aboutsummaryrefslogtreecommitdiffstats
path: root/vncviewer/DesktopWindow.cxx
diff options
context:
space:
mode:
authorPierre Ossman <ossman@cendio.se>2011-06-14 13:36:57 +0000
committerPierre Ossman <ossman@cendio.se>2011-06-14 13:36:57 +0000
commita4f0f181b3ed0a0906083c453632e39e19472135 (patch)
treebdb1d4c95eb72e7f6be26db3826b20c8c461f189 /vncviewer/DesktopWindow.cxx
parentdb7091c0f48c5b6a4adaf1701a3a9dcf4b32daa1 (diff)
downloadtigervnc-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.cxx52
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