summaryrefslogtreecommitdiff
path: root/src/protocols/ToplevelExport.cpp
diff options
context:
space:
mode:
authorWhySoBad <49595640+WhySoBad@users.noreply.github.com>2025-02-06 13:42:20 +0100
committerGitHub <noreply@github.com>2025-02-06 12:42:20 +0000
commitacbcf0cf115d55ef80a75ded3223a9e098f77541 (patch)
treeebff9aa6356da40d353ad2f6655a0dc11d6da6e8 /src/protocols/ToplevelExport.cpp
parent30b49c75bf04ceffc9fb1652a4d02e4eebacc24c (diff)
toplevelexport: fix transformed origin for shm buffers (#9343)
* toplevelexport: fix transformed origin for shm buffers * toplevelexport: fix style nits
Diffstat (limited to 'src/protocols/ToplevelExport.cpp')
-rw-r--r--src/protocols/ToplevelExport.cpp25
1 files changed, 24 insertions, 1 deletions
diff --git a/src/protocols/ToplevelExport.cpp b/src/protocols/ToplevelExport.cpp
index 8b835b50..a9009aa4 100644
--- a/src/protocols/ToplevelExport.cpp
+++ b/src/protocols/ToplevelExport.cpp
@@ -11,6 +11,7 @@
#include "../render/Renderer.hpp"
#include <algorithm>
+#include <hyprutils/math/Vector2D.hpp>
CToplevelExportClient::CToplevelExportClient(SP<CHyprlandToplevelExportManagerV1> resource_) : resource(resource_) {
if UNLIKELY (!good())
@@ -289,7 +290,29 @@ bool CToplevelExportFrame::copyShm(timespec* now) {
glPixelStorei(GL_PACK_ALIGNMENT, 1);
auto glFormat = PFORMAT->flipRB ? GL_BGRA_EXT : GL_RGBA;
- glReadPixels(0, 0, box.width, box.height, glFormat, PFORMAT->glType, pixelData);
+
+ auto origin = Vector2D(0, 0);
+ switch (PMONITOR->transform) {
+ case WL_OUTPUT_TRANSFORM_FLIPPED_180:
+ case WL_OUTPUT_TRANSFORM_90: {
+ origin.y = PMONITOR->vecPixelSize.y - box.height;
+ break;
+ }
+ case WL_OUTPUT_TRANSFORM_FLIPPED_270:
+ case WL_OUTPUT_TRANSFORM_180: {
+ origin.x = PMONITOR->vecPixelSize.x - box.width;
+ origin.y = PMONITOR->vecPixelSize.y - box.height;
+ break;
+ }
+ case WL_OUTPUT_TRANSFORM_FLIPPED:
+ case WL_OUTPUT_TRANSFORM_270: {
+ origin.x = PMONITOR->vecPixelSize.x - box.width;
+ break;
+ }
+ default: break;
+ }
+
+ glReadPixels(origin.x, origin.y, box.width, box.height, glFormat, PFORMAT->glType, pixelData);
if (overlayCursor) {
g_pPointerManager->unlockSoftwareForMonitor(PMONITOR->self.lock());