[73248] trunk/dports/aqua/emacs-app
css at macports.org
css at macports.org
Sun Nov 7 07:04:53 PST 2010
Revision: 73248
http://trac.macports.org/changeset/73248
Author: css at macports.org
Date: 2010-11-07 07:04:48 -0800 (Sun, 07 Nov 2010)
Log Message:
-----------
Add emacs-app fullscreen patch. refs #27046
Modified Paths:
--------------
trunk/dports/aqua/emacs-app/Portfile
Added Paths:
-----------
trunk/dports/aqua/emacs-app/files/patch-fullscreen.diff
Modified: trunk/dports/aqua/emacs-app/Portfile
===================================================================
--- trunk/dports/aqua/emacs-app/Portfile 2010-11-07 13:57:01 UTC (rev 73247)
+++ trunk/dports/aqua/emacs-app/Portfile 2010-11-07 15:04:48 UTC (rev 73248)
@@ -1,8 +1,11 @@
+# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:ft=tcl:et:sw=4:ts=4:sts=4
# $Id$
PortSystem 1.0
+
name emacs-app
version 23.2
+revision 1
categories aqua editors
maintainers css
description The GNU Emacs text editor (Cocoa version)
@@ -31,6 +34,11 @@
configure.args --with-ns --without-x --without-dbus
+variant fullscreen description {Add fullscreen patch from http://gist.github.com/291150 as mentioned in http://www.sanityinc.com/full-screen-support-for-cocoa-emacs-on-osx} {
+ patchfiles patch-fullscreen.diff
+ patch.args -p1
+}
+
destroot {
system "cd ${worksrcpath} && make install"
xinstall -m 755 -d ${destroot}${applications_dir}
Added: trunk/dports/aqua/emacs-app/files/patch-fullscreen.diff
===================================================================
--- trunk/dports/aqua/emacs-app/files/patch-fullscreen.diff (rev 0)
+++ trunk/dports/aqua/emacs-app/files/patch-fullscreen.diff 2010-11-07 15:04:48 UTC (rev 73248)
@@ -0,0 +1,240 @@
+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;
++
++ at end
++
++/* 10.5 or below is not supported [NSWindow setStyleMask:], so require content swap hack */
++ at 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 */
+
++ at 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;
++}
++
++ at end /* EmacsFullWindow */
++
+
+ /* ==========================================================================
+
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macports-changes/attachments/20101107/ce9e92ff/attachment.html>
More information about the macports-changes
mailing list