summaryrefslogtreecommitdiffstats
path: root/server/red_dispatcher.c
diff options
context:
space:
mode:
authorAlon Levy <alevy@redhat.com>2011-07-31 16:35:41 +0300
committerAlon Levy <alevy@redhat.com>2011-07-31 17:47:07 +0300
commitf0f44e2630079774719f8ef5a9af57d554b49b8c (patch)
tree108bb6e9621e3b7bbfa4980e8eaa0124d472c679 /server/red_dispatcher.c
parent759fe8e27027dd8d8882eca60c9ba50b7afb0ba9 (diff)
downloadspice-f0f44e2630079774719f8ef5a9af57d554b49b8c.tar.gz
spice-f0f44e2630079774719f8ef5a9af57d554b49b8c.tar.xz
spice-f0f44e2630079774719f8ef5a9af57d554b49b8c.zip
server/red_dispatcher: fix wrong resolution set for tablet
when changing resolutions due to the new async code paths the surface creation command was kept by reference, and later, when the red_worker signaled completion by calling async_complete the mouse mode was updated using the reference. This caused the wrong values to be read resulting in wrong resolutions set and a non working mouse pointer. Fix this by keeping a copy of the surface creation command instead of a reference. No bz. Found in testing.
Diffstat (limited to 'server/red_dispatcher.c')
-rw-r--r--server/red_dispatcher.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/server/red_dispatcher.c b/server/red_dispatcher.c
index 7792d90a..8f4a8a8f 100644
--- a/server/red_dispatcher.c
+++ b/server/red_dispatcher.c
@@ -56,7 +56,7 @@ struct RedDispatcher {
RedDispatcher *next;
RedWorkerMessage async_message;
pthread_mutex_t async_lock;
- QXLDevSurfaceCreate *surface_create;
+ QXLDevSurfaceCreate surface_create;
};
typedef struct RedWorkeState {
@@ -382,7 +382,7 @@ static void qxl_worker_destroy_primary_surface(QXLWorker *qxl_worker, uint32_t s
static void red_dispatcher_create_primary_surface_complete(RedDispatcher *dispatcher)
{
- QXLDevSurfaceCreate *surface = dispatcher->surface_create;
+ QXLDevSurfaceCreate *surface = &dispatcher->surface_create;
dispatcher->x_res = surface->width;
dispatcher->y_res = surface->height;
@@ -390,7 +390,7 @@ static void red_dispatcher_create_primary_surface_complete(RedDispatcher *dispat
dispatcher->primary_active = TRUE;
update_client_mouse_allowed();
- dispatcher->surface_create = NULL;
+ memset(&dispatcher->surface_create, sizeof(QXLDevSurfaceCreate), 0);
}
static void
@@ -408,7 +408,7 @@ red_dispatcher_create_primary_surface(RedDispatcher *dispatcher, uint32_t surfac
} else {
message = RED_WORKER_MESSAGE_CREATE_PRIMARY_SURFACE;
}
- dispatcher->surface_create = surface;
+ dispatcher->surface_create = *surface;
write_message(dispatcher->channel, &message);
if (async) {