Compare commits

...

17 Commits

Author SHA1 Message Date
Dianne Skoll
d59fe832fd Update version number. 2025-10-27 10:24:11 -04:00
Dianne Skoll
88ebdf275e Avoid test failure. 2025-10-27 10:23:38 -04:00
Dianne Skoll
a7a6f8b5f0 Prep for 06.01.08 release. 2025-10-27 10:22:29 -04:00
Dianne Skoll
3e248c069e Change button color. 2025-10-26 16:46:14 -04:00
Dianne Skoll
65cca1fd8f Remove useless test. 2025-10-25 12:45:59 -04:00
Dianne Skoll
5a889043ba Remove misleading wording. 2025-10-25 12:42:58 -04:00
Dianne Skoll
6d1fcdf246 Change button color. 2025-10-25 11:04:52 -04:00
Dianne Skoll
3476b965ef Add "Show Command" option to Print dialog. 2025-10-24 16:31:27 -04:00
Dianne Skoll
0bba2dc3b3 Fix modal file browser. 2025-10-24 10:27:48 -04:00
Dianne Skoll
e5c27f19f5 Handle window raising better. 2025-10-24 08:52:59 -04:00
Dianne Skoll
f9aa53433e Raise .edit on button press. 2025-10-24 08:51:06 -04:00
Dianne Skoll
5323245529 Use wm protocol WM_DELETE_WINDOW on the .edit modal as well. 2025-10-24 08:49:14 -04:00
Dianne Skoll
deb12ac7cd Fix all modal dialogs. 2025-10-24 08:12:20 -04:00
Dianne Skoll
a1488d93ad Finally fix all the race conditions. 2025-10-23 22:00:06 -04:00
Dianne Skoll
65add3d32e Reset EditingReminder to 0 if edit window is destroyed. 2025-10-23 21:23:39 -04:00
Dianne Skoll
8d6f5efa7b Fix race conditions seen on slow computers if you double-click a day number or tagged reminder. 2025-10-23 17:54:40 -04:00
Dianne Skoll
eb996a8146 Avoid error if you click too fast on a tagged reminder. 2025-10-23 17:12:18 -04:00
8 changed files with 163 additions and 44 deletions

18
configure vendored
View File

@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.72 for remind 06.01.07.
# Generated by GNU Autoconf 2.72 for remind 06.01.08.
#
#
# Copyright (C) 1992-1996, 1998-2017, 2020-2023 Free Software Foundation,
@@ -601,8 +601,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='remind'
PACKAGE_TARNAME='remind'
PACKAGE_VERSION='06.01.07'
PACKAGE_STRING='remind 06.01.07'
PACKAGE_VERSION='06.01.08'
PACKAGE_STRING='remind 06.01.08'
PACKAGE_BUGREPORT=''
PACKAGE_URL='https://dianne.skoll.ca/projects/remind/'
@@ -1258,7 +1258,7 @@ if test "$ac_init_help" = "long"; then
# 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 remind 06.01.07 to adapt to many kinds of systems.
'configure' configures remind 06.01.08 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1320,7 +1320,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
short | recursive ) echo "Configuration of remind 06.01.07:";;
short | recursive ) echo "Configuration of remind 06.01.08:";;
esac
cat <<\_ACEOF
@@ -1408,7 +1408,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
remind configure 06.01.07
remind configure 06.01.08
generated by GNU Autoconf 2.72
Copyright (C) 2023 Free Software Foundation, Inc.
@@ -1871,7 +1871,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
It was created by remind $as_me 06.01.07, which was
It was created by remind $as_me 06.01.08, which was
generated by GNU Autoconf 2.72. Invocation command line was
$ $0$ac_configure_args_raw
@@ -4895,7 +4895,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
This file was extended by remind $as_me 06.01.07, which was
This file was extended by remind $as_me 06.01.08, which was
generated by GNU Autoconf 2.72. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -4960,7 +4960,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config='$ac_cs_config_escaped'
ac_cs_version="\\
remind config.status 06.01.07
remind config.status 06.01.08
configured by $0, generated by GNU Autoconf 2.72,
with options \\"\$ac_cs_config\\"

View File

@@ -1,6 +1,6 @@
dnl Process this file with autoconf to produce a configure script.
AC_INIT(remind, 06.01.07, , , https://dianne.skoll.ca/projects/remind/)
AC_INIT(remind, 06.01.08, , , https://dianne.skoll.ca/projects/remind/)
AC_CONFIG_SRCDIR([src/queue.c])
cat <<'EOF'

View File

@@ -1,5 +1,18 @@
CHANGES TO REMIND
* VERSION 06.01.08 - 2025-10-27
- BUG FIXES: tkremind: Fix many bugs with modal dialogs: Clicking too fast
to launch them could cause error messages; closing them with the window
manager "close" button rather than "Cancel" could cause errors. Thanks
to Tug Williams for finding these bugs.
- MINOR NEW FEATURE: tkremind: The "Print" dialog has a "Show Command"
button that lets you cut-and-paste the command tkremind would have used
for printing. You can then customize it as you like.
- MINOR FIXES: remind: A few silly errors in the man page were fixed.
* VERSION 06.01.07 - 2025-10-23
- IMPROVEMENT: tkremind: Add a "help" button that pops up the TkRemind man

View File

@@ -5313,8 +5313,7 @@ expressions are evaluated only once, not recursively. Thus, writing:
.fi
.PP
causes \fBRemind\fR to read the token "[a+b]". It does not interpret
this as a pasted-in expression. In fact, the only way to get a literal
left-bracket into a reminder is to use ["["].
this as a pasted-in expression.
.PP
You can use expression pasting almost anywhere. However, there are a few
exceptions:
@@ -5601,8 +5600,6 @@ following example:
# FSET -f(x) 2*x
.fi
.PP
to define a function and suppress any "redefined function" warning.
.PP
.SH SAVING AND RESTORING FUNCTIONS
.PP
Occasionally, it is useful to redefine a function for a specific block of

View File

@@ -168,6 +168,12 @@ that during printing, \fBRemind\fR is called with the
option. If you are producing PDF output, then the option \fB-itkpdf=1\fR
is also supplied to \fBRemind\fR.
If you click on \fBShow Command\fR rather than \fBPrint\fR, then
\fBTkRemind\fR won't actually print anything. Instead, it will pop
up a text window with the command that it \fIwould have used\fR to print
the calendar. You can cut-and-paste the command into a shell prompt and
adjust as needed if you want to use any \fBrem2pdf\fR or \fBrem2ps\fR
options that are not directly supported by \fBTkRemind\fR.
.SH EDITING REMINDERS

View File

@@ -252,6 +252,8 @@ set Rem2PDF "rem2pdf"
# Check if we have Rem2PDF
set HaveRem2PDF 0
set InModalDialog 0
set a [exec sh -c "$Rem2PDF < /dev/null 2>&1 || true"]
if {[string match "rem2pdf:*" "$a"]} {
@@ -1411,11 +1413,25 @@ proc Status { stuff } {
# None
#---------------------------------------------------------------------------
proc DoPrint {} {
global InModalDialog
if { $InModalDialog } {
return 0
}
set InModalDialog 1
catch { DoPrintHelper } err more
puts $err
puts $more
set InModalDialog 0
}
proc DoPrintHelper {} {
global Rem2PS Rem2PDF HaveRem2PDF PSCmd Option PrintStatus RemindErrors
global CurMonth CurYear MonthNames
catch {destroy .p}
toplevel .p
bind .p <ButtonPress-1> [list raise .p]
wm title .p "TkRemind Print..."
wm iconname .p "Print..."
frame .p.f1 -relief sunken -bd 2
@@ -1462,8 +1478,10 @@ proc DoPrint {} {
checkbutton .p.calendars -text "Print small calendars" -variable Option(PrintSmallCalendars)
button .p.print -text "Print" -command {set PrintStatus print}
button .p.showcmd -text "Show Command" -command { set PrintStatus showcmd }
button .p.cancel -text "Cancel" -command {set PrintStatus cancel}
wm protocol .p WM_DELETE_WINDOW { .p.cancel flash; .p.cancel invoke }
if {$HaveRem2PDF} {
pack .p.f1 .p.ff .p.f2 .p.f2a .p.f3 .p.f3a \
-side top -fill both -expand 1 -anchor w
@@ -1485,7 +1503,7 @@ proc DoPrint {} {
pack .p.size .p.letter .p.a4 -in .p.f2 -side top -fill none -expand 0 -anchor w
pack .p.margin .p.24pt .p.36pt .p.48pt -in .p.f2a -side top -anchor w -fill none -expand 0
pack .p.orient .p.landscape .p.portrait -in .p.f3 -side top -fill none -expand 0 -anchor w
pack .p.print .p.cancel -in .p.f4 -side left -fill none -expand 0
pack .p.print .p.showcmd .p.cancel -in .p.f4 -side left -fill none -expand 0
bind .p <KeyPress-Escape> ".p.cancel flash; .p.cancel invoke"
bind .p <KeyPress-Return> ".p.print flash; .p.print invoke"
@@ -1600,12 +1618,34 @@ proc DoPrint {} {
}
append cmd " $fname"
Status "Printing..."
if {[catch {exec /bin/sh "-c" $cmd} err]} {
set RemindErrors [unique_lines $err]
set_button_to_errors
if {$PrintStatus == "showcmd"} {
puts "SHOWING COMMAND"
catch { destroy .pc }
toplevel .pc -background $Option(WinBackground)
text .pc.t -width 80 -height 10 -font TkFixedFont -foreground $Option(TextColor) -background $Option(BackgroundColor) -yscrollcommand ".pc.sb set" -wrap word
scrollbar .pc.sb -orient vertical -command ".pc.t yview"
button .pc.ok -text "OK" -command "destroy .pc" -foreground $Option(LabelColor) -background $Option(BackgroundColor) -highlightthickness 1 -highlightcolor $Option(LineColor) -highlightbackground $Option(WinBackground)
grid .pc.t -row 0 -column 0 -sticky nsew
grid .pc.sb -row 0 -column 1 -sticky ns
grid .pc.ok -row 1 -column 0 -sticky w
grid columnconfigure .pc 0 -weight 1
grid columnconfigure .pc 1 -weight 0
grid rowconfigure .pc 0 -weight 1
grid rowconfigure .pc 1 -weight 0
CenterWindow .pc .
.pc.t insert end "Command for printing calendar follows; cut-and-paste and adjust as needed:\n\n"
.pc.t insert end $cmd
.pc.t configure -state disabled
wm deiconify .pc
puts "DONE SHOWING COMMAND"
} else {
Status "Printing..."
if {[catch {exec /bin/sh "-c" $cmd} err]} {
set RemindErrors [unique_lines $err]
set_button_to_errors
}
DisplayTime
}
DisplayTime
}
#---------------------------------------------------------------------------
@@ -1613,7 +1653,14 @@ proc DoPrint {} {
# Arguments: none
#---------------------------------------------------------------------------
proc PrintFileBrowse {} {
set ans [BrowseForFile .filebrowse "Print to file..." "Ok" 0 "*.ps"]
global Option
if { $Option(PrintFormat) == "pdf" } {
set pattern "*.pdf"
} else {
set pattern "*.ps"
}
set ans [BrowseForFile .filebrowse "Print to file..." "Ok" 0 $pattern]
if {$ans != ""} {
.p.filename delete 0 end
.p.filename insert end $ans
@@ -1750,6 +1797,14 @@ proc complete_through_today { w } {
#---------------------------------------------------------------------------
proc CreateModifyDialog {w day firstDay args} {
bind $w <Destroy> {
global InModalDialog ModifyDialogResult
set InModalDialog 0
set ModifyDialogResult -2
}
wm protocol $w WM_DELETE_WINDOW { .mod.but1 flash; .mod.but1 invoke }
# Set up: Year, Month, Day, WeekdayName
global CurYear CurMonth EnglishDayNames MonthNames OptionType SkipType
global ModifyDialogResult TwentyFourHourMode DateOfEventBeingEdited
@@ -2219,7 +2274,17 @@ proc CreateYearMenu {w {every 1}} {
# d -- which day to modify
# firstDay -- first weekday in month (0-6)
#---------------------------------------------------------------------------
proc ModifyDay {d firstDay} {
proc ModifyDay { d firstDay} {
global InModalDialog
if { $InModalDialog } {
return
}
set InModalDialog 1
catch { ModifyDayHelper $d $firstDay }
set InModalDialog 0
}
proc ModifyDayHelper {d firstDay} {
global ModifyDialogResult AppendFile HighestTagSoFar
catch {destroy .mod}
toplevel .mod
@@ -2229,15 +2294,18 @@ proc ModifyDay {d firstDay} {
tkwait visibility .mod
set oldFocus [focus]
toggle_complete_through .mod
bind .mod <ButtonPress-1> [list raise .mod]
while {1} {
grab .mod
raise .mod
focus .mod.entry
catch {
grab .mod
raise .mod
focus .mod.entry
}
set ModifyDialogResult -1
tkwait variable ModifyDialogResult
if {$ModifyDialogResult == 1} {
if {$ModifyDialogResult == 1 || $ModifyDialogResult == -2 || ![winfo exists .mod]} {
catch {focus $oldFocus}
destroy .mod
catch { destroy .mod }
return 0
}
set problem [catch {set rem [CreateReminder .mod]} err]
@@ -2247,9 +2315,10 @@ proc ModifyDay {d firstDay} {
} else {
if {$ModifyDialogResult == 3} {
set rem [EditReminder $rem Cancel "Add reminder"]
if {$ModifyDialogResult == 1} {
if {$ModifyDialogResult == 1 || $ModifyDialogResult == -2} {
continue
}
set ModifyDialogResult 2
}
set opts [RemindDialogToOptions .mod]
catch {focus $oldFocus}
@@ -2616,6 +2685,10 @@ proc EditReminder {rem args} {
text .edit.t -width 80 -height 5 -relief sunken
.edit.t insert end $rem
frame .edit.f
bind .edit <Destroy> {
global ModifyDialogResult
set ModifyDialogResult -2
}
set n 0
foreach but $args {
incr n
@@ -2625,16 +2698,28 @@ proc EditReminder {rem args} {
pack .edit.t -side top -fill both -expand 1
pack .edit.f -side top -fill x -expand 1
bind .edit <KeyPress-Escape> ".edit.but1 flash; .edit.but1 invoke"
wm protocol .edit WM_DELETE_WINDOW { .edit.but1 flash; .edit.but1 invoke }
set ModifyDialogResult 0
CenterWindow .edit .
bind .edit <ButtonPress-1> {
catch { raise .mod }
raise .edit
}
tkwait visibility .edit
set oldFocus [focus]
focus .edit.t
grab .edit
tkwait variable ModifyDialogResult
catch {focus $oldFocus}
if {$ModifyDialogResult == -2 || ![winfo exists .edit]} {
catch {destroy .edit}
return ""
}
set rem [.edit.t get 1.0 end]
catch {destroy .edit}
catch {
bind .edit <Destroy> ""
destroy .edit
}
return $rem
}
@@ -2725,6 +2810,7 @@ proc BrowseForFile {w title {oktext "OK"} {showdots 0} {filter "*"}} {
# Fill in the box and wait for status to change
BrowseForFileRead $w [pwd]
bind $w <ButtonPress-1> "catch { raise .p } ; raise $w"
bind $w <KeyPress-Escape> "$w.cancel flash; $w.cancel invoke"
bind $w.list <Button-1> "$w.entry delete 0 end; $w.entry insert 0 \[selection get\]"
bind $w.list <Double-Button-1> "$w.ok flash; $w.ok invoke"
@@ -2735,6 +2821,7 @@ proc BrowseForFile {w title {oktext "OK"} {showdots 0} {filter "*"}} {
bind $w.entry <KeyPress-space> "ExpandFile $w"
bindtags $w.entry "Entry $w.entry $w all"
wm protocol $w WM_DELETE_WINDOW "$w.cancel flash; $w.cancel invoke"
bindtags $w.list "Listbox $w.list $w all"
CenterWindow $w .
set oldFocus [focus]
@@ -2930,7 +3017,7 @@ proc ShowQueue { queue } {
wm iconname $w "Queue Dbg"
text $w.t -fg black -bg white -width 80 -height 30 -wrap word -yscrollcommand "$w.sb set" -foreground $Option(TextColor) -background $Option(BackgroundColor) -font CalBoxFont
scrollbar $w.sb -orient vertical -command "$w.text yview"
button $w.ok -text "OK" -command "destroy $w" -foreground $Option(TextColor) -background $Option(BackgroundColor) -highlightthickness 1 -highlightcolor $Option(LineColor) -highlightbackground $Option(WinBackground)
button $w.ok -text "OK" -command "destroy $w" -foreground $Option(LabelColor) -background $Option(BackgroundColor) -highlightthickness 1 -highlightcolor $Option(LineColor) -highlightbackground $Option(WinBackground)
grid $w.t -row 0 -column 0 -sticky nsew
grid $w.sb -row 0 -column 1 -sticky ns
grid $w.ok -row 1 -column 0 -sticky w
@@ -3887,6 +3974,16 @@ proc details_popup { pairs } {
# Opens a dialog box to edit the current editable reminder
#***********************************************************************
proc EditTaggedReminder { w } {
global InModalDialog
if { $InModalDialog } {
return
}
set InModalDialog 1
catch { EditTaggedReminderHelper $w }
set InModalDialog 0
}
proc EditTaggedReminderHelper { w } {
global ModifyDialogResult
set tag [GetCurrentReminder $w]
if {$tag == ""} {
@@ -3905,6 +4002,7 @@ proc EditTaggedReminder { w } {
return
}
catch {destroy .mod}
toplevel .mod
CreateModifyDialog .mod 1 0 "Cancel" "Replace reminder" "Delete reminder" "Preview reminder"
wm title .mod "TkRemind Edit Reminder..."
@@ -3913,15 +4011,18 @@ proc EditTaggedReminder { w } {
toggle_complete_through .mod
tkwait visibility .mod
set oldFocus [focus]
bind .mod <ButtonPress-1> [list raise .mod]
while {1} {
raise .mod
grab .mod
focus .mod.entry
catch {
grab .mod
raise .mod
focus .mod.entry
}
set ModifyDialogResult -1
tkwait variable ModifyDialogResult
if {$ModifyDialogResult == 1} {
if {$ModifyDialogResult == 1 || $ModifyDialogResult == -2 || ![winfo exists .mod]} {
catch {focus $oldFocus}
destroy .mod
catch { destroy .mod }
return 0
}
set problem [catch {set rem [CreateReminder .mod]} err]
@@ -3931,13 +4032,13 @@ proc EditTaggedReminder { w } {
}
if {$ModifyDialogResult == 4} {
set rem [EditReminder $rem "Cancel" "Replace reminder"]
if {$ModifyDialogResult == 1} {
if {$ModifyDialogResult == 1 || $ModifyDialogResult == -2} {
continue
}
set ModifyDialogResult 2
}
set opts [RemindDialogToOptions .mod]
catch {focus $oldFocus}
destroy .mod
set problem [catch {
if {$ModifyDialogResult == 2} {
ReplaceTaggedReminder $tag $rem $opts
@@ -3945,6 +4046,7 @@ proc EditTaggedReminder { w } {
DeleteTaggedReminder $tag
}
} err]
catch { destroy .mod }
if {$problem} {
show_error $err
return 1
@@ -4368,7 +4470,7 @@ proc ShowTodaysReminders { force date } {
wm iconname $w "Reminders"
text $w.text -width 80 -height 20 -wrap word -yscrollcommand "$w.sb set" -foreground $Option(TextColor) -background $Option(BackgroundColor) -font CalboxFont -spacing1 3
scrollbar $w.sb -orient vertical -command "$w.text yview"
button $w.ok -text "OK" -command "destroy $w" -foreground $Option(TextColor) -background $Option(BackgroundColor) -highlightthickness 1 -highlightcolor $Option(LineColor) -highlightbackground $Option(WinBackground)
button $w.ok -text "OK" -command "destroy $w" -foreground $Option(LabelColor) -background $Option(BackgroundColor) -highlightthickness 1 -highlightcolor $Option(LineColor) -highlightbackground $Option(WinBackground)
grid $w.text -row 0 -column 0 -sticky nsew
grid $w.sb -row 0 -column 1 -sticky ns
@@ -4900,7 +5002,7 @@ proc ShowManPage { cmd jump destroy } {
$w.t tag configure underline -underlinefg $link_color
}
scrollbar $w.sb -orient vertical -command "$w.t yview"
button $w.ok -text OK -command [list destroy $w] -foreground $Option(TextColor) -background $Option(BackgroundColor) -highlightthickness 1 -highlightcolor $Option(LineColor) -highlightbackground $Option(WinBackground)
button $w.ok -text OK -command [list destroy $w] -foreground $Option(LabelColor) -background $Option(BackgroundColor) -highlightthickness 1 -highlightcolor $Option(LineColor) -highlightbackground $Option(WinBackground)
grid $w.t -row 0 -column 0 -sticky nsew
grid $w.sb -row 0 -column 1 -sticky ns
grid $w.ok -row 1 -column 0 -stick w

View File

@@ -526,6 +526,7 @@ dev
devel
dfs
dh
dialogs
difftime
doesn
dosubst

View File

@@ -1046,7 +1046,7 @@ set a057 value("a05"+"6")
"a05" + "6" => "a056"
value("a056") => "SDFJHSDF KSJDFH KJSDFH KSJDFH"
set a058 version()
version() => "06.01.07"
version() => "06.01.08"
set a059 wkday(today())
today() => 1991-02-16
wkday(1991-02-16) => "Saturday"
@@ -2609,7 +2609,7 @@ a056 "SDFJHSDF KSJDFH KJSDFH KSJDFH"
a007 "1991-02-16"
a057 "SDFJHSDF KSJDFH KJSDFH KSJDFH"
a008 "11:44"
a058 "06.01.07"
a058 "06.01.08"
a059 "Saturday"
a010 12
a060 6
@@ -5562,8 +5562,8 @@ REM SATISFY ""
REM SATISFY [version() > "01.00.00"]
../tests/test.rem(1074): SATISFY: expression has no reference to trigdate() or $T...
../tests/test.rem(1074): Trig = Saturday, 16 February, 1991
version() => "06.01.07"
"06.01.07" > "01.00.00" => 1
version() => "06.01.08"
"06.01.08" > "01.00.00" => 1
../tests/test.rem(1074): Trig(satisfied) = Saturday, 16 February, 1991
REM SATISFY [max(x, max(x, 1, 2, 3), 4, 5, 6) * 5]
../tests/test.rem(1075): SATISFY: expression has no reference to trigdate() or $T...
@@ -23707,7 +23707,7 @@ SECURITY: Won't read world-writable file or directory!
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
06.01.07
06.01.08
Enabling test mode: This is meant for the acceptance test.
Do not use --test in production.
In test mode, the system time is fixed at 2025-01-06@19:00