]> Pileus Git - ~andy/gtk/blobdiff - gdk/x11/xsettings-client.c
x11: Fold xsettings-common.[ch] into xsettings-client.[ch]
[~andy/gtk] / gdk / x11 / xsettings-client.c
index fb97f95dd7b55d20cf8dd80e3b98075cd63bbf8e..93d3bc1e5bc1c7132ac169e7ed5db284f5cb6637 100644 (file)
@@ -25,6 +25,8 @@
 
 #include "xsettings-client.h"
 
+#include <glib.h>
+
 #include <limits.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -49,12 +51,12 @@ struct _XSettingsClient
   Atom selection_atom;
   Atom xsettings_atom;
 
-  XSettingsList *settings;
+  GHashTable *settings; /* string => XSettingsSetting */
 };
 
 static void
 notify_changes (XSettingsClient *client,
-               XSettingsList   *old_list)
+               GHashTable      *old_list)
 {
   GHashTableIter iter;
   XSettingsSetting *setting, *old_setting;
@@ -67,7 +69,7 @@ notify_changes (XSettingsClient *client,
       g_hash_table_iter_init (&iter, client->settings);
       while (g_hash_table_iter_next (&iter, NULL, (gpointer*) &setting))
        {
-         old_setting = xsettings_list_lookup (old_list, setting->name);
+         old_setting = old_list ? g_hash_table_lookup (old_list, setting->name) : NULL;
 
          if (old_setting == NULL)
            client->notify (setting->name, XSETTINGS_ACTION_NEW, setting, client->cb_data);
@@ -166,13 +168,13 @@ fetch_card8 (XSettingsBuffer *buffer,
 
 #define XSETTINGS_PAD(n,m) ((n + m - 1) & (~(m-1)))
 
-static XSettingsList *
+static GHashTable *
 parse_settings (unsigned char *data,
                size_t         len)
 {
   XSettingsBuffer buffer;
   XSettingsResult result = XSETTINGS_SUCCESS;
-  XSettingsList *settings = NULL;
+  GHashTable *settings = NULL;
   CARD32 serial;
   CARD32 n_entries;
   CARD32 i;
@@ -243,10 +245,10 @@ parse_settings (unsigned char *data,
       setting->name[name_len] = '\0';
       buffer.pos += pad_len;
 
+      /* last change serial (we ignore it) */
       result = fetch_card32 (&buffer, &v_int);
       if (result != XSETTINGS_SUCCESS)
        goto out;
-      setting->last_change_serial = v_int;
 
       switch (type)
        {
@@ -304,10 +306,18 @@ parse_settings (unsigned char *data,
 
       setting->type = type;
 
-      result = xsettings_list_insert (&settings, setting);
-      if (result != XSETTINGS_SUCCESS)
-       goto out;
+      if (settings == NULL)
+        settings = g_hash_table_new_full (g_str_hash, g_str_equal,
+                                          NULL,
+                                          (GDestroyNotify) xsettings_setting_free);
 
+      if (g_hash_table_lookup (settings, setting->name) != NULL)
+        {
+          result = XSETTINGS_DUPLICATE_ENTRY;
+          goto out;
+        }
+
+      g_hash_table_insert (settings, setting->name, setting);
       setting = NULL;
     }
 
@@ -334,9 +344,9 @@ parse_settings (unsigned char *data,
       if (setting)
        xsettings_setting_free (setting);
 
-      xsettings_list_free (settings);
+      if (settings)
+        g_hash_table_unref (settings);
       settings = NULL;
-
     }
 
   return settings;
@@ -354,7 +364,7 @@ read_settings (XSettingsClient *client)
 
   int (*old_handler) (Display *, XErrorEvent *);
   
-  XSettingsList *old_list = client->settings;
+  GHashTable *old_list = client->settings;
 
   client->settings = NULL;
 
@@ -385,7 +395,8 @@ read_settings (XSettingsClient *client)
     }
 
   notify_changes (client, old_list);
-  xsettings_list_free (old_list);
+  if (old_list)
+    g_hash_table_unref (old_list);
 }
 
 static void
@@ -517,23 +528,16 @@ xsettings_client_destroy (XSettingsClient *client)
   if (client->manager_window && client->watch)
     client->watch (client->manager_window, False, 0, client->cb_data);
   
-  xsettings_list_free (client->settings);
+  if (client->settings)
+    g_hash_table_unref (client->settings);
   free (client);
 }
 
-XSettingsResult
+const XSettingsSetting *
 xsettings_client_get_setting (XSettingsClient   *client,
-                             const char        *name,
-                             XSettingsSetting **setting)
+                             const char        *name)
 {
-  XSettingsSetting *search = xsettings_list_lookup (client->settings, name);
-  if (search)
-    {
-      *setting = xsettings_setting_copy (search);
-      return *setting ? XSETTINGS_SUCCESS : XSETTINGS_NO_MEM;
-    }
-  else
-    return XSETTINGS_NO_ENTRY;
+  return g_hash_table_lookup (client->settings, name);
 }
 
 Bool
@@ -572,3 +576,42 @@ xsettings_client_process_event (XSettingsClient *client,
   
   return False;
 }
+
+int
+xsettings_setting_equal (XSettingsSetting *setting_a,
+                        XSettingsSetting *setting_b)
+{
+  if (setting_a->type != setting_b->type)
+    return 0;
+
+  if (strcmp (setting_a->name, setting_b->name) != 0)
+    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)
+    free (setting->data.v_string);
+
+  if (setting->name)
+    free (setting->name);
+  
+  free (setting);
+}
+