GTK+ はキーの長押しを認識できないようで

Y901 というアプリは上下矢印キーの長押しでリスト選択位置の移動のみを行っていた。
キーを離し WM_KEYUP メッセージを捕まえた所で選択位置のファイルを再生開始していた。
当然 Y901x でもそうしたいわけだ。

しかし…とにかくコレを動かして上下どちらかの矢印キーを押しっ放しにしてみる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/usr/bin/env python
#-*- coding:utf-8 -*-
 
import gtk
 
class KeyUpDown(gtk.Window):
    def __init__(self):
        gtk.Window.__init__(self)
        self.tv = gtk.TextView()
        sw = gtk.ScrolledWindow()
        sw.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
        sw.add(self.tv)
        self.add(sw)
        # GDK イベントの有効化を行っておく
        self.set_events(gtk.gdk.KEY_PRESS_MASK | gtk.gdk.KEY_RELEASE_MASK)
        self.connect("key_press_event", self.on_key_press)
        self.connect("key_release_event", self.on_key_release)
        self.connect("delete-event", gtk.main_quit)
        self.resize(300, 400)
        self.show_all()
 
    def on_key_press(self, widget, event):
        if event.keyval == 65362 or event.keyval == 65364:
            buf = self.tv.get_buffer()
            s = "押した\n"
            it = buf.get_end_iter()
            buf.insert(it, s, len(s))
 
    def on_key_release(self, widget, event):
        if event.keyval == 65362 or event.keyval == 65364:
            buf = self.tv.get_buffer()
            s = "離した\n"
            it = buf.get_end_iter()
            buf.insert(it, s, len(s))
 
if __name__ == "__main__":
    w = KeyUpDown()
    gtk.main()

updown

つまり key_press_event シグナルは必ず key_release_event シグナルと交互に発生する。
Windows のように WM_KEYDOWN イベントのみが起こるというわけではないようだ。
キーを離し WM_KEYUP メッセージを捕まえるように key_release_event を…

できない!

まいった、何か方法を見つけるまで今までどうり一つ上下移動のみにするしかない。
つーかこの現実が解るまで「あれぇ?なんで???」と苦しんだ私であった。

それとラジオメニューとトグルボタンは UIManager から同期させられないっぽい。
しかたがないのでリピート用のトグルボタンを排除するという暴挙で解決!
パッと見て状態が解ればいいんだからステータスバーに表示、これが私のクオリティ。

追記、長押し判定する方法がありました
GTK+ Cancel Long Keypress | PaePoi