第 7 章 ウィジェットリファレンス 113
7.4 メニューウィジェット
7.4.3 UI マネージャ
118 m e n u = g t k _ m e n u _ n e w ( ) ;
119 g t k _ m e n u _ i t e m _ s e t _ s u b m e n u ( G T K _ M E N U _ I T E M ( i t e m ) , m e n u ) ;
120 {
121 i t e m = g t k _ t e a r o f f _ m e n u _ i t e m _ n e w ( ) ;
122 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 ( m e n u ) , i t e m ) ;
123
124 i t e m = g t k _ c h e c k _ m e n u _ i t e m _ n e w _ w i t h _ l a b e l ( " S h o w H i d d e n F o l d e r s " ) ;
125 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 ( m e n u ) , i t e m ) ;
126 g t k _ w i d g e t _ a d d _ a c c e l e r a t o r ( i t e m , " a c t i v a t e " , a c c e l _ g r o u p ,
127 G D K _ H ,
128 G D K _ C O N T R O L _ M A S K , G T K _ A C C E L _ V I S I B L E ) ;
129
130 i t e m = g t k _ i m a g e _ m e n u _ i t e m _ n e w _ w i t h _ l a b e l ( " S o r t b y . . . " ) ;
131 i m a g e = g t k _ i m a g e _ n e w _ f r o m _ s t o c k ( G T K _ S T O C K _ S O R T _ A S C E N D I N G ,
132 G T K _ I C O N _ S I Z E _ M E N U ) ;
133 g t k _ i m a g e _ m e n u _ i t e m _ s e t _ i m a g e ( G T K _ I M A G E _ M E N U _ I T E M ( i t e m ) , i m a g e ) ;
134 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 ( m e n u ) , i t e m ) ;
135 m e n u = g t k _ m e n u _ n e w ( ) ;
136 g t k _ m e n u _ i t e m _ s e t _ s u b m e n u ( G T K _ M E N U _ I T E M ( i t e m ) , m e n u ) ;
137 {
138 i t e m = g t k _ r a d i o _ m e n u _ i t e m _ n e w _ w i t h _ l a b e l ( g r o u p , " F i l e t y p e " ) ;
139 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 ( m e n u ) , i t e m ) ;
140 g t k _ c h e c k _ m e n u _ i t e m _ s e t _ a c t i v e ( G T K _ C H E C K _ M E N U _ I T E M ( i t e m ) , T R U E ) ;
141
142 g r o u p = g t k _ r a d i o _ m e n u _ i t e m _ g e t _ g r o u p ( G T K _ R A D I O _ M E N U _ I T E M ( i t e m ) ) ;
143 i t e m = g t k _ r a d i o _ m e n u _ i t e m _ n e w _ w i t h _ l a b e l ( g r o u p , " F i l e s i z e " ) ;
144 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 ( m e n u ) , i t e m ) ;
145
146 g r o u p = g t k _ r a d i o _ m e n u _ i t e m _ g e t _ g r o u p ( G T K _ R A D I O _ M E N U _ I T E M ( i t e m ) ) ;
147 i t e m = g t k _ r a d i o _ m e n u _ i t e m _ n e w _ w i t h _ l a b e l ( g r o u p , " U p d a t e t i m e " ) ;
148 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 ( m e n u ) , i t e m ) ;
149 }
150 }
151 r e t u r n p o p u p m e n u ;
152 }
153 154 i n t
155 m a i n (i n t ar g c , c h a r * * a r g v )
156 {
157 G t k W i d g e t * w i n d o w ;
158 G t k W i d g e t * e v e n t b o x ;
159 G t k W i d g e t * p o p u p m e n u ;
160
161 g t k _ i n i t ( & a r g c , & a r g v ) ;
162
163 w i n d o w = g t k _ w i n d o w _ n e w ( G T K _ W I N D O W _ T O P L E V E L ) ;
164 g t k _ w i n d o w _ s e t _ t i t l e ( G T K _ W I N D O W ( w i n d o w ) , " G t k P o p u p M e n u S a m p l e " ) ;
165 g t k _ c o n t a i n e r _ s e t _ b o r d e r _ w i d t h ( G T K _ C O N T A I N E R ( w i n d o w ) , 5 ) ;
166 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 , 1 0 0 ) ;
167 g _ s i g n a l _ c o n n e c t ( G _ O B J E C T ( w i n d o w ) , " d e s t r o y " ,
168 G _ C A L L B A C K ( g t k _ m a i n _ q u i t ) , N U L L ) ;
169
170 p o p u p m e n u = c r e a t e _ p o p u p m e n u ( G T K _ W I N D O W ( w i n d o w ) ) ;
171 g t k _ w i d g e t _ s h o w _ a l l ( p o p u p m e n u ) ;
172
173 e v e n t b o x = g t k _ e v e n t _ b o x _ n e w ( ) ;
174 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 ) , e v e n t b o x ) ;
175 g _ s i g n a l _ c o n n e c t ( G _ O B J E C T ( e v e n t b o x ) , " b u t t o n _ p r e s s _ e v e n t " ,
176 G _ C A L L B A C K ( c b _ p o p u p _ m e n u ) , p o p u p m e n u ) ;
177
178 g t k _ w i d g e t _ s h o w _ a l l ( w i n d o w ) ;
179 g t k _ m a i n ( ) ;
180
181 r e t u r n 0 ;
182 }
オブジェクトの階層構造 G O b j e c t
+ - - - -G t k U I M a n a g e r
UIマネージャの作成
ウィジェットの作成には関数gtk ui manager newを使用します.
G t k U I M a n a g e r* g t k _ u i _ m a n a g e r _ n e w (v o i d) ;
メニューアイテムの定義
メニューアイテムの定義はGtkActionEntryという構造体を用いて行います.GtkActionEntry構造体は次のように定義さ れています.
t y p e d e f s t r u c t {
c o n s t g c h a r * n a m e ; c o n s t g c h a r * s t o c k _ i d ; c o n s t g c h a r * l a b e l ; c o n s t g c h a r * a c c e l e r a t o r ; c o n s t g c h a r * t o o l t i p ; G C a l l b a c k c a l l b a c k ; } G t k A c t i o n E n t r y;
構造体のメンバの説明を以下にまとめます.
• name
メニューアイテムを特定するための文字列です.
• stock id
メニューアイテムの先頭に表示するアイコン用のGtkStockItemで定義された文字列です.
• label
メニューアイテムに表示するラベルです.文字の前にアンダースコアを挿入することで,その文字の下にアンダースコア が表示されアクセラレータキーとして動作します.
• accelerator
メ ニ ュ ー ア イ テ ム の シ ョ ー ト カ ッ ト を 設 定 す る た め の 文 字 列 で す .”<control>O” や ”<control><shift>S”,
”<alt><shift>X”のように指定します.
• tooltips
メニューアイテムの説明のための文字列です.
• callback
メニューアイテムがクリックされたときに呼び出すコールバック関数です.
図7.19 UIマネージャ
今説明したメニューアイテムは普通のメニューアイテムでチェックボタンやラジオボタンの機能を持つメニューアイテムの 定義は,それぞれGtkToggleActionEntryとGtkRadioActionEntryという構造体を用いて行います.GtkToggleActionEntry 構造体は次のように定義されています.
t y p e d e f s t r u c t {
c o n s t g c h a r * n a m e ; c o n s t g c h a r * s t o c k _ i d ; c o n s t g c h a r * l a b e l ; c o n s t g c h a r * a c c e l e r a t o r ; c o n s t g c h a r * t o o l t i p ; G C a l l b a c k c a l l b a c k ; g b o o l e a n i s _ a c t i v e ; } G t k T o g g l e A c t i o n E n t r y;
GtkToggleActionEntry構造体は,GtkActionEntry構造体のメンバにis activeというアイテムがアクティブ状態かどうか
を表すgboolean型のメンバが追加されたものです.
GtkRadioActionEntry構造体は次のように定義されています.
t y p e d e f s t r u c t {
c o n s t g c h a r * n a m e ; c o n s t g c h a r * s t o c k _ i d ; c o n s t g c h a r * l a b e l ; c o n s t g c h a r * a c c e l e r a t o r ; c o n s t g c h a r * t o o l t i p ;
g i n t v a l u e ;
} G t k R a d i o A c t i o n E n t r y;
GtkRadioActionEntry 構 造 体 は ,callback メ ン バ が な く ,同 じ ラ ジ オ メ ニ ュ ー ア イ テ ム の 中 の ID を 表 す value と い う gint 型 の メ ン バ が 追 加 さ れ て い ま す .ラ ジ オ メ ニ ュ ー ア イ テ ム の コ ー ル バ ッ ク 関 数 は こ の 後 説 明 す る 関 数 gtk action group add radio actionsで設定します.
アクショングループの作成とメニューアイテムの登録
UIマネージャを利用したメニュー作成に密接に関連するウィジェットが,アクショングループ(GtkActionGroup)です.こ のウィジェットは,メニューアイテムをまとめて扱うためのウィジェットです.
アクショングループの作成は関数gtk action group newを使用します.引数の文字列には,作成するアクショングループを 特定するための名前を指定します.
G t k A c t i o n G r o u p* g t k _ a c t i o n _ g r o u p _ n e w (c o n s t g c h a r * n a m e ) ;
そして次の3つの関数で,作成したアクショングループに対してメニューアイテムを登録します.
• gtk action group add actions
GtkActionEntry構造体で用意したメニューアイテムをアクショングループに登録するための関数です.第3引数にはメ
ニューアイテムの数,第4引数にはコールバック関数に渡すデータを指定します.
v o i d
g t k _ a c t i o n _ g r o u p _ a d d _ a c t i o n s (G t k A c t i o n G r o u p * a c t i o n _ g r o u p , c o n s t G t k A c t i o n E n t r y * e n t r i e s ,
g u i n t n _ e n t r i e s ,
g p o i n t e r u s e r _ d a t a ) ;
• gtk action group add toggle actions
GtkActionToggleEntry構造体で用意したメニューアイテムをアクショングループに登録するための関数です.
v o i d g t k _ a c t i o n _ g r o u p _ a d d _ t o g g l e _ a c t i o n s (G t k A c t i o n G r o u p * a c t i o n _ g r o u p ,
c o n s t G t k T o g g l e A c t i o n E n t r y * e n t r i e s ,
g u i n t n _ e n t r i e s ,
g p o i n t e r u s e r _ d a t a ) ;
• gtk action group add radio actions
GtkActionRadioEntry構造体で用意したメニューアイテムをアクショングループに登録するための関数です.第4引数
には初期状態でアクティブにするアイテム番号(GtkActionRadioEntry構造体のvalueの値)を指定します.また第5 引数でコールバック関数を指定します.
v o i d g t k _ a c t i o n _ g r o u p _ a d d _ r a d i o _ a c t i o n s (G t k A c t i o n G r o u p * a c t i o n _ g r o u p ,
c o n s t G t k R a d i o A c t i o n E n t r y * e n t r i e s ,
g u i n t n _ e n t r i e s ,
g i n t v a l u e ,
G C a l l b a c k o n _ c h a n g e ,
g p o i n t e r u s e r _ d a t a ) ;
メニューの階層構造の定義
今まではメニューアイテム1つずつの定義について説明してきました.ではメニューの構成はどうやって決定したらいいので しょう.前節までに説明した方法では,サブメニューを追加してどのメニューアイテムを配置するのかなどを,すべてGTK+
の関数を呼び出して設定する必要がありました.
GtkUIManagerを使用してメニューを構成する場合には,メニューの階層構造をテキストで記述するだけで済んでしまいま
す.簡単なメニューの階層構造の例を次に示します.
s t a t i c c o n s t g c h a r * u i _ i n f o =
" <ui > "
" <m e n u b a r n a m e = ’M e n u B a r ’ >"
" <m e n u a c t i o n = ’F i l e M e n u ’ >"
" <m e n u i t e m a c t i o n = ’N e w ’/ >"
" <m e n u i t e m a c t i o n = ’O p e n ’/ >"
" <m e n u i t e m a c t i o n = ’S a v e ’/ >"
" <m e n u i t e m a c t i o n = ’S a v e A s ’/ >"
" <s e p a r a t o r / >"
" <m e n u i t e m a c t i o n = ’Q u i t ’/ >"
" </m e n u > "
" </m e n u b a r > "
" </ui > " ;
文字列は“<ui>”で始まり,“</ui>”で終わる必要があります.基本的な記述は「識別子」と「属性」という形式で行いま
す.メニューアイテムの記述は“<menuitem action=’New’/>”のように記述して,actionの属性にはGtkActionEntry構造 体のnameメンバの値を記述します.
サンプルプログラム
ソース7–4–4にGtkUIManagerを用いたサンプルプログラムのソースコードを示します.
ソース7-4-4 UIマネージャのサンプルプログラム: gtkuimanager-sample.c
1 # i n c l u d e <g t k / g t k . h >
2
3 s t a t i c v o i d
4 c b _ t e s t 1 (v o i d)
5 {
6 g _ p r i n t ( " . . . \ n " ) ;
7 }
8
9 s t a t i c v o i d
10 c b _ t e s t 2 (G t k W i d g e t * w i d g e t , g p o i n t e r u s e r _ d a t a )
11 {
12 g _ p r i n t ( " % s \ n " , (g c h a r * ) u s e r _ d a t a ) ;
13 }
14
15 s t a t i c G t k A c t i o n E n t r y e n t r i e s [ ] =
16 {
17 { " F i l e M e n u " , N U L L , " _ F i l e " } ,
18 { " E d i t M e n u " , N U L L , " _ E d i t " } ,
19 { " V i e w M e n u " , N U L L , " _ V i e w " } ,
20 { " S o r t M e n u " , G T K _ S T O C K _ S O R T _ A S C E N D I N G , " S o r t b y . . . " } ,
21 { " N e w " , N U L L , " _ N e w " , " <c o n t r o l > N " , N U L L , c b _ t e s t 1 } ,
22 { " O p e n " , N U L L , " _ O p e n " , " <c o n t r o l > O " , N U L L , G _ C A L L B A C K ( c b _ t e s t 2 ) } ,
23 { " S a v e " , N U L L , " _ S a v e " , " <c o n t r o l > S " , N U L L , N U L L } ,
24 { " S a v e A s " , N U L L , " S a v e _ a s " , " <s h i f t > <c o n t r o l > S " , N U L L , N U L L } ,
25 { " Q u i t " , N U L L , " _ Q u i t " , " <c o n t r o l > Q " , N U L L , g t k _ m a i n _ q u i t } ,
26 { " C u t " , G T K _ S T O C K _ C U T , " C _ u t " , " <c o n t r o l > X " , N U L L , N U L L } ,
27 { " C o p y " , G T K _ S T O C K _ C O P Y , " _ C o p y " , " <c o n t r o l > C " , N U L L , N U L L } ,
28 { " P a s t e " , G T K _ S T O C K _ P A S T E , " _ P a s t e " , " <c o n t r o l > V " , N U L L , N U L L } ,
29 { " D e l e t e " , G T K _ S T O C K _ D E L E T E , " _ D e l e t e " , " <c o n t r o l > D " , N U L L , N U L L }
30 } ;
31
32 s t a t i c G t k T o g g l e A c t i o n E n t r y t o g g l e _ e n t r i e s [ ] =
33 {
34 { " S h o w H i d d e n " , N U L L , " S h o w H i d d e n F o l d e r s " , " <c o n t r o l > H " ,
35 NU L L , N U L L , F A L S E }
36 } ;
37 38 e n u m
39 {
40 S O R T _ F I L E _ T Y P E ,
41 S O R T _ F I L E _ S I Z E ,
42 S O R T _ U P D A T E _ T I M E
43 } ;
44
45 s t a t i c G t k R a d i o A c t i o n E n t r y r a d i o _ e n t r i e s [ ] =
46 {
47 { " F i l e T y p e " , N U L L , " F i l e t y p e " , N U L L , N U L L , S O R T _ F I L E _ T Y P E } ,
48 { " F i l e S i z e " , N U L L , " F i l e s i z e " , N U L L , N U L L , S O R T _ F I L E _ S I Z E } ,
49 { " U p d a t e T i m e " , N U L L , " U p d a t e t i m e " , N U L L , N U L L , S O R T _ U P D A T E _ T I M E }
50 } ;
51
52 s t a t i c g u i n t n _ e n t r i e s = G _ N _ E L E M E N T S ( e n t r i e s ) ;
53 s t a t i c g u i n t n _ t o g g l e _ e n t r i e s = G _ N _ E L E M E N T S ( t o g g l e _ e n t r i e s ) ;
54 s t a t i c g u i n t n _ r a d i o _ e n t r i e s = G _ N _ E L E M E N T S ( r a d i o _ e n t r i e s ) ;
55
56 s t a t i c c o n s t g c h a r * u i _ i n f o =
57 " <ui > "
58 " <m e n u b a r n a m e = ’M e n u B a r ’ >"
59 " <m e n u a c t i o n = ’F i l e M e n u ’ >"
60 " <m e n u i t e m a c t i o n = ’N e w ’/ >"
61 " <m e n u i t e m a c t i o n = ’O p e n ’/ >"
62 " <m e n u i t e m a c t i o n = ’S a v e ’/ >"
63 " <m e n u i t e m a c t i o n = ’S a v e A s ’/ >"
64 " <s e p a r a t o r / >"
65 " <m e n u i t e m a c t i o n = ’Q u i t ’/ >"
66 " </m e n u > "
67 " <m e n u a c t i o n = ’E d i t M e n u ’ >"
68 " <m e n u i t e m a c t i o n = ’C u t ’/ >"
69 " <m e n u i t e m a c t i o n = ’C o p y ’/ >"
70 " <m e n u i t e m a c t i o n = ’P a s t e ’/ >"
71 " <m e n u i t e m a c t i o n = ’D e l e t e ’/ >"
72 " </m e n u > "
73 " <m e n u a c t i o n = ’V i e w M e n u ’ >"
74 " <m e n u i t e m a c t i o n = ’S h o w H i d d e n ’/ >"
75 " <m e n u a c t i o n = ’S o r t M e n u ’ >"
76 " <m e n u i t e m a c t i o n = ’F i l e T y p e ’/ >"
77 " <m e n u i t e m a c t i o n = ’F i l e S i z e ’/ >"
78 " <m e n u i t e m a c t i o n = ’U p d a t e T i m e ’/ >"
79 " </m e n u > "
80 " </m e n u > "
81 " </m e n u b a r > "
82 " </ui > " ;
83
84 s t a t i c v o i d
85 a c t i v a t e _ r a d i o _ a c t i o n (G t k A c t i o n * a c t i o n ,
86 G t k R a d i o A c t i o n * c u r r e n t )
87 {
88 g _ p r i n t ( " R a d i o a c t i o n \ " % s \ " s e l e c t e d \ n " ,
89 g t k _ a c t i o n _ g e t _ n a m e ( G T K _ A C T I O N ( c u r r e n t ) ) ) ;
90 }
91
92 s t a t i c G t k W i d g e t*
93 c r e a t e _ m e n u (G t k W i d g e t * p a r e n t )
94 {
95 G t k U I M a n a g e r * u i ;
96 G t k A c t i o n G r o u p * a c t i o n s ;
97 s t a t i c g c h a r * t e x t = " H e l l o " ;
98
99 a c t i o n s = g t k _ a c t i o n _ g r o u p _ n e w ( " A c t i o n s " ) ;
100 g t k _ a c t i o n _ g r o u p _ a d d _ a c t i o n s ( a c t i o n s , e n t r i e s , n _ e n t r i e s ,
101 (g p o i n t e r) t e x t ) ;
102 g t k _ a c t i o n _ g r o u p _ a d d _ t o g g l e _ a c t i o n s ( a c t i o n s ,
103 t o g g l e _ e n t r i e s , n _ t o g g l e _ e n t r i e s ,
104 N U L L ) ;
105 g t k _ a c t i o n _ g r o u p _ a d d _ r a d i o _ a c t i o n s ( a c t i o n s ,
106 r a d i o _ e n t r i e s , n _ r a d i o _ e n t r i e s ,
107 S O R T _ F I L E _ T Y P E ,
108 G _ C A L L B A C K ( a c t i v a t e _ r a d i o _ a c t i o n ) ,
109 N U L L ) ;
110
111 u i = g t k _ u i _ m a n a g e r _ n e w ( ) ;
112 g t k _ u i _ m a n a g e r _ i n s e r t _ a c t i o n _ g r o u p ( ui , a c t i o n s , 0 ) ;
113 g t k _ u i _ m a n a g e r _ s e t _ a d d _ t e a r o f f s ( ui , T R U E ) ;
114 g t k _ w i n d o w _ a d d _ a c c e l _ g r o u p ( G T K _ W I N D O W ( p a r e n t ) ,
115 g t k _ u i _ m a n a g e r _ g e t _ a c c e l _ g r o u p ( u i ) ) ;
116 g t k _ u i _ m a n a g e r _ a d d _ u i _ f r o m _ s t r i n g ( ui , u i _ i n f o , -1 , N U L L ) ;
117
118 r e t u r n g t k _ u i _ m a n a g e r _ g e t _ w i d g e t ( ui , " / M e n u B a r " ) ;
119 }
120 121 i n t
122 m a i n (i n t a r g c , c h a r * * a r g v )
123 {
124 G t k W i d g e t * w i n d o w ;
125 G t k W i d g e t * m e n u b a r ;
126
127 g t k _ i n i t ( & a r g c , & a r g v ) ;
128 w i n d o w = g t k _ w i n d o w _ n e w ( G T K _ W I N D O W _ T O P L E V E L ) ;
129 g t k _ w i n d o w _ s e t _ t i t l e ( G T K _ W I N D O W ( w i n d o w ) , " G t k U I M a n a g e r S a m p l e " ) ;
130 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 , -1);
131 g t k _ c o n t a i n e r _ s e t _ b o r d e r _ w i d t h ( G T K _ C O N T A I N E R ( w i n d o w ) , 5 ) ;
132 g _ s i g n a l _ c o n n e c t ( G _ O B J E C T ( w i n d o w ) , " d e s t r o y " ,
133 G _ C A L L B A C K ( g t k _ m a i n _ q u i t ) , N U L L ) ;
134
135 m e n u b a r = c r e a t e _ m e n u ( w i n d o w ) ;
136 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 ) , m e n u b a r ) ;
137
138 g t k _ w i d g e t _ s h o w _ a l l ( w i n d o w ) ;
139 g t k _ m a i n ( ) ;
140
141 r e t u r n 0 ;
142 }