2020-12-21

GTK4 を触ってみた

12月16日に GTK 4.0 が公開をされました。GTK は C 言語で記述されたクロスプラットフォーム対応の GUI ツールキットです。最近は GTK を使って直接コンパイルすることをしなくなってしまいましたが、いまどきの GTK を知りたくなり、簡単なプログラムをコンパイルしてみました。

本ブログ記事では下記の OS 環境で動作確認をしています。

Fedora 33 (Workstation Edition) x86_64

GTK4 のパッケージをインストール

dnf コマンドで gtk4 を検索キーにしてパッケージを検索すると下記のように該当パッケージ一覧が表示されます。

[bitwalk@fedora-pc ~]$ dnf search gtk4
...
============================= 名前 完全一致: gtk4 ==============================
gtk4.i686 : GTK graphical user interface library
gtk4.x86_64 : GTK graphical user interface library
=============================== 名前 一致: gtk4 ================================
gtk4-devel.i686 : Development files for GTK
gtk4-devel.x86_64 : Development files for GTK
libproxy-webkitgtk4.x86_64 : Plugin for libproxy and webkitgtk3
[bitwalk@fedora-pc ~]$ 

バージョンを確認すると 3.99.4 で、さすがにまだ 4.0 になっていませんでしたが、ほぼ同等と考えてインストールすることにしました。GTK のマイナーバージョンの番号が .90 以降は、次のメジャーバージョンへの開発バージョンという扱いになります [3]

[bitwalk@fedora-pc ~]$ dnf list gtk4
...
利用可能なパッケージ
gtk4.i686                          3.99.4-1.fc33                         updates
gtk4.x86_64                        3.99.4-1.fc33                         updates
[bitwalk@fedora-pc ~]$ 

下記のようにインストールしました。

[bitwalk@fedora-pc ~]$ sudo dnf install gtk4-devel
...
依存関係が解決しました。
================================================================================
 パッケージ            Arch          バージョン            リポジトリー   サイズ
================================================================================
インストール:
 gtk4-devel            x86_64        3.99.4-1.fc33         updates         12 M
依存関係のインストール:
 graphene-devel        x86_64        1.10.2-4.fc33         fedora         157 k
 gtk4                  x86_64        3.99.4-1.fc33         updates        4.8 M

トランザクションの概要
================================================================================
インストール  3 パッケージ

ダウンロードサイズの合計: 17 M
インストール後のサイズ: 62 M
これでよろしいですか? [y/N]: y
パッケージのダウンロード:
(1/3): graphene-devel-1.10.2-4.fc33.x86_64.rpm  915 kB/s | 157 kB     00:00    
(2/3): gtk4-3.99.4-1.fc33.x86_64.rpm             10 MB/s | 4.8 MB     00:00    
(3/3): gtk4-devel-3.99.4-1.fc33.x86_64.rpm      1.9 MB/s |  12 MB     00:06    
--------------------------------------------------------------------------------
合計                                            2.1 MB/s |  17 MB     00:07     
...
(途中省略)
...

完了しました!
[bitwalk@fedora-pc ~]$ 

なお、GTK を利用したプログラムをコンパイルするにあたって、C コンパイラ (gcc) がインストールされていることを前提にしています。

Hello World プログラムをコンパイル

GTK プロジェクトの下記サイトに紹介されている Hello World のプログラムをビルドします。

念の為、下記にソースコード表示しました。なお、astyle で整形しています。

hello-world-gtk.c

hello-world-gtk.c について

hello-world-gtk.c は以下の構成になっています。

  • main() 関数
    • main() 関数で GtkApplication のインスタンスが作成され、gtk_application_new() を使って初期化されます。
    • activate シグナルを main() 関数の上にある activate() 関数に接続します。
    • g_application_run 内で activate() 関数へシグナルが送信され、アプリケーションの activate() 関数に進みます。
    • activate() 関数
      • gtk_application_window_new() 関数は新しい GtkApplicationWindow インスタンスを作成します。
      • gtk_window_set_title() 関数を使ってウィンドウのタイトルを設定します。ただし GTK_WINDOW() マクロを使ってウィンドウをキャストしなければなりません。
      • gtk_window_set_default_size() 関数でウィンドウのサイズを設定します。
      • ボタンの追加
        • gtk_button_new_with_label() 関数でボタンを初期化します。
        • g_signal_connect を使って、print_hello() 関数に接続し、ボタンがクリックされると GTK がこの関数を呼び出すようにしています。
        • print_hello() 関数
          • "Hello World" という文字列を引数にして g_print() 函数を呼び出します。
        • gtk_window_set_child() 関数でボタンをウィンドウに追加します。
      • gtk_window_present() 関数でウィンドウを表示します。
    • ウィンドウ右上の X をクリックするなどしてウィンドウを終了すると、g_application_run() 関数は status に保存された数値を返します。
    • その後、GtkApplication オブジェクトは g_object_unref() 関数によってメモリから解放されます。
    • 最後に status の整数値が OS に返され、GTK アプリケーションは終了します。

pkgconf

上記 Getting Started では、Hello World のプログラムをコンパイル(ビルド)する際に pkg-config を利用しています。pkg-config は、使用するライブラリのビルドに必要な情報が記載された .pc ファイルを読み込んで、ビルドに必要な文字列を返すプログラムです。

Fedora を含む Red Hat 系の OS では、オリジナルの pkg-config ではなく、pkgconf [4] を採用しています。pkg-config というコマンド名、コマンドレベルでの操作、コマンドの実行結果はどちらも同じです。

下記のように backticks(バッククォート)` で囲んで pkg-config のコマンドを実行します。

$ gcc `pkg-config aaa --cflags --libs` aaa.c

コンパイル

上記 Getting Started に従って、下記のようにコンパイルします。

[bitwalk@fedora-pc hello-world-gtk]$ gcc -o hello-world-gtk hello-world-gtk.c `pkg-config --cflags --libs gtk4`
次のファイルから読み込み:  /usr/include/gtk-4.0/gdk/gdk.h:76,
         次から読み込み:  /usr/include/gtk-4.0/gtk/gtk.h:31,
         次から読み込み:  hello-world-gtk.c:1:
/usr/include/gtk-4.0/gdk/gdkvulkancontext.h:32:10: 致命的エラー: vulkan/vulkan.h: そのようなファイルやディレクトリはありません
   32 | #include <vulkan/vulkan.h>
      |          ^~~~~~~~~~~~~~~~~
コンパイルを停止しました。
[bitwalk@fedora-pc hello-world-gtk]$

「vulkan/vulkan.h: そのようなファイルやディレクトリはありません」というエラーが出たので、不足分をインストールします。

[bitwalk@fedora-pc hello-world-gtk]$ sudo dnf install vulkan-headers
...
================================================================================
 パッケージ           Arch         バージョン                リポジトリー サイズ
================================================================================
インストール:
 vulkan-headers       noarch       1.2.148.0-1.fc33          fedora       532 k

トランザクションの概要
================================================================================
インストール  1 パッケージ

ダウンロードサイズの合計: 532 k
インストール後のサイズ: 8.2 M
これでよろしいですか? [y/N]: y
パッケージのダウンロード:
...
(途中省略)
...

完了しました!
[bitwalk@fedora-pc hello-world-gtk]$

再びコンパイルします。

[bitwalk@fedora-pc hello-world-gtk]$ gcc -o hello-world-gtk hello-world-gtk.c `pkg-config --cflags --libs gtk4`
[bitwalk@fedora-pc hello-world-gtk]$ ls
hello-world-gtk  hello-world-gtk.c
[bitwalk@fedora-pc hello-world-gtk]$ ./hello-world-gtk
Hello World
[bitwalk@fedora-pc hello-world-gtk]$ 
hello-world-gtk の実行例

この Hello World プログラムをビルドした限りでは、従来の GTK との違いが全く判りません。GTK 4.0 がリリースされたのを機会に簡単なサンプルを試してみる予定です。

参考サイト

  1. GTK 4.0 – GTK Development Blog [2020-12-16]
  2. 「GTK 4」が公開、メディア再生サポートなどが加わる | OSDN Magazine [2020-12-17]
  3. Versioning and long term stability promise in GTK+ – GTK Development Blog [2016-09-01]
  4. pkgconf/pkgconf: package compiler and linker metadata toolkit

 

ブログランキング・にほんブログ村へにほんブログ村

0 件のコメント: