aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Gould <ted@gould.cx>2010-02-17 22:36:13 -0600
committerTed Gould <ted@gould.cx>2010-02-17 22:36:13 -0600
commit17cc7e00bb7f77e3ff0060f81998923793fddf00 (patch)
tree9955097d7c8c7652a184cf48e47787ed5809bb57
parentd1e6eaaa5de14e0489299191e25351c697914825 (diff)
parentfe779752785d3a220edcc9ff961045845ec3f1d1 (diff)
downloadayatana-indicator-datetime-17cc7e00bb7f77e3ff0060f81998923793fddf00.tar.gz
ayatana-indicator-datetime-17cc7e00bb7f77e3ff0060f81998923793fddf00.tar.bz2
ayatana-indicator-datetime-17cc7e00bb7f77e3ff0060f81998923793fddf00.zip
Date menuitem, calendar menuitem and time settings menuitem.
-rw-r--r--src/indicator-datetime.c108
1 files changed, 95 insertions, 13 deletions
diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c
index 9b4bec4..00854a4 100644
--- a/src/indicator-datetime.c
+++ b/src/indicator-datetime.c
@@ -34,6 +34,8 @@ struct _IndicatorDatetime {
struct _IndicatorDatetimePrivate {
GtkLabel * label;
+ GtkMenuItem * date;
+ GtkMenuItem * calendar;
guint timer;
};
@@ -79,6 +81,8 @@ indicator_datetime_init (IndicatorDatetime *self)
self->priv = INDICATOR_DATETIME_GET_PRIVATE(self);
self->priv->label = NULL;
+ self->priv->date = NULL;
+ self->priv->calendar = NULL;
self->priv->timer = 0;
return;
@@ -94,6 +98,16 @@ indicator_datetime_dispose (GObject *object)
self->priv->label = NULL;
}
+ if (self->priv->date != NULL) {
+ g_object_unref(self->priv->date);
+ self->priv->date = NULL;
+ }
+
+ if (self->priv->calendar != NULL) {
+ g_object_unref(self->priv->calendar);
+ self->priv->calendar = NULL;
+ }
+
if (self->priv->timer != 0) {
g_source_remove(self->priv->timer);
self->priv->timer = 0;
@@ -113,9 +127,11 @@ indicator_datetime_finalize (GObject *object)
/* Updates the label to be the current time. */
static void
-update_label (GtkLabel * label)
+update_label (IndicatorDatetime * io)
{
- if (label == NULL) return;
+ IndicatorDatetime * self = INDICATOR_DATETIME(io);
+
+ if (self->priv->label == NULL) return;
gchar longstr[128];
time_t t;
@@ -125,14 +141,23 @@ update_label (GtkLabel * label)
ltime = localtime(&t);
if (ltime == NULL) {
g_debug("Error getting local time");
- gtk_label_set_label(label, _("Error getting time"));
+ gtk_label_set_label(self->priv->label, _("Error getting time"));
return;
}
strftime(longstr, 128, "%I:%M %p", ltime);
gchar * utf8 = g_locale_to_utf8(longstr, -1, NULL, NULL, NULL);
- gtk_label_set_label(label, utf8);
+ gtk_label_set_label(self->priv->label, utf8);
+ g_free(utf8);
+
+ if (self->priv->date == NULL) return;
+
+ /* Note: may require some localization tweaks */
+ strftime(longstr, 128, "%A, %e %B %Y", ltime);
+
+ utf8 = g_locale_to_utf8(longstr, -1, NULL, NULL, NULL);
+ gtk_menu_item_set_label(self->priv->date, utf8);
g_free(utf8);
return;
@@ -145,7 +170,7 @@ minute_timer_func (gpointer user_data)
IndicatorDatetime * self = INDICATOR_DATETIME(user_data);
if (self->priv->label != NULL) {
- update_label(self->priv->label);
+ update_label(self);
return TRUE;
} else {
self->priv->timer = 0;
@@ -155,6 +180,18 @@ minute_timer_func (gpointer user_data)
return FALSE;
}
+static void
+activate_cb (GtkWidget *widget, const gchar *command)
+{
+ GError * error = NULL;
+
+ if (!g_spawn_command_line_async(command, &error)) {
+ g_warning("Unable to start %s: %s", (char *)command, error->message);
+ g_error_free(error);
+ }
+}
+
+
/* Grabs the label. Creates it if it doesn't
exist already */
static GtkLabel *
@@ -166,10 +203,10 @@ get_label (IndicatorObject * io)
if (self->priv->label == NULL) {
self->priv->label = GTK_LABEL(gtk_label_new("Time"));
g_object_ref(G_OBJECT(self->priv->label));
- update_label(self->priv->label);
+ update_label(self);
gtk_widget_show(GTK_WIDGET(self->priv->label));
}
-
+
if (self->priv->timer == 0) {
self->priv->timer = g_timeout_add_seconds(60, minute_timer_func, self);
}
@@ -177,20 +214,65 @@ get_label (IndicatorObject * io)
return self->priv->label;
}
-/* Build a dummy menu for now */
+static void
+check_for_calendar_application (IndicatorDatetime * self)
+{
+ GtkMenuItem * item = self->priv->calendar;
+ g_return_if_fail (item != NULL);
+
+ gchar *evo = g_find_program_in_path("evolution");
+ if (evo != NULL) {
+ g_signal_connect (GTK_MENU_ITEM (item), "activate",
+ G_CALLBACK (activate_cb), "evolution -c calendar");
+ gtk_widget_set_sensitive (GTK_WIDGET (item), TRUE);
+ gtk_widget_show(GTK_WIDGET(item));
+ g_free(evo);
+ } else {
+ gtk_widget_hide(GTK_WIDGET(item));
+ }
+}
+
static GtkMenu *
get_menu (IndicatorObject * io)
{
+ IndicatorDatetime * self = INDICATOR_DATETIME(io);
+
GtkWidget * menu = NULL;
GtkWidget * item = NULL;
menu = gtk_menu_new();
+
+ if (self->priv->date == NULL) {
+ item = gtk_menu_item_new_with_label("No date yet...");
+ gtk_widget_set_sensitive (GTK_WIDGET (item), FALSE);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
+ self->priv->date = GTK_MENU_ITEM (item);
+ update_label(self);
+ }
- item = gtk_menu_item_new_with_label("No menu yet.");
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
- gtk_widget_show(item);
-
- gtk_widget_show(menu);
+ if (self->priv->calendar == NULL) {
+ item = gtk_menu_item_new_with_label(_("Open Calendar"));
+ /* insensitive until we check for available apps */
+ gtk_widget_set_sensitive (GTK_WIDGET (item), FALSE);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
+ self->priv->calendar = GTK_MENU_ITEM (item);
+ }
+
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu),
+ gtk_separator_menu_item_new ());
+
+ GtkWidget *settings_mi = gtk_menu_item_new_with_label (_("Set Time and Date..."));
+ g_signal_connect (GTK_MENU_ITEM (settings_mi), "activate",
+ G_CALLBACK (activate_cb), "time-admin");
+ gtk_menu_shell_append (GTK_MENU_SHELL(menu), settings_mi);
+ gtk_widget_show(settings_mi);
+
+ /* show_all to reveal the separator */
+ gtk_widget_show_all(menu);
+
+ /* Note: maybe should move that to an idle loop if that helps with
+ boot performance */
+ check_for_calendar_application (self);
return GTK_MENU(menu);
}