From 3d75911a551fab492ceb71506f85ffbae993b3b7 Mon Sep 17 00:00:00 2001 From: Pierre Ossman Date: Mon, 27 Aug 2012 14:40:51 +0000 Subject: [PATCH] The OS X keyboard grabbing code needs to be multi-head aware to function properly. git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4977 3789f03b-4d11-0410-bbf8-ca57d06f2519 --- vncviewer/DesktopWindow.cxx | 8 +++++++- vncviewer/cocoa.h | 2 +- vncviewer/cocoa.mm | 29 +++++++++++++++++++++++++---- 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/vncviewer/DesktopWindow.cxx b/vncviewer/DesktopWindow.cxx index 6fc2b923..ca33ebeb 100644 --- a/vncviewer/DesktopWindow.cxx +++ b/vncviewer/DesktopWindow.cxx @@ -439,7 +439,13 @@ void DesktopWindow::grabKeyboard() #elif defined(__APPLE__) int ret; - ret = cocoa_capture_display(this); + ret = cocoa_capture_display(this, +#ifdef HAVE_FLTK_FULLSCREEN_SCREENS + fullScreenAllMonitors +#else + false +#endif + ); if (ret != 0) vlog.error(_("Failure grabbing keyboard")); #else diff --git a/vncviewer/cocoa.h b/vncviewer/cocoa.h index 3bbe6fa0..87980823 100644 --- a/vncviewer/cocoa.h +++ b/vncviewer/cocoa.h @@ -19,7 +19,7 @@ #ifndef __VNCVIEWER_COCOA_H__ #define __VNCVIEWER_COCOA_H__ -int cocoa_capture_display(Fl_Window *win); +int cocoa_capture_display(Fl_Window *win, bool all_displays); void cocoa_release_display(Fl_Window *win); #endif diff --git a/vncviewer/cocoa.mm b/vncviewer/cocoa.mm index 6300d3c0..6872b230 100644 --- a/vncviewer/cocoa.mm +++ b/vncviewer/cocoa.mm @@ -24,15 +24,36 @@ static bool captured = false; -int cocoa_capture_display(Fl_Window *win) +int cocoa_capture_display(Fl_Window *win, bool all_displays) { NSWindow *nsw; nsw = (NSWindow*)fl_xid(win); if (!captured) { - if (CGDisplayCapture(kCGDirectMainDisplay) != kCGErrorSuccess) - return 1; + if (all_displays) { + if (CGCaptureAllDisplays() != kCGErrorSuccess) + return 1; + } else { + CGDirectDisplayID displays[16]; + CGDisplayCount count; + int index; + + if (CGGetActiveDisplayList(16, displays, &count) != kCGErrorSuccess) + return 1; + + if (count != Fl::screen_count()) + return 1; + +#ifdef HAVE_FLTK_FULLSCREEN_SCREENS + index = Fl::screen_num(win->x(), win->y(), win->w(), win->h()); +#else + index = 0; +#endif + + if (CGDisplayCapture(displays[index]) != kCGErrorSuccess) + return 1; + } captured = true; } @@ -51,7 +72,7 @@ void cocoa_release_display(Fl_Window *win) int newlevel; if (captured) - CGDisplayRelease(kCGDirectMainDisplay); + CGReleaseAllDisplays(); captured = false; -- 2.39.5