* Fullscreen patch for Cocoa Emacs
@ 2010-02-01 0:00 Filipe Cabecinhas
2010-02-02 11:16 ` Ivan Andrus
0 siblings, 1 reply; 4+ messages in thread
From: Filipe Cabecinhas @ 2010-02-01 0:00 UTC (permalink / raw)
To: emacs-devel
[-- 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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
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Fullscreen patch for Cocoa Emacs
2010-02-01 0:00 Fullscreen patch for Cocoa Emacs Filipe Cabecinhas
@ 2010-02-02 11:16 ` Ivan Andrus
2010-02-02 14:42 ` David Reitter
2010-02-02 23:57 ` YAMAMOTO Mitsuharu
0 siblings, 2 replies; 4+ messages in thread
From: Ivan Andrus @ 2010-02-02 11:16 UTC (permalink / raw)
To: Filipe Cabecinhas; +Cc: emacs-devel
> 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é.
This works for me, except that the toolbar is not shown in fullscreen mode. Is this difficult for some technical reason, or just not desired?
When I turn off fullscreen mode the toolbar is no longer displayed. Also, the scroll bars do not work in fullscreen mode (I have them on the left if that makes a difference). There is just a white rectangle where they should be.
That said I really appreciate this patch.
-Ivan
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Fullscreen patch for Cocoa Emacs
2010-02-02 11:16 ` Ivan Andrus
@ 2010-02-02 14:42 ` David Reitter
2010-02-02 23:57 ` YAMAMOTO Mitsuharu
1 sibling, 0 replies; 4+ messages in thread
From: David Reitter @ 2010-02-02 14:42 UTC (permalink / raw)
To: Filipe Cabecinhas, Ivan Andrus
Cc: Chong Yidong, emacs-devel@gnu.org discussions
[-- Attachment #1: Type: text/plain, Size: 1047 bytes --]
On Feb 2, 2010, at 6:16 AM, Ivan Andrus wrote:
>> 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é.
>
> This works for me, except that the toolbar is not shown in fullscreen mode. Is this difficult for some technical reason, or just not desired?
>
> When I turn off fullscreen mode the toolbar is no longer displayed. Also, the scroll bars do not work in fullscreen mode (I have them on the left if that makes a difference). There is just a white rectangle where they should be.
There are plenty of other problems, including flickering scrollbars in the frame after switching back from fullscreen mode (until the frame is deleted+recreated, or possibly minimized). And of course it breaks backward compatibility with earlier OS X versions.
So, code quality is one reason why I have not committed my change here and why I am not ready to assign the rights to the code. Help with debugging would be appreciated.
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 203 bytes --]
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Fullscreen patch for Cocoa Emacs
2010-02-02 11:16 ` Ivan Andrus
2010-02-02 14:42 ` David Reitter
@ 2010-02-02 23:57 ` YAMAMOTO Mitsuharu
1 sibling, 0 replies; 4+ messages in thread
From: YAMAMOTO Mitsuharu @ 2010-02-02 23:57 UTC (permalink / raw)
To: Ivan Andrus; +Cc: Filipe Cabecinhas, emacs-devel
>>>>> On Tue, 2 Feb 2010 12:16:51 +0100, Ivan Andrus <darthandrus@gmail.com> said:
>> 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é.
> This works for me, except that the toolbar is not shown in
> fullscreen mode. Is this difficult for some technical reason, or
> just not desired?
Unlike GTK+, the Cocoa toolbar is considered by design as extension of
the title bar, not part of the window contents. So a window without
the title bar cannot display the Cocoa toolbar.
The Mac port uses Emacs-native toolbars, which are used in W32 and
non-GTK+ X11 builds, instead of Cocoa ones for fullscreen frames:
http://lists.gnu.org/archive/html/emacs-devel/2010-01/msg01487.html
You may want to try this if you can accept its
experimental/hackers-only status. (That does not mean it is
unstable.) Its fullscreen mode is supposed to be robust against
several configuration changes trigerred by either frame parameters or
external environments such as monitor configurations. If you find
some problematic cases about the fullscreen mode on the Mac port,
please report them to the address written in the README-mac file, not
here.
YAMAMOTO Mitsuharu
mituharu@math.s.chiba-u.ac.jp
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2010-02-02 23:57 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-02-01 0:00 Fullscreen patch for Cocoa Emacs Filipe Cabecinhas
2010-02-02 11:16 ` Ivan Andrus
2010-02-02 14:42 ` David Reitter
2010-02-02 23:57 ` YAMAMOTO Mitsuharu
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.