作成者: BlinkGTK Project
バージョン: 1.2.0-build2
アプリが動いたら、次はアプリらしく置く段です。アプリ一覧に出す、アイコンを
付ける、ソフトウェアセンターに載せる — このページはその手順です。
BlinkGTK 固有の話は多くありません。GTK4
アプリとして普通のことをするだけです。
そのため、仕様そのものは freedesktop.org と GNOME
の一次情報へ誘導し、ここでは
BlinkGTK を使うときに気をつける点を中心に書きます。
最初に決めるのがこれです。逆ドメイン形式にします。
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 で結び付けます。
/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=falseIcon=
には拡張子もパスも書きません。アプリ ID
をそのまま書きます。
書式の詳細は
Desktop
Entry Specification
が正本です。
置いたら索引を更新します。
sudo update-desktop-database /usr/share/applicationshicolor テーマに、アプリ 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/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 が正本です。
.desktop の MimeType=
に書いたうえで、独自形式なら 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/mimeEPUB
のような既存の型なら、登録は要りません。MimeType=application/epub+zip;
と書くだけです。
ここからが本題です。
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.MyReaderStartupWMClass
は、ウィンドウとアイコンを結び付けるためにも要ります。
タスクバーのアイコンが既定のものになる場合は、ここが合っていません。
置いたあと、こう確かめられます。
# .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
に書く必要は
通常ありません。