diff options
author | Pierre Ossman <ossman@cendio.se> | 2011-06-14 13:36:57 +0000 |
---|---|---|
committer | Pierre Ossman <ossman@cendio.se> | 2011-06-14 13:36:57 +0000 |
commit | a4f0f181b3ed0a0906083c453632e39e19472135 (patch) | |
tree | bdb1d4c95eb72e7f6be26db3826b20c8c461f189 /vncviewer/DesktopWindow.cxx | |
parent | db7091c0f48c5b6a4adaf1701a3a9dcf4b32daa1 (diff) | |
download | tigervnc-a4f0f181b3ed0a0906083c453632e39e19472135.tar.gz tigervnc-a4f0f181b3ed0a0906083c453632e39e19472135.zip |
Implement a more robust method to handle the keyboard grab/focus voodoo as
it didn't catch some cases on OS X.
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4496 3789f03b-4d11-0410-bbf8-ca57d06f2519
Diffstat (limited to 'vncviewer/DesktopWindow.cxx')
-rw-r--r-- | vncviewer/DesktopWindow.cxx | 52 |
1 files changed, 43 insertions, 9 deletions
diff --git a/vncviewer/DesktopWindow.cxx b/vncviewer/DesktopWindow.cxx index 52725ed2..456e372f 100644 --- a/vncviewer/DesktopWindow.cxx +++ b/vncviewer/DesktopWindow.cxx @@ -69,6 +69,9 @@ DesktopWindow::DesktopWindow(int w, int h, const char *name, OptionsDialog::addCallback(handleOptions, this); + // Hack. See below... + Fl::event_dispatch(&fltkHandle); + #ifdef HAVE_FLTK_FULLSCREEN if (fullScreen) fullscreen(); @@ -197,9 +200,6 @@ int DesktopWindow::handle(int event) { 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()); @@ -213,12 +213,6 @@ int DesktopWindow::handle(int event) 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: // Sometimes the focus gets out of whack and we fall through to the @@ -234,6 +228,46 @@ int DesktopWindow::handle(int event) } +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 |