eog」タグアーカイブ

Eye of GNOME プラグインは本当に面倒

おぉ! 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 を使っている意味ネェ、、、、、、、、、、

動けばいいのさ動けば。
やっと実装コードに移れるよ、そっちでも問題バリバリな可能性は高い。

Eye of GNOME プラグインは面倒

Eye of GNOME でリネームプラグインを作る。
って書いたけど本当に作れるんかいな?

Gedit/Plugins – GNOME Live!
EyeOfGnome/Plugins – GNOME Live!

gEdit とは扱いが随分違うなぁ… HowTo も何もない、勘で作れと?

Eye of GNOME Reference Manual

これ Python にバインディングされているのだろうか?

EyeOfGnome – SunagaLab

以前貼った所をよく見ると window.get_image() メソッドが使えているからできるのだろう。
ただ、9.04 付属の 2.26.1 はこの機能が標準装備、進化って悲しいなぁ。
他の Python への変換は勘でなんとかなると思う、今更 C で作りたく無いよ。

とにかく実際に書いてみるのが一番早い、とりあえず Plugins ページ一番下にあったコードは動いた。
次は gEdit プラグインを作ったのと同じように MessageBox を出すのを作って試す。

っっって

何これ、Eye of GNOME ってプラグインから例外を出すと終了してくれない!
端末から eog で起動して終了しなかったら Ctrl+C で強制終了さなきゃやってられん。
GUI アプリでコレをやるとは思いもしなかった。

eogdebug

2 と出ているのは debug 用でどこまで動いたかを print しているだけだから気にしない。
最初それが解らなくて再起動やログアウトをやるという無駄なことをしてしまった。

こんなことをやっている間に気がついた。
Ubuntu 9.04 って Ctrl+Alt+BackSpace で X の再起動ができなくなっている!

Ubuntu 9.04 Beta ctrl+alt+backspaceを有効にする。

$ sudo apt-get install dontzap
$ sudo dontzap -d

しなきゃいけないのね、何故わざわざ無効にする必要があったのか理解できない。
おいおい、そんなことをしている間に今日が終わっちゃう。
はたしてこの計画は進むのだろうか?