diff options
author | Pierre Ossman <ossman@cendio.se> | 2011-05-26 14:48:29 +0000 |
---|---|---|
committer | Pierre Ossman <ossman@cendio.se> | 2011-05-26 14:48:29 +0000 |
commit | 407a5c3ce60e3e9d361c6d1e8a2a14c39946707e (patch) | |
tree | 46937e98dd44f48f4d79b1fb30d2f5bb9940a0a3 /vncviewer/cocoa.mm | |
parent | ad9d1aef3bbcb011b40411f2b720766c01376254 (diff) | |
download | tigervnc-407a5c3ce60e3e9d361c6d1e8a2a14c39946707e.tar.gz tigervnc-407a5c3ce60e3e9d361c6d1e8a2a14c39946707e.zip |
Implement support for grabbing the keyboard when in full screen mode.
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4449 3789f03b-4d11-0410-bbf8-ca57d06f2519
Diffstat (limited to 'vncviewer/cocoa.mm')
-rw-r--r-- | vncviewer/cocoa.mm | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/vncviewer/cocoa.mm b/vncviewer/cocoa.mm new file mode 100644 index 00000000..589da2d9 --- /dev/null +++ b/vncviewer/cocoa.mm @@ -0,0 +1,69 @@ +/* Copyright 2011 Pierre Ossman <ossman@cendio.se> for Cendio AB + * + * This is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this software; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + * USA. + */ + +#include <FL/Fl.H> +#include <FL/Fl_Window.H> +#include <FL/x.H> + +#import <Cocoa/Cocoa.h> + +int cocoa_capture_display(Fl_Window *win) +{ + NSWindow *nsw; + + nsw = (NSWindow*)fl_xid(win); + + // Already captured? + if ([nsw level] == CGShieldingWindowLevel()) + return 0; + + if (CGDisplayCapture(kCGDirectMainDisplay) != kCGErrorSuccess) + return 1; + + [nsw setLevel:CGShieldingWindowLevel()]; + + return 0; +} + +void cocoa_release_display(Fl_Window *win) +{ + NSWindow *nsw; + int newlevel; + + CGDisplayRelease(kCGDirectMainDisplay); + + nsw = (NSWindow*)fl_xid(win); + + // Someone else has already changed the level of this window + if ([nsw level] != CGShieldingWindowLevel()) + return; + + // FIXME: Store the previous level somewhere so we don't have to hard + // code a level here. +#ifdef HAVE_FLTK_FULLSCREEN + if (win->fullscreen_active() && win->contains(Fl::focus())) + newlevel = NSStatusWindowLevel; + else +#endif + newlevel = NSNormalWindowLevel; + + // Only change if different as the level change also moves the window + // to the top of that level. + if ([nsw level] != newlevel) + [nsw setLevel:newlevel]; +} |