GTK   はじめの一歩

ホーム   C/C++チュートリアル

はじめの一歩


次のコードを、お好きなエディタで記述して、hello.c という名前でお好きな場所に保存してください。Windowsの場合は、C:¥msys64¥home¥ユーザー名 に保存するのが便利です。


hello.c


#include <gtk/gtk.h>

int main(int argc, char *argv[])
{
    GtkWidget * window;
    
    gtk_init(&argc, &argv);
    
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window), "Hello");
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
    
    gtk_widget_show(window);
    gtk_main();
    return 0;
}
    


コンパイル

  1. コードファイルの記述が終わりましたら、ソースコードを機械語に変える コンパイルという作業が必要です。
  2. ターミナルもしくはMSYS2を起動して、 hello.cを保存したディレクトリに移動してください。
  3. Windowsの場合に、C:¥msys64¥home¥ユーザー名 に保存した場合は、MSYS2 を起動した画面が、 hello.c を保存した場所になります。
  4. GTK3でコンパイルする場合は、次のコマンドを使います。 どのプラットフォームでも同じです
  5. gcc hello.c `pkg-config --cflags --libs gtk+-3.0`
  6. GTK2では次のコマンドを使います。最後の3.0 が 2.0 に変わるだけです。
  7. gcc hello.c `pkg-config --cflags --libs gtk+-2.0`
  8. macOS の GTK2 の場合は、多数の警告(warning)が表示されますが、 エラーがない限りはコンパイルは成功しています。
  9. コンパイルに成功すると、macOSとLinuxでは a.out、Windowsでは a.exe という実行ファイルが作成されます。
  10. 実行ファイルを特定の名前にしたい場合は、コンパイル時に -o オプションをつけて 次のようにします。
  11. gcc hello.c `pkg-config --cflags --libs gtk+-3.0` -o Hello
  12. macOSとLinuxでは Hello、Windowsでは Hello.exe という実行ファイルが作成されます。

実行方法


// macOS Linuxの場合
./a.out
./Hello

// Windowの場合
./a
./Hello

// ダブルクリックによる実行方法は後ほど説明します。
    

実行結果

macOS
  1. ウィンドウを閉じるとアプリケーションは終了します。
  2. ウィンドウのデフォルトサイズは、どのプラットフォームでも、横 200 ピクセル 縦 200 ピクセルになるみたいです。

コード説明


#include <gtk/gtk.h>
    

gtk/gtk.h を読み込むと、GTK 関連と C 関連のヘッダーファイルのほとんどを読み込めるみたいです。


int main(int argc, char *argv[])
    

main 関数では、C で定番となっている、int argc, char *argv[] という引数が 必須です。後ほどこれらの引数は使われます。


    GtkWidget * window;
    

GtkWidget 型は、GTK ですべてのウィジェット(widget、GUIパーツ)を表す型です。


    gtk_init(&argc, &argv);
	

gtk_init関数は、GTK アプリケーションを初期化する関数です。 この時に、main関数の引数を受け取ります。gtk_init関数は、 他のGTK関数を呼び出す前に呼び出さなければなりません


    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	

gtk_window_new関数は、ウィンドウを作る関数です。 引数のGTK_WINDOW_TOPLEVELは 0 を表す定数で、 ウィンドウにタイトルバーと境界線を表示するように指定します。 ここに 1 を指定すると、タイトルバーと境界線のないウィンドウが作成されます。


   gtk_window_set_title(GTK_WINDOW(window), "Hello!");
}
	

gtk_window_set_title関数はウィンドウのタイトルを設定する関数です。 引数に対象のウィンドウと、タイトルを指定します。タイトルを指定しない場合は、 実行ファイル名がウィンドウのタイトルになります。


    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    

gtk_window_set_position関数はウィンドウの位置を設定する関数です。 引数に対象のウィンドウと、位置を指定するGTKの定数を指定します。 GTK_WIN_POS_CENTERは、ウィンドウをスクリーン中央に表示することを 指示する定数です。


    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
    
  1. g_signal_connect関数は、第1引数で指定されたウィジェット (ここでは window) が発するシグナル(ここでは "destroy") を G_CALLBACK関数で指定された関数(ここでは gtk_main_quit)に接続します。
  2. 最後のNULLは、gtk_main_quitに渡す引数がないことを表しています。
  3. ウィジェットが発するシグナルのことをプログラミング用語では 「イベント」と呼びます。
  4. そして、イベントにと接続される関数のことをイベントハンドラー(event handler) と言います。
  5. このg_signal_connect関数を記述しなければ、ウィンドウを閉じても、アプリケーションは終了しません。

    gtk_widget_show(window);
    

gtk_widget_show関数は引数のウィジェットを表示します。 ウィンドウは作成しただけでは表示されません。この関数を呼び出して、 はじめて表示されます。


    gtk_main();
    

イベントループを開始する関数です。アプリケーションはイベントループがなければ、 一瞬で終了します。一瞬で終了するためウィンドウの表示も見えません。


ダブルクリックで起動できるようにする


Windows

  1. Windowsではアプリケーションをダブルクリックで起動するには、 そのアプリケーションにDLLライブラリというものを含めなければなりません。
  2. 今のところ、MSYS2でコンパイルした、GTKの実行ファイルに DLLライブラリを含める方法を、私は見つけ出せていません。
  3. しかし、Windows 10では、環境変数でDLLライブラリへのパスを通すことによって 擬似的にダブルクリックで起動することができるようになります。
  4. まず、次のように -mwindows オプションをつけてコンパイルし直してください。
  5. gcc hello.c `pkg-config --cflags --libs gtk+-3.0` -mwindows
  6. -mwindows オプションをつけないと、ダブルクリックで起動した時に、 コマンドプロンプトも起動してしまいます。
  7. そして環境変数に次のパスを追加してください。
  8. C:¥msys64¥mingw64¥bin
  9. Windows 10 を再起動すると、アプリケーションを ダブルクリックで起動できるようになります。
  10. なお、この方法でも、Windows XP や Windows 7 では、 ダブルクリックによる起動はできません。


macOS

  1. ターミナルを起動して、hello.cpp を保存したディレクトリに移動し、次のコマンドを実行してください。
  2. gcc hello.cpp `pkg-config --cflags --libs gtk+-3.0` -o hello
  3. コンパイルが完了すると、hello.c と同じディレクトに hello という実行ファイルが出来上がります。
  4. この、hello ファイルをダブルクリックすると新しいターミナルのウィンドウが開き、 しばらくすると Hello アプリケーションが起動します。

  5. ターミナルを開かずにダブルクリックで hello アプリケーションを起動させる簡単な方法は、次のようにします。
    1. hello以外の適当な名前の新規フォルダを作ります。
    2. そのフォルダに hello 実行ファイルを入れます。
    3. 次に、そのフォルダの名前を Hello.app にしてください。
    4. macOS では、.app のついたフォルダは、.app という拡張子は非常時になり、 アプリケーションとなります。この仕組みのことを アプリケーションバンドルと言います。
    5. この簡易方法では、フォルダの名前は実行ファイルと同じにしなければなりません。
    6. 実行ファイルは hello ですが、フォルダの名前は Hello と大文字で初めても大丈夫です。
    7. この Hello アプリケーションをダブルクリックすると、 ターミナルを開かずにアプリケーションが起動します。
  6. 以上は、簡易的なアプリケーションバンドルの作り方ですが、正式には次の 「アプリケーションバンドル」で説明します。


アプリケーションバンドル

macOS では、アプリケーションを、「アプリケーションバンドル」とよばれる特殊なフォルダで管理します。アプリケーションバンドルを使うとダブルクリックでターミナルを開かずにアプリケーションを起動できるようになります。

アプリケーションバンドルは次のようなディレクトリ構成になります。


Hello.app
+Contents
++Info.plist
++MacOS
+++hello
++Resources
+++Hello.icns
    
Hello.app/Contents
  1. Hello.app は、通常のフォルダの末尾に .app という拡張子をつけたものです。〜.app というフォルダは単一のアプリケーションのように表示されます
  2. アプリケーションバンドルを右クリックして「パッケージの内容を表示」を選ぶと、アプリケーションバンドルの中身にアクセスできます
  3. Hello.app の直下に Contents というフォルダを作ります
  4. Contens というフォルダの下に Info.plist というテキストファイルと、MacOS というフォルダと、Resources というフォルダを作ります
  5. MacOS の中に、先ほど作った hello 実行ファイルを入れます
  6. Resources の中に、.icns という拡張子のついたアイコンファイルを入れます

Info.plist

Info.plist は、xml 形式のテキストファイルです。このファイルにアプリケーションのいろいろな設定をしていきます。


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CFBundleDevelopmentRegion</key>
	<string>English</string>
	<key>CFBundleExecutable</key>
	<string>hello</string>
	<key>CFBundleIconFile</key>
	<string>Hello.icns</string>
	<key>CFBundleName</key>
	<string>Hello</string>
	<key>NSPrincipalClass</keyv
	<string>NSApplication</string>
</dict>
</plist>
    
  1. CFBundleDevelopmentRegion には、アプリケーションで使用する主要な言語を指定します
  2. CFBundleExecutable には、実行ファイルを指定します。 この方法で実行ファイルを指定する場合は、実行ファイル名とアプリケーション名を 同じにする必要はありません。
  3. CFBundleIconFile には、.icns 形式のアイコンファイルを指定します
  4. CFBundleName には、アプリケーションメニューに表示される名前を指定します。これを指定しないと実行ファイルの名前がアプリケーションメニューに表示されます
  5. NSPrincipalClass には、NSApplication を指定します

最小限、以上の5項目を設定すれば OK です

出来上がったアプリケーションバンドルをダブルクリックしても起動しない場合は、アプリケーションバンドルを他の場所(例えばデスクトップなど)に移動してダブルクリックしてみてください。一度起動できれば、そのあとは、どの場所に移動しても起動できます。

Hello.app


Linux

Fedora、CentOS、Ubuntu 16.04、Mint 18では、 コンパイルして出来上がった実行ファイルを、ダブルクリックで起動できます。 しかしアイコンはシステムのデフォルトアイコンになります。

Dbian、Ubuntu 18.04、Mint 19では、コンパイルして出来上がった実行ファイルを ダブルクリックしても起動できません。アイコンもつきません。

しかしスタートメニューに登録することで シングルクリックで起動できて任意のアイコンもつけることができます。


デスクトップエントリー

  1. デスクトップエントリーというファイルを作り、そのファイルで実行ファイルやアイコン などを指定することで、スタートメニューに登録されます。
  2. 実行ファイルは次のように名前を指定してコンパイルすると良いでしょう。
    
    gcc hello.c `pkg-config --cflags --libs gtk+-3.0` -o hello
        
  3. 次にpng形式かsvg形式のアイコンを用意します。今回は下記の場所から適当なsvg をコピーしてきました。あくまでもコピーして使ってください。 移動するとそのアイコンを必要とするアプリケーションから使えなくなります。 今回はLinux Mint 19.1 Mateからmate.svgというアイコンをコピーしました
    
    /usr/share/icons/hicolor/scalable/apps
        
  4. 次に下記の場所にhello実行ファイルとアイコンファイルを移動します。 指定のディレクトリがないようでしたら作ってください。
    
    /home/ユーザー名/.local/share/applications
        
  5. そして、同じ場所に次の内容の hello.desktop というファイルを作ります。

    hello.desktop

    
    [Desktop Entry]
    Type=Application
    Version=1.0
    Name=Hello
    Exec=/home/ユーザー名/.local/share/applications/hello
    Icon=/home/ユーザー名/.local/share/applications/mate.svg
    Comment=My first application.
    Categories=
        
    1. Versionはアプリケーションのバージョンではなく、 デスクトップエントリーの仕様バージョンです。記述しなくても問題ないみたいです。
    2. ExecとIconはフルパスで指定しなければいけません。
    3. Commentが有効になるのは私の環境ではLinux Mintだけでした。
    4. Categoriesは指定方法がわかりません。 逆に間違えて設定するとスタートメニューに登録されないことがありので 指定しないほうが良いかもしれません。指定しない場合は「その他」に分類されます。
  6. hello.desktopに間違いないかは次のコマンドで確認できます。 何も表示されなければエラーはありません。
    
     desktop-file-validate hello.desktop
        
  7. デスクトップエントリーの設定はすぐに有効になるOSもあれば 再ログイン後に有効になるOSもあるみたいです。


場所について

上記の方法はユーザー専用にアプリケーションを登録する方法でした。 システム全体(全ユーザー向け)に登録するには、 それぞれのファイルの場所を次のとおり変更します。


デスクトップエントリー
~/.local/share/applications                 // ユーザー専用
/usr/share/applications                     // システム全体

アプリケーション
~/.local/shara/applications                 // ユーザー専用
/usr/bin                                    // システム全体

アイコン
~/.local/share/applications                 // ユーザー専用
もしくは
~/.local/share/icons/hicolor/scalable/apps  // ユーザー専用
/usr/share/icons/hicolor/scalable/apps      // システム全体

デスクトップエントリーの設定を反映させるために次のコマンドを使えるそうですが、
私の環境でエラーが出ます。再ログインのほうが良いように思います。
再ログインなしで設定が反映される場合もあります。
update-desktop-database                     
    

そしてデスクトップエントリーを次のように変更します。

hello.desktop


[Desktop Entry]
Type=Application
Version=1.0
Name=Hello
Exec=hello
Icon=mate.svg
Comment=My first application.
Categories=
    

/usr/binと/usr/share/icons/hicolor/scalable/appsには、 すでにパスが通っていますので、それぞれファイル名だけで大丈夫です。

ユーザー専用設定とシステム全体設定の両方が存在する場合は、 ユーザー専用設定が使われます。



7005 visits
Posted: Dec. 14, 2019
Update: Jan. 13, 2020

ホーム   C/C++チュートリアル   目次