From: Filipe Cabecinhas <filcab@gmail.com>
To: emacs-devel@gnu.org
Subject: Fullscreen patch for Cocoa Emacs
Date: Mon, 01 Feb 2010 00:00:01 +0000 [thread overview]
Message-ID: <4B661981.5000004@gmail.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 193 bytes --]
Hi.
This is a patch to port Aquamacs' fullscreen mode to GNU Emacs. With
this patch we also hide the old frame, instead of displaying an empty
frame when using Exposé.
Regards,
Filipe
[-- Attachment #2: cocoa-fullscreen.patch --]
[-- Type: text/plain, Size: 11585 bytes --]
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: filcab@gmail.com-20100131235816-0nyldg5dd0835jjk
# target_branch: http://bzr.savannah.gnu.org/r/emacs/trunk
# testament_sha1: cb25bfa7130858067241507e19cd3d6a13629ee6
# timestamp: 2010-01-31 23:59:04 +0000
# base_revision_id: handa@m17n.org-20100131070807-d62s9ooqgebvu7s7
#
# Begin patch
=== modified file 'src/nsfns.m'
--- src/nsfns.m 2010-01-15 01:46:53 +0000
+++ src/nsfns.m 2010-01-31 23:58:16 +0000
@@ -1029,7 +1029,7 @@
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 */
+ x_set_fullscreen, /* generic OK */
x_set_font_backend, /* generic OK */
x_set_alpha,
0, /* x_set_sticky */
=== modified file 'src/nsterm.m'
--- src/nsterm.m 2010-01-31 05:23:09 +0000
+++ src/nsterm.m 2010-01-31 23:58:16 +0000
@@ -1103,6 +1103,10 @@
NSTRACE (x_set_offset);
+ /* Refuse to change one or both offsets if in full-screen mode. */
+ if (f->want_fullscreen & FULLSCREEN_BOTH)
+ return;
+
BLOCK_INPUT;
f->left_pos = xoff;
@@ -1150,6 +1154,9 @@
&& oldTB == tb))
return;
+ if (f->want_fullscreen & FULLSCREEN_BOTH)
+ return;
+
/*fprintf (stderr, "\tsetWindowSize: %d x %d, font size %d x %d\n", cols, rows, FRAME_COLUMN_WIDTH (f), FRAME_LINE_HEIGHT (f)); */
BLOCK_INPUT;
@@ -3446,6 +3453,168 @@
}
+/* From AquaMacs: Fullscreen mode*/
+/* ==========================================================================
+
+ Fullscreen
+
+ ========================================================================== */
+
+#ifndef NSAppKitVersionNumber10_5
+#define NSAppKitVersionNumber10_5 949
+#endif
+
+/* Hack to allow for compilation with pre-10.6 SDKs */
+#define _NSApplicationPresentationAutoHideDock (1 << 0)
+#define _NSApplicationPresentationAutoHideMenuBar (1 << 2)
+
+extern NSString * const NSFullScreenModeAllScreens __attribute__((weak_import));
+
+
+static void
+ns_fullscreen_hook (f)
+FRAME_PTR f;
+{
+ int rows, cols;
+ int fs =0;
+ int width, height, ign;
+
+#ifdef NS_IMPL_COCOA
+ if (f->async_visible)
+ {
+ EmacsView *view = FRAME_NS_VIEW (f);
+
+ if ([view respondsToSelector:@selector(exitFullScreenModeWithOptions:)])
+ {
+ BLOCK_INPUT;
+ NSDisableScreenUpdates();
+ NSDictionary *opts;
+
+ switch (f->want_fullscreen)
+ {
+ case FULLSCREEN_BOTH:
+ if (NSAppKitVersionNumber < NSAppKitVersionNumber10_5)
+ {
+ opts = [NSDictionary dictionaryWithObjectsAndKeys: nil];
+ } else if (NSAppKitVersionNumber < NSAppKitVersionNumber10_5+1) /* not 10.6 yet? */
+ {
+ opts = [NSDictionary dictionaryWithObjectsAndKeys:
+ [NSNumber numberWithBool:NO],
+ NSFullScreenModeAllScreens, /* defined from 10.5 on */
+ nil];
+ } else /* 10.6 and later. */
+ {
+ opts = [NSDictionary dictionaryWithObjectsAndKeys:
+ [NSNumber numberWithBool:NO],
+ NSFullScreenModeAllScreens,
+ /* let menu and Dock appear if mouse is moved there. */
+ [NSNumber numberWithInt: (_NSApplicationPresentationAutoHideMenuBar|_NSApplicationPresentationAutoHideDock)],
+ /* hack: avoid using constant to allow for compilation with pre-10.6 SDKs */
+ @"NSFullScreenModeApplicationPresentationOptions", /* defined from 10.6 on */
+ nil];
+ }
+
+ /* Hide the non-fullscreened window while on fullscreen mode. */
+ [[view window] orderOut: NSApp];
+ [view enterFullScreenMode:[[view window] screen]
+ withOptions:opts];
+ FRAME_NS_WINDOW (f) = [view window];
+
+ fs = 1;
+ [NSCursor setHiddenUntilMouseMoves:YES];
+
+ break;
+ default:
+ [view exitFullScreenModeWithOptions: nil];
+ FRAME_NS_WINDOW (f) = [view window];
+ /* restore from fullscreen NSWindow: */
+ [[view window] makeFirstResponder: view];
+ }
+
+ NSRect vr = [view frame];
+
+ NSRect r = [[view window] frame];
+ width = r.size.width;
+ height = r.size.height;
+
+ /* NS removes toolbar / titlebar for fullscreen.
+ We need to recalculate frame geometry and
+ update frame parameters. */
+ FRAME_NS_TITLEBAR_HEIGHT (f) = height - vr.size.height;
+
+ if ([[[view window] toolbar] isVisible])
+ {
+ FRAME_EXTERNAL_TOOL_BAR (f) = 1;
+ update_frame_tool_bar (f);
+ x_set_frame_parameters (f, Fcons (Fcons (Qtool_bar_lines, make_number(1)),
+ Qnil));
+ }
+ else
+ {
+ if (FRAME_EXTERNAL_TOOL_BAR (f))
+ {
+ free_frame_tool_bar (f);
+ FRAME_EXTERNAL_TOOL_BAR (f) = 0;
+ }
+ x_set_frame_parameters (f, Fcons (Fcons (Qtool_bar_lines, make_number(0)),
+ Qnil));
+ }
+
+ /* to do: save and restore previous state of tool bar */
+
+ if (FRAME_EXTERNAL_TOOL_BAR (f))
+ {
+
+ FRAME_NS_TOOLBAR_HEIGHT (f) =
+ NSHeight ([[view window] frameRectForContentRect: NSMakeRect (0, 0, 0, 0)])
+ - FRAME_NS_TITLEBAR_HEIGHT (f);
+ }
+ else
+ FRAME_NS_TOOLBAR_HEIGHT (f) = 0;
+
+
+
+ cols = FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f,
+ width);
+ if (cols < MINWIDTH)
+ cols = MINWIDTH;
+ rows = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, height
+ - FRAME_NS_TITLEBAR_HEIGHT (f)
+ - FRAME_NS_TOOLBAR_HEIGHT (f));
+ if (rows < MINHEIGHT)
+ rows = MINHEIGHT;
+
+ /* Handle scroll bars */
+ set_vertical_scroll_bar (XWINDOW (f->root_window));
+
+ FRAME_NS_DISPLAY_INFO (f)->x_focus_frame = f;
+
+ FRAME_PIXEL_WIDTH (f) = width;
+ FRAME_PIXEL_HEIGHT (f) = height;
+ if (FRAME_COLS (f) != cols || FRAME_LINES (f) != rows)
+ {
+ change_frame_size (f, rows, cols, 0, 0, 1); /* pretend, delay, safe */
+ SET_FRAME_GARBAGED (f);
+ cancel_mouse_face (f);
+ }
+ x_set_window_size (f, 0, f->text_cols, f->text_lines);
+
+ f->async_iconified = 0;
+ f->async_visible = 1;
+ windows_or_buffers_changed++;
+ SET_FRAME_GARBAGED (f);
+ ns_raise_frame (f);
+ ns_frame_rehighlight (f);
+ ns_send_appdefined (-1);
+
+ NSEnableScreenUpdates();
+
+ UNBLOCK_INPUT;
+ }
+ }
+#endif
+}
+
/* ==========================================================================
@@ -3679,7 +3848,7 @@
terminal->frame_rehighlight_hook = ns_frame_rehighlight;
terminal->frame_raise_lower_hook = ns_frame_raise_lower;
- terminal->fullscreen_hook = 0; /* see XTfullscreen_hook */
+ terminal->fullscreen_hook = ns_fullscreen_hook; /* see XTfullscreen_hook */
terminal->set_vertical_scroll_bar_hook = ns_set_vertical_scroll_bar;
terminal->condemn_scroll_bars_hook = ns_condemn_scroll_bars;
@@ -4918,6 +5087,9 @@
NSTRACE (windowWillResize);
/*fprintf (stderr,"Window will resize: %.0f x %.0f\n",frameSize.width,frameSize.height); */
+ if (emacsframe->want_fullscreen & FULLSCREEN_BOTH)
+ return;
+
cols = FRAME_PIXEL_WIDTH_TO_TEXT_COLS (emacsframe,
#ifdef NS_IMPL_GNUSTEP
frameSize.width + 3);
@@ -4995,6 +5167,9 @@
NSTRACE (windowDidResize);
/*fprintf (stderr,"windowDidResize: %.0f\n",[theWindow frame].size.height); */
+ if (emacsframe->want_fullscreen & FULLSCREEN_BOTH)
+ return;
+
#ifdef NS_IMPL_COCOA
if (old_title != 0)
{
@@ -5191,6 +5366,9 @@
NSTRACE (windowDidMove);
+ if (emacsframe->want_fullscreen & FULLSCREEN_BOTH)
+ return;
+
if (!emacsframe->output_data.ns)
return;
if (screen != nil)
# Begin bundle
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
next reply other threads:[~2010-02-01 0:00 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-02-01 0:00 Filipe Cabecinhas [this message]
2010-02-02 11:16 ` Fullscreen patch for Cocoa Emacs Ivan Andrus
2010-02-02 14:42 ` David Reitter
2010-02-02 23:57 ` YAMAMOTO Mitsuharu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4B661981.5000004@gmail.com \
--to=filcab@gmail.com \
--cc=emacs-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.