Implement "window cascading" on NS

* src/nsfns.m (Fx_create_frame): Cascade new frame position if
size hint flags are not USPosition or PPosition.
This commit is contained in:
Po Lu 2022-03-06 10:43:25 +08:00
parent db2cb522e1
commit e09bbfc37d

View file

@ -1112,6 +1112,7 @@ Turn the input menu (an NSMenu) into a lisp list for tracking on lisp side.
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 @@ Turn the input menu (an NSMenu) into a lisp list for tracking on lisp side.
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. */