Helmut Giese
2024-09-12 23:31:34 UTC
Hello out there,
it seems like as long as a popup is posted the app cannot do anything
- in particular it cannot post any events. Consider this script:
---
package require Tk
foreach ch [winfo children "."] {destroy $ch}
# Turn $x & $y into absolute coords
proc mkAbsCoords {c x y} {
# get the canvas's coord relative to the toplevel
set xOfs [expr {[winfo rootx $c]}]
set yOfs [expr {[winfo rooty $c]}]
return [list [expr {$x + $xOfs}] [expr {$y + $yOfs}]]
}
proc popupMenu {c x y} {
catch {destroy .popup}
set popup [menu .popup -tearoff false]
set inactiveBG #b2b2b2
$popup add command -label "Choose an op" \
-background #b2b2b2 -activebackground #b2b2b2 \
-activeforeground [$popup cget -fg]
$popup add command -label "Op 1" -command {puts "Op1 selected"}
$popup add command -label "Op 2" -command {puts "Op2 selected"}
lassign [mkAbsCoords $c $x $y] x y
tk_popup $popup $x $y
}
set num [lindex $argv 0]
set c [canvas .c -width 200 -height 200]
pack $c
set id [$c create rectangle 50 50 150 150 -fill lightyellow]
$c bind $id <Button-3> [list popupMenu $c %x %y]
update
if {$num} {
set event Button
} else {
set event ButtonPress
}
event generate $c <$event> -button 3 -x 100 -y 100 -warp 1
puts "Back from '$event'"
if {$num == 0} {
event generate $c <ButtonRelease> -button 3 -x 100 -y 100 -warp 1
puts "Back from 'ButtonRelease'"
}
---
and this output:
---
Microsoft Windows [Version 10.0.19045.4894]
(c) Microsoft Corporation. Alle Rechte vorbehalten.
d:\proj\_ToolsSE\Skeleton\TclTests>tclsh tst.tcl 1
Back from 'Button'
Op1 selected
d:\proj\_ToolsSE\Skeleton\TclTests>tclsh tst.tcl 0
Back from 'ButtonPress'
Back from 'ButtonRelease'
Op1 selected
---
To me this seems to clearly indicate that the selection cannot be
influenced by the controlling app: control only returns when the
selection has happened - which is too bad.
Or is there a trick by which one can influence the selection from a
popup?
Any idea will be highly appreciated.
Helmut
Oh, this is on Windows 64 bit under Tcl 8.6.10
it seems like as long as a popup is posted the app cannot do anything
- in particular it cannot post any events. Consider this script:
---
package require Tk
foreach ch [winfo children "."] {destroy $ch}
# Turn $x & $y into absolute coords
proc mkAbsCoords {c x y} {
# get the canvas's coord relative to the toplevel
set xOfs [expr {[winfo rootx $c]}]
set yOfs [expr {[winfo rooty $c]}]
return [list [expr {$x + $xOfs}] [expr {$y + $yOfs}]]
}
proc popupMenu {c x y} {
catch {destroy .popup}
set popup [menu .popup -tearoff false]
set inactiveBG #b2b2b2
$popup add command -label "Choose an op" \
-background #b2b2b2 -activebackground #b2b2b2 \
-activeforeground [$popup cget -fg]
$popup add command -label "Op 1" -command {puts "Op1 selected"}
$popup add command -label "Op 2" -command {puts "Op2 selected"}
lassign [mkAbsCoords $c $x $y] x y
tk_popup $popup $x $y
}
set num [lindex $argv 0]
set c [canvas .c -width 200 -height 200]
pack $c
set id [$c create rectangle 50 50 150 150 -fill lightyellow]
$c bind $id <Button-3> [list popupMenu $c %x %y]
update
if {$num} {
set event Button
} else {
set event ButtonPress
}
event generate $c <$event> -button 3 -x 100 -y 100 -warp 1
puts "Back from '$event'"
if {$num == 0} {
event generate $c <ButtonRelease> -button 3 -x 100 -y 100 -warp 1
puts "Back from 'ButtonRelease'"
}
---
and this output:
---
Microsoft Windows [Version 10.0.19045.4894]
(c) Microsoft Corporation. Alle Rechte vorbehalten.
d:\proj\_ToolsSE\Skeleton\TclTests>tclsh tst.tcl 1
Back from 'Button'
Op1 selected
d:\proj\_ToolsSE\Skeleton\TclTests>tclsh tst.tcl 0
Back from 'ButtonPress'
Back from 'ButtonRelease'
Op1 selected
---
To me this seems to clearly indicate that the selection cannot be
influenced by the controlling app: control only returns when the
selection has happened - which is too bad.
Or is there a trick by which one can influence the selection from a
popup?
Any idea will be highly appreciated.
Helmut
Oh, this is on Windows 64 bit under Tcl 8.6.10