Hello community,

here is the log from the commit of package calcurse for openSUSE:Factory 
checked in at 2016-10-23 12:52:54
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/calcurse (Old)
 and      /work/SRC/openSUSE:Factory/.calcurse.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "calcurse"

Changes:
--------
--- /work/SRC/openSUSE:Factory/calcurse/calcurse.changes        2016-08-09 
22:14:37.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.calcurse.new/calcurse.changes   2016-10-23 
12:53:00.000000000 +0200
@@ -1,0 +2,21 @@
+Fri Oct 21 19:08:55 UTC 2016 - [email protected]
+
+- Update to version 4.2.0
+  * In the calendar panel, days with non-recurrent items now have 
+    another color as days containing recurrent items only.
+  * Automatically select new appointments/events after creation.
+  * Support for (optional) dates when specifying the start/end time of items.
+    Allows for easily moving items and adding appointments without switching
+    the selected day beforehand.
+  * Encoding fixes in calcurse-caldav
+  * Avoid notification bar artifacts after leaving calcurse.
+  * Fixes to the key binding pagination
+  * Do not change selection unexpectedly after modifying items.
+- Remove useless dependencies
+  * autoconf
+  * automake
+  * gcc
+  * gettext
+  * make
+
+-------------------------------------------------------------------

Old:
----
  calcurse-4.1.0.tar.gz

New:
----
  calcurse-4.2.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ calcurse.spec ++++++
--- /var/tmp/diff_new_pack.2Xo2hO/_old  2016-10-23 12:53:02.000000000 +0200
+++ /var/tmp/diff_new_pack.2Xo2hO/_new  2016-10-23 12:53:02.000000000 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           calcurse
-Version:        4.1.0
+Version:        4.2.0
 Release:        0
 Summary:        Text-based Organizer
 License:        BSD-2-Clause
@@ -26,14 +26,9 @@
 Source1:        %{name}.desktop
 Url:            http://calcurse.org
 BuildRoot:      %{_tmppath}/%{name}-%{version}-build
-BuildRequires:  autoconf
-BuildRequires:  automake
-BuildRequires:  gcc
-BuildRequires:  gettext
 BuildRequires:  gettext-devel
 BuildRequires:  glibc-devel
 BuildRequires:  libtool
-BuildRequires:  make
 BuildRequires:  ncurses-devel
 BuildRequires:  update-desktop-files
 
@@ -51,25 +46,25 @@
 
 %build
 %configure
-%__make %{?_smp_flags}
+make %{?_smp_flags}
 
 %install
 %makeinstall
 
-%__rm -rf "%{buildroot}%{_datadir}/doc"
+rm -rf "%{buildroot}%{_datadir}/doc"
 
-%__install -D -m 0644 "%{SOURCE1}" 
"%{buildroot}%{_datadir}/applications/%{name}.desktop"
+install -D -m 0644 "%{SOURCE1}" 
"%{buildroot}%{_datadir}/applications/%{name}.desktop"
 %if 0%{?suse_version} > 0
 %suse_update_desktop_file -r "%{name}" Office Calendar
 %endif
 
-%__mv \
+mv \
     "%{buildroot}%{_datadir}/locale/en" \
     "%{buildroot}%{_datadir}/locale/en_US"
 
 %find_lang %{name}
 
-%__chmod 0644 AUTHORS COPYING NEWS README
+chmod 0644 AUTHORS COPYING NEWS README
 
 %files
 %defattr(-,root,root)

++++++ calcurse-4.1.0.tar.gz -> calcurse-4.2.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/calcurse-4.1.0/.version new/calcurse-4.2.0/.version
--- old/calcurse-4.1.0/.version 2016-04-12 20:37:21.000000000 +0200
+++ new/calcurse-4.2.0/.version 2016-10-10 22:04:06.000000000 +0200
@@ -1 +1 @@
-4.1.0
+4.2.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/calcurse-4.1.0/Makefile.in 
new/calcurse-4.2.0/Makefile.in
--- old/calcurse-4.1.0/Makefile.in      2016-04-12 20:37:10.000000000 +0200
+++ new/calcurse-4.2.0/Makefile.in      2016-10-10 22:03:48.000000000 +0200
@@ -552,7 +552,7 @@
          ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
        || chmod -R a+r "$(distdir)"
 dist-gzip: distdir
-       tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c 
>$(distdir).tar.gz
+       tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c 
>$(distdir).tar.gz
        $(am__post_remove_distdir)
 
 dist-bzip2: distdir
@@ -578,7 +578,7 @@
        @echo WARNING: "Support for shar distribution archives is" \
                       "deprecated." >&2
        @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
-       shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+       shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz
        $(am__post_remove_distdir)
 
 dist-zip: distdir
@@ -596,7 +596,7 @@
 distcheck: dist
        case '$(DIST_ARCHIVES)' in \
        *.tar.gz*) \
-         GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
+         eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\
        *.tar.bz2*) \
          bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
        *.tar.lz*) \
@@ -606,7 +606,7 @@
        *.tar.Z*) \
          uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
        *.shar.gz*) \
-         GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
+         eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
        *.zip*) \
          unzip $(distdir).zip ;;\
        esac
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/calcurse-4.1.0/NEWS new/calcurse-4.2.0/NEWS
--- old/calcurse-4.1.0/NEWS     2016-04-12 16:58:57.000000000 +0200
+++ new/calcurse-4.2.0/NEWS     2016-10-10 22:02:51.000000000 +0200
@@ -1,3 +1,24 @@
+[12 Oct 2016]
+Version 4.2.0:
+- New features:
+  * In the calendar panel, days with non-recurrent items now have another color
+    as days containing recurrent items only.
+
+  * Automatically select new appointments/events after creation.
+
+  * Support for (optional) dates when specifying the start/end time of items.
+    Allows for easily moving items and adding appointments without switching
+    the selected day beforehand.
+
+- Bug fixes:
+  * Encoding fixes in calcurse-caldav (reported by Raf Czlonka).
+
+  * Avoid notification bar artifacts after leaving calcurse.
+
+  * Fixes to the key binding pagination (reported by Kevin Wang).
+
+  * Do not change selection unexpectedly after modifying items.
+
 [12 Apr 2016]
 Version 4.1.0:
 - New features:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/calcurse-4.1.0/configure new/calcurse-4.2.0/configure
--- old/calcurse-4.1.0/configure        2016-04-12 20:37:10.000000000 +0200
+++ new/calcurse-4.2.0/configure        2016-10-10 22:03:49.000000000 +0200
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for calcurse 4.1.0.
+# Generated by GNU Autoconf 2.69 for calcurse 4.2.0.
 #
 # Report bugs to <[email protected]>.
 #
@@ -580,8 +580,8 @@
 # Identity of this package.
 PACKAGE_NAME='calcurse'
 PACKAGE_TARNAME='calcurse'
-PACKAGE_VERSION='4.1.0'
-PACKAGE_STRING='calcurse 4.1.0'
+PACKAGE_VERSION='4.2.0'
+PACKAGE_STRING='calcurse 4.2.0'
 PACKAGE_BUGREPORT='[email protected]'
 PACKAGE_URL=''
 
@@ -1304,7 +1304,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures calcurse 4.1.0 to adapt to many kinds of systems.
+\`configure' configures calcurse 4.2.0 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1374,7 +1374,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of calcurse 4.1.0:";;
+     short | recursive ) echo "Configuration of calcurse 4.2.0:";;
    esac
   cat <<\_ACEOF
 
@@ -1479,7 +1479,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-calcurse configure 4.1.0
+calcurse configure 4.2.0
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -1848,7 +1848,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by calcurse $as_me 4.1.0, which was
+It was created by calcurse $as_me 4.2.0, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -2711,7 +2711,7 @@
 
 # Define the identity of the package.
  PACKAGE='calcurse'
- VERSION='4.1.0'
+ VERSION='4.2.0'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -7713,7 +7713,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by calcurse $as_me 4.1.0, which was
+This file was extended by calcurse $as_me 4.2.0, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -7779,7 +7779,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; 
s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-calcurse config.status 4.1.0
+calcurse config.status 4.2.0
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/calcurse-4.1.0/contrib/caldav/calcurse-caldav 
new/calcurse-4.2.0/contrib/caldav/calcurse-caldav
--- old/calcurse-4.1.0/contrib/caldav/calcurse-caldav   2016-04-12 
20:37:17.000000000 +0200
+++ new/calcurse-4.2.0/contrib/caldav/calcurse-caldav   2016-10-10 
22:03:58.000000000 +0200
@@ -108,6 +108,9 @@
                 print("> " + line)
         print()
 
+    if isinstance(body, str):
+        body = body.encode('utf-8')
+
     conn.request(cmd, path, headers=headers, body=body)
 
     resp = conn.getresponse()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/calcurse-4.1.0/contrib/caldav/calcurse-caldav.py 
new/calcurse-4.2.0/contrib/caldav/calcurse-caldav.py
--- old/calcurse-4.1.0/contrib/caldav/calcurse-caldav.py        2016-03-27 
12:26:18.000000000 +0200
+++ new/calcurse-4.2.0/contrib/caldav/calcurse-caldav.py        2016-06-18 
10:31:32.000000000 +0200
@@ -108,6 +108,9 @@
                 print("> " + line)
         print()
 
+    if isinstance(body, str):
+        body = body.encode('utf-8')
+
     conn.request(cmd, path, headers=headers, body=body)
 
     resp = conn.getresponse()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/calcurse-4.1.0/doc/calcurse.1 
new/calcurse-4.2.0/doc/calcurse.1
--- old/calcurse-4.1.0/doc/calcurse.1   2016-04-12 20:37:21.000000000 +0200
+++ new/calcurse-4.2.0/doc/calcurse.1   2016-10-10 22:04:02.000000000 +0200
@@ -2,12 +2,12 @@
 .\"     Title: calcurse
 .\"    Author: [see the "Authors" section]
 .\" Generator: DocBook XSL Stylesheets v1.79.1 <http://docbook.sf.net/>
-.\"      Date: 04/12/2016
+.\"      Date: 10/10/2016
 .\"    Manual: \ \&
 .\"    Source: \ \&
 .\"  Language: English
 .\"
-.TH "CALCURSE" "1" "04/12/2016" "\ \&" "\ \&"
+.TH "CALCURSE" "1" "10/10/2016" "\ \&" "\ \&"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/calcurse-4.1.0/doc/manual.html 
new/calcurse-4.2.0/doc/manual.html
--- old/calcurse-4.1.0/doc/manual.html  2016-04-12 20:37:19.000000000 +0200
+++ new/calcurse-4.2.0/doc/manual.html  2016-10-10 22:03:59.000000000 +0200
@@ -853,7 +853,7 @@
 <div class="paragraph"><p>First you need to gunzip and untar the source 
archive:</p></div>
 <div class="listingblock">
 <div class="content">
-<pre><code>$ tar zxvf calcurse-4.1.0.tar.gz</code></pre>
+<pre><code>$ tar zxvf calcurse-4.2.0.tar.gz</code></pre>
 </div></div>
 <div class="paragraph"><p>Once you meet the requirements and have extracted 
the archive, the install
 process is quite simple, and follows the standard three steps 
process:</p></div>
@@ -3205,7 +3205,7 @@
 <div id="footnotes"><hr /></div>
 <div id="footer">
 <div id="footer-text">
-Last updated 2016-04-12 17:26:37 CEST
+Last updated 2016-10-10 22:02:51 CEST
 </div>
 </div>
 </body>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/calcurse-4.1.0/doc/manual.txt 
new/calcurse-4.2.0/doc/manual.txt
--- old/calcurse-4.1.0/doc/manual.txt   2016-04-12 17:26:37.000000000 +0200
+++ new/calcurse-4.2.0/doc/manual.txt   2016-10-10 22:02:51.000000000 +0200
@@ -143,7 +143,7 @@
 First you need to gunzip and untar the source archive:
 
 ----
-$ tar zxvf calcurse-4.1.0.tar.gz
+$ tar zxvf calcurse-4.2.0.tar.gz
 ----
 
 Once you meet the requirements and have extracted the archive, the install
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/calcurse-4.1.0/doc/submitting-patches.html 
new/calcurse-4.2.0/doc/submitting-patches.html
--- old/calcurse-4.1.0/doc/submitting-patches.html      2016-04-12 
20:37:19.000000000 +0200
+++ new/calcurse-4.2.0/doc/submitting-patches.html      2016-10-10 
22:04:00.000000000 +0200
@@ -896,7 +896,7 @@
 <div id="footnotes"><hr /></div>
 <div id="footer">
 <div id="footer-text">
-Last updated 2016-03-27 12:26:18 CEST
+Last updated 2016-06-18 10:31:32 CEST
 </div>
 </div>
 </body>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/calcurse-4.1.0/po/calcurse.pot 
new/calcurse-4.2.0/po/calcurse.pot
--- old/calcurse-4.1.0/po/calcurse.pot  2016-04-02 08:45:01.000000000 +0200
+++ new/calcurse-4.2.0/po/calcurse.pot  2016-10-10 22:02:51.000000000 +0200
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: [email protected]\n"
-"POT-Creation-Date: 2016-04-02 08:45+0200\n"
+"POT-Creation-Date: 2016-10-10 16:48+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <[email protected]>\n"
@@ -1199,7 +1199,7 @@
 msgid "Enter the day to go to [ENTER for today] : %s"
 msgstr ""
 
-msgid "Enter start time ([hh:mm] or [hhmm]):"
+msgid "Enter start time ([hh:mm] or [hhmm]) or date:"
 msgstr ""
 
 msgid "Press [Enter] to continue"
Files old/calcurse-4.1.0/po/de.gmo and new/calcurse-4.2.0/po/de.gmo differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/calcurse-4.1.0/po/de.po new/calcurse-4.2.0/po/de.po
--- old/calcurse-4.1.0/po/de.po 2016-04-11 17:12:58.000000000 +0200
+++ new/calcurse-4.2.0/po/de.po 2016-10-10 22:03:57.000000000 +0200
@@ -9,7 +9,7 @@
 msgstr ""
 "Project-Id-Version: calcurse\n"
 "Report-Msgid-Bugs-To: [email protected]\n"
-"POT-Creation-Date: 2016-04-02 08:45+0200\n"
+"POT-Creation-Date: 2016-10-10 16:48+0200\n"
 "PO-Revision-Date: 2016-04-02 06:45+0000\n"
 "Last-Translator: Lukas Fleischer <[email protected]>\n"
 "Language-Team: German (http://www.transifex.com/lfleischer/calcurse/language/";
@@ -1263,7 +1263,8 @@
 msgid "Enter the day to go to [ENTER for today] : %s"
 msgstr "Zu welchem Tag soll gesprungen werden? [EINGABE für heute] : %s"
 
-msgid "Enter start time ([hh:mm] or [hhmm]):"
+#, fuzzy
+msgid "Enter start time ([hh:mm] or [hhmm]) or date:"
 msgstr "Startuhrzeit eingeben ([hh:mm] oder [hhmm]):"
 
 msgid "Press [Enter] to continue"
Files old/calcurse-4.1.0/po/en.gmo and new/calcurse-4.2.0/po/en.gmo differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/calcurse-4.1.0/po/en.po new/calcurse-4.2.0/po/en.po
--- old/calcurse-4.1.0/po/en.po 2016-04-11 17:12:58.000000000 +0200
+++ new/calcurse-4.2.0/po/en.po 2016-10-10 22:03:57.000000000 +0200
@@ -9,7 +9,7 @@
 msgstr ""
 "Project-Id-Version: calcurse 1.4\n"
 "Report-Msgid-Bugs-To: [email protected]\n"
-"POT-Creation-Date: 2016-04-02 08:45+0200\n"
+"POT-Creation-Date: 2016-10-10 16:48+0200\n"
 "PO-Revision-Date: 2006-07-03 00:05+0100\n"
 "Last-Translator: Neil Williams <[email protected]>\n"
 "Language-Team: English/GB <[email protected]>\n"
@@ -1283,7 +1283,7 @@
 msgstr "Enter the day to go to [ENTER for today] : dd/mm/yyyy"
 
 #, fuzzy
-msgid "Enter start time ([hh:mm] or [hhmm]):"
+msgid "Enter start time ([hh:mm] or [hhmm]) or date:"
 msgstr "Enter end time ([hh:mm] or [h:mm]) or duration (in minutes) : "
 
 msgid "Press [Enter] to continue"
Files old/calcurse-4.1.0/po/es.gmo and new/calcurse-4.2.0/po/es.gmo differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/calcurse-4.1.0/po/es.po new/calcurse-4.2.0/po/es.po
--- old/calcurse-4.1.0/po/es.po 2016-04-11 17:12:58.000000000 +0200
+++ new/calcurse-4.2.0/po/es.po 2016-10-10 22:03:57.000000000 +0200
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: calcurse\n"
 "Report-Msgid-Bugs-To: [email protected]\n"
-"POT-Creation-Date: 2016-04-02 08:45+0200\n"
+"POT-Creation-Date: 2016-10-10 16:48+0200\n"
 "PO-Revision-Date: 2016-04-02 06:45+0000\n"
 "Last-Translator: Lukas Fleischer <[email protected]>\n"
 "Language-Team: Spanish (http://www.transifex.com/lfleischer/calcurse/";
@@ -1208,7 +1208,7 @@
 msgid "Enter the day to go to [ENTER for today] : %s"
 msgstr ""
 
-msgid "Enter start time ([hh:mm] or [hhmm]):"
+msgid "Enter start time ([hh:mm] or [hhmm]) or date:"
 msgstr ""
 
 msgid "Press [Enter] to continue"
Files old/calcurse-4.1.0/po/fr.gmo and new/calcurse-4.2.0/po/fr.gmo differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/calcurse-4.1.0/po/fr.po new/calcurse-4.2.0/po/fr.po
--- old/calcurse-4.1.0/po/fr.po 2016-04-11 17:12:58.000000000 +0200
+++ new/calcurse-4.2.0/po/fr.po 2016-10-10 22:03:57.000000000 +0200
@@ -12,7 +12,7 @@
 msgstr ""
 "Project-Id-Version: calcurse\n"
 "Report-Msgid-Bugs-To: [email protected]\n"
-"POT-Creation-Date: 2016-04-02 08:45+0200\n"
+"POT-Creation-Date: 2016-10-10 16:48+0200\n"
 "PO-Revision-Date: 2016-04-02 06:45+0000\n"
 "Last-Translator: Lukas Fleischer <[email protected]>\n"
 "Language-Team: French (http://www.transifex.com/lfleischer/calcurse/language/";
@@ -1312,7 +1312,7 @@
 "Saisir le jour auquel vous souhaitez vous rendre [ou simplement ENTRÉE pour "
 "aujourd'hui] : %s"
 
-msgid "Enter start time ([hh:mm] or [hhmm]):"
+msgid "Enter start time ([hh:mm] or [hhmm]) or date:"
 msgstr ""
 
 msgid "Press [Enter] to continue"
Files old/calcurse-4.1.0/po/nl.gmo and new/calcurse-4.2.0/po/nl.gmo differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/calcurse-4.1.0/po/nl.po new/calcurse-4.2.0/po/nl.po
--- old/calcurse-4.1.0/po/nl.po 2016-04-11 17:12:58.000000000 +0200
+++ new/calcurse-4.2.0/po/nl.po 2016-10-10 22:03:57.000000000 +0200
@@ -9,7 +9,7 @@
 msgstr ""
 "Project-Id-Version: calcurse\n"
 "Report-Msgid-Bugs-To: [email protected]\n"
-"POT-Creation-Date: 2016-04-02 08:45+0200\n"
+"POT-Creation-Date: 2016-10-10 16:48+0200\n"
 "PO-Revision-Date: 2016-04-02 06:45+0000\n"
 "Last-Translator: Lukas Fleischer <[email protected]>\n"
 "Language-Team: Dutch (http://www.transifex.com/lfleischer/calcurse/language/";
@@ -1216,7 +1216,7 @@
 msgid "Enter the day to go to [ENTER for today] : %s"
 msgstr ""
 
-msgid "Enter start time ([hh:mm] or [hhmm]):"
+msgid "Enter start time ([hh:mm] or [hhmm]) or date:"
 msgstr ""
 
 msgid "Press [Enter] to continue"
Files old/calcurse-4.1.0/po/pt_BR.gmo and new/calcurse-4.2.0/po/pt_BR.gmo differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/calcurse-4.1.0/po/pt_BR.po 
new/calcurse-4.2.0/po/pt_BR.po
--- old/calcurse-4.1.0/po/pt_BR.po      2016-04-11 17:12:58.000000000 +0200
+++ new/calcurse-4.2.0/po/pt_BR.po      2016-10-10 22:03:57.000000000 +0200
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: calcurse\n"
 "Report-Msgid-Bugs-To: [email protected]\n"
-"POT-Creation-Date: 2016-04-02 08:45+0200\n"
+"POT-Creation-Date: 2016-10-10 16:48+0200\n"
 "PO-Revision-Date: 2016-04-02 06:45+0000\n"
 "Last-Translator: Lukas Fleischer <[email protected]>\n"
 "Language-Team: Portuguese (Brazil) (http://www.transifex.com/lfleischer/";
@@ -1297,7 +1297,8 @@
 msgid "Enter the day to go to [ENTER for today] : %s"
 msgstr "Insira o dia para ir para [ENTER para hoje] : %s"
 
-msgid "Enter start time ([hh:mm] or [hhmm]):"
+#, fuzzy
+msgid "Enter start time ([hh:mm] or [hhmm]) or date:"
 msgstr "Insira o horário início ([hh:mm] ou [hhmm]):"
 
 msgid "Press [Enter] to continue"
Files old/calcurse-4.1.0/po/ru.gmo and new/calcurse-4.2.0/po/ru.gmo differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/calcurse-4.1.0/po/ru.po new/calcurse-4.2.0/po/ru.po
--- old/calcurse-4.1.0/po/ru.po 2016-04-11 17:12:58.000000000 +0200
+++ new/calcurse-4.2.0/po/ru.po 2016-10-10 22:03:57.000000000 +0200
@@ -10,7 +10,7 @@
 msgstr ""
 "Project-Id-Version: calcurse\n"
 "Report-Msgid-Bugs-To: [email protected]\n"
-"POT-Creation-Date: 2016-04-02 08:45+0200\n"
+"POT-Creation-Date: 2016-10-10 16:48+0200\n"
 "PO-Revision-Date: 2016-04-02 06:45+0000\n"
 "Last-Translator: Lukas Fleischer <[email protected]>\n"
 "Language-Team: Russian (http://www.transifex.com/lfleischer/calcurse/";
@@ -1255,7 +1255,8 @@
 msgid "Enter the day to go to [ENTER for today] : %s"
 msgstr "Переход на N-ый день [ENTER для текущего дня] : %s"
 
-msgid "Enter start time ([hh:mm] or [hhmm]):"
+#, fuzzy
+msgid "Enter start time ([hh:mm] or [hhmm]) or date:"
 msgstr "Начало ([чч:мм] или [ччмм]): "
 
 msgid "Press [Enter] to continue"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/calcurse-4.1.0/scripts/calcurse-upgrade 
new/calcurse-4.2.0/scripts/calcurse-upgrade
--- old/calcurse-4.1.0/scripts/calcurse-upgrade 2016-04-12 20:37:17.000000000 
+0200
+++ new/calcurse-4.2.0/scripts/calcurse-upgrade 2016-10-10 22:03:57.000000000 
+0200
@@ -10,10 +10,10 @@
   if [ "$1" = "--config" ]; then
     CONFFILE=$2
   elif [ "$1" = "-h" -o "$1" = "--help" ]; then
-    echo "calcurse-upgrade 4.1.0"
+    echo "calcurse-upgrade 4.2.0"
     echo "$(gettext "Usage: calcurse-upgrade [-h|-v|--config <file>]")"
   elif [ "$1" = "-v" -o "$1" = "--version" ]; then
-    echo "calcurse-upgrade 4.1.0"
+    echo "calcurse-upgrade 4.2.0"
     echo "$(gettext "
 Copyright (c) 2004-2016 calcurse Development Team.
 This is free software; see the source for copying conditions.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/calcurse-4.1.0/src/calcurse.c 
new/calcurse-4.2.0/src/calcurse.c
--- old/calcurse-4.1.0/src/calcurse.c   2016-03-27 12:26:18.000000000 +0200
+++ new/calcurse-4.2.0/src/calcurse.c   2016-10-10 22:02:51.000000000 +0200
@@ -49,6 +49,15 @@
 static void do_storage(int day_changed)
 {
        struct day_item *day = ui_day_selitem();
+       union aptev_ptr item;
+
+       if (day) {
+               /*
+                * day_process_storage() rebuilds the vector of day items, so
+                * we need to save the reference to the actual item here.
+                */
+               item = day->item;
+       }
 
        day_process_storage(ui_calendar_get_slctd_day(), day_changed);
        ui_day_load_items();
@@ -56,7 +65,7 @@
        if (day_changed)
                ui_day_sel_reset();
        else if (day)
-               ui_day_set_selitem(day);
+               ui_day_set_selitem_by_aptev_ptr(item);
 }
 
 static inline void key_generic_change_view(void)
@@ -111,7 +120,6 @@
 static inline void key_generic_add_appt(void)
 {
        ui_day_item_add();
-       do_storage(1);
        wins_update(FLAG_CAL | FLAG_APP | FLAG_STA);
 }
 
@@ -127,7 +135,6 @@
        case APP:
        case CAL:
                ui_day_item_add();
-               do_storage(0);
                wins_update(FLAG_CAL | FLAG_APP | FLAG_STA);
                break;
        case TOD:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/calcurse-4.1.0/src/calcurse.h 
new/calcurse-4.2.0/src/calcurse.h
--- old/calcurse-4.1.0/src/calcurse.h   2016-03-27 12:45:58.000000000 +0200
+++ new/calcurse-4.2.0/src/calcurse.h   2016-10-10 22:02:51.000000000 +0200
@@ -628,6 +628,10 @@
        GETSTRING_RET           /* return was pressed without entering any 
text. */
 };
 
+/* Return codes for parse_datetime(). */
+#define PARSE_DATETIME_HAS_DATE (1 << 0)
+#define PARSE_DATETIME_HAS_TIME (1 << 1)
+
 /* Week days. */
 enum wday {
        SUNDAY,
@@ -772,6 +776,7 @@
 unsigned day_chk_busy_slices(struct date, int, int *);
 struct day_item *day_cut_item(long, int);
 int day_paste_item(struct day_item *, long);
+int day_get_position_by_aptev_ptr(union aptev_ptr);
 int day_get_position(struct day_item *);
 struct day_item *day_get_item(int);
 unsigned day_item_count(int);
@@ -1044,6 +1049,7 @@
 
 /* ui-day.c */
 struct day_item *ui_day_selitem(void);
+void ui_day_set_selitem_by_aptev_ptr(union aptev_ptr);
 void ui_day_set_selitem(struct day_item *);
 void ui_day_item_add(void);
 void ui_day_item_delete(unsigned);
@@ -1134,6 +1140,7 @@
 int parse_time(const char *, unsigned *, unsigned *);
 int parse_duration(const char *, unsigned *);
 int parse_date_duration(const char *, unsigned *);
+int parse_datetime(const char *, long *);
 void file_close(FILE *, const char *);
 void psleep(unsigned);
 int fork_exec(int *, int *, const char *, const char *const *);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/calcurse-4.1.0/src/day.c new/calcurse-4.2.0/src/day.c
--- old/calcurse-4.1.0/src/day.c        2016-03-27 12:26:18.000000000 +0200
+++ new/calcurse-4.2.0/src/day.c        2016-10-10 22:02:51.000000000 +0200
@@ -507,13 +507,26 @@
 }
 
 /*
- * Need to know if there is an item for the current selected day inside
- * calendar. This is used to put the correct colors inside calendar panel.
+ * Check whether there is an item on a given day.
+ *
+ * Returns 2 if the selected day contains a regular event or appointment.
+ * Returns 1 if the selected day does not contain a regular event or
+ * appointment but an occurrence of a recurrent item. Returns 0 otherwise.
  */
 int day_check_if_item(struct date day)
 {
        const time_t t = date2sec(day, 0, 0);
 
+       if (LLIST_FIND_FIRST(&eventlist, (time_t *)&t, event_inday))
+               return 2;
+
+       LLIST_TS_LOCK(&alist_p);
+       if (LLIST_TS_FIND_FIRST(&alist_p, (time_t *)&t, apoint_inday)) {
+               LLIST_TS_UNLOCK(&alist_p);
+               return 2;
+       }
+       LLIST_TS_UNLOCK(&alist_p);
+
        if (LLIST_FIND_FIRST(&recur_elist, (time_t *)&t, recur_event_inday))
                return 1;
 
@@ -525,16 +538,6 @@
        }
        LLIST_TS_UNLOCK(&recur_alist_p);
 
-       if (LLIST_FIND_FIRST(&eventlist, (time_t *)&t, event_inday))
-               return 1;
-
-       LLIST_TS_LOCK(&alist_p);
-       if (LLIST_TS_FIND_FIRST(&alist_p, (time_t *)&t, apoint_inday)) {
-               LLIST_TS_UNLOCK(&alist_p);
-               return 1;
-       }
-       LLIST_TS_UNLOCK(&alist_p);
-
        return 0;
 }
 
@@ -692,20 +695,25 @@
 }
 
 /* Returns the position corresponding to a given item. */
-int day_get_position(struct day_item *needle)
+int day_get_position_by_aptev_ptr(union aptev_ptr aptevp)
 {
        int n = 0;
 
        VECTOR_FOREACH(&day_items, n) {
                struct day_item *p = VECTOR_NTH(&day_items, n);
                /* Compare pointers. */
-               if (p->item.ev == needle->item.ev)
+               if (p->item.ev == aptevp.ev)
                        return n;
        }
 
        return -1;
 }
 
+int day_get_position(struct day_item *needle)
+{
+       return day_get_position_by_aptev_ptr(needle->item);
+}
+
 /* Returns a structure containing the selected item. */
 struct day_item *day_get_item(int item_number)
 {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/calcurse-4.1.0/src/notify.c 
new/calcurse-4.2.0/src/notify.c
--- old/calcurse-4.1.0/src/notify.c     2016-03-27 12:26:18.000000000 +0200
+++ new/calcurse-4.2.0/src/notify.c     2016-10-10 22:02:51.000000000 +0200
@@ -549,6 +549,9 @@
 /* Launch the notify-bar main thread. */
 void notify_start_main_thread(void)
 {
+       /* Avoid starting the notification bar thread twice. */
+       notify_stop_main_thread();
+
        pthread_create(&notify_t_main, NULL, notify_main_thread, NULL);
        notify_check_next_app(0);
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/calcurse-4.1.0/src/ui-calendar.c 
new/calcurse-4.2.0/src/ui-calendar.c
--- old/calcurse-4.1.0/src/ui-calendar.c        2016-03-27 12:26:18.000000000 
+0200
+++ new/calcurse-4.2.0/src/ui-calendar.c        2016-10-10 22:02:51.000000000 
+0200
@@ -435,6 +435,8 @@
        }
 
        for (c_day = 1; c_day <= numdays; ++c_day, ++c_day_1, c_day_1 %= 7) {
+               unsigned attr;
+
                check_day.dd = c_day;
                check_day.mm = slctd_day.mm;
                check_day.yyyy = slctd_day.yyyy;
@@ -453,36 +455,27 @@
                        ofs_x = (w - 27) / 2 - day_1_sav - 4 * c_day;
                }
 
-               WINS_CALENDAR_LOCK;
                if (c_day == current_day->dd
                    && current_day->mm == slctd_day.mm
                    && current_day->yyyy == slctd_day.yyyy
-                   && current_day->dd != slctd_day.dd) {
-                       /* This is today, so print it in yellow. */
-                       custom_apply_attr(sw->inner, ATTR_LOWEST);
-                       mvwprintw(sw->inner, ofs_y + 1,
-                                 ofs_x + day_1_sav + 4 * c_day + 1, "%2d",
-                                 c_day);
-                       custom_remove_attr(sw->inner, ATTR_LOWEST);
-               } else if (c_day == slctd_day.dd) {
-                       /* This is the selected day, print it according to 
user's theme. */
-                       custom_apply_attr(sw->inner, ATTR_HIGHEST);
-                       mvwprintw(sw->inner, ofs_y + 1,
-                                 ofs_x + day_1_sav + 4 * c_day + 1, "%2d",
-                                 c_day);
-                       custom_remove_attr(sw->inner, ATTR_HIGHEST);
-               } else if (item_this_day) {
-                       custom_apply_attr(sw->inner, ATTR_LOW);
-                       mvwprintw(sw->inner, ofs_y + 1,
-                                 ofs_x + day_1_sav + 4 * c_day + 1, "%2d",
-                                 c_day);
-                       custom_remove_attr(sw->inner, ATTR_LOW);
-               } else {
-                       /* otherwise, print normal days in black */
-                       mvwprintw(sw->inner, ofs_y + 1,
-                                 ofs_x + day_1_sav + 4 * c_day + 1, "%2d",
-                                 c_day);
-               }
+                   && current_day->dd != slctd_day.dd)
+                       attr = ATTR_LOWEST;
+               else if (c_day == slctd_day.dd)
+                       attr = ATTR_HIGHEST;
+               else if (item_this_day == 1)
+                       attr = ATTR_LOW;
+               else if (item_this_day == 2)
+                       attr = ATTR_TRUE;
+               else
+                       attr = 0;
+
+               WINS_CALENDAR_LOCK;
+               if (attr)
+                       custom_apply_attr(sw->inner, attr);
+               mvwprintw(sw->inner, ofs_y + 1,
+                         ofs_x + day_1_sav + 4 * c_day + 1, "%2d", c_day);
+               if (attr)
+                       custom_remove_attr(sw->inner, attr);
                WINS_CALENDAR_UNLOCK;
        }
 
@@ -528,11 +521,13 @@
                    && current_day->mm == slctd_day.mm
                    && current_day->yyyy == slctd_day.yyyy
                    && current_day->dd != slctd_day.dd)
-                       attr = ATTR_LOWEST;     /* today, but not selected */
+                       attr = ATTR_LOWEST;
                else if (t.tm_mday == slctd_day.dd)
-                       attr = ATTR_HIGHEST;    /* selected day */
-               else if (item_this_day)
+                       attr = ATTR_HIGHEST;
+               else if (item_this_day == 1)
                        attr = ATTR_LOW;
+               else if (item_this_day == 2)
+                       attr = ATTR_TRUE;
                else
                        attr = 0;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/calcurse-4.1.0/src/ui-day.c 
new/calcurse-4.2.0/src/ui-day.c
--- old/calcurse-4.1.0/src/ui-day.c     2016-04-01 08:49:34.000000000 +0200
+++ new/calcurse-4.2.0/src/ui-day.c     2016-10-10 22:02:51.000000000 +0200
@@ -46,36 +46,37 @@
        return day_get_item(listbox_get_sel(&lb_apt));
 }
 
-void ui_day_set_selitem(struct day_item *day)
+void ui_day_set_selitem_by_aptev_ptr(union aptev_ptr p)
 {
-       int n = day_get_position(day);
+       int n = day_get_position_by_aptev_ptr(p);
        if (n >= 0)
                listbox_set_sel(&lb_apt, n);
 }
 
+void ui_day_set_selitem(struct day_item *day)
+{
+       ui_day_set_selitem_by_aptev_ptr(day->item);
+}
+
 /* Request the user to enter a new time. */
-static int day_edit_time(int time, unsigned *new_hour,
-                        unsigned *new_minute)
+static int day_edit_time(int time)
 {
-       char *timestr = date_sec2date_str(time, "%H:%M");
+       char *input = date_sec2date_str(time, "%H:%M");
        const char *msg_time =
-           _("Enter start time ([hh:mm] or [hhmm]):");
+           _("Enter start time ([hh:mm] or [hhmm]) or date:");
        const char *enter_str = _("Press [Enter] to continue");
        const char *fmt_msg =
            _("You entered an invalid time, should be [hh:mm] or [hhmm]");
+       long ts = time;
 
        for (;;) {
                status_mesg(msg_time, "");
-               if (updatestring(win[STA].p, &timestr, 0, 1) !=
-                   GETSTRING_VALID)
+               if (updatestring(win[STA].p, &input, 0, 1) != GETSTRING_VALID)
                        return 0;
-               if (parse_time(timestr, new_hour, new_minute) == 1) {
-                       mem_free(timestr);
-                       return 1;
-               } else {
-                       status_mesg(fmt_msg, enter_str);
-                       wgetch(win[KEY].p);
-               }
+               if (parse_datetime(input, &ts))
+                       return ts;
+               status_mesg(fmt_msg, enter_str);
+               wgetch(win[KEY].p);
        }
 }
 
@@ -88,8 +89,7 @@
        const char *enter_str = _("Press [Enter] to continue");
        const char *fmt_msg =
            _("You entered an invalid time, should be [hh:mm] or [hhmm]");
-       long newtime;
-       unsigned hr, mn;
+       long end;
 
        for (;;) {
                int ret;
@@ -101,21 +101,28 @@
                } else if (ret == GETSTRING_RET) {
                        *new_duration = 0;
                        break;
-               } else if (*timestr == '+'
-                   && parse_duration(timestr + 1, new_duration) == 1) {
-                       *new_duration *= MININSEC;
-                       break;
-               } else if (parse_time(timestr, &hr, &mn) == 1) {
-                       newtime = update_time_in_date(start + dur, hr, mn);
-                       *new_duration =
-                           (newtime >
-                            start) ? newtime - start : DAYINSEC +
-                           newtime - start;
+               }
+               if (*timestr == '+') {
+                       if (parse_duration(timestr + 1, new_duration)) {
+                               *new_duration *= MININSEC;
+                               break;
+                       }
+               }
+               end = start + dur;
+               ret = parse_datetime(timestr, &end);
+               /*
+                * If the user enters a end time which is smaller than
+                * the start time, assume that the time belongs to the
+                * next day.
+                */
+               if (!(ret & PARSE_DATETIME_HAS_DATE) && end < start)
+                       end = date_sec_change(end, 0, 1);
+               if (ret) {
+                       *new_duration = end - start;
                        break;
-               } else {
-                       status_mesg(fmt_msg, enter_str);
-                       wgetch(win[KEY].p);
                }
+               status_mesg(fmt_msg, enter_str);
+               wgetch(win[KEY].p);
        }
 
        mem_free(timestr);
@@ -126,20 +133,19 @@
 static void update_start_time(long *start, long *dur, int update_dur)
 {
        long newtime;
-       unsigned hr, mn;
        int valid_date;
        const char *msg_wrong_time =
            _("Invalid time: start time must be before end time!");
        const char *msg_enter = _("Press [Enter] to continue");
 
        do {
-               if (!day_edit_time(*start, &hr, &mn))
+               newtime = day_edit_time(*start);
+               if (!newtime)
                        break;
                if (!update_dur) {
-                       *start = update_time_in_date(*start, hr, mn);
+                       *start = newtime;
                        return;
                }
-               newtime = update_time_in_date(*start, hr, mn);
                if (newtime < *start + *dur) {
                        *dur -= (newtime - *start);
                        *start = newtime;
@@ -500,7 +506,7 @@
  */
 void ui_day_item_add(void)
 {
-#define LTIME 6
+#define LTIME 16
 #define LDUR 12
        const char *mesg_1 =
            _("Enter start time ([hh:mm] or [hhmm]), leave blank for an all-day 
event:");
@@ -514,11 +520,11 @@
        const char *enter_str = _("Press [Enter] to continue");
        char item_time[LDUR] = "";
        char item_mesg[BUFSIZ] = "";
-       time_t apoint_start;
-       unsigned heures, minutes;
-       unsigned apoint_duration;
-       unsigned end_h, end_m;
+       time_t start = date2sec(*ui_calendar_get_slctd_day(), 0, 0), end;
+       unsigned dur;
        int is_appointment = 1;
+       int ret;
+       union aptev_ptr item;
 
        /* Get the starting time */
        for (;;) {
@@ -530,7 +536,10 @@
                        is_appointment = 0;
                        break;
                }
-               if (parse_time(item_time, &heures, &minutes) == 1)
+               ret = parse_datetime(item_time, &start);
+               if (!(ret & PARSE_DATETIME_HAS_TIME))
+                       is_appointment = 0;
+               if (ret)
                        break;
                status_mesg(format_message_1, enter_str);
                wgetch(win[KEY].p);
@@ -549,27 +558,26 @@
                            GETSTRING_ESC)
                                return;
                        if (strlen(item_time) == 0) {
-                               apoint_duration = 0;
+                               dur = 0;
                                break;
                        }
-                       if (*item_time == '+'
-                           && parse_duration(item_time + 1,
-                                             &apoint_duration) == 1)
-                               break;
-                       if (parse_time(item_time, &end_h, &end_m) == 1) {
-                               if (end_h < heures
-                                   || ((end_h == heures)
-                                       && (end_m < minutes))) {
-                                       apoint_duration =
-                                           MININSEC - minutes + end_m +
-                                           (24 + end_h -
-                                            (heures + 1)) * MININSEC;
-                               } else {
-                                       apoint_duration =
-                                           MININSEC - minutes + end_m +
-                                           (end_h -
-                                            (heures + 1)) * MININSEC;
+                       if (*item_time == '+') {
+                               if (parse_duration(item_time + 1, &dur)) {
+                                       dur *= MININSEC;
+                                       break;
                                }
+                       }
+                       end = start;
+                       ret = parse_datetime(item_time, &end);
+                       /*
+                        * If the user enters a end time which is smaller than
+                        * the start time, assume that the time belongs to the
+                        * next day.
+                        */
+                       if (!(ret & PARSE_DATETIME_HAS_DATE) && end < start)
+                               end = date_sec_change(end, 0, 1);
+                       if (ret) {
+                               dur = end - start;
                                break;
                        }
                        status_mesg(format_message_2, enter_str);
@@ -581,20 +589,16 @@
        if (getstring(win[STA].p, item_mesg, BUFSIZ, 0, 1) ==
            GETSTRING_VALID) {
                if (is_appointment) {
-                       apoint_start =
-                           date2sec(*ui_calendar_get_slctd_day(), heures,
-                                    minutes);
-                       apoint_new(item_mesg, 0L, apoint_start,
-                                  min2sec(apoint_duration), 0L);
+                       item.apt = apoint_new(item_mesg, 0L, start, dur, 0L);
                        if (notify_bar())
-                               notify_check_added(item_mesg, apoint_start,
-                                                  0L);
+                               notify_check_added(item_mesg, start, 0L);
                } else {
-                       event_new(item_mesg, 0L,
-                                 date2sec(*ui_calendar_get_slctd_day(), 0,
-                                          0), 1);
+                       item.ev = event_new(item_mesg, 0L, start, 1);
                }
                io_set_modified();
+               day_process_storage(ui_calendar_get_slctd_day(), 0);
+               ui_day_load_items();
+               ui_day_set_selitem_by_aptev_ptr(item);
        }
 
        ui_calendar_monthly_view_cache_set_invalid();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/calcurse-4.1.0/src/utils.c 
new/calcurse-4.2.0/src/utils.c
--- old/calcurse-4.1.0/src/utils.c      2016-03-27 12:45:31.000000000 +0200
+++ new/calcurse-4.2.0/src/utils.c      2016-10-10 22:02:51.000000000 +0200
@@ -75,6 +75,9 @@
 {
        int was_interactive;
 
+       ui_calendar_stop_date_thread();
+       io_stop_psave_thread();
+
        if (ui_mode == UI_CURSES) {
                notify_stop_main_thread();
                clear();
@@ -86,11 +89,10 @@
                was_interactive = 0;
        }
 
-       ui_calendar_stop_date_thread();
-       io_stop_psave_thread();
        free_user_data();
        keys_free();
        mem_stats();
+
        if (was_interactive) {
                if (unlink(path_cpid) != 0)
                        EXIT(_("Could not remove calcurse lock file: %s\n"),
@@ -1101,6 +1103,49 @@
        return 1;
 }
 
+/*
+ * Converts a string containing a date or a time into a time stamp.
+ *
+ * Takes a date/time string and a time stamp. If the string only contains a
+ * date, the date of the time stamp is updated while the time remains
+ * untouched. If the string only contains a time, the time of the time stamp is
+ * updated and the date remains the same. If the string contains both a date
+ * and a time, the time stamp is updated to match the given string.
+ *
+ * Returns a positive value on success and 0 on failure. The least-significant
+ * bit is set if the date was updated. Bit 1 is set if the time was updated.
+ */
+int parse_datetime(const char *string, long *ts)
+{
+       char *t = mem_strdup(string);
+       char *p = strtok(t, " ");
+
+       unsigned int hour, minute;
+       int year, month, day;
+       struct date new_date;
+       int ret = 0;
+
+       while (p) {
+               if (parse_date(p, conf.input_datefmt, &year, &month, &day,
+                              ui_calendar_get_slctd_day())) {
+                       new_date.dd = day;
+                       new_date.mm = month;
+                       new_date.yyyy = year;
+                       *ts = date2sec(new_date, 0, 0) + get_item_time(*ts);
+                       ret |= PARSE_DATETIME_HAS_DATE;
+               } else if (parse_time(p, &hour, &minute) == 1) {
+                       *ts = update_time_in_date(*ts, hour, minute);
+                       ret |= PARSE_DATETIME_HAS_TIME;
+               } else {
+                       return 0;
+               }
+               p = strtok(NULL, " ");
+       }
+
+       mem_free(t);
+       return ret;
+}
+
 void file_close(FILE * f, const char *pos)
 {
        EXIT_IF((fclose(f)) != 0, _("Error when closing file at %s"), pos);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/calcurse-4.1.0/src/wins.c 
new/calcurse-4.2.0/src/wins.c
--- old/calcurse-4.1.0/src/wins.c       2016-03-27 12:26:18.000000000 +0200
+++ new/calcurse-4.2.0/src/wins.c       2016-10-10 22:02:51.000000000 +0200
@@ -717,11 +717,24 @@
 /* Update the status bar page number to display other commands. */
 void wins_other_status_page(int panel)
 {
-       int max_page = bindings_size / (KEYS_CMDS_PER_LINE * 2 - 1) + 1;
+       /*
+        * Determine the number of completely filled pages of key bindings.
+        * There are two lines of bindings and KEYS_CMDS_PER_LINE bindings per
+        * line. On each page (other than the last page), one slot is reserved
+        * for OtherCmd.
+        */
+       const int slots_per_page = KEYS_CMDS_PER_LINE * 2 - 1;
+       int max_page = bindings_size / slots_per_page;
 
-       /* There is no "OtherCmd" on the last page. */
-       if (bindings_size % (KEYS_CMDS_PER_LINE * 2 - 1) == 1)
-               max_page--;
+       /*
+        * The result of the previous computation might have been rounded down.
+        * In this case, there are some bindings left. If there is exactly one
+        * binding left, it can be squashed onto the last page in place of the
+        * OtherCmd binding. If there are at least two bindings left, we need
+        * to add another page.
+        */
+       if (bindings_size % slots_per_page > 1)
+               max_page++;
 
        status_page = (status_page % max_page) + 1;
 }


Reply via email to