[gtk+] x11: Get rid of XSettingsSetting
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] x11: Get rid of XSettingsSetting
- Date: Tue, 19 Feb 2013 13:49:38 +0000 (UTC)
commit e1efe3269cb7f5f09f9cb0dfc725fcbb50512f2c
Author: Benjamin Otte <otte redhat com>
Date: Sun Feb 17 00:30:06 2013 +0100
x11: Get rid of XSettingsSetting
Use GValue throughout instead.
gdk/x11/gdkscreen-x11.c | 76 +++--------------------
gdk/x11/xsettings-client.c | 145 ++++++++++++++++++++++++--------------------
gdk/x11/xsettings-client.h | 29 +---------
3 files changed, 92 insertions(+), 158 deletions(-)
---
diff --git a/gdk/x11/gdkscreen-x11.c b/gdk/x11/gdkscreen-x11.c
index fd37020..1efec10 100644
--- a/gdk/x11/gdkscreen-x11.c
+++ b/gdk/x11/gdkscreen-x11.c
@@ -1329,86 +1329,32 @@ gdk_x11_screen_get_window_stack (GdkScreen *screen)
}
static gboolean
-check_transform (const gchar *xsettings_name,
- GType src_type,
- GType dest_type)
-{
- if (!g_value_type_transformable (src_type, dest_type))
- {
- g_warning ("Cannot transform xsetting %s of type %s to type %s\n",
- xsettings_name,
- g_type_name (src_type),
- g_type_name (dest_type));
- return FALSE;
- }
- else
- return TRUE;
-}
-
-static gboolean
gdk_x11_screen_get_setting (GdkScreen *screen,
const gchar *name,
GValue *value)
{
GdkX11Screen *x11_screen = GDK_X11_SCREEN (screen);
- const XSettingsSetting *setting;
- gboolean success = FALSE;
- GValue tmp_val = G_VALUE_INIT;
+ const GValue *setting;
setting = xsettings_client_get_setting (x11_screen->xsettings_client, name);
if (setting == NULL)
goto out;
- switch (setting->type)
+ if (!g_value_type_transformable (G_VALUE_TYPE (setting), G_VALUE_TYPE (value)))
{
- case XSETTINGS_TYPE_INT:
- if (check_transform (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 (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 (name, GDK_TYPE_RGBA, G_VALUE_TYPE (value)))
- {
- GdkRGBA rgba;
-
- g_value_init (&tmp_val, GDK_TYPE_RGBA);
-
- rgba.red = setting->data.v_color.red / 65535.0;
- rgba.green = setting->data.v_color.green / 65535.0;
- rgba.blue = setting->data.v_color.blue / 65535.0;
- rgba.alpha = setting->data.v_color.alpha / 65535.0;
-
- g_value_set_boxed (&tmp_val, &rgba);
-
- g_value_transform (&tmp_val, value);
-
- success = TRUE;
- }
- break;
+ g_warning ("Cannot transform xsetting %s of type %s to type %s\n",
+ name,
+ g_type_name (G_VALUE_TYPE (setting)),
+ g_type_name (G_VALUE_TYPE (value)));
+ goto out;
}
- g_value_unset (&tmp_val);
+ g_value_transform (setting, value);
+
+ return TRUE;
out:
- if (success)
- return TRUE;
- else
- return _gdk_x11_get_xft_setting (screen, name, value);
+ return _gdk_x11_get_xft_setting (screen, name, value);
}
static void
diff --git a/gdk/x11/xsettings-client.c b/gdk/x11/xsettings-client.c
index 1bb437f..757984a 100644
--- a/gdk/x11/xsettings-client.c
+++ b/gdk/x11/xsettings-client.c
@@ -63,7 +63,6 @@ struct _XSettingsClient
static void
gdk_xsettings_notify (const char *name,
GdkSettingAction action,
- XSettingsSetting *setting,
GdkScreen *screen)
{
GdkEvent new_event;
@@ -81,12 +80,33 @@ gdk_xsettings_notify (const char *name,
gdk_event_put (&new_event);
}
+static gboolean
+value_equal (const GValue *value_a,
+ const GValue *value_b)
+{
+ if (G_VALUE_TYPE (value_a) != G_VALUE_TYPE (value_b))
+ return FALSE;
+
+ switch (G_VALUE_TYPE (value_a))
+ {
+ case G_TYPE_INT:
+ return g_value_get_int (value_a) == g_value_get_int (value_b);
+ case XSETTINGS_TYPE_COLOR:
+ return gdk_rgba_equal (g_value_get_boxed (value_a), g_value_get_boxed (value_b));
+ case G_TYPE_STRING:
+ return g_str_equal (g_value_get_string (value_a), g_value_get_string (value_b));
+ default:
+ g_warning ("unable to compare values of type %s", g_type_name (G_VALUE_TYPE (value_a)));
+ return FALSE;
+ }
+}
+
static void
notify_changes (XSettingsClient *client,
GHashTable *old_list)
{
GHashTableIter iter;
- XSettingsSetting *setting, *old_setting;
+ GValue *setting, *old_setting;
const char *name;
if (client->settings != NULL)
@@ -97,9 +117,9 @@ notify_changes (XSettingsClient *client,
old_setting = old_list ? g_hash_table_lookup (old_list, name) : NULL;
if (old_setting == NULL)
- gdk_xsettings_notify (name, GDK_SETTING_ACTION_NEW, setting, client->screen);
- else if (!xsettings_setting_equal (setting, old_setting))
- gdk_xsettings_notify (name, GDK_SETTING_ACTION_CHANGED, setting, client->screen);
+ gdk_xsettings_notify (name, GDK_SETTING_ACTION_NEW, client->screen);
+ else if (!value_equal (setting, old_setting))
+ gdk_xsettings_notify (name, GDK_SETTING_ACTION_CHANGED, client->screen);
/* remove setting from old_list */
if (old_setting != NULL)
@@ -112,7 +132,7 @@ notify_changes (XSettingsClient *client,
/* old_list now contains only deleted settings */
g_hash_table_iter_init (&iter, old_list);
while (g_hash_table_iter_next (&iter, (gpointer *) &name, (gpointer*) &old_setting))
- gdk_xsettings_notify (name, GDK_SETTING_ACTION_DELETED, NULL, client->screen);
+ gdk_xsettings_notify (name, GDK_SETTING_ACTION_DELETED, client->screen);
}
}
@@ -215,6 +235,15 @@ fetch_string (XSettingsBuffer *buffer,
return TRUE;
}
+static void
+free_value (gpointer data)
+{
+ GValue *value = data;
+
+ g_value_unset (value);
+ g_free (value);
+}
+
static GHashTable *
parse_settings (unsigned char *data,
size_t len)
@@ -224,7 +253,7 @@ parse_settings (unsigned char *data,
CARD32 serial;
CARD32 n_entries;
CARD32 i;
- XSettingsSetting *setting = NULL;
+ GValue *value = NULL;
char *x_name = NULL;
const char *gdk_name;
@@ -263,9 +292,6 @@ parse_settings (unsigned char *data,
if (!fetch_card16 (&buffer, &name_len))
goto out;
- setting = g_new (XSettingsSetting, 1);
- setting->type = XSETTINGS_TYPE_INT; /* No allocated memory */
-
if (!fetch_string (&buffer, name_len, &x_name) ||
/* last change serial (we ignore it) */
!fetch_card32 (&buffer, &v_int))
@@ -277,26 +303,49 @@ parse_settings (unsigned char *data,
if (!fetch_card32 (&buffer, &v_int))
goto out;
- setting->data.v_int = (INT32)v_int;
- GDK_NOTE(SETTINGS, g_print(" %s = %d\n", x_name, (gint) setting->data.v_int));
+ value = g_new0 (GValue, 1);
+ g_value_init (value, G_TYPE_INT);
+ g_value_set_int (value, (gint32) v_int);
+
+ GDK_NOTE(SETTINGS, g_print(" %s = %d\n", x_name, (gint32) v_int));
break;
case XSETTINGS_TYPE_STRING:
- if (!fetch_card32 (&buffer, &v_int) ||
- !fetch_string (&buffer, v_int, &setting->data.v_string))
- goto out;
-
- GDK_NOTE(SETTINGS, g_print(" %s = \"%s\"\n", x_name, setting->data.v_string));
+ {
+ char *s;
+
+ if (!fetch_card32 (&buffer, &v_int) ||
+ !fetch_string (&buffer, v_int, &s))
+ goto out;
+
+ value = g_new0 (GValue, 1);
+ g_value_init (value, G_TYPE_STRING);
+ g_value_take_string (value, s);
+
+ GDK_NOTE(SETTINGS, g_print(" %s = \"%s\"\n", x_name, s));
+ }
break;
case XSETTINGS_TYPE_COLOR:
- if (!fetch_ushort (&buffer, &setting->data.v_color.red) ||
- !fetch_ushort (&buffer, &setting->data.v_color.green) ||
- !fetch_ushort (&buffer, &setting->data.v_color.blue) ||
- !fetch_ushort (&buffer, &setting->data.v_color.alpha))
- goto out;
+ {
+ unsigned short red, green, blue, alpha;
+ GdkRGBA rgba;
+
+ if (!fetch_ushort (&buffer, &red) ||
+ !fetch_ushort (&buffer, &green) ||
+ !fetch_ushort (&buffer, &blue) ||
+ !fetch_ushort (&buffer, &alpha))
+ goto out;
+
+ rgba.red = red / 65535.0;
+ rgba.green = green / 65535.0;
+ rgba.blue = blue / 65535.0;
+ rgba.alpha = alpha / 65535.0;
+
+ value = g_new0 (GValue, 1);
+ g_value_init (value, G_TYPE_STRING);
+ g_value_set_boxed (value, &rgba);
- GDK_NOTE(SETTINGS, g_print(" %s = #%02X%02X%02X%02X\n", x_name,
- setting->data.v_color.alpha, setting->data.v_color.red,
- setting->data.v_color.green, setting->data.v_color.blue));
+ GDK_NOTE(SETTINGS, g_print(" %s = #%02X%02X%02X%02X\n", x_name, alpha,red, green, blue));
+ }
break;
default:
/* Quietly ignore unknown types */
@@ -304,8 +353,6 @@ parse_settings (unsigned char *data,
break;
}
- setting->type = type;
-
gdk_name = gdk_from_xsettings_name (x_name);
g_free (x_name);
x_name = NULL;
@@ -321,7 +368,7 @@ parse_settings (unsigned char *data,
if (settings == NULL)
settings = g_hash_table_new_full (g_str_hash, g_str_equal,
NULL,
- (GDestroyNotify) xsettings_setting_free);
+ free_value);
if (g_hash_table_lookup (settings, gdk_name) != NULL)
{
@@ -329,18 +376,18 @@ parse_settings (unsigned char *data,
goto out;
}
- g_hash_table_insert (settings, (gpointer) gdk_name, setting);
+ g_hash_table_insert (settings, (gpointer) gdk_name, value);
}
- setting = NULL;
+ value = NULL;
}
return settings;
out:
- if (setting)
- xsettings_setting_free (setting);
+ if (value)
+ free_value (value);
if (settings)
g_hash_table_unref (settings);
@@ -535,42 +582,10 @@ xsettings_client_destroy (XSettingsClient *client)
g_free (client);
}
-const XSettingsSetting *
+const GValue *
xsettings_client_get_setting (XSettingsClient *client,
const char *name)
{
return g_hash_table_lookup (client->settings, name);
}
-int
-xsettings_setting_equal (XSettingsSetting *setting_a,
- XSettingsSetting *setting_b)
-{
- if (setting_a->type != setting_b->type)
- return 0;
-
- switch (setting_a->type)
- {
- case XSETTINGS_TYPE_INT:
- return setting_a->data.v_int == setting_b->data.v_int;
- case XSETTINGS_TYPE_COLOR:
- return (setting_a->data.v_color.red == setting_b->data.v_color.red &&
- setting_a->data.v_color.green == setting_b->data.v_color.green &&
- setting_a->data.v_color.blue == setting_b->data.v_color.blue &&
- setting_a->data.v_color.alpha == setting_b->data.v_color.alpha);
- case XSETTINGS_TYPE_STRING:
- return strcmp (setting_a->data.v_string, setting_b->data.v_string) == 0;
- }
-
- return 0;
-}
-
-void
-xsettings_setting_free (XSettingsSetting *setting)
-{
- if (setting->type == XSETTINGS_TYPE_STRING)
- g_free (setting->data.v_string);
-
- g_free (setting);
-}
-
diff --git a/gdk/x11/xsettings-client.h b/gdk/x11/xsettings-client.h
index 5d9d82e..9400c24 100644
--- a/gdk/x11/xsettings-client.h
+++ b/gdk/x11/xsettings-client.h
@@ -24,19 +24,13 @@
#define XSETTINGS_CLIENT_H
#include <gdk/gdkscreen.h>
-#include <X11/Xlib.h>
/* Renames for GDK inclusion */
#define xsettings_client_destroy _gdk_x11_xsettings_client_destroy
#define xsettings_client_get_setting _gdk_x11_xsettings_client_get_setting
#define xsettings_client_new _gdk_x11_xsettings_client_new
-#define xsettings_client_process_event _gdk_x11_xsettings_client_process_event
-#define xsettings_setting_equal _gdk_x11_xsettings_setting_equal
-#define xsettings_setting_free _gdk_x11_xsettings_setting_free
-typedef struct _XSettingsColor XSettingsColor;
-typedef struct _XSettingsSetting XSettingsSetting;
typedef struct _XSettingsClient XSettingsClient;
/* Types of settings possible. Enum values correspond to
@@ -49,30 +43,9 @@ typedef enum
XSETTINGS_TYPE_COLOR = 2
} XSettingsType;
-struct _XSettingsColor
-{
- unsigned short red, green, blue, alpha;
-};
-
-struct _XSettingsSetting
-{
- XSettingsType type;
-
- union {
- int v_int;
- char *v_string;
- XSettingsColor v_color;
- } data;
-};
-
-void xsettings_setting_free (XSettingsSetting *setting);
-int xsettings_setting_equal (XSettingsSetting *setting_a,
- XSettingsSetting *setting_b);
-
XSettingsClient *xsettings_client_new (GdkScreen *screen);
void xsettings_client_destroy (XSettingsClient *client);
-const XSettingsSetting *
- xsettings_client_get_setting (XSettingsClient *client,
+const GValue * xsettings_client_get_setting (XSettingsClient *client,
const char *name);
#endif /* XSETTINGS_CLIENT_H */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]