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);
+#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,
gboolean notifications_enabled;
GHashTable *rules_map;
GSList *widget_rules;
+ gboolean window_weak_ref;
};
static void _execute_dimming_rule (gpointer key, gpointer value, gpointer user_data);
static void _execute_widget_dimming_rule (gpointer data, gpointer user_data);
-static void _insensitive_press_callback (GtkWidget *widget, gpointer user_data);
-
-
GType
modest_dimming_rules_group_get_type (void)
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));
}
(GDestroyNotify) g_free,
(GDestroyNotify) g_object_unref);
priv->widget_rules = NULL;
+ priv->window_weak_ref = FALSE;
}
static void
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;
+ }
+
+ G_OBJECT_CLASS(parent_class)->finalize (obj);
+}
- if (priv->rules_map != NULL)
+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);
}
priv->window = MODEST_WINDOW (window);
widget = modest_dimming_rule_get_widget (rule);
+#ifndef MODEST_TOOLKIT_GTK
/* Connect insensitive-presss handler to show notifications */
g_signal_connect (G_OBJECT (widget), "insensitive-press",
G_CALLBACK (_insensitive_press_callback),
rule);
-
+#endif
/* Register new dimming rule */
modest_dimming_rule_set_group (rule, self);
action_path = modest_dimming_rule_get_action_path (rule);
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,
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++) {
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);
modest_dimming_rule_process (MODEST_DIMMING_RULE(data));
}
+#ifndef MODEST_TOOLKIT_GTK
static void
_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)
if (notification != NULL)
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;
+}