OptionsDialog::addCallback(handleOptions, this);
+ // Hack. See below...
+ Fl::event_dispatch(&fltkHandle);
+
#ifdef HAVE_FLTK_FULLSCREEN
if (fullScreen)
fullscreen();
{
switch (event) {
#ifdef HAVE_FLTK_FULLSCREEN
- case FL_FOCUS:
- // FIXME: We reassert the keyboard grabbing on focus/unfocus as FLTK
- // releases the grab when someone calls Fl::grab(0)
case FL_FULLSCREEN:
if (event == FL_FULLSCREEN)
fullScreen.setParam(fullscreen_active());
else
ungrabKeyboard();
- break;
- case FL_UNFOCUS:
- // FIXME: We need to relinquish control when the entire window loses
- // focus as it seems to interfere with the WM:s ability to handle
- // interactions with popups' window decorations.
- ungrabKeyboard();
break;
#endif
case FL_SHORTCUT:
}
+int DesktopWindow::fltkHandle(int event, Fl_Window *win)
+{
+ int ret;
+
+ ret = Fl::handle_(event, win);
+
+#ifdef HAVE_FLTK_FULLSCREEN
+ // 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
+ // need. Fortunately we can grab them here...
+
+ DesktopWindow *dw = dynamic_cast<DesktopWindow*>(win);
+
+ if (dw && fullscreenSystemKeys) {
+ switch (event) {
+ case FL_FOCUS:
+ // FIXME: We reassert the keyboard grabbing on focus as FLTK there are
+ // some issues we need to work around:
+ // a) Fl::grab(0) on X11 will release the keyboard grab for us.
+ // b) Gaining focus on the system level causes FLTK to switch
+ // window level on OS X.
+ if (dw->fullscreen_active())
+ dw->grabKeyboard();
+ break;
+
+ case FL_UNFOCUS:
+ // FIXME: We need to relinquish control when the entire window loses
+ // focus as it is very tied to this specific window on some
+ // platforms and we want to be able to open subwindows.
+ dw->ungrabKeyboard();
+ break;
+ }
+ }
+#endif
+
+ return ret;
+}
+
+
void DesktopWindow::grabKeyboard()
{
// Grabbing the keyboard is fairly safe as FLTK reroutes events to the
const Fl_Menu_Item *m;
char buffer[1024];
- // FIXME: Hacky workaround for the fact that menus grab and ungrab the
- // keyboard. Releasing focus here triggers some events on ungrab
- // that DesktopWindow can catch and trigger some voodoo.
- // See DesktopWindow::handle().
- if (window()->contains(Fl::focus()))
- Fl::focus(NULL);
-
// Make sure the menu is reset to its initial state between goes or
// it will start up highlighting the previously selected entry.
contextMenu->value(-1);
#import <Cocoa/Cocoa.h>
+static bool captured = false;
+
int cocoa_capture_display(Fl_Window *win)
{
NSWindow *nsw;
nsw = (NSWindow*)fl_xid(win);
- // Already captured?
+ if (!captured) {
+ if (CGDisplayCapture(kCGDirectMainDisplay) != kCGErrorSuccess)
+ return 1;
+
+ captured = true;
+ }
+
if ([nsw level] == CGShieldingWindowLevel())
return 0;
- if (CGDisplayCapture(kCGDirectMainDisplay) != kCGErrorSuccess)
- return 1;
-
[nsw setLevel:CGShieldingWindowLevel()];
return 0;
NSWindow *nsw;
int newlevel;
- CGDisplayRelease(kCGDirectMainDisplay);
+ if (captured)
+ CGDisplayRelease(kCGDirectMainDisplay);
+
+ captured = false;
nsw = (NSWindow*)fl_xid(win);