summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2018-02-13 14:28:44 +0100
committerCarlos Garnacho <carlosg@gnome.org>2018-02-14 14:58:06 +0100
commit3146f29d3ae3abae33822bcdf3eaf44b5b19cd7e (patch)
treeba5595a32153588cefb3390b9d8256f2b642f051
parentc6901a8b950f156aaddf2ee8f8fb39440b7b9cfd (diff)
downloadgtk+-3146f29d3ae3abae33822bcdf3eaf44b5b19cd7e.tar.gz
gdk/wayland: Add GdkDisplay call to query available globals
The internal known_globals hashtable is used to carry accounting for interfaces that depend on others (as ordering is not guaranteed), extend its usage so it also keeps track of unimplemented interfaces (here at least). The API call will then use this to allow querying the globals offered by the compositor, it will be useful to determine whether we can use text-input protocols or should fallback to other IMs.
-rw-r--r--docs/reference/gdk/gdk3-sections.txt1
-rw-r--r--gdk/wayland/gdkdisplay-wayland.c42
-rw-r--r--gdk/wayland/gdkwaylanddisplay.h4
3 files changed, 41 insertions, 6 deletions
diff --git a/docs/reference/gdk/gdk3-sections.txt b/docs/reference/gdk/gdk3-sections.txt
index f26c22d3c6..4e5c403670 100644
--- a/docs/reference/gdk/gdk3-sections.txt
+++ b/docs/reference/gdk/gdk3-sections.txt
@@ -1270,6 +1270,7 @@ gdk_wayland_device_get_wl_seat
gdk_wayland_display_get_wl_compositor
gdk_wayland_display_get_wl_display
gdk_wayland_display_get_xdg_shell
+gdk_wayland_display_query_registry
gdk_wayland_window_get_wl_surface
gdk_wayland_window_set_use_custom_surface
GdkWaylandWindowExported
diff --git a/gdk/wayland/gdkdisplay-wayland.c b/gdk/wayland/gdkdisplay-wayland.c
index 8bcd6755a6..3e9ca8465d 100644
--- a/gdk/wayland/gdkdisplay-wayland.c
+++ b/gdk/wayland/gdkdisplay-wayland.c
@@ -372,7 +372,6 @@ gdk_registry_handle_global (void *data,
{
GdkWaylandDisplay *display_wayland = data;
struct wl_output *output;
- gboolean handled = TRUE;
GDK_NOTE (MISC,
g_message ("add global %u, interface %s, version %u", id, interface, version));
@@ -495,12 +494,9 @@ gdk_registry_handle_global (void *data,
&server_decoration_listener,
display_wayland);
}
- else
- handled = FALSE;
- if (handled)
- g_hash_table_insert (display_wayland->known_globals,
- GUINT_TO_POINTER (id), g_strdup (interface));
+ g_hash_table_insert (display_wayland->known_globals,
+ GUINT_TO_POINTER (id), g_strdup (interface));
process_on_globals_closures (display_wayland);
}
@@ -1386,3 +1382,37 @@ gdk_wayland_display_get_selection (GdkDisplay *display)
return display_wayland->selection;
}
+
+/**
+ * gdk_wayland_display_query_registry:
+ * @display: a wayland #GdkDisplay
+ * @interface: global interface to query in the registry
+ *
+ * Returns %TRUE if the the interface was found in the display
+ * wl_registry.global handler.
+ *
+ * Returns: %TRUE if the global is offered by the compositor
+ *
+ * Since: 3.22.27
+ **/
+gboolean
+gdk_wayland_display_query_registry (GdkDisplay *display,
+ const gchar *global)
+{
+ GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (display);
+ GHashTableIter iter;
+ gchar *value;
+
+ g_return_val_if_fail (GDK_IS_WAYLAND_DISPLAY (display), FALSE);
+ g_return_val_if_fail (global != NULL, FALSE);
+
+ g_hash_table_iter_init (&iter, display_wayland->known_globals);
+
+ while (g_hash_table_iter_next (&iter, NULL, (gpointer*) &value))
+ {
+ if (strcmp (value, global) == 0)
+ return TRUE;
+ }
+
+ return FALSE;
+}
diff --git a/gdk/wayland/gdkwaylanddisplay.h b/gdk/wayland/gdkwaylanddisplay.h
index d980d6cf87..af9cc896be 100644
--- a/gdk/wayland/gdkwaylanddisplay.h
+++ b/gdk/wayland/gdkwaylanddisplay.h
@@ -60,6 +60,10 @@ void gdk_wayland_display_set_startup_notification_id (GdkDisp
GDK_AVAILABLE_IN_3_22
gboolean gdk_wayland_display_prefers_ssd (GdkDisplay *display);
+GDK_AVAILABLE_IN_3_22
+gboolean gdk_wayland_display_query_registry (GdkDisplay *display,
+ const gchar *global);
+
G_END_DECLS
#endif /* __GDK_WAYLAND_DISPLAY_H__ */