X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-dimming-rules-group.c;h=5b98427843b86eb6e45aef178900a3efa0ebd091;hp=84e50a1ca55b071ea7bf765812a835d8d0d48880;hb=HEAD;hpb=52665b57b1c2770d5542fb0e70f96d6853225eb8 diff --git a/src/modest-dimming-rules-group.c b/src/modest-dimming-rules-group.c index 84e50a1..5b98427 100644 --- a/src/modest-dimming-rules-group.c +++ b/src/modest-dimming-rules-group.c @@ -30,21 +30,36 @@ #include "modest-dimming-rules-group.h" #include "modest-dimming-rules-group-priv.h" #include "modest-dimming-rule.h" -#include "modest-hildon-includes.h" +#include "modest-platform.h" +#include "modest-ui-dimming-rules.h" 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, + ModestWindow *window); typedef struct _ModestDimmingRulesGroupPrivate ModestDimmingRulesGroupPrivate; struct _ModestDimmingRulesGroupPrivate { + ModestWindow *window; gchar *name; + gboolean notifications_enabled; GHashTable *rules_map; + GSList *widget_rules; + gboolean window_weak_ref; }; + #define MODEST_DIMMING_RULES_GROUP_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ MODEST_TYPE_DIMMING_RULES_GROUP, \ ModestDimmingRulesGroupPrivate)) @@ -53,9 +68,7 @@ struct _ModestDimmingRulesGroupPrivate { static GObjectClass *parent_class = NULL; static void _execute_dimming_rule (gpointer key, gpointer value, gpointer user_data); -static void _insensitive_press_callback (GtkWidget *widget, gpointer user_data); - - +static void _execute_widget_dimming_rule (gpointer data, gpointer user_data); GType modest_dimming_rules_group_get_type (void) @@ -89,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)); } @@ -101,10 +115,14 @@ modest_dimming_rules_group_init (ModestDimmingRulesGroup *obj) priv = MODEST_DIMMING_RULES_GROUP_GET_PRIVATE(obj); priv->name = NULL; + priv->window = NULL; + priv->notifications_enabled = FALSE; priv->rules_map = g_hash_table_new_full ((GHashFunc) g_str_hash, (GEqualFunc) g_str_equal, (GDestroyNotify) g_free, (GDestroyNotify) g_object_unref); + priv->widget_rules = NULL; + priv->window_weak_ref = FALSE; } static void @@ -114,18 +132,38 @@ 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; + } + + 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; + } - G_OBJECT_CLASS(parent_class)->finalize (obj); + 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)->dispose (obj); } ModestDimmingRulesGroup* -modest_dimming_rules_group_new(const gchar *group_name) +modest_dimming_rules_group_new(const gchar *group_name, + gboolean notifications_enabled) { ModestDimmingRulesGroup *obj; ModestDimmingRulesGroupPrivate *priv; @@ -136,6 +174,7 @@ modest_dimming_rules_group_new(const gchar *group_name) priv = MODEST_DIMMING_RULES_GROUP_GET_PRIVATE(obj); priv->name = g_strdup(group_name); + priv->notifications_enabled = notifications_enabled; return obj; } @@ -153,11 +192,74 @@ modest_dimming_rules_group_get_name (ModestDimmingRulesGroup *self) return g_strdup (priv->name); } +static void +_add_rule (ModestDimmingRulesGroup *self, + ModestDimmingRule *rule, + ModestWindow *window) +{ + ModestDimmingRulesGroupPrivate *priv; + GtkWidget *widget = NULL; + const gchar *action_path = NULL; + + g_return_if_fail (MODEST_IS_DIMMING_RULES_GROUP(self)); + g_return_if_fail (MODEST_IS_WINDOW(window)); + g_return_if_fail (MODEST_IS_DIMMING_RULE (rule)); + + priv = MODEST_DIMMING_RULES_GROUP_GET_PRIVATE(self); + + /* Set window to process dimming rules */ + 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); + if (action_path) + g_hash_table_insert (priv->rules_map, g_strdup(action_path), rule); + else + priv->widget_rules = g_slist_prepend (priv->widget_rules, rule); +} + +void +modest_dimming_rules_group_add_widget_rule (ModestDimmingRulesGroup *self, + GtkWidget *widget, + GCallback callback, + ModestWindow *window) +{ + ModestDimmingRulesGroupPrivate *priv; + ModestDimmingRule *dim_rule = NULL; + + g_return_if_fail (MODEST_IS_DIMMING_RULES_GROUP(self)); + g_return_if_fail (GTK_IS_WIDGET (widget)); + g_return_if_fail (MODEST_IS_WINDOW(window)); + + 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, + widget); + + _add_rule (self, dim_rule, window); +} + void modest_dimming_rules_group_add_rules (ModestDimmingRulesGroup *self, const ModestDimmingEntry modest_dimming_entries[], guint n_elements, - gpointer user_data) + ModestWindow *window) { ModestDimmingRulesGroupPrivate *priv; ModestDimmingRule *dim_rule = NULL; @@ -169,10 +271,18 @@ modest_dimming_rules_group_add_rules (ModestDimmingRulesGroup *self, g_return_if_fail (MODEST_IS_DIMMING_RULES_GROUP(self)); g_return_if_fail (modest_dimming_entries != NULL); g_return_if_fail (n_elements > 0); - g_return_if_fail (MODEST_IS_WINDOW(user_data)); + g_return_if_fail (MODEST_IS_WINDOW(window)); 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++) { entry = modest_dimming_entries[i]; @@ -185,30 +295,51 @@ modest_dimming_rules_group_add_rules (ModestDimmingRulesGroup *self, if (!unique) continue; /* Check action path is valid */ - widget = modest_window_get_action_widget (MODEST_WINDOW (user_data), entry.action_path); + widget = modest_window_get_action_widget (MODEST_WINDOW (window), entry.action_path); if (widget == NULL) continue; /* Create a new dimming rule */ - dim_rule = modest_dimming_rule_new (MODEST_WINDOW(user_data), + dim_rule = modest_dimming_rule_new (priv->window, (ModestDimmingCallback) entry.callback, entry.action_path); - - /* Connect insensitive-presss handler to show notifications */ - g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (_insensitive_press_callback), dim_rule); - /* Register new dimming rule */ - g_hash_table_insert (priv->rules_map, g_strdup(entry.action_path), dim_rule); + _add_rule (self, dim_rule, window); } } +gboolean +modest_dimming_rules_group_notifications_enabled (ModestDimmingRulesGroup *self) +{ + ModestDimmingRulesGroupPrivate *priv; + + g_return_val_if_fail (MODEST_IS_DIMMING_RULES_GROUP(self), FALSE); + priv = MODEST_DIMMING_RULES_GROUP_GET_PRIVATE(self); + + return priv->notifications_enabled; +} + void modest_dimming_rules_group_execute (ModestDimmingRulesGroup *self) { ModestDimmingRulesGroupPrivate *priv; + DimmedState *state = NULL; + 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); + + /* execute group dimming rules */ g_hash_table_foreach (priv->rules_map, _execute_dimming_rule, NULL); + g_slist_foreach (priv->widget_rules, (GFunc) _execute_widget_dimming_rule, NULL); + + /* Free dimming ruls init data */ + modest_window_set_dimming_state (priv->window, NULL); } @@ -222,21 +353,56 @@ _execute_dimming_rule (gpointer key, gpointer value, gpointer user_data) } static void +_execute_widget_dimming_rule (gpointer data, gpointer user_data) +{ + g_return_if_fail (MODEST_IS_DIMMING_RULE (data)); + + /* Process dimming rule */ + modest_dimming_rule_process (MODEST_DIMMING_RULE(data)); +} + +#ifndef MODEST_TOOLKIT_GTK +static void _insensitive_press_callback (GtkWidget *widget, gpointer user_data) { - ModestDimmingRule *rule; + ModestDimmingRulesGroup *group = NULL; + ModestDimmingRule *rule = NULL; gchar *notification = NULL; g_return_if_fail (MODEST_IS_DIMMING_RULE (user_data)); rule = MODEST_DIMMING_RULE (user_data); + /* Check if this group has notification system enabled */ + group = modest_dimming_rule_get_group (rule); + if (!modest_dimming_rules_group_notifications_enabled (group)) + goto frees; + /* Get specific notification */ notification = modest_dimming_rule_get_notification (rule); - if (notification == NULL) return; + if (notification == NULL) + goto frees; + /* Notifications for dimmed items are not shown in Hildon2 */ +#ifndef MODEST_TOOLKIT_HILDON2 /* Show notification banner */ - hildon_banner_show_information (NULL, NULL, notification); + modest_platform_information_banner (NULL, NULL, notification); +#endif /* Free */ - g_free(notification); + frees: + if (group != NULL) + g_object_unref(group); + 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; }