>From 72ec4de5701cb3029cb3ae2c4c3262144c4eff76 Mon Sep 17 00:00:00 2001 From: Alan Third Date: Sun, 11 Jun 2017 17:07:28 +0100 Subject: [PATCH] Add no-focus-on-map to NS build (bug#25408) * src/nsfns.m (ns_frame_parm_handlers): Add x_set_no_focus_on_map. (x-create-frame): Check for no-focus-on-map. * src/nsterm.h (x_set_no_focus_on_map): New function. * src/nsterm.m (x_set_no_focus_on_map): New function. (ns_raise_frame): Add parameter for specifying whether to focus the frame. (ns_frame_raise_lower): (x_make_frame_visible): Handle new parameter for ns_raise_frame. --- src/nsfns.m | 4 +++- src/nsterm.h | 2 ++ src/nsterm.m | 33 +++++++++++++++++++++++++++++---- 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/nsfns.m b/src/nsfns.m index 0c865070fb..dbce279da6 100644 --- a/src/nsfns.m +++ b/src/nsfns.m @@ -980,7 +980,7 @@ Turn the input menu (an NSMenu) into a lisp list for tracking on lisp side #endif x_set_parent_frame, 0, /* x_set_skip_taskbar */ - 0, /* x_set_no_focus_on_map */ + x_set_no_focus_on_map, x_set_no_accept_focus, x_set_z_group, /* x_set_z_group */ 0, /* x_set_override_redirect */ @@ -1288,6 +1288,8 @@ Turn the input menu (an NSMenu) into a lisp list for tracking on lisp side store_frame_param (f, Qparent_frame, parent_frame); x_default_parameter (f, parms, Qz_group, Qnil, NULL, NULL, RES_TYPE_SYMBOL); + x_default_parameter (f, parms, Qno_focus_on_map, Qnil, + NULL, NULL, RES_TYPE_BOOLEAN); x_default_parameter (f, parms, Qno_accept_focus, Qnil, NULL, NULL, RES_TYPE_BOOLEAN); diff --git a/src/nsterm.h b/src/nsterm.h index f75e3759e4..bed0b92c79 100644 --- a/src/nsterm.h +++ b/src/nsterm.h @@ -1218,6 +1218,8 @@ extern void x_set_undecorated (struct frame *f, Lisp_Object new_value, Lisp_Object old_value); extern void x_set_parent_frame (struct frame *f, Lisp_Object new_value, Lisp_Object old_value); +extern void x_set_no_focus_on_map (struct frame *f, Lisp_Object new_value, + Lisp_Object old_value); extern void x_set_no_accept_focus (struct frame *f, Lisp_Object new_value, Lisp_Object old_value); extern void x_set_z_group (struct frame *f, Lisp_Object new_value, diff --git a/src/nsterm.m b/src/nsterm.m index 633ca3bf76..b298e4a153 100644 --- a/src/nsterm.m +++ b/src/nsterm.m @@ -1463,7 +1463,7 @@ -(void)remove static void -ns_raise_frame (struct frame *f) +ns_raise_frame (struct frame *f, BOOL make_key) /* -------------------------------------------------------------------------- Bring window to foreground and make it active -------------------------------------------------------------------------- */ @@ -1474,7 +1474,12 @@ -(void)remove view = FRAME_NS_VIEW (f); block_input (); if (FRAME_VISIBLE_P (f)) - [[view window] makeKeyAndOrderFront: NSApp]; + { + if (make_key) + [[view window] makeKeyAndOrderFront: NSApp]; + else + [[view window] orderFront: NSApp]; + } unblock_input (); } @@ -1504,7 +1509,7 @@ -(void)remove NSTRACE ("ns_frame_raise_lower"); if (raise) - ns_raise_frame (f); + ns_raise_frame (f, YES); else ns_lower_frame (f); } @@ -1567,7 +1572,7 @@ -(void)remove EmacsView *view = (EmacsView *)FRAME_NS_VIEW (f); SET_FRAME_VISIBLE (f, 1); - ns_raise_frame (f); + ns_raise_frame (f, ! FRAME_NO_FOCUS_ON_MAP (f)); /* Making a new frame from a fullscreen frame will make the new frame fullscreen also. So skip handleFS as this will print an error. */ @@ -1926,6 +1931,26 @@ so some key presses (TAB) are swallowed by the system. */ } } +/** + * x_set_no_focus_on_map: + * + * Set frame F's `no-focus-on-map' parameter which, if non-nil, means + * that F's window-system window does not want to receive input focus + * when it is mapped. (A frame's window is mapped when the frame is + * displayed for the first time and when the frame changes its state + * from `iconified' or `invisible' to `visible'.) + * + * Some window managers may not honor this parameter. + */ +void +x_set_no_focus_on_map (struct frame *f, Lisp_Object new_value, Lisp_Object old_value) +{ + if (!EQ (new_value, old_value)) + { + FRAME_NO_FOCUS_ON_MAP (f) = !NILP (new_value); + } +} + void x_set_no_accept_focus (struct frame *f, Lisp_Object new_value, Lisp_Object old_value) /* Set frame F's `no-accept-focus' parameter which, if non-nil, hints -- 2.12.0