タグ別アーカイブ: eog

eog and Gedit 3.18 Plugin

うーん困った、って何が?

Eye of GNOME って見た目のショボさとは裏腹にかなり優秀である。
SVG 画像を綺麗に拡大できるだけでなく実はディレクトリ監視も行っている。

eog で画像を表示した状態で同一ディレクトリのファイルを別アプリからリネーム。
すると eog のリストへ即座に繁栄され矢印キーやスライドショーにも適用される。
ただ即時繁栄のためサムネイル画像がまだ作成されていない状態になってしまう。
サムネイル表示(F9)を出していないと気にならないけど。

なので今まで自作リネームプラグインはサムネイル画像を自前で入れ替えしていた。
それが 3.18 で上手く動作しない、仕様変更されたようだ。

どうも remove_image が無効になっているだけっぽいけどよく解らない。
とりあえず即元にもどせるようコメントアウトでしばらく様子見。

eog318_remove_image

Gedit はやはり gi.require_version 追記だけだった。
しかし eog もそうだけど Peas のバージョン指定もいるようだ。
Peas はソースで使っていないし 1.0 しかないのに、将来の伏線かな?

ついでに、筆者は Gedit Plugin を 4 つ公開しているのですが。
一つに書いただけで警告は出なくなった、おいおい…
まあ全部に書いたけどね。

gedit318_peas

というわけでプラグイン 3.18 版を公開。
最後に。

kuroe

いえーい、無課金なのにクロエ・ルメールを最終進化できるぞい!
貯めた炭酸を全部使った甲斐があった(ウチ姫はどうした!

eog plugin 3.16

随分前に Fedora を 22 にアップデートしたような。
そうだ、自作 eog プラグインの更新を忘れていた!

私的に傑作プラグインだけど、そんなにリネームなんてしないジャン。
ということでとっとと更新しなければ。

Apps/EyeOfGnome/Plugins – GNOME Wiki!

公式は相変わらずヤル気ネェ…
とにかく Gedit 同様に GtkUIManager を排除する必要があるだろう。

GEdit 用に作った奴をコピペして Eog に書き換えてみた。
Eog.App なんて無いよと Python に怒られる、なんでじゃ!

dir(Eog) で調べると Eog.Application らしい、まぎらわしいわ!
AppActivatable も ApplicationActivatable だ、統一してよ。
同じ GNOME 標準アプリといっても企業ではなく GPL だからしかたがないが。

メニューを作ろうとしたけど extend_menu メソッドが使えない。
よく解らないのでソースを落とし reload プラグインを見てみる。
GtkApplicationWindow の activate で突っ込んでいた。
だから統一、、、まあいいか。

この方法だとメニュー排除が凄く面倒臭いようだ。
というか g_menu_item_set_attribute が何故か上手くいかない。
ええい面倒だ、メニューは廃止にしてしまえwww

昨今の GNOME に合わせシンプルにしたといえば皆納得するだろう。
実際筆者はメニューからリネームなんてしたことないもん。

Mac でも F2 をつい何度と押したことか、Mac は Enter なんだよね。
はどうでもよくて。
ということでこんなソースになりました。

renamedlg.py

#-*- coding:utf-8 -*-

#    Eye of GNOME renamedlg plugin version 3.16.0
#    Copyright © 2012 sasakima-nao <sasakimanao@gmail.com>
#
#    This program is free software; you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation; either version 2 of the License, or
#    (at your option) any later version.
#
#    Eye of GNOME Plugins
#    https://wiki.gnome.org/Apps/EyeOfGnome/Plugins
#    Eye of GNOME Reference Manual
#    http://developer.gnome.org/eog/stable/index.html
#
#   2015.06.16 3.16.0
#   Support eog 3.16 (Remove GtkUIManager)
#
#   2012.08.28 3.12.0
#   Support eog 3.12 (Python3)
#
#   2012.08.28 3.0.0

from gi.repository import GObject, Gtk, Eog, Gio, GLib
import os

class RenameDlgAppActivatable(GObject.Object, Eog.ApplicationActivatable):
    """
        Set GMenu and Accelerator
    """
    app = GObject.property(type=Eog.Application)
 
    def __init__(self):
        GObject.Object.__init__(self)
 
    def do_activate(self):
        self.app.add_accelerator("F2", "win.rename", None)
 
    def do_deactivate(self):
        self.app.remove_accelerator("win.rename", None)

class RenameDlgPlugin(GObject.Object, Eog.WindowActivatable):
    """
        Rename Dialog Plugin for eog 3.6
        Actibate from F2 key
    """
    __gtype_name__ = "Rename"
    window = GObject.property(type=Eog.Window)
    def __init__(self):
        GObject.Object.__init__(self)

    def do_activate(self):
        # Add Action
        self.action = Gio.SimpleAction.new("rename", None)
        self.action.connect('activate', self.on_rename)
        self.window.add_action(self.action)

    def do_deactivate(self):
        # Remove Action
        self.window.remove_action("rename")

    def do_update_state(self):
        #self.action.set_enabled(not self.window.is_empty())
        self.action.set_enabled(True)
        pass

    def on_rename(self, action, data=None):
        img = self.window.get_image()
        if img == None:
            return
        fullname = img.get_uri_for_display()[7:]
        path, name = os.path.split(fullname)
        label = Gtk.Label(name)
        entry = Gtk.Entry()
        entry.set_text(name)
        d = Gtk.Dialog( "Rename",
                        self.window,
                        Gtk.DialogFlags.MODAL,
                        (Gtk.STOCK_CANCEL, Gtk.ResponseType.REJECT,
                        Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT) )
        vbox = d.get_content_area()
        try:
            vbox.pack_start(label, False, False, 0)
            vbox.pack_start(entry, False, False, 0)
            d.show_all()
            def dlg_ok(self):
                d.response(Gtk.ResponseType.ACCEPT)
            def on_focus_in(self, widget):
                try:
                    # Calculate the number of characters
                    # Converted to a Display Name
                    s = entry.get_text()
                    displayname = GLib.filename_display_name(s)
                    i = displayname.rindex(".")
                    entry.select_region(0, i)
                except ValueError:
                    # Full select
                    pass
            def on_focus_out(self, widget):
                entry.select_region(0, 0)
            entry.connect("activate", dlg_ok)
            entry.connect("focus-in-event", on_focus_in)
            entry.connect("focus-out-event", on_focus_out)
            # Loop until success or Cancel
            while 1:
                if d.run() == Gtk.ResponseType.ACCEPT:
                    text = entry.get_text()
                    if text == "":
                        self.messagebox("File name is empty")
                        entry.set_text(name)
                    elif text == name:
                        self.messagebox("Have not changed")
                    elif  text in os.listdir(path):
                        self.messagebox("Found the same file name")
                    else:
                        # Get the EogListStore
                        store = self.window.get_store()
                        # Rename
                        newname = os.path.join(path, text)
                        os.rename(fullname, newname)
                        # Turn the queue
                        while Gtk.events_pending():
                            Gtk.main_iteration()
                        # Create EogImage
                        f = Gio.file_new_for_path(newname)
                        newimg = Eog.Image.new_file(f)
                        # Insert EogListStore
                        store.append_image(newimg)
                        # EogThumbView
                        tv = self.window.get_thumb_view()
                        tv.set_current_image(newimg, True)
                        # Turn the queue
                        while Gtk.events_pending():
                            Gtk.main_iteration()
                        # Remove Image from EogListStore
                        store.remove_image(img)
                        break
                else:
                    # Cancel Button
                    break
        finally:
            d.destroy()

    def messagebox(self, text):
        dlg = Gtk.MessageDialog(
                self.window,
                Gtk.DialogFlags.MODAL,
                Gtk.MessageType.WARNING,
                Gtk.ButtonsType.OK,
                text)
        dlg.set_title("Eye of GNOME")  
        r = dlg.run()  
        dlg.destroy()
        return r

koruri

Gedit 及び Eye of Gnome プラグイン – L’Isola di Niente

よしよし、キチンとリネーム可能だぞと。
よく見ると update_state ハンドラが実験用のままじゃないか。
特に問題は無いから次の更新で修正しよう、オープンソースはそれでイイ。

*.plugin ファイルの仕様は 3.14 までと変わっていない。
IAge が今でも 2 のまま動く、多分ガン無視しているだけだろうけど。

ところで。
Gedit で今頃気が付いたが 3.16 は単語 W クリックの仕様が変わっていた。
do_update_state 等の W クリック単語選択はアンダーバーを含めるようになた。
以前は区切りになっていたはずなんだが、あの動作に慣れているのでとまどうYO!

Eye of GNOME 3 plugin Create

Rename Dialog Eye of GNOME 3.* plugin 公開。

EyeOfGnome/Plugins – GNOME Live!

あれ、一番下に
~/.config/eog/plugins/ に入れろって書いてある。
3.0 の時からそう書いていたかな?記憶では v2 と同じ位置に置けと…
つか confug ディレクトリなのか、開発者によって色々思う所あるんだろうなと…

普通にサンプルコードが動いてしまったのだけど。
ちなみに v2 時は ~/.gnome2/eog/plugins に入れろであった。

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

v2 の時には Gedit Plugin と同様に activate で window ポインタをアトリビュートにして保持すると終了できないという「ワケガワカラナイヨ」な動作をしやがったたので強引な奇策を使う必要があった。

だけど v3 はソレで全然問題ないみたい。

というか。
class 直下にポインタ保持変数を書くのは初期化に限られていると思う、うっかり self を忘れがちなどころか継承を行うと場合によっては知らぬ間に書き換えらている可能性があるので正直勧められない。

#!/usr/bin/env python
#-*- coding:utf-8 -*-

class Cls(object):
    def __init__(self):
        self.first = "3rd"

class Test(Cls):
    first = "1st"
    def __init__(self):
        Cls.__init__(self)
        print "2nd"
        print self.first

if __name__ == "__main__":
    Test()

""" output
2nd
3rd
"""

継承元を熟知していないと Python の場合こういうことが起こるのよ。
__init__ の下に書きたくない場合は絶対に継承元が利用していないと断言できる変数名にするしかない。
とはいえ公式が公開しているサンプルコードなので同様に書くのが一番初心者が迷わないよな。
まあソレは余談で。

*.plugin の IAge が 2 指定のままなのが気になるけど。
IAge=3 に書き換えてもどっちでも動くや、意味ネェ。
多分このキーを完全無視しているだけなのだろう。

とにかく Gedit とほぼ同一に書いて問題なくなったぞと。
Gedit Plugin の解説が知らぬ間にスゲェ細かくなてるね。
書き方が解らない場合は Gedit のを参考にすればいいかなと。

Gedit/PythonPluginHowTo – GNOME Live!

次は Unicode へ変換して日本語を含む文字数を算出する方法に困った。
ダイアログ表示時に拡張子を除いた部分のみを選択するのに必要な処理。
gtk_entry_get_text() 戻り値から 普通に unicode(str) でイケなかったのよ。

v2 時はイケた、というか PyGtk がそうバインドされていた。
どうやら PyGI ではあの親切極まりない全自動変換は諦めるしか無いようだ。
ならば GLib を使ってドット位置の long 値を見つければいいと考えた。

Unicode Manipulation

上記で strstr から for 文のような処理が使える方法を探すも上手くいかない。
GLib.utf8_substring(s, 0, 3) とかで日本語も一文字扱いなのは解ったけどドット位置を日本語も一文字扱いで探す方法が見つからない。
というか UCS4 への変換すらできない、Python で扱えないということか。
やはり Python の強力な文字列変換機能に頼りたい。

Character Set Conversion

g_filename_display_name () というのを見つけて実験。

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from gi.repository import Gtk, GLib

class Win(Gtk.Window):
    """
        Unicode Test
    """
    def __init__(self):
        Gtk.Window.__init__(self)
        self.set_title("Gtk3")
        entry = Gtk.Entry()
        button = Gtk.Button("Button")
        button.connect("clicked", self.on_clicked, entry)
        vbox = Gtk.VBox()
        vbox.pack_start(button, False, False, 0)
        vbox.pack_start(entry, False, False, 0)
        self.add(vbox)
        self.connect("delete-event", Gtk.main_quit)
        self.show_all()
        self.set_focus(entry)

    def on_clicked(self, widget, entry):
        s = entry.get_text()
        print s
        #unicode(s) #=> UnicodeDecodeError
        displayname = GLib.filename_display_name(s)
        #print displayname #=> UnicodeDecodeError
        print len(unicode(displayname))

if __name__ == "__main__":
    Win()
    Gtk.main()

display_name 変換後であれば Unicode 変換が可能になる。
しかし display_name を標準出力するとエラー、ややこしいよ。
GTK3 は ucs4 を utf-8 として扱っているみたいだからえっと…
つまりメモリ内での扱いが少々違っていることだけ解ればいい、と思う。

Activate 時の Action とかを本家が全然解説していないけど Gedit とまったく同じ。
下記から PyGI コードに自力変換する、そんなに難しくはない。

Eye of GNOME Reference Manual

他色々と v2 時とは違っていて。
画像表示中に EogListStore から削除すると EogThumbView が死ぬとかリネーム前のファイルを取り除くのは最後にしないとサムネイル更新が上手くいかないとかets…
キリがないので後はコードを見てで済ませる。

とにかくこんなコードでやっと成功した。
多分外国人のほうが興味があると思うのでヘタクソな英語にしました。
日本人って自分で作らず探しているだけの奴ばっかだもんなぁ…

renamedlg.plugin

[Plugin]
Loader=python
Module=renamedlg
IAge=2
Name=rename
Name[ja]=リネーム
Description=view of file rename
Description[ja]=観覧中のファイルをリネーム
Authors=sasakima-nao <m6579ne998z@gmail.com>
Copyright=Copyright © 2012 sasakima-nao <m6579ne998z@gmail.com>
Website=http://palepoli.skr.jp/

renamedlg.py

#-*- coding:utf-8 -*-

#    Eye of GNOME renamedlg plugin version 3.0.0
#    Copyright © 2012 sasakima-nao <m6579ne998z@gmail.com>
#
#    This program is free software; you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation; either version 2 of the License, or
#    (at your option) any later version.
#
#    Eye of GNOME Plugins
#    http://live.gnome.org/EyeOfGnome/Plugins
#    Eye of GNOME Reference Manual
#    http://developer.gnome.org/eog/stable/index.html
#
#   2012.08.28 3.0.0

from gi.repository import GObject, Gtk, Eog, Gio, GLib
import os

ui_str = """<ui>
    <menubar name="MainMenu">
        <menu action="Edit">
            <separator/>
            <menuitem action="rename"/>
        </menu>
    </menubar>
</ui>"""

class RenameDlgPlugin(GObject.Object, Eog.WindowActivatable):
    """
        Rename Dialog Plugin for eog 3.*
        Actibate from Menu select or F2 key
    """
    window = GObject.property(type=Eog.Window)
    def __init__(self):
        GObject.Object.__init__(self)

    def do_activate(self):
        uimanager = self.window.get_ui_manager()
        self._action_group = Gtk.ActionGroup("RenameActions")
        actions = [("rename", None, "Rename", "F2", "Rename", self.on_rename)]
        self._action_group.add_actions(actions)
        uimanager.insert_action_group(self._action_group, 0)
        self._ui_id = uimanager.add_ui_from_string(ui_str)

    def do_deactivate(self):
        uimanager = self.window.get_ui_manager()
        uimanager.remove_ui(self._ui_id)
        uimanager.remove_action_group(self._action_group)
        uimanager.ensure_update()

    def on_rename(self, action, data=None):
        img = self.window.get_image()
        if img == None:
            return
        fullname = img.get_uri_for_display()[7:]
        path, name = os.path.split(fullname)
        label = Gtk.Label(name)
        entry = Gtk.Entry()
        entry.set_text(name)
        d = Gtk.Dialog( "Rename",
                        self.window,
                        Gtk.DialogFlags.MODAL,
                        (Gtk.STOCK_CANCEL, Gtk.ResponseType.REJECT,
                        Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT) )
        vbox = d.get_content_area()
        try:
            vbox.pack_start(label, False, False, 0)
            vbox.pack_start(entry, False, False, 0)
            d.show_all()
            def dlg_ok(self):
                d.response(Gtk.ResponseType.ACCEPT)
            def on_focus_in(self, widget):
                try:
                    # Calculate the number of characters in Unicode
                    # (e.g. Japanese Language)
                    # Converted to a Display Name
                    s = entry.get_text()
                    displayname = GLib.filename_display_name(s)
                    u = unicode(displayname)
                    i = u.rindex(".")
                    entry.select_region(0, i)
                except ValueError:
                    # Full select
                    pass
            def on_focus_out(self, widget):
                entry.select_region(0, 0)
            entry.connect("activate", dlg_ok)
            entry.connect("focus-in-event", on_focus_in)
            entry.connect("focus-out-event", on_focus_out)
            # Loop until success or Cancel
            while 1:
                if d.run() == Gtk.ResponseType.ACCEPT:
                    text = entry.get_text()
                    if text == "":
                        self.messagebox("File name is empty")
                        entry.set_text(name)
                    elif text == name:
                        self.messagebox("Have not changed")
                    elif  text in os.listdir(path):
                        self.messagebox("Found the same file name")
                    else:
                        # Get the EogListStore
                        store = self.window.get_store()
                        # Rename
                        newname = os.path.join(path, text)
                        os.rename(fullname, newname)
                        # Turn the queue
                        while Gtk.events_pending():
                            Gtk.main_iteration()
                        # Create EogImage
                        f = Gio.file_new_for_path(newname)
                        newimg = Eog.Image.new_file(f)
                        # Insert EogListStore
                        store.append_image(newimg)
                        # EogThumbView
                        tv = self.window.get_thumb_view()
                        tv.set_current_image(newimg, True)
                        # Turn the queue
                        while Gtk.events_pending():
                            Gtk.main_iteration()
                        # Remove Image from EogListStore
                        store.remove_image(img)
                        break
                else:
                    # Cancel Button
                    break
        finally:
            d.destroy()

    def messagebox(self, text):
        dlg = Gtk.MessageDialog(
                self.window,
                Gtk.DialogFlags.MODAL,
                Gtk.MessageType.WARNING,
                Gtk.ButtonsType.OK,
                text)
        dlg.set_title("Eye of GNOME")  
        r = dlg.run()  
        dlg.destroy()
        return r

Now, move all of these to ~/.config/eog/plugins/

Pless F2 Key

Enjoy!

Eye of GNOME プラグインはやっぱり面倒

Rename Dialog プラグインはなんとか完成した。
本サイトに eog-plugin 付きのを置いているけどコードも貼っておきます。
日本語が読めないのに海外からコードを探しに来る人もいるって解ったし。
コメントは日本語でいくけど。

#-*- coding:utf-8 -*-

#    Eye of GNOME renamedlg plugin version 1.0.0
#    Copyright © 2009 sasakima-nao <m6579ne998z@gmail.com>
#
#    This program is free software; you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation; either version 2 of the License, or
#    (at your option) any later version.

# Eye of GNOME Documentation
# http://library.gnome.org/devel/eog/stable/index.html

import eog
import gtk
import os
import gio

ui_str = """<ui>
    <menubar name="MainMenu">
        <menu action="Edit">
            <separator/>
            <menuitem action="rename"/>
        </menu>
    </menubar>
</ui>"""

class RenameDlgPlugin(eog.Plugin):
    """
        ダイアログを出しリネームを行うプラグイン
    """
    def __init__(self):
        eog.Plugin.__init__(self)

    def activate(self, window):
        """
            window ポインタをどこかに保存するとプロセスが終了しなくなる
            GtkActionGroup.add_actions でシグナルの user_data でも駄目
            ということで F2 キーとメニューのシグナル処理は別々に作る
        """
        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, "リネーム(_R)", None, "リネーム", None)]
        action_group.add_actions(actions)
        uimanager.insert_action_group(action_group, 0)
        self._ui_id = uimanager.add_ui_from_string(ui_str)
        # 普通にコネクトなら window を user_dataにしても大丈夫
        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)
        accelgroup = uimanager.get_accel_group()
        accelgroup.disconnect_key(gtk.keysyms.F2, 0)
        uimanager.ensure_update()

    def on_acc(self, accelGroup, window, keyval, modifier):
        self.on_rename(None, window)

    def on_rename(self, widget, window):
        #print dir(window)
        if window == None:
            return
        img = window.get_image()
        if img == None:
            return
        fullname = img.get_uri_for_display()[7:]
        path, name = os.path.split(fullname)
        label = gtk.Label(name)
        entry = gtk.Entry()
        entry.set_text(name)
        d = gtk.Dialog( "リネーム",
                        window,
                        gtk.DIALOG_MODAL,
                        (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,
                        gtk.STOCK_OK, gtk.RESPONSE_ACCEPT) )
        try:
            d.vbox.pack_start(label, False)
            d.vbox.pack_start(entry, False)
            d.show_all()
            def dlg_ok(self):
                d.response(gtk.RESPONSE_ACCEPT)
            entry.connect("activate", dlg_ok)
            # 成功かキャンセルまでループ
            while 1:
                if d.run() == gtk.RESPONSE_ACCEPT:
                    text = entry.get_text()
                    if text == name:
                        self.messagebox("変更されていません", window)
                    else:
                        if  text in os.listdir(path):
                            self.messagebox("同一ファイル名が見つかりました", window)
                        else:
                            # EogListStore から削除
                            store = window.get_store()
                            store.remove_image(img)
                            # リネームさせる
                            newname = os.path.join(path, text)
                            os.rename(fullname, newname)
                            # 一応キューを回しておく
                            while gtk.events_pending():
                                gtk.main_iteration()
                            # EogImage として登録
                            f = gio.File(newname)
                            newimg = eog.eog_image_new_file(f)
                            # EogListStore に突っ込む
                            store.append_image(newimg)
                            # EogThumbView に選択させれば EogScrollView に反映
                            tv = window.get_thumb_view()
                            tv.set_current_image(newimg, True)
                            break
                else:
                    break
        finally:
            d.destroy()

    def messagebox(self, text, window):
        dlg = gtk.MessageDialog(window, gtk.DIALOG_MODAL, gtk.MESSAGE_WARNING, 
                                gtk.BUTTONS_OK, text)
        dlg.set_title("Eye of GNOME")  
        r = dlg.run()  
        dlg.destroy()

こうやって貼り付けると「なんだ、簡単なんだ」思われそう。
せっかくなのでコードの整理をする前の一部分を貼り付けておきます。

store = window.get_store()
store.remove_image(img)
newname = os.path.join(path, text)
#
os.rename(fullname, newname)
while gtk.events_pending():
    gtk.main_iteration()
f = gio.File(newname)
newimg = eog.eog_image_new_file(f)
# EogListStore に突っ込む
store.append_image(newimg)
i = store.get_pos_by_image(newimg)
tv = window.get_thumb_view()
tv.set_current_image(newimg, True)
#
#view = window.get_view()
#view.set_image(store.get_image_by_pos(i))
#
# GLocalFile を得てコピーを作る
"""oldimg = img.get_file()
f = gio.File(newname)
print dir(f)"""
#newimg = eog.eog_image_new_file(f)
"""oldimg.copy(f)
newimg = eog.eog_image_new_file(f)
# EogListStore に突っ込む
store = window.get_store()
#i = store.get_pos_by_image(newimg)
store.append_image(newimg)
while gtk.events_pending():
    gtk.main_iteration()
view = window.get_view()
view.set_image(newimg)
store.remove_image(img)
oldimg.remove()"""
#print old
#print dir(old)
"""os.rename(fullname, newname)
while gtk.events_pending():
    gtk.main_iteration()
f = gio.File(newname)
newimg = eog.eog_image_new_file(f)"""
#img.load(newimg, 0)#, (eog.IMAGE_DATA_IMAGE, eog.IMAGE_DATA_DIMENSION))#, None, None)
#view = window.get_view()
#view.set_image(newimg)
"""store = window.get_store()
store.append_image(newimg)
v = window.get_thumb_view()
v.set_current_image(i, True)"""

とにかく情報らしい情報が無いも同然だから自力で漁ったのよこの方法。
eog のソースに eog_window_display_image なんて関数があるが外部提供されていないし。
これ以上書くと愚痴になるのでおしまい。

しかしこれで Eye of GNOME への不満は私的には解消だ、他を探す必要もない。
プラグインを作るって面白いよ、アプリは探すものではなく作ったり改造したりするものだ。

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

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