aboutsummaryrefslogtreecommitdiffstats
path: root/src/calendar.c
diff options
context:
space:
mode:
authorLukas Fleischer <calcurse@cryptocrack.de>2012-06-27 11:31:08 +0200
committerLukas Fleischer <calcurse@cryptocrack.de>2012-06-30 14:34:36 +0200
commit7a75415a619bd6698f45ec24f696f7b9dbb3752c (patch)
tree90a8c32c6def32e16e2454cb39e8b857dabe1062 /src/calendar.c
parent81d97315c7dad26edf1dcfba849d57c3299e0f6b (diff)
downloadcalcurse-7a75415a619bd6698f45ec24f696f7b9dbb3752c.tar.gz
calcurse-7a75415a619bd6698f45ec24f696f7b9dbb3752c.zip
Implement a cache for the monthly view
Add a very simple cache, which is used to store the days that contain an event or an appointment. This makes redrawing and browsing the calendar panel much faster. The cache has a size of 31 integers (which is equivalent to 124 bytes on a 32 bit system and 248 bytes on a 64 bit system) and invalidates itself if the current month has changed. If an item is added/changed/removed, the cache needs to be invalidated manually by calling calendar_monthly_view_cache_set_invalid(). Note that this will always invalidate the whole cache, even if only one item at the last day of the month was removed. This is a trade-off between simplicity and efficiency. Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
Diffstat (limited to 'src/calendar.c')
-rw-r--r--src/calendar.c25
1 files changed, 24 insertions, 1 deletions
diff --git a/src/calendar.c b/src/calendar.c
index a157caa..61e758b 100644
--- a/src/calendar.c
+++ b/src/calendar.c
@@ -77,6 +77,10 @@ static void (*draw_calendar[CAL_VIEWS]) (struct window *, struct date *,
unsigned) = {
draw_monthly_view, draw_weekly_view};
+static int monthly_view_cache[MAXDAYSPERMONTH];
+static int monthly_view_cache_valid = 0;
+static int monthly_view_cache_month = 0;
+
/* Switch between calendar views (monthly view is selected by default). */
void calendar_view_next(void)
{
@@ -264,6 +268,11 @@ static int date_change(struct tm *date, int delta_month, int delta_day)
}
}
+void calendar_monthly_view_cache_set_invalid(void)
+{
+ monthly_view_cache_valid = 0;
+}
+
/* Draw the monthly view inside calendar panel. */
static void
draw_monthly_view(struct window *cwin, struct date *current_day,
@@ -313,13 +322,25 @@ draw_monthly_view(struct window *cwin, struct date *current_day,
day_1_sav = (c_day_1 + 1) * 3 + c_day_1 - 7;
+ /* invalidate cache if a new month is selected */
+ if (yr * YEARINMONTHS + mo != monthly_view_cache_month) {
+ monthly_view_cache_month = yr * YEARINMONTHS + mo;
+ monthly_view_cache_valid = 0;
+ }
+
for (c_day = 1; c_day <= numdays; ++c_day, ++c_day_1, c_day_1 %= 7) {
check_day.dd = c_day;
check_day.mm = slctd_day.mm;
check_day.yyyy = slctd_day.yyyy;
/* check if the day contains an event or an appointment */
- item_this_day = day_check_if_item(check_day);
+ if (monthly_view_cache_valid) {
+ item_this_day = monthly_view_cache[c_day - 1];
+ }
+ else {
+ item_this_day = monthly_view_cache[c_day - 1] =
+ day_check_if_item(check_day);
+ }
/* Go to next line, the week is over. */
if (!c_day_1 && 1 != c_day) {
@@ -352,6 +373,8 @@ draw_monthly_view(struct window *cwin, struct date *current_day,
mvwprintw(cwin->p, ofs_y + 1,
ofs_x + day_1_sav + 4 * c_day + 1, "%2d", c_day);
}
+
+ monthly_view_cache_valid = 1;
}
static int weeknum(const struct tm *t, int firstweekday)