Browse Source

punk::console 0.1.8: fix 8 bugs found during -console migration audit

- disableAnsi was defined as a duplicate enableAnsi in the windows
  no-twapi branch, leaving disableAnsi undefined there
- get_size_using_cursormove flushed stdout instead of the supplied
  output channel
- get_size_using_chanconfigure: removed unreachable code after its
  unconditional error
- cell_size: query path now passes its -console spec to get_size
  instead of always querying the default console; bad-format error
  message named punk::sixel instead of punk::console
- test_string_cursor: undefined $test_string reference in the no-ansi
  path; rowoffset/columnoffset return labels were swapped
- ansi::move_emit vt52 branch called nonexistent punk::ansi::v52move_emit
  (now vt52move_emit)
- move_emit_return re-expanded {*}$args inside its per-triple loop,
  duplicating emissions when extra row/col/data triples were supplied
- dec_has_mode unknown-mode error message named dec_get_mode

Console module test suites pass (27/27, Tcl 9.0.3).

Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
master
Julian Noble 2 weeks ago
parent
commit
b7fe87c2bb
  1. 35
      src/modules/punk/console-999999.0a1.0.tm
  2. 3
      src/modules/punk/console-buildversion.txt

35
src/modules/punk/console-999999.0a1.0.tm

@ -1522,7 +1522,7 @@ namespace eval punk::console {
set pixeldict [punk::console::get_xterm_pixels $terminal] set pixeldict [punk::console::get_xterm_pixels $terminal]
lassign $pixeldict _w sw _h sh lassign $pixeldict _w sw _h sh
if {[string is integer -strict $sw] && [string is integer -strict $sh]} { if {[string is integer -strict $sw] && [string is integer -strict $sh]} {
lassign [punk::console::get_size] _cols columns _rows rows lassign [punk::console::get_size $terminal] _cols columns _rows rows
#review - is returned size in pixels always a multiple of rows and cols? #review - is returned size in pixels always a multiple of rows and cols?
set w [expr {$sw / $columns}] set w [expr {$sw / $columns}]
set h [expr {$sh / $rows}] set h [expr {$sh / $rows}]
@ -1539,7 +1539,7 @@ namespace eval punk::console {
#newsize supplied - try to set #newsize supplied - try to set
lassign [split [string tolower $newsize] x] w h lassign [split [string tolower $newsize] x] w h
if {![string is integer -strict $w] || ![string is integer -strict $h] || $w < 1 || $h < 1} { if {![string is integer -strict $w] || ![string is integer -strict $h] || $w < 1 || $h < 1} {
error "punk::sixel::cell_size error - expected format WxH where W and H are positive integers - got '$newsize'" error "punk::console::cell_size error - expected format WxH where W and H are positive integers - got '$newsize'"
} }
set cell_size ${w}x${h} set cell_size ${w}x${h}
} }
@ -2015,21 +2015,6 @@ namespace eval punk::console {
} }
} }
error "chan configure method of getting console size not supported or failed to get valid size info" error "chan configure method of getting console size not supported or failed to get valid size info"
#we don't need to care about the input channel if chan configure on the output can give us the info.
#short circuit ansi cursor movement method if chan configure supports the -winsize value
set outconf [chan configure $out]
if {[dict exists $outconf -winsize]} {
#this mechanism is much faster than ansi cursor movements
#REVIEW check if any x-platform anomalies with this method?
#can -winsize key exist but contain erroneous info? We will check that we get 2 ints at least
lassign [dict get $outconf -winsize] cols lines
if {[string is integer -strict $cols] && [string is integer -strict $lines]} {
return [dict create columns $cols rows $lines]
}
#continue on to ansi mechanism if we didn't get 2 ints
}
} }
proc get_size_using_tput {{inoutchannels {stdin stdout}}} { proc get_size_using_tput {{inoutchannels {stdin stdout}}} {
@ -2059,7 +2044,7 @@ namespace eval punk::console {
#This issue also occurs when switching back from the alternate screen buffer - so perhaps that needs to be addressed elsewhere. #This issue also occurs when switching back from the alternate screen buffer - so perhaps that needs to be addressed elsewhere.
puts -nonewline $out [punk::ansi::cursor_off][punk::ansi::move 2000 2000] puts -nonewline $out [punk::ansi::cursor_off][punk::ansi::move 2000 2000]
lassign [get_cursor_pos_list $inoutchannels] lines cols lassign [get_cursor_pos_list $inoutchannels] lines cols
puts -nonewline $out [punk::ansi::move $start_row $start_col][punk::ansi::cursor_on];flush stdout puts -nonewline $out [punk::ansi::move $start_row $start_col][punk::ansi::cursor_on];flush $out
set result [dict create columns $cols rows $lines] set result [dict create columns $cols rows $lines]
} errM]} { } errM]} {
puts -nonewline $out [punk::ansi::move $start_row $start_col] puts -nonewline $out [punk::ansi::move $start_row $start_col]
@ -2365,7 +2350,7 @@ namespace eval punk::console {
if {[dict exists $decmode_names $num_or_name]} { if {[dict exists $decmode_names $num_or_name]} {
set m [dict get $decmode_names $num_or_name] set m [dict get $decmode_names $num_or_name]
} else { } else {
error "punk::console::dec_get_mode unrecognised mode '$num_or_name'. Known mode names: [dict keys $decmode_names]" error "punk::console::dec_has_mode unrecognised mode '$num_or_name'. Known mode names: [dict keys $decmode_names]"
} }
} }
variable dec_has_mode_cache variable dec_has_mode_cache
@ -3300,7 +3285,7 @@ namespace eval punk::console {
proc test_string_cursor {teststring {emit 0}} { proc test_string_cursor {teststring {emit 0}} {
variable ansi_available variable ansi_available
if {!$ansi_available} { if {!$ansi_available} {
puts stderr "No ansi - cannot test char_width of '$teststring' returning [string length $test_string]" puts stderr "No ansi - cannot test char_width of '$teststring' returning [string length $teststring]"
return [string length $teststring] return [string length $teststring]
} }
punk::console::enable_alt_screen punk::console::enable_alt_screen
@ -3337,7 +3322,7 @@ namespace eval punk::console {
} }
flush stdout;#if we don't flush - a subsequent stderr write could move the cursor to a newline and interfere with our 2K1G erasure and cursor repositioning. flush stdout;#if we don't flush - a subsequent stderr write could move the cursor to a newline and interfere with our 2K1G erasure and cursor repositioning.
punk::console::disable_alt_screen punk::console::disable_alt_screen
return [list rowoffset [expr {$col2 - $col1}] columnoffset [expr {$row2 - $row1}]] return [list rowoffset [expr {$row2 - $row1}] columnoffset [expr {$col2 - $col1}]]
} }
#todo! - improve ideally we want to use VT sequences to determine - and make a separate utility for testing via systemcalls/os api #todo! - improve ideally we want to use VT sequences to determine - and make a separate utility for testing via systemcalls/os api
@ -3662,7 +3647,7 @@ namespace eval punk::console {
if {!$is_vt52} { if {!$is_vt52} {
puts -nonewline stdout [punk::ansi::move_emit $row $col $data {*}$args] puts -nonewline stdout [punk::ansi::move_emit $row $col $data {*}$args]
} else { } else {
puts -nonewline stdout [punk::ansi::v52move_emit $row $col $data {*}$args] puts -nonewline stdout [punk::ansi::vt52move_emit $row $col $data {*}$args]
} }
} }
proc move_emit_return {row col data args} { proc move_emit_return {row col data args} {
@ -3671,9 +3656,9 @@ namespace eval punk::console {
lassign [punk::console::get_cursor_pos_list] orig_row orig_col lassign [punk::console::get_cursor_pos_list] orig_row orig_col
set commands "" set commands ""
append commands [punk::ansi::move_emit $row $col $data {*}$args] append commands [punk::ansi::move_emit $row $col $data]
foreach {row col data} $args { foreach {row col data} $args {
append commands [punk::ansi::move_emit $row $col $data {*}$args] append commands [punk::ansi::move_emit $row $col $data]
} }
if {!$is_in_raw} { if {!$is_in_raw} {
incr orig_row -1 incr orig_row -1
@ -4708,7 +4693,7 @@ namespace eval punk::console {
proc enableAnsi {} { proc enableAnsi {} {
} }
#disableAnsi #disableAnsi
proc enableAnsi {} { proc disableAnsi {} {
} }
#enableVirtualTerminal #enableVirtualTerminal
proc enableVirtualTerminal {{channels {input output}}} { proc enableVirtualTerminal {{channels {input output}}} {

3
src/modules/punk/console-buildversion.txt

@ -1,6 +1,7 @@
0.1.7 0.1.8
#First line must be a semantic version number #First line must be a semantic version number
#all other lines are ignored. #all other lines are ignored.
#0.1.8 - bug fixes: disableAnsi was defined as a duplicate enableAnsi in the windows no-twapi branch; get_size_using_cursormove flushed stdout instead of the supplied output channel; removed unreachable code after error in get_size_using_chanconfigure; cell_size query path now passes its -console spec to get_size and error message names punk::console (was punk::sixel); test_string_cursor undefined $test_string reference and swapped rowoffset/columnoffset return labels; ansi::move_emit vt52 branch called nonexistent v52move_emit (now vt52move_emit); move_emit_return no longer re-expands args inside its per-triple loop (duplicated emissions); dec_has_mode unknown-mode error named dec_get_mode
#0.1.7 - get_size dispatches object-governed calls through the virtual ::opunk::Console::size method (subclass overrides honoured); ANSI/tput mechanisms factored into size_via_query_mechanisms and registered as the class size_query_provider via ensure_object_integration; legacy channel path returns 80x24 instead of erroring when undetermined #0.1.7 - get_size dispatches object-governed calls through the virtual ::opunk::Console::size method (subclass overrides honoured); ANSI/tput mechanisms factored into size_via_query_mechanisms and registered as the class size_query_provider via ensure_object_integration; legacy channel path returns 80x24 instead of erroring when undetermined
#0.1.6 - get_ansi_response_payload performs first-use active settling (with recursion latch) so all query paths pay one probe instead of a timeout per call on unsettled ambiguous consoles; default_console unifies the opunk::console probe-byte store with input_chunks_waiting #0.1.6 - get_ansi_response_payload performs first-use active settling (with recursion latch) so all query paths pay one probe instead of a timeout per call on unsettled ambiguous consoles; default_console unifies the opunk::console probe-byte store with input_chunks_waiting
#0.1.5 - settle_can_respond: layered active settling of console response capability (certainty/heuristic without emission, CSI 6n probe with timeout in the ambiguous zone); get_size triggers it at first use for anchored/default console specs; new variable can_respond_probe_timeout_ms #0.1.5 - settle_can_respond: layered active settling of console response capability (certainty/heuristic without emission, CSI 6n probe with timeout in the ambiguous zone); get_size triggers it at first use for anchored/default console specs; new variable can_respond_probe_timeout_ms

Loading…
Cancel
Save