[Xfce4-commits] r26294 - in xfdesktop: branches/xfce_4_4/src trunk/src

Brian Tarricone kelnos at xfce.org
Thu Nov 15 08:37:46 CET 2007


Author: kelnos
Date: 2007-11-15 07:37:46 +0000 (Thu, 15 Nov 2007)
New Revision: 26294

Modified:
   xfdesktop/branches/xfce_4_4/src/settings.c
   xfdesktop/trunk/src/settings.c
Log:
fix settings only getting applied to screen 0 in a multihead setup when
the settings change (bug 3467)


Modified: xfdesktop/branches/xfce_4_4/src/settings.c
===================================================================
--- xfdesktop/branches/xfce_4_4/src/settings.c	2007-11-15 06:22:11 UTC (rev 26293)
+++ xfdesktop/branches/xfce_4_4/src/settings.c	2007-11-15 07:37:46 UTC (rev 26294)
@@ -41,8 +41,8 @@
 
 typedef struct _SettingsCBData
 {
-    SettingsCallback cb;
     gpointer user_data;
+    GList *callbacks;
 } SettingsCBData;
 
 static McsClient *mcs_client = NULL;
@@ -74,15 +74,18 @@
 notify_cb(const char *name, const char *channel_name, McsAction action,
         McsSetting *setting, void *data)
 {
-    GList *l;
+    GList *l, *m;
     
     g_return_if_fail(!strcmp(channel_name, BACKDROP_CHANNEL));
     
     for(l = callbacks; l; l = l->next) {
-        SettingsCBData *cbd = l->data;
+        SettingsCBData *cbdata = l->data;
         
-        if((*cbd->cb)(mcs_client, action, setting, cbd->user_data))
-            break;
+        for(m = cbdata->callbacks; m; m = m->next) {
+            SettingsCallback cb = m->data;
+            if(cb(mcs_client, action, setting, cbdata->user_data))
+                break;
+        }
     }
 }
 
@@ -112,18 +115,36 @@
     return mcs_client;
 }
 
+static gint
+settings_compare_cbdata(gconstpointer a,
+                        gconstpointer b)
+{
+    const SettingsCBData *ca = a, *cb = b;
+    return ca->user_data - cb->user_data;
+}
+
+/* callbacks are keyed to the user_data parameter, which can't be NULL.
+ * for each user_data parameter registered, each callback registered (there
+ * can be more than one) for that user_data pointer will be called until
+ * one of them returns TRUE. */
 void
 settings_register_callback(SettingsCallback cb, gpointer user_data)
 {
+    GList *l;
     SettingsCBData *cbdata;
     
-    g_return_if_fail(cb != NULL && mcs_client != NULL);
+    g_return_if_fail(cb && user_data && mcs_client);
     
-    cbdata = g_new0(SettingsCBData, 1);
-    cbdata->cb = cb;
-    cbdata->user_data = user_data;
+    l = g_list_find_custom(callbacks, user_data, settings_compare_cbdata);
+    if(l)
+        cbdata = l->data;
+    else {
+        cbdata = g_new0(SettingsCBData, 1);
+        cbdata->user_data = user_data;
+        callbacks = g_list_append(callbacks, cbdata);
+    }
     
-    callbacks = g_list_append(callbacks, cbdata);
+    cbdata->callbacks = g_list_append(cbdata->callbacks, cb);
 }
 
 void
@@ -145,10 +166,10 @@
         mcs_client = NULL;
     }
     
-    for(l = callbacks; l; l = l->next)
+    for(l = callbacks; l; l = l->next) {
+        g_list_free(((SettingsCBData *)l->data)->callbacks);
         g_free(l->data);
-    if(callbacks) {
-        g_list_free(callbacks);
-        callbacks = NULL;
     }
+    g_list_free(callbacks);
+    callbacks = NULL;
 }

Modified: xfdesktop/trunk/src/settings.c
===================================================================
--- xfdesktop/trunk/src/settings.c	2007-11-15 06:22:11 UTC (rev 26293)
+++ xfdesktop/trunk/src/settings.c	2007-11-15 07:37:46 UTC (rev 26294)
@@ -41,8 +41,8 @@
 
 typedef struct _SettingsCBData
 {
-    SettingsCallback cb;
     gpointer user_data;
+    GList *callbacks;
 } SettingsCBData;
 
 static McsClient *mcs_client = NULL;
@@ -74,15 +74,18 @@
 notify_cb(const char *name, const char *channel_name, McsAction action,
         McsSetting *setting, void *data)
 {
-    GList *l;
+    GList *l, *m;
     
     g_return_if_fail(!strcmp(channel_name, BACKDROP_CHANNEL));
     
     for(l = callbacks; l; l = l->next) {
-        SettingsCBData *cbd = l->data;
+        SettingsCBData *cbdata = l->data;
         
-        if((*cbd->cb)(mcs_client, action, setting, cbd->user_data))
-            break;
+        for(m = cbdata->callbacks; m; m = m->next) {
+            SettingsCallback cb = m->data;
+            if(cb(mcs_client, action, setting, cbdata->user_data))
+                break;
+        }
     }
 }
 
@@ -112,18 +115,36 @@
     return mcs_client;
 }
 
+static gint
+settings_compare_cbdata(gconstpointer a,
+                        gconstpointer b)
+{
+    const SettingsCBData *ca = a, *cb = b;
+    return ca->user_data - cb->user_data;
+}
+
+/* callbacks are keyed to the user_data parameter, which can't be NULL.
+ * for each user_data parameter registered, each callback registered (there
+ * can be more than one) for that user_data pointer will be called until
+ * one of them returns TRUE. */
 void
 settings_register_callback(SettingsCallback cb, gpointer user_data)
 {
+    GList *l;
     SettingsCBData *cbdata;
     
-    g_return_if_fail(cb != NULL && mcs_client != NULL);
+    g_return_if_fail(cb && user_data && mcs_client);
     
-    cbdata = g_new0(SettingsCBData, 1);
-    cbdata->cb = cb;
-    cbdata->user_data = user_data;
+    l = g_list_find_custom(callbacks, user_data, settings_compare_cbdata);
+    if(l)
+        cbdata = l->data;
+    else {
+        cbdata = g_new0(SettingsCBData, 1);
+        cbdata->user_data = user_data;
+        callbacks = g_list_append(callbacks, cbdata);
+    }
     
-    callbacks = g_list_append(callbacks, cbdata);
+    cbdata->callbacks = g_list_append(cbdata->callbacks, cb);
 }
 
 void
@@ -145,10 +166,10 @@
         mcs_client = NULL;
     }
     
-    for(l = callbacks; l; l = l->next)
+    for(l = callbacks; l; l = l->next) {
+        g_list_free(((SettingsCBData *)l->data)->callbacks);
         g_free(l->data);
-    if(callbacks) {
-        g_list_free(callbacks);
-        callbacks = NULL;
     }
+    g_list_free(callbacks);
+    callbacks = NULL;
 }



More information about the Xfce4-commits mailing list