デスクトップに置く

作成者: BlinkGTK Project
バージョン: 1.2.0-build2

アプリが動いたら、次はアプリらしく置く段です。アプリ一覧に出す、アイコンを
付ける、ソフトウェアセンターに載せる — このページはその手順です。

BlinkGTK 固有の話は多くありません。GTK4 アプリとして普通のことをするだけです。
そのため、仕様そのものは freedesktop.org と GNOME の一次情報へ誘導し、ここでは
BlinkGTK を使うときに気をつける点を中心に書きます。

アプリ ID を決める

最初に決めるのがこれです。逆ドメイン形式にします。

org.example.MyReader

この ID を、以下すべてで同じ文字列として使います。

使う場所
.desktop ファイル名 org.example.MyReader.desktop
AppStream ファイル名 org.example.MyReader.metainfo.xml
アイコンファイル名 org.example.MyReader.svg
GtkApplication の ID gtk_application_new("org.example.MyReader", ...)

揃っていないとアイコンが出ません。 デスクトップ環境は、ウィンドウとアイコンを
この ID で結び付けます。

アプリ一覧に出す (.desktop)

/usr/share/applications/org.example.MyReader.desktop に置きます。

[Desktop Entry]
Type=Application
Name=My Reader
Name[ja]=マイリーダー
Comment=An e-book reader
Comment[ja]=電子書籍リーダー
Exec=/usr/bin/my-reader %f
Icon=org.example.MyReader
Categories=Office;Viewer;
MimeType=application/epub+zip;
Terminal=false

Icon= には拡張子もパスも書きません。アプリ ID をそのまま書きます。

書式の詳細は
Desktop Entry Specification
が正本です。

置いたら索引を更新します。

sudo update-desktop-database /usr/share/applications

アイコンを置く

hicolor テーマに、アプリ ID の名前で置きます。SVG が 1 枚あれば足ります。

/usr/share/icons/hicolor/scalable/apps/org.example.MyReader.svg

PNG も併せて置く場合はサイズごとのディレクトリへ。

/usr/share/icons/hicolor/48x48/apps/org.example.MyReader.png
/usr/share/icons/hicolor/256x256/apps/org.example.MyReader.png

キャッシュを更新します。

sudo gtk4-update-icon-cache /usr/share/icons/hicolor

ソフトウェアセンターに載せる (AppStream)

/usr/share/metainfo/org.example.MyReader.metainfo.xml に置きます。

<?xml version="1.0" encoding="UTF-8"?>
<component type="desktop-application">
  <id>org.example.MyReader</id>
  <name>My Reader</name>
  <summary>An e-book reader</summary>
  <metadata_license>CC0-1.0</metadata_license>
  <project_license>MIT</project_license>
  <description>
    <p>Reads EPUB 3 with vertical Japanese typesetting.</p>
  </description>
  <launchable type="desktop-id">org.example.MyReader.desktop</launchable>
  <screenshots>
    <screenshot type="default">
      <image>https://example.org/screenshot.png</image>
    </screenshot>
  </screenshots>
  <releases>
    <release version="1.0.0" date="2026-08-05"/>
  </releases>
</component>

書式の検証ができます。

appstreamcli validate /usr/share/metainfo/org.example.MyReader.metainfo.xml

仕様は AppStream が正本です。

ファイルを関連付ける

.desktopMimeType= に書いたうえで、独自形式なら MIME 型そのものを登録します。

<!-- /usr/share/mime/packages/org.example.MyReader.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
  <mime-type type="application/x-myreader-book">
    <comment>My Reader book</comment>
    <glob pattern="*.mrb"/>
  </mime-type>
</mime-info>
sudo update-mime-database /usr/share/mime

EPUB のような既存の型なら、登録は要りません。MimeType=application/epub+zip;
と書くだけです。


BlinkGTK を使うときに気をつける点

ここからが本題です。

Wayland 専用であることを書く

BlinkGTK は Wayland でのみ動きます。X11 セッションでは起動しません。

.desktop から起動された場合、利用者には「クリックしたのに何も起きない」と
しか見えません。AppStream の <description> に動作環境を明記しておくと、
入れる前に気づいてもらえます。

<p>Requires a Wayland session. Does not run on X11.</p>

起動スクリプトで確かめて、分かる形で終わらせるのも手です。

#!/bin/sh
if [ -z "$WAYLAND_DISPLAY" ]; then
  echo "This application requires a Wayland session." >&2
  exit 1
fi
exec /usr/libexec/my-reader "$@"

リソースの場所を実行ファイルから決める

BlinkGTK は Chromium のリソース (icudtl.dat / .pak / V8 スナップショット) を
必要とします。.desktop から起動されると カレントディレクトリが不定なので、
相対パスに頼ると見つかりません。

/* 実行ファイルの位置から決める。カレントディレクトリに頼らない */
blink_gtk_set_resources_path("/usr/lib64/my-reader");
blink_gtk_set_icu_data_path("/usr/lib64/my-reader");

端末から動いていたアプリが .desktop 経由だと起動しない、という場合は
まずここを疑ってください

単一インスタンスにするなら

GtkApplication の単一インスタンス機能を使う場合、メインループの扱いに
注意が要ります
g_application_run() は Chromium 側のループを回さないため、
それだけでは画面が出ません。

書き方は アプリに組み込む にあります。

起動が速く見えるようにする

BlinkGTK は起動時に Chromium のプロセス群を立ち上げるため、最初の 1 秒ほどは
何も出ません
.desktop に次を書くと、デスクトップ環境が起動中であることを
利用者に示してくれます。

StartupNotify=true
StartupWMClass=org.example.MyReader

StartupWMClass は、ウィンドウとアイコンを結び付けるためにも要ります。
タスクバーのアイコンが既定のものになる場合は、ここが合っていません。


確認する

置いたあと、こう確かめられます。

# .desktop の書式
desktop-file-validate /usr/share/applications/org.example.MyReader.desktop

# AppStream の書式
appstreamcli validate /usr/share/metainfo/org.example.MyReader.metainfo.xml

# アイコンが引けるか
gtk4-query-settings 2>/dev/null || true
python3 -c "
import gi; gi.require_version('Gtk','4.0')
from gi.repository import Gtk, Gdk
Gtk.init()
t = Gtk.IconTheme.get_for_display(Gdk.Display.get_default())
print('見つかりました' if t.has_icon('org.example.MyReader') else '見つかりません')"

パッケージに入れる

RPM / DEB を作る場合、上記 4 つを配置します。

/usr/share/applications/org.example.MyReader.desktop
/usr/share/icons/hicolor/scalable/apps/org.example.MyReader.svg
/usr/share/metainfo/org.example.MyReader.metainfo.xml
/usr/share/mime/packages/org.example.MyReader.xml   (独自形式のみ)

索引の更新はパッケージマネージャが自動で行うため、%post に書く必要は
通常ありません。

関連