leigh123linux / rpms / mutter

Forked from rpms/mutter 5 years ago
Clone

Blame 0001-Force-cursor-update-after-applying-configuration.patch

Florian Müllner 4e32261
From c642a96d33d5cf2fe7f2950bf48b9bbb5e5c8c5f Mon Sep 17 00:00:00 2001
341cacd
From: Ray Strode <rstrode@redhat.com>
341cacd
Date: Mon, 11 May 2015 16:53:41 -0400
341cacd
Subject: [PATCH] Force cursor update after applying configuration
341cacd
341cacd
The qxl kms driver has a bug where the cursor gets hidden
341cacd
implicitly after a drmModeSetCrtc call.
341cacd
341cacd
This commit works around the bug by forcing a drmModeSetCursor2
11e24ea
call after the drmModeSetCrtc calls.
11e24ea
11e24ea
This is pretty hacky and won't ever go upstream.
341cacd
341cacd
https://bugzilla.gnome.org/show_bug.cgi?id=746078
341cacd
---
11e24ea
 src/backends/native/meta-launcher.c            | 37 +++++++++++++++++++++++++
341cacd
 src/backends/native/meta-monitor-manager-kms.c | 38 ++++++++++++++++++++++++++
11e24ea
 2 files changed, 75 insertions(+)
341cacd
11e24ea
diff --git a/src/backends/native/meta-launcher.c b/src/backends/native/meta-launcher.c
Florian Müllner 4e32261
index 7cd338b..8a6db23 100644
11e24ea
--- a/src/backends/native/meta-launcher.c
11e24ea
+++ b/src/backends/native/meta-launcher.c
Florian Müllner 4e32261
@@ -102,6 +102,30 @@ get_seat_proxy (GCancellable *cancellable,
11e24ea
 }
11e24ea
 
11e24ea
 static void
11e24ea
+frame_callback (CoglOnscreen  *onscreen,
11e24ea
+                CoglFrameEvent event,
11e24ea
+                CoglFrameInfo *frame_info,
11e24ea
+                void          *user_data)
11e24ea
+{
11e24ea
+  CoglFrameClosure **frame_closure = user_data;
11e24ea
+
11e24ea
+  MetaBackend *backend = meta_get_backend ();
11e24ea
+  MetaCursorRenderer *renderer = meta_backend_get_cursor_renderer (backend);
11e24ea
+  CoglOnscreen *cogl_onscreen;
11e24ea
+
11e24ea
+  if (event != COGL_FRAME_EVENT_COMPLETE)
11e24ea
+    return;
11e24ea
+
11e24ea
+  meta_cursor_renderer_native_force_update (META_CURSOR_RENDERER_NATIVE (renderer));
11e24ea
+
11e24ea
+  cogl_onscreen = COGL_ONSCREEN (cogl_get_draw_framebuffer ());
11e24ea
+  cogl_onscreen_remove_frame_callback (cogl_onscreen,
11e24ea
+                                       *frame_closure);
11e24ea
+
11e24ea
+  *frame_closure = NULL;
11e24ea
+}
11e24ea
+
11e24ea
+static void
11e24ea
 session_unpause (void)
11e24ea
 {
11e24ea
   ClutterBackend *clutter_backend;
Florian Müllner 4e32261
@@ -120,6 +144,8 @@ session_unpause (void)
11e24ea
     MetaBackend *backend = meta_get_backend ();
11e24ea
     MetaCursorRenderer *renderer = meta_backend_get_cursor_renderer (backend);
11e24ea
     ClutterActor *stage = meta_backend_get_stage (backend);
11e24ea
+    CoglOnscreen *cogl_onscreen;
11e24ea
+    static CoglFrameClosure *frame_closure = NULL;
11e24ea
 
11e24ea
     /* When we mode-switch back, we need to immediately queue a redraw
11e24ea
      * in case nothing else queued one for us, and force the cursor to
Florian Müllner 4e32261
@@ -127,6 +153,17 @@ session_unpause (void)
11e24ea
 
11e24ea
     clutter_actor_queue_redraw (stage);
11e24ea
     meta_cursor_renderer_native_force_update (META_CURSOR_RENDERER_NATIVE (renderer));
11e24ea
+
11e24ea
+    cogl_onscreen = COGL_ONSCREEN (cogl_get_draw_framebuffer ());
11e24ea
+
11e24ea
+    if (frame_closure)
11e24ea
+        cogl_onscreen_remove_frame_callback (cogl_onscreen, frame_closure);
11e24ea
+
11e24ea
+    frame_closure = cogl_onscreen_add_frame_callback (cogl_onscreen,
11e24ea
+                                                      frame_callback,
11e24ea
+                                                      &frame_closure,
11e24ea
+                                                      NULL);
11e24ea
+
11e24ea
     meta_idle_monitor_native_reset_idletime (meta_idle_monitor_get_core ());
11e24ea
   }
11e24ea
 }
341cacd
diff --git a/src/backends/native/meta-monitor-manager-kms.c b/src/backends/native/meta-monitor-manager-kms.c
Florian Müllner 4e32261
index e1a6f5f..af92cd1 100644
341cacd
--- a/src/backends/native/meta-monitor-manager-kms.c
341cacd
+++ b/src/backends/native/meta-monitor-manager-kms.c
Florian Müllner 4e32261
@@ -25,6 +25,8 @@
341cacd
 
341cacd
 #include "meta-monitor-manager-kms.h"
341cacd
 #include "meta-monitor-config.h"
341cacd
+#include "backends/meta-backend-private.h"
341cacd
+#include "meta-cursor-renderer-native.h"
341cacd
 
341cacd
 #include <string.h>
341cacd
 #include <stdlib.h>
Florian Müllner 4e32261
@@ -82,6 +84,9 @@ struct _MetaMonitorManagerKms
341cacd
   drmModeConnector **connectors;
341cacd
   unsigned int       n_connectors;
341cacd
 
341cacd
+  /* used to find out when configuration has been applied */
341cacd
+  CoglFrameClosure *frame_closure;
341cacd
+
341cacd
   GUdevClient *udev;
341cacd
 
341cacd
   GSettings *desktop_settings;
Florian Müllner 4e32261
@@ -1053,6 +1058,29 @@ set_underscan (MetaMonitorManagerKms *manager_kms,
341cacd
 }
341cacd
 
341cacd
 static void
341cacd
+frame_callback (CoglOnscreen  *onscreen,
341cacd
+                CoglFrameEvent event,
341cacd
+                CoglFrameInfo *frame_info,
341cacd
+                void          *user_data)
341cacd
+{
341cacd
+  MetaMonitorManagerKms *manager_kms = user_data;
341cacd
+  MetaBackend *backend = meta_get_backend ();
341cacd
+  MetaCursorRenderer *renderer = meta_backend_get_cursor_renderer (backend);
341cacd
+  CoglOnscreen *cogl_onscreen;
341cacd
+
341cacd
+  if (event != COGL_FRAME_EVENT_COMPLETE)
341cacd
+    return;
341cacd
+
341cacd
+  meta_cursor_renderer_native_force_update (META_CURSOR_RENDERER_NATIVE (renderer));
341cacd
+
341cacd
+  cogl_onscreen = COGL_ONSCREEN (cogl_get_draw_framebuffer ());
341cacd
+  cogl_onscreen_remove_frame_callback (cogl_onscreen,
341cacd
+                                       manager_kms->frame_closure);
341cacd
+
341cacd
+  manager_kms->frame_closure = NULL;
341cacd
+}
341cacd
+
341cacd
+static void
341cacd
 meta_monitor_manager_kms_apply_configuration (MetaMonitorManager *manager,
341cacd
                                               MetaCRTCInfo       **crtcs,
341cacd
                                               unsigned int         n_crtcs,
Florian Müllner 4e32261
@@ -1063,6 +1091,7 @@ meta_monitor_manager_kms_apply_configuration (MetaMonitorManager *manager,
341cacd
   ClutterBackend *backend;
341cacd
   CoglContext *cogl_context;
341cacd
   CoglDisplay *cogl_display;
341cacd
+  CoglOnscreen *cogl_onscreen;
341cacd
   unsigned i;
341cacd
   GPtrArray *cogl_crtcs;
341cacd
   int screen_width, screen_height;
Florian Müllner 4e32261
@@ -1206,6 +1235,15 @@ meta_monitor_manager_kms_apply_configuration (MetaMonitorManager *manager,
341cacd
       return;
341cacd
     }
341cacd
 
341cacd
+  cogl_onscreen = COGL_ONSCREEN (cogl_get_draw_framebuffer ());
341cacd
+  if (manager_kms->frame_closure)
341cacd
+    cogl_onscreen_remove_frame_callback (cogl_onscreen,
341cacd
+                                         manager_kms->frame_closure);
341cacd
+  manager_kms->frame_closure = cogl_onscreen_add_frame_callback (cogl_onscreen,
341cacd
+                                                                 frame_callback,
341cacd
+                                                                 manager,
341cacd
+                                                                 NULL);
341cacd
+
341cacd
   for (i = 0; i < n_outputs; i++)
341cacd
     {
341cacd
       MetaOutputInfo *output_info = outputs[i];
341cacd
-- 
Florian Müllner 4e32261
2.7.0
341cacd