From: Po Lu Date: Sat, 21 May 2022 03:50:08 +0000 (+0800) Subject: Implement monitor change hooks on NS X-Git-Tag: emacs-29.0.90~1910^2~551 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=b7b14e920336646428c357b370cbfaac544ce295;p=emacs.git Implement monitor change hooks on NS This hasn't been tested with anything more complicated than removing an emulated monitor. * nsterm.m (ns_displays_reconfigured): New function. (ns_term_init): Register display reconfiguration callbacks. --- diff --git a/src/nsterm.m b/src/nsterm.m index 7fbfcf8c6d4..67b02c7a54a 100644 --- a/src/nsterm.m +++ b/src/nsterm.m @@ -5213,6 +5213,31 @@ static struct redisplay_interface ns_redisplay_interface = ns_default_font_parameter }; +#ifdef NS_IMPL_COCOA +static void +ns_displays_reconfigured (CGDirectDisplayID display, + CGDisplayChangeSummaryFlags flags, + void *user_info) +{ + struct input_event ie; + union buffered_input_event *ev; + + EVENT_INIT (ie); + + ev = (kbd_store_ptr == kbd_buffer + ? kbd_buffer + KBD_BUFFER_SIZE - 1 + : kbd_store_ptr - 1); + + if (kbd_store_ptr != kbd_fetch_ptr + && ev->ie.kind == MONITORS_CHANGED_EVENT) + return; + + ie.kind = MONITORS_CHANGED_EVENT; + XSETTERMINAL (ie.arg, x_display_list->terminal); + + kbd_buffer_store_event (&ie); +} +#endif static void ns_delete_display (struct ns_display_info *dpyinfo) @@ -5568,6 +5593,15 @@ ns_term_init (Lisp_Object display_name) catch_child_signal (); #endif +#ifdef NS_IMPL_COCOA + /* Begin listening for display reconfiguration, so we can run the + appropriate hooks. FIXME: is this called when the resolution of + a monitor changes? */ + + CGDisplayRegisterReconfigurationCallback (ns_displays_reconfigured, + NULL); +#endif + NSTRACE_MSG ("ns_term_init done"); unblock_input ();