From fa8b528ae670b04ec75f3c634dec032e7eee0cca Mon Sep 17 00:00:00 2001 From: Huang Peng Date: Wed, 4 Mar 2009 18:11:55 +0800 Subject: Implement ibus_prop_list_update_property. --- src/ibusproperty.c | 48 +++++++++++++++++++++++++++++++++++++++++++++--- src/ibusproperty.h | 2 ++ 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/src/ibusproperty.c b/src/ibusproperty.c index 0976363..5162ef0 100644 --- a/src/ibusproperty.c +++ b/src/ibusproperty.c @@ -320,8 +320,8 @@ void ibus_property_set_sub_props (IBusProperty *prop, IBusPropList *prop_list) { - g_return_if_fail (IBUS_IS_PROPERTY (prop)); - g_return_if_fail (IBUS_IS_PROP_LIST (prop_list) || prop_list == NULL); + g_assert (IBUS_IS_PROPERTY (prop)); + g_assert (IBUS_IS_PROP_LIST (prop_list) || prop_list == NULL); if (prop->sub_props) { g_object_unref (prop->sub_props); @@ -335,6 +335,36 @@ ibus_property_set_sub_props (IBusProperty *prop, prop->sub_props = ibus_prop_list_new (); } +gboolean +ibus_property_update (IBusProperty *prop, + IBusProperty *prop_update) +{ + g_assert (IBUS_IS_PROPERTY (prop)); + g_assert (IBUS_IS_PROPERTY (prop_update)); + + if (g_strcmp0 (prop->key, prop_update->key) != 0) { + return ibus_prop_list_update_property (prop->sub_props, prop_update); + } + + g_free (prop->icon); + prop->icon = g_strdup (prop_update->icon); + + if (prop->label) { + g_object_unref (prop->label); + } + prop->label = (IBusText *) g_object_ref (prop_update->label); + + if (prop->tooltip) { + g_object_unref (prop->tooltip); + } + prop->tooltip = (IBusText *) g_object_ref (prop_update->tooltip); + prop->visible = prop_update->visible; + prop->state = prop_update->state; + prop->sensitive = prop_update->sensitive; + + return TRUE; +} + GType ibus_prop_list_get_type (void) { @@ -525,7 +555,19 @@ ibus_prop_list_get (IBusPropList *prop_list, gboolean ibus_prop_list_update_property (IBusPropList *prop_list, - IBusProperty *prop) + IBusProperty *prop_update) { + g_assert (IBUS_IS_PROP_LIST (prop_list)); + g_assert (IBUS_IS_PROPERTY (prop_update)); + + gint i; + + for (i = 0; i < prop_list->properties->len; i ++) { + IBusProperty *prop = g_array_index (prop_list->properties, IBusPropList *, i); + if (ibus_property_update (prop, prop_update)) { + return TRUE; + } + } + return FALSE; } diff --git a/src/ibusproperty.h b/src/ibusproperty.h index 7cd90c9..19ff33c 100644 --- a/src/ibusproperty.h +++ b/src/ibusproperty.h @@ -126,6 +126,8 @@ void ibus_property_set_visible (IBusProperty *prop, gboolean visible); void ibus_property_set_sub_props(IBusProperty *prop, IBusPropList *prop_list); +gboolean ibus_property_update (IBusProperty *prop, + IBusProperty *prop_update); GType ibus_prop_list_get_type (); IBusPropList *ibus_prop_list_new (); -- cgit