Skip to content

Instantly share code, notes, and snippets.

@cefstat
Created November 10, 2011 19:31
Show Gist options
  • Save cefstat/1355895 to your computer and use it in GitHub Desktop.
Save cefstat/1355895 to your computer and use it in GitHub Desktop.
Patch for Emacs fullscreen support under Mac OS X 10.7 (Lion)
=== modified file 'lisp/term/ns-win.el'
--- old/lisp/term/ns-win.el 2011-10-01 20:32:01 +0000
+++ new/lisp/term/ns-win.el 2011-11-10 16:22:51 +0000
@@ -928,6 +928,10 @@
(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)
=== modified file 'src/nsfns.m'
--- old/src/nsfns.m 2011-11-05 12:25:01 +0000
+++ new/src/nsfns.m 2011-11-10 18:54:31 +0000
@@ -2567,6 +2567,22 @@
}
+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
@@ -2724,6 +2740,8 @@
defsubr (&Sx_show_tip);
defsubr (&Sx_hide_tip);
+ defsubr (&Sns_toggle_fullscreen_internal);
+
/* used only in fontset.c */
check_window_system_func = check_ns;
=== modified file 'src/nsmenu.m'
--- old/src/nsmenu.m 2011-07-29 05:31:12 +0000
+++ new/src/nsmenu.m 2011-11-10 16:22:51 +0000
@@ -986,7 +986,7 @@
-------------------------------------------------------------------------- */
{
BLOCK_INPUT;
- [[FRAME_NS_VIEW (f) toolbar] setVisible: NO];
+ [[FRAME_NS_VIEW (f) window] setToolbar: nil];
FRAME_TOOLBAR_HEIGHT (f) = 0;
UNBLOCK_INPUT;
}
@@ -1003,6 +1003,8 @@
EmacsToolbar *toolbar = [view toolbar];
BLOCK_INPUT;
+ [window setToolbar: toolbar];
+
[toolbar clearActive];
/* update EmacsToolbar as in GtkUtils, build items list */
=== modified file 'src/nsterm.h'
--- old/src/nsterm.h 2011-09-09 01:06:52 +0000
+++ new/src/nsterm.h 2011-11-10 18:39:22 +0000
@@ -38,6 +38,9 @@
#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__
=== modified file 'src/nsterm.m'
--- old/src/nsterm.m 2011-11-05 12:25:01 +0000
+++ new/src/nsterm.m 2011-11-10 18:54:02 +0000
@@ -5299,39 +5299,7 @@
#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;
@@ -5353,14 +5321,6 @@
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). */
@@ -5388,6 +5348,60 @@
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() */
@@ -5559,6 +5573,14 @@
[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 setPresentationOptions: NSApplicationPresentationFullScreen | [NSApp presentationOptions] ];
+ [win setCollectionBehavior: NSWindowCollectionBehaviorFullScreenPrimary | [win collectionBehavior] ];
+ }
+#endif
+
ns_window_num++;
return self;
}
@cefstat
Copy link
Author

cefstat commented Jun 7, 2012

I forgot to mention: I modified the gist so that now there is no check whether Emacs is active.

@renard
Copy link

renard commented Sep 20, 2012

In order to make this patch work correctly you should change the windowDidEnterFullScreen function
with that hunk:

+#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;
+    NSView *view = FRAME_NS_VIEW (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);
+    [view setFrame: NSMakeRect (0, 0, w, h)];
+    ns_send_appdefined (-1);
+}
+#endif

You need that because now the updateFrameSize function redraws the window frame and the top of the fullscreen window is not used (this size is the toolbar size) and the minibuffer is then on half drawn.

@renard
Copy link

renard commented Sep 28, 2012

For information a working patch and build setup s available at https://github.com/renard/emacs-build-macosx

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment