From e0956b83d773f47e92108c2ad21031e6f0efc757 Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Sun, 4 Nov 2012 17:51:51 -0600 Subject: extract method geo_set_timezone() from geo_address_cb() and geo_client_invalid() s.t. modifying the geo_location variable always happens in just one place. --- src/datetime-service.c | 36 +++++++++++++----------------------- 1 file changed, 13 insertions(+), 23 deletions(-) (limited to 'src/datetime-service.c') diff --git a/src/datetime-service.c b/src/datetime-service.c index e63fed6..f8d673f 100644 --- a/src/datetime-service.c +++ b/src/datetime-service.c @@ -1185,6 +1185,17 @@ system_proxy_cb (GObject * object, GAsyncResult * res, gpointer user_data) g_signal_connect(proxy, "g-signal", G_CALLBACK(session_active_change_cb), user_data); } +static void +geo_set_timezone (const gchar * timezone) +{ + if (geo_timezone != timezone) { + g_clear_pointer (&geo_timezone, g_free); + geo_timezone = g_strdup (timezone); + g_debug("Geoclue timezone is: %s", timezone ? timezone : "(Null)"); + update_location_menu_items(); + } +} + /* Callback from getting the address */ static void geo_address_cb (GeoclueAddress * address, int timestamp, GHashTable * addy_data, GeoclueAccuracy * accuracy, GError * error, gpointer user_data) @@ -1195,21 +1206,7 @@ geo_address_cb (GeoclueAddress * address, int timestamp, GHashTable * addy_data, return; } - g_debug("Geoclue timezone is: %s", (gchar *)g_hash_table_lookup(addy_data, "timezone")); - - if (geo_timezone != NULL) { - g_free(geo_timezone); - geo_timezone = NULL; - } - - gpointer tz_hash = g_hash_table_lookup(addy_data, "timezone"); - if (tz_hash != NULL) { - geo_timezone = g_strdup((gchar *)tz_hash); - } - - update_location_menu_items(); - - return; + geo_set_timezone (g_hash_table_lookup (addy_data, "timezone")); } /* Clean up the reference we kept to the address and make sure to @@ -1300,14 +1297,7 @@ geo_client_invalid (GeoclueMasterClient * client, gpointer user_data) GeoclueMaster * master = geoclue_master_get_default(); geoclue_master_create_client_async(master, geo_create_client, NULL); - if (geo_timezone != NULL) { - g_free(geo_timezone); - geo_timezone = NULL; - } - - update_location_menu_items(); - - return; + geo_set_timezone (NULL); } /* Callback from creating the client */ -- cgit v1.2.3 From 0a0f7705fa39a7d6e351685930ef2475cf82fa05 Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Sun, 4 Nov 2012 18:17:50 -0600 Subject: move geoclue variables to the geoclue section of the code --- src/datetime-service.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) (limited to 'src/datetime-service.c') diff --git a/src/datetime-service.c b/src/datetime-service.c index f8d673f..d326ebe 100644 --- a/src/datetime-service.c +++ b/src/datetime-service.c @@ -64,11 +64,9 @@ with this program. If not, see . #define SETTINGS_APP_INVOCATION "gnome-control-center datetime" #endif -static void geo_create_client (GeoclueMaster * master, GeoclueMasterClient * client, gchar * path, GError * error, gpointer user_data); static gboolean update_appointment_menu_items (gpointer user_data); static void update_location_menu_items (void); static void day_timer_reset (void); -static void geo_client_invalid (GeoclueMasterClient * client, gpointer user_data); static gboolean get_greeter_mode (void); static void quick_set_tz (DbusmenuMenuitem * menuitem, guint timestamp, gpointer user_data); @@ -96,10 +94,6 @@ static ESourceRegistry * source_registry = NULL; static GList * appointment_sources = NULL; -/* Geoclue trackers */ -static GeoclueMasterClient * geo_master = NULL; -static GeoclueAddress * geo_address = NULL; - /* Our 2 important timezones */ static gchar * current_timezone = NULL; static gchar * geo_timezone = NULL; @@ -1185,6 +1179,17 @@ system_proxy_cb (GObject * object, GAsyncResult * res, gpointer user_data) g_signal_connect(proxy, "g-signal", G_CALLBACK(session_active_change_cb), user_data); } + +/**** +***** GEOCLUE +****/ + +static void geo_create_client (GeoclueMaster * master, GeoclueMasterClient * client, gchar * path, GError * error, gpointer user_data); +static void geo_client_invalid (GeoclueMasterClient * client, gpointer user_data); + +static GeoclueMasterClient * geo_master = NULL; +static GeoclueAddress * geo_address = NULL; + static void geo_set_timezone (const gchar * timezone) { @@ -1339,6 +1344,10 @@ geo_create_client (GeoclueMaster * master, GeoclueMasterClient * client, gchar * return; } +/**** +***** +****/ + static gboolean get_greeter_mode (void) { -- cgit v1.2.3 From e2589b091864b40513992183dd38d62ee32da1f5 Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Sun, 4 Nov 2012 18:20:41 -0600 Subject: clarify variable names: the GeoclueMaster is 'geo_master'; the GeoclueMasterClient is 'geo_client' --- src/datetime-service.c | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) (limited to 'src/datetime-service.c') diff --git a/src/datetime-service.c b/src/datetime-service.c index d326ebe..cf77605 100644 --- a/src/datetime-service.c +++ b/src/datetime-service.c @@ -1187,7 +1187,8 @@ system_proxy_cb (GObject * object, GAsyncResult * res, gpointer user_data) static void geo_create_client (GeoclueMaster * master, GeoclueMasterClient * client, gchar * path, GError * error, gpointer user_data); static void geo_client_invalid (GeoclueMasterClient * client, gpointer user_data); -static GeoclueMasterClient * geo_master = NULL; +static GeoclueMaster * geo_master = NULL; +static GeoclueMasterClient * geo_client = NULL; static GeoclueAddress * geo_address = NULL; static void @@ -1236,14 +1237,14 @@ geo_address_clean (void) static void geo_client_clean (void) { - if (geo_master == NULL) { + if (geo_client == NULL) { return; } - g_signal_handlers_disconnect_by_func(G_OBJECT(geo_master), geo_client_invalid, NULL); - g_object_unref(G_OBJECT(geo_master)); + g_signal_handlers_disconnect_by_func(G_OBJECT(geo_client), geo_client_invalid, NULL); + g_object_unref(G_OBJECT(geo_client)); - geo_master = NULL; + geo_client = NULL; return; } @@ -1299,8 +1300,9 @@ geo_client_invalid (GeoclueMasterClient * client, gpointer user_data) /* And our master client is invalid */ geo_client_clean(); - GeoclueMaster * master = geoclue_master_get_default(); - geoclue_master_create_client_async(master, geo_create_client, NULL); + g_clear_object (&geo_master); + geo_master = geoclue_master_get_default(); + geoclue_master_create_client_async (geo_master, geo_create_client, NULL); geo_set_timezone (NULL); } @@ -1311,7 +1313,7 @@ geo_create_client (GeoclueMaster * master, GeoclueMasterClient * client, gchar * { g_debug("Created Geoclue client at: %s", path); - geo_master = client; + geo_client = client; if (error != NULL) { g_warning("Unable to get a GeoClue client! '%s' Geolocation based timezone support will not be available.", error->message); @@ -1319,17 +1321,17 @@ geo_create_client (GeoclueMaster * master, GeoclueMasterClient * client, gchar * return; } - if (geo_master == NULL) { + if (geo_client == NULL) { g_warning(_("Unable to get a GeoClue client! Geolocation based timezone support will not be available.")); return; } - g_object_ref(G_OBJECT(geo_master)); + g_object_ref(G_OBJECT(geo_client)); /* New client, make sure we don't have an address hanging on */ geo_address_clean(); - geoclue_master_client_set_requirements_async(geo_master, + geoclue_master_client_set_requirements_async(geo_client, GEOCLUE_ACCURACY_LEVEL_REGION, 0, FALSE, @@ -1337,7 +1339,7 @@ geo_create_client (GeoclueMaster * master, GeoclueMasterClient * client, gchar * geo_req_set, NULL); - geoclue_master_client_create_address_async(geo_master, geo_create_address, NULL); + geoclue_master_client_create_address_async(geo_client, geo_create_address, NULL); g_signal_connect(G_OBJECT(client), "invalidated", G_CALLBACK(geo_client_invalid), NULL); @@ -1438,8 +1440,8 @@ main (int argc, char ** argv) update_current_timezone(); /* Setup geoclue */ - GeoclueMaster * master = geoclue_master_get_default(); - geoclue_master_create_client_async(master, geo_create_client, NULL); + geo_master = geoclue_master_get_default(); + geoclue_master_create_client_async (geo_master, geo_create_client, NULL); /* Setup dbus interface */ dbus = g_object_new(DATETIME_INTERFACE_TYPE, NULL); @@ -1470,7 +1472,6 @@ main (int argc, char ** argv) free_appointment_sources(); g_object_unref(G_OBJECT(conf)); - g_object_unref(G_OBJECT(master)); g_object_unref(G_OBJECT(dbus)); g_object_unref(G_OBJECT(service)); g_object_unref(G_OBJECT(server)); @@ -1481,6 +1482,7 @@ main (int argc, char ** argv) geo_address_clean(); geo_client_clean(); + g_clear_object (&geo_master); return 0; } -- cgit v1.2.3 From f45aa8bf13dab27e21b1108ea00611973999eb5b Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Sun, 4 Nov 2012 18:32:54 -0600 Subject: new functions, geo_start() and geo_stop(), so that geo_client_invalid() and main() don't have to duplicate each other's code --- src/datetime-service.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) (limited to 'src/datetime-service.c') diff --git a/src/datetime-service.c b/src/datetime-service.c index cf77605..80f3933 100644 --- a/src/datetime-service.c +++ b/src/datetime-service.c @@ -1184,6 +1184,8 @@ system_proxy_cb (GObject * object, GAsyncResult * res, gpointer user_data) ***** GEOCLUE ****/ +static void geo_start (void); +static void geo_stop (void); static void geo_create_client (GeoclueMaster * master, GeoclueMasterClient * client, gchar * path, GError * error, gpointer user_data); static void geo_client_invalid (GeoclueMasterClient * client, gpointer user_data); @@ -1292,19 +1294,26 @@ static void geo_client_invalid (GeoclueMasterClient * client, gpointer user_data) { g_warning("Master client invalid, rebuilding."); + geo_stop (); + geo_start (); +} - /* Client changes we can assume the address is now invalid so we - need to unreference the one we had. */ +static void +geo_stop (void) +{ geo_address_clean(); - - /* And our master client is invalid */ geo_client_clean(); + g_clear_object (&geo_master); +} + +static void +geo_start (void) +{ + g_warn_if_fail (geo_master == NULL); g_clear_object (&geo_master); geo_master = geoclue_master_get_default(); geoclue_master_create_client_async (geo_master, geo_create_client, NULL); - - geo_set_timezone (NULL); } /* Callback from creating the client */ @@ -1440,8 +1449,7 @@ main (int argc, char ** argv) update_current_timezone(); /* Setup geoclue */ - geo_master = geoclue_master_get_default(); - geoclue_master_create_client_async (geo_master, geo_create_client, NULL); + geo_start (); /* Setup dbus interface */ dbus = g_object_new(DATETIME_INTERFACE_TYPE, NULL); @@ -1480,9 +1488,7 @@ main (int argc, char ** argv) icaltimezone_free_builtin_timezones(); - geo_address_clean(); - geo_client_clean(); - g_clear_object (&geo_master); + geo_stop (); return 0; } -- cgit v1.2.3 From b2d2e1ac4817de01aa3d3b039764c0b68df7b4ea Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Sun, 4 Nov 2012 18:36:04 -0600 Subject: copyediting --- src/datetime-service.c | 37 +++++++++++++------------------------ 1 file changed, 13 insertions(+), 24 deletions(-) (limited to 'src/datetime-service.c') diff --git a/src/datetime-service.c b/src/datetime-service.c index 80f3933..0c8a7f8 100644 --- a/src/datetime-service.c +++ b/src/datetime-service.c @@ -1222,16 +1222,10 @@ geo_address_cb (GeoclueAddress * address, int timestamp, GHashTable * addy_data, static void geo_address_clean (void) { - if (geo_address == NULL) { - return; + if (geo_address != NULL) { + g_signal_handlers_disconnect_by_func(geo_address, geo_address_cb, NULL); + g_clear_object (&geo_address); } - - g_signal_handlers_disconnect_by_func(G_OBJECT(geo_address), geo_address_cb, NULL); - g_object_unref(G_OBJECT(geo_address)); - - geo_address = NULL; - - return; } /* Clean up and remove all signal handlers from the client as we @@ -1239,16 +1233,10 @@ geo_address_clean (void) static void geo_client_clean (void) { - if (geo_client == NULL) { - return; + if (geo_client != NULL) { + g_signal_handlers_disconnect_by_func(geo_client, geo_client_invalid, NULL); + g_clear_object (&geo_client); } - - g_signal_handlers_disconnect_by_func(G_OBJECT(geo_client), geo_client_invalid, NULL); - g_object_unref(G_OBJECT(geo_client)); - - geo_client = NULL; - - return; } /* Callback from creating the address */ @@ -1268,8 +1256,7 @@ geo_create_address (GeoclueMasterClient * master, GeoclueAddress * address, GErr geo_address_clean(); g_debug("Created Geoclue Address"); - geo_address = address; - g_object_ref(G_OBJECT(geo_address)); + geo_address = g_object_ref (address); geoclue_address_get_address_async(geo_address, geo_address_cb, NULL); @@ -1301,8 +1288,10 @@ geo_client_invalid (GeoclueMasterClient * client, gpointer user_data) static void geo_stop (void) { - geo_address_clean(); - geo_client_clean(); + geo_set_timezone (NULL); + + geo_address_clean (); + geo_client_clean (); g_clear_object (&geo_master); } @@ -1330,12 +1319,12 @@ geo_create_client (GeoclueMaster * master, GeoclueMasterClient * client, gchar * return; } - if (geo_client == NULL) { + if (client == NULL) { g_warning(_("Unable to get a GeoClue client! Geolocation based timezone support will not be available.")); return; } - g_object_ref(G_OBJECT(geo_client)); + g_object_ref (geo_client); /* New client, make sure we don't have an address hanging on */ geo_address_clean(); -- cgit v1.2.3 From ce8ea326b06fed4a9d7537fe85cee0242ae01cef Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Sun, 4 Nov 2012 18:42:56 -0600 Subject: only use geoclue if com.canonical.indicator.datetime.show-auto-detected-location is true. honor GSettings changes for that variable to disable/enable our use of geoclue. --- src/datetime-service.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) (limited to 'src/datetime-service.c') diff --git a/src/datetime-service.c b/src/datetime-service.c index 0c8a7f8..488856e 100644 --- a/src/datetime-service.c +++ b/src/datetime-service.c @@ -1344,6 +1344,15 @@ geo_create_client (GeoclueMaster * master, GeoclueMasterClient * client, gchar * return; } +static void +on_use_geoclue_changed_cb (GSettings * settings, gchar * key, gpointer unused G_GNUC_UNUSED) +{ + geo_stop (); + + if (g_settings_get_boolean (conf, SETTINGS_SHOW_DETECTED_S)) + geo_start (); +} + /**** ***** ****/ @@ -1412,7 +1421,9 @@ main (int argc, char ** argv) /* Set up GSettings */ conf = g_settings_new(SETTINGS_INTERFACE); - // TODO Add a signal handler to catch gsettings changes and respond to them + g_signal_connect (conf, "changed::show-auto-detected-location", + G_CALLBACK(on_use_geoclue_changed_cb), NULL); + // TODO Add a signal handler to catch other gsettings changes and respond to them /* Build our list of appointment calendar sources. When a source changes, update our menu items. @@ -1438,7 +1449,8 @@ main (int argc, char ** argv) update_current_timezone(); /* Setup geoclue */ - geo_start (); + if (g_settings_get_boolean (conf, SETTINGS_SHOW_DETECTED_S)) + geo_start (); /* Setup dbus interface */ dbus = g_object_new(DATETIME_INTERFACE_TYPE, NULL); -- cgit v1.2.3 From e83ac166bbbb03250fd74771a9b934f2d43286f5 Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Sun, 4 Nov 2012 18:46:19 -0600 Subject: minor copyediting in the geoclue section --- src/datetime-service.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) (limited to 'src/datetime-service.c') diff --git a/src/datetime-service.c b/src/datetime-service.c index 488856e..8e88586 100644 --- a/src/datetime-service.c +++ b/src/datetime-service.c @@ -1208,13 +1208,12 @@ geo_set_timezone (const gchar * timezone) static void geo_address_cb (GeoclueAddress * address, int timestamp, GHashTable * addy_data, GeoclueAccuracy * accuracy, GError * error, gpointer user_data) { - if (error != NULL) { + if (error == NULL) { + geo_set_timezone (g_hash_table_lookup (addy_data, "timezone")); + } else { g_warning("Unable to get Geoclue address: %s", error->message); g_clear_error (&error); - return; } - - geo_set_timezone (g_hash_table_lookup (addy_data, "timezone")); } /* Clean up the reference we kept to the address and make sure to @@ -1223,7 +1222,7 @@ static void geo_address_clean (void) { if (geo_address != NULL) { - g_signal_handlers_disconnect_by_func(geo_address, geo_address_cb, NULL); + g_signal_handlers_disconnect_by_func (geo_address, geo_address_cb, NULL); g_clear_object (&geo_address); } } @@ -1234,7 +1233,7 @@ static void geo_client_clean (void) { if (geo_client != NULL) { - g_signal_handlers_disconnect_by_func(geo_client, geo_client_invalid, NULL); + g_signal_handlers_disconnect_by_func (geo_client, geo_client_invalid, NULL); g_clear_object (&geo_client); } } @@ -1258,11 +1257,9 @@ geo_create_address (GeoclueMasterClient * master, GeoclueAddress * address, GErr g_debug("Created Geoclue Address"); geo_address = g_object_ref (address); - geoclue_address_get_address_async(geo_address, geo_address_cb, NULL); - - g_signal_connect(G_OBJECT(address), "address-changed", G_CALLBACK(geo_address_cb), NULL); + geoclue_address_get_address_async (geo_address, geo_address_cb, NULL); - return; + g_signal_connect (address, "address-changed", G_CALLBACK(geo_address_cb), NULL); } /* Callback from setting requirements */ @@ -1273,7 +1270,6 @@ geo_req_set (GeoclueMasterClient * master, GError * error, gpointer user_data) g_warning("Unable to set Geoclue requirements: %s", error->message); g_clear_error (&error); } - return; } /* Client is killing itself rather oddly */ @@ -1339,9 +1335,7 @@ geo_create_client (GeoclueMaster * master, GeoclueMasterClient * client, gchar * geoclue_master_client_create_address_async(geo_client, geo_create_address, NULL); - g_signal_connect(G_OBJECT(client), "invalidated", G_CALLBACK(geo_client_invalid), NULL); - - return; + g_signal_connect(client, "invalidated", G_CALLBACK(geo_client_invalid), NULL); } static void -- cgit v1.2.3