unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* 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

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 public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).