aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkarl-qdh <karl@qdh.org.uk>2011-02-25 14:04:46 +0000
committerkarl-qdh <karl@qdh.org.uk>2011-02-25 14:04:46 +0000
commit398154d354d19a85f629a6d7131b1a7bd6b7b869 (patch)
treea87c8ff21536c7e05ab21cb271260a8bf6c505aa
parent7a70d5723bafdee6460f5080fa94449667eba8f4 (diff)
downloadayatana-indicator-datetime-398154d354d19a85f629a6d7131b1a7bd6b7b869.tar.gz
ayatana-indicator-datetime-398154d354d19a85f629a6d7131b1a7bd6b7b869.tar.bz2
ayatana-indicator-datetime-398154d354d19a85f629a6d7131b1a7bd6b7b869.zip
Fixing up indicator-datetime
* Config options * Calendar update signals from calendar widget - should update appointments/marks not working at present
-rw-r--r--data/com.canonical.indicator.datetime.gschema.xml35
-rw-r--r--src/datetime-service.c87
-rw-r--r--src/dbus-shared.h9
-rw-r--r--src/indicator-datetime.c61
4 files changed, 148 insertions, 44 deletions
diff --git a/data/com.canonical.indicator.datetime.gschema.xml b/data/com.canonical.indicator.datetime.gschema.xml
index 117f965..5881d09 100644
--- a/data/com.canonical.indicator.datetime.gschema.xml
+++ b/data/com.canonical.indicator.datetime.gschema.xml
@@ -5,6 +5,11 @@
<value nick="24-hour" value="2" />
<value nick="custom" value="3" />
</enum>
+ <enum id="week-start-enum">
+ <value nick="locale-default" value="0" />
+ <value nick="sunday" value="1" />
+ <value nick="monday" value="2" />
+ </enum>
<schema id="com.canonical.indicator.datetime" path="/com/canonical/indicator/datetime/" gettext-domain="indicator-datetime">
<key name="time-format" enum="time-enum">
<default>'locale-default'</default>
@@ -57,13 +62,41 @@
more information.
</description>
</key>
+ <key name="show-week-numbers" type="b">
+ <default>false</default>
+ <summary>Show week numbers in calendar</summary>
+ <description>
+ Shows the week numbers in the monthly calendar in indicator-datetime's menu.
+ </description>
+ </key>
<key name="locations" type="as">
- <default>[]</default>
+ <default>['UTC']</default>
<summary>A List of locations</summary>
<description>
Adds the list of locations the user has configured to display in the
indicator-datetime menu.
</description>
</key>
+ <key name="show-calendar" type="b">
+ <default>true</default>
+ <summary>Show the monthly calendar in the indicator</summary>
+ <description>
+ Puts the monthly calendar in indicator-datetime's menu.
+ </description>
+ </key>
+ <key name="show-events" type="b">
+ <default>true</default>
+ <summary>Show events in the indicator</summary>
+ <description>
+ Shows events from Evolution in indicator-datetime's menu.
+ </description>
+ </key>
+ <key name="show-locations" type="b">
+ <default>false</default>
+ <summary>Show locations in the indicator</summary>
+ <description>
+ Shows custom defined locations in indicator-datetime's menu.
+ </description>
+ </key>
</schema>
</schemalist>
diff --git a/src/datetime-service.c b/src/datetime-service.c
index 347fecb..6a9575e 100644
--- a/src/datetime-service.c
+++ b/src/datetime-service.c
@@ -54,8 +54,11 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
#include "dbus-shared.h"
-#define SETTINGS_INTERFACE "com.canonical.indicator.datetime"
-#define SETTINGS_LOCATIONS "locations"
+#define SETTINGS_INTERFACE "com.canonical.indicator.datetime"
+#define SETTINGS_LOCATIONS "locations"
+#define SETTINGS_SHOW_CALENDAR "show-calendar"
+#define SETTINGS_SHOW_EVENTS "show-events"
+#define SETTINGS_SHOW_LOCATIONS "show-locations"
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);
@@ -115,6 +118,13 @@ check_timezone_sync (void) {
} else {
g_debug("Timezones are different");
}
+
+ if (!g_settings_get_boolean(conf, SETTINGS_SHOW_LOCATIONS)) {
+ dbusmenu_menuitem_property_set_bool (locations_separator, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE);
+ dbusmenu_menuitem_property_set_bool (current_location, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE);
+ dbusmenu_menuitem_property_set_bool (geo_location, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE);
+ return;
+ }
if (geo_location != NULL && current_location != NULL) {
g_debug("Got timezone %s", current_timezone);
@@ -288,52 +298,35 @@ activate_cb (DbusmenuMenuitem * menuitem, guint timestamp, const gchar *command)
}
}
+static gboolean
+month_changed_cb (DbusmenuMenuitem * menuitem, GVariant *variant, guint timestamp)
+{
+ // TODO: * Decode the month/year from the string we received
+ // * Check what our current month/year are
+ // * Set some globals so when we-re-run update appointment menu items it gets the right start date
+ // * update appointment menu items
+ g_debug("Received month changed : %s", g_variant_get_string(variant, NULL));
+ return TRUE;
+}
+
/* Looks for the calendar application and enables the item if
we have one */
static gboolean
check_for_calendar (gpointer user_data)
{
g_return_val_if_fail (calendar != NULL, FALSE);
+
+ if (!g_settings_get_boolean(conf, SETTINGS_SHOW_CALENDAR)) return FALSE;
gchar *evo = g_find_program_in_path("evolution");
if (evo != NULL) {
g_debug("Found the calendar application: %s", evo);
dbusmenu_menuitem_property_set_bool(calendar, DBUSMENU_MENUITEM_PROP_ENABLED, TRUE);
dbusmenu_menuitem_property_set_bool(calendar, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE);
-/*
- GError *gerror = NULL;
- // TODO: In reality we should iterate sources of calendar, but getting the local one doens't lag for > a minute
- g_debug("Setting up ecal.");
- if (!ecal)
- ecal = e_cal_new_system_calendar();
-
- if (!ecal) {
- g_debug("e_cal_new_system_calendar failed");
- ecal = NULL;
- }
- g_debug("Open calendar.");
- if (!e_cal_open(ecal, FALSE, &gerror) ) {
- g_debug("e_cal_open: %s\n", gerror->message);
- g_free(ecal);
- ecal = NULL;
- }
- g_debug("Get calendar timezone.");
- if (!e_cal_get_timezone(ecal, "UTC", &tzone, &gerror)) {
- g_debug("failed to get time zone\n");
- g_free(ecal);
- ecal = NULL;
- }
-
- This timezone represents the timezone of the calendar, this might be different to the current UTC offset.
- * this means we'll have some geoclue interaction going on, and possibly the user will be involved in setting
- * their location manually, case in point: trains have satellite links which often geoclue to sweden,
- * this shouldn't automatically set the location and mess up all the appointments for the user.
-
- if (ecal) ecal_timezone = icaltimezone_get_tzid(tzone);
- */
+
DbusmenuMenuitem * separator = dbusmenu_menuitem_new();
dbusmenu_menuitem_property_set(separator, DBUSMENU_MENUITEM_PROP_TYPE, DBUSMENU_CLIENT_TYPES_SEPARATOR);
- dbusmenu_menuitem_child_add_position(root, separator, 3);
+ dbusmenu_menuitem_child_add_position(root, separator, 2);
add_appointment = dbusmenu_menuitem_new();
dbusmenu_menuitem_property_set (add_appointment, DBUSMENU_MENUITEM_PROP_LABEL, _("Add Appointment"));
@@ -342,9 +335,12 @@ check_for_calendar (gpointer user_data)
g_signal_connect(G_OBJECT(add_appointment), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(activate_cb), "evolution -c calendar");
dbusmenu_menuitem_child_add_position (root, add_appointment, 3);
- update_appointment_menu_items(NULL);
- g_signal_connect(root, DBUSMENU_MENUITEM_SIGNAL_ABOUT_TO_SHOW, G_CALLBACK(update_appointment_menu_items), NULL);
-
+ // Update the calendar items every 30 minutes if it updates the first time
+ if (update_appointment_menu_items(NULL))
+ g_timeout_add_seconds(60*30, update_appointment_menu_items, NULL);
+
+ // Connect to event::month-changed
+ g_signal_connect(calendar, "event::month-changed", G_CALLBACK(month_changed_cb), NULL);
g_free(evo);
} else {
g_debug("Unable to find calendar app.");
@@ -358,7 +354,14 @@ check_for_calendar (gpointer user_data)
static gboolean
update_timezone_menu_items(gpointer user_data) {
+ if (!g_settings_get_boolean(conf, SETTINGS_SHOW_LOCATIONS)) {
+ dbusmenu_menuitem_property_set_bool (locations_separator, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE);
+ dbusmenu_menuitem_property_set_bool (current_location, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE);
+ dbusmenu_menuitem_property_set_bool (geo_location, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE);
+ return FALSE;
+ }
g_debug("Updating timezone menu items");
+
gchar ** locations = g_settings_get_strv(conf, SETTINGS_LOCATIONS);
if (locations == NULL) {
g_debug("No locations configured (NULL)");
@@ -425,7 +428,8 @@ auth_func (ECal *ecal, const gchar *prompt, const gchar *key, gpointer user_data
else component_name = "Calendar";
gchar *password = e_passwords_get_password (component_name, key);
-
+ gboolean remember;
+
if (password == NULL) {
password = e_passwords_ask_password (
_("Enter password"),
@@ -493,6 +497,9 @@ static gboolean
update_appointment_menu_items (gpointer user_data) {
// FFR: we should take into account short term timers, for instance
// tea timers, pomodoro timers etc... that people may add, this is hinted to in the spec.
+ if (calendar == NULL) return FALSE;
+ if (!g_settings_get_boolean(conf, SETTINGS_SHOW_EVENTS)) return FALSE;
+
time_t t1, t2;
gchar *query, *is, *ie, *ad;
GList *objects = NULL, *l;
@@ -545,7 +552,6 @@ update_appointment_menu_items (gpointer user_data) {
g_signal_connect (G_OBJECT(source), "changed", G_CALLBACK (update_appointment_menu_items), NULL);
ECal *ecal = e_cal_new(source, E_CAL_SOURCE_TYPE_EVENT);
e_cal_set_auth_func (ecal, (ECalAuthFunc) auth_func, NULL);
- //icaltimezone * tzone;
if (!e_cal_open(ecal, FALSE, &gerror)) {
g_debug("Failed to get ecal sources %s", gerror->message);
@@ -558,7 +564,8 @@ update_appointment_menu_items (gpointer user_data) {
if (!e_cal_get_object_list_as_comp(ecal, query, &objects, &gerror)) {
g_debug("Failed to get objects\n");
g_free(ecal);
- return FALSE;
+ gerror = NULL;
+ continue;
}
g_debug("Number of objects returned: %d", g_list_length(objects));
diff --git a/src/dbus-shared.h b/src/dbus-shared.h
index bad8354..93ea5a1 100644
--- a/src/dbus-shared.h
+++ b/src/dbus-shared.h
@@ -27,7 +27,14 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
#define MENU_OBJ "/com/canonical/indicator/datetime/menu"
-#define DBUSMENU_CALENDAR_MENUITEM_TYPE "x-canonical-calendar-item"
+#define DBUSMENU_CALENDAR_MENUITEM_TYPE "x-canonical-calendar-item"
+
+// The following properties are not *really* properties, but are just
+// a way of accessing the calendar from the service
+#define CALENDAR_MENUITEM_PROP_MARK "calendar-mark"
+#define CALENDAR_MENUITEM_PROP_UNMARK "calendar-unmark"
+#define CALENDAR_MENUITEM_PROP_CLEAR_MARKS "calendar-clear-marks"
+
#define APPOINTMENT_MENUITEM_TYPE "appointment-item"
#define APPOINTMENT_MENUITEM_PROP_LABEL "appointment-label"
diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c
index 54b4507..e793d71 100644
--- a/src/indicator-datetime.c
+++ b/src/indicator-datetime.c
@@ -26,9 +26,11 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
#include <locale.h>
#include <langinfo.h>
#include <string.h>
+#include <time.h>
/* GStuff */
#include <glib.h>
+#include <glib/gprintf.h>
#include <glib-object.h>
#include <glib/gi18n-lib.h>
#include <gio/gio.h>
@@ -79,6 +81,9 @@ struct _IndicatorDatetimePrivate {
gchar * custom_string;
gboolean custom_show_seconds;
+ gboolean show_week_numbers;
+ gint week_start;
+
guint idle_measure;
gint max_width;
@@ -102,7 +107,8 @@ enum {
PROP_SHOW_SECONDS,
PROP_SHOW_DAY,
PROP_SHOW_DATE,
- PROP_CUSTOM_TIME_FORMAT
+ PROP_CUSTOM_TIME_FORMAT,
+ PROP_SHOW_WEEK_NUMBERS
};
typedef struct _indicator_item_t indicator_item_t;
@@ -120,6 +126,7 @@ struct _indicator_item_t {
#define PROP_SHOW_DAY_S "show-day"
#define PROP_SHOW_DATE_S "show-date"
#define PROP_CUSTOM_TIME_FORMAT_S "custom-time-format"
+#define PROP_SHOW_WEEK_NUMBERS_S "show-week-numbers"
#define SETTINGS_INTERFACE "com.canonical.indicator.datetime"
#define SETTINGS_TIME_FORMAT_S "time-format"
@@ -127,6 +134,7 @@ struct _indicator_item_t {
#define SETTINGS_SHOW_DAY_S "show-day"
#define SETTINGS_SHOW_DATE_S "show-date"
#define SETTINGS_CUSTOM_TIME_FORMAT_S "custom-time-format"
+#define SETTINGS_SHOW_WEEK_NUMBERS_S "show-week-numbers"
enum {
SETTINGS_TIME_LOCALE = 0,
@@ -247,6 +255,13 @@ indicator_datetime_class_init (IndicatorDatetimeClass *klass)
DEFAULT_TIME_FORMAT,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (object_class,
+ PROP_SHOW_WEEK_NUMBERS,
+ g_param_spec_boolean(PROP_SHOW_WEEK_NUMBERS_S,
+ "Whether to show the week numbers in the calendar.",
+ "Shows the week numbers in the monthly calendar in indicator-datetime's menu.",
+ FALSE, /* default */
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
return;
}
@@ -305,6 +320,11 @@ indicator_datetime_init (IndicatorDatetime *self)
self,
PROP_CUSTOM_TIME_FORMAT_S,
G_SETTINGS_BIND_DEFAULT);
+ g_settings_bind(self->priv->settings,
+ SETTINGS_SHOW_WEEK_NUMBERS_S,
+ self,
+ PROP_SHOW_WEEK_NUMBERS_S,
+ G_SETTINGS_BIND_DEFAULT);
} else {
g_warning("Unable to get settings for '" SETTINGS_INTERFACE "'");
}
@@ -531,6 +551,18 @@ set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec
}
break;
}
+ case PROP_SHOW_WEEK_NUMBERS: {
+ if (g_value_get_boolean(value) != self->priv->show_week_numbers) {
+ GtkCalendarDisplayOptions flags = ido_calendar_menu_item_get_display_options (self->priv->ido_calendar);
+ if (g_value_get_boolean(value) == TRUE)
+ flags |= GTK_CALENDAR_SHOW_WEEK_NUMBERS;
+ else
+ flags &= ~GTK_CALENDAR_SHOW_WEEK_NUMBERS;
+ ido_calendar_menu_item_set_display_options (self->priv->ido_calendar, flags);
+ self->priv->show_week_numbers = g_value_get_boolean(value);
+ }
+ break;
+ }
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
return;
@@ -586,6 +618,9 @@ get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspe
case PROP_CUSTOM_TIME_FORMAT:
g_value_set_string(value, self->priv->custom_string);
break;
+ case PROP_SHOW_WEEK_NUMBERS:
+ g_value_set_boolean(value, self->priv->show_week_numbers);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
return;
@@ -1224,6 +1259,15 @@ indicator_prop_change_cb (DbusmenuMenuitem * mi, gchar * prop, GVariant *value,
timezone_update_labels(mi_data);
} else if (!g_strcmp0(prop, TIMEZONE_MENUITEM_PROP_RADIO)) {
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mi_data->gmi), g_variant_get_boolean(value));
+
+ // Properties for marking and unmarking the calendar
+
+ } else if (!g_strcmp0(prop, CALENDAR_MENUITEM_PROP_MARK)) {
+ ido_calendar_menu_item_mark_day (IDO_CALENDAR_MENU_ITEM (mi_data), g_variant_get_int16(value));
+ } else if (!g_strcmp0(prop, CALENDAR_MENUITEM_PROP_UNMARK)) {
+ ido_calendar_menu_item_unmark_day (IDO_CALENDAR_MENU_ITEM (mi_data), g_variant_get_int16(value));
+ } else if (!g_strcmp0(prop, CALENDAR_MENUITEM_PROP_CLEAR_MARKS)) {
+ ido_calendar_menu_item_clear_marks (IDO_CALENDAR_MENU_ITEM (mi_data));
} else {
g_warning("Indicator Item property '%s' unknown", prop);
}
@@ -1307,6 +1351,19 @@ new_appointment_item (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, Dbu
return TRUE;
}
+static void
+month_changed_cb (IdoCalendarMenuItem *ido,
+ gpointer user_data)
+{
+ gchar datestring[20];
+ guint d,m,y;
+ ido_calendar_menu_item_get_date(ido, &y, &m, &d);
+ g_sprintf(datestring, "%d-%d-%d", y, m, d);
+ GVariant *variant = g_variant_new_string(datestring);
+ guint timestamp = (guint)time(NULL);
+ dbusmenu_menuitem_handle_event(DBUSMENU_MENUITEM(ido), "event::month-changed", variant, timestamp);
+ g_debug("Got month changed signal: %s", datestring);
+}
static gboolean
new_calendar_item (DbusmenuMenuitem * newitem,
@@ -1331,7 +1388,7 @@ new_calendar_item (DbusmenuMenuitem * newitem,
self->priv->ido_calendar = ido;
dbusmenu_gtkclient_newitem_base(DBUSMENU_GTKCLIENT(client), newitem, GTK_MENU_ITEM(ido), parent);
-
+ g_signal_connect(ido, "month-changed", G_CALLBACK(month_changed_cb), NULL);
return TRUE;
}