aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Gould <ted@gould.cx>2011-09-15 09:53:20 -0500
committerTed Gould <ted@gould.cx>2011-09-15 09:53:20 -0500
commit5f8e3e3e774c1286bf2a9145b349d84d8eec8065 (patch)
tree7cdc17b8afd72af17eb242fd8f00bfb551821168
parent1231071a4465b03925791a030e210669564ff8ba (diff)
parent87eaa8d2fa412e2f28360587308530fd3e9231d9 (diff)
downloadayatana-indicator-datetime-5f8e3e3e774c1286bf2a9145b349d84d8eec8065.tar.gz
ayatana-indicator-datetime-5f8e3e3e774c1286bf2a9145b349d84d8eec8065.tar.bz2
ayatana-indicator-datetime-5f8e3e3e774c1286bf2a9145b349d84d8eec8065.zip
Use the GNOME Wall Clock interface
-rw-r--r--configure.ac5
-rw-r--r--src/datetime-service.c77
-rw-r--r--src/indicator-datetime.c101
3 files changed, 52 insertions, 131 deletions
diff --git a/configure.ac b/configure.ac
index a713c6f..d557006 100644
--- a/configure.ac
+++ b/configure.ac
@@ -65,6 +65,8 @@ GEOCLUE_REQUIRED_VERSION=0.12.0
ECAL_REQUIRED_VERSION=2.30
EDS_REQUIRED_VERSION=2.30
ICAL_REQUIRED_VERSION=0.44
+GNOME_DESKTOP_REQUIRED_VERSION=3.1.91
+GSETTINGS_DESKTOP_SCHEMAS_REQUIRED=3.1.4
CAIRO_REQUIRED_VERSION=1.10
GDK_REQUIRED_VERSION=2.22
GLIB_REQUIRED_VERSION=2.29.19
@@ -74,6 +76,8 @@ GCONF_REQUIRED_VERSION=2.31
AS_IF([test "x$with_gtk" = x3],
[PKG_CHECK_MODULES(INDICATOR, indicator3-0.4 >= $INDICATOR_REQUIRED_VERSION
glib-2.0 >= $GLIB_REQUIRED_VERSION
+ gnome-desktop-3.0 >= $GNOME_DESKTOP_REQUIRED_VERSION
+ gsettings-desktop-schemas >= $GSETTINGS_DESKTOP_SCHEMAS_REQUIRED
dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION
dbusmenu-gtk3-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION
libido3-0.1 >= $INDICATOR_DISPLAY_OBJECTS)
@@ -101,6 +105,7 @@ PKG_CHECK_MODULES(SERVICE, indicator3-0.4 >= $INDICATOR_REQUIRED_VERSION
libedataserverui-3.0 >= EDS_REQUIRED_VERSION
cairo >= CAIRO_REQUIRED_VERSION
gdk-3.0 >= GDK_REQUIRED_VERSION
+ gnome-desktop-3.0 >= $GNOME_DESKTOP_REQUIRED_VERSION
gconf-2.0 >= GCONF_REQUIRED_VERSION)
PKG_CHECK_MODULES(PREF, gio-2.0 >= $GIO_REQUIRED_VERSION
diff --git a/src/datetime-service.c b/src/datetime-service.c
index 80c0b57..5a492c1 100644
--- a/src/datetime-service.c
+++ b/src/datetime-service.c
@@ -38,6 +38,10 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
#include <geoclue/geoclue-master.h>
#include <geoclue/geoclue-master-client.h>
+#define GNOME_DESKTOP_USE_UNSTABLE_API
+#include <gdesktop-enums.h>
+#include <libgnome-desktop/gnome-wall-clock.h>
+
#include <time.h>
#include <libecal/e-cal.h>
#include <libical/ical.h>
@@ -57,7 +61,6 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
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 gboolean update_timezone_menu_items(gpointer user_data);
-static void setup_timer (void);
static void geo_client_invalid (GeoclueMasterClient * client, gpointer user_data);
static void geo_address_change (GeoclueMasterClient * client, gchar * a, gchar * b, gchar * c, gchar * d, gpointer user_data);
static gboolean get_greeter_mode (void);
@@ -1139,67 +1142,12 @@ build_menus (DbusmenuMenuitem * root)
return;
}
-/* Run when the timezone file changes */
static void
-timezone_changed (GFileMonitor * monitor, GFile * file, GFile * otherfile, GFileMonitorEvent event, gpointer user_data)
+on_clock_changed (GnomeWallClock *clock,
+ GParamSpec *pspec,
+ gpointer user_data)
{
- update_current_timezone();
- datetime_interface_update(DATETIME_INTERFACE(user_data));
- update_datetime(NULL);
- setup_timer();
- return;
-}
-
-/* Set up monitoring the timezone file */
-static void
-build_timezone (DatetimeInterface * dbus)
-{
- GFile * timezonefile = g_file_new_for_path(TIMEZONE_FILE);
- GFileMonitor * monitor = g_file_monitor_file(timezonefile, G_FILE_MONITOR_NONE, NULL, NULL);
- if (monitor != NULL) {
- g_signal_connect(G_OBJECT(monitor), "changed", G_CALLBACK(timezone_changed), dbus);
- g_debug("Monitoring timezone file: '" TIMEZONE_FILE "'");
- } else {
- g_warning("Unable to monitor timezone file: '" TIMEZONE_FILE "'");
- }
- return;
-}
-
-/* Source ID for the timer */
-static guint timer = 0;
-
-/* Execute at a given time, update and setup a new
- timer to go again. */
-static gboolean
-timer_func (gpointer user_data)
-{
- timer = 0;
- /* Reset up each time to reduce error */
- setup_timer();
- update_datetime(NULL);
- return FALSE;
-}
-
-/* Sets up the time to launch the timer to update the
- date in the datetime entry */
-static void
-setup_timer (void)
-{
- if (timer != 0) {
- g_source_remove(timer);
- timer = 0;
- }
-
- time_t t;
- t = time(NULL);
- struct tm * ltime = localtime(&t);
-
- timer = g_timeout_add_seconds(((23 - ltime->tm_hour) * 60 * 60) +
- ((59 - ltime->tm_min) * 60) +
- ((60 - ltime->tm_sec)) + 60 /* one minute past */,
- timer_func, NULL);
-
- return;
+ update_datetime (NULL);
}
static void
@@ -1213,7 +1161,6 @@ session_active_change_cb (GDBusProxy * proxy, gchar * sender_name, gchar * signa
if (!idle) {
datetime_interface_update(DATETIME_INTERFACE(user_data));
update_datetime(NULL);
- setup_timer();
}
}
return;
@@ -1437,6 +1384,8 @@ service_shutdown (IndicatorService * service, gpointer user_data)
int
main (int argc, char ** argv)
{
+ GnomeWallClock *clock;
+
g_type_init();
/* Acknowledging the service init and setting up the interface */
@@ -1472,11 +1421,9 @@ main (int argc, char ** argv)
/* Setup dbus interface */
dbus = g_object_new(DATETIME_INTERFACE_TYPE, NULL);
- /* Setup timezone watch */
- build_timezone(dbus);
-
/* Setup the timer */
- setup_timer();
+ clock = g_object_new (GNOME_TYPE_WALL_CLOCK, NULL);
+ g_signal_connect (clock, "notify::clock", G_CALLBACK (on_clock_changed), NULL);
/* And watch for system resumes */
g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM,
diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c
index 339ea2f..61cfc5f 100644
--- a/src/indicator-datetime.c
+++ b/src/indicator-datetime.c
@@ -45,6 +45,10 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
#include <libido/libido.h>
#include <libdbusmenu-gtk3/menuitem.h>
+/* For GnomeWallClock */
+#define GNOME_DESKTOP_USE_UNSTABLE_API
+#include <libgnome-desktop/gnome-wall-clock.h>
+
#include "utils.h"
#include "dbus-shared.h"
#include "settings-shared.h"
@@ -72,7 +76,6 @@ struct _IndicatorDatetime {
struct _IndicatorDatetimePrivate {
GtkLabel * label;
- guint timer;
gchar * time_string;
@@ -101,8 +104,11 @@ struct _IndicatorDatetimePrivate {
GList * timezone_items;
GSettings * settings;
+ GSettings * gnome_settings;
GtkSizeGroup * indicator_right_group;
+
+ GnomeWallClock *clock;
};
/* Enum for the properties so that they can be quickly
@@ -166,8 +172,8 @@ static gboolean bind_enum_get (GValue * value, GVariant * variant, g
static gchar * generate_format_string_now (IndicatorDatetime * self);
static void update_label (IndicatorDatetime * io, GDateTime ** datetime);
static void guess_label_size (IndicatorDatetime * self);
-static void setup_timer (IndicatorDatetime * self, GDateTime * datetime);
static void update_time (IndicatorDatetime * self);
+static void on_clock_changed (GnomeWallClock *clock, GParamSpec *pspec, gpointer user_data);
static void receive_signal (GDBusProxy * proxy, gchar * sender_name, gchar * signal_name, GVariant * parameters, gpointer user_data);
static void service_proxy_cb (GObject * object, GAsyncResult * res, gpointer user_data);
static gint generate_strftime_bitmask (const char *time_str);
@@ -293,7 +299,6 @@ indicator_datetime_init (IndicatorDatetime *self)
IndicatorDatetimePrivate);
self->priv->label = NULL;
- self->priv->timer = 0;
self->priv->idle_measure = 0;
self->priv->max_width = 0;
@@ -362,6 +367,11 @@ indicator_datetime_init (IndicatorDatetime *self)
g_warning("Unable to get settings for '" SETTINGS_INTERFACE "'");
}
+ self->priv->gnome_settings = g_settings_new ("org.gnome.desktop.interface");
+
+ self->priv->clock = g_object_new (GNOME_TYPE_WALL_CLOCK, NULL);
+ g_signal_connect (self->priv->clock, "notify::clock", G_CALLBACK (on_clock_changed), self);
+
self->priv->sm = indicator_service_manager_new_version(SERVICE_NAME, SERVICE_VERSION);
self->priv->indicator_right_group = GTK_SIZE_GROUP(gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL));
@@ -433,9 +443,9 @@ indicator_datetime_dispose (GObject *object)
self->priv->label = NULL;
}
- if (self->priv->timer != 0) {
- g_source_remove(self->priv->timer);
- self->priv->timer = 0;
+ if (self->priv->clock != NULL) {
+ g_object_unref (self->priv->clock);
+ self->priv->clock = NULL;
}
if (self->priv->idle_measure != 0) {
@@ -562,7 +572,7 @@ set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec
if (newval != self->priv->time_mode) {
update = TRUE;
self->priv->time_mode = newval;
- setup_timer(self, NULL);
+ update_time (self);
}
break;
}
@@ -571,8 +581,11 @@ set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec
self->priv->show_seconds = !self->priv->show_seconds;
if (self->priv->time_mode != SETTINGS_TIME_CUSTOM) {
update = TRUE;
- setup_timer(self, NULL);
+ update_time (self);
}
+ g_settings_set_boolean (self->priv->gnome_settings,
+ "clock-show-seconds",
+ self->priv->show_seconds);
}
break;
}
@@ -606,8 +619,11 @@ set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec
self->priv->custom_show_seconds = (time_mask & STRFTIME_MASK_SECONDS);
if (self->priv->time_mode == SETTINGS_TIME_CUSTOM) {
update = TRUE;
- setup_timer(self, NULL);
+ update_time (self);
}
+ g_settings_set_boolean (self->priv->gnome_settings,
+ "clock-show-seconds",
+ self->priv->show_seconds);
}
break;
}
@@ -830,11 +846,16 @@ update_time (IndicatorDatetime * self)
GDateTime * dt = NULL;
update_label(self, &dt);
timezone_update_all_labels(self);
- if (dt != NULL) {
- setup_timer(self, dt);
- g_date_time_unref(dt);
- }
- return;
+}
+
+static void
+on_clock_changed (GnomeWallClock *clock,
+ GParamSpec *pspec,
+ gpointer user_data)
+{
+ IndicatorDatetime *self = INDICATOR_DATETIME (user_data);
+
+ update_time (self);
}
/* Receives all signals from the service, routed to the appropriate functions */
@@ -851,54 +872,6 @@ receive_signal (GDBusProxy * proxy, gchar * sender_name, gchar * signal_name,
return;
}
-/* Runs every minute and updates the time */
-gboolean
-timer_func (gpointer user_data)
-{
- IndicatorDatetime * self = INDICATOR_DATETIME(user_data);
- self->priv->timer = 0;
- GDateTime * dt = NULL;
- update_label(self, &dt);
- timezone_update_all_labels(self);
- if (dt != NULL) {
- setup_timer(self, dt);
- g_date_time_unref(dt);
- }
- return FALSE;
-}
-
-/* Configure the timer to run the next time through */
-static void
-setup_timer (IndicatorDatetime * self, GDateTime * datetime)
-{
- gboolean unref = FALSE;
-
- if (self->priv->timer != 0) {
- g_source_remove(self->priv->timer);
- self->priv->timer = 0;
- }
-
- if (self->priv->show_seconds ||
- (self->priv->time_mode == SETTINGS_TIME_CUSTOM && self->priv->custom_show_seconds)) {
- self->priv->timer = g_timeout_add_full(G_PRIORITY_HIGH, 999, timer_func, self, NULL);
- } else {
- if (datetime == NULL) {
- datetime = g_date_time_new_now_local();
- unref = TRUE;
- }
-
- /* Plus 2 so we're just after the minute, don't want to be early. */
- gint seconds = (gint)g_date_time_get_seconds(datetime);
- self->priv->timer = g_timeout_add_seconds(60 - seconds + 2, timer_func, self);
-
- if (unref) {
- g_date_time_unref(datetime);
- }
- }
-
- return;
-}
-
/* Does a quick meausre of how big the string is in
pixels with a Pango layout */
static gint
@@ -1519,10 +1492,6 @@ get_label (IndicatorObject * io)
gtk_widget_set_visible(GTK_WIDGET (self->priv->label), self->priv->show_clock);
}
- if (self->priv->timer == 0) {
- setup_timer(self, NULL);
- }
-
return self->priv->label;
}