backend/drm: support updating cursor when session is paused

This commit is contained in:
emersion 2018-02-02 21:01:59 +01:00
parent 5aa642485d
commit bb4aeb3b2f
No known key found for this signature in database
GPG key ID: 0FDE7BE0E88F5E48
3 changed files with 18 additions and 9 deletions

View file

@ -91,6 +91,8 @@ static void session_signal(struct wl_listener *listener, void *data) {
struct wlr_drm_plane *plane = conn->crtc->cursor;
drm->iface->crtc_set_cursor(drm, conn->crtc,
(plane && plane->cursor_enabled) ? plane->cursor_bo : NULL);
drm->iface->crtc_move_cursor(drm, conn->crtc, conn->cursor_x,
conn->cursor_y);
}
} else {
wlr_log(L_INFO, "DRM fd paused");

View file

@ -517,10 +517,6 @@ static bool wlr_drm_connector_set_cursor(struct wlr_output *output,
struct wlr_drm_backend *drm = (struct wlr_drm_backend *)output->backend;
struct wlr_drm_renderer *renderer = &drm->renderer;
if (!drm->session->active) {
return false;
}
struct wlr_drm_crtc *crtc = conn->crtc;
if (!crtc) {
return false;
@ -540,6 +536,9 @@ static bool wlr_drm_connector_set_cursor(struct wlr_output *output,
if (!buf && update_pixels) {
// Hide the cursor
plane->cursor_enabled = false;
if (!drm->session->active) {
return true;
}
return drm->iface->crtc_set_cursor(drm, crtc, NULL);
}
plane->cursor_enabled = true;
@ -637,6 +636,10 @@ static bool wlr_drm_connector_set_cursor(struct wlr_output *output,
gbm_bo_unmap(bo, bo_data);
if (!drm->session->active) {
return true;
}
bool ok = drm->iface->crtc_set_cursor(drm, crtc, bo);
if (ok) {
wlr_output_update_needs_swap(output);
@ -648,9 +651,6 @@ static bool wlr_drm_connector_move_cursor(struct wlr_output *output,
int x, int y) {
struct wlr_drm_connector *conn = (struct wlr_drm_connector *)output;
struct wlr_drm_backend *drm = (struct wlr_drm_backend *)output->backend;
if (!drm->session->active) {
return false;
}
if (!conn->crtc) {
return false;
}
@ -670,6 +670,13 @@ static bool wlr_drm_connector_move_cursor(struct wlr_output *output,
box.y -= plane->cursor_hotspot_y;
}
conn->cursor_x = box.x;
conn->cursor_y = box.y;
if (!drm->session->active) {
return true;
}
bool ok = drm->iface->crtc_move_cursor(drm, conn->crtc, box.x, box.y);
if (ok) {
wlr_output_update_needs_swap(output);

View file

@ -123,8 +123,8 @@ struct wlr_drm_connector {
union wlr_drm_connector_props props;
uint32_t width;
uint32_t height;
uint32_t width, height;
int32_t cursor_x, cursor_y;
drmModeCrtc *old_crtc;