Fixed alarm saving code. Fixed alarm loading code. New -partial-
Fixed alarm saving code. Fixed alarm loading code. New -partial- implementation of the mail alarm. It is not working, I do not know what is closing stdin to sendmail svn path=/trunk/; revision=194
This commit is contained in:
@ -1,3 +1,8 @@
|
||||
1998-04-24 Miguel de Icaza <miguel@nuclecu.unam.mx>
|
||||
|
||||
* calobj.c (ical_object_create_from_vobject): Fixed alarm loading;
|
||||
Load snooze time and snooze count
|
||||
|
||||
1998-04-23 Federico Mena Quintero <federico@nuclecu.unam.mx>
|
||||
|
||||
* calendar.c (calendar_save): Actually save the to-do entries.
|
||||
|
@ -412,17 +412,25 @@ load_recurrence (iCalObject *o, char *str)
|
||||
return 1;
|
||||
}
|
||||
|
||||
#define is_a_prop_of(obj,prop) isAPropertyOf (obj,prop)
|
||||
#define str_val(obj) the_str = fakeCString (vObjectUStringZValue (obj))
|
||||
#define has(obj,prop) (vo = isAPropertyOf (obj, prop))
|
||||
|
||||
/*
|
||||
* FIXME: This is loosing precission. Enhanec the thresholds
|
||||
*/
|
||||
#define HOURS(n) (n*(60*60))
|
||||
|
||||
static void
|
||||
setup_alarm_at (time_t base, CalendarAlarm *alarm, char *iso_time)
|
||||
setup_alarm_at (iCalObject *ico, CalendarAlarm *alarm, char *iso_time, VObject *vo)
|
||||
{
|
||||
time_t alarm_time = time_from_isodate (iso_time);
|
||||
time_t base = ico->dtstart;
|
||||
int d = difftime (base, alarm_time);
|
||||
|
||||
VObject *a;
|
||||
char *the_str;
|
||||
|
||||
alarm->enabled = 1;
|
||||
if (d > HOURS (2)){
|
||||
if (d > HOURS (48)){
|
||||
alarm->count = d / HOURS (24);
|
||||
@ -435,11 +443,17 @@ setup_alarm_at (time_t base, CalendarAlarm *alarm, char *iso_time)
|
||||
alarm->count = d / 60;
|
||||
alarm->units = ALARM_MINUTES;
|
||||
}
|
||||
}
|
||||
|
||||
#define is_a_prop_of(obj,prop) isAPropertyOf (obj,prop)
|
||||
#define str_val(obj) the_str = fakeCString (vObjectUStringZValue (obj))
|
||||
#define has(obj,prop) (vo = isAPropertyOf (obj, prop))
|
||||
if ((a = is_a_prop_of (vo, VCSnoozeTimeProp))){
|
||||
alarm->snooze_secs = isodiff_to_secs (str_val (a));
|
||||
free (the_str);
|
||||
}
|
||||
|
||||
if ((a = is_a_prop_of (vo, VCRepeatCountProp))){
|
||||
alarm->snooze_repeat = atoi (str_val (a));
|
||||
free (the_str);
|
||||
}
|
||||
}
|
||||
|
||||
/* FIXME: we need to load the recurrence properties */
|
||||
iCalObject *
|
||||
@ -597,9 +611,8 @@ ical_object_create_from_vobject (VObject *o, const char *object_name)
|
||||
ical->dalarm.type = ALARM_DISPLAY;
|
||||
ical->dalarm.enabled = 0;
|
||||
if (has (o, VCDAlarmProp)){
|
||||
if ((a = is_a_prop_of (o, VCRunTimeProp))){
|
||||
ical->dalarm.enabled = 1;
|
||||
setup_alarm_at (ical->dtstart, &ical->dalarm, str_val (a));
|
||||
if ((a = is_a_prop_of (vo, VCRunTimeProp))){
|
||||
setup_alarm_at (ical, &ical->dalarm, str_val (a), vo);
|
||||
free (the_str);
|
||||
}
|
||||
}
|
||||
@ -608,9 +621,8 @@ ical_object_create_from_vobject (VObject *o, const char *object_name)
|
||||
ical->aalarm.type = ALARM_AUDIO;
|
||||
ical->aalarm.enabled = 0;
|
||||
if (has (o, VCAAlarmProp)){
|
||||
if ((a = is_a_prop_of (o, VCRunTimeProp))){
|
||||
ical->aalarm.enabled = 1;
|
||||
setup_alarm_at (ical->dtstart, &ical->aalarm, str_val (a));
|
||||
if ((a = is_a_prop_of (vo, VCRunTimeProp))){
|
||||
setup_alarm_at (ical, &ical->aalarm, str_val (a), vo);
|
||||
free (the_str);
|
||||
}
|
||||
}
|
||||
@ -620,12 +632,11 @@ ical_object_create_from_vobject (VObject *o, const char *object_name)
|
||||
ical->palarm.enabled = 0;
|
||||
if (has (o, VCPAlarmProp)){
|
||||
ical->palarm.type = ALARM_PROGRAM;
|
||||
if ((a = is_a_prop_of (o, VCRunTimeProp))){
|
||||
ical->palarm.enabled = 1;
|
||||
setup_alarm_at (ical->dtstart, &ical->palarm, str_val (a));
|
||||
if ((a = is_a_prop_of (vo, VCRunTimeProp))){
|
||||
setup_alarm_at (ical, &ical->palarm, str_val (a), vo);
|
||||
free (the_str);
|
||||
|
||||
if ((a = is_a_prop_of (o, VCProcedureNameProp))){
|
||||
if ((a = is_a_prop_of (vo, VCProcedureNameProp))){
|
||||
ical->palarm.data = g_strdup (str_val (a));
|
||||
free (the_str);
|
||||
}
|
||||
@ -637,12 +648,11 @@ ical_object_create_from_vobject (VObject *o, const char *object_name)
|
||||
ical->malarm.enabled = 0;
|
||||
if (has (o, VCMAlarmProp)){
|
||||
ical->malarm.type = ALARM_MAIL;
|
||||
if ((a = is_a_prop_of (o, VCRunTimeProp))){
|
||||
ical->malarm.enabled = 1;
|
||||
setup_alarm_at (ical->dtstart, &ical->malarm, str_val (a));
|
||||
if ((a = is_a_prop_of (vo, VCRunTimeProp))){
|
||||
setup_alarm_at (ical, &ical->malarm, str_val (a), vo);
|
||||
free (the_str);
|
||||
|
||||
if ((a = is_a_prop_of (o, VCEmailAddressProp))){
|
||||
if ((a = is_a_prop_of (vo, VCEmailAddressProp))){
|
||||
ical->malarm.data = g_strdup (str_val (a));
|
||||
free (the_str);
|
||||
}
|
||||
@ -754,9 +764,19 @@ save_alarm (VObject *o, CalendarAlarm *alarm, iCalObject *ical)
|
||||
alarm_time = mktime (tm);
|
||||
alarm_object = addProp (o, alarm_names [alarm->type]);
|
||||
addPropValue (alarm_object, VCRunTimeProp, isodate_from_time_t (alarm_time));
|
||||
addPropValue (alarm_object, VCRepeatCountProp, "1");
|
||||
addPropValue (alarm_object, VCDisplayStringProp, "GNOME appointment alarm");
|
||||
|
||||
if (alarm->snooze_secs)
|
||||
addPropValue (alarm_object, VCSnoozeTimeProp, isodiff_from_secs (alarm->snooze_secs));
|
||||
else
|
||||
addPropValue (alarm_object, VCSnoozeTimeProp, "");
|
||||
|
||||
if (alarm->snooze_repeat){
|
||||
char buf [20];
|
||||
|
||||
sprintf (buf, "%d", alarm->snooze_repeat);
|
||||
addPropValue (alarm_object, VCRepeatCountProp, buf);
|
||||
} else
|
||||
addPropValue (alarm_object, VCRepeatCountProp, "");
|
||||
return alarm_object;
|
||||
}
|
||||
|
||||
|
@ -36,6 +36,9 @@ typedef struct {
|
||||
/* Does not get saved, internally used */
|
||||
time_t offset;
|
||||
time_t trigger;
|
||||
|
||||
int snooze_secs;
|
||||
int snooze_repeat;
|
||||
|
||||
/* Widgets */
|
||||
void *w_count; /* A GtkEntry */
|
||||
@ -109,6 +112,7 @@ typedef struct {
|
||||
time_t _enddate; /* As found on the vCalendar file */
|
||||
int __count;
|
||||
} Recurrence;
|
||||
|
||||
#define IS_INFINITE(r) (r->duration == 0)
|
||||
|
||||
/* Flags to indicate what has changed in an object */
|
||||
|
@ -97,6 +97,8 @@ calendar_add_object (Calendar *cal, iCalObject *obj)
|
||||
case ICAL_EVENT:
|
||||
cal->events = g_list_prepend (cal->events, obj);
|
||||
ical_object_try_alarms (obj);
|
||||
obj->malarm.trigger = 0;
|
||||
calendar_notify (0, obj);
|
||||
break;
|
||||
|
||||
case ICAL_TODO:
|
||||
|
@ -412,17 +412,25 @@ load_recurrence (iCalObject *o, char *str)
|
||||
return 1;
|
||||
}
|
||||
|
||||
#define is_a_prop_of(obj,prop) isAPropertyOf (obj,prop)
|
||||
#define str_val(obj) the_str = fakeCString (vObjectUStringZValue (obj))
|
||||
#define has(obj,prop) (vo = isAPropertyOf (obj, prop))
|
||||
|
||||
/*
|
||||
* FIXME: This is loosing precission. Enhanec the thresholds
|
||||
*/
|
||||
#define HOURS(n) (n*(60*60))
|
||||
|
||||
static void
|
||||
setup_alarm_at (time_t base, CalendarAlarm *alarm, char *iso_time)
|
||||
setup_alarm_at (iCalObject *ico, CalendarAlarm *alarm, char *iso_time, VObject *vo)
|
||||
{
|
||||
time_t alarm_time = time_from_isodate (iso_time);
|
||||
time_t base = ico->dtstart;
|
||||
int d = difftime (base, alarm_time);
|
||||
|
||||
VObject *a;
|
||||
char *the_str;
|
||||
|
||||
alarm->enabled = 1;
|
||||
if (d > HOURS (2)){
|
||||
if (d > HOURS (48)){
|
||||
alarm->count = d / HOURS (24);
|
||||
@ -435,11 +443,17 @@ setup_alarm_at (time_t base, CalendarAlarm *alarm, char *iso_time)
|
||||
alarm->count = d / 60;
|
||||
alarm->units = ALARM_MINUTES;
|
||||
}
|
||||
}
|
||||
|
||||
#define is_a_prop_of(obj,prop) isAPropertyOf (obj,prop)
|
||||
#define str_val(obj) the_str = fakeCString (vObjectUStringZValue (obj))
|
||||
#define has(obj,prop) (vo = isAPropertyOf (obj, prop))
|
||||
if ((a = is_a_prop_of (vo, VCSnoozeTimeProp))){
|
||||
alarm->snooze_secs = isodiff_to_secs (str_val (a));
|
||||
free (the_str);
|
||||
}
|
||||
|
||||
if ((a = is_a_prop_of (vo, VCRepeatCountProp))){
|
||||
alarm->snooze_repeat = atoi (str_val (a));
|
||||
free (the_str);
|
||||
}
|
||||
}
|
||||
|
||||
/* FIXME: we need to load the recurrence properties */
|
||||
iCalObject *
|
||||
@ -597,9 +611,8 @@ ical_object_create_from_vobject (VObject *o, const char *object_name)
|
||||
ical->dalarm.type = ALARM_DISPLAY;
|
||||
ical->dalarm.enabled = 0;
|
||||
if (has (o, VCDAlarmProp)){
|
||||
if ((a = is_a_prop_of (o, VCRunTimeProp))){
|
||||
ical->dalarm.enabled = 1;
|
||||
setup_alarm_at (ical->dtstart, &ical->dalarm, str_val (a));
|
||||
if ((a = is_a_prop_of (vo, VCRunTimeProp))){
|
||||
setup_alarm_at (ical, &ical->dalarm, str_val (a), vo);
|
||||
free (the_str);
|
||||
}
|
||||
}
|
||||
@ -608,9 +621,8 @@ ical_object_create_from_vobject (VObject *o, const char *object_name)
|
||||
ical->aalarm.type = ALARM_AUDIO;
|
||||
ical->aalarm.enabled = 0;
|
||||
if (has (o, VCAAlarmProp)){
|
||||
if ((a = is_a_prop_of (o, VCRunTimeProp))){
|
||||
ical->aalarm.enabled = 1;
|
||||
setup_alarm_at (ical->dtstart, &ical->aalarm, str_val (a));
|
||||
if ((a = is_a_prop_of (vo, VCRunTimeProp))){
|
||||
setup_alarm_at (ical, &ical->aalarm, str_val (a), vo);
|
||||
free (the_str);
|
||||
}
|
||||
}
|
||||
@ -620,12 +632,11 @@ ical_object_create_from_vobject (VObject *o, const char *object_name)
|
||||
ical->palarm.enabled = 0;
|
||||
if (has (o, VCPAlarmProp)){
|
||||
ical->palarm.type = ALARM_PROGRAM;
|
||||
if ((a = is_a_prop_of (o, VCRunTimeProp))){
|
||||
ical->palarm.enabled = 1;
|
||||
setup_alarm_at (ical->dtstart, &ical->palarm, str_val (a));
|
||||
if ((a = is_a_prop_of (vo, VCRunTimeProp))){
|
||||
setup_alarm_at (ical, &ical->palarm, str_val (a), vo);
|
||||
free (the_str);
|
||||
|
||||
if ((a = is_a_prop_of (o, VCProcedureNameProp))){
|
||||
if ((a = is_a_prop_of (vo, VCProcedureNameProp))){
|
||||
ical->palarm.data = g_strdup (str_val (a));
|
||||
free (the_str);
|
||||
}
|
||||
@ -637,12 +648,11 @@ ical_object_create_from_vobject (VObject *o, const char *object_name)
|
||||
ical->malarm.enabled = 0;
|
||||
if (has (o, VCMAlarmProp)){
|
||||
ical->malarm.type = ALARM_MAIL;
|
||||
if ((a = is_a_prop_of (o, VCRunTimeProp))){
|
||||
ical->malarm.enabled = 1;
|
||||
setup_alarm_at (ical->dtstart, &ical->malarm, str_val (a));
|
||||
if ((a = is_a_prop_of (vo, VCRunTimeProp))){
|
||||
setup_alarm_at (ical, &ical->malarm, str_val (a), vo);
|
||||
free (the_str);
|
||||
|
||||
if ((a = is_a_prop_of (o, VCEmailAddressProp))){
|
||||
if ((a = is_a_prop_of (vo, VCEmailAddressProp))){
|
||||
ical->malarm.data = g_strdup (str_val (a));
|
||||
free (the_str);
|
||||
}
|
||||
@ -754,9 +764,19 @@ save_alarm (VObject *o, CalendarAlarm *alarm, iCalObject *ical)
|
||||
alarm_time = mktime (tm);
|
||||
alarm_object = addProp (o, alarm_names [alarm->type]);
|
||||
addPropValue (alarm_object, VCRunTimeProp, isodate_from_time_t (alarm_time));
|
||||
addPropValue (alarm_object, VCRepeatCountProp, "1");
|
||||
addPropValue (alarm_object, VCDisplayStringProp, "GNOME appointment alarm");
|
||||
|
||||
if (alarm->snooze_secs)
|
||||
addPropValue (alarm_object, VCSnoozeTimeProp, isodiff_from_secs (alarm->snooze_secs));
|
||||
else
|
||||
addPropValue (alarm_object, VCSnoozeTimeProp, "");
|
||||
|
||||
if (alarm->snooze_repeat){
|
||||
char buf [20];
|
||||
|
||||
sprintf (buf, "%d", alarm->snooze_repeat);
|
||||
addPropValue (alarm_object, VCRepeatCountProp, buf);
|
||||
} else
|
||||
addPropValue (alarm_object, VCRepeatCountProp, "");
|
||||
return alarm_object;
|
||||
}
|
||||
|
||||
|
@ -36,6 +36,9 @@ typedef struct {
|
||||
/* Does not get saved, internally used */
|
||||
time_t offset;
|
||||
time_t trigger;
|
||||
|
||||
int snooze_secs;
|
||||
int snooze_repeat;
|
||||
|
||||
/* Widgets */
|
||||
void *w_count; /* A GtkEntry */
|
||||
@ -109,6 +112,7 @@ typedef struct {
|
||||
time_t _enddate; /* As found on the vCalendar file */
|
||||
int __count;
|
||||
} Recurrence;
|
||||
|
||||
#define IS_INFINITE(r) (r->duration == 0)
|
||||
|
||||
/* Flags to indicate what has changed in an object */
|
||||
|
@ -326,8 +326,6 @@ ee_create_ae (GtkTable *table, char *str, CalendarAlarm *alarm, enum AlarmType t
|
||||
GTK_SIGNAL_FUNC (alarm_toggle), alarm);
|
||||
gtk_table_attach (table, alarm->w_enabled, 0, 1, y, y+1, FS, FS, 0, 0);
|
||||
|
||||
gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (alarm->w_enabled), alarm->enabled);
|
||||
|
||||
alarm->w_count = make_spin_button (alarm->count, 0, 10000);
|
||||
gtk_table_attach (table, alarm->w_count, 1, 2, y, y+1, FS, FS, 0, 0);
|
||||
|
||||
@ -358,7 +356,7 @@ ee_create_ae (GtkTable *table, char *str, CalendarAlarm *alarm, enum AlarmType t
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (alarm->w_enabled), alarm->enabled);
|
||||
ee_alarm_setting (alarm, alarm->enabled);
|
||||
}
|
||||
|
||||
|
@ -9,6 +9,7 @@
|
||||
#include <unistd.h>
|
||||
#include <signal.h>
|
||||
#include <sys/wait.h>
|
||||
#include <fcntl.h>
|
||||
#include "calendar.h"
|
||||
#include "gnome-cal.h"
|
||||
#include "gncal-day-panel.h"
|
||||
@ -257,9 +258,9 @@ execute (char *command, int close_standard)
|
||||
*/
|
||||
execl ("/bin/sh", "/bin/sh", "-c", command, (char *) 0);
|
||||
|
||||
exit (127);
|
||||
_exit (127);
|
||||
} else {
|
||||
exit (127);
|
||||
_exit (127);
|
||||
}
|
||||
}
|
||||
wait (&status);
|
||||
@ -285,13 +286,31 @@ calendar_notify (time_t time, void *data)
|
||||
if (ico->malarm.enabled && ico->malarm.trigger == time){
|
||||
char *command;
|
||||
time_t app = ico->malarm.trigger + ico->malarm.offset;
|
||||
pid_t pid;
|
||||
int p [2];
|
||||
|
||||
command = g_copy_strings ("mail -s '",
|
||||
_("Reminder of your appointment at "),
|
||||
ctime (&app), "' '",
|
||||
ico->malarm.data, "' ",
|
||||
NULL);
|
||||
execute (command, 1);
|
||||
pipe (p);
|
||||
pid = fork ();
|
||||
if (pid == 0){
|
||||
const int top = max_open_files ();
|
||||
int dev_null, i;
|
||||
|
||||
for (i = 0; i < top; i++)
|
||||
if (i != p [1])
|
||||
close (i);
|
||||
dev_null = open ("/dev/null", O_RDWR);
|
||||
dup2 (p [1], 0);
|
||||
dup2 (dev_null, 1);
|
||||
dup2 (dev_null, 2);
|
||||
execl ("/usr/lib/sendmail", "/usr/lib/sendmail",
|
||||
ico->malarm.data, NULL);
|
||||
_exit (127);
|
||||
}
|
||||
close (p [1]);
|
||||
command = g_copy_strings ("To: ", ico->malarm.data, "\n",
|
||||
"Subject: ", _("Reminder of your appointment at "),
|
||||
ctime (&app), "\n\n", NULL);
|
||||
write (p [0], command, strlen (command));
|
||||
|
||||
g_free (command);
|
||||
return;
|
||||
|
@ -97,6 +97,8 @@ calendar_add_object (Calendar *cal, iCalObject *obj)
|
||||
case ICAL_EVENT:
|
||||
cal->events = g_list_prepend (cal->events, obj);
|
||||
ical_object_try_alarms (obj);
|
||||
obj->malarm.trigger = 0;
|
||||
calendar_notify (0, obj);
|
||||
break;
|
||||
|
||||
case ICAL_TODO:
|
||||
|
@ -326,8 +326,6 @@ ee_create_ae (GtkTable *table, char *str, CalendarAlarm *alarm, enum AlarmType t
|
||||
GTK_SIGNAL_FUNC (alarm_toggle), alarm);
|
||||
gtk_table_attach (table, alarm->w_enabled, 0, 1, y, y+1, FS, FS, 0, 0);
|
||||
|
||||
gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (alarm->w_enabled), alarm->enabled);
|
||||
|
||||
alarm->w_count = make_spin_button (alarm->count, 0, 10000);
|
||||
gtk_table_attach (table, alarm->w_count, 1, 2, y, y+1, FS, FS, 0, 0);
|
||||
|
||||
@ -358,7 +356,7 @@ ee_create_ae (GtkTable *table, char *str, CalendarAlarm *alarm, enum AlarmType t
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (alarm->w_enabled), alarm->enabled);
|
||||
ee_alarm_setting (alarm, alarm->enabled);
|
||||
}
|
||||
|
||||
|
@ -9,6 +9,7 @@
|
||||
#include <unistd.h>
|
||||
#include <signal.h>
|
||||
#include <sys/wait.h>
|
||||
#include <fcntl.h>
|
||||
#include "calendar.h"
|
||||
#include "gnome-cal.h"
|
||||
#include "gncal-day-panel.h"
|
||||
@ -257,9 +258,9 @@ execute (char *command, int close_standard)
|
||||
*/
|
||||
execl ("/bin/sh", "/bin/sh", "-c", command, (char *) 0);
|
||||
|
||||
exit (127);
|
||||
_exit (127);
|
||||
} else {
|
||||
exit (127);
|
||||
_exit (127);
|
||||
}
|
||||
}
|
||||
wait (&status);
|
||||
@ -285,13 +286,31 @@ calendar_notify (time_t time, void *data)
|
||||
if (ico->malarm.enabled && ico->malarm.trigger == time){
|
||||
char *command;
|
||||
time_t app = ico->malarm.trigger + ico->malarm.offset;
|
||||
pid_t pid;
|
||||
int p [2];
|
||||
|
||||
command = g_copy_strings ("mail -s '",
|
||||
_("Reminder of your appointment at "),
|
||||
ctime (&app), "' '",
|
||||
ico->malarm.data, "' ",
|
||||
NULL);
|
||||
execute (command, 1);
|
||||
pipe (p);
|
||||
pid = fork ();
|
||||
if (pid == 0){
|
||||
const int top = max_open_files ();
|
||||
int dev_null, i;
|
||||
|
||||
for (i = 0; i < top; i++)
|
||||
if (i != p [1])
|
||||
close (i);
|
||||
dev_null = open ("/dev/null", O_RDWR);
|
||||
dup2 (p [1], 0);
|
||||
dup2 (dev_null, 1);
|
||||
dup2 (dev_null, 2);
|
||||
execl ("/usr/lib/sendmail", "/usr/lib/sendmail",
|
||||
ico->malarm.data, NULL);
|
||||
_exit (127);
|
||||
}
|
||||
close (p [1]);
|
||||
command = g_copy_strings ("To: ", ico->malarm.data, "\n",
|
||||
"Subject: ", _("Reminder of your appointment at "),
|
||||
ctime (&app), "\n\n", NULL);
|
||||
write (p [0], command, strlen (command));
|
||||
|
||||
g_free (command);
|
||||
return;
|
||||
|
@ -51,6 +51,9 @@ static char *load_file;
|
||||
/* If set, show events for the specified date and quit */
|
||||
static int show_events;
|
||||
|
||||
/* Session management */
|
||||
static GnomeClient *sm_client;
|
||||
|
||||
static void
|
||||
init_username (void)
|
||||
{
|
||||
@ -121,7 +124,7 @@ about_calendar_cmd (GtkWidget *widget, void *data)
|
||||
};
|
||||
|
||||
about = gnome_about_new (_("Gnome Calendar"), VERSION,
|
||||
"(C) 1998 the Free Software Fundation",
|
||||
"(C) 1998 the Free Software Foundation",
|
||||
authors,
|
||||
_("The GNOME personal calendar and schedule manager."),
|
||||
NULL);
|
||||
@ -171,7 +174,7 @@ day_range_changed (void)
|
||||
}
|
||||
|
||||
static void
|
||||
quit_cmd (GtkWidget *widget, GnomeCalendar *gcal)
|
||||
quit_cmd (void)
|
||||
{
|
||||
while (all_calendars){
|
||||
GnomeCalendar *cal = GNOME_CALENDAR (all_calendars->data);
|
||||
@ -500,6 +503,42 @@ static struct argp parser =
|
||||
argp_options, parse_an_arg, NULL, NULL, NULL, NULL, NULL
|
||||
};
|
||||
|
||||
static void
|
||||
session_die (void)
|
||||
{
|
||||
quit_cmd ();
|
||||
}
|
||||
|
||||
static int
|
||||
session_save_state (GnomeClient *client, gint phase, GnomeRestartStyle save_style, gint shutdown,
|
||||
GnomeInteractStyle interact_style, gint fast, gpointer client_data)
|
||||
{
|
||||
printf ("Got a message to save the state\n");
|
||||
}
|
||||
|
||||
/* Setup the Session Manager shutdown routine */
|
||||
static GnomeClient *
|
||||
new_client (void)
|
||||
{
|
||||
GnomeClient *client;
|
||||
char buf [4096];
|
||||
|
||||
client = gnome_client_new_default ();
|
||||
if (client)
|
||||
return NULL;
|
||||
|
||||
getcwd ((void *)&buf, sizeof (buf));
|
||||
|
||||
gtk_object_ref(GTK_OBJECT(client));
|
||||
gtk_object_sink(GTK_OBJECT(client));
|
||||
|
||||
gtk_signal_connect (GTK_OBJECT (client), "save_yourself",
|
||||
GTK_SIGNAL_FUNC (session_save_state), NULL);
|
||||
gtk_signal_connect (GTK_OBJECT (client), "die",
|
||||
GTK_SIGNAL_FUNC (session_die), NULL);
|
||||
return client;
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
@ -510,6 +549,8 @@ main(int argc, char *argv[])
|
||||
|
||||
gnome_init ("calendar", &parser, argc, argv, 0, NULL);
|
||||
|
||||
sm_client = new_client ();
|
||||
|
||||
process_dates ();
|
||||
alarm_init ();
|
||||
init_calendar ();
|
||||
|
@ -51,6 +51,9 @@ static char *load_file;
|
||||
/* If set, show events for the specified date and quit */
|
||||
static int show_events;
|
||||
|
||||
/* Session management */
|
||||
static GnomeClient *sm_client;
|
||||
|
||||
static void
|
||||
init_username (void)
|
||||
{
|
||||
@ -121,7 +124,7 @@ about_calendar_cmd (GtkWidget *widget, void *data)
|
||||
};
|
||||
|
||||
about = gnome_about_new (_("Gnome Calendar"), VERSION,
|
||||
"(C) 1998 the Free Software Fundation",
|
||||
"(C) 1998 the Free Software Foundation",
|
||||
authors,
|
||||
_("The GNOME personal calendar and schedule manager."),
|
||||
NULL);
|
||||
@ -171,7 +174,7 @@ day_range_changed (void)
|
||||
}
|
||||
|
||||
static void
|
||||
quit_cmd (GtkWidget *widget, GnomeCalendar *gcal)
|
||||
quit_cmd (void)
|
||||
{
|
||||
while (all_calendars){
|
||||
GnomeCalendar *cal = GNOME_CALENDAR (all_calendars->data);
|
||||
@ -500,6 +503,42 @@ static struct argp parser =
|
||||
argp_options, parse_an_arg, NULL, NULL, NULL, NULL, NULL
|
||||
};
|
||||
|
||||
static void
|
||||
session_die (void)
|
||||
{
|
||||
quit_cmd ();
|
||||
}
|
||||
|
||||
static int
|
||||
session_save_state (GnomeClient *client, gint phase, GnomeRestartStyle save_style, gint shutdown,
|
||||
GnomeInteractStyle interact_style, gint fast, gpointer client_data)
|
||||
{
|
||||
printf ("Got a message to save the state\n");
|
||||
}
|
||||
|
||||
/* Setup the Session Manager shutdown routine */
|
||||
static GnomeClient *
|
||||
new_client (void)
|
||||
{
|
||||
GnomeClient *client;
|
||||
char buf [4096];
|
||||
|
||||
client = gnome_client_new_default ();
|
||||
if (client)
|
||||
return NULL;
|
||||
|
||||
getcwd ((void *)&buf, sizeof (buf));
|
||||
|
||||
gtk_object_ref(GTK_OBJECT(client));
|
||||
gtk_object_sink(GTK_OBJECT(client));
|
||||
|
||||
gtk_signal_connect (GTK_OBJECT (client), "save_yourself",
|
||||
GTK_SIGNAL_FUNC (session_save_state), NULL);
|
||||
gtk_signal_connect (GTK_OBJECT (client), "die",
|
||||
GTK_SIGNAL_FUNC (session_die), NULL);
|
||||
return client;
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
@ -510,6 +549,8 @@ main(int argc, char *argv[])
|
||||
|
||||
gnome_init ("calendar", &parser, argc, argv, 0, NULL);
|
||||
|
||||
sm_client = new_client ();
|
||||
|
||||
process_dates ();
|
||||
alarm_init ();
|
||||
init_calendar ();
|
||||
|
@ -412,17 +412,25 @@ load_recurrence (iCalObject *o, char *str)
|
||||
return 1;
|
||||
}
|
||||
|
||||
#define is_a_prop_of(obj,prop) isAPropertyOf (obj,prop)
|
||||
#define str_val(obj) the_str = fakeCString (vObjectUStringZValue (obj))
|
||||
#define has(obj,prop) (vo = isAPropertyOf (obj, prop))
|
||||
|
||||
/*
|
||||
* FIXME: This is loosing precission. Enhanec the thresholds
|
||||
*/
|
||||
#define HOURS(n) (n*(60*60))
|
||||
|
||||
static void
|
||||
setup_alarm_at (time_t base, CalendarAlarm *alarm, char *iso_time)
|
||||
setup_alarm_at (iCalObject *ico, CalendarAlarm *alarm, char *iso_time, VObject *vo)
|
||||
{
|
||||
time_t alarm_time = time_from_isodate (iso_time);
|
||||
time_t base = ico->dtstart;
|
||||
int d = difftime (base, alarm_time);
|
||||
|
||||
VObject *a;
|
||||
char *the_str;
|
||||
|
||||
alarm->enabled = 1;
|
||||
if (d > HOURS (2)){
|
||||
if (d > HOURS (48)){
|
||||
alarm->count = d / HOURS (24);
|
||||
@ -435,11 +443,17 @@ setup_alarm_at (time_t base, CalendarAlarm *alarm, char *iso_time)
|
||||
alarm->count = d / 60;
|
||||
alarm->units = ALARM_MINUTES;
|
||||
}
|
||||
}
|
||||
|
||||
#define is_a_prop_of(obj,prop) isAPropertyOf (obj,prop)
|
||||
#define str_val(obj) the_str = fakeCString (vObjectUStringZValue (obj))
|
||||
#define has(obj,prop) (vo = isAPropertyOf (obj, prop))
|
||||
if ((a = is_a_prop_of (vo, VCSnoozeTimeProp))){
|
||||
alarm->snooze_secs = isodiff_to_secs (str_val (a));
|
||||
free (the_str);
|
||||
}
|
||||
|
||||
if ((a = is_a_prop_of (vo, VCRepeatCountProp))){
|
||||
alarm->snooze_repeat = atoi (str_val (a));
|
||||
free (the_str);
|
||||
}
|
||||
}
|
||||
|
||||
/* FIXME: we need to load the recurrence properties */
|
||||
iCalObject *
|
||||
@ -597,9 +611,8 @@ ical_object_create_from_vobject (VObject *o, const char *object_name)
|
||||
ical->dalarm.type = ALARM_DISPLAY;
|
||||
ical->dalarm.enabled = 0;
|
||||
if (has (o, VCDAlarmProp)){
|
||||
if ((a = is_a_prop_of (o, VCRunTimeProp))){
|
||||
ical->dalarm.enabled = 1;
|
||||
setup_alarm_at (ical->dtstart, &ical->dalarm, str_val (a));
|
||||
if ((a = is_a_prop_of (vo, VCRunTimeProp))){
|
||||
setup_alarm_at (ical, &ical->dalarm, str_val (a), vo);
|
||||
free (the_str);
|
||||
}
|
||||
}
|
||||
@ -608,9 +621,8 @@ ical_object_create_from_vobject (VObject *o, const char *object_name)
|
||||
ical->aalarm.type = ALARM_AUDIO;
|
||||
ical->aalarm.enabled = 0;
|
||||
if (has (o, VCAAlarmProp)){
|
||||
if ((a = is_a_prop_of (o, VCRunTimeProp))){
|
||||
ical->aalarm.enabled = 1;
|
||||
setup_alarm_at (ical->dtstart, &ical->aalarm, str_val (a));
|
||||
if ((a = is_a_prop_of (vo, VCRunTimeProp))){
|
||||
setup_alarm_at (ical, &ical->aalarm, str_val (a), vo);
|
||||
free (the_str);
|
||||
}
|
||||
}
|
||||
@ -620,12 +632,11 @@ ical_object_create_from_vobject (VObject *o, const char *object_name)
|
||||
ical->palarm.enabled = 0;
|
||||
if (has (o, VCPAlarmProp)){
|
||||
ical->palarm.type = ALARM_PROGRAM;
|
||||
if ((a = is_a_prop_of (o, VCRunTimeProp))){
|
||||
ical->palarm.enabled = 1;
|
||||
setup_alarm_at (ical->dtstart, &ical->palarm, str_val (a));
|
||||
if ((a = is_a_prop_of (vo, VCRunTimeProp))){
|
||||
setup_alarm_at (ical, &ical->palarm, str_val (a), vo);
|
||||
free (the_str);
|
||||
|
||||
if ((a = is_a_prop_of (o, VCProcedureNameProp))){
|
||||
if ((a = is_a_prop_of (vo, VCProcedureNameProp))){
|
||||
ical->palarm.data = g_strdup (str_val (a));
|
||||
free (the_str);
|
||||
}
|
||||
@ -637,12 +648,11 @@ ical_object_create_from_vobject (VObject *o, const char *object_name)
|
||||
ical->malarm.enabled = 0;
|
||||
if (has (o, VCMAlarmProp)){
|
||||
ical->malarm.type = ALARM_MAIL;
|
||||
if ((a = is_a_prop_of (o, VCRunTimeProp))){
|
||||
ical->malarm.enabled = 1;
|
||||
setup_alarm_at (ical->dtstart, &ical->malarm, str_val (a));
|
||||
if ((a = is_a_prop_of (vo, VCRunTimeProp))){
|
||||
setup_alarm_at (ical, &ical->malarm, str_val (a), vo);
|
||||
free (the_str);
|
||||
|
||||
if ((a = is_a_prop_of (o, VCEmailAddressProp))){
|
||||
if ((a = is_a_prop_of (vo, VCEmailAddressProp))){
|
||||
ical->malarm.data = g_strdup (str_val (a));
|
||||
free (the_str);
|
||||
}
|
||||
@ -754,9 +764,19 @@ save_alarm (VObject *o, CalendarAlarm *alarm, iCalObject *ical)
|
||||
alarm_time = mktime (tm);
|
||||
alarm_object = addProp (o, alarm_names [alarm->type]);
|
||||
addPropValue (alarm_object, VCRunTimeProp, isodate_from_time_t (alarm_time));
|
||||
addPropValue (alarm_object, VCRepeatCountProp, "1");
|
||||
addPropValue (alarm_object, VCDisplayStringProp, "GNOME appointment alarm");
|
||||
|
||||
if (alarm->snooze_secs)
|
||||
addPropValue (alarm_object, VCSnoozeTimeProp, isodiff_from_secs (alarm->snooze_secs));
|
||||
else
|
||||
addPropValue (alarm_object, VCSnoozeTimeProp, "");
|
||||
|
||||
if (alarm->snooze_repeat){
|
||||
char buf [20];
|
||||
|
||||
sprintf (buf, "%d", alarm->snooze_repeat);
|
||||
addPropValue (alarm_object, VCRepeatCountProp, buf);
|
||||
} else
|
||||
addPropValue (alarm_object, VCRepeatCountProp, "");
|
||||
return alarm_object;
|
||||
}
|
||||
|
||||
|
@ -36,6 +36,9 @@ typedef struct {
|
||||
/* Does not get saved, internally used */
|
||||
time_t offset;
|
||||
time_t trigger;
|
||||
|
||||
int snooze_secs;
|
||||
int snooze_repeat;
|
||||
|
||||
/* Widgets */
|
||||
void *w_count; /* A GtkEntry */
|
||||
@ -109,6 +112,7 @@ typedef struct {
|
||||
time_t _enddate; /* As found on the vCalendar file */
|
||||
int __count;
|
||||
} Recurrence;
|
||||
|
||||
#define IS_INFINITE(r) (r->duration == 0)
|
||||
|
||||
/* Flags to indicate what has changed in an object */
|
||||
|
@ -218,3 +218,106 @@ time_week_begin (time_t t)
|
||||
return mktime (&tm);
|
||||
}
|
||||
|
||||
static char *
|
||||
pcat (char *dest, int num, char key)
|
||||
{
|
||||
int c;
|
||||
|
||||
c = sprintf (dest, "%d%c", num, key);
|
||||
return dest + c;
|
||||
}
|
||||
|
||||
/* Converts secs into the ISO difftime representation */
|
||||
char *
|
||||
isodiff_from_secs (int secs)
|
||||
{
|
||||
static char buffer [60], *p;
|
||||
int years, months, weeks, days, hours, minutes;
|
||||
|
||||
years = months = weeks = days = hours = minutes = 0;
|
||||
|
||||
years = secs / (365 * 86400);
|
||||
secs %= (365 * 86400);
|
||||
months = secs / (30 * 86400);
|
||||
secs %= (30 * 86400);
|
||||
weeks = secs / (7 * 86400);
|
||||
secs %= (7 * 86400);
|
||||
days = secs / 86400;
|
||||
secs %= 86400;
|
||||
hours = secs / 3600;
|
||||
secs %= 3600;
|
||||
minutes = secs / 60;
|
||||
secs %= 60;
|
||||
|
||||
strcpy (buffer, "P");
|
||||
p = buffer + 1;
|
||||
if (years)
|
||||
p = pcat (p, years, 'Y');
|
||||
if (months)
|
||||
p = pcat (p, months, 'M');
|
||||
if (weeks)
|
||||
p = pcat (p, weeks, 'W');
|
||||
if (days)
|
||||
p = pcat (p, days, 'D');
|
||||
if (hours || minutes || secs){
|
||||
*p++ = 'T';
|
||||
if (hours)
|
||||
p = pcat (p, hours, 'H');
|
||||
if (minutes)
|
||||
p = pcat (p, minutes, 'M');
|
||||
if (secs)
|
||||
p = pcat (p, secs, 'S');
|
||||
}
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
int
|
||||
isodiff_to_secs (char *str)
|
||||
{
|
||||
int value, time;
|
||||
int years, months, weeks, days, hours, minutes, seconds;
|
||||
|
||||
value = years = months = weeks = days = hours = minutes = time = seconds = 0;
|
||||
if (*str != 'P')
|
||||
return 0;
|
||||
|
||||
str++;
|
||||
while (*str){
|
||||
switch (*str){
|
||||
case '0': case '1': case '2': case '3': case '4':
|
||||
case '5': case '6': case '7': case '8': case '9':
|
||||
value = value * 10 + (*str - '0');
|
||||
break;
|
||||
case 'Y':
|
||||
years = value; value = 0;
|
||||
break;
|
||||
case 'M':
|
||||
if (time)
|
||||
minutes = value;
|
||||
else
|
||||
months = value;
|
||||
value = 0;
|
||||
break;
|
||||
case 'W':
|
||||
weeks = value; value = 0;
|
||||
break;
|
||||
case 'D':
|
||||
days = value; value = 0;
|
||||
break;
|
||||
case 'T':
|
||||
value = 0; time = 1;
|
||||
break;
|
||||
case 'H':
|
||||
hours = value; value = 0;
|
||||
break;
|
||||
case 'S':
|
||||
seconds = value; value = 0;
|
||||
break;
|
||||
}
|
||||
str++;
|
||||
}
|
||||
return seconds + (minutes * 60) + (hours * 3600) +
|
||||
(days * 86400) + (weeks * 7 * 86400) +
|
||||
(months * 30 * 86400) + (years * 365 * 86400);
|
||||
}
|
||||
|
@ -17,6 +17,8 @@ time_t time_from_isodate (char *str);
|
||||
time_t time_from_start_duration (time_t start, char *duration);
|
||||
char *isodate_from_time_t (time_t t);
|
||||
int get_time_t_hour (time_t t);
|
||||
int isodiff_to_secs (char *str);
|
||||
char *isodiff_from_secs (int secs);
|
||||
|
||||
time_t time_add_minutes (time_t time, int minutes);
|
||||
time_t time_add_day (time_t time, int days);
|
||||
|
Reference in New Issue
Block a user