[metacity] prefs: use button layout from GtkSettings
- From: Alberts Muktupāvels <muktupavels src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [metacity] prefs: use button layout from GtkSettings
- Date: Thu, 4 Jun 2015 14:18:47 +0000 (UTC)
commit 5e694c3935c838bb2d1179d3cbb6da61f433a5c1
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date: Thu Jun 4 17:04:51 2015 +0300
prefs: use button layout from GtkSettings
This is needed to make sure that client-side and server-side
decorations have same button layout.
GNOME Settings Daemon will update Gtk/DecorationLayout from
button-layout. At this point everything should be ok.
But then it is possible to override Gtk/DecorationLayout from
xsettings plugin in GNOME Settings Daemon. At this point we can
end up with different button layouts between client-side and
server-side decorations. I can not think any reason why someone
would want different button layouts.
src/core/prefs.c | 98 +++++++++++++++++++++++++++++++++++++++++++++++------
1 files changed, 87 insertions(+), 11 deletions(-)
---
diff --git a/src/core/prefs.c b/src/core/prefs.c
index 6278fdd..f404aff 100644
--- a/src/core/prefs.c
+++ b/src/core/prefs.c
@@ -129,6 +129,7 @@ static gboolean button_layout_handler (GVariant*, gpointer*, gpointer);
static void init_bindings (void);
static void init_workspace_names (void);
+static void update_button_layout (const gchar *string_value);
typedef struct
{
@@ -759,6 +760,71 @@ queue_changed (MetaPreference pref)
changed_idle_handler, NULL, NULL);
}
+static void
+gtk_decoration_layout_changed (GtkSettings *settings,
+ GParamSpec *pspec,
+ gpointer user_data)
+{
+ gchar *layout;
+ gchar **sides;
+ gint i;
+ gint j;
+
+ g_object_get (settings, "gtk-decoration-layout", &layout, NULL);
+
+ sides = g_strsplit (layout, ":", -1);
+ g_free (layout);
+
+ for (i = 0; sides[i]; i++)
+ {
+ gchar **buttons;
+
+ buttons = g_strsplit (sides[i], ",", -1);
+
+ for (j = 0; buttons[j]; j++)
+ {
+ const gchar *button;
+
+ if (g_strcmp0 (buttons[j], "icon") == 0)
+ button = "menu";
+ else if (g_strcmp0 (buttons[j], "menu") == 0)
+ button = "appmenu";
+ else
+ button = NULL;
+
+ if (button)
+ {
+ g_free (buttons[j]);
+ buttons[j] = g_strdup (button);
+ }
+ }
+
+ g_free (sides[i]);
+ sides[i] = g_strjoinv (",", buttons);
+
+ g_strfreev (buttons);
+ }
+
+ layout = g_strjoinv (":", sides);
+ g_strfreev (sides);
+
+ update_button_layout (layout);
+ g_free (layout);
+}
+
+static void
+init_gtk_decoration_layout (void)
+{
+ GtkSettings *settings;
+
+ settings = gtk_settings_get_default ();
+
+ g_signal_connect (settings, "notify::gtk-decoration-layout",
+ G_CALLBACK (gtk_decoration_layout_changed), NULL);
+
+ gtk_decoration_layout_changed (settings, NULL, NULL);
+}
+
/****************************************************************************/
/* Initialisation. */
/****************************************************************************/
@@ -799,6 +865,8 @@ meta_prefs_init (void)
init_bindings ();
init_workspace_names ();
+
+ init_gtk_decoration_layout ();
}
/****************************************************************************/
@@ -1118,13 +1186,10 @@ button_opposite_function (MetaButtonFunction ofwhat)
}
}
-static gboolean
-button_layout_handler (GVariant *value,
- gpointer *result,
- gpointer data)
+static void
+update_button_layout (const gchar *string_value)
{
MetaButtonLayout new_layout;
- const gchar *string_value;
char **sides = NULL;
int i;
@@ -1132,12 +1197,7 @@ button_layout_handler (GVariant *value,
* compat with future versions
*/
- *result = NULL; /* ignored */
- string_value = g_variant_get_string (value, NULL);
-
- if (string_value)
- sides = g_strsplit (string_value, ":", 2);
-
+ sides = g_strsplit (string_value, ":", 2);
i = 0;
if (sides != NULL && sides[0] != NULL)
@@ -1303,7 +1363,23 @@ button_layout_handler (GVariant *value,
button_layout = new_layout;
emit_changed (META_PREF_BUTTON_LAYOUT);
}
+}
+static gboolean
+button_layout_handler (GVariant *value,
+ gpointer *result,
+ gpointer data)
+{
+#if 0
+ const gchar *string_value;
+
+ string_value = g_variant_get_string (value, NULL);
+
+ if (string_value)
+ update_button_layout (string_value);
+#endif
+
+ *result = NULL; /* ignored */
return TRUE;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]