emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master e09bbfc37d: Implement "window cascading" on NS


From: Po Lu
Subject: master e09bbfc37d: Implement "window cascading" on NS
Date: Sat, 5 Mar 2022 21:45:08 -0500 (EST)

branch: master
commit e09bbfc37d81d58af3412ae1b56dc2e620218653
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>

    Implement "window cascading" on NS
    
    * src/nsfns.m (Fx_create_frame): Cascade new frame position if
    size hint flags are not USPosition or PPosition.
---
 src/nsfns.m | 22 +++++++++++++++++++++-
 1 file changed, 21 insertions(+), 1 deletion(-)

diff --git a/src/nsfns.m b/src/nsfns.m
index 1900616b9d..6256bd220d 100644
--- a/src/nsfns.m
+++ b/src/nsfns.m
@@ -1112,6 +1112,7 @@ DEFUN ("x-create-frame", Fx_create_frame, Sx_create_frame,
   Lisp_Object parent, parent_frame;
   struct kboard *kb;
   static int desc_ctr = 1;
+  NSWindow *main_window = [NSApp mainWindow];
 
   /* gui_display_get_arg modifies parms.  */
   parms = Fcopy_alist (parms);
@@ -1483,8 +1484,27 @@ DEFUN ("x-create-frame", Fx_create_frame, 
Sx_create_frame,
     if (CONSP (XCAR (tem)) && !NILP (XCAR (XCAR (tem))))
       fset_param_alist (f, Fcons (XCAR (tem), f->param_alist));
 
-  if (window_prompting & USPosition)
+  /* This cascading behavior (which is the job of the window manager
+     on X-based systems) is something NS applications are expected to
+     implement themselves.  At least one person tells me he used
+     Carbon Emacs solely for this behavior.  */
+  if (window_prompting & (USPosition | PPosition) || FRAME_PARENT_FRAME (f))
     ns_set_offset (f, f->left_pos, f->top_pos, 1);
+  else
+    {
+      NSWindow *frame_window = [FRAME_NS_VIEW (f) window];
+      NSPoint top_left;
+
+      if (main_window)
+       {
+         top_left = NSMakePoint (NSMinX ([main_window frame]),
+                                 NSMaxY ([main_window frame]));
+         top_left = [frame_window cascadeTopLeftFromPoint: top_left];
+         [frame_window cascadeTopLeftFromPoint: top_left];
+       }
+      else
+       [main_window center];
+    }
 
   /* Make sure windows on this frame appear in calls to next-window
      and similar functions.  */



reply via email to

[Prev in Thread] Current Thread [Next in Thread]