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.
This commit is contained in:
Po Lu 2022-05-21 11:50:08 +08:00
parent 5a290eb7d3
commit b7b14e9203

View file

@ -5213,6 +5213,31 @@ static Lisp_Object ns_string_to_lispmod (const char *s)
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 @@ Needs to be here because ns_initialize_display_info () uses AppKit classes.
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 ();