XFCE's window manager did not interact well with the code that avoided
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
diff --git a/vncviewer/DesktopWindow.cxx b/vncviewer/DesktopWindow.cxx
index ed62de0..fad5ad3 100644
--- a/vncviewer/DesktopWindow.cxx
+++ b/vncviewer/DesktopWindow.cxx
@@ -281,26 +281,35 @@
 #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;
+    // 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;
 
-      Fl::screen_xywh(sx, sy, sw, sh, i);
+    XGetWindowAttributes(fl_display, fl_xid(this), &actual);
+    XTranslateCoordinates(fl_display, fl_xid(this), actual.root,
+                          0, 0, &wx, &wy, &cr);
 
-      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;
+    // 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;
+        }
       }
     }
   }