x11: Get rid of XSettingsSetting
Use GValue throughout instead.
This commit is contained in:
parent
84679ba78b
commit
e1efe3269c
@ -1328,87 +1328,33 @@ gdk_x11_screen_get_window_stack (GdkScreen *screen)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
static gboolean
|
||||||
gdk_x11_screen_get_setting (GdkScreen *screen,
|
gdk_x11_screen_get_setting (GdkScreen *screen,
|
||||||
const gchar *name,
|
const gchar *name,
|
||||||
GValue *value)
|
GValue *value)
|
||||||
{
|
{
|
||||||
GdkX11Screen *x11_screen = GDK_X11_SCREEN (screen);
|
GdkX11Screen *x11_screen = GDK_X11_SCREEN (screen);
|
||||||
const XSettingsSetting *setting;
|
const GValue *setting;
|
||||||
gboolean success = FALSE;
|
|
||||||
GValue tmp_val = G_VALUE_INIT;
|
|
||||||
|
|
||||||
setting = xsettings_client_get_setting (x11_screen->xsettings_client, name);
|
setting = xsettings_client_get_setting (x11_screen->xsettings_client, name);
|
||||||
if (setting == NULL)
|
if (setting == NULL)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
switch (setting->type)
|
if (!g_value_type_transformable (G_VALUE_TYPE (setting), G_VALUE_TYPE (value)))
|
||||||
{
|
{
|
||||||
case XSETTINGS_TYPE_INT:
|
g_warning ("Cannot transform xsetting %s of type %s to type %s\n",
|
||||||
if (check_transform (name, G_TYPE_INT, G_VALUE_TYPE (value)))
|
name,
|
||||||
{
|
g_type_name (G_VALUE_TYPE (setting)),
|
||||||
g_value_init (&tmp_val, G_TYPE_INT);
|
g_type_name (G_VALUE_TYPE (value)));
|
||||||
g_value_set_int (&tmp_val, setting->data.v_int);
|
goto out;
|
||||||
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_value_unset (&tmp_val);
|
g_value_transform (setting, value);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
if (success)
|
return _gdk_x11_get_xft_setting (screen, name, value);
|
||||||
return TRUE;
|
|
||||||
else
|
|
||||||
return _gdk_x11_get_xft_setting (screen, name, value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -63,7 +63,6 @@ struct _XSettingsClient
|
|||||||
static void
|
static void
|
||||||
gdk_xsettings_notify (const char *name,
|
gdk_xsettings_notify (const char *name,
|
||||||
GdkSettingAction action,
|
GdkSettingAction action,
|
||||||
XSettingsSetting *setting,
|
|
||||||
GdkScreen *screen)
|
GdkScreen *screen)
|
||||||
{
|
{
|
||||||
GdkEvent new_event;
|
GdkEvent new_event;
|
||||||
@ -81,12 +80,33 @@ gdk_xsettings_notify (const char *name,
|
|||||||
gdk_event_put (&new_event);
|
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
|
static void
|
||||||
notify_changes (XSettingsClient *client,
|
notify_changes (XSettingsClient *client,
|
||||||
GHashTable *old_list)
|
GHashTable *old_list)
|
||||||
{
|
{
|
||||||
GHashTableIter iter;
|
GHashTableIter iter;
|
||||||
XSettingsSetting *setting, *old_setting;
|
GValue *setting, *old_setting;
|
||||||
const char *name;
|
const char *name;
|
||||||
|
|
||||||
if (client->settings != NULL)
|
if (client->settings != NULL)
|
||||||
@ -97,9 +117,9 @@ notify_changes (XSettingsClient *client,
|
|||||||
old_setting = old_list ? g_hash_table_lookup (old_list, name) : NULL;
|
old_setting = old_list ? g_hash_table_lookup (old_list, name) : NULL;
|
||||||
|
|
||||||
if (old_setting == NULL)
|
if (old_setting == NULL)
|
||||||
gdk_xsettings_notify (name, GDK_SETTING_ACTION_NEW, setting, client->screen);
|
gdk_xsettings_notify (name, GDK_SETTING_ACTION_NEW, client->screen);
|
||||||
else if (!xsettings_setting_equal (setting, old_setting))
|
else if (!value_equal (setting, old_setting))
|
||||||
gdk_xsettings_notify (name, GDK_SETTING_ACTION_CHANGED, setting, client->screen);
|
gdk_xsettings_notify (name, GDK_SETTING_ACTION_CHANGED, client->screen);
|
||||||
|
|
||||||
/* remove setting from old_list */
|
/* remove setting from old_list */
|
||||||
if (old_setting != NULL)
|
if (old_setting != NULL)
|
||||||
@ -112,7 +132,7 @@ notify_changes (XSettingsClient *client,
|
|||||||
/* old_list now contains only deleted settings */
|
/* old_list now contains only deleted settings */
|
||||||
g_hash_table_iter_init (&iter, old_list);
|
g_hash_table_iter_init (&iter, old_list);
|
||||||
while (g_hash_table_iter_next (&iter, (gpointer *) &name, (gpointer*) &old_setting))
|
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;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
free_value (gpointer data)
|
||||||
|
{
|
||||||
|
GValue *value = data;
|
||||||
|
|
||||||
|
g_value_unset (value);
|
||||||
|
g_free (value);
|
||||||
|
}
|
||||||
|
|
||||||
static GHashTable *
|
static GHashTable *
|
||||||
parse_settings (unsigned char *data,
|
parse_settings (unsigned char *data,
|
||||||
size_t len)
|
size_t len)
|
||||||
@ -224,7 +253,7 @@ parse_settings (unsigned char *data,
|
|||||||
CARD32 serial;
|
CARD32 serial;
|
||||||
CARD32 n_entries;
|
CARD32 n_entries;
|
||||||
CARD32 i;
|
CARD32 i;
|
||||||
XSettingsSetting *setting = NULL;
|
GValue *value = NULL;
|
||||||
char *x_name = NULL;
|
char *x_name = NULL;
|
||||||
const char *gdk_name;
|
const char *gdk_name;
|
||||||
|
|
||||||
@ -263,9 +292,6 @@ parse_settings (unsigned char *data,
|
|||||||
if (!fetch_card16 (&buffer, &name_len))
|
if (!fetch_card16 (&buffer, &name_len))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
setting = g_new (XSettingsSetting, 1);
|
|
||||||
setting->type = XSETTINGS_TYPE_INT; /* No allocated memory */
|
|
||||||
|
|
||||||
if (!fetch_string (&buffer, name_len, &x_name) ||
|
if (!fetch_string (&buffer, name_len, &x_name) ||
|
||||||
/* last change serial (we ignore it) */
|
/* last change serial (we ignore it) */
|
||||||
!fetch_card32 (&buffer, &v_int))
|
!fetch_card32 (&buffer, &v_int))
|
||||||
@ -277,26 +303,49 @@ parse_settings (unsigned char *data,
|
|||||||
if (!fetch_card32 (&buffer, &v_int))
|
if (!fetch_card32 (&buffer, &v_int))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
setting->data.v_int = (INT32)v_int;
|
value = g_new0 (GValue, 1);
|
||||||
GDK_NOTE(SETTINGS, g_print(" %s = %d\n", x_name, (gint) setting->data.v_int));
|
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;
|
break;
|
||||||
case XSETTINGS_TYPE_STRING:
|
case XSETTINGS_TYPE_STRING:
|
||||||
if (!fetch_card32 (&buffer, &v_int) ||
|
{
|
||||||
!fetch_string (&buffer, v_int, &setting->data.v_string))
|
char *s;
|
||||||
goto out;
|
|
||||||
|
|
||||||
GDK_NOTE(SETTINGS, g_print(" %s = \"%s\"\n", x_name, setting->data.v_string));
|
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;
|
break;
|
||||||
case XSETTINGS_TYPE_COLOR:
|
case XSETTINGS_TYPE_COLOR:
|
||||||
if (!fetch_ushort (&buffer, &setting->data.v_color.red) ||
|
{
|
||||||
!fetch_ushort (&buffer, &setting->data.v_color.green) ||
|
unsigned short red, green, blue, alpha;
|
||||||
!fetch_ushort (&buffer, &setting->data.v_color.blue) ||
|
GdkRGBA rgba;
|
||||||
!fetch_ushort (&buffer, &setting->data.v_color.alpha))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
GDK_NOTE(SETTINGS, g_print(" %s = #%02X%02X%02X%02X\n", x_name,
|
if (!fetch_ushort (&buffer, &red) ||
|
||||||
setting->data.v_color.alpha, setting->data.v_color.red,
|
!fetch_ushort (&buffer, &green) ||
|
||||||
setting->data.v_color.green, setting->data.v_color.blue));
|
!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, alpha,red, green, blue));
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
/* Quietly ignore unknown types */
|
/* Quietly ignore unknown types */
|
||||||
@ -304,8 +353,6 @@ parse_settings (unsigned char *data,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
setting->type = type;
|
|
||||||
|
|
||||||
gdk_name = gdk_from_xsettings_name (x_name);
|
gdk_name = gdk_from_xsettings_name (x_name);
|
||||||
g_free (x_name);
|
g_free (x_name);
|
||||||
x_name = NULL;
|
x_name = NULL;
|
||||||
@ -321,7 +368,7 @@ parse_settings (unsigned char *data,
|
|||||||
if (settings == NULL)
|
if (settings == NULL)
|
||||||
settings = g_hash_table_new_full (g_str_hash, g_str_equal,
|
settings = g_hash_table_new_full (g_str_hash, g_str_equal,
|
||||||
NULL,
|
NULL,
|
||||||
(GDestroyNotify) xsettings_setting_free);
|
free_value);
|
||||||
|
|
||||||
if (g_hash_table_lookup (settings, gdk_name) != NULL)
|
if (g_hash_table_lookup (settings, gdk_name) != NULL)
|
||||||
{
|
{
|
||||||
@ -329,18 +376,18 @@ parse_settings (unsigned char *data,
|
|||||||
goto out;
|
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;
|
return settings;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|
||||||
if (setting)
|
if (value)
|
||||||
xsettings_setting_free (setting);
|
free_value (value);
|
||||||
|
|
||||||
if (settings)
|
if (settings)
|
||||||
g_hash_table_unref (settings);
|
g_hash_table_unref (settings);
|
||||||
@ -535,42 +582,10 @@ xsettings_client_destroy (XSettingsClient *client)
|
|||||||
g_free (client);
|
g_free (client);
|
||||||
}
|
}
|
||||||
|
|
||||||
const XSettingsSetting *
|
const GValue *
|
||||||
xsettings_client_get_setting (XSettingsClient *client,
|
xsettings_client_get_setting (XSettingsClient *client,
|
||||||
const char *name)
|
const char *name)
|
||||||
{
|
{
|
||||||
return g_hash_table_lookup (client->settings, 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);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
@ -24,19 +24,13 @@
|
|||||||
#define XSETTINGS_CLIENT_H
|
#define XSETTINGS_CLIENT_H
|
||||||
|
|
||||||
#include <gdk/gdkscreen.h>
|
#include <gdk/gdkscreen.h>
|
||||||
#include <X11/Xlib.h>
|
|
||||||
|
|
||||||
/* Renames for GDK inclusion */
|
/* Renames for GDK inclusion */
|
||||||
|
|
||||||
#define xsettings_client_destroy _gdk_x11_xsettings_client_destroy
|
#define xsettings_client_destroy _gdk_x11_xsettings_client_destroy
|
||||||
#define xsettings_client_get_setting _gdk_x11_xsettings_client_get_setting
|
#define xsettings_client_get_setting _gdk_x11_xsettings_client_get_setting
|
||||||
#define xsettings_client_new _gdk_x11_xsettings_client_new
|
#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;
|
typedef struct _XSettingsClient XSettingsClient;
|
||||||
|
|
||||||
/* Types of settings possible. Enum values correspond to
|
/* Types of settings possible. Enum values correspond to
|
||||||
@ -49,30 +43,9 @@ typedef enum
|
|||||||
XSETTINGS_TYPE_COLOR = 2
|
XSETTINGS_TYPE_COLOR = 2
|
||||||
} XSettingsType;
|
} 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);
|
XSettingsClient *xsettings_client_new (GdkScreen *screen);
|
||||||
void xsettings_client_destroy (XSettingsClient *client);
|
void xsettings_client_destroy (XSettingsClient *client);
|
||||||
const XSettingsSetting *
|
const GValue * xsettings_client_get_setting (XSettingsClient *client,
|
||||||
xsettings_client_get_setting (XSettingsClient *client,
|
|
||||||
const char *name);
|
const char *name);
|
||||||
|
|
||||||
#endif /* XSETTINGS_CLIENT_H */
|
#endif /* XSETTINGS_CLIENT_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user