aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/cal-util
diff options
context:
space:
mode:
authorDamon Chaplin <damon@ximian.com>2001-05-29 10:18:00 +0800
committerDamon Chaplin <damon@src.gnome.org>2001-05-29 10:18:00 +0800
commitff523035dd2592f6ff25955e7f1e379f24640347 (patch)
tree586ea9b1c89726cace082c42865d82d61db5eb19 /calendar/cal-util
parentaaa9b9bb2ab4ff9fba2a6b9cc68fbc7fdfaa71bc (diff)
downloadgsoc2013-evolution-ff523035dd2592f6ff25955e7f1e379f24640347.tar
gsoc2013-evolution-ff523035dd2592f6ff25955e7f1e379f24640347.tar.gz
gsoc2013-evolution-ff523035dd2592f6ff25955e7f1e379f24640347.tar.bz2
gsoc2013-evolution-ff523035dd2592f6ff25955e7f1e379f24640347.tar.lz
gsoc2013-evolution-ff523035dd2592f6ff25955e7f1e379f24640347.tar.xz
gsoc2013-evolution-ff523035dd2592f6ff25955e7f1e379f24640347.tar.zst
gsoc2013-evolution-ff523035dd2592f6ff25955e7f1e379f24640347.zip
new files to contain layout code split off from EDayView an EWeekView, so
2001-05-28 Damon Chaplin <damon@ximian.com> * gui/e-week-view-layout.[hc]: * gui/e-day-view-layout.[hc]: new files to contain layout code split off from EDayView an EWeekView, so we can use it for printing. * gui/print.c: rewritten to use the same layout code as the EDayView and EWeekView widgets. * gui/gnome-cal.c (gnome_calendar_get_task_pad_cal_client): added function so we can get the CalClient used for the TaskPad for printing. * gui/Makefile.am (evolution_calendar_SOURCES): added e-day-view-layout.[hc] amd e-week-view-layout.[hc]. * cal-util/timeutil.c (time_week_begin): (time_week_end): added week_start_day argument. * cal-util/cal-recur.c: added comments describing problems in it. svn path=/trunk/; revision=10037
Diffstat (limited to 'calendar/cal-util')
-rw-r--r--calendar/cal-util/cal-recur.c18
-rw-r--r--calendar/cal-util/timeutil.c26
-rw-r--r--calendar/cal-util/timeutil.h41
3 files changed, 54 insertions, 31 deletions
diff --git a/calendar/cal-util/cal-recur.c b/calendar/cal-util/cal-recur.c
index 0b4f114484..8ac6f771d9 100644
--- a/calendar/cal-util/cal-recur.c
+++ b/calendar/cal-util/cal-recur.c
@@ -84,6 +84,24 @@
* the BYSETPOS property is used to select which of the occurrences are
* finally output. If BYSETPOS is not specified then all the occurrences are
* output.
+ *
+ *
+ * FIXME: I think there are a few errors in this code:
+ *
+ * 1) I'm not sure it should be generating events in parallel like it says
+ * above. That needs to be checked.
+ *
+ * 2) I didn't think about timezone changes when implementing this. I just
+ * assumed all the occurrences of the event would be in local time.
+ * But when clocks go back or forwards due to daylight-saving time, some
+ * special handling may be needed, especially for the shorter frequencies.
+ * e.g. for a MINUTELY frequency it should probably iterate over all the
+ * minutes before and after clocks go back (i.e. some may be the same local
+ * time but have different UTC offsets). For longer frequencies, if an
+ * occurrence lands on the overlapping or non-existant time when clocks
+ * go back/forward, then it may need to choose which of the times to use
+ * or move the time forward or something. I'm not sure this is clear in the
+ * spec.
*/
/* Define this for some debugging output. */
diff --git a/calendar/cal-util/timeutil.c b/calendar/cal-util/timeutil.c
index 764ec5d078..7bb4c904ec 100644
--- a/calendar/cal-util/timeutil.c
+++ b/calendar/cal-util/timeutil.c
@@ -319,35 +319,45 @@ time_month_end (time_t t)
return mktime (&tm);
}
+/* Returns the start of the week. week_start_day should use the same values
+ as mktime(), i.e. 0 (Sun) to 6 (Sat). */
time_t
-time_week_begin (time_t t)
+time_week_begin (time_t t, int week_start_day)
{
struct tm tm;
-
- /* FIXME: make it take week_starts_on_monday into account */
+ int offset;
tm = *localtime (&t);
+
+ /* Calculate the current offset from the week start day. */
+ offset = (tm.tm_wday + 7 - week_start_day) % 7;
+
tm.tm_hour = 0;
tm.tm_min = 0;
tm.tm_sec = 0;
- tm.tm_mday -= tm.tm_wday;
+ tm.tm_mday -= offset;
tm.tm_isdst = -1;
return mktime (&tm);
}
+/* Returns the end of the week. week_start_day should use the same values
+ as mktime(), i.e. 0 (Sun) to 6 (Sat). */
time_t
-time_week_end (time_t t)
+time_week_end (time_t t, int week_start_day)
{
struct tm tm;
-
- /* FIXME: make it take week_starts_on_monday into account */
+ int offset;
tm = *localtime (&t);
+
+ /* Calculate the current offset from the week start day. */
+ offset = (tm.tm_wday + 7 - week_start_day) % 7;
+
tm.tm_hour = 0;
tm.tm_min = 0;
tm.tm_sec = 0;
- tm.tm_mday += 7 - tm.tm_wday;
+ tm.tm_mday += 7 - offset;
tm.tm_isdst = -1;
return mktime (&tm);
diff --git a/calendar/cal-util/timeutil.h b/calendar/cal-util/timeutil.h
index 04f1ca4867..3907a11b8c 100644
--- a/calendar/cal-util/timeutil.h
+++ b/calendar/cal-util/timeutil.h
@@ -26,41 +26,36 @@ time_t time_add_month (time_t time, int months);
time_t time_add_year (time_t time, int years);
-/* Returns the number of days in the specified month. Years are full years (starting from year 1).
- * Months are in [0, 11].
- */
+/* Returns the number of days in the specified month. Years are full years
+ (starting from year 1). Months are in [0, 11]. */
int time_days_in_month (int year, int month);
-/* Converts the specified date to a time_t at the start of the specified day. Years are full years
- * (starting from year 1). Months are in [0, 11]. Days are 1-based.
- */
+/* Converts the specified date to a time_t at the start of the specified day.
+ Years are full years (starting from year 1). Months are in [0, 11].
+ Days are 1-based. */
time_t time_from_day (int year, int month, int day);
-/* For the functions below, time ranges are considered to contain the start time, but not the end
- * time.
- */
+/* For the functions below, time ranges are considered to contain the start
+ time, but not the end time. */
-/* These two functions take a time value and return the beginning or end of the corresponding year,
- * respectively.
- */
+/* These two functions take a time value and return the beginning or end of
+ the corresponding year, respectively. */
time_t time_year_begin (time_t t);
time_t time_year_end (time_t t);
-/* These two functions take a time value and return the beginning or end of the corresponding month,
- * respectively.
- */
+/* These two functions take a time value and return the beginning or end of
+ the corresponding month, respectively. */
time_t time_month_begin (time_t t);
time_t time_month_end (time_t t);
-/* These functions take a time value and return the beginning or end of the corresponding week,
- * respectively. This takes into account the global week_starts_on_monday flag.
- */
-time_t time_week_begin (time_t t);
-time_t time_week_end (time_t t);
+/* These functions take a time value and return the beginning or end of the
+ corresponding week, respectively. week_start_day should use the same values
+ as mktime(), i.e. 0 (Sun) to 6 (Sat). */
+time_t time_week_begin (time_t t, int week_start_day);
+time_t time_week_end (time_t t, int week_start_day);
-/* These two functions take a time value and return the beginning or end of the corresponding day,
- * respectively.
- */
+/* These two functions take a time value and return the beginning or end of
+ the corresponding day, respectively. */
time_t time_day_begin (time_t t);
time_t time_day_end (time_t t);