// Global due to http://www.fltk.org/str.php?L2177 and the similar
// issue for Fl::event_dispatch.
-static DesktopWindow *staticSelf = NULL;
+static std::set<DesktopWindow *> instances;
DesktopWindow::DesktopWindow(int w, int h, const char *name,
const rfb::PixelFormat& serverPF,
OptionsDialog::addCallback(handleOptions, this);
- staticSelf = this;
+ // Some events need to be caught globally
+ if (instances.size() == 0)
+ Fl::add_handler(fltkHandle);
+ instances.insert(this);
// Hack. See below...
- Fl::event_dispatch(&fltkHandle);
+ Fl::event_dispatch(fltkDispatch);
// Support for -geometry option. Note that although we do support
// negative coordinates, we do not support -XOFF-YOFF (ie
delete statsGraph;
- staticSelf = NULL;
+ instances.erase(this);
+
+ if (instances.size() == 0)
+ Fl::remove_handler(fltkHandle);
Fl::event_dispatch(Fl::handle_);
}
-void DesktopWindow::reconfigureFullscreen(void *data)
-{
- DesktopWindow *self = (DesktopWindow *)data;
-
- assert(self);
- self->fullscreen_on();
-}
-
-
-int DesktopWindow::fltkHandle(int event, Fl_Window *win)
+int DesktopWindow::fltkDispatch(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
return ret;
}
+int DesktopWindow::fltkHandle(int event)
+{
+ 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"
+ Fl::remove_timeout(reconfigureFullscreen);
+ Fl::add_timeout(0.5, reconfigureFullscreen);
+ }
+
+ return 0;
+}
+
void DesktopWindow::fullscreen_on()
{
bool allMonitors = !strcasecmp(fullScreenMode, "all");
}
+void DesktopWindow::reconfigureFullscreen(void *data)
+{
+ std::set<DesktopWindow *>::iterator iter;
+
+ for (iter = instances.begin(); iter != instances.end(); ++iter) {
+ if ((*iter)->fullscreen_active())
+ (*iter)->fullscreen_on();
+ }
+}
+
+
void DesktopWindow::remoteResize(int width, int height)
{
ScreenSet layout;