/* location-gnome-clock.c -- GNOME Panel Clock location provider source This file is part of Redshift. Redshift is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Redshift is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Redshift. If not, see . Copyright (c) 2010 Jon Lund Steffensen */ #include #include #include #include "location-gnome-clock.h" #ifdef ENABLE_NLS # include # define _(s) gettext(s) #else # define _(s) s #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) { g_type_init(); 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); if (error) { fputs(_("Cannot list GNOME panel applets.\n"), stderr); g_object_unref(client); g_slist_free(applets); return -1; } /* 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 *id = applet->data; if (current_city == NULL) { char *key = g_strdup_printf("/apps/panel/applets/%s" "/bonobo_iid", id); char *bonobo_iid = gconf_client_get_string(client, key, &error); 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(id); } g_slist_free(applets); g_object_unref(client); /* Check whether an applet and a current city was found. */ if (clock_applet_count == 0) { fputs(_("No clock applet was found.\n"), stderr); return -1; } 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=\""); state->lat = g_ascii_strtod(lat_num_str, NULL); state->lon = g_ascii_strtod(lon_num_str, NULL); return 0; } int location_gnome_clock_start(location_gnome_clock_state_t *state) { return 0; } void location_gnome_clock_free(location_gnome_clock_state_t *state) { } void location_gnome_clock_print_help(FILE *f) { fputs(_("Use the location as set in the GNOME Clock applet.\n"), f); fputs("\n", f); } int location_gnome_clock_set_option(location_gnome_clock_state_t *state, const char *key, const char *value) { return -1; } int location_gnome_clock_get_location(location_gnome_clock_state_t *state, float *lat, float *lon) { *lat = state->lat; *lon = state->lon; return 0; }