Karl Lattimer has proposed merging
lp:~karl-qdh/indicator-datetime/calendarmenuitemsignals into
lp:indicator-datetime.
Requested reviews:
Ted Gould (ted)
Related bugs:
Bug #726531 in Indicator Date and Time: Browsing calendar widget should
update appointments
https://bugs.launchpad.net/indicator-datetime/+bug/726531
For more details, see:
https://code.launchpad.net/~karl-qdh/indicator-datetime/calendarmenuitemsignals/+merge/53467
Updated code in this branch to fulfil ted's comments
Partially fixes bug #726531
--
https://code.launchpad.net/~karl-qdh/indicator-datetime/calendarmenuitemsignals/+merge/53467
Your team ayatana-commits is subscribed to branch lp:indicator-datetime.
=== modified file 'src/datetime-service.c'
--- src/datetime-service.c 2011-03-15 02:43:27 +
+++ src/datetime-service.c 2011-03-15 15:51:12 +
@@ -280,9 +280,6 @@
static gboolean
month_changed_cb (DbusmenuMenuitem * menuitem, gchar *name, GVariant *variant, guint timestamp)
{
- // BLOCKED: get type, then get type as string from the variant causes segfault in glib
- // TODO: * Set some globals so when we-re-run update appointment menu items it gets the right start date
- // * update appointment menu items
start_time_appointments = (time_t)g_variant_get_uint32(variant);
g_debug(Received month changed with timestamp: %d - %s,(int)start_time_appointments, ctime(start_time_appointments));
@@ -290,6 +287,37 @@
return TRUE;
}
+static gboolean
+day_selected_cb (DbusmenuMenuitem * menuitem, gchar *name, GVariant *variant, guint timestamp)
+{
+ start_time_appointments = (time_t)g_variant_get_uint32(variant);
+
+ g_debug(Received day-selected with timestamp: %d - %s,(int)start_time_appointments, ctime(start_time_appointments));
+ update_appointment_menu_items(NULL);
+ return TRUE;
+}
+
+static gboolean
+day_selected_double_click_cb (DbusmenuMenuitem * menuitem, gchar *name, GVariant *variant, guint timestamp)
+{
+ time_t evotime = (time_t)g_variant_get_uint32(variant);
+
+ g_debug(Received day-selected-double-click with timestamp: %d - %s,(int)evotime, ctime(evotime));
+
+ gchar *ad = isodate_from_time_t(evotime);
+ gchar *cmd = g_strconcat(evolution calendar:///?startdate=, ad, NULL);
+
+ GError * error = NULL;
+
+ g_debug(Issuing command '%s', cmd);
+ if (!g_spawn_command_line_async(cmd, error)) {
+ g_warning(Unable to start %s: %s, (char *)cmd, error-message);
+ g_error_free(error);
+ }
+
+ return TRUE;
+}
+
static guint ecaltimer = 0;
static void
@@ -365,8 +393,10 @@
stop_ecal_timer();
}
- // Connect to event::month-changed
+ // Connect to calendar events
g_signal_connect(calendar, event::month-changed, G_CALLBACK(month_changed_cb), NULL);
+ g_signal_connect(calendar, event::day-selected, G_CALLBACK(day_selected_cb), NULL);
+ g_signal_connect(calendar, event::day-selected-double-click, G_CALLBACK(day_selected_double_click_cb), NULL);
g_free(evo);
} else {
g_debug(Unable to find calendar app.);
@@ -543,27 +573,51 @@
if (updating_appointments) return TRUE;
updating_appointments = TRUE;
- time_t t1, t2;
+ time_t curtime = 0, t1 = 0, t2 = 0;
gchar *ad;
GList *l;
GSList *g;
GError *gerror = NULL;
gint i;
- gint width, height;
+ gint width = 0, height = 0;
ESourceList * sources = NULL;
-
- if (start_time_appointments 0)
- t1 = start_time_appointments;
- else
- time(t1);
-
- /* TODO: 7 days ahead of now, we actually need number_of_days_in_this_month
- * so we call mark-day for all remaining days in this month
- * N.B. Ideally we want any/all dates which are later than today to be marked.
- */
- t2 = t1 + (time_t) (7 * 24 * 60 * 60);
-
- // TODO Remove all highlights from the calendar widget
+
+ // Get today work out query times
+ time(curtime);
+ struct tm *today = localtime(curtime);
+ const int mday = today-tm_mday;
+ const int mon = today-tm_mon;
+ const int year = today-tm_year;
+
+ struct tm *start_tm = NULL;
+ int this_year = today-tm_year + 1900;
+ int days[12]={31,28,31,30,31,30,31,31,30,31,30,31};
+ if ((this_year % 400 == 0) || (this_year % 100 0 this_year % 4 == 0)) days[1] = 29;
+
+ int highlightdays = days[mon] - mday + 1;
+ t1 = curtime; // By default the current time is the appointment start time.
+
+ if (start_time_appointments 0) {
+ start_tm = localtime(start_time_appointments);
+ int start_month = start_tm-tm_mon;
+ int start_year = start_tm-tm_year + 1900;
+ if ((start_month != mon) || (start_year != this_year)) {
+ // Set t1 to the start of that month.
+ struct tm month_start = {0};
+ month_start.tm_year = start_tm-tm_year;
+ month_start.tm_mon = start_tm-tm_mon;
+ month_start.tm_mday = 1;
+ t1 = mktime(month_start);
+ highlightdays = days[mon];
+ }
+ }
+
+ g_debug(Will highlight %d days from %s, highlightdays, ctime(t1));
+
+ t2 = t1 + (time_t) (highlightdays * 24 * 60 * 60);
+
+ // Remove all highlights from the calendar widget
+ dbusmenu_menuitem_property_set (calendar,