- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
:: このページの目次
{{outline}}
{{ref_image gtk_since_3_10_simplest_app_window.png}}
!!! ダウンロード
* {{ref simplest_app_window_20160424.zip}}
!!! メインのスクリプトとその説明
/*
最もシンプルなGTKウィンドウ
*/
*_build
#packopt name "gtk_since_3_10_simplest_app_window"
#runtime "hsp3c"
*_include
#include "h_myconsts.as"
#include "m_2u.as"
#include "modclbk.as"
#include "gtk+3.as"
*_main
// init and start app
gtk_application_new "jp.lldev.hspgtk.gtk_since_3_10_simplest_app_window", G_APPLICATION_FLAGS_NONE
app = stat
newclbk3 cb_app_activate, 2, *on_app_activate, CLBKMODE_CDECL
g_signal_connect_data app, "activate", cb_app_activate, NULL, NULL, NULL
g_application_run app, NULL, NULL
status = stat
g_object_unref app
end status
*_signal_handlers
*on_app_activate
clbkargprotect args
gtk_application_window_new args( 0 )
win = stat
gtk_window_set_title win, u( "テスト" )
gtk_widget_set_size_request win, 200, 200
gtk_widget_show_all win
return
{{include_html _code_gtk3_simple_window}}
!! 名前が"_"で始まるラベルについて
これらのラベルはコーディング中の目印として置いたもので、スクリプトからは利用されていません。
!! _includeパート
* h_myconsts.as
** サンプルの作者が個人的によく使う定数をまとめたファイルです。ダウンロードアーカイブに含まれています。
* m_2u.as
** シフトJIS文字列を受け取ってUTF-8に変換して返す関数が入ってます。ダウンロードアーカイブに含まれています。
* modclbk.as
** tds12さんが[hsp.tvの掲示板|http://hsp.tv/play/pforum.php?mode=all&num=62130]で公開されたHSPでコールバック関数を使うためのスクリプトを保存したファイルです。ダウンロードアーカイブに含まれています。
* gtk+3.as
** GTK+関連のDLLに含まれる関数をHSPで使えるように#func命令で登録するスクリプトと、GTK+のプログラミングで使われる定数の定義の一部を保存したファイルです。実際はこの中でDLLごとに分けたものをさらにインクルードしています。ダウンロードアーカイブに含まれています。さらに詳しい説明が必要な場合は、[[こちらのページ|GTK関連ライブラリ(DLL)用HSPヘッダファイル]]を見てください。
!! _mainパート
* gtk_application_new関数
** GTK+ API。GtkApplicationインスタンスを生成する。GtkApplicationを利用するプログラムではgtk_init関数を呼ばなくてよい。
** 引数:
*** const gchar *application_id: ユニークなアプリケーションID文字列のポインタ。アプリケーションの識別に関する機能を使う必要がなければ、ヌルポインタ(0)でもよい。設定する場合は、[このガイド|https://wiki.gnome.org/HowDoI/ChooseApplicationID]に沿ってIDを決める。IDを設定すると、同一ログインセッション内でのプログラムの多重起動を禁止することができる。0を指定すると、多重起動のチェックは行われない。IDを設定して多重起動を禁止したプログラムを複数起動すると、後から起動した方はすぐに終了し、最初に起動した方のactivateシグナルハンドラ(後の説明参照)が再度実行される(デフォルト)。
*** GApplicationFlags flags: アプリケーションの動作を設定するためのフラグ。特に必要がなければGAPPLICATION_FLAGS_NONE (0)を指定する。ここに他のフラグをセットすると、コマンドライン解析関連のオプション機能などが利用できたりする。
** 戻り値: 生成したインスタンスのポインタ
* newclbk3命令
** modclbk.asの命令。指定したラベルから始まるサブルーチンをコールバック関数として設定して、そのポインタを取得する。
** 引数:
*** p1: 関数ポインタを受け取る変数
*** p2: 引数の数
*** p3: ラベル
*** p4: 作成のモード。サブルーチンをGTK+のシグナルハンドラとして使いたい場合は、CLBKMODE_CDECL (1)を指定する。
* g_signal_connect_data関数
** GTK+ API。指定したGTK+クラスのインスタンスの「シグナル」と関数ポインタを関連付けする。サンプルでは、GtkApplicationインスタンスのactivateシグナルとon_app_activateサブルーチンを関連付けしている。関連付けされたサブルーチン(関数)は、対象のシグナルが「発行」された時点でコールバック関数として自動的に呼び出される。GtkApplicationのactivateシグナルは、g_application_run関数によってアプリケーションが起動される時に発行される。シグナルについては、下の【GTK+プログラムの基本的なしくみ】を参照。
** 引数:
*** gpointer instance: GTK+クラスのインスタンスのポインタ
*** const gchar *detailed_signal: シグナル名
*** GCallback c_handler: 関数ポインタ
*** gpointer data: 関連付けするサブルーチン(関数)の呼び出し時に渡したいデータのポインタ。このポインタは呼び出し時に引数の一つとして受け取ることができる。特に使う必要がなければヌル(0)でよい。
*** GClosureNotify destroy_data: あまり使わないので省略。特に使う必要がなければヌル(0)でよい。
*** GConnectFlags connect_flags: あまり使わないので省略。特に使う必要がなければヌル(0)でよい。
** 戻り値: シグナルハンドラID。関連付けを解除する時などに使う。
* 【GTK+プログラムの基本的なしくみ】
** GTK+を利用したアプリケーションは、HSPの標準的なプログラムと同じくイベント駆動のプログラムとなる。ここでいうイベントとは、プログラムのユーザによる何らかの操作を指すことが多いが、ウィンドウマネージャーやその他のプログラムからのある種のメッセージも含まれる。GTK+ではイベントが発生すると、対象のウィジェット(GTK+クラスの内、GUI部品に分類されるものを指す呼び名)またはその他のインスタンスに対してシグナルが発行される。ウィジェットまたはその他のインスタンスは、そのシグナルに対してあらかじめ関連づけられていた(connectされていた)関数があればそれを呼び出す。このコールバック関数のことをGTK+の用語ではシグナルハンドラと呼ぶ。シグナルハンドラの引数の仕様はシグナルごとに決められている。詳細は各GTK+クラスの[リファレンスマニュアル|https://developer.gnome.org/gtk3/stable/]を参照。
* g_application_run関数
** GTK+ API。アプリケーションを動作状態に移行させる。
** この関数は、C言語プログラムでいうところのmain関数内で呼び出される想定で作られている。その際には、GtkApplicationインスタンスのポインタとともに、C言語プログラムでのmain関数の引数であるargcとargvを引数として指定する。この関数にargcとargvを渡すと、プログラムへの引数のうちGTK+に影響を与えるもののみが処理され取り除かれるので、残りをアプリケーションがそれぞれの都合で処理すればよい。
** この関数が呼ばれると、引数から渡されたGtkApplicationインスタンスに対してactivateシグナルが発行され、それを引き金として、(もしあれば)前もってシグナルに関連付けされていたコールバック関数(サンプルではon_app_activateサブルーチン)が呼ばれる。
** この関数は内部にイベントループを含んでいるため、ウィンドウのクローズボタンをクリックするなどしてウィンドウが閉じられてはじめてreturnする。そしてこの時返される値(サンプルではstatus変数に代入されている)は、アプリケーション・プログラムが終了コード(終了ステータス)として返すべき値である。
** 引数:
*** GApplication *application: GtkApplicationインスタンスのポインタ
*** int argc: C言語プログラムのmain関数の引数であるargc。利用できない場合は0でよい。
*** char **argv: C言語プログラムのmain関数の引数であるargv。利用できない場合はヌル(0)でよい。
** 戻り値: 終了ステータス
* g_object_unref関数
** GTK+ API。GTK+クラスのインスタンスへのリファレンスカウントを1減らす。その結果、カウントが0になると、インスタンスのメモリが開放される。
** 引数:
*** gpointer object: 対象インスタンスのポインタ
* end命令
** g_application_run関数の戻り値を終了コードとしてreturnしてプログラムを終了する。
!! _signal_handlersパート
GTK+クラスのインスタンスに対してシグナルが発行されたときに実行されるサブルーチン(シグナルハンドラ)が書いてあります。シグナルハンドラはコールバック関数として呼び出されます。
! on_app_activateサブルーチン
サンプルでは、GtkApplicationインスタンスに対してactivateシグナルが発行されたときに実行される。ここにはアプリケーション独自の初期化処理を記述する。
* clbkargprotect命令
** modclbk.asの命令。newclbk3命令で設定したコールバック関数の呼び出し時に、その引数を取得する。
** 引数:
*** p1: コールバック関数の引数を受け取るための変数(配列)
* gtk_application_window_new関数
** GTK+ API。GtkApplicationインスタンスに関連付けられたGtkApplicationWindowインスタンスを生成する。GtkApplicationWindowはGtkWindowの一種で、外枠とタイトルバー、およびプラットフォームごとに定められたその他のコントロールを備えている。
** 引数:
*** GtkApplication *application: GtkApplicationインスタンスのポインタ
** 戻り値: GtkApplicationWindowインスタンスのポインタ
* gtk_window_set_title関数
** GTK+ API。ウィンドウのタイトルを設定する。
** 引数:
*** GtkWindow *window: GtkWindowインスタンスのポインタ
*** const gchar *title: 表示する文字列(UTF-8のみ)
* gtk_widget_set_size_request関数
** GTK+ API。ウィジェットの現在のサイズを変更し、同時に変更後のサイズを最小サイズとして設定する。この関数でサイズを設定すると、プログラムのユーザは通常の操作ではそれ以上小さくすることはできなくなる。そのような制限を付けたくない場合は、代わりにgtk_window_set_default_size関数を使う。サンプルで使っているGtkApplicationWindowはGtkWidgetを継承しているクラスなので、この関数の引数に指定することができる。
** 引数:
*** GtkWidget *widget: GtkWidgetインスタンスのポインタ
*** gint width: ウィジェットの幅
*** gint height: ウィジェットの高さ
* gtk_widget_show_all関数
** GTK+ API。指定したウィジェットを画面に表示する。そのウィジェットに載っているすべてのウィジェットも同時に表示状態になる。
** 引数:
*** GtkWidget *widget: GtkWidgetインスタンスのポインタ
!!! 参考にしたページ
* [Getting Started with GTK+|https://developer.gnome.org/gtk3/stable/gtk-getting-started.html]
* [GTK+ 3 Reference Manual|https://developer.gnome.org/gtk3/stable/]