Merge lp:~mterry/indicator-datetime/live-location-updates into lp:indicator-datetime/0.3

Proposed by Michael Terry
Status: Merged
Merged at revision: 86
Proposed branch: lp:~mterry/indicator-datetime/live-location-updates
Merge into: lp:indicator-datetime/0.3
Prerequisite: lp:~mterry/indicator-datetime/bevel+utc
Diff against target: 159 lines (+58/-18)
1 file modified
src/datetime-prefs-locations.c (+58/-18)
To merge this branch: bzr merge lp:~mterry/indicator-datetime/live-location-updates
Reviewer Review Type Date Requested Status
Indicator Applet Developers Pending
Review via email: mp+54756@code.launchpad.net
To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/datetime-prefs-locations.c'
--- src/datetime-prefs-locations.c 2011-03-24 18:19:24 +0000
+++ src/datetime-prefs-locations.c 2011-03-24 18:19:24 +0000
@@ -39,7 +39,8 @@
39#define COL_TIME 139#define COL_TIME 1
40#define COL_ZONE 240#define COL_ZONE 2
4141
42static gboolean update_times (TimezoneCompletion * completion);42static gboolean update_times (GtkWidget * dlg);
43static void save_when_idle (GtkWidget * dlg);
4344
44static void45static void
45handle_add (GtkWidget * button, GtkTreeView * tree)46handle_add (GtkWidget * button, GtkTreeView * tree)
@@ -96,7 +97,7 @@
9697
97static gboolean98static gboolean
98timezone_selected (GtkEntryCompletion * widget, GtkTreeModel * model,99timezone_selected (GtkEntryCompletion * widget, GtkTreeModel * model,
99 GtkTreeIter * iter, gpointer user_data)100 GtkTreeIter * iter, GtkWidget * dlg)
100{101{
101 const gchar * zone, * name;102 const gchar * zone, * name;
102103
@@ -132,7 +133,7 @@
132 gtk_list_store_set (store, store_iter, COL_NAME, name, COL_ZONE, zone, -1);133 gtk_list_store_set (store, store_iter, COL_NAME, name, COL_ZONE, zone, -1);
133 }134 }
134135
135 update_times (TIMEZONE_COMPLETION (widget));136 update_times (dlg);
136137
137 return FALSE; // Do normal action too138 return FALSE; // Do normal action too
138}139}
@@ -155,9 +156,10 @@
155}156}
156157
157static gboolean158static gboolean
158update_times (TimezoneCompletion * completion)159update_times (GtkWidget * dlg)
159{160{
160 /* For each entry, check zone in column 2 and set column 1 to it's time */161 /* For each entry, check zone in column 2 and set column 1 to it's time */
162 TimezoneCompletion * completion = TIMEZONE_COMPLETION (g_object_get_data (G_OBJECT (dlg), "completion"));
161 GtkListStore * store = GTK_LIST_STORE (g_object_get_data (G_OBJECT (completion), "store"));163 GtkListStore * store = GTK_LIST_STORE (g_object_get_data (G_OBJECT (completion), "store"));
162 GObject * cell = G_OBJECT (g_object_get_data (G_OBJECT (completion), "name-cell"));164 GObject * cell = G_OBJECT (g_object_get_data (G_OBJECT (completion), "name-cell"));
163165
@@ -167,6 +169,8 @@
167 return TRUE;169 return TRUE;
168 }170 }
169171
172 g_signal_handlers_block_by_func (store, save_when_idle, dlg);
173
170 GDateTime * now = g_date_time_new_now_local ();174 GDateTime * now = g_date_time_new_now_local ();
171175
172 GtkTreeIter iter;176 GtkTreeIter iter;
@@ -193,6 +197,9 @@
193 }197 }
194198
195 g_date_time_unref (now);199 g_date_time_unref (now);
200
201 g_signal_handlers_unblock_by_func (store, save_when_idle, dlg);
202
196 return TRUE;203 return TRUE;
197}204}
198205
@@ -220,13 +227,8 @@
220}227}
221228
222static void229static void
223dialog_closed (GtkWidget * dlg, GObject * store)230save_to_settings (GObject * store, GSettings * conf)
224{231{
225 /* Cleanup a tad */
226 guint time_id = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (dlg), "time-id"));
227 g_source_remove (time_id);
228
229 /* Now save to settings */
230 GVariantBuilder builder;232 GVariantBuilder builder;
231 g_variant_builder_init (&builder, G_VARIANT_TYPE_ARRAY);233 g_variant_builder_init (&builder, G_VARIANT_TYPE_ARRAY);
232234
@@ -249,13 +251,47 @@
249 }251 }
250252
251 GVariant * locations = g_variant_builder_end (&builder);253 GVariant * locations = g_variant_builder_end (&builder);
252
253 GSettings * conf = G_SETTINGS (g_object_get_data (G_OBJECT (dlg), "conf"));
254 g_settings_set_strv (conf, SETTINGS_LOCATIONS_S, g_variant_get_strv (locations, NULL));254 g_settings_set_strv (conf, SETTINGS_LOCATIONS_S, g_variant_get_strv (locations, NULL));
255
256 g_variant_unref (locations);255 g_variant_unref (locations);
257}256}
258257
258static gboolean
259save_now (GtkWidget *dlg)
260{
261 GSettings * conf = G_SETTINGS (g_object_get_data (G_OBJECT (dlg), "conf"));
262 GObject * completion = G_OBJECT (g_object_get_data (G_OBJECT (dlg), "completion"));
263 GObject * store = G_OBJECT (g_object_get_data (completion, "store"));
264
265 save_to_settings (store, conf);
266
267 g_object_set_data (G_OBJECT (dlg), "save-id", GINT_TO_POINTER(0));
268
269 return FALSE;
270}
271
272static void
273save_when_idle (GtkWidget *dlg)
274{
275 guint save_id = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (dlg), "save-id"));
276
277 if (save_id == 0) {
278 save_id = g_idle_add ((GSourceFunc)save_now, dlg);
279 g_object_set_data (G_OBJECT (dlg), "save-id", GINT_TO_POINTER(save_id));
280 }
281}
282
283static void
284dialog_closed (GtkWidget * dlg, GObject * store)
285{
286 /* Cleanup a tad */
287 guint time_id = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (dlg), "time-id"));
288 g_source_remove (time_id);
289
290 guint save_id = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (dlg), "save-id"));
291 if (save_id > 0)
292 g_source_remove (save_id);
293}
294
259static void295static void
260selection_changed (GtkTreeSelection * selection, GtkWidget * remove_button)296selection_changed (GtkTreeSelection * selection, GtkWidget * remove_button)
261{297{
@@ -290,7 +326,7 @@
290 TimezoneCompletion * completion = timezone_completion_new ();326 TimezoneCompletion * completion = timezone_completion_new ();
291 g_object_set_data (G_OBJECT (completion), "tzmap", map);327 g_object_set_data (G_OBJECT (completion), "tzmap", map);
292 g_object_set_data (G_OBJECT (completion), "store", store);328 g_object_set_data (G_OBJECT (completion), "store", store);
293 g_signal_connect (completion, "match-selected", G_CALLBACK (timezone_selected), NULL);329 g_signal_connect (completion, "match-selected", G_CALLBACK (timezone_selected), dlg);
294330
295 GtkCellRenderer * cell = gtk_cell_renderer_text_new ();331 GtkCellRenderer * cell = gtk_cell_renderer_text_new ();
296 g_object_set (cell, "editable", TRUE, NULL);332 g_object_set (cell, "editable", TRUE, NULL);
@@ -317,14 +353,18 @@
317 g_signal_connect (WIG ("removeButton"), "clicked", G_CALLBACK (handle_remove), tree);353 g_signal_connect (WIG ("removeButton"), "clicked", G_CALLBACK (handle_remove), tree);
318354
319 fill_from_settings (store, conf);355 fill_from_settings (store, conf);
320356 g_signal_connect_swapped (store, "row-deleted", G_CALLBACK (save_when_idle), dlg);
321 guint time_id = g_timeout_add_seconds (2, (GSourceFunc)update_times, completion);357 g_signal_connect_swapped (store, "row-inserted", G_CALLBACK (save_when_idle), dlg);
322 update_times (completion);358 g_signal_connect_swapped (store, "row-changed", G_CALLBACK (save_when_idle), dlg);
359 g_signal_connect_swapped (store, "rows-reordered", G_CALLBACK (save_when_idle), dlg);
323360
324 g_object_set_data_full (G_OBJECT (dlg), "conf", g_object_ref (conf), g_object_unref);361 g_object_set_data_full (G_OBJECT (dlg), "conf", g_object_ref (conf), g_object_unref);
325 g_object_set_data_full (G_OBJECT (dlg), "completion", completion, g_object_unref);362 g_object_set_data_full (G_OBJECT (dlg), "completion", completion, g_object_unref);
363 g_signal_connect (dlg, "destroy", G_CALLBACK (dialog_closed), store);
364
365 guint time_id = g_timeout_add_seconds (2, (GSourceFunc)update_times, dlg);
326 g_object_set_data (G_OBJECT (dlg), "time-id", GINT_TO_POINTER(time_id));366 g_object_set_data (G_OBJECT (dlg), "time-id", GINT_TO_POINTER(time_id));
327 g_signal_connect (dlg, "destroy", G_CALLBACK (dialog_closed), store);367 update_times (dlg);
328368
329 gtk_window_set_transient_for (GTK_WINDOW (dlg), parent);369 gtk_window_set_transient_for (GTK_WINDOW (dlg), parent);
330370

Subscribers

People subscribed via source and target branches