試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

PyGTKでファイルマネージャからファイルアイコンをドラッグ・アンド・ドロップを受け取る(ファイルマネージャや環境による挙動の違いについて)

PyGTKでファイルマネージャからファイルアイコンをドラッグ・アンド・ドロップを受け取る(概要と簡単な例)」の続き。前回の記事の最後に貼り付けたコードを実行し、GUIファイルマネージャからファイルやディレクトリのアイコンをD&Dして、端末に表示される情報を比較してみる。

以下、ディレクト/tmp/work/

  • ディレクトdir
  • ファイルtest.txt
  • ファイルs p a c e.txt(途中に4回半角スペースを入れている)
  • ファイル日本語.txt

を用意して、これらをまとめてウィンドウにD&Dしている。
表示しているのは「drag_data_received」シグナルのハンドラに渡される引数と、引数contextの一部メンバ変数、引数selectionのメンバ変数dataとなる。
xとyはドロップしたウィンドウ内の座標となっていて、infoはgtk.Widgetdrag_dest_set()の中で指定するリストの中の値と同一のもの(今回のコードでは12345という値)が入っている。

GNU/Linux上のPyGTK

Nautilus
context: <gtk.gdk.DragContext object at 0x1596b90 (GdkDragContext at 0x169d070)>
x: 66
y: 124
selection: <GtkSelectionData at 0x7ffff2517600>
info: 12345
time: 361691165
action: <flags GDK_ACTION_COPY of type GdkDragAction>
actions: <flags GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK | GDK_ACTION_ASK of type GdkDragAction>
suggested_action: <flags GDK_ACTION_COPY of type GdkDragAction>
targets: ['x-special/gnome-icon-list', 'text/uri-list', 'UTF8_STRING', 'COMPOUND_TEXT', 'TEXT', 'STRING', 'text/plain;charset=utf-8', 'text/plain']
selection.data: [file:///tmp/work/dir
file:///tmp/work/%E6%97%A5%E6%9C%AC%E8%AA%9E.txt
file:///tmp/work/s%20p%20a%20c%20e.txt
file:///tmp/work/test.txt
]

selection.dataではファイル名はURLエンコードされ、各ファイルの場所は「file://[ファイルの絶対パス]」の形で示されている。

xffm4
context: <gtk.gdk.DragContext object at 0x1596b90 (GdkDragContext at 0x169d230)>
x: 30
y: 68
selection: <GtkSelectionData at 0x7ffff2517600>
info: 12345
time: 361723502
action: <flags GDK_ACTION_COPY of type GdkDragAction>
actions: <flags GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK of type GdkDragAction>
suggested_action: <flags GDK_ACTION_COPY of type GdkDragAction>
targets: ['text/uri-list', 'text/x-moz-url', 'text/plain', 'UTF8_STRING', 'STRING']
selection.data: [file:/tmp/work/test.txt
file:/tmp/work/日本語.txt
file:/tmp/work/dir
file:/tmp/work/s p a c e.txt
]

selection.dataではファイル名はURLエンコードされていなかった。各ファイルの場所は「file:[ファイルの絶対パス]」の形で示されている。

Wine上のWindows版PyGTK

Windows版PyGTKをWine環境にインストール」と「Wine環境にWindows版のPyGTKをインストールする作業を自動化」で環境を作成したWindows版PyGTKではファイルの場所が「file:///[ドライブ]:[ファイルの絶対パス]」となっている。
場合によってはファイルのパスが変な切れ方をしてしまうが、これはWine上での問題かもしれない。
(2009/3/21)Wine上のD&Dには
http://wiki.winehq.org/DragAndDrop
によると幾つかの種類があり、PyGTKアプリケーションへのドロップは動作するが、他の種類では動作しないもの(Windowsアプリケーションどうしなど)もあるようだ。

Nautilus
context: <gtk.gdk.DragContext object at 0xb55378 (GdkDragContext at 0x1acb00)>
x: 281
y: 239
selection: <GtkSelectionData at 0x41f64c>
info: 12345
time: 153150
action: <flags 0 of type GdkDragAction>
actions: <flags GDK_ACTION_COPY of type GdkDragAction>
suggested_action: <flags GDK_ACTION_COPY of type GdkDragAction>
targets: ['text/uri-list']
selection.data: [file:///Z:/tmp/work/dir
file:///Z:/tmp/work/%E6%97%A5%E6%9C%AC%E8%AA%9E.tZ:/tmp/work/s%20p%20a%20c%20e.txt
file:///Z:/tmp/work/test.txt
]
xffm4
context: <gtk.gdk.DragContext object at 0xb55378 (GdkDragContext at 0x1acb38)>
x: 285
y: 244
selection: <GtkSelectionData at 0x41f64c>
info: 12345
time: 280784
action: <flags 0 of type GdkDragAction>
actions: <flags GDK_ACTION_COPY of type GdkDragAction>
suggested_action: <flags GDK_ACTION_COPY of type GdkDragAction>
targets: ['text/uri-list']
selection.data: [file:///Z:/tmp/work/test.txt
file:///Z:/tmp/work/%E6%97%A5%E6%9C%AC%E8%AA%9E.tZ:/tmp/work/dir
file:///Z:/tmp/work/s%20p%20a%20c%20e.txt
]

関連記事:

使用したバージョン:

  • Nautilus 2.24.0
  • xffm 4.5.0
  • (GNU/Linux上のPyGTK) Python 2.5.2 / PyGTK 2.13.0
  • (Wine上のWin32版PyGTK) Python 2.6.1 / PyGTK 2.12.1
  • Wine 1.1.16