mirror of
https://salsa.debian.org/dskoll/remind.git
synced 2026-04-16 14:28:40 +02:00
Compare commits
63 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
51dfd707a2 | ||
|
|
7c3bf8601b | ||
|
|
714195efe5 | ||
|
|
eaeca2d09b | ||
|
|
ffa3b13437 | ||
|
|
2551e98d11 | ||
|
|
1bfd7761bc | ||
|
|
de9cb1d0a3 | ||
|
|
b2d32b514a | ||
|
|
6e53fd6924 | ||
|
|
8296d2b962 | ||
|
|
d6e66ee1e6 | ||
|
|
a49532b9c5 | ||
|
|
57d87f4caf | ||
|
|
ec9b30c616 | ||
|
|
27d8a62ab6 | ||
|
|
5077814c4a | ||
|
|
ca795a352a | ||
|
|
e59fc36458 | ||
|
|
39e3657539 | ||
|
|
6031f70701 | ||
|
|
3567c9e55f | ||
|
|
26de4e3fd3 | ||
|
|
cd65c6144d | ||
|
|
d32edbbb1f | ||
|
|
eae48a5538 | ||
|
|
63eba104d9 | ||
|
|
ae64961735 | ||
|
|
f7bb91320c | ||
|
|
c11071a859 | ||
|
|
53cbcc22db | ||
|
|
af9dcec3e9 | ||
|
|
d5a4b0d235 | ||
|
|
3b870403d9 | ||
|
|
284d822884 | ||
|
|
d881a26ad0 | ||
|
|
8519edde29 | ||
|
|
a30c467c48 | ||
|
|
887cd83ebe | ||
|
|
242d787ca2 | ||
|
|
5dd2cf7356 | ||
|
|
5efb70909d | ||
|
|
a60d466774 | ||
|
|
1c01f36271 | ||
|
|
3718632551 | ||
|
|
e8f3d5ff9f | ||
|
|
d77e27942d | ||
|
|
734cc61489 | ||
|
|
44d489d3d2 | ||
|
|
3e36ffa9ff | ||
|
|
12104a96b1 | ||
|
|
8ab8d65a15 | ||
|
|
f7a8122cef | ||
|
|
77d9bbb7d6 | ||
|
|
623def52fd | ||
|
|
d088e35142 | ||
|
|
5821e55eb8 | ||
|
|
1ee989c65d | ||
|
|
62388fb21f | ||
|
|
13571f84af | ||
|
|
03fdc06b65 | ||
|
|
4bce675ae6 | ||
|
|
7b64623115 |
121
configure
vendored
121
configure
vendored
@@ -1511,6 +1511,39 @@ fi
|
||||
|
||||
} # ac_fn_c_try_link
|
||||
|
||||
# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
|
||||
# -------------------------------------------------------
|
||||
# Tests whether HEADER exists and can be compiled using the include files in
|
||||
# INCLUDES, setting the cache variable VAR accordingly.
|
||||
ac_fn_c_check_header_compile ()
|
||||
{
|
||||
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
|
||||
printf %s "checking for $2... " >&6; }
|
||||
if eval test \${$3+y}
|
||||
then :
|
||||
printf %s "(cached) " >&6
|
||||
else $as_nop
|
||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||
/* end confdefs.h. */
|
||||
$4
|
||||
#include <$2>
|
||||
_ACEOF
|
||||
if ac_fn_c_try_compile "$LINENO"
|
||||
then :
|
||||
eval "$3=yes"
|
||||
else $as_nop
|
||||
eval "$3=no"
|
||||
fi
|
||||
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
|
||||
fi
|
||||
eval ac_res=\$$3
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
|
||||
printf "%s\n" "$ac_res" >&6; }
|
||||
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
|
||||
|
||||
} # ac_fn_c_check_header_compile
|
||||
|
||||
# ac_fn_c_try_run LINENO
|
||||
# ----------------------
|
||||
# Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that
|
||||
@@ -1743,39 +1776,6 @@ rm -f conftest.val
|
||||
|
||||
} # ac_fn_c_compute_int
|
||||
|
||||
# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
|
||||
# -------------------------------------------------------
|
||||
# Tests whether HEADER exists and can be compiled using the include files in
|
||||
# INCLUDES, setting the cache variable VAR accordingly.
|
||||
ac_fn_c_check_header_compile ()
|
||||
{
|
||||
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
|
||||
printf %s "checking for $2... " >&6; }
|
||||
if eval test \${$3+y}
|
||||
then :
|
||||
printf %s "(cached) " >&6
|
||||
else $as_nop
|
||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||
/* end confdefs.h. */
|
||||
$4
|
||||
#include <$2>
|
||||
_ACEOF
|
||||
if ac_fn_c_try_compile "$LINENO"
|
||||
then :
|
||||
eval "$3=yes"
|
||||
else $as_nop
|
||||
eval "$3=no"
|
||||
fi
|
||||
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
|
||||
fi
|
||||
eval ac_res=\$$3
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
|
||||
printf "%s\n" "$ac_res" >&6; }
|
||||
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
|
||||
|
||||
} # ac_fn_c_check_header_compile
|
||||
|
||||
# ac_fn_c_check_func LINENO FUNC VAR
|
||||
# ----------------------------------
|
||||
# Tests whether FUNC exists, setting the cache variable VAR accordingly
|
||||
@@ -2449,8 +2449,8 @@ as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H"
|
||||
as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H"
|
||||
as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H"
|
||||
as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H"
|
||||
as_fn_append ac_header_c_list " utime.h utime_h HAVE_UTIME_H"
|
||||
as_fn_append ac_header_c_list " sys/time.h sys_time_h HAVE_SYS_TIME_H"
|
||||
as_fn_append ac_header_c_list " utime.h utime_h HAVE_UTIME_H"
|
||||
|
||||
# Auxiliary files required by this configure script.
|
||||
ac_aux_files="install-sh"
|
||||
@@ -3872,7 +3872,6 @@ then :
|
||||
|
||||
fi
|
||||
|
||||
|
||||
ac_header= ac_cache=
|
||||
for ac_item in $ac_header_c_list
|
||||
do
|
||||
@@ -3902,6 +3901,9 @@ then :
|
||||
printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h
|
||||
|
||||
fi
|
||||
|
||||
|
||||
|
||||
# The cast to long int works around a bug in the HP C Compiler
|
||||
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
|
||||
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
|
||||
@@ -3968,6 +3970,39 @@ printf "%s\n" "$ac_cv_sizeof_unsigned_long" >&6; }
|
||||
printf "%s\n" "#define SIZEOF_UNSIGNED_LONG $ac_cv_sizeof_unsigned_long" >>confdefs.h
|
||||
|
||||
|
||||
# The cast to long int works around a bug in the HP C Compiler
|
||||
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
|
||||
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
|
||||
# This bug is HP SR number 8606223364.
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of time_t" >&5
|
||||
printf %s "checking size of time_t... " >&6; }
|
||||
if test ${ac_cv_sizeof_time_t+y}
|
||||
then :
|
||||
printf %s "(cached) " >&6
|
||||
else $as_nop
|
||||
if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (time_t))" "ac_cv_sizeof_time_t" "$ac_includes_default"
|
||||
then :
|
||||
|
||||
else $as_nop
|
||||
if test "$ac_cv_type_time_t" = yes; then
|
||||
{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
|
||||
printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
|
||||
as_fn_error 77 "cannot compute sizeof (time_t)
|
||||
See \`config.log' for more details" "$LINENO" 5; }
|
||||
else
|
||||
ac_cv_sizeof_time_t=0
|
||||
fi
|
||||
fi
|
||||
|
||||
fi
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_time_t" >&5
|
||||
printf "%s\n" "$ac_cv_sizeof_time_t" >&6; }
|
||||
|
||||
|
||||
|
||||
printf "%s\n" "#define SIZEOF_TIME_T $ac_cv_sizeof_time_t" >>confdefs.h
|
||||
|
||||
|
||||
|
||||
ac_fn_c_check_header_compile "$LINENO" "sys/types.h" "ac_cv_header_sys_types_h" "$ac_includes_default"
|
||||
if test "x$ac_cv_header_sys_types_h" = xyes
|
||||
@@ -4093,23 +4128,20 @@ printf "%s\n" "#define HAVE_UTIME_NULL 1" >>confdefs.h
|
||||
fi
|
||||
rm -f conftest.data
|
||||
|
||||
|
||||
|
||||
|
||||
if test "$GCC" = yes; then
|
||||
CFLAGS="$CFLAGS -Wall -Wextra -Wstrict-prototypes"
|
||||
# Check for link-time optimization support
|
||||
f=-flto=auto
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports $f" >&5
|
||||
printf %s "checking whether $CC supports $f... " >&6; }
|
||||
if $CC -E $f /dev/null > /dev/null 2>&1 ; then
|
||||
if $CC -Werror -E $f - < /dev/null > /dev/null 2>&1 ; then
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
||||
printf "%s\n" "yes" >&6; }
|
||||
CFLAGS="$CFLAGS $f"
|
||||
f=-ffat-lto-objects
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports $f" >&5
|
||||
printf %s "checking whether $CC supports $f... " >&6; }
|
||||
if $CC -E $f /dev/null > /dev/null 2>&1 ; then
|
||||
if $CC -Werror -E $f - < /dev/null > /dev/null 2>&1 ; then
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
||||
printf "%s\n" "yes" >&6; }
|
||||
CFLAGS="$CFLAGS $f"
|
||||
@@ -4123,6 +4155,12 @@ printf "%s\n" "no" >&6; }
|
||||
fi
|
||||
fi
|
||||
|
||||
if test "$ac_cv_sizeof_time_t" = "4" ; then
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: time_t is 32-bits on this system; attempting to use 64-bit time_t" >&5
|
||||
printf "%s\n" "$as_me: time_t is 32-bits on this system; attempting to use 64-bit time_t" >&6;}
|
||||
CFLAGS="$CFLAGS -D_TIME_BITS=64 -D_FILE_OFFSET_BITS=64"
|
||||
fi
|
||||
|
||||
if test "$ac_cv_perlartifacts" = "yes" ; then
|
||||
PERLARTIFACTS=
|
||||
else
|
||||
@@ -4174,7 +4212,8 @@ then :
|
||||
|
||||
fi
|
||||
|
||||
VERSION=04.02.06
|
||||
|
||||
VERSION=04.02.08
|
||||
|
||||
|
||||
|
||||
|
||||
17
configure.in
17
configure.in
@@ -30,10 +30,12 @@ AC_PATH_PROG([PERL], [perl])
|
||||
|
||||
dnl Checks for libraries.
|
||||
AC_CHECK_LIB(m, sqrt)
|
||||
AC_CHECK_HEADERS_ONCE([sys/time.h])
|
||||
|
||||
dnl Integer sizes
|
||||
AC_CHECK_SIZEOF(unsigned int)
|
||||
AC_CHECK_SIZEOF(unsigned long)
|
||||
AC_CHECK_SIZEOF(time_t)
|
||||
|
||||
dnl Checks for header files.
|
||||
AC_CHECK_HEADERS(sys/types.h glob.h wctype.h locale.h langinfo.h)
|
||||
@@ -43,19 +45,17 @@ AC_STRUCT_TM
|
||||
|
||||
dnl Checks for library functions.
|
||||
AC_FUNC_UTIME_NULL
|
||||
AC_CHECK_HEADERS_ONCE([sys/time.h])
|
||||
|
||||
if test "$GCC" = yes; then
|
||||
CFLAGS="$CFLAGS -Wall -Wextra -Wstrict-prototypes"
|
||||
# Check for link-time optimization support
|
||||
f=-flto=auto
|
||||
AC_MSG_CHECKING([whether $CC supports $f])
|
||||
if $CC -E $f /dev/null > /dev/null 2>&1 ; then
|
||||
if $CC -Werror -E $f - < /dev/null > /dev/null 2>&1 ; then
|
||||
AC_MSG_RESULT([yes])
|
||||
CFLAGS="$CFLAGS $f"
|
||||
f=-ffat-lto-objects
|
||||
AC_MSG_CHECKING([whether $CC supports $f])
|
||||
if $CC -E $f /dev/null > /dev/null 2>&1 ; then
|
||||
if $CC -Werror -E $f - < /dev/null > /dev/null 2>&1 ; then
|
||||
AC_MSG_RESULT([yes])
|
||||
CFLAGS="$CFLAGS $f"
|
||||
else
|
||||
@@ -66,6 +66,12 @@ if test "$GCC" = yes; then
|
||||
fi
|
||||
fi
|
||||
|
||||
dnl If sizeof(time_t) is 4, try to get 64-bit time_t
|
||||
if test "$ac_cv_sizeof_time_t" = "4" ; then
|
||||
AC_MSG_NOTICE([time_t is 32-bits on this system; attempting to use 64-bit time_t])
|
||||
CFLAGS="$CFLAGS -D_TIME_BITS=64 -D_FILE_OFFSET_BITS=64"
|
||||
fi
|
||||
|
||||
if test "$ac_cv_perlartifacts" = "yes" ; then
|
||||
PERLARTIFACTS=
|
||||
else
|
||||
@@ -81,7 +87,8 @@ if test "$?" != 0 ; then
|
||||
exit 1
|
||||
fi
|
||||
AC_CHECK_FUNCS(setenv unsetenv glob mbstowcs setlocale initgroups)
|
||||
VERSION=04.02.06
|
||||
|
||||
VERSION=04.02.08
|
||||
AC_SUBST(VERSION)
|
||||
AC_SUBST(PERL)
|
||||
AC_SUBST(PERLARTIFACTS)
|
||||
|
||||
@@ -514,6 +514,7 @@ Acts on the region or places point where it needs to be."
|
||||
(set (make-local-variable 'comment-start) ";")
|
||||
(set (make-local-variable 'comment-start) "#")
|
||||
(set (make-local-variable 'comment-end) "\n")
|
||||
(set (make-local-variable 'comment-end-skip) "[ \t]*\\(\\s>\\||#\\)")
|
||||
(set (make-local-variable 'skeleton-end-hook) nil) ; so the skeletons will not automatically go to a new line.
|
||||
(set (make-local-variable 'fill-column) '100);cause I was having problems with autofill.
|
||||
(set (make-local-variable 'indent-line-function) 'remind-indent-line)
|
||||
|
||||
@@ -1,5 +1,63 @@
|
||||
CHANGES TO REMIND
|
||||
|
||||
* VERSION 4.2 Patch 8 - 2023-12-14
|
||||
|
||||
- NEW FEATURE: Add the $MaxLateMinutes system variable. This suppresses
|
||||
a queued time reminder if the current time is more than $MaxLateMinutes
|
||||
past the trigger time. (This typically only occurs if the computer
|
||||
has been suspended/hibernated and then resumed.)
|
||||
|
||||
- IMPROVEMENT: tkremind: If an error occurs during printing, catch it
|
||||
and change the Queue... button to Errors... (the same way errors in
|
||||
reminder files are handled.)
|
||||
|
||||
- IMPROVEMENT: rem2html: add the --utf8 flag to set the HTML charset to
|
||||
UTF-8.
|
||||
|
||||
- MINOR IMPROVEMENTS: Refactor some of the C code; use symbolic exit
|
||||
statuses and file descriptors for stdin/stdout/stderr where possible.
|
||||
|
||||
- BUG FIX: configure.in: Use better option detection so we don't use the
|
||||
unsupported option -ffat-lto-objects if compiling with clang instead of gcc.
|
||||
|
||||
- BUG FIXES: Many fixes to man pages, some by Jochen Sprickerhof
|
||||
|
||||
- MINOR BUG FIX: If Remind puts itself in the background, only close
|
||||
stdout/stderr if they are not associated with a terminal. If
|
||||
we close a descriptor, dup /dev/null onto it.
|
||||
|
||||
- MINOR BUG FIX: Catch SIGCONT when running in daemon/background mode.
|
||||
This forces the select() call to be interrupted so we can update the
|
||||
sleep time. This really only matters if the computer or the background
|
||||
Remind process is suspended and then resumed.
|
||||
|
||||
* VERSION 4.2 Patch 7 - 2023-10-09
|
||||
|
||||
- IMPROVEMENT: remind: On 32-bit systems, attempt to use a 64-bit time_t
|
||||
if the C library supports that. This lets Remind work properly with
|
||||
dates after 2038 in the few cases it has to call mktime() internally.
|
||||
|
||||
- MINOR NEW FEATURE: remind: Attempt to obtain the terminal background
|
||||
color using an OSC sequence. This normally only happens if standard
|
||||
output is a terminal, but can be forced with the '-@..,t' option.
|
||||
|
||||
- MINOR NEW FEATURE: remind: Add "--version" long option to print out
|
||||
Remind's version and exit.
|
||||
|
||||
- MINOR IMPROVEMENT: tkremind: Use a higher-resolution PNG image for
|
||||
the icon.
|
||||
|
||||
- MINOR IMPROVEMENT: remind-conf-mode.el: Update highlighting rules
|
||||
courtesy of Bill Benedetto
|
||||
|
||||
- MINOR CHANGE: Make AT optional. If we encounter a TIME in a REM
|
||||
command, implicitly begin an AT clause.
|
||||
|
||||
- DOCUMENTATION: Many minor fixes and improvements courtesy of Dan Jacobson.
|
||||
|
||||
- BUG FIX: Make "-w0" set the calendar width based on standard output
|
||||
rather than setting it to zero and causing an infinite loop.
|
||||
|
||||
* VERSION 4.2 Patch 6 - 2023-09-12
|
||||
|
||||
- NEW FEATURE: remind: The "nonomitted()" function takes an optional
|
||||
|
||||
@@ -10,7 +10,7 @@ FSET center(x) pad("", " ", (columns() - columns(x))/2) + x
|
||||
FSET right(x) pad("", " ", columns() - columns(x)) + x
|
||||
|
||||
MSG This is left-aligned.
|
||||
MSG [ansicolor(0,255,0)]This is also left-aligned.[ansicolor("")]
|
||||
MSG [ansicolor(0,255,0)]🌕 🌕 🌕 🌕 This is also left-aligned.[ansicolor("")]
|
||||
|
||||
MSG [center("This is centered.")]
|
||||
MSG [ansicolor(255,255,0) + center("🌕 🌕 🌕 🌕 This is also centered. ") + ansicolor("")]
|
||||
|
||||
@@ -8,15 +8,13 @@
|
||||
# Set this variable to 1 if your terminal has a dark background or 0 if
|
||||
# it: light.
|
||||
|
||||
bg_dark=1
|
||||
|
||||
# Set your latitude and longitude correctly for Sunrise/Sunset/Equinox/Solstice
|
||||
#
|
||||
# The values below are for Ottawa, Ontario, Canada
|
||||
latitude="45.420556"
|
||||
longitude="-75.689722"
|
||||
|
||||
remind -g -ibg_dark="$bg_dark" "-i\$Latitude=\"$latitude\"" "-i\$Longitude=\"$longitude\"" -q -@2 - "$@" <<'EOF'
|
||||
remind -g "-i\$Latitude=\"$latitude\"" "-i\$Longitude=\"$longitude\"" -q -@2 - "$@" <<'EOF'
|
||||
SET $AddBlankLines 0
|
||||
BANNER %
|
||||
|
||||
@@ -24,24 +22,25 @@ INCLUDE [$SysInclude]/ansitext.rem
|
||||
|
||||
MSG Today is [ansi_bold][$T][ansi_normal], being the [ord($T-date(year($T),1,1)+1)] day of [year($T)].%_
|
||||
|
||||
IF bg_dark
|
||||
IF $TerminalBackground == 0
|
||||
SPECIAL COLOR 255 255 0 Sunrise: 🌅 [sunrise()] today and [sunrise($T+1)] tomorrow
|
||||
SPECIAL COLOR 255 128 0 Sunset: 🌇 [sunset()] today and [sunset($T+1)] tomorrow%_
|
||||
ELSE
|
||||
SPECIAL COLOR 128 128 0 Sunrise: 🌅 [sunrise()] today and [sunrise($T+1)] tomorrow
|
||||
SPECIAL COLOR 128 32 0 Sunset: 🌇 [sunset()] today and [sunset($T+1)] tomorrow%_
|
||||
|
||||
ENDIF
|
||||
EOF
|
||||
|
||||
remind -g -ibg_dark="$bg_dark" "-i\$Latitude=\"$latitude\"" "-i\$Longitude=\"$longitude\"" -q -@2 - "$@" <<'EOF'
|
||||
remind -g "-i\$Latitude=\"$latitude\"" "-i\$Longitude=\"$longitude\"" -q -@2 - "$@" <<'EOF'
|
||||
SET $AddBlankLines 0
|
||||
BANNER %
|
||||
IF bg_dark
|
||||
IF $TerminalBackground == 0
|
||||
REM [moondatetime(0)] +60 SPECIAL COLOR 255 255 0 New moon: 🌑 [$T] %3 (%b)
|
||||
REM [moondatetime(1)] +60 SPECIAL COLOR 255 255 128 First Quarter: 🌓 [$T] %3 (%b)
|
||||
REM [moondatetime(2)] +60 SPECIAL COLOR 255 255 255 Full moon: 🌕 [$T] %3 (%b)
|
||||
REM [moondatetime(3)] +60 SPECIAL COLOR 255 255 128 Last Quarter: 🌗 [$T] %3 (%b)
|
||||
ELSE
|
||||
SPECIAL COLOR 128 128 0 Sunrise: 🌅 [sunrise()] today and [sunrise($T+1)] tomorrow
|
||||
SPECIAL COLOR 128 32 0 Sunset: 🌇 [sunset()] today and [sunset($T+1)] tomorrow%_
|
||||
|
||||
REM [moondatetime(0)] +60 SPECIAL COLOR 128 128 0 New moon: 🌑 [$T] %3 (%b)
|
||||
REM [moondatetime(1)] +60 SPECIAL COLOR 128 128 64 First Quarter: 🌓 [$T] %3 (%b)
|
||||
REM [moondatetime(2)] +60 SPECIAL COLOR 0 0 0 Full moon: 🌕 [$T] %3 (%b)
|
||||
@@ -51,7 +50,7 @@ EOF
|
||||
|
||||
echo ""
|
||||
|
||||
remind -g -ibg_dark="$bg_dark" "-i\$Latitude=\"$latitude\"" "-i\$Longitude=\"$longitude\"" -q -@2 - "$@" <<'EOF'
|
||||
remind -g "-i\$Latitude=\"$latitude\"" "-i\$Longitude=\"$longitude\"" -q -@2 - "$@" <<'EOF'
|
||||
SET $AddBlankLines 0
|
||||
BANNER %
|
||||
|
||||
|
||||
@@ -19,4 +19,4 @@ Remind was written by Dianne Skoll <dianne@skoll.ca>
|
||||
.SH HOME PAGE
|
||||
https://dianne.skoll.ca/projects/remind/
|
||||
.SH SEE ALSO
|
||||
\fBremind\fR
|
||||
\fBremind\fR(1)
|
||||
|
||||
@@ -327,7 +327,7 @@ calendar.
|
||||
.SH REM2PS INPUT FORMAT (-P OPTION)
|
||||
The \fB\-p\fR option is an older, simpler interchange format used by
|
||||
\fBRemind\fR to communicate with back-ends. New back-ends are
|
||||
encoraged to support the new \fB\-pp\fR format preferably, though they
|
||||
encouraged to support the new \fB\-pp\fR format preferably, though they
|
||||
are encouraged to support the older \fB\-p\fR format as well if the
|
||||
older format contains enough information for them to work properly.
|
||||
.PP
|
||||
@@ -458,7 +458,7 @@ JSON object. The keys that may be present in the JSON object are as
|
||||
follows:
|
||||
.TP
|
||||
.B date \fIYYYY-MM-DD\fR
|
||||
The \fbdate\fR key will \fIalways\fR be present; it is the trigger date
|
||||
The \fBdate\fR key will \fIalways\fR be present; it is the trigger date
|
||||
of the reminder expressed as a string in the format \fIYYYY-MM-DD\fR
|
||||
.TP
|
||||
.B filename \fIf\fR
|
||||
|
||||
100
man/remind.1.in
100
man/remind.1.in
@@ -28,6 +28,10 @@ Anything after the __EOF__ marker is completely ignored.
|
||||
\fBRemind\fR has a slew of options. If you're new to the program,
|
||||
ignore them for now and skip to the section "REMINDER FILES".
|
||||
.TP
|
||||
.B \-\-version
|
||||
The \fB\-\-version\fR option causes \fBRemind\fR to print its version number
|
||||
to standard output and then exit.
|
||||
.TP
|
||||
.B \-n
|
||||
The \fB\-n\fR option causes \fBRemind\fR to print the \fBnext\fR occurrence
|
||||
of each reminder in a simple calendar format. You can sort this by
|
||||
@@ -62,7 +66,7 @@ causes \fBRemind\fR to display reminders on the calendar on the
|
||||
day they actually occur \fIas well as\fR on any preceding days
|
||||
specified by the reminder's \fIdelta\fR. This \fIalso\fR causes
|
||||
\fBRemind\fR to include text outside %"...%" sequences that would
|
||||
otherwise be removed (though the actual %" markers themseves are removed.)
|
||||
otherwise be removed (though the actual %" markers themselves are removed.)
|
||||
.TP
|
||||
.B 'l'
|
||||
causes \fBRemind\fR to use VT100 line-drawing characters to draw
|
||||
@@ -105,11 +109,18 @@ If the optional \fIm\fR parameter is supplied following a comma, then
|
||||
\fIm\fR=0 tells \fBRemind\fR that the terminal background is dark, and
|
||||
\fBRemind\fR will brighten up dark colors to make them visible. If
|
||||
\fIm\fR=1, then \fBRemind\fR assumes the terminal background is light
|
||||
and it will darken bright colors to make them visible. If no \fIm\fR
|
||||
is supplied, or it is supplied as \fIm\fR=2, then \fBRemind\fR does
|
||||
not perform any adjustments, and some reminders may be hard or
|
||||
impossible to see if the color is too close to the terminal background
|
||||
color.
|
||||
and it will darken bright colors to make them visible. If \fIm\fR is
|
||||
specified as 2, then \fBRemind\fR does not perform any adjustments,
|
||||
and some reminders may be hard or impossible to see if the color is
|
||||
too close to the terminal background color. If you supply the letter
|
||||
\fBt\fR rather than a number, then Remind attempts to guess the background
|
||||
color of the terminal, \fIeven if\fR stdout is not a terminal.
|
||||
.PP
|
||||
On startup, if the standard output is a terminal, \fBRemind\fR
|
||||
attempts to determine if the terminal background is dark or light by
|
||||
sending a special escape sequence to determine the background color.
|
||||
The \fIm\fR parameter can override this check (or force it if
|
||||
\fIm\fR is given as \fBt\fR.)
|
||||
.PP
|
||||
If the optional \fIb\fR parameter is supplied following a comma, then
|
||||
\fIb=0\fR tells \fBRemind\fR to ignore SPECIAL SHADE reminders (the
|
||||
@@ -225,7 +236,7 @@ regardless of the \fIdelta\fR supplied for each reminder.
|
||||
.B \-t\fR\fIn\fR
|
||||
If you supply a number \fIn\fR after the \fB\-t\fR option, then
|
||||
\fBRemind\fR pretends that echo \fBREM\fR command has a delta
|
||||
of \+\+\fIn\fR, regardles of any existing delta.
|
||||
of \+\+\fIn\fR, regardless of any existing delta.
|
||||
.TP
|
||||
.B \-tz\fR
|
||||
If you supply the letter \fBz\fR after the \fB\-t\fR option, then
|
||||
@@ -610,6 +621,11 @@ The following examples show how date specifications are interpreted.
|
||||
.PP
|
||||
1. Null date specification - the reminder is triggered every day.
|
||||
The trigger date for a specific run is simply the current system date.
|
||||
For example:
|
||||
.PP
|
||||
.nf
|
||||
REM MSG This is triggered every time Remind runs
|
||||
.fi
|
||||
.PP
|
||||
2. Only
|
||||
.I day
|
||||
@@ -1790,7 +1806,7 @@ will begin reading from standard input.
|
||||
.PP
|
||||
If you specify a \fIdirectory\fR as the argument to \fBINCLUDE\fR, then
|
||||
\fBRemind\fR will process all files in that directory that match the shell
|
||||
patterm "*.rem". The files are processed in sorted order; the sort order
|
||||
pattern "*.rem". The files are processed in sorted order; the sort order
|
||||
matches that used by the shell when it expands "*.rem".
|
||||
.PP
|
||||
Note that the file specified by an \fBINCLUDE\fR command is interpreted
|
||||
@@ -2398,6 +2414,10 @@ is normally 0, but can be set with the \fB\-tt\fR option or explicitly
|
||||
set in your script. If \fB$DefaultDelta\fR is non-zero, you can use an
|
||||
explicit delta of +0 in an AT clause to countermand the default delta.
|
||||
.TP
|
||||
.B $DeltaOverride (read-only)
|
||||
If non-zero, corresponds to the \fIn\fR argument given to a
|
||||
\fB\-t\fR\fIn\fR command-line option.
|
||||
.TP
|
||||
.B $DontFork (read-only)
|
||||
If non-zero, then the \fB\-c\fR option was supplied on the command line.
|
||||
.TP
|
||||
@@ -2464,7 +2484,8 @@ or a date different from today's true date was supplied. If non-zero,
|
||||
then \fBONCE\fR directives will be ignored.
|
||||
.TP
|
||||
.B $InfDelta (read-only)
|
||||
If non-zero, then the \fB\-t\fR option was supplied on the command line.
|
||||
If non-zero, then the \fB\-t\fR option was supplied on the command line,
|
||||
with no \fIn\fR argument.
|
||||
.TP
|
||||
.B $IntMax (read-only)
|
||||
The largest representable \fBINT\fR. On a machine with 32-bit signed integers
|
||||
@@ -2541,6 +2562,24 @@ updates \fB$LongDeg\fR, \fB$LongMin\fR and \fB$LongSec\fR. Similar
|
||||
rules apply to \fB$Latitude\fR, \fB$LatDeg\fR, \fB$LatMin\fR and \fB$LatSec\fR.
|
||||
.RE
|
||||
.TP
|
||||
.B $MaxLateMinutes
|
||||
This variable controls how \fBRemind\fR reacts to a computer being suspended
|
||||
and then woken. Normally, if a timed reminder is queued and then the
|
||||
computer suspended, and then the computer is woken \fIafter\fR the
|
||||
timed reminder's trigger time, \fBRemind\fR will triger the timer anyway,
|
||||
despite the fact that the trigger time has already passed.
|
||||
.RS
|
||||
.PP
|
||||
If you set \fB$MaxLateMinutes\fR to a non-zero integer between 1 and 1440,
|
||||
then \fBRemind\fR will \fInot\fR trigger a timed reminder whose trigger
|
||||
time is more than \fB$MaxLateMinutes\fR minutes in the past.
|
||||
.PP
|
||||
Note that \fBRemind\fR uses the value of \fB$MaxLateMinutes\fR that is in
|
||||
effect when it has finished reading the reminder file and puts itself in
|
||||
the background. Generally, you should set \fB$MaxLateMinutes\fR once
|
||||
near the beginning of the file and not change it after that.
|
||||
.RE
|
||||
.TP
|
||||
.B $MaxSatIter
|
||||
The maximum number of iterations for the \fBSATISFY\fR clause
|
||||
(described later.) Must be at least 10.
|
||||
@@ -2708,9 +2747,13 @@ Set to 1 if the \fB\-@1\fR option was used; 0 otherwise.
|
||||
Set to 1 if the \fB\-@2\fR option was used; 0 otherwise.
|
||||
.TP
|
||||
.B $TerminalBackground (read-only)
|
||||
Returns -1 if the terminal background color was not specified,
|
||||
0 if it was specified as dark with the \fB\-@,0\fR option or
|
||||
1 if it was specified as light with the \fB\-@,1\fR option.
|
||||
Returns -1 if the terminal background color could not be determined, 0
|
||||
if it was found to be dark (or was specified as dark with the
|
||||
\fB\-@,0\fR option) or 1 if it was found to be light (or specified as
|
||||
light with the \fB\-@,1\fR option.) The terminal background is considered
|
||||
to be "dark" if the average of the red, green and blue components is
|
||||
at most 85 out of 255, and if the maximum of any component is at most
|
||||
128 out of 255.
|
||||
.PP
|
||||
Note: If any of the calendar modes are in effect, then the
|
||||
values of $Daemon, $DontFork, $DontTrigAts, $DontQueue, $HushMode,
|
||||
@@ -3294,7 +3337,7 @@ This function returns the number of \fInon-\fRomitted days between
|
||||
counted. \fIend\fR is never counted.
|
||||
.RS
|
||||
.PP
|
||||
Note that if \fIend\fR is less than \ffIstart\fR, the arguments
|
||||
Note that if \fIend\fR is less than \fIstart\fR, the arguments
|
||||
are effectively swapped, so counting always begins from the older
|
||||
date.
|
||||
.PP
|
||||
@@ -3339,7 +3382,7 @@ reminder will label day numbers in a calendar:
|
||||
.fi
|
||||
.PP
|
||||
Obviously, the answer you get from \fBnonomitted\fR depends on the global
|
||||
OMIT context. If you use moveable OMITs, you may get inconsistent results.
|
||||
OMIT context. If you use movable OMITs, you may get inconsistent results.
|
||||
.PP
|
||||
Here is a more complex use for \fBnonomitted\fR. My garbage collection
|
||||
follows two interleaved 14-day cycles: One Friday, garbage and paper
|
||||
@@ -4304,7 +4347,7 @@ Dean was born in 1984. The above example, on 1 November 1992, would print:
|
||||
Similarly, the function is useful in anniversary reminders. For example:
|
||||
.PP
|
||||
.nf
|
||||
REM 4 June MSG [since(1989)] anniversary of the Tiananmen Square massacre
|
||||
REM 4 June MSG [since(1989)] anniversary of the Tienanmen Square massacre
|
||||
.fi
|
||||
.PP
|
||||
Notes:
|
||||
@@ -5525,7 +5568,7 @@ The \fBSPECIAL\fR keyword is used to transmit "out-of-band" information
|
||||
to \fBRemind\fR backends, such as \fBtkremind\fR or \fBRem2PS\fR.
|
||||
They are used only when piping data from a \fBremind \-p\fR line.
|
||||
(Note that the COLOR special is an exception; it downgrades to the
|
||||
equivalent of MSG in \fBremind's\fR normal mode of operation.)
|
||||
equivalent of MSG in \fBRemind's\fR normal mode of operation.)
|
||||
.PP
|
||||
The various \fBSPECIAL\fRs recognized are particular for each
|
||||
backend; however, there are four \fBSPECIAL\fRs that all backends
|
||||
@@ -5816,6 +5859,25 @@ components, then \fBRemind\fR will correctly compute a trigger date, even
|
||||
if it happens to be before the start of scanning.
|
||||
Note that this behaviour is not true for
|
||||
versions of \fBRemind\fR prior to 03.00.01.
|
||||
.SH FILES
|
||||
.PP
|
||||
The traditional location of your reminders file or directory is:
|
||||
.PP
|
||||
.nf
|
||||
$HOME/.reminders
|
||||
.fi
|
||||
.PP
|
||||
where \fB$HOME\fR is your home directory.
|
||||
.PP
|
||||
Remind ships with some preinstalled files for holidays and language
|
||||
packs. These are located in the following directory:
|
||||
.PP
|
||||
.nf
|
||||
@prefix@/share/remind/
|
||||
.fi
|
||||
.PP
|
||||
Do not hard-code the above directory in your reminder files. Instead,
|
||||
use the value of the $SysInclude system variable.
|
||||
.SH AUTHOR
|
||||
.PP
|
||||
Dianne Skoll <dianne@skoll.ca> wrote \fBRemind\fR. The moon code
|
||||
@@ -5863,9 +5925,11 @@ Liviu Daia
|
||||
Rafa Couto
|
||||
.PP
|
||||
\fBIcelandic\fR --
|
||||
Bj\(:orn Dav\('i\[Sd]sson
|
||||
Bj\[:o]rn Daví\[Sd]sson
|
||||
.SH BUGS
|
||||
.PP
|
||||
If you find a bug in Remind, please report it to: dianne@skoll.ca
|
||||
.PP
|
||||
There's no good reason why read-only system variables are not
|
||||
implemented as functions, or why functions like \fBversion()\fR, etc.
|
||||
are not implemented as read-only system variables.
|
||||
@@ -5888,6 +5952,8 @@ Richard Siegel and Michael and Sharon Strassfeld, \fIThe First Jewish
|
||||
Catalog\fR, Jewish Publication Society of America.
|
||||
.SH HOME PAGE
|
||||
https://dianne.skoll.ca/projects/remind/
|
||||
.SH MAILING LIST
|
||||
https://dianne.skoll.ca/mailman/listinfo/remind-fans
|
||||
.SH SEE ALSO
|
||||
.PP
|
||||
\fBrem\fR(1), \fBrem2ps\fR(1), \fBrem2pdf\fR(1), \fBtkremind\fR(1), \fBrem2html\fR(1)
|
||||
|
||||
@@ -383,6 +383,16 @@ same thing.
|
||||
STATUS
|
||||
Return the number of queued reminders.
|
||||
|
||||
.TP
|
||||
QUEUE
|
||||
Returns the contents of the queue, printed between "NOTE queue" and
|
||||
"NOTE endqueue" lines.
|
||||
|
||||
.TP
|
||||
JSONQUEUE
|
||||
Returns the contents of the queue in JSON format, printed between
|
||||
"NOTE JSONQUEUE" and "NOTE ENDJSONQUEUE" lines.
|
||||
|
||||
.TP
|
||||
REREAD
|
||||
Re-read the reminder file
|
||||
@@ -416,6 +426,16 @@ NOTE queued \fIn\fR
|
||||
This line is emitted in response to a \fBSTATUS\fR command. The number
|
||||
\fIn\fR is the number of reminders in the queue.
|
||||
|
||||
.TP
|
||||
NOTE queue
|
||||
Indicates that queue contents are about to follow. The end of the
|
||||
queue is indicated by a NOTE endqueue line.
|
||||
|
||||
.TP
|
||||
NOTE JSONQUEUE
|
||||
Indicates that queue contents in JSON format are about to follow. The
|
||||
end of the queue is indicated by a NOTE ENDJSONQUEUE line.
|
||||
|
||||
.SH AUTHOR
|
||||
TkRemind was written by Dianne Skoll <dianne@skoll.ca>
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@ use warnings;
|
||||
|
||||
use Getopt::Long;
|
||||
use JSON::MaybeXS;
|
||||
use Encode;
|
||||
|
||||
my %Options;
|
||||
|
||||
@@ -44,6 +45,11 @@ Print usage information
|
||||
|
||||
Print version
|
||||
|
||||
=item --utf8
|
||||
|
||||
Assume standard input is encoded in UTF-8; write UTF-8 data to standard
|
||||
output.
|
||||
|
||||
=item --backurl I<url>
|
||||
|
||||
When producing the small calendar for the previous month, make the
|
||||
@@ -154,6 +160,7 @@ Usage: remind -pp ... | rem2html [options]
|
||||
Options:
|
||||
|
||||
--help, -h Print usage information
|
||||
--utf8 Assume UTF-8 input and write UTF-8 output
|
||||
--man Show man page (requires "perldoc")
|
||||
--version Print version
|
||||
--backurl url Make the title on the previous month's small calendar
|
||||
@@ -197,6 +204,7 @@ sub parse_options
|
||||
local $SIG{__WARN__} = sub { print STDERR "$TIDY_PROGNAME: $_[0]\n"; };
|
||||
if (!GetOptions(\%Options, "help|h",
|
||||
"man",
|
||||
"utf8",
|
||||
"pngs",
|
||||
"version",
|
||||
"stylesheet=s",
|
||||
@@ -216,13 +224,22 @@ sub parse_options
|
||||
if ($stylesheet) {
|
||||
$Options{stylesheet} = smoosh($Options{imgbase}, $stylesheet);
|
||||
}
|
||||
if ($Options{utf8}) {
|
||||
binmode(STDIN, ':encoding(UTF-8)');
|
||||
binmode(STDOUT, ':encoding(UTF-8)');
|
||||
}
|
||||
}
|
||||
|
||||
sub start_output
|
||||
{
|
||||
return if ($Options{tableonly});
|
||||
|
||||
print("<html>\n<head>\n<title>" . $Options{title} . "</title>\n");
|
||||
print("<html>\n<head>\n");
|
||||
if ($Options{utf8}) {
|
||||
print '<meta charset="UTF-8">' . "\n";
|
||||
}
|
||||
|
||||
print("<title>" . $Options{title} . "</title>\n");
|
||||
if (!$Options{nostyle}) {
|
||||
if ($Options{stylesheet}) {
|
||||
print('<link rel="stylesheet" type="text/css" href="' .
|
||||
@@ -310,7 +327,12 @@ sub parse_input
|
||||
($y, $m, $d, $special, $tag, $duration, $time, $body) =
|
||||
($1, $2, $3, $4, $5, $6, $7, $8);
|
||||
} elsif (/\{/) {
|
||||
my $obj = decode_json($_);
|
||||
my $obj;
|
||||
if ($Options{utf8}) {
|
||||
$obj = decode_json(encode('UTF-8', $_, Encode::FB_DEFAULT));
|
||||
} else {
|
||||
$obj = decode_json($_);
|
||||
}
|
||||
next unless ($obj->{date} =~ /^(\d+)-(\d+)-(\d+)$/);
|
||||
$y = $1;
|
||||
$m = $2;
|
||||
|
||||
@@ -29,31 +29,62 @@ set Hostname [exec hostname]
|
||||
# Our icon photo
|
||||
catch {
|
||||
image create photo rpicon -data {
|
||||
R0lGODlhFwAgAOecABUTERYTERYUERcVEhgWExkXFBkXFRoXFRsZFhwZFxwa
|
||||
GB0bGR4cGR4cGh8dGiAeHCEfHCEfHSIgHSIgHiQiHyYkISknJCooJispJywq
|
||||
Jy4sKTIwLjUzMDUzMTo4Njs5Nzs5ODw7ODw7OT07OT48OkE/PUJAPkNBP0RC
|
||||
QEVDQUVEQkdFQ0lIRkpJR01LSU5MSlBPTVFQTlNSUFRSUFRSUVVTUlVUUllY
|
||||
VltZV1xaWF1cWmBfXmJgX2RiYGZlY2dmZGppZ2tqaG1ram9tbHFwb3Jwb3Rz
|
||||
cXV0c3Z0c3Z1c3Z1dHd1dHh2dXh3dnt5eHx7eXx7en18en59e4B/foGAf4KB
|
||||
f4SDgYWEgoWEg4eGhIiHhouKiI2Mio6Ni46NjJCQj5KRkJSTkZeWlpiXlpmY
|
||||
l5qZmJybmp6dnKCfnqGgoKKhoKOioaSjoqinp6qpqKurqq+urbCvrrCwr7Gw
|
||||
r7OysbW1tLi3tri3t7u6ur28vMTDw8TEw8XFxMbFxcfGxsfHxsrJycrKyczM
|
||||
y83My83MzM3NzdDQz9LR0dPS0tPT09fX19jY19ra2dvb29zc29zc3Ojn5+jo
|
||||
6Orq6uzs7O/v7/T09PX19fb29vf39/r6+vv7+/7+/v//////////////////
|
||||
////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////
|
||||
/////////////////////yH5BAEKAP8ALAAAAAAXACAAAAj+AP8JHEiwoMGD
|
||||
CAcusRAAQEKDBQIcEBAAwUODAQJAsBGAwsWCBzJuUBLgI0ENGVM2dACg5UWV
|
||||
KU+Y/JfRQBknPoq8ATQz4wxOQIFa6vMx5ZSgQetczJDSClKgcF6mFDEnE9I2
|
||||
D0fADOChUdA1D7dmTBEUTditDQRQAnomIQaxICpoAmomoUoAGS2YIBIUDEIu
|
||||
YndI8FAJaBaEMlIuSEkloxugUBBOSLkh44AvGfkAPYJQpYqMLIQEILB205DO
|
||||
KW9kJHMhQAmgkaKgzsgjggM5GbEAxaNmdoAPOoz8CCAgEVAtg3wPEPMnQQAU
|
||||
QWsg5AAzDZSMbIBeaoHwAUwSDAI2XMAENA8ThAPEBvAStEkc3yonrOW0aUMk
|
||||
+BkBVAlaKATC8Fsp8Igid5ABgxMHtaTgggy6ZFBAADs= }
|
||||
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 }
|
||||
|
||||
wm iconphoto . -default rpicon
|
||||
}
|
||||
@@ -1249,7 +1280,7 @@ proc Status { stuff } {
|
||||
# None
|
||||
#---------------------------------------------------------------------------
|
||||
proc DoPrint {} {
|
||||
global Rem2PS Rem2PDF HaveRem2PDF PSCmd Option PrintStatus
|
||||
global Rem2PS Rem2PDF HaveRem2PDF PSCmd Option PrintStatus RemindErrors
|
||||
global CurMonth CurYear MonthNames
|
||||
|
||||
catch {destroy .p}
|
||||
@@ -1435,7 +1466,8 @@ proc DoPrint {} {
|
||||
append cmd " $fname"
|
||||
Status "Printing..."
|
||||
if {[catch {eval "exec $cmd"} err]} {
|
||||
tk_dialog .error Error "Error during printing: $err" error 0 Ok
|
||||
set RemindErrors [unique_lines $err]
|
||||
set_button_to_errors
|
||||
}
|
||||
DisplayTime
|
||||
}
|
||||
@@ -2671,9 +2703,14 @@ proc ShowQueue { file } {
|
||||
continue;
|
||||
}
|
||||
set obj [lsort -command sort_q $obj]
|
||||
set did 0
|
||||
foreach q $obj {
|
||||
$w.t insert end "$q\n"
|
||||
set did 1
|
||||
}
|
||||
if { $did == 0 } {
|
||||
$w.t insert end "(Queue is empty)\n"
|
||||
}
|
||||
}
|
||||
$w.t configure -state disabled
|
||||
}
|
||||
@@ -4017,13 +4054,17 @@ bind Balloon <Destroy> {
|
||||
catch { unset Balloon(helptext%W) }
|
||||
}
|
||||
|
||||
proc balloon_add_help { w txt } {
|
||||
proc balloon_set_help { w txt } {
|
||||
global Balloon
|
||||
if {"$txt" == ""} {
|
||||
catch { unset Balloon(helptext$w) }
|
||||
return
|
||||
}
|
||||
set Balloon(helptext$w) $txt
|
||||
}
|
||||
|
||||
proc balloon_add_help { w txt } {
|
||||
balloon_set_help $w $txt
|
||||
bindtags $w "Balloon [bindtags $w]"
|
||||
}
|
||||
|
||||
@@ -4175,9 +4216,11 @@ proc update_color_buttons { w } {
|
||||
}
|
||||
|
||||
proc set_button_to_queue {} {
|
||||
balloon_set_help .b.queue "See the queue of pending reminders (debugging purposes only)"
|
||||
.b.queue configure -text {Queue...} -command {DoQueue}
|
||||
}
|
||||
proc set_button_to_errors {} {
|
||||
balloon_set_help .b.queue "See the list of errors from the most recent operation"
|
||||
.b.queue configure -text {Errors...} -command {ShowErrors}
|
||||
}
|
||||
|
||||
|
||||
@@ -1218,7 +1218,7 @@ static void PrintLeft(char const *s, int width, char pad)
|
||||
if (!buf) {
|
||||
/* Uh-oh... cannot recover */
|
||||
fprintf(stderr, "%s\n", ErrMsg[E_NO_MEM]);
|
||||
exit(1);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
(void) mbstowcs(buf, s, len+1);
|
||||
@@ -1297,7 +1297,7 @@ static void PrintCentered(char const *s, int width, char *pad)
|
||||
if (!buf) {
|
||||
/* Uh-oh... cannot recover */
|
||||
fprintf(stderr, "%s\n", ErrMsg[E_NO_MEM]);
|
||||
exit(1);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
(void) mbstowcs(buf, s, len+1);
|
||||
@@ -1603,7 +1603,7 @@ static void GenerateCalEntries(int col)
|
||||
r=IncludeFile(InitialFile);
|
||||
if (r) {
|
||||
fprintf(ErrFp, "%s %s: %s\n", ErrMsg[E_ERR_READING], InitialFile, ErrMsg[r]);
|
||||
exit(1);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
while(1) {
|
||||
@@ -1611,7 +1611,7 @@ static void GenerateCalEntries(int col)
|
||||
if (r == E_EOF) return;
|
||||
if (r) {
|
||||
Eprint("%s: %s", ErrMsg[E_ERR_READING], ErrMsg[r]);
|
||||
exit(1);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
s = FindInitialToken(&tok, CurLine);
|
||||
|
||||
|
||||
26
src/dorem.c
26
src/dorem.c
@@ -350,6 +350,16 @@ int ParseRem(ParsePtr s, Trigger *trig, TimeTrig *tim, int save_in_globals)
|
||||
if (r) return r;
|
||||
break;
|
||||
|
||||
/* A time implicitly introduces an AT if AT is not explicit */
|
||||
case T_Time:
|
||||
DBufFree(&buf);
|
||||
if (tim->ttime != NO_TIME) return E_TIME_TWICE;
|
||||
tim->ttime = tok.val;
|
||||
r = ParseTimeTrig(s, tim, save_in_globals);
|
||||
if (r) return r;
|
||||
trig->duration_days = ComputeTrigDuration(tim);
|
||||
break;
|
||||
|
||||
case T_At:
|
||||
DBufFree(&buf);
|
||||
r=ParseTimeTrig(s, tim, save_in_globals);
|
||||
@@ -1136,7 +1146,12 @@ int TriggerReminder(ParsePtr p, Trigger *t, TimeTrig *tim, int dse, int is_queue
|
||||
if (msg_command) {
|
||||
DoMsgCommand(msg_command, DBufValue(&buf));
|
||||
} else {
|
||||
printf("%s", DBufValue(&buf));
|
||||
/* Add a space before "NOTE endreminder" */
|
||||
if (Daemon < 0 && !strncmp(DBufValue(&buf), "NOTE endreminder", 16)) {
|
||||
printf(" %s", DBufValue(&buf));
|
||||
} else {
|
||||
printf("%s", DBufValue(&buf));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -1184,7 +1199,7 @@ int ShouldTriggerReminder(Trigger *t, TimeTrig *tim, int dse, int *err)
|
||||
if (DontIssueAts > 1) {
|
||||
/* If two or more -a options, then *DO* issue ats that are in the
|
||||
future */
|
||||
if (tim->ttime < SystemTime(0) / 60) {
|
||||
if (tim->ttime < MinutesPastMidnight(0)) {
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
@@ -1192,13 +1207,6 @@ int ShouldTriggerReminder(Trigger *t, TimeTrig *tim, int dse, int *err)
|
||||
}
|
||||
}
|
||||
|
||||
/* Don't trigger "old" timed reminders */
|
||||
/*** REMOVED...
|
||||
if (dse == DSEToday &&
|
||||
tim->ttime != NO_TIME &&
|
||||
tim->ttime < SystemTime(0) / 60) return 0;
|
||||
*** ...UNTIL HERE */
|
||||
|
||||
/* If "infinite delta" option is chosen, always trigger future reminders */
|
||||
if (InfiniteDelta || NextMode) return 1;
|
||||
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int dse, int mode)
|
||||
{
|
||||
int diff = dse - DSEToday;
|
||||
int curtime = SystemTime(0) / 60;
|
||||
int curtime = MinutesPastMidnight(0);
|
||||
int err, done;
|
||||
int c;
|
||||
int d, m, y;
|
||||
@@ -894,7 +894,7 @@ int DoSubstFromString(char const *source, DynamicBuffer *dbuf,
|
||||
int r;
|
||||
|
||||
if (dse == NO_DATE) dse=DSEToday;
|
||||
if (tim == NO_TIME) tim=SystemTime(0)/60;
|
||||
if (tim == NO_TIME) tim=MinutesPastMidnight(0);
|
||||
CreateParser(source, &tempP);
|
||||
tempP.allownested = 0;
|
||||
tempTrig.typ = MSG_TYPE;
|
||||
|
||||
19
src/funcs.c
19
src/funcs.c
@@ -1421,28 +1421,28 @@ static int FRealtoday(func_info *info)
|
||||
static int FNow(func_info *info)
|
||||
{
|
||||
RetVal.type = TIME_TYPE;
|
||||
RETVAL = (int) ( SystemTime(0) / 60L );
|
||||
RETVAL = MinutesPastMidnight(0);
|
||||
return OK;
|
||||
}
|
||||
|
||||
static int FRealnow(func_info *info)
|
||||
{
|
||||
RetVal.type = TIME_TYPE;
|
||||
RETVAL = (int) ( SystemTime(1) / 60L );
|
||||
RETVAL = MinutesPastMidnight(1);
|
||||
return OK;
|
||||
}
|
||||
|
||||
static int FCurrent(func_info *info)
|
||||
{
|
||||
RetVal.type = DATETIME_TYPE;
|
||||
RETVAL = DSEToday * MINUTES_PER_DAY + (SystemTime(0) / 60);
|
||||
RETVAL = DSEToday * MINUTES_PER_DAY + MinutesPastMidnight(0);
|
||||
return OK;
|
||||
}
|
||||
|
||||
static int FRealCurrent(func_info *info)
|
||||
{
|
||||
RetVal.type = DATETIME_TYPE;
|
||||
RETVAL = RealToday * MINUTES_PER_DAY + (SystemTime(1) / 60);
|
||||
RETVAL = RealToday * MINUTES_PER_DAY + MinutesPastMidnight(1);
|
||||
return OK;
|
||||
}
|
||||
|
||||
@@ -2492,7 +2492,7 @@ static int FTimezone(func_info *info)
|
||||
|
||||
if (Nargs == 0) {
|
||||
dse = DSEToday;
|
||||
now = (SystemTime(0) / 60);
|
||||
now = MinutesPastMidnight(0);
|
||||
} else {
|
||||
if (!HASDATE(ARG(0))) return E_BAD_TYPE;
|
||||
dse = DATEPART(ARG(0));
|
||||
@@ -3574,6 +3574,8 @@ rows_or_cols(func_info *info, int want_rows)
|
||||
struct winsize w;
|
||||
int fd = STDOUT_FILENO;
|
||||
|
||||
int opened = 0;
|
||||
|
||||
RetVal.type = INT_TYPE;
|
||||
if (!isatty(fd)) {
|
||||
fd = open("/dev/tty", O_RDONLY);
|
||||
@@ -3581,6 +3583,7 @@ rows_or_cols(func_info *info, int want_rows)
|
||||
RETVAL = -1;
|
||||
return OK;
|
||||
}
|
||||
opened = 1;
|
||||
}
|
||||
if (ioctl(fd, TIOCGWINSZ, &w) == 0) {
|
||||
if (want_rows) RETVAL = w.ws_row;
|
||||
@@ -3588,7 +3591,7 @@ rows_or_cols(func_info *info, int want_rows)
|
||||
} else {
|
||||
RETVAL = -1;
|
||||
}
|
||||
if (fd != STDOUT_FILENO) {
|
||||
if (opened) {
|
||||
close(fd);
|
||||
}
|
||||
return OK;
|
||||
@@ -3757,7 +3760,7 @@ solstice_equinox_for_year(int y, int which)
|
||||
j -= 2447892.50000; /* This is the Julian date of midnight, 1 Jan 1990 UTC */
|
||||
int dse = (int) j;
|
||||
|
||||
int min = floor((j - (double) dse) * MINUTES_PER_DAY);
|
||||
int min = (int) floor((j - (double) dse) * MINUTES_PER_DAY);
|
||||
int ret;
|
||||
|
||||
/* Convert from UTC to local time */
|
||||
@@ -3805,8 +3808,10 @@ FSoleq(func_info *info)
|
||||
}
|
||||
|
||||
ret = solstice_equinox_for_year(y, which);
|
||||
if (ret < 0) return E_MKTIME_PROBLEM;
|
||||
if (dse != NO_DATE && (ret / MINUTES_PER_DAY) < dse) {
|
||||
ret = solstice_equinox_for_year(y+1, which);
|
||||
if (ret < 0) return E_MKTIME_PROBLEM;
|
||||
}
|
||||
RetVal.type = DATETIME_TYPE;
|
||||
RETVAL = ret;
|
||||
|
||||
@@ -50,6 +50,7 @@ EXTERN int LineNo;
|
||||
EXTERN int FreshLine;
|
||||
EXTERN uid_t TrustedUsers[MAX_TRUSTED_USERS];
|
||||
|
||||
EXTERN INIT( int MaxLateMinutes, 0);
|
||||
EXTERN INIT( int NumTrustedUsers, 0);
|
||||
EXTERN INIT( char const *MsgCommand, NULL);
|
||||
EXTERN INIT( char const *QueuedMsgCommand, NULL);
|
||||
|
||||
180
src/init.c
180
src/init.c
@@ -25,10 +25,11 @@
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <poll.h>
|
||||
#include <pwd.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <termios.h>
|
||||
|
||||
#ifdef HAVE_INITGROUPS
|
||||
#include <grp.h>
|
||||
@@ -40,6 +41,14 @@
|
||||
#include "expr.h"
|
||||
#include "err.h"
|
||||
|
||||
static int should_guess_terminal_background = 1;
|
||||
|
||||
static void guess_terminal_background(int *r, int *g, int *b);
|
||||
static int tty_init(int fd);
|
||||
static void tty_raw(int fd);
|
||||
static void tty_reset(int fd);
|
||||
|
||||
static void ProcessLongOption(char const *arg);
|
||||
/***************************************************************
|
||||
*
|
||||
* Command line options recognized:
|
||||
@@ -167,6 +176,7 @@ void InitRemind(int argc, char const *argv[])
|
||||
int x;
|
||||
int dse;
|
||||
int ttyfd;
|
||||
int r, g, b;
|
||||
|
||||
dse = NO_DATE;
|
||||
|
||||
@@ -219,7 +229,7 @@ void InitRemind(int argc, char const *argv[])
|
||||
}
|
||||
} else {
|
||||
fprintf(stderr, "Invoked with a NULL argv[0]; bailing because that's just plain bizarre.\n");
|
||||
exit(1);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
/* Parse the command-line options */
|
||||
@@ -243,6 +253,11 @@ void InitRemind(int argc, char const *argv[])
|
||||
while(*arg) arg++;
|
||||
break;
|
||||
|
||||
case '-':
|
||||
ProcessLongOption(arg);
|
||||
while(*arg) arg++;
|
||||
break;
|
||||
|
||||
case '@':
|
||||
UseVTColors = 1;
|
||||
if (*arg) {
|
||||
@@ -259,16 +274,24 @@ void InitRemind(int argc, char const *argv[])
|
||||
if (*arg == ',') {
|
||||
arg++;
|
||||
if (*arg != ',') {
|
||||
PARSENUM(x, arg);
|
||||
if (x == 0) {
|
||||
TerminalBackground = TERMINAL_BACKGROUND_DARK;
|
||||
} else if (x == 1) {
|
||||
TerminalBackground = TERMINAL_BACKGROUND_LIGHT;
|
||||
} else if (x == 2) {
|
||||
TerminalBackground = TERMINAL_BACKGROUND_UNKNOWN;
|
||||
if (*arg == 't') {
|
||||
arg++;
|
||||
should_guess_terminal_background = 2;
|
||||
} else {
|
||||
fprintf(ErrFp, "%s: -@n,m,b: m must be 0, 1 or 2 (assuming 2)\n",
|
||||
argv[0]);
|
||||
PARSENUM(x, arg);
|
||||
if (x == 0) {
|
||||
should_guess_terminal_background = 0;
|
||||
TerminalBackground = TERMINAL_BACKGROUND_DARK;
|
||||
} else if (x == 1) {
|
||||
should_guess_terminal_background = 0;
|
||||
TerminalBackground = TERMINAL_BACKGROUND_LIGHT;
|
||||
} else if (x == 2) {
|
||||
should_guess_terminal_background = 0;
|
||||
TerminalBackground = TERMINAL_BACKGROUND_UNKNOWN;
|
||||
} else {
|
||||
fprintf(ErrFp, "%s: -@n,m,b: m must be t, 0, 1 or 2 (assuming 2)\n",
|
||||
argv[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -537,7 +560,7 @@ void InitRemind(int argc, char const *argv[])
|
||||
arg++;
|
||||
/* -wt means get width from /dev/tty */
|
||||
ttyfd = open("/dev/tty", O_RDONLY);
|
||||
if (!ttyfd) {
|
||||
if (ttyfd < 0) {
|
||||
fprintf(stderr, "%s: `-wt': Cannot open /dev/tty: %s\n",
|
||||
argv[0], strerror(errno));
|
||||
} else {
|
||||
@@ -548,7 +571,12 @@ void InitRemind(int argc, char const *argv[])
|
||||
PARSENUM(CalWidth, arg);
|
||||
if (CalWidth != 0 && CalWidth < 71) CalWidth = 71;
|
||||
if (CalWidth == 0) {
|
||||
CalWidth = -1;
|
||||
/* Cal width of 0 means obtain from stdout */
|
||||
if (isatty(STDOUT_FILENO)) {
|
||||
InitCalWidthAndFormWidth(STDOUT_FILENO);
|
||||
} else {
|
||||
CalWidth = 80;
|
||||
}
|
||||
}
|
||||
FormWidth = CalWidth - 8;
|
||||
if (FormWidth < 20) FormWidth = 20;
|
||||
@@ -621,6 +649,17 @@ void InitRemind(int argc, char const *argv[])
|
||||
}
|
||||
}
|
||||
|
||||
if (should_guess_terminal_background) {
|
||||
guess_terminal_background(&r, &g, &b);
|
||||
if (r >= 0 && g >= 0 && b >= 0) {
|
||||
if (r+g+b <= 85*3 && r <= 128 && g <= 128 && b <= 128) {
|
||||
TerminalBackground = TERMINAL_BACKGROUND_DARK;
|
||||
} else {
|
||||
TerminalBackground = TERMINAL_BACKGROUND_LIGHT;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Get the filename. */
|
||||
if (!InvokedAsRem) {
|
||||
if (i >= argc) {
|
||||
@@ -726,7 +765,7 @@ void InitRemind(int argc, char const *argv[])
|
||||
|
||||
/* Figure out the offset from UTC */
|
||||
if (CalculateUTC)
|
||||
(void) CalcMinsFromUTC(DSEToday, SystemTime(0)/60,
|
||||
(void) CalcMinsFromUTC(DSEToday, MinutesPastMidnight(0),
|
||||
&MinsFromUTC, NULL);
|
||||
}
|
||||
|
||||
@@ -958,3 +997,116 @@ AddTrustedUser(char const *username)
|
||||
NumTrustedUsers++;
|
||||
}
|
||||
|
||||
static void
|
||||
ProcessLongOption(char const *arg)
|
||||
{
|
||||
if (!strcmp(arg, "version")) {
|
||||
printf("%s\n", VERSION);
|
||||
exit(EXIT_SUCCESS);
|
||||
}
|
||||
fprintf(ErrFp, "%s: Unknown long option --%s\n", ArgV[0], arg);
|
||||
}
|
||||
|
||||
static void
|
||||
guess_terminal_background(int *r, int *g, int *b)
|
||||
{
|
||||
int ttyfd;
|
||||
struct pollfd p;
|
||||
int rr, gg, bb;
|
||||
char buf[128];
|
||||
int n;
|
||||
|
||||
*r = -1;
|
||||
*g = -1;
|
||||
*b = -1;
|
||||
|
||||
/* Don't guess if stdout not a terminal unless asked to by @,t */
|
||||
if (should_guess_terminal_background != 2) {
|
||||
if (!isatty(STDOUT_FILENO)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
ttyfd = open("/dev/tty", O_RDWR);
|
||||
if (ttyfd < 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!isatty(ttyfd)) {
|
||||
/* Not a TTY: Can't guess the color */
|
||||
close(ttyfd);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!tty_init(ttyfd)) {
|
||||
return;
|
||||
}
|
||||
tty_raw(ttyfd);
|
||||
write(ttyfd, "\033]11;?\033\\", 8);
|
||||
|
||||
/* Wait up to 0.1s for terminal to respond */
|
||||
p.fd = ttyfd;
|
||||
p.events = POLLIN;
|
||||
if (poll(&p, 1, 100) < 0) {
|
||||
tty_reset(ttyfd);
|
||||
close(ttyfd);
|
||||
return;
|
||||
}
|
||||
if (!(p.revents & POLLIN)) {
|
||||
tty_reset(ttyfd);
|
||||
close(ttyfd);
|
||||
return;
|
||||
}
|
||||
n = read(ttyfd, buf, 127);
|
||||
if (n <= 0) {
|
||||
tty_reset(ttyfd);
|
||||
close(ttyfd);
|
||||
return;
|
||||
}
|
||||
tty_reset(ttyfd);
|
||||
buf[n+1] = 0;
|
||||
if (n < 25) {
|
||||
/* Too short */
|
||||
return;
|
||||
}
|
||||
if (sscanf(buf+5, "rgb:%x/%x/%x", &rr, &gg, &bb) != 3) {
|
||||
/* Couldn't scan color codes */
|
||||
return;
|
||||
}
|
||||
*r = (rr >> 8) & 255;
|
||||
*g = (gg >> 8) & 255;
|
||||
*b = (bb >> 8) & 255;
|
||||
}
|
||||
|
||||
static struct termios orig_termios;
|
||||
|
||||
static int
|
||||
tty_init(int fd)
|
||||
{
|
||||
if (tcgetattr(fd, &orig_termios) < 0) {
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void
|
||||
tty_raw(int fd)
|
||||
{
|
||||
struct termios raw;
|
||||
|
||||
raw = orig_termios;
|
||||
|
||||
raw.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
|
||||
raw.c_oflag &= ~(OPOST);
|
||||
raw.c_cflag |= (CS8);
|
||||
raw.c_lflag &= ~(ECHO | ICANON | IEXTEN | ISIG);
|
||||
|
||||
/* put terminal in raw mode after flushing */
|
||||
tcsetattr(fd,TCSAFLUSH,&raw);
|
||||
}
|
||||
|
||||
static void
|
||||
tty_reset(int fd)
|
||||
{
|
||||
tcsetattr(fd, TCSAFLUSH, &orig_termios);
|
||||
}
|
||||
|
||||
31
src/main.c
31
src/main.c
@@ -181,14 +181,14 @@ static void DoReminders(void)
|
||||
|
||||
if (FileAccessDate < 0) {
|
||||
fprintf(ErrFp, "%s: `%s': %s.\n", ErrMsg[E_CANTACCESS], InitialFile, strerror(errno));
|
||||
exit(1);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
r=IncludeFile(InitialFile);
|
||||
if (r) {
|
||||
fprintf(ErrFp, "%s %s: %s\n", ErrMsg[E_ERR_READING],
|
||||
InitialFile, ErrMsg[r]);
|
||||
exit(1);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
while(1) {
|
||||
@@ -196,7 +196,7 @@ static void DoReminders(void)
|
||||
if (r == E_EOF) return;
|
||||
if (r) {
|
||||
Eprint("%s: %s", ErrMsg[E_ERR_READING], ErrMsg[r]);
|
||||
exit(1);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
s = FindInitialToken(&tok, CurLine);
|
||||
|
||||
@@ -749,17 +749,30 @@ int PushToken(char const *tok, ParsePtr p)
|
||||
/***************************************************************/
|
||||
long SystemTime(int realtime)
|
||||
{
|
||||
time_t tloc;
|
||||
time_t now;
|
||||
struct tm *t;
|
||||
|
||||
if (!realtime && (SysTime != -1L)) return SysTime;
|
||||
|
||||
(void) time(&tloc);
|
||||
t = localtime(&tloc);
|
||||
now = time(NULL);
|
||||
t = localtime(&now);
|
||||
return (long) t->tm_hour * 3600L + (long) t->tm_min * 60L +
|
||||
(long) t->tm_sec;
|
||||
}
|
||||
|
||||
/***************************************************************/
|
||||
/* */
|
||||
/* MinutesPastMidnight */
|
||||
/* */
|
||||
/* Return the system time in minutes past midnight */
|
||||
/* */
|
||||
/***************************************************************/
|
||||
int MinutesPastMidnight(int realtime)
|
||||
{
|
||||
return (int) (SystemTime(realtime) / 60);
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************/
|
||||
/* */
|
||||
/* SystemDate */
|
||||
@@ -771,11 +784,11 @@ long SystemTime(int realtime)
|
||||
/***************************************************************/
|
||||
int SystemDate(int *y, int *m, int *d)
|
||||
{
|
||||
time_t tloc;
|
||||
time_t now;
|
||||
struct tm *t;
|
||||
|
||||
(void) time(&tloc);
|
||||
t = localtime(&tloc);
|
||||
now = time(NULL);
|
||||
t = localtime(&now);
|
||||
|
||||
*d = t->tm_mday;
|
||||
*m = t->tm_mon;
|
||||
|
||||
@@ -72,6 +72,7 @@ void CreateParser (char const *s, ParsePtr p);
|
||||
void DestroyParser (ParsePtr p);
|
||||
int PushToken (char const *tok, ParsePtr p);
|
||||
long SystemTime (int realtime);
|
||||
int MinutesPastMidnight (int realtime);
|
||||
int SystemDate (int *y, int *m, int *d);
|
||||
int DoIf (ParsePtr p);
|
||||
int DoElse (ParsePtr p);
|
||||
|
||||
71
src/queue.c
71
src/queue.c
@@ -27,6 +27,7 @@
|
||||
#include <sys/select.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include "types.h"
|
||||
#include "globals.h"
|
||||
@@ -79,7 +80,7 @@ int QueueReminder(ParsePtr p, Trigger *trig,
|
||||
trig->noqueue ||
|
||||
tim->ttime == NO_TIME ||
|
||||
trig->typ == CAL_TYPE ||
|
||||
tim->ttime < SystemTime(0) / 60 ||
|
||||
tim->ttime < MinutesPastMidnight(0) ||
|
||||
((trig->typ == RUN_TYPE) && RunDisabled)) return OK;
|
||||
|
||||
qelem = NEW(QueuedRem);
|
||||
@@ -110,6 +111,36 @@ int QueueReminder(ParsePtr p, Trigger *trig,
|
||||
return OK;
|
||||
}
|
||||
|
||||
static void
|
||||
maybe_close(int fd)
|
||||
{
|
||||
int new_fd;
|
||||
/* Don't close descriptors connected to a TTY, except for stdin */
|
||||
if (fd && isatty(fd)) return;
|
||||
|
||||
(void) close(fd);
|
||||
if (fd != STDIN_FILENO) {
|
||||
new_fd = open("/dev/null", O_WRONLY);
|
||||
} else {
|
||||
new_fd = open("/dev/null", O_RDONLY);
|
||||
}
|
||||
|
||||
/* If the open failed... well... not much we can do */
|
||||
if (new_fd < 0) return;
|
||||
|
||||
/* If we got back the same fd as what we just closed, aces! */
|
||||
if (fd == new_fd) return;
|
||||
|
||||
(void) dup2(new_fd, fd);
|
||||
(void) close(new_fd);
|
||||
}
|
||||
|
||||
void
|
||||
SigContHandler(int d)
|
||||
{
|
||||
UNUSED(d);
|
||||
}
|
||||
|
||||
/***************************************************************/
|
||||
/* */
|
||||
/* HandleQueuedReminders */
|
||||
@@ -143,9 +174,10 @@ void HandleQueuedReminders(void)
|
||||
* processed correctly are RUN commands, provided they mail
|
||||
* the result back or use their own resource (as a window).
|
||||
*/
|
||||
if (!DontFork && (!isatty(1) || !isatty(2))) {
|
||||
close(1);
|
||||
close(2);
|
||||
if (!DontFork) {
|
||||
maybe_close(STDIN_FILENO);
|
||||
maybe_close(STDOUT_FILENO);
|
||||
maybe_close(STDERR_FILENO);
|
||||
}
|
||||
|
||||
/* If we're a daemon, get the mod time of initial file */
|
||||
@@ -160,7 +192,7 @@ void HandleQueuedReminders(void)
|
||||
/* Initialize the queue - initialize all the entries time of issue */
|
||||
|
||||
while (q) {
|
||||
q->tt.nexttime = (int) (SystemTime(1)/60 - 1);
|
||||
q->tt.nexttime = MinutesPastMidnight(1) - 1;
|
||||
q->tt.nexttime = CalculateNextTime(q);
|
||||
q = q->next;
|
||||
}
|
||||
@@ -169,6 +201,8 @@ void HandleQueuedReminders(void)
|
||||
sa.sa_handler = SigIntHandler;
|
||||
sa.sa_flags = 0;
|
||||
(void) sigaction(SIGINT, &sa, NULL);
|
||||
sa.sa_handler = SigContHandler;
|
||||
(void) sigaction(SIGCONT, &sa, NULL);
|
||||
}
|
||||
|
||||
/* Sit in a loop, issuing reminders when necessary */
|
||||
@@ -222,7 +256,7 @@ void HandleQueuedReminders(void)
|
||||
if (!Daemon) {
|
||||
int y, m, d;
|
||||
if (RealToday != SystemDate(&y, &m, &d)) {
|
||||
exit(0);
|
||||
exit(EXIT_SUCCESS);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -244,10 +278,12 @@ void HandleQueuedReminders(void)
|
||||
/* Do NOT trigger the reminder if tt.nexttime is more than a
|
||||
minute in the past. This can happen if the clock is
|
||||
changed or a laptop awakes from hibernation.
|
||||
However, DO trigger if tt.nexttime == tt.ttime so all
|
||||
However, DO trigger if tt.nexttime == tt.ttime and we're
|
||||
within MaxLateTrigger minutes so all
|
||||
queued reminders are triggered at least once. */
|
||||
if ((SystemTime(1) - (q->tt.nexttime * 60) <= 60) ||
|
||||
(q->tt.nexttime == q->tt.ttime)) {
|
||||
(q->tt.nexttime == q->tt.ttime &&
|
||||
(MaxLateMinutes == 0 || SystemTime(1) - (q->tt.nexttime * 60) <= 60 * MaxLateMinutes))) {
|
||||
/* Trigger the reminder */
|
||||
CreateParser(q->text, &p);
|
||||
trig.typ = q->typ;
|
||||
@@ -256,7 +292,7 @@ void HandleQueuedReminders(void)
|
||||
if (Daemon < 0) {
|
||||
printf("NOTE reminder %s",
|
||||
SimpleTime(q->tt.ttime));
|
||||
printf("%s", SimpleTime(SystemTime(1)/60));
|
||||
printf("%s", SimpleTime(MinutesPastMidnight(1)));
|
||||
if (!*DBufValue(&q->tags)) {
|
||||
printf("*\n");
|
||||
} else {
|
||||
@@ -277,8 +313,17 @@ void HandleQueuedReminders(void)
|
||||
|
||||
/* Calculate the next trigger time */
|
||||
q->tt.nexttime = CalculateNextTime(q);
|
||||
|
||||
/* If trigger time is way in the past because computer has been
|
||||
suspended or hibernated, remove from queue */
|
||||
if (q->tt.nexttime != NO_TIME) {
|
||||
if (q->tt.ttime < MinutesPastMidnight(1) - MaxLateMinutes &&
|
||||
q->tt.nexttime < MinutesPastMidnight(1) - MaxLateMinutes) {
|
||||
q->tt.nexttime = NO_TIME;
|
||||
}
|
||||
}
|
||||
}
|
||||
exit(0);
|
||||
exit(EXIT_SUCCESS);
|
||||
}
|
||||
|
||||
|
||||
@@ -566,16 +611,16 @@ static void DaemonWait(struct timeval *sleep_tv)
|
||||
|
||||
/* If EOF on stdin, exit */
|
||||
if (feof(stdin)) {
|
||||
exit(0);
|
||||
exit(EXIT_SUCCESS);
|
||||
}
|
||||
|
||||
/* Read a line from stdin and interpret it */
|
||||
if (!fgets(cmdLine, sizeof(cmdLine), stdin)) {
|
||||
exit(0);
|
||||
exit(EXIT_SUCCESS);
|
||||
}
|
||||
|
||||
if (!strcmp(cmdLine, "EXIT\n")) {
|
||||
exit(0);
|
||||
exit(EXIT_SUCCESS);
|
||||
} else if (!strcmp(cmdLine, "STATUS\n")) {
|
||||
int nqueued = 0;
|
||||
QueuedRem *q = QueueHead;
|
||||
|
||||
24
src/rem2ps.c
24
src/rem2ps.c
@@ -186,19 +186,19 @@ JSONToCalEntry(DynamicBuffer *buf)
|
||||
val = json_parse(DBufValue(buf), DBufLen(buf));
|
||||
if (!val) {
|
||||
fprintf(stderr, "Unable to parse JSON line `%s'\n", DBufValue(buf));
|
||||
exit(1);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (val->type != json_object) {
|
||||
fprintf(stderr, "Expecting JSON object; found `%s'\n",
|
||||
DBufValue(buf));
|
||||
exit(1);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
c = NEW(CalEntry);
|
||||
if (!c) {
|
||||
fprintf(stderr, "malloc failed - aborting.\n");
|
||||
exit(1);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
c->next = NULL;
|
||||
c->special = SPECIAL_NORMAL;
|
||||
@@ -221,7 +221,7 @@ JSONToCalEntry(DynamicBuffer *buf)
|
||||
c->entry = malloc(strlen(s)+1);
|
||||
if (!c->entry) {
|
||||
fprintf(stderr, "malloc failed - aborting.\n");
|
||||
exit(1);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
strcpy(c->entry, s);
|
||||
got_body = 1;
|
||||
@@ -253,7 +253,7 @@ JSONToCalEntry(DynamicBuffer *buf)
|
||||
|
||||
if (!got_body || !got_date) {
|
||||
fprintf(stderr, "Could not parse line `%s'\n", DBufValue(buf));
|
||||
exit(1);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
return c;
|
||||
}
|
||||
@@ -272,7 +272,7 @@ TextToCalEntry(DynamicBuffer *buf)
|
||||
CalEntry *c = NEW(CalEntry);
|
||||
if (!c) {
|
||||
fprintf(stderr, "malloc failed - aborting.\n");
|
||||
exit(1);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
c->next = NULL;
|
||||
c->special = SPECIAL_NORMAL;
|
||||
@@ -296,7 +296,7 @@ TextToCalEntry(DynamicBuffer *buf)
|
||||
c->entry = malloc(strlen(startOfBody) + 1);
|
||||
if (!c->entry) {
|
||||
fprintf(stderr, "malloc failed - aborting.\n");
|
||||
exit(1);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
strcpy(c->entry, startOfBody);
|
||||
|
||||
@@ -343,7 +343,7 @@ int main(int argc, char *argv[])
|
||||
DBufGets(&buf, stdin);
|
||||
if (first_line && (!strcmp(DBufValue(&buf), "["))) {
|
||||
fprintf(stderr, "Rem2PS: It appears that you have invoked Remind with the -ppp option.\n Please use either -p or -pp, but not -ppp.\n");
|
||||
exit(1);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
first_line = 0;
|
||||
if (!strcmp(DBufValue(&buf), PSBEGIN) ||
|
||||
@@ -361,7 +361,7 @@ int main(int argc, char *argv[])
|
||||
if (!validfile) {
|
||||
fprintf(stderr, "Rem2PS: Couldn't find any calendar data - are you\n");
|
||||
fprintf(stderr, " sure you fed me input produced by remind -p ...?\n");
|
||||
exit(1);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
printf("%%%%Trailer\n");
|
||||
printf("%%%%Pages: %d\n", validfile);
|
||||
@@ -486,7 +486,7 @@ void DoPsCal(void)
|
||||
while(1) {
|
||||
if (feof(stdin)) {
|
||||
fprintf(stderr, "Input from REMIND is corrupt!\n");
|
||||
exit(1);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
DBufGets(&buf, stdin);
|
||||
@@ -952,7 +952,7 @@ void Init(int argc, char *argv[])
|
||||
fprintf(stderr, " WxHin Specify size in inches (W and H are decimal numbers)\n");
|
||||
fprintf(stderr, " WxHcm Specify size in centimetres (W and H are decimal numbers)\n");
|
||||
fprintf(stderr, "Default media type is %s\n", DefaultPage[0].name);
|
||||
exit(1);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -1033,7 +1033,7 @@ void Usage(char const *s)
|
||||
fprintf(stderr, "-e Make calendar fill entire page\n");
|
||||
fprintf(stderr, "-x Put day numbers on left instead of right\n");
|
||||
fprintf(stderr, "-o[lrtb] marg Specify left, right, top and bottom margins\n");
|
||||
exit(1);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
/***************************************************************/
|
||||
|
||||
@@ -825,6 +825,7 @@ static SysVar SysVarArr[] = {
|
||||
{"LongMin", 1, SPECIAL_TYPE, longmin_func, 0, 0 },
|
||||
{"LongSec", 1, SPECIAL_TYPE, longsec_func, 0, 0 },
|
||||
{"March", 1, STR_TYPE, &DynamicMonthName[2], 0, 0 },
|
||||
{"MaxLateMinutes", 1, INT_TYPE, &MaxLateMinutes, 0, 1440 },
|
||||
{"MaxSatIter", 1, INT_TYPE, &MaxSatIter, 10, ANY },
|
||||
{"MaxStringLen", 1, INT_TYPE, &MaxStringLen, -1, ANY },
|
||||
{"May", 1, STR_TYPE, &DynamicMonthName[4], 0, 0 },
|
||||
|
||||
@@ -437,6 +437,9 @@ rm -rf include_dir/ww
|
||||
# This segfaulted in 04.02.03
|
||||
../src/remind -h '-imsgprefix(x)="foo"' /dev/null >> ../tests/test.out 2>&1
|
||||
|
||||
# Test --version long option
|
||||
../src/remind --version >> ../tests/test.out 2>&1
|
||||
|
||||
# Remove references to SysInclude, which is build-specific
|
||||
grep -F -v '$SysInclude' < ../tests/test.out > ../tests/test.out.1 && mv -f ../tests/test.out.1 ../tests/test.out
|
||||
cmp -s ../tests/test.out ../tests/test.cmp
|
||||
|
||||
@@ -1060,7 +1060,7 @@ set a057 value("a05"+"6")
|
||||
"a05" + "6" => "a056"
|
||||
value("a056") => "SDFJHSDF KSJDFH KJSDFH KSJDFH"
|
||||
set a058 version()
|
||||
version() => "04.02.06"
|
||||
version() => "04.02.08"
|
||||
set a059 wkday(today())
|
||||
today() => 1991-02-16
|
||||
wkday(1991-02-16) => "Saturday"
|
||||
@@ -2644,7 +2644,7 @@ a086 4
|
||||
a109 2012-01-01
|
||||
a128 2018-02-03@16:45
|
||||
a039 "February"
|
||||
a058 "04.02.06"
|
||||
a058 "04.02.08"
|
||||
a077 "1992 92\n"
|
||||
a096 -4
|
||||
a119 -1
|
||||
@@ -2789,6 +2789,7 @@ Variable Value
|
||||
$LongMin 15
|
||||
$LongSec 0
|
||||
$March "March"
|
||||
$MaxLateMinutes 0 [0, 1440]
|
||||
$MaxSatIter 150 [10, Inf)
|
||||
$MaxStringLen 65535 [-1, Inf)
|
||||
$May "May"
|
||||
@@ -11695,3 +11696,4 @@ Can't open file: include_dir/ww
|
||||
Error reading include_dir/ww: Can't open file
|
||||
SECURITY: Won't read world-writable file or directory!
|
||||
Error reading include_dir/ww: No files matching *.rem
|
||||
04.02.08
|
||||
|
||||
Reference in New Issue
Block a user