[gtk+] broadway: During pointer grabs, send pointer events only to one client
- From: Alexander Larsson <alexl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] broadway: During pointer grabs, send pointer events only to one client
- Date: Thu, 27 Dec 2012 21:52:13 +0000 (UTC)
commit 63b6c07fe051c928f619fd2e769805d76139cdea
Author: Alexander Larsson <alexl redhat com>
Date: Wed Dec 26 22:31:52 2012 +0100
broadway: During pointer grabs, send pointer events only to one client
gdk/broadway/broadway-server.c | 28 ++++++++++++++++++++-
gdk/broadway/broadway-server.h | 4 ++-
gdk/broadway/broadwayd.c | 54 +++++++++++++++++++++++-----------------
3 files changed, 61 insertions(+), 25 deletions(-)
---
diff --git a/gdk/broadway/broadway-server.c b/gdk/broadway/broadway-server.c
index 93387df..05e3485 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 0329ea8..b408139 100644
--- a/gdk/broadway/broadway-server.h
+++ b/gdk/broadway/broadway-server.h
@@ -5,7 +5,8 @@
#include <glib-object.h>
#include <cairo.h>
-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 8d6d23e..2e13ab2 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);
+ }
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]