[mutter] monitor-manager-kms: Don't listen on hotplugs when paused
- From: Jonas Ådahl <jadahl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] monitor-manager-kms: Don't listen on hotplugs when paused
- Date: Sat, 11 Mar 2017 01:18:54 +0000 (UTC)
commit db14e6099e437b64e7c691663f7218c69601f9d9
Author: Jonas Ådahl <jadahl gmail com>
Date: Fri Mar 10 16:29:11 2017 +0800
monitor-manager-kms: Don't listen on hotplugs when paused
When mutter is paused (i.e. not the DRM master), stop listening on
hotplug events. Instead read the current state and set modes when
resumed.
This avoids a race condition in the drm API which currently only
manages to properly deal with one application querying the EDID state
at the same time when there are multiple mutter instances running at
the same time (e.g. gnome-shell driving gdm at the same time as
gnome-shell as the session instance).
https://bugzilla.gnome.org/show_bug.cgi?id=779837
src/backends/native/meta-backend-native.c | 16 +++++++++++++---
src/backends/native/meta-monitor-manager-kms.c | 15 +++++++++++++++
src/backends/native/meta-monitor-manager-kms.h | 4 ++++
3 files changed, 32 insertions(+), 3 deletions(-)
---
diff --git a/src/backends/native/meta-backend-native.c b/src/backends/native/meta-backend-native.c
index 22312d7..3cd1d11 100644
--- a/src/backends/native/meta-backend-native.c
+++ b/src/backends/native/meta-backend-native.c
@@ -537,21 +537,31 @@ meta_activate_session (void)
void
meta_backend_native_pause (MetaBackendNative *native)
{
+ MetaBackend *backend = META_BACKEND (native);
+ MetaMonitorManager *monitor_manager =
+ meta_backend_get_monitor_manager (backend);
+ MetaMonitorManagerKms *monitor_manager_kms =
+ META_MONITOR_MANAGER_KMS (monitor_manager);
+
clutter_evdev_release_devices ();
clutter_egl_freeze_master_clock ();
+
+ meta_monitor_manager_kms_pause (monitor_manager_kms);
}
void meta_backend_native_resume (MetaBackendNative *native)
{
MetaBackend *backend = META_BACKEND (native);
- MetaRenderer *renderer;
+ MetaMonitorManager *monitor_manager =
+ meta_backend_get_monitor_manager (backend);
+ MetaMonitorManagerKms *monitor_manager_kms =
+ META_MONITOR_MANAGER_KMS (monitor_manager);
MetaCursorRenderer *cursor_renderer;
MetaCursorRendererNative *cursor_renderer_native;
ClutterActor *stage;
MetaIdleMonitor *idle_monitor;
- renderer = meta_backend_get_renderer (backend);
- meta_renderer_native_queue_modes_reset (META_RENDERER_NATIVE (renderer));
+ meta_monitor_manager_kms_resume (monitor_manager_kms);
clutter_evdev_reclaim_devices ();
clutter_egl_thaw_master_clock ();
diff --git a/src/backends/native/meta-monitor-manager-kms.c b/src/backends/native/meta-monitor-manager-kms.c
index 3cedde1..5256b47 100644
--- a/src/backends/native/meta-monitor-manager-kms.c
+++ b/src/backends/native/meta-monitor-manager-kms.c
@@ -1783,6 +1783,21 @@ meta_monitor_manager_kms_disconnect_uevent_handler (MetaMonitorManagerKms *manag
manager_kms->uevent_handler_id = 0;
}
+void
+meta_monitor_manager_kms_pause (MetaMonitorManagerKms *manager_kms)
+{
+ meta_monitor_manager_kms_disconnect_uevent_handler (manager_kms);
+}
+
+void
+meta_monitor_manager_kms_resume (MetaMonitorManagerKms *manager_kms)
+{
+ MetaMonitorManager *manager = META_MONITOR_MANAGER (manager_kms);
+
+ meta_monitor_manager_kms_connect_uevent_handler (manager_kms);
+ handle_hotplug_event (manager);
+}
+
static void
meta_monitor_manager_kms_init (MetaMonitorManagerKms *manager_kms)
{
diff --git a/src/backends/native/meta-monitor-manager-kms.h b/src/backends/native/meta-monitor-manager-kms.h
index d4978b8..c641f28 100644
--- a/src/backends/native/meta-monitor-manager-kms.h
+++ b/src/backends/native/meta-monitor-manager-kms.h
@@ -58,4 +58,8 @@ gboolean meta_monitor_manager_kms_flip_crtc (MetaMonitorManagerKms *manager_kms,
void meta_monitor_manager_kms_wait_for_flip (MetaMonitorManagerKms *manager_kms);
+void meta_monitor_manager_kms_pause (MetaMonitorManagerKms *manager_kms);
+
+void meta_monitor_manager_kms_resume (MetaMonitorManagerKms *manager_kms);
+
#endif /* META_MONITOR_MANAGER_KMS_H */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]