X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fmodest-dimming-rules-group.c;h=5b98427843b86eb6e45aef178900a3efa0ebd091;hb=3e27aefbedc6e025124197c745f69106013c9d97;hp=9f7483756ba3d362fc6bc20b755fdd507d589494;hpb=19268972c11b8c0db2becf9ea7c91f2a7e6e1f90;p=modest diff --git a/src/modest-dimming-rules-group.c b/src/modest-dimming-rules-group.c index 9f74837..5b98427 100644 --- a/src/modest-dimming-rules-group.c +++ b/src/modest-dimming-rules-group.c @@ -36,11 +36,15 @@ static void modest_dimming_rules_group_class_init (ModestDimmingRulesGroupClass *klass); static void modest_dimming_rules_group_init (ModestDimmingRulesGroup *obj); static void modest_dimming_rules_group_finalize (GObject *obj); +static void modest_dimming_rules_group_dispose (GObject *obj); -#ifdef MODEST_PLATFORM_MAEMO +#ifndef MODEST_TOOLKIT_GTK static void _insensitive_press_callback (GtkWidget *widget, gpointer user_data); #endif +static void on_window_destroy (gpointer data, + GObject *object); + static void _add_rule (ModestDimmingRulesGroup *self, ModestDimmingRule *rule, ModestWindow *window); @@ -52,6 +56,7 @@ struct _ModestDimmingRulesGroupPrivate { gboolean notifications_enabled; GHashTable *rules_map; GSList *widget_rules; + gboolean window_weak_ref; }; @@ -97,6 +102,7 @@ modest_dimming_rules_group_class_init (ModestDimmingRulesGroupClass *klass) parent_class = g_type_class_peek_parent (klass); gobject_class->finalize = modest_dimming_rules_group_finalize; + gobject_class->dispose = modest_dimming_rules_group_dispose; g_type_class_add_private (gobject_class, sizeof(ModestDimmingRulesGroupPrivate)); } @@ -116,6 +122,7 @@ modest_dimming_rules_group_init (ModestDimmingRulesGroup *obj) (GDestroyNotify) g_free, (GDestroyNotify) g_object_unref); priv->widget_rules = NULL; + priv->window_weak_ref = FALSE; } static void @@ -125,16 +132,32 @@ modest_dimming_rules_group_finalize (GObject *obj) priv = MODEST_DIMMING_RULES_GROUP_GET_PRIVATE(obj); - if (priv->name != NULL) - g_free(priv->name); + if (priv->window && priv->window_weak_ref) { + g_object_weak_unref (G_OBJECT (priv->window), on_window_destroy, obj); + priv->window_weak_ref = FALSE; + } - if (priv->rules_map != NULL) + G_OBJECT_CLASS(parent_class)->finalize (obj); +} + +static void +modest_dimming_rules_group_dispose (GObject *obj) +{ + ModestDimmingRulesGroupPrivate *priv; + + priv = MODEST_DIMMING_RULES_GROUP_GET_PRIVATE(obj); + + if (priv->rules_map != NULL) { g_hash_table_destroy (priv->rules_map); + priv->rules_map = NULL; + } - if (priv->widget_rules != NULL) + if (priv->widget_rules != NULL) { g_slist_foreach (priv->widget_rules, (GFunc) g_object_unref, NULL); + priv->widget_rules = NULL; + } - G_OBJECT_CLASS(parent_class)->finalize (obj); + G_OBJECT_CLASS(parent_class)->dispose (obj); } @@ -188,7 +211,7 @@ _add_rule (ModestDimmingRulesGroup *self, priv->window = MODEST_WINDOW (window); widget = modest_dimming_rule_get_widget (rule); -#ifdef MODEST_PLATFORM_MAEMO +#ifndef MODEST_TOOLKIT_GTK /* Connect insensitive-presss handler to show notifications */ g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (_insensitive_press_callback), @@ -219,7 +242,11 @@ modest_dimming_rules_group_add_widget_rule (ModestDimmingRulesGroup *self, priv = MODEST_DIMMING_RULES_GROUP_GET_PRIVATE(self); /* Set window to process dimming rules */ + if (priv->window_weak_ref) + g_object_weak_unref ((GObject *) priv->window, on_window_destroy, self); priv->window = MODEST_WINDOW (window); + g_object_weak_ref (G_OBJECT (window), on_window_destroy, self); + priv->window_weak_ref = TRUE; dim_rule = modest_dimming_rule_new_from_widget (priv->window, (ModestDimmingCallback) callback, @@ -249,7 +276,11 @@ modest_dimming_rules_group_add_rules (ModestDimmingRulesGroup *self, priv = MODEST_DIMMING_RULES_GROUP_GET_PRIVATE(self); /* Set window to process dimming rules */ + if (priv->window_weak_ref) + g_object_weak_unref ((GObject *) priv->window, on_window_destroy, self); priv->window = MODEST_WINDOW (window); + g_object_weak_ref (G_OBJECT (window), on_window_destroy, self); + priv->window_weak_ref = TRUE; /* Add dimming rules */ for (i=0; i < n_elements; i++) { @@ -296,6 +327,9 @@ modest_dimming_rules_group_execute (ModestDimmingRulesGroup *self) g_return_if_fail (MODEST_IS_DIMMING_RULES_GROUP(self)); priv = MODEST_DIMMING_RULES_GROUP_GET_PRIVATE(self); + if (!priv->window) + return; + /* Init dimming rules init data */ state = modest_ui_dimming_rules_define_dimming_state (priv->window); modest_window_set_dimming_state (priv->window, state); @@ -327,7 +361,7 @@ _execute_widget_dimming_rule (gpointer data, gpointer user_data) modest_dimming_rule_process (MODEST_DIMMING_RULE(data)); } -#ifdef MODEST_PLATFORM_MAEMO +#ifndef MODEST_TOOLKIT_GTK static void _insensitive_press_callback (GtkWidget *widget, gpointer user_data) { @@ -347,10 +381,13 @@ _insensitive_press_callback (GtkWidget *widget, gpointer user_data) notification = modest_dimming_rule_get_notification (rule); if (notification == NULL) goto frees; - + + /* Notifications for dimmed items are not shown in Hildon2 */ +#ifndef MODEST_TOOLKIT_HILDON2 /* Show notification banner */ - modest_platform_information_banner (NULL, NULL, notification); - + modest_platform_information_banner (NULL, NULL, notification); +#endif + /* Free */ frees: if (group != NULL) @@ -359,3 +396,13 @@ _insensitive_press_callback (GtkWidget *widget, gpointer user_data) g_free(notification); } #endif + +static void +on_window_destroy (gpointer data, + GObject *object) +{ + ModestDimmingRulesGroup *self = MODEST_DIMMING_RULES_GROUP (data); + ModestDimmingRulesGroupPrivate *priv = MODEST_DIMMING_RULES_GROUP_GET_PRIVATE (self); + + priv->window = NULL; +}