Force cursor update after applying configuration
The qxl kms driver has a bug where the cursor gets hidden implicitly after a drmModeSetCrtc call. This commit works around the bug by forcing a drmModeSetCursor2 call after the drmModeSetCrtc calls. This is pretty hacky and won't ever go upstream. https://bugzilla.gnome.org/show_bug.cgi?id=746078
This commit is contained in:
parent
af2a13ded4
commit
33150569cd
@ -109,6 +109,30 @@ get_seat_proxy (GCancellable *cancellable)
|
||||
return seat;
|
||||
}
|
||||
|
||||
static void
|
||||
frame_callback (CoglOnscreen *onscreen,
|
||||
CoglFrameEvent event,
|
||||
CoglFrameInfo *frame_info,
|
||||
void *user_data)
|
||||
{
|
||||
CoglFrameClosure **frame_closure = user_data;
|
||||
|
||||
MetaBackend *backend = meta_get_backend ();
|
||||
MetaCursorRenderer *renderer = meta_backend_get_cursor_renderer (backend);
|
||||
CoglOnscreen *cogl_onscreen;
|
||||
|
||||
if (event != COGL_FRAME_EVENT_COMPLETE)
|
||||
return;
|
||||
|
||||
meta_cursor_renderer_native_force_update (META_CURSOR_RENDERER_NATIVE (renderer));
|
||||
|
||||
cogl_onscreen = COGL_ONSCREEN (cogl_get_draw_framebuffer ());
|
||||
cogl_onscreen_remove_frame_callback (cogl_onscreen,
|
||||
*frame_closure);
|
||||
|
||||
*frame_closure = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
session_unpause (void)
|
||||
{
|
||||
@ -128,6 +152,8 @@ session_unpause (void)
|
||||
MetaBackend *backend = meta_get_backend ();
|
||||
MetaCursorRenderer *renderer = meta_backend_get_cursor_renderer (backend);
|
||||
ClutterActor *stage = meta_backend_get_stage (backend);
|
||||
CoglOnscreen *cogl_onscreen;
|
||||
static CoglFrameClosure *frame_closure = NULL;
|
||||
|
||||
/* When we mode-switch back, we need to immediately queue a redraw
|
||||
* in case nothing else queued one for us, and force the cursor to
|
||||
@ -135,6 +161,17 @@ session_unpause (void)
|
||||
|
||||
clutter_actor_queue_redraw (stage);
|
||||
meta_cursor_renderer_native_force_update (META_CURSOR_RENDERER_NATIVE (renderer));
|
||||
|
||||
cogl_onscreen = COGL_ONSCREEN (cogl_get_draw_framebuffer ());
|
||||
|
||||
if (frame_closure)
|
||||
cogl_onscreen_remove_frame_callback (cogl_onscreen, frame_closure);
|
||||
|
||||
frame_closure = cogl_onscreen_add_frame_callback (cogl_onscreen,
|
||||
frame_callback,
|
||||
&frame_closure,
|
||||
NULL);
|
||||
|
||||
meta_idle_monitor_native_reset_idletime (meta_idle_monitor_get_core ());
|
||||
}
|
||||
}
|
||||
|
@ -25,6 +25,8 @@
|
||||
|
||||
#include "meta-monitor-manager-kms.h"
|
||||
#include "meta-monitor-config.h"
|
||||
#include "backends/meta-backend-private.h"
|
||||
#include "meta-cursor-renderer-native.h"
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
@ -77,6 +79,9 @@ struct _MetaMonitorManagerKms
|
||||
drmModeConnector **connectors;
|
||||
unsigned int n_connectors;
|
||||
|
||||
/* used to find out when configuration has been applied */
|
||||
CoglFrameClosure *frame_closure;
|
||||
|
||||
GUdevClient *udev;
|
||||
|
||||
GSettings *desktop_settings;
|
||||
@ -905,6 +910,29 @@ set_underscan (MetaMonitorManagerKms *manager_kms,
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
frame_callback (CoglOnscreen *onscreen,
|
||||
CoglFrameEvent event,
|
||||
CoglFrameInfo *frame_info,
|
||||
void *user_data)
|
||||
{
|
||||
MetaMonitorManagerKms *manager_kms = user_data;
|
||||
MetaBackend *backend = meta_get_backend ();
|
||||
MetaCursorRenderer *renderer = meta_backend_get_cursor_renderer (backend);
|
||||
CoglOnscreen *cogl_onscreen;
|
||||
|
||||
if (event != COGL_FRAME_EVENT_COMPLETE)
|
||||
return;
|
||||
|
||||
meta_cursor_renderer_native_force_update (META_CURSOR_RENDERER_NATIVE (renderer));
|
||||
|
||||
cogl_onscreen = COGL_ONSCREEN (cogl_get_draw_framebuffer ());
|
||||
cogl_onscreen_remove_frame_callback (cogl_onscreen,
|
||||
manager_kms->frame_closure);
|
||||
|
||||
manager_kms->frame_closure = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_monitor_manager_kms_apply_configuration (MetaMonitorManager *manager,
|
||||
MetaCRTCInfo **crtcs,
|
||||
@ -916,6 +944,7 @@ meta_monitor_manager_kms_apply_configuration (MetaMonitorManager *manager,
|
||||
ClutterBackend *backend;
|
||||
CoglContext *cogl_context;
|
||||
CoglDisplay *cogl_display;
|
||||
CoglOnscreen *cogl_onscreen;
|
||||
unsigned i;
|
||||
GPtrArray *cogl_crtcs;
|
||||
int screen_width, screen_height;
|
||||
@ -1051,6 +1080,15 @@ meta_monitor_manager_kms_apply_configuration (MetaMonitorManager *manager,
|
||||
return;
|
||||
}
|
||||
|
||||
cogl_onscreen = COGL_ONSCREEN (cogl_get_draw_framebuffer ());
|
||||
if (manager_kms->frame_closure)
|
||||
cogl_onscreen_remove_frame_callback (cogl_onscreen,
|
||||
manager_kms->frame_closure);
|
||||
manager_kms->frame_closure = cogl_onscreen_add_frame_callback (cogl_onscreen,
|
||||
frame_callback,
|
||||
manager,
|
||||
NULL);
|
||||
|
||||
for (i = 0; i < n_outputs; i++)
|
||||
{
|
||||
MetaOutputInfo *output_info = outputs[i];
|
||||
|
Loading…
Reference in New Issue
Block a user