/* 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;
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)
{
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);
}
}
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);
guint32
broadway_server_grab_pointer (BroadwayServer *server,
+ gint client_id,
gint id,
gboolean owner_events,
guint32 event_mask,
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_;
/* 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.
*/
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:
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 */
}
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;
}
void
-broadway_events_got_input (BroadwayInputMsg *message)
+broadway_events_got_input (BroadwayInputMsg *message,
+ gint32 client_id)
{
GList *l;
BroadwayReplyEvent reply_event;
{
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);
+ }
}
}