← Back to team overview

ayatana-commits team mailing list archive

[Merge] lp:~karl-qdh/indicator-datetime/calendarmenuitemsignals into lp:indicator-datetime

 

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/53212

Updated code in this branch to fulfil ted's comments

Partially fixes bug #726531
-- 
https://code.launchpad.net/~karl-qdh/indicator-datetime/calendarmenuitemsignals/+merge/53212
Your team ayatana-commits is subscribed to branch lp:indicator-datetime.
=== modified file 'src/datetime-service.c'
--- src/datetime-service.c	2011-03-10 15:05:51 +0000
+++ src/datetime-service.c	2011-03-14 10:02:49 +0000
@@ -82,6 +82,7 @@
 static GList			* dconflocations = NULL;
 static GList			* comp_instances = NULL;
 static gboolean           updating_appointments = FALSE;
+static time_t			  start_time_appointments = (time_t) 0;
 GSettings *conf;
 
 
@@ -277,14 +278,15 @@
 }
 
 static gboolean
-month_changed_cb (DbusmenuMenuitem * menuitem, GVariant *variant, guint timestamp)
+month_changed_cb (DbusmenuMenuitem * menuitem, gchar *name, GVariant *variant, guint timestamp)
 {
-	// BLOCKED: We're not getting the signal from calendar the ido calendar menuitem
-	// 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
+	// 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
-	g_debug("Received month changed : %s", g_variant_get_string(variant, NULL));
+	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));	
+	update_appointment_menu_items(NULL);
 	return TRUE;
 }
 
@@ -535,6 +537,7 @@
 {
 	// 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.
+	g_debug("Update appointments called");
 	if (calendar == NULL) return FALSE;
 	if (!g_settings_get_boolean(conf, SETTINGS_SHOW_EVENTS_S)) return FALSE;
 	if (updating_appointments) return TRUE;
@@ -543,29 +546,22 @@
 	time_t t1, t2;
 	gchar *ad;
 	GList *l;
-	//GList *allobjects = NULL;
 	GSList *g;
 	GError *gerror = NULL;
 	gint i;
 	gint width, height;
 	ESourceList * sources = NULL;
 	
-	time(&t1);
-	time(&t2);
-	t2 += (time_t) (7 * 24 * 60 * 60); /* 7 days ahead of now, we actually need number_of_days_in_this_month */
+	if (start_time_appointments > 0)
+		t1 = start_time_appointments;
+	else
+		time(&t1);
 
-	/* Remove all of the previous appointments */
-	if (appointments != NULL) {
-		g_debug("Freeing old appointments");
-		while (appointments != NULL) {
-			DbusmenuMenuitem * litem =  DBUSMENU_MENUITEM(appointments->data);
-			g_debug("Freeing old appointment: %p", litem);
-			// Remove all the existing menu items which are in appointments.
-			appointments = g_list_remove(appointments, litem);
-			dbusmenu_menuitem_child_delete(root, DBUSMENU_MENUITEM(litem));
-			g_object_unref(G_OBJECT(litem));
-		}
-	}
+	/* 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
 	
@@ -609,11 +605,27 @@
 	g_debug("Number of ECalComponents returned: %d", g_list_length(comp_instances));
 	GList *sorted_comp_instances = g_list_sort(comp_instances, compare_comp_instances);
 	comp_instances = NULL;
-	
-	gtk_icon_size_lookup(GTK_ICON_SIZE_MENU, &width, &height);
+
+	/* Remove all of the previous appointments */
+	if (appointments != NULL) {
+		g_debug("Freeing old appointments");
+		while (appointments != NULL) {
+			DbusmenuMenuitem * litem =  DBUSMENU_MENUITEM(appointments->data);
+			g_debug("Freeing old appointment: %p", litem);
+			// Remove all the existing menu items which are in appointments.
+			appointments = g_list_remove(appointments, litem);
+			dbusmenu_menuitem_child_delete(root, DBUSMENU_MENUITEM(litem));
+			g_object_unref(G_OBJECT(litem));
+		}
+	}
+
+	gtk_icon_size_lookup(GTK_ICON_SIZE_MENU, &width, &height); 
+	// Sometimes these give negative numbers, sometimes large numbers which look like timestamps
+	// is there a buffer overwrite causing it?
 	if (width <= 0) width = 12;
-	if (height <= 0) height = 13;
-	
+	if (height <= 0) height = 12;
+	if (width > 30) width = 12;
+	if (height > 30) height = 12;
 	i = 0;
 	for (l = sorted_comp_instances; l; l = l->next) {
 		struct comp_instance *ci = l->data;
@@ -669,7 +681,7 @@
 		else
 			strftime(right, 20, "%a %l:%M %p", due);
 			
-		g_debug("Appointment time: %s", right);
+		g_debug("Appointment time: %s, for date %s", right, asctime(due));
 		dbusmenu_menuitem_property_set (item, APPOINTMENT_MENUITEM_PROP_RIGHT, right);
 		
 		// Now we pull out the URI for the calendar event and try to create a URI that'll work when we execute evolution

=== modified file 'src/dbus-shared.h'
--- src/dbus-shared.h	2011-03-03 18:51:26 +0000
+++ src/dbus-shared.h	2011-03-14 10:02:49 +0000
@@ -34,6 +34,7 @@
 #define CALENDAR_MENUITEM_PROP_MARK        "calendar-mark"
 #define CALENDAR_MENUITEM_PROP_UNMARK      "calendar-unmark"
 #define CALENDAR_MENUITEM_PROP_CLEAR_MARKS "calendar-clear-marks"
+#define CALENDAR_MENUITEM_PROP_SET_DATE    "calendar-set-date"
 
 
 #define APPOINTMENT_MENUITEM_TYPE          "appointment-item"	

=== modified file 'src/indicator-datetime.c'
--- src/indicator-datetime.c	2011-03-11 04:50:30 +0000
+++ src/indicator-datetime.c	2011-03-14 10:02:49 +0000
@@ -1153,6 +1153,10 @@
 		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 if (!g_strcmp0(prop, CALENDAR_MENUITEM_PROP_SET_DATE)) {
+		gint *array = g_variant_get_fixed_array(value, 3, sizeof(gint));
+		// TODO: Needs ido branch merged - lp:~karl-qdh/ido/select-activate-set-date
+		//ido_calendar_menu_item_set_date (IDO_CALENDAR_MENU_ITEM (mi_data), array[0], array[1], array[2]);
 	} else {
 		g_warning("Indicator Item property '%s' unknown", prop);
 	}
@@ -1240,16 +1244,61 @@
 month_changed_cb (IdoCalendarMenuItem *ido, 
                   gpointer        user_data) 
 {
-	gchar datestring[20];
-	guint d,m,y;
-	DbusmenuMenuitem * item = DBUSMENU_MENUITEM (user_data);
-	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(item), "event::month-changed", variant, timestamp);
-	g_debug("Got month changed signal: %s", datestring);
-}
+	guint d,m,y;
+	DbusmenuMenuitem * item = DBUSMENU_MENUITEM (user_data);
+	ido_calendar_menu_item_get_date(ido, &y, &m, &d);
+	struct tm date = {0};
+	date.tm_mday = d;
+	date.tm_mon = m;
+	date.tm_year = y - 1900;
+	guint selecteddate = (guint)mktime(&date);
+	g_debug("Got month changed signal: %s", asctime(&date));
+	GVariant *variant = g_variant_new_uint32(selecteddate);
+	guint timestamp = (guint)time(NULL);
+	dbusmenu_menuitem_handle_event(DBUSMENU_MENUITEM(item), "month-changed", variant, timestamp);
+}
+
+// TODO: Needs ido branch merged - lp:~karl-qdh/ido/select-activate-set-date
+/*	
+static void
+day_selected_cb (IdoCalendarMenuItem *ido,
+				  guint           day,
+                  gpointer        user_data) 
+{
+	guint d,m,y;
+	DbusmenuMenuitem * item = DBUSMENU_MENUITEM (user_data);
+	ido_calendar_menu_item_get_date(ido, &y, &m, &d);
+	struct tm date = {0};
+	date.tm_mday = d;
+	date.tm_mon = m;
+	date.tm_year = y - 1900;
+	guint selecteddate = (guint)mktime(&date);
+	g_debug("Got day selected signal: %s", asctime(&date));
+	GVariant *variant = g_variant_new_uint32(selecteddate);
+	guint timestamp = (guint)time(NULL);
+	dbusmenu_menuitem_handle_event(DBUSMENU_MENUITEM(item), "day-selected", variant, timestamp);
+}
+
+static void
+day_selected_double_click_cb (IdoCalendarMenuItem *ido,
+				              guint           day,
+                              gpointer        user_data) 
+{
+	guint d,m,y;
+	DbusmenuMenuitem * item = DBUSMENU_MENUITEM (user_data);
+	ido_calendar_menu_item_get_date(ido, &y, &m, &d);
+	struct tm date = {0};
+	date.tm_mday = d;
+	date.tm_mon = m;
+	date.tm_year = y - 1900;
+	guint selecteddate = (guint)mktime(&date);
+	g_debug("Got day selected double click signal: %s", asctime(&date));
+	GVariant *variant = g_variant_new_uint32(selecteddate);
+	guint timestamp = (guint)time(NULL);
+	dbusmenu_menuitem_handle_event(DBUSMENU_MENUITEM(item), "day-selected-double-click", variant, timestamp);
+}
+*/
+
 
 static gboolean
 new_calendar_item (DbusmenuMenuitem * newitem,
@@ -1284,6 +1333,11 @@
 
 	dbusmenu_gtkclient_newitem_base(DBUSMENU_GTKCLIENT(client), newitem, GTK_MENU_ITEM(ido), parent);
 	g_signal_connect_after(ido, "month-changed", G_CALLBACK(month_changed_cb), (gpointer)newitem);
+	
+	// TODO: Needs ido branch merged - lp:~karl-qdh/ido/select-activate-set-date
+	/*g_signal_connect_after(ido, "day-selected", G_CALLBACK(day_selected_cb), (gpointer)newitem);
+	g_signal_connect_after(ido, "day-selected-double-click", G_CALLBACK(day_selected_double_click_cb), (gpointer)newitem);*/
+
 	return TRUE;
 }
 


Follow ups