]> code.delx.au - gnu-emacs/commitdiff
Ensure NS frames remain hidden when invisible
authorDavid Reitter <david.reitter@gmail.com>
Tue, 26 May 2009 18:14:14 +0000 (18:14 +0000)
committerDavid Reitter <david.reitter@gmail.com>
Tue, 26 May 2009 18:14:14 +0000 (18:14 +0000)
* nsterm.m (ns_raise_frame): only raise frame if visible.
(x_make_frame_visible): move frame to front rather than calling
ns_raise_frame().
(keyDown:) do not swallow events that aren't re-sent if frame
isn't key window.
(drawRect:) do not set visibility/iconified flags because
drawRect may be called by NSView even if the frame is hidden.

* nsfns.m (Fx_create_frame): follow other ports in
determining visibility; default to t. Ensure async_visible is set.

src/ChangeLog
src/nsfns.m
src/nsterm.m

index c51bbd52b6348654022b391d3c0e8855307a3f11..3a44cebd1ab280270ae32ce2f792eb7fdb2c5257 100644 (file)
@@ -1,3 +1,16 @@
+2009-05-25  David Reitter  <david.reitter@gmail.com>
+
+       * nsterm.m (ns_raise_frame): only raise frame if visible.
+       (x_make_frame_visible): move frame to front rather than calling
+       ns_raise_frame().
+       (keyDown:) do not swallow events that aren't re-sent if frame
+       isn't key window.
+       (drawRect:) do not set visibility/iconified flags because
+       drawRect may be called by NSView even if the frame is hidden.
+
+       * nsfns.m (Fx_create_frame): follow other ports in
+       determining visibility; default to t. Ensure async_visible is set.
+
 2009-05-23  Eli Zaretskii  <eliz@gnu.org>
 
        * dired.c (Ffile_attributes): Doc fix.
index 01ffcf1181c9148a5a358492d66ee0db19ecfef2..5d944593f56065f7dd9e82d0c6d397d6b8506a98 100644 (file)
@@ -1317,13 +1317,20 @@ be shared by the new frame.  */)
 
   if (! f->output_data.ns->explicit_parent)
     {
-        tem = x_get_arg (dpyinfo, parms, Qvisibility, 0, 0, RES_TYPE_BOOLEAN);
-        if (EQ (tem, Qunbound))
-            tem = Qnil;
-
-        x_set_visibility (f, tem, Qnil);
-        if (EQ (tem, Qt))
-            [[FRAME_NS_VIEW (f) window] makeKeyWindow];
+      tem = x_get_arg (dpyinfo, parms, Qvisibility, 0, 0, RES_TYPE_SYMBOL);
+      if (EQ (tem, Qunbound))
+       tem = Qt;
+      x_set_visibility (f, tem, Qnil);
+      if (EQ (tem, Qicon))
+       x_iconify_frame (f);
+      else if (! NILP (tem))
+       {
+         x_make_frame_visible (f);
+         f->async_visible = 1;
+         [[FRAME_NS_VIEW (f) window] makeKeyWindow];
+       }
+      else
+         f->async_visible = 0;
     }
 
   if (FRAME_HAS_MINIBUF_P (f)
index 9ca74e8baf94c9f01247a41d0bda2ced4487a706..4a9a192835919aceaf1606e6f7af1704d7ff3b4b 100644 (file)
@@ -896,7 +896,11 @@ ns_raise_frame (struct frame *f)
   NSView *view = FRAME_NS_VIEW (f);
   check_ns ();
   BLOCK_INPUT;
-  [[view window] makeKeyAndOrderFront: NSApp];
+  FRAME_SAMPLE_VISIBILITY (f);
+  if (FRAME_VISIBLE_P (f))
+    {
+      [[view window] makeKeyAndOrderFront: NSApp];
+    }
   UNBLOCK_INPUT;
 }
 
@@ -983,7 +987,10 @@ x_make_frame_visible (struct frame *f)
      called this (frame.c:Fraise_frame ()) also called raise_lower;
      if this ends up the case again, comment this out again. */
   if (!FRAME_VISIBLE_P (f))
-    ns_raise_frame (f);
+    {
+      f->async_visible = 1;
+      ns_raise_frame (f);
+    }
 }
 
 
@@ -4461,7 +4468,8 @@ extern void update_window_cursor (struct window *w, int on);
   if (!emacs_event)
     return;
 
- if (![[self window] isKeyWindow])
+ if (![[self window] isKeyWindow]
+     && [[theEvent window] isKindOfClass: [EmacsWindow class]])
    {
      /* XXX: There is an occasional condition in which, when Emacs display
          updates a different frame from the current one, and temporarily
@@ -4469,8 +4477,7 @@ extern void update_window_cursor (struct window *w, int on);
          (dispnew.c:3878), OS will send the event to the correct NSWindow, but
          for some reason that window has its first responder set to the NSView
          most recently updated (I guess), which is not the correct one. */
-     if ([[theEvent window] isKindOfClass: [EmacsWindow class]])
-         [(EmacsView *)[[theEvent window] delegate] keyDown: theEvent];
+     [(EmacsView *)[[theEvent window] delegate] keyDown: theEvent];
      return;
    }
 
@@ -5466,8 +5473,15 @@ extern void update_window_cursor (struct window *w, int on);
 
   ns_clear_frame_area (emacsframe, x, y, width, height);
   expose_frame (emacsframe, x, y, width, height);
-  emacsframe->async_visible = 1;
-  emacsframe->async_iconified = 0;
+
+  /*
+    drawRect: may be called (at least in OS X 10.5) for invisible
+    views as well for some reason.  Thus, do not infer visibility 
+    here.
+
+    emacsframe->async_visible = 1;
+    emacsframe->async_iconified = 0;
+  */
 }