53
53
#include "datetime-interface.h"
54
54
#include "dbus-shared.h"
57
#define SETTINGS_INTERFACE "com.canonical.indicator.datetime"
58
#define SETTINGS_LOCATIONS "locations"
55
#include "settings-shared.h"
60
59
static void geo_create_client (GeoclueMaster * master, GeoclueMasterClient * client, gchar * path, GError * error, gpointer user_data);
61
60
static gboolean update_appointment_menu_items (gpointer user_data);
92
91
static gchar * current_timezone = NULL;
93
92
static gchar * geo_timezone = NULL;
95
set_timezone_label (DbusmenuMenuitem * mi, const gchar * location)
98
split_settings_location (location, &zone, &name);
100
dbusmenu_menuitem_property_set (mi, TIMEZONE_MENUITEM_PROP_NAME, name);
101
dbusmenu_menuitem_property_set (mi, TIMEZONE_MENUITEM_PROP_ZONE, zone);
95
107
/* Check to see if our timezones are the same */
97
109
check_timezone_sync (void) {
145
159
if (label != NULL) {
146
160
// TODO work out the current location name in a nice way
147
dbusmenu_menuitem_property_set (current_location, TIMEZONE_MENUITEM_PROP_ZONE, label);
161
set_timezone_label (current_location, label);
148
162
// TODO work out the current time at that location
149
dbusmenu_menuitem_property_set_bool (current_location, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE);
163
dbusmenu_menuitem_property_set_bool (current_location, DBUSMENU_MENUITEM_PROP_VISIBLE, show);
150
164
dbusmenu_menuitem_property_set_bool(current_location, TIMEZONE_MENUITEM_PROP_RADIO, TRUE);
152
166
g_debug("Label for current location is null, this shouldn't happen");
154
168
if (geo_timezone != NULL) {
155
169
// TODO work out the geo location name in a nice way
156
dbusmenu_menuitem_property_set (geo_location, TIMEZONE_MENUITEM_PROP_ZONE, geo_timezone);
170
set_timezone_label (geo_location, geo_timezone);
157
171
// TODO work out the current time at that location
158
dbusmenu_menuitem_property_set_bool (geo_location, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE);
172
dbusmenu_menuitem_property_set_bool (geo_location, DBUSMENU_MENUITEM_PROP_VISIBLE, show);
161
175
// TODO work out the geo location name in a nice way
162
dbusmenu_menuitem_property_set (geo_location, TIMEZONE_MENUITEM_PROP_ZONE, geo_timezone);
176
set_timezone_label (geo_location, geo_timezone);
163
177
// TODO work out the current time at that location
164
dbusmenu_menuitem_property_set_bool(geo_location, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE);
178
dbusmenu_menuitem_property_set_bool(geo_location, DBUSMENU_MENUITEM_PROP_VISIBLE, show);
166
180
// TODO work out the current location name in a nice way
167
dbusmenu_menuitem_property_set (current_location, TIMEZONE_MENUITEM_PROP_ZONE, current_timezone);
181
set_timezone_label (current_location, current_timezone);
168
182
// TODO work out the current time at that location
169
183
dbusmenu_menuitem_property_set_bool(current_location, TIMEZONE_MENUITEM_PROP_RADIO, TRUE);
170
dbusmenu_menuitem_property_set_bool(current_location, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE);
171
dbusmenu_menuitem_property_set_bool(locations_separator, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE);
184
dbusmenu_menuitem_property_set_bool(current_location, DBUSMENU_MENUITEM_PROP_VISIBLE, show);
185
dbusmenu_menuitem_property_set_bool(locations_separator, DBUSMENU_MENUITEM_PROP_VISIBLE, show);
174
188
g_debug("Finished checking timezone sync");
214
/* See how our timezone setting went */
216
quick_set_tz_cb (OobsObject * obj, OobsResult result, gpointer user_data)
218
if (result == OOBS_RESULT_OK) {
219
g_debug("Timezone set");
221
g_warning("Unable to quick set timezone");
226
/* Set the timezone to the Geoclue discovered one */
228
quick_set_tz (DbusmenuMenuitem * menuitem, guint timestamp, gpointer user_data)
230
const gchar * tz = dbusmenu_menuitem_property_get(menuitem, TIMEZONE_MENUITEM_PROP_ZONE);
232
g_debug("Quick setting timezone to: %s", tz);
234
g_return_if_fail(tz != NULL);
236
if (g_strcmp0(tz, current_timezone) == 0)
239
OobsObject * obj = oobs_time_config_get();
240
g_return_if_fail(obj != NULL);
242
OobsTimeConfig * timeconfig = OOBS_TIME_CONFIG(obj);
243
oobs_time_config_set_timezone(timeconfig, tz);
245
oobs_object_commit_async(obj, quick_set_tz_cb, NULL);
250
228
/* Updates the label in the date menuitem */
252
230
update_datetime (gpointer user_data)
371
349
/* Remove all of the previous locations */
372
350
if (dconflocations != NULL) {
373
g_debug("Freeing old locations");
374
351
while (dconflocations != NULL) {
375
352
DbusmenuMenuitem * litem = DBUSMENU_MENUITEM(dconflocations->data);
376
g_debug("Freeing old location: %p", litem);
377
353
// Remove all the existing menu items which are in dconflocations.
378
354
dconflocations = g_list_remove(dconflocations, litem);
379
355
dbusmenu_menuitem_child_delete(root, DBUSMENU_MENUITEM(litem));
360
gboolean show = g_settings_get_boolean (conf, SETTINGS_SHOW_LOCATIONS_S);
384
362
// TODO: Remove items from the dconflocations at the end of the iteration
385
363
// Make sure if there are multiple locations, our current location is shown
387
dbusmenu_menuitem_property_set_bool (locations_separator, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE);
388
dbusmenu_menuitem_property_set_bool (current_location, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE);
365
dbusmenu_menuitem_property_set_bool (locations_separator, DBUSMENU_MENUITEM_PROP_VISIBLE, show);
366
dbusmenu_menuitem_property_set_bool (current_location, DBUSMENU_MENUITEM_PROP_VISIBLE, show);
389
367
dbusmenu_menuitem_property_set_bool (current_location, DBUSMENU_MENUITEM_PROP_ENABLED, TRUE);
391
369
g_debug("No locations configured (Empty List)");
400
378
g_debug("Adding timezone in update_timezones %s", locations[i]);
401
379
item = dbusmenu_menuitem_new();
402
380
dbusmenu_menuitem_property_set (item, DBUSMENU_MENUITEM_PROP_TYPE, TIMEZONE_MENUITEM_TYPE);
403
dbusmenu_menuitem_property_set (item, TIMEZONE_MENUITEM_PROP_ZONE, locations[i]);
381
set_timezone_label (item, locations[i]);
404
382
dbusmenu_menuitem_property_set_bool (item, TIMEZONE_MENUITEM_PROP_RADIO, FALSE);
405
383
dbusmenu_menuitem_property_set_bool (item, DBUSMENU_MENUITEM_PROP_ENABLED, TRUE);
406
dbusmenu_menuitem_property_set_bool (item, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE);
384
dbusmenu_menuitem_property_set_bool (item, DBUSMENU_MENUITEM_PROP_VISIBLE, show);
407
385
dbusmenu_menuitem_child_add_position (root, item, offset++);
408
g_signal_connect(G_OBJECT(item), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(quick_set_tz), NULL);
409
386
dconflocations = g_list_append(dconflocations, item);
717
694
g_return_val_if_fail (settings != NULL, FALSE);
719
gchar * timeadmin = g_find_program_in_path("time-admin");
696
gchar * timeadmin = g_find_program_in_path("indicator-datetime-preferences");
720
697
if (timeadmin != NULL) {
721
g_debug("Found the time-admin application: %s", timeadmin);
698
g_debug("Found the indicator-datetime-preferences application: %s", timeadmin);
722
699
dbusmenu_menuitem_property_set_bool(settings, DBUSMENU_MENUITEM_PROP_ENABLED, TRUE);
723
700
g_free(timeadmin);
725
g_debug("Unable to find time-admin app.");
702
g_debug("Unable to find indicator-datetime-preferences app.");
726
703
dbusmenu_menuitem_property_set_bool(settings, DBUSMENU_MENUITEM_PROP_ENABLED, FALSE);
710
show_locations_changed (void)
713
check_timezone_sync();
732
716
/* Does the work to build the default menu, really calls out
733
717
to other functions but this is the core to clean up the
734
718
main function. */
760
744
locations_separator = dbusmenu_menuitem_new();
761
745
dbusmenu_menuitem_property_set(locations_separator, DBUSMENU_MENUITEM_PROP_TYPE, DBUSMENU_CLIENT_TYPES_SEPARATOR);
762
dbusmenu_menuitem_property_set_bool (locations_separator, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE);
746
dbusmenu_menuitem_property_set_bool (locations_separator, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE);
763
747
dbusmenu_menuitem_child_append(root, locations_separator);
765
749
geo_location = dbusmenu_menuitem_new();
766
750
dbusmenu_menuitem_property_set (geo_location, DBUSMENU_MENUITEM_PROP_TYPE, TIMEZONE_MENUITEM_TYPE);
767
dbusmenu_menuitem_property_set (geo_location, TIMEZONE_MENUITEM_PROP_ZONE, "");
751
set_timezone_label (geo_location, "");
768
752
dbusmenu_menuitem_property_set_bool (geo_location, DBUSMENU_MENUITEM_PROP_ENABLED, FALSE);
769
753
dbusmenu_menuitem_property_set_bool (geo_location, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE);
770
g_signal_connect(G_OBJECT(geo_location), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(quick_set_tz), NULL);
771
754
dbusmenu_menuitem_child_append(root, geo_location);
773
756
current_location = dbusmenu_menuitem_new();
774
757
dbusmenu_menuitem_property_set (current_location, DBUSMENU_MENUITEM_PROP_TYPE, TIMEZONE_MENUITEM_TYPE);
775
dbusmenu_menuitem_property_set (current_location, TIMEZONE_MENUITEM_PROP_ZONE, "");
758
set_timezone_label (current_location, "");
776
759
dbusmenu_menuitem_property_set_bool (current_location, DBUSMENU_MENUITEM_PROP_ENABLED, FALSE);
777
760
dbusmenu_menuitem_property_set_bool (current_location, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE);
778
g_signal_connect(G_OBJECT(current_location), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(quick_set_tz), NULL);
779
761
dbusmenu_menuitem_child_append(root, current_location);
781
763
check_timezone_sync();
765
g_signal_connect (conf, "changed::" SETTINGS_SHOW_LOCATIONS_S, G_CALLBACK (show_locations_changed), NULL);
783
767
DbusmenuMenuitem * separator = dbusmenu_menuitem_new();
784
768
dbusmenu_menuitem_property_set(separator, DBUSMENU_MENUITEM_PROP_TYPE, DBUSMENU_CLIENT_TYPES_SEPARATOR);
785
769
dbusmenu_menuitem_child_append(root, separator);
788
772
dbusmenu_menuitem_property_set (settings, DBUSMENU_MENUITEM_PROP_LABEL, _("Time & Date Settings..."));
789
773
/* insensitive until we check for available apps */
790
774
dbusmenu_menuitem_property_set_bool(settings, DBUSMENU_MENUITEM_PROP_ENABLED, FALSE);
791
g_signal_connect(G_OBJECT(settings), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(activate_cb), "time-admin");
775
g_signal_connect(G_OBJECT(settings), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(activate_cb), "indicator-datetime-preferences");
792
776
dbusmenu_menuitem_child_append(root, settings);
793
777
g_idle_add(check_for_timeadmin, NULL);