aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/mark.c
diff options
context:
space:
mode:
Diffstat (limited to 'calendar/mark.c')
-rw-r--r--calendar/mark.c118
1 files changed, 118 insertions, 0 deletions
diff --git a/calendar/mark.c b/calendar/mark.c
index 6aab8b1b74..f3725bb7e5 100644
--- a/calendar/mark.c
+++ b/calendar/mark.c
@@ -61,6 +61,7 @@ mark_current_day (GnomeMonthItem *mitem)
item = gnome_month_item_num2child (mitem, GNOME_MONTH_ITEM_DAY_LABEL + day_index);
gnome_canvas_item_set (item,
"fill_color", color_spec_from_prop (COLOR_PROP_CURRENT_DAY_FG),
+ "font", CURRENT_DAY_FONT,
NULL);
}
}
@@ -115,4 +116,121 @@ unmark_month_item (GnomeMonthItem *mitem)
gnome_canvas_item_set (GNOME_CANVAS_ITEM (mitem),
"day_color", color_spec_from_prop (COLOR_PROP_DAY_FG),
NULL);
+
+ gnome_canvas_item_set (GNOME_CANVAS_ITEM (mitem),
+ "day_font", NORMAL_DAY_FONT,
+ NULL);
+}
+
+/* Frees the prelight information in the month item when it is destroyed */
+static void
+free_prelight_info (GtkObject *object, gpointer data)
+{
+ g_free (gtk_object_get_data (object, "prelight_info"));
+}
+
+/* Handles EnterNotify and LeaveNotify events from the month item's day groups, and performs
+ * appropriate prelighting.
+ */
+static gint
+day_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data)
+{
+ GnomeCanvasItem *mitem;
+ GnomeCanvasItem *box;
+ int child_num, day;
+ gulong *day_pixels;
+ GetPrelightColorFunc func;
+ gpointer func_data;
+ char *spec;
+ GdkColor color;
+
+ mitem = data;
+ child_num = gnome_month_item_child2num (GNOME_MONTH_ITEM (mitem), item);
+ day = gnome_month_item_num2day (GNOME_MONTH_ITEM (mitem), child_num);
+
+ if (day == 0)
+ return FALSE; /* it was a day outside the month's range */
+
+ child_num -= GNOME_MONTH_ITEM_DAY_GROUP;
+ box = gnome_month_item_num2child (GNOME_MONTH_ITEM (mitem), GNOME_MONTH_ITEM_DAY_BOX + child_num);
+
+ day_pixels = gtk_object_get_data (GTK_OBJECT (mitem), "prelight_info_pixels");
+ func = gtk_object_get_data (GTK_OBJECT (mitem), "prelight_info_func");
+ func_data = gtk_object_get_data (GTK_OBJECT (mitem), "prelight_info_data");
+
+ switch (event->type) {
+ case GDK_ENTER_NOTIFY:
+ spec = (* func) (func_data);
+ gnome_canvas_item_set (box,
+ "fill_color", spec,
+ NULL);
+ break;
+
+ case GDK_LEAVE_NOTIFY:
+ color.pixel = day_pixels[child_num];
+ gnome_canvas_item_set (box,
+ "fill_color_gdk", &color,
+ NULL);
+ break;
+
+ default:
+ break;
+ }
+
+ return FALSE;
+}
+
+void
+month_item_prepare_prelight (GnomeMonthItem *mitem, GetPrelightColorFunc func, gpointer func_data)
+{
+ gulong *day_pixels;
+ GnomeCanvasItem *day_group;
+ GnomeCanvasItem *box;
+ GtkArg arg;
+ GdkColor *color;
+ int i;
+
+ day_pixels = gtk_object_get_data (GTK_OBJECT (mitem), "prelight_info_pixels");
+
+ /* Set up the buffer for day background colors and attach it to the month item, if necessary */
+
+ if (!day_pixels) {
+ /* Create the buffer and attach it */
+
+ day_pixels = g_new (gulong, 42);
+ gtk_object_set_data (GTK_OBJECT (mitem), "prelight_info_pixels", day_pixels);
+ gtk_object_set_data (GTK_OBJECT (mitem), "prelight_info_func", func);
+ gtk_object_set_data (GTK_OBJECT (mitem), "prelight_info_data", func_data);
+ gtk_signal_connect (GTK_OBJECT (mitem), "destroy",
+ (GtkSignalFunc) free_prelight_info,
+ NULL);
+
+ /* Connect the appropriate signals to perform prelighting */
+
+ for (i = 0; i < 42; i++) {
+ day_group = gnome_month_item_num2child (GNOME_MONTH_ITEM (mitem), GNOME_MONTH_ITEM_DAY_GROUP + i);
+ gtk_signal_connect (GTK_OBJECT (day_group), "event",
+ (GtkSignalFunc) day_event,
+ mitem);
+ }
+ }
+
+ /* Fetch the background colors from the day boxes and store them in the prelight info */
+
+ for (i = 0; i < 42; i++) {
+ box = gnome_month_item_num2child (mitem, GNOME_MONTH_ITEM_DAY_BOX + i);
+
+ arg.name = "fill_color_gdk";
+ gtk_object_getv (GTK_OBJECT (box), 1, &arg);
+
+ color = GTK_VALUE_BOXED (arg);
+ day_pixels[i] = color->pixel;
+ g_free (color);
+ }
+}
+
+char *
+default_prelight_func (gpointer data)
+{
+ return color_spec_from_prop (COLOR_PROP_PRELIGHT_DAY_BG);
}