Author: juha
Date: 2007-10-27 21:45:04 +0000 (Sat, 27 Oct 2007)
New Revision: 26202

Modified:
   xfcalendar/trunk/src/functions.c
   xfcalendar/trunk/src/ical-code.c
   xfcalendar/trunk/src/interface.c
   xfcalendar/trunk/src/main.c
   xfcalendar/trunk/src/parameters.h
   xfcalendar/trunk/src/reminder.c
   xfcalendar/trunk/src/reminder.h
Log:
do less timeouts in Orage. No alarm timer fires only when needed.
tooltip timer still fires every 60 seconds if trayicon is used.
foreign files change check still fires every 30 secs if foreign files are in 
use.


Modified: xfcalendar/trunk/src/functions.c
===================================================================
--- xfcalendar/trunk/src/functions.c    2007-10-26 18:56:01 UTC (rev 26201)
+++ xfcalendar/trunk/src/functions.c    2007-10-27 21:45:04 UTC (rev 26202)
@@ -85,7 +85,8 @@
             cur_t.tm_year -= 1900;
             date_to_display = orage_tm_date_to_i18_date(&cur_t);
             */
-            date_to_display = orage_cal_to_i18_date(selDate_Calendar_calendar);
+            date_to_display = orage_cal_to_i18_date(
+                    GTK_CALENDAR(selDate_Calendar_calendar));
             break;
         case 1:
             /*
@@ -215,7 +216,7 @@
 
 char *orage_tm_time_to_icaltime(struct tm *t)
 {
-    static char icaltime[32];
+    static char icaltime[XFICAL_APPT_TIME_FORMAT_LEN];
 
     g_sprintf(icaltime, XFICAL_APPT_TIME_FORMAT
             , t->tm_year + 1900, t->tm_mon + 1, t->tm_mday

Modified: xfcalendar/trunk/src/ical-code.c
===================================================================
--- xfcalendar/trunk/src/ical-code.c    2007-10-26 18:56:01 UTC (rev 26201)
+++ xfcalendar/trunk/src/ical-code.c    2007-10-27 21:45:04 UTC (rev 26202)
@@ -2983,6 +2983,7 @@
         xfical_alarm_build_list_internal_real(first_list_today, f_ical[i].ical
                 , file_type);
     }
+    setup_orage_alarm_clock();
 }
 
 void xfical_alarm_build_list(gboolean first_list_today)

Modified: xfcalendar/trunk/src/interface.c
===================================================================
--- xfcalendar/trunk/src/interface.c    2007-10-26 18:56:01 UTC (rev 26201)
+++ xfcalendar/trunk/src/interface.c    2007-10-27 21:45:04 UTC (rev 26202)
@@ -87,6 +87,7 @@
     gint i;
     gboolean changes_present = FALSE;
 
+    g_print("orage_foreign_files_check: start\n");
     if (!latest_foreign_file_change)
         latest_foreign_file_change = time(NULL);
 
@@ -108,8 +109,11 @@
         orage_mark_appointments();
     }
 
-    /* keep running */
-    return (TRUE);
+    /* keep running ? */
+    if (g_par.foreign_count)
+        return(TRUE);
+    else /* no need to check changes if we do not have any files */
+        return(FALSE);
 }
 
 static void on_destroy(GtkWidget *window, gpointer user_data)
@@ -694,6 +698,8 @@
     write_parameters();
     orage_mark_appointments();
     xfical_alarm_build_list(FALSE);
+    if (g_par.foreign_count == 1) /* we just added our first foreign file */
+        g_timeout_add(30*1000, (GtkFunction) orage_foreign_files_check, NULL);
     return(TRUE);
 }
 

Modified: xfcalendar/trunk/src/main.c
===================================================================
--- xfcalendar/trunk/src/main.c 2007-10-26 18:56:01 UTC (rev 26201)
+++ xfcalendar/trunk/src/main.c 2007-10-27 21:45:04 UTC (rev 26202)
@@ -487,13 +487,12 @@
     orage_mark_appointments();
     */
     mCalendar_month_changed_cb(g_par.xfcal->mCalendar, NULL);
+    g_par.day_timer = 0;
+    orage_day_change(NULL); /* first day change after we start */
 
-    /* start alarm monitoring timeout */
-    g_timeout_add_full(0, 1000, (GtkFunction) orage_alarm_clock
-            , (gpointer) g_par.xfcal, NULL);
-
-    /* start monitoring foreign file updates */
-    g_timeout_add(30*1000, (GtkFunction) orage_foreign_files_check, NULL);
+    /* start monitoring foreign file updates if we have foreign files */
+    if (g_par.foreign_count)
+        g_timeout_add(30*1000, (GtkFunction) orage_foreign_files_check, NULL);
                                                         
     /* let's check if I got filename as a parameter */
     initialized = TRUE;

Modified: xfcalendar/trunk/src/parameters.h
===================================================================
--- xfcalendar/trunk/src/parameters.h   2007-10-26 18:56:01 UTC (rev 26201)
+++ xfcalendar/trunk/src/parameters.h   2007-10-27 21:45:04 UTC (rev 26202)
@@ -75,6 +75,11 @@
     /* List of active alarms */
     GList *alarm_list;
 
+    /* alarm timer id and timeout in millisecs */
+    guint alarm_timer; /* monitors next alarm */
+    guint day_timer;   /* fires when day changes = every 24 hours */
+    guint tooltip_timer; /* keeps tooltips upto date */
+
     /* main window */
     CalWin *xfcal;
     gint pos_x, pos_y;

Modified: xfcalendar/trunk/src/reminder.c
===================================================================
--- xfcalendar/trunk/src/reminder.c     2007-10-26 18:56:01 UTC (rev 26201)
+++ xfcalendar/trunk/src/reminder.c     2007-10-27 21:45:04 UTC (rev 26202)
@@ -55,6 +55,8 @@
 #include "parameters.h"
 
 void create_notify_reminder(alarm_struct *alarm);
+gboolean orage_alarm_clock(gpointer user_data);
+gboolean orage_tooltip_update(gpointer user_data);
 
 
 static void alarm_free_memory(alarm_struct *alarm)
@@ -366,32 +368,56 @@
         */
 }
 
-gboolean orage_alarm_clock(gpointer user_data)
+gboolean reset_orage_day_change(gboolean changed)
 {
-    CalWin *xfcal = (CalWin *)user_data;
     struct tm *t;
+    gint secs_left;
+
+    if (changed) { /* date was change, need to count next change time */
+        t = orage_localtime();
+        /* t format is 23:59:59 -> 00:00:00 so we can use 
+         * 24:00:00 to represent next day.
+         * Let's find out how much time we have until it happens */
+        secs_left = 60*60*(24 - t->tm_hour) - 60*t->tm_min - t->tm_sec;
+        /*
+        if (g_par.day_timer) { / * first time it is not active yet * /
+            g_source_remove(g_par.day_timer);
+        }
+        */
+        g_par.day_timer = g_timeout_add(secs_left * 1000
+                , (GtkFunction) orage_day_change, NULL);
+    }
+    else { /* the change did not happen. Need to try again asap. */
+        /*
+        g_source_remove(g_par.day_timer);
+        */
+        g_par.day_timer = g_timeout_add(1 * 1000
+                , (GtkFunction) orage_day_change, NULL);
+    }
+    return(TRUE);
+}
+
+/* fire after the date has changed and setup the icon 
+ * and change the date in the mainwindow
+ */
+gboolean orage_day_change(gpointer user_data)
+{
+    CalWin *xfcal;
+    struct tm *t;
     static guint previous_year=0, previous_month=0, previous_day=0;
     guint selected_year=0, selected_month=0, selected_day=0;
     guint current_year=0, current_month=0, current_day=0;
-    GList *alarm_l;
-    alarm_struct *cur_alarm;
-    gboolean alarm_raised=FALSE;
-    gboolean more_alarms=TRUE;
-    gchar time_now[XFICAL_APPT_TIME_FORMAT_LEN];
-    GString *tooltip=NULL;
-    gint alarm_cnt=0;
-    gint tooltip_alarm_limit=5;
-    gint year, month, day, hour, minute, second;
-    gint dd, hh, min;
-    GDate *g_now, *g_alarm;
                                                                                
 
     t = orage_localtime();
-  /* See if the day just changed and the former current date was selected */
-    if (previous_day != t->tm_mday) {
+  /* See if the day just changed */
+    if (previous_day != t->tm_mday
+    || previous_month != t->tm_mon
+    || previous_year != t->tm_year + 1900) {
         current_year  = t->tm_year + 1900;
         current_month = t->tm_mon;
         current_day   = t->tm_mday;
       /* Get the selected data from calendar */
+        xfcal = g_par.xfcal;
         gtk_calendar_get_date(GTK_CALENDAR (xfcal->mCalendar),
                  &selected_year, &selected_month, &selected_day);
         if (selected_year == previous_year 
@@ -405,7 +431,6 @@
         previous_year  = current_year;
         previous_month = current_month;
         previous_day   = current_day;
-        xfical_alarm_build_list(TRUE);  /* new alarm list when date changed */
         if (g_par.show_systray) {
             /* refresh date in tray icon */
             if (g_par.trayIcon && NETK_IS_TRAY_ICON(g_par.trayIcon->tray)) { 
@@ -415,11 +440,68 @@
             g_par.trayIcon = create_TrayIcon(xfcal);
             xfce_tray_icon_connect(g_par.trayIcon);
         }
+        xfical_alarm_build_list(TRUE);  /* new alarm list when date changed */
+        reset_orage_day_change(TRUE); /* setup for next time */
     }
+    else { 
+        /* we should very seldom come here since we schedule us to happen
+         * after the date has changed, but it is possible that the clock
+         * in this machine is not accurate and we end here too early.
+         * */
+        reset_orage_day_change(FALSE);
+    }
+    return(FALSE); /* we started new timer, so we end here */
+}
 
-    if (g_par.trayIcon && NETK_IS_TRAY_ICON(g_par.trayIcon->tray)) { 
-        tooltip = g_string_new(_("Next active alarms:"));
+gboolean reset_orage_alarm_clock()
+{
+    struct tm *t, t_alarm;
+    GList *alarm_l;
+    alarm_struct *cur_alarm;
+    gchar *next_alarm;
+    gint secs_to_alarm;
+    GDate *g_now, *g_alarm;
+    gint dd;
+
+    if (g_par.alarm_timer) /* need to stop it if running */
+        g_source_remove(g_par.alarm_timer);
+    if (g_par.alarm_list == NULL) { /* we do not have alarms */
+        return(FALSE);
     }
+    t = orage_localtime();
+    alarm_l = g_list_first(g_par.alarm_list);
+    cur_alarm = (alarm_struct *)alarm_l->data;
+    next_alarm = cur_alarm->alarm_time;
+    t_alarm = orage_icaltime_to_tm_time(next_alarm, FALSE);
+    /* let's find out how much time we have until alarm happens */
+    g_now = g_date_new_dmy(t->tm_mday, t->tm_mon + 1, t->tm_year + 1900);
+    g_alarm = g_date_new_dmy(t_alarm.tm_mday, t_alarm.tm_mon, t_alarm.tm_year);
+    dd = g_date_days_between(g_now, g_alarm);
+    g_date_free(g_now);
+    g_date_free(g_alarm);
+    secs_to_alarm = t_alarm.tm_sec  - t->tm_sec
+              + 60*(t_alarm.tm_min  - t->tm_min)
+           + 60*60*(t_alarm.tm_hour - t->tm_hour)
+        + 24*60*60*dd;
+    secs_to_alarm += 1; /* alarm needs to come a bit later */
+    if (secs_to_alarm < 1) /* were rare, but possible */
+            secs_to_alarm = 1;
+    g_par.alarm_timer = g_timeout_add(secs_to_alarm * 1000
+            , (GtkFunction) orage_alarm_clock, NULL);
+    return(TRUE);
+}
+
+/* check and raise alarms if there are any */
+gboolean orage_alarm_clock(gpointer user_data)
+{
+    struct tm *t;
+    GList *alarm_l;
+    alarm_struct *cur_alarm;
+    gboolean alarm_raised=FALSE;
+    gboolean more_alarms=TRUE;
+    gchar *time_now;
+                                                                               
 
+    t = orage_localtime();
   /* Check if there are any alarms to show */
     alarm_l = g_par.alarm_list;
     for (alarm_l = g_list_first(alarm_l);
@@ -427,58 +509,101 @@
          alarm_l = g_list_next(alarm_l)) {
         /* remember that it is sorted list */
         cur_alarm = (alarm_struct *)alarm_l->data;
-        g_sprintf(time_now, XFICAL_APPT_TIME_FORMAT, t->tm_year + 1900
-                , t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
+        time_now = orage_tm_time_to_icaltime(t);
         if (strcmp(time_now, cur_alarm->alarm_time) > 0) {
             create_reminders(cur_alarm);
             alarm_raised = TRUE;
         }
-        else /*if (strcmp(time_now, cur_alarm->alarm_time) <= 0) */ {
-            /* check if this should be visible in systray icon tooltip */
-            if (tooltip && (alarm_cnt < tooltip_alarm_limit)) {
-                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);
-                dd = g_date_days_between(g_now, g_alarm);
-                hh = hour - t->tm_hour;
-                min = minute - t->tm_min;
-                if (min < 0) {
-                    min += 60;
-                    hh -= 1;
-                }
-                if (hh < 0) {
-                    hh += 24;
-                    dd -= 1;
-                }
-                g_date_free(g_now);
-                g_date_free(g_alarm);
-
-                g_string_append_printf(tooltip, 
-                        _("\n%02d d %02d h %02d min to: %s"),
-                        dd, hh, min, cur_alarm->title->str);
-                alarm_cnt++;
-            }
-            else /* sorted so scan can be stopped */
-                more_alarms = FALSE; 
-        }
+        else /* sorted so scan can be stopped */
+            more_alarms = FALSE; 
     }
     if (alarm_raised) { /* at least one alarm processed, need new list */
-        xfical_alarm_build_list(FALSE); 
+        xfical_alarm_build_list(FALSE); /* this calls reset_orage_alarm_clock 
*/
     }
+    else
+        reset_orage_alarm_clock(); /* need to setup next timer */
+    return(FALSE); /* only once */
+}
 
-    if (tooltip) {
-        if (alarm_cnt == 0)
-            g_string_append_printf(tooltip, _("\nNo active alarms found"));
-        xfce_tray_icon_set_tooltip(g_par.trayIcon, tooltip->str, NULL);
-        g_string_free(tooltip, TRUE);
+gboolean reset_orage_tooltip_update()
+{
+    if (g_par.tooltip_timer) { /* need to stop it if running */
+        g_source_remove(g_par.tooltip_timer);
     }
-    /*
-    if (g_par.trayIcon && NETK_IS_TRAY_ICON(g_par.trayIcon->tray)) { 
-        build_tray_tooltip(time_now);
+
+    orage_tooltip_update(NULL);
+    g_par.tooltip_timer = g_timeout_add(60*1000
+            , (GtkFunction) orage_tooltip_update, NULL);
+    return(FALSE);
+}
+
+/* refresh trayicon tooltip once per minute */
+gboolean orage_tooltip_update(gpointer user_data)
+{
+    struct tm *t;
+    GList *alarm_l;
+    alarm_struct *cur_alarm;
+    gboolean more_alarms=TRUE;
+    GString *tooltip=NULL;
+    gint alarm_cnt=0;
+    gint tooltip_alarm_limit=5;
+    gint year, month, day, hour, minute, second;
+    gint dd, hh, min;
+    GDate *g_now, *g_alarm;
+                                                                               
 
+
+    if (!(g_par.trayIcon && NETK_IS_TRAY_ICON(g_par.trayIcon->tray))) { 
+           /* no trayicon => no need to update the tooltip */
+        return(FALSE);
     }
-    */
-    return TRUE;
+    t = orage_localtime();
+    tooltip = g_string_new(_("Next active alarms:"));
+  /* Check if there are any alarms to show */
+    alarm_l = g_par.alarm_list;
+    for (alarm_l = g_list_first(alarm_l);
+         alarm_l != NULL && more_alarms;
+         alarm_l = g_list_next(alarm_l)) {
+        /* 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);
+            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);
+            dd = g_date_days_between(g_now, g_alarm);
+            g_date_free(g_now);
+            g_date_free(g_alarm);
+            hh = hour - t->tm_hour;
+            min = minute - t->tm_min;
+            if (min < 0) {
+                min += 60;
+                hh -= 1;
+            }
+            if (hh < 0) {
+                hh += 24;
+                dd -= 1;
+            }
+            g_string_append_printf(tooltip, 
+                    _("\n%02d d %02d h %02d min to: %s"),
+                    dd, hh, min, cur_alarm->title->str);
+            alarm_cnt++;
+        }
+        else /* sorted so scan can be stopped */
+            more_alarms = FALSE; 
+    }
+    if (alarm_cnt == 0)
+        g_string_append_printf(tooltip, _("\nNo active alarms found"));
+    xfce_tray_icon_set_tooltip(g_par.trayIcon, tooltip->str, NULL);
+    g_string_free(tooltip, TRUE);
+    return(TRUE);
 }
 
+gboolean setup_orage_alarm_clock()
+{
+    reset_orage_alarm_clock();
+    /* We need to use timer since for some reason it does not work if we
+     * do it here directly. Ugly, I know, but it works. */
+    g_timeout_add(1*1000, (GtkFunction) reset_orage_tooltip_update, NULL);
+    return(TRUE);
+}

Modified: xfcalendar/trunk/src/reminder.h
===================================================================
--- xfcalendar/trunk/src/reminder.h     2007-10-26 18:56:01 UTC (rev 26201)
+++ xfcalendar/trunk/src/reminder.h     2007-10-27 21:45:04 UTC (rev 26202)
@@ -57,6 +57,7 @@
     active_alarm_struct *active_alarm;
 } alarm_struct;
 
-gboolean orage_alarm_clock(gpointer user_data);
+gboolean orage_day_change(gpointer user_data);
+gboolean setup_orage_alarm_clock(void);
 
 #endif /* !__REMINDER_H__ */

_______________________________________________
Xfce4-commits mailing list
[email protected]
http://foo-projects.org/mailman/listinfo/xfce4-commits

Reply via email to