第 6 章 ウィジェットリファレンス 83
6.4 メニューウィジェット
6.4.3 UI マネージャ
134 r e t u r n p o p u p m e n u ;
135 }
136
137 i n t m a i n (i n t ar g c , c h a r * * a r g v ) {
138 G t k W i d g e t * w i n d o w ;
139 G t k W i d g e t * e v e n t b o x ;
140 G t k W i d g e t * p o p u p m e n u ;
141
142 g t k _ i n i t ( & a r g c , & a r g v ) ;
143 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 ) ;
144 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 " ) ;
145 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 ) ;
146 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 ) ;
147 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 " ,
148 G _ C A L L B A C K ( g t k _ m a i n _ q u i t ) , N U L L ) ;
149
150 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 ) ) ;
151 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 ) ;
152
153 e v e n t b o x = g t k _ e v e n t _ b o x _ n e w ( ) ;
154 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 ) ;
155 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 " ,
156 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 ) ;
157
158 g t k _ w i d g e t _ s h o w _ a l l ( w i n d o w ) ;
159 g t k _ m a i n ( ) ;
160
161 r e t u r n 0 ;
162 }
メニューアイテムの定義
メニューアイテムの定義は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
図6.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マネージャを利用したメニュー作成に密接に関連するウィジェットがアクショングループ
(GtkAction-Group)です. このウィジェットはメニューアイテムをまとめて扱うためのウィジェットです. アクショング
ループの作成は関数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 ) ;
メニューの階層構造の定義
今まではメニューアイテム一つずつの定義についての説明でした. ではメニューの構成はどうやって決定し たらいいでしょう. 前節までに説明した方法では, サブメニューを追加してどのメニューアイテムを配置する のかなどを全て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メンバの値を記述します.
サンプルプログラム
ソース6–4–3にGtkUIManagerを用いたサンプルプログラムのソースコードを示します.
ソース 6–4–3 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 G t k A c t i o n E n t r y e n t r i e s [ ] = {
4 { " F i l e M e n u " , N U L L , " _ F i l e " } ,
5 { " E d i t M e n u " , N U L L , " _ E d i t " } ,
6 { " V i e w M e n u " , N U L L , " _ V i e w " } ,
7 { " 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 à . . . " } ,
8 { " N e w " , N U L L , " _ N e w " , " <c o n t r o l > N " , " C r e a t e à a à n e w à f i l e " , N U L L } ,
9 { " O p e n " , N U L L , " _ O p e n " , " <c o n t r o l > O " , " O p e n à a à f i l e " , N U L L } ,
10 { " S a v e " , N U L L , " _ S a v e " , " <c o n t r o l > S " , " S a v e à a à f i l e " , N U L L } ,
11 { " 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 } ,
12 { " Q u i t " , N U L L , " _ Q u i t " , " <c o n t r o l > Q " , " Q u i t à a à p r o g r a m " , g t k _ m a i n _ q u i t } ,
13 { " 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 } ,
14 { " 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 } ,
15 { " 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 } ,
16 { " 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 }
17 } ;
18
19 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 [ ] = {
20 { " 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 " ,
21 NU L L , N U L L , F A L S E }
22 } ;
23
24 e n u m {
25 S O R T _ F I L E _ T Y P E ,
26 S O R T _ F I L E _ S I Z E ,
27 S O R T _ U P D A T E _ T I M E
28 } ;
29
30 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 [ ] = {
31 { " 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 } ,
32 { " 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 } ,
33 { " 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 }
34 } ;
35
36 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 ) ;
37 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 ) ;
38 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 ) ;
39
40 s t a t i c c o n s t g c h a r * u i _ i n f o =
41 " <ui > "
42 " à à <m e n u b a r à n a m e = ’M e n u B a r ’ >"
43 " à à à à <m e n u à a c t i o n = ’F i l e M e n u ’ >"
44 " à à à à à à <m e n u i t e m à a c t i o n = ’N e w ’/ >"
45 " à à à à à à <m e n u i t e m à a c t i o n = ’O p e n ’/ >"
46 " à à à à à à <m e n u i t e m à a c t i o n = ’S a v e ’/ >"
47 " à à à à à à <m e n u i t e m à a c t i o n = ’S a v e A s ’/ >"
48 " Ã Ã Ã Ã Ã Ã <s e p a r a t o r / >"
49 " à à à à à à <m e n u i t e m à a c t i o n = ’Q u i t ’/ >"
50 " Ã Ã Ã Ã </m e n u > "
51 " à à à à <m e n u à a c t i o n = ’E d i t M e n u ’ >"
52 " à à à à à à <m e n u i t e m à a c t i o n = ’C u t ’/ >"
53 " à à à à à à <m e n u i t e m à a c t i o n = ’C o p y ’/ >"
54 " à à à à à à <m e n u i t e m à a c t i o n = ’P a s t e ’/ >"
55 " à à à à à à <m e n u i t e m à a c t i o n = ’D e l e t e ’/ >"
56 " Ã Ã Ã Ã </m e n u > "
57 " à à à à <m e n u à a c t i o n = ’V i e w M e n u ’ >"
58 " à à à à à à <m e n u i t e m à a c t i o n = ’S h o w H i d d e n ’/ >"
59 " à à à à à à <m e n u à a c t i o n = ’S o r t M e n u ’ >"
60 " à à à à à à à à <m e n u i t e m à a c t i o n = ’F i l e T y p e ’/ >"
61 " à à à à à à à à <m e n u i t e m à a c t i o n = ’F i l e S i z e ’/ >"
62 " à à à à à à à à <m e n u i t e m à a c t i o n = ’U p d a t e T i m e ’/ >"
63 " Ã Ã Ã Ã Ã Ã </m e n u > "
64 " Ã Ã Ã Ã </m e n u > "
65 " Ã Ã </m e n u b a r > "
66 " </ui > " ;
67
68 s t a t i c v o i d 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 ,
69 G t k R a d i o A c t i o n * c u r r e n t ) {
70 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 " ,
71 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 ) ) ) ;
72 }
73
74 s t a t i c G t k W i d g e t* 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 ) {
75 G t k U I M a n a g e r * u i ;
76 G t k A c t i o n G r o u p * a c t i o n s ;
77
78 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 " ) ;
79 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 , N U L L ) ;
80 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 ,
81 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 ,
82 N U L L ) ;
83 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 ,
84 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 ,
85 S O R T _ F I L E _ T Y P E ,
86 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 ) ,
87 N U L L ) ;
88
89 u i = g t k _ u i _ m a n a g e r _ n e w ( ) ;
90 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 ) ;
91 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 ) ;
92 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 ) ,
93 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 ) ) ;
94 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 ) ;
95
96 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 " ) ;
97 }
98
99 i n t m a i n (i n t ar g c , c h a r * * a r g v ) {
100 G t k W i d g e t * w i n d o w ;
101 G t k W i d g e t * m e n u b a r ;
102
103 g t k _ i n i t ( & a r g c , & a r g v ) ;
104 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 ) ;
105 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 " ) ;
106 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);
107 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 ) ;
108 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 " ,
109 G _ C A L L B A C K ( g t k _ m a i n _ q u i t ) , N U L L ) ;
110
111 m e n u b a r = c r e a t e _ m e n u ( w i n d o w ) ;
112 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 ) ;
113
114 g t k _ w i d g e t _ s h o w _ a l l ( w i n d o w ) ;
115 g t k _ m a i n ( ) ;
116
117 r e t u r n 0 ;
118 }