[mutter] wayland/gtk-shell: Emit new capabilities event when changed
- From: Georges Basile Stavracas Neto <gbsneto src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] wayland/gtk-shell: Emit new capabilities event when changed
- Date: Tue, 27 Nov 2018 14:56:29 +0000 (UTC)
commit 0d29609aece6ab93f5384063f52a2c25ccfe5f9d
Author: Jonas Ã…dahl <jadahl gmail com>
Date: Thu Aug 23 15:55:26 2018 +0200
wayland/gtk-shell: Emit new capabilities event when changed
The capabilities may change during the compositors lifetime, so make
gtk-shell emit the capabilities event when capabilities change.
https://gitlab.gnome.org/GNOME/mutter/issues/276
src/wayland/meta-wayland-gtk-shell.c | 61 +++++++++++++++++++++++++++++++++---
1 file changed, 56 insertions(+), 5 deletions(-)
---
diff --git a/src/wayland/meta-wayland-gtk-shell.c b/src/wayland/meta-wayland-gtk-shell.c
index 6f88b2621..0853dd1f6 100644
--- a/src/wayland/meta-wayland-gtk-shell.c
+++ b/src/wayland/meta-wayland-gtk-shell.c
@@ -46,6 +46,9 @@ typedef struct _MetaWaylandGtkSurface
struct _MetaWaylandGtkShell
{
GObject parent;
+
+ GList *shell_resources;
+ uint32_t capabilities;
};
G_DEFINE_TYPE (MetaWaylandGtkShell, meta_wayland_gtk_shell, G_TYPE_OBJECT)
@@ -363,23 +366,32 @@ static const struct gtk_shell1_interface meta_wayland_gtk_shell_interface = {
gtk_shell_system_bell,
};
+static void
+gtk_shell_destructor (struct wl_resource *resource)
+{
+ MetaWaylandGtkShell *gtk_shell = wl_resource_get_user_data (resource);
+
+ gtk_shell->shell_resources = g_list_remove (gtk_shell->shell_resources,
+ resource);
+}
+
static void
bind_gtk_shell (struct wl_client *client,
void *data,
guint32 version,
guint32 id)
{
+ MetaWaylandGtkShell *gtk_shell = data;
struct wl_resource *resource;
- uint32_t capabilities = 0;
resource = wl_resource_create (client, >k_shell1_interface, version, id);
wl_resource_set_implementation (resource, &meta_wayland_gtk_shell_interface,
- data, NULL);
+ data, gtk_shell_destructor);
- if (!meta_prefs_get_show_fallback_app_menu ())
- capabilities = GTK_SHELL1_CAPABILITY_GLOBAL_APP_MENU;
+ gtk_shell->shell_resources = g_list_prepend (gtk_shell->shell_resources,
+ resource);
- gtk_shell1_send_capabilities (resource, capabilities);
+ gtk_shell1_send_capabilities (resource, gtk_shell->capabilities);
}
static void
@@ -394,6 +406,41 @@ meta_wayland_gtk_shell_class_init (MetaWaylandGtkShellClass *klass)
g_quark_from_static_string ("-meta-wayland-gtk-shell-surface-data");
}
+static uint32_t
+calculate_capabilities (void)
+{
+ uint32_t capabilities = 0;
+
+ if (!meta_prefs_get_show_fallback_app_menu ())
+ capabilities = GTK_SHELL1_CAPABILITY_GLOBAL_APP_MENU;
+
+ return capabilities;
+}
+
+static void
+prefs_changed (MetaPreference pref,
+ gpointer user_data)
+{
+ MetaWaylandGtkShell *gtk_shell = user_data;
+ uint32_t new_capabilities;
+ GList *l;
+
+ if (pref != META_PREF_BUTTON_LAYOUT)
+ return;
+
+ new_capabilities = calculate_capabilities ();
+ if (gtk_shell->capabilities == new_capabilities)
+ return;
+ gtk_shell->capabilities = new_capabilities;
+
+ for (l = gtk_shell->shell_resources; l; l = l->next)
+ {
+ struct wl_resource *resource = l->data;
+
+ gtk_shell1_send_capabilities (resource, gtk_shell->capabilities);
+ }
+}
+
static MetaWaylandGtkShell *
meta_wayland_gtk_shell_new (MetaWaylandCompositor *compositor)
{
@@ -407,6 +454,10 @@ meta_wayland_gtk_shell_new (MetaWaylandCompositor *compositor)
gtk_shell, bind_gtk_shell) == NULL)
g_error ("Failed to register a global gtk-shell object");
+ gtk_shell->capabilities = calculate_capabilities ();
+
+ meta_prefs_add_listener (prefs_changed, gtk_shell);
+
return gtk_shell;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]