From: Po Lu Date: Sun, 22 May 2022 01:27:46 +0000 (+0800) Subject: Don't unnecessarily call monitor change functions X-Git-Tag: emacs-29.0.90~1910^2~537 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=e465ea816d6a64a21822549982928c48961fec99;p=emacs.git Don't unnecessarily call monitor change functions * src/xterm.c (handle_one_xevent): If monitor attributes didn't change, don't send monitor change event. (x_term_init, mark_xterm): Mark and init new field. * src/xterm.h (struct x_display_info): New field `last_monitor_attributes_list'. --- diff --git a/src/xterm.c b/src/xterm.c index add0c848db9..05ede2e5803 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -20119,6 +20119,7 @@ handle_one_xevent (struct x_display_info *dpyinfo, { union buffered_input_event *ev; Time timestamp; + Lisp_Object current_monitors; if (event->type == (dpyinfo->xrandr_event_base + RRScreenChangeNotify)) @@ -20144,6 +20145,18 @@ handle_one_xevent (struct x_display_info *dpyinfo, inev.ie.kind = MONITORS_CHANGED_EVENT; inev.ie.timestamp = timestamp; XSETTERMINAL (inev.ie.arg, dpyinfo->terminal); + + /* Also don't do anything if the monitor configuration + didn't really change. */ + + current_monitors + = Fx_display_monitor_attributes_list (inev.ie.arg); + + if (Fequal (current_monitors, + dpyinfo->last_monitor_attributes_list)) + inev.ie.kind = NO_EVENT; + + dpyinfo->last_monitor_attributes_list = current_monitors; } #endif OTHER: @@ -24447,9 +24460,15 @@ x_term_init (Lisp_Object display_name, char *xrm_option, char *resource_name) #endif #ifdef HAVE_XRANDR + Lisp_Object term; + + dpyinfo->last_monitor_attributes_list = Qnil; dpyinfo->xrandr_supported_p = XRRQueryExtension (dpy, &dpyinfo->xrandr_event_base, &dpyinfo->xrandr_error_base); + + XSETTERMINAL (term, terminal); + if (dpyinfo->xrandr_supported_p) { XRRQueryVersion (dpy, &dpyinfo->xrandr_major_version, @@ -24457,15 +24476,20 @@ x_term_init (Lisp_Object display_name, char *xrm_option, char *resource_name) if (dpyinfo->xrandr_major_version == 1 && dpyinfo->xrandr_minor_version >= 2) - XRRSelectInput (dpyinfo->display, - dpyinfo->root_window, - (RRScreenChangeNotifyMask - | RRCrtcChangeNotifyMask - | RROutputChangeNotifyMask - /* Emacs doesn't actually need this, but GTK - selects for it when the display is - initialized. */ - | RROutputPropertyNotifyMask)); + { + dpyinfo->last_monitor_attributes_list + = Fx_display_monitor_attributes_list (term); + + XRRSelectInput (dpyinfo->display, + dpyinfo->root_window, + (RRScreenChangeNotifyMask + | RRCrtcChangeNotifyMask + | RROutputChangeNotifyMask + /* Emacs doesn't actually need this, but GTK + selects for it when the display is + initialized. */ + | RROutputPropertyNotifyMask)); + } } #endif @@ -25274,7 +25298,7 @@ mark_xterm (void) mark_object (val); } -#if defined HAVE_XINPUT2 || defined USE_TOOLKIT_SCROLL_BARS +#if defined HAVE_XINPUT2 || defined USE_TOOLKIT_SCROLL_BARS || defined HAVE_XRANDR for (dpyinfo = x_display_list; dpyinfo; dpyinfo = dpyinfo->next) { #ifdef HAVE_XINPUT2 @@ -25284,6 +25308,9 @@ mark_xterm (void) #ifdef USE_TOOLKIT_SCROLL_BARS for (i = 0; i < dpyinfo->n_protected_windows; ++i) mark_object (dpyinfo->protected_windows[i]); +#endif +#ifdef HAVE_XRANDR + mark_object (dpyinfo->last_monitor_attributes_list); #endif } #endif diff --git a/src/xterm.h b/src/xterm.h index 8571bd9d39c..c59992fdaa8 100644 --- a/src/xterm.h +++ b/src/xterm.h @@ -607,6 +607,10 @@ struct x_display_info int xrandr_error_base; int xrandr_major_version; int xrandr_minor_version; + + /* This is used to determine if the monitor configuration really + changed upon receiving a monitor change event. */ + Lisp_Object last_monitor_attributes_list; #endif #if defined USE_CAIRO || defined HAVE_XRENDER