[mutter] monitor-manager-xrandr: Don't do extra work on RRScreenChangeNotify



commit 47e339b46e80f01c2a4d020dbef7341e5a02b7eb
Author: Rui Matos <tiagomatos gmail com>
Date:   Thu Oct 16 13:31:26 2014 +0200

    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 files 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 a5251fe..d492958 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;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]