summaryrefslogtreecommitdiffstats
path: root/src
Commit message (Collapse)AuthorAgeFilesLines
* Impossible dates in recurrence rulesLars Henriksen2019-05-201-0/+12
| | | | | | | | | | | | | | | According to RFC 5545 dates like 30 February and 31 June must be ignored when derived from a recurrence rule. calcurse relies on mktime() "normalization" of dates (e.g. turning 32 December 2019 into 1 January 2020 when moving from 31 December to the next day). Normalization may also lead to impossible dates in monthly and yearly recurrence rules, and this must be avoided. Signed-off-by: Lars Henriksen <LarsHenriksen@get2net.dk> Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Fix display of time left before next appointmentLars Henriksen2019-04-132-7/+12
| | | | | | | | | | | | | | | | | | In the notify bar, the clock is shown in hours, minutes and seconds, whereas the time left to the next appointment is shown in hours and minutes only. When you read the clock in hours and minutes (discarding the seconds), you are mentally rounding down to the nearest minute. To agree with that reading, the time left (in seconds) should be (programmatically) rounded up to the nearest minute for display. In that way the time left is counted down whenever the minute "hand" of the clock "ticks", and reaches zero when the clock reaches the time of the next appointment, not one minute before. Also, the clock (in hours and minutes) and the time left always add up to the time of the next appointment. Signed-off-by: Lars Henriksen <LarsHenriksen@get2net.dk> Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Fix daemon notification for short warning periodsLars Henriksen2019-04-131-2/+3
| | | | | | | | | | | | When the warning period for notifications is less than 60 seconds (DAEMON_SLEEP_TIME), the daemon may be at sleep when the appointment comes up. If that happens, no notification is launched. In stead, the daemon should launch the notification early. Addresses GitHub issue #204, part 2. Signed-off-by: Lars Henriksen <LarsHenriksen@get2net.dk> Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Fix one-second warning period for notificationsLars Henriksen2019-04-132-2/+2
| | | | | | | Adresses GitHub issue #204, the interactive part. Signed-off-by: Lars Henriksen <LarsHenriksen@get2net.dk> Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Use ICALDATETIMEFMT for EXDATEHenrik Grimler2019-04-131-2/+2
| | | | | | Some servers (Radicale) cannot handle YYYYMM. Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Avoid deadlock in config_save()Lars Henriksen2019-03-211-7/+8
| | | | | | | | | Must not exit with nbar.mutex locked. Addresses GitHub issue #201. Signed-off-by: Lars Henriksen <LarsHenriksen@get2net.dk> Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Fix calendar (re)drawLars Henriksen2019-03-131-10/+4
| | | | | | | | | Window erasure is moved to the drawing functions. Adresses GitHub issue #196. Signed-off-by: Lars Henriksen <LarsHenriksen@get2net.dk> Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Fix vector_remove()Lars Henriksen2019-03-131-1/+1
| | | | | Signed-off-by: Lars Henriksen <LarsHenriksen@get2net.dk> Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Change -C and -D long option namesvxid2019-03-131-2/+6
| | | | | | | | | | The config dir long option has been changed from --conf to --confdir. The data dir long option has been changed from --directory to --datadir. Both old options are kept for backward compatibility but are removed from the manual. Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* View or edit exception days of a recurrent itemLars Henriksen2019-02-283-1/+72
| | | | | | | | | | | | The exception days are presented for viewing/editing as a string of space-separated dates (in the user-preferred input format). After editing the string is checked for valid dates, but there is no check that a date is meaningful (an occurrence day of the item between start day and until day). Although possible, it is best to add exception days in the usual way by deletion of occurrences. Signed-off-by: Lars Henriksen <LarsHenriksen@get2net.dk> Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Fix empty dynamic stringLars Henriksen2019-02-281-0/+1
| | | | | Signed-off-by: Lars Henriksen <LarsHenriksen@get2net.dk> Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Check for KEY_ENTER in getstring()Lukas Fleischer2019-02-101-1/+2
| | | | | | | | In some cases (e.g., TERM=pccon0) wgetch(3) can return KEY_ENTER instead of '\n' when the return key is pressed, causing getstring() to fail. Suggested-by: Mikolaj Kucharski <mikolaj@kucharski.name> Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Use portable default day heading formatLukas Fleischer2019-02-101-1/+1
| | | | | | | | The %-d format string is not standards-compliant. Use %e instead. Reported-by: Mikolaj Kucharski <mikolaj@kucharski.name> Suggested-by: Lars Henriksen <LarsHenriksen@get2net.dk> Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Close stream after exporting iCal itemcrvs2019-02-041-0/+1
| | | | | | Fixes GitHub issue #178. Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Invalidate calendar cache when adding an exceptionLukas Fleischer2019-02-021-1/+3
| | | | | | | Removing an occurrence of a recurrent item can turn a busy day into a free day. Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Fix deletion of a multi-day recurrent appointmentLars Henriksen2019-02-021-2/+11
| | | | | | | | | | When the selected day in the calendar is a continuation day (not the first day) of such an appointment, deleting the occurrence does not work. The reason is that the selected day, and not the first day of the occurrence, is added as an exception day. Signed-off-by: Lars Henriksen <LarsHenriksen@get2net.dk> Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Refactor keys_format_label()Lukas Fleischer2019-01-191-24/+9
| | | | | | | Simplify the key formatting function and enforce display width properly using the UTF8 chopping function. Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Bind RETURN to view-item by defaultLukas Fleischer2019-01-191-2/+2
| | | | | | | | | Also, use the modern key name instead of the backwards compatibility name. Addresses GitHub issue #168. Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Overflow check for 32-bit types onlyLars Henriksen2019-01-183-14/+47
| | | | | | | Included is a check of the 'until' date for pasted recurrent items. Signed-off-by: Lars Henriksen <LarsHenriksen@get2net.dk> Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Use time_t for system time valuesLukas Fleischer2019-01-149-129/+129
| | | | Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Legalese for queue.cLars Henriksen2019-01-121-0/+36
| | | | | Signed-off-by: Lars Henriksen <LarsHenriksen@get2net.dk> Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Fix next recurring appointmentLars Henriksen2019-01-113-27/+18
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Recurring appointments do not show up in the notification bar as next appointment. This was partly corrected by 2084f35 (Fix notification of recurrent appointments, 2017-02-09) and 5aa7a09 (Fix another error in the notification code, 2017-02-11). The search function recur_apoint_starts_before() had a wrong second argument, but is really of no use: the start time of a recurring appointment is the start time of the very first occurrence (in the past). A comparison against the item in the notify_app structure tells nothing of the start time of the current day; at most it eliminates some future recurring appointments. The function can be dropped, and the entire recurring appointment list looked through. The proper start time is found in the main search loop (and called real_recur_start_time) and must be compared against the item in the notify_app structure. But because recur_apoint_find_occurrence() is limited to a particular day (second argument), two searches are necessary to cover 24 hours. Unrelated cleanups: removed function return value; changed long to time_t. Signed-off-by: Lars Henriksen <LarsHenriksen@get2net.dk> Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Initialize data paths once onlyLars Henriksen2019-01-081-2/+3
| | | | | Signed-off-by: Lars Henriksen <LarsHenriksen@get2net.dk> Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Explicit calendar and todo view configurationLars Henriksen2019-01-074-22/+66
| | | | | | | | | | | | | | | | | | | The configuration settings for calendar view (monthly/weekly) and todo view (hide/show completed) used to be saved automatically on calcurse exit, with values taken from the current interactive settings. They could not be set explicitly in the configuration menues. Configuration settings are no longer saved on program exit, but on exit from the configuration menu. This means that the saved values are those that were current when the configuration menu was entered. To change a saved value, you must set the view as desired and then enter/exit the configuration menu. The preferred calendar and todo views are no longer automatically taken from the interactive settings, but are explicitly set in the general options menu. Default values are monthly view and hide completed view. Signed-off-by: Lars Henriksen <LarsHenriksen@get2net.dk> Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Purge option glorifiedLars Henriksen2019-01-071-4/+7
| | | | | | | | | | | | | | The invert filter option is automatically set for -P (and cannot be used on the command line). The intention is that the grep option (-G) is used to find the items that should be removed. To remove them, the same command is run with -P instead of -G. In general, purge will remove matching items (silently). Backward compatibility for option -F (no invert filter). Signed-off-by: Lars Henriksen <LarsHenriksen@get2net.dk> Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Filter option: invertLars Henriksen2019-01-076-121/+128
| | | | | | | | | | | | | New filter option: --filter-invert. When present it inverts (negates) the other filter options combined. This is mostly useful with the -G option (with -Q the output is limited by the query range (day range)). The ouput from "calcurse -G <filter options>" is the (set) complement of "calcurse -G <filter options> --filter-invert". Here <filter options> may be any combination of filter options. Signed-off-by: Lars Henriksen <LarsHenriksen@get2net.dk> Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* CLI: detect conflicting filter optionsLars Henriksen2019-01-071-0/+37
| | | | | | | | Several start/end-time filter options set the same filter criterion. Only allow one such filter option at a time. Signed-off-by: Lars Henriksen <LarsHenriksen@get2net.dk> Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* CLI: Revert to and update of parse_datetimearg()Lars Henriksen2019-01-073-54/+106
| | | | | | | | | | | | | | | | | | | | | An earlier commit ("CLI: take input date format from configuration file, do not accept time") replaced parse_datetimearg() with parse_datearg() and eliminated time-of-day from command line date arguments. This made the full use of filter options impossible. That earlier commit is reverted and updated. The parse_datearg() function is replaced by an updated parse_datetimearg() function that - takes the date format from the configuration file - accepts date, date-time or time The updated parse_datetimearg() function has been extended to report back the type of the date string received in order to set (filter) options correctly. Input dates for query ranges (--from, --to, --days) are still limited to dates only. Signed-off-by: Lars Henriksen <LarsHenriksen@get2net.dk> Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Safety exit and read-only modeLars Henriksen2019-01-071-18/+35
| | | | | | | | | | | | | | | | | | | The key_generic_command() function provides a "safety exit" in case of online changes that should be dropped at exit when auto_save is on, or (NEW) should be saved at exit when in read-only mode. A check for unsaved changes has been added. The command prompt has been extended with minimal help information. After commit 05e0fd0 "Quit, autosave and interactive save" you could not leave calcurse in read-only mode with the quit command because the key_generic_quit() function interpreted IO_SAVE_CANCEL as a decision (by the user) to cancel a save-conflict and cancelled the quit as well. Now the function will quit unconditionally in read-only mode (as stated in the man page). In normal mode a check for unsaved changes has been added in case auto-save is off. Signed-off-by: Lars Henriksen <LarsHenriksen@get2net.dk> Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Fix print_date()Lars Henriksen2019-01-071-5/+8
| | | | | | | | In print_date(date, day, ...) it is silently assumed that day is midnight (beginning) of the day to be printed. Assume only that it belongs to the day. Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* CLI: do not start daemon if calcurse is runningLars Henriksen2019-01-071-1/+3
| | | | | Signed-off-by: Lars Henriksen <LarsHenriksen@get2net.dk> Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* CLI: filter options have no effect for dates before the epochLars Henriksen2019-01-073-16/+16
| | | | | | | | | | | | | | | | With the exception of filter.type_mask, a filter is only applied if set explicitly on the command line with a filter option. Whether that is the case, is determined by comparison with the initialization value. For date related filters (start_from/to, end_from/to) that is -1, hence the criterion is != -1, not >= 0. In generel, a filter initialization value should be invalid (i.e. one that cannot be set explicitly). As times before the epoch (1 January 1970 00:00:00 UTC) are negative, -1 is a valid Unix time. However, as it cannot be set from the command line, it is probably no problem? Signed-off-by: Lars Henriksen <LarsHenriksen@get2net.dk> Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* CLI: time assignments for filter optionsLars Henriksen2019-01-071-4/+21
| | | | | | | | | | | | | | | | | | | | | Explanation. There is an important difference between "to <date>" (e.g. to 15/11/2018) and "to <date time>" (e.g. to "15/11/2018 13:30"): <date> is a time span (of 24 hours), while <date time> is a point in time. "To <date>" really means "to the end of <date>", while "before <date>" means "before the beginning of <date>". There are 24 hours between the two, whereas there is only one second between "before <date time>" and "to <date time>". Similar for from/after. An earlier commit introduced parse_datearg() that only accepts a date without a time. Hence, a date should be treated as a time span from midnight to one second before next midnight. The commit also fixes an error detection bug (filter.start_from/to and filter.end_from/to were updated too early). Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* CLI: long options to override configuration file settingsLars Henriksen2019-01-071-3/+29
| | | | | | | | | | The input and output date formats may be set from the command line. Intended for scripts that must be independent of the local user configuration. Cannot be used in interactive mode. Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* CLI: take input date format from configuration file, do not accept timeLars Henriksen2019-01-072-73/+49
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Before this patch the input date parsing accepts three formats: yyyy/mm/dd, mm/dd/yyyy, yyyy-mm-dd. They are tried in sequence. It also accepts an additional time (hh:mm), or a time without a date. There are several issues with this: - it is not documented - the date format dd/mm/yyyy is not accepted - print_date() and filter option settings (in parse_args()) can only handle midnight times (which are the result of a date without time) - it is highly uncertain what happens if a time (without a date) is given; at least the -d option treats a time without colon (1215 for 12:15) as a number It seems that acceptance of time input is a by-product and not needed. For these reasons the input date parsing has been changed: - the format is taken from the configuration file (as is the case for the output date format) - only a date, and no time, is accepted Because the input date format is used during parsing of the command line, the configuration file must be loaded first, i.e. the options -D or -C must be parsed before the remaining ones. Loading the configuration file may result in errors (e.g. caused by changes between versions). For this reason config_load() has been made more tolerant and issues warnings instead of exiting. A followup patch will introduce two options to allow the configuration file settings to be overridden for input and output date formats. Signed-off-by: Lars Henriksen <LarsHenriksen@get2net.dk> Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Command line options: -P, option check, usage, helpLars Henriksen2019-01-071-25/+69
| | | | | | | | | | Option -F/--filter renamed to -P/--purge; -F retained as deprecated. Check for non-option arguments and for filter, format and query-range options only. Update of help and usage messages. Fixed --status output when calcurse is not running. Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Fix day range for queriesLars Henriksen2019-01-071-8/+6
| | | | | | | | | | | | | | | | In "--from a --to z", a is included in the range, z not. This is non-intuitive and disagrees with the semantics of "to" in filter options like --filter-start-to, where "to" (and "from") are used inclusively (as opposed to "before" and "after"). It also has the effect that "--from today --to tomorrow" has a range of 1 day, "--to z" a range of 0 days (otherwise not allowed), and "--to today --days -1" is allowed and displays yesterday! The implementation has been fixed to agree with "inclusive" semantics. Options --from and -days with negative range are allowed, while --to and --days are disallowed also when the range is negative. Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Rewrite of io_init()Lars Henriksen2018-12-144-97/+60
| | | | | | | | | | | | | | The introduction of the "-C <confdir>" option is an opportunity to review the initialization of data paths. It lead to a rewrite. Two "root" directories are used (data and configuration files); by default they are identical. The statically allocated path buffers are turned into dynamically allocated buffers. Missing files/directories now include hooks. Signed-off-by: Lars Henriksen <LarsHenriksen@get2net.dk> Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Fix priority parsing in iCal importsdott2018-11-241-1/+1
| | | | Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Fix default paths for configuration filesLukas Fleischer2018-11-101-3/+3
| | | | | | | Addresses a copy-paste typo introduced in commit 65064ce (Check if the configuration folder exists, 2018-08-25). Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* DST fix: daylength v. DAYINSECLars Henriksen2018-11-104-3/+9
| | | | | | | | | | | | | | | The number of seconds in a day and daylength in seconds differ when Daylight Saving Time is in effect on two days of the year. The day when DST takes effect is 23 hours long, and the day when DST ends is 25 hours long. In the latter case the date changing thread wóuld enter a loop in the last hour before midnight (in the former it would set the date an hour too late). The next midnight is calculated through mktime(), invoked by date2sec(). Wrong daylength prevented appointments from being stored in the day vector and caused them to be displayed wrongly in the appts panel. Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* DST fix: adjusting time in appointmentsLars Henriksen2018-11-104-13/+39
| | | | | | | | | | | | | | | | | | | | | | | | | Calcurse saves time and date information on disk as local time in readable text file format. When loaded from disk or when entered by the user, local time is converted to Unix time (seconds since 00:00:00, 1 January 1970). When displayed, and later when saved to disk, the Unix time is converted back to readable local time. Both conversions depend on DST. Hence, if midnight for a day with DST in effect (i.e. local time) is converted, increased with an amount and converted back, the amount has changed if DST is _not_ in effect for the resulting time. In general, calculations on Unix time variables should be used with caution because of the DST-dependent conversions. Instead, the calculations should be performed on local time data with the help of mktime(). The commit fixes start time for pasted appointments (ordinary and recurrent) and the 'until'-date of recurrent appointments, pasted as well as new and edited. The latter problem is slightly different in that the adjustment is a number of days, as it is for exception dates. Update of the date in parse_datetime() has been corrected to be similar to update of the time, although no problem has been identified. Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* DST fix: adding appointments on the day when DST starts or stopsLars Henriksen2018-11-101-11/+7
| | | | | | | | | | A new apppoint inserted on the day when the clock is adjusted backward by an hour got a wrong start time (an hour late). Reason: mktime() must not use the Daylight Saving Time information returned by localtime_r(). Also editorial simplifications. Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Ignore resize and error keys in getstring()Lukas Fleischer2018-10-211-0/+3
| | | | | | | Partly addresses GitHub issue #145. Suggested-by: Lars Henriksen <LarsHenriksen@get2net.dk> Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Check if the configuration folder existsQuentin Hibon2018-10-213-10/+20
| | | | Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Mutex for the system message queueLars Henriksen2018-10-211-3/+9
| | | | | | | The main thread only reads and removes events from the queue. All other threads only insert events in the queue. Hence, only insertion and removal need protection. Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Configuration variable for system eventsLars Henriksen2018-10-215-2/+18
| | | | | | | | After user acknowledgement a system event is deleted from the event queue. The configuration variable determines whether it is turned into an appointment (for later inspection) or not. Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Periodic save: report cancelled saveLars Henriksen2018-10-211-1/+3
| | | | Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* System message queueLars Henriksen2018-10-214-0/+112
| | | | | | | | | | | | | | | The screen and user interaction is managed by the main thread. Other parts of calcurse (threads) wishing to use the screen or communicate with the user, must do it via the main thread. For this purpose the main input loop is extended with a message queue. A thread may insert a message in the queue. The main thread tests for messages before listening for user commands. If a message is present, it is displayed (in a popup window) for the user to acknowledge. Depending on the message other actions may be performed, e.g. the message could be turned into a "system appointment/event" and inserted among the usual appointments. Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Quit, autosave and interactive saveLars Henriksen2018-10-211-2/+11
| | | | | | | | Quitting calcurse with auto_save on may lead to an interactive conflict resolution for the save operation. When the result is a cancellation of the save, the quit command is also cancelled. Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>