diff options
author | Alexander Larsson <alexl@redhat.com> | 2019-03-29 11:03:38 +0100 |
---|---|---|
committer | Alexander Larsson <alexl@redhat.com> | 2019-03-29 14:30:13 +0100 |
commit | ab801fe78265858251a0dd9f5f845db068d9cb13 (patch) | |
tree | a60c85a2389fce615a8efc1a63229536630d69a9 | |
parent | 43778bef4de3eedc01587fb3b4dfb78f02efe99f (diff) | |
download | gtk+-ab801fe78265858251a0dd9f5f845db068d9cb13.tar.gz |
broadway: Fix handling of input with multiple in-process GdkDisplays
We need each instance to only forward input to the right display.
This make the inspector work better.
-rw-r--r-- | gdk/broadway/gdkbroadway-server.c | 18 | ||||
-rw-r--r-- | gdk/broadway/gdkbroadway-server.h | 3 | ||||
-rw-r--r-- | gdk/broadway/gdkdisplay-broadway.c | 2 | ||||
-rw-r--r-- | gdk/broadway/gdkeventsource.c | 20 | ||||
-rw-r--r-- | gdk/broadway/gdkprivate-broadway.h | 3 |
5 files changed, 18 insertions, 28 deletions
diff --git a/gdk/broadway/gdkbroadway-server.c b/gdk/broadway/gdkbroadway-server.c index 548f180375..4b8fe4fd9b 100644 --- a/gdk/broadway/gdkbroadway-server.c +++ b/gdk/broadway/gdkbroadway-server.c @@ -38,6 +38,7 @@ typedef struct BroadwayInput BroadwayInput; struct _GdkBroadwayServer { GObject parent_instance; + GdkDisplay *display; guint32 next_serial; guint32 next_texture_id; @@ -96,7 +97,9 @@ _gdk_broadway_server_get_next_serial (GdkBroadwayServer *server) } GdkBroadwayServer * -_gdk_broadway_server_new (const char *display, GError **error) +_gdk_broadway_server_new (GdkDisplay *display, + const char *display_name, + GError **error) { GdkBroadwayServer *server; GSocketClient *client; @@ -108,14 +111,14 @@ _gdk_broadway_server_new (const char *display, GError **error) char *local_socket_type = NULL; int port; - if (display == NULL) - display = ":0"; + if (display_name == NULL) + display_name = ":0"; - if (display[0] == ':' && g_ascii_isdigit(display[1])) + if (display_name[0] == ':' && g_ascii_isdigit(display_name[1])) { char *path, *basename; - port = strtol (display + strlen (":"), NULL, 10); + port = strtol (display_name + strlen (":"), NULL, 10); basename = g_strdup_printf ("broadway%d.socket", port + 1); path = g_build_filename (g_get_user_runtime_dir (), basename, NULL); g_free (basename); @@ -127,7 +130,7 @@ _gdk_broadway_server_new (const char *display, GError **error) else { g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, - _("Broadway display type not supported: %s"), display); + _("Broadway display type not supported: %s"), display_name); return NULL; } @@ -145,6 +148,7 @@ _gdk_broadway_server_new (const char *display, GError **error) server = g_object_new (GDK_TYPE_BROADWAY_SERVER, NULL); server->connection = connection; + server->display = display; in = g_io_stream_get_input_stream (G_IO_STREAM (server->connection)); pollable = G_POLLABLE_INPUT_STREAM (in); @@ -346,7 +350,7 @@ process_input_messages (GdkBroadwayServer *server) server->incomming); if (reply->base.type == BROADWAY_REPLY_EVENT) - _gdk_broadway_events_got_input (&reply->event.msg); + _gdk_broadway_events_got_input (server->display, &reply->event.msg); else g_warning ("Unhandled reply type %d", reply->base.type); g_free (reply); diff --git a/gdk/broadway/gdkbroadway-server.h b/gdk/broadway/gdkbroadway-server.h index 537c8a199a..b30e38a5a6 100644 --- a/gdk/broadway/gdkbroadway-server.h +++ b/gdk/broadway/gdkbroadway-server.h @@ -14,7 +14,8 @@ typedef struct _GdkBroadwayServerClass GdkBroadwayServerClass; #define GDK_IS_BROADWAY_SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_BROADWAY_SERVER)) #define GDK_BROADWAY_SERVER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_BROADWAY_SERVER, GdkBroadwayServerClass)) -GdkBroadwayServer *_gdk_broadway_server_new (const char *display, +GdkBroadwayServer *_gdk_broadway_server_new (GdkDisplay *display, + const char *display_name, GError **error); void _gdk_broadway_server_flush (GdkBroadwayServer *server); void _gdk_broadway_server_sync (GdkBroadwayServer *server); diff --git a/gdk/broadway/gdkdisplay-broadway.c b/gdk/broadway/gdkdisplay-broadway.c index 9a80ec8d55..4cb868c635 100644 --- a/gdk/broadway/gdkdisplay-broadway.c +++ b/gdk/broadway/gdkdisplay-broadway.c @@ -174,7 +174,7 @@ _gdk_broadway_display_open (const gchar *display_name) if (display_name == NULL) display_name = g_getenv ("BROADWAY_DISPLAY"); - broadway_display->server = _gdk_broadway_server_new (display_name, &error); + broadway_display->server = _gdk_broadway_server_new (display, display_name, &error); if (broadway_display->server == NULL) { g_printerr ("Unable to init Broadway server: %s\n", error->message); diff --git a/gdk/broadway/gdkeventsource.c b/gdk/broadway/gdkeventsource.c index 9356ad975b..b9f0cdfe27 100644 --- a/gdk/broadway/gdkeventsource.c +++ b/gdk/broadway/gdkeventsource.c @@ -83,30 +83,14 @@ gdk_event_source_check (GSource *source) } void -_gdk_broadway_events_got_input (BroadwayInputMsg *message) +_gdk_broadway_events_got_input (GdkDisplay *display, + BroadwayInputMsg *message) { - GdkDisplay *display; GdkBroadwayDisplay *display_broadway; GdkSeat *seat; GdkSurface *surface; GdkEvent *event = NULL; GList *node; - GSList *list, *d; - - display = NULL; - - list = gdk_display_manager_list_displays (gdk_display_manager_get ()); - for (d = list; d; d = d->next) - { - if (GDK_IS_BROADWAY_DISPLAY (d->data)) - { - display = d->data; - break; - } - } - g_slist_free (list); - - g_assert (display != NULL); display_broadway = GDK_BROADWAY_DISPLAY (display); seat = gdk_display_get_default_seat (display); diff --git a/gdk/broadway/gdkprivate-broadway.h b/gdk/broadway/gdkprivate-broadway.h index 11a48a0291..ec6393606b 100644 --- a/gdk/broadway/gdkprivate-broadway.h +++ b/gdk/broadway/gdkprivate-broadway.h @@ -78,7 +78,8 @@ gboolean _gdk_keymap_key_is_modifier (GdkKeymap *keymap, void _gdk_broadway_display_size_changed (GdkDisplay *display, BroadwayInputScreenResizeNotify *msg); -void _gdk_broadway_events_got_input (BroadwayInputMsg *message); +void _gdk_broadway_events_got_input (GdkDisplay *display, + BroadwayInputMsg *message); void _gdk_broadway_display_init_root_window (GdkDisplay *display); void _gdk_broadway_display_init_dnd (GdkDisplay *display); |