#elif defined(__APPLE__)
int ret;
- ret = cocoa_capture_display(this, fullScreenAllMonitors);
+ ret = cocoa_capture_displays(this);
if (ret != 0) {
vlog.error(_("Failure grabbing keyboard"));
return;
#if defined(WIN32)
win32_disable_lowlevel_keyboard(fl_xid(this));
#elif defined(__APPLE__)
- cocoa_release_display(this);
+ cocoa_release_displays(this);
#else
// FLTK has a grab so lets not mess with it
if (Fl::grab())
#ifndef __VNCVIEWER_COCOA_H__
#define __VNCVIEWER_COCOA_H__
-int cocoa_capture_display(Fl_Window *win, bool all_displays);
-void cocoa_release_display(Fl_Window *win);
+class Fl_Window;
+
+int cocoa_capture_displays(Fl_Window *win);
+void cocoa_release_displays(Fl_Window *win);
typedef struct CGColorSpace *CGColorSpaceRef;
#define XK_XKB_KEYS
#include <rfb/keysymdef.h>
#include <rfb/XF86keysym.h>
+#include <rfb/Rect.h>
#include "keysym2ucs.h"
static bool captured = false;
-int cocoa_capture_display(Fl_Window *win, bool all_displays)
+int cocoa_capture_displays(Fl_Window *win)
{
NSWindow *nsw;
nsw = (NSWindow*)fl_xid(win);
if (!captured) {
- if (all_displays) {
- if (CGCaptureAllDisplays() != kCGErrorSuccess)
- return 1;
- } else {
- CGDirectDisplayID displays[16];
- CGDisplayCount count;
- int index;
+ CGDisplayCount count;
+ CGDirectDisplayID displays[16];
- if (CGGetActiveDisplayList(16, displays, &count) != kCGErrorSuccess)
- return 1;
+ int sx, sy, sw, sh;
+ rfb::Rect windows_rect, screen_rect;
- if (count != (unsigned)Fl::screen_count())
- return 1;
+ windows_rect.setXYWH(win->x(), win->y(), win->w(), win->h());
- index = Fl::screen_num(win->x(), win->y(), win->w(), win->h());
+ if (CGGetActiveDisplayList(16, displays, &count) != kCGErrorSuccess)
+ return 1;
+
+ if (count != (unsigned)Fl::screen_count())
+ return 1;
+
+ for (int i = 0; i < Fl::screen_count(); i++) {
+ Fl::screen_xywh(sx, sy, sw, sh, i);
- if (CGDisplayCapture(displays[index]) != kCGErrorSuccess)
- return 1;
+ screen_rect.setXYWH(sx, sy, sw, sh);
+ if (screen_rect.enclosed_by(windows_rect)) {
+ if (CGDisplayCapture(displays[i]) != kCGErrorSuccess)
+ return 1;
+ }
}
captured = true;
return 0;
}
-void cocoa_release_display(Fl_Window *win)
+void cocoa_release_displays(Fl_Window *win)
{
NSWindow *nsw;
int newlevel;