summaryrefslogtreecommitdiff
path: root/applets/clock/clock-location.c
diff options
context:
space:
mode:
Diffstat (limited to 'applets/clock/clock-location.c')
-rw-r--r--applets/clock/clock-location.c166
1 files changed, 25 insertions, 141 deletions
diff --git a/applets/clock/clock-location.c b/applets/clock/clock-location.c
index bcebb538..9b4c882d 100644
--- a/applets/clock/clock-location.c
+++ b/applets/clock/clock-location.c
@@ -17,12 +17,6 @@
#include <gio/gio.h>
#include <gtk/gtk.h>
-#ifdef HAVE_NETWORK_MANAGER
-#include <dbus/dbus-glib.h>
-#include <dbus/dbus-glib-lowlevel.h>
-#include <NetworkManager/NetworkManager.h>
-#endif
-
#include "clock-location.h"
#include "clock-marshallers.h"
#include "set-timezone.h"
@@ -72,9 +66,8 @@ static guint location_signals[LAST_SIGNAL] = { 0 };
static void clock_location_finalize (GObject *);
static void clock_location_set_tz (ClockLocation *this);
static void clock_location_unset_tz (ClockLocation *this);
+static gboolean update_weather_info (ClockLocation *loc);
static void setup_weather_updates (ClockLocation *loc);
-static void add_to_network_monitor (ClockLocation *loc);
-static void remove_from_network_monitor (ClockLocation *loc);
static gchar *clock_location_get_valid_weather_code (const gchar *code);
@@ -176,9 +169,23 @@ clock_location_class_init (ClockLocationClass *this_class)
}
static void
+network_changed (GNetworkMonitor *monitor,
+ gboolean available,
+ ClockLocation *loc)
+{
+ ClockLocationPrivate *priv = PRIVATE (loc);
+
+ if (available) {
+ priv->weather_retry_time = WEATHER_TIMEOUT_BASE;
+ update_weather_info (loc);
+ }
+}
+
+static void
clock_location_init (ClockLocation *this)
{
ClockLocationPrivate *priv = PRIVATE (this);
+ GNetworkMonitor *monitor;
priv->name = NULL;
priv->city = NULL;
@@ -192,6 +199,10 @@ clock_location_init (ClockLocation *this)
priv->latitude = 0;
priv->longitude = 0;
+ monitor = g_network_monitor_get_default();
+ g_signal_connect (monitor, "network-changed",
+ G_CALLBACK (network_changed), this);
+
priv->temperature_unit = TEMP_UNIT_CENTIGRADE;
priv->speed_unit = SPEED_UNIT_MS;
}
@@ -200,8 +211,12 @@ static void
clock_location_finalize (GObject *g_obj)
{
ClockLocationPrivate *priv = PRIVATE (g_obj);
+ GNetworkMonitor *monitor;
- remove_from_network_monitor (CLOCK_LOCATION (g_obj));
+ monitor = g_network_monitor_get_default ();
+ g_signal_handlers_disconnect_by_func (monitor,
+ G_CALLBACK (network_changed),
+ CLOCK_LOCATION (g_obj));
if (priv->name) {
g_free (priv->name);
@@ -624,8 +639,6 @@ clock_location_get_weather_info (ClockLocation *loc)
return priv->weather_info;
}
-static gboolean update_weather_info (gpointer data);
-
static void
set_weather_update_timeout (ClockLocation *loc)
{
@@ -667,9 +680,8 @@ weather_info_updated (WeatherInfo *info, gpointer data)
}
static gboolean
-update_weather_info (gpointer data)
+update_weather_info (ClockLocation *loc)
{
- ClockLocation *loc = data;
ClockLocationPrivate *priv = PRIVATE (loc);
WeatherPrefs prefs = {
FORECAST_STATE,
@@ -714,132 +726,6 @@ rad2dms (gfloat lat, gfloat lon)
(int)deg2, (int)min2, h2);
}
-static GList *locations = NULL;
-
-static void
-update_weather_infos (void)
-{
- GList *l;
-
- for (l = locations; l; l = l->next) {
- ClockLocation *loc = l->data;
- ClockLocationPrivate *priv = PRIVATE (loc);
-
- priv->weather_retry_time = WEATHER_TIMEOUT_BASE;
- update_weather_info (loc);
- }
-}
-
-#ifdef HAVE_NETWORK_MANAGER
-static void
-state_notify (DBusPendingCall *pending, gpointer data)
-{
- DBusMessage *msg = dbus_pending_call_steal_reply (pending);
-
- if (!msg)
- return;
-
- if (dbus_message_get_type (msg) == DBUS_MESSAGE_TYPE_METHOD_RETURN) {
- dbus_uint32_t result;
-
- if (dbus_message_get_args (msg, NULL,
- DBUS_TYPE_UINT32, &result,
- DBUS_TYPE_INVALID)) {
- if (result == NM_STATE_CONNECTED) {
- update_weather_infos ();
- }
- }
- }
-
- dbus_message_unref (msg);
-}
-
-static void
-check_network (DBusConnection *connection)
-{
- DBusMessage *message;
- DBusPendingCall *reply;
-
- message = dbus_message_new_method_call (NM_DBUS_SERVICE,
- NM_DBUS_PATH,
- NM_DBUS_INTERFACE,
- "state");
- if (dbus_connection_send_with_reply (connection, message, &reply, -1)) {
- dbus_pending_call_set_notify (reply, state_notify, NULL, NULL);
- dbus_pending_call_unref (reply);
- }
-
- dbus_message_unref (message);
-}
-
-static DBusHandlerResult
-filter_func (DBusConnection *connection,
- DBusMessage *message,
- void *user_data)
-{
- if (dbus_message_is_signal (message,
- NM_DBUS_INTERFACE,
- "StateChanged")) {
- check_network (connection);
-
- return DBUS_HANDLER_RESULT_HANDLED;
- }
-
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-}
-
-static void
-setup_network_monitor (void)
-{
- GError *error;
- DBusError derror;
- static DBusGConnection *bus = NULL;
- DBusConnection *dbus;
-
- if (bus == NULL) {
- error = NULL;
- bus = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
- if (bus == NULL) {
- g_warning ("Couldn't connect to system bus: %s",
- error->message);
- g_error_free (error);
-
- return;
- }
-
- dbus_error_init (&derror);
- dbus = dbus_g_connection_get_connection (bus);
- dbus_connection_add_filter (dbus, filter_func, NULL, NULL);
- dbus_bus_add_match (dbus,
- "type='signal',"
- "interface='" NM_DBUS_INTERFACE "'",
- &derror);
- if (dbus_error_is_set (&derror)) {
- g_warning ("Couldn't register signal handler: %s: %s",
- derror.name, derror.message);
- dbus_error_free (&derror);
- }
- }
-}
-#endif
-
-static void
-add_to_network_monitor (ClockLocation *loc)
-{
-#ifdef HAVE_NETWORK_MANAGER
- setup_network_monitor ();
-#endif
-
- if (!g_list_find (locations, loc))
- locations = g_list_prepend (locations, loc);
-}
-
-static void
-remove_from_network_monitor (ClockLocation *loc)
-{
- locations = g_list_remove (locations, loc);
-}
-
static void
setup_weather_updates (ClockLocation *loc)
{
@@ -885,8 +771,6 @@ setup_weather_updates (ClockLocation *loc)
weather_location_free (wl);
g_free (dms);
-
- add_to_network_monitor (loc);
}
void