aboutsummaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
...
* Introduce multiple days in the appointments panelLars Henriksen2019-05-226-49/+115
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Overview of existing implementation ----------------------------------- The APP panel displays the 'day_items' vector in the 'lb_apt' listbox. A listbox consists of a scrollwin (structure) in which a number of items is displayed. The listbox keeps track of: - the number of items - the selected item - the type of each item in an array type[] - the height of each item (ie. how many screen lines) in an array ch[] - how to display an item (on the screen) The latter three are handled by functions fn_type(), fn_height(), fn_draw(). The first two are used to fill in the corresponding array entry, type[] or ch[], for item number i, the third draws item number i. The items are taken from the global variables vector_t day_items int day_items_nb in day.c. Items include captions (DAY_HEADING, DAY_SEPARATOR). Everything is sorted for display (DAY_HEADING, events, DAY_SEPARATOR, appts). These are filled in ("stored") [by day_store_items() for the selected day in the calendar], before being "loaded" into the listbox. See do_storage() in calcurse.c and ui_day_item_add() in ui-day.c. New APP panel design -------------------- Several days are displayed in the APP panel by loading them with day_store_items(). With several days come several headings and separators. DAY_SEPARATOR is reinterpreted to separate days, and a new separator, EVNT_SEPARATOR, separates events from appointments. To sort everything, an 'order' member of type time_t is added to the day_item structure. It is set for headings and separators as well as for appointments and events as follows: item order --------------------- DAY_HEADING BGNOFDAY (= midnight) EVNT_SEPARATOR BGNOFDAY DAY_SEPARATOR ENDOFDAY event start time (midnight) appointment start time (first day) BGNOFDAY (following days, if any) The sort function day_cmp() (used by vector_sort) is extended to sort by order first. The order field always indicates the day to which an item belongs. This comes in handy, because with several days in the APP panel it is necessary to distinguish between the selected day in the calendar and the selected day in the APP panel. This raises the question which day should actions (commands) operate on: the one selected in the calendar or the one selected in the APP panel? Unquestionably the one on the APP panel which is the one tacitly implied. In most cases it is not a problem, though, because actions work on the selected item and the selected day does not come into play. But in some cases it does: delete item When deleting an occurrence of a repeated item, the selected day is the exception day to add. view item day_popup_item() needs the day of the selected item for display of correct start/end times. cut/paste item Paste needs the selected day in which to paste. add item The day of the new item is taken from the calendar. Instead a dummy event is inserted in an empty day. This makes the day selectable, which is otherwise impossible with only the DAY_HEADING displayed. The dummy event is selectable but cannot be edited or deleted (but viewed or piped). With more than one day in the day_items vecter, an appointment spanning more than one day may occur more than once in the vector (with start/end times suitably adjusted for display). A day_item is no longer (always) identified by the aptev_ptr (item) value. Instead the combination (order, item.<ptr>) is used; order is roughly the day. Signed-off-by: Lars Henriksen <LarsHenriksen@get2net.dk> Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Simplify day storageLars Henriksen2019-05-226-44/+15
| | | | | | | | | | | The function day_process_storage() is a wrapper for day_store_items(). It has an unused second argument, and is only used twice to load the selected day. It has been removed. A new function, get_slctd_day(), is the equivalant of get_today() and replaces the very awkwardly named ui_calendar_get_slctd_day_sec(). Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Fix initialization of the day_items vectorLars Henriksen2019-05-221-0/+1
| | | | | | | | | | | | | | | | This patch fixes all failings tests, but one, in PR #193. Until now the missing initialization of day_items_nb has caused no problems, because the variable was assigned to (=) before being used. In the Multiple days implementation it is repeatedly increased (+=) in a loop without being initialized first. Indeed, this may considered an easily fixed bug. But the initialization really belongs in day_init_vector() so that the call day_item_count(0) returns 0 if done right after the call day_init_vector(). The bug only shows up in command line mode because day_items_nb is not used in interactive mode. Signed-off-by: Lars Henriksen <LarsHenriksen@get2net.dk> Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Refactor listbox codeLars Henriksen2019-05-223-40/+49
| | | | | | | | | | | | | | | | | | | | | | | | | The changes are related to the selected item and the visible lines in the scroll window viewport. In particular, the function listbox_fix_visible_region() has been eliminated, and functions previously only called by it have been removed. It performed several tasks that are now elsewhere. One was removed in an earlier commit (scroll window pad improvement). The task of making a multi-line item visible has been moved to listbox_item_in_view(). The task of making a caption line above a text line visible is listbox specific (for the ap_list) and will be moved to ui_day_sel_move(), where it is needed. Boundary checks for the listbox selection have been moved to listbox_fix_sel(). For future use listbox_sel_move() returns success or failure. The function wins_scrollwin_ensure_visible() has been renamed wins_scrollwin_in_view(). Signed-off-by: Lars Henriksen <LarsHenriksen@get2net.dk> Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Improve scroll window padLars Henriksen2019-05-224-24/+16
| | | | | | | | | | | | | | | | | | | A scroll window consists of a pad to write on, and a window through which to view the pad, the viewport. The pad may change in size when new contents are loaded into the scroll window. If so, the pad size is set with wins_scrollwin_set_linecount(). But the offset into the pad (the top line to be displayed in the viewport) is not adjusted, although it may not be appropriate for the new pad size. The same is the case when a scroll window is resized and the viewport changes size. This is probably the cause of the problem solved by commit 0b46ad4, Avoid blank space after the last list box item, and the fix has been removed. The wins_scrollwin_set_linecount() has been renamed wins_scrollwin_set_pad() and sets size as well as offset. The offset is only changed if necessary. Signed-off-by: Lars Henriksen <LarsHenriksen@get2net.dk> Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Test cases for impossible dates in recurrence ruleLars Henriksen2019-05-203-1/+54
| | | | | Signed-off-by: Lars Henriksen <LarsHenriksen@get2net.dk> Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* 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>
* New test cases for next appoinmentLars Henriksen2019-04-133-0/+40
| | | | | | | | The change by commit "Fix display of time left before next appointment" is not detected by the existing test because the time set has zero seconds. 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>
* Add support for vdir synchronizationvxid2019-03-146-3/+332
| | | | | | | | | | | Add a script to synchronize calcurse with a VDIR collection. Add a wrapper script around vdirsyncer to automatically synchronize calcurse data to a vdirsyncer collection. Add script documentation and Makefile. Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Make AsciiDoc check more stringentBrandon Munger2019-03-131-0/+10
| | | | | | | Add an additional check to configure.ac to error out if AsciiDoc is not found and pre-built documentation also does not exist. 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-132-6/+10
| | | | | | | | | | 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>
* calcurse-caldav: add custom data directory supportvxid2019-03-121-11/+21
| | | | | | | Added the --datadir flag to calcurse-caldav which enables to specify a custom calcurse data directory similarly to the -D flag in calcurse. 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>
* Fix note on -P in the 4.4.0 release notesLukas Fleischer2019-02-242-2/+4
| | | | | Reported-by: Lars Henriksen <LarsHenriksen@get2net.dk> Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Release 4.4.0v4.4.0Lukas Fleischer2019-02-213-3/+83
| | | | Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Update po filesLukas Fleischer2019-02-217-699/+1978
| | | | | | | This is just automated updates from `make update-po` and does not include any new translations from Transifex. 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>
* calcurse-caldav: fix -x argumentLukas Fleischer2019-02-101-1/+1
| | | | | | | | The optional argument to -x must be given as "-xical" (without a space). Partly addresses GitHub issue #177. 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>
* calcurse-caldav: drop misplaced filter argumentLukas Fleischer2019-02-021-1/+0
| | | | | | | | | | | We cannot use the filter options when importing events. This was noticed because the new calcurse argument parser catches invalid input flag combinations and bails out. Partly addresses GitHub issue #177. Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* doc/flag.txt: fix typoLukas Fleischer2019-01-241-2/+1
| | | | 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>
* Update message catalogLukas Fleischer2019-01-121-86/+209
|
* 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>
* CLI: tests alignedLars Henriksen2019-01-073-3/+3
| | | | Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Update man pageLars Henriksen2019-01-071-362/+576
| | | | | | | Rework man page. Add invert filter and purge option. 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>