我がアプリに矢印キーの代わりにマウスで押すボタンを付けた。
出した後で気が付いた、矢印キーの設定と連動していない。
まあ普通に GdkEvent を作って emit すれば…じゃない!
このアプリでは Ctrl 等の装飾キー状態も必要だった。
ボタンクリックのハンドラにて現在どの装飾キーが押されているかを取得。
それって手段があるのか?ってレベルの話だな。
ガチでアプリを作っている人でないと一生気にならなそうだ。
なんだ devhelp で get_modifier と検索したらアッサリ。
早速試してみよう。
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 39 | #!/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 に投げれば…
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 39 | #!/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!
よし必殺技だ、ハンドラを関数として呼び出ししてまえ。
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 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 でも同じハンドラという狙ったとおりになる。
実装する時はキチンと関数に分離しとこう。