Commit Graph
100 Commits
Author SHA1 Message Date
Lukas Fleischer 8ee78c14af Add calcurse-dateutil
Add a script to iterate over a certain date range, performing operations
on each of the dates and printing the result. An additional string can
be appended to each of the printed lines.

The script can be used to create "extended recurrent events". For
example

    ./calcurse-dateutil.py --date 2017-01-01 --range 365 --unique \
        --append ' [1] Test event' bom next-weekday 3 skip-days 14

can be used to print an event for each third Thursday of each month in
2017.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2017-09-08 22:35:36 +02:00
Lukas Fleischer 8ab3106f6b git-version-gen: Add default version
Instead of bailing out early in the build process when neither a version
file nor a valid Git repository is detected, use a hardcoded default
version string. This fixes building from shallow clones or Git
snapshots.

Also fixes GitHub issue #22.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2017-09-08 22:35:36 +02:00
Lukas Fleischer 2fe9c7efce Reload data after resolving save conflict
After resolving a save conflict with the merge tool, we need to reload
the data files to import the result of the conflict resolution.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2017-09-08 21:23:25 +02:00
Lukas Fleischer e943a8a4db Unset modification flag after merging
Turn off the local modification flag to avoid a bogus warning when
reloading the data files immediately after the merge process.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2017-09-08 21:22:22 +02:00
Lukas Fleischer f69698569f Recompute hashes after saving
After saving the data files, we need to recompute and store the hashes
to make sure the updated contents is reflected.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2017-09-08 21:21:45 +02:00
Lukas Fleischer 380124c7a2 Factor out hash computation
Move code to compute the hash of a data file to a separate function.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2017-09-08 21:21:11 +02:00
Lukas Fleischer 7a0134204e Use a shared input/output mutex
Replace the save mutex with a common mutex, which is locked whenever
read or write operations on the data files are performed. Also, since
this mutex is an implementation detail, mark the locking functions
static and remove them from the header file.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2017-09-08 21:08:54 +02:00
Lukas Fleischer 0f3d1988bf Interrupt periodic save when launching process
To avoid interactions between the periodic save thread and external
processes, stop the periodic save thread before launching an external
program and restart the thread as soon as the program is terminated.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2017-09-08 21:08:54 +02:00
Lukas Fleischer 57dd3d6b66 Only reload if data files were changed
Instead of blindly reloading data in io_reload_data(), compare the
stored hashes of the data files with hashes of the current file contents
and only reload if any of the hashes differs.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2017-09-08 21:08:54 +02:00
Lukas Fleischer ba85d9b6f5 Factor out check for external modifications
Move the check to compare the stored hashes of the data files with the
current hash to a separate function. This makes the code easier to read
and reusable.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2017-09-08 21:08:54 +02:00
Lukas Fleischer 9137590e7a Do not blindly overwrite files when saving
When reading the data files, compute a cryptographic hash of the file
contents and store it. When saving the files later, ensure that the hash
still matches the current file contents. If it does not, show a warning
to the user and ask whether she wants to execute the merge tool.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2017-09-08 21:08:53 +02:00
Lukas Fleischer fb1524b4e2 Use .new as file extension when merging
Using the file name extension .sav and naming the variables "backup" is
slightly misleading, since the affected files actually contain the
updated content and not some old snapshot. Use the term "new" instead.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2017-09-08 21:08:53 +02:00
Lukas Fleischer e5a824e576 Factor out merge routine
Move the code, which runs the merge tool with current and updated data
files, to a separate function to make it reusable.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2017-09-08 21:08:53 +02:00
Lukas Fleischer 74d90e7cbc Add CALCURSE_{EDITOR,PAGER,MERGETOOL} environment variables
Support environment variables specific to calcurse to override $EDITOR,
$PAGER and $MERGETOOL.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2017-09-08 21:08:53 +02:00
Lukas Fleischer 2e584f03e6 Replace remaining uses of wgetch() by keys_wgetch()
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2017-09-03 16:37:35 +02:00
Lukas Fleischer 53f0f1d2e3 Add a function to wait for any key press
Introduce a new function keys_wait_for_any_key() and use it instead of
wgetch() whenever the return value is discarded.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2017-09-03 16:37:35 +02:00
Lukas Fleischer 8373ecfe51 Improve default selection when editing key bindings
When adding a new key binding, automatically select the new binding.
When removing a key binding, keep the selection index (unless the last
binding of a row is removed).

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2017-09-03 15:51:01 +02:00
Lukas Fleischer 6521d8cc0a Use strncpy() properly in general_option_edit()
Always use strncpy() to copy strings between fixed-size buffers and pass
the buffer size as maximal length parameter.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2017-09-03 09:31:33 +02:00
Lukas Fleischer 578091f051 Add support for UTF-8 key bindings
A new function keys_wgetch() reads full UTF-8 characters instead of
single ASCII characters only.

Key bindings for regular ASCII characters are stored in a hash map while
the actions of keys with higher code points are stored in a linked list
for space efficiency.

The key serialization methods are updated to handle UTF-8 characters as
well; extended UTF-8 characters (characters not in the ASCII range) are
serialized by using the hexadecimal representation of the corresponding
code points (e.g. "U+00E4").

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2017-08-30 16:39:23 +02:00
Lukas Fleischer 8544e4a570 Rename keys_getch() to keys_get()
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2017-08-30 16:26:10 +02:00
Lukas Fleischer 273e32d43d Factor out UTF-8 code point decoding
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2017-08-30 16:17:28 +02:00
Lukas Fleischer 6cb26c2f27 Relocate HANDLE_KEY macros
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2017-08-30 16:15:39 +02:00
Lukas Fleischer fad4a5f4e0 Add basic Travis CI support
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2017-08-28 07:30:38 +02:00
Lukas Fleischer bebc46fb63 Rename README to README.md
Make sure that the Markdown syntax already used in the README file is
recognized by repository browsers such as cgit or GitHub.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2017-08-28 07:30:38 +02:00
Lukas Fleischer 550a2e9379 Extend strings API for formatted dates
Add two new functions string_catftime(), resp. string_strftime(), which
can be used to append, resp. print, a formatted date to a dynamic
string.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2017-08-28 07:30:38 +02:00
Lukas Fleischer 8d85a58a26 ical-002: Fix broken test
In the expected output, the punctual appointment (lasting one second in
the iCal data) was missing. The test was not failing because calcurse
did not print the missing item due to a bug. This bug was fixed by
7924315 (Fix support for punctual appointments at 00:00, 2017-08-28),
making the test case fail. Fix the test case as well such that
everything behaves as expected again.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2017-08-28 07:30:15 +02:00
Lukas Fleischer 7924315bfb Fix support for punctual appointments at 00:00
When checking whether an appointment belongs to a given day in
apoint_inday(), the return value was 0 if the end time of the
appointment matched 00:00 on that day (because we do not want to include
appointments starting on the day before and lasting until midnight).
However, this means that punctual appointments at 00:00 were not
included in any day. Fix the apoint_inday() logic to take this into
consideration.

Fixes GitHub issue #39.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2017-08-28 07:06:06 +02:00
Lukas Fleischer e76b96c9ff calcurse-caldav: Specify depth in the initial request
For the initial calendar-query request, set the Depth header to 1. This
is required because according to RFC 4791, the depth value defaults to 0
if no header is specified.

Fixes GitHub issue #38.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2017-08-28 06:42:53 +02:00
Lukas Fleischer 43cd40e8ce Include stdarg.h when using variable argument lists
Fixes GitHub issue #36.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2017-07-28 16:09:43 +02:00
Lukas Fleischer 5722d2ea4c Fix segmentation fault when changing colors
The pair_content() function can be used to retrieve a color pair. The
foreground and the background color numbers are written to addresses
specified by the second and third parameters. While both parameters were
optional in older ncurses implementations (making it possible to pass
NULL pointers if the one does not care about either foreground or
background color), recent implementations seem to assume that both
parameters are valid pointers. Thus, instead of passing NULL, we need to
pass a pointer to a dummy variable when we do not care about the
background color.

Partly fixes GitHub issue #31.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2017-07-28 16:02:46 +02:00
Lukas Fleischer 5aa7a0962a Fix another error in the notification code
In addition to checking whether a recurrent item predates the current
next appointment, we need to check that the actual occurrence of the
item predates the current appointment as well.

Fixes GitHub issue #26.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2017-02-11 11:50:51 +01:00
Lukas Fleischer 2084f353e3 Fix notification of recurrent appointments
The recur_apoint_starts_before() filter function expected the second
parameter to be passed by value, whereas its only caller passed the
value by reference. For consistency with apoint_starts_after(), change
the signature and the implementation of recur_apoint_starts_before()
such that the parameter is passed by reference.

Also, add a comment to the only caller of recur_apoint_starts_before()
to clarify on why recur_apoint_starts_before() is used.

Fixes GitHub issue #25.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2017-02-09 08:43:32 +01:00
Lukas Fleischer ed6035afb1 Do not read past NUL character in ical_get_value()
Make sure we never read beyond the end of the buffer, even if the
terminating quote of a quoted string is missing.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2017-02-08 07:32:35 +01:00
Lukas Fleischer e4e2e0eb20 Gracefully parse iCal parameters with colons
According to RFC 5545, iCalendar content lines can have optional
parameters, which can be quoted strings containing colons (":"). Make
sure that such colons are not interpreted as delimiters marking the
start of the value string.

Also, add a test case that covers this corner case.

Reported-by: Håkan Jerning <jerning@home.se>
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2017-02-07 21:54:05 +01:00
Lukas Fleischer 3375fddb4e Release 4.2.2
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2017-01-14 14:09:46 +01:00
Lukas Fleischer 9f6678bc49 Update copyright ranges
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2017-01-12 08:40:30 +01:00
Lukas Fleischer e2086c426c calcurse-caldav: Use right diffs when synchronizing
Some parameters where swapped accidentally when reworking the diff
computation in c8d3d87 (calcurse-caldav: Compute diffs before
synchronizing, 2016-12-13) such that the synchronization functions were
working with incorrect diffs since that commit. Exchange the parameters
again to fix this.

Reported-by: Guillaume Laurès <guillaume@lauresfamily.fr>
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-12-15 18:41:24 +01:00
Lukas Fleischer 6a80e156dd calcurse-caldav: Fix scrambled comment
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-12-13 18:47:38 +01:00
Lukas Fleischer c8d3d87c84 calcurse-caldav: Compute diffs before synchronizing
Instead of computing the objects to push/pull on-demand, use a snapshot
of the synchronization database taken before the synchronization process
starts.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-12-13 18:32:12 +01:00
Lukas Fleischer 338e556f8d calcurse-caldav: Fix appointment imports
When importing an appointment from the server, make sure we store a hash
of the item in the sync DB, and not the serialized item itself.

Reported-by: Guillaume Laurès <guillaume@lauresfamily.fr>
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-12-08 21:43:35 +01:00
Lukas Fleischer e70b41bda9 calcurse-caldav: Add debug output for sync DB operations
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-12-08 16:22:00 +01:00
Lukas Fleischer 9fdb714aea calcurse-caldav: Avoid empty multiget
When there are no new objects to pull from the server, skip the import
routine instead of sending a query that requests zero items.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-12-08 16:22:00 +01:00
Lukas Fleischer 7b5602ae17 calcurse-caldav: Split object addition and removal
Instead of performing two synchronization steps (push/pull), split the
synchronization protocol into four steps:

1. Retrieve new objects from the server.
2. Delete local objects that no longer exist on the server.
3. Push new objects to the server.
4. Delete remote objects that no longer exist locally.

Each of the steps is performed by a separate function.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-12-08 16:22:00 +01:00
Lukas Fleischer 8cd7c76db3 Release 4.2.1
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-10-30 12:08:12 +01:00
Lukas Fleischer fd97187bcd Fix visible region after loading list box items
Make sure the visible region is updated after loading items, e.g. when
the users switches from the full todo list to the "uncompleted items
only" view.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-10-30 11:57:01 +01:00
Lukas Fleischer cf75caeb61 Fix listbox_fix_visible_region()
Make sure that listbox_fix_visible_region() always updates the visible
region to show the entire list if it fits into the box. Also, reuse
listbox_fix_visible_region() in listbox_resize() instead of duplicating
the code.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-10-30 11:56:02 +01:00
Lukas Fleischer 0d74c14fd1 Do not start the daemon more than once
Avoid starting multiple daemon instances if the --daemon argument is
passed and the daemon is already running. Terminate the already running
instance before spawning a new one instead.

Suggested-by: Vlad Glagolev <scm@vaygr.net>
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-10-19 18:19:02 +02:00
Lukas Fleischer 095576b945 calcurse.1.txt: Document --daemon
Mention the --daemon command line parameter in the man page. This was
forgotten when adding the flag in 6061fec (Add a --daemon command-line
parameter, 2016-01-28).

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-10-19 18:13:02 +02:00
Lukas Fleischer 39d3007318 Prevent segfault when all todo items are hidden
To prevent from illegal memory access, we checked whether the list of
todo items is empty before performing an interactive todo item action
such as flagging or removal. However, since 1a4bf2b (Add a "hide
completed" view to the todo panel, 2016-01-17), it is possible to hide
completed items from the todo panel. Thus, it may occur that the todo
list box is empty while the list of todo items is not.

To detect such situations as well, teach todo_get_item() to return NULL
if the requested item does not exist. Then, instead of checking whether
the todo item list is non-empty, make sure that the item returned by
todo_get_item() is non-NULL when performing an action.

Reported-by: Vlad Glagolev <scm@vaygr.net>
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-10-14 20:29:50 +02:00
Lukas Fleischer 9ef5fe2191 Always use memory management wrappers
Use mem_*() wrappers instead of directly accessing libc functions when
allocating/deallocating memory.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-10-13 19:51:43 +02:00
Lukas Fleischer 32dcdff20b Release 4.2.0
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-10-10 22:02:07 +02:00
Lukas Fleischer 89efd4e612 Update message catalog
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-10-10 22:00:15 +02:00
Lukas Fleischer 007a73f7a2 Replace parse_datetime() constants by named flags
Remove the magic constants used in the return value of parse_datetime()
and use named flags instead.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-10-10 09:02:42 +02:00
Lukas Fleischer 48bd82a003 Refactor duration/end time parsing
Replace all remaining invocations of parse_time() by parse_datetime()
which now indicates whether a date was supplied or not.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-10-10 09:02:42 +02:00
Lukas Fleischer adf29c8ee9 Support dates when specifying start/end times
Add support for combined date/time or date-only strings when specifying
the start or end time of a new item.

This is a follow-up to 1f39b5c (Add support for moving items to another
day, 2016-09-30).

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-10-09 20:21:04 +02:00
Lukas Fleischer 343d68596d Factor out parse_datetime()
Create a new function that takes a time stamp and updates the date or
time components of that time stamp according to a given date/time
string. Use that function for updating the start time of an item.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-10-09 18:12:45 +02:00
Lukas Fleischer 1f39b5c668 Add support for moving items to another day
When moving an item (or when changing the start time of an item), allow
for optionally specifying a date. If both date and time are entered, the
item is updated to start on the given date and time. If only a date is
entered, the item is modified to start on the given date, keeping the
current start time. If only a time is entered, the item is modified to
start on the current date and the new start time.

Fixes GitHub issue #12.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-10-08 14:42:51 +02:00
Lukas Fleischer 1003be18df Refactor day_edit_time()
Make the function more flexible by returning the updated time instead of
single hour and minute components.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-10-01 09:00:23 +02:00
Lukas Fleischer 1af9ccccd7 Automatically select new appointments/events
This is a follow-up to commit 65b699f (Make automatic selection of
appointments/events smarter, 2016-02-16). Newly created appointments and
events are now selected automatically.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-09-28 19:03:20 +02:00
Lukas Fleischer ab9256adf0 Fix out-of-bounds memory access
Do not try to access freed day items. This also fixes unexpected
selection changes after modifying appointments or events.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-09-28 19:02:04 +02:00
Lukas Fleischer 77d5b10ee0 Fix key binding pagination
Do not create an empty key bindings page if the number of bindings is a
multiple of the number of slots per page.

Also, add comments to explain the computation.

Reported-by: Kevin Wang <kevin.wang2004@hotmail.com>
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-09-27 08:56:12 +02:00
Lukas Fleischer 55afda8a73 Stop all threads before leaving curses mode
This prevents from notification bar artifacts being drawn after leaving
interactive mode.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-09-13 08:28:24 +02:00
Lukas Fleischer e6f8a2932a Avoid starting the notification thread twice
Starting the notification thread more than once can result in strange
behavior. For example, when launching external commands, only the most
recently started thread is stopped which results in the external
command's screen output being overwritten by the notification bar.

Currently, there are a couple of situations where the thread is started
twice. As a first countermeasure, explicitly check whether the thread is
already running (and terminate it) before starting a new one.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-08-24 21:49:53 +02:00
Lukas Fleischer 8fe9dd1c2b Remove duplicate code in draw_monthly_view()
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-06-27 08:59:35 +02:00
Lukas Fleischer 203ac0aa61 Highlight days with non-recurrent items
Use a different color for days with non-recurrent items in the calendar
panel. This makes it possible to easily spot days that actually contain
appointments.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-06-27 08:57:42 +02:00
Lukas Fleischer b6f95b380f calcurse-caldav: Encode the request body in UTF-8
When a string is passed to HTTPConnection.request(), it is automatically
ISO 8859-1 encoded. Therefore, since we already specify UTF-8 as
character set in the headers, we need to UTF-8 encode the request body
manually.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-06-18 10:30:30 +02:00
Lukas Fleischer 5d793f6b35 Release 4.1.0
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-04-12 17:27:02 +02:00
Lukas Fleischer 2fa33567dd po/: Translation updates from Transifex 2016-04-11 22:06:55 +02:00
Lukas Fleischer 306a207f28 po/calcurse.pot: Update message catalog
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-04-02 08:46:47 +02:00
Lukas Fleischer 1531425005 Support relative dates when adding recurrences
In commit f5d8b5e (Support durations in recurrence ending dates,
2016-02-25), we added support for the `+xxwxxd` syntax when specifying
recurrence end dates. However, this only worked when *editing* the
recurrence, not when converting a regular item to a recurrent one. Fix
this and support the new syntax in both cases.

Also, mention the new syntax in the prompt.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-04-01 08:51:26 +02:00
Lukas Fleischer 2c9ea341cf Document the hooks feature
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-04-01 08:35:14 +02:00
Lukas Fleischer 4633846550 Fix apoint_inday() with long appointments
Fixes a regression introduced in 9e160fa (Do not assume that days always
have 86400 seconds, 2016-03-27).

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-03-28 08:45:49 +02:00
Lukas Fleischer 9e160fac16 Do not assume that days always have 86400 seconds
Make that date membership is computed correctly, even if a day has less
than 86400 seconds (e.g. after changing clocks).

Reported-by: Hakan Jerning <jerning@home.se>
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-03-27 13:06:18 +02:00
Lukas Fleischer e1b6d22669 Add proper UTF-8 support to the notification area
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-02-26 21:52:14 +01:00
Lukas Fleischer f5d8b5e021 Support durations in recurrence ending dates
When spending the end date of recurring items, allow date duration
specifiers such as "+5d" or "+3w2d".

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-02-26 09:14:40 +01:00
Lukas Fleischer c34f9aba29 Refactor UTF-8 chopping
Add a function that makes sure a string does not exceed a given display
size. If the string is too long, dots ("...") are appended.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-02-26 09:14:40 +01:00
Lukas Fleischer 85772d746f Fix tests to match the new item ordering
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-02-18 22:23:33 +01:00
Lukas Fleischer 8c32812fe1 ui-day.c: Simplify code using ui_day_selitem()
Use the new ui_day_selitem() utility function to retrieve the currently
selected item.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-02-16 07:55:19 +01:00
Lukas Fleischer 65b699f770 Make automatic selection of appointments/events smarter
Keep item selection when an item is moved (e.g. by changing the start
time or description).

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-02-16 07:53:12 +01:00
Lukas Fleischer feb059e8cf Fix segmentation fault on reload with pre-load hook
We need to manually force a reinitialization of the todo item list box
before reloading the items. Otherwise, the list box contains dangling
references to the linked list of todo items which has already been
cleared at this point. After the pre-load hook is called, the windows
are redrawn by wins_unprepare_external() and these invalid references
are accessed, leading to a segmentation fault.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-02-15 19:03:26 +01:00
Lukas Fleischer eaf8f96e06 Improve ordering of appointments/events
* Order by start time first.
* Order items with the same start time by priority.
* Order items with the same start and priority by description.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-02-15 18:25:55 +01:00
Lukas Fleischer 07954626c6 Support format strings when dumping imported items
In commit 3eae7ce (Add --list-imported command line option, 2016-01-12),
we added an option to print the hashes of imported items to stdout.
Extend this command line option such that it dumps the items using the
specified formatting strings. With the new behavior it is, for example,
easier to check items for import errors.

Also, rename the option from --list-imported to --dump-imported (it is
not part of any official release yet so we do not need to care about
backwards compatibility).

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-02-11 18:33:57 +01:00
Lukas Fleischer fe0621bafd Allow decimals in durations
Parse durations containing decimal numbers (such as "1.5h") gracefully.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-02-10 08:24:01 +01:00
Lukas Fleischer a3b0c8eed2 Install calcurse-caldav by default
Add a new Makefile to build and install calcurse-caldav and include it
in the top-level build process.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-02-09 22:22:12 +01:00
Lukas Fleischer 4ab6e75aa9 Improve example hooks
The post-save and post-sync hooks now automatically detect whether the
data directory contains a .git/ directory and skip the commit creation
process if it does not.

The post-save hook and the new pre-load hook now also run
calcurse-caldav in the background if that script is available and the
data directory contains a caldav/ directory.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-02-08 08:17:49 +01:00
Lukas Fleischer 616c3759a5 Fix highlighting of busy days on initialization
Make sure that the monthly view cache is invalidated after the data
files are loaded.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-02-07 14:06:21 +01:00
Lukas Fleischer 537b2859f2 hooks.c: Fix window preparation in interactive mode
In commit 2857bac (Fix segfault when running hooks in non-interactive
mode, 2016-01-16), we added checks to fix a segmentation fault in
non-interactive mode. However, at the same time, that commit broke
window preparation in interactive mode.

When wins_prepare_external() is called, the UI mode is changed to
command line, such that we cannot determine whether we need to call
wins_unprepare_external() when returning from the hook. As a workaround,
we now store the mode in a temporary variable.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-02-07 13:51:35 +01:00
Lukas Fleischer e7a83118ea Do not put all files under version control in example hooks
Modify the Git hooks such they only add known data files to the index.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-02-07 13:38:52 +01:00
Lukas Fleischer e5ba06ff5d calcurse-caldav: Add hook support
Introduce pre-sync and post-sync hooks which need to be located under
~/.calcurse/caldav/hooks/ and are executed before/after synchronization
with a CalDAV server.

Also, add an example post-sync hook and change the example post-save
hook such that it does not create tiny commits during synchronization.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-02-07 13:29:44 +01:00
Lukas Fleischer e40646d30f Fix file name of the example hook
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-02-07 13:18:25 +01:00
Lukas Fleischer cfd9fc316d Move example hook to contrib/hooks/
The contrib/ directory now contains another script that is not directly
related to hooks. Clean things up by placing example hooks in a separate
subdirectory.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-02-07 13:12:18 +01:00
Lukas Fleischer 812c6b1dd6 calcurse-caldav: Use -G and %(hash) to list hashes
Instead of reimplementing the code to generate object hashes in the
synchronization script, use format strings to print the hashes in grep
mode.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-02-05 19:12:12 +01:00
Lukas Fleischer 4ada3deda2 Fix %(hash) formatting of events
Actually print the hash instead of raw object data.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-02-05 19:11:43 +01:00
Lukas Fleischer 62f04c3f9a Support format specifiers in grep mode
Honor --format-* parameters when using the -G operation. In the case of
recurring items, the first occurrence is used.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-02-05 19:09:36 +01:00
Lukas Fleischer e9c8197e4e Refactor grep mode
Split io_save_{apts,todo}() into functions that write raw data to a file
and functions that write formatted items to stdout such that one can
easily extend the grep mode for format string support in a follow-up
commit.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-02-05 19:06:54 +01:00
Lukas Fleischer 8bdf0c0b3b calcurse-caldav: Reword dry-run warning
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-02-02 08:16:08 +01:00
Lukas Fleischer 4671a02846 calcurse-caldav: Modernize format strings
Replace %-style string formatting with format().

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-02-01 19:11:27 +01:00
Lukas Fleischer 2cf7023b37 calcurse-caldav: Make synchronization more robust
In addition to storing ETag-hash tuples in the synchronization database,
also store the URI of each object. This makes the synchronization
process a bit more robust as we do not need to depend on ETags being
globally unique. It also allows us to detect conflicts which occur when
an object is modified locally and on the server at the same time.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-02-01 19:11:27 +01:00
Lukas Fleischer cb85175524 calcurse-caldav: Fix issues reported by pylint
Add missing parameter to remote_query() and fix various style issues.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-02-01 19:05:27 +01:00
Lukas Fleischer 19f239e490 po/calcurse.pot: Update message catalog
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2016-01-30 11:22:36 +01:00