Merge GNOME clock fix for multiple applets by Francesco Marella.
Clean up GNOME clock code and fix memory leak.
This commit is contained in:
+63
-37
@@ -32,6 +32,41 @@
|
||||
#endif
|
||||
|
||||
|
||||
/* Find current selected city for the clock applet with the specified id.
|
||||
Returns NULL if not found. */
|
||||
static char *
|
||||
find_current_city(GConfClient *client, const char *id)
|
||||
{
|
||||
GError *error = NULL;
|
||||
|
||||
char *current_city = NULL;
|
||||
char *cities_key = g_strdup_printf("/apps/panel/applets/%s"
|
||||
"/prefs/cities", id);
|
||||
GSList *cities = gconf_client_get_list(client,
|
||||
cities_key,
|
||||
GCONF_VALUE_STRING, &error);
|
||||
|
||||
if (error) {
|
||||
fprintf(stderr, _("Error reading city list: `%s'.\n"),
|
||||
cities_key);
|
||||
g_free(cities_key);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
g_free(cities_key);
|
||||
|
||||
for (GSList *city = cities; city != NULL;
|
||||
city = g_slist_next(city)) {
|
||||
char *city_spec = city->data;
|
||||
char *c = strstr(city_spec, "current=\"true\"");
|
||||
if (c) current_city = g_strdup(city_spec);
|
||||
g_free(city->data);
|
||||
}
|
||||
g_slist_free(cities);
|
||||
|
||||
return current_city;
|
||||
}
|
||||
|
||||
int
|
||||
location_gnome_clock_init(location_gnome_clock_state_t *state)
|
||||
{
|
||||
@@ -40,6 +75,7 @@ location_gnome_clock_init(location_gnome_clock_state_t *state)
|
||||
GError *error = NULL;
|
||||
GConfClient *client = gconf_client_get_default();
|
||||
|
||||
/* Get a list of active applets in the panel. */
|
||||
GSList *applets = gconf_client_get_list(client,
|
||||
"/apps/panel/general/applet_id_list",
|
||||
GCONF_VALUE_STRING, &error);
|
||||
@@ -50,73 +86,63 @@ location_gnome_clock_init(location_gnome_clock_state_t *state)
|
||||
return -1;
|
||||
}
|
||||
|
||||
char *cities_key = NULL;
|
||||
/* Go through each applet and check if it is a clock applet.
|
||||
When a clock applet is found, check whether there is a
|
||||
city selected as the current city. */
|
||||
char *current_city = NULL;
|
||||
|
||||
/* Keep track of the number of clock applets found to be able to give
|
||||
better error output if something fails. */
|
||||
int clock_applet_count = 0;
|
||||
|
||||
for (GSList *applet = applets; applet != NULL;
|
||||
applet = g_slist_next(applet)) {
|
||||
char *path = applet->data;
|
||||
if (cities_key == NULL) {
|
||||
char *id = applet->data;
|
||||
if (current_city == NULL) {
|
||||
char *key = g_strdup_printf("/apps/panel/applets/%s"
|
||||
"/bonobo_iid", path);
|
||||
"/bonobo_iid", id);
|
||||
char *bonobo_iid = gconf_client_get_string(client, key,
|
||||
&error);
|
||||
|
||||
if (!error && bonobo_iid != NULL) {
|
||||
if (!strcmp(bonobo_iid,
|
||||
"OAFIID:GNOME_ClockApplet")) {
|
||||
cities_key = g_strdup_printf(
|
||||
"/apps/panel/applets/%s"
|
||||
"/prefs/cities", path);
|
||||
}
|
||||
g_free(bonobo_iid);
|
||||
if (!error && bonobo_iid != NULL &&
|
||||
!strcmp(bonobo_iid, "OAFIID:GNOME_ClockApplet")) {
|
||||
clock_applet_count += 1;
|
||||
current_city = find_current_city(client, id);
|
||||
}
|
||||
|
||||
g_free(bonobo_iid);
|
||||
g_free(key);
|
||||
}
|
||||
g_free(path);
|
||||
g_free(id);
|
||||
}
|
||||
|
||||
g_slist_free(applets);
|
||||
g_object_unref(client);
|
||||
|
||||
if (cities_key == NULL) {
|
||||
/* Check whether an applet and a current city was found. */
|
||||
|
||||
if (clock_applet_count == 0) {
|
||||
fputs(_("No clock applet was found.\n"), stderr);
|
||||
g_object_unref(client);
|
||||
return -1;
|
||||
}
|
||||
|
||||
GSList *cities = gconf_client_get_list(client, cities_key,
|
||||
GCONF_VALUE_STRING, &error);
|
||||
if (error) {
|
||||
fprintf(stderr, _("Error reading city list: `%s'.\n"),
|
||||
cities_key);
|
||||
g_free(cities_key);
|
||||
g_object_unref(client);
|
||||
return -1;
|
||||
}
|
||||
|
||||
g_free(cities_key);
|
||||
|
||||
char *current_city = NULL;
|
||||
for (GSList *city = cities; city != NULL;
|
||||
city = g_slist_next(city)) {
|
||||
char *city_spec = city->data;
|
||||
char *c = strstr(city_spec, "current=\"true\"");
|
||||
if (c) current_city = g_strdup(city_spec);
|
||||
g_free(city->data);
|
||||
}
|
||||
g_slist_free(cities);
|
||||
|
||||
if (current_city == NULL) {
|
||||
fputs(_("No city selected as current city.\n"), stderr);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Find coords for selected city and parse as number. */
|
||||
|
||||
char *lat_str = strstr(current_city, "latitude=\"");
|
||||
char *lon_str = strstr(current_city, "longitude=\"");
|
||||
if (lat_str == NULL || lon_str == NULL) {
|
||||
fputs(_("Location not specified for city.\n"), stderr);
|
||||
g_free(current_city);
|
||||
return -1;
|
||||
}
|
||||
|
||||
g_free(current_city);
|
||||
|
||||
char *lat_num_str = lat_str + strlen("latitude=\"");
|
||||
char *lon_num_str = lon_str + strlen("longitude=\"");
|
||||
|
||||
|
||||
Reference in New Issue
Block a user