]> source.dussan.org Git - tigervnc.git/commitdiff
Detect leaving window on zaphod systems
authorPierre Ossman <ossman@cendio.se>
Wed, 8 Mar 2023 17:15:33 +0000 (18:15 +0100)
committerPierre Ossman <ossman@cendio.se>
Wed, 8 Mar 2023 17:15:33 +0000 (18:15 +0100)
The coordinates we get are relative the root window of each screen, so
we can only trust them if we are on the same screen. So let's explicitly
check that we are still getting events from the expected screen by
checking the root window field of the event.

vncviewer/DesktopWindow.cxx

index c59520943d2b68ca06c3858ec5942a35518c12b1..b85485b22c625a5aa3bfc06c1e3def5be2b8bea0 100644 (file)
@@ -844,12 +844,20 @@ int DesktopWindow::handle(int event)
   case FL_LEAVE:
   case FL_DRAG:
   case FL_MOVE:
-    // We don't get FL_LEAVE with a grabbed pointer, so check manually
     if (mouseGrabbed) {
+      // We don't get FL_LEAVE with a grabbed pointer, so check manually
       if ((Fl::event_x() < 0) || (Fl::event_x() >= w()) ||
           (Fl::event_y() < 0) || (Fl::event_y() >= h())) {
         ungrabPointer();
       }
+      // We also don't get sensible coordinates on zaphod setups
+#if !defined(WIN32) && !defined(__APPLE__)
+      if ((fl_xevent != NULL) && (fl_xevent->type == MotionNotify) &&
+          (((XMotionEvent*)fl_xevent)->root !=
+           XRootWindow(fl_display, fl_screen))) {
+        ungrabPointer();
+      }
+#endif
     }
     if (fullscreen_active()) {
       // calculate width of "edge" regions