aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/lint_python.yml21
-rw-r--r--.github/workflows/make.yml53
-rw-r--r--.travis.yml23
-rw-r--r--.tx/config49
-rw-r--r--CHANGES.md92
-rw-r--r--COPYING2
-rw-r--r--README.md32
-rwxr-xr-xautogen.sh2
-rwxr-xr-xbuild-aux/git-version-gen2
-rw-r--r--configure.ac75
-rw-r--r--contrib/caldav/README.md13
-rwxr-xr-xcontrib/caldav/calcurse-caldav.py241
-rw-r--r--contrib/caldav/config.sample14
-rwxr-xr-xcontrib/caldav/hooks/post-sync2
-rw-r--r--contrib/setup.cfg3
-rw-r--r--doc/Makefile.am2
-rw-r--r--doc/calcurse.1.txt4
-rw-r--r--doc/credits.txt2
-rw-r--r--doc/de/credits.txt2
-rw-r--r--doc/es/credits.txt2
-rw-r--r--doc/fr/credits.txt2
-rw-r--r--doc/manual.txt8
-rw-r--r--doc/nl/credits.txt2
-rw-r--r--doc/pt_BR/credits.txt2
-rw-r--r--doc/ru/credits.txt2
-rw-r--r--doc/submitting-patches.txt2
-rw-r--r--po/calcurse.pot124
-rw-r--r--po/de.po238
-rw-r--r--po/doc/add-nb_NO.po4
-rw-r--r--po/doc/copy-paste-nb_NO.po4
-rw-r--r--po/doc/credits-nb_NO.po2
-rw-r--r--po/doc/edit-nb_NO.po4
-rw-r--r--po/doc/export-nb_NO.po4
-rw-r--r--po/doc/flag-nb_NO.po4
-rw-r--r--po/doc/save-nb_NO.po4
-rw-r--r--po/doc/tab-nb_NO.po4
-rw-r--r--po/doc/vnote-nb_NO.po4
-rw-r--r--po/en.po1585
-rw-r--r--po/es.po239
-rw-r--r--po/fr.po252
-rw-r--r--po/nl.po194
-rw-r--r--po/pt_BR.po233
-rw-r--r--po/ru.po283
-rw-r--r--scripts/calcurse-upgrade.sh.in2
-rw-r--r--src/apoint.c10
-rw-r--r--src/args.c12
-rw-r--r--src/calcurse.c113
-rw-r--r--src/calcurse.h63
-rw-r--r--src/config.c28
-rw-r--r--src/custom.c76
-rw-r--r--src/day.c70
-rw-r--r--src/dmon.c2
-rw-r--r--src/event.c2
-rw-r--r--src/getstring.c4
-rw-r--r--src/help.c6
-rw-r--r--src/hooks.c15
-rw-r--r--src/htable.h2
-rw-r--r--src/ical.c308
-rw-r--r--src/io.c213
-rw-r--r--src/keys.c335
-rw-r--r--src/listbox.c2
-rw-r--r--src/llist.c204
-rw-r--r--src/llist.h5
-rw-r--r--src/llist_ts.h4
-rw-r--r--src/mem.c2
-rw-r--r--src/note.c6
-rw-r--r--src/notify.c25
-rw-r--r--src/pcal.c6
-rw-r--r--src/queue.c2
-rw-r--r--src/recur.c65
-rw-r--r--src/sha1.c3
-rw-r--r--src/sha1.h4
-rw-r--r--src/sigs.c2
-rw-r--r--src/strings.c2
-rw-r--r--src/todo.c6
-rw-r--r--src/ui-calendar.c123
-rw-r--r--src/ui-day.c31
-rw-r--r--src/ui-todo.c27
-rw-r--r--src/utf8.c2
-rw-r--r--src/utils.c87
-rw-r--r--src/vars.c5
-rw-r--r--src/vector.c2
-rw-r--r--src/vector.h2
-rw-r--r--src/wins.c22
-rw-r--r--test/data/ical-009.ical12
-rwxr-xr-xtest/ical-001.sh12
-rwxr-xr-xtest/ical-002.sh10
-rwxr-xr-xtest/ical-003.sh14
-rwxr-xr-xtest/ical-004.sh12
-rwxr-xr-xtest/ical-005.sh12
-rwxr-xr-xtest/ical-006.sh10
-rwxr-xr-xtest/ical-007.sh12
-rwxr-xr-xtest/ical-008.sh12
-rwxr-xr-xtest/ical-009.sh51
-rwxr-xr-xtest/ical-010.sh12
-rwxr-xr-xtest/ical-011.sh21
-rwxr-xr-xtest/ical-012.sh10
-rwxr-xr-xtest/ical-013.sh10
-rwxr-xr-xtest/ical-014.sh10
-rwxr-xr-xtest/io-005.sh1
-rwxr-xr-xtest/io-006.sh1
-rw-r--r--test/run-test.c2
-rw-r--r--test/test-init.sh5
103 files changed, 2737 insertions, 3228 deletions
diff --git a/.github/workflows/lint_python.yml b/.github/workflows/lint_python.yml
new file mode 100644
index 0000000..c04a772
--- /dev/null
+++ b/.github/workflows/lint_python.yml
@@ -0,0 +1,21 @@
+name: Lint Python
+
+on:
+ pull_request:
+ paths: ['contrib/**']
+ push:
+ paths: ['contrib/**']
+
+jobs:
+ lint_python:
+ runs-on: ubuntu-latest
+ defaults:
+ run:
+ working-directory: contrib
+ steps:
+ - uses: actions/checkout@v2
+ - uses: actions/setup-python@v2
+ - run: pip install codespell flake8 isort
+ - run: codespell --quiet-level=2 || true
+ - run: flake8 --count --show-source --statistics
+ - run: isort --check-only --profile black .
diff --git a/.github/workflows/make.yml b/.github/workflows/make.yml
new file mode 100644
index 0000000..7700ff3
--- /dev/null
+++ b/.github/workflows/make.yml
@@ -0,0 +1,53 @@
+name: Build and test
+
+on:
+ push:
+ branches: [master, pu]
+ paths-ignore:
+ - 'contrib/**'
+ - 'doc/**'
+ - 'po/**'
+ pull_request:
+ branches: [master, pu]
+ paths-ignore:
+ - 'contrib/**'
+ - 'doc/**'
+ - 'po/**'
+
+jobs:
+ build:
+ strategy:
+ matrix:
+ os: ['ubuntu-latest', 'macos-latest']
+ runs-on: ${{ matrix.os }}
+
+ steps:
+ - uses: actions/checkout@v2
+ - name: Install dependencies (Ubuntu)
+ run: |
+ sudo apt-get update
+ sudo apt-get install asciidoc autopoint gettext xmlto autoconf-archive
+ if: matrix.os == 'ubuntu-latest'
+ - name: Install dependencies (MacOS)
+ run: |
+ brew update
+ brew install --overwrite python
+ brew install automake
+ brew install asciidoc
+ brew install gettext
+ brew install xmlto
+ brew install autoconf-archive
+ brew link --force gettext
+ sudo mkdir /etc/xml
+ sudo ln -s /usr/local/etc/xml/catalog /etc/xml/catalog
+ if: matrix.os == 'macos-latest'
+ - name: autogen.sh
+ run: ./autogen.sh
+ - name: configure
+ run: ./configure
+ - name: make
+ run: make
+ - name: make check
+ run: make check
+ - name: make distcheck
+ run: make distcheck
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 47d27fe..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,23 +0,0 @@
-language: c
-
-os:
- - linux
- - osx
-
-addons:
- apt:
- packages:
- - asciidoc
- - autopoint
- - xmlto
-
-before_install:
- - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update; fi
- - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install asciidoc; fi
- - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install gettext; fi
- - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install xmlto; fi
- - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew link --force gettext; fi
- - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then sudo mkdir /etc/xml; fi
- - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then sudo ln -s /usr/local/etc/xml/catalog /etc/xml/catalog; fi
-
-script: ./autogen.sh && ./configure && make && make check
diff --git a/.tx/config b/.tx/config
index b9ac976..376e152 100644
--- a/.tx/config
+++ b/.tx/config
@@ -1,123 +1,122 @@
[main]
host = https://www.transifex.com
-type = PO
-[calcurse.calcurse]
+[o:lfleischer:p:calcurse:r:calcurse]
file_filter = po/<lang>.po
source_file = po/calcurse.pot
source_lang = en
-[calcurse.doc-add]
+[o:lfleischer:p:calcurse:r:doc-add]
file_filter = po/doc/add-<lang>.po
source_file = po/doc/add.pot
source_lang = en
-[calcurse.doc-config]
+[o:lfleischer:p:calcurse:r:doc-config]
file_filter = po/doc/config-<lang>.po
source_file = po/doc/config.pot
source_lang = en
-[calcurse.doc-copy-paste]
+[o:lfleischer:p:calcurse:r:doc-copy-paste]
file_filter = po/doc/copy-paste-<lang>.po
source_file = po/doc/copy-paste.pot
source_lang = en
-[calcurse.doc-credits]
+[o:lfleischer:p:calcurse:r:doc-credits]
file_filter = po/doc/credits-<lang>.po
source_file = po/doc/credits.pot
source_lang = en
-[calcurse.doc-delete]
+[o:lfleischer:p:calcurse:r:doc-delete]
file_filter = po/doc/delete-<lang>.po
source_file = po/doc/delete.pot
source_lang = en
-[calcurse.doc-displacement]
+[o:lfleischer:p:calcurse:r:doc-displacement]
file_filter = po/doc/displacement-<lang>.po
source_file = po/doc/displacement.pot
source_lang = en
-[calcurse.doc-edit]
+[o:lfleischer:p:calcurse:r:doc-edit]
file_filter = po/doc/edit-<lang>.po
source_file = po/doc/edit.pot
source_lang = en
-[calcurse.doc-enote]
+[o:lfleischer:p:calcurse:r:doc-enote]
file_filter = po/doc/enote-<lang>.po
source_file = po/doc/enote.pot
source_lang = en
-[calcurse.doc-export]
+[o:lfleischer:p:calcurse:r:doc-export]
file_filter = po/doc/export-<lang>.po
source_file = po/doc/export.pot
source_lang = en
-[calcurse.doc-flag]
+[o:lfleischer:p:calcurse:r:doc-flag]
file_filter = po/doc/flag-<lang>.po
source_file = po/doc/flag.pot
source_lang = en
-[calcurse.doc-general]
+[o:lfleischer:p:calcurse:r:doc-general]
file_filter = po/doc/general-<lang>.po
source_file = po/doc/general.pot
source_lang = en
-[calcurse.doc-goto]
+[o:lfleischer:p:calcurse:r:doc-goto]
file_filter = po/doc/goto-<lang>.po
source_file = po/doc/goto.pot
source_lang = en
-[calcurse.doc-import]
+[o:lfleischer:p:calcurse:r:doc-import]
file_filter = po/doc/import-<lang>.po
source_file = po/doc/import.pot
source_lang = en
-[calcurse.doc-intro]
+[o:lfleischer:p:calcurse:r:doc-intro]
file_filter = po/doc/intro-<lang>.po
source_file = po/doc/intro.pot
source_lang = en
-[calcurse.doc-other]
+[o:lfleischer:p:calcurse:r:doc-other]
file_filter = po/doc/other-<lang>.po
source_file = po/doc/other.pot
source_lang = en
-[calcurse.doc-pipe]
+[o:lfleischer:p:calcurse:r:doc-pipe]
file_filter = po/doc/pipe-<lang>.po
source_file = po/doc/pipe.pot
source_lang = en
-[calcurse.doc-priority]
+[o:lfleischer:p:calcurse:r:doc-priority]
file_filter = po/doc/priority-<lang>.po
source_file = po/doc/priority.pot
source_lang = en
-[calcurse.doc-reload]
+[o:lfleischer:p:calcurse:r:doc-reload]
file_filter = po/doc/reload-<lang>.po
source_file = po/doc/reload.pot
source_lang = en
-[calcurse.doc-repeat]
+[o:lfleischer:p:calcurse:r:doc-repeat]
file_filter = po/doc/repeat-<lang>.po
source_file = po/doc/repeat.pot
source_lang = en
-[calcurse.doc-save]
+[o:lfleischer:p:calcurse:r:doc-save]
file_filter = po/doc/save-<lang>.po
source_file = po/doc/save.pot
source_lang = en
-[calcurse.doc-tab]
+[o:lfleischer:p:calcurse:r:doc-tab]
file_filter = po/doc/tab-<lang>.po
source_file = po/doc/tab.pot
source_lang = en
-[calcurse.doc-view]
+[o:lfleischer:p:calcurse:r:doc-view]
file_filter = po/doc/view-<lang>.po
source_file = po/doc/view.pot
source_lang = en
-[calcurse.doc-vnote]
+[o:lfleischer:p:calcurse:r:doc-vnote]
file_filter = po/doc/vnote-<lang>.po
source_file = po/doc/vnote.pot
source_lang = en
diff --git a/CHANGES.md b/CHANGES.md
index 4124197..acc24e4 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,6 +1,98 @@
Release Notes
=============
+Version 4.8.1 (2023-05-22)
+--------------------------
+
+- Bug fixes:
+
+ * Fixed characters in weekly view.
+
+ * AsciiDoc checks are skipped if --disable-docs is used.
+
+ * Fixed import for iCal files with empty description (fixed by Marian
+ Buschsieweke).
+
+ * Fixed handling of note files edited outside calcurse (fixed by Nicholas
+ Johnson).
+
+ * Fixed handling of recurrent open-ended appointments at 00:00.
+
+ * Default description for items with empty descriptions (reported and
+ partially implemented by Jonathan van der Steege).
+
+- New calcurse-caldav features:
+
+ * The PasswordCommand option can now be used to manage passwords in an
+ external program and is the new recommended way of storing passwords for
+ calcurse-caldav (implemented by Ryan Lue).
+
+Version 4.8.0 (2022-04-16)
+--------------------------
+
+- New features:
+
+ * Support any weekday as first day of week; previously, only Sunday and
+ Monday were allowed (implemented by Morgan Seltzer).
+
+ * Configuration of the format in which appointment time is displayed
+ (implemented by mercurialmoon).
+
+ * Actions without key bindings.
+
+ * generic-prev-view key binding to cycle backwards through windows
+ (implemented by Aurora).
+
+ * Support for Home/End keys in text input mode.
+
+- Bug fixes:
+
+ * Support compilation on big-endian systems (reported by nmeum).
+
+ * Fixed --docdir support (fixed by Marco Sirabella).
+
+ * Allow newlines in iCal SUMMARY by replacing them with blanks (reported by
+ Matthias Braun).
+
+ * Fixed sidebar configuration sometimes not increasing width (fixed by
+ Morgan Seltzer).
+
+ * Layout change recognizes changed appointment space; before this change, a
+ layout change did not update the maximum number of appointments visible
+ until the config menu was left (fixed by Morgan Seltzer).
+
+- calcurse-caldav bug fixes:
+
+ * Fixed InsecureSSL support (reported by Pitido).
+
+Version 4.7.1 (2021-04-11)
+--------------------------
+
+- Bug fixes:
+
+ * Multiple iCal import fixes: Make iCal event import independent of
+ property ordering. Return failure if an item is skipped. Avoid double
+ free on import errors. Fix parsing of UNTIL.
+
+ * Do not remove an empty note file after edit session.
+
+ * Keep internal linked list sorted when moving items.
+
+ * Prevent external hook/notification commands from interacting with the UI.
+
+- calcurse-caldav bug fixes:
+
+ * Allow non-ASCII characters in username and password (fixed by Henrik
+ Grimler).
+
+ * Improved error handling for the configuration file. Unknown keys are now
+ reported as errors instead of ignored.
+
+ * Always request href from server after pushing a new object to prevent
+ items from being erroneously deleted or created when path contains
+ characters that need to be URL-encoded (reported and fixed by Max
+ Deineko).
+
Version 4.7.0 (2020-10-12)
--------------------------
diff --git a/COPYING b/COPYING
index d3ebf1b..ceb0721 100644
--- a/COPYING
+++ b/COPYING
@@ -1,4 +1,4 @@
-Copyright (c) 2004-2020 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
diff --git a/README.md b/README.md
index 6fc80af..009a5e6 100644
--- a/README.md
+++ b/README.md
@@ -1,17 +1,26 @@
-calcurse
-========
+# calcurse
+
+[![Build and test](https://github.com/lfos/calcurse/actions/workflows/make.yml/badge.svg)](https://github.com/lfos/calcurse/actions/workflows/make.yml)
+[![Lint Python](https://github.com/lfos/calcurse/actions/workflows/lint_python.yml/badge.svg)](https://github.com/lfos/calcurse/actions/workflows/lint_python.yml)
![Demo](https://calcurse.org/images/demo.gif)
-Building
---------
+## Installation
+
+calcurse is available on a number of Linux distributions:
+
+[![Packaging status](https://repology.org/badge/vertical-allrepos/calcurse.svg)](https://repology.org/project/calcurse/versions)
+
+## Building from Source
-Install the following build dependencies. If your distro segments development
-files from core packages (i.e., \*-devel or \*-dev packages), you may need to
-install those as well:
+Install the following build dependencies. If your distribution segments
+development files from core packages (i.e., \*-devel or \*-dev packages), you
+may need to install those as well:
* gcc
+* autoconf-archive
* automake
+* autopoint
* asciidoc
* gettext with development files
* ncurses with development files
@@ -26,8 +35,7 @@ and install calcurse:
Note that `make install` needs to be run as root. When working on a Git
checkout, you need to run `./autogen.sh` before `./configure`.
-Package Overview
-----------------
+## Source Overview
* `build-aux`: auxiliary files for the build process
* `contrib`: useful tools such as hooks or the CalDAV synchronization script
@@ -37,8 +45,7 @@ Package Overview
* `src`: the actual calcurse source files
* `test`: test suite and test cases for calcurse
-Authors
--------
+## Authors
calcurse was created by Frederic Culot in 2004. Since 2011, the project is
maintained by Lukas Fleischer. Many core features added to calcurse since 2017
@@ -48,8 +55,7 @@ Of course, there are numerous other contributors. Check the Git commit log and
the `Thanks` section in the manual for a list of people who have contributed by
reporting bugs, sending fixes, or suggesting improvements.
-Contributing and Donations
---------------------------
+## Contributing and Donations
Patches, bug reports and other requests are always welcome! You can submit them
to one of our mailing lists (check the [patch submission
diff --git a/autogen.sh b/autogen.sh
index 55c7768..ee8f12f 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (c) 2004-2020 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
diff --git a/build-aux/git-version-gen b/build-aux/git-version-gen
index fe1ec84..40c04b5 100755
--- a/build-aux/git-version-gen
+++ b/build-aux/git-version-gen
@@ -6,7 +6,7 @@ then
exit 1
fi
-DEF_VER=4.7.0
+DEF_VER=4.8.1
VERFILE="$1"
if [ -d '.git' ]
diff --git a/configure.ac b/configure.ac
index 1f6ec61..da211d0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,16 +1,14 @@
#-------------------------------------------------------------------------------
# Init
#-------------------------------------------------------------------------------
-AC_PREREQ(2.59)
-AC_INIT([calcurse],
- m4_esyscmd([build-aux/git-version-gen .version]),
- [bugs@calcurse.org])
+AC_PREREQ([2.71])
+AC_INIT([calcurse],[m4_esyscmd(build-aux/git-version-gen .version)],[bugs@calcurse.org])
AM_INIT_AUTOMAKE
#m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
AM_GNU_GETTEXT([external])
-AM_GNU_GETTEXT_VERSION([0.14.1])
+AM_GNU_GETTEXT_VERSION([0.19.8])
AC_CONFIG_SRCDIR([src/calcurse.c])
-AC_CONFIG_HEADER([config.h])
+AC_CONFIG_HEADERS([config.h])
#-------------------------------------------------------------------------------
# Checks for system type
#-------------------------------------------------------------------------------
@@ -19,37 +17,22 @@ AC_CANONICAL_HOST
# Checks for programs
#-------------------------------------------------------------------------------
AC_PROG_CC
+AC_C_BIGENDIAN
#-------------------------------------------------------------------------------
# Checks for header files
#-------------------------------------------------------------------------------
-AC_HEADER_STDC
AC_CHECK_HEADERS([ctype.h getopt.h locale.h math.h signal.h stdio.h stdlib.h \
string.h sys/stat.h sys/types.h sys/wait.h time.h unistd.h \
fcntl.h paths.h errno.h limits.h regex.h])
#-------------------------------------------------------------------------------
# Checks for system libs
#-------------------------------------------------------------------------------
-AC_CHECK_FUNC(initscr,,
-[
- available_ncurses="none"
- for lib in ncursesw ncurses
- do
- AC_CHECK_LIB($lib, initscr,
- [available_ncurses="$lib"; break])
- done
- if test "$available_ncurses" = none; then
- AC_MSG_ERROR(Either ncurses or ncursesw library is required to build calcurse!)
- elif test "$available_ncurses" = ncursesw; then
- AC_CHECK_HEADERS([ncursesw/ncurses.h],,
- [AC_CHECK_HEADERS([ncurses.h],,
- AC_MSG_ERROR([Missing ncursesw header file]))])
- else
- AC_CHECK_HEADERS([ncurses/ncurses.h],,
- [AC_CHECK_HEADERS([ncurses.h],,
- AC_MSG_ERROR([Missing ncurses header file]))])
- fi
- LIBS="$LIBS -l$available_ncurses"
-])
+AX_WITH_CURSES
+if test "x$ax_cv_ncursesw" != xyes && test "x$ax_cv_ncurses" != xyes; then
+ AC_MSG_ERROR(Either ncurses or ncursesw library is required to build calcurse!)
+fi
+
+LIBS="$LIBS $CURSES_LIBS"
AC_CHECK_HEADERS([pthread.h], [
AC_CHECK_LIB(pthread, pthread_create, [
@@ -76,7 +59,6 @@ AC_ARG_ENABLE(docs,
[enabledocs=$enableval], [enabledocs=yes])
if test x"$enabledocs" != x"yes"; then
enabledocs=no
- AC_MSG_WARN([Skipping documentation!])
fi
AC_MSG_CHECKING([whether to include documentation])
AC_MSG_RESULT($enabledocs)
@@ -87,7 +69,21 @@ AC_ARG_WITH(asciidoc,
[use AsciiDoc to regenerate documentation]),
[use_asciidoc=$withval],
[use_asciidoc="auto"])
-if test x"$use_asciidoc" = x"auto"; then
+if test x"$enabledocs" = x"no" -o x"$use_asciidoc" = x"no"; then
+ AC_MSG_WARN([Will not rebuild documentation!])
+ have_asciidoc=no
+ have_a2x=no
+elif test x"$use_asciidoc" = x"yes"; then
+ AC_PATH_PROG([ASCIIDOC], [asciidoc])
+ if test -z "$ASCIIDOC"; then
+ AC_MSG_ERROR([AsciiDoc not found and "--with-asciidoc" specified!])
+ fi
+ AC_PATH_PROG([A2X], [a2x])
+ if test -z "$A2X"; then
+ AC_MSG_ERROR([a2x not found and "--with-asciidoc" specified!])
+ fi
+ have_asciidoc=yes
+elif test x"$use_asciidoc" = x"auto"; then
AC_PATH_PROG([ASCIIDOC], [asciidoc])
if test -z "$ASCIIDOC"; then
have_asciidoc=no
@@ -112,20 +108,6 @@ if test x"$use_asciidoc" = x"auto"; then
else
have_a2x=yes
fi
-elif test x"$use_asciidoc" = x"yes"; then
- AC_PATH_PROG([ASCIIDOC], [asciidoc])
- if test -z "$ASCIIDOC"; then
- AC_MSG_ERROR([AsciiDoc not found and "--with-asciidoc" specified!])
- fi
- AC_PATH_PROG([A2X], [a2x])
- if test -z "$A2X"; then
- AC_MSG_ERROR([a2x not found and "--with-asciidoc" specified!])
- fi
- have_asciidoc=yes
-elif test x"$use_asciidoc" = x"no"; then
- AC_MSG_WARN([Will not rebuild documentation!])
- have_asciidoc=no
- have_a2x=no
fi
AM_CONDITIONAL(HAVE_ASCIIDOC, test $have_asciidoc = yes)
AM_CONDITIONAL(HAVE_A2X, test $have_a2x = yes)
@@ -152,9 +134,10 @@ AM_CONDITIONAL(CALCURSE_MEMORY_DEBUG, test x$memdebug = xyes)
#-------------------------------------------------------------------------------
# Create Makefiles
#-------------------------------------------------------------------------------
-AC_OUTPUT(Makefile doc/Makefile src/Makefile test/Makefile \
+AC_CONFIG_FILES([Makefile doc/Makefile src/Makefile test/Makefile \
scripts/Makefile po/Makefile.in po/Makefile \
- contrib/caldav/Makefile contrib/vdir/Makefile)
+ contrib/caldav/Makefile contrib/vdir/Makefile])
+AC_OUTPUT
#-------------------------------------------------------------------------------
# Summary
#-------------------------------------------------------------------------------
diff --git a/contrib/caldav/README.md b/contrib/caldav/README.md
index a842081..b464dc9 100644
--- a/contrib/caldav/README.md
+++ b/contrib/caldav/README.md
@@ -34,13 +34,12 @@ argument. You can choose between the following initialization modes:
For subsequent calcurse-caldav invocations, you don't need to specify any
additional parameters.
-You can specify a username and password for basic authentication in the
-config file. Alternatively, the password can be passed securely from another
-program (such as *pass*) via the `CALCURSE_CALDAV_PASSWORD` environment variable like
-so:
-```
-CALCURSE_CALDAV_PASSWORD=$(pass show calcurse) calcurse-caldav
-```
+Specify your HTTP Basic authentication credentials under the config file's
+`Auth` section. The most secure approach is to save your password in a CLI
+encrypted password store (_e.g.,_ [pass](https://www.passwordstore.org/)), and
+then set `PasswordCommand` to the shell command used to retrieve it.
+If security is not a priority, you may store your password in plain text
+instead.
Hooks
-----
diff --git a/contrib/caldav/calcurse-caldav.py b/contrib/caldav/calcurse-caldav.py
index 7c9b89b..f9488e6 100755
--- a/contrib/caldav/calcurse-caldav.py
+++ b/contrib/caldav/calcurse-caldav.py
@@ -3,25 +3,92 @@
import argparse
import base64
import configparser
-import httplib2
-import pathlib
import os
+import pathlib
import re
+import shlex
import subprocess
import sys
import textwrap
-import urllib.parse
import xml.etree.ElementTree as etree
+import httplib2
+
# Optional libraries for OAuth2 authentication
try:
- from oauth2client.client import OAuth2WebServerFlow, HttpAccessTokenRefreshError
- from oauth2client.file import Storage
import webbrowser
+
+ from oauth2client.client import HttpAccessTokenRefreshError, OAuth2WebServerFlow
+ from oauth2client.file import Storage
except ModuleNotFoundError:
pass
+class Config:
+ _map = {}
+
+ def __init__(self, fn):
+ self._map = {
+ 'Auth': {
+ 'Password': None,
+ 'PasswordCommand': None,
+ 'Username': None,
+ },
+ 'CustomHeaders': {},
+ 'General': {
+ 'AuthMethod': 'basic',
+ 'Binary': 'calcurse',
+ 'Debug': False,
+ 'DryRun': True,
+ 'HTTPS': True,
+ 'Hostname': None,
+ 'InsecureSSL': False,
+ 'Path': None,
+ 'SyncFilter': 'cal,todo',
+ 'Verbose': False,
+ },
+ 'OAuth2': {
+ 'ClientID': None,
+ 'ClientSecret': None,
+ 'RedirectURI': 'http://127.0.0.1',
+ 'Scope': None,
+ },
+ }
+
+ config = configparser.RawConfigParser()
+ config.optionxform = str
+ if verbose:
+ print('Loading configuration from ' + configfn + '...')
+ try:
+ config.read_file(open(fn))
+ except FileNotFoundError:
+ die('Configuration file not found: {}'.format(fn))
+
+ for sec in config.sections():
+ if sec not in self._map:
+ die('Unexpected config section: {}'.format(sec))
+
+ if not self._map[sec]:
+ # Import section with custom key-value pairs.
+ self._map[sec] = dict(config.items(sec))
+ continue
+
+ # Import section with predefined keys.
+ for key, val in config.items(sec):
+ if key not in self._map[sec]:
+ die('Unexpected config key in section {}: {}'.format(sec, key))
+ if type(self._map[sec][key]) == bool:
+ self._map[sec][key] = config.getboolean(sec, key)
+ else:
+ self._map[sec][key] = val
+
+ def section(self, section):
+ return self._map[section]
+
+ def get(self, section, key):
+ return self._map[section][key]
+
+
def msgfmt(msg, prefix=''):
lines = []
for line in msg.splitlines():
@@ -43,6 +110,7 @@ def check_dir(dir):
except FileExistsError:
die("{} is not a directory".format(dir))
+
def die_atnode(msg, node):
if debug:
msg += '\n\n'
@@ -147,8 +215,8 @@ def calcurse_version():
def get_auth_headers():
if not username or not password:
return {}
- user_password = ('{}:{}'.format(username, password)).encode('ascii')
- user_password = base64.b64encode(user_password).decode('ascii')
+ user_password = ('{}:{}'.format(username, password)).encode('utf-8')
+ user_password = base64.b64encode(user_password).decode('utf-8')
headers = {'Authorization': 'Basic {}'.format(user_password)}
return headers
@@ -353,18 +421,21 @@ def push_object(conn, objhash):
if not headers:
return None
-
- etag = None
headerdict = dict(headers)
- if 'etag' in headerdict:
- etag = headerdict['etag']
- while not etag:
+
+ # Retrieve href from server to match server-side format. Retrieve ETag
+ # unless it can be extracted from the PUT response already.
+ ret_href, ret_etag = None, headerdict.get('etag')
+ while not ret_etag or not ret_href:
etagdict = get_etags(conn, [href])
- if etagdict:
- etag = next(iter(etagdict.values()))
- etag = etag.strip('"')
+ if not etagdict:
+ continue
+ ret_href, new_etag = next(iter(etagdict.items()))
+ # Favor ETag from PUT response to avoid race condition.
+ if not ret_etag:
+ ret_etag = new_etag
- return (urllib.parse.quote(href), etag)
+ return (ret_href, ret_etag.strip('"'))
def push_objects(objhashes, conn, syncdb, etagdict):
@@ -588,105 +659,57 @@ verbose = args.verbose
debug = args.debug
debug_raw = args.debug_raw
-# Read environment variables
-password = os.getenv('CALCURSE_CALDAV_PASSWORD')
-
# Read configuration.
-config = configparser.RawConfigParser()
-if verbose:
- print('Loading configuration from ' + configfn + '...')
-try:
- config.read_file(open(configfn))
-except FileNotFoundError as e:
- die('Configuration file not found: {}'.format(configfn))
-
-if config.has_option('General', 'InsecureSSL'):
- insecure_ssl = config.getboolean('General', 'InsecureSSL')
+config = Config(configfn)
+
+authmethod = config.get('General', 'AuthMethod').lower()
+calcurse = [config.get('General', 'Binary')]
+debug = debug or config.get('General', 'Debug')
+dry_run = config.get('General', 'DryRun')
+hostname = config.get('General', 'Hostname')
+https = config.get('General', 'HTTPS')
+insecure_ssl = config.get('General', 'InsecureSSL')
+path = config.get('General', 'Path')
+sync_filter = config.get('General', 'SyncFilter')
+verbose = verbose or config.get('General', 'Verbose')
+
+if os.getenv('CALCURSE_CALDAV_PASSWORD'):
+ # This approach is deprecated, but preserved for backwards compatibility
+ password = os.getenv('CALCURSE_CALDAV_PASSWORD')
+elif config.get('Auth', 'Password'):
+ password = config.get('Auth', 'Password')
+elif config.get('Auth', 'PasswordCommand'):
+ tokenized_cmd = shlex.split(config.get('Auth', 'PasswordCommand'))
+ password = subprocess.run(tokenized_cmd, capture_output=True).stdout.decode('UTF-8')
else:
- insecure_ssl = False
+ password = None
-# Read config for "HTTPS" option (default=True)
-if config.has_option('General', 'HTTPS'):
- https = config.getboolean('General', 'HTTPS')
-else:
- https = True
+username = config.get('Auth', 'Username')
-if config.has_option('General', 'Binary'):
- calcurse = [config.get('General', 'Binary')]
-else:
- calcurse = ['calcurse']
+client_id = config.get('OAuth2', 'ClientID')
+client_secret = config.get('OAuth2', 'ClientSecret')
+redirect_uri = config.get('OAuth2', 'RedirectURI')
+scope = config.get('OAuth2', 'Scope')
+
+custom_headers = config.section('CustomHeaders')
+# Append data directory to calcurse command.
if datadir:
check_dir(datadir)
calcurse += ['-D', datadir]
-if config.has_option('General', 'DryRun'):
- dry_run = config.getboolean('General', 'DryRun')
-else:
- dry_run = True
-
-if not verbose and config.has_option('General', 'Verbose'):
- verbose = config.getboolean('General', 'Verbose')
-
-if not debug and config.has_option('General', 'Debug'):
- debug = config.getboolean('General', 'Debug')
-
-if config.has_option('General', 'AuthMethod'):
- authmethod = config.get('General', 'AuthMethod').lower()
-else:
- authmethod = 'basic'
-
-if config.has_option('General', 'SyncFilter'):
- sync_filter = config.get('General', 'SyncFilter')
-
- invalid_filter_values = validate_sync_filter()
-
- if len(invalid_filter_values):
- die('Invalid value(s) in SyncFilter option: ' + ', '.join(invalid_filter_values))
-else:
- sync_filter = 'cal,todo'
-
-if config.has_option('Auth', 'UserName'):
- username = config.get('Auth', 'UserName')
-else:
- username = None
-
-if config.has_option('Auth', 'Password') and not password:
- password = config.get('Auth', 'Password')
-
-if config.has_section('CustomHeaders'):
- custom_headers = dict(config.items('CustomHeaders'))
-else:
- custom_headers = {}
-
-if config.has_option('OAuth2', 'ClientID'):
- client_id = config.get('OAuth2', 'ClientID')
-else:
- client_id = None
-
-if config.has_option('OAuth2', 'ClientSecret'):
- client_secret = config.get('OAuth2', 'ClientSecret')
-else:
- client_secret = None
-
-if config.has_option('OAuth2', 'Scope'):
- scope = config.get('OAuth2', 'Scope')
-else:
- scope = None
-
-if config.has_option('OAuth2', 'RedirectURI'):
- redirect_uri = config.get('OAuth2', 'RedirectURI')
-else:
- redirect_uri = 'http://127.0.0.1'
-
-# Change URl prefix according to HTTP/HTTPS
-if https:
- urlprefix = "https://"
-else:
- urlprefix = "http://"
-
-hostname = config.get('General', 'HostName')
-path = '/' + config.get('General', 'Path').strip('/') + '/'
+# Validate sync filter.
+invalid_filter_values = validate_sync_filter()
+if len(invalid_filter_values):
+ die('Invalid value(s) in SyncFilter option: ' + ', '.join(invalid_filter_values))
+
+# Ensure host name and path are defined and initialize *_uri.
+if not hostname:
+ die('Hostname missing in configuration.')
+if not path:
+ die('Path missing in configuration.')
+urlprefix = "https://" if https else "http://"
+path = '/{}/'.format(path.strip('/'))
hostname_uri = urlprefix + hostname
absolute_uri = hostname_uri + path
@@ -719,9 +742,7 @@ try:
# Connect to the server.
if verbose:
print('Connecting to ' + hostname + '...')
- conn = httplib2.Http()
- if insecure_ssl:
- conn.disable_ssl_certificate_validation = True
+ conn = httplib2.Http(disable_ssl_certificate_validation=insecure_ssl)
if authmethod == 'oauth2':
# Authenticate with OAuth2 and authorize HTTP object
@@ -784,7 +805,7 @@ try:
# Write the synchronization database.
save_syncdb(syncdbfn, syncdb)
- #Clear OAuth2 credentials if used
+ # Clear OAuth2 credentials if used.
if authmethod == 'oauth2':
conn.clear_credentials()
diff --git a/contrib/caldav/config.sample b/contrib/caldav/config.sample
index c89cfb7..0ba8fa8 100644
--- a/contrib/caldav/config.sample
+++ b/contrib/caldav/config.sample
@@ -11,10 +11,12 @@
# Path to the calcurse binary that is used for importing/exporting items.
Binary = calcurse
-# Host name of the server that hosts CalDAV.
+# Host name of the server that hosts CalDAV. Do NOT prepend a protocol prefix,
+# such as http:// or https://. Append :<port> for a port other than 80.
Hostname = some.hostname.com
-# Path to the CalDAV calendar on the host specified above.
+# Path to the CalDAV calendar on the host specified above. This is the base
+# path following your host name in the URL.
Path = /path/to/calendar/on/the/server/
# Type of authentication to use. Must be "basic" or "oauth2"
@@ -46,11 +48,13 @@ DryRun = Yes
# Enable this if you want detailed logs written to stdout.
Verbose = Yes
-# Credentials for HTTP Basic Authentication. Leave this commented out if you do
-# not want to use authentication.
+# Credentials for HTTP Basic Authentication (if required).
+# Set `Password` to your password in plaintext (unsafe),
+# or `PasswordCommand` to a shell command that retrieves it (recommended).
#[Auth]
#Username = user
-#Password = pass
+#Password = password
+#PasswordCommand = pass baikal
# Optionally specify additional HTTP headers here.
#[CustomHeaders]
diff --git a/contrib/caldav/hooks/post-sync b/contrib/caldav/hooks/post-sync
index 62ebe11..db0059b 100755
--- a/contrib/caldav/hooks/post-sync
+++ b/contrib/caldav/hooks/post-sync
@@ -26,7 +26,7 @@ commit_dir() {
if [ -d .git ] && command -v git >/dev/null; then
git add "$@"
if ! git diff-index --quiet --cached HEAD; then
- git commit -m "Automatic commit by the post-save hook"
+ git commit -m "Automatic commit by the post-sync hook"
fi
fi
}
diff --git a/contrib/setup.cfg b/contrib/setup.cfg
new file mode 100644
index 0000000..0691fee
--- /dev/null
+++ b/contrib/setup.cfg
@@ -0,0 +1,3 @@
+[flake8]
+max-line-length = 100
+max-complexity = 16
diff --git a/doc/Makefile.am b/doc/Makefile.am
index 73cd8ce..adee962 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -57,8 +57,6 @@ CLEANFILES = \
submitting-patches.html \
calcurse.1
-docdir = $(datadir)/doc/$(PACKAGE)
-
.txt.html:
if HAVE_ASCIIDOC
$(AM_V_GEN) $(ASCIIDOC) $(ASCIIDOC_ARGS) $<
diff --git a/doc/calcurse.1.txt b/doc/calcurse.1.txt
index 4605219..1f79f9a 100644
--- a/doc/calcurse.1.txt
+++ b/doc/calcurse.1.txt
@@ -1,6 +1,6 @@
////
/*
- * Copyright (c) 2004-2020 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
@@ -764,5 +764,5 @@ AUTHORS
COPYRIGHT
---------
-Copyright (c) 2004-2020 calcurse Development Team.
+Copyright (c) 2004-2023 calcurse Development Team.
This software is released under the BSD License.
diff --git a/doc/credits.txt b/doc/credits.txt
index ac7c1ab..e1f5ae7 100644
--- a/doc/credits.txt
+++ b/doc/credits.txt
@@ -1,7 +1,7 @@
Calcurse - text-based organizer
===============================
-Copyright (c) 2004-2020 calcurse Development Team
+Copyright (c) 2004-2023 calcurse Development Team
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/doc/de/credits.txt b/doc/de/credits.txt
index ac7c1ab..e1f5ae7 100644
--- a/doc/de/credits.txt
+++ b/doc/de/credits.txt
@@ -1,7 +1,7 @@
Calcurse - text-based organizer
===============================
-Copyright (c) 2004-2020 calcurse Development Team
+Copyright (c) 2004-2023 calcurse Development Team
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/doc/es/credits.txt b/doc/es/credits.txt
index ac7c1ab..e1f5ae7 100644
--- a/doc/es/credits.txt
+++ b/doc/es/credits.txt
@@ -1,7 +1,7 @@
Calcurse - text-based organizer
===============================
-Copyright (c) 2004-2020 calcurse Development Team
+Copyright (c) 2004-2023 calcurse Development Team
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/doc/fr/credits.txt b/doc/fr/credits.txt
index ac7c1ab..e1f5ae7 100644
--- a/doc/fr/credits.txt
+++ b/doc/fr/credits.txt
@@ -1,7 +1,7 @@
Calcurse - text-based organizer
===============================
-Copyright (c) 2004-2020 calcurse Development Team
+Copyright (c) 2004-2023 calcurse Development Team
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/doc/manual.txt b/doc/manual.txt
index 7eaa211..03a27ff 100644
--- a/doc/manual.txt
+++ b/doc/manual.txt
@@ -1,6 +1,6 @@
////
/*
- * Copyright (c) 2004-2020 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
@@ -143,7 +143,7 @@ Install process
First you need to gunzip and untar the source archive:
----
-$ tar zxvf calcurse-4.7.0.tar.gz
+$ tar zxvf calcurse-4.8.1.tar.gz
----
Once you meet the requirements and have extracted the archive, the install
@@ -650,9 +650,9 @@ directory. Also make sure the scripts are executable.
*pre-load*::
Executed before the data files are loaded.
*post-load*::
- Executed after the data files are saved.
+ Executed after the data files are loaded.
*pre-save*::
- Executed before the data files are loaded.
+ Executed before the data files are saved.
*post-save*::
Executed after the data files are saved.
diff --git a/doc/nl/credits.txt b/doc/nl/credits.txt
index ac7c1ab..e1f5ae7 100644
--- a/doc/nl/credits.txt
+++ b/doc/nl/credits.txt
@@ -1,7 +1,7 @@
Calcurse - text-based organizer
===============================
-Copyright (c) 2004-2020 calcurse Development Team
+Copyright (c) 2004-2023 calcurse Development Team
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/doc/pt_BR/credits.txt b/doc/pt_BR/credits.txt
index 5cddabc..82efeb5 100644
--- a/doc/pt_BR/credits.txt
+++ b/doc/pt_BR/credits.txt
@@ -1,7 +1,7 @@
Calcurse - organizador baseado em texto
=======================================
-Copyright (c) 2004-2020 Equipe de Desenvolvimento do Calcurse
+Copyright (c) 2004-2023 Equipe de Desenvolvimento do Calcurse
Todos os direitos reservados.
A redistribuição e uso na forma de código-fonte e binário, com ou
diff --git a/doc/ru/credits.txt b/doc/ru/credits.txt
index ac7c1ab..e1f5ae7 100644
--- a/doc/ru/credits.txt
+++ b/doc/ru/credits.txt
@@ -1,7 +1,7 @@
Calcurse - text-based organizer
===============================
-Copyright (c) 2004-2020 calcurse Development Team
+Copyright (c) 2004-2023 calcurse Development Team
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/doc/submitting-patches.txt b/doc/submitting-patches.txt
index 056bfb5..6514949 100644
--- a/doc/submitting-patches.txt
+++ b/doc/submitting-patches.txt
@@ -1,6 +1,6 @@
////
/*
- * Copyright (c) 2004-2020 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
diff --git a/po/calcurse.pot b/po/calcurse.pot
index 16bf2e9..f1894e3 100644
--- a/po/calcurse.pot
+++ b/po/calcurse.pot
@@ -1,14 +1,14 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR calcurse Development Team <misc@calcurse.org>
-# This file is distributed under the same license as the PACKAGE package.
+# This file is distributed under the same license as the calcurse package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
+"Project-Id-Version: calcurse 4.8.1\n"
"Report-Msgid-Bugs-To: bugs@calcurse.org\n"
-"POT-Creation-Date: 2020-10-12 10:38-0400\n"
+"POT-Creation-Date: 2023-05-22 14:19-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -50,7 +50,7 @@ msgstr ""
msgid "calcurse %s -- text-based organizer\n"
msgstr ""
-msgid "Copyright (c) 2004-2020 calcurse Development Team."
+msgid "Copyright (c) 2004-2023 calcurse Development Team."
msgstr ""
msgid "This is free software; see the source for copying conditions."
@@ -419,12 +419,6 @@ msgstr ""
msgid "(if set to YES, confirmation is required before deleting an event)"
msgstr ""
-msgid "Monday"
-msgstr ""
-
-msgid "Sunday"
-msgstr ""
-
msgid "(specifies the first day of week in the calendar view)"
msgstr ""
@@ -449,12 +443,18 @@ msgstr ""
msgid "(Format of the date displayed in the appointments panel)"
msgstr ""
+msgid "(Format of the time displayed in the appointments panel)"
+msgstr ""
+
msgid "Enter a text string (an empty string for the default text)"
msgstr ""
msgid "Enter the date format (see 'man 3 strftime' for possible formats) "
msgstr ""
+msgid "Enter the time format (see 'man 3 strftime' for possible formats) "
+msgstr ""
+
msgid "Enter the date format: "
msgstr ""
@@ -467,7 +467,7 @@ msgstr ""
msgid "Undefined option!"
msgstr ""
-msgid "undefined"
+msgid "UNDEFINED"
msgstr ""
msgid "keys configuration"
@@ -480,7 +480,7 @@ msgstr ""
msgid "The key '%s' is already used for %s. Choose another one."
msgstr ""
-msgid "Some actions do not have any associated key bindings!"
+msgid "Some actions are left undefined!"
msgstr ""
msgid ""
@@ -581,6 +581,12 @@ msgstr ""
msgid "unknown ical type"
msgstr ""
+msgid "(empty)"
+msgstr ""
+
+msgid "ical_store_event: out of memory"
+msgstr ""
+
msgid "need DTSTART to determine event type."
msgstr ""
@@ -602,6 +608,9 @@ msgstr ""
msgid "either until or count."
msgstr ""
+msgid "missing until value."
+msgstr ""
+
msgid "invalid until format."
msgstr ""
@@ -640,58 +649,55 @@ msgstr ""
msgid "malformed summary."
msgstr ""
-msgid "line break in summary."
+msgid "item start date not defined."
msgstr ""
-msgid "could not retrieve item summary."
-msgstr ""
-
-msgid "item start date is not defined."
+msgid "malformed start time line."
msgstr ""
-msgid "multi-day event changed to one-day event"
+msgid "invalid or malformed event start time."
msgstr ""
-#, c-format
-msgid "Location: %s"
+msgid "invalid end time value type."
msgstr ""
-#, c-format
-msgid "Comment: %s"
+msgid "malformed end time line."
msgstr ""
-#, c-format
-msgid "rrule does not match start day (%s)."
+msgid "malformed event end time."
msgstr ""
-msgid "item could not be identified."
+msgid "end must be later than start."
msgstr ""
-msgid "malformed start time line."
+msgid "either end or duration."
msgstr ""
-msgid "invalid or malformed event start time."
+msgid "malformed duration line."
msgstr ""
-msgid "either end or duration."
+msgid "invalid duration."
msgstr ""
-msgid "invalid end time value type."
+msgid "exception date, but no recurrence rule."
msgstr ""
-msgid "malformed end time line."
+msgid "multi-day event changed to one-day event"
msgstr ""
-msgid "malformed event end time."
+#, c-format
+msgid "Location: %s"
msgstr ""
-msgid "end must be later than start."
+#, c-format
+msgid "Comment: %s"
msgstr ""
-msgid "malformed duration line."
+#, c-format
+msgid "rrule does not match start day (%s)."
msgstr ""
-msgid "invalid duration."
+msgid "item could not be identified."
msgstr ""
msgid "only one description allowed."
@@ -703,6 +709,9 @@ msgstr ""
msgid "The ical file seems to be malformed. The end of item was not found."
msgstr ""
+msgid "could not retrieve item summary."
+msgstr ""
+
msgid "item priority is invalid (must be between 0 and 9)."
msgstr ""
@@ -797,31 +806,37 @@ msgstr ""
msgid "failed to open key file"
msgstr ""
-msgid ""
-"\n"
-"Too many errors while reading configuration file!\n"
-"Please backup your keys file, remove it from directory, and launch calcurse "
-"again.\n"
+msgid "Could not read key label"
msgstr ""
-msgid "Could not read key label"
+#, c-format
+msgid "Key label not recognized: \"%s\""
msgstr ""
-msgid "Key label not recognized"
+#, c-format
+msgid "No keys assigned to \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "Keyname not recognized: \"%s\""
msgstr ""
#, c-format
-msgid "Error reading key: \"%s\""
+msgid "\"%s\" assigned twice: \"%s\"."
msgstr ""
#, c-format
-msgid "\"%s\" assigned multiple times!"
+msgid ""
+"Action \"%s\" absent, but default key \"%s\" assigned to another action."
msgstr ""
-msgid "There were some errors when loading keys file."
+msgid "Errors in the keys file."
msgstr ""
-msgid "Too many errors while reading keys file, aborting..."
+msgid "Remove offending line(s) from the keys file, aborting..."
+msgstr ""
+
+msgid "Some actions do not have any associated key bindings!"
msgstr ""
#, c-format
@@ -948,6 +963,9 @@ msgstr ""
msgid "Chg Win"
msgstr ""
+msgid "Prev Win"
+msgstr ""
+
msgid "Import"
msgstr ""
@@ -1126,6 +1144,9 @@ msgstr ""
msgid "Select next panel in calcurse main screen."
msgstr ""
+msgid "Select previous panel in calcurse main screen."
+msgstr ""
+
msgid "Import data from an external file."
msgstr ""
@@ -1246,7 +1267,7 @@ msgid "FATAL ERROR: null file pointer."
msgstr ""
#, c-format
-msgid "When adding default key for \"%s\", \"%s\" was already assigned!"
+msgid "Default key(s) assigned to %d action%s."
msgstr ""
msgid "xmalloc: zero size"
@@ -1339,12 +1360,6 @@ msgstr ""
msgid "Warning: could not open %s, Aborting..."
msgstr ""
-msgid "error while launching command: could not fork"
-msgstr ""
-
-msgid "error while launching command"
-msgstr ""
-
msgid "(if set to YES, notify-bar will be displayed)"
msgstr ""
@@ -1370,9 +1385,6 @@ msgstr ""
msgid "(Log activity when running in background)"
msgstr ""
-msgid "Enter the time format (see 'man 3 strftime' for possible formats) "
-msgstr ""
-
msgid "Enter the number of seconds (0 not to be warned before an appointment)"
msgstr ""
@@ -1761,7 +1773,7 @@ msgstr ""
msgid ""
"\n"
-"Copyright (c) 2004-2020 calcurse Development Team.\n"
+"Copyright (c) 2004-2023 calcurse Development Team.\n"
"This is free software; see the source for copying conditions.\n"
msgstr ""
diff --git a/po/de.po b/po/de.po
index 9707916..19dcf19 100644
--- a/po/de.po
+++ b/po/de.po
@@ -4,7 +4,7 @@
#
# Translators:
# delix, 2012
-# delix, 2012
+# 854c965733f966783769d2df566aaebe_fdcf60e, 2012
# Lukas Fleischer, 2019
# Stefan Schroeder <ondekoza@gmail.com>, 2017
# Tim, 2013
@@ -14,8 +14,8 @@ msgid ""
msgstr ""
"Project-Id-Version: calcurse\n"
"Report-Msgid-Bugs-To: bugs@calcurse.org\n"
-"POT-Creation-Date: 2020-10-12 10:38-0400\n"
-"PO-Revision-Date: 2020-01-30 18:17+0000\n"
+"POT-Creation-Date: 2023-05-22 14:19-0400\n"
+"PO-Revision-Date: 2020-10-12 15:20+0000\n"
"Last-Translator: Lukas Fleischer\n"
"Language-Team: German (http://www.transifex.com/lfleischer/calcurse/language/"
"de/)\n"
@@ -59,9 +59,8 @@ msgstr "Der Aufruf `calcurse -h` zeigt weitere Hilfen."
msgid "calcurse %s -- text-based organizer\n"
msgstr "calcurse %s -- Terminplaner im Textmodus\n"
-#, fuzzy
-msgid "Copyright (c) 2004-2020 calcurse Development Team."
-msgstr "Copyright (c) 2004-2017 calcurse Entwickler-Team."
+msgid "Copyright (c) 2004-2023 calcurse Development Team."
+msgstr ""
msgid "This is free software; see the source for copying conditions."
msgstr "This is free software; see the source for copying conditions."
@@ -438,12 +437,6 @@ msgstr ""
"(Ist JA gewählt, ist eine Bestätigung erforderlich, um ein Ereignis zu "
"löschen)"
-msgid "Monday"
-msgstr "Montag"
-
-msgid "Sunday"
-msgstr "Sonntag"
-
msgid "(specifies the first day of week in the calendar view)"
msgstr "(lege den ersten Tag der Woche in der Kalenderansicht fest)"
@@ -468,12 +461,19 @@ msgstr "(Position des Titels in der Terminleiste)"
msgid "(Format of the date displayed in the appointments panel)"
msgstr "(Format des Datums in der Termin-Anzeige)"
+#, fuzzy
+msgid "(Format of the time displayed in the appointments panel)"
+msgstr "(Format des Datums in der Termin-Anzeige)"
+
msgid "Enter a text string (an empty string for the default text)"
msgstr ""
msgid "Enter the date format (see 'man 3 strftime' for possible formats) "
msgstr "Geben Sie das Datumsformat an (vgl. 'man 3 strftime')"
+msgid "Enter the time format (see 'man 3 strftime' for possible formats) "
+msgstr "Zeitformat eingeben (vgl. 'man 3 strftime')"
+
msgid "Enter the date format: "
msgstr "Datumsformat eingeben:"
@@ -488,8 +488,8 @@ msgstr "Allgemeine Einstellungen"
msgid "Undefined option!"
msgstr "Unbestimmte Einstellung!"
-msgid "undefined"
-msgstr "unbestimmt"
+msgid "UNDEFINED"
+msgstr ""
msgid "keys configuration"
msgstr "Tasteneinstellung"
@@ -501,8 +501,9 @@ msgstr "Taste drücken, die zugewiesen werden soll:"
msgid "The key '%s' is already used for %s. Choose another one."
msgstr "Die Taste '%s' wird schon von %s benutzt. Wählen Sie eine andere."
-msgid "Some actions do not have any associated key bindings!"
-msgstr "Einige Aktionen haben keine Tastenzuordnung!"
+#, fuzzy
+msgid "Some actions are left undefined!"
+msgstr "Option nicht definiert"
msgid ""
"Sorry, colors are not supported by your terminal\n"
@@ -607,6 +608,13 @@ msgstr "Hauptspeicher reicht nicht aus"
msgid "unknown ical type"
msgstr "Unbekannter ICal-Typ"
+msgid "(empty)"
+msgstr ""
+
+#, fuzzy
+msgid "ical_store_event: out of memory"
+msgstr "xcalloc: Speicher ist voll"
+
msgid "need DTSTART to determine event type."
msgstr ""
@@ -630,6 +638,9 @@ msgstr "Ungültiger Filter"
msgid "either until or count."
msgstr ""
+msgid "missing until value."
+msgstr ""
+
#, fuzzy
msgid "invalid until format."
msgstr "Ungültiges Exportformat: %s"
@@ -658,61 +669,32 @@ msgstr ""
msgid "invalid exception."
msgstr "Ungültige Wiederholungsrate."
-#, fuzzy, c-format
+#, c-format
msgid "malformed %s line."
-msgstr "Startzeit des Ereignisses hat ein ungültiges Format."
+msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "malformed %s."
-msgstr "Beschreibung eingeben:"
+msgstr ""
-#, fuzzy
msgid "malformed summary line."
-msgstr "Startzeit des Ereignisses hat ein ungültiges Format."
-
-msgid "malformed summary."
msgstr ""
-msgid "line break in summary."
+msgid "malformed summary."
msgstr ""
-msgid "could not retrieve item summary."
-msgstr "Kann die Zusammenfassung des Eintrags nicht lesen."
-
-msgid "item start date is not defined."
+#, fuzzy
+msgid "item start date not defined."
msgstr "Anfangsdatum des Eintrags fehlt."
-msgid "multi-day event changed to one-day event"
-msgstr ""
-
-#, fuzzy, c-format
-msgid "Location: %s"
-msgstr "alloziiert bei: %s\n"
-
-#, c-format
-msgid "Comment: %s"
-msgstr ""
-
-#, c-format
-msgid "rrule does not match start day (%s)."
-msgstr ""
-
-msgid "item could not be identified."
-msgstr "Element kann nicht erkannt werden."
-
-#, fuzzy
msgid "malformed start time line."
-msgstr "Startzeit des Ereignisses hat ein ungültiges Format."
+msgstr ""
#, fuzzy
msgid "invalid or malformed event start time."
msgstr "Kann die Startzeit des Ereignis nicht lesen."
#, fuzzy
-msgid "either end or duration."
-msgstr "Syntaxfehler in Item-Zeit oder -Dauer"
-
-#, fuzzy
msgid "invalid end time value type."
msgstr "Ungültiger Zeitraum: %s"
@@ -727,16 +709,39 @@ msgid "end must be later than start."
msgstr ""
#, fuzzy
+msgid "either end or duration."
+msgstr "Syntaxfehler in Item-Zeit oder -Dauer"
+
msgid "malformed duration line."
-msgstr "Beschreibung Fehlerhaft."
+msgstr ""
#, fuzzy
msgid "invalid duration."
msgstr "Ungültiges Datum: %s"
-#, fuzzy
+msgid "exception date, but no recurrence rule."
+msgstr ""
+
+msgid "multi-day event changed to one-day event"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Location: %s"
+msgstr "alloziiert bei: %s\n"
+
+#, c-format
+msgid "Comment: %s"
+msgstr ""
+
+#, c-format
+msgid "rrule does not match start day (%s)."
+msgstr ""
+
+msgid "item could not be identified."
+msgstr "Element kann nicht erkannt werden."
+
msgid "only one description allowed."
-msgstr "Beschreibung Fehlerhaft."
+msgstr ""
msgid "only one location allowed."
msgstr ""
@@ -744,6 +749,9 @@ msgstr ""
msgid "The ical file seems to be malformed. The end of item was not found."
msgstr "Die ICal Datei ist fehlerhaft. Keine Enddatum des Eintrags gefunden."
+msgid "could not retrieve item summary."
+msgstr "Kann die Zusammenfassung des Eintrags nicht lesen."
+
msgid "item priority is invalid (must be between 0 and 9)."
msgstr "Priorität des Eintrags ist ungültig (gültig sind 0 bis 9)"
@@ -842,37 +850,40 @@ msgstr ""
msgid "failed to open key file"
msgstr "Konnte Tastenkonfigurationsdatei nicht öffnen"
-msgid ""
-"\n"
-"Too many errors while reading configuration file!\n"
-"Please backup your keys file, remove it from directory, and launch calcurse "
-"again.\n"
-msgstr ""
-"\n"
-"Zu viele Fehler beim Lesen der Konfigurationsdatei!\n"
-"Bitte die Einstellungsdatei der Tastaturkürzel sichern, diese aus dem\n"
-"Verzeichnis löschen und calcurse neu starten.\n"
-
msgid "Could not read key label"
msgstr "Tastenbezeichnung nicht lesbar"
-msgid "Key label not recognized"
+#, fuzzy, c-format
+msgid "Key label not recognized: \"%s\""
msgstr "Tastenbezeichnung nicht erkannt"
#, c-format
-msgid "Error reading key: \"%s\""
-msgstr "Fehler beim Lesen der Taste \"%s\""
+msgid "No keys assigned to \"%s\"."
+msgstr ""
-#, c-format
-msgid "\"%s\" assigned multiple times!"
+#, fuzzy, c-format
+msgid "Keyname not recognized: \"%s\""
+msgstr "Tastenbezeichnung nicht erkannt"
+
+#, fuzzy, c-format
+msgid "\"%s\" assigned twice: \"%s\"."
msgstr "\"%s\" ist mehrfach zugeordnet!"
-msgid "There were some errors when loading keys file."
+#, c-format
+msgid ""
+"Action \"%s\" absent, but default key \"%s\" assigned to another action."
+msgstr ""
+
+msgid "Errors in the keys file."
msgstr ""
-msgid "Too many errors while reading keys file, aborting..."
+#, fuzzy
+msgid "Remove offending line(s) from the keys file, aborting..."
msgstr "Zu viele Fehler beim Lesen der 'keys'-Datei, Abbruch..."
+msgid "Some actions do not have any associated key bindings!"
+msgstr "Einige Aktionen haben keine Tastenzuordnung!"
+
#, c-format
msgid "FATAL ERROR: could not create %s: %s\n"
msgstr "SCHWERER FEHLER Konnte %s nicht erstellen: %s\n"
@@ -1002,6 +1013,9 @@ msgstr "Einfügen"
msgid "Chg Win"
msgstr "Wechseln"
+msgid "Prev Win"
+msgstr ""
+
msgid "Import"
msgstr "Importieren"
@@ -1189,6 +1203,10 @@ msgstr "Item an aktueller Position einfügen."
msgid "Select next panel in calcurse main screen."
msgstr "Wähle nächstes Fenster im calcurse-Hauptbildschirm."
+#, fuzzy
+msgid "Select previous panel in calcurse main screen."
+msgstr "Wähle nächstes Fenster im calcurse-Hauptbildschirm."
+
msgid "Import data from an external file."
msgstr "Importiere Daten von einer externen Datei."
@@ -1321,9 +1339,8 @@ msgid "FATAL ERROR: null file pointer."
msgstr "SCHWERER FEHLER: Null-Datei-Zeiger."
#, c-format
-msgid "When adding default key for \"%s\", \"%s\" was already assigned!"
+msgid "Default key(s) assigned to %d action%s."
msgstr ""
-"Beim Hinzufügen einer Default-Taste für \"%s\" war \"%s\" bereits zugewiesen!"
msgid "xmalloc: zero size"
msgstr "xmalloc: Länge 0"
@@ -1415,12 +1432,6 @@ msgstr " belegte Blöcke: %u\n"
msgid "Warning: could not open %s, Aborting..."
msgstr "WARNUNG: Kann %s nicht öffnen. Abbruch..."
-msgid "error while launching command: could not fork"
-msgstr "Fehler beim Ausführen einer Befehlszeile: Kann nicht Ausführen"
-
-msgid "error while launching command"
-msgstr "Fehler beim Ausführen einer Befehlszeile"
-
msgid "(if set to YES, notify-bar will be displayed)"
msgstr "(Ist JA gewählt, wird die Benachrichtigungszeile angezeigt)"
@@ -1447,9 +1458,6 @@ msgstr ""
msgid "(Log activity when running in background)"
msgstr "(Aufzeichnen von Aktivitäten, wenn im Hintergrund ausgeführt)"
-msgid "Enter the time format (see 'man 3 strftime' for possible formats) "
-msgstr "Zeitformat eingeben (vgl. 'man 3 strftime')"
-
msgid "Enter the number of seconds (0 not to be warned before an appointment)"
msgstr "Geben Sie die Zeit in Sekunden ein (0 um keine Hinweis zu erhalten)."
@@ -1856,13 +1864,9 @@ msgstr "Verwendung: calcurse-upgrade [-h|-v|--config <file>]"
#, fuzzy
msgid ""
"\n"
-"Copyright (c) 2004-2020 calcurse Development Team.\n"
+"Copyright (c) 2004-2023 calcurse Development Team.\n"
"This is free software; see the source for copying conditions.\n"
-msgstr ""
-"\n"
-"Copyright (c) 2004-2017 calcurse Entwickler-Team.\n"
-"Calcurse ist freie Software; die Lizenzbedingungen sind in den Quelltexten "
-"vermerkt.\n"
+msgstr "This is free software; see the source for copying conditions."
msgid "unrecognized option:"
msgstr "unbekannte Option:"
@@ -1912,6 +1916,36 @@ msgstr "Aktualisiere Konfigurationsanweisungen..."
msgid "Remove temporary backup..."
msgstr "Entferne temporäres Backup..."
+#~ msgid "Monday"
+#~ msgstr "Montag"
+
+#~ msgid "Sunday"
+#~ msgstr "Sonntag"
+
+#~ msgid "undefined"
+#~ msgstr "unbestimmt"
+
+#~ msgid ""
+#~ "\n"
+#~ "Too many errors while reading configuration file!\n"
+#~ "Please backup your keys file, remove it from directory, and launch "
+#~ "calcurse again.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Zu viele Fehler beim Lesen der Konfigurationsdatei!\n"
+#~ "Bitte die Einstellungsdatei der Tastaturkürzel sichern, diese aus dem\n"
+#~ "Verzeichnis löschen und calcurse neu starten.\n"
+
+#, c-format
+#~ msgid "Error reading key: \"%s\""
+#~ msgstr "Fehler beim Lesen der Taste \"%s\""
+
+#, c-format
+#~ msgid "When adding default key for \"%s\", \"%s\" was already assigned!"
+#~ msgstr ""
+#~ "Beim Hinzufügen einer Default-Taste für \"%s\" war \"%s\" bereits "
+#~ "zugewiesen!"
+
#~ msgid ""
#~ "(if set to YES, messages about loaded and saved data will be displayed)"
#~ msgstr ""
@@ -1924,10 +1958,6 @@ msgstr "Entferne temporäres Backup..."
#~ msgid "recurrence frequency not recognized."
#~ msgstr "Wiederholung nicht erkannt."
-#, fuzzy
-#~ msgid "empty description."
-#~ msgstr "Beschreibung eingeben:"
-
#~ msgid "item has a negative duration."
#~ msgstr "Eintrag hat eine negative Dauer."
@@ -1940,6 +1970,12 @@ msgstr "Entferne temporäres Backup..."
#~ msgid "Data files found. Data will be loaded now."
#~ msgstr "Benutzerdaten gefunden. Daten werden geladen."
+#~ msgid "error while launching command: could not fork"
+#~ msgstr "Fehler beim Ausführen einer Befehlszeile: Kann nicht Ausführen"
+
+#~ msgid "error while launching command"
+#~ msgstr "Fehler beim Ausführen einer Befehlszeile"
+
#~ msgid "unknown repetition type"
#~ msgstr "Unbekannter Wiederholungstyp"
@@ -1976,15 +2012,3 @@ msgstr "Entferne temporäres Backup..."
#~ msgid "wrong item type"
#~ msgstr "Falscher Typ des Eintrags"
-
-#~ msgid "recurrence rule malformed."
-#~ msgstr "Wiederholungstyp falsch."
-
-#~ msgid "recurrence exception dates malformed."
-#~ msgstr "Ausnahmen des Wiederholungstyp falsch."
-
-#~ msgid "could not get entire item description."
-#~ msgstr "Kann nicht die ganze Beschreibung lesen."
-
-#~ msgid "event end time malformed."
-#~ msgstr "Ereignis-Endzeit hat ein ungültiges Format."
diff --git a/po/doc/add-nb_NO.po b/po/doc/add-nb_NO.po
index c981c8b..19838eb 100644
--- a/po/doc/add-nb_NO.po
+++ b/po/doc/add-nb_NO.po
@@ -1,13 +1,13 @@
#
# Translators:
-# Alexander F Rødseth <rodseth@gmail.com>, 2013
+# Alexander F. Rødseth <rodseth@gmail.com>, 2013
msgid ""
msgstr ""
"Project-Id-Version: calcurse\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-22 10:27+0200\n"
"PO-Revision-Date: 2017-09-19 19:05+0000\n"
-"Last-Translator: Alexander F Rødseth <rodseth@gmail.com>\n"
+"Last-Translator: Alexander F. Rødseth <rodseth@gmail.com>\n"
"Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/lfleischer/calcurse/language/nb_NO/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
diff --git a/po/doc/copy-paste-nb_NO.po b/po/doc/copy-paste-nb_NO.po
index c84f2ba..363ac2a 100644
--- a/po/doc/copy-paste-nb_NO.po
+++ b/po/doc/copy-paste-nb_NO.po
@@ -1,13 +1,13 @@
#
# Translators:
-# Alexander F Rødseth <rodseth@gmail.com>, 2017
+# Alexander F. Rødseth <rodseth@gmail.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: calcurse\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-22 10:27+0200\n"
"PO-Revision-Date: 2017-09-19 19:05+0000\n"
-"Last-Translator: Alexander F Rødseth <rodseth@gmail.com>\n"
+"Last-Translator: Alexander F. Rødseth <rodseth@gmail.com>\n"
"Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/lfleischer/calcurse/language/nb_NO/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
diff --git a/po/doc/credits-nb_NO.po b/po/doc/credits-nb_NO.po
index 76ddeef..074595b 100644
--- a/po/doc/credits-nb_NO.po
+++ b/po/doc/credits-nb_NO.po
@@ -1,6 +1,6 @@
#
# Translators:
-# Alexander F Rødseth <rodseth@gmail.com>, 2017
+# Alexander F. Rødseth <rodseth@gmail.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: calcurse\n"
diff --git a/po/doc/edit-nb_NO.po b/po/doc/edit-nb_NO.po
index 89fc52e..42d4951 100644
--- a/po/doc/edit-nb_NO.po
+++ b/po/doc/edit-nb_NO.po
@@ -1,13 +1,13 @@
#
# Translators:
-# Alexander F Rødseth <rodseth@gmail.com>, 2013
+# Alexander F. Rødseth <rodseth@gmail.com>, 2013
msgid ""
msgstr ""
"Project-Id-Version: calcurse\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-22 10:27+0200\n"
"PO-Revision-Date: 2017-09-19 19:05+0000\n"
-"Last-Translator: Alexander F Rødseth <rodseth@gmail.com>\n"
+"Last-Translator: Alexander F. Rødseth <rodseth@gmail.com>\n"
"Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/lfleischer/calcurse/language/nb_NO/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
diff --git a/po/doc/export-nb_NO.po b/po/doc/export-nb_NO.po
index 4fcd275..80d78e9 100644
--- a/po/doc/export-nb_NO.po
+++ b/po/doc/export-nb_NO.po
@@ -1,13 +1,13 @@
#
# Translators:
-# Alexander F Rødseth <rodseth@gmail.com>, 2017
+# Alexander F. Rødseth <rodseth@gmail.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: calcurse\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-22 10:27+0200\n"
"PO-Revision-Date: 2017-09-19 19:05+0000\n"
-"Last-Translator: Alexander F Rødseth <rodseth@gmail.com>\n"
+"Last-Translator: Alexander F. Rødseth <rodseth@gmail.com>\n"
"Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/lfleischer/calcurse/language/nb_NO/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
diff --git a/po/doc/flag-nb_NO.po b/po/doc/flag-nb_NO.po
index 60e4a19..bfd2673 100644
--- a/po/doc/flag-nb_NO.po
+++ b/po/doc/flag-nb_NO.po
@@ -1,13 +1,13 @@
#
# Translators:
-# Alexander F Rødseth <rodseth@gmail.com>, 2013
+# Alexander F. Rødseth <rodseth@gmail.com>, 2013
msgid ""
msgstr ""
"Project-Id-Version: calcurse\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-22 10:27+0200\n"
"PO-Revision-Date: 2017-09-19 19:05+0000\n"
-"Last-Translator: Alexander F Rødseth <rodseth@gmail.com>\n"
+"Last-Translator: Alexander F. Rødseth <rodseth@gmail.com>\n"
"Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/lfleischer/calcurse/language/nb_NO/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
diff --git a/po/doc/save-nb_NO.po b/po/doc/save-nb_NO.po
index 0b35dc9..9f5a111 100644
--- a/po/doc/save-nb_NO.po
+++ b/po/doc/save-nb_NO.po
@@ -1,13 +1,13 @@
#
# Translators:
-# Alexander F Rødseth <rodseth@gmail.com>, 2017
+# Alexander F. Rødseth <rodseth@gmail.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: calcurse\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-22 10:27+0200\n"
"PO-Revision-Date: 2017-09-19 19:05+0000\n"
-"Last-Translator: Alexander F Rødseth <rodseth@gmail.com>\n"
+"Last-Translator: Alexander F. Rødseth <rodseth@gmail.com>\n"
"Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/lfleischer/calcurse/language/nb_NO/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
diff --git a/po/doc/tab-nb_NO.po b/po/doc/tab-nb_NO.po
index 386f0bc..6b2a512 100644
--- a/po/doc/tab-nb_NO.po
+++ b/po/doc/tab-nb_NO.po
@@ -1,13 +1,13 @@
#
# Translators:
-# Alexander F Rødseth <rodseth@gmail.com>, 2017
+# Alexander F. Rødseth <rodseth@gmail.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: calcurse\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-22 10:27+0200\n"
"PO-Revision-Date: 2017-09-19 19:05+0000\n"
-"Last-Translator: Alexander F Rødseth <rodseth@gmail.com>\n"
+"Last-Translator: Alexander F. Rødseth <rodseth@gmail.com>\n"
"Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/lfleischer/calcurse/language/nb_NO/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
diff --git a/po/doc/vnote-nb_NO.po b/po/doc/vnote-nb_NO.po
index c008471..16876ba 100644
--- a/po/doc/vnote-nb_NO.po
+++ b/po/doc/vnote-nb_NO.po
@@ -1,13 +1,13 @@
#
# Translators:
-# Alexander F Rødseth <rodseth@gmail.com>, 2013
+# Alexander F. Rødseth <rodseth@gmail.com>, 2013
msgid ""
msgstr ""
"Project-Id-Version: calcurse\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-22 10:27+0200\n"
"PO-Revision-Date: 2017-09-19 19:05+0000\n"
-"Last-Translator: Alexander F Rødseth <rodseth@gmail.com>\n"
+"Last-Translator: Alexander F. Rødseth <rodseth@gmail.com>\n"
"Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/lfleischer/calcurse/language/nb_NO/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
diff --git a/po/en.po b/po/en.po
index 971cdaf..72378ee 100644
--- a/po/en.po
+++ b/po/en.po
@@ -1,15 +1,13 @@
-# English/GB translation of calcurse.
-# Copyright (C) 2006 Copyright (c) Frederic Culot <frederic@culot.org>
+# English/GB translation of calcurse
+# Copyright (C) 2021 calcurse Development Team <misc@calcurse.org>
# This file is distributed under the same license as the calcurse package.
# Neil Williams <linux@codehelp.co.uk>, 2006.
-# , fuzzy
-#
#
msgid ""
msgstr ""
-"Project-Id-Version: calcurse 1.4\n"
+"Project-Id-Version: calcurse\n"
"Report-Msgid-Bugs-To: bugs@calcurse.org\n"
-"POT-Creation-Date: 2020-10-12 10:38-0400\n"
+"POT-Creation-Date: 2023-05-22 14:19-0400\n"
"PO-Revision-Date: 2006-07-03 00:05+0100\n"
"Last-Translator: Neil Williams <linux@codehelp.co.uk>\n"
"Language-Team: English/GB <en_GB@li.org>\n"
@@ -17,25 +15,22 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "null pointer"
msgstr ""
-#, fuzzy
msgid "illegal date in appointment"
-msgstr "Appointment :"
+msgstr ""
-#, fuzzy
msgid "error in appointment description"
-msgstr "Appointment :"
+msgstr ""
-#, fuzzy
msgid "date error in appointment"
-msgstr "Appointment :"
+msgstr ""
-#, fuzzy
msgid "no such appointment"
-msgstr "Appointment :"
+msgstr ""
msgid ""
"Usage:\n"
@@ -47,31 +42,21 @@ msgid ""
"daemon"
msgstr ""
-#, fuzzy
msgid "Try `calcurse -h` for more information."
-msgstr "Try 'calcurse -h' for more information.\n"
+msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "calcurse %s -- text-based organizer\n"
-msgstr "Calcurse %s - text-based organizer\n"
+msgstr ""
-#, fuzzy
-msgid "Copyright (c) 2004-2020 calcurse Development Team."
+msgid "Copyright (c) 2004-2023 calcurse Development Team."
msgstr ""
-"\n"
-"Copyright (c) 2004-2006 Frederic Culot.\n"
-"This is free software; see the source for copying conditions.\n"
-#, fuzzy
msgid "This is free software; see the source for copying conditions."
msgstr ""
-"\n"
-"Copyright (c) 2004-2006 Frederic Culot.\n"
-"This is free software; see the source for copying conditions.\n"
-#, fuzzy
msgid "Operations in command line mode:"
-msgstr "starting interactive mode...\n"
+msgstr ""
msgid " -Q, --query Print items in a given query range"
msgstr ""
@@ -155,20 +140,15 @@ msgid ""
" -x, --export[<format>] Export to stdout in ical (default) or pcal format"
msgstr ""
-#, fuzzy
msgid ""
"For more information, type '?' from within calcurse, or read the manpage."
msgstr ""
-"\n"
-"For more information, type '?' from within Calcurse, or read the manpage.\n"
-#, fuzzy
msgid "Submit feature requests and suggestions to <misc@calcurse.org>."
-msgstr "Mail bug reports and suggestions to <misc@calcurse.org>.\n"
+msgstr ""
-#, fuzzy
msgid "Submit bug reports to <bugs@calcurse.org>."
-msgstr "Mail bug reports and suggestions to <misc@calcurse.org>.\n"
+msgstr ""
#, c-format
msgid ""
@@ -192,11 +172,10 @@ msgid "completed tasks:\n"
msgstr ""
msgid "to do:\n"
-msgstr "to do:\n"
+msgstr ""
-#, fuzzy
msgid "next appointment:\n"
-msgstr "Appointment :"
+msgstr ""
#, c-format
msgid "invalid range: %s"
@@ -236,13 +215,13 @@ msgstr ""
msgid "calcurse is running (pid = %d)"
msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "invalid input date format: %s"
-msgstr "Enter the new ToDo item : "
+msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "invalid output date format: %s"
-msgstr "Enter the new ToDo item : "
+msgstr ""
msgid "invalid argument combination"
msgstr ""
@@ -256,13 +235,11 @@ msgstr ""
msgid "Unable to find documentation."
msgstr ""
-#, fuzzy
msgid "Data were saved successfully"
-msgstr "The data files were successfully saved"
+msgstr ""
-#, fuzzy
msgid "Data were saved/reloaded successfully"
-msgstr "The data files were successfully saved"
+msgstr ""
msgid "Save cancelled"
msgstr ""
@@ -270,17 +247,14 @@ msgstr ""
msgid "Data were already saved"
msgstr ""
-#, fuzzy
msgid "Cannot open data file"
-msgstr "Failed to open todo file"
+msgstr ""
-#, fuzzy
msgid "Data were reloaded successfully"
-msgstr "The data files were successfully saved"
+msgstr ""
-#, fuzzy
msgid "Date were merged/reloaded successfully"
-msgstr "The data files were successfully saved"
+msgstr ""
msgid "Reload cancelled"
msgstr ""
@@ -297,9 +271,8 @@ msgstr ""
msgid "There are unsaved changes. Should they be saved?"
msgstr ""
-#, fuzzy
msgid "Do you really want to quit?"
-msgstr "Do you really want to quit ?"
+msgstr ""
msgid "Command: [ h(elp) | w(rite)(!) | q(uit)(!) | wq(!) | n(ext) | p(rev) ]"
msgstr ""
@@ -330,13 +303,11 @@ msgstr ""
msgid "No such command: %s"
msgstr ""
-#, fuzzy
msgid "unknown color"
-msgstr "Colour"
+msgstr "unknown colour"
-#, fuzzy
msgid "failed to open configuration file"
-msgstr "Failed to open config file"
+msgstr ""
#, c-format
msgid "invalid configuration directive: \"%s\""
@@ -351,21 +322,20 @@ msgstr ""
msgid "unknown user option: \"%s\" (ignored)"
msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "invalid option format: \"%s\" (ignored)"
-msgstr "Enter the new ToDo item : "
+msgstr ""
#, c-format
msgid "unknown user option: \"%s\" (disabled)"
msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "invalid option format: \"%s\" (disabled)"
-msgstr "Enter the new ToDo item : "
+msgstr ""
-#, fuzzy
msgid "layout configuration"
-msgstr "CalCurse %s | general options"
+msgstr ""
msgid "Foreground"
msgstr ""
@@ -376,19 +346,17 @@ msgstr ""
msgid "(terminal's default)"
msgstr ""
-#, fuzzy
msgid "color theme"
-msgstr "CalCurse %s | help"
+msgstr "colour theme"
-#, fuzzy
msgid "(if set to YES, compact panels are used)"
-msgstr "(if set to YES, progress bar will not be displayed when saving data)"
+msgstr ""
msgid "Calendar"
-msgstr "Calendar"
+msgstr ""
msgid "Appointments"
-msgstr "Appointments"
+msgstr ""
msgid "TODO"
msgstr ""
@@ -433,7 +401,7 @@ msgid "(display more than one day in the appointments panel)"
msgstr ""
msgid "(if set to YES, automatic save is done when quitting)"
-msgstr "(if set to YES, automatic save is done when quitting)"
+msgstr ""
msgid "(run the garbage collector when quitting)"
msgstr ""
@@ -445,15 +413,9 @@ msgid "(if YES, system events are turned into appointments (or else deleted))"
msgstr ""
msgid "(if set to YES, confirmation is required before quitting)"
-msgstr "(if set to YES, confirmation is required before quitting)"
-
-msgid "(if set to YES, confirmation is required before deleting an event)"
-msgstr "(if set to YES, confirmation is required before deleting an event)"
-
-msgid "Monday"
msgstr ""
-msgid "Sunday"
+msgid "(if set to YES, confirmation is required before deleting an event)"
msgstr ""
msgid "(specifies the first day of week in the calendar view)"
@@ -480,32 +442,35 @@ msgstr ""
msgid "(Format of the date displayed in the appointments panel)"
msgstr ""
+msgid "(Format of the time displayed in the appointments panel)"
+msgstr ""
+
msgid "Enter a text string (an empty string for the default text)"
msgstr ""
msgid "Enter the date format (see 'man 3 strftime' for possible formats) "
msgstr ""
-#, fuzzy
+msgid "Enter the time format (see 'man 3 strftime' for possible formats) "
+msgstr ""
+
msgid "Enter the date format: "
-msgstr "Enter the new ToDo item : "
+msgstr ""
msgid "Enter the delay, in minutes, between automatic saves (0 to disable) "
msgstr ""
-#, fuzzy
msgid "general options"
-msgstr "CalCurse %s | general options"
+msgstr ""
msgid "Undefined option!"
msgstr ""
-msgid "undefined"
+msgid "UNDEFINED"
msgstr ""
-#, fuzzy
msgid "keys configuration"
-msgstr "CalCurse %s | general options"
+msgstr ""
msgid "Press the key you want to assign to:"
msgstr ""
@@ -514,7 +479,7 @@ msgstr ""
msgid "The key '%s' is already used for %s. Choose another one."
msgstr ""
-msgid "Some actions do not have any associated key bindings!"
+msgid "Some actions are left undefined!"
msgstr ""
msgid ""
@@ -524,67 +489,62 @@ msgstr ""
"Sorry, colours are not supported by your terminal\n"
"(Press [ENTER] to continue)"
-#, fuzzy, c-format
+#, c-format
msgid "Could not save %s."
-msgstr "Enter description :"
+msgstr ""
msgid "unknown item type"
msgstr ""
-#, fuzzy
msgid "Note:"
-msgstr "Add Item"
+msgstr ""
-#, fuzzy
msgid "Event:"
-msgstr "Event :"
+msgstr ""
-#, fuzzy
msgid "Appointment:"
-msgstr "Appointment :"
+msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "Could not stop daemon properly: %s\n"
-msgstr "Enter description :"
+msgstr ""
#, c-format
msgid "terminated at %s with signal %d\n"
msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "Could not remove daemon lock file: %s\n"
-msgstr "Enter description :"
+msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "Could not fork: %s\n"
-msgstr "Enter description :"
+msgstr ""
#, c-format
msgid "Could not detach from the controlling terminal: %s\n"
msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "Could not change working directory: %s\n"
-msgstr "Enter description :"
+msgstr ""
msgid "Cannot daemonize, aborting\n"
msgstr ""
-#, fuzzy
msgid "Could not set lock file\n"
-msgstr "Enter description :"
+msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "Could not access \"%s\": %s\n"
-msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
+msgstr ""
#, c-format
msgid "started at %s\n"
msgstr ""
-#, fuzzy
msgid "error loading next appointment\n"
-msgstr "Appointment :"
+msgstr ""
#, c-format
msgid "launching notification at %s for: \"%s\"\n"
@@ -603,16 +563,15 @@ msgstr[1] ""
msgid "awakened at %s\n"
msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "Could not stop calcurse daemon: %s\n"
-msgstr "Enter description :"
+msgstr ""
msgid "illegal date in event"
msgstr ""
-#, fuzzy
msgid "date error in event\n"
-msgstr "FATAL ERROR in event_scan: date error in the event\n"
+msgstr ""
msgid "Internal error: line too long"
msgstr ""
@@ -620,9 +579,14 @@ msgstr ""
msgid "out of memory"
msgstr ""
-#, fuzzy
msgid "unknown ical type"
-msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
+msgstr ""
+
+msgid "(empty)"
+msgstr ""
+
+msgid "ical_store_event: out of memory"
+msgstr ""
msgid "need DTSTART to determine event type."
msgstr ""
@@ -639,16 +603,17 @@ msgstr ""
msgid "rrule frequency not supported."
msgstr ""
-#, fuzzy
msgid "invalid interval."
-msgstr "Enter the new ToDo item : "
+msgstr ""
msgid "either until or count."
msgstr ""
-#, fuzzy
+msgid "missing until value."
+msgstr ""
+
msgid "invalid until format."
-msgstr "Enter the new ToDo item : "
+msgstr ""
msgid "invalid count value."
msgstr ""
@@ -668,87 +633,76 @@ msgstr ""
msgid "malformed exceptions line."
msgstr ""
-#, fuzzy
msgid "invalid exception."
-msgstr "FATAL ERROR in load_app: syntax error in the item date\n"
+msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "malformed %s line."
-msgstr "Enter description :"
+msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "malformed %s."
-msgstr "Enter description :"
+msgstr ""
-#, fuzzy
msgid "malformed summary line."
-msgstr "Enter description :"
+msgstr ""
msgid "malformed summary."
msgstr ""
-msgid "line break in summary."
+msgid "item start date not defined."
msgstr ""
-#, fuzzy
-msgid "could not retrieve item summary."
-msgstr "Enter description :"
-
-#, fuzzy
-msgid "item start date is not defined."
-msgstr "The day you entered is not valid"
+msgid "malformed start time line."
+msgstr ""
-msgid "multi-day event changed to one-day event"
+msgid "invalid or malformed event start time."
msgstr ""
-#, c-format
-msgid "Location: %s"
+msgid "invalid end time value type."
msgstr ""
-#, c-format
-msgid "Comment: %s"
+msgid "malformed end time line."
msgstr ""
-#, c-format
-msgid "rrule does not match start day (%s)."
+msgid "malformed event end time."
msgstr ""
-msgid "item could not be identified."
+msgid "end must be later than start."
msgstr ""
-msgid "malformed start time line."
+msgid "either end or duration."
msgstr ""
-msgid "invalid or malformed event start time."
+msgid "malformed duration line."
msgstr ""
-#, fuzzy
-msgid "either end or duration."
-msgstr "FATAL ERROR in load_app: syntax error in the item date\n"
+msgid "invalid duration."
+msgstr ""
-msgid "invalid end time value type."
+msgid "exception date, but no recurrence rule."
msgstr ""
-msgid "malformed end time line."
+msgid "multi-day event changed to one-day event"
msgstr ""
-msgid "malformed event end time."
+#, c-format
+msgid "Location: %s"
msgstr ""
-msgid "end must be later than start."
+#, c-format
+msgid "Comment: %s"
msgstr ""
-#, fuzzy
-msgid "malformed duration line."
-msgstr "Enter description :"
+#, c-format
+msgid "rrule does not match start day (%s)."
+msgstr ""
-#, fuzzy
-msgid "invalid duration."
-msgstr "FATAL ERROR in load_app: syntax error in the item date\n"
+msgid "item could not be identified."
+msgstr ""
-#, fuzzy
msgid "only one description allowed."
-msgstr "Enter description :"
+msgstr ""
msgid "only one location allowed."
msgstr ""
@@ -756,6 +710,9 @@ msgstr ""
msgid "The ical file seems to be malformed. The end of item was not found."
msgstr ""
+msgid "could not retrieve item summary."
+msgstr ""
+
msgid "item priority is invalid (must be between 0 and 9)."
msgstr ""
@@ -768,13 +725,12 @@ msgstr ""
msgid "The file cannot be accessed, please enter another file name."
msgstr ""
-#, fuzzy
msgid "Press [ENTER] to continue."
-msgstr "Press [ENTER] to continue"
+msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "Failed to open \"%s\", - %s\n"
-msgstr "Failed to open todo file"
+msgstr ""
msgid "Failed to build message\n"
msgstr ""
@@ -791,9 +747,8 @@ msgstr ""
msgid "%s does not exist"
msgstr ""
-#, fuzzy
msgid "Data files have changed and will be overwritten:"
-msgstr "Data files found. Data will be loaded now."
+msgstr ""
msgid "(c)ontinue"
msgstr ""
@@ -807,37 +762,29 @@ msgstr ""
msgid "[cma]"
msgstr ""
-#, fuzzy
msgid "failed to open appointment file"
-msgstr "Failed to open config file"
+msgstr ""
-#, fuzzy
msgid "syntax error in the item date"
-msgstr "FATAL ERROR in load_app: syntax error in the item date\n"
+msgstr ""
-#, fuzzy
msgid "no event nor appointment found"
-msgstr "FATAL ERROR in load_app: no event nor appointment found\n"
+msgstr ""
-#, fuzzy
msgid "syntax error in item time or duration"
-msgstr "FATAL ERROR in load_app: syntax error in the item date\n"
+msgstr ""
-#, fuzzy
msgid "syntax error in item identifier"
-msgstr "FATAL ERROR in load_app: syntax error in the item date\n"
+msgstr ""
-#, fuzzy
msgid "wrong format in the appointment or event"
-msgstr "FATAL ERROR in load_app: wrong format in the appointment or event\n"
+msgstr ""
-#, fuzzy
msgid "syntax error in item repetition"
-msgstr "FATAL ERROR in load_app: syntax error in the item date\n"
+msgstr ""
-#, fuzzy
msgid "syntax error in until date"
-msgstr "FATAL ERROR in load_app: syntax error in the item date\n"
+msgstr ""
msgid "until date error"
msgstr ""
@@ -848,58 +795,60 @@ msgstr ""
msgid "missing end of recurrence"
msgstr ""
-#, fuzzy
msgid "syntax error in item state"
-msgstr "FATAL ERROR in load_app: syntax error in the item date\n"
+msgstr ""
-#, fuzzy
msgid "failed to open todo file"
-msgstr "Failed to open todo file"
+msgstr ""
msgid "Screen data have changed and will be lost:"
msgstr ""
-#, fuzzy
msgid "failed to open key file"
-msgstr "Failed to open todo file"
-
-msgid ""
-"\n"
-"Too many errors while reading configuration file!\n"
-"Please backup your keys file, remove it from directory, and launch calcurse "
-"again.\n"
msgstr ""
msgid "Could not read key label"
msgstr ""
-msgid "Key label not recognized"
+#, c-format
+msgid "Key label not recognized: \"%s\""
+msgstr ""
+
+#, c-format
+msgid "No keys assigned to \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "Keyname not recognized: \"%s\""
msgstr ""
#, c-format
-msgid "Error reading key: \"%s\""
+msgid "\"%s\" assigned twice: \"%s\"."
msgstr ""
#, c-format
-msgid "\"%s\" assigned multiple times!"
+msgid ""
+"Action \"%s\" absent, but default key \"%s\" assigned to another action."
msgstr ""
-msgid "There were some errors when loading keys file."
+msgid "Errors in the keys file."
msgstr ""
-msgid "Too many errors while reading keys file, aborting..."
+msgid "Remove offending line(s) from the keys file, aborting..."
msgstr ""
-#, fuzzy, c-format
+msgid "Some actions do not have any associated key bindings!"
+msgstr ""
+
+#, c-format
msgid "FATAL ERROR: could not create %s: %s\n"
-msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
+msgstr ""
-#, fuzzy
msgid "The data were successfully exported"
-msgstr "The data files were successfully saved"
+msgstr ""
msgid "Press [ENTER] to continue"
-msgstr "Press [ENTER] to continue"
+msgstr ""
msgid "unknown export type"
msgstr ""
@@ -920,9 +869,8 @@ msgstr ""
msgid "FATAL ERROR: the input file cannot be accessed, Aborting..."
msgstr ""
-#, fuzzy
msgid "FATAL ERROR: wrong import mode"
-msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
+msgstr ""
#, c-format
msgid "%d app"
@@ -996,13 +944,13 @@ msgid "Credits"
msgstr ""
msgid "Help"
-msgstr "Help"
+msgstr ""
msgid "Quit"
-msgstr "Quit"
+msgstr ""
msgid "Save"
-msgstr "Save"
+msgstr ""
msgid "Reload"
msgstr ""
@@ -1013,9 +961,11 @@ msgstr ""
msgid "Paste"
msgstr ""
-#, fuzzy
msgid "Chg Win"
-msgstr "Chg View"
+msgstr ""
+
+msgid "Prev Win"
+msgstr ""
msgid "Import"
msgstr ""
@@ -1023,41 +973,35 @@ msgstr ""
msgid "Export"
msgstr ""
-#, fuzzy
msgid "Go to"
-msgstr "Goto:\n"
+msgstr ""
msgid "OtherCmd"
msgstr ""
msgid "Config"
-msgstr "Config"
+msgstr ""
msgid "Redraw"
-msgstr "Redraw"
+msgstr ""
-#, fuzzy
msgid "Add Appt"
-msgstr "Add Item"
+msgstr ""
msgid "Add Todo"
msgstr ""
-#, fuzzy
msgid "-1 Day"
-msgstr "-/+1 Day"
+msgstr ""
-#, fuzzy
msgid "+1 Day"
-msgstr "-/+1 Day"
+msgstr ""
-#, fuzzy
msgid "-1 Week"
-msgstr "-/+1 Week"
+msgstr ""
-#, fuzzy
msgid "+1 Week"
-msgstr "-/+1 Week"
+msgstr ""
msgid "-1 Month"
msgstr ""
@@ -1071,13 +1015,11 @@ msgstr ""
msgid "+1 Year"
msgstr ""
-#, fuzzy
msgid "Nxt View"
-msgstr "View"
+msgstr ""
-#, fuzzy
msgid "Prv View"
-msgstr "View"
+msgstr ""
msgid "Today"
msgstr ""
@@ -1091,51 +1033,44 @@ msgstr ""
msgid "Left"
msgstr ""
-#, fuzzy
msgid "Down"
-msgstr "Up/Down"
+msgstr ""
msgid "Up"
msgstr ""
-#, fuzzy
msgid "beg Week"
-msgstr "-/+1 Week"
+msgstr ""
-#, fuzzy
msgid "end Week"
-msgstr "-/+1 Week"
+msgstr ""
msgid "Add Item"
-msgstr "Add Item"
+msgstr ""
msgid "Del Item"
-msgstr "Del Item"
+msgstr ""
-#, fuzzy
msgid "Edit Itm"
-msgstr "Add Item"
+msgstr ""
msgid "View"
-msgstr "View"
+msgstr ""
msgid "Pipe"
msgstr ""
-#, fuzzy
msgid "Flag Itm"
-msgstr "Del Item"
+msgstr ""
msgid "Repeat"
msgstr ""
-#, fuzzy
msgid "EditNote"
-msgstr "Add Item"
+msgstr ""
-#, fuzzy
msgid "ViewNote"
-msgstr "View"
+msgstr ""
msgid "Prio.+"
msgstr ""
@@ -1153,25 +1088,23 @@ msgid ""
"# interface. It should not be edited directly.\n"
msgstr ""
-#, fuzzy
msgid "FATAL ERROR: could not create default keys file."
-msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
+msgstr ""
-#, fuzzy
msgid "FATAL ERROR: key value out of bounds"
-msgstr "FATAL ERROR in update_windows: no window selected\n"
+msgstr ""
msgid "General"
-msgstr "General"
+msgstr ""
msgid "Layout"
-msgstr "Layout"
+msgstr ""
msgid "Sidebar"
msgstr ""
msgid "Color"
-msgstr "Colour"
+msgstr ""
msgid "Notify"
msgstr ""
@@ -1179,9 +1112,8 @@ msgstr ""
msgid "Keys"
msgstr ""
-#, fuzzy
msgid "Unknown"
-msgstr "Colour"
+msgstr ""
msgid "Cancel the ongoing action."
msgstr ""
@@ -1213,6 +1145,9 @@ msgstr ""
msgid "Select next panel in calcurse main screen."
msgstr ""
+msgid "Select previous panel in calcurse main screen."
+msgstr ""
+
msgid "Import data from an external file."
msgstr ""
@@ -1225,9 +1160,8 @@ msgstr ""
msgid "Show next possible actions inside status bar."
msgstr ""
-#, fuzzy
msgid "Enter the configuration menu."
-msgstr "CalCurse %s | general options"
+msgstr ""
msgid "Redraw calcurse's screen."
msgstr ""
@@ -1330,12 +1264,11 @@ msgstr ""
msgid "Lower a task priority inside the todo panel."
msgstr ""
-#, fuzzy
msgid "FATAL ERROR: null file pointer."
-msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
+msgstr ""
#, c-format
-msgid "When adding default key for \"%s\", \"%s\" was already assigned!"
+msgid "Default key(s) assigned to %d action%s."
msgstr ""
msgid "xmalloc: zero size"
@@ -1365,9 +1298,8 @@ msgstr ""
msgid "could not allocate memory to store block info"
msgstr ""
-#, fuzzy
msgid "Block not found"
-msgstr "Appointment :"
+msgstr ""
#, c-format
msgid "overflow at %s"
@@ -1429,16 +1361,8 @@ msgstr ""
msgid "Warning: could not open %s, Aborting..."
msgstr ""
-#, fuzzy
-msgid "error while launching command: could not fork"
-msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-msgid "error while launching command"
-msgstr ""
-
-#, fuzzy
msgid "(if set to YES, notify-bar will be displayed)"
-msgstr "(if set to YES, progress bar will not be displayed when saving data)"
+msgstr ""
msgid "(Format of the date to be displayed inside notify-bar)"
msgstr ""
@@ -1462,9 +1386,6 @@ msgstr ""
msgid "(Log activity when running in background)"
msgstr ""
-msgid "Enter the time format (see 'man 3 strftime' for possible formats) "
-msgstr ""
-
msgid "Enter the number of seconds (0 not to be warned before an appointment)"
msgstr ""
@@ -1505,32 +1426,26 @@ msgstr ""
msgid "event not found"
msgstr ""
-#, fuzzy
msgid "appointment not found"
-msgstr "Appointment :"
+msgstr ""
-#, fuzzy
msgid "syntax error in bymonthday"
-msgstr "FATAL ERROR in load_app: syntax error in the item date\n"
+msgstr ""
-#, fuzzy
msgid "syntax error in bywday"
-msgstr "FATAL ERROR in load_app: syntax error in the item date\n"
+msgstr ""
-#, fuzzy
msgid "syntax error in bymonth"
-msgstr "FATAL ERROR in load_app: syntax error in the item date\n"
+msgstr ""
msgid "illegal bymonth value"
msgstr ""
-#, fuzzy
msgid "syntax error in item date"
-msgstr "FATAL ERROR in load_app: syntax error in the item date\n"
+msgstr ""
-#, fuzzy
msgid "date error in item exception"
-msgstr "FATAL ERROR in event_scan: date error in the event\n"
+msgstr ""
#, c-format
msgid "Error setting signal #%d : %s\n"
@@ -1546,22 +1461,22 @@ msgid "ERROR setting first day of week"
msgstr ""
msgid "The day you entered is not valid"
-msgstr "The day you entered is not valid"
+msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "Enter the day to go to [ENTER for today] : %s"
-msgstr "Enter the day to go to [ENTER for today] : dd/mm/yyyy"
+msgstr ""
#, c-format
msgid "The move failed (%d/%d/%d)."
msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "Enter start date [%s] and/or time ([hh:mm] or [hhmm]):"
-msgstr "Enter end time ([hh:mm] or [h:mm]) or duration (in minutes) : "
+msgstr ""
msgid "Press [Enter] to continue"
-msgstr "Press [Enter] to continue"
+msgstr ""
msgid "Invalid date or time."
msgstr ""
@@ -1583,23 +1498,20 @@ msgstr ""
msgid "Time: hh:mm (hh: or :mm) or hhmm. Duration: +mm, +hh:mm, +??d??h??m."
msgstr ""
-#, fuzzy
msgid "Invalid time or duration."
-msgstr "FATAL ERROR in load_app: syntax error in the item date\n"
+msgstr ""
msgid "Invalid date: end time must come after start time."
msgstr ""
-#, fuzzy
msgid "Enter the new item description:"
-msgstr "Enter description :"
+msgstr ""
msgid "Exception days:"
msgstr ""
-#, fuzzy
msgid "Invalid date format - try again:."
-msgstr "FATAL ERROR in load_app: syntax error in the item date\n"
+msgstr ""
msgid "Limit repetition to listed days."
msgstr ""
@@ -1652,20 +1564,17 @@ msgstr ""
msgid "Monthdays 1|..|31 or -1|..|-31, space-separated list, '?' for help:"
msgstr ""
-#, fuzzy
msgid "Invalid format - try again."
-msgstr "FATAL ERROR in load_app: syntax error in the item date\n"
+msgstr ""
-#, fuzzy
msgid "Press any key to continue."
-msgstr "Press any key to continue..."
+msgstr ""
msgid "Base period:"
msgstr ""
-#, fuzzy
msgid "day"
-msgstr "May"
+msgstr ""
msgid "week"
msgstr ""
@@ -1685,9 +1594,8 @@ msgstr ""
msgid "Invalid frequency."
msgstr ""
-#, fuzzy
msgid "Until date, increment or repeat count ('?' for input formats):"
-msgstr "Possible argument formats are : 'mm/dd/yyyy' or 'n'\n"
+msgstr ""
#, c-format
msgid "Date: %s (year, month may be omitted, endless: 0)."
@@ -1710,16 +1618,14 @@ msgstr ""
msgid "Repetition must begin on start day (%s); any change discarded."
msgstr ""
-#, fuzzy
msgid "Description"
-msgstr "Enter description :"
+msgstr ""
msgid "Repetition"
msgstr ""
-#, fuzzy
msgid "Edit: "
-msgstr "Add Item"
+msgstr ""
msgid "Start time"
msgstr ""
@@ -1733,18 +1639,15 @@ msgstr ""
msgid "Pipe item to external command:"
msgstr ""
-#, fuzzy
msgid "Enter start time ([hh:mm] or [hhmm]), leave blank for an all-day event:"
msgstr ""
-"Enter start time ([hh:mm] or [h:mm]), leave blank for an all-day event : "
msgid ""
"Enter end time as date (and/or time) or duration ('?' for input formats):"
msgstr ""
-#, fuzzy
msgid "Enter description:"
-msgstr "Enter description :"
+msgstr ""
#, c-format
msgid "Date: %s (and/or time), year or month may be omitted."
@@ -1788,16 +1691,14 @@ msgstr ""
msgid "A (s)imple or (a)dvanced repetition?"
msgstr ""
-#, fuzzy
msgid "Enter the new TODO item:"
-msgstr "Enter the new ToDo item : "
+msgstr ""
msgid "Enter the TODO priority [0 (none), 1 (highest) - 9 (lowest)]:"
msgstr ""
-#, fuzzy
msgid "Do you really want to delete this task?"
-msgstr "Do you really want to delete this task ?"
+msgstr ""
msgid "This item has a note attached to it. Delete (t)odo or just its (n)ote?"
msgstr ""
@@ -1805,16 +1706,15 @@ msgstr ""
msgid "[tn]"
msgstr ""
-#, fuzzy
msgid "Enter the new TODO description:"
-msgstr "Enter the new ToDo item : "
+msgstr ""
msgid "TODO:"
msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "Could not remove calcurse lock file: %s\n"
-msgstr "Enter description :"
+msgstr ""
msgid "/!\\ INTERNAL ERROR /!\\"
msgstr ""
@@ -1826,7 +1726,7 @@ msgid "[yn]"
msgstr ""
msgid "Press any key to continue..."
-msgstr "Press any key to continue..."
+msgstr ""
msgid "failure in mktime"
msgstr ""
@@ -1835,10 +1735,10 @@ msgid "error in mktime"
msgstr ""
msgid "yes"
-msgstr "yes"
+msgstr ""
msgid "no"
-msgstr "no"
+msgstr ""
msgid "option not defined"
msgstr ""
@@ -1872,30 +1772,23 @@ msgstr ""
msgid "Usage: calcurse-upgrade [-h|-v|--config <file>]"
msgstr ""
-#, fuzzy
msgid ""
"\n"
-"Copyright (c) 2004-2020 calcurse Development Team.\n"
+"Copyright (c) 2004-2023 calcurse Development Team.\n"
"This is free software; see the source for copying conditions.\n"
msgstr ""
-"\n"
-"Copyright (c) 2004-2006 Frederic Culot.\n"
-"This is free software; see the source for copying conditions.\n"
msgid "unrecognized option:"
msgstr ""
-#, fuzzy
msgid "Configuration file not found:"
-msgstr "FATAL ERROR in fill_config_var: wrong configuration variable format.\n"
+msgstr ""
-#, fuzzy
msgid "Pre-3.0.0 configuration file format detected..."
-msgstr "FATAL ERROR in fill_config_var: wrong configuration variable format.\n"
+msgstr ""
-#, fuzzy
msgid "Create temporary backup of the configuration file..."
-msgstr "Failed to open config file"
+msgstr ""
msgid "Old backup file found:"
msgstr ""
@@ -1924,1023 +1817,3 @@ msgstr ""
msgid "Remove temporary backup..."
msgstr ""
-
-#, fuzzy
-#~ msgid ""
-#~ "(if set to YES, messages about loaded and saved data will be displayed)"
-#~ msgstr ""
-#~ "(if set to YES, messages about loaded and saved data will not be "
-#~ "displayed)"
-
-#, fuzzy
-#~ msgid "empty description."
-#~ msgstr "Enter description :"
-
-#~ msgid "Welcome to Calcurse. Missing data files were created."
-#~ msgstr "Welcome to Calcurse. Missing data files were created."
-
-#~ msgid "Data files found. Data will be loaded now."
-#~ msgstr "Data files found. Data will be loaded now."
-
-#, fuzzy
-#~ msgid "Enter the new repetition type:"
-#~ msgstr "Enter description :"
-
-#, fuzzy
-#~ msgid "Enter the repetition frequency:"
-#~ msgstr "Enter description :"
-
-#, fuzzy
-#~ msgid "Do you really want to delete this item?"
-#~ msgstr "Do you really want to delete this item ?"
-
-#, fuzzy
-#~ msgid "Enter the repetition type:"
-#~ msgstr "Enter description :"
-
-#, fuzzy
-#~ msgid "could not get entire item description."
-#~ msgstr "Enter description :"
-
-#, fuzzy
-#~ msgid "configuration variable unknown: \"%s\""
-#~ msgstr ""
-#~ "FATAL ERROR in fill_config_var: wrong configuration variable format.\n"
-
-#, fuzzy
-#~ msgid "wrong configuration variable format for \"%s\""
-#~ msgstr ""
-#~ "FATAL ERROR in fill_config_var: wrong configuration variable format.\n"
-
-#, fuzzy
-#~ msgid "(if set to YES, progress bar will be displayed when saving data)"
-#~ msgstr ""
-#~ "(if set to YES, progress bar will not be displayed when saving data)"
-
-#~ msgid "Saving..."
-#~ msgstr "Saving..."
-
-#~ msgid "Loading..."
-#~ msgstr "Loading..."
-
-#, fuzzy
-#~ msgid "Exporting..."
-#~ msgstr "aborting...\n"
-
-#~ msgid "Problems accessing data file ..."
-#~ msgstr "Problems accessing data file ..."
-
-#~ msgid "The data files were successfully saved"
-#~ msgstr "The data files were successfully saved"
-
-#, fuzzy
-#~ msgid "You entered an invalid time, should be [hh:mm] or [hhmm]"
-#~ msgstr "You entered an invalid start time, should be [h:mm] or [hh:mm]"
-
-#, fuzzy
-#~ msgid ""
-#~ "Enter end time ([hh:mm], [hhmm]) or duration ([+hh:mm], [+xxxdxxhxxm]):"
-#~ msgstr "Enter end time ([hh:mm] or [h:mm]) or duration (in minutes) : "
-
-#, fuzzy
-#~ msgid "The entered date is not valid."
-#~ msgstr "The day you entered is not valid"
-
-#, fuzzy
-#~ msgid "Possible formats are [%s] or '0' for an endless repetition."
-#~ msgstr "Possible argument formats are : 'mm/dd/yyyy' or 'n'\n"
-
-#, fuzzy
-#~ msgid "Enter the new repetition frequency:"
-#~ msgstr "Enter description :"
-
-#, fuzzy
-#~ msgid "Enter end date ([%s]), duration ([+xxwxxd]) or '0':"
-#~ msgstr "Enter end time ([hh:mm] or [h:mm]) or duration (in minutes) : "
-
-#, fuzzy
-#~ msgid "You entered an invalid start time, should be [hh:mm] or [hhmm]"
-#~ msgstr "You entered an invalid start time, should be [h:mm] or [hh:mm]"
-
-#, fuzzy
-#~ msgid ""
-#~ "Invalid end time/duration, should be [hh:mm], [hhmm], [+hh:mm], "
-#~ "[+xxxdxxhxxm] or [+mm]"
-#~ msgstr ""
-#~ "You entered an invalid end time, should be [h:mm] or [hh:mm] or [mm]"
-
-#, fuzzy
-#~ msgid "Possible formats are [%s], [+xxwxxd] or '0'."
-#~ msgstr "Possible argument formats are : 'mm/dd/yyyy' or 'n'\n"
-
-#, fuzzy
-#~ msgid "Enter an option number to change its value"
-#~ msgstr "Enter an option number to change its value [Q to quit] "
-
-#, fuzzy
-#~ msgid "The frequence you entered is not valid."
-#~ msgstr "The day you entered is not valid"
-
-#~ msgid "January"
-#~ msgstr "January"
-
-#~ msgid "February"
-#~ msgstr "February"
-
-#~ msgid "March"
-#~ msgstr "March"
-
-#~ msgid "April"
-#~ msgstr "April"
-
-#~ msgid "June"
-#~ msgstr "June"
-
-#~ msgid "July"
-#~ msgstr "July"
-
-#~ msgid "August"
-#~ msgstr "August"
-
-#~ msgid "September"
-#~ msgstr "September"
-
-#~ msgid "October"
-#~ msgstr "October"
-
-#~ msgid "November"
-#~ msgstr "November"
-
-#~ msgid "December"
-#~ msgstr "December"
-
-#~ msgid "Sun"
-#~ msgstr "Sun"
-
-#~ msgid "Mon"
-#~ msgstr "Mon"
-
-#~ msgid "Tue"
-#~ msgstr "Tue"
-
-#~ msgid "Wed"
-#~ msgstr "Wed"
-
-#~ msgid "Thu"
-#~ msgstr "Thu"
-
-#~ msgid "Fri"
-#~ msgstr "Fri"
-
-#~ msgid "Sat"
-#~ msgstr "Sat"
-
-#, fuzzy
-#~ msgid ""
-#~ "Usage: calcurse [-g|-h|-v] [-an] [-t[num]] [-i<file>] [-x[format]]\n"
-#~ " [-d <date>|<num>] [-s[date]] [-r[range]]\n"
-#~ " [-c<file>] [-D<dir>] [-S<regex>] [--status]\n"
-#~ " [--read-only]\n"
-#~ msgstr "Usage: calcurse [-h | -v] [-at] [-d date|num] [-c file]\n"
-
-#, fuzzy
-#~ msgid ""
-#~ "\n"
-#~ "Miscellaneous:\n"
-#~ " -h, --help\n"
-#~ "\tprint this help and exit.\n"
-#~ "\n"
-#~ " -v, --version\n"
-#~ "\tprint calcurse version and exit.\n"
-#~ "\n"
-#~ " --status\n"
-#~ "\tdisplay the status of running instances of calcurse.\n"
-#~ "\n"
-#~ " --read-only\n"
-#~ "\tDon't save configuration nor appointments/todos. Use with care.\n"
-#~ "\n"
-#~ "Files:\n"
-#~ " -c <file>, --calendar <file>\n"
-#~ "\tspecify the calendar <file> to use (has precedence over '-D').\n"
-#~ "\n"
-#~ " -D <dir>, --directory <dir>\n"
-#~ "\tspecify the data directory to use.\n"
-#~ "\tIf not specified, the default directory is ~/.calcurse\n"
-#~ "\n"
-#~ "Non-interactive:\n"
-#~ " -a, --appointment\n"
-#~ " \tprint events and appointments for current day and exit.\n"
-#~ "\n"
-#~ " -d <date|num>, --day <date|num>\n"
-#~ "\tprint events and appointments for <date> or <num> upcoming days and\n"
-#~ "\texit. To specify both a starting date and a range, use the\n"
-#~ "\t'--startday' and the '--range' option.\n"
-#~ "\n"
-#~ " -g, --gc\n"
-#~ "\trun the garbage collector for note files and exit. \n"
-#~ "\n"
-#~ " -i <file>, --import <file>\n"
-#~ "\timport the icalendar data contained in <file>. \n"
-#~ "\n"
-#~ " -n, --next\n"
-#~ "\tprint next appointment within upcoming 24 hours and exit. Also given\n"
-#~ "\tis the remaining time before this next appointment.\n"
-#~ "\n"
-#~ " -l <num>, --limit <num>\n"
-#~ "\tonly print information regarding the next <num> items. \n"
-#~ "\n"
-#~ " -r[num], --range[=num]\n"
-#~ "\tprint events and appointments for the [num] number of days\n"
-#~ "\tand exit. If no [num] is given, a range of 1 day is considered.\n"
-#~ "\n"
-#~ " -s[date], --startday[=date]\n"
-#~ "\tprint events and appointments from [date] and exit.\n"
-#~ "\tIf no [date] is given, the current day is considered.\n"
-#~ "\n"
-#~ " -S<regex>, --search=<regex>\n"
-#~ "\tsearch for the given regular expression within events, appointments,\n"
-#~ "\tand todos description.\n"
-#~ "\n"
-#~ " -t[num], --todo[=num]\n"
-#~ "\tprint todo list and exit. If the optional number [num] is given,\n"
-#~ "\tthen only todos having a priority equal to [num] will be returned.\n"
-#~ "\tThe priority number must be between 1 (highest) and 9 (lowest).\n"
-#~ "\tIt is also possible to specify '0' for the priority, in which case\n"
-#~ "\tonly completed tasks will be shown.\n"
-#~ "\n"
-#~ " -x[format], --export[=format]\n"
-#~ "\texport user data to the specified format. Events, appointments and\n"
-#~ "\ttodos are converted and echoed to stdout.\n"
-#~ "\tTwo possible formats are available: 'ical' and 'pcal'.\n"
-#~ "\tIf the optional argument format is not given, ical format is\n"
-#~ "\tselected by default.\n"
-#~ "\tnote: redirect standard output to export data to a file,\n"
-#~ "\tby issuing a command such as: calcurse --export > calcurse.dat\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Miscellaneous:\n"
-#~ " -h\t\tprint this help and exit.\n"
-#~ " -v\t\tprint calcurse version and exit.\n"
-#~ "\n"
-#~ "Options:\n"
-#~ " -c <file>\tspecify the calendar <file> to use.\n"
-#~ "\n"
-#~ "Non-interactive:\n"
-#~ " -a \t\tprint events and appointments for current day and exit.\n"
-#~ " -d <date|num>\tprint events and appointments for <date> or <num> "
-#~ "upcoming\n"
-#~ "\t\tdays and exit.\n"
-#~ " -t\t\tprint todo list and exit.\n"
-#~ "\n"
-#~ "For more information, type '?' from within Calcurse, or read the "
-#~ "manpage.\n"
-#~ "Mail bug reports and suggestions to <misc@calcurse.org>.\n"
-
-#, fuzzy
-#~ msgid "Enter the new ending date: [%s] or '0'"
-#~ msgstr "Possible argument formats are : 'mm/dd/yyyy' or 'n'\n"
-
-#, fuzzy
-#~ msgid "Possible formats are [%s] or '0' for an endless repetition"
-#~ msgstr "Possible argument formats are : 'mm/dd/yyyy' or 'n'\n"
-
-#~ msgid "Argument to the '-d' flag is not valid\n"
-#~ msgstr "Argument to the '-d' flag is not valid\n"
-
-#, fuzzy
-#~ msgid "Argument is not valid\n"
-#~ msgstr "Argument to the '-d' flag is not valid\n"
-
-#, fuzzy
-#~ msgid "%s does not exist, create it now [y/n]? "
-#~ msgstr "%s does not exist, create it now [y or n] ? "
-
-#~ msgid "aborting...\n"
-#~ msgstr "aborting...\n"
-
-#~ msgid "%s successfully created\n"
-#~ msgstr "%s successfully created\n"
-
-#~ msgid "Exit"
-#~ msgstr "Exit"
-
-#, fuzzy
-#~ msgid "No color"
-#~ msgstr "Colour"
-
-#, fuzzy
-#~ msgid "Add key"
-#~ msgstr "Add Item"
-
-#, fuzzy
-#~ msgid "Del key"
-#~ msgstr "Del Item"
-
-#, fuzzy
-#~ msgid "unknwon type"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#~ msgid "To do :"
-#~ msgstr "To do :"
-
-#, fuzzy
-#~ msgid "Calcurse help"
-#~ msgstr "CalCurse %s | help"
-
-#~ msgid " Welcome to Calcurse. This is the main help screen.\n"
-#~ msgstr " Welcome to Calcurse. This is the main help screen.\n"
-
-#, fuzzy
-#~ msgid ""
-#~ "Moving around: Press '%s' or '%s' to scroll text upward or downward\n"
-#~ " inside help screens, if necessary.\n"
-#~ "\n"
-#~ " Exit help: When finished, press '%s' to exit help and go back to\n"
-#~ " the main Calcurse screen.\n"
-#~ "\n"
-#~ " Help topic: At the bottom of this screen you can see a panel with\n"
-#~ " different fields, represented by a letter and a short\n"
-#~ " title. This panel contains all the available actions\n"
-#~ " you can perform when using Calcurse.\n"
-#~ " By pressing one of the letters appearing in this\n"
-#~ " panel, you will be shown a short description of the\n"
-#~ " corresponding action. At the top right side of the\n"
-#~ " description screen are indicated the user-defined key\n"
-#~ " bindings that lead to the action.\n"
-#~ "\n"
-#~ " Credits: Press '%s' for credits."
-#~ msgstr ""
-#~ " Moving around: Press CTRL-P or CTRL-N to scroll text upward or\n"
-#~ " downward inside help screens, if necessary.\n"
-#~ "\n"
-#~ " Exit help: When finished, press 'Q' to exit help and go back\n"
-#~ " to the main Calcurse screen.\n"
-#~ "\n"
-#~ " Help topic: At the bottom of this screen you can see a panel\n"
-#~ " with different fields, represented by a letter and\n"
-#~ " a short title. This panel contains all the available\n"
-#~ " actions you can perform when using Calcurse.\n"
-#~ " By pressing one of the letters appearing in this\n"
-#~ " panel, you will be shown a short description of the\n"
-#~ " corresponding action.\n"
-#~ "\n"
-#~ " Credits: Press '@' for credits."
-
-#, fuzzy
-#~ msgid "Save\n"
-#~ msgstr "Save:\n"
-
-#, fuzzy
-#~ msgid ""
-#~ "Save calcurse data.\n"
-#~ "Data are splitted into four different files which contain :\n"
-#~ "\n"
-#~ " / ~/.calcurse/conf -> user configuration\n"
-#~ " | (layout, color, general options)\n"
-#~ " | ~/.calcurse/apts -> data related to the appointments\n"
-#~ " | ~/.calcurse/todo -> data related to the todo list\n"
-#~ " \\ ~/.calcurse/keys -> user-defined key bindings\n"
-#~ "\n"
-#~ "In the config menu, you can choose to save the Calcurse data\n"
-#~ "automatically before quitting."
-#~ msgstr ""
-#~ "Pressing 'S' saves the Calcurse data.\n"
-#~ "\n"
-#~ "The data is splitted into three different files which contains :\n"
-#~ "\n"
-#~ " / ~/.calcurse/conf -> the user configuration\n"
-#~ " | (layout, colour, general options)\n"
-#~ " | ~/.calcurse/apts -> the data related to the appointments\n"
-#~ " \\ ~/.calcurse/todo -> the data related to the todo list\n"
-#~ "\n"
-#~ "In the config menu, you can choose to save the Calcurse data\n"
-#~ "automatically before quitting."
-
-#, fuzzy
-#~ msgid "Export\n"
-#~ msgstr "aborting...\n"
-
-#, fuzzy
-#~ msgid "Displacement keys\n"
-#~ msgstr "Displacement keys:\n"
-
-#, fuzzy
-#~ msgid "View\n"
-#~ msgstr "View:\n"
-
-#, fuzzy
-#~ msgid ""
-#~ "View the item you select in either the Todo or Appointment panel.\n"
-#~ "\n"
-#~ "This is usefull when an event description is longer than the available\n"
-#~ "space to display it. If that is the case, the description will be\n"
-#~ "shortened and its end replaced by '...'. To be able to read the entire\n"
-#~ "description, just press '%s' and a popup window will appear, containing\n"
-#~ "the whole event.\n"
-#~ "\n"
-#~ "Press any key to close the popup window and go back to the main\n"
-#~ "Calcurse screen."
-#~ msgstr ""
-#~ "Pressing 'V' allows you to view the item you select in either the ToDo\n"
-#~ "or Appointment panel.\n"
-#~ "\n"
-#~ "This is usefull when an event description is longer than the available\n"
-#~ "space to display it. If that is the case, the description will be\n"
-#~ "shortened and its end replaced by '...'. To be able to read the entire\n"
-#~ "description, just press 'V' and a popup window will appear, containing\n"
-#~ "the whole event.\n"
-#~ "\n"
-#~ "Press any key to close the popup window and go back to the main\n"
-#~ "Calcurse screen."
-
-#, fuzzy
-#~ msgid "Tab\n"
-#~ msgstr "Tab:\n"
-
-#, fuzzy
-#~ msgid ""
-#~ "Switch between panels.\n"
-#~ "The panel currently in use has its border colorized.\n"
-#~ "\n"
-#~ "Some actions are possible only if the right panel is selected.\n"
-#~ "For example, if you want to add a task in the TODO list, you need first\n"
-#~ "to press the '%s' key to get the TODO panel selected. Then you can\n"
-#~ "press '%s' to add your item.\n"
-#~ "\n"
-#~ "Notice that at the bottom of the screen the list of possible actions\n"
-#~ "change while pressing '%s', so you always know what action can be\n"
-#~ "performed on the selected panel."
-#~ msgstr ""
-#~ "Pressing 'Tab' allows you to switch between panels.\n"
-#~ "The panel currently in use has its border in colour.\n"
-#~ "\n"
-#~ "Some actions are possible only if the right panel is selected.\n"
-#~ "For example, if you want to add a task in the TODO list, you need first\n"
-#~ "to press the 'Tab' key to get the TODO panel selected. Then you can\n"
-#~ "press 'A' to add your item.\n"
-#~ "\n"
-#~ "Notice that at the bottom of the screen the list of possible actions\n"
-#~ "change while pressing 'Tab', so you always know what action can be\n"
-#~ "performed on the selected panel."
-
-#, fuzzy
-#~ msgid "Goto\n"
-#~ msgstr "Goto:\n"
-
-#, fuzzy
-#~ msgid ""
-#~ "Jump to a specific day in the calendar.\n"
-#~ "\n"
-#~ "Using this command, you do not need to travel to that day using\n"
-#~ "the displacement keys inside the calendar panel.\n"
-#~ "If you hit [ENTER] without specifying any date, Calcurse checks the\n"
-#~ "system current date and you will be taken to that date.\n"
-#~ "\n"
-#~ "Notice that pressing '%s', whatever panel is\n"
-#~ "selected, will select current day in the calendar."
-#~ msgstr ""
-#~ "Pressing 'G' allows you to jump to a specific day in the calendar.\n"
-#~ "\n"
-#~ "Using this command, you do not need to travel to that day using\n"
-#~ "the displacement keys inside the calendar panel.\n"
-#~ "If you hit [ENTER] without specifying any date, Calcurse checks the\n"
-#~ "system current date and you will be taken to that date."
-
-#, fuzzy
-#~ msgid "Delete\n"
-#~ msgstr "Delete:\n"
-
-#, fuzzy
-#~ msgid ""
-#~ "Delete an element in the ToDo or Appointment list.\n"
-#~ "\n"
-#~ "Depending on which panel is selected when you press the delete key,\n"
-#~ "the hilighted item of either the ToDo or Appointment list will be \n"
-#~ "removed from this list.\n"
-#~ "\n"
-#~ "If the item to be deleted is recurrent, you will be asked if you\n"
-#~ "wish to suppress all of the item occurences or just the one you\n"
-#~ "selected.\n"
-#~ "\n"
-#~ "If the general option 'confirm_delete' is set to 'YES', then you will\n"
-#~ "be asked for confirmation before deleting the selected event.\n"
-#~ "Do not forget to save the calendar data to retrieve the modifications\n"
-#~ "next time you launch Calcurse."
-#~ msgstr ""
-#~ "Pressing 'D' deletes an element in the ToDo or Appointment list.\n"
-#~ "\n"
-#~ "Depending on which panel is selected when you press the delete key,\n"
-#~ "the highlighted item of either the ToDo or Appointment list will be \n"
-#~ "removed from this list.\n"
-#~ "\n"
-#~ "If the general option 'confirm_delete' is set to 'YES', then you will\n"
-#~ "be asked for confirmation before deleting the selected event.\n"
-#~ "Do not forget to save the calendar data to retrieve the modifications\n"
-#~ "next time you launch Calcurse."
-
-#, fuzzy
-#~ msgid "Add\n"
-#~ msgstr "Add:\n"
-
-#, fuzzy
-#~ msgid ""
-#~ "Add an item in either the ToDo or Appointment list, depending on which\n"
-#~ "panel is selected when you press '%s'.\n"
-#~ "\n"
-#~ "To enter a new item in the TODO list, you will need first to enter the\n"
-#~ "description of this new item. Then you will be asked to specify the todo\n"
-#~ "priority. This priority is represented by a number going from 9 for the\n"
-#~ "lowest priority, to 1 for the highest one. It is still possible to\n"
-#~ "change the item priority afterwards, by using the '%s' and '%s' keys\n"
-#~ "inside the todo panel.\n"
-#~ "\n"
-#~ "If the APPOINTMENT panel is selected while pressing '%s', you will be\n"
-#~ "able to enter either a new appointment or a new all-day long event.\n"
-#~ "To enter a new event, press [ENTER] instead of the item start time, and\n"
-#~ "just fill in the event description.\n"
-#~ "To enter a new appointment to be added in the APPOINTMENT list, you\n"
-#~ "will need to enter successively the time at which the appointment\n"
-#~ "begins, the appointment length (either by specifying the end time in\n"
-#~ "[hh:mm] or the duration in [+hh:mm], [+xxdxxhxxm] or [+mm] format), \n"
-#~ "and the description of the event.\n"
-#~ "\n"
-#~ "The day at which occurs the event or appointment is the day currently\n"
-#~ "selected in the calendar, so you need to move to the desired day before\n"
-#~ "pressing '%s'.\n"
-#~ "\n"
-#~ "Notes:\n"
-#~ " o if an appointment lasts for such a long time that it continues\n"
-#~ " on the next days, this event will be indicated on all the\n"
-#~ " corresponding days, and the beginning or ending hour will be\n"
-#~ " replaced by '..' if the event does not begin or end on the day.\n"
-#~ " o if you only press [ENTER] at the APPOINTMENT or TODO event\n"
-#~ " description prompt, without any description, no item will be\n"
-#~ " added.\n"
-#~ " o do not forget to save the calendar data to retrieve the new\n"
-#~ " event next time you launch Calcurse."
-#~ msgstr ""
-#~ "Pressing 'A' allows you to add an item in either the ToDo or Appointment\n"
-#~ "list, depending on which panel is selected when you press 'A'.\n"
-#~ "\n"
-#~ "To enter a new item in the TODO list, you only need to enter the\n"
-#~ "description of this new item.\n"
-#~ "\n"
-#~ "If the APPOINTMENT panel is selected while pressing 'A', you will be\n"
-#~ "able to enter either a new appointment or a new all-day long event.\n"
-#~ "To enter a new event, press [ENTER] instead of the item start time, and\n"
-#~ "just fill in the event description.\n"
-#~ "To enter a new appointment to be added in the APPOINTMENT list, you\n"
-#~ "will need to enter successively the time at which the appointment\n"
-#~ "begins, the appointment length (either by specifying the duration in\n"
-#~ "minutes, or the end time in [hh:mm] or [h:mm] format), and the\n"
-#~ "description of the event.\n"
-#~ "\n"
-#~ "The day at which occurs the event or appointment is the day currently\n"
-#~ "selected in the calendar, so you need to move to the desired day before\n"
-#~ "pressing 'A'.\n"
-#~ "\n"
-#~ "Notes:\n"
-#~ " o if an appointment lasts for such a long time that it continues\n"
-#~ " into the next days, this event will be indicated on all the\n"
-#~ " corresponding days, and the beginning or ending hour will be\n"
-#~ " replaced by '..' if the event does not begin or end on the day.\n"
-#~ " o if you only press [ENTER] at the APPOINTMENT or TODO event\n"
-#~ " description prompt, without any description, no item will be\n"
-#~ " added.\n"
-#~ " o do not forget to save the calendar data to retrieve the new\n"
-#~ " event next time you launch Calcurse."
-
-#, fuzzy
-#~ msgid "Edit Item\n"
-#~ msgstr "Add Item"
-
-#, fuzzy
-#~ msgid "EditNote\n"
-#~ msgstr "Add Item"
-
-#, fuzzy
-#~ msgid "ViewNote\n"
-#~ msgstr "View:\n"
-
-#, fuzzy
-#~ msgid "Repeat\n"
-#~ msgstr "Redraw:\n"
-
-#, fuzzy
-#~ msgid "Flag Item\n"
-#~ msgstr "Add Item"
-
-#, fuzzy
-#~ msgid "Config\n"
-#~ msgstr "Config:\n"
-
-#, fuzzy
-#~ msgid ""
-#~ "Open the configuration submenu.\n"
-#~ "From this submenu, you can select between color, layout, notification\n"
-#~ "and general options, and you can also configure your keybindings.\n"
-#~ "\n"
-#~ "The color submenu lets you choose the color theme.\n"
-#~ "The layout submenu lets you choose the Calcurse screen layout, in other\n"
-#~ "words where to place the three different panels on the screen.\n"
-#~ "The general options submenu brings a screen with the different options\n"
-#~ "which modifies the way Calcurse interacts with the user.\n"
-#~ "The notify submenu allows you to change the notify-bar settings.\n"
-#~ "The keys submenu lets you define your own key bindings.\n"
-#~ "\n"
-#~ "Do not forget to save the calendar data to retrieve your configuration\n"
-#~ "next time you launch Calcurse."
-#~ msgstr ""
-#~ "Pressing 'C' leads to the configuration submenu, from which you can\n"
-#~ "select between colour, layout, and general options.\n"
-#~ "\n"
-#~ "The colour submenu lets you choose the colour theme.\n"
-#~ "\n"
-#~ "The layout submenu lets you choose the Calcurse screen layout, in other\n"
-#~ "words where to place the three different panels on the screen.\n"
-#~ "\n"
-#~ "The general options submenu brings a screen with the different options\n"
-#~ "which modifies the way Calcurse interacts with the user.\n"
-#~ "\n"
-#~ "Do not forget to save the calendar data to retrieve your configuration\n"
-#~ "next time you launch Calcurse."
-
-#~ msgid "Calcurse - text-based organizer"
-#~ msgstr "Calcurse - text-based organizer"
-
-#, fuzzy
-#~ msgid ""
-#~ "Enter end time ([hh:mm] or [hhmm]) or duration ([+hh:mm], [+xxxdxxhxxm] "
-#~ "or [+mm]) : "
-#~ msgstr "Enter end time ([hh:mm] or [h:mm]) or duration (in minutes) : "
-
-#, fuzzy
-#~ msgid "could not convert string"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#~ msgid "ToDo"
-#~ msgstr "ToDo"
-
-#~ msgid "Appointment"
-#~ msgstr "Appointment"
-
-#, fuzzy
-#~ msgid "missing colors in config file"
-#~ msgstr "Failed to open config file"
-
-#~ msgid "auto_save = "
-#~ msgstr "auto_save = "
-
-#, fuzzy
-#~ msgid "periodic_save = "
-#~ msgstr "auto_save = "
-
-#~ msgid "confirm_quit = "
-#~ msgstr "confirm_quit = "
-
-#~ msgid "confirm_delete = "
-#~ msgstr "confirm_delete = "
-
-#~ msgid "skip_system_dialogs = "
-#~ msgstr "skip_system_dialogues = "
-
-#~ msgid "skip_progress_bar = "
-#~ msgstr "skip_progress_bar = "
-
-#~ msgid "week_begins_on_monday = "
-#~ msgstr "week_begins_on_monday = "
-
-#~ msgid ""
-#~ "(if set to YES, monday is the first day of the week, else it is sunday)"
-#~ msgstr ""
-#~ "(if set to YES, monday is the first day of the week, otherwise it is "
-#~ "sunday)"
-
-#, fuzzy
-#~ msgid "Week"
-#~ msgstr "-/+1 Week"
-
-#, fuzzy
-#~ msgid "could not find any key file."
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#, fuzzy
-#~ msgid "could not remove note"
-#~ msgstr "Enter description :"
-
-#~ msgid "Enter an option number to change its value [Q to quit] "
-#~ msgstr "Enter an option number to change its value [Q to quit] "
-
-#, fuzzy
-#~ msgid "CalCurse %s | notify-bar options"
-#~ msgstr "CalCurse %s | general options"
-
-#, fuzzy
-#~ msgid ""
-#~ "\n"
-#~ "Copyright (c) 2004-2008 Frederic Culot\n"
-#~ "\n"
-#~ "This program is free software; you can redistribute it and/or modify\n"
-#~ "it under the terms of the GNU General Public License as published by\n"
-#~ "the Free Software Foundation; either version 2 of the License, or\n"
-#~ "(at your option) any later version.\n"
-#~ "\n"
-#~ "This program is distributed in the hope that it will be useful,\n"
-#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
-#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
-#~ "GNU General Public License for more details.\n"
-#~ "\n"
-#~ "\n"
-#~ "Send your feedback or comments to : misc@calcurse.org\n"
-#~ "Calcurse home page : http://calcurse.org"
-#~ msgstr ""
-#~ "Copyright (c) 2004-2006 Frederic Culot\n"
-#~ "\n"
-#~ "This program is free software; you can redistribute it and/or modify\n"
-#~ "it under the terms of the GNU General Public License as published by\n"
-#~ "the Free Software Foundation; either version 2 of the License, or\n"
-#~ "(at your option) any later version.\n"
-#~ "\n"
-#~ "This program is distributed in the hope that it will be useful,\n"
-#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
-#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
-#~ "GNU General Public License for more details.\n"
-#~ "\n"
-#~ "\n"
-#~ "Send your feedback or comments to : misc@calcurse.org\n"
-#~ "Calcurse home page : http://calcurse.org"
-
-#~ msgid "Pick the desired layout on next screen [press ENTER]"
-#~ msgstr "Pick the desired layout on next screen [press ENTER]"
-
-#, fuzzy
-#~ msgid "('A'= Appointment panel, 'C'= calendar panel, 'T'= todo panel)"
-#~ msgstr "('A'= Appointment panel, 'c'= calendar panel, 't'= todo panel)"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in apoint_delete: no such type\n"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#~ msgid "FATAL ERROR in apoint_scan: date error in the appointment\n"
-#~ msgstr "FATAL ERROR in apoint_scan: date error in the appointment\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in apoint_get: no such item\n"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in apoint_delete_bynum: no such appointment"
-#~ msgstr "FATAL ERROR in apoint_delete_bynum: no such appointment\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in apoint_switch_notify: no such appointment"
-#~ msgstr "FATAL ERROR in apoint_delete_bynum: no such appointment\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in custom_load_color: wrong color number.\n"
-#~ msgstr ""
-#~ "FATAL ERROR in fill_config_var: wrong configuration variable format.\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in custom_load_color: wrong color name.\n"
-#~ msgstr "FATAL ERROR in load_app: wrong format in the appointment or event\n"
-
-#, fuzzy
-#~ msgid ""
-#~ "FATAL ERROR in custom_load_color: wrong configuration variable format.\n"
-#~ msgstr ""
-#~ "FATAL ERROR in fill_config_var: wrong configuration variable format.\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in custom_color_theme_name: unknown color\n"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in day_popup_item: unknown item type\n"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in event_get: no such item\n"
-#~ msgstr "FATAL ERROR in event_delete_bynum: no such event\n"
-
-#~ msgid "FATAL ERROR in event_delete_bynum: no such event\n"
-#~ msgstr "FATAL ERROR in event_delete_bynum: no such event\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in foreach_date_dump: incoherent repetition type\n"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#, fuzzy
-#~ msgid ""
-#~ "FATAL ERROR in pcal_export_recur_events: incoherent repetition type\n"
-#~ msgstr "FATAL ERROR in event_delete_bynum: no such event\n"
-
-#, fuzzy
-#~ msgid ""
-#~ "FATAL ERROR in pcal_export_recur_apoints: incoherent repetition type\n"
-#~ msgstr "FATAL ERROR in apoint_delete_bynum: no such appointment\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in io_export_data: wrong export mode\n"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in io_export_data: unknown export type\n"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in io_import_data: unknown import type"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in launch_cmd: could not launch user command"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in recur_def2char: unknown recur type\n"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in recur_char2def: unknown char\n"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in recur_event_scan: date error in the event\n"
-#~ msgstr "FATAL ERROR in event_scan: date error in the event\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in recur_item_inday: unknown item type\n"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in recur_event_erase: no such event\n"
-#~ msgstr "FATAL ERROR in event_delete_bynum: no such event\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in recur_apoint_erase: no such appointment\n"
-#~ msgstr "FATAL ERROR in apoint_delete_bynum: no such appointment\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in recur_repeat_item: wrong item type\n"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in recur_exc_scan: syntax error in the item date\n"
-#~ msgstr "FATAL ERROR in load_app: syntax error in the item date\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in recur_get_apoint: no such item\n"
-#~ msgstr "FATAL ERROR in apoint_delete_bynum: no such appointment\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in recur_get_event: no such item\n"
-#~ msgstr "FATAL ERROR in event_delete_bynum: no such event\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in recur_apoint_switch_notify: no such item\n"
-#~ msgstr "FATAL ERROR in apoint_delete_bynum: no such appointment\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in todo_delete_note_bynum: no note attached\n"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in todo_delete_note_bynum: no such todo\n"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#~ msgid "FATAL ERROR in todo_delete_bynum: no such todo\n"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in todo_get_position: todo not found\n"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in todo_chg_priority: no such action\n"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#~ msgid "FATAL ERROR in date2sec: failure in mktime\n"
-#~ msgstr "FATAL ERROR in date2sec: failure in mktime\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in date_sec_change: failure in mktime\n"
-#~ msgstr "FATAL ERROR in date2sec: failure in mktime\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in other_status_page: unknown panel\n"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in mystrtol: number is out of range"
-#~ msgstr "FATAL ERROR in update_windows: no window selected\n"
-
-#~ msgid "option not defined - Problem in print_option_incolor()"
-#~ msgstr "option not defined - Problem in print_option_incolor()"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in erase_note: could not remove note\n"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in wins_update: no window selected\n"
-#~ msgstr "FATAL ERROR in update_windows: no window selected\n"
-
-#, fuzzy
-#~ msgid ""
-#~ "You can use either 'H','J','K','L' or the arrow keys '<','v','^','>'\n"
-#~ "to move into the calendar.\n"
-#~ "\n"
-#~ "The following scheme explains how :\n"
-#~ "\n"
-#~ " move to previous week\n"
-#~ " K ^ \n"
-#~ " move to previous day H < > L move to next day\n"
-#~ " J v \n"
-#~ " move to next week\n"
-#~ "\n"
-#~ "Moreover, while inside the calendar panel, the '0' (zero) key moves\n"
-#~ "to the first day of the week, and the '$' key selects the last day of\n"
-#~ "the week.\n"
-#~ "\n"
-#~ "When the Appointment or ToDo panel is selected, the up and down keys\n"
-#~ "(respectively K or up arrow, and J or down arrow) allows you to select\n"
-#~ "an item from those lists."
-#~ msgstr ""
-#~ "You can use either 'H','J','K','L' or the arrow keys '<','v','^','>'\n"
-#~ "to move into the calendar.\n"
-#~ "\n"
-#~ "The following scheme explains how :\n"
-#~ "\n"
-#~ " move to previous week\n"
-#~ " K ^ \n"
-#~ " move to previous day H < > L move to next day\n"
-#~ " J v \n"
-#~ " move to next week\n"
-#~ "\n"
-#~ "When the Appointment or ToDo panel is selected, the up and down keys\n"
-#~ "(respectively K or up arrow, and J or down arrow) allows you to select\n"
-#~ "an item from those lists."
-
-#~ msgid "CalCurse %s | help"
-#~ msgstr "CalCurse %s | help"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in wins_prop: property unknown\n"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#~ msgid ""
-#~ "Please resize your terminal screen\n"
-#~ "(to at least 80x24),\n"
-#~ "and restart calcurse.\n"
-#~ msgstr ""
-#~ "Please resize your terminal screen\n"
-#~ "(to at least 80x24),\n"
-#~ "and restart calcurse.\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in update_time_in_date: failure in mktime\n"
-#~ msgstr "FATAL ERROR in date2sec: failure in mktime\n"
-
-#~ msgid "Pick the number corresponding to the color scheme (Q to exit) :"
-#~ msgstr "Pick the number corresponding to the colour scheme (Q to exit) :"
-
-#~ msgid "([>0<] for black & white)"
-#~ msgstr "([>0<] for black & white)"
-
-#~ msgid "-- Press 'N' for next page --"
-#~ msgstr "-- Press 'N' for next page --"
-
-#~ msgid "-- Press 'P' for previous page --"
-#~ msgstr "-- Press 'P' for previous page --"
-
-#~ msgid " |Ac| |At| |cA| |tA|"
-#~ msgstr " |Ac| |At| |cA| |tA|"
-
-#~ msgid "[1]|At| [2]|Ac| [3]|tA| [4]|cA|"
-#~ msgstr "[1]|At| [2]|Ac| [3]|tA| [4]|cA|"
-
-#~ msgid "Redraw:\n"
-#~ msgstr "Redraw:\n"
-
-#, fuzzy
-#~ msgid ""
-#~ "Pressing CTRL-L redraws the Calcurse panels.\n"
-#~ "\n"
-#~ "You might want to use this function when you resize your terminal\n"
-#~ "screen for example, and you want Calcurse to take into account the new\n"
-#~ "size of the terminal.\n"
-#~ "\n"
-#~ "This function can also be useful when garbage appears in the display,\n"
-#~ "and you want to clean it."
-#~ msgstr ""
-#~ "Pressing 'R' redraws the Calcurse panels.\n"
-#~ "\n"
-#~ "You might want to use this function when you resize your terminal\n"
-#~ "screen for example, and you want Calcurse to take into account the new\n"
-#~ "size of the terminal.\n"
-#~ "\n"
-#~ "This function can also be useful when garbage appears in the display,\n"
-#~ "and you want to clear it."
-
-#~ msgid "GoTo"
-#~ msgstr "GoTo"
diff --git a/po/es.po b/po/es.po
index 01a4295..b3736b7 100644
--- a/po/es.po
+++ b/po/es.po
@@ -12,8 +12,8 @@ msgid ""
msgstr ""
"Project-Id-Version: calcurse\n"
"Report-Msgid-Bugs-To: bugs@calcurse.org\n"
-"POT-Creation-Date: 2020-10-12 10:38-0400\n"
-"PO-Revision-Date: 2020-01-30 18:17+0000\n"
+"POT-Creation-Date: 2023-05-22 14:19-0400\n"
+"PO-Revision-Date: 2020-10-12 15:20+0000\n"
"Last-Translator: Lukas Fleischer\n"
"Language-Team: Spanish (http://www.transifex.com/lfleischer/calcurse/"
"language/es/)\n"
@@ -57,9 +57,8 @@ msgstr "Consulte `calcurse -h` para más información."
msgid "calcurse %s -- text-based organizer\n"
msgstr "calcurse %s -- organizador basado en texto\n"
-#, fuzzy
-msgid "Copyright (c) 2004-2020 calcurse Development Team."
-msgstr "Copyright (c) 2004-2017 Equipo de desarrollo de calcurse."
+msgid "Copyright (c) 2004-2023 calcurse Development Team."
+msgstr ""
msgid "This is free software; see the source for copying conditions."
msgstr ""
@@ -443,12 +442,6 @@ msgid "(if set to YES, confirmation is required before deleting an event)"
msgstr ""
"(si se le asigna YES, se requiere confirmación antes de borrar un evento)"
-msgid "Monday"
-msgstr "Lunes"
-
-msgid "Sunday"
-msgstr "Domingo"
-
msgid "(specifies the first day of week in the calendar view)"
msgstr "(especifica el primer día de la semana en la vista de calendario)"
@@ -473,6 +466,10 @@ msgstr "(posición de la cabecera en el panel de citas)"
msgid "(Format of the date displayed in the appointments panel)"
msgstr "(Formato de la fecha mostrado en el panel de citas)"
+#, fuzzy
+msgid "(Format of the time displayed in the appointments panel)"
+msgstr "(Formato de la fecha mostrado en el panel de citas)"
+
msgid "Enter a text string (an empty string for the default text)"
msgstr ""
@@ -481,6 +478,11 @@ msgstr ""
"Ingrese el formato de la fecha (ver 'man 3 strftime' para los formatos "
"posibles) "
+msgid "Enter the time format (see 'man 3 strftime' for possible formats) "
+msgstr ""
+"Introduzca el formato de la hora (ver 'man 3 strftime' para los formatos "
+"posibles) "
+
msgid "Enter the date format: "
msgstr "Ingrese el formato de fecha:"
@@ -495,8 +497,8 @@ msgstr "opciones generales"
msgid "Undefined option!"
msgstr "¡Opción no definida!"
-msgid "undefined"
-msgstr "sin definir"
+msgid "UNDEFINED"
+msgstr ""
msgid "keys configuration"
msgstr "configuración de teclas"
@@ -508,8 +510,9 @@ msgstr "Presione la tecla que quiere asignarle a:"
msgid "The key '%s' is already used for %s. Choose another one."
msgstr "La tecla '%s' ya está en uso por %s. Elija otra."
-msgid "Some actions do not have any associated key bindings!"
-msgstr "¡Algunas acciones no tienen ninguna tecla asociada!"
+#, fuzzy
+msgid "Some actions are left undefined!"
+msgstr "opción no definida"
msgid ""
"Sorry, colors are not supported by your terminal\n"
@@ -614,6 +617,13 @@ msgstr "memoria agotada"
msgid "unknown ical type"
msgstr "tipo ical desconocido"
+msgid "(empty)"
+msgstr ""
+
+#, fuzzy
+msgid "ical_store_event: out of memory"
+msgstr "xcalloc: memoria agotada"
+
msgid "need DTSTART to determine event type."
msgstr ""
@@ -637,6 +647,9 @@ msgstr "máscara de filtrado inválida"
msgid "either until or count."
msgstr ""
+msgid "missing until value."
+msgstr ""
+
#, fuzzy
msgid "invalid until format."
msgstr "formato de exportación inválido: %s"
@@ -665,61 +678,32 @@ msgstr ""
msgid "invalid exception."
msgstr "Frecuencia inválida."
-#, fuzzy, c-format
+#, c-format
msgid "malformed %s line."
-msgstr "fecha de comienzo del evento mal formada."
+msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "malformed %s."
-msgstr "Ingrese descripción:"
+msgstr ""
-#, fuzzy
msgid "malformed summary line."
-msgstr "fecha de comienzo del evento mal formada."
-
-msgid "malformed summary."
msgstr ""
-msgid "line break in summary."
+msgid "malformed summary."
msgstr ""
-msgid "could not retrieve item summary."
-msgstr "no se pudo recuperar el resumen del elemento."
-
-msgid "item start date is not defined."
+#, fuzzy
+msgid "item start date not defined."
msgstr "la fecha de comienzo del elemento no está definida."
-msgid "multi-day event changed to one-day event"
-msgstr ""
-
-#, fuzzy, c-format
-msgid "Location: %s"
-msgstr " asignado en: %s\n"
-
-#, c-format
-msgid "Comment: %s"
-msgstr ""
-
-#, c-format
-msgid "rrule does not match start day (%s)."
-msgstr ""
-
-msgid "item could not be identified."
-msgstr "el elemento no pudo ser identificado."
-
-#, fuzzy
msgid "malformed start time line."
-msgstr "fecha de comienzo del evento mal formada."
+msgstr ""
#, fuzzy
msgid "invalid or malformed event start time."
msgstr "no se pudo recuperar la fecha de comienzo del evento."
#, fuzzy
-msgid "either end or duration."
-msgstr "error de sintaxis en la hora o duración del evento"
-
-#, fuzzy
msgid "invalid end time value type."
msgstr "rango de fecha inválido: %s"
@@ -734,16 +718,39 @@ msgid "end must be later than start."
msgstr ""
#, fuzzy
+msgid "either end or duration."
+msgstr "error de sintaxis en la hora o duración del evento"
+
msgid "malformed duration line."
-msgstr "descripción mal formada."
+msgstr ""
#, fuzzy
msgid "invalid duration."
msgstr "fecha inválida: %s"
-#, fuzzy
+msgid "exception date, but no recurrence rule."
+msgstr ""
+
+msgid "multi-day event changed to one-day event"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Location: %s"
+msgstr " asignado en: %s\n"
+
+#, c-format
+msgid "Comment: %s"
+msgstr ""
+
+#, c-format
+msgid "rrule does not match start day (%s)."
+msgstr ""
+
+msgid "item could not be identified."
+msgstr "el elemento no pudo ser identificado."
+
msgid "only one description allowed."
-msgstr "descripción mal formada."
+msgstr ""
msgid "only one location allowed."
msgstr ""
@@ -753,6 +760,9 @@ msgstr ""
"El archivo ical parece estar mal formado. No se pudo encontrar el fin del "
"elemento."
+msgid "could not retrieve item summary."
+msgstr "no se pudo recuperar el resumen del elemento."
+
msgid "item priority is invalid (must be between 0 and 9)."
msgstr "La prioridad del elemento es inválida (debe estar entre 0 y 9)."
@@ -851,37 +861,40 @@ msgstr ""
msgid "failed to open key file"
msgstr "no pudo abrirse el archivo de teclas"
-msgid ""
-"\n"
-"Too many errors while reading configuration file!\n"
-"Please backup your keys file, remove it from directory, and launch calcurse "
-"again.\n"
-msgstr ""
-"\n"
-"¡Demasiados errores al leer el archivo de configuración!\n"
-"Por favor respalde el archivo de teclas, elimínelo del directorio y vuelva a "
-"iniciar calcurse.\n"
-
msgid "Could not read key label"
msgstr "No se pudo leer etiqueta de tecla"
-msgid "Key label not recognized"
+#, fuzzy, c-format
+msgid "Key label not recognized: \"%s\""
msgstr "Etiqueta de tecla no reconocida"
#, c-format
-msgid "Error reading key: \"%s\""
-msgstr "Error leyendo tecla: \"%s\""
+msgid "No keys assigned to \"%s\"."
+msgstr ""
-#, c-format
-msgid "\"%s\" assigned multiple times!"
+#, fuzzy, c-format
+msgid "Keyname not recognized: \"%s\""
+msgstr "Etiqueta de tecla no reconocida"
+
+#, fuzzy, c-format
+msgid "\"%s\" assigned twice: \"%s\"."
msgstr "¡\"%s\" asignado múltiples veces!"
-msgid "There were some errors when loading keys file."
+#, c-format
+msgid ""
+"Action \"%s\" absent, but default key \"%s\" assigned to another action."
msgstr ""
-msgid "Too many errors while reading keys file, aborting..."
+msgid "Errors in the keys file."
+msgstr ""
+
+#, fuzzy
+msgid "Remove offending line(s) from the keys file, aborting..."
msgstr "Demasiados errores al leer archivo de teclas, abortando..."
+msgid "Some actions do not have any associated key bindings!"
+msgstr "¡Algunas acciones no tienen ninguna tecla asociada!"
+
#, c-format
msgid "FATAL ERROR: could not create %s: %s\n"
msgstr "ERROR FATAL: no pudo crearse %s: %s\n"
@@ -1015,6 +1028,9 @@ msgstr "Pegar"
msgid "Chg Win"
msgstr "CmbVent"
+msgid "Prev Win"
+msgstr ""
+
msgid "Import"
msgstr "Importar"
@@ -1202,6 +1218,10 @@ msgstr "Pegar un elemento en la posición actual."
msgid "Select next panel in calcurse main screen."
msgstr "Seleccionar el panel siguiente en la pantalla principal de calcurse."
+#, fuzzy
+msgid "Select previous panel in calcurse main screen."
+msgstr "Seleccionar el panel siguiente en la pantalla principal de calcurse."
+
msgid "Import data from an external file."
msgstr "Importar datos desde un archivo externo."
@@ -1345,9 +1365,8 @@ msgid "FATAL ERROR: null file pointer."
msgstr "ERROR FATAL: puntero nulo a archivo."
#, c-format
-msgid "When adding default key for \"%s\", \"%s\" was already assigned!"
+msgid "Default key(s) assigned to %d action%s."
msgstr ""
-"Al añadir la tecla por defecto para \"%s\", ¡\"%s\" ya estaba asignada!!"
msgid "xmalloc: zero size"
msgstr "xmalloc: tamaño cero"
@@ -1439,12 +1458,6 @@ msgstr " bloques sin liberar: %u\n"
msgid "Warning: could not open %s, Aborting..."
msgstr "Advertencia: no pudo abrirse %s. Abortando..."
-msgid "error while launching command: could not fork"
-msgstr "error al lanzar comando: no pudo realizarse fork"
-
-msgid "error while launching command"
-msgstr "error al lanzar comando"
-
msgid "(if set to YES, notify-bar will be displayed)"
msgstr "(si selecciona SÃ, se mostrará la barra de notificaciones)"
@@ -1472,11 +1485,6 @@ msgstr ""
msgid "(Log activity when running in background)"
msgstr "(Registrar actividad al ejecutar en segundo plano)"
-msgid "Enter the time format (see 'man 3 strftime' for possible formats) "
-msgstr ""
-"Introduzca el formato de la hora (ver 'man 3 strftime' para los formatos "
-"posibles) "
-
msgid "Enter the number of seconds (0 not to be warned before an appointment)"
msgstr ""
"Introduzca el número de segundos (con 0 no se avisará antes de una cita)"
@@ -1888,13 +1896,11 @@ msgstr "Uso: calcurse-upgrade [-h|-v|--config <file>]"
#, fuzzy
msgid ""
"\n"
-"Copyright (c) 2004-2020 calcurse Development Team.\n"
+"Copyright (c) 2004-2023 calcurse Development Team.\n"
"This is free software; see the source for copying conditions.\n"
msgstr ""
-"\n"
-"Copyright (c) 2004-2017 Equipo de desarrollo de calcurse. \n"
-"Esto es software libre; consulte el código fuente para las condiciones de "
-"copia.\n"
+"Esto es software libre; consulte el código fuente para ver las condiciones "
+"de copia."
msgid "unrecognized option:"
msgstr "opción no reconocida:"
@@ -1946,6 +1952,35 @@ msgstr "Actualizar directivas de configuración..."
msgid "Remove temporary backup..."
msgstr "Eliminar respaldo temporal..."
+#~ msgid "Monday"
+#~ msgstr "Lunes"
+
+#~ msgid "Sunday"
+#~ msgstr "Domingo"
+
+#~ msgid "undefined"
+#~ msgstr "sin definir"
+
+#~ msgid ""
+#~ "\n"
+#~ "Too many errors while reading configuration file!\n"
+#~ "Please backup your keys file, remove it from directory, and launch "
+#~ "calcurse again.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "¡Demasiados errores al leer el archivo de configuración!\n"
+#~ "Por favor respalde el archivo de teclas, elimínelo del directorio y "
+#~ "vuelva a iniciar calcurse.\n"
+
+#, c-format
+#~ msgid "Error reading key: \"%s\""
+#~ msgstr "Error leyendo tecla: \"%s\""
+
+#, c-format
+#~ msgid "When adding default key for \"%s\", \"%s\" was already assigned!"
+#~ msgstr ""
+#~ "Al añadir la tecla por defecto para \"%s\", ¡\"%s\" ya estaba asignada!!"
+
#~ msgid ""
#~ "(if set to YES, messages about loaded and saved data will be displayed)"
#~ msgstr ""
@@ -1958,10 +1993,6 @@ msgstr "Eliminar respaldo temporal..."
#~ msgid "recurrence frequency not recognized."
#~ msgstr "frecuencia recurrente no reconocida."
-#, fuzzy
-#~ msgid "empty description."
-#~ msgstr "Ingrese descripción:"
-
#~ msgid "item has a negative duration."
#~ msgstr "el elemento tiene una duración negativa."
@@ -1975,6 +2006,12 @@ msgstr "Eliminar respaldo temporal..."
#~ msgid "Data files found. Data will be loaded now."
#~ msgstr "Archivos de datos encontrados. Ahora se cargaran los datos."
+#~ msgid "error while launching command: could not fork"
+#~ msgstr "error al lanzar comando: no pudo realizarse fork"
+
+#~ msgid "error while launching command"
+#~ msgstr "error al lanzar comando"
+
#~ msgid "unknown repetition type"
#~ msgstr "tipo de repetición desconocido"
@@ -2011,15 +2048,3 @@ msgstr "Eliminar respaldo temporal..."
#~ msgid "wrong item type"
#~ msgstr "tipo de elemento inválido"
-
-#~ msgid "recurrence rule malformed."
-#~ msgstr "regla de recurrencia mal formada"
-
-#~ msgid "recurrence exception dates malformed."
-#~ msgstr "excepción de recurrencia mal formada."
-
-#~ msgid "could not get entire item description."
-#~ msgstr "no se pudo obtener la descripción completa del elemento."
-
-#~ msgid "event end time malformed."
-#~ msgstr "fecha de finalización del evento mal formada."
diff --git a/po/fr.po b/po/fr.po
index 58ff7f9..1f0aed5 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -6,7 +6,7 @@
# esaule <godrik@mandragor.org>, 2011
# Gwendal Rogel <pythot@yahoo.fr>, 2018-2019
# Lukas Fleischer <transifex@cryptocrack.de>, 2011
-# lkppo, 2012
+# 4a14a73d523224463300dea5e0502458_3dab472, 2012
# SubS0, 2017
# tikismoke <webmaster@tikijs.dyndns.org>, 2014
# zorun <zerstorer@free.fr>, 2012
@@ -14,8 +14,8 @@ msgid ""
msgstr ""
"Project-Id-Version: calcurse\n"
"Report-Msgid-Bugs-To: bugs@calcurse.org\n"
-"POT-Creation-Date: 2020-10-12 10:38-0400\n"
-"PO-Revision-Date: 2020-01-30 18:17+0000\n"
+"POT-Creation-Date: 2023-05-22 14:19-0400\n"
+"PO-Revision-Date: 2020-10-12 15:20+0000\n"
"Last-Translator: Lukas Fleischer\n"
"Language-Team: French (http://www.transifex.com/lfleischer/calcurse/language/"
"fr/)\n"
@@ -67,10 +67,8 @@ msgstr "Tapez `calcurse -h` pour plus d'informations"
msgid "calcurse %s -- text-based organizer\n"
msgstr "calcurse %s -- organiseur en mode texte\n"
-#, fuzzy
-msgid "Copyright (c) 2004-2020 calcurse Development Team."
+msgid "Copyright (c) 2004-2023 calcurse Development Team."
msgstr ""
-"(c) 2004-2017. L'équipe de développement de calcurse. Tous droits réservés."
msgid "This is free software; see the source for copying conditions."
msgstr ""
@@ -470,12 +468,6 @@ msgid "(if set to YES, confirmation is required before deleting an event)"
msgstr ""
"(si fixé à OUI, il est nécessaire de confirmer avant d'effacer un élément)"
-msgid "Monday"
-msgstr "Lundi"
-
-msgid "Sunday"
-msgstr "Dimanche"
-
msgid "(specifies the first day of week in the calendar view)"
msgstr "(indique le premier jour de la semaine dans la vue de calendrier)"
@@ -500,6 +492,10 @@ msgstr "(position de l'entête dans le panneau rendez-vous)"
msgid "(Format of the date displayed in the appointments panel)"
msgstr "(Format de la date affichée dans le panneau rendez-vous)"
+#, fuzzy
+msgid "(Format of the time displayed in the appointments panel)"
+msgstr "(Format de la date affichée dans le panneau rendez-vous)"
+
msgid "Enter a text string (an empty string for the default text)"
msgstr ""
@@ -507,6 +503,11 @@ msgid "Enter the date format (see 'man 3 strftime' for possible formats) "
msgstr ""
"Saisir le format de date (voir 'man 3 strftime' pour les formats possibles)"
+msgid "Enter the time format (see 'man 3 strftime' for possible formats) "
+msgstr ""
+"Saisir le format de l'heure (voir 'man 3 strftime' pour les formats "
+"possibles)"
+
msgid "Enter the date format: "
msgstr "Saisir le format de date : "
@@ -521,8 +522,8 @@ msgstr "options générales"
msgid "Undefined option!"
msgstr "Option inconnue !"
-msgid "undefined"
-msgstr "inconnue"
+msgid "UNDEFINED"
+msgstr ""
msgid "keys configuration"
msgstr "Configuration des raccourcis"
@@ -534,8 +535,9 @@ msgstr "Pressez la touche que vous voulez assigner :"
msgid "The key '%s' is already used for %s. Choose another one."
msgstr "Le raccourci '%s' est déjà utilisé for %s. Choisissez en un autre."
-msgid "Some actions do not have any associated key bindings!"
-msgstr "Certaines actions n'ont pas de raccourcis clavier associés !"
+#, fuzzy
+msgid "Some actions are left undefined!"
+msgstr "option non définie"
msgid ""
"Sorry, colors are not supported by your terminal\n"
@@ -640,6 +642,13 @@ msgstr "dépassement de mémoire"
msgid "unknown ical type"
msgstr "type ical inconnu"
+msgid "(empty)"
+msgstr ""
+
+#, fuzzy
+msgid "ical_store_event: out of memory"
+msgstr "xcalloc : dépassement de mémoire"
+
msgid "need DTSTART to determine event type."
msgstr ""
@@ -663,6 +672,9 @@ msgstr "Filtre invalide"
msgid "either until or count."
msgstr ""
+msgid "missing until value."
+msgstr ""
+
#, fuzzy
msgid "invalid until format."
msgstr "format d'exportation invalide : %s"
@@ -692,61 +704,32 @@ msgstr ""
msgid "invalid exception."
msgstr "Fréquence invalide."
-#, fuzzy, c-format
+#, c-format
msgid "malformed %s line."
-msgstr "Heure de départ non valide."
+msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "malformed %s."
-msgstr "Saisir la description :"
+msgstr ""
-#, fuzzy
msgid "malformed summary line."
-msgstr "Heure de départ non valide."
-
-msgid "malformed summary."
msgstr ""
-msgid "line break in summary."
+msgid "malformed summary."
msgstr ""
-msgid "could not retrieve item summary."
-msgstr "impossible de récupérer le résumé de l'événement."
-
-msgid "item start date is not defined."
+#, fuzzy
+msgid "item start date not defined."
msgstr "la date de début de l'élément n'est pas définie."
-msgid "multi-day event changed to one-day event"
-msgstr ""
-
-#, fuzzy, c-format
-msgid "Location: %s"
-msgstr " alloué en : %s\n"
-
-#, c-format
-msgid "Comment: %s"
-msgstr ""
-
-#, c-format
-msgid "rrule does not match start day (%s)."
-msgstr ""
-
-msgid "item could not be identified."
-msgstr "l'élément n'a pu être identifié."
-
-#, fuzzy
msgid "malformed start time line."
-msgstr "Heure de départ non valide."
+msgstr ""
#, fuzzy
msgid "invalid or malformed event start time."
msgstr "impossible de récupérer l'heure de début de l'événement."
#, fuzzy
-msgid "either end or duration."
-msgstr "Heure ou durée non valide."
-
-#, fuzzy
msgid "invalid end time value type."
msgstr "Date ou heure non valide."
@@ -761,16 +744,39 @@ msgid "end must be later than start."
msgstr ""
#, fuzzy
+msgid "either end or duration."
+msgstr "Heure ou durée non valide."
+
msgid "malformed duration line."
-msgstr "description mal formée."
+msgstr ""
#, fuzzy
msgid "invalid duration."
msgstr "Heure ou durée non valide."
-#, fuzzy
+msgid "exception date, but no recurrence rule."
+msgstr ""
+
+msgid "multi-day event changed to one-day event"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Location: %s"
+msgstr " alloué en : %s\n"
+
+#, c-format
+msgid "Comment: %s"
+msgstr ""
+
+#, c-format
+msgid "rrule does not match start day (%s)."
+msgstr ""
+
+msgid "item could not be identified."
+msgstr "l'élément n'a pu être identifié."
+
msgid "only one description allowed."
-msgstr "description mal formée."
+msgstr ""
msgid "only one location allowed."
msgstr ""
@@ -779,6 +785,9 @@ msgid "The ical file seems to be malformed. The end of item was not found."
msgstr ""
"Le fichier ical semble mal formé. La fin de l'élément n'a pas été trouvée."
+msgid "could not retrieve item summary."
+msgstr "impossible de récupérer le résumé de l'événement."
+
msgid "item priority is invalid (must be between 0 and 9)."
msgstr ""
"La priorité de l'élément est invalide (doit être comprise entre 0 et 9)"
@@ -879,40 +888,41 @@ msgstr "Les données à l'écran ont été modifiées et seront perdues :"
msgid "failed to open key file"
msgstr "impossible d'ouvrir le fichier des raccourcis clavier"
-msgid ""
-"\n"
-"Too many errors while reading configuration file!\n"
-"Please backup your keys file, remove it from directory, and launch calcurse "
-"again.\n"
-msgstr ""
-"\n"
-"Trop d'erreurs à la lecture du fichier de configuration !\n"
-"Veuillez faire une sauvegarde de votre fichier de raccourcis, supprimer le "
-"du répertoire, puis relancer calcurse.\n"
-
msgid "Could not read key label"
msgstr "Impossible de lire le libellé de la touche"
-msgid "Key label not recognized"
+#, fuzzy, c-format
+msgid "Key label not recognized: \"%s\""
msgstr "Libellé de la touche non reconnu"
#, c-format
-msgid "Error reading key: \"%s\""
-msgstr "Erreur de lecture de la touche : \"%s\""
+msgid "No keys assigned to \"%s\"."
+msgstr ""
-#, c-format
-msgid "\"%s\" assigned multiple times!"
+#, fuzzy, c-format
+msgid "Keyname not recognized: \"%s\""
+msgstr "Libellé de la touche non reconnu"
+
+#, fuzzy, c-format
+msgid "\"%s\" assigned twice: \"%s\"."
msgstr "\"%s\" est assignée plusieurs fois !"
-msgid "There were some errors when loading keys file."
+#, c-format
+msgid ""
+"Action \"%s\" absent, but default key \"%s\" assigned to another action."
msgstr ""
-"Il y a eu des erreurs au chargement du fichier de configuration des "
-"raccourcis."
-msgid "Too many errors while reading keys file, aborting..."
+msgid "Errors in the keys file."
+msgstr ""
+
+#, fuzzy
+msgid "Remove offending line(s) from the keys file, aborting..."
msgstr ""
"Trop d'erreurs durant la lecture du fichier de raccourcis, annulation..."
+msgid "Some actions do not have any associated key bindings!"
+msgstr "Certaines actions n'ont pas de raccourcis clavier associés !"
+
#, c-format
msgid "FATAL ERROR: could not create %s: %s\n"
msgstr "ERREUR FATALE : impossible de créer %s : %s\n"
@@ -1047,6 +1057,9 @@ msgstr "Coller"
msgid "Chg Win"
msgstr "Chg.Fen."
+msgid "Prev Win"
+msgstr ""
+
msgid "Import"
msgstr "Importer"
@@ -1236,6 +1249,10 @@ msgstr "Coller un élément à la position actuelle."
msgid "Select next panel in calcurse main screen."
msgstr "Sélectionner le panneau suivant dans l'écran général de calcurse."
+#, fuzzy
+msgid "Select previous panel in calcurse main screen."
+msgstr "Sélectionner le panneau suivant dans l'écran général de calcurse."
+
msgid "Import data from an external file."
msgstr "Importer les données d'un fichier externe."
@@ -1375,10 +1392,8 @@ msgid "FATAL ERROR: null file pointer."
msgstr "ERREUR FATALE : pointeur de fichier nul."
#, c-format
-msgid "When adding default key for \"%s\", \"%s\" was already assigned!"
+msgid "Default key(s) assigned to %d action%s."
msgstr ""
-"Pendant l'ajout de la touche par défaut pour \"%s\", \"%s\" était déjà "
-"assignée !"
msgid "xmalloc: zero size"
msgstr "xmalloc : taille nulle"
@@ -1471,12 +1486,6 @@ msgstr " blocs non libérés : %u\n"
msgid "Warning: could not open %s, Aborting..."
msgstr "Attention : impossible d'ouvrir %s, abandon..."
-msgid "error while launching command: could not fork"
-msgstr "erreur pendant le lancement de la commande : fork impossible"
-
-msgid "error while launching command"
-msgstr "erreur durant le lancement de la commande"
-
msgid "(if set to YES, notify-bar will be displayed)"
msgstr "(si fixé à OUI, la barre de notification sera affichée)"
@@ -1509,11 +1518,6 @@ msgstr ""
msgid "(Log activity when running in background)"
msgstr "(Enregistrer l'activité lors de l'exécution en arrière-plan)"
-msgid "Enter the time format (see 'man 3 strftime' for possible formats) "
-msgstr ""
-"Saisir le format de l'heure (voir 'man 3 strftime' pour les formats "
-"possibles)"
-
msgid "Enter the number of seconds (0 not to be warned before an appointment)"
msgstr ""
"Saisir le nombre de secondes (0 pour désactiver l'alerte qui précéde un "
@@ -1942,13 +1946,11 @@ msgstr "Utilisation : calcurse-upgrade [-h|-v|--config <fichier>]"
#, fuzzy
msgid ""
"\n"
-"Copyright (c) 2004-2020 calcurse Development Team.\n"
+"Copyright (c) 2004-2023 calcurse Development Team.\n"
"This is free software; see the source for copying conditions.\n"
msgstr ""
-"\n"
-"(c) 2004-2017. L'équipe de développement de calcurse. Tous droits réservés.\n"
-"Ceci est un logiciel libre ; voir le code source pour les conditions légales "
-"d'utilisation.\n"
+"Ceci est un logiciel libre : consultez le code source pour connaître les "
+"conditions légales d'utilisation."
msgid "unrecognized option:"
msgstr "option non reconnue :"
@@ -1998,6 +2000,41 @@ msgstr "Mise à jour des instructions de configuration..."
msgid "Remove temporary backup..."
msgstr "Suppression de la sauvegarde temporaire..."
+#~ msgid "Monday"
+#~ msgstr "Lundi"
+
+#~ msgid "Sunday"
+#~ msgstr "Dimanche"
+
+#~ msgid "undefined"
+#~ msgstr "inconnue"
+
+#~ msgid ""
+#~ "\n"
+#~ "Too many errors while reading configuration file!\n"
+#~ "Please backup your keys file, remove it from directory, and launch "
+#~ "calcurse again.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Trop d'erreurs à la lecture du fichier de configuration !\n"
+#~ "Veuillez faire une sauvegarde de votre fichier de raccourcis, supprimer "
+#~ "le du répertoire, puis relancer calcurse.\n"
+
+#, c-format
+#~ msgid "Error reading key: \"%s\""
+#~ msgstr "Erreur de lecture de la touche : \"%s\""
+
+#~ msgid "There were some errors when loading keys file."
+#~ msgstr ""
+#~ "Il y a eu des erreurs au chargement du fichier de configuration des "
+#~ "raccourcis."
+
+#, c-format
+#~ msgid "When adding default key for \"%s\", \"%s\" was already assigned!"
+#~ msgstr ""
+#~ "Pendant l'ajout de la touche par défaut pour \"%s\", \"%s\" était déjà "
+#~ "assignée !"
+
#~ msgid ""
#~ "(if set to YES, messages about loaded and saved data will be displayed)"
#~ msgstr ""
@@ -2010,10 +2047,6 @@ msgstr "Suppression de la sauvegarde temporaire..."
#~ msgid "recurrence frequency not recognized."
#~ msgstr "fréquence de répétition non reconnue."
-#, fuzzy
-#~ msgid "empty description."
-#~ msgstr "Saisir la description :"
-
#~ msgid "item has a negative duration."
#~ msgstr "l'élément a une durée négative."
@@ -2027,6 +2060,12 @@ msgstr "Suppression de la sauvegarde temporaire..."
#~ msgstr ""
#~ "Fichiers de données trouvés. Les données seront chargées immédiatement."
+#~ msgid "error while launching command: could not fork"
+#~ msgstr "erreur pendant le lancement de la commande : fork impossible"
+
+#~ msgid "error while launching command"
+#~ msgstr "erreur durant le lancement de la commande"
+
#~ msgid "unknown repetition type"
#~ msgstr "type de répétition inconnu"
@@ -2073,18 +2112,3 @@ msgstr "Suppression de la sauvegarde temporaire..."
#~ msgid "wrong item type"
#~ msgstr "type d'élément incorrect"
-
-#~ msgid "recurrence rule malformed."
-#~ msgstr "règle de répétition mal formée."
-
-#~ msgid "recurrence exception dates malformed."
-#~ msgstr "dates de répétition exceptées mal formées."
-
-#~ msgid "could not get entire item description."
-#~ msgstr "impossible de trouver la description entière de l'élément."
-
-#~ msgid "event start time malformed."
-#~ msgstr "heure de début de l'événement mal formée."
-
-#~ msgid "event end time malformed."
-#~ msgstr "heure de fin de l'événement mal formée."
diff --git a/po/nl.po b/po/nl.po
index 59807b5..fc164b5 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -11,8 +11,8 @@ msgid ""
msgstr ""
"Project-Id-Version: calcurse\n"
"Report-Msgid-Bugs-To: bugs@calcurse.org\n"
-"POT-Creation-Date: 2020-10-12 10:38-0400\n"
-"PO-Revision-Date: 2020-01-30 18:17+0000\n"
+"POT-Creation-Date: 2023-05-22 14:19-0400\n"
+"PO-Revision-Date: 2020-10-12 15:20+0000\n"
"Last-Translator: Lukas Fleischer\n"
"Language-Team: Dutch (http://www.transifex.com/lfleischer/calcurse/language/"
"nl/)\n"
@@ -56,7 +56,7 @@ msgstr "Probeer `calcurse -h` voor meer informatie."
msgid "calcurse %s -- text-based organizer\n"
msgstr "calcurse %s -- tekst gebaseerde agenda\n"
-msgid "Copyright (c) 2004-2020 calcurse Development Team."
+msgid "Copyright (c) 2004-2023 calcurse Development Team."
msgstr ""
msgid "This is free software; see the source for copying conditions."
@@ -428,12 +428,6 @@ msgstr "(Bij JA, wordt er een bevestiging gevraagd bij eindigen programma"
msgid "(if set to YES, confirmation is required before deleting an event)"
msgstr "(Bij JA, is een bevestiging nodig voor het wissen van een gebeurtenis)"
-msgid "Monday"
-msgstr "maandag"
-
-msgid "Sunday"
-msgstr "zondag"
-
msgid "(specifies the first day of week in the calendar view)"
msgstr ""
@@ -458,12 +452,19 @@ msgstr ""
msgid "(Format of the date displayed in the appointments panel)"
msgstr ""
+#, fuzzy
+msgid "(Format of the time displayed in the appointments panel)"
+msgstr "(Formaat van de tijd in de informatiebalk.)"
+
msgid "Enter a text string (an empty string for the default text)"
msgstr ""
msgid "Enter the date format (see 'man 3 strftime' for possible formats) "
msgstr "Geef het formaat van de datum (zie 'man 3 strftime')"
+msgid "Enter the time format (see 'man 3 strftime' for possible formats) "
+msgstr "Geef het formaat van de tijd (zie 'man 3 strftime')"
+
msgid "Enter the date format: "
msgstr ""
@@ -478,8 +479,8 @@ msgstr "Algemene opties"
msgid "Undefined option!"
msgstr "Niet gekende optie!"
-msgid "undefined"
-msgstr "Ongekend"
+msgid "UNDEFINED"
+msgstr ""
msgid "keys configuration"
msgstr "Toetsinstellingen"
@@ -491,7 +492,7 @@ msgstr "Druk de toets die u wilt toewijzen:"
msgid "The key '%s' is already used for %s. Choose another one."
msgstr ""
-msgid "Some actions do not have any associated key bindings!"
+msgid "Some actions are left undefined!"
msgstr ""
msgid ""
@@ -597,6 +598,12 @@ msgstr ""
msgid "unknown ical type"
msgstr "onbekend ical type"
+msgid "(empty)"
+msgstr ""
+
+msgid "ical_store_event: out of memory"
+msgstr ""
+
msgid "need DTSTART to determine event type."
msgstr ""
@@ -618,6 +625,9 @@ msgstr ""
msgid "either until or count."
msgstr ""
+msgid "missing until value."
+msgstr ""
+
msgid "invalid until format."
msgstr ""
@@ -642,46 +652,22 @@ msgstr ""
msgid "invalid exception."
msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "malformed %s line."
-msgstr "omschrijving beschadigd"
-
-#, fuzzy, c-format
-msgid "malformed %s."
-msgstr "omschrijving beschadigd"
-
-#, fuzzy
-msgid "malformed summary line."
-msgstr "omschrijving beschadigd"
-
-msgid "malformed summary."
-msgstr ""
-
-msgid "line break in summary."
-msgstr ""
-
-msgid "could not retrieve item summary."
-msgstr "kan item onderwerp niet ophalen"
-
-msgid "item start date is not defined."
-msgstr ""
-
-msgid "multi-day event changed to one-day event"
msgstr ""
#, c-format
-msgid "Location: %s"
+msgid "malformed %s."
msgstr ""
-#, c-format
-msgid "Comment: %s"
+msgid "malformed summary line."
msgstr ""
-#, c-format
-msgid "rrule does not match start day (%s)."
+msgid "malformed summary."
msgstr ""
-msgid "item could not be identified."
+#, fuzzy
+msgid "item start date not defined."
msgstr "item onbekend"
msgid "malformed start time line."
@@ -691,10 +677,6 @@ msgstr ""
msgid "invalid or malformed event start time."
msgstr "kan begintijd van gebeurtenis niet ophalen"
-#, fuzzy
-msgid "either end or duration."
-msgstr "syntaxfout in itemtijd of duurtijd van het item"
-
msgid "invalid end time value type."
msgstr ""
@@ -709,16 +691,39 @@ msgid "end must be later than start."
msgstr ""
#, fuzzy
+msgid "either end or duration."
+msgstr "syntaxfout in itemtijd of duurtijd van het item"
+
msgid "malformed duration line."
-msgstr "omschrijving beschadigd"
+msgstr ""
#, fuzzy
msgid "invalid duration."
msgstr "item heeft een negatieve tijdsduur"
-#, fuzzy
+msgid "exception date, but no recurrence rule."
+msgstr ""
+
+msgid "multi-day event changed to one-day event"
+msgstr ""
+
+#, c-format
+msgid "Location: %s"
+msgstr ""
+
+#, c-format
+msgid "Comment: %s"
+msgstr ""
+
+#, c-format
+msgid "rrule does not match start day (%s)."
+msgstr ""
+
+msgid "item could not be identified."
+msgstr "item onbekend"
+
msgid "only one description allowed."
-msgstr "omschrijving beschadigd"
+msgstr ""
msgid "only one location allowed."
msgstr ""
@@ -726,6 +731,9 @@ msgstr ""
msgid "The ical file seems to be malformed. The end of item was not found."
msgstr "Ical-bestand oogt onjuist. Het einde van item niet gevonden."
+msgid "could not retrieve item summary."
+msgstr "kan item onderwerp niet ophalen"
+
msgid "item priority is invalid (must be between 0 and 9)."
msgstr ""
@@ -822,38 +830,41 @@ msgstr ""
msgid "failed to open key file"
msgstr ""
-msgid ""
-"\n"
-"Too many errors while reading configuration file!\n"
-"Please backup your keys file, remove it from directory, and launch calcurse "
-"again.\n"
-msgstr ""
-"\n"
-"Teveel fouten tijdens het lezen van het configuratiebestand!\n"
-"Maak een backup van het sneltoetsenbestand, verwijder het van de map en "
-"start calcurse opnieuw op.\n"
-
msgid "Could not read key label"
msgstr ""
-msgid "Key label not recognized"
+#, c-format
+msgid "Key label not recognized: \"%s\""
msgstr ""
#, c-format
-msgid "Error reading key: \"%s\""
+msgid "No keys assigned to \"%s\"."
msgstr ""
#, c-format
-msgid "\"%s\" assigned multiple times!"
+msgid "Keyname not recognized: \"%s\""
+msgstr ""
+
+#, fuzzy, c-format
+msgid "\"%s\" assigned twice: \"%s\"."
msgstr "\"%s\" meer dan eens toegewezen!"
-msgid "There were some errors when loading keys file."
+#, c-format
+msgid ""
+"Action \"%s\" absent, but default key \"%s\" assigned to another action."
msgstr ""
-msgid "Too many errors while reading keys file, aborting..."
+msgid "Errors in the keys file."
+msgstr ""
+
+#, fuzzy
+msgid "Remove offending line(s) from the keys file, aborting..."
msgstr ""
"Teveel fouten bij het laden van het sneltoetsenbestand, wordt afgebroken ..."
+msgid "Some actions do not have any associated key bindings!"
+msgstr ""
+
#, c-format
msgid "FATAL ERROR: could not create %s: %s\n"
msgstr "FATALE FOUT: kan %s niet aanmaken: %s\n"
@@ -979,6 +990,9 @@ msgstr "Plak"
msgid "Chg Win"
msgstr ""
+msgid "Prev Win"
+msgstr ""
+
msgid "Import"
msgstr "Import"
@@ -1157,6 +1171,9 @@ msgstr ""
msgid "Select next panel in calcurse main screen."
msgstr ""
+msgid "Select previous panel in calcurse main screen."
+msgstr ""
+
msgid "Import data from an external file."
msgstr "Importeer gegevens uit een extern bestand."
@@ -1279,7 +1296,7 @@ msgid "FATAL ERROR: null file pointer."
msgstr ""
#, c-format
-msgid "When adding default key for \"%s\", \"%s\" was already assigned!"
+msgid "Default key(s) assigned to %d action%s."
msgstr ""
msgid "xmalloc: zero size"
@@ -1372,12 +1389,6 @@ msgstr ""
msgid "Warning: could not open %s, Aborting..."
msgstr "Pas op: bestand %s niet te openen. Stoppen..."
-msgid "error while launching command: could not fork"
-msgstr ""
-
-msgid "error while launching command"
-msgstr "fout bij uitvoeren commando"
-
msgid "(if set to YES, notify-bar will be displayed)"
msgstr "(Bij JA, wordt de informatiebalk weergegeven)"
@@ -1405,9 +1416,6 @@ msgstr ""
msgid "(Log activity when running in background)"
msgstr ""
-msgid "Enter the time format (see 'man 3 strftime' for possible formats) "
-msgstr "Geef het formaat van de tijd (zie 'man 3 strftime')"
-
msgid "Enter the number of seconds (0 not to be warned before an appointment)"
msgstr "Geef het aantal seconden (0 voor geen waarschuwing voor een afspraak)."
@@ -1805,7 +1813,7 @@ msgstr ""
#, fuzzy
msgid ""
"\n"
-"Copyright (c) 2004-2020 calcurse Development Team.\n"
+"Copyright (c) 2004-2023 calcurse Development Team.\n"
"This is free software; see the source for copying conditions.\n"
msgstr "Dit is vrije software; bekijk de broncode voor de kopieer voorwaarden"
@@ -1849,9 +1857,25 @@ msgstr ""
msgid "Remove temporary backup..."
msgstr ""
-#, fuzzy
-#~ msgid "empty description."
-#~ msgstr "omschrijving beschadigd"
+#~ msgid "Monday"
+#~ msgstr "maandag"
+
+#~ msgid "Sunday"
+#~ msgstr "zondag"
+
+#~ msgid "undefined"
+#~ msgstr "Ongekend"
+
+#~ msgid ""
+#~ "\n"
+#~ "Too many errors while reading configuration file!\n"
+#~ "Please backup your keys file, remove it from directory, and launch "
+#~ "calcurse again.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Teveel fouten tijdens het lezen van het configuratiebestand!\n"
+#~ "Maak een backup van het sneltoetsenbestand, verwijder het van de map en "
+#~ "start calcurse opnieuw op.\n"
#~ msgid "item duration malformed."
#~ msgstr "item tijdsduur onjuist"
@@ -1862,6 +1886,9 @@ msgstr ""
#~ msgid "Data files found. Data will be loaded now."
#~ msgstr "Databestanden gevonden. Data wordt geladen."
+#~ msgid "error while launching command"
+#~ msgstr "fout bij uitvoeren commando"
+
#~ msgid "(d)aily"
#~ msgstr "(d)agelijks"
@@ -1870,12 +1897,3 @@ msgstr ""
#~ msgid "(y)early"
#~ msgstr "(y)aarlijks"
-
-#~ msgid "recurrence rule malformed."
-#~ msgstr "herhalingsregel onjuist"
-
-#~ msgid "recurrence exception dates malformed."
-#~ msgstr "herhaling exceptie datum onjuist"
-
-#~ msgid "could not get entire item description."
-#~ msgstr "onvolledige item omschrijving"
diff --git a/po/pt_BR.po b/po/pt_BR.po
index 8bd9327..b32085a 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -9,8 +9,8 @@ msgid ""
msgstr ""
"Project-Id-Version: calcurse\n"
"Report-Msgid-Bugs-To: bugs@calcurse.org\n"
-"POT-Creation-Date: 2020-10-12 10:38-0400\n"
-"PO-Revision-Date: 2020-01-30 18:17+0000\n"
+"POT-Creation-Date: 2023-05-22 14:19-0400\n"
+"PO-Revision-Date: 2020-10-12 15:20+0000\n"
"Last-Translator: Lukas Fleischer\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/lfleischer/"
"calcurse/language/pt_BR/)\n"
@@ -62,9 +62,8 @@ msgstr "Tente `calcurse -h` para mais informações."
msgid "calcurse %s -- text-based organizer\n"
msgstr "calcurse %s -- agenda baseada em texto\n"
-#, fuzzy
-msgid "Copyright (c) 2004-2020 calcurse Development Team."
-msgstr "Copyright (c) 2004-2017 calcurse Equipe de Desenvolvimento."
+msgid "Copyright (c) 2004-2023 calcurse Development Team."
+msgstr ""
msgid "This is free software; see the source for copying conditions."
msgstr ""
@@ -464,12 +463,6 @@ msgstr ""
"(se definida como SIM, uma confirmação será necessária antes da exclusão de "
"um evento)"
-msgid "Monday"
-msgstr "Segunda-feira"
-
-msgid "Sunday"
-msgstr "Domingo"
-
msgid "(specifies the first day of week in the calendar view)"
msgstr "(especifica o primeiro dia da semana na visão de calendário)"
@@ -494,6 +487,10 @@ msgstr "(posição do cabeçalho no painel de agendamentos)"
msgid "(Format of the date displayed in the appointments panel)"
msgstr "(Formato da data exibida no painel de agendamentos)"
+#, fuzzy
+msgid "(Format of the time displayed in the appointments panel)"
+msgstr "(Formato da data exibida no painel de agendamentos)"
+
msgid "Enter a text string (an empty string for the default text)"
msgstr ""
@@ -502,6 +499,11 @@ msgstr ""
"Entre com o formato da data (veja \"man 3 strftime\" para formatos "
"possíveis) "
+msgid "Enter the time format (see 'man 3 strftime' for possible formats) "
+msgstr ""
+"Entre com o formato do horário (veja \"man 3 strftime\" para formatos "
+"possíveis) "
+
msgid "Enter the date format: "
msgstr "Entre com formato da data: "
@@ -515,8 +517,8 @@ msgstr "Opções Gerais"
msgid "Undefined option!"
msgstr "Opção indefinida!"
-msgid "undefined"
-msgstr "indefinida"
+msgid "UNDEFINED"
+msgstr ""
msgid "keys configuration"
msgstr "Configuração das Teclas"
@@ -528,8 +530,9 @@ msgstr "Pressione a tecla que você quer designar para:"
msgid "The key '%s' is already used for %s. Choose another one."
msgstr "A tecla '%s' já está em uso para %s. Selecione outra."
-msgid "Some actions do not have any associated key bindings!"
-msgstr "Algumas ações não têm teclas de atalho associadas!"
+#, fuzzy
+msgid "Some actions are left undefined!"
+msgstr "opção não definida"
msgid ""
"Sorry, colors are not supported by your terminal\n"
@@ -634,6 +637,13 @@ msgstr "memória insuficiente"
msgid "unknown ical type"
msgstr "tipo de ical desconhecido"
+msgid "(empty)"
+msgstr ""
+
+#, fuzzy
+msgid "ical_store_event: out of memory"
+msgstr "xcalloc: memória insuficiente"
+
msgid "need DTSTART to determine event type."
msgstr ""
@@ -657,6 +667,9 @@ msgstr "máscara de filtro inválida"
msgid "either until or count."
msgstr ""
+msgid "missing until value."
+msgstr ""
+
#, fuzzy
msgid "invalid until format."
msgstr "formato de exportação inválido: %s"
@@ -685,48 +698,24 @@ msgstr ""
msgid "invalid exception."
msgstr "combinação inválida de argumentos"
-#, fuzzy, c-format
+#, c-format
msgid "malformed %s line."
-msgstr "descrição mal-formulada."
+msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "malformed %s."
-msgstr "Insera uma descrição:"
+msgstr ""
-#, fuzzy
msgid "malformed summary line."
-msgstr "descrição mal-formulada."
-
-msgid "malformed summary."
msgstr ""
-msgid "line break in summary."
+msgid "malformed summary."
msgstr ""
-msgid "could not retrieve item summary."
-msgstr "não foi possível adquirir sumário do item."
-
-msgid "item start date is not defined."
+#, fuzzy
+msgid "item start date not defined."
msgstr "data de início do ítem não foi definida."
-msgid "multi-day event changed to one-day event"
-msgstr ""
-
-#, fuzzy, c-format
-msgid "Location: %s"
-msgstr " alocado em: %s\n"
-
-#, c-format
-msgid "Comment: %s"
-msgstr ""
-
-#, c-format
-msgid "rrule does not match start day (%s)."
-msgstr ""
-
-msgid "item could not be identified."
-msgstr "item não pôde ser identificado."
-
msgid "malformed start time line."
msgstr ""
@@ -735,10 +724,6 @@ msgid "invalid or malformed event start time."
msgstr "não foi possível adquirir hora de início do evento."
#, fuzzy
-msgid "either end or duration."
-msgstr "erro de sintaxe no horário ou duração do item"
-
-#, fuzzy
msgid "invalid end time value type."
msgstr "intervalo de datas inválido: %s"
@@ -753,16 +738,39 @@ msgid "end must be later than start."
msgstr ""
#, fuzzy
+msgid "either end or duration."
+msgstr "erro de sintaxe no horário ou duração do item"
+
msgid "malformed duration line."
-msgstr "descrição mal-formulada."
+msgstr ""
#, fuzzy
msgid "invalid duration."
msgstr "data inválida: %s"
-#, fuzzy
+msgid "exception date, but no recurrence rule."
+msgstr ""
+
+msgid "multi-day event changed to one-day event"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Location: %s"
+msgstr " alocado em: %s\n"
+
+#, c-format
+msgid "Comment: %s"
+msgstr ""
+
+#, c-format
+msgid "rrule does not match start day (%s)."
+msgstr ""
+
+msgid "item could not be identified."
+msgstr "item não pôde ser identificado."
+
msgid "only one description allowed."
-msgstr "descrição mal-formulada."
+msgstr ""
msgid "only one location allowed."
msgstr ""
@@ -771,6 +779,9 @@ msgid "The ical file seems to be malformed. The end of item was not found."
msgstr ""
"O arquivo ical parece estar mal-formulada. O fim do item não foi encontrado."
+msgid "could not retrieve item summary."
+msgstr "não foi possível adquirir sumário do item."
+
msgid "item priority is invalid (must be between 0 and 9)."
msgstr ""
@@ -869,37 +880,40 @@ msgstr ""
msgid "failed to open key file"
msgstr "falha na abertura do arquivo de teclas"
-msgid ""
-"\n"
-"Too many errors while reading configuration file!\n"
-"Please backup your keys file, remove it from directory, and launch calcurse "
-"again.\n"
-msgstr ""
-"\n"
-"Muitos erros de leitura do arquivo de configuração!\n"
-"Favor faça backup de seus arquivos de teclas, exclua-o de seu diretório e "
-"carregue calcurse novamente.\n"
-
msgid "Could not read key label"
msgstr "Não foi possível ler o rótulo de tecla"
-msgid "Key label not recognized"
+#, fuzzy, c-format
+msgid "Key label not recognized: \"%s\""
msgstr "Rótulo de tecla não reconhecida"
#, c-format
-msgid "Error reading key: \"%s\""
-msgstr "Erro na leitura da tecla: \"%s\""
+msgid "No keys assigned to \"%s\"."
+msgstr ""
-#, c-format
-msgid "\"%s\" assigned multiple times!"
+#, fuzzy, c-format
+msgid "Keyname not recognized: \"%s\""
+msgstr "Rótulo de tecla não reconhecida"
+
+#, fuzzy, c-format
+msgid "\"%s\" assigned twice: \"%s\"."
msgstr "\"%s\" alocada múltiplas vezes!"
-msgid "There were some errors when loading keys file."
+#, c-format
+msgid ""
+"Action \"%s\" absent, but default key \"%s\" assigned to another action."
+msgstr ""
+
+msgid "Errors in the keys file."
msgstr ""
-msgid "Too many errors while reading keys file, aborting..."
+#, fuzzy
+msgid "Remove offending line(s) from the keys file, aborting..."
msgstr "Erros demais na leitura do arquivo de chaves, abortando..."
+msgid "Some actions do not have any associated key bindings!"
+msgstr "Algumas ações não têm teclas de atalho associadas!"
+
#, c-format
msgid "FATAL ERROR: could not create %s: %s\n"
msgstr "ERRO FATAL: não foi possível criar %s: %s\n"
@@ -1031,6 +1045,9 @@ msgstr "Colar"
msgid "Chg Win"
msgstr "MudarJan"
+msgid "Prev Win"
+msgstr ""
+
msgid "Import"
msgstr "Importar"
@@ -1209,6 +1226,10 @@ msgstr "Cola um item na posição atual."
msgid "Select next panel in calcurse main screen."
msgstr "Seleciona o próximo painel na tela principal do calcurse."
+#, fuzzy
+msgid "Select previous panel in calcurse main screen."
+msgstr "Seleciona o próximo painel na tela principal do calcurse."
+
msgid "Import data from an external file."
msgstr "Importa dados a partir de um arquivo externo."
@@ -1354,8 +1375,8 @@ msgid "FATAL ERROR: null file pointer."
msgstr "ERRO FATAL: ponteiro nulo de arquivo."
#, c-format
-msgid "When adding default key for \"%s\", \"%s\" was already assigned!"
-msgstr "Quando adicionava tecla padrão para \"%s\", \"%s\" já foi designada!"
+msgid "Default key(s) assigned to %d action%s."
+msgstr ""
msgid "xmalloc: zero size"
msgstr "xmalloc: tamanho zero"
@@ -1447,12 +1468,6 @@ msgstr " blocos não livres: %u\n"
msgid "Warning: could not open %s, Aborting..."
msgstr "Aviso: não foi possível abrir %s. Abortando..."
-msgid "error while launching command: could not fork"
-msgstr "erro durante o lançamento do comando: não foi possível realizar fork"
-
-msgid "error while launching command"
-msgstr "erro durante o lançamento do comando"
-
msgid "(if set to YES, notify-bar will be displayed)"
msgstr "(Se definida como SIM, a barra de notificação será exibida)"
@@ -1465,8 +1480,8 @@ msgstr "(Formato de horário a ser exibido dentro da barra de notificação)"
msgid ""
"(Warn user if an appointment is within next 'notify-bar_warning' seconds)"
msgstr ""
-"(Avisa o usuário se um agendamento ocorrerá nos próximos \"notify-bar_warning"
-"\" segundos)"
+"(Avisa o usuário se um agendamento ocorrerá nos próximos \"notify-"
+"bar_warning\" segundos)"
msgid "(Command used to notify user of an upcoming appointment)"
msgstr "(Comando usado para notificar usuário de um agendamento próximo)"
@@ -1480,11 +1495,6 @@ msgstr "(Executa em plano de fundo para pegar notificações depois de sair)"
msgid "(Log activity when running in background)"
msgstr "(Registra atividades quando estiver executando em plano de fundo)"
-msgid "Enter the time format (see 'man 3 strftime' for possible formats) "
-msgstr ""
-"Entre com o formato do horário (veja \"man 3 strftime\" para formatos "
-"possíveis) "
-
msgid "Enter the number of seconds (0 not to be warned before an appointment)"
msgstr ""
"Entre com o número de segundos (0 para não ser avisado antes do agendamento)"
@@ -1898,7 +1908,7 @@ msgstr "Uso: calcurse-upgrade [-h|-v|--config <arquivo>]"
#, fuzzy
msgid ""
"\n"
-"Copyright (c) 2004-2020 calcurse Development Team.\n"
+"Copyright (c) 2004-2023 calcurse Development Team.\n"
"This is free software; see the source for copying conditions.\n"
msgstr ""
"Esse programa é livre; veja o arquivo fonte para as condições aplicadas em "
@@ -1951,6 +1961,35 @@ msgstr "Atualizar diretivas de configuração..."
msgid "Remove temporary backup..."
msgstr "Excluir backup temporário..."
+#~ msgid "Monday"
+#~ msgstr "Segunda-feira"
+
+#~ msgid "Sunday"
+#~ msgstr "Domingo"
+
+#~ msgid "undefined"
+#~ msgstr "indefinida"
+
+#~ msgid ""
+#~ "\n"
+#~ "Too many errors while reading configuration file!\n"
+#~ "Please backup your keys file, remove it from directory, and launch "
+#~ "calcurse again.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Muitos erros de leitura do arquivo de configuração!\n"
+#~ "Favor faça backup de seus arquivos de teclas, exclua-o de seu diretório e "
+#~ "carregue calcurse novamente.\n"
+
+#, c-format
+#~ msgid "Error reading key: \"%s\""
+#~ msgstr "Erro na leitura da tecla: \"%s\""
+
+#, c-format
+#~ msgid "When adding default key for \"%s\", \"%s\" was already assigned!"
+#~ msgstr ""
+#~ "Quando adicionava tecla padrão para \"%s\", \"%s\" já foi designada!"
+
#~ msgid ""
#~ "(if set to YES, messages about loaded and saved data will be displayed)"
#~ msgstr ""
@@ -1963,10 +2002,6 @@ msgstr "Excluir backup temporário..."
#~ msgid "recurrence frequency not recognized."
#~ msgstr "periodicidade de recorrência não reconhecida."
-#, fuzzy
-#~ msgid "empty description."
-#~ msgstr "Insera uma descrição:"
-
#~ msgid "item has a negative duration."
#~ msgstr "item tem uma duração negativa."
@@ -1980,6 +2015,13 @@ msgstr "Excluir backup temporário..."
#~ msgid "Data files found. Data will be loaded now."
#~ msgstr "Arquivos de dados encontrados. Os dados serão carregados agora."
+#~ msgid "error while launching command: could not fork"
+#~ msgstr ""
+#~ "erro durante o lançamento do comando: não foi possível realizar fork"
+
+#~ msgid "error while launching command"
+#~ msgstr "erro durante o lançamento do comando"
+
#~ msgid "unknown repetition type"
#~ msgstr "tipo de repetição desconhecida"
@@ -2016,12 +2058,3 @@ msgstr "Excluir backup temporário..."
#~ msgid "wrong item type"
#~ msgstr "tipo de item errado"
-
-#~ msgid "recurrence rule malformed."
-#~ msgstr "regra de recorrência mal-formulada."
-
-#~ msgid "recurrence exception dates malformed."
-#~ msgstr "Exceção de datas de recorrência mal-formulada."
-
-#~ msgid "could not get entire item description."
-#~ msgstr "não foi possível adquirir a descrição completa do item."
diff --git a/po/ru.po b/po/ru.po
index 82d034b..219fb6b 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -6,23 +6,23 @@
# ÐлекÑей Мехоношин <ruskidecko@gmail.com>, 2011-2012
# ÐлекÑей Мехоношин <ruskidecko@gmail.com>, 2012-2014,2016
# Lukas Fleischer <transifex@cryptocrack.de>, 2011
-# ÐлекÑей Мехоношин <ruskidecko@gmail.com>, 2016-2017,2019
+# ÐлекÑей Мехоношин <ruskidecko@gmail.com>, 2016-2017,2019-2020
msgid ""
msgstr ""
"Project-Id-Version: calcurse\n"
"Report-Msgid-Bugs-To: bugs@calcurse.org\n"
-"POT-Creation-Date: 2020-10-12 10:38-0400\n"
-"PO-Revision-Date: 2020-01-30 18:17+0000\n"
-"Last-Translator: Lukas Fleischer\n"
+"POT-Creation-Date: 2023-05-22 14:19-0400\n"
+"PO-Revision-Date: 2020-10-12 17:52+0000\n"
+"Last-Translator: ÐлекÑей Мехоношин <ruskidecko@gmail.com>\n"
"Language-Team: Russian (http://www.transifex.com/lfleischer/calcurse/"
"language/ru/)\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
-"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n"
-"%100>=11 && n%100<=14)? 2 : 3);\n"
+"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || "
+"(n%100>=11 && n%100<=14)? 2 : 3);\n"
msgid "null pointer"
msgstr "пуÑтой указатель"
@@ -41,6 +41,7 @@ msgstr "ошибка даты в задаче"
msgid "no such appointment"
msgstr "задача отÑутÑтвует"
+#, fuzzy
msgid ""
"Usage:\n"
"calcurse [-D <directory>] [-C <directory>] [-c <calendar file>]\n"
@@ -50,6 +51,11 @@ msgid ""
"calcurse -h | -v | --status | -G | -P | -g | -i <file> | -x[<format>] | --"
"daemon"
msgstr ""
+"ИÑпользование:\n"
+"calcurse [-D ] [-C ] [-c ]\n"
+"calcurse -Q [--from ] [--to ] [--days ]\n"
+"calcurse -a | -d | -d | -n | -r[] | -s[] | -t[]\n"
+"calcurse -h | -v | --status | -G | -P | -g | -i | -x[] | --daemon"
msgid "Try `calcurse -h` for more information."
msgstr "Выполните 'calcurse -h' Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñправки."
@@ -59,8 +65,8 @@ msgid "calcurse %s -- text-based organizer\n"
msgstr "calcurse %s - текÑтовый органайзер\n"
#, fuzzy
-msgid "Copyright (c) 2004-2020 calcurse Development Team."
-msgstr "Copyright (c) 2004-2017 calcurse Development Team."
+msgid "Copyright (c) 2004-2023 calcurse Development Team."
+msgstr "Копирайт (c) 2004-2020 calcurse Development Team."
msgid "This is free software; see the source for copying conditions."
msgstr ""
@@ -68,7 +74,7 @@ msgstr ""
"Ñ Ð¸Ñходным кодом."
msgid "Operations in command line mode:"
-msgstr ""
+msgstr "Операции в режиме командной Ñтроки:"
msgid " -Q, --query Print items in a given query range"
msgstr ""
@@ -112,7 +118,7 @@ msgid " --search, -S <regexp> Match regular expression in queries"
msgstr ""
msgid "Consult the man page for details."
-msgstr ""
+msgstr "ПодробноÑти Ñмотрите в man-Ñтранице"
msgid "Miscellaneous:"
msgstr "Разное:"
@@ -130,10 +136,10 @@ msgid " -D, --datadir <dir> The data directory to use"
msgstr ""
msgid " -g, --gc Run the garbage collector"
-msgstr ""
+msgstr "-g, --gc ЗапуÑтить Ñборщик муÑора"
msgid " -h, --help Show this help text"
-msgstr ""
+msgstr "-h, --help Показать Ñту Ñправку"
msgid " -i, --import <file> Import iCal data from file"
msgstr ""
@@ -148,7 +154,7 @@ msgid " --status Display status of running instances"
msgstr ""
msgid " -v, --version Show version information"
-msgstr ""
+msgstr " -v, --version Показать информацию о верÑии"
msgid ""
" -x, --export[<format>] Export to stdout in ical (default) or pcal format"
@@ -185,7 +191,7 @@ msgid "calcurse is running in background (pid %d)\n"
msgstr "calcurse запущен в фоновом режиме (pid: %d)\n"
msgid "calcurse is not running"
-msgstr ""
+msgstr "calcurse не запущен"
msgid "completed tasks:\n"
msgstr "Выполненные задачи:\n"
@@ -232,7 +238,7 @@ msgstr "неверный диапазон дат: %s"
#, c-format
msgid "calcurse is running (pid = %d)"
-msgstr ""
+msgstr "calcurse запущен (pid = %d)"
#, c-format
msgid "invalid input date format: %s"
@@ -249,7 +255,7 @@ msgid "cannot specify a range and an end date"
msgstr "невозможно задать диапазон и конечную дату"
msgid "end date cannot come before start date"
-msgstr ""
+msgstr "ÐºÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ð´Ð°Ñ‚Ð° не может быть до даты начала"
msgid "Unable to find documentation."
msgstr "Ðевозможно найти документацию"
@@ -261,7 +267,7 @@ msgid "Data were saved/reloaded successfully"
msgstr ""
msgid "Save cancelled"
-msgstr ""
+msgstr "Сохранение отменено"
msgid "Data were already saved"
msgstr ""
@@ -388,10 +394,10 @@ msgid "(specifies the panel that is selected by default)"
msgstr "(Задаёт панель, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ активна по умолчанию)"
msgid "monthly"
-msgstr ""
+msgstr "ежемеÑÑчно"
msgid "weekly"
-msgstr ""
+msgstr "еженедельно"
msgid "(preferred calendar display)"
msgstr ""
@@ -441,12 +447,6 @@ msgstr "(yes/no) Подтверждение выхода из программы
msgid "(if set to YES, confirmation is required before deleting an event)"
msgstr "(yes/no) Подтверждение ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ñобытий"
-msgid "Monday"
-msgstr "Пн"
-
-msgid "Sunday"
-msgstr "Ð’Ñ"
-
msgid "(specifies the first day of week in the calendar view)"
msgstr "(указание первого Ð´Ð½Ñ Ð½ÐµÐ´ÐµÐ»Ð¸ в календаре)"
@@ -471,12 +471,19 @@ msgstr ""
msgid "(Format of the date displayed in the appointments panel)"
msgstr "(Формат даты, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶Ð°ÐµÑ‚ÑÑ Ð² панели задач)"
+#, fuzzy
+msgid "(Format of the time displayed in the appointments panel)"
+msgstr "(Формат даты, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶Ð°ÐµÑ‚ÑÑ Ð² панели задач)"
+
msgid "Enter a text string (an empty string for the default text)"
msgstr ""
msgid "Enter the date format (see 'man 3 strftime' for possible formats) "
msgstr "Задайте формат даты (Ñм. 'man 3 strftime' Ð´Ð»Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ‹Ñ… форматов)"
+msgid "Enter the time format (see 'man 3 strftime' for possible formats) "
+msgstr "Задайте формат времени (Ñм. 'man 3 strftime' Ð´Ð»Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ‹Ñ… форматов) "
+
msgid "Enter the date format: "
msgstr "Задайте формат даты: "
@@ -489,8 +496,8 @@ msgstr "ОÑновные наÑтройки"
msgid "Undefined option!"
msgstr "ÐÐµÐ¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ‘Ð½Ð½Ð°Ñ Ð½Ð°Ñтройка!"
-msgid "undefined"
-msgstr "неопределено"
+msgid "UNDEFINED"
+msgstr ""
msgid "keys configuration"
msgstr "ÐаÑтройка клавиш"
@@ -502,8 +509,9 @@ msgstr "Ðажмите клавишу, чтобы привÑзать её к:"
msgid "The key '%s' is already used for %s. Choose another one."
msgstr "Ключ '%s' уже иÑпользуетÑÑ Ð´Ð»Ñ %s. Выберите другой ключ."
-msgid "Some actions do not have any associated key bindings!"
-msgstr "Ðекоторые дейÑÑ‚Ð²Ð¸Ñ Ð½Ðµ привÑзаны к клавишам!"
+#, fuzzy
+msgid "Some actions are left undefined!"
+msgstr "параметр не уÑтановлен"
msgid ""
"Sorry, colors are not supported by your terminal\n"
@@ -608,6 +616,13 @@ msgstr "нехватка памÑти"
msgid "unknown ical type"
msgstr "неизвеÑтный тип ical"
+msgid "(empty)"
+msgstr ""
+
+#, fuzzy
+msgid "ical_store_event: out of memory"
+msgstr "xcalloc: out of memory"
+
msgid "need DTSTART to determine event type."
msgstr ""
@@ -631,6 +646,9 @@ msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð¼Ð°Ñка фильтра"
msgid "either until or count."
msgstr ""
+msgid "missing until value."
+msgstr ""
+
#, fuzzy
msgid "invalid until format."
msgstr "неверный формат ÑкÑпорта: %s"
@@ -660,61 +678,32 @@ msgstr ""
msgid "invalid exception."
msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñ‡Ð°Ñтота."
-#, fuzzy, c-format
+#, c-format
msgid "malformed %s line."
-msgstr "Ðеверное начальное времÑ."
+msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "malformed %s."
-msgstr "ОпиÑание: "
+msgstr ""
-#, fuzzy
msgid "malformed summary line."
-msgstr "Ðеверное начальное времÑ."
-
-msgid "malformed summary."
msgstr ""
-msgid "line break in summary."
+msgid "malformed summary."
msgstr ""
-msgid "could not retrieve item summary."
-msgstr "невозможно воÑÑтановить Ñуммарные запиÑи."
-
-msgid "item start date is not defined."
+#, fuzzy
+msgid "item start date not defined."
msgstr "Ð²Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð½Ðµ определено."
-msgid "multi-day event changed to one-day event"
-msgstr ""
-
-#, fuzzy, c-format
-msgid "Location: %s"
-msgstr " allocated in: %s\n"
-
-#, c-format
-msgid "Comment: %s"
-msgstr ""
-
-#, c-format
-msgid "rrule does not match start day (%s)."
-msgstr ""
-
-msgid "item could not be identified."
-msgstr "значение не может быть раÑпознано."
-
-#, fuzzy
msgid "malformed start time line."
-msgstr "Ðеверное начальное времÑ."
+msgstr ""
#, fuzzy
msgid "invalid or malformed event start time."
msgstr "невозможно воÑÑтановить Ð²Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° ÑобытиÑ."
#, fuzzy
-msgid "either end or duration."
-msgstr "Ðеверное Ð²Ñ€ÐµÐ¼Ñ Ð¸Ð»Ð¸ продолжительноÑÑ‚ÑŒ."
-
-#, fuzzy
msgid "invalid end time value type."
msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð°Ñ‚Ð° или времÑ."
@@ -729,16 +718,39 @@ msgid "end must be later than start."
msgstr ""
#, fuzzy
+msgid "either end or duration."
+msgstr "Ðеверное Ð²Ñ€ÐµÐ¼Ñ Ð¸Ð»Ð¸ продолжительноÑÑ‚ÑŒ."
+
msgid "malformed duration line."
-msgstr "опиÑание повреждено."
+msgstr ""
#, fuzzy
msgid "invalid duration."
msgstr "Ðеверное Ð²Ñ€ÐµÐ¼Ñ Ð¸Ð»Ð¸ продолжительноÑÑ‚ÑŒ."
-#, fuzzy
+msgid "exception date, but no recurrence rule."
+msgstr ""
+
+msgid "multi-day event changed to one-day event"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Location: %s"
+msgstr " allocated in: %s\n"
+
+#, c-format
+msgid "Comment: %s"
+msgstr ""
+
+#, c-format
+msgid "rrule does not match start day (%s)."
+msgstr ""
+
+msgid "item could not be identified."
+msgstr "значение не может быть раÑпознано."
+
msgid "only one description allowed."
-msgstr "опиÑание повреждено."
+msgstr ""
msgid "only one location allowed."
msgstr ""
@@ -746,6 +758,9 @@ msgstr ""
msgid "The ical file seems to be malformed. The end of item was not found."
msgstr "Файл ical Ñкорее вÑего повреждён. Ðе найдено окончание запиÑи."
+msgid "could not retrieve item summary."
+msgstr "невозможно воÑÑтановить Ñуммарные запиÑи."
+
msgid "item priority is invalid (must be between 0 and 9)."
msgstr "приоритет запиÑи в неверном формате (должно быть чиÑло между 0 и 9)"
@@ -844,37 +859,40 @@ msgstr ""
msgid "failed to open key file"
msgstr "ошибка Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° ключа"
-msgid ""
-"\n"
-"Too many errors while reading configuration file!\n"
-"Please backup your keys file, remove it from directory, and launch calcurse "
-"again.\n"
-msgstr ""
-"\n"
-"Обнаружены ошибки при чтении файла наÑтроек!\n"
-"Сделайте копию keys-файла, удалите его из каталога и запуÑтите calcurse "
-"Ñнова.\n"
-
msgid "Could not read key label"
msgstr "Ðевозможно раÑпознать клавишу"
-msgid "Key label not recognized"
+#, fuzzy, c-format
+msgid "Key label not recognized: \"%s\""
msgstr "Клавиша не опознана"
#, c-format
-msgid "Error reading key: \"%s\""
-msgstr "Ошибка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ¸: \"%s\""
+msgid "No keys assigned to \"%s\"."
+msgstr ""
-#, c-format
-msgid "\"%s\" assigned multiple times!"
+#, fuzzy, c-format
+msgid "Keyname not recognized: \"%s\""
+msgstr "Клавиша не опознана"
+
+#, fuzzy, c-format
+msgid "\"%s\" assigned twice: \"%s\"."
msgstr "\"%s\" определено множеÑтво времён!"
-msgid "There were some errors when loading keys file."
+#, c-format
+msgid ""
+"Action \"%s\" absent, but default key \"%s\" assigned to another action."
msgstr ""
-msgid "Too many errors while reading keys file, aborting..."
+msgid "Errors in the keys file."
+msgstr ""
+
+#, fuzzy
+msgid "Remove offending line(s) from the keys file, aborting..."
msgstr "Обнаружены ошибки при чтении keys-файла, отмена..."
+msgid "Some actions do not have any associated key bindings!"
+msgstr "Ðекоторые дейÑÑ‚Ð²Ð¸Ñ Ð½Ðµ привÑзаны к клавишам!"
+
#, c-format
msgid "FATAL ERROR: could not create %s: %s\n"
msgstr "ФÐТÐЛЬÐÐЯ ОШИБКÐ: невозможно Ñоздать %s: %s\n"
@@ -1010,6 +1028,9 @@ msgstr "Ð’Ñтавить"
msgid "Chg Win"
msgstr "Панель"
+msgid "Prev Win"
+msgstr ""
+
msgid "Import"
msgstr "Импорт"
@@ -1195,6 +1216,10 @@ msgstr "Ð’Ñтавить запиÑÑŒ в текущую позицию"
msgid "Select next panel in calcurse main screen."
msgstr "Выбрать Ñлед. панель на главном Ñкране calcurse"
+#, fuzzy
+msgid "Select previous panel in calcurse main screen."
+msgstr "Выбрать Ñлед. панель на главном Ñкране calcurse"
+
msgid "Import data from an external file."
msgstr "Импортированть данные Ñ Ð²Ð½ÐµÑˆÐ½ÐµÐ³Ð¾ файла."
@@ -1317,8 +1342,8 @@ msgid "FATAL ERROR: null file pointer."
msgstr "FATAL ERROR: null file pointer."
#, c-format
-msgid "When adding default key for \"%s\", \"%s\" was already assigned!"
-msgstr "При назначении клав. \"%s\", \"%s\" уже была назначена!"
+msgid "Default key(s) assigned to %d action%s."
+msgstr ""
msgid "xmalloc: zero size"
msgstr "xmalloc: zero size"
@@ -1410,12 +1435,6 @@ msgstr " unfreed blocks: %u\n"
msgid "Warning: could not open %s, Aborting..."
msgstr "Внимание: невозможно открыть %s, Завершение..."
-msgid "error while launching command: could not fork"
-msgstr "ошибка во Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿ÑƒÑка команды: невозможно разделитьÑÑ (fork)"
-
-msgid "error while launching command"
-msgstr "ошибка во Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿ÑƒÑка команды"
-
msgid "(if set to YES, notify-bar will be displayed)"
msgstr "(ЕÑли выбрано yes, будет выводитÑÑ Ð¾ÐºÐ½Ð¾ уведомлениÑ)"
@@ -1442,9 +1461,6 @@ msgstr "(ЗапуÑтить в фоновом режиме, Ð´Ð»Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð
msgid "(Log activity when running in background)"
msgstr "(Лог активен во Ð²Ñ€ÐµÐ¼Ñ Ñ„Ð¾Ð½Ð¾Ð²Ð¾Ð³Ð¾ режима)"
-msgid "Enter the time format (see 'man 3 strftime' for possible formats) "
-msgstr "Задайте формат времени (Ñм. 'man 3 strftime' Ð´Ð»Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ‹Ñ… форматов) "
-
msgid "Enter the number of seconds (0 not to be warned before an appointment)"
msgstr "Введите количеÑтво Ñекунд (0 - отмена Ð¾Ð¿Ð¾Ð²ÐµÑ‰ÐµÐ½Ð¸Ñ Ð´Ð¾ ÑобытиÑ)"
@@ -1537,7 +1553,7 @@ msgstr ""
#, c-format
msgid "Enter start date [%s] and/or time ([hh:mm] or [hhmm]):"
-msgstr ""
+msgstr "Введите дату начала [%s] и/или Ð²Ñ€ÐµÐ¼Ñ ([hh:mm] or [hhmm]):"
msgid "Press [Enter] to continue"
msgstr "Ðажмите [Enter]"
@@ -1578,7 +1594,7 @@ msgid "Exception days:"
msgstr ""
msgid "Invalid date format - try again:."
-msgstr ""
+msgstr "Ðеверный формат даты - попробуйте Ñнова:."
msgid "Limit repetition to listed days."
msgstr ""
@@ -1633,7 +1649,7 @@ msgstr ""
#, fuzzy
msgid "Invalid format - try again."
-msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð°Ñ‚Ð° или времÑ."
+msgstr "Ðеверный формат даты - попробуйте Ñнова:."
#, fuzzy
msgid "Press any key to continue."
@@ -1646,12 +1662,13 @@ msgstr ""
msgid "day"
msgstr "СегоднÑ"
+#, fuzzy
msgid "week"
-msgstr ""
+msgstr "еженедельно"
#, fuzzy
msgid "month"
-msgstr "(m)ежемеÑÑчно"
+msgstr "ежемеÑÑчно"
msgid "year"
msgstr ""
@@ -1854,7 +1871,7 @@ msgstr "ИÑпользовать: calcurse-upgrade [-h|-v|--config <file>]"
#, fuzzy
msgid ""
"\n"
-"Copyright (c) 2004-2020 calcurse Development Team.\n"
+"Copyright (c) 2004-2023 calcurse Development Team.\n"
"This is free software; see the source for copying conditions.\n"
msgstr ""
"Это Ñвободное ПО. Ð”Ð»Ñ Ð¾Ð·Ð½Ð°ÐºÐ¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ñ ÑƒÑловиÑми ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐŸÐž, ознакомьтеÑÑŒ "
@@ -1906,6 +1923,34 @@ msgstr "Обновление конфигурации..."
msgid "Remove temporary backup..."
msgstr "Удалить временный архивный файл..."
+#~ msgid "Monday"
+#~ msgstr "Пн"
+
+#~ msgid "Sunday"
+#~ msgstr "Ð’Ñ"
+
+#~ msgid "undefined"
+#~ msgstr "неопределено"
+
+#~ msgid ""
+#~ "\n"
+#~ "Too many errors while reading configuration file!\n"
+#~ "Please backup your keys file, remove it from directory, and launch "
+#~ "calcurse again.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Обнаружены ошибки при чтении файла наÑтроек!\n"
+#~ "Сделайте копию keys-файла, удалите его из каталога и запуÑтите calcurse "
+#~ "Ñнова.\n"
+
+#, c-format
+#~ msgid "Error reading key: \"%s\""
+#~ msgstr "Ошибка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ¸: \"%s\""
+
+#, c-format
+#~ msgid "When adding default key for \"%s\", \"%s\" was already assigned!"
+#~ msgstr "При назначении клав. \"%s\", \"%s\" уже была назначена!"
+
#~ msgid ""
#~ "(if set to YES, messages about loaded and saved data will be displayed)"
#~ msgstr "(yes/no) Отображение ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾ загрузке и Ñохранении данных"
@@ -1916,10 +1961,6 @@ msgstr "Удалить временный архивный файл..."
#~ msgid "recurrence frequency not recognized."
#~ msgstr "Ñ€ÐµÐºÑƒÑ€Ñ€ÐµÐ½Ñ‚Ð½Ð°Ñ Ñ‡Ð°Ñтота не раÑпознана"
-#, fuzzy
-#~ msgid "empty description."
-#~ msgstr "ОпиÑание: "
-
#~ msgid "item has a negative duration."
#~ msgstr "значение имеет отрицательную продолжительноÑÑ‚ÑŒ."
@@ -1933,6 +1974,12 @@ msgstr "Удалить временный архивный файл..."
#~ msgid "Data files found. Data will be loaded now."
#~ msgstr "Данные найдены и будут загружены"
+#~ msgid "error while launching command: could not fork"
+#~ msgstr "ошибка во Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿ÑƒÑка команды: невозможно разделитьÑÑ (fork)"
+
+#~ msgid "error while launching command"
+#~ msgstr "ошибка во Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿ÑƒÑка команды"
+
#~ msgid "unknown repetition type"
#~ msgstr "неизвеÑтный тип повторениÑ"
@@ -1945,6 +1992,9 @@ msgstr "Удалить временный архивный файл..."
#~ msgid "(w)eekly"
#~ msgstr "(w)еженедельно"
+#~ msgid "(m)onthly"
+#~ msgstr "(m)ежемеÑÑчно"
+
#~ msgid "(y)early"
#~ msgstr "(y)ежегодно"
@@ -1973,18 +2023,3 @@ msgstr "Удалить временный архивный файл..."
#~ msgid "wrong item type"
#~ msgstr "неправильный тип запиÑи"
-
-#~ msgid "recurrence rule malformed."
-#~ msgstr "рекуррентные правила повреждены."
-
-#~ msgid "recurrence exception dates malformed."
-#~ msgstr "рекурентные ÑÐ¾Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ð´Ð°Ñ‚ повреждены."
-
-#~ msgid "could not get entire item description."
-#~ msgstr "невозможно получить опиÑание полноÑтью."
-
-#~ msgid "event start time malformed."
-#~ msgstr "Ð²Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð½ÐµÐ²ÐµÑ€Ð½Ð¾ оформлено"
-
-#~ msgid "event end time malformed."
-#~ msgstr "Ñобытие и Ð²Ñ€ÐµÐ¼Ñ Ð½ÐµÐ²ÐµÑ€Ð½Ð¾ оформлены"
diff --git a/scripts/calcurse-upgrade.sh.in b/scripts/calcurse-upgrade.sh.in
index c9c9c78..b6a7438 100644
--- a/scripts/calcurse-upgrade.sh.in
+++ b/scripts/calcurse-upgrade.sh.in
@@ -15,7 +15,7 @@ if [ "$#" -gt 0 ]; then
elif [ "$1" = "-v" -o "$1" = "--version" ]; then
echo "calcurse-upgrade @PACKAGE_VERSION@"
echo "$(gettext "
-Copyright (c) 2004-2020 calcurse Development Team.
+Copyright (c) 2004-2023 calcurse Development Team.
This is free software; see the source for copying conditions.
")"
else
diff --git a/src/apoint.c b/src/apoint.c
index 4cb77f6..e138e5e 100644
--- a/src/apoint.c
+++ b/src/apoint.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
@@ -42,6 +42,8 @@
#include "calcurse.h"
#include "sha1.h"
+#define APPT_TIME_LENGTH 25
+
llist_ts_t alist_p;
void apoint_free(struct apoint *apt)
@@ -134,16 +136,14 @@ void apoint_sec2str(struct apoint *o, time_t day, char *start, char *end)
} else {
t = o->start;
localtime_r(&t, &lt);
- snprintf(start, HRMIN_SIZE, "%02u:%02u", lt.tm_hour,
- lt.tm_min);
+ strftime(start, APPT_TIME_LENGTH, conf.timefmt, &lt);
}
if (o->start + o->dur > day + DAYLEN(day)) {
strncpy(end, "..:..", 6);
} else {
t = o->start + o->dur;
localtime_r(&t, &lt);
- snprintf(end, HRMIN_SIZE, "%02u:%02u", lt.tm_hour,
- lt.tm_min);
+ strftime(end, APPT_TIME_LENGTH, conf.timefmt, &lt);
}
}
diff --git a/src/args.c b/src/args.c
index abcc70a..57cbe63 100644
--- a/src/args.c
+++ b/src/args.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
@@ -112,7 +112,7 @@ static void version_arg(void)
{
printf(_("calcurse %s -- text-based organizer\n"), VERSION);
putchar('\n');
- printf("%s\n", _("Copyright (c) 2004-2020 calcurse Development Team."));
+ printf("%s\n", _("Copyright (c) 2004-2023 calcurse Development Team."));
printf("%s\n", _("This is free software; see the source for copying conditions."));
}
@@ -428,7 +428,7 @@ int parse_args(int argc, char **argv)
const char *cfile = NULL, *confdir = NULL;
char *ifile = NULL;
- int non_interactive = 1;
+ int ret, non_interactive = 1;
int ch, cpid, type;
regex_t reg;
char buf[BUFSIZ];
@@ -963,10 +963,12 @@ int parse_args(int argc, char **argv)
fmt_apt = fmt_rapt = fmt_ev = fmt_rev = NULL;
fmt_todo = NULL;
}
- io_import_data(IO_IMPORT_ICAL, ifile, fmt_ev, fmt_rev, fmt_apt,
- fmt_rapt, fmt_todo);
+ ret = io_import_data(IO_IMPORT_ICAL, ifile, fmt_ev, fmt_rev,
+ fmt_apt, fmt_rapt, fmt_todo);
io_save_apts(path_apts);
io_save_todo(path_todo);
+ if (!ret)
+ exit_calcurse(EXIT_FAILURE);
} else if (export) {
io_check_file(path_apts);
io_check_file(path_todo);
diff --git a/src/calcurse.c b/src/calcurse.c
index 3083f86..c89d1dd 100644
--- a/src/calcurse.c
+++ b/src/calcurse.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
@@ -41,37 +41,6 @@
#define HANDLE_KEY(key, fn) case key: fn(); break;
int count, reg;
-/*
- * Store events and appointments for a range of days in the day vector -
- * beginning with the selected day - and load them into the APP listbox. If no
- * day-change occurs, reset the selected APP item and with it the selected day,
- * thereby storing and loading the same range of days.
- */
-static void do_storage(int day_changed)
-{
- int pre_sel;
- /*
- * Save the selected item before rebuilding the day vector -
- * unless a preselection is already set.
- */
- if (!(pre_sel = day_check_sel_data()))
- day_set_sel_data(ui_day_get_sel());
-
- if (!day_changed)
- ui_day_sel_reset();
-
- /* The day_items vector. */
- day_store_items(get_slctd_day(), 1, day_get_days());
- /* The APP listbox. */
- ui_day_load_items();
-
- if (day_changed && !pre_sel)
- ui_day_sel_reset();
- else
- ui_day_find_sel();
-
- day_set_sel_data(&empty_day);
-}
static inline void key_generic_change_view(void)
{
@@ -80,6 +49,13 @@ static inline void key_generic_change_view(void)
wins_update(FLAG_ALL);
}
+static inline void key_generic_prev_view(void)
+{
+ wins_reset_status_page();
+ wins_slctd_prev();
+ wins_update(FLAG_ALL);
+}
+
static inline void key_generic_other_cmd(void)
{
wins_other_status_page();
@@ -91,7 +67,7 @@ static inline void key_generic_goto(void)
wins_erase_status_bar();
ui_calendar_set_current_date();
ui_calendar_change_day(conf.input_datefmt);
- do_storage(1);
+ day_do_storage(1);
wins_update(FLAG_CAL | FLAG_APP | FLAG_STA);
}
@@ -100,7 +76,7 @@ static inline void key_generic_goto_today(void)
wins_erase_status_bar();
ui_calendar_set_current_date();
ui_calendar_goto_today();
- do_storage(1);
+ day_do_storage(1);
wins_update(FLAG_CAL | FLAG_APP | FLAG_STA);
}
@@ -118,14 +94,14 @@ static inline void key_generic_config_menu(void)
wins_erase_status_bar();
wins_reset_status_page();
custom_config_main();
- do_storage(0);
+ day_do_storage(0);
wins_update(FLAG_ALL);
}
static inline void key_generic_add_appt(void)
{
ui_day_item_add();
- do_storage(0);
+ day_do_storage(0);
wins_update(FLAG_CAL | FLAG_APP | FLAG_STA);
}
@@ -141,7 +117,7 @@ static inline void key_add_item(void)
case APP:
case CAL:
ui_day_item_add();
- do_storage(0);
+ day_do_storage(0);
wins_update(FLAG_CAL | FLAG_APP | FLAG_STA);
break;
case TOD:
@@ -157,7 +133,7 @@ static inline void key_edit_item(void)
{
if (wins_slctd() == APP && !event_dummy(ui_day_get_sel())) {
ui_day_item_edit();
- do_storage(0);
+ day_do_storage(0);
wins_update(FLAG_CAL | FLAG_APP | FLAG_STA);
} else if (wins_slctd() == TOD) {
ui_todo_edit();
@@ -169,7 +145,7 @@ static inline void key_del_item(void)
{
if (wins_slctd() == APP && !event_dummy(ui_day_get_sel())) {
ui_day_item_delete(reg);
- do_storage(0);
+ day_do_storage(0);
wins_update(FLAG_CAL | FLAG_APP | FLAG_STA);
} else if (wins_slctd() == TOD) {
ui_todo_delete();
@@ -187,7 +163,7 @@ static inline void key_generic_paste(void)
{
if (wins_slctd() == APP) {
ui_day_item_paste(reg);
- do_storage(0);
+ day_do_storage(0);
wins_update(FLAG_CAL | FLAG_APP);
}
}
@@ -196,7 +172,7 @@ static inline void key_repeat_item(void)
{
if (wins_slctd() == APP && !event_dummy(ui_day_get_sel())) {
ui_day_item_repeat();
- do_storage(0);
+ day_do_storage(0);
wins_update(FLAG_CAL | FLAG_APP | FLAG_STA);
}
}
@@ -205,7 +181,7 @@ static inline void key_flag_item(void)
{
if (wins_slctd() == APP && !event_dummy(ui_day_get_sel())) {
ui_day_flag();
- do_storage(0);
+ day_do_storage(0);
wins_update(FLAG_APP);
} else if (wins_slctd() == TOD) {
ui_todo_flag();
@@ -244,7 +220,7 @@ static inline void key_edit_note(void)
{
if (wins_slctd() == APP && !event_dummy(ui_day_get_sel())) {
ui_day_edit_note();
- do_storage(0);
+ day_do_storage(0);
} else if (wins_slctd() == TOD) {
ui_todo_edit_note();
}
@@ -284,7 +260,7 @@ static inline void key_generic_save(void)
if (ret == IO_SAVE_RELOAD) {
ui_todo_load_items();
ui_todo_sel_reset();
- do_storage(0);
+ day_do_storage(0);
notify_check_next_app(1);
ui_calendar_monthly_view_cache_set_invalid();
}
@@ -319,7 +295,7 @@ static inline void key_generic_reload(void)
ret == IO_RELOAD_MERGE) {
ui_todo_load_items();
ui_todo_sel_reset();
- do_storage(0);
+ day_do_storage(0);
notify_check_next_app(1);
ui_calendar_monthly_view_cache_set_invalid();
}
@@ -349,7 +325,7 @@ static inline void key_generic_import(void)
wins_erase_status_bar();
io_import_data(IO_IMPORT_ICAL, NULL, NULL, NULL, NULL, NULL, NULL);
ui_calendar_monthly_view_cache_set_invalid();
- do_storage(0);
+ day_do_storage(0);
ui_todo_load_items();
wins_update(FLAG_ALL);
}
@@ -374,14 +350,14 @@ static inline void key_generic_export()
break;
}
- do_storage(0);
+ day_do_storage(0);
wins_update(FLAG_ALL);
}
static inline void key_generic_prev_day(void)
{
ui_calendar_move(DAY_PREV, count);
- do_storage(1);
+ day_do_storage(1);
wins_update(FLAG_CAL | FLAG_APP);
}
@@ -394,7 +370,7 @@ static inline void key_move_left(void)
static inline void key_generic_next_day(void)
{
ui_calendar_move(DAY_NEXT, count);
- do_storage(1);
+ day_do_storage(1);
wins_update(FLAG_CAL | FLAG_APP);
}
@@ -407,7 +383,7 @@ static inline void key_move_right(void)
static inline void key_generic_prev_week(void)
{
ui_calendar_move(WEEK_PREV, count);
- do_storage(1);
+ day_do_storage(1);
wins_update(FLAG_CAL | FLAG_APP);
}
@@ -418,7 +394,7 @@ static inline void key_move_up(void)
} else if (wins_slctd() == APP) {
if (!ui_day_sel_move(-1)) {
ui_calendar_move(DAY_PREV, 1);
- do_storage(1);
+ day_do_storage(1);
ui_day_sel_dayend();
}
wins_update(FLAG_APP | FLAG_CAL);
@@ -431,7 +407,7 @@ static inline void key_move_up(void)
static inline void key_generic_next_week(void)
{
ui_calendar_move(WEEK_NEXT, count);
- do_storage(1);
+ day_do_storage(1);
wins_update(FLAG_CAL | FLAG_APP);
}
@@ -442,7 +418,7 @@ static inline void key_move_down(void)
} else if (wins_slctd() == APP) {
if (!ui_day_sel_move(1)) {
ui_calendar_move(DAY_PREV, day_get_days() - 2);
- do_storage(1);
+ day_do_storage(1);
ui_day_sel_daybegin(day_get_days() - 1);
}
wins_update(FLAG_APP | FLAG_CAL);
@@ -455,28 +431,28 @@ static inline void key_move_down(void)
static inline void key_generic_prev_month(void)
{
ui_calendar_move(MONTH_PREV, count);
- do_storage(1);
+ day_do_storage(1);
wins_update(FLAG_CAL | FLAG_APP);
}
static inline void key_generic_next_month(void)
{
ui_calendar_move(MONTH_NEXT, count);
- do_storage(1);
+ day_do_storage(1);
wins_update(FLAG_CAL | FLAG_APP);
}
static inline void key_generic_prev_year(void)
{
ui_calendar_move(YEAR_PREV, count);
- do_storage(1);
+ day_do_storage(1);
wins_update(FLAG_CAL | FLAG_APP);
}
static inline void key_generic_next_year(void)
{
ui_calendar_move(YEAR_NEXT, count);
- do_storage(1);
+ day_do_storage(1);
wins_update(FLAG_CAL | FLAG_APP);
}
@@ -484,7 +460,7 @@ static inline void key_start_of_week(void)
{
if (wins_slctd() == CAL) {
ui_calendar_move(WEEK_START, count);
- do_storage(1);
+ day_do_storage(1);
wins_update(FLAG_CAL | FLAG_APP);
}
}
@@ -493,7 +469,7 @@ static inline void key_end_of_week(void)
{
if (wins_slctd() == CAL) {
ui_calendar_move(WEEK_END, count);
- do_storage(1);
+ day_do_storage(1);
wins_update(FLAG_CAL | FLAG_APP);
}
}
@@ -623,8 +599,12 @@ static inline void key_generic_cmd(void)
warnbox(error_msg);
goto cleanup;
}
- day = date2sec(*ui_calendar_get_slctd_day(), 0, 0);
item = ui_day_get_sel();
+ /*
+ * The selected day need not be the (item) start day
+ * for multi-day occurrences.
+ */
+ day = DAY(item->start);
if (item->type == RECUR_EVNT) {
rev = item->item.rev;
more = recur_next_occurrence(rev->day, -1, rev->rpt, &rev->exc,
@@ -646,7 +626,7 @@ static inline void key_generic_cmd(void)
item->order = next;
ui_calendar_set_slctd_day(sec2date(next));
day_set_sel_data(item);
- do_storage(1);
+ day_do_storage(1);
valid = 1;
}
@@ -668,7 +648,7 @@ static inline void key_generic_cmd(void)
* The selected day need not be the (item) start day
* for multi-day occurrences.
*/
- day = update_time_in_date(item->start, 0, 0);
+ day = DAY(item->start);
if (item->type == RECUR_EVNT) {
rev = item->item.rev;
more = recur_prev_occurrence(rev->day, -1, rev->rpt,
@@ -691,7 +671,7 @@ static inline void key_generic_cmd(void)
item->order = prev;
ui_calendar_set_slctd_day(sec2date(prev));
day_set_sel_data(item);
- do_storage(1);
+ day_do_storage(1);
valid = 1;
}
@@ -801,7 +781,7 @@ int main(int argc, char **argv)
*/
wins_wrefresh(win[KEY].p);
ui_calendar_monthly_view_cache_set_invalid();
- do_storage(1);
+ day_do_storage(1);
ui_todo_load_items();
ui_todo_sel_reset();
wins_update(FLAG_ALL);
@@ -821,7 +801,7 @@ int main(int argc, char **argv)
que_show();
if (conf.systemevents) {
que_save();
- do_storage(0);
+ day_do_storage(0);
}
wins_update(FLAG_ALL);
que_rem();
@@ -831,7 +811,7 @@ int main(int argc, char **argv)
resize = 0;
wins_reset();
if (conf.multiple_days) {
- do_storage(0);
+ day_do_storage(0);
wins_update(FLAG_APP);
}
}
@@ -847,6 +827,7 @@ int main(int argc, char **argv)
wtimeout(win[KEY].p, -1);
switch (key) {
HANDLE_KEY(KEY_GENERIC_CHANGE_VIEW, key_generic_change_view);
+ HANDLE_KEY(KEY_GENERIC_PREV_VIEW, key_generic_prev_view);
HANDLE_KEY(KEY_GENERIC_OTHER_CMD, key_generic_other_cmd);
HANDLE_KEY(KEY_GENERIC_GOTO, key_generic_goto);
HANDLE_KEY(KEY_GENERIC_GOTO_TODAY, key_generic_goto_today);
diff --git a/src/calcurse.h b/src/calcurse.h
index 763264d..8322416 100644
--- a/src/calcurse.h
+++ b/src/calcurse.h
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
@@ -111,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
@@ -142,9 +139,11 @@
*/
#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
@@ -153,7 +152,7 @@
* The argument (d) is the "Sunday"-numbering of member tm_wday in struct tm.
*/
#define WDAY(d) \
- (ui_calendar_week_begins_on_monday() ? ((d ? d : WEEKINDAYS) - 1) : d)
+ (modify_wday(d, -ui_calendar_get_wday_start()))
/* Key definitions. */
#define CTRLVAL 0x1F
@@ -304,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 {
@@ -336,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.
@@ -513,8 +517,8 @@ struct io_file {
char *name;
};
-/* Available keys. */
-enum key {
+/* Virtual keys. */
+enum vkey {
KEY_GENERIC_CANCEL,
KEY_GENERIC_SELECT,
KEY_GENERIC_CREDITS,
@@ -525,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,
@@ -564,7 +569,7 @@ enum key {
KEY_RAISE_PRIORITY,
KEY_LOWER_PRIORITY,
- NBKEYS,
+ NBVKEYS,
KEY_UNDEF,
/* Non-configurable, context sensitive key bindings. */
@@ -669,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;
};
@@ -808,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);
@@ -854,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 *);
@@ -924,7 +929,7 @@ unsigned io_file_exists(const char *);
int io_check_file(const char *);
int io_check_data_files(void);
void io_export_data(enum export_type, int);
-void io_import_data(enum import_type, 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 *);
@@ -936,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);
@@ -946,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 *,
@@ -1230,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);
@@ -1250,9 +1258,9 @@ 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 *);
@@ -1325,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);
diff --git a/src/config.c b/src/config.c
index f621320..4e0f7db 100644
--- a/src/config.c
+++ b/src/config.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
@@ -36,6 +36,8 @@
#include <ctype.h>
#include <unistd.h>
+#include <string.h>
+#include <strings.h>
#include "calcurse.h"
@@ -109,6 +111,7 @@ static const struct confvar confmap[] = {
{"format.inputdate", config_parse_input_datefmt, config_serialize_input_datefmt, NULL},
{"format.notifydate", CONFIG_HANDLER_STR(nbar.datefmt)},
{"format.notifytime", CONFIG_HANDLER_STR(nbar.timefmt)},
+ {"format.appointmenttime", CONFIG_HANDLER_STR(conf.timefmt)},
{"format.outputdate", config_parse_output_datefmt, config_serialize_output_datefmt, NULL},
{"format.dayheading", CONFIG_HANDLER_STR(conf.day_heading)},
{"general.autogc", CONFIG_HANDLER_BOOL(conf.auto_gc)},
@@ -260,14 +263,16 @@ static int config_parse_default_panel(void *dummy, const char *val)
static int config_parse_first_day_of_week(void *dummy, const char *val)
{
- if (!strcmp(val, "monday"))
- ui_calendar_set_first_day_of_week(MONDAY);
- else if (!strcmp(val, "sunday"))
- ui_calendar_set_first_day_of_week(SUNDAY);
- else
- return 0;
+ int i;
- return 1;
+ for (i = 0; i < WEEKINDAYS; i++) {
+ if(!strcasecmp(val, get_wday_default_string(i))) {
+ ui_calendar_set_first_day_of_week(i);
+ return 1;
+ }
+ }
+
+ return 0;
}
static int config_parse_color_theme(void *dummy, const char *val)
@@ -467,10 +472,9 @@ static int config_serialize_default_panel(char **buf, void *dummy)
static int config_serialize_first_day_of_week(char **buf, void *dummy)
{
- if (ui_calendar_week_begins_on_monday())
- *buf = mem_strdup("monday");
- else
- *buf = mem_strdup("sunday");
+ *buf = mem_strdup(get_wday_default_string(ui_calendar_get_wday_start()));
+ /* now stores string with uppercase first letter, changing to lower */
+ **buf = tolower(**buf);
return 1;
}
diff --git a/src/custom.c b/src/custom.c
index 0e5e554..2cd385c 100644
--- a/src/custom.c
+++ b/src/custom.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
@@ -38,6 +38,7 @@
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
+#include <langinfo.h>
#include "calcurse.h"
@@ -545,6 +546,7 @@ enum {
INPUT_DATE_FMT,
HEADING_POS,
DAY_HEADING_FMT,
+ APPOINTMENT_TIME_FMT,
NB_OPTIONS
};
@@ -573,7 +575,8 @@ static void print_general_option(int i, WINDOW *win, int y, int hilt, void *cb_d
"format.outputdate = ",
"format.inputdate = ",
"appearance.headingposition = ",
- "format.dayheading = "
+ "format.dayheading = ",
+ "format.appointmenttime = "
};
const char *panel;
const char *position;
@@ -700,8 +703,7 @@ static void print_general_option(int i, WINDOW *win, int y, int hilt, void *cb_d
case FIRST_DAY_OF_WEEK:
custom_apply_attr(win, ATTR_HIGHEST);
mvwaddstr(win, y, XPOS + strlen(opt[FIRST_DAY_OF_WEEK]),
- ui_calendar_week_begins_on_monday()? _("Monday") :
- _("Sunday"));
+ nl_langinfo(DAY_1 + ui_calendar_get_wday_start()));
custom_remove_attr(win, ATTR_HIGHEST);
mvwaddstr(win, y + 1, XPOS,
_("(specifies the first day of week in the calendar view)"));
@@ -746,6 +748,14 @@ static void print_general_option(int i, WINDOW *win, int y, int hilt, void *cb_d
mvwaddstr(win, y + 1, XPOS,
_("(Format of the date displayed in the appointments panel)"));
break;
+ case APPOINTMENT_TIME_FMT:
+ custom_apply_attr(win, ATTR_HIGHEST);
+ mvwaddstr(win, y, XPOS + strlen(opt[APPOINTMENT_TIME_FMT]),
+ conf.timefmt);
+ custom_remove_attr(win, ATTR_HIGHEST);
+ mvwaddstr(win, y + 1, XPOS,
+ _("(Format of the time displayed in the appointments panel)"));
+ break;
}
if (hilt)
@@ -771,6 +781,8 @@ static void general_option_edit(int i)
_("Enter a text string (an empty string for the default text)");
const char *output_datefmt_str =
_("Enter the date format (see 'man 3 strftime' for possible formats) ");
+ const char *output_timefmt_str =
+ _("Enter the time format (see 'man 3 strftime' for possible formats) ");
const char *input_datefmt_prefix = _("Enter the date format: ");
const char *periodic_save_str =
_("Enter the delay, in minutes, between automatic saves (0 to disable) ");
@@ -893,6 +905,15 @@ static void general_option_edit(int i)
conf.day_heading[BUFSIZ - 1] = '\0';
}
break;
+ case APPOINTMENT_TIME_FMT:
+ status_mesg(output_timefmt_str, "");
+ strncpy(buf, conf.timefmt, BUFSIZ);
+ buf[BUFSIZ - 1] = '\0';
+ if (updatestring(win[STA].p, &buf, 0, 1) == 0) {
+ strncpy(conf.timefmt, buf, BUFSIZ);
+ conf.timefmt[BUFSIZ - 1] = '\0';
+ }
+ break;
}
mem_free(buf);
@@ -975,10 +996,11 @@ print_keys_bindings(WINDOW * win, int selected_row, int selected_elm,
const int XPOS = 1;
const int EQUALPOS = 23;
const int KEYPOS = 25;
- int noelm, action, y;
+ int noelm, action, y, pos;
+ const char *key = NULL;
noelm = y = 0;
- for (action = 0; action < NBKEYS; action++) {
+ for (action = 0; action < NBVKEYS; action++) {
char *actionstr;
int nbkeys;
@@ -990,18 +1012,15 @@ print_keys_bindings(WINDOW * win, int selected_row, int selected_elm,
mem_free(actionstr);
mvwaddstr(win, y, EQUALPOS, "=");
if (nbkeys == 0)
- mvwaddstr(win, y, KEYPOS, _("undefined"));
+ mvwaddstr(win, y, KEYPOS, _("UNDEFINED"));
if (action == selected_row)
custom_remove_attr(win, ATTR_HIGHEST);
if (nbkeys > 0) {
if (action == selected_row) {
- const char *key;
- int pos;
-
+ /* Elements may have been added or deleted. */
+ wclrtoeol(win);
pos = KEYPOS;
- while ((key =
- keys_action_nkey(action,
- noelm)) != NULL) {
+ while ((key = keys_action_nkey(action, noelm))) {
if (noelm == selected_elm)
print_key_incolor(win, key,
y, pos);
@@ -1012,8 +1031,9 @@ print_keys_bindings(WINDOW * win, int selected_row, int selected_elm,
pos += utf8_strwidth((char *)key) + 1;
}
} else {
- mvwaddstr(win, y, KEYPOS,
- keys_action_allkeys(action));
+ key = keys_action_allkeys(action);
+ mvwaddstr(win, y, KEYPOS, key);
+ mem_free((char *)key);
}
}
y += yoff;
@@ -1045,9 +1065,11 @@ void custom_keys_config(void)
const int LABELLINES = 3;
clear();
- nbdisplayed = ((notify_bar() ? row - 3 : row - 2) - LABELLINES) / LINESPERKEY;
- wins_scrollwin_init(&kwin, 0, 0, notify_bar() ? row - 3 : row - 2, col, _("keys configuration"));
- wins_scrollwin_set_pad(&kwin, NBKEYS * LINESPERKEY);
+ nbdisplayed = ((notify_bar() ? row - 3 : row - 2) -
+ LABELLINES) / LINESPERKEY;
+ wins_scrollwin_init(&kwin, 0, 0, notify_bar() ? row - 3 : row - 2, col,
+ _("keys configuration"));
+ wins_scrollwin_set_pad(&kwin, NBVKEYS * LINESPERKEY);
wins_scrollwin_draw_deco(&kwin, 0);
custom_keys_config_bar();
selrow = selelm = 0;
@@ -1072,7 +1094,7 @@ void custom_keys_config(void)
}
break;
case KEY_MOVE_DOWN:
- if (selrow < NBKEYS - 1) {
+ if (selrow < NBVKEYS - 1) {
selrow++;
selelm = 0;
if (selrow == lastrow) {
@@ -1103,7 +1125,7 @@ void custom_keys_config(void)
keys_get_label(selrow), 0);
for (;;) {
ch = keys_wgetch(grabwin);
- enum key action = keys_get_action(ch);
+ enum vkey action = keys_get_action(ch);
/* Is the key already used by this action? */
if (action == selrow)
break;
@@ -1142,10 +1164,8 @@ void custom_keys_config(void)
selelm--;
break;
case KEY_GENERIC_QUIT:
- if (keys_check_missing_bindings() != 0) {
- WARN_MSG(_("Some actions do not have any associated "
- "key bindings!"));
- }
+ if (keys_check_undefined())
+ WARN_MSG(_("Some actions are left undefined!"));
wins_scrollwin_delete(&kwin);
return;
}
@@ -1222,7 +1242,7 @@ void custom_config_main(void)
old_layout = wins_layout();
custom_layout_config();
if (wins_layout() != old_layout)
- wins_reset();
+ wins_resize();
break;
case 'G':
case 'g':
@@ -1248,7 +1268,11 @@ void custom_config_main(void)
resize = 0;
wins_reset();
}
-
+
+ /* needed to update app list */
+ day_do_storage(0);
+
+ /* wins_update(FLAG_ALL), but with custom bindings */
wins_set_bindings(bindings, ARRAY_SIZE(bindings));
wins_update_border(FLAG_ALL);
wins_update_panels(FLAG_ALL);
diff --git a/src/day.c b/src/day.c
index 5bf84c4..78f4acf 100644
--- a/src/day.c
+++ b/src/day.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
@@ -58,7 +58,7 @@ static struct day_item sel_data = { 0, 0, 0, {NULL}};
/*
* Save the item to become the selected APP item.
- * Public function used to override the setting in do_storage().
+ * Public function used to override the setting in day_do_storage().
*/
int day_set_sel_data(struct day_item *d)
{
@@ -100,7 +100,7 @@ int day_sel_index(void)
/* If still not found, stay on the same day. */
VECTOR_FOREACH(&day_items, i) {
p = VECTOR_NTH(&day_items, i);
- if (p->order == update_time_in_date(sel_data.order, 0, 0))
+ if (p->order == DAY(sel_data.order))
return i;
}
return -1;
@@ -198,7 +198,8 @@ static void day_add_item(int type, time_t start, time_t order, union aptev_ptr i
/* Get the message of an item. */
char *day_item_get_mesg(struct day_item *day)
{
- switch (day->type) {
+ switch (day->type)
+ {
case APPT:
return day->item.apt->mesg;
case EVNT:
@@ -212,6 +213,15 @@ char *day_item_get_mesg(struct day_item *day)
}
}
+/* Get the display message of an item. */
+char *day_item_get_display_mesg(struct day_item *day)
+{
+ char *msg = day_item_get_mesg(day);
+ if (msg[0] == '\0')
+ return EMPTY_EVENT_DESC_DEFAULT;
+ return msg;
+}
+
/* Get the note attached to an item. */
char *day_item_get_note(struct day_item *day)
{
@@ -529,7 +539,7 @@ day_display_item(struct day_item *day, WINDOW *win, int incolor, int width,
if (width <= 0)
return;
- char *mesg = day_item_get_mesg(day);
+ char *mesg = day_item_get_display_mesg(day);
ch_recur = (day->type == RECUR_EVNT) ? '*' : ' ';
ch_note = day_item_get_note(day) ? '>' : ' ';
@@ -578,6 +588,38 @@ void day_write_stdout(time_t date, const char *fmt_apt, const char *fmt_rapt,
}
}
+/*
+ * Store events and appointments for a range of days in the day vector -
+ * beginning with the selected day - and load them into the APP listbox. If no
+ * day-change occurs, reset the selected APP item and with it the selected day,
+ * thereby storing and loading the same range of days.
+ */
+void day_do_storage(int day_changed)
+{
+ int pre_sel;
+ /*
+ * Save the selected item before rebuilding the day vector -
+ * unless a preselection is already set.
+ */
+ if(!(pre_sel = day_check_sel_data()))
+ day_set_sel_data(ui_day_get_sel());
+
+ if (!day_changed)
+ ui_day_sel_reset();
+
+ /* The day_items vector. */
+ day_store_items(get_slctd_day(), 1, day_get_days());
+ /* The APP listbox. */
+ ui_day_load_items();
+
+ if (day_changed && !pre_sel)
+ ui_day_sel_reset();
+ else
+ ui_day_find_sel();
+
+ day_set_sel_data(&empty_day);
+}
+
/* Display an item inside a popup window. */
void day_popup_item(struct day_item *day)
{
@@ -592,15 +634,19 @@ void day_popup_item(struct day_item *day)
asprintf(&notepath, "%s%s", path_notes, day_item_get_note(day));
fp = fopen(notepath, "r");
+ if (fp == NULL) {
+ item_in_popup(NULL, NULL, day_item_get_mesg(day), _("Event:"));
+ return;
+ }
note_read_contents(note, note_size, fp);
fclose(fp);
mem_free(notepath);
- asprintf(&msg, "%s\n\n%s\n%s", day_item_get_mesg(day), note_heading, note);
+ asprintf(&msg, "%s\n\n%s\n%s", day_item_get_display_mesg(day), note_heading, note);
item_in_popup(NULL, NULL, msg, _("Event:"));
mem_free(msg);
} else {
- item_in_popup(NULL, NULL, day_item_get_mesg(day), _("Event:"));
+ item_in_popup(NULL, NULL, day_item_get_display_mesg(day), _("Event:"));
}
} else if (day->type == APPT || day->type == RECUR_APPT) {
char a_st[100], a_end[100];
@@ -619,15 +665,19 @@ void day_popup_item(struct day_item *day)
asprintf(&notepath, "%s%s", path_notes, day_item_get_note(day));
fp = fopen(notepath, "r");
+ if (fp == NULL) {
+ item_in_popup(a_st, a_end, day_item_get_mesg(day), _("Appointment:"));
+ return;
+ }
note_read_contents(note, note_size, fp);
fclose(fp);
mem_free(notepath);
- asprintf(&msg, "%s\n\n%s\n%s", day_item_get_mesg(day), note_heading, note);
+ asprintf(&msg, "%s\n\n%s\n%s", day_item_get_display_mesg(day), note_heading, note);
item_in_popup(a_st, a_end, msg, _("Appointment:"));
mem_free(msg);
} else {
- item_in_popup(a_st, a_end, day_item_get_mesg(day), _("Appointment:"));
+ item_in_popup(a_st, a_end, day_item_get_display_mesg(day), _("Appointment:"));
}
} else {
EXIT(_("unknown item type"));
@@ -832,7 +882,7 @@ int day_paste_item(struct day_item *p, time_t date)
/* wanted: until = shift + old_until */
if (p->item.rapt->rpt->until &&
overflow_add(
- date - update_time_in_date(p->item.rapt->start, 0, 0),
+ date - DAY(p->item.rapt->start),
p->item.rapt->rpt->until,
&until)
)
diff --git a/src/dmon.c b/src/dmon.c
index e61caf5..11d3458 100644
--- a/src/dmon.c
+++ b/src/dmon.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
diff --git a/src/event.c b/src/event.c
index e0da4c1..7c371e4 100644
--- a/src/event.c
+++ b/src/event.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
diff --git a/src/getstring.c b/src/getstring.c
index 7cdb84e..8ea5df5 100644
--- a/src/getstring.c
+++ b/src/getstring.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
@@ -241,9 +241,11 @@ enum getstr getstring(WINDOW * win, char *str, int l, int x, int y)
st.len = st.pos;
break;
case CTRL('A'): /* go to beginning of string */
+ case KEY_HOME:
st.pos = 0;
break;
case CTRL('E'): /* go to end of string */
+ case KEY_END:
st.pos = st.len;
break;
case KEY_LEFT: /* move one char backward */
diff --git a/src/help.c b/src/help.c
index 398fb6d..3f2c94f 100644
--- a/src/help.c
+++ b/src/help.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
@@ -105,7 +105,7 @@ int display_help(const char *topic)
if (!io_file_exists(path)) {
int ch = keys_str2int(topic);
- enum key action = keys_get_action(ch);
+ enum vkey action = keys_get_action(ch);
if (ch > 0 && action > 0 && action != KEY_UNDEF) {
topic = keys_get_label(action);
mem_free(path);
@@ -134,6 +134,8 @@ int display_help(const char *topic)
topic = "copy-paste";
else if (!strcmp(topic, "generic-change-view"))
topic = "tab";
+ else if (!strcmp(topic, "generic-prev-view"))
+ topic = "tab";
else if (!strcmp(topic, "generic-import"))
topic = "import";
else if (!strcmp(topic, "generic-export"))
diff --git a/src/hooks.c b/src/hooks.c
index b4933af..f649076 100644
--- a/src/hooks.c
+++ b/src/hooks.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
@@ -41,20 +41,18 @@
int run_hook(const char *name)
{
- char *hook_path = NULL, *hook_cmd = NULL, *mesg;
+ char *hook_path = NULL, *mesg;
+ int pid, pin, pout, perr, ret = -127;
char const *arg[2];
- int pid, ret = -127;
asprintf(&hook_path, "%s/%s", path_hooks, name);
if (!io_file_exists(hook_path))
goto cleanup;
-
- asprintf(&hook_cmd, "%s <&- >&- 2>&-", hook_path);
- arg[0] = hook_cmd;
+ arg[0] = hook_path;
arg[1] = NULL;
- if ((pid = shell_exec(NULL, NULL, *arg, arg))) {
- ret = child_wait(NULL, NULL, pid);
+ if ((pid = shell_exec(&pin, &pout, &perr, 1, *arg, arg))) {
+ ret = child_wait(&pin, &pout, &perr, pid);
if (ret > 0 && WIFEXITED(ret)) {
asprintf(&mesg, "%s hook: exit status %d",
name,
@@ -71,6 +69,5 @@ int run_hook(const char *name)
cleanup:
mem_free(hook_path);
- mem_free(hook_cmd);
return ret;
}
diff --git a/src/htable.h b/src/htable.h
index 5266213..92be6e2 100644
--- a/src/htable.h
+++ b/src/htable.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2004-2020 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
diff --git a/src/ical.c b/src/ical.c
index 5847b88..4a7738e 100644
--- a/src/ical.c
+++ b/src/ical.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
@@ -213,8 +213,10 @@ static void ical_export_note(FILE *stream, char *name)
int has_desc, has_prop, i;
asprintf(&note_file, "%s/%s", path_notes, name);
- if (!(fp = fopen(note_file, "r")))
+ if (!(fp = fopen(note_file, "r")) || ungetc(getc(fp), fp) == EOF) {
+ fclose(fp);
return;
+ }
string_init(&note);
while (fgets(lbuf, BUFSIZ, fp))
string_catf(&note, "%s", lbuf);
@@ -518,6 +520,10 @@ ical_store_event(char *mesg, char *note, time_t day, time_t end,
struct event *ev;
struct recur_event *rev;
+ if (!mesg)
+ mesg = mem_strdup(_("(empty)"));
+ EXIT_IF(!mesg, _("ical_store_event: out of memory"));
+
/*
* Repeating event. The end day is ignored, and the event becomes
* one-day even if multi-day.
@@ -570,6 +576,10 @@ ical_store_apoint(char *mesg, char *note, time_t start, long dur,
struct recur_apoint *rapt;
time_t day;
+ if (!mesg)
+ mesg = mem_strdup(_("(empty)"));
+ EXIT_IF(!mesg, _("ical_store_event: out of memory"));
+
if (has_alarm)
state |= APOINT_NOTIFY;
if (rpt) {
@@ -582,7 +592,7 @@ ical_store_apoint(char *mesg, char *note, time_t start, long dur,
* calcurse until day must be changed to the day before.
*/
if (rpt->until) {
- day = update_time_in_date(rpt->until, 0, 0);
+ day = DAY(rpt->until);
if (recur_item_find_occurrence(start, dur, rpt, NULL,
day, NULL) &&
get_item_time(rpt->until) < get_item_time(start))
@@ -1053,7 +1063,7 @@ static struct rpt *ical_read_rrule(FILE *log, char *rrulestr,
time_t start,
int *count)
{
- char freqstr[8];
+ char freqstr[8], datestr[17];
struct rpt *rpt;
char *p, *q;
@@ -1082,7 +1092,7 @@ static struct rpt *ical_read_rrule(FILE *log, char *rrulestr,
/* FREQ rule part */
if ((p = strstr(rrulestr, "FREQ="))) {
- if (sscanf(p, "FREQ=%s", freqstr) != 1) {
+ if (sscanf(p, "FREQ=%7s", freqstr) != 1) {
ical_log(log, ICAL_VEVENT, itemline,
_("frequency not set in rrule."));
(*noskipped)++;
@@ -1134,7 +1144,14 @@ static struct rpt *ical_read_rrule(FILE *log, char *rrulestr,
}
if ((p = strstr(rrulestr, "UNTIL="))) {
- rpt->until = ical_datetime2time_t(strchr(p, '=') + 1, NULL, type);
+ if (sscanf(p, "UNTIL=%16s", datestr) != 1) {
+ ical_log(log, ICAL_VEVENT, itemline,
+ _("missing until value."));
+ (*noskipped)++;
+ mem_free(rpt);
+ return NULL;
+ }
+ rpt->until = ical_datetime2time_t(datestr, NULL, type);
if (!rpt->until) {
ical_log(log, ICAL_VEVENT, itemline,
_("invalid until format."));
@@ -1218,11 +1235,6 @@ ical_read_exdate(llist_t * exc, FILE * log, char *exstr, unsigned *noskipped,
time_t t;
int n;
- if (type == UNDEFINED) {
- ical_log(log, ICAL_VEVENT, itemline,
- _("need DTSTART to determine event type."));
- goto cleanup;
- }
if (type != ical_get_type(exstr)) {
ical_log(log, ICAL_VEVENT, itemline,
_("invalid exception date value type."));
@@ -1327,12 +1339,9 @@ static char *ical_read_summary(char *line, unsigned *noskipped,
}
/* An event summary is one line only. */
- if (strchr(summary, '\n')) {
- ical_log(log, item_type, itemline, _("line break in summary."));
- (*noskipped)++;
- mem_free(summary);
- summary = NULL;
- }
+ for (p = summary; *p; p++)
+ if (*p == '\n')
+ *p = ' ';
leave:
return summary;
}
@@ -1346,8 +1355,9 @@ ical_read_event(FILE * fdi, FILE * log, unsigned *noevents,
const int ITEMLINE = *lineno - !feof(fdi);
ical_vevent_e vevent_type;
ical_property_e property;
- char *p, *note = NULL, *tmp, *tzid;
- struct string s;
+ char *p, *note, *tzid;
+ char *dtstart, *dtend, *duration, *rrule;
+ struct string s, exdate;
struct {
llist_t exc;
struct rpt *rpt;
@@ -1357,12 +1367,13 @@ ical_read_event(FILE * fdi, FILE * log, unsigned *noevents,
long dur;
int has_alarm;
} vevent;
- int skip_alarm, has_note, separator;
+ int skip_alarm, has_note, separator, has_exdate;
vevent_type = UNDEFINED;
memset(&vevent, 0, sizeof vevent);
LLIST_INIT(&vevent.exc);
- skip_alarm = has_note = separator = 0;
+ note = dtstart = dtend = duration = rrule = NULL;
+ skip_alarm = has_note = separator = has_exdate =0;
while (ical_readline(fdi, buf, lstore, lineno)) {
note = NULL;
property = NO_PROPERTY;
@@ -1376,16 +1387,112 @@ ical_read_event(FILE * fdi, FILE * log, unsigned *noevents,
continue;
}
if (starts_with_ci(buf, "END:VEVENT")) {
- if (!vevent.mesg) {
+ /* DTSTART and related properties (picked up earlier). */
+ if (!dtstart) {
ical_log(log, ICAL_VEVENT, ITEMLINE,
- _("could not retrieve item summary."));
+ _("item start date not defined."));
+ goto skip;
+ }
+ vevent_type = ical_get_type(dtstart);
+ if ((tzid = ical_get_tzid(dtstart)) &&
+ vevent_type == APPOINTMENT) {
+ if (vevent.imp) {
+ asprintf(&p, "%s, TZID=%s",
+ vevent.imp, tzid);
+ mem_free(vevent.imp);
+ vevent.imp = p;
+ } else
+ asprintf(&vevent.imp, "TZID=%s", tzid);
+ has_note = separator = 1;
+ }
+ p = ical_get_value(dtstart);
+ if (!p) {
+ ical_log(log, ICAL_VEVENT, ITEMLINE,
+ _("malformed start time line."));
+ goto skip;
+ }
+ vevent.start = ical_datetime2time_t(p, tzid, vevent_type);
+ if (tzid) {
+ mem_free(tzid);
+ tzid = NULL;
+ }
+ if (!vevent.start) {
+ ical_log(log, ICAL_VEVENT, ITEMLINE,
+ _("invalid or malformed event "
+ "start time."));
+ goto skip;
+ }
+ /* DTEND */
+ if (!dtend)
+ goto duration;
+ if (vevent_type != ical_get_type(dtend)) {
+ ical_log(log, ICAL_VEVENT, ITEMLINE,
+ _("invalid end time value type."));
+ goto skip;
+ }
+ tzid = ical_get_tzid(dtend);
+ p = ical_get_value(dtend);
+ if (!p) {
+ ical_log(log, ICAL_VEVENT, ITEMLINE,
+ _("malformed end time line."));
+ goto skip;
+ }
+ vevent.end = ical_datetime2time_t(p, tzid, vevent_type);
+ if (tzid) {
+ mem_free(tzid);
+ tzid = NULL;
+ }
+ if (!vevent.end) {
+ ical_log(log, ICAL_VEVENT, ITEMLINE,
+ _("malformed event end time."));
+ goto skip;
+ }
+ if (vevent.end <= vevent.start) {
+ ical_log(log, ICAL_VEVENT, ITEMLINE,
+ _("end must be later than start."));
+ goto skip;
+ }
+ duration:
+ if (!duration)
+ goto rrule;
+ if (vevent.end) {
+ ical_log(log, ICAL_VEVENT, ITEMLINE,
+ _("either end or duration."));
+ goto skip;
+ }
+ p = ical_get_value(duration);
+ if (!p) {
+ ical_log(log, ICAL_VEVENT, ITEMLINE,
+ _("malformed duration line."));
+ goto skip;
+ }
+ vevent.dur = ical_dur2long(p, vevent_type);
+ if (!vevent.dur) {
+ ical_log(log, ICAL_VEVENT, ITEMLINE,
+ _("invalid duration."));
goto skip;
}
- if (vevent.start == 0) {
+ rrule:
+ if (!rrule)
+ goto exdate;
+ vevent.rpt = ical_read_rrule(log, rrule, noskipped,
+ ITEMLINE, vevent_type, vevent.start,
+ &vevent.count);
+ if (!vevent.rpt)
+ goto cleanup;
+ exdate:
+ if (!has_exdate)
+ goto duration_end;
+ if (!rrule) {
ical_log(log, ICAL_VEVENT, ITEMLINE,
- _("item start date is not defined."));
+ _("exception date, but no recurrence "
+ "rule."));
goto skip;
}
+ if (!ical_read_exdate(&vevent.exc, log, exdate.buf,
+ noskipped, ITEMLINE, vevent_type))
+ goto cleanup;
+ duration_end:
/* An APPOINTMENT must always have a duration. */
if (vevent_type == APPOINTMENT && !vevent.dur) {
vevent.dur = vevent.end ?
@@ -1402,10 +1509,10 @@ ical_read_event(FILE * fdi, FILE * log, unsigned *noevents,
char *md = _("multi-day event changed "
"to one-day event");
if (vevent.imp) {
- asprintf(&tmp, "%s, %s",
+ asprintf(&p, "%s, %s",
vevent.imp, md);
mem_free(vevent.imp);
- vevent.imp = tmp;
+ vevent.imp = p;
} else
asprintf(&vevent.imp, "%s", md);
has_note = separator = 1;
@@ -1417,6 +1524,7 @@ ical_read_event(FILE * fdi, FILE * log, unsigned *noevents,
if (vevent.desc) {
string_catf(&s, "%s", vevent.desc);
mem_free(vevent.desc);
+ vevent.desc = NULL;
}
if (separator)
string_catf(&s, SEPARATOR);
@@ -1424,16 +1532,19 @@ ical_read_event(FILE * fdi, FILE * log, unsigned *noevents,
string_catf(&s, _("Location: %s"),
vevent.loc);
mem_free(vevent.loc);
+ vevent.loc = NULL;
}
if (vevent.comm) {
string_catf(&s, _("Comment: %s"),
vevent.comm);
mem_free(vevent.comm);
+ vevent.comm = NULL;
}
if (vevent.imp) {
string_catf(&s, ("Import: %s\n"),
vevent.imp);
mem_free(vevent.imp);
+ vevent.imp = NULL;
}
vevent.note = generate_note(string_buf(&s));
mem_free(s.buf);
@@ -1444,7 +1555,7 @@ ical_read_event(FILE * fdi, FILE * log, unsigned *noevents,
char *msg;
dur = vevent_type == EVENT ? -1 : vevent.dur;
- day = update_time_in_date(vevent.start, 0, 0);
+ day = DAY(vevent.start);
msg = _("rrule does not match start day (%s).");
if (vevent.count) {
@@ -1494,115 +1605,28 @@ ical_read_event(FILE * fdi, FILE * log, unsigned *noevents,
}
if (starts_with_ci(buf, "DTSTART")) {
/*
- * DTSTART has a value type: either DATE-TIME (by
- * default) or DATE. Properties DTEND, DURATION and
- * EXDATE and rrule part UNTIL must agree.
- * Assume that DTSTART comes before the others even
- * though RFC 5545 allows any order.
+ * DTSTART has a value type: either DATE-TIME or DATE.
* In calcurse DATE-TIME implies an appointment, DATE an
* event.
+ * Properties DTEND, DURATION and EXDATE and rrule part
+ * UNTIL must match the DTSTART value type.
*/
- vevent_type = ical_get_type(buf);
- if ((tzid = ical_get_tzid(buf)) &&
- vevent_type == APPOINTMENT) {
- /* Add note on TZID. */
- if (vevent.imp) {
- asprintf(&tmp, "%s, TZID=%s",
- vevent.imp, tzid);
- mem_free(vevent.imp);
- vevent.imp = tmp;
- } else
- asprintf(&vevent.imp, "TZID=%s", tzid);
- has_note = separator = 1;
- }
- p = ical_get_value(buf);
- if (!p) {
- ical_log(log, ICAL_VEVENT, ITEMLINE,
- _("malformed start time line."));
- goto skip;
- }
-
- vevent.start = ical_datetime2time_t(p, tzid, vevent_type);
- if (tzid)
- mem_free(tzid);
- if (!vevent.start) {
- ical_log(log, ICAL_VEVENT, ITEMLINE,
- _("invalid or malformed event "
- "start time."));
- goto skip;
- }
+ asprintf(&dtstart, "%s", buf);
} else if (starts_with_ci(buf, "DTEND")) {
- if (vevent.dur) {
- ical_log(log, ICAL_VEVENT, ITEMLINE,
- _("either end or duration."));
- goto skip;
- }
- if (vevent_type == UNDEFINED) {
- ical_log(log, ICAL_VEVENT, ITEMLINE,
- _("need DTSTART to determine "
- "event type."));
- goto skip;
- }
- if (vevent_type != ical_get_type(buf)) {
- ical_log(log, ICAL_VEVENT, ITEMLINE,
- _("invalid end time value type."));
- goto skip;
- }
- tzid = ical_get_tzid(buf);
- p = ical_get_value(buf);
- if (!p) {
- ical_log(log, ICAL_VEVENT, ITEMLINE,
- _("malformed end time line."));
- goto skip;
- }
-
- vevent.end = ical_datetime2time_t(p, tzid, vevent_type);
- if (tzid)
- mem_free(tzid);
- if (!vevent.end) {
- ical_log(log, ICAL_VEVENT, ITEMLINE,
- _("malformed event end time."));
- goto skip;
- }
- if (vevent.end <= vevent.start) {
- ical_log(log, ICAL_VEVENT, ITEMLINE,
- _("end must be later than start."));
- goto skip;
- }
+ asprintf(&dtend, "%s", buf);
} else if (starts_with_ci(buf, "DURATION")) {
- if (vevent.end) {
- ical_log(log, ICAL_VEVENT, ITEMLINE,
- _("either end or duration."));
- goto skip;
- }
- if (vevent_type == UNDEFINED) {
- ical_log(log, ICAL_VEVENT, ITEMLINE,
- _("need DTSTART to determine "
- "event type."));
- goto skip;
- }
- p = ical_get_value(buf);
- if (!p) {
- ical_log(log, ICAL_VEVENT, ITEMLINE,
- _("malformed duration line."));
- goto skip;
- }
- vevent.dur = ical_dur2long(p, vevent_type);
- if (!vevent.dur) {
- ical_log(log, ICAL_VEVENT, ITEMLINE,
- _("invalid duration."));
- goto skip;
- }
+ asprintf(&duration, "%s", buf);
} else if (starts_with_ci(buf, "RRULE")) {
- vevent.rpt = ical_read_rrule(log, buf, noskipped,
- ITEMLINE, vevent_type, vevent.start,
- &vevent.count);
- if (!vevent.rpt)
- goto cleanup;
+ asprintf(&rrule, "%s", buf);
} else if (starts_with_ci(buf, "EXDATE")) {
- if (!ical_read_exdate(&vevent.exc, log, buf, noskipped,
- ITEMLINE, vevent_type))
- goto cleanup;
+ if (!has_exdate) {
+ has_exdate = 1;
+ string_init(&exdate);
+ string_catf(&exdate, "%s", buf);
+ } else {
+ p = ical_get_value(buf);
+ string_catf(&exdate, ",%s", p);
+ }
} else if (starts_with_ci(buf, "SUMMARY")) {
vevent.mesg = ical_read_summary(buf, noskipped,
ICAL_VEVENT, ITEMLINE, log);
@@ -1646,10 +1670,10 @@ ical_read_event(FILE * fdi, FILE * log, unsigned *noevents,
case COMMENT:
/* There may be more than one. */
if (vevent.comm) {
- asprintf(&tmp, "%sComment: %s",
+ asprintf(&p, "%sComment: %s",
vevent.comm, note);
mem_free(vevent.comm);
- vevent.comm = tmp;
+ vevent.comm = p;
} else
vevent.comm = note;
break;
@@ -1663,6 +1687,16 @@ ical_read_event(FILE * fdi, FILE * log, unsigned *noevents,
skip:
(*noskipped)++;
cleanup:
+ if (dtstart)
+ mem_free(dtstart);
+ if (dtend)
+ mem_free(dtend);
+ if (duration)
+ mem_free(duration);
+ if (rrule)
+ mem_free(rrule);
+ if (has_exdate)
+ mem_free(exdate.buf);
if (note)
mem_free(note);
if (vevent.desc)
@@ -1686,7 +1720,7 @@ ical_read_todo(FILE * fdi, FILE * log, unsigned *notodos, unsigned *noskipped,
{
const int ITEMLINE = *lineno - !feof(fdi);
ical_property_e property;
- char *note = NULL, *tmp;
+ char *p, *note;
struct string s;
struct {
char *mesg, *desc, *loc, *comm, *note;
@@ -1696,6 +1730,7 @@ ical_read_todo(FILE * fdi, FILE * log, unsigned *notodos, unsigned *noskipped,
int skip_alarm, has_note, separator;
memset(&vtodo, 0, sizeof vtodo);
+ note = NULL;
skip_alarm = has_note = separator = 0;
while (ical_readline(fdi, buf, lstore, lineno)) {
note = NULL;
@@ -1721,6 +1756,7 @@ ical_read_todo(FILE * fdi, FILE * log, unsigned *notodos, unsigned *noskipped,
if (vtodo.desc) {
string_catf(&s, "%s", vtodo.desc);
mem_free(vtodo.desc);
+ vtodo.desc = NULL;
}
if (separator)
string_catf(&s, SEPARATOR);
@@ -1728,11 +1764,13 @@ ical_read_todo(FILE * fdi, FILE * log, unsigned *notodos, unsigned *noskipped,
string_catf(&s, _("Location: %s"),
vtodo.loc);
mem_free(vtodo.loc);
+ vtodo.loc = NULL;
}
if (vtodo.comm) {
string_catf(&s, _("Comment: %s"),
vtodo.comm);
mem_free(vtodo.comm);
+ vtodo.comm = NULL;
}
vtodo.note = generate_note(string_buf(&s));
mem_free(s.buf);
@@ -1796,10 +1834,10 @@ ical_read_todo(FILE * fdi, FILE * log, unsigned *notodos, unsigned *noskipped,
case COMMENT:
/* There may be more than one. */
if (vtodo.comm) {
- asprintf(&tmp, "%sComment: %s",
+ asprintf(&p, "%sComment: %s",
vtodo.comm, note);
mem_free(vtodo.comm);
- vtodo.comm = tmp;
+ vtodo.comm = p;
} else
vtodo.comm = note;
break;
diff --git a/src/io.c b/src/io.c
index 43c9b28..d596aab 100644
--- a/src/io.c
+++ b/src/io.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
@@ -50,8 +50,8 @@
struct ht_keybindings_s {
const char *label;
- enum key key;
- HTABLE_ENTRY(ht_keybindings_s);
+ enum vkey key;
+ HTABLE_ENTRY(ht_keybindings_s);
};
static void load_keys_ht_getkey(struct ht_keybindings_s *, const char **,
@@ -237,25 +237,25 @@ void io_dump_apts(const char *fmt_apt, const char *fmt_rapt,
LLIST_FOREACH(&recur_elist, i) {
struct recur_event *rev = LLIST_GET_DATA(i);
- time_t day = update_time_in_date(rev->day, 0, 0);
+ time_t day = DAY(rev->day);
print_recur_event(fmt_rev, day, rev);
}
LLIST_TS_FOREACH(&recur_alist_p, i) {
struct recur_apoint *rapt = LLIST_GET_DATA(i);
- time_t day = update_time_in_date(rapt->start, 0, 0);
+ time_t day = DAY(rapt->start);
print_recur_apoint(fmt_rapt, day, rapt->start, rapt);
}
LLIST_TS_FOREACH(&alist_p, i) {
struct apoint *apt = LLIST_TS_GET_DATA(i);
- time_t day = update_time_in_date(apt->start, 0, 0);
+ time_t day = DAY(apt->start);
print_apoint(fmt_apt, day, apt);
}
LLIST_FOREACH(&eventlist, i) {
struct event *ev = LLIST_TS_GET_DATA(i);
- time_t day = update_time_in_date(ev->day, 0, 0);
+ time_t day = DAY(ev->day);
print_event(fmt_ev, day, ev);
}
}
@@ -940,16 +940,6 @@ load_keys_ht_compare(struct ht_keybindings_s *data1,
}
/*
- * isblank(3) is protected by the __BSD_VISIBLE macro and this fails to be
- * visible in some specific cases. Thus replace it by the following is_blank()
- * function.
- */
-static int is_blank(int c)
-{
- return c == ' ' || c == '\t';
-}
-
-/*
* Load user-definable keys from file.
* A hash table is used to speed up loading process in avoiding string
* comparisons.
@@ -958,21 +948,21 @@ static int is_blank(int c)
*/
void io_load_keys(const char *pager)
{
- struct ht_keybindings_s keys[NBKEYS];
+ struct ht_keybindings_s virt_keys[NBVKEYS], *ht_elm, ht_entry;
FILE *keyfp;
- char buf[BUFSIZ];
+ char buf[BUFSIZ], key_label[BUFSIZ], key_str[BUFSIZ];
+ char *p, *msg;
struct io_file *log;
- int i, skipped, loaded, line;
- const int MAX_ERRORS = 5;
+ int i, n, skipped, loaded, line, assigned, undefined, key;
keys_init();
struct ht_keybindings ht_keys = HTABLE_INITIALIZER(&ht_keys);
- for (i = 0; i < NBKEYS; i++) {
- keys[i].key = (enum key)i;
- keys[i].label = keys_get_label((enum key)i);
- HTABLE_INSERT(ht_keybindings, &ht_keys, &keys[i]);
+ for (i = 0; i < NBVKEYS; i++) {
+ virt_keys[i].key = (enum vkey)i;
+ virt_keys[i].label = keys_get_label((enum vkey)i);
+ HTABLE_INSERT(ht_keybindings, &ht_keys, &virt_keys[i]);
}
keyfp = fopen(path_keys, "r");
@@ -981,111 +971,97 @@ void io_load_keys(const char *pager)
log = io_log_init();
skipped = loaded = line = 0;
while (fgets(buf, BUFSIZ, keyfp) != NULL) {
- char key_label[BUFSIZ], *p;
- struct ht_keybindings_s *ht_elm, ht_entry;
- const int AWAITED = 1;
- int assigned;
-
line++;
- if (skipped > MAX_ERRORS) {
- const char *too_many =
- _("\nToo many errors while reading configuration file!\n"
- "Please backup your keys file, remove it from directory, "
- "and launch calcurse again.\n");
-
- io_log_print(log, line, too_many);
- break;
- }
- for (p = buf; is_blank((int)*p); p++) ;
- if (p != buf)
- memmove(buf, p, strlen(p));
- if (buf[0] == '#' || buf[0] == '\n')
+ p = buf;
+ while (*p == ' ' || *p == '\t') p++;
+ if (*p == '#' || *p == '\n')
continue;
- if (sscanf(buf, "%s", key_label) != AWAITED) {
+ /* Find the virtual key by key label. */
+ if (sscanf(p, "%s", key_label) != 1) {
skipped++;
io_log_print(log, line,
_("Could not read key label"));
continue;
}
-
- /* Skip legacy entries. */
- if (strcmp(key_label, "generic-cut") == 0)
- continue;
-
+ p += strlen(key_label);
ht_entry.label = key_label;
- p = buf + strlen(key_label) + 1;
- ht_elm =
- HTABLE_LOOKUP(ht_keybindings, &ht_keys, &ht_entry);
+ ht_elm = HTABLE_LOOKUP(ht_keybindings, &ht_keys, &ht_entry);
if (!ht_elm) {
skipped++;
- io_log_print(log, line,
- _("Key label not recognized"));
+ asprintf(&msg,
+ _("Key label not recognized: \"%s\""),
+ key_label);
+ io_log_print(log, line, msg);
+ mem_free(msg);
continue;
}
- assigned = 0;
- for (;;) {
- char key_ch[BUFSIZ], tmpbuf[BUFSIZ];
-
- while (*p == ' ')
- p++;
- (void)strncpy(tmpbuf, p, BUFSIZ);
- tmpbuf[BUFSIZ - 1] = '\0';
- if (sscanf(tmpbuf, "%s", key_ch) == AWAITED) {
- int ch;
-
- if ((ch = keys_str2int(key_ch)) < 0) {
- char *unknown_key;
+ /* Assign keyboard keys to the virtual key. */
+ assigned = undefined = 0;
+ for (;;) {
+ if (sscanf(p, "%s%n", key_str, &n) != 1) {
+ if (assigned || undefined)
+ loaded++;
+ else {
skipped++;
- asprintf(&unknown_key,
- _("Error reading key: \"%s\""),
- key_ch);
- io_log_print(log, line, unknown_key);
- mem_free(unknown_key);
- } else {
- int used;
-
- used =
- keys_assign_binding(ch,
- ht_elm->
- key);
- if (used) {
- char *already_assigned;
-
- skipped++;
- asprintf(&already_assigned,
- _("\"%s\" assigned multiple times!"),
- key_ch);
- io_log_print(log, line,
- already_assigned);
- mem_free(already_assigned);
- } else {
- assigned++;
- }
+ asprintf(&msg,
+ _("No keys assigned to "
+ "\"%s\"."),
+ key_label);
+ io_log_print(log, line, msg);
+ mem_free(msg);
}
- p += strlen(key_ch) + 1;
- } else {
- if (assigned)
- loaded++;
break;
}
+ p += n;
+ if (!strcmp(key_str, "UNDEFINED")) {
+ undefined++;
+ keys_assign_binding(-1, ht_elm->key);
+ } else if ((key = keys_str2int(key_str)) < 0) {
+ skipped++;
+ asprintf(&msg,
+ _("Keyname not recognized: \"%s\""),
+ key_str);
+ io_log_print(log, line, msg);
+ mem_free(msg);
+ } else if (keys_assign_binding(key, ht_elm->key)) {
+ skipped++;
+ asprintf(&msg,
+ _("\"%s\" assigned twice: \"%s\"."),
+ key_str, key_label);
+ io_log_print(log, line, msg);
+ mem_free(msg);
+ } else
+ assigned++;
}
}
file_close(keyfp, __FILE_POS__);
+ if (loaded < NBVKEYS && (i = keys_fill_missing()) < 1) {
+ skipped++;
+ strcpy(key_label, keys_get_label((enum vkey)(-i)));
+ strcpy(key_str, keys_get_binding((enum vkey)(-i)));
+ asprintf(&msg, _("Action \"%s\" absent, but default key \"%s\" "
+ "assigned to another action."),
+ key_label, key_str);
+ io_log_print(log, line, msg);
+ mem_free(msg);
+ }
file_close(log->fd, __FILE_POS__);
if (skipped > 0) {
- const char *view_log =
- _("There were some errors when loading keys file.");
- io_log_display(log, view_log, pager);
+ msg = _("Errors in the keys file.");
+ io_log_display(log, msg, pager);
+ WARN_MSG(_("Remove offending line(s) from the keys file, "
+ "aborting..."));
+ exit_calcurse(EXIT_FAILURE);
}
io_log_free(log);
- EXIT_IF(skipped > MAX_ERRORS,
- _("Too many errors while reading keys file, aborting..."));
- if (loaded < NBKEYS)
- keys_fill_missing();
- if (keys_check_missing_bindings())
- WARN_MSG(_("Some actions do not have any associated key bindings!"));
+ /* Default keys were inserted. */
+ if (loaded < NBVKEYS)
+ io_save_keys();
+ /* Should never occur. */
+ EXIT_IF(keys_check_missing(),
+ _("Some actions do not have any associated key bindings!"));
}
int io_check_dir(const char *dir)
@@ -1277,7 +1253,7 @@ static FILE *get_import_stream(enum import_type type, char **stream_name)
* A temporary log file is created in /tmp to store the import process report,
* and is cleared at the end.
*/
-void io_import_data(enum import_type type, char *stream_name,
+int io_import_data(enum import_type type, char *stream_name,
const char *fmt_ev, const char *fmt_rev,
const char *fmt_apt, const char *fmt_rapt,
const char *fmt_todo)
@@ -1312,7 +1288,7 @@ void io_import_data(enum import_type type, char *stream_name,
}
if (stream == NULL)
- return;
+ return 0;
memset(&stats, 0, sizeof stats);
@@ -1320,7 +1296,7 @@ void io_import_data(enum import_type type, char *stream_name,
if (log == NULL) {
if (stream != stdin)
file_close(stream, __FILE_POS__);
- return;
+ return 0;
}
if (type == IO_IMPORT_ICAL)
@@ -1377,8 +1353,11 @@ void io_import_data(enum import_type type, char *stream_name,
mem_free(stats_str[3]);
if (ui_mode == UI_CURSES)
mem_free(stream_name);
- if (!stats.skipped)
+ if (!stats.skipped) {
io_log_free(log);
+ return 1;
+ } else
+ return 0;
}
struct io_file *io_log_init(void)
@@ -1576,22 +1555,6 @@ unsigned io_get_pid(char *file)
}
/*
- * Check whether a file is empty.
- */
-int io_file_is_empty(char *file)
-{
- FILE *fp;
- int ret = -1;
-
- if (file && (fp = fopen(file, "r"))) {
- ret = (fgetc(fp) == '\n' && fgetc(fp) == EOF) || feof(fp);
- fclose(fp);
- }
-
- return ret;
-}
-
-/*
* Check whether two files are equal.
*/
int io_files_equal(const char *file1, const char *file2)
diff --git a/src/keys.c b/src/keys.c
index 3a25a0b..ae0375c 100644
--- a/src/keys.c
+++ b/src/keys.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
@@ -39,26 +39,73 @@
#include "calcurse.h"
-#define MAXKEYVAL KEY_MAX /* ncurses defines KEY_MAX as maximum key value */
-
-struct keydef_s {
- const char *label;
- const char *binding;
- const char *sb_label;
-};
+/*
+ * The interactive calcurse interface is controlled by "virtual keys", aka
+ * actions or commands. The virtual keys are defined by the type 'enum vkey',
+ * see calcurse.h. To each virtual key is assigned (or bound) zero or more
+ * keyboard keys/characters. A character (generated by a keyboard key) may be
+ * either an ordinary character or a pseudo-character. [An ordinary character
+ * is either a singlebyte ASCII character or a multibyte, UTF-8 encoded
+ * character; a pseudo-character (as supported by curses) is an escape sequence
+ * generated by a key.] A keyboard key/character is uniquely identified by its
+ * keyname (a character string) or by an integer (the Unicode code point of the
+ * character with a slight modification to accomodate the range of curses
+ * pseudo-characters). Mapping between the two forms is performed by the
+ * functions keys_str2int() and keys_int2str().
+ */
-static llist_t keys[NBKEYS];
-static enum key actions[MAXKEYVAL];
+/*
+ * Assignment of keys to virtual keys is held in the tabel keys[]. The entry for
+ * each virtual key is a linked list of keyboard keys (bindings); each list
+ * element is the keyname as returned by keys_int2str().
+ *
+ * At the very first run default keys are assigned to all virtual keys from a
+ * built-in table keydef[] and saved to disk in the calcurse config directory.
+ * Later the user may edit the key configuration and change the key bindings by
+ * adding/removing keys. If all keys are removed, the virtual key is left
+ * undefined. This state is also saved in the configuration file. The linked
+ * list for an undefined virtual key contains a single element with a null
+ * pointer as data.
+ */
+static llist_t keys[NBVKEYS];
+/*
+ * To cater for the other direction (which virtual key is a keyboard key
+ * assigned to), two constructions are needed: a table actions[] for the
+ * keyboard keys in the curses range, and a linked list actions_ext for
+ * multi-byte UTF-8 encoded keyboard characters.
+ *
+ * For each keyboard key (integer) in the curses key range, the virtual key
+ * (action) it is assigned to or, if not assigned, KEY_UNDEF.
+ */
+static enum vkey actions[KEY_MAX];
+/*
+ * For the millions of possible keyboard keys above the curses range, a linked
+ * list of keys which are actually bound to a virtual key.
+ * Each list element is a key_ext structure.
+ */
+llist_t actions_ext;
struct key_ext {
- int ch;
- enum key action;
+ int key;
+ enum vkey action;
};
-llist_t actions_ext;
+/*
+ * Assigning a keyboard key to a virtual key is accomplished by
+ * 1) either inserting the virtual key in the actions[] entry for the keyboard key
+ * or adding the pair (key, virtual key) to the list actions_ext
+ * 2) adding it in keys[] to the list for the virtual key
+ * See keys_assign_binding() below.
+ */
+/* The default key bindings for the virtual keys. */
+struct keydef_s {
+ const char *label; /* Name of the virtual key (action). */
+ const char *binding; /* String of space-separated keynames bound to it. */
+ const char *sb_label; /* Display name in the status bar menu. */
+};
#define gettext_noop(s) s
-static struct keydef_s keydef[NBKEYS] = {
+static struct keydef_s keydef[NBVKEYS] = {
{ "generic-cancel", "ESC", gettext_noop("Cancel") },
{ "generic-select", "SPC", gettext_noop("Select") },
{ "generic-credits", "@", gettext_noop("Credits") },
@@ -69,6 +116,7 @@ static struct keydef_s keydef[NBKEYS] = {
{ "generic-copy", "c", gettext_noop("Copy") },
{ "generic-paste", "p ^V", gettext_noop("Paste") },
{ "generic-change-view", "TAB", gettext_noop("Chg Win") },
+ { "generic-prev-view", "KEY_BTAB", gettext_noop("Prev Win") },
{ "generic-import", "i I", gettext_noop("Import") },
{ "generic-export", "x X", gettext_noop("Export") },
{ "generic-goto", "g G", gettext_noop("Go to") },
@@ -132,10 +180,11 @@ void keys_init(void)
int i;
const char *cp;
- for (i = 0; i < MAXKEYVAL; i++)
+ /* All keys unassigned. */
+ for (i = 0; i < KEY_MAX; i++)
actions[i] = KEY_UNDEF;
LLIST_INIT(&actions_ext);
- for (i = 0; i < NBKEYS; i++)
+ for (i = 0; i < NBVKEYS; i++)
LLIST_INIT(&keys[i]);
/* Initialization of the keynames table. */
@@ -146,7 +195,7 @@ void keys_init(void)
for (i = 1; i < 128; i++)
if ((cp = keyname(i)))
keynames[i] = mem_strdup(cp);
- /* ... and for the ncurses escape keys (pseudokeys). */
+ /* ... and for the ncurses pseudo-characters. */
for (i = KEY_MIN; i < KEY_MAX; i++)
if ((cp = keyname(i)))
keynames[i] = mem_strdup(cp);
@@ -189,7 +238,7 @@ void keys_free(void)
{
int i;
- for (i = 0; i < NBKEYS; i++) {
+ for (i = 0; i < NBVKEYS; i++) {
LLIST_FREE_INNER(&keys[i], key_free);
LLIST_FREE(&keys[i]);
}
@@ -205,31 +254,40 @@ void keys_dump_defaults(char *file)
_("FATAL ERROR: could not create default keys file."));
dump_intro(fd);
- for (i = 0; i < NBKEYS; i++)
+ for (i = 0; i < NBVKEYS; i++)
fprintf(fd, "%s %s\n", keydef[i].label,
keydef[i].binding);
file_close(fd, __FILE_POS__);
}
-const char *keys_get_label(enum key key)
+const char *keys_get_label(enum vkey key)
{
EXIT_IF(key < 0
- || key > NBKEYS,
+ || key > NBVKEYS,
_("FATAL ERROR: key value out of bounds"));
return keydef[key].label;
}
+const char *keys_get_binding(enum vkey key)
+{
+ EXIT_IF(key < 0
+ || key > NBVKEYS,
+ _("FATAL ERROR: key value out of bounds"));
+
+ return keydef[key].binding;
+}
+
static int key_ext_hasch(struct key_ext *k, void *cbdata)
{
- return (k->ch == *((int *)cbdata));
+ return (k->key == *((int *)cbdata));
}
-enum key keys_get_action(int pressed)
+enum vkey keys_get_action(int pressed)
{
if (pressed < 0) {
return -1;
- } else if (pressed > MAXKEYVAL) {
+ } else if (pressed > KEY_MAX) {
llist_item_t *i = LLIST_FIND_FIRST(&actions_ext, &pressed,
key_ext_hasch);
if (!i)
@@ -274,7 +332,7 @@ void keys_wait_for_any_key(WINDOW *win)
keys_wgetch(win);
}
-enum key keys_get(WINDOW *win, int *count, int *reg)
+enum vkey keys_get(WINDOW *win, int *count, int *reg)
{
int ch = '0';
@@ -312,60 +370,89 @@ enum key keys_get(WINDOW *win, int *count, int *reg)
}
}
-static void add_key_str(enum key action, int key)
+static void add_if_undefined(enum vkey action)
{
- if (action > NBKEYS)
- return;
+ /* If list is empty, mark action as UNDEFINED. */
+ if (!keys[action].head)
+ LLIST_ADD(&keys[action], NULL);
+}
- LLIST_ADD(&keys[action], keys_int2str(key));
+static void del_if_undefined(enum vkey action)
+{
+ /* Action UNDEFINED? */
+ if (!LLIST_GET_DATA(LLIST_FIRST(&keys[action])))
+ LLIST_REMOVE(&keys[action], keys[action].head);
}
-int keys_assign_binding(int key, enum key action)
+static void free_key_str(char *str)
{
- if (key < 0)
- return 1;
- if (key > KEY_MAX) {
- llist_item_t *i = LLIST_FIND_FIRST(&actions_ext, &key, key_ext_hasch);
- if (i)
- return 1;
- struct key_ext *k = mem_malloc(sizeof(struct key_ext));
- k->ch = key;
- k->action = action;
- LLIST_ADD(&actions_ext, k);
- } else {
- if (actions[key] != KEY_UNDEF)
- return 1;
- actions[key] = action;
- }
- add_key_str(action, key);
- return 0;
+ mem_free(str);
}
-static void del_key_str(enum key action, int key)
+static void add_key_str(enum vkey action, int key)
+{
+ if (action > NBVKEYS)
+ return;
+
+ del_if_undefined(action);
+ LLIST_ADD(&keys[action], keys_int2str(key));
+}
+
+static void del_key_str(enum vkey action, int key)
{
llist_item_t *i;
- char *oldstr = keys_int2str(key);;
+ char *oldstr = keys_int2str(key), *j;
- if (action > NBKEYS)
+ if (action > NBVKEYS)
return;
LLIST_FOREACH(&keys[action], i) {
- if (strcmp(LLIST_GET_DATA(i), oldstr) == 0) {
+ if (strcmp((j = LLIST_GET_DATA(i)), oldstr) == 0) {
LLIST_REMOVE(&keys[action], i);
+ free_key_str(j);
goto cleanup;
}
}
cleanup:
+ add_if_undefined(action);
mem_free(oldstr);
}
-void keys_remove_binding(int key, enum key action)
+/*
+ * Assign keyboard key "key" to virtual key "action" by
+ *
+ * - marking keyboard key "key" as used for virtual key "actual"
+ * - adding "key" to the list of assigned keys for "action" in the tabel keys[]
+ *
+ * The former is done by either inserting "action" in the "key" entry of tabel
+ * actions[], or for keys above the curses range, inserting (key, action) in the
+ * list actions_ext.
+ */
+int keys_assign_binding(int key, enum vkey action)
+{
+ if (key > KEY_MAX) {
+ if (LLIST_FIND_FIRST(&actions_ext, &key, key_ext_hasch))
+ return 1;
+ struct key_ext *k = mem_malloc(sizeof(struct key_ext));
+ k->key = key;
+ k->action = action;
+ LLIST_ADD(&actions_ext, k);
+ } else if (key > -1) {
+ if (actions[key] != KEY_UNDEF)
+ return 1;
+ actions[key] = action;
+ }
+ add_key_str(action, key);
+ return 0;
+}
+
+void keys_remove_binding(int key, enum vkey action)
{
if (key < 0)
return;
- if (key <= MAXKEYVAL) {
+ if (key <= KEY_MAX) {
actions[key] = KEY_UNDEF;
} else {
llist_item_t *i = LLIST_FIND_FIRST(&actions_ext, &key,
@@ -410,6 +497,8 @@ char *keys_int2str(int key)
{
char *res;
+ if (key == -1)
+ return NULL;
if (key < KEY_MAX) {
if (strcmp(keynames[key], "") == 0)
return NULL;
@@ -421,50 +510,44 @@ char *keys_int2str(int key)
}
}
-int keys_action_count_keys(enum key action)
+int keys_action_count_keys(enum vkey action)
{
llist_item_t *i;
int n = 0;
+ /* Action UNDEFINED? */
+ if (!LLIST_GET_DATA(LLIST_FIRST(&keys[action])))
+ return 0;
+
LLIST_FOREACH(&keys[action], i)
- n++;
+ n++;
return n;
}
-const char *keys_action_firstkey(enum key action)
+const char *keys_action_firstkey(enum vkey action)
{
const char *s = LLIST_GET_DATA(LLIST_FIRST(&keys[action]));
return (s != NULL) ? s : "XXX";
}
-const char *keys_action_nkey(enum key action, int keynum)
+const char *keys_action_nkey(enum vkey action, int keynum)
{
return LLIST_GET_DATA(LLIST_NTH(&keys[action], keynum));
}
-char *keys_action_allkeys(enum key action)
+char *keys_action_allkeys(enum vkey action)
{
llist_item_t *i;
- static char keystr[BUFSIZ];
- int keystrlen = 0;
- int entrylen;
-
- if (!LLIST_FIRST(&keys[action]))
- return NULL;
-
- keystr[0] = '\0';
- LLIST_FOREACH(&keys[action], i) {
- entrylen = strlen(LLIST_GET_DATA(i)) + 1;
- if (keystrlen + entrylen >= BUFSIZ)
- break;
- memcpy(keystr + keystrlen, LLIST_GET_DATA(i), entrylen - 1);
- keystr[keystrlen + entrylen - 1] = ' ';
- keystrlen += entrylen;
- }
-
- keystr[keystrlen] = '\0';
- return keystr;
+ struct string keystr;
+
+ string_init(&keystr);
+ if (!LLIST_GET_DATA(LLIST_FIRST(&keys[action])))
+ string_catf(&keystr, "%s", "UNDEFINED");
+ else
+ LLIST_FOREACH(&keys[action], i)
+ string_catf(&keystr, "%s ", LLIST_GET_DATA(i));
+ return string_buf(&keystr);
}
/* Need this to display keys properly inside status bar. */
@@ -509,7 +592,7 @@ keys_display_bindings_bar(WINDOW * win, int *bindings, int count,
const char *label;
- if (binding_key < NBKEYS) {
+ if (binding_key < NBVKEYS) {
strncpy(key, keys_action_firstkey(binding_key), UTF8_MAXLEN);
key[UTF8_MAXLEN] = '\0';
label = gettext(keydef[binding_key].sb_label);
@@ -561,9 +644,9 @@ keys_display_bindings_bar(WINDOW * win, int *bindings, int count,
* Display information about the given key.
* (could not add the keys descriptions to keydef variable, because of i18n).
*/
-void keys_popup_info(enum key key)
+void keys_popup_info(enum vkey key)
{
- char *info[NBKEYS];
+ char *info[NBVKEYS];
WINDOW *infowin;
info[KEY_GENERIC_CANCEL] = _("Cancel the ongoing action.");
@@ -582,6 +665,8 @@ void keys_popup_info(enum key key)
_("Paste an item at the current position.");
info[KEY_GENERIC_CHANGE_VIEW] =
_("Select next panel in calcurse main screen.");
+ info[KEY_GENERIC_PREV_VIEW] =
+ _("Select previous panel in calcurse main screen.");
info[KEY_GENERIC_IMPORT] = _("Import data from an external file.");
info[KEY_GENERIC_EXPORT] = _("Export data to a new file format.");
info[KEY_GENERIC_GOTO] = _("Select the day to go to.");
@@ -651,7 +736,7 @@ void keys_popup_info(enum key key)
info[KEY_LOWER_PRIORITY] =
_("Lower a task priority inside the todo panel.");
- if (key > NBKEYS)
+ if (key > NBVKEYS)
return;
#define WINROW 10
@@ -668,59 +753,75 @@ void keys_popup_info(enum key key)
void keys_save_bindings(FILE * fd)
{
int i;
- char *action;
+ char *keys;
EXIT_IF(fd == NULL, _("FATAL ERROR: null file pointer."));
dump_intro(fd);
- for (i = 0; i < NBKEYS; i++) {
- action = keys_action_allkeys(i);
- if (action)
- fprintf(fd, "%s %s\n", keydef[i].label, action);
+ for (i = 0; i < NBVKEYS; i++) {
+ if ((keys = keys_action_allkeys(i)))
+ fprintf(fd, "%s %s\n", keydef[i].label, keys);
}
+ mem_free(keys);
}
-int keys_check_missing_bindings(void)
+int keys_check_undefined(void)
{
int i;
- for (i = 0; i < NBKEYS; i++) {
- if (!LLIST_FIRST(&keys[i]))
+ for (i = 0; i < NBVKEYS; i++) {
+ if (!LLIST_GET_DATA(LLIST_FIRST(&keys[i])))
return 1;
}
return 0;
}
-void keys_fill_missing(void)
+int keys_check_missing(void)
{
int i;
- for (i = 0; i < NBKEYS; i++) {
- if (!LLIST_FIRST(&keys[i])) {
- char *p, tmpbuf[BUFSIZ];
-
- strncpy(tmpbuf, keydef[i].binding, BUFSIZ);
- tmpbuf[BUFSIZ - 1] = '\0';
- p = tmpbuf;
- for (;;) {
- char key_ch[BUFSIZ];
-
- while (*p == ' ')
- p++;
- if (sscanf(p, "%s", key_ch) == 1) {
- int ch, used;
-
- ch = keys_str2int(key_ch);
- used = keys_assign_binding(ch, i);
- if (used)
- WARN_MSG(_("When adding default key for \"%s\", "
- "\"%s\" was already assigned!"),
- keydef[i].label,
- key_ch);
- p += strlen(key_ch);
- } else {
- break;
- }
- }
+ for (i = 0; i < NBVKEYS; i++) {
+ if (!LLIST_FIRST(&keys[i]))
+ return 1;
+ }
+ return 0;
+}
+
+/*
+ * Insert default keybindings for missing actions.
+ * Return either the number of actions assigned to (on success) or, if default
+ * keys could not be assigned, the negative index into the keydef[] table of the
+ * failing action.
+ */
+int keys_fill_missing(void)
+{
+ int i, ch, assign, assigned;
+ char *p, key_ch[BUFSIZ];
+
+ for (i = assigned = 0; i < NBVKEYS; i++) {
+ if (LLIST_FIRST(&keys[i]))
+ continue;
+
+ p = (char *)keydef[i].binding;
+ for (assign = 0;;) {
+ while (*p == ' ')
+ p++;
+ if (sscanf(p, "%s", key_ch) == 1) {
+ ch = keys_str2int(key_ch);
+ if (keys_assign_binding(ch, i))
+ return -i;
+ else
+ assign = 1;
+ p += strlen(key_ch);
+ } else
+ break;
}
+ assigned += assign;
+ }
+
+ if (assigned) {
+ p = (assigned == 1) ? "": "s";
+ WARN_MSG(_("Default key(s) assigned to %d action%s."),
+ assigned, p);
}
+ return assigned;
}
diff --git a/src/listbox.c b/src/listbox.c
index 2b39aa8..d86f540 100644
--- a/src/listbox.c
+++ b/src/listbox.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
diff --git a/src/llist.c b/src/llist.c
index aca0a9d..d31f004 100644
--- a/src/llist.c
+++ b/src/llist.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
@@ -109,6 +109,34 @@ llist_item_t *llist_next(llist_item_t * i)
}
/*
+ * Return the predecessor of a list item or, if head, the list item itself,
+ * or if not in the list, NULL.
+ * The list item may be supplied either directly (i) or as a pointer to
+ * the contents (data); the first case takes precedence.
+ */
+static llist_item_t *llist_prev(llist_t *l, llist_item_t *i, void *data)
+{
+ llist_item_t *j;
+
+ if (!i && !data)
+ return NULL;
+
+ if (l->head == i || l->head->data == data)
+ return l->head;
+
+ if (i) {
+ for (j = l->head; j; j = j->next)
+ if (j->next == i)
+ return j;
+ } else {
+ for (j = l->head; j && j->next; j = j->next)
+ if (j->next->data == data)
+ return j;
+ }
+ return NULL;
+}
+
+/*
* Return the successor of a list item if it is matched by some filter
* callback. Return NULL otherwise.
*/
@@ -150,34 +178,94 @@ void llist_add(llist_t * l, void *data)
}
/*
+ * Insert an existing item in a sorted list.
+ */
+static void llist_relink(llist_t *l, llist_item_t *i, llist_fn_cmp_t fn_cmp)
+{
+ llist_item_t *j;
+
+ if (!i)
+ return;
+
+ i->next = NULL;
+ if (!l->head) {
+ l->head = l->tail = i;
+ } else if (fn_cmp(i->data, l->tail->data) >= 0) {
+ l->tail->next = i;
+ l->tail = i;
+ } else if (fn_cmp(i->data, l->head->data) < 0) {
+ i->next = l->head;
+ l->head = i;
+ } else {
+ j = l->head;
+ while (j->next && fn_cmp(i->data, j->next->data) >= 0)
+ j = j->next;
+ i->next = j->next;
+ j->next = i;
+ }
+}
+
+/*
+ * Unlink an item from a list and return it.
+ */
+static llist_item_t *llist_unlink(llist_t *l, llist_item_t *i)
+{
+ llist_item_t *p;
+
+ if (!i)
+ return NULL;
+
+ p = llist_prev(l, i, NULL);
+ if (!p)
+ return NULL;
+
+ if (i == l->tail)
+ l->tail = (i == l->head) ? NULL : p;
+ if (i == l->head)
+ l->head = i->next;
+ else
+ p->next = i->next;
+ i->next = NULL;
+ return i;
+}
+
+/*
+ * Find an item matched by some filter callback; start from a specified item.
+ */
+static llist_item_t *llist_find_from(llist_item_t *i, void *data,
+ llist_fn_match_t fn_match)
+{
+ if (!i)
+ return NULL;
+
+ if (fn_match) {
+ for (; i; i = i->next) {
+ if (fn_match(i->data, data))
+ return i;
+ }
+ } else {
+ for (; i; i = i->next) {
+ if (i->data == data)
+ return i;
+ }
+ }
+
+ return NULL;
+}
+
+/*
* Add an item to a sorted list.
*/
void llist_add_sorted(llist_t * l, void *data, llist_fn_cmp_t fn_cmp)
{
llist_item_t *o = mem_malloc(sizeof(llist_item_t));
- llist_item_t *i;
if (o) {
o->data = data;
o->next = NULL;
-
- if (!l->head) {
- l->head = l->tail = o;
- } else if (fn_cmp(o->data, l->tail->data) >= 0) {
- l->tail->next = o;
- l->tail = o;
- } else if (fn_cmp(o->data, l->head->data) < 0) {
- o->next = l->head;
- l->head = o;
- } else {
- i = l->head;
- while (i->next
- && fn_cmp(o->data, i->next->data) >= 0)
- i = i->next;
- o->next = i->next;
- i->next = o;
- }
}
+
+ llist_relink(l, o, fn_cmp);
}
/*
@@ -209,21 +297,7 @@ void llist_remove(llist_t * l, llist_item_t * i)
llist_item_t *llist_find_first(llist_t * l, void *data,
llist_fn_match_t fn_match)
{
- llist_item_t *i;
-
- if (fn_match) {
- for (i = l->head; i; i = i->next) {
- if (fn_match(i->data, data))
- return i;
- }
- } else {
- for (i = l->head; i; i = i->next) {
- if (i->data == data)
- return i;
- }
- }
-
- return NULL;
+ return l ? llist_find_from(l->head, data, fn_match) : NULL;
}
/*
@@ -232,22 +306,7 @@ llist_item_t *llist_find_first(llist_t * l, void *data,
llist_item_t *llist_find_next(llist_item_t * i, void *data,
llist_fn_match_t fn_match)
{
- if (i) {
- i = i->next;
- if (fn_match) {
- for (; i; i = i->next) {
- if (fn_match(i->data, data))
- return i;
- }
- } else {
- for (; i; i = i->next) {
- if (i->data == data)
- return i;
- }
- }
- }
-
- return NULL;
+ return i ? llist_find_from(i->next, data, fn_match) : NULL;
}
/*
@@ -261,17 +320,42 @@ llist_item_t *llist_find_nth(llist_t * l, int n, void *data,
if (n < 0)
return NULL;
- if (fn_match) {
- for (i = l->head; i; i = i->next) {
- if (fn_match(i->data, data) && (n-- == 0))
- return i;
- }
- } else {
- for (i = l->head; i; i = i->next) {
- if ((i->data == data) && (n-- == 0))
- return i;
- }
+ for (i = l->head; i; i = i->next, n--) {
+ i = llist_find_from(i, data, fn_match);
+ if (!i || !n)
+ return i;
}
return NULL;
}
+
+/*
+ * Reorder a sorted linked list when an item has changed.
+ */
+void llist_reorder(llist_t *l, void *data, llist_fn_cmp_t fn_cmp)
+{
+ llist_item_t *o, *p;
+
+ if (!(p = llist_prev(l, NULL, data)))
+ return;
+
+ /* List head? */
+ if (p->data == data)
+ o = p;
+ else
+ o = p->next;
+
+ /* Sorted already?
+ * Note: p is either the previous element or o itself.
+ */
+ if (o->next &&
+ fn_cmp(p->data, o->data) <= 0 &&
+ fn_cmp(o->data, o->next->data) <= 0)
+ return;
+ if (!o->next &&
+ fn_cmp(p->data, o->data) <= 0)
+ return;
+
+ /* Link manipulation only. */
+ llist_relink(l, llist_unlink(l, o), fn_cmp);
+}
diff --git a/src/llist.h b/src/llist.h
index 9533819..0dd15bf 100644
--- a/src/llist.h
+++ b/src/llist.h
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
@@ -99,8 +99,11 @@ void *llist_get_data(llist_item_t *);
void llist_add(llist_t *, void *);
void llist_add_sorted(llist_t *, void *, llist_fn_cmp_t);
void llist_remove(llist_t *, llist_item_t *);
+void llist_reorder(llist_t *, void *, llist_fn_cmp_t);
#define LLIST_ADD(l, data) llist_add(l, data)
#define LLIST_ADD_SORTED(l, data, fn_cmp) \
llist_add_sorted(l, data, (llist_fn_cmp_t)fn_cmp)
#define LLIST_REMOVE(l, i) llist_remove(l, i)
+#define LLIST_REORDER(l, data, fn_cmp) \
+ llist_reorder(l, data, (llist_fn_cmp_t)fn_cmp)
diff --git a/src/llist_ts.h b/src/llist_ts.h
index 6597cde..a4b6184 100644
--- a/src/llist_ts.h
+++ b/src/llist_ts.h
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
@@ -90,3 +90,5 @@ struct llist_ts {
#define LLIST_TS_REMOVE(l_ts, i) llist_remove ((llist_t *)l_ts, i)
#define LLIST_TS_ADD_SORTED(l_ts, data, fn_cmp) \
llist_add_sorted ((llist_t *)l_ts, data, (llist_fn_cmp_t)fn_cmp)
+#define LLIST_TS_REORDER(l_ts, data, fn_cmp) \
+ llist_reorder((llist_t *)l_ts, data, (llist_fn_cmp_t)fn_cmp)
diff --git a/src/mem.c b/src/mem.c
index 8b8a5d5..ce3cf80 100644
--- a/src/mem.c
+++ b/src/mem.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
diff --git a/src/note.c b/src/note.c
index 40e0882..655ad89 100644
--- a/src/note.c
+++ b/src/note.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
@@ -94,9 +94,7 @@ void edit_note(char **note, const char *editor)
const char *arg[] = { editor, tmppath, NULL };
wins_launch_external(arg);
- if (io_file_is_empty(tmppath) > 0) {
- erase_note(note);
- } else if ((fp = fopen(tmppath, "r"))) {
+ if ((fp = fopen(tmppath, "r"))) {
sha1_stream(fp, sha1);
fclose(fp);
*note = sha1;
diff --git a/src/notify.c b/src/notify.c
index 036af0f..6eda361 100644
--- a/src/notify.c
+++ b/src/notify.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
@@ -137,9 +137,6 @@ void notify_init_vars(void)
strncpy(nbar.cmd, cmd, BUFSIZ);
nbar.cmd[BUFSIZ - 1] = '\0';
- if ((nbar.shell = getenv("SHELL")) == NULL)
- nbar.shell = "/bin/sh";
-
nbar.notify_all = 0;
pthread_attr_init(&detached_thread_attr);
@@ -216,26 +213,18 @@ void notify_reinit_bar(void)
/* Launch user defined command as a notification. */
unsigned notify_launch_cmd(void)
{
- int pid;
+ char const *arg[2] = { nbar.cmd, NULL };
+ int pid, pin, pout, perr;
if (notify_app.state & APOINT_NOTIFIED)
return 1;
notify_app.state |= APOINT_NOTIFIED;
- pid = fork();
-
- if (pid < 0) {
- ERROR_MSG(_("error while launching command: could not fork"));
- return 0;
- } else if (pid == 0) {
- /* Child: launch user defined command */
- if (execlp(nbar.shell, nbar.shell, "-c", nbar.cmd, NULL) <
- 0) {
- ERROR_MSG(_("error while launching command"));
- _exit(1);
- }
- _exit(0);
+ if ((pid = shell_exec(&pin, &pout, &perr, 1, *arg, arg))) {
+ close(pin);
+ close(pout);
+ close(perr);
}
return 1;
diff --git a/src/pcal.c b/src/pcal.c
index 78da0bb..435656a 100644
--- a/src/pcal.c
+++ b/src/pcal.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
@@ -102,8 +102,8 @@ static void pcal_export_header(FILE * stream)
{
fputs("# calcurse pcal export\n", stream);
fputs("\n# =======\n# options\n# =======\n", stream);
- fprintf(stream, "opt -A -K -l -m -F %s\n",
- ui_calendar_week_begins_on_monday()? "Monday" : "Sunday");
+ fprintf(stream, "opt -A -K -l -m -F %s\n", get_wday_default_string(
+ ui_calendar_get_wday_start()));
fputs("# Display week number (i.e. 1-52) on every Monday\n",
stream);
fprintf(stream, "all monday in all week %%w\n");
diff --git a/src/queue.c b/src/queue.c
index a00ebad..41cb69b 100644
--- a/src/queue.c
+++ b/src/queue.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
diff --git a/src/recur.c b/src/recur.c
index 3a16d1e..12f76b8 100644
--- a/src/recur.c
+++ b/src/recur.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
@@ -517,8 +517,7 @@ char *recur_apoint_scan(FILE *f, struct tm start, struct tm end,
/* Does it occur on the start day? */
if (!recur_item_find_occurrence(tstart, tend - tstart, rpt, NULL,
- update_time_in_date(tstart, 0, 0),
- NULL)) {
+ DAY(tstart), NULL)) {
char *fmt = _("recurrence error: not on start day (%s)");
return day_ins(&fmt, tstart);
}
@@ -590,8 +589,7 @@ char *recur_event_scan(FILE * f, struct tm start, int id,
/* Does it occur on the start day? */
if (!recur_item_find_occurrence(tstart, -1, rpt, NULL,
- update_time_in_date(tstart, 0, 0),
- NULL)) {
+ DAY(tstart), NULL)) {
char *fmt = _("recurrence error: not on start day (%s)");
return day_ins(&fmt, tstart);
}
@@ -1005,14 +1003,20 @@ static int find_occurrence(time_t start, long dur, struct rpt *rpt, llist_t *exc
if (rpt->until && t >= NEXTDAY(rpt->until))
return 0;
- /* Does it span the given day? */
- if (t + DUR(t) < day)
+ /* Does it span the given day?
+ *
+ * NOTE: An appointment ending at 00:00 is not considered to span the
+ * given day, unless the appointment is an appointment without
+ * specified end time, which is internally treated as appointment with
+ * duration 0.
+ */
+ if (t + DUR(t) >= day || (t == day && dur == 0)) {
+ if (occurrence)
+ *occurrence = t;
+ return 1;
+ } else {
return 0;
-
- if (occurrence)
- *occurrence = t;
-
- return 1;
+ }
}
#undef DUR
@@ -1209,7 +1213,7 @@ static int expand_monthly(time_t start, long dur, struct rpt *rpt, llist_t *exc,
-WEEKINDAYS
);
r.until = date_sec_change(
- update_time_in_date(nstart, 0, 0),
+ DAY(nstart),
0,
r.freq * WEEKINDAYS
);
@@ -1243,7 +1247,7 @@ static int expand_monthly(time_t start, long dur, struct rpt *rpt, llist_t *exc,
-WEEKINDAYS
);
r.until = date_sec_change(
- update_time_in_date(nstart, 0, 0),
+ DAY(nstart),
0,
r.freq * WEEKINDAYS
);
@@ -1349,7 +1353,7 @@ static int expand_yearly(time_t start, long dur, struct rpt *rpt, llist_t *exc,
-WEEKINDAYS
);
r.until = date_sec_change(
- update_time_in_date(nstart, 0, 0),
+ DAY(nstart),
0,
r.freq * WEEKINDAYS
);
@@ -1394,7 +1398,7 @@ static int expand_yearly(time_t start, long dur, struct rpt *rpt, llist_t *exc,
-WEEKINDAYS
);
r.until = date_sec_change(
- update_time_in_date(nstart, 0, 0),
+ DAY(nstart),
0,
r.freq * WEEKINDAYS
);
@@ -1840,7 +1844,7 @@ int recur_nth_occurrence(time_t s, long d, struct rpt *r, llist_t *e, int n,
return 0;
for (n--, *nth = s; n > 0; n--) {
- day = update_time_in_date(*nth, 0, 0);
+ day = DAY(*nth);
if (!recur_next_occurrence(s, d, r, e, day, nth))
break;
}
@@ -1854,19 +1858,20 @@ int recur_nth_occurrence(time_t s, long d, struct rpt *r, llist_t *e, int n,
int recur_prev_occurrence(time_t s, long d, struct rpt *r, llist_t *e,
time_t day, time_t *prev)
{
- time_t prev_day, next;
+ int ret = 0;
- if (day <= update_time_in_date(s, 0, 0))
- return 0;
- next = *prev = s;
- while (update_time_in_date(next, 0, 0) < day) {
- /* Set new previous and next. */
- *prev = next;
- prev_day = update_time_in_date(*prev, 0, 0);
- recur_next_occurrence(s, d, r, e, prev_day, &next);
- /* Multi-day appointment */
- if (next == *prev)
- next = NEXTDAY(*prev);
+ if (day <= DAY(s))
+ return ret;
+
+ while (DAY(s) < day) {
+ day = PREVDAY(day);
+ if (recur_item_find_occurrence(s, d, r, e, day, prev)) {
+ /* Multi-day appointment. */
+ if (d != -1 && *prev < day && day < *prev + d)
+ continue;
+ ret = 1;
+ break;
+ }
}
- return 1;
+ return ret;
}
diff --git a/src/sha1.c b/src/sha1.c
index 3826c76..6ab63f8 100644
--- a/src/sha1.c
+++ b/src/sha1.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
@@ -43,6 +43,7 @@
#include <stdlib.h>
#include <string.h>
+#include "config.h"
#include "sha1.h"
#define rol(val, n) (((val) << (n)) | ((val) >> (32 - (n))))
diff --git a/src/sha1.h b/src/sha1.h
index bdba4e8..25d60b9 100644
--- a/src/sha1.h
+++ b/src/sha1.h
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
@@ -52,6 +52,6 @@ typedef struct {
void sha1_init(sha1_ctx_t *);
void sha1_update(sha1_ctx_t *, const uint8_t *, unsigned int);
-void sha1_final(sha1_ctx_t *, uint8_t *);
+void sha1_final(sha1_ctx_t *, uint8_t[SHA1_DIGESTLEN]);
void sha1_digest(const char *, char *);
void sha1_stream(FILE *, char *);
diff --git a/src/sigs.c b/src/sigs.c
index fab4498..9320652 100644
--- a/src/sigs.c
+++ b/src/sigs.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
diff --git a/src/strings.c b/src/strings.c
index b3dc1c4..45c9310 100644
--- a/src/strings.c
+++ b/src/strings.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
diff --git a/src/todo.c b/src/todo.c
index aa77b15..9bd8f8a 100644
--- a/src/todo.c
+++ b/src/todo.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
@@ -158,9 +158,7 @@ void todo_delete(struct todo *todo)
*/
void todo_resort(struct todo *t)
{
- llist_item_t *i = LLIST_FIND_FIRST(&todolist, t, NULL);
- LLIST_REMOVE(&todolist, i);
- LLIST_ADD_SORTED(&todolist, t, todo_cmp);
+ LLIST_REORDER(&todolist, t, todo_cmp);
}
/* Flag a todo item. */
diff --git a/src/ui-calendar.c b/src/ui-calendar.c
index 4a8ef44..c1719d8 100644
--- a/src/ui-calendar.c
+++ b/src/ui-calendar.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
@@ -45,14 +45,14 @@
#include "calcurse.h"
static struct date today, slctd_day;
-static unsigned ui_calendar_view, week_begins_on_monday;
+static unsigned ui_calendar_view;
+static int wday_start; /* this is used in signed arithmetic */
static pthread_mutex_t date_thread_mutex = PTHREAD_MUTEX_INITIALIZER;
-static void draw_monthly_view(struct scrollwin *, struct date *, unsigned);
-static void draw_weekly_view(struct scrollwin *, struct date *, unsigned);
-static void (*draw_calendar[CAL_VIEWS]) (struct scrollwin *, struct date *,
- unsigned) = {
-draw_monthly_view, draw_weekly_view};
+static void draw_monthly_view(struct scrollwin *, struct date *);
+static void draw_weekly_view(struct scrollwin *, struct date *);
+static void (*draw_calendar[CAL_VIEWS]) (struct scrollwin *,
+ struct date *) = {draw_monthly_view, draw_weekly_view};
/* Six weeks cover a month. */
static int monthly_view_cache[WEEKINDAYS * 6];
@@ -148,30 +148,26 @@ struct date *ui_calendar_get_today(void)
/* Needed to display sunday or monday as the first day of week in calendar. */
void ui_calendar_set_first_day_of_week(enum wday first_day)
{
- switch (first_day) {
- case SUNDAY:
- week_begins_on_monday = 0;
- break;
- case MONDAY:
- week_begins_on_monday = 1;
- break;
- default:
+ if (first_day >= 0 && first_day <= 6)
+ wday_start = first_day;
+ else {
ERROR_MSG(_("ERROR setting first day of week"));
- week_begins_on_monday = 0;
- /* NOTREACHED */
+ wday_start = 0;
}
}
/* Swap first day of week in calendar. */
void ui_calendar_change_first_day_of_week(void)
{
- week_begins_on_monday = !week_begins_on_monday;
+ wday_start++;
+ if(wday_start >= WEEKINDAYS)
+ wday_start = 0;
}
/* Return 1 if week begins on monday, 0 otherwise. */
-unsigned ui_calendar_week_begins_on_monday(void)
+int ui_calendar_get_wday_start(void)
{
- return week_begins_on_monday;
+ return wday_start;
}
/* Fill in the given variable with the current date. */
@@ -219,18 +215,14 @@ void ui_calendar_monthly_view_cache_set_invalid(void)
monthly_view_cache_valid = 0;
}
-static int weeknum(const struct tm *t, int firstweekday)
+static int weeknum(const struct tm *t, int wday_start)
{
int wday, wnum;
wday = t->tm_wday;
- if (firstweekday == MONDAY) {
- if (wday == SUNDAY)
- wday = 6;
- else
- wday--;
- }
- wnum = ((t->tm_yday + WEEKINDAYS - wday) / WEEKINDAYS);
+ wnum = ((t->tm_yday + WEEKINDAYS + -modify_wday(wday, -wday_start))
+ / WEEKINDAYS);
+
if (wnum < 0)
wnum = 0;
@@ -296,7 +288,7 @@ static int ISO8601weeknum(const struct tm *t)
* Return the tm structure for the first day of the first week
* (containing a day) of the selected month.
*/
-static struct tm get_first_day(unsigned sunday_first)
+static struct tm get_first_day(int wday_start)
{
struct tm t;
struct date d;
@@ -308,26 +300,20 @@ static struct tm get_first_day(unsigned sunday_first)
t = date2tm(d, 0, 0);
mktime(&t);
/* get the first day of the week */
- date_change(&t, 0,
- -(sunday_first ?
- t.tm_wday :
- (t.tm_wday + WEEKINDAYS - 1) % WEEKINDAYS));
+ date_change(&t, 0, -modify_wday(t.tm_wday, -wday_start));
+
return t;
}
-static struct tm get_first_weekday(unsigned sunday_first)
+static struct tm get_first_weekday(int wday_start)
{
- int c_wday, days_to_remove;
+ int c_wday;
struct tm t;
c_wday = ui_calendar_get_wday(&slctd_day);
- if (sunday_first)
- days_to_remove = c_wday;
- else
- days_to_remove = c_wday == 0 ? WEEKINDAYS - 1 : c_wday - 1;
-
t = date2tm(slctd_day, 0, 0);
- date_change(&t, 0, -days_to_remove);
+
+ date_change(&t, 0, -modify_wday(c_wday, -wday_start));
return t;
}
@@ -346,8 +332,7 @@ static void draw_week_number(struct scrollwin *sw, struct tm t)
/* Draw the monthly view inside calendar panel. */
static void
-draw_monthly_view(struct scrollwin *sw, struct date *current_day,
- unsigned sunday_first)
+draw_monthly_view(struct scrollwin *sw, struct date *current_day)
{
struct date c_day;
int slctd, w_day, numdays, j, week = 0;
@@ -373,7 +358,7 @@ draw_monthly_view(struct scrollwin *sw, struct date *current_day,
* Step forward by week until past the last day of the month.
* The first day of the first week may belong to the previous month.
*/
- t = t_first = get_first_day(sunday_first);
+ t = t_first = get_first_day(wday_start);
t.tm_mday += WEEKINDAYS;
mktime(&t);
last_day += WEEKINDAYS;
@@ -423,7 +408,7 @@ draw_monthly_view(struct scrollwin *sw, struct date *current_day,
custom_apply_attr(sw->inner, ATTR_HIGHEST);
for (j = 0; j < WEEKINDAYS; j++) {
mvwaddstr(sw->inner, ofs_y, ofs_x + weekw + 4 * j,
- nl_langinfo(ABDAY_1 + (1 + j - sunday_first) % WEEKINDAYS));
+ nl_langinfo(ABDAY_1 + modify_wday(j, wday_start)));
}
custom_remove_attr(sw->inner, ATTR_HIGHEST);
WINS_CALENDAR_UNLOCK;
@@ -449,11 +434,9 @@ draw_monthly_view(struct scrollwin *sw, struct date *current_day,
if (j == first_day ||
(mo == 1 && j == WEEKINDAYS) ||
(mo == 12 && j >= 4 * WEEKINDAYS)) {
- if (sunday_first)
- date_change(&t, 0, 1);
+ date_change(&t, 0, WDAY(MONDAY));
week = ISO8601weeknum(&t);
- if (sunday_first)
- date_change(&t, 0, -1);
+ date_change(&t, 0, -WDAY(MONDAY));
} else
week++;
}
@@ -506,8 +489,7 @@ draw_monthly_view(struct scrollwin *sw, struct date *current_day,
/* Draw the weekly view inside calendar panel. */
static void
-draw_weekly_view(struct scrollwin *sw, struct date *current_day,
- unsigned sunday_first)
+draw_weekly_view(struct scrollwin *sw, struct date *current_day)
{
#define DAYSLICESNO 6
const int WCALWIDTH = 28;
@@ -520,14 +502,14 @@ draw_weekly_view(struct scrollwin *sw, struct date *current_day,
OFFX = (wins_sbar_width() - 2 - WCALWIDTH) / 2;
/* Print the week number, calculated from monday. */
- t = get_first_weekday(0);
+ t = get_first_weekday(MONDAY);
draw_week_number(sw, t);
/* Now draw calendar view. */
for (j = 0; j < WEEKINDAYS; j++) {
/* get next day */
if (j == 0)
- t = get_first_weekday(sunday_first);
+ t = get_first_weekday(wday_start);
else
date_change(&t, 0, 1);
@@ -538,7 +520,7 @@ draw_weekly_view(struct scrollwin *sw, struct date *current_day,
/* print the day names, with regards to the first day of the week */
custom_apply_attr(sw->inner, ATTR_HIGHEST);
mvwaddstr(sw->inner, OFFY, OFFX + 4 * j,
- nl_langinfo(ABDAY_1 + (1 + j - sunday_first) % WEEKINDAYS));
+ nl_langinfo(ABDAY_1 + modify_wday(j, wday_start)));
custom_remove_attr(sw->inner, ATTR_HIGHEST);
/* Check if the day to be printed has an item or not. */
@@ -578,9 +560,8 @@ draw_weekly_view(struct scrollwin *sw, struct date *current_day,
if (j != WEEKINDAYS - 1
&& i != DAYSLICESNO - 1) {
WINS_CALENDAR_LOCK;
- mvwhline(sw->inner, OFFY + 2 + i,
- OFFX + 3 + 4 * j, ACS_S9,
- 2);
+ mvwaddstr(sw->inner, OFFY + 2 + i,
+ OFFX + 3 + 4 * j, "__");
WINS_CALENDAR_UNLOCK;
}
if (slices[i]) {
@@ -611,9 +592,9 @@ draw_weekly_view(struct scrollwin *sw, struct date *current_day,
/* Draw marks to indicate midday on the sides of the calendar. */
WINS_CALENDAR_LOCK;
custom_apply_attr(sw->inner, ATTR_HIGHEST);
- mvwhline(sw->inner, OFFY + 1 + DAYSLICESNO / 2, OFFX, ACS_S9, 1);
- mvwhline(sw->inner, OFFY + 1 + DAYSLICESNO / 2,
- OFFX + WCALWIDTH - 1, ACS_S9, 1);
+ mvwaddch(sw->inner, OFFY + 1 + DAYSLICESNO / 2, OFFX, '<');
+ mvwaddch(sw->inner, OFFY + 1 + DAYSLICESNO / 2,
+ OFFX + WCALWIDTH - 1, '>');
custom_remove_attr(sw->inner, ATTR_HIGHEST);
WINS_CALENDAR_UNLOCK;
@@ -624,11 +605,9 @@ draw_weekly_view(struct scrollwin *sw, struct date *current_day,
void ui_calendar_update_panel(void)
{
struct date current_day;
- unsigned sunday_first;
ui_calendar_store_current_date(&current_day);
- sunday_first = !ui_calendar_week_begins_on_monday();
- draw_calendar[ui_calendar_view] (&sw_cal, &current_day, sunday_first);
+ draw_calendar[ui_calendar_view] (&sw_cal, &current_day);
wins_scrollwin_display(&sw_cal, NOHILT);
}
@@ -728,28 +707,14 @@ void ui_calendar_move(enum move move, int count)
ret = date_change(&t, count * YEARINMONTHS, 0);
break;
case WEEK_START:
- /* Normalize struct tm to get week day number. */
mktime(&t);
- if (ui_calendar_week_begins_on_monday())
- days_to_remove =
- ((t.tm_wday ==
- 0) ? WEEKINDAYS - 1 : t.tm_wday - 1);
- else
- days_to_remove =
- ((t.tm_wday == 0) ? 0 : t.tm_wday);
+ days_to_remove = WDAY(t.tm_wday);
days_to_remove += (count - 1) * WEEKINDAYS;
ret = date_change(&t, 0, -days_to_remove);
break;
case WEEK_END:
mktime(&t);
- if (ui_calendar_week_begins_on_monday())
- days_to_add =
- ((t.tm_wday ==
- 0) ? 0 : WEEKINDAYS - t.tm_wday);
- else
- days_to_add = ((t.tm_wday == 0) ?
- WEEKINDAYS - 1 : WEEKINDAYS - 1 -
- t.tm_wday);
+ days_to_add = modify_wday(-t.tm_wday, wday_start - 1);
days_to_add += (count - 1) * WEEKINDAYS;
ret = date_change(&t, 0, days_to_add);
break;
diff --git a/src/ui-day.c b/src/ui-day.c
index 613e242..6a038fa 100644
--- a/src/ui-day.c
+++ b/src/ui-day.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
@@ -79,7 +79,7 @@ void ui_day_find_sel(void)
*/
time_t ui_day_sel_date(void)
{
- return update_time_in_date(ui_day_get_sel()->order, 0, 0);
+ return DAY(ui_day_get_sel()->order);
}
/*
@@ -184,10 +184,9 @@ static void update_start_time(time_t *start, long *dur, struct rpt *rpt, int mov
newtime = day_edit_time(*start, *dur, move);
if (!newtime)
break;
- if (rpt && !recur_item_find_occurrence(
- newtime, *dur, rpt, NULL,
- update_time_in_date(newtime, 0, 0),
- NULL)) {
+ if (rpt && !recur_item_find_occurrence(newtime, *dur, rpt, NULL,
+ DAY(newtime),
+ NULL)) {
msg = day_ins(&msg_match, newtime);
status_mesg(msg, msg_enter);
mem_free(msg);
@@ -786,10 +785,7 @@ static int update_rept(time_t start, long dur, struct rpt **rpt, llist_t *exc,
continue;
}
/* Until is midnight of the day. */
- nrpt.until = date_sec_change(
- update_time_in_date(start, 0, 0),
- 0, days
- );
+ nrpt.until = date_sec_change(DAY(start), 0, days);
} else if (*timstr == '#') {
char *eos;
count = strtol(timstr + 1, &eos, 10);
@@ -802,7 +798,7 @@ static int update_rept(time_t start, long dur, struct rpt **rpt, llist_t *exc,
keys_wgetch(win[KEY].p);
continue;
}
- nrpt.until = update_time_in_date(until, 0, 0);
+ nrpt.until = DAY(until);
break;
} else {
int year, month, day;
@@ -816,7 +812,7 @@ static int update_rept(time_t start, long dur, struct rpt **rpt, llist_t *exc,
nrpt.until = date2sec(d, 0, 0);
}
/* Conmpare days (midnights) - until-day may equal start day. */
- if (nrpt.until >= update_time_in_date(start, 0, 0))
+ if (nrpt.until >= DAY(start))
break;
mem_free(timstr);
@@ -884,7 +880,7 @@ static int update_rept(time_t start, long dur, struct rpt **rpt, llist_t *exc,
keys_wgetch(win[KEY].p);
goto cleanup;
}
- nrpt.until = update_time_in_date(until, 0, 0);
+ nrpt.until = DAY(until);
}
/*
* Check whether the start occurrence matches the recurrence rule, in
@@ -895,8 +891,7 @@ static int update_rept(time_t start, long dur, struct rpt **rpt, llist_t *exc,
char *msg_match =
_("Repetition must begin on start day (%s); "
"any change discarded.");
- if (!recur_item_find_occurrence(start, dur, &nrpt, NULL,
- update_time_in_date(start, 0, 0),
+ if (!recur_item_find_occurrence(start, dur, &nrpt, NULL, DAY(start),
NULL)) {
mem_free(outstr);
outstr = day_ins(&msg_match, start);
@@ -1072,7 +1067,7 @@ void ui_day_item_pipe(void)
return;
wins_prepare_external();
- if ((pid = shell_exec(NULL, &pout, *arg, arg))) {
+ if ((pid = shell_exec(NULL, &pout, NULL, 0, *arg, arg))) {
fpout = fdopen(pout, "w");
switch (p->type) {
@@ -1093,7 +1088,7 @@ void ui_day_item_pipe(void)
}
fclose(fpout);
- child_wait(NULL, &pout, pid);
+ child_wait(NULL, &pout, NULL, pid);
press_any_key();
}
wins_unprepare_external();
@@ -1525,7 +1520,7 @@ void ui_day_draw(int n, WINDOW *win, int y, int hilt, void *cb_data)
{
struct day_item *item = day_get_item(n);
/* The item order always indicates the date. */
- time_t date = update_time_in_date(item->order, 0, 0);
+ time_t date = DAY(item->order);
int width = lb_apt.sw.w - 2, is_slctd;
hilt = hilt && (wins_slctd() == APP);
diff --git a/src/ui-todo.c b/src/ui-todo.c
index 876f570..46933b3 100644
--- a/src/ui-todo.c
+++ b/src/ui-todo.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
@@ -158,11 +158,11 @@ void ui_todo_pipe(void)
return;
wins_prepare_external();
- if ((pid = shell_exec(NULL, &pout, *arg, arg))) {
+ if ((pid = shell_exec(NULL, &pout, NULL, 0, *arg, arg))) {
fpout = fdopen(pout, "w");
todo_write(item, fpout);
fclose(fpout);
- child_wait(NULL, &pout, pid);
+ child_wait(NULL, &pout, NULL, pid);
press_any_key();
}
wins_unprepare_external();
@@ -207,14 +207,16 @@ void ui_todo_draw(int n, WINDOW *win, int y, int hilt, void *cb_data)
if (hilt)
custom_apply_attr(win, ATTR_HIGHEST);
- if (utf8_strwidth(todo->mesg) < width) {
- mesg = todo->mesg;
- } else {
+ mesg = todo->mesg;
+ if (mesg[0] == '\0')
+ mesg = EMPTY_EVENT_DESC_DEFAULT;
+
+ if (utf8_strwidth(mesg) >= width) {
width -= 3;
- for (j = 0; todo->mesg[j] && width > 0; j++) {
- if (!UTF8_ISCONT(todo->mesg[j]))
- width -= utf8_width(&todo->mesg[j]);
- buf[j] = todo->mesg[j];
+ for (j = 0; mesg[j] && width > 0; j++) {
+ if (!UTF8_ISCONT(mesg[j]))
+ width -= utf8_width(&mesg[j]);
+ buf[j] = mesg[j];
}
if (j) {
buf[j - 1] = '.';
@@ -325,6 +327,11 @@ void ui_todo_popup_item(void)
asprintf(&notepath, "%s%s", path_notes, item->note);
fp = fopen(notepath, "r");
+ if (fp == NULL) {
+ item_in_popup(NULL, NULL, item->mesg, _("TODO:"));
+ return;
+ }
+
note_read_contents(note, note_size, fp);
fclose(fp);
mem_free(notepath);
diff --git a/src/utf8.c b/src/utf8.c
index 1fd4c3b..997a4fa 100644
--- a/src/utf8.c
+++ b/src/utf8.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
diff --git a/src/utils.c b/src/utils.c
index 2d2f615..2d30bfc 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
@@ -626,6 +626,42 @@ long min2sec(unsigned minutes)
return minutes * MININSEC;
}
+int modify_wday(int wday, int shift)
+{
+ return (WEEKINDAYS + wday + shift) % WEEKINDAYS;
+}
+
+/* returns char* representing a wday, used for internal functions */
+char *get_wday_default_string(int wday)
+{
+ switch(wday) {
+ case MONDAY:
+ return "Monday";
+ break;
+ case TUESDAY:
+ return "Tuesday";
+ break;
+ case WEDNESDAY:
+ return "Wednesday";
+ break;
+ case THURSDAY:
+ return "Thursday";
+ break;
+ case FRIDAY:
+ return "Friday";
+ break;
+ case SATURDAY:
+ return "Saturday";
+ break;
+ case SUNDAY:
+ return "Sunday";
+ break;
+ default:
+ return "Sunday";
+ break;
+ }
+}
+
/*
* Display a scroll bar when there are so many items that they
* can not be displayed inside the corresponding panel.
@@ -1317,21 +1353,32 @@ void psleep(unsigned secs)
/*
* Fork and execute an external process.
*
- * If pfdin and/or pfdout point to a valid address, a pipe is created and the
- * appropriate file descriptors are written to pfdin/pfdout.
+ * If pfdin/pfdout/pfderr point to a valid address, a pipe is created and the
+ * appropriate file descriptors are written to pfdin/pfdout/pfderr.
+ *
+ * If new_session is non-zero, setsid() is called after forking.
*/
-int fork_exec(int *pfdin, int *pfdout, const char *path,
- const char *const *arg)
+int fork_exec(int *pfdin, int *pfdout, int *pfderr, int new_session,
+ const char *path, const char *const *arg)
{
- int pin[2], pout[2];
+ int pin[2], pout[2], perr[2];
int pid;
if (pfdin && (pipe(pin) == -1))
return 0;
if (pfdout && (pipe(pout) == -1))
return 0;
+ if (pfderr && (pipe(perr) == -1))
+ return 0;
if ((pid = fork()) == 0) {
+ if (pfderr) {
+ if (dup2(perr[0], STDERR_FILENO) < 0)
+ _exit(127);
+ close(perr[0]);
+ close(perr[1]);
+ }
+
if (pfdout) {
if (dup2(pout[0], STDIN_FILENO) < 0)
_exit(127);
@@ -1346,6 +1393,11 @@ int fork_exec(int *pfdin, int *pfdout, const char *path,
close(pin[1]);
}
+ if (new_session) {
+ if ((setsid() < 0))
+ _exit(127);
+ }
+
execvp(path, (char *const *)arg);
_exit(127);
} else {
@@ -1353,6 +1405,8 @@ int fork_exec(int *pfdin, int *pfdout, const char *path,
close(pin[1]);
if (pfdout)
close(pout[0]);
+ if (pfderr)
+ close(perr[0]);
if (pid > 0) {
if (pfdin) {
@@ -1363,11 +1417,17 @@ int fork_exec(int *pfdin, int *pfdout, const char *path,
fcntl(pout[1], F_SETFD, FD_CLOEXEC);
*pfdout = pout[1];
}
+ if (pfderr) {
+ fcntl(perr[1], F_SETFD, FD_CLOEXEC);
+ *pfderr = perr[1];
+ }
} else {
if (pfdin)
close(pin[0]);
if (pfdout)
close(pout[1]);
+ if (pfderr)
+ close(perr[1]);
return 0;
}
}
@@ -1376,8 +1436,8 @@ int fork_exec(int *pfdin, int *pfdout, const char *path,
/* Execute an external program in a shell. */
int
-shell_exec(int *pfdin, int *pfdout, const char *path,
- const char *const *arg)
+shell_exec(int *pfdin, int *pfdout, int *pfderr, int new_session,
+ const char *path, const char *const *arg)
{
int argc, i;
const char **narg;
@@ -1406,7 +1466,7 @@ shell_exec(int *pfdin, int *pfdout, const char *path,
narg[3] = NULL;
}
- ret = fork_exec(pfdin, pfdout, *narg, narg);
+ ret = fork_exec(pfdin, pfdout, pfderr, new_session, *narg, narg);
if (arg0)
mem_free(arg0);
@@ -1416,7 +1476,7 @@ shell_exec(int *pfdin, int *pfdout, const char *path,
}
/* Wait for a child process to terminate. */
-int child_wait(int *pfdin, int *pfdout, int pid)
+int child_wait(int *pfdin, int *pfdout, int *pfderr, int pid)
{
int stat;
@@ -1424,6 +1484,8 @@ int child_wait(int *pfdin, int *pfdout, int pid)
close(*pfdin);
if (pfdout)
close(*pfdout);
+ if (pfderr)
+ close(*pfderr);
if (waitpid(pid, &stat, 0) == pid)
return stat;
@@ -1643,7 +1705,7 @@ static void print_date(time_t date, time_t day, const char *extformat)
if (!strcmp(extformat, "epoch")) {
printf("%ld", (long)date);
} else {
- time_t day_start = update_time_in_date(day, 0, 0);
+ time_t day_start = DAY(day);
time_t day_end = date_sec_change(day_start, 0, 1);
struct tm lt;
@@ -2079,8 +2141,7 @@ char *day_ins(char **template, time_t t)
{
char *day, *msg;
- day = date_sec2date_str(update_time_in_date(t, 0 , 0),
- DATEFMT(conf.input_datefmt));
+ day = date_sec2date_str(DAY(t), DATEFMT(conf.input_datefmt));
asprintf(&msg, *template, day);
mem_free(day);
return msg;
diff --git a/src/vars.c b/src/vars.c
index 2c308e7..97a129a 100644
--- a/src/vars.c
+++ b/src/vars.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
@@ -140,6 +140,7 @@ void vars_init(void)
conf.input_datefmt = 1;
conf.heading_pos = RIGHT;
strcpy(conf.day_heading, DAY_HEADING_DEFAULT);
+ strcpy(conf.timefmt, APPT_TIME_DEFAULT);
datefmt_str[0] = _("mm/dd/yyyy");
datefmt_str[1] = _("dd/mm/yyyy");
@@ -174,6 +175,8 @@ void vars_init(void)
ui_calendar_set_first_day_of_week(MONDAY);
+ wins_set_sbar_width(col * SBARMINWIDTH / 100);
+
/* Pad structure to scroll text inside the appointment panel */
apad.length = 1;
apad.first_onscreen = 0;
diff --git a/src/vector.c b/src/vector.c
index fd468ab..796ef8e 100644
--- a/src/vector.c
+++ b/src/vector.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
diff --git a/src/vector.h b/src/vector.h
index 86cb3b8..7648df2 100644
--- a/src/vector.h
+++ b/src/vector.h
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
diff --git a/src/wins.c b/src/wins.c
index 5f4c0ba..46ac98e 100644
--- a/src/wins.c
+++ b/src/wins.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
@@ -63,7 +63,7 @@ static int layout;
/*
* The screen_mutex mutex and wins_refresh(), wins_wrefresh(), wins_doupdate()
* functions are used to prevent concurrent updates of the screen.
- * It was observed that the display could get screwed up when mulitple threads
+ * It was observed that the display could get screwed up when multiple threads
* tried to refresh the screen at the same time.
*
* Note (2010-03-21):
@@ -229,7 +229,7 @@ void wins_sbar_winc(void)
void wins_sbar_wdec(void)
{
- if (sbarwidth_perc > 0)
+ if (col * sbarwidth_perc / 100 > SBARMINWIDTH)
sbarwidth_perc--;
}
@@ -254,6 +254,15 @@ void wins_slctd_next(void)
slctd_win++;
}
+/* Shift-TAB key was hit in the interface, need to select previous window. */
+void wins_slctd_prev(void)
+{
+ if (slctd_win == CAL)
+ slctd_win = TOD;
+ else
+ slctd_win--;
+}
+
static void wins_init_panels(void)
{
wins_scrollwin_init(&sw_cal, win[CAL].y, win[CAL].x,
@@ -624,8 +633,8 @@ void wins_launch_external(const char *arg[])
int pid;
wins_prepare_external();
- if ((pid = shell_exec(NULL, NULL, *arg, arg)))
- child_wait(NULL, NULL, pid);
+ if ((pid = shell_exec(NULL, NULL, NULL, 0, *arg, arg)))
+ child_wait(NULL, NULL, NULL, pid);
wins_unprepare_external();
}
@@ -651,6 +660,7 @@ void wins_update_bindings(void)
static int bindings_cal[] = {
KEY_GENERIC_HELP, KEY_GENERIC_QUIT, KEY_GENERIC_SAVE,
KEY_GENERIC_RELOAD, KEY_GENERIC_CHANGE_VIEW,
+ KEY_GENERIC_PREV_VIEW,
KEY_GENERIC_SCROLL_DOWN, KEY_GENERIC_SCROLL_UP, KEY_MOVE_UP,
KEY_MOVE_DOWN, KEY_MOVE_LEFT, KEY_MOVE_RIGHT, KEY_GENERIC_GOTO,
KEY_GENERIC_IMPORT, KEY_GENERIC_EXPORT, KEY_START_OF_WEEK,
@@ -666,6 +676,7 @@ void wins_update_bindings(void)
static int bindings_apoint[] = {
KEY_GENERIC_HELP, KEY_GENERIC_QUIT, KEY_GENERIC_SAVE,
KEY_GENERIC_RELOAD, KEY_GENERIC_CHANGE_VIEW,
+ KEY_GENERIC_PREV_VIEW,
KEY_GENERIC_IMPORT, KEY_GENERIC_EXPORT, KEY_ADD_ITEM,
KEY_DEL_ITEM, KEY_EDIT_ITEM, KEY_VIEW_ITEM, KEY_PIPE_ITEM,
KEY_GENERIC_REDRAW, KEY_REPEAT_ITEM, KEY_FLAG_ITEM,
@@ -682,6 +693,7 @@ void wins_update_bindings(void)
static int bindings_todo[] = {
KEY_GENERIC_HELP, KEY_GENERIC_QUIT, KEY_GENERIC_SAVE,
KEY_GENERIC_RELOAD, KEY_GENERIC_CHANGE_VIEW,
+ KEY_GENERIC_PREV_VIEW,
KEY_GENERIC_SCROLL_DOWN, KEY_GENERIC_SCROLL_UP,
KEY_GENERIC_IMPORT, KEY_GENERIC_EXPORT, KEY_ADD_ITEM,
KEY_DEL_ITEM, KEY_EDIT_ITEM, KEY_VIEW_ITEM, KEY_PIPE_ITEM,
diff --git a/test/data/ical-009.ical b/test/data/ical-009.ical
index 3495223..14bf4eb 100644
--- a/test/data/ical-009.ical
+++ b/test/data/ical-009.ical
@@ -1,9 +1,9 @@
BEGIN:VCALENDAR
VERSION:2.0
BEGIN:VEVENT
-DTSTART:20200318T084100
DURATION:PT1H30M0S
SUMMARY:A simple appointment
+DTSTART:20200318T084100
END:VEVENT
BEGIN:VTODO
PRIORITY:1
@@ -12,6 +12,10 @@ END:VTODO
BEGIN:VEVENT
DTSTART:
DURATION:PT1H30M0S
+SUMMARY:invalid start time
+END:VEVENT
+BEGIN:VEVENT
+DURATION:PT1H30M0S
SUMMARY:missing start time
END:VEVENT
BEGIN:VEVENT
@@ -39,6 +43,12 @@ END:VEVENT
BEGIN:VEVENT
DTSTART:20200318T084100
DURATION:PT1H30M0S
+EXDATE:20200324T084100
+SUMMARY:exdate\, missing rrule
+END:VEVENT
+BEGIN:VEVENT
+DTSTART:20200318T084100
+DURATION:PT1H30M0S
SUMMARY:Summary with more than\none line
END:VEVENT
BEGIN:VEVENT
diff --git a/test/ical-001.sh b/test/ical-001.sh
index 4ff1bfe..c8005a7 100755
--- a/test/ical-001.sh
+++ b/test/ical-001.sh
@@ -3,12 +3,12 @@
. "${TEST_INIT:-./test-init.sh}"
if [ "$1" = 'actual' ]; then
- mkdir .calcurse || exit 1
- cp "$DATA_DIR/conf" .calcurse || exit 1
- "$CALCURSE" -D "$PWD/.calcurse" -i "$DATA_DIR/ical-001.ical"
- "$CALCURSE" -D "$PWD/.calcurse" -s01/01/1980 -r2
- "$CALCURSE" -D "$PWD/.calcurse" -t
- rm -rf .calcurse || exit 1
+ tmpdir=$(mktemp -d)
+ cp "$DATA_DIR/conf" "$tmpdir" || exit 1
+ "$CALCURSE" -D "$tmpdir" -i "$DATA_DIR/ical-001.ical"
+ "$CALCURSE" -D "$tmpdir" -s01/01/1980 -r2
+ "$CALCURSE" -D "$tmpdir" -t
+ rm -rf "$tmpdir" || exit 1
elif [ "$1" = 'expected' ]; then
cat <<EOD
Import process report: 0012 lines read
diff --git a/test/ical-002.sh b/test/ical-002.sh
index 0b74b19..eeecab4 100755
--- a/test/ical-002.sh
+++ b/test/ical-002.sh
@@ -3,11 +3,11 @@
. "${TEST_INIT:-./test-init.sh}"
if [ "$1" = 'actual' ]; then
- mkdir .calcurse || exit 1
- cp "$DATA_DIR/conf" .calcurse || exit 1
- "$CALCURSE" -D "$PWD/.calcurse" -i "$DATA_DIR/ical-002.ical"
- "$CALCURSE" -D "$PWD/.calcurse" -s01/01/2000 -r2
- rm -rf .calcurse || exit 1
+ tmpdir=$(mktemp -d)
+ cp "$DATA_DIR/conf" "$tmpdir" || exit 1
+ "$CALCURSE" -D "$tmpdir" -i "$DATA_DIR/ical-002.ical"
+ "$CALCURSE" -D "$tmpdir" -s01/01/2000 -r2
+ rm -rf "$tmpdir" || exit 1
elif [ "$1" = 'expected' ]; then
cat <<EOD
Import process report: 0028 lines read
diff --git a/test/ical-003.sh b/test/ical-003.sh
index cff65c0..ace0165 100755
--- a/test/ical-003.sh
+++ b/test/ical-003.sh
@@ -4,13 +4,13 @@
. "${TEST_INIT:-./test-init.sh}"
if [ "$1" = 'actual' ]; then
- mkdir .calcurse || exit 1
- cp "$DATA_DIR/conf" .calcurse || exit 1
- "$CALCURSE" -D "$PWD/.calcurse" -i "$DATA_DIR/ical-003.ical"
- "$CALCURSE" -D "$PWD/.calcurse" -s01/01/2000 -r365
- "$CALCURSE" -D "$PWD/.calcurse" -s05/01/2020 --to 01/01/2023
- cat "$PWD/.calcurse/notes"/*
- rm -rf .calcurse || exit 1
+ tmpdir=$(mktemp -d)
+ cp "$DATA_DIR/conf" "$tmpdir" || exit 1
+ "$CALCURSE" -D "$tmpdir" -i "$DATA_DIR/ical-003.ical"
+ "$CALCURSE" -D "$tmpdir" -s01/01/2000 -r365
+ "$CALCURSE" -D "$tmpdir" -s05/01/2020 --to 01/01/2023
+ cat "$tmpdir/notes"/*
+ rm -rf "$tmpdir" || exit 1
elif [ "$1" = 'expected' ]; then
cat <<EOD
Import process report: 0070 lines read
diff --git a/test/ical-004.sh b/test/ical-004.sh
index 7be6d1c..1d19d73 100755
--- a/test/ical-004.sh
+++ b/test/ical-004.sh
@@ -3,12 +3,12 @@
. "${TEST_INIT:-./test-init.sh}"
if [ "$1" = 'actual' ]; then
- mkdir .calcurse || exit 1
- cp "$DATA_DIR/conf" .calcurse || exit 1
- "$CALCURSE" -D "$PWD/.calcurse" -i "$DATA_DIR/ical-004.ical"
- "$CALCURSE" -D "$PWD/.calcurse" -s01/01/1980 -r2
- "$CALCURSE" -D "$PWD/.calcurse" -t
- rm -rf .calcurse || exit 1
+ tmpdir=$(mktemp -d)
+ cp "$DATA_DIR/conf" "$tmpdir" || exit 1
+ "$CALCURSE" -D "$tmpdir" -i "$DATA_DIR/ical-004.ical"
+ "$CALCURSE" -D "$tmpdir" -s01/01/1980 -r2
+ "$CALCURSE" -D "$tmpdir" -t
+ rm -rf "$tmpdir" || exit 1
elif [ "$1" = 'expected' ]; then
cat <<EOD
Import process report: 0012 lines read
diff --git a/test/ical-005.sh b/test/ical-005.sh
index 5d38301..47891ee 100755
--- a/test/ical-005.sh
+++ b/test/ical-005.sh
@@ -3,12 +3,12 @@
. "${TEST_INIT:-./test-init.sh}"
if [ "$1" = 'actual' ]; then
- mkdir .calcurse || exit 1
- cp "$DATA_DIR/conf" .calcurse || exit 1
- "$CALCURSE" -D "$PWD/.calcurse" -i "$DATA_DIR/ical-005.ical"
- "$CALCURSE" -D "$PWD/.calcurse" -s10/03/2013 -r3
- cat "$PWD/.calcurse/notes"/*
- rm -rf .calcurse || exit 1
+ tmpdir=$(mktemp -d)
+ cp "$DATA_DIR/conf" "$tmpdir" || exit 1
+ "$CALCURSE" -D "$tmpdir" -i "$DATA_DIR/ical-005.ical"
+ "$CALCURSE" -D "$tmpdir" -s10/03/2013 -r3
+ cat "$tmpdir/notes"/*
+ rm -rf "$tmpdir" || exit 1
elif [ "$1" = 'expected' ]; then
cat <<EOD
Import process report: 0023 lines read
diff --git a/test/ical-006.sh b/test/ical-006.sh
index 6899d42..b923712 100755
--- a/test/ical-006.sh
+++ b/test/ical-006.sh
@@ -3,11 +3,11 @@
. "${TEST_INIT:-./test-init.sh}"
if [ "$1" = 'actual' ]; then
- mkdir .calcurse || exit 1
- cp "$DATA_DIR/conf" .calcurse || exit 1
- "$CALCURSE" -D "$PWD/.calcurse" -i "$DATA_DIR/ical-006.ical"
- "$CALCURSE" -D "$PWD/.calcurse" -s06/01/2012 -r2
- rm -rf .calcurse || exit 1
+ tmpdir=$(mktemp -d)
+ cp "$DATA_DIR/conf" "$tmpdir" || exit 1
+ "$CALCURSE" -D "$tmpdir" -i "$DATA_DIR/ical-006.ical"
+ "$CALCURSE" -D "$tmpdir" -s06/01/2012 -r2
+ rm -rf "$tmpdir" || exit 1
elif [ "$1" = 'expected' ]; then
cat <<EOD
Import process report: 0063 lines read
diff --git a/test/ical-007.sh b/test/ical-007.sh
index 59b7bf8..82405c9 100755
--- a/test/ical-007.sh
+++ b/test/ical-007.sh
@@ -3,13 +3,13 @@
. "${TEST_INIT:-./test-init.sh}"
if [ "$1" = 'actual' ]; then
- mkdir .calcurse || exit 1
- cp "$DATA_DIR/conf" .calcurse || exit 1
- TZ="America/New_York" "$CALCURSE" -D "$PWD/.calcurse" \
+ tmpdir=$(mktemp -d)
+ cp "$DATA_DIR/conf" "$tmpdir" || exit 1
+ TZ="America/New_York" "$CALCURSE" -D "$tmpdir" \
-i "$DATA_DIR/ical-007.ical"
- "$CALCURSE" -D "$PWD/.calcurse" -s02/23/2015
- cat "$PWD/.calcurse/notes/"*
- rm -rf .calcurse || exit 1
+ "$CALCURSE" -D "$tmpdir" -s02/23/2015
+ cat "$tmpdir/notes/"*
+ rm -rf "$tmpdir" || exit 1
elif [ "$1" = 'expected' ]; then
cat <<EOD
Import process report: 0018 lines read
diff --git a/test/ical-008.sh b/test/ical-008.sh
index b659eb0..344fa8a 100755
--- a/test/ical-008.sh
+++ b/test/ical-008.sh
@@ -3,12 +3,12 @@
. "${TEST_INIT:-./test-init.sh}"
if [ "$1" = 'actual' ]; then
- mkdir .calcurse || exit 1
- cp "$DATA_DIR/conf" .calcurse || exit 1
- "$CALCURSE" -D "$PWD/.calcurse" -i "$DATA_DIR/ical-008.ical"
- "$CALCURSE" -D "$PWD/.calcurse" -s01/01/1980 -r2
- "$CALCURSE" -D "$PWD/.calcurse" -t
- rm -rf .calcurse || exit 1
+ tmpdir=$(mktemp -d)
+ cp "$DATA_DIR/conf" "$tmpdir" || exit 1
+ "$CALCURSE" -D "$tmpdir" -i "$DATA_DIR/ical-008.ical"
+ "$CALCURSE" -D "$tmpdir" -s01/01/1980 -r2
+ "$CALCURSE" -D "$tmpdir" -t
+ rm -rf "$tmpdir" || exit 1
elif [ "$1" = 'expected' ]; then
cat <<EOD
Import process report: 0012 lines read
diff --git a/test/ical-009.sh b/test/ical-009.sh
index 9015323..6c1a0d4 100755
--- a/test/ical-009.sh
+++ b/test/ical-009.sh
@@ -4,40 +4,41 @@
. "${TEST_INIT:-./test-init.sh}"
if [ "$1" = 'actual' ]; then
- mkdir .calcurse || exit 1
- cp "$DATA_DIR/conf" .calcurse || exit 1
- out=$("$CALCURSE" -D "$PWD/.calcurse" -i "$DATA_DIR/ical-009.ical" 2>&1)
+ tmpdir=$(mktemp -d)
+ cp "$DATA_DIR/conf" "$tmpdir" || exit 1
+ out=$("$CALCURSE" -D "$tmpdir" -i "$DATA_DIR/ical-009.ical" 2>&1)
# Print the import report (stdout).
echo "$out" | awk '$1 == "Import"; $2 == "apps"'
# Find the log file and print the log messages (stderr).
logfile=$(echo "$out" | awk '$1 == "See" { print $2 }')
sed '1,18d' "$logfile"
# One empty note file.
- cat "$PWD/.calcurse/notes"/* | wc | awk '{ print $1 $2 $3 }'
- rm -rf .calcurse || exit 1
+ cat "$tmpdir/notes"/* | wc | awk '{ print $1 $2 $3 }'
+ rm -rf "$tmpdir" || exit 1
elif [ "$1" = 'expected' ]; then
cat <<EOD
-Import process report: 0121 lines read
-2 apps / 0 events / 1 todo / 19 skipped
+Import process report: 0131 lines read
+3 apps / 0 events / 1 todo / 20 skipped
VEVENT [12]: invalid or malformed event start time.
-VEVENT [17]: rrule frequency not supported.
-VEVENT [23]: malformed summary line.
-VTODO [28]: item priority is invalid (must be between 0 and 9).
-VEVENT [32]: malformed exceptions line.
-VEVENT [39]: line break in summary.
-VEVENT [44]: malformed description line.
-VEVENT [50]: malformed description.
-VTODO [62]: malformed summary.
-VEVENT [66]: only one location allowed.
-VEVENT [73]: invalid duration.
-VEVENT [78]: invalid or malformed event start time.
-VEVENT [83]: invalid end time value type.
-VEVENT [88]: invalid until format.
-VEVENT [94]: invalid exception date value type.
-VEVENT [101]: invalid exception.
-VEVENT [108]: either end or duration.
-VEVENT [114]: end must be later than start.
-VTODO [119]: The ical file seems to be malformed. The end of item was not found.
+VEVENT [17]: item start date not defined.
+VEVENT [21]: rrule frequency not supported.
+VEVENT [27]: malformed summary line.
+VTODO [32]: item priority is invalid (must be between 0 and 9).
+VEVENT [36]: malformed exceptions line.
+VEVENT [43]: exception date, but no recurrence rule.
+VEVENT [54]: malformed description line.
+VEVENT [60]: malformed description.
+VTODO [72]: malformed summary.
+VEVENT [76]: only one location allowed.
+VEVENT [83]: invalid duration.
+VEVENT [88]: invalid or malformed event start time.
+VEVENT [93]: invalid end time value type.
+VEVENT [98]: invalid until format.
+VEVENT [104]: invalid exception date value type.
+VEVENT [111]: invalid exception.
+VEVENT [118]: either end or duration.
+VEVENT [124]: end must be later than start.
+VTODO [129]: The ical file seems to be malformed. The end of item was not found.
101
EOD
else
diff --git a/test/ical-010.sh b/test/ical-010.sh
index 7cb1002..e66538c 100755
--- a/test/ical-010.sh
+++ b/test/ical-010.sh
@@ -4,12 +4,12 @@
. "${TEST_INIT:-./test-init.sh}"
if [ "$1" = 'actual' ]; then
- mkdir .calcurse || exit 1
- cp "$DATA_DIR/conf" .calcurse || exit 1
- cp "$DATA_DIR/apts-export" .calcurse/apts || exit 1
- cp "$DATA_DIR/todo-export" .calcurse/todo || exit 1
- "$CALCURSE" -D "$PWD/.calcurse" --export=ical | sed '/^PRODID/d'
- rm -rf .calcurse || exit 1
+ tmpdir=$(mktemp -d)
+ cp "$DATA_DIR/conf" "$tmpdir" || exit 1
+ cp "$DATA_DIR/apts-export" "$tmpdir"/apts || exit 1
+ cp "$DATA_DIR/todo-export" "$tmpdir"/todo || exit 1
+ "$CALCURSE" -D "$tmpdir" --export=ical | sed '/^PRODID/d'
+ rm -rf "$tmpdir" || exit 1
elif [ "$1" = 'expected' ]; then
cat <<EOD
BEGIN:VCALENDAR
diff --git a/test/ical-011.sh b/test/ical-011.sh
index 4b6c238..1b76e6d 100755
--- a/test/ical-011.sh
+++ b/test/ical-011.sh
@@ -3,18 +3,17 @@
. "${TEST_INIT:-./test-init.sh}"
-mkdir .calcurse || exit 1
-cp "$DATA_DIR/conf" .calcurse || exit 1
-cp "$DATA_DIR/apts-export" .calcurse/apts || exit 1
-cp "$DATA_DIR/todo-export" .calcurse/todo || exit 1
+tmpdir=$(mktemp -d)
+cp "$DATA_DIR/conf" "$tmpdir" || exit 1
+cp "$DATA_DIR/apts-export" "$tmpdir"/apts || exit 1
+cp "$DATA_DIR/todo-export" "$tmpdir"/todo || exit 1
-"$CALCURSE" -D "$PWD/.calcurse" --export=ical > "$PWD"/.calcurse/export.ical &&
-(cd .calcurse; mv apts apts-export; mv todo todo-export) &&
-"$CALCURSE" -D "$PWD/.calcurse" --quiet --import \
- "$PWD"/.calcurse/export.ical &&
-(cd .calcurse; cmp -s apts-export apts) &&
-(cd .calcurse; cmp -s todo-export todo) &&
+"$CALCURSE" -D "$tmpdir" --export=ical >"$tmpdir"/export.ical &&
+(cd "$tmpdir"; mv apts apts-export; mv todo todo-export) &&
+"$CALCURSE" -D "$tmpdir" --quiet --import "$tmpdir"/export.ical &&
+(cd "$tmpdir"; cmp -s apts-export apts) &&
+(cd "$tmpdir"; cmp -s todo-export todo) &&
status=0 || status=1
-rm -rf .calcurse
+rm -rf "$tmpdir" || exit 1
exit $status
diff --git a/test/ical-012.sh b/test/ical-012.sh
index f4b27df..38ae673 100755
--- a/test/ical-012.sh
+++ b/test/ical-012.sh
@@ -7,11 +7,11 @@
. "${TEST_INIT:-./test-init.sh}"
if [ "$1" = 'actual' ]; then
- mkdir .calcurse &&
- cp "$DATA_DIR/conf" .calcurse || exit 1
- "$CALCURSE" -D "$PWD/.calcurse" -i "$DATA_DIR/ical-012.ical"
- (cd "$PWD/.calcurse/notes/"; cat $(ls -S1))
- rm -rf .calcurse || exit 1
+ tmpdir=$(mktemp -d)
+ cp "$DATA_DIR/conf" "$tmpdir" || exit 1
+ "$CALCURSE" -D "$tmpdir" -i "$DATA_DIR/ical-012.ical"
+ (cd "$tmpdir/notes/"; cat $(ls -S1))
+ rm -rf "$tmpdir" || exit 1
elif [ "$1" = 'expected' ]; then
cat <<EOD
Import process report: 0089 lines read
diff --git a/test/ical-013.sh b/test/ical-013.sh
index f5d012b..6509996 100755
--- a/test/ical-013.sh
+++ b/test/ical-013.sh
@@ -4,11 +4,11 @@
. "${TEST_INIT:-./test-init.sh}"
if [ "$1" = 'actual' ]; then
- mkdir .calcurse || exit 1
- cp "$DATA_DIR/conf" .calcurse || exit 1
- TZ=America/New_York "$CALCURSE" -D "$PWD/.calcurse" -i "$DATA_DIR/rfc5545.ical"
- "$CALCURSE" -D "$PWD/.calcurse" -s09/01/1997 -r365
- rm -rf .calcurse || exit 1
+ tmpdir=$(mktemp -d)
+ cp "$DATA_DIR/conf" "$tmpdir" || exit 1
+ TZ=America/New_York "$CALCURSE" -D "$tmpdir" -i "$DATA_DIR/rfc5545.ical"
+ "$CALCURSE" -D "$tmpdir" -s09/01/1997 -r365
+ rm -rf "$tmpdir" || exit 1
elif [ "$1" = 'expected' ]; then
cat <<EOD
Import process report: 0238 lines read
diff --git a/test/ical-014.sh b/test/ical-014.sh
index 68f36a1..18134bf 100755
--- a/test/ical-014.sh
+++ b/test/ical-014.sh
@@ -4,17 +4,17 @@
. "${TEST_INIT:-./test-init.sh}"
if [ "$1" = 'actual' ]; then
- mkdir .calcurse || exit 1
- cp "$DATA_DIR/conf" .calcurse || exit 1
- "$CALCURSE" -q -D "$PWD/.calcurse" -i "$DATA_DIR/ical-014.ical"
- "$CALCURSE" -D "$PWD/.calcurse" -x |
+ tmpdir=$(mktemp -d)
+ cp "$DATA_DIR/conf" "$tmpdir" || exit 1
+ "$CALCURSE" -q -D "$tmpdir" -i "$DATA_DIR/ical-014.ical"
+ "$CALCURSE" -D "$tmpdir" -x |
sed -n '
/DESCRIPTION/p
/LOCATION/p
/COMMENT/p
' |
sort
- rm -rf .calcurse || exit 1
+ rm -rf "$tmpdir" || exit 1
elif [ "$1" = 'expected' ]; then
cat "$DATA_DIR/ical-014.ical" |
sed -n '
diff --git a/test/io-005.sh b/test/io-005.sh
index c5ebcc7..6b03908 100755
--- a/test/io-005.sh
+++ b/test/io-005.sh
@@ -3,7 +3,6 @@
. "${TEST_INIT:-./test-init.sh}"
home=$(mktemp -d)
-CALCURSE=$(readlink -f "$CALCURSE")
(unset -v XDG_DATA_HOME XDG_CONFIG_HOME; HOME="$home" "$CALCURSE" -a)
[ -f "$home/.local/share/calcurse/apts" ] && [ -f "$home/.config/calcurse/conf" ] && failed=0 || failed=1
diff --git a/test/io-006.sh b/test/io-006.sh
index 4184d9f..babcfcd 100755
--- a/test/io-006.sh
+++ b/test/io-006.sh
@@ -3,7 +3,6 @@
. "${TEST_INIT:-./test-init.sh}"
dir=$(mktemp -d)
-CALCURSE=$(readlink -f "$CALCURSE")
cd "$dir"
(unset -v HOME XDG_DATA_HOME XDG_CONFIG_HOME; "$CALCURSE" -a)
[ -f "$dir/.calcurse/apts" ] && [ -f "$dir/.calcurse/conf" ] && failed=0 || failed=1
diff --git a/test/run-test.c b/test/run-test.c
index d1db112..41d55ad 100644
--- a/test/run-test.c
+++ b/test/run-test.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 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
diff --git a/test/test-init.sh b/test/test-init.sh
index c95c884..92ad779 100644
--- a/test/test-init.sh
+++ b/test/test-init.sh
@@ -2,3 +2,8 @@
CALCURSE=${CALCURSE:-../src/calcurse}
DATA_DIR=${DATA_DIR:-data/}
+
+case "$CALCURSE" in
+ /*) ;;
+ *) CALCURSE="${PWD}/${CALCURSE}" ;;
+esac