summaryrefslogtreecommitdiffstats
path: root/plugins/datetime/gsd-datetime-manager.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/datetime/gsd-datetime-manager.c')
-rw-r--r--plugins/datetime/gsd-datetime-manager.c226
1 files changed, 226 insertions, 0 deletions
diff --git a/plugins/datetime/gsd-datetime-manager.c b/plugins/datetime/gsd-datetime-manager.c
new file mode 100644
index 0000000..dcd9f8c
--- /dev/null
+++ b/plugins/datetime/gsd-datetime-manager.c
@@ -0,0 +1,226 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2013 Kalev Lember <kalevlember@gmail.com>
+ *
+ * This program 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 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 this program; if not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "config.h"
+
+#include <gio/gio.h>
+#include <glib/gi18n.h>
+#include <libnotify/notify.h>
+
+#include "gsd-datetime-manager.h"
+#include "gsd-timezone-monitor.h"
+#include "gnome-settings-profile.h"
+
+#define DATETIME_SCHEMA "org.gnome.desktop.datetime"
+#define AUTO_TIMEZONE_KEY "automatic-timezone"
+
+struct _GsdDatetimeManager
+{
+ GObject parent;
+
+ GSettings *settings;
+ GsdTimezoneMonitor *timezone_monitor;
+ NotifyNotification *notification;
+};
+
+static void gsd_datetime_manager_class_init (GsdDatetimeManagerClass *klass);
+static void gsd_datetime_manager_init (GsdDatetimeManager *manager);
+static void gsd_datetime_manager_finalize (GObject *object);
+
+G_DEFINE_TYPE (GsdDatetimeManager, gsd_datetime_manager, G_TYPE_OBJECT)
+
+static gpointer manager_object = NULL;
+
+static void
+notification_closed_cb (NotifyNotification *n,
+ GsdDatetimeManager *self)
+{
+ g_clear_object (&self->notification);
+}
+
+static void
+open_settings_cb (NotifyNotification *n,
+ const char *action,
+ const char *path)
+{
+ const gchar *argv[] = { "gnome-control-center", "datetime", NULL };
+
+ g_debug ("Running gnome-control-center datetime");
+ g_spawn_async (NULL, (gchar **) argv, NULL, G_SPAWN_SEARCH_PATH,
+ NULL, NULL, NULL, NULL);
+
+ notify_notification_close (n, NULL);
+}
+
+static void
+timezone_changed_cb (GsdTimezoneMonitor *timezone_monitor,
+ const gchar *timezone_id,
+ GsdDatetimeManager *self)
+{
+ GDateTime *datetime;
+ GTimeZone *tz;
+ gchar *notification_summary;
+ gchar *timezone_name;
+ gchar *utc_offset;
+
+ tz = g_time_zone_new (timezone_id);
+ datetime = g_date_time_new_now (tz);
+ g_time_zone_unref (tz);
+
+ /* Translators: UTC here means the Coordinated Universal Time.
+ * %:::z will be replaced by the offset from UTC e.g. UTC+02 */
+ utc_offset = g_date_time_format (datetime, _("UTC%:::z"));
+ timezone_name = g_strdup (g_date_time_get_timezone_abbreviation (datetime));
+ g_date_time_unref (datetime);
+
+ notification_summary = g_strdup_printf (_("Time Zone Updated to %s (%s)"),
+ timezone_name,
+ utc_offset);
+ g_free (timezone_name);
+ g_free (utc_offset);
+
+ if (self->notification == NULL) {
+ self->notification = notify_notification_new (notification_summary, NULL,
+ "preferences-system-time-symbolic");
+ g_signal_connect (self->notification,
+ "closed",
+ G_CALLBACK (notification_closed_cb),
+ self);
+
+ notify_notification_add_action (self->notification,
+ "settings",
+ _("Settings"),
+ (NotifyActionCallback) open_settings_cb,
+ NULL, NULL);
+ } else {
+ notify_notification_update (self->notification,
+ notification_summary, NULL,
+ "preferences-system-time-symbolic");
+ }
+ g_free (notification_summary);
+
+ notify_notification_set_app_name (self->notification, _("Date & Time Settings"));
+ notify_notification_set_hint_string (self->notification, "desktop-entry", "gnome-datetime-panel");
+ notify_notification_set_urgency (self->notification, NOTIFY_URGENCY_NORMAL);
+ notify_notification_set_timeout (self->notification, NOTIFY_EXPIRES_NEVER);
+
+ if (!notify_notification_show (self->notification, NULL)) {
+ g_warning ("Failed to send timezone notification");
+ }
+}
+
+static void
+auto_timezone_settings_changed_cb (GSettings *settings,
+ const char *key,
+ GsdDatetimeManager *self)
+{
+ gboolean enabled;
+
+ enabled = g_settings_get_boolean (settings, key);
+ if (enabled && self->timezone_monitor == NULL) {
+ g_debug ("Automatic timezone enabled");
+ self->timezone_monitor = gsd_timezone_monitor_new ();
+
+ g_signal_connect (self->timezone_monitor, "timezone-changed",
+ G_CALLBACK (timezone_changed_cb), self);
+ } else {
+ g_debug ("Automatic timezone disabled");
+ g_clear_object (&self->timezone_monitor);
+ }
+}
+
+gboolean
+gsd_datetime_manager_start (GsdDatetimeManager *self,
+ GError **error)
+{
+ g_debug ("Starting datetime manager");
+ gnome_settings_profile_start (NULL);
+
+ self->settings = g_settings_new (DATETIME_SCHEMA);
+
+ g_signal_connect (self->settings, "changed::" AUTO_TIMEZONE_KEY,
+ G_CALLBACK (auto_timezone_settings_changed_cb), self);
+ auto_timezone_settings_changed_cb (self->settings, AUTO_TIMEZONE_KEY, self);
+
+ gnome_settings_profile_end (NULL);
+
+ return TRUE;
+}
+
+void
+gsd_datetime_manager_stop (GsdDatetimeManager *self)
+{
+ g_debug ("Stopping datetime manager");
+
+ g_clear_object (&self->settings);
+ g_clear_object (&self->timezone_monitor);
+
+ if (self->notification != NULL) {
+ g_signal_handlers_disconnect_by_func (self->notification,
+ G_CALLBACK (notification_closed_cb),
+ self);
+ g_clear_object (&self->notification);
+ }
+}
+
+static void
+gsd_datetime_manager_class_init (GsdDatetimeManagerClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->finalize = gsd_datetime_manager_finalize;
+
+ notify_init ("gnome-settings-daemon");
+}
+
+static void
+gsd_datetime_manager_init (GsdDatetimeManager *manager)
+{
+}
+
+static void
+gsd_datetime_manager_finalize (GObject *object)
+{
+ GsdDatetimeManager *manager;
+
+ g_return_if_fail (object != NULL);
+ g_return_if_fail (GSD_IS_DATETIME_MANAGER (object));
+
+ manager = GSD_DATETIME_MANAGER (object);
+
+ g_return_if_fail (manager != NULL);
+
+ gsd_datetime_manager_stop (manager);
+
+ G_OBJECT_CLASS (gsd_datetime_manager_parent_class)->finalize (object);
+}
+
+GsdDatetimeManager *
+gsd_datetime_manager_new (void)
+{
+ if (manager_object != NULL) {
+ g_object_ref (manager_object);
+ } else {
+ manager_object = g_object_new (GSD_TYPE_DATETIME_MANAGER, NULL);
+ g_object_add_weak_pointer (manager_object,
+ (gpointer *) &manager_object);
+ }
+
+ return GSD_DATETIME_MANAGER (manager_object);
+}