tk print from 8.7 for 8.6

tk print from 8.7 for 8.6

experimented a bit with print.tcl from tk8.7 in tk8.6

Tip 604 Tip Printing Support for Text and Canvas Widgets

print.tcl from tk8.7

Printing in core - still a ways to go before TIP, but major milestone

#print-8.6erw.tcl
# ..lib/print-8.6erw.tcl
#0.3
#13.09.2023 14.20
# using print.tcl and tk print from tk8.7 for tk8.6
if {[info tclversion] eq "8.6"} {
   source [file join [file normalize [file dirname [info script]]] print.tcl]
   # ..lib/print.tcl
   # print.tcl from src/tk/library (Source Code tk 8.7)
   # https://core.tcl-lang.org/tips/doc/trunk/tip/604.md
   if {[tk windowingsystem] eq "win32"} {
      package require gdi
      package require printer
      #Tcl Extensions by Michael Schwarz
      #http://wiki.tcl-lang.org/page/TkPrint
      package require struct::list
      namespace eval ::tk::print {
         # this 4 procs exists in tk8.7 not in libs printer or gdi, wrapper in tk 8.6
         proc _openprinter {args} {
            #   variable printargs
            variable printer_name
            variable paper_width
            variable paper_height
            variable dpi_x
            variable dpi_y
            variable copies
            #set pliste [printer list]
            set hDC [printer open {*}$args]
            set attr  [struct::list flatten [printer attr -hDc $hDC]]
            # diff to 8.7,  proc _set_dc, set printargs(hDC) $printer_name
            # set printer_name [dict get  $attr device]
            # set printargs(printer_name) [dict get $attr device]
            set printer_name [lindex $hDC 0]
            set paper_width [lindex [dict get $attr "page dimensions"] 0]
            set paper_height [lindex [dict get $attr "page dimensions"] 1]
            set dpi_x [lindex [dict get $attr "pixels per inch"] 0]
            set dpi_y [lindex [dict get $attr "pixels per inch"] 1]
            set copies [dict get $attr copies]
         }

         proc _closeprinter {} {
            printer close
         }

         proc _opendoc {} {
            printer job start
         }

         proc _closedoc {} {
            printer job end
         }

         proc _openpage {} {
            printer page start
         }

         proc _closepage {} {
            printer page end
         }

         proc _gdi {args} {
            gdi {*}$args
            #tailcall gdi {*}$args
         }

         proc _selectprinter {} {
            # variable printargs
            variable printer_name
            variable paper_width
            variable paper_height
            variable dpi_x
            variable dpi_y
            variable copies
            set hDC [printer dialog select]
            set attr  [struct::list flatten [printer attr -hDc $hDC]]
            # diff to 8.7,  proc _set_dc, set printargs(hDC) $printer_name            
            # set printer_name [dict get  $attr device]
            # set printargs(printer_name) [dict get $attr device]
            set printer_name [lindex $hDC 0]
            set paper_width [lindex [dict get $attr "page dimensions"] 0]
            set paper_height [lindex [dict get $attr "page dimensions"] 1]
            set dpi_x [lindex [dict get $attr "pixels per inch"] 0]
            set dpi_y [lindex [dict get $attr "pixels per inch"] 1]
            set copies [dict get $attr copies]
         }
      }

   }
}

Example: printtest86.tcl

#printtest86.tcl
package require Tk
#package require tkcon
#tkcon show
# ../lib/lib print-8.6erw.tcl
# ../lib/print.tcl
# print.tcl from src/tk/library (Source Code tk 8.7)

source [file join [file join [file normalize [file dirname [info script]]] lib print-8.6erw.tcl]]

proc call {} {
    #set out ""
    set out [catch {tk print .t} err1]
    .t insert end "arr: [array get ::tk::print::printargs]\n"
    .t insert end "out: $out \n"
    .t insert end "err1: $err1 \n"
    .t insert end "attr: [catch {printer attr -hdc $::tk::print::printargs(hDC)} err2]\n"
    .t insert end "err2: $err2 \n\n"
}

text .t
button .btn -text print -command {call}
.t insert end "[info patchlevel] \n"
.t insert end "[tk windowingsystem]\n"
.t insert end "[info nameofexecutable]\n\n"

pack .t -fill both -expand 1
pack .btn -expand 0