From 47e339b46e80f01c2a4d020dbef7341e5a02b7eb Mon Sep 17 00:00:00 2001 From: Rui Matos Date: Thu, 16 Oct 2014 13:31:26 +0200 Subject: [PATCH] monitor-manager-xrandr: Don't do extra work on RRScreenChangeNotify The X server sends several RRScreenChangeNotify events in a burst when something happens which, currently, causes us to rebuild our view of the world as many times and notify the upper layers about it which causes a lot of bogus repeated work like rebuilding background actors. We can avoid this extra work by looking at the timestamp in the XRRScreenResources struct which is updated when an X client (including us!) last changed something and comparing it with the previous timestamp. https://bugzilla.gnome.org/show_bug.cgi?id=738630 --- src/backends/x11/meta-monitor-manager-xrandr.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/backends/x11/meta-monitor-manager-xrandr.c b/src/backends/x11/meta-monitor-manager-xrandr.c index a5251feca..d492958c7 100644 --- a/src/backends/x11/meta-monitor-manager-xrandr.c +++ b/src/backends/x11/meta-monitor-manager-xrandr.c @@ -1059,12 +1059,15 @@ meta_monitor_manager_xrandr_handle_xevent (MetaMonitorManagerXrandr *manager_xra { MetaMonitorManager *manager = META_MONITOR_MANAGER (manager_xrandr); gboolean hotplug; + Time old_timestamp; if ((event->type - manager_xrandr->rr_event_base) != RRScreenChangeNotify) return FALSE; XRRUpdateConfiguration (event); + old_timestamp = manager_xrandr->resources->timestamp; + meta_monitor_manager_read_current_config (manager); hotplug = manager_xrandr->resources->timestamp < manager_xrandr->resources->configTimestamp; @@ -1075,8 +1078,9 @@ meta_monitor_manager_xrandr_handle_xevent (MetaMonitorManagerXrandr *manager_xra } else { - /* Something else changed -- tell the world about it. */ - meta_monitor_manager_rebuild_derived (manager); + /* If something else changed -- tell the world about it. */ + if (old_timestamp < manager_xrandr->resources->timestamp) + meta_monitor_manager_rebuild_derived (manager); } return TRUE;