Xdg-utils

Xdg-utils は代表的なデスクトップ環境に対応しており、このツールを使えば異なる環境でもデスクトップ関連の操作を同じインターフェイスで扱うことができる。

Xdg-utils にはインストールに関連したツールの他にも以下のツールが含まれている。

  • xdg-open
  • xdg-email
  • xdg-screensaver

これらのコマンドの実体はシェルスクリプトであり、それぞれのコマンドの役割は上から順に

となっている。バージョン1.0.2の場合、内部で使われているコマンドは次の通りである。

Xdg-utils KDE GNOME Xfce
xdg-open kfmclient exec gnome-open exo-open
xdg-email kmailservice gnome-open exo-open
xdg-screensaver dcop kdesktop KScreensaverIface gnome-screensaver-command

ただし、スクリーンセーバーに関しては、KDEGNOME 環境ではない場合、xscreensaver-command がインストールされていれば、xscreensaver-command が使われる。

Xdg-utils では環境変数に応じて、使われているデスクトップ環境が検出される。具体的には

  1. KDE_FULL_SESSION が true ならば KDE
  2. GNOME_DESKTOP_SESSION_ID が設定されていれば GNOME
  3. xprop -root _DT_SAVE_MODE から得られた出力の最後が「 = "xfce4"」になっていたら Xfce

と判定している。この検出結果に基づいて上記の表におけるコマンドの中から適切なものが使われる。ただし、dcop は KDE3 までのコマンドであり、KDE4環境ではうまく動作しないかもしれない。

なお、kfmclient exec に似た KDE のコマンドとして kde-open がある。

Xdg-utils のコマンドの中には OpenSUSE10.0に対する workaround なども含まれるため、 Xdg-utils が使える環境では、直接 kfmclient や gnome-open を呼ぶよりもこれらのコマンドを使った方がよい。

基本的な使い方は以下の通りである。

xdg-open の場合

$ xdg-open 開くファイルまたは URL

例えば

$ xdg-open ~/foo.txt
$ xdg-open http://example.com/

xdg-email の場合

$ xdg-email 宛先のメールアドレスまたは URI

例えば

$ xdg-email foo@example.com
$ xdg-email mailto:foo@example.com

この Xdg-Utils を使っているライブラリに Qt がある。Qt 4.4.1 の QDesktopServices クラスの openUrl() では

  • 引数で与えた URL のスキームが file ならば openDocument()
  • それ以外ならば launchWebBrowser()

を呼んでいる。X11 版ならば、二つの関数の実装は qdesktopservices_x11.cpp で行われている。

URL の検証後は、以下のように処理される。

ドキュメントの場合は

  1. xdg-open を実行
  2. 失敗したら
  3. 失敗したら、メジャーなブラウザを起動

ドキュメント以外の場合は

  1. スキームが mailto の場合はドキュメントのときと同じ処理をする
  2. xdg-open を実行
  3. 失敗したら、環境変数 DEFAULT_BROWSER に指定されているブラウザを起動する
  4. 失敗したら、環境変数 BROWSER に指定されているブラウザを起動する
  5. 失敗したら
  6. 失敗したら、メジャーなブラウザを起動

となる。

つまり、Xdg-utils がインストールされていれば xdg-open で URL が開くことになる。