Created
September 18, 2010 03:55
-
-
Save masaedw/585327 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/lisp/term/ns-win.el b/lisp/term/ns-win.el | |
index 157b2dd..f3807b7 100644 | |
--- a/lisp/term/ns-win.el | |
+++ b/lisp/term/ns-win.el | |
@@ -1263,6 +1263,11 @@ the operating system.") | |
(add-to-list 'window-system-initialization-alist '(ns . ns-initialize-window-system)) | |
+(declare-function ns-toggle-fullscreen-internal "nsfns.m" ()) | |
+(defun ns-toggle-fullscreen () | |
+ (interactive) | |
+ (ns-toggle-fullscreen-internal)) | |
+ | |
(provide 'ns-win) | |
;; arch-tag: eb138a45-4e2e-4d68-b1c9-a39665731644 | |
diff --git a/src/nsfns.m b/src/nsfns.m | |
index 642ff79..03ffcf7 100644 | |
--- a/src/nsfns.m | |
+++ b/src/nsfns.m | |
@@ -2589,6 +2589,34 @@ Value is t if tooltip was open, nil otherwise. */) | |
#endif | |
+DEFUN ("ns-toggle-fullscreen-internal", Fns_toggle_fullscreen_internal, Sns_toggle_fullscreen_internal, | |
+ 0, 0, 0, | |
+ doc: /* Toggle fulscreen mode */) | |
+ () | |
+{ | |
+ struct frame *f = SELECTED_FRAME(); | |
+ EmacsWindow *window = ns_get_window(f); | |
+ | |
+ EmacsWindow *new_window = [window toggleFullscreen]; | |
+ FRAME_NS_WINDOW(f) = new_window; | |
+ | |
+ NSRect r = [new_window contentRectForFrameRect:[new_window frame]]; | |
+ int cols = FRAME_PIXEL_WIDTH_TO_TEXT_COLS(f, r.size.width); | |
+ int rows = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES(f, r.size.height); | |
+ | |
+ change_frame_size (f, rows, cols, 0, 1, 0); /* pretend, delay, safe */ | |
+ FRAME_PIXEL_WIDTH (f) = (int)r.size.width; | |
+ FRAME_PIXEL_HEIGHT (f) = (int)r.size.height; | |
+ | |
+ f->border_width = [new_window frame].size.width - r.size.width; | |
+ FRAME_NS_TITLEBAR_HEIGHT (f) = | |
+ [new_window frame].size.height - r.size.height; | |
+ | |
+ [[new_window delegate] windowDidMove:nil]; | |
+ | |
+ return Qnil; | |
+} | |
+ | |
/* ========================================================================== | |
@@ -2676,6 +2704,8 @@ be used as the image of the icon representing the frame. */); | |
defsubr (&Sx_show_tip); | |
defsubr (&Sx_hide_tip); | |
+ defsubr (&Sns_toggle_fullscreen_internal); | |
+ | |
/* used only in fontset.c */ | |
check_window_system_func = check_ns; | |
diff --git a/src/nsterm.h b/src/nsterm.h | |
index 29d312a..17b19e4 100644 | |
--- a/src/nsterm.h | |
+++ b/src/nsterm.h | |
@@ -95,8 +95,25 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ | |
{ | |
NSPoint grabOffset; | |
} | |
+ | |
+-(EmacsWindow *)toggleFullscreen; | |
+ | |
+@end | |
+ | |
+/* 10.5 or below is not supported [NSWindow setStyleMask:], so require content swap hack */ | |
+@interface EmacsFullWindow : EmacsWindow { | |
+ EmacsWindow *normalWindow; | |
+} | |
+ | |
+-(id)initWithNormalWindow:(EmacsWindow *)window; | |
+-(EmacsWindow *)getNormalWindow; | |
+ | |
@end | |
+// dummy for 10.5- | |
+#define NSApplicationPresentationDefault 0 | |
+#define NSApplicationPresentationAutoHideDock (1 << 0) | |
+#define NSApplicationPresentationAutoHideMenuBar (1 << 2) | |
/* ========================================================================== | |
diff --git a/src/nsterm.m b/src/nsterm.m | |
index 9256c08..8bbb575 100644 | |
--- a/src/nsterm.m | |
+++ b/src/nsterm.m | |
@@ -686,6 +686,13 @@ ns_focus (struct frame *f, NSRect *r, int n) | |
/*debug_lock--; */ | |
} | |
+ if (view) { | |
+ EmacsFullWindow *win = [view window]; | |
+ if ([win isKindOfClass:[EmacsFullWindow class]]) { | |
+ [[win getNormalWindow] orderOut:nil]; | |
+ } | |
+ } | |
+ | |
if (view) | |
#ifdef NS_IMPL_GNUSTEP | |
r ? [view lockFocusInRect: u] : [view lockFocus]; | |
@@ -1131,8 +1138,14 @@ x_set_window_size (struct frame *f, int change_grav, int cols, int rows) | |
f->scroll_bar_actual_width = NS_SCROLL_BAR_WIDTH (f); | |
compute_fringe_widths (f, 0); | |
- pixelwidth = FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, cols); | |
- pixelheight = FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, rows); | |
+ if ([window isKindOfClass:[EmacsFullWindow class]]) { | |
+ pixelwidth = [[window screen] frame].size.width; | |
+ pixelheight = [[window screen] frame].size.height; | |
+ } | |
+ else { | |
+ pixelwidth = FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, cols); | |
+ pixelheight = FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, rows); | |
+ } | |
/* If we have a toolbar, take its height into account. */ | |
if (tb) | |
@@ -1150,7 +1163,7 @@ x_set_window_size (struct frame *f, int change_grav, int cols, int rows) | |
+ FRAME_NS_TOOLBAR_HEIGHT (f); | |
/* constrain to screen if we can */ | |
- if (screen) | |
+ if (screen && ![window isKindOfClass:[EmacsFullWindow class]]) | |
{ | |
NSSize sz = [screen visibleFrame].size; | |
NSSize ez = { wr.size.width - sz.width, wr.size.height - sz.height }; | |
@@ -1197,7 +1210,7 @@ x_set_window_size (struct frame *f, int change_grav, int cols, int rows) | |
change_frame_size (f, rows, cols, 0, 1, 0); /* pretend, delay, safe */ | |
FRAME_PIXEL_WIDTH (f) = pixelwidth; | |
FRAME_PIXEL_HEIGHT (f) = pixelheight; | |
-/* SET_FRAME_GARBAGED (f); // this short-circuits expose call in drawRect */ | |
+ /* SET_FRAME_GARBAGED (f); // this short-circuits expose call in drawRect */ | |
mark_window_cursors_off (XWINDOW (f->root_window)); | |
cancel_mouse_face (f); | |
@@ -5609,6 +5622,59 @@ extern void update_window_cursor (struct window *w, int on); | |
@implementation EmacsWindow | |
+-(NSWindow *)toggleFullscreen { | |
+ BOOL isFullscreen = [[self className] isEqualToString:@"EmacsFullWindow"]; | |
+ NSWindow *win; | |
+ | |
+ if (isFullscreen) { | |
+ EmacsFullWindow *f = (EmacsFullWindow *)self; | |
+ EmacsWindow *w = [f getNormalWindow]; | |
+ | |
+ [w setContentView:[f contentView]]; | |
+ [w makeKeyAndOrderFront:nil]; | |
+ | |
+ [f close]; | |
+ | |
+ win = w; | |
+ | |
+ if ([[self screen] isEqual:[[NSScreen screens] objectAtIndex:0]]) { | |
+ if ([NSApp respondsToSelector:@selector(setPresentationOptions:)]) { | |
+ [NSApp setPresentationOptions:NSApplicationPresentationDefault]; | |
+ } | |
+ else { | |
+ [NSMenu setMenuBarVisible:YES]; | |
+ } | |
+ } | |
+ } | |
+ else { | |
+ [self deminiaturize:nil]; | |
+ | |
+ if ([[self screen] isEqual:[[NSScreen screens] objectAtIndex:0]]) { | |
+ if ([NSApp respondsToSelector:@selector(setPresentationOptions:)]) { | |
+ [NSApp setPresentationOptions:NSApplicationPresentationAutoHideDock | NSApplicationPresentationAutoHideMenuBar]; | |
+ } | |
+ else { | |
+ [NSMenu setMenuBarVisible:NO]; | |
+ } | |
+ } | |
+ | |
+ [self orderOut:nil]; | |
+ | |
+ EmacsFullWindow *f = [[EmacsFullWindow alloc] initWithNormalWindow:self]; | |
+ EmacsView *view = (EmacsView *)[self delegate]; | |
+ [f setDelegate:view]; | |
+ [f makeFirstResponder:view]; | |
+ [f setContentView:[self contentView]]; | |
+ [f setContentSize:[[self screen] frame].size]; | |
+ [f setTitle:[self title]]; | |
+ [f makeKeyAndOrderFront:nil]; | |
+ | |
+ win = f; | |
+ } | |
+ | |
+ return win; | |
+} | |
+ | |
/* called only on resize clicks by special case in EmacsApp-sendEvent */ | |
- (void)mouseDown: (NSEvent *)theEvent | |
{ | |
@@ -5667,6 +5733,32 @@ extern void update_window_cursor (struct window *w, int on); | |
@end /* EmacsWindow */ | |
+@implementation EmacsFullWindow | |
+ | |
+-(BOOL)canBecomeKeyWindow { | |
+ return YES; | |
+} | |
+ | |
+-(id)initWithNormalWindow:(EmacsWindow *)window { | |
+ self = [super initWithContentRect:[window contentRectForFrameRect:[[window screen] frame]] | |
+ styleMask:NSBorderlessWindowMask | |
+ backing:NSBackingStoreBuffered | |
+ defer:YES]; | |
+ if (self) { | |
+ normalWindow = window; | |
+ [self setAcceptsMouseMovedEvents: YES]; | |
+ [self useOptimizedDrawing: YES]; | |
+ } | |
+ | |
+ return self; | |
+} | |
+ | |
+-(EmacsWindow *)getNormalWindow { | |
+ return normalWindow; | |
+} | |
+ | |
+@end /* EmacsFullWindow */ | |
+ | |
/* ========================================================================== | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment