diff options
author | Ted Gould <ted@gould.cx> | 2010-02-17 22:36:13 -0600 |
---|---|---|
committer | Ted Gould <ted@gould.cx> | 2010-02-17 22:36:13 -0600 |
commit | 17cc7e00bb7f77e3ff0060f81998923793fddf00 (patch) | |
tree | 9955097d7c8c7652a184cf48e47787ed5809bb57 | |
parent | d1e6eaaa5de14e0489299191e25351c697914825 (diff) | |
parent | fe779752785d3a220edcc9ff961045845ec3f1d1 (diff) | |
download | ayatana-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.c | 108 |
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); } |