LoginSignup
2
4

More than 3 years have passed since last update.

GTK+プログラミングやってみる

Last updated at Posted at 2019-11-04

GTK+プログラミングやってみる

着手しはじめた、QEMUのコードリーディングだったのだが
いざ読み始めてたり、調べたりすると
イベントループ処理の流れを理解するにはGLibの動作を知る必要がありそうだということが分かった。

GLib

出典: フリー百科事典『ウィキペディア(Wikipedia)』

GLib とは、C言語で書かれたクロスプラットフォームのユーティリティライブラリの一種である。
【GTK+プロジェクトの一部】としてスタートしたが、現在では他のアプリケーションでも使われている。
当初は低レベルなコードを入れるためのライブラリとされていたが、現在ではプラットフォーム間の差異を吸収する機能も加えられ、
異なるCPU、OS間でのアプリケーションの移植性を確保するライブラリとしても利用されている。

Glibは、GTK+の一部とのこと
で、GTK+というのは
GUI アプリケーションを作成するためのツールキット(ライブラリ)のひとつ
もともとは GIMP という画像編集ソフトを作成するために開発されたとのこと

GTK+はQtと並んで、Linuxの標準的なGUIツールキットのようだ
ざっとヘルプとか見るとWindowsでいうなら、MFCに近い感じかな。

GUIプログラミングはもっぱらWindows畑で育ったので、LinuxのGUIプログラミングは全くの未経験
ちょっと寄り道になるけど、GTK+を少し触ってみるっていうのが本記事

利用環境

CentOS Linux release 7.7.1908 (Core)
gtk2-devel-2.24.31-1.el7.x86_64

GTK+のCentOSへのインストール

CentOS でGTK 2 パッケージがインストールされているか確認する方法
rpm -q gtk2
rpm -q gtk2-devel

gtk2-devel は入って無かった
image.png
image.png

そこで、gtk2-devel のインストール(yumにて)
~~~bash
yum install gtk2-devel
~~~

image.png

ちょんプロ (HELLO SKKS)

HelloGTK2.c
#include <gtk/gtk.h>

static void destroy(GtkWidget *window, gpointer data)
{
    /*  メインループを終了  */
    gtk_main_quit();
}

int main(int argc, char *argv[])
{
    GtkWidget *window, *label;

    /*  GTK+ の初期化  */
    gtk_init(&argc, &argv);

    /*  ウィンドウ(GtkWindow) の作成  */
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

    /*  ウィンドウの初期設定  */
    gtk_window_set_title(GTK_WINDOW(window), "SKKS");  //  title
    gtk_widget_set_size_request(window, 200, 100);      //  window size

    /*  ウィンドウが消去されたときのコールバック関数を設定  */
    g_signal_connect(G_OBJECT(window), "destroy",
                     G_CALLBACK(destroy), NULL);

    /*  ラベル(GtkLabel) の作成  */
    label = gtk_label_new("Hello, SKKS!");

    /*  ラベルをウィンドウに追加  */
    gtk_container_add(GTK_CONTAINER(window), label);

    /*  ウィンドウを表示  */
    gtk_widget_show_all(window);

    /*  メインループ  */
    gtk_main();

    return 0;
}

コンパイル

gcc -Wall -o hello HelloGTK2.c `pkg-config --cflags --libs gtk+-2.0`

Linux畑の人には常識かも知れませんが、調べたのでメモ
シェルスクリプトの中で,コマンドを `(グレイヴアクセント,アクサングラベ,shft+@)で括ると,その部分がそのコマンドの実行結果で置き換わる.
つまり、gtk+2.0に必要な、 -I や -L などをpkg-configコマンドで生み出している
では、pkg-configとは?
以下はWikipediaより

pkg-configは、環境変数PKG_CONFIG_PATHのパスに存在する *.pc ファイルに記録された情報を元に、ビルドの際に必要な文字列を返す。
例えば、libaaa.soを /usr/local/lib/aaa/ 以下に保存し、ヘッダファイルを /usr/local/include/aaa/ 以下にインストールした場合
libaaa.so を利用したソースをコンパイルする際に、コンパイラへlibとincludeのパス等を指定する必要があるが、
そのパスが環境ごとに異なる場合を考えると必ずしも gcc -I/usr/local/lib/include -o a.c -L/usr/local/lib/aaa -laaa が成立するとは限らない。
もしもlibaaa が aaa.pc を提供していれば、
pkg-config aaa --cflags
で文字列 -I /usr/local/lib/aaa を得られ、
pkg-config aaa --libs
で文字列 -L /usr/local/lib/aaa -laaa を得られる

実行結果

CentOSのデスクトップに入って、ダブルクリック
image.png

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4