diff options
-rw-r--r-- | xsettings/ChangeLog | 15 | ||||
-rw-r--r-- | xsettings/xsettings-client.c | 85 | ||||
-rw-r--r-- | xsettings/xsettings-client.h | 28 |
3 files changed, 94 insertions, 34 deletions
diff --git a/xsettings/ChangeLog b/xsettings/ChangeLog index aa08127..fe8d039 100644 --- a/xsettings/ChangeLog +++ b/xsettings/ChangeLog @@ -1,3 +1,18 @@ +Thu Feb 26 19:55:29 2004 Owen Taylor <otaylor@redhat.com> + + * xsettings-client.[ch]: Add + xsettings_client_set_grab_func(), + xsettings_client_set_ungrab_func() to allow users to + control exactly how server grabs are done. (In case + the user has a refcounted grab facility, for instance.) + (Patch by Soeren Sandmann) + + * xsettings-client.c: Use XInternAtoms() to reduce + roundtrips. + + * xsettings-client.c: Fix a memory leak for + XGetWindowProperty() on type mismatch. + Mon Dec 2 20:24:02 2002 Owen Taylor <otaylor@redhat.com> * xsettings.xml: Fix ordering of color components. diff --git a/xsettings/xsettings-client.c b/xsettings/xsettings-client.c index 7be2dd1..8b81b45 100644 --- a/xsettings/xsettings-client.c +++ b/xsettings/xsettings-client.c @@ -38,6 +38,9 @@ struct _XSettingsClient XSettingsWatchFunc watch; void *cb_data; + XSettingsGrabFunc grab; + XSettingsGrabFunc ungrab; + Window manager_window; Atom manager_atom; Atom selection_atom; @@ -370,24 +373,31 @@ read_settings (XSettingsClient *client) XSettingsList *old_list = client->settings; client->settings = NULL; - - old_handler = XSetErrorHandler (ignore_errors); - result = XGetWindowProperty (client->display, client->manager_window, - client->xsettings_atom, 0, LONG_MAX, - False, client->xsettings_atom, - &type, &format, &n_items, &bytes_after, &data); - XSetErrorHandler (old_handler); - - if (result == Success && type == client->xsettings_atom) + + if (client->manager_window) { - if (format != 8) + old_handler = XSetErrorHandler (ignore_errors); + result = XGetWindowProperty (client->display, client->manager_window, + client->xsettings_atom, 0, LONG_MAX, + False, client->xsettings_atom, + &type, &format, &n_items, &bytes_after, &data); + XSetErrorHandler (old_handler); + + if (result == Success && type != None) { - fprintf (stderr, "Invalid format for XSETTINGS property %d", format); + if (type != client->xsettings_atom) + { + fprintf (stderr, "Invalid type for XSETTINGS property"); + } + eles if (format != 8) + { + fprintf (stderr, "Invalid format for XSETTINGS property %d", format); + } + else + client->settings = parse_settings (data, n_items); + + XFree (data); } - else - client->settings = parse_settings (data, n_items); - - XFree (data); } notify_changes (client, old_list); @@ -410,8 +420,11 @@ check_manager_window (XSettingsClient *client) { if (client->manager_window && client->watch) client->watch (client->manager_window, False, 0, client->cb_data); - - XGrabServer (client->display); + + if (client->grab) + client->grab (client->display); + else + XGrabServer (client->display); client->manager_window = XGetSelectionOwner (client->display, client->selection_atom); @@ -419,7 +432,11 @@ check_manager_window (XSettingsClient *client) XSelectInput (client->display, client->manager_window, PropertyChangeMask | StructureNotifyMask); - XUngrabServer (client->display); + if (client->ungrab) + client->ungrab (client->display); + else + XUngrabServer (client->display); + XFlush (client->display); if (client->manager_window && client->watch) @@ -439,7 +456,9 @@ xsettings_client_new (Display *display, { XSettingsClient *client; char buffer[256]; - + char *atom_names[3]; + Atom atoms[3]; + client = malloc (sizeof *client); if (!client) return NULL; @@ -449,14 +468,22 @@ xsettings_client_new (Display *display, client->notify = notify; client->watch = watch; client->cb_data = cb_data; + client->grab = NULL; + client->ungrab = NULL; client->manager_window = None; client->settings = NULL; sprintf(buffer, "_XSETTINGS_S%d", screen); - client->selection_atom = XInternAtom (display, buffer, False); - client->xsettings_atom = XInternAtom (display, "_XSETTINGS_SETTINGS", False); - client->manager_atom = XInternAtom (display, "MANAGER", False); + atom_names[0] = buffer; + atom_names[1] = "_XSETTINGS_SETTINGS"; + atom_names[2] = "MANAGER"; + + XInternAtoms (display, atom_names, 3, False, atoms); + + client->selection_atom = atoms[0]; + client->xsettings_atom = atoms[1]; + client->manager_atom = atoms[2]; /* Select on StructureNotify so we get MANAGER events */ @@ -472,6 +499,20 @@ xsettings_client_new (Display *display, } void +xsettings_client_set_grab_func (XSettingsClient *client, + XSettingsGrabFunc grab) +{ + client->grab = grab; +} + +void +xsettings_client_set_ungrab_func (XSettingsClient *client, + XSettingsGrabFunc ungrab) +{ + client->ungrab = ungrab; +} + +void xsettings_client_destroy (XSettingsClient *client) { if (client->watch) diff --git a/xsettings/xsettings-client.h b/xsettings/xsettings-client.h index 1b13fe3..b916eba 100644 --- a/xsettings/xsettings-client.h +++ b/xsettings/xsettings-client.h @@ -47,19 +47,23 @@ typedef void (*XSettingsWatchFunc) (Window window, Bool is_start, long mask, void *cb_data); +typedef void (*XSettingsGrabFunc) (Display *display); -XSettingsClient *xsettings_client_new (Display *display, - int screen, - XSettingsNotifyFunc notify, - XSettingsWatchFunc watch, - void *cb_data); -void xsettings_client_destroy (XSettingsClient *client); -Bool xsettings_client_process_event (XSettingsClient *client, - XEvent *xev); - -XSettingsResult xsettings_client_get_setting (XSettingsClient *client, - const char *name, - XSettingsSetting **setting); +XSettingsClient *xsettings_client_new (Display *display, + int screen, + XSettingsNotifyFunc notify, + XSettingsWatchFunc watch, + void *cb_data); +void xsettings_client_set_grab_func (XSettingsClient *client, + XSettingsGrabFunc grab); +void xsettings_client_set_ungrab_func (XSettingsClient *client, + XSettingsGrabFunc ungrab); +void xsettings_client_destroy (XSettingsClient *client); +Bool xsettings_client_process_event (XSettingsClient *client, + XEvent *xev); +XSettingsResult xsettings_client_get_setting (XSettingsClient *client, + const char *name, + XSettingsSetting **setting); #ifdef __cplusplus } |