From: Alexander Larsson Date: Wed, 26 Dec 2012 21:31:52 +0000 (+0100) Subject: broadway: During pointer grabs, send pointer events only to one client X-Git-Url: http://pileus.org/git/?a=commitdiff_plain;h=63b6c07fe051c928f619fd2e769805d76139cdea;p=~andy%2Fgtk broadway: During pointer grabs, send pointer events only to one client --- diff --git a/gdk/broadway/broadway-server.c b/gdk/broadway/broadway-server.c index 93387dfaa..05e348594 100644 --- a/gdk/broadway/broadway-server.c +++ b/gdk/broadway/broadway-server.c @@ -39,6 +39,7 @@ struct _BroadwayServer { /* Explicit pointer grabs: */ gint32 pointer_grab_window_id; /* -1 => none */ + gint32 pointer_grab_client_id; /* -1 => none */ guint32 pointer_grab_time; gboolean pointer_grab_owner_events; @@ -225,10 +226,25 @@ broadway_server_lookahead_event (BroadwayServer *server, return FALSE; } +static gboolean +is_pointer_event (BroadwayInputMsg *message) +{ + return + message->base.type == BROADWAY_EVENT_ENTER || + message->base.type == BROADWAY_EVENT_LEAVE || + message->base.type == BROADWAY_EVENT_POINTER_MOVE || + message->base.type == BROADWAY_EVENT_BUTTON_PRESS || + message->base.type == BROADWAY_EVENT_BUTTON_RELEASE || + message->base.type == BROADWAY_EVENT_SCROLL || + message->base.type == BROADWAY_EVENT_GRAB_NOTIFY || + message->base.type == BROADWAY_EVENT_UNGRAB_NOTIFY; +} + static void process_input_messages (BroadwayServer *server) { BroadwayInputMsg *message; + gint32 client; while (server->input_messages) { @@ -239,7 +255,12 @@ process_input_messages (BroadwayServer *server) update_event_state (server, message); - broadway_events_got_input (message); + client = -1; + if (is_pointer_event (message) && + server->pointer_grab_window_id != -1) + client = server->pointer_grab_client_id; + + broadway_events_got_input (message, client); g_free (message); } } @@ -1275,6 +1296,9 @@ broadway_server_window_hide (BroadwayServer *server, server->mouse_in_toplevel_id = 0; } + if (server->pointer_grab_window_id == id) + server->pointer_grab_window_id = -1; + if (server->output) { broadway_output_hide_surface (server->output, window->id); @@ -1549,6 +1573,7 @@ broadway_server_window_move_resize (BroadwayServer *server, guint32 broadway_server_grab_pointer (BroadwayServer *server, + gint client_id, gint id, gboolean owner_events, guint32 event_mask, @@ -1562,6 +1587,7 @@ broadway_server_grab_pointer (BroadwayServer *server, time_ = server->last_seen_time; server->pointer_grab_window_id = id; + server->pointer_grab_client_id = client_id; server->pointer_grab_owner_events = owner_events; server->pointer_grab_time = time_; diff --git a/gdk/broadway/broadway-server.h b/gdk/broadway/broadway-server.h index 0329ea8e3..b40813987 100644 --- a/gdk/broadway/broadway-server.h +++ b/gdk/broadway/broadway-server.h @@ -5,7 +5,8 @@ #include #include -void broadway_events_got_input (BroadwayInputMsg *message); +void broadway_events_got_input (BroadwayInputMsg *message, + gint32 client_id); typedef struct _BroadwayServer BroadwayServer; typedef struct _BroadwayServerClass BroadwayServerClass; @@ -33,6 +34,7 @@ void broadway_server_query_mouse (BroadwayServer * gint32 *root_y, guint32 *mask); guint32 broadway_server_grab_pointer (BroadwayServer *server, + gint client_id, gint id, gboolean owner_events, guint32 event_mask, diff --git a/gdk/broadway/broadwayd.c b/gdk/broadway/broadwayd.c index 8d6d23ec5..2e13ab2f8 100644 --- a/gdk/broadway/broadwayd.c +++ b/gdk/broadway/broadwayd.c @@ -15,7 +15,9 @@ /* TODO: * Cache surfaces that are opened via shm_open inbetween updates. * Send configure event when a window is moved and no client - * Rewrite events (only to one client, per-client serials, etc) + * Handle implicit grabs when in broadway-server.c + * Rewrite events (per-client serials, etc) + * Handle window size changes * _gdk_broadway_server_has_client is always FALSE, so resize don't work. */ @@ -242,17 +244,17 @@ client_handle_request (BroadwayClient *client, break; case BROADWAY_REQUEST_SET_TRANSIENT_FOR: broadway_server_window_set_transient_for (server, - request->set_transient_for.id, - request->set_transient_for.parent); + request->set_transient_for.id, + request->set_transient_for.parent); break; case BROADWAY_REQUEST_TRANSLATE: area = region_from_rects (request->translate.rects, request->translate.n_rects); broadway_server_window_translate (server, - request->translate.id, - area, - request->translate.dx, - request->translate.dy); + request->translate.id, + area, + request->translate.dx, + request->translate.dy); cairo_region_destroy (area); break; case BROADWAY_REQUEST_UPDATE: @@ -262,18 +264,18 @@ client_handle_request (BroadwayClient *client, if (surface != NULL) { broadway_server_window_update (server, - request->update.id, - surface); + request->update.id, + surface); cairo_surface_destroy (surface); } break; case BROADWAY_REQUEST_MOVE_RESIZE: if (!broadway_server_window_move_resize (server, - request->move_resize.id, - request->move_resize.x, - request->move_resize.y, - request->move_resize.width, - request->move_resize.height)) + request->move_resize.id, + request->move_resize.x, + request->move_resize.y, + request->move_resize.width, + request->move_resize.height)) { /* TODO: Send configure request */ } @@ -281,17 +283,18 @@ client_handle_request (BroadwayClient *client, case BROADWAY_REQUEST_GRAB_POINTER: reply_grab_pointer.status = broadway_server_grab_pointer (server, - request->grab_pointer.id, - request->grab_pointer.owner_events, - request->grab_pointer.event_mask, - request->grab_pointer.time_); + client->id, + request->grab_pointer.id, + request->grab_pointer.owner_events, + request->grab_pointer.event_mask, + request->grab_pointer.time_); send_reply (client, request, (BroadwayReply *)&reply_grab_pointer, sizeof (reply_grab_pointer), BROADWAY_REPLY_GRAB_POINTER); break; case BROADWAY_REQUEST_UNGRAB_POINTER: reply_ungrab_pointer.status = broadway_server_ungrab_pointer (server, - request->ungrab_pointer.time_); + request->ungrab_pointer.time_); send_reply (client, request, (BroadwayReply *)&reply_ungrab_pointer, sizeof (reply_ungrab_pointer), BROADWAY_REPLY_UNGRAB_POINTER); break; @@ -495,7 +498,8 @@ get_event_size (int type) } void -broadway_events_got_input (BroadwayInputMsg *message) +broadway_events_got_input (BroadwayInputMsg *message, + gint32 client_id) { GList *l; BroadwayReplyEvent reply_event; @@ -509,8 +513,12 @@ broadway_events_got_input (BroadwayInputMsg *message) { BroadwayClient *client = l->data; - send_reply (client, NULL, (BroadwayReply *)&reply_event, - sizeof (BroadwayReplyBase) + size, - BROADWAY_REPLY_EVENT); + if (client_id == -1 || + client->id == client_id) + { + send_reply (client, NULL, (BroadwayReply *)&reply_event, + sizeof (BroadwayReplyBase) + size, + BROADWAY_REPLY_EVENT); + } } }