D-Bus Application Launch

gnome-weather は Gjs 製。
その desktop ファイルの名前。

org.gnome.Weather.Application.desktop

これだけでも変だけど、その Exec キー。

gapplication launch org.gnome.Weather.Application

何ですかコレ?

/usr/share に org.gnome.Weather ディレクトリがある。
その中に org.gnome.Weather.Application ファイルがある。
中身は Gjs である、シバンがあるので Gjs で起動できるのは解る。

肝心の JavaScript ソースは同一ディレクトリでバイナリ化されている。
ワカガワカラナイヨ、こんなの見たことがない。

色々検索してみると、どうも DBus 関連らしい。
HowDoI/DBusApplicationLaunching – GNOME Wiki!
コレみたいだが全然ワカランぞ!

Gjs 関連は後日思い立ったら調べるとして。
とりあえず gapplication コマンドは何をしているかを試してみる。

gapplication launch org.gnome.Documents

gapp

普通に起動できるんだね、list-apps で表示されるもの以外に

/usr/share/dbus-1/services

にあるサービスなら何でも起動できるようです。
中身は普通の ini ファイルなんですけど。

ならばこんなディレクトリを作り、念の為再ログイン。

~/.local/share/dbus-1/services

org.madoka.Magika.service という名前で以下のファイルを。
残念ながら ~ や $HOME は使えないのでフルパスで。

[D-BUS Service]
Name=org.madoka.Magika
Exec=/home/sasakima-nao/test.py  --gapplication-service

起動するファイル、上記 Exec の指定位置に保存。
+x パーミッションを忘れずに。

#!/usr/bin/env python3

import sys
from gi.repository import Gtk, Gio

class App(Gtk.Application):
    """
        org.madoka.Magika App
    """
    def __init__(self):
        Gtk.Application.__init__(
                self,
                application_id="org.madoka.Magika",
                flags=Gio.ApplicationFlags.FLAGS_NONE )
 
    def do_activate(self):
        self._win = Gtk.ApplicationWindow.new(self)
        self._win.set_title(self.props.application_id)
        self._win.show()

app = App()
app.run(sys.argv)

さあどうだ。

gapplication launch org.madoka.Magika

dbus_launch

なるほど、あのコマンドで実行できる仕組みはコレか。

コマンドの処理が戻ってきているから最初から転送扱いみたい。
application_id が一致しないと起動はできるけど終了しない。
–gapplication-service 引数を書かないと何故か2つ起動する

ここまで解ったけど使わないかも。
セッションバスに追加されるようなので何か思いついたらne!