XSettingsResult xsettings_manager_set_setting (XSettingsManager *manager, XSettingsSetting *setting) { XSettingsSetting *old_setting = xsettings_list_lookup (settings, setting->name); XSettingsSetting *new_setting; XSettingsResult result; if (old_setting) { if (xsettings_setting_equal (old_setting, setting)) return XSETTINGS_SUCCESS; xsettings_list_delete (&settings, setting->name); } new_setting = xsettings_setting_copy (setting); if (!new_setting) return XSETTINGS_NO_MEM; new_setting->last_change_serial = manager->serial; result = xsettings_list_insert (&settings, new_setting); if (result != XSETTINGS_SUCCESS) xsettings_setting_free (new_setting); return result; }
static gboolean gdk_x11_screen_get_setting (GdkScreen *screen, const gchar *name, GValue *value) { const char *xsettings_name = NULL; XSettingsResult result; XSettingsSetting *setting = NULL; GdkX11Screen *x11_screen; gboolean success = FALSE; gint i; GValue tmp_val = { 0, }; g_return_val_if_fail (GDK_IS_SCREEN (screen), FALSE); x11_screen = GDK_X11_SCREEN (screen); for (i = 0; i < GDK_SETTINGS_N_ELEMENTS(); i++) if (strcmp (GDK_SETTINGS_GDK_NAME (i), name) == 0) { xsettings_name = GDK_SETTINGS_X_NAME (i); break; } if (!xsettings_name) goto out; result = xsettings_client_get_setting (x11_screen->xsettings_client, xsettings_name, &setting); if (result != XSETTINGS_SUCCESS) goto out; switch (setting->type) { case XSETTINGS_TYPE_INT: if (check_transform (xsettings_name, G_TYPE_INT, G_VALUE_TYPE (value))) { g_value_init (&tmp_val, G_TYPE_INT); g_value_set_int (&tmp_val, setting->data.v_int); g_value_transform (&tmp_val, value); success = TRUE; } break; case XSETTINGS_TYPE_STRING: if (check_transform (xsettings_name, G_TYPE_STRING, G_VALUE_TYPE (value))) { g_value_init (&tmp_val, G_TYPE_STRING); g_value_set_string (&tmp_val, setting->data.v_string); g_value_transform (&tmp_val, value); success = TRUE; } break; case XSETTINGS_TYPE_COLOR: if (!check_transform (xsettings_name, GDK_TYPE_COLOR, G_VALUE_TYPE (value))) { GdkColor color; g_value_init (&tmp_val, GDK_TYPE_COLOR); color.pixel = 0; color.red = setting->data.v_color.red; color.green = setting->data.v_color.green; color.blue = setting->data.v_color.blue; g_value_set_boxed (&tmp_val, &color); g_value_transform (&tmp_val, value); success = TRUE; } break; } g_value_unset (&tmp_val); out: if (setting) xsettings_setting_free (setting); if (success) return TRUE; else return _gdk_x11_get_xft_setting (screen, name, value); }