diff options
| author | Po Lu | 2022-03-06 10:43:25 +0800 |
|---|---|---|
| committer | Po Lu | 2022-03-06 10:43:25 +0800 |
| commit | e09bbfc37d81d58af3412ae1b56dc2e620218653 (patch) | |
| tree | 347ec2352781cc8d5ae2c0a9a00042c8035e8075 /src | |
| parent | db2cb522e154ce97b7a780572d2cb99d82d291ca (diff) | |
| download | emacs-e09bbfc37d81d58af3412ae1b56dc2e620218653.tar.gz emacs-e09bbfc37d81d58af3412ae1b56dc2e620218653.zip | |
Implement "window cascading" on NS
* src/nsfns.m (Fx_create_frame): Cascade new frame position if
size hint flags are not USPosition or PPosition.
Diffstat (limited to 'src')
| -rw-r--r-- | src/nsfns.m | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/src/nsfns.m b/src/nsfns.m index 1900616b9de..6256bd220dd 100644 --- a/src/nsfns.m +++ b/src/nsfns.m | |||
| @@ -1112,6 +1112,7 @@ DEFUN ("x-create-frame", Fx_create_frame, Sx_create_frame, | |||
| 1112 | Lisp_Object parent, parent_frame; | 1112 | Lisp_Object parent, parent_frame; |
| 1113 | struct kboard *kb; | 1113 | struct kboard *kb; |
| 1114 | static int desc_ctr = 1; | 1114 | static int desc_ctr = 1; |
| 1115 | NSWindow *main_window = [NSApp mainWindow]; | ||
| 1115 | 1116 | ||
| 1116 | /* gui_display_get_arg modifies parms. */ | 1117 | /* gui_display_get_arg modifies parms. */ |
| 1117 | parms = Fcopy_alist (parms); | 1118 | parms = Fcopy_alist (parms); |
| @@ -1483,8 +1484,27 @@ DEFUN ("x-create-frame", Fx_create_frame, Sx_create_frame, | |||
| 1483 | if (CONSP (XCAR (tem)) && !NILP (XCAR (XCAR (tem)))) | 1484 | if (CONSP (XCAR (tem)) && !NILP (XCAR (XCAR (tem)))) |
| 1484 | fset_param_alist (f, Fcons (XCAR (tem), f->param_alist)); | 1485 | fset_param_alist (f, Fcons (XCAR (tem), f->param_alist)); |
| 1485 | 1486 | ||
| 1486 | if (window_prompting & USPosition) | 1487 | /* This cascading behavior (which is the job of the window manager |
| 1488 | on X-based systems) is something NS applications are expected to | ||
| 1489 | implement themselves. At least one person tells me he used | ||
| 1490 | Carbon Emacs solely for this behavior. */ | ||
| 1491 | if (window_prompting & (USPosition | PPosition) || FRAME_PARENT_FRAME (f)) | ||
| 1487 | ns_set_offset (f, f->left_pos, f->top_pos, 1); | 1492 | ns_set_offset (f, f->left_pos, f->top_pos, 1); |
| 1493 | else | ||
| 1494 | { | ||
| 1495 | NSWindow *frame_window = [FRAME_NS_VIEW (f) window]; | ||
| 1496 | NSPoint top_left; | ||
| 1497 | |||
| 1498 | if (main_window) | ||
| 1499 | { | ||
| 1500 | top_left = NSMakePoint (NSMinX ([main_window frame]), | ||
| 1501 | NSMaxY ([main_window frame])); | ||
| 1502 | top_left = [frame_window cascadeTopLeftFromPoint: top_left]; | ||
| 1503 | [frame_window cascadeTopLeftFromPoint: top_left]; | ||
| 1504 | } | ||
| 1505 | else | ||
| 1506 | [main_window center]; | ||
| 1507 | } | ||
| 1488 | 1508 | ||
| 1489 | /* Make sure windows on this frame appear in calls to next-window | 1509 | /* Make sure windows on this frame appear in calls to next-window |
| 1490 | and similar functions. */ | 1510 | and similar functions. */ |