• 検索結果がありません。

UI マネージャ

ドキュメント内 表紙 (ページ 155-161)

第 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 }

ドキュメント内 表紙 (ページ 155-161)