おぉ! Eye of GNOME のプラグイン作りが上手くいかない理由がやっと解った。
def activate(self, window): self.ww = window
みたくパラメータを self のアトリビュートにした時点で終了しなくなる。
global にしてみても駄目、GtkActionGroup のユーザーデータにしても何をしても駄目。
とにかくパラメータの window ポインタは一切保存しないようにするしかない。
ということは EogImage のポインタはどうやって取得すればいいのだ?
__init__ で get_image() しても None が戻ってくるだけだ。
試しに GtkUIManager から直接 Menu を抜いてコネクトならユーザーデータにできる。
ま、FullScreen プラグインのソースを見たらそうやっていたので試したんだが。
そういえば GtkActionGroup なら window 引数が有るからそのまま使える。
ということは…
#-*- coding:utf-8 -*- import eog import gtk ui_str = """<ui> <menubar name="MainMenu"> <menu name="Edit" action="Edit"> <separator/> <menuitem name="rename" action="rename"/> </menu> </menubar> </ui>""" class RenameDlgPlugin(eog.Plugin): def __init__(self): eog.Plugin.__init__(self) def activate(self, window): uimanager = window.get_ui_manager() # F2 キーでの処理 accelgroup = uimanager.get_accel_group() accelgroup.connect_group(gtk.keysyms.F2, 0, gtk.ACCEL_VISIBLE, self.on_acc) # 上手くいかないけどメニューを作るためだけの処理 action_group = gtk.ActionGroup("RenameActions") actions = [("rename", None, "リネーム", None, "リネーム", None)] action_group.add_actions(actions) uimanager.insert_action_group(action_group, 0) self._ui_id = uimanager.add_ui_from_string(ui_str) # メニューは普通にコネクトさせる m = uimanager.get_widget("/MainMenu/Edit/rename") m.connect("activate", self.on_rename, window) def update_ui(self, window): pass def deactivate(self, window): uimanager = window.get_ui_manager() uimanager.remove_ui(self._ui_id) # 2009.05.16 ちょっと書き換え accelgroup = uimanager.get_accel_group() accelgroup.disconnect_key(gtk.keysyms.F2, 0) #uimanager.remove_action_group(self._action_group) uimanager.ensure_update() def on_acc(self, accelGroup, window, keyval, modifier): self.on_rename(None, window) def on_rename(self, widget, window): if window == None: return img = window.get_image() if img == None: return print img.get_uri_for_display()
まったく別々に作ってムリムリにつじつまを合わせてやっと成功、なんじゃこりゃ。
GtkUIManager を使っている意味ネェ、、、、、、、、、、
動けばいいのさ動けば。
やっと実装コードに移れるよ、そっちでも問題バリバリな可能性は高い。