1 /* Copyright (c) 2006, Nokia Corporation
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * * Neither the name of the Nokia Corporation nor the names of its
14 * contributors may be used to endorse or promote products derived from
15 * this software without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
18 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
20 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
21 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 #include "modest-debug.h"
31 #include "modest-ui-dimming-manager.h"
32 #include "modest-dimming-rules-group-priv.h"
34 static void modest_ui_dimming_manager_class_init (ModestUIDimmingManagerClass *klass);
35 static void modest_ui_dimming_manager_init (ModestUIDimmingManager *obj);
36 static void modest_ui_dimming_manager_finalize (GObject *obj);
37 static void modest_ui_dimming_manager_dispose (GObject *obj);
39 static void _process_all_rules (gpointer key, gpointer value, gpointer user_data);
41 #define WIDGET_DIMMING_MODE "widget-dimming-mode"
44 typedef struct _ModestUIDimmingManagerPrivate ModestUIDimmingManagerPrivate;
45 struct _ModestUIDimmingManagerPrivate {
46 GHashTable *groups_map;
47 GHashTable *delayed_calls;
50 #define MODEST_UI_DIMMING_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
51 MODEST_TYPE_UI_DIMMING_MANAGER, \
52 ModestUIDimmingManagerPrivate))
55 static GObjectClass *parent_class = NULL;
58 modest_ui_dimming_manager_get_type (void)
60 static GType my_type = 0;
62 static const GTypeInfo my_info = {
63 sizeof(ModestUIDimmingManagerClass),
65 NULL, /* base finalize */
66 (GClassInitFunc) modest_ui_dimming_manager_class_init,
67 NULL, /* class finalize */
68 NULL, /* class data */
69 sizeof(ModestUIDimmingManager),
71 (GInstanceInitFunc) modest_ui_dimming_manager_init,
74 my_type = g_type_register_static (G_TYPE_OBJECT,
75 "ModestUIDimmingManager",
82 modest_ui_dimming_manager_class_init (ModestUIDimmingManagerClass *klass)
84 GObjectClass *gobject_class;
85 gobject_class = (GObjectClass*) klass;
87 parent_class = g_type_class_peek_parent (klass);
88 gobject_class->finalize = modest_ui_dimming_manager_finalize;
89 gobject_class->dispose = modest_ui_dimming_manager_dispose;
91 g_type_class_add_private (gobject_class, sizeof(ModestUIDimmingManagerPrivate));
95 modest_ui_dimming_manager_init (ModestUIDimmingManager *obj)
97 ModestUIDimmingManagerPrivate *priv;
99 priv = MODEST_UI_DIMMING_MANAGER_GET_PRIVATE(obj);
101 priv->groups_map = g_hash_table_new_full ((GHashFunc) g_str_hash,
102 (GEqualFunc) g_str_equal,
103 (GDestroyNotify) g_free,
104 (GDestroyNotify) g_object_unref);
105 priv->delayed_calls = g_hash_table_new_full (g_str_hash,
112 remove_all_timeouts (gpointer key,
116 if (GPOINTER_TO_INT (value) > 0)
117 g_source_remove (GPOINTER_TO_INT (value));
121 modest_ui_dimming_manager_finalize (GObject *obj)
123 ModestUIDimmingManagerPrivate *priv;
125 priv = MODEST_UI_DIMMING_MANAGER_GET_PRIVATE(obj);
127 if (priv->groups_map != NULL)
128 g_hash_table_unref (priv->groups_map);
130 if (priv->delayed_calls != NULL) {
131 /* Remove all pending calls */
132 g_hash_table_foreach (priv->delayed_calls,
136 g_hash_table_unref (priv->delayed_calls);
139 G_OBJECT_CLASS(parent_class)->finalize (obj);
143 modest_ui_dimming_manager_dispose (GObject *obj)
145 ModestUIDimmingManagerPrivate *priv;
147 priv = MODEST_UI_DIMMING_MANAGER_GET_PRIVATE(obj);
149 if (priv->delayed_calls != NULL && (g_hash_table_size (priv->delayed_calls) > 0)) {
150 /* Remove all pending calls */
151 g_hash_table_foreach (priv->delayed_calls,
154 g_hash_table_remove_all (priv->delayed_calls);
157 if (priv->groups_map) {
158 g_hash_table_foreach (priv->groups_map, g_object_run_dispose, NULL);
159 g_hash_table_unref (priv->groups_map);
160 priv->groups_map = NULL;
163 G_OBJECT_CLASS(parent_class)->dispose (obj);
167 ModestUIDimmingManager*
168 modest_ui_dimming_manager_new()
170 ModestUIDimmingManager *obj;
172 obj = MODEST_UI_DIMMING_MANAGER(g_object_new(MODEST_TYPE_UI_DIMMING_MANAGER, NULL));
179 modest_ui_dimming_manager_insert_rules_group (ModestUIDimmingManager *self,
180 ModestDimmingRulesGroup *group)
182 ModestUIDimmingManagerPrivate *priv;
183 gchar *group_name = NULL;
184 gboolean unique = FALSE;
186 priv = MODEST_UI_DIMMING_MANAGER_GET_PRIVATE(self);
189 group_name = modest_dimming_rules_group_get_name (group);
191 /* Check group name is unique */
192 unique = g_hash_table_lookup (priv->groups_map, group_name) == NULL;
195 g_return_if_fail (unique);
199 /* Insert new dimming rules group */
200 g_hash_table_insert (priv->groups_map, group_name, g_object_ref(group));
204 modest_ui_dimming_manager_process_dimming_rules (ModestUIDimmingManager *self)
206 ModestUIDimmingManagerPrivate *priv;
208 priv = MODEST_UI_DIMMING_MANAGER_GET_PRIVATE(self);
210 /* Peforms a full dimming tules checking */
211 g_hash_table_foreach (priv->groups_map, _process_all_rules, NULL);
216 ModestDimmingRulesGroup *group;
217 ModestUIDimmingManager *manager;
220 } DelayedDimmingRules;
223 process_dimming_rules_delayed (gpointer data)
225 DelayedDimmingRules *helper = (DelayedDimmingRules *) data;
226 gpointer timeout_handler;
227 ModestUIDimmingManagerPrivate *priv;
229 /* Let the destroyer remove it from the hash table */
230 helper->delete = TRUE;
232 /* We remove the timeout here because the execute action could
233 take too much time, and so this will be called again */
234 priv = MODEST_UI_DIMMING_MANAGER_GET_PRIVATE(helper->manager);
235 timeout_handler = g_hash_table_lookup (priv->delayed_calls, helper->name);
237 if (GPOINTER_TO_INT (timeout_handler) > 0) {
238 g_source_remove (GPOINTER_TO_INT (timeout_handler));
241 gdk_threads_enter ();
242 modest_dimming_rules_group_execute (helper->group);
243 gdk_threads_leave ();
249 process_dimming_rules_delayed_destroyer (gpointer data)
251 DelayedDimmingRules *helper = (DelayedDimmingRules *) data;
252 ModestUIDimmingManagerPrivate *priv;
254 priv = MODEST_UI_DIMMING_MANAGER_GET_PRIVATE(helper->manager);
256 /* We can only destroy it if we had really executed it. If the
257 source is removed because the manager is finalized then we
258 cannot remove it because it removes the sources in a
259 foreach, that does not allow you to modify the hash table
262 g_hash_table_remove (priv->delayed_calls, helper->name);
264 g_free (helper->name);
265 g_object_unref (helper->manager);
266 g_slice_free (DelayedDimmingRules, helper);
270 modest_ui_dimming_manager_process_dimming_rules_group (ModestUIDimmingManager *self,
271 const gchar *group_name)
273 ModestDimmingRulesGroup *group = NULL;
274 ModestUIDimmingManagerPrivate *priv;
275 guint *handler, new_handler;
276 DelayedDimmingRules *helper;
278 g_return_if_fail (group_name != NULL);
280 priv = MODEST_UI_DIMMING_MANAGER_GET_PRIVATE(self);
282 /* Search group by name */
283 group = MODEST_DIMMING_RULES_GROUP(g_hash_table_lookup (priv->groups_map, group_name));
284 g_return_if_fail (group != NULL);
286 /* If there was another pending dimming operation check then ignore this */
287 handler = g_hash_table_lookup (priv->delayed_calls, group_name);
289 /* Create the helper and start the timeout */
290 helper = g_slice_new (DelayedDimmingRules);
291 helper->group = group;
292 helper->manager = g_object_ref (self);
293 helper->name = g_strdup (group_name);
294 helper->delete = FALSE;
295 new_handler = g_timeout_add_full (G_PRIORITY_DEFAULT, 100,
296 process_dimming_rules_delayed,
297 helper, process_dimming_rules_delayed_destroyer);
298 g_hash_table_insert (priv->delayed_calls,
299 g_strdup (group_name),
300 GINT_TO_POINTER (new_handler));
301 MODEST_DEBUG_BLOCK(g_print ("---------------------Adding %d\n", new_handler););
303 MODEST_DEBUG_BLOCK(g_print ("---------------------Ignoring\n"););
309 _process_all_rules (gpointer key, gpointer value, gpointer user_data)
311 g_return_if_fail (MODEST_IS_DIMMING_RULES_GROUP (value));
313 modest_dimming_rules_group_execute (MODEST_DIMMING_RULES_GROUP (value));
317 modest_ui_dimming_manager_set_widget_dimming_mode (GtkWidget *widget,
318 ModestUIDimmingMode mode)
320 g_return_if_fail (GTK_IS_WIDGET (widget));
322 g_object_set_data (G_OBJECT (widget), WIDGET_DIMMING_MODE, GINT_TO_POINTER (mode));
326 modest_ui_dimming_manager_get_widget_dimming_mode (GtkWidget *widget)
328 g_return_val_if_fail (GTK_IS_WIDGET (widget), MODEST_UI_DIMMING_MODE_DIM);
330 return (ModestUIDimmingMode) GPOINTER_TO_INT (g_object_get_data (G_OBJECT (widget), WIDGET_DIMMING_MODE));