Created
January 4, 2012 16:03
-
-
Save leoncamel/1560693 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 df0ddd7..c576f02 100644 | |
--- a/lisp/term/ns-win.el | |
+++ b/lisp/term/ns-win.el | |
@@ -930,6 +930,10 @@ See the documentation of `create-fontset-from-fontset-spec' for the format.") | |
(add-to-list 'frame-creation-function-alist '(ns . x-create-frame-with-faces)) | |
(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) | |
diff --git a/src/nsfns.m b/src/nsfns.m | |
index ecefd71..fd3025c 100644 | |
--- a/src/nsfns.m | |
+++ b/src/nsfns.m | |
@@ -1001,6 +1001,25 @@ x_icon (struct frame *f, Lisp_Object parms) | |
error ("Both left and top icon corners of icon must be specified"); | |
} | |
+void | |
+ns_set_fullscreen(struct frame *f) | |
+{ | |
+ | |
+ if (f) | |
+ { | |
+ EmacsWindow *window = ns_get_window(f); | |
+ if (f->want_fullscreen != FULLSCREEN_BOTH) | |
+ { | |
+#if defined (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7 | |
+ [window toggleFullScreen:nil]; | |
+#endif | |
+ } | |
+ else if (f->want_fullscreen == FULLSCREEN_BOTH) | |
+ { | |
+ // TODO: | |
+ } | |
+ } | |
+} | |
/* Note: see frame.c for template, also where generic functions are impl */ | |
frame_parm_handler ns_frame_parm_handlers[] = | |
@@ -1033,7 +1052,7 @@ frame_parm_handler ns_frame_parm_handlers[] = | |
x_set_fringe_width, /* generic OK */ | |
x_set_fringe_width, /* generic OK */ | |
0, /* x_set_wait_for_wm, will ignore */ | |
- 0, /* x_set_fullscreen will ignore */ | |
+ ns_set_fullscreen, | |
x_set_font_backend, /* generic OK */ | |
x_set_alpha, | |
0, /* x_set_sticky */ | |
@@ -2609,6 +2628,22 @@ Value is t if tooltip was open, nil otherwise. */) | |
} | |
+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); | |
+ | |
+#if defined (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7 | |
+ [window toggleFullScreen:nil]; | |
+#endif | |
+ | |
+ return Qnil; | |
+} | |
+ | |
+ | |
/* ========================================================================== | |
Class implementations | |
@@ -2766,6 +2801,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/nsmenu.m b/src/nsmenu.m | |
index 94c6b6a..150a400 100644 | |
--- a/src/nsmenu.m | |
+++ b/src/nsmenu.m | |
@@ -1015,7 +1015,7 @@ free_frame_tool_bar (FRAME_PTR f) | |
-------------------------------------------------------------------------- */ | |
{ | |
BLOCK_INPUT; | |
- [[FRAME_NS_VIEW (f) toolbar] setVisible: NO]; | |
+ [[FRAME_NS_VIEW (f) window] setToolbar: nil]; | |
FRAME_TOOLBAR_HEIGHT (f) = 0; | |
UNBLOCK_INPUT; | |
} | |
@@ -1032,6 +1032,8 @@ update_frame_tool_bar (FRAME_PTR f) | |
EmacsToolbar *toolbar = [view toolbar]; | |
BLOCK_INPUT; | |
+ [window setToolbar: toolbar]; | |
+ | |
[toolbar clearActive]; | |
/* update EmacsToolbar as in GtkUtils, build items list */ | |
diff --git a/src/nsterm.h b/src/nsterm.h | |
index 14918cc..5efb971 100644 | |
--- a/src/nsterm.h | |
+++ b/src/nsterm.h | |
@@ -38,6 +38,9 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ | |
#ifndef MAC_OS_X_VERSION_10_6 | |
#define MAC_OS_X_VERSION_10_6 1060 | |
#endif | |
+#ifndef MAC_OS_X_VERSION_10_7 | |
+#define MAC_OS_X_VERSION_10_7 1070 | |
+#endif | |
#endif /* NS_IMPL_COCOA */ | |
#ifdef __OBJC__ | |
diff --git a/src/nsterm.m b/src/nsterm.m | |
index f8e69f9..a65723c 100644 | |
--- a/src/nsterm.m | |
+++ b/src/nsterm.m | |
@@ -5301,39 +5301,7 @@ ns_term_shutdown (int sig) | |
#endif | |
if (rows < MINHEIGHT) | |
rows = MINHEIGHT; | |
-#ifdef NS_IMPL_COCOA | |
- { | |
- /* this sets window title to have size in it; the wm does this under GS */ | |
- NSRect r = [[self window] frame]; | |
- if (r.size.height == frameSize.height && r.size.width == frameSize.width) | |
- { | |
- if (old_title != 0) | |
- { | |
- xfree (old_title); | |
- old_title = 0; | |
- } | |
- } | |
- else | |
- { | |
- char *size_title; | |
- NSWindow *window = [self window]; | |
- if (old_title == 0) | |
- { | |
- const char *t = [[[self window] title] UTF8String]; | |
- char *pos = strstr (t, " — "); | |
- if (pos) | |
- *pos = '\0'; | |
- old_title = (char *) xmalloc (strlen (t) + 1); | |
- strcpy (old_title, t); | |
- } | |
- size_title = xmalloc (strlen (old_title) + 40); | |
- esprintf (size_title, "%s — (%d x %d)", old_title, cols, rows); | |
- [window setTitle: [NSString stringWithUTF8String: size_title]]; | |
- [window display]; | |
- xfree (size_title); | |
- } | |
- } | |
-#endif /* NS_IMPL_COCOA */ | |
+ | |
/*fprintf (stderr," ...size became %.0f x %.0f (%d x %d)\n",frameSize.width,frameSize.height,cols,rows); */ | |
return frameSize; | |
@@ -5355,14 +5323,6 @@ ns_term_shutdown (int sig) | |
NSTRACE (windowDidResize); | |
/*fprintf (stderr,"windowDidResize: %.0f\n",[theWindow frame].size.height); */ | |
-#ifdef NS_IMPL_COCOA | |
- if (old_title != 0) | |
- { | |
- xfree (old_title); | |
- old_title = 0; | |
- } | |
-#endif /* NS_IMPL_COCOA */ | |
- | |
/* Avoid loop under GNUstep due to call at beginning of this function. | |
(x_set_window_size causes a resize which causes | |
a "windowDidResize" which calls x_set_window_size). */ | |
@@ -5390,6 +5350,60 @@ ns_term_shutdown (int sig) | |
ns_send_appdefined (-1); | |
} | |
+#if defined (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7 | |
+- (void)windowDidEnterFullScreen:(NSNotification *)notification | |
+{ | |
+ NSTRACE (windowDidEnterFullScreen); | |
+ /* NSLog(@"Calling windowDidEnterFullScreen"); */ | |
+ | |
+ NSWindow *window = [self window]; | |
+ NSRect wr = [window frame]; | |
+ int w = (int)wr.size.width - emacsframe->border_width; | |
+ int h = (int)wr.size.height; | |
+ cols = FRAME_PIXEL_WIDTH_TO_TEXT_COLS(emacsframe, w); | |
+ rows = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES(emacsframe, h); | |
+ /* NSLog(@"window_size=%dx%d (%dx%d)", w, h, cols, rows); */ | |
+ FRAME_PIXEL_WIDTH (emacsframe) = w; | |
+ FRAME_PIXEL_HEIGHT (emacsframe) = h; | |
+ change_frame_size (emacsframe, rows, cols, 0, 1, 0); | |
+ SET_FRAME_GARBAGED (emacsframe); | |
+ cancel_mouse_face (emacsframe); | |
+ ns_send_appdefined (-1); | |
+} | |
+#endif | |
+ | |
+#if defined (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7 | |
+- (void)windowDidExitFullScreen:(NSNotification *)notification | |
+{ | |
+ NSTRACE (windowDidExitFullScreen); | |
+ /* NSLog(@"Calling windowDidExitFullScreen"); */ | |
+ | |
+ NSWindow *window = [self window]; | |
+ NSRect wr = [window frame]; | |
+ int w = (int)wr.size.width - emacsframe->border_width; | |
+ int h = (int)wr.size.height | |
+ - FRAME_NS_TITLEBAR_HEIGHT (emacsframe) | |
+ - FRAME_TOOLBAR_HEIGHT (emacsframe); | |
+ cols = FRAME_PIXEL_WIDTH_TO_TEXT_COLS(emacsframe, w); | |
+ rows = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES(emacsframe, h); | |
+ /* NSLog(@"window_size=%dx%d (%dx%d)", w, h, cols, rows); */ | |
+ FRAME_PIXEL_WIDTH (emacsframe) = w; | |
+ FRAME_PIXEL_HEIGHT (emacsframe) = h; | |
+ change_frame_size (emacsframe, rows, cols, 0, 1, 0); | |
+ SET_FRAME_GARBAGED (emacsframe); | |
+ cancel_mouse_face (emacsframe); | |
+ ns_send_appdefined (-1); | |
+} | |
+#endif | |
+ | |
+#if defined (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7 | |
+- (NSApplicationPresentationOptions)window:(NSWindow *)window willUseFullScreenPresentationOptions:(NSApplicationPresentationOptions)proposedOptions | |
+{ | |
+ /* NSLog(@"Calling window:willUseFullScreenPresentationOptions: %d", proposedOptions); */ | |
+ return proposedOptions | NSApplicationPresentationAutoHideToolbar; | |
+} | |
+#endif | |
+ | |
- (void)windowDidBecomeKey: (NSNotification *)notification | |
/* cf. x_detect_focus_change(), x_focus_changed(), x_new_focus_frame() */ | |
@@ -5561,6 +5575,14 @@ ns_term_shutdown (int sig) | |
[NSApp registerServicesMenuSendTypes: ns_send_types | |
returnTypes: nil]; | |
+#if defined (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7 | |
+ if (NSApp != nil && [NSApp isActive]) | |
+ { | |
+ [NSApp setPresentationOptions: NSApplicationPresentationFullScreen | [NSApp presentationOptions] ]; | |
+ [win setCollectionBehavior: NSWindowCollectionBehaviorFullScreenPrimary | [win collectionBehavior] ]; | |
+ } | |
+#endif | |
+ | |
ns_window_num++; | |
return self; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment