diff options
Diffstat (limited to 'plugins')
| -rw-r--r-- | plugins/xsettings/msd-xsettings-manager.c | 88 | ||||
| -rw-r--r-- | plugins/xsettings/xsettings-manager.c | 75 | ||||
| -rw-r--r-- | plugins/xsettings/xsettings-manager.h | 3 |
3 files changed, 128 insertions, 38 deletions
diff --git a/plugins/xsettings/msd-xsettings-manager.c b/plugins/xsettings/msd-xsettings-manager.c index c8199da..86ff376 100644 --- a/plugins/xsettings/msd-xsettings-manager.c +++ b/plugins/xsettings/msd-xsettings-manager.c @@ -56,6 +56,10 @@ #define SCALING_FACTOR_QT_KEY "window-scaling-factor-qt-sync" #define FONT_RENDER_SCHEMA "org.mate.font-rendering" + +#define XSETTINGS_PLUGIN_SCHEMA "org.mate.SettingsDaemon.plugins.xsettings" +#define XSETTINGS_OVERRIDE_KEY "overrides" + #define FONT_ANTIALIASING_KEY "antialiasing" #define FONT_HINTING_KEY "hinting" #define FONT_RGBA_ORDER_KEY "rgba-order" @@ -106,6 +110,7 @@ struct MateXSettingsManagerPrivate XSettingsManager **managers; GHashTable *gsettings; GSettings *gsettings_font; + GSettings *plugin_settings; fontconfig_monitor_handle_t *fontconfig_handle; gint window_scale; }; @@ -549,44 +554,6 @@ scale_change_workarounds (MateXSettingsManager *manager, int new_scale, int unsc g_clear_error (&error); } } - } else { - /* Restart marco */ - /* FIXME: The ideal scenario would be for marco to respect window scaling and thus - * resize itself. Currently this is not happening, so msd restarts it when the window - * scaling factor changes so that it's visually correct. */ - wm_common_update_window(); - gchar *wm = wm_common_get_current_window_manager (); - if (g_strcmp0 (wm, WM_COMMON_MARCO) == 0) { - gchar *marco[3] = {"marco", "--replace", NULL}; - if (!g_spawn_async (NULL, marco, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, &error)) { - g_warning ("There was a problem restarting marco: %s", error->message); - g_clear_error (&error); - } - } - g_free (wm); - - /* Restart mate-panel */ - /* FIXME: The ideal scenario would be for mate-panel to respect window scaling and thus - * resize itself. Currently this is not happening, so msd restarts it when the window - * scaling factor changes so that it's visually correct. */ - gchar *mate_panel[3] = {"killall", "mate-panel", NULL}; - if (!g_spawn_async (NULL, mate_panel, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, &error)) { - g_warning ("There was a problem restarting mate-panel: %s", error->message); - g_clear_error (&error); - } - - /* Toggle icons on desktop to fix size */ - /* FIXME: The ideal scenario would be for caja to respect window scaling and thus - * resize itself. Currently this is not happening, so msd restarts it when the window - * scaling factor changes so that it's visually correct. */ - GSettings *desktop_settings; - desktop_settings = g_settings_new ("org.mate.background"); - if (g_settings_get_boolean (desktop_settings, "show-desktop-icons")) { - /* Delay the toggle to allow enough time for the desktop to redraw */ - g_timeout_add_seconds (1, delayed_toggle_bg_draw, GBOOLEAN_TO_POINTER (FALSE)); - g_timeout_add_seconds (2, delayed_toggle_bg_draw, GBOOLEAN_TO_POINTER (TRUE)); - } - g_object_unref (desktop_settings); } /* Store new scale value */ @@ -744,6 +711,34 @@ xft_callback (GSettings *gsettings G_GNUC_UNUSED, } static void +override_callback (GSettings *settings, + const gchar *key, + MateXSettingsManager *manager) +{ + GVariant *value; + int i; + + value = g_settings_get_value (settings, XSETTINGS_OVERRIDE_KEY); + + for (i = 0; manager->priv->managers [i]; i++) { + xsettings_manager_set_overrides (manager->priv->managers [i], value); + xsettings_manager_notify (manager->priv->managers [i]); + } + + g_variant_unref (value); +} + +static void +plugin_callback (GSettings *settings, + const char *key, + MateXSettingsManager *manager) +{ + if (g_str_equal (key, XSETTINGS_OVERRIDE_KEY)) { + override_callback (settings, key, manager); + } +} + +static void fontconfig_callback (fontconfig_monitor_handle_t *handle, MateXSettingsManager *manager) { @@ -972,6 +967,10 @@ mate_xsettings_manager_start (MateXSettingsManager *manager, g_signal_connect (manager->priv->gsettings_font, "changed", G_CALLBACK (xft_callback), manager); update_xft_settings (manager); + /* Plugin settings (overrides) */ + manager->priv->plugin_settings = g_settings_new (XSETTINGS_PLUGIN_SCHEMA); + g_signal_connect (manager->priv->plugin_settings, "changed", G_CALLBACK (plugin_callback), manager); + start_fontconfig_monitor (manager); for (i = 0; manager->priv->managers [i]; i++) @@ -983,6 +982,14 @@ mate_xsettings_manager_start (MateXSettingsManager *manager, xsettings_manager_notify (manager->priv->managers [i]); } + /* Load initial overrides */ + GVariant *overrides = g_settings_get_value (manager->priv->plugin_settings, XSETTINGS_OVERRIDE_KEY); + for (i = 0; manager->priv->managers [i]; i++) { + xsettings_manager_set_overrides (manager->priv->managers [i], overrides); + xsettings_manager_notify (manager->priv->managers [i]); + } + g_variant_unref (overrides); + mate_settings_profile_end (NULL); return TRUE; @@ -1014,6 +1021,11 @@ mate_xsettings_manager_stop (MateXSettingsManager *manager) p->gsettings_font = NULL; } + if (p->plugin_settings != NULL) { + g_object_unref (p->plugin_settings); + p->plugin_settings = NULL; + } + stop_fontconfig_monitor (manager); } diff --git a/plugins/xsettings/xsettings-manager.c b/plugins/xsettings/xsettings-manager.c index 8bf4187..d8f5dd5 100644 --- a/plugins/xsettings/xsettings-manager.c +++ b/plugins/xsettings/xsettings-manager.c @@ -26,6 +26,7 @@ #include <string.h> #include <X11/Xmd.h> /* For CARD16 */ +#include <glib.h> #include "xsettings-manager.h" @@ -44,6 +45,8 @@ struct _XSettingsManager XSettingsList *settings; unsigned long serial; + + GVariant *overrides; }; static XSettingsList *settings; @@ -146,6 +149,7 @@ xsettings_manager_new (Display *display, manager->settings = NULL; manager->serial = 0; + manager->overrides = NULL; manager->window = XCreateSimpleWindow (display, RootWindow (display, screen), @@ -193,6 +197,10 @@ xsettings_manager_destroy (XSettingsManager *manager) XDestroyWindow (manager->display, manager->window); xsettings_list_free (manager->settings); + + if (manager->overrides) + g_variant_unref (manager->overrides); + free (manager); } @@ -423,3 +431,70 @@ xsettings_manager_notify (XSettingsManager *manager) return XSETTINGS_SUCCESS; } +#define XSETTINGS_VARIANT_TYPE_COLOR (G_VARIANT_TYPE ("(qqqq)")) + +void +xsettings_manager_set_overrides (XSettingsManager *manager, + GVariant *overrides) +{ + GVariantIter iter; + const gchar *key; + GVariant *value; + + g_return_if_fail (overrides != NULL && g_variant_is_of_type (overrides, G_VARIANT_TYPE_VARDICT)); + + if (manager->overrides) + { + /* unset the existing overrides */ + + g_variant_iter_init (&iter, manager->overrides); + while (g_variant_iter_next (&iter, "{&sv}", &key, NULL)) + /* only unset it at this point if it's not in the new list */ + if (!g_variant_lookup (overrides, key, "*", NULL)) + xsettings_manager_delete_setting (manager, key); + g_variant_unref (manager->overrides); + } + + /* save this so we can do the unsets next time */ + manager->overrides = g_variant_ref_sink (overrides); + + /* set the new values */ + g_variant_iter_init (&iter, overrides); + while (g_variant_iter_loop (&iter, "{&sv}", &key, &value)) + { + XSettingsSetting *setting; + + /* only accept recognised types... */ + if (!g_variant_is_of_type (value, G_VARIANT_TYPE_STRING) && + !g_variant_is_of_type (value, G_VARIANT_TYPE_INT32) && + !g_variant_is_of_type (value, XSETTINGS_VARIANT_TYPE_COLOR)) + continue; + + setting = g_new0 (XSettingsSetting, 1); + setting->name = g_strdup (key); + + if (g_variant_is_of_type (value, G_VARIANT_TYPE_STRING)) + { + setting->type = XSETTINGS_TYPE_STRING; + setting->data.v_string = g_strdup (g_variant_get_string (value, NULL)); + } + else if (g_variant_is_of_type (value, G_VARIANT_TYPE_INT32)) + { + setting->type = XSETTINGS_TYPE_INT; + setting->data.v_int = g_variant_get_int32 (value); + } + else if (g_variant_is_of_type (value, XSETTINGS_VARIANT_TYPE_COLOR)) + { + guint16 red, green, blue, alpha; + + g_variant_get (value, "(qqqq)", &red, &green, &blue, &alpha); + setting->type = XSETTINGS_TYPE_COLOR; + setting->data.v_color.red = red; + setting->data.v_color.green = green; + setting->data.v_color.blue = blue; + setting->data.v_color.alpha = alpha; + } + + xsettings_manager_set_setting (manager, setting); + } +} diff --git a/plugins/xsettings/xsettings-manager.h b/plugins/xsettings/xsettings-manager.h index 55f674b..ebd7740 100644 --- a/plugins/xsettings/xsettings-manager.h +++ b/plugins/xsettings/xsettings-manager.h @@ -25,6 +25,7 @@ #define XSETTINGS_MANAGER_H #include <X11/Xlib.h> +#include <glib.h> #include "xsettings-common.h" #ifdef __cplusplus @@ -62,6 +63,8 @@ XSettingsResult xsettings_manager_set_color (XSettingsManager *manage const char *name, const XSettingsColor *value); XSettingsResult xsettings_manager_notify (XSettingsManager *manager); +void xsettings_manager_set_overrides (XSettingsManager *manager, + GVariant *overrides); #ifdef __cplusplus } |
