GTK+-3.0からは,GtkApplictionというクラスが追加されました. これは, GTK+の初期化やセッション管理,デスク
トップシステムとの連携などを自動的に行ってくれるものです. また, GtkApplicationを使用するとメニューバーを簡単に作成 することができます.
次節においてメニューバーを導入する前準備として,本節では前節で作成したソース2–4をGtkApplicationを用いた形に書 き換え,変更点について説明していきます. 変更後のソースコードがソース2–5になります.
今までの方法でも,2.7節で紹介する方法によりメニューバーを作成することはできますが,現時点で一部の機能が実現で きないようです.
2.6.1 GtkApplication を用いたプログラムの流れ
図2.9にこれまで説明したプログラム作成の流れとGtkApplicationを用いた場合のプログラム作成の流れの比較を示します. こ れ ま で は, ま ず 第 1 に 関 数 gtk init を 呼 び 出 し て GTK+ の 初 期 化 を 行 っ て い ま し た が, そ の 代 わ り に 関 数 gtk application newを呼び出して, GtkApplicationクラスの変数を生成します(ソース2–5の83行目). このとき, 関数
gtk initが内部で呼び出されるため,プログラム内部に記述する必要がなくなります.
関数gtk application newの第1引数にはアプリケーションIDとして固有の文字列を与えます. アプリケーションIDとし
て与える文字列にどのような約束があるのかは詳細は不明ですが,ピリオド(.)が含まれている必要があるようです. 第2引数 のアプリケーションフラグには通常0 (G APPLICATION FLAGS NONE)を与えればよいでしょう.
G t k A p p l i c a t i o n * g t k _ a p p l i c a t i o n _ n e w (c o n s t g c h a r * a p p l i c a t i o n _ i d , G A p p l i c a t i o n F l a g s f l a g s ) ;
第2章 GTK+ で画像ビューワを作ってみよう
2.6 GtkApplicationフレームワークへの対応 21 第1引数 アプリケーションID.
第2引数 アプリケーションフラグ.
戻り値 生成したGtkApplication
アプリケーションのループを開始するためには,これまでの関数gtk mainの代わりに関数g application run を呼び出し ます.
i n t g _ a p p l i c a t i o n _ r u n ( G A p p l i c a t i o n * a p p l i c a t i o n , i n t ar g c , c h a r * * a r g v ) ;
第1引数 GApplicationクラスの変数. 第2引数 コマンドライン引数の数. 第3引数 コマンドライン引数.
また,プログラムを終了するための方法が関数gtk main quitから関数g application quitに変わります. v o i d g _ a p p l i c a t i o n _ q u i t ( G A p p l i c a t i o n * a p p l i c a t i o n ) ;
第1引数 GApplicationクラスの変数.
2.6.2 GUI の作成
GUIの作成については,これまでに説明した方法に変わりはありませんが,ソース2–5では, GtkApplicationクラスの変数が 有効になったタイミング,すなわち, activateシグナルが発生したときに呼び出されるコールバック関数内でGUIの作成を行っ ています.
もう一つの変更点は,ウィンドウウィジェットを作成する方法が関数gtk window newから関数gtk application window new に変わったことです.
G t k W i d g e t * g t k _ a p p l i c a t i o n _ w i n d o w _ n e w (G t k A p p l i c a t i o n * a p p l i c a t i o n ) ;
第1引数 GtkApplicationクラスの変数.
ソース2–5 GtkAppliction版への変更: image-viewer.c
1 # i n c l u d e <g t k / g t k . h >
2 # i n c l u d e <s t d l i b . h >
3 4 / *
5 ボ タ ン が ク リ ッ ク さ れ た と き に 呼 び 出 さ れ る 関 数 6 * /
7 s t a t i c v o i d
8 c b _ b u t t o n _ c l i c k e d (G t k W i d g e t * b u t t o n , g p o i n t e r u s e r _ d a t a )
9 {
10 / * メ イ ン ル ー プ を 終 了 * /
GTK+ライブラリの初期化
GUIの作成
GUIの表示
アプリケーションの開始
GtkApplicationの作成
GUIの作成
GUIの表示
アプリケーションの開始
g t g t
g t g t
t自動的にg tが呼び出される
図2.9 GtkApplicationを用いたプログラムの流れ
第2章 GTK+ で画像ビューワを作ってみよう 22 第2章 GTK+で画像ビューワを作ってみよう
11 G A p p l i c a t i o n * a p p = G _ A P P L I C A T I O N ( u s e r _ d a t a ) ;
12 g _ a p p l i c a t i o n _ q u i t ( a p p ) ;
13 }
14 15 / *
16 * ア プ リ ケ ー シ ョ ン が 有 効 に な っ た と き に 呼 び 出 さ れ る 関 数 17 * /
18 s t a t i c v o i d
19 c b _ a c t i v a t e ( G A p p l i c a t i o n * app , g p o i n t e r u s e r _ d a t a )
20 {
21 G t k W i d g e t * w i n d o w ;
22
23 / * ウ ィ ン ド ウ の 作 成 * /
24 w i n d o w = g t k _ a p p l i c a t i o n _ w i n d o w _ n e w ( G T K _ A P P L I C A T I O N ( a p p ) ) ;
25 / * ウ ィ ン ド ウ の 大 き さ の 設 定 * /
26 g t k _ w i d g e t _ s e t _ s i z e _ r e q u e s t ( w i n d o w , 3 0 0 , 2 0 0 ) ;
27 {
28 G t k W i d g e t* v b o x ;
29
30 / * 縦 に ウ ィ ジ ェ ッ ト を 配 置 す る ボ ッ ク ス の 作 成 * /
31 v b o x = g t k _ b o x _ n e w ( G T K _ O R I E N T A T I O N _ V E R T I C A L , 2 ) ;
32 / * ボ ッ ク ス を ウ ィ ン ド ウ に 配 置 * /
33 g t k _ c o n t a i n e r _ a d d ( G T K _ C O N T A I N E R ( w i n d o w ) , v b o x ) ;
34 {
35 G t k W i d g e t * s c r o l l _ w i n d o w ;
36 G t k W i d g e t * b u t t o n ;
37
38 / * ス ク ロ ー ル バ ー 付 き ウ ィ ン ド ウ の 作 成 * /
39 s c r o l l _ w i n d o w = g t k _ s c r o l l e d _ w i n d o w _ n e w ( N U L L , N U L L ) ;
40 / * ス ク ロ ー ル バ ー 付 き ウ ィ ン ド ウ を ボ ッ ク ス に 配 置 * /
41 g t k _ b o x _ p a c k _ s t a r t ( G T K _ B O X ( v b o x ) , s c r o l l _ w i n d o w , T R U E , T R U E , 0 ) ;
42 / * ス ク ロ ー ル バ ー の 表 示 設 定 * /
43 g t k _ s c r o l l e d _ w i n d o w _ s e t _ p o l i c y ( G T K _ S C R O L L E D _ W I N D O W ( s c r o l l _ w i n d o w ) ,
44 G T K _ P O L I C Y _ A U T O M A T I C ,
45 G T K _ P O L I C Y _ A U T O M A T I C ) ;
46 {
47 G t k W i d g e t * i m a g e ;
48
49 / * フ ァ イ ル か ら 画 像 を 読 み 込 ん で イ メ ー ジ の 作 成 * /
50 i m a g e = g t k _ i m a g e _ n e w _ f r o m _ f i l e ( (c h a r * ) u s e r _ d a t a ) ;
51 / * イ メ ー ジ を ス ク ロ ー ル バ ー 付 き ウ ィ ン ド ウ に 配 置 * /
52 g t k _ c o n t a i n e r _ a d d ( G T K _ C O N T A I N E R ( s c r o l l _ w i n d o w ) , i m a g e ) ;
53 }
54 / * ボ タ ン の 作 成 * /
55 b u t t o n = g t k _ b u t t o n _ n e w _ w i t h _ l a b e l ( " Q u i t " ) ;
56 / * ボ タ ン が ク リ ッ ク さ れ た と き に 呼 び 出 さ れ る 関 数 の 設 定 * /
57 g _ s i g n a l _ c o n n e c t ( G _ O B J E C T ( b u t t o n ) , " c l i c k e d " ,
58 G _ C A L L B A C K ( c b _ b u t t o n _ c l i c k e d ) , a p p ) ;
59 / * ボ タ ン を ボ ッ ク ス に 配 置 * /
60 g t k _ b o x _ p a c k _ s t a r t ( G T K _ B O X ( v b o x ) , b u t t o n , F A L S E , F A L S E , 0 ) ;
61 }
62 }
63 / * ウ ィ ン ド ウ の 表 示 * /
64 g t k _ w i d g e t _ s h o w _ a l l ( w i n d o w ) ;
65 }
66 67 / *
68 メ イ ン 関 数 69 * /
70 i n t
71 m a i n (i n t ar g c , c h a r * * a r g v )
72 {
73 G t k A p p l i c a t i o n * a p p ;
74
75 / * 引 数 の チ ェ ッ ク * /
76 i f ( a r g c ! = 2 )
77 {
78 g _ p r i n t ( " U s a g e : ␣ % s ␣ i m a g e - f i l e \ n " , a r g v [ 0 ] ) ;
79 e x i t ( 1 ) ;
80 }
81 / * ア プ リ ケ ー シ ョ ン の 作 成 * /
82 a p p = g t k _ a p p l i c a t i o n _ n e w ( " g t k . i m a g e v i e w e r " , 0 ) ;
83 / * シ グ ナ ル ハ ン ド ラ の 登 録 * /
84 g _ s i g n a l _ c o n n e c t ( app , " a c t i v a t e " , G _ C A L L B A C K ( c b _ a c t i v a t e ) , a r g v [ 1 ] ) ;
第2章 GTK+ で画像ビューワを作ってみよう