[Xfce4-commits] <orage:master> 4.8.1.3 Fixed bug 7427 alarms not always working right

Juha Kautto noreply at xfce.org
Wed Jul 6 15:56:02 CEST 2011


Updating branch refs/heads/master
         to 5c1745f6f2dfc6578574a53bc27f467713656fcd (commit)
       from 6c8258c3907d8d05fc0dcc9e14d5bf76f97560bb (commit)

commit 5c1745f6f2dfc6578574a53bc27f467713656fcd
Author: Juha Kautto <juha at xfce.org>
Date:   Wed Jul 6 16:51:19 2011 +0300

    4.8.1.3 Fixed bug 7427 alarms not always working right
    
    Two fixes:
    1) alarms were working wrong when weekday specific repeating appointment was
    used.
    2) full day events caused wrong icon tooltip to be shown.

 configure.in.in |    2 +-
 src/ical-code.c |   61 +++++++++++++++++++++++++++++++++++++-----------------
 src/reminder.c  |   15 +++++++++++-
 3 files changed, 56 insertions(+), 22 deletions(-)

diff --git a/configure.in.in b/configure.in.in
index b4c997b..de82fff 100644
--- a/configure.in.in
+++ b/configure.in.in
@@ -9,7 +9,7 @@ dnl Written for Xfce by Juha Kautto <juha at xfce.org>
 dnl
 
 dnl Version information
-m4_define([orage_version], [4.8.1.2-git])
+m4_define([orage_version], [4.8.1.3-git])
 
 m4_define([gtk_minimum_version], [2.10.0])
 m4_define([xfce_minimum_version], [4.6.0])
diff --git a/src/ical-code.c b/src/ical-code.c
index e726103..8a70d5d 100644
--- a/src/ical-code.c
+++ b/src/ical-code.c
@@ -2589,7 +2589,13 @@ static alarm_struct *process_alarm_trigger(icalcomponent *c
         rel = ICAL_RELATED_START;
     per = ic_get_period(c, TRUE);
     next_alarm_time = count_alarm_time(per, cur_time, trg.duration, rel);
-    alarm_start_diff = icaltime_subtract(per.stime, next_alarm_time);
+    alarm_start_diff = icaltime_subtract(next_alarm_time, per.stime);
+/*
+orage_message(120, P_N "current %s", icaltime_as_ical_string(cur_time));
+orage_message(120, P_N "Start %s", icaltime_as_ical_string(per.stime));
+orage_message(120, P_N "End %s", icaltime_as_ical_string(per.etime));
+orage_message(120, P_N "Alarm %s", icaltime_as_ical_string(next_alarm_time));
+*/
     /* we only have ctime for TODOs and only if todo has been completed.
      * So if we have ctime, we need to compare against it instead of 
      * current date */
@@ -2614,42 +2620,46 @@ static alarm_struct *process_alarm_trigger(icalcomponent *c
         rrule = icalproperty_get_rrule(p);
         set_todo_times(c, &per); /* may change per.stime to be per.ctime */
         next_alarm_time = count_alarm_time(per, cur_time, trg.duration, rel);
-        alarm_start_diff = icaltime_subtract(per.stime, next_alarm_time);
-        ri = icalrecur_iterator_new(rrule, next_alarm_time);
-        for (next_alarm_time = icalrecur_iterator_next(ri),
-             next_start_time = icaltime_add(next_alarm_time, alarm_start_diff);
-             !icaltime_is_null_time(next_alarm_time)
+/*
+orage_message(120, P_N "rec Start %s", icaltime_as_ical_string(per.stime));
+orage_message(120, P_N "rec End %s", icaltime_as_ical_string(per.etime));
+orage_message(120, P_N "rec Alarm %s", icaltime_as_ical_string(next_alarm_time));
+*/
+        alarm_start_diff = icaltime_subtract(next_alarm_time, per.stime);
+        ri = icalrecur_iterator_new(rrule, per.stime);
+        for (next_start_time = icalrecur_iterator_next(ri),
+             next_alarm_time = icaltime_add(next_start_time, alarm_start_diff);
+             !icaltime_is_null_time(next_start_time)
              && ((per.ikind == ICAL_VTODO_COMPONENT
                   && icaltime_compare(next_start_time, per.ctime) <= 0)
                  || (per.ikind != ICAL_VTODO_COMPONENT 
                      && icaltime_compare(next_alarm_time, cur_time) <= 0)
                  || icalproperty_recurrence_is_excluded(c
                          , &per.stime, &next_start_time));
-            next_alarm_time = icalrecur_iterator_next(ri),
-            next_start_time = icaltime_add(next_alarm_time, alarm_start_diff)) {
+            next_start_time = icalrecur_iterator_next(ri),
+            next_alarm_time = icaltime_add(next_start_time, alarm_start_diff)) {
             /* we loop = search next active alarm time as long as 
-             * next_alarm_time is not null = real alarm time still found
-             * and if TODO and next_alarm_time before complete time
+             * next_start_time is not null = real start time still found
+             * and if TODO and next_start_time before complete time
              * or if not TODO (= EVENT) and next_alarm_time before current time
              */
             (*cnt_repeat)++;
+/*
+orage_message(120, P_N "rec loop Alarm start:%s alarm:%s", icaltime_as_ical_string(next_start_time), icaltime_as_ical_string(next_alarm_time));
+*/
         }
         icalrecur_iterator_free(ri);
         if (icaltime_compare(cur_time, next_alarm_time) <= 0) {
             trg_active = TRUE;
         }
+/*
+orage_message(120, P_N "rec loop end Alarm start:%s alarm:%s", icaltime_as_ical_string(next_start_time), icaltime_as_ical_string(next_alarm_time));
+*/
     }
 
     if (!trg_active)
         next_alarm_time = icaltime_null_time();
 
-    /* alarm_start_diff goes from alarm to start, so we need to revert it
-     * 1) here (temporarily) since rdate is start time and we need to get the 
-     * alarm time. */
-    if (alarm_start_diff.is_neg)
-        alarm_start_diff.is_neg = 0;
-    else 
-        alarm_start_diff.is_neg = 1;
     /* this is used to convert rdate to local time. We need to read it here
      * so that it does not break the loop handling since it resets the
      * iterator */
@@ -2683,7 +2693,7 @@ static alarm_struct *process_alarm_trigger(icalcomponent *c
             rdate_period.time = convert_to_local_timezone(rdate_period.time, p);
         }
 
-        /* 1) then we still need to convert it from start time to alarm time */
+        /* we still need to convert it from start time to alarm time */
         rdate_alarm_time = icaltime_add(rdate_period.time, alarm_start_diff);
         /*
         g_print(P_N "**** RDATE alarm time (%s) next alarm time (%s) period time (%s)(%s)\n", icaltime_as_ical_string(rdate_alarm_time), icaltime_as_ical_string(next_alarm_time), icaltime_as_ical_string(rdate_period.time), ic_get_char_timezone(p));
@@ -2714,7 +2724,8 @@ static alarm_struct *process_alarm_trigger(icalcomponent *c
         new_alarm = g_new0(alarm_struct, 1);
         next_alarm_time = icaltime_convert_to_zone(next_alarm_time, local_icaltimezone);
         new_alarm->alarm_time = g_strdup(icaltime_as_ical_string(next_alarm_time));
-        /* convert the diff back */
+    /* alarm_start_diff goes from start to alarm, so we need to revert it
+     * here since now we need to get the start time from alarm. */
         if (alarm_start_diff.is_neg)
             alarm_start_diff.is_neg = 0;
         else 
@@ -2927,6 +2938,10 @@ static void xfical_alarm_build_list_internal_real(gboolean first_list_today
                 new_alarm->description = orage_process_text_commands(
                         (char *)icalcomponent_get_description(c));
             alarm_add(new_alarm);
+/*
+	    orage_message(60, "new alarm: alarm:%s action:%s title:%s\n"
+		, new_alarm->alarm_time, new_alarm->action_time, new_alarm->title);
+*/
             cnt_alarm_add++;
         }
     }  /* COMPONENT */
@@ -2936,6 +2951,14 @@ static void xfical_alarm_build_list_internal_real(gboolean first_list_today
         orage_message(60, _("\tFound %d alarms of which %d are active. (Searched %d recurring alarms.)")
                 , cnt_alarm, cnt_act_alarm, cnt_repeat);
     }
+/*
+    else {
+        orage_message(60, _("Build alarm list: Added %d alarms. Processed %d events.")
+                , cnt_alarm_add, cnt_event);
+        orage_message(60, _("\tFound %d alarms of which %d are active. (Searched %d recurring alarms.)")
+                , cnt_alarm, cnt_act_alarm, cnt_repeat);
+    }
+*/
 }
 
 static void xfical_alarm_build_list_internal(gboolean first_list_today)
diff --git a/src/reminder.c b/src/reminder.c
index fccef05..dcca425 100644
--- a/src/reminder.c
+++ b/src/reminder.c
@@ -1054,8 +1054,16 @@ static gboolean orage_tooltip_update(gpointer user_data)
         /* remember that it is sorted list */
         cur_alarm = (alarm_struct *)alarm_l->data;
         if (alarm_cnt < tooltip_alarm_limit) {
-            sscanf(cur_alarm->alarm_time, XFICAL_APPT_TIME_FORMAT
-                    , &year, &month, &day, &hour, &minute, &second);
+            if (strlen(cur_alarm->alarm_time) < XFICAL_APPT_DATE_FORMAT_LEN) { 
+               /* it is date = full day */
+                sscanf(cur_alarm->alarm_time, XFICAL_APPT_DATE_FORMAT
+                        , &year, &month, &day);
+                hour = 0; minute = 0; second = 0;
+            }
+            else {
+                sscanf(cur_alarm->alarm_time, XFICAL_APPT_TIME_FORMAT
+                        , &year, &month, &day, &hour, &minute, &second);
+            }
             g_now = g_date_new_dmy(t->tm_mday, t->tm_mon + 1
                     , t->tm_year + 1900);
             g_alarm = g_date_new_dmy(day, month, year);
@@ -1072,6 +1080,9 @@ static gboolean orage_tooltip_update(gpointer user_data)
                 hh += 24;
                 dd -= 1;
             }
+/*
+    orage_message(10, P_N "tooltip: alarm=%s hh=%d hh=%d min=%d", cur_alarm->alarm_time, dd, hh, min);
+*/
 #if GTK_CHECK_VERSION(2,16,0)
             g_string_append(tooltip, "<span weight=\"bold\">");
             tooltip_highlight_helper = g_string_new(" </span>");



More information about the Xfce4-commits mailing list