]> git.eshelyaron.com Git - emacs.git/commitdiff
Implement monitor change hooks on NS
authorPo Lu <luangruo@yahoo.com>
Sat, 21 May 2022 03:50:08 +0000 (11:50 +0800)
committerPo Lu <luangruo@yahoo.com>
Sat, 21 May 2022 03:50:08 +0000 (11:50 +0800)
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.

src/nsterm.m

index 7fbfcf8c6d402f7e8f6e6d798a53b98561c636cd..67b02c7a54ae883ea498149a29cebc4ae4109cbb 100644 (file)
@@ -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 ();