]> Pileus Git - ~andy/gtk/blobdiff - gdk/x11/xsettings-client.c
xsettings: Use glib byte order functions
[~andy/gtk] / gdk / x11 / xsettings-client.c
index d17e4213a6c2e5e60f54ccde5a8cae5b7483dc9d..fb97f95dd7b55d20cf8dd80e3b98075cd63bbf8e 100644 (file)
  *
  * Author:  Owen Taylor, Red Hat, Inc.
  */
-#include <config.h>
+
+#include "config.h"
+
+#include "xsettings-client.h"
+
 #include <limits.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -29,8 +33,6 @@
 #include <X11/Xlib.h>
 #include <X11/Xmd.h>           /* For CARD16 */
 
-#include "xsettings-client.h"
-
 struct _XSettingsClient
 {
   Display *display;
@@ -54,51 +56,36 @@ static void
 notify_changes (XSettingsClient *client,
                XSettingsList   *old_list)
 {
-  XSettingsList *old_iter = old_list;
-  XSettingsList *new_iter = client->settings;
+  GHashTableIter iter;
+  XSettingsSetting *setting, *old_setting;
 
   if (!client->notify)
     return;
 
-  while (old_iter || new_iter)
+  if (client->settings != NULL)
     {
-      int cmp;
-      
-      if (old_iter && new_iter)
-       cmp = strcmp (old_iter->setting->name, new_iter->setting->name);
-      else if (old_iter)
-       cmp = -1;
-      else
-       cmp = 1;
-
-      if (cmp < 0)
+      g_hash_table_iter_init (&iter, client->settings);
+      while (g_hash_table_iter_next (&iter, NULL, (gpointer*) &setting))
        {
-         client->notify (old_iter->setting->name,
-                         XSETTINGS_ACTION_DELETED,
-                         NULL,
-                         client->cb_data);
-       }
-      else if (cmp == 0)
-       {
-         if (!xsettings_setting_equal (old_iter->setting,
-                                       new_iter->setting))
-           client->notify (old_iter->setting->name,
-                           XSETTINGS_ACTION_CHANGED,
-                           new_iter->setting,
-                           client->cb_data);
-       }
-      else
-       {
-         client->notify (new_iter->setting->name,
-                         XSETTINGS_ACTION_NEW,
-                         new_iter->setting,
-                         client->cb_data);
+         old_setting = xsettings_list_lookup (old_list, setting->name);
+
+         if (old_setting == NULL)
+           client->notify (setting->name, XSETTINGS_ACTION_NEW, setting, client->cb_data);
+         else if (!xsettings_setting_equal (setting, old_setting))
+           client->notify (setting->name, XSETTINGS_ACTION_CHANGED, setting, client->cb_data);
+           
+         /* remove setting from old_list */
+         if (old_setting != NULL)
+           g_hash_table_remove (old_list, setting->name);
        }
+    }
 
-      if (old_iter)
-       old_iter = old_iter->next;
-      if (new_iter)
-       new_iter = new_iter->next;
+  if (old_list != NULL)
+    {
+      /* old_list now contains only deleted settings */
+      g_hash_table_iter_init (&iter, old_list);
+      while (g_hash_table_iter_next (&iter, NULL, (gpointer*) &old_setting))
+       client->notify (old_setting->name, XSETTINGS_ACTION_DELETED, NULL, client->cb_data);
     }
 }
 
@@ -108,8 +95,6 @@ ignore_errors (Display *display, XErrorEvent *event)
   return True;
 }
 
-static char local_byte_order = '\0';
-
 #define BYTES_LEFT(buffer) ((buffer)->data + (buffer)->len - (buffer)->pos)
 
 static XSettingsResult
@@ -124,10 +109,10 @@ fetch_card16 (XSettingsBuffer *buffer,
   x = *(CARD16 *)buffer->pos;
   buffer->pos += 2;
   
-  if (buffer->byte_order == local_byte_order)
-    *result = x;
+  if (buffer->byte_order == MSBFirst)
+    *result = GUINT16_FROM_BE (x);
   else
-    *result = (x << 8) | (x >> 8);
+    *result = GUINT16_FROM_LE (x);
 
   return XSETTINGS_SUCCESS;
 }
@@ -158,10 +143,10 @@ fetch_card32 (XSettingsBuffer *buffer,
   x = *(CARD32 *)buffer->pos;
   buffer->pos += 4;
   
-  if (buffer->byte_order == local_byte_order)
-    *result = x;
+  if (buffer->byte_order == MSBFirst)
+    *result = GUINT32_FROM_BE (x);
   else
-    *result = (x << 24) | ((x & 0xff00) << 8) | ((x & 0xff0000) >> 8) | (x >> 24);
+    *result = GUINT32_FROM_LE (x);
   
   return XSETTINGS_SUCCESS;
 }
@@ -193,8 +178,6 @@ parse_settings (unsigned char *data,
   CARD32 i;
   XSettingsSetting *setting = NULL;
   
-  local_byte_order = xsettings_byte_order ();
-
   buffer.pos = buffer.data = data;
   buffer.len = len;
   
@@ -441,9 +424,19 @@ check_manager_window (XSettingsClient *client)
   XFlush (client->display);
 
   if (client->manager_window && client->watch)
-    client->watch (client->manager_window, True, 
-                  PropertyChangeMask | StructureNotifyMask,
-                  client->cb_data);
+    {
+      if (!client->watch (client->manager_window, True, 
+                         PropertyChangeMask | StructureNotifyMask,
+                         client->cb_data))
+       {
+         /* Inability to watch the window probably means that it was destroyed
+          * after we ungrabbed
+          */
+         client->manager_window = None;
+         return;
+       }
+    }
+      
   
   read_settings (client);
 }
@@ -453,20 +446,9 @@ xsettings_client_new (Display             *display,
                      int                  screen,
                      XSettingsNotifyFunc  notify,
                      XSettingsWatchFunc   watch,
-                     void                *cb_data)
-{
-  return xsettings_client_new_with_grab_funcs (display, screen, notify, watch, cb_data,
-                                               NULL, NULL);
-}
-
-XSettingsClient *
-xsettings_client_new_with_grab_funcs (Display             *display,
-                                     int                  screen,
-                                     XSettingsNotifyFunc  notify,
-                                     XSettingsWatchFunc   watch,
-                                     void                *cb_data,
-                                     XSettingsGrabFunc    grab,
-                                     XSettingsGrabFunc    ungrab)
+                     void                *cb_data,
+                     XSettingsGrabFunc    grab,
+                     XSettingsGrabFunc    ungrab)
 {
   XSettingsClient *client;
   char buffer[256];
@@ -484,7 +466,6 @@ xsettings_client_new_with_grab_funcs (Display             *display,
   client->cb_data = cb_data;
   client->grab = grab;
   client->ungrab = ungrab;
-  
   client->manager_window = None;
   client->settings = NULL;
 
@@ -493,14 +474,8 @@ xsettings_client_new_with_grab_funcs (Display             *display,
   atom_names[1] = "_XSETTINGS_SETTINGS";
   atom_names[2] = "MANAGER";
 
-#ifdef HAVE_XINTERNATOMS
   XInternAtoms (display, atom_names, 3, False, atoms);
-#else
-  atoms[0] = XInternAtom (display, atom_names[0], False);
-  atoms[1] = XInternAtom (display, atom_names[1], False);
-  atoms[2] = XInternAtom (display, atom_names[2], False);
-#endif
-  
+
   client->selection_atom = atoms[0];
   client->xsettings_atom = atoms[1];
   client->manager_atom = atoms[2];