g_file_trash ってのがあった

何を今頃気がついた。
Eye of GNOME って Delete キーで「ゴミ箱へ移動」ができるんだね。

sakura241

これは…早速ソースコードを拝ませてもらわなきゃ、ダウンロード。
このポイントだけ知りたいんだから GPL 関係は大丈夫だろう。
というか Y901x はオープンソースだし。

Eye of GNOME

とにかく g_file_trash なんていう関数を使えばいいと解った。
しかしスゲェ、ゴミ箱に入れられるかどうかチェックして g_file_delete と振り分けている。
標準アプリはやはりこういう部分をキチンと考えて作っているんだなと関心する。

コレってやはり Gnome てか Nautilus に依存するのかな?
でもそんなの関係ねぇ(古い…最近マジでテレビ見ないし
つーか Y901x は D&D 処理自体から Nautilus に依存だ、わっはっはシラネ!

それよりこれって Python バインディングではどう書くのだ?
海外を探してもなーんにも見つからないんだが。

思いつくかぎりのワードで探して gio なんてモジュールがあると解った。
後は dir(gio) で gio.File を見つける、どうやらコレっぽい。

gio

あぁやっと見つかった。
何かもの凄い無駄なことをしているような気がしなくもないが私はいつもこんなだ。
ということで実験で書いてみたコード。

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

import gtk
import gio
import urllib
import os.path

class TrashWin(gtk.Window):
    """
        ドロップされたファイルをゴミ箱に捨てる
    """
    def __init__(self):
        gtk.Window.__init__(self)
        # D&D の準備
        dnd_list = [("text/uri-list", 0, 0)]
        self.drag_dest_set( gtk.DEST_DEFAULT_MOTION |
                            gtk.DEST_DEFAULT_HIGHLIGHT |
                            gtk.DEST_DEFAULT_DROP,
                            dnd_list, gtk.gdk.ACTION_MOVE )
        self.connect("drag_data_received", self.on_drop)
        # いつもの処理
        self.connect("delete-event", gtk.main_quit)
        self.resize(320, 150)
        self.show_all()

    def on_drop(self, widget, context, x, y, selection_data, info, time):
        drops = selection_data.data.split("\n")
        for drop in drops:
            name = urllib.unquote(drop)[7:-1]
            if os.path.isfile(name):
                # ゴミ箱へ Go!
                obj = gio.File(name)
                obj.trash()

if __name__ == "__main__":
    w = TrashWin()
    gtk.main()

こんなにアッサリ作れてしまった…例外や失敗の処理無しならたったの二行。
trash メソッドの引数は不要みたい、成功すると True が帰ってくる。

つーことで早速 Y901x に入れて更新!
ボタンも真似させてもらった、set_default_response で OK ボタンが選択できるのね。