とあるアプリに表示されているリンクを選択すると、標準のウェブブラウザが開いてリンク先を表示する。当たり前の動作だが、その時にすでに存在すれば既存のブラウザを利用するようになっている。
- ブラウザが開いていない場合: ブラウザを起動して URL を表示する。
- すでにブラウザが開いている場合: 既存のブラウザを前面に出して URL を表示する。
Ubuntu でこの仕組がどのように実現されているのか調べてみた。
まず、「ブラウザ以外のとある画面に表示されているリンクを選択すると、標準のウェブブラウザが開いてリンク先を表示する。」を実現するために Linux では xdg-open というコマンドラインツールがある。github を開くには次のようにする。
$ xdg-open https://github.com
mime-type とデフォルトアプリの対応は /usr/share/applications/defaults.list に記述されている。ただどうやらこれは歴史の名残で、仕様では mimeapps.list を使うべきらしい。
デフォルトアプリを問い合わせる xdg-mime
コマンドで確認と登録削除が出来る。text/html のデフォルトアプリを調べてみる。
$ xdg-mime query default text/html
firefox.desktop
という事で、text/html は firefox.desktop に関連付けられている。このファイルは /usr/share/applications/firefox.desktop に存在していて、firefox が開く事が出来る mime type を宣言している。
firefox.desktop のセクション [Desktop Entry] に Exec=firefox %u
という記述があるが、ここで %u は URL を表す。結果的に firefox https://github.com
が呼び出される。
/usr/bin/firefox はシェルスクリプトで、結果 /usr/lib/firefox/firefox を呼び出す。
結局 /usr/lib/firefox/firefox の中ですでにプロセスが立ち上がっていれば既存のプロセスに URL を渡しているようだ。プロセスをシングルトンにする方法は https://stackoverflow.com/questions/5339200/how-to-create-a-single-instance-application-in-c-or-c 等いくつか見つかったが、URL を渡す方法は良くわからなかった。