[Xfce4-commits] r26877 - xfconf/trunk/xfsettingsd
Stephan Arts
stephan at xfce.org
Mon Apr 21 11:38:50 CEST 2008
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__ */
More information about the Xfce4-commits
mailing list