summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrediano Ziglio <fziglio@redhat.com>2017-09-07 15:39:48 +0100
committerFrediano Ziglio <fziglio@redhat.com>2017-10-04 10:57:39 +0100
commit78f1381f1458a9f13520be0746081f3c2931f161 (patch)
tree5fe7406a98f54c5669cc7af5b45345715ca42d53
parenta94b3a7a26a5b1c0fa7e8fdf62be5f72853b96a0 (diff)
gl: fix client mouse mode
Since 2.8, QEMU no longer creates QXL primary surfaces when using GL. This change broke client-side mouse mode, because Spice server relies on having a primary surface. When GL is enabled, use GL scanout informations. Mouse mode is always client when GL surfaces are used. This patch and most of the message are based on a patch from Marc-André Lureau, just moving responsibility from reds to RedQxl. Signed-off-by: Frediano Ziglio <fziglio@redhat.com> Reviewed-by: Jonathon Jongsma <jjongsma@redhat.com> Acked-by: Christophe de Dinechin <dinechin@redhat.com>
-rw-r--r--server/red-qxl.c31
-rw-r--r--server/red-qxl.h3
-rw-r--r--server/reds.c3
3 files changed, 23 insertions, 14 deletions
diff --git a/server/red-qxl.c b/server/red-qxl.c
index 7dc13bbd..336bb2e6 100644
--- a/server/red-qxl.c
+++ b/server/red-qxl.c
@@ -841,6 +841,8 @@ void spice_qxl_gl_scanout(QXLInstance *qxl,
/* FIXME: find a way to coallesce all pending SCANOUTs */
dispatcher_send_message(qxl_state->dispatcher,
RED_WORKER_MESSAGE_GL_SCANOUT, &payload);
+
+ reds_update_client_mouse_allowed(qxl_state->reds);
}
SPICE_GNUC_VISIBLE
@@ -964,20 +966,29 @@ void red_qxl_clear_pending(QXLState *qxl_state, int pending)
clear_bit(pending, &qxl_state->pending);
}
-gboolean red_qxl_get_primary_active(QXLInstance *qxl)
+bool red_qxl_get_allow_client_mouse(QXLInstance *qxl, int *x_res, int *y_res, int *allow_now)
{
- return qxl->st->primary_active;
-}
+ // try to get resolution when 3D enabled, since qemu did not create QXL primary surface
+ SpiceMsgDisplayGlScanoutUnix *gl;
+ if ((gl = red_qxl_get_gl_scanout(qxl))) {
+ *x_res = gl->width;
+ *y_res = gl->height;
+ *allow_now = TRUE;
+ red_qxl_put_gl_scanout(qxl, gl);
+ return true;
+ }
+
+ // check for 2D
+ if (!qxl->st->primary_active) {
+ return false;
+ }
-gboolean red_qxl_get_allow_client_mouse(QXLInstance *qxl, gint *x_res, gint *y_res)
-{
if (qxl->st->use_hardware_cursor) {
- if (x_res)
- *x_res = qxl->st->x_res;
- if (y_res)
- *y_res = qxl->st->y_res;
+ *x_res = qxl->st->x_res;
+ *y_res = qxl->st->y_res;
}
- return qxl->st->use_hardware_cursor;
+ *allow_now = qxl->st->use_hardware_cursor;
+ return true;
}
void red_qxl_on_ic_change(QXLInstance *qxl, SpiceImageCompression ic)
diff --git a/server/red-qxl.h b/server/red-qxl.h
index 51ec1456..6014d32a 100644
--- a/server/red-qxl.h
+++ b/server/red-qxl.h
@@ -34,8 +34,7 @@ void red_qxl_stop(QXLInstance *qxl);
void red_qxl_start(QXLInstance *qxl);
uint32_t red_qxl_get_ram_size(QXLInstance *qxl);
gboolean red_qxl_client_monitors_config(QXLInstance *qxl, VDAgentMonitorsConfig *monitors_config);
-gboolean red_qxl_get_primary_active(QXLInstance *qxl);
-gboolean red_qxl_get_allow_client_mouse(QXLInstance *qxl, gint *x_res, gint *y_res);
+bool red_qxl_get_allow_client_mouse(QXLInstance *qxl, int *x_res, int *y_res, int *allow_now);
SpiceMsgDisplayGlScanoutUnix *red_qxl_get_gl_scanout(QXLInstance *qxl);
void red_qxl_put_gl_scanout(QXLInstance *qxl, SpiceMsgDisplayGlScanoutUnix *scanout);
void red_qxl_gl_draw_async_complete(QXLInstance *qxl);
diff --git a/server/reds.c b/server/reds.c
index ddc93352..12c33570 100644
--- a/server/reds.c
+++ b/server/reds.c
@@ -4376,8 +4376,7 @@ void reds_update_client_mouse_allowed(RedsState *reds)
allow_now = TRUE;
FOREACH_QXL_INSTANCE(reds, qxl) {
- if (red_qxl_get_primary_active(qxl)) {
- allow_now = red_qxl_get_allow_client_mouse(qxl, &x_res, &y_res);
+ if (red_qxl_get_allow_client_mouse(qxl, &x_res, &y_res, &allow_now)) {
break;
}
}