]> source.dussan.org Git - tigervnc.git/commitdiff
XFCE's window manager did not interact well with the code that avoided
authorPierre Ossman <ossman@cendio.se>
Wed, 3 Oct 2012 12:21:54 +0000 (12:21 +0000)
committerPierre Ossman <ossman@cendio.se>
Wed, 3 Oct 2012 12:21:54 +0000 (12:21 +0000)
accidental legacy full screen requests. Seems we need to sort that
FIXME out sooner rather than later.

git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@5002 3789f03b-4d11-0410-bbf8-ca57d06f2519

vncviewer/DesktopWindow.cxx

index ed62de0f43710173ac393f85678d55cfb277147b..fad5ad3e61035fb4182e219281cff41d017810ff 100644 (file)
@@ -281,26 +281,35 @@ void DesktopWindow::resize(int x, int y, int w, int h)
 #if ! (defined(WIN32) || defined(__APPLE__))
   // X11 window managers will treat a resize to cover the entire
   // monitor as a request to go full screen. Make sure we avoid this.
-  //
-  // FIXME: If this is an external event then this code will get
-  //        FLTK into a confused state about the window's position/size.
-  //        Unfortunately FLTK doesn't offer an easy way to tell
-  //        what kind of resize it is. Let's hope this corner case
-  //        isn't too common...
 #ifdef HAVE_FLTK_FULLSCREEN
   if (!fullscreen_active())
 #endif
   {
-    for (int i = 0;i < Fl::screen_count();i++) {
-      int sx, sy, sw, sh;
-
-      Fl::screen_xywh(sx, sy, sw, sh, i);
-
-      if ((sx == x) && (sy == y) && (sw == w) && (sh == h)) {
-        vlog.info("Adjusting window size to avoid accidental full screen request");
-        // Assume a panel of some form and adjust the height
-        y += 20;
-        h -= 40;
+    // Get the real window coordinates, so we can determine if
+    // this is a request to resize, or a notification of a resize
+    // from the X server.
+    XWindowAttributes actual;
+    Window cr;
+    int wx, wy;
+
+    XGetWindowAttributes(fl_display, fl_xid(this), &actual);
+    XTranslateCoordinates(fl_display, fl_xid(this), actual.root,
+                          0, 0, &wx, &wy, &cr);
+
+    // Actual resize request?
+    if ((wx != x) || (wy != y) ||
+        (actual.width != w) || (actual.height != h)) {
+      for (int i = 0;i < Fl::screen_count();i++) {
+        int sx, sy, sw, sh;
+
+        Fl::screen_xywh(sx, sy, sw, sh, i);
+
+        if ((sx == x) && (sy == y) && (sw == w) && (sh == h)) {
+          vlog.info("Adjusting window size to avoid accidental full screen request");
+          // Assume a panel of some form and adjust the height
+          y += 20;
+          h -= 40;
+        }
       }
     }
   }