トップ «前の日記(05/13/2008) 最新 次の日記(05/20/2008)» 編集

本 日 の h o g e

hogeとはワイルドカードのようなものです。日々起こった、さまざまなこと −すなわちワイルドカード− を取り上げて日記を書く、という意味で名付けたのかというとそうでもありません。適当に決めたらこんな理由が浮かんできました。

更新情報の取得には rdflirs を使ってもらえると嬉しいです.


05/19/2008 ふむ [長年日記]

tDiary 2034日目

[メモ] GTK の Enter キー

SCIM とかだと変換確定時の Enter が key-press-event に渡らないけど,XIM だと渡ってしまうくさい.

Enter 入力時の動作をいじるとき,key-press-event をフックする方法を採ると SCIM とかは大丈夫でも XIM でおかしなことになる.

Pidgin とかは key-press-event を使わず,gtk_binding_entry_add_signal で Enter キーをシグナルに関連づけてるっぽい.

PyGTK なら例えば以下のような感じで実現可能.

import gobject
import gtk

class EnterKeyPressEntry(gtk.Entry):
    __gsignals__ = {
        'enter-pressed': (gobject.SIGNAL_RUN_LAST|gobject.SIGNAL_ACTION,
                          gobject.TYPE_NONE, (gobject.TYPE_INT,))
    }

    def __init__(self):
        gtk.Entry.__init__(self)

    def do_enter_pressed(self, modifier):
        pass

gobject.type_register(EnterKeyPressEntry)

for mod in [0, gtk.gdk.SHIFT_MASK, gtk.gdk.CONTROL_MASK, gtk.gdk.MOD1_MASK]:
    gtk.binding_entry_add_signal(EnterKeyPressEntry, gtk.keysyms.Return, mod,
                                 'enter-pressed', gobject.TYPE_INT, mod)
    gtk.binding_entry_add_signal(EnterKeyPressEntry, gtk.keysyms.KP_Enter, mod,
                                 'enter-pressed', gobject.TYPE_INT, mod)

if __name__ == '__main__':
    import sys

    e = EnterKeyPressEntry()
    e.connect('enter-pressed', lambda _e, m: sys.stdout.write('mod:%d\n' % m))

    w = gtk.Window()
    w.add(e)
    w.connect('delete-event', lambda w, e: gtk.main_quit())
    w.set_default_size(100, 50)
    w.show_all()

    gtk.main()

そういや

Entry は activate か何かがまさにそれだったような気がする... 例を TextView とかにしとけばよかった.