diff options
Diffstat (limited to 'src/calcurse.h')
-rw-r--r-- | src/calcurse.h | 193 |
1 files changed, 121 insertions, 72 deletions
diff --git a/src/calcurse.h b/src/calcurse.h index 39f46b7..8322416 100644 --- a/src/calcurse.h +++ b/src/calcurse.h @@ -1,7 +1,7 @@ /* * Calcurse - text-based organizer * - * Copyright (c) 2004-2017 calcurse Development Team <misc@calcurse.org> + * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org> * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -84,7 +84,8 @@ #endif /* ENABLE_NLS */ /* Paths configuration. */ -#define DIR_NAME ".calcurse/" +#define DIR_NAME "calcurse/" +#define DIR_NAME_LEGACY ".calcurse/" #define TODO_PATH_NAME "todo" #define APTS_PATH_NAME "apts" #define CONF_PATH_NAME "conf" @@ -110,9 +111,6 @@ #define STATUSHEIGHT 2 #define MAX_NOTESIZ 40 -/* Format for appointment hours is: HH:MM */ -#define HRMIN_SIZE 6 - /* Maximum number of colors available. */ #define NBUSERCOLORS 6 @@ -141,12 +139,20 @@ */ #define DAYINSEC (DAYINMIN * MININSEC) #define NEXTDAY(date) date_sec_change((date), 0, 1) +#define PREVDAY(date) date_sec_change((date), 0, -1) #define DAYLEN(date) (NEXTDAY(date) - (date)) #define ENDOFDAY(date) (NEXTDAY(date) - 1) #define HOURINSEC (HOURINMIN * MININSEC) +#define DAY(date) (update_time_in_date(date, 0, 0)) /* Calendar window. */ #define CALHEIGHT 8 +/* + * Week day numbering (0, 1,..., 6) which depends on the first day of the week. + * The argument (d) is the "Sunday"-numbering of member tm_wday in struct tm. + */ +#define WDAY(d) \ + (modify_wday(d, -ui_calendar_get_wday_start())) /* Key definitions. */ #define CTRLVAL 0x1F @@ -160,8 +166,11 @@ #define KEYS_LABELEN 8 /* length of command description */ #define KEYS_CMDS_PER_LINE 6 /* max number of commands per line */ -/* Register definitions. */ -#define REG_BLACK_HOLE 37 +/* + * Register definitions, see ui_day.c. + * Index 0-35 is used for '0'-'9' and 'a'-'z', see keys_get(). + */ +#define REG_BLACK_HOLE 36 /* Size of the hash table the note garbage collector uses. */ #define NOTE_GC_HSIZE 1024 @@ -281,7 +290,6 @@ struct conf { unsigned confirm_delete; enum win default_panel; unsigned compact_panels; - unsigned system_dialogs; unsigned multiple_days; unsigned header_line; unsigned event_separator; @@ -295,9 +303,11 @@ struct conf { int input_datefmt; /* format for reading date */ enum pos heading_pos; /* left/center/right for heading in appts panel */ char day_heading[BUFSIZ]; /* format for displaying heading in appts panel */ + char timefmt[BUFSIZ]; /* format for displaying time in appts panel*/ }; #define EMPTY_DAY_DEFAULT "--" +#define EMPTY_EVENT_DESC_DEFAULT _("(empty description)") /* Daemon-related configuration. */ struct dmon_conf { @@ -327,6 +337,9 @@ enum datefmt { /* Day heading default format. */ #define DAY_HEADING_DEFAULT "%B %e, %Y" +/* Appointment time default format. */ +#define APPT_TIME_DEFAULT "%H:%M" + /* * Calcurse representation of the date of a day in the calendar. * When time_t is a 32-bit signed integer, the year range is 1902 - 2037. @@ -375,40 +388,57 @@ struct excp { }; enum recur_type { - RECUR_NO, RECUR_DAILY, RECUR_WEEKLY, RECUR_MONTHLY, RECUR_YEARLY, - RECUR_TYPES + NBRECUR }; -/* To describe an item's repetition. */ +/* + * Recurrence rule according to RFC5545; used + * - in each recurrent appointment/event instance + * - in passing parameters as a single function argument + */ struct rpt { - enum recur_type type; /* repetition type */ - int freq; /* repetition frequency */ - time_t until; /* ending date for repeated event */ + enum recur_type type; /* FREQ */ + int freq; /* INTERVAL */ + time_t until; /* UNTIL */ + llist_t bymonth; /* BYMONTH list */ + llist_t bywday; /* BY(WEEK)DAY list */ + llist_t bymonthday; /* BYMONTHDAY list */ + llist_t exc; /* EXDATE's */ }; +/* Types of integers in rrule lists. */ +typedef enum { + BYMONTH, + BYDAY_W, + BYDAY_M, + BYDAY_Y, + BYMONTHDAY, + NOLL +} int_list_t; + /* Recurrent appointment definition. */ struct recur_apoint { - struct rpt *rpt; /* information about repetition */ - llist_t exc; /* days when the item should not be repeated */ - time_t start; /* beggining of the appointment */ - long dur; /* duration of the appointment */ - char state; /* 8 bits to store item state */ - char *mesg; /* appointment description */ - char *note; /* note attached to appointment */ + struct rpt *rpt; /* recurrence rule */ + llist_t exc; /* recurrence exceptions (NOT rpt->exc) */ + time_t start; /* start time */ + long dur; /* duration */ + char state; /* item state */ + char *mesg; /* description */ + char *note; /* attached note */ }; -/* Reccurent event definition. */ +/* Recurrent event definition. */ struct recur_event { - struct rpt *rpt; /* information about repetition */ - llist_t exc; /* days when the item should not be repeated */ + struct rpt *rpt; /* recurrence rule */ + llist_t exc; /* recurrence exceptions (NOT rpt->exc) */ int id; /* event type */ - time_t day; /* day at which event occurs */ - char *mesg; /* event description */ - char *note; /* note attached to event */ + time_t day; /* day of the event */ + char *mesg; /* description */ + char *note; /* attached note */ }; /* Generic pointer data type for appointments and events. */ @@ -484,11 +514,11 @@ struct notify_app { struct io_file { FILE *fd; - char name[BUFSIZ]; + char *name; }; -/* Available keys. */ -enum key { +/* Virtual keys. */ +enum vkey { KEY_GENERIC_CANCEL, KEY_GENERIC_SELECT, KEY_GENERIC_CREDITS, @@ -499,6 +529,7 @@ enum key { KEY_GENERIC_COPY, KEY_GENERIC_PASTE, KEY_GENERIC_CHANGE_VIEW, + KEY_GENERIC_PREV_VIEW, KEY_GENERIC_IMPORT, KEY_GENERIC_EXPORT, KEY_GENERIC_GOTO, @@ -538,7 +569,7 @@ enum key { KEY_RAISE_PRIORITY, KEY_LOWER_PRIORITY, - NBKEYS, + NBVKEYS, KEY_UNDEF, /* Non-configurable, context sensitive key bindings. */ @@ -643,7 +674,6 @@ struct nbar { char datefmt[BUFSIZ]; /* format for displaying date */ char timefmt[BUFSIZ]; /* format for displaying time */ char cmd[BUFSIZ]; /* notification command */ - const char *shell; /* user shell to launch notif. cmd */ unsigned notify_all; /* notify all appointments */ pthread_mutex_t mutex; }; @@ -758,7 +788,7 @@ void apoint_sec2str(struct apoint *, time_t, char *, char *); char *apoint_tostr(struct apoint *); char *apoint_hash(struct apoint *); void apoint_write(struct apoint *, FILE *); -struct apoint *apoint_scan(FILE *, struct tm, struct tm, char, char *, +char *apoint_scan(FILE *, struct tm, struct tm, char, char *, struct item_filter *); void apoint_delete(struct apoint *); struct notify_app *apoint_check_next(struct notify_app *, time_t); @@ -782,7 +812,7 @@ void ui_calendar_set_current_date(void); struct date *ui_calendar_get_today(void); void ui_calendar_set_first_day_of_week(enum wday); void ui_calendar_change_first_day_of_week(void); -unsigned ui_calendar_week_begins_on_monday(void); +int ui_calendar_get_wday_start(void); void ui_calendar_store_current_date(struct date *); void ui_calendar_init_slctd_day(void); struct date *ui_calendar_get_slctd_day(void); @@ -828,6 +858,7 @@ void day_display_item_date(struct day_item *, WINDOW *, int, time_t, int, int); void day_display_item(struct day_item *, WINDOW *, int, int, int, int); void day_write_stdout(time_t, const char *, const char *, const char *, const char *, int *); +void day_do_storage(int day_changed); void day_popup_item(struct day_item *); int day_check_if_item(struct date); unsigned day_chk_busy_slices(struct date, int, int *); @@ -856,7 +887,7 @@ unsigned event_inday(struct event *, time_t *); char *event_tostr(struct event *); char *event_hash(struct event *); void event_write(struct event *, FILE *); -struct event *event_scan(FILE *, struct tm, int, char *, struct item_filter *); +char *event_scan(FILE *, struct tm, int, char *, struct item_filter *); void event_delete(struct event *); void event_paste_item(struct event *, time_t); int event_dummy(struct day_item *); @@ -872,9 +903,9 @@ int display_help(const char *); int run_hook(const char *); /* ical.c */ -void ical_import_data(FILE *, FILE *, unsigned *, unsigned *, unsigned *, - unsigned *, unsigned *, const char *, const char *, - const char *, const char *, const char *); +void ical_import_data(const char *, FILE *, FILE *, unsigned *, unsigned *, + unsigned *, unsigned *, unsigned *, const char *, + const char *, const char *, const char *, const char *); void ical_export_data(FILE *, int); /* io.c */ @@ -897,9 +928,8 @@ unsigned io_dir_exists(const char *); unsigned io_file_exists(const char *); int io_check_file(const char *); int io_check_data_files(void); -void io_startup_screen(int); void io_export_data(enum export_type, int); -void io_import_data(enum import_type, const char *, const char *, const char *, +int io_import_data(enum import_type, char *, const char *, const char *, const char *, const char *, const char *); struct io_file *io_log_init(void); void io_log_print(struct io_file *, int, const char *); @@ -911,7 +941,6 @@ void io_set_lock(void); unsigned io_dump_pid(char *); unsigned io_get_pid(char *); int io_files_equal(const char *, const char *); -int io_file_is_empty(char *); int io_file_cp(const char *, const char *); void io_unset_modified(void); void io_set_modified(void); @@ -921,24 +950,26 @@ int io_get_modified(void); void keys_init(void); void keys_free(void); void keys_dump_defaults(char *); -const char *keys_get_label(enum key); -enum key keys_get_action(int); +const char *keys_get_label(enum vkey); +const char *keys_get_binding(enum vkey); +enum vkey keys_get_action(int); int keys_wgetch(WINDOW *); void keys_wait_for_any_key(WINDOW *); -enum key keys_get(WINDOW *, int *, int *); -int keys_assign_binding(int, enum key); -void keys_remove_binding(int, enum key); +enum vkey keys_get(WINDOW * win, int *, int *); +int keys_assign_binding(int, enum vkey); +void keys_remove_binding(int, enum vkey); int keys_str2int(const char *); char *keys_int2str(int); -int keys_action_count_keys(enum key); -const char *keys_action_firstkey(enum key); -const char *keys_action_nkey(enum key, int); -char *keys_action_allkeys(enum key); +int keys_action_count_keys(enum vkey); +const char *keys_action_firstkey(enum vkey); +const char *keys_action_nkey(enum vkey, int); +char *keys_action_allkeys(enum vkey); void keys_display_bindings_bar(WINDOW *, int *, int, int, int); -void keys_popup_info(enum key); +void keys_popup_info(enum vkey); void keys_save_bindings(FILE *); -int keys_check_missing_bindings(void); -void keys_fill_missing(void); +int keys_check_missing(void); +int keys_check_undefined(void); +int keys_fill_missing(void); /* listbox.c */ void listbox_init(struct listbox *, int, int, int, int, const char *, @@ -994,6 +1025,7 @@ void edit_note(char **, const char *); void view_note(const char *, const char *); void erase_note(char **); void note_read(char *, FILE *); +void note_read_contents(char *, size_t, FILE *); void note_gc(void); /* notify.c */ @@ -1025,7 +1057,11 @@ void pcal_export_data(FILE *); /* recur.c */ extern llist_ts_t recur_alist_p; extern llist_t recur_elist; -int recur_update_exc(llist_t *, char *); +void recur_free_int_list(llist_t *); +void recur_int_list_dup(llist_t *, llist_t *); +void recur_free_exc_list(llist_t *); +void recur_exc_dup(llist_t *, llist_t *); +int recur_str2exc(llist_t *, char *); char *recur_exc2str(llist_t *); struct recur_event *recur_event_dup(struct recur_event *); struct recur_apoint *recur_apoint_dup(struct recur_apoint *); @@ -1038,17 +1074,16 @@ void recur_event_llist_init(void); void recur_apoint_llist_free(void); void recur_event_llist_free(void); struct recur_apoint *recur_apoint_new(char *, char *, time_t, long, char, - int, int, time_t, llist_t *); -struct recur_event *recur_event_new(char *, char *, time_t, int, int, int, - time_t, llist_t *); + struct rpt *); +struct recur_event *recur_event_new(char *, char *, time_t, int, + struct rpt *); char recur_def2char(enum recur_type); int recur_char2def(char); -struct recur_apoint *recur_apoint_scan(FILE *, struct tm, struct tm, - char, int, struct tm, char *, - llist_t *, char, struct item_filter *); -struct recur_event *recur_event_scan(FILE *, struct tm, int, char, - int, struct tm, char *, llist_t *, - struct item_filter *); +char *recur_apoint_scan(FILE *, struct tm, struct tm, char, + char *, struct item_filter *, + struct rpt *); +char *recur_event_scan(FILE *, struct tm, int, char *, + struct item_filter *, struct rpt *); char *recur_apoint_tostr(struct recur_apoint *); char *recur_apoint_hash(struct recur_apoint *); void recur_apoint_write(struct recur_apoint *, FILE *); @@ -1056,22 +1091,29 @@ char *recur_event_tostr(struct recur_event *); char *recur_event_hash(struct recur_event *); void recur_event_write(struct recur_event *, FILE *); void recur_save_data(FILE *); -unsigned recur_item_find_occurrence(time_t, long, llist_t *, int, - int, time_t, time_t, time_t *); +unsigned recur_item_find_occurrence(time_t, long, struct rpt *, llist_t *, + time_t, time_t *); unsigned recur_apoint_find_occurrence(struct recur_apoint *, time_t, time_t *); unsigned recur_event_find_occurrence(struct recur_event *, time_t, time_t *); -unsigned recur_item_inday(time_t, long, llist_t *, int, int, time_t, time_t); +unsigned recur_item_inday(time_t, long, struct rpt *, llist_t *, time_t); unsigned recur_apoint_inday(struct recur_apoint *, time_t *); unsigned recur_event_inday(struct recur_event *, time_t *); void recur_event_add_exc(struct recur_event *, time_t); void recur_apoint_add_exc(struct recur_apoint *, time_t); void recur_event_erase(struct recur_event *); void recur_apoint_erase(struct recur_apoint *); +void recur_bymonth(llist_t *, FILE *); +void recur_bywday(enum recur_type, llist_t *, FILE *); +void recur_bymonthday(llist_t *, FILE *); void recur_exc_scan(llist_t *, FILE *); void recur_apoint_check_next(struct notify_app *, time_t, time_t); void recur_apoint_switch_notify(struct recur_apoint *); void recur_event_paste_item(struct recur_event *, time_t); void recur_apoint_paste_item(struct recur_apoint *, time_t); +int recur_next_occurrence(time_t, long, struct rpt *, llist_t *, time_t, time_t *); +int recur_nth_occurrence(time_t, long, struct rpt *, llist_t *, int, time_t *); +int recur_prev_occurrence(time_t, long, struct rpt *, llist_t *, time_t, time_t *); + /* sigs.c */ void sigs_init(void); @@ -1114,6 +1156,7 @@ void ui_day_item_delete(unsigned); void ui_day_item_edit(void); void ui_day_item_pipe(void); void ui_day_item_repeat(void); +void ui_day_item_cut(unsigned); void ui_day_item_cut_free(unsigned); void ui_day_item_copy(unsigned); void ui_day_item_paste(unsigned); @@ -1183,7 +1226,7 @@ int get_item_min(time_t); struct tm date2tm(struct date, unsigned, unsigned); time_t date2sec(struct date, unsigned, unsigned); struct date sec2date(time_t); -time_t utcdate2sec(struct date, unsigned, unsigned); +time_t tzdate2sec(struct date, unsigned, unsigned, char *); int date_cmp(struct date *, struct date *); int date_cmp_day(time_t, time_t); char *date_sec2date_str(time_t, const char *); @@ -1193,6 +1236,8 @@ time_t date_sec_change(time_t, int, int); time_t update_time_in_date(time_t, unsigned, unsigned); time_t get_sec_date(struct date); long min2sec(unsigned); +int modify_wday(int,int); +char *get_wday_default_string(int); void draw_scrollbar(struct scrollwin *, int); void item_in_popup(const char *, const char *, const char *, const char *); time_t get_today(void); @@ -1209,13 +1254,13 @@ int check_sec(time_t *); int check_time(unsigned, unsigned); int parse_time(const char *, unsigned *, unsigned *); int parse_duration(const char *, unsigned *, time_t); -int parse_date_duration(const char *, unsigned *, time_t); +int parse_date_increment(const char *, unsigned *, time_t); int parse_datetime(const char *, time_t *, time_t); void file_close(FILE *, const char *); void psleep(unsigned); -int fork_exec(int *, int *, const char *, const char *const *); -int shell_exec(int *, int *, const char *, const char *const *); -int child_wait(int *, int *, int); +int fork_exec(int *, int *, int *, int, const char *, const char *const *); +int shell_exec(int *, int *, int *, int, const char *, const char *const *); +int child_wait(int *, int *, int *, int); void press_any_key(void); void print_apoint(const char *, time_t, struct apoint *); void print_event(const char *, time_t, struct event *); @@ -1227,9 +1272,12 @@ int asprintf(char **, const char *, ...); int starts_with(const char *, const char *); int starts_with_ci(const char *, const char *); int hash_matches(const char *, const char *); -int show_dialogs(void); long overflow_add(long, long, long *); long overflow_mul(long, long, long *); +time_t next_wday(time_t, int); +int wday_per_year(int, int); +int wday_per_month(int, int, int); +char *day_ins(char **, time_t); /* vars.c */ extern int col, row; @@ -1285,6 +1333,7 @@ void wins_sbar_wdec(void); enum win wins_slctd(void); void wins_slctd_set(enum win); void wins_slctd_next(void); +void wins_slctd_prev(void); void wins_init(void); void wins_scrollwin_init(struct scrollwin *, int, int, int, int, const char *); void wins_scrollwin_resize(struct scrollwin *, int, int, int, int); |