Author: stephan
Date: 2008-04-21 09:38:50 +0000 (Mon, 21 Apr 2008)
New Revision: 26877

Modified:
   xfconf/trunk/xfsettingsd/main.c
   xfconf/trunk/xfsettingsd/registry.c
   xfconf/trunk/xfsettingsd/registry.h
Log:
Make xfsettingsd use the new property-changed signal interface

Xfsettingsd will now exit cleanly when it loses the selection



Modified: xfconf/trunk/xfsettingsd/main.c
===================================================================
--- xfconf/trunk/xfsettingsd/main.c     2008-04-21 08:33:15 UTC (rev 26876)
+++ xfconf/trunk/xfsettingsd/main.c     2008-04-21 09:38:50 UTC (rev 26877)
@@ -71,8 +71,11 @@
                       GdkEvent *event,
                       gpointer data)
 {
-    if (FALSE)
+    XSettingsRegistry *registry = XSETTINGS_REGISTRY(data);
+
+    if (xsettings_registry_process_event(registry, xevent))
     {
+        gtk_main_quit();
         return GDK_FILTER_REMOVE;
     }
     else
@@ -161,10 +164,10 @@
         xsettings_registry_load(registry, debug);
 
         xsettings_registry_notify(registry);
+
+        gdk_window_add_filter(NULL, manager_event_filter, registry);
     }
 
-    gdk_window_add_filter(NULL, manager_event_filter, NULL);
-
     if(!debug) /* If not in debug mode, fork to background */
     {
         if(!fork())

Modified: xfconf/trunk/xfsettingsd/registry.c
===================================================================
--- xfconf/trunk/xfsettingsd/registry.c 2008-04-21 08:33:15 UTC (rev 26876)
+++ xfconf/trunk/xfsettingsd/registry.c 2008-04-21 09:38:50 UTC (rev 26877)
@@ -82,16 +82,30 @@
     Display *display;
     Window window;
     Atom xsettings_atom;
+    Atom selection_atom;
 };
 
 static void xsettings_registry_set_property(GObject*, guint, const GValue*, 
GParamSpec*);
 static void xsettings_registry_get_property(GObject*, guint, GValue*, 
GParamSpec*);
 
 static void
-cb_xsettings_registry_channel_property_changed(XfconfChannel *channel, const 
gchar *property_name, XSettingsRegistry *registry); 
+cb_xsettings_registry_channel_property_changed(XfconfChannel *channel, const 
gchar *property_name, const GValue *value, XSettingsRegistry *registry); 
 static Bool
 timestamp_predicate (Display *display, XEvent  *xevent, XPointer arg);
 
+gboolean
+xsettings_registry_process_event (XSettingsRegistry *registry, XEvent *xevent)
+{
+    if ((xevent->xany.window == registry->priv->window) &&
+        (xevent->xany.type == SelectionClear) &&
+        (xevent->xselectionclear.selection == registry->priv->selection_atom))
+    {
+        return TRUE;
+    }
+
+    return FALSE;
+}
+
 static XSettingsRegistryEntry *
 xsettings_registry_entry_new_string(const gchar *name, const gchar *value);
 static XSettingsRegistryEntry *
@@ -106,6 +120,7 @@
     XSETTINGS_REGISTRY_PROPERTY_DISPLAY,
     XSETTINGS_REGISTRY_PROPERTY_SCREEN,
     XSETTINGS_REGISTRY_PROPERTY_XSETTINGS_ATOM,
+    XSETTINGS_REGISTRY_PROPERTY_SELECTION_ATOM,
     XSETTINGS_REGISTRY_PROPERTY_WINDOW
 };
 
@@ -131,6 +146,9 @@
        pspec = g_param_spec_long("xsettings_atom", NULL, NULL, G_MINLONG, 
G_MAXLONG, 0, G_PARAM_READABLE|G_PARAM_WRITABLE|G_PARAM_CONSTRUCT_ONLY);
        g_object_class_install_property(object_class, 
XSETTINGS_REGISTRY_PROPERTY_XSETTINGS_ATOM, pspec);
 
+       pspec = g_param_spec_long("selection_atom", NULL, NULL, G_MINLONG, 
G_MAXLONG, 0, G_PARAM_READABLE|G_PARAM_WRITABLE|G_PARAM_CONSTRUCT_ONLY);
+       g_object_class_install_property(object_class, 
XSETTINGS_REGISTRY_PROPERTY_SELECTION_ATOM, pspec);
+
        pspec = g_param_spec_long("window", NULL, NULL, G_MINLONG, G_MAXLONG, 
0, G_PARAM_READABLE|G_PARAM_WRITABLE|G_PARAM_CONSTRUCT_ONLY);
        g_object_class_install_property(object_class, 
XSETTINGS_REGISTRY_PROPERTY_WINDOW, pspec);
 
@@ -182,7 +200,7 @@
 }
 
 static void
-cb_xsettings_registry_channel_property_changed(XfconfChannel *channel, const 
gchar *name, XSettingsRegistry *registry)
+cb_xsettings_registry_channel_property_changed(XfconfChannel *channel, const 
gchar *name, const GValue *value, XSettingsRegistry *registry)
 {
     gint i;
 
@@ -191,18 +209,9 @@
         XSettingsRegistryEntry *entry = registry->priv->properties[i];
         if (!strcmp(entry->name, &name[1]))
         {
-            switch (G_VALUE_TYPE(entry->value))
-            {
-                case G_TYPE_INT:
-                    g_value_set_int(entry->value, 
xfconf_channel_get_int(channel, name, g_value_get_int(entry->value)));
-                    break;
-                case G_TYPE_STRING:
-                    g_value_set_string(entry->value, 
xfconf_channel_get_string(channel, name, g_value_get_string(entry->value)));
-                    break;
-                case G_TYPE_BOOLEAN:
-                    g_value_set_boolean(entry->value, 
xfconf_channel_get_bool(channel, name, g_value_get_boolean(entry->value)));
-                    break;
-            }
+            g_value_reset(entry->value);
+            g_value_copy(value, entry->value);
+            break;
         }
     }
     xsettings_registry_notify(registry);
@@ -404,6 +413,10 @@
     Atom xsettings_atom = XInternAtom(dpy, "_XSETTINGS_SETTINGS", True);
 
     Window window = 0;
+    gchar buffer[256];
+    unsigned char c = 'a';
+    TimeStampInfo info;
+    XEvent xevent;
 
     window = XCreateSimpleWindow (dpy,
                                         RootWindow (dpy, screen),
@@ -416,22 +429,20 @@
         return NULL;
     }
 
+    g_snprintf(buffer, sizeof(buffer), "_XSETTINGS_S%d", screen);
+    Atom selection_atom = XInternAtom(dpy, buffer, True);
+    Atom manager_atom = XInternAtom(dpy, "MANAGER", True);
+
+
     GObject *object = g_object_new(XSETTINGS_REGISTRY_TYPE,
                                    "channel", channel,
                                    "display", dpy,
                                    "screen", screen,
                                    "xsettings_atom", xsettings_atom,
+                                   "selection_atom", selection_atom,
                                    "window", window,
                                    NULL);
-    gchar buffer[256];
-    unsigned char c = 'a';
-    TimeStampInfo info;
-    XEvent xevent;
 
-    g_snprintf(buffer, sizeof(buffer), "_XSETTINGS_S%d", screen);
-    Atom selection_atom = XInternAtom(dpy, buffer, True);
-    Atom manager_atom = XInternAtom(dpy, "MANAGER", True);
-
     info.timestamp_prop_atom = XInternAtom(dpy, "_TIMESTAMP_PROP", False);
     info.window = window;
 
@@ -505,6 +516,9 @@
         case XSETTINGS_REGISTRY_PROPERTY_XSETTINGS_ATOM:
             XSETTINGS_REGISTRY(object)->priv->xsettings_atom = 
g_value_get_long(value);
             break;
+        case XSETTINGS_REGISTRY_PROPERTY_SELECTION_ATOM:
+            XSETTINGS_REGISTRY(object)->priv->selection_atom = 
g_value_get_long(value);
+            break;
         case XSETTINGS_REGISTRY_PROPERTY_WINDOW:
             XSETTINGS_REGISTRY(object)->priv->window = g_value_get_long(value);
             break;
@@ -529,6 +543,9 @@
         case XSETTINGS_REGISTRY_PROPERTY_XSETTINGS_ATOM:
             g_value_set_long(value, 
XSETTINGS_REGISTRY(object)->priv->xsettings_atom);
         break;
+        case XSETTINGS_REGISTRY_PROPERTY_SELECTION_ATOM:
+            g_value_set_long(value, 
XSETTINGS_REGISTRY(object)->priv->selection_atom);
+        break;
         case XSETTINGS_REGISTRY_PROPERTY_WINDOW:
             g_value_set_long(value, XSETTINGS_REGISTRY(object)->priv->window);
         break;

Modified: xfconf/trunk/xfsettingsd/registry.h
===================================================================
--- xfconf/trunk/xfsettingsd/registry.h 2008-04-21 08:33:15 UTC (rev 26876)
+++ xfconf/trunk/xfsettingsd/registry.h 2008-04-21 09:38:50 UTC (rev 26877)
@@ -82,5 +82,7 @@
 xsettings_registry_load(XSettingsRegistry *registry, gboolean debug);
 void
 xsettings_registry_notify(XSettingsRegistry *registry);
+gboolean
+xsettings_registry_process_event (XSettingsRegistry *registry, XEvent *xevent);
 
 #endif /* __XSETTINGS_REGISTRY_H__ */

_______________________________________________
Xfce4-commits mailing list
Xfce4-commits@xfce.org
http://foo-projects.org/mailman/listinfo/xfce4-commits

Reply via email to