| 193 | |
| 194 | == key-press-event の罠 == |
| 195 | * SCIM とかならキー入力が key-press-event に渡らないが,XIM だと渡ってしまうくさい. |
| 196 | * 例えば Return 入力時の動作をいじるとき,key-press-event をフックする方法を採ると SCIM とかは大丈夫でも XIM でおかしなことになる. |
| 197 | * キーバインドをシグナルに結びつける方法を採ればこの問題は解消する. |
| 198 | {{{ |
| 199 | #!python |
| 200 | import gobject |
| 201 | import gtk |
| 202 | |
| 203 | class EnterKeyPressTextView(gtk.TextView): |
| 204 | __gsignals__ = { |
| 205 | 'enter-pressed': (gobject.SIGNAL_RUN_LAST|gobject.SIGNAL_ACTION, |
| 206 | gobject.TYPE_NONE, (gobject.TYPE_INT,)) |
| 207 | } |
| 208 | |
| 209 | gobject.type_register(EnterKeyPressTextView) |
| 210 | |
| 211 | for mod in [0, gtk.gdk.SHIFT_MASK, gtk.gdk.CONTROL_MASK, gtk.gdk.MOD1_MASK]: |
| 212 | gtk.binding_entry_add_signal(EnterKeyPressTextView, gtk.keysyms.Return, mod, |
| 213 | 'enter-pressed', gobject.TYPE_INT, mod) |
| 214 | gtk.binding_entry_add_signal(EnterKeyPressTextView, gtk.keysyms.KP_Enter, mod, |
| 215 | 'enter-pressed', gobject.TYPE_INT, mod) |
| 216 | |
| 217 | if __name__ == '__main__': |
| 218 | import sys |
| 219 | |
| 220 | e = EnterKeyPressTextView() |
| 221 | e.connect('enter-pressed', lambda _e, m: sys.stdout.write('mod:%d\n' % m)) |
| 222 | |
| 223 | w = gtk.Window() |
| 224 | w.add(e) |
| 225 | w.connect('delete-event', lambda _w, _e: gtk.main_quit()) |
| 226 | w.set_default_size(640, 480) |
| 227 | w.show_all() |
| 228 | |
| 229 | gtk.main() |
| 230 | }}} |