]> Pileus Git - ~andy/gtk/commitdiff
x11: Get rid of XSettingsSetting
authorBenjamin Otte <otte@redhat.com>
Sat, 16 Feb 2013 23:30:06 +0000 (00:30 +0100)
committerBenjamin Otte <otte@redhat.com>
Tue, 19 Feb 2013 13:33:38 +0000 (14:33 +0100)
Use GValue throughout instead.

gdk/x11/gdkscreen-x11.c
gdk/x11/xsettings-client.c
gdk/x11/xsettings-client.h

index fd370207bc43d1fd06912a5ddb869a24fde426a9..1efec10c0e7a7e2d7f437364cf116e3bf1bc3e47 100644 (file)
@@ -1328,87 +1328,33 @@ gdk_x11_screen_get_window_stack (GdkScreen *screen)
   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
 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
index 1bb437fcfeb891f599315900f4e3f479a289746c..757984a04cebbf18b9dd67bb23d076fe49a9ddd1 100644 (file)
@@ -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);
-}
-
index 5d9d82eafdaf1dc1e1c1ede0f7921e17fc510ab3..9400c2424b095e35f61aae54776f881f6dcdd28f 100644 (file)
 #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 */