おぉ! 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 を使っている意味ネェ、、、、、、、、、、
動けばいいのさ動けば。
やっと実装コードに移れるよ、そっちでも問題バリバリな可能性は高い。