[mutter] monitor-manager-xrandr: Don't do extra work on RRScreenChangeNotify
- From: Rui Matos <rtcm src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] monitor-manager-xrandr: Don't do extra work on RRScreenChangeNotify
- Date: Thu, 16 Oct 2014 18:45:26 +0000 (UTC)
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]