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 bd3bdc51b9
commit 29bb4c27e3

View File

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