]> source.dussan.org Git - tigervnc.git/commitdiff
Recreate fullscreen window if screens are removed or added 642/head
authorPeter Åstrand (astrand) <astrand@cendio.se>
Mon, 7 May 2018 06:14:39 +0000 (08:14 +0200)
committerPeter Åstrand (astrand) <astrand@cendio.se>
Mon, 7 May 2018 06:14:39 +0000 (08:14 +0200)
vncviewer/DesktopWindow.cxx
vncviewer/DesktopWindow.h

index e86e90e6f6c50f943cd460346c061d6ee31bc3d3..f0aae11a024328727e8d3dfa469d46222e2bac62 100644 (file)
@@ -59,6 +59,10 @@ using namespace rfb;
 
 static rfb::LogWriter vlog("DesktopWindow");
 
+// Global due to http://www.fltk.org/str.php?L2177 and the similar
+// issue for Fl::event_dispatch.
+static DesktopWindow *staticSelf = NULL;
+
 DesktopWindow::DesktopWindow(int w, int h, const char *name,
                              const rfb::PixelFormat& serverPF,
                              CConn* cc_)
@@ -93,6 +97,8 @@ DesktopWindow::DesktopWindow(int w, int h, const char *name,
 
   OptionsDialog::addCallback(handleOptions, this);
 
+  staticSelf = this;
+
   // Hack. See below...
   Fl::event_dispatch(&fltkHandle);
 
@@ -207,6 +213,8 @@ DesktopWindow::~DesktopWindow()
 
   delete statsGraph;
 
+  staticSelf = NULL;
+
   // FLTK automatically deletes all child widgets, so we shouldn't touch
   // them ourselves here
 }
@@ -669,12 +677,43 @@ int DesktopWindow::handle(int event)
 }
 
 
+void DesktopWindow::reconfigureFullscreen(void *data)
+{
+  DesktopWindow *self = (DesktopWindow *)data;
+
+  assert(self);
+  self->fullscreen_on();
+}
+
+
 int DesktopWindow::fltkHandle(int event, Fl_Window *win)
 {
   int ret;
 
   ret = Fl::handle_(event, win);
 
+  switch (event) {
+  case FL_SCREEN_CONFIGURATION_CHANGED:
+    // Screens removed or added. Recreate fullscreen window if
+    // necessary. On Windows, adding a second screen only works
+    // reliable if we are using a timer. Otherwise, the window will
+    // not be resized to cover the new screen. A timer makes sense
+    // also on other systems, to make sure that whatever desktop
+    // environment has a chance to deal with things before we do.
+    // Please note that when using FullscreenSystemKeys on macOS, the
+    // display configuration cannot be changed: macOS will not detect
+    // added or removed screens and there will be no
+    // FL_SCREEN_CONFIGURATION_CHANGED event. This is by design:
+    // "When you capture a display, you have exclusive use of the
+    // display. Other applications and system services are not allowed
+    // to use the display or change its configuration. In addition,
+    // they are not notified of display changes"
+    if (staticSelf->fullscreen_active()) {
+      Fl::remove_timeout(reconfigureFullscreen, staticSelf);
+      Fl::add_timeout(0.5, reconfigureFullscreen, staticSelf);
+    }
+  }
+
   // This is hackish and the result of the dodgy focus handling in FLTK.
   // The basic problem is that FLTK's view of focus and the system's tend
   // to differ, and as a result we do not see all the FL_FOCUS events we
index 6ec8e1bd3823b3fdad19007788cc3b4d5de386d7..25203c9b487394c95ba8475552bbea5831995d39 100644 (file)
@@ -99,6 +99,7 @@ private:
 
   void handleDesktopSize();
   static void handleResizeTimeout(void *data);
+  static void reconfigureFullscreen(void *data);
   void remoteResize(int width, int height);
 
   void repositionWidgets();