소스 검색

fix: fall back to active Wayland viewport for mouse input (#576)

Co-authored-by: louzt <louzt@users.noreply.github.com>
Co-authored-by: Alexis Maiquez <wpengine@alma.mu>
David Mireles 4 달 전
부모
커밋
8377a550b7
1개의 변경된 파일과 39개의 추가작업 그리고 7개의 파일을 삭제
  1. 39 7
      src/WallpaperEngine/Input/Drivers/WaylandMouseInput.cpp

+ 39 - 7
src/WallpaperEngine/Input/Drivers/WaylandMouseInput.cpp

@@ -13,6 +13,24 @@
 
 using namespace WallpaperEngine::Input::Drivers;
 
+namespace {
+const WallpaperEngine::Render::Drivers::Output::WaylandOutputViewport* getActiveViewport (
+    const WallpaperEngine::Render::Drivers::WaylandOpenGLDriver& driver
+) {
+    if (driver.viewportInFocus && driver.viewportInFocus->rendering) {
+	return driver.viewportInFocus;
+    }
+
+    for (const auto* viewport : driver.m_screens) {
+	if (viewport && viewport->rendering) {
+	    return viewport;
+	}
+    }
+
+    return nullptr;
+}
+}
+
 WaylandMouseInput::WaylandMouseInput (const WallpaperEngine::Render::Drivers::WaylandOpenGLDriver& driver) :
     m_waylandDriver (driver) { }
 
@@ -62,16 +80,29 @@ glm::dvec2 WaylandMouseInput::position () const {
 	return { 0, 0 };
     }
 
-    if (m_waylandDriver.viewportInFocus && m_waylandDriver.viewportInFocus->rendering) {
-	return m_waylandDriver.viewportInFocus->mousePos;
+    const auto* viewport = getActiveViewport (m_waylandDriver);
+    if (!viewport) {
+	return { 0, 0 };
+    }
+
+    if (viewport == m_waylandDriver.viewportInFocus) {
+	return viewport->mousePos;
     }
 
-    return this->m_pos;
+    if (viewport->mousePos.x != 0 || viewport->mousePos.y != 0) {
+	return viewport->mousePos;
+    }
+
+    return {
+	static_cast<double> (viewport->size.x * viewport->scale) / 2.0,
+	static_cast<double> (viewport->size.y * viewport->scale) / 2.0,
+    };
 }
 
 WallpaperEngine::Input::MouseClickStatus WaylandMouseInput::leftClick () const {
-    if (m_waylandDriver.viewportInFocus && m_waylandDriver.viewportInFocus->rendering) {
-	return m_waylandDriver.viewportInFocus->leftClick;
+    const auto* viewport = getActiveViewport (m_waylandDriver);
+    if (viewport) {
+	return viewport->leftClick;
     }
 
     return MouseClickStatus::Released;
@@ -145,8 +176,9 @@ std::optional<glm::dvec2> WaylandMouseInput::queryHyprlandCursorPosition () cons
 }
 
 WallpaperEngine::Input::MouseClickStatus WaylandMouseInput::rightClick () const {
-    if (m_waylandDriver.viewportInFocus && m_waylandDriver.viewportInFocus->rendering) {
-	return m_waylandDriver.viewportInFocus->rightClick;
+    const auto* viewport = getActiveViewport (m_waylandDriver);
+    if (viewport) {
+	return viewport->rightClick;
     }
 
     return MouseClickStatus::Released;