Как связать событие «Control-Control» в Tcl / Tk - PullRequest
0 голосов
/ 03 декабря 2018

Я хотел бы связать очень специфическое событие, которое представляет собой «Управляющий ключ», за которым следует другой «Управляющий ключ», аналогичный операции KVM, с виджетом.

Я знаю, как связать различные события, ноне этот, который включает в себя два последовательных события.

Есть идеи, как это реализовать?

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Теперь с учетом быстрой задержки, необходимой для «двойного щелчка»

bind . <KeyPress> {queueEvent %K}

set queue {}
set times {}

proc queueEvent {key} {
    global queue times
    if {![string match Control* $key]} {set queue {}; set times {}; return}
    if {$key eq $queue} {
        if {[expr [clock milliseconds] - $times] <= 500} {
            puts "double ctrl $key"
            set queue {}; set times {}
            return
        }
    }
    set queue $key
    set times [clock milliseconds]
}
0 голосов
/ 03 декабря 2018

Теоретически, вы можете использовать последовательность событий привязки для этого:

# The keyboard often has two control keys; they have different names
bind $w <KeyPress-Control_L><KeyPress-Control_L> {puts "double-control (left)"}
bind $w <KeyPress-Control_R><KeyPress-Control_R> {puts "double-control (right)"}

Однако управляющие клавиши (как и в случае других модификаторов) особенно сложны в обращении, посколькуони повторяются ОС для вас;это особый случай!Поэтому вместо этого вам нужно создать собственную очередь событий клавиатуры:

bind $w <KeyPress> {queueEvent %K}
set queue {no-such-key}
proc queueEvent {key} {
    global queue
    if {[llength [lappend queue $key]] > 2} {
        set queue [lrange $queue end-1 end]
    }
    lassign $queue last this
    if {$last eq $this && [string match Control* $this]} {
        puts "double ctrl"
    }
}

Это может плохо взаимодействовать с другими привязками.Как это исправить, зависит от более широкого контекста вашего приложения.

...