Fix property notifications for certain properties

If a property has a reload function, but the standard property-fetching
mechanism isn't used (hooks->type == META_PROP_VALUE_INVALID), then the
a logic error (introduced in January) caused the hook to never be run.

This meant that changes to struts and icons weren't noticed.

Same as: http://bugzilla.gnome.org/show_bug.cgi?id=572573
The fix here is different in detail from that applied to Metacity, but
similar in spirit.

http://bugzilla.gnome.org/show_bug.cgi?id=585980
This commit is contained in:
Owen W. Taylor 2009-06-15 13:24:43 -04:00
parent 820970328b
commit d810315884

View File

@ -63,12 +63,13 @@ typedef struct MetaWindowPropHooks
ReloadValueFunc reload_func; ReloadValueFunc reload_func;
} MetaWindowPropHooks; } MetaWindowPropHooks;
static void init_prop_value (MetaDisplay *display, static void init_prop_value (MetaDisplay *display,
Atom property, MetaWindowPropHooks *hooks,
MetaPropValue *value); MetaPropValue *value);
static void reload_prop_value (MetaWindow *window, static void reload_prop_value (MetaWindow *window,
MetaPropValue *value, MetaWindowPropHooks *hooks,
gboolean initial); MetaPropValue *value,
gboolean initial);
static MetaWindowPropHooks* find_hooks (MetaDisplay *display, static MetaWindowPropHooks* find_hooks (MetaDisplay *display,
Atom property); Atom property);
@ -122,7 +123,8 @@ meta_window_reload_properties_from_xwindow (MetaWindow *window,
i = 0; i = 0;
while (i < n_properties) while (i < n_properties)
{ {
init_prop_value (window->display, properties[i], &values[i]); MetaWindowPropHooks *hooks = find_hooks (window->display, properties[i]);
init_prop_value (window->display, hooks, &values[i]);
++i; ++i;
} }
@ -132,7 +134,8 @@ meta_window_reload_properties_from_xwindow (MetaWindow *window,
i = 0; i = 0;
while (i < n_properties) while (i < n_properties)
{ {
reload_prop_value (window, &values[i], initial); MetaWindowPropHooks *hooks = find_hooks (window->display, properties[i]);
reload_prop_value (window, hooks, &values[i], initial);
++i; ++i;
} }
@ -144,31 +147,28 @@ meta_window_reload_properties_from_xwindow (MetaWindow *window,
/* Fill in the MetaPropValue used to get the value of "property" */ /* Fill in the MetaPropValue used to get the value of "property" */
static void static void
init_prop_value (MetaDisplay *display, init_prop_value (MetaDisplay *display,
Atom property, MetaWindowPropHooks *hooks,
MetaPropValue *value) MetaPropValue *value)
{ {
MetaWindowPropHooks *hooks = find_hooks (display, property);
if (!hooks || hooks->type == META_PROP_VALUE_INVALID) if (!hooks || hooks->type == META_PROP_VALUE_INVALID)
{ {
value->type = META_PROP_VALUE_INVALID; value->type = META_PROP_VALUE_INVALID;
value->atom = None; value->atom = None;
} }
else else
{ {
value->type = hooks->type; value->type = hooks->type;
value->atom = property; value->atom = hooks->property;
} }
} }
static void static void
reload_prop_value (MetaWindow *window, reload_prop_value (MetaWindow *window,
MetaPropValue *value, MetaWindowPropHooks *hooks,
gboolean initial) MetaPropValue *value,
gboolean initial)
{ {
MetaWindowPropHooks *hooks = find_hooks (window->display, value->atom);
if (hooks && hooks->reload_func != NULL) if (hooks && hooks->reload_func != NULL)
(* hooks->reload_func) (window, value, initial); (* hooks->reload_func) (window, value, initial);
} }