diff --git a/src/helpers/Monitor.cpp b/src/helpers/Monitor.cpp index 118286e..ca642a2 100644 --- a/src/helpers/Monitor.cpp +++ b/src/helpers/Monitor.cpp @@ -1,8 +1,15 @@ #include "Monitor.hpp" #include "../Hyprpaper.hpp" +#include "MiscFunctions.hpp" void SMonitor::registerListeners() { - output->setMode([this](CCWlOutput* r, uint32_t flags, int32_t width, int32_t height, int32_t refresh) { size = Vector2D(width, height); }); + output->setMode([this](CCWlOutput* r, uint32_t flags, int32_t width, int32_t height, int32_t refresh) { + size = Vector2D(width, height); + + //ensures any transforms are also taken care of when setting the mode + if (transform & 1) + std::swap(size.x, size.y); + }); output->setDone([this](CCWlOutput* r) { readyForLS = true; @@ -25,12 +32,12 @@ void SMonitor::registerListeners() { output->setGeometry([this](CCWlOutput* r, int32_t x, int32_t y, int32_t width_mm, int32_t height_mm, int32_t subpixel, const char* make, const char* model, int32_t transform_) { // /* - see https://wayland.freedesktop.org/docs/html/apa.html#protocol-spec-wl_output-enum-transform - IF { (new transform event IS by 90n degrees) AND (old transform event was NOT by 90n degrees) } - THEN { swap the size vector accordingly. } + see https://wayland.freedesktop.org/docs/html/apa.html#protocol-spec-wl_output-enum-transform + If there is a difference in parity of the old vs new transforms, the size needs to be swapped. */ - if (((transform_ % 4) == 1 || (transform_ % 4) == 3) && ((transform % 4) != 1 || (transform % 4) != 3)) + if ((transform ^ transform_) & 1) std::swap(size.x, size.y); + transform = (wl_output_transform)transform_; }); -} \ No newline at end of file +} diff --git a/src/helpers/Monitor.hpp b/src/helpers/Monitor.hpp index ae3c538..c9b5e9d 100644 --- a/src/helpers/Monitor.hpp +++ b/src/helpers/Monitor.hpp @@ -22,10 +22,9 @@ struct SMonitor { uint32_t configureSerial = 0; SPoolBuffer buffer; - bool wantsReload = false; - bool wantsACK = false; - bool initialized = false; - bool newModeForGeometry = false; //used to ensure mode has been set/changed before handling new geometry events + bool wantsReload = false; + bool wantsACK = false; + bool initialized = false; std::vector> layerSurfaces; CLayerSurface* pCurrentLayerSurface = nullptr;