我がアプリに矢印キーの代わりにマウスで押すボタンを付けた。
出した後で気が付いた、矢印キーの設定と連動していない。
まあ普通に GdkEvent を作って emit すれば…じゃない!
このアプリでは Ctrl 等の装飾キー状態も必要だった。
ボタンクリックのハンドラにて現在どの装飾キーが押されているかを取得。
それって手段があるのか?ってレベルの話だな。
ガチでアプリを作っている人でないと一生気にならなそうだ。
なんだ devhelp で get_modifier と検索したらアッサリ。
早速試してみよう。
#!/usr/bin/env python3 import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk, Gdk class ButtonWin(Gtk.Window): def __init__(self): Gtk.Window.__init__(self) button = Gtk.Button(label="modifier = ?") button.connect("clicked", self.on_button_clicked) self.connect("delete-event", Gtk.main_quit) self.add(button) self.show_all() def on_button_clicked(self, button): kmp = Gdk.Keymap.get_default() state = kmp.get_modifier_state() if state == 0: button.set_label("modifier = NULL") elif state == 1: button.set_label("modifier = Shift") elif state == 4: button.set_label("modifier = Ctrl") elif state == 5: button.set_label("modifier = Shift+Ctrl") elif state == 8: button.set_label("modifier = Alt") elif state == 9: button.set_label("modifier = Shift+Alt") elif state == 12: button.set_label("modifier = Ctrl+Alt") elif state == 13: button.set_label("modifier = Shift+Ctrl+Alt") else: button.set_label("modifier = ???") ButtonWin() Gtk.main()
これでボタンからでも装飾キーの状態が判別できるね。
後は GdkEvent を作って key-press-event に投げれば…
#!/usr/bin/env python3 import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk, Gdk class ButtonWin(Gtk.Window): def __init__(self): Gtk.Window.__init__(self) button = Gtk.Button(label="Press Key 'A'") button.connect("clicked", self.on_button_clicked) self.connect("delete-event", Gtk.main_quit) self.connect("key-press-event", self.on_key_press_event) self.add(button) self.show_all() def on_button_clicked(self, button): """ Gdk-WARNING **: Event with type 8 not holding a GdkDevice. It is most likely synthesized outside Gdk/GTK+ """ kmp = Gdk.Keymap.get_default() event = Gdk.Event() event.type = Gdk.EventType.KEY_PRESS event.state = kmp.get_modifier_state() event.keyval = Gdk.KEY_a event.window = self.props.window event.put() def on_key_press_event(self, widget, event): if event.state == Gdk.ModifierType.CONTROL_MASK: self.set_title("Ctrl+{0}".format(chr(event.keyval))) else: self.set_title("{0}".format(chr(event.keyval))) ButtonWin() Gtk.main()
これで Ctrl を押しながらボタンクリックも Ctrl+a にはなるけど。
GdkDevice がどうのとワーニングになってしまう。
キーボードの指定か何か必要なのか?よくワカンネェYO!
よし必殺技だ、ハンドラを関数として呼び出ししてまえ。
#!/usr/bin/env python3 import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk, Gdk class ButtonWin(Gtk.Window): def __init__(self): Gtk.Window.__init__(self) button = Gtk.Button(label="Press Key 'A'") button.connect("clicked", self.on_button_clicked) self.connect("delete-event", Gtk.main_quit) self.connect("key-press-event", self.on_key_press_event) self.add(button) self.show_all() def on_button_clicked(self, button): """ call on_key_press_event """ kmp = Gdk.Keymap.get_default() event = Gdk.Event() event.state = kmp.get_modifier_state() event.keyval = Gdk.KEY_a #event.put() self.on_key_press_event(None, event) def on_key_press_event(self, widget, event): """ OK """ if event.state == Gdk.ModifierType.CONTROL_MASK: self.set_title("Ctrl+{0}".format(chr(event.keyval))) else: self.set_title("{0}".format(chr(event.keyval))) ButtonWin() Gtk.main()
なんというアホな処理。
でもこれで Ctrl+Click でも同じハンドラという狙ったとおりになる。
実装する時はキチンと関数に分離しとこう。