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

ÆþÌçGTK+

N/A
N/A
Protected

Academic year: 2021

シェア "ÆþÌçGTK+"

Copied!
28
0
0

読み込み中.... (全文を見る)

全文

(1)

249

10

プログラミングの小箱

本章では以下に挙げるような,実際にアプリケーションを作成する際に役に立つちょっとしたテクニックを紹介します. マウスクリックの検出や座標の取得 キープレスの検出とキーの取得 ドラッグ&ドロップ オリジナルストックアイテムの作成 プログラムオプションの解析

10.1

マウスクリックの検出と座標の取得

この節ではマウスクリックを検出したり,マウスがクリックされたときの座標を取得する方法などを説明します.

10.1.1

マウス情報検出の準備

ウィンドウ上でマウスクリックを検出したり,マウスをクリックしたときのカーソルの座標を取得するためには,そのウィ ジェットにマウスクリック等のイベントを検出するための設定を行う必要があります.イベント検出の設定を行うには次の関数 を使用します. v o i d g t k _ w i d g e t _ s e t _ e v e n t s (G t k W i d g e t * w i d g e t , g i n t e v e n t s ) ; 第1引数にはイベントを検出したいウィジェットを指定します.第2引数には列挙体GtkEventMaskで定義されたイベント を指定します. t y p e d e f e n u m { G D K _ E X P O S U R E _ M A S K = 1 < < 1 , G D K _ P O I N T E R _ M O T I O N _ M A S K = 1 < < 2 , G D K _ P O I N T E R _ M O T I O N _ H I N T _ M A S K = 1 < < 3 , G D K _ B U T T O N _ M O T I O N _ M A S K = 1 < < 4 , G D K _ B U T T O N 1 _ M O T I O N _ M A S K = 1 < < 5 , G D K _ B U T T O N 2 _ M O T I O N _ M A S K = 1 < < 6 , G D K _ B U T T O N 3 _ M O T I O N _ M A S K = 1 < < 7 , G D K _ B U T T O N _ P R E S S _ M A S K = 1 < < 8 , G D K _ B U T T O N _ R E L E A S E _ M A S K = 1 < < 9 , G D K _ K E Y _ P R E S S _ M A S K = 1 < < 10 , G D K _ K E Y _ R E L E A S E _ M A S K = 1 < < 11 , G D K _ E N T E R _ N O T I F Y _ M A S K = 1 < < 12 ,

(2)

G D K _ L E A V E _ N O T I F Y _ M A S K = 1 < < 13 , G D K _ F O C U S _ C H A N G E _ M A S K = 1 < < 14 , G D K _ S T R U C T U R E _ M A S K = 1 < < 15 , G D K _ P R O P E R T Y _ C H A N G E _ M A S K = 1 < < 16 , G D K _ V I S I B I L I T Y _ N O T I F Y _ M A S K = 1 < < 17 , G D K _ P R O X I M I T Y _ I N _ M A S K = 1 < < 18 , G D K _ P R O X I M I T Y _ O U T _ M A S K = 1 < < 19 , G D K _ S U B S T R U C T U R E _ M A S K = 1 < < 20 , G D K _ S C R O L L _ M A S K = 1 < < 21 , G D K _ A L L _ E V E N T S _ M A S K = 0 x 3 F F F F E } G d k E v e n t M a s k;

10.1.2

マウスボタンのクリックを検出する

マウスクリックを検出するためには,前項に従ってGDK BUTTON PRESS MASKをウィジェットに設定します.次に

ウィジェットにbutton-press-eventシグナルに対するコールバック関数を設定します.このシグナルに対するコールバック 関数のプロトタイプ宣言は次のようになっています. g b o o l e a n u s e r _ f u n c t i o n (G t k W i d g e t * w i d g e t , G d k E v e n t B u t t o n * e v e n t , g p o i n t e r u s e r _ d a t a ) ; このコールバック関数は標準で設定されているコールバック関数の後に呼び出されます.また,複数のコールバック関数が存 在するときは,コールバック関数の戻り値がFALSEの場合,後に続くコールバック関数は呼び出されますが,戻り値がTRUE の場合は,後に続くコールバック関数は呼び出されません.

10.1.3

マウスの座標を取得する

マウスがクリックされたときの座標を取得するには,GdkEventButton構造体のメンバxとyを使用します.ウィンドウ上 でマウスをクリックすると,その座標をターミナルに出力する例をソース10–1–1に示します. マウスクリックを検出するためのイベントを26行目で設定し,27–28行目でコールバック関数の設定を行っています.そし て8–9行目で,マウスカーソルの座標をGdkEventButton構造体のメンバxとyによって出力しています. t y p e d e f s t r u c t { G d k E v e n t T y p e t y p e ; G d k W i n d o w * w i n d o w ; g i n t 8 s e n d _ e v e n t ; g u i n t 3 2 t i m e ; g d o u b l e x ; g d o u b l e y ; g d o u b l e * a x e s ; g u i n t s t a t e ; g u i n t b u t t o n ; G d k D e v i c e * d e v i c e ; g d o u b l e x _ r o o t , y _ r o o t ; } G d k E v e n t B u t t o n; ソース10-1-1 マウスクリックの検出と座標の取得のサンプルプログラム: mouse-tips1.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 b o o l e a n 4 c b _ m o u s e _ p r e s s (G t k W i d g e t * w i d g e t , 5 G d k E v e n t B u t t o n * e v e n t , 6 g p o i n t e r u s e r _ d a t a ) 7 { 8 g _ p r i n t ( " T h e m o u s e w a s c l i c k e d o n t h e m a i n w i n d o w a t ( % 3 d , % 3 d ) . \ n " ,

(3)

10.1 マウスクリックの検出と座標の取得 251 11 } 12 13 i n t 14 m a i n (i n t a r g c , c h a r * a r g v [ ] ) 15 { 16 G t k W i d g e t * w i n d o w ; 17 18 g t k _ i n i t ( & a r g c , & a r g v ) ; 19 20 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 ) ; 21 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 ) , " M o u s e T i p s 1 " ) ; 22 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 ) ; 23 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 " , 24 G _ C A L L B A C K ( g t k _ m a i n _ q u i t ) , N U L L ) ; 25 26 g t k _ w i d g e t _ a d d _ e v e n t s ( w i n d o w , G D K _ B U T T O N _ P R E S S _ M A S K ) ; 27 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 ) , " b u t t o n - p r e s s - e v e n t " , 28 G _ C A L L B A C K ( c b _ m o u s e _ p r e s s ) , N U L L ) ; 29 30 g t k _ w i d g e t _ s h o w _ a l l ( w i n d o w ) ; 31 g t k _ m a i n ( ) ; 32 33 r e t u r n 0 ; 34 }

10.1.4

マウスの移動を検出する

マウスの移動を検出するためには,GDK POINTER MOTION MASKをウィジェットに設定し,次にウィジェットに

motion-notify-eventシグナル に対するコールバック関数を設定します.このシグナルに対するコールバック関数のプロト タイプ宣言は次のようになっています. g b o o l e a n u s e r _ f u n c t i o n (G t k W i d g e t * w i d g e t , G d k E v e n t M o t i o n * e v e n t , g p o i n t e r u s e r _ d a t a ) ; ソース10–1–2は,マウスの移動を検出してマウスカーソルの座標を出力するサンプルです.マウスボタンを押したままでマ

ウスを移動しても検出できるように,GDK BUTTON PRESS MASKも設定していることに注意してください.

ソース10-1-2 マウス移動検出のサンプルプログラム: mouse-tips2.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 b o o l e a n 4 c b _ m o u s e _ m o v e (G t k W i d g e t * w i d g e t , 5 G d k E v e n t M o t i o n * e v e n t , 6 g p o i n t e r u s e r _ d a t a ) 7 { 8 g _ p r i n t ( " ( % 3 d , % 3 d ) \ r " , (i n t) e v e n t - >x , (i n t) e v e n t - >y ) ; 9 10 r e t u r n F A L S E ; 11 } 12 13 i n t 14 m a i n (i n t a r g c , c h a r * a r g v [ ] ) 15 { 16 G t k W i d g e t * w i n d o w ; 17 18 g t k _ i n i t ( & a r g c , & a r g v ) ; 19 20 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 ) ; 21 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 ) , " M o u s e T i p s 2 " ) ; 22 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 ) ; 23 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 " , 24 G _ C A L L B A C K ( g t k _ m a i n _ q u i t ) , N U L L ) ; 25 g t k _ w i d g e t _ s e t _ e v e n t s ( w i n d o w , 26 G D K _ B U T T O N _ P R E S S _ M A S K | 27 G D K _ P O I N T E R _ M O T I O N _ M A S K ) ; 28 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 ) , " m o t i o n - n o t i f y - e v e n t " , 29 G _ C A L L B A C K ( c b _ m o u s e _ m o v e ) , N U L L ) ;

(4)

30 31 g t k _ w i d g e t _ s h o w _ a l l ( w i n d o w ) ; 32 g t k _ m a i n ( ) ; 33 34 r e t u r n 0 ; 35 }

10.1.5

マウスボタンの種類を判定する

マウスをクリックしたときにどのボタンが押されたのかを知るには,GdkEventButton構造体メンバのbuttonを使用しま す.またGdkEventButton構造体メンバのstateを使用すると,同時にコントロールキーやシフトキーが押されているかどう かを知ることができます.

buttonの値は,左ボタンを押したときに1,中ボタンで2,右ボタンで3となります.またstateの値は,列挙体

GdkModi-fierTypeで定義された値になります.

ソース10–1–3は,マウスをクリックしたときにGdkEventButtonのbuttonの値とstateの値を表示するプログラムです.

ソース10-1-3 マウスボタンの種類検出のサンプルプログラム: mouse-tips3.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 b o o l e a n 4 c b _ m o u s e _ p r e s s (G t k W i d g e t * w i d g e t , 5 G d k E v e n t B u t t o n * e v e n t , 6 g p o i n t e r u s e r _ d a t a ) 7 { 8 g _ p r i n t ( " B u t t o n t y p e = % d , S t a t e = % d \ n " , e v e n t - >b u t t o n , e v e n t - >s t a t e ) ; 9 r e t u r n F A L S E ; 10 } 11 12 i n t 13 m a i n (i n t ar g c , c h a r * a r g v [ ] ) 14 { 15 G t k W i d g e t * w i n d o w ; 16 17 g t k _ i n i t ( & a r g c , & a r g v ) ; 18 19 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 ) ; 20 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 ) , " M o u s e T i p s 3 " ) ; 21 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 ) ; 22 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 " , 23 G _ C A L L B A C K ( g t k _ m a i n _ q u i t ) , N U L L ) ; 24 25 g t k _ w i d g e t _ a d d _ e v e n t s ( w i n d o w , G D K _ B U T T O N _ P R E S S _ M A S K ) ; 26 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 ) , " b u t t o n - p r e s s - e v e n t " , 27 G _ C A L L B A C K ( c b _ m o u s e _ p r e s s ) , N U L L ) ; 28 29 g t k _ w i d g e t _ s h o w _ a l l ( w i n d o w ) ; 30 g t k _ m a i n ( ) ; 31 32 r e t u r n 0 ; 33 }

10.1.6

ダブルクリックを検出する

マウスのダブルクリックを検出するには,GdkEventButton 構造体メンバのtype を使用します.ダブルクリックは

GdkEventTypeで,GDK 2BUTTON PRESS = 5と定義されています.

10.1.7

マウスカーソルを変更する

マウスカーソルを変更する手順は「カーソルデータの生成」と「カーソルの設定」の2段階からなります.

カーソルデータを生成するにはいくつかの方法がありますが,ここでは次の方法を説明します.

1. 既存のカーソルを使用する方法

(5)

10.1 マウスクリックの検出と座標の取得 253

既存のカーソルを使用する方法

既存のカーソルを使用するには関数gdk cursor new for displayを使用します. G d k C u r s o r* g d k _ c u r s o r _ n e w _ f o r _ d i s p l a y (G d k D i s p l a y * d i s p l a y ,

G d k C u r s o r T y p e c u r s o r _ t y p e ) ;

この関数は2つの引数を取ります.1つ目の引数にはGdkDiplay型の変数を指定しますが,これは関数gdk display get default により取得すればいいでしょう. G d k D i s p l a y* g d k _ d i s p l a y _ g e t _ d e f a u l t (v o i d) ; 次に2つ目の引数で使用するカーソルを指定します.これは次のGdkCursorTypeで定義されています. t y p e d e f e n u m { G D K _ X _ C U R S O R = 0 , G D K _ A R R O W = 2 , G D K _ B A S E D _ A R R O W _ D O W N = 4 , . . . G D K _ X T E R M = 1 5 2 , G D K _ L A S T _ C U R S O R , G D K _ C U R S O R _ I S _ P I X M A P = -1 } G d k C u r s o r T y p e; ソース10–1–4に,既存のカーソルを使用してマウスカーソルを変更する例を示します. ソース10-1-4 マウスカーソル変更のサンプルプログラム: mouse-tips5-1.c 1 # i n c l u d e <g t k / g t k . h > 2 3 i n t 4 m a i n (i n t a r g c , c h a r * a r g v [ ] ) 5 { 6 G t k W i d g e t * w i n d o w ; 7 G d k C u r s o r * c u r s o r ; 8 9 g t k _ i n i t ( & a r g c , & a r g v ) ; 10 11 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 ) ; 12 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 ) , " M o u s e T i p s 5 - 1 " ) ; 13 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 ) ; 14 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 " , 15 G _ C A L L B A C K ( g t k _ m a i n _ q u i t ) , N U L L ) ; 16 g t k _ w i d g e t _ s h o w _ a l l ( w i n d o w ) ; 17 18 c u r s o r = g d k _ c u r s o r _ n e w _ f o r _ d i s p l a y ( g d k _ d i s p l a y _ g e t _ d e f a u l t ( ) , 19 G D K _ X _ C U R S O R ) ; 20 g d k _ w i n d o w _ s e t _ c u r s o r ( w i n d o w - >w i n d o w , c u r s o r ) ; 21 22 g t k _ m a i n ( ) ; 23 24 r e t u r n 0 ; 25 } ビットマップデータからカーソルを生成する方法

作成したいカーソル画像とそのマスクデータがchar型の配列で与えられているとき,まず関数gdk bitmap new from data によってカーソル画像とそのマスクデータのビットマップを生成します.

G d k B i t m a p* g d k _ b i t m a p _ c r e a t e _ f r o m _ d a t a (G d k D r a w a b l e * d r a w a b l e , c o n s t g c h a r * d a t a , g i n t w i d t h , g i n t h e i g h t ) ;

ビットマップデータが用意できたら,関数gdk cursor new from pixmapでカーソルを生成します. G d k C u r s o r* g d k _ c u r s o r _ n e w _ f r o m _ p i x m a p (G d k P i x m a p * s o u r c e ,

(6)

c o n s t G d k C o l o r * fg , c o n s t G d k C o l o r * bg , g i n t x , g i n t y ) ; 関数の第5引数と第6引数の(x, y)には,カーソル座標のカーソル画像中の位置を指定します.また関数の第3引数と第4 引数には,カーソルの前景色と背景色をGdkColorで指定する必要があります. ソース10–1–5は,マウスボタンを押したときと離したときにマウスカーソルを変更するプログラムです.マウスボタンが離

されたときのイベントを検出するために,100行目でGDK BUTTON RELEASE MASKを設定していることに注意してくだ

さい. ソース10-1-5 ビットマップからカーソルを生成するサンプルプログラム: mouse-tips5-2.c 1 # i n c l u d e <g t k / g t k . h > 2 3 G d k C u r s o r * h a n d _ o p e n ; 4 G d k C u r s o r * h a n d _ c l o s e ; 5 6 s t a t i c c h a r h a n d _ o p e n _ d a t a [ ] = 7 { 8 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x06 , 0 x00 , 9 0 x60 , 0 x36 , 0 x00 , 0 x60 , 0 x36 , 0 x00 , 0 xc0 , 0 x36 , 0 x01 , 0 xc0 , 0 xb6 , 0 x01 , 10 0 x80 , 0 xbf , 0 x01 , 0 x98 , 0 xff , 0 x01 , 0 xb8 , 0 xff , 0 x00 , 0 xf0 , 0 xff , 0 x00 , 11 0 xe0 , 0 xff , 0 x00 , 0 xe0 , 0 x7f , 0 x00 , 0 xc0 , 0 x7f , 0 x00 , 0 x80 , 0 x3f , 0 x00 , 12 0 x00 , 0 x3f , 0 x00 , 0 x00 , 0 x3f , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x 0 0 13 } ; 14 15 s t a t i c c h a r h a n d _ o p e n _ m a s k [ ] = 16 { 17 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x06 , 0 x00 , 0 x60 , 0 x3f , 0 x00 , 18 0 xf0 , 0 x7f , 0 x00 , 0 xf0 , 0 x7f , 0 x01 , 0 xe0 , 0 xff , 0 x03 , 0 xe0 , 0 xff , 0 x03 , 19 0 xd8 , 0 xff , 0 x03 , 0 xfc , 0 xff , 0 x03 , 0 xfc , 0 xff , 0 x01 , 0 xf8 , 0 xff , 0 x01 , 20 0 xf0 , 0 xff , 0 x01 , 0 xf0 , 0 xff , 0 x00 , 0 xe0 , 0 xff , 0 x00 , 0 xc0 , 0 x7f , 0 x00 , 21 0 x80 , 0 x7f , 0 x00 , 0 x80 , 0 x7f , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x 0 0 22 } ; 23 24 s t a t i c c h a r h a n d _ c l o s e _ d a t a [ ] = 25 { 26 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 27 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x06 , 0 x00 , 0 x80 , 0 x3f , 0 x00 , 28 0 x80 , 0 xff , 0 x00 , 0 x80 , 0 xff , 0 x00 , 0 xb0 , 0 xff , 0 x00 , 0 xf0 , 0 xff , 0 x00 , 29 0 xe0 , 0 xff , 0 x00 , 0 xe0 , 0 x7f , 0 x00 , 0 xc0 , 0 x7f , 0 x00 , 0 x80 , 0 x3f , 0 x00 , 30 0 x00 , 0 x3f , 0 x00 , 0 x00 , 0 x3f , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x 0 0 31 } ; 32 33 s t a t i c c h a r h a n d _ c l o s e _ m a s k [ ] = 34 { 35 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 36 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x06 , 0 x00 , 0 x80 , 0 x3f , 37 0 x00 , 0 xc0 , 0 xff , 0 x00 , 0 xc0 , 0 xff , 0 x01 , 0 xf0 , 0 xff , 0 x01 , 38 0 xf8 , 0 xff , 0 x01 , 0 xf8 , 0 xff , 0 x01 , 0 xf0 , 0 xff , 0 x01 , 0 xf0 , 39 0 xff , 0 x00 , 0 xe0 , 0 xff , 0 x00 , 0 xc0 , 0 x7f , 0 x00 , 0 x80 , 0 x7f , 40 0 x00 , 0 x80 , 0 x7f , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x 0 0 41 } ; 42 43 s t a t i c G d k C u r s o r* 44 m a k e _ c u r s o r (c h a r * c u r s o r _ d a t a , 45 c h a r * c u r s o r _ m a s k , 46 i n t w i d t h , 47 i n t h e i g h t ) 48 { 49 G d k B i t m a p * d a t a ; 50 G d k B i t m a p * m a s k ; 51 G d k C o l o r b l a c k = {0 , 0 , 0 , 0 } ; 52 G d k C o l o r w h i t e = {0 , 0 x f f f f , 0 x f f f f , 0 x f f f f } ; 53 G d k C u r s o r * c u r s o r ; 54 55 d a t a = g d k _ b i t m a p _ c r e a t e _ f r o m _ d a t a ( N U L L , c u r s o r _ d a t a , w i d t h , h e i g h t ) ; 56 m a s k = g d k _ b i t m a p _ c r e a t e _ f r o m _ d a t a ( N U L L , c u r s o r _ m a s k , w i d t h , h e i g h t ) ; 57 c u r s o r = g d k _ c u r s o r _ n e w _ f r o m _ p i x m a p ( d a t a , m a s k , & w h i t e , & b l a c k , 58 w i d t h / 2 , h e i g h t / 2 ) ; 59 g _ o b j e c t _ u n r e f ( d a t a ) ;

(7)

10.2 キープレスの検出とキーの取得 255 60 g _ o b j e c t _ u n r e f ( m a s k ) ; 61 62 r e t u r n c u r s o r ; 63 } 64 65 s t a t i c g b o o l e a n 66 c b _ m o u s e _ p r e s s (G t k W i d g e t * w i d g e t , 67 G d k E v e n t B u t t o n * e v e n t , 68 g p o i n t e r u s e r _ d a t a ) 69 { 70 g d k _ w i n d o w _ s e t _ c u r s o r ( w i d g e t - >w i n d o w , h a n d _ c l o s e ) ; 71 72 r e t u r n F A L S E ; 73 } 74 75 s t a t i c g b o o l e a n 76 c b _ m o u s e _ r e l e a s e (G t k W i d g e t * w i d g e t , 77 G d k E v e n t B u t t o n * e v e n t , 78 g p o i n t e r u s e r _ d a t a ) 79 { 80 g d k _ w i n d o w _ s e t _ c u r s o r ( w i d g e t - >w i n d o w , h a n d _ o p e n ) ; 81 82 r e t u r n F A L S E ; 83 } 84 85 i n t 86 m a i n (i n t a r g c , c h a r * a r g v [ ] ) 87 { 88 G t k W i d g e t * w i n d o w ; 89 90 g t k _ i n i t ( & a r g c , & a r g v ) ; 91 92 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 ) ; 93 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 ) , " M o u s e T i p s 5 - 2 " ) ; 94 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 ) ; 95 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 " , 96 G _ C A L L B A C K ( g t k _ m a i n _ q u i t ) , N U L L ) ; 97 98 g t k _ w i d g e t _ a d d _ e v e n t s ( w i n d o w , 99 G D K _ B U T T O N _ P R E S S _ M A S K | 100 G D K _ B U T T O N _ R E L E A S E _ M A S K ) ; 101 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 ) , " b u t t o n - p r e s s - e v e n t " , 102 G _ C A L L B A C K ( c b _ m o u s e _ p r e s s ) , N U L L ) ; 103 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 ) , " b u t t o n - r e l e a s e - e v e n t " , 104 G _ C A L L B A C K ( c b _ m o u s e _ r e l e a s e ) , N U L L ) ; 105 106 h a n d _ o p e n = m a k e _ c u r s o r ( h a n d _ o p e n _ d a t a , h a n d _ o p e n _ m a s k , 20 , 2 0 ) ; 107 h a n d _ c l o s e = m a k e _ c u r s o r ( h a n d _ c l o s e _ d a t a , h a n d _ c l o s e _ m a s k , 20 , 2 0 ) ; 108 109 g t k _ w i d g e t _ s h o w _ a l l ( w i n d o w ) ; 110 g d k _ w i n d o w _ s e t _ c u r s o r ( w i n d o w - >w i n d o w , h a n d _ o p e n ) ; 111 g t k _ m a i n ( ) ; 112 113 r e t u r n 0 ; 114 }

10.2

キープレスの検出とキーの取得

この節ではキープレスの検出と押されたキーの取得方法を説明します.

10.2.1

キープレス検出の準備

ウィンドウ上でキーが押されたことを検出するには,前節のマウスのときと同様に,そのウィジェットにキープレス等のイベ ントを検出するための設定を行う必要があります.

イベント検出の設定を行うには,関数 を使用します.キーが押されたことを検出するためにはGDK KEY PRESS MASK

(8)

10.2.2

キープレスを検出する

キープレスを検出してコールバック関数を呼び出すには,ウィジェットにkey-press-eventシグナルに対するコールバック 関数を設定します.このシグナルに対するコールバック関数のプロトタイプ宣言は次のようになっています. g b o o l e a n u s e r _ f u n c t i o n (G t k W i d g e t * w i d g e t , G d k E v e n t K e y * e v e n t , g p o i n t e r u s e r _ d a t a ) ;

10.2.3

キーを取得する

キーの種類を取得するにはGdkEvenKey構造体のメンバを使用します.GdkEventKey構造体は次のように定義されてい ます. t y p e d e f s t r u c t { G d k E v e n t T y p e t y p e ; G d k W i n d o w * w i n d o w ; g i n t 8 s e n d _ e v e n t ; g u i n t 3 2 t i m e ; g u i n t s t a t e ; g u i n t k e y v a l ; g i n t l e n g t h ; g c h a r * s t r i n g ; g u i n t 1 6 h a r d w a r e _ k e y c o d e ; g u i n t 8 g r o u p ; } G d k E v e n t K e y;

keyvalはキーの種類,stateは同時に押されているコントロールキーやシフトキーの種類,stringはキーの種類の文字列を表

します.

ソース10–2は,押されたキーに対するGdkEventKeyのkeyval,state,stringの値を表示するプログラムです.

ソース10-2 キープレスの検出とキーの取得のサンプルプログラム: key-tips1.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 b o o l e a n 4 c b _ k e y _ p r e s s (G t k W i d g e t * w i d g e t , 5 G d k E v e n t K e y * e v e n t , 6 g p o i n t e r u s e r _ d a t a ) 7 { 8 g _ p r i n t ( " k e y v a l = % d , s t a t e = % d , s t r i n g = % s \ n " , 9 e v e n t - >k e y v a l , e v e n t - >s t a t e , e v e n t - >s t r i n g ) ; 10 r e t u r n F A L S E ; 11 } 12 13 i n t 14 m a i n (i n t ar g c , c h a r * a r g v [ ] ) 15 { 16 G t k W i d g e t * w i n d o w ; 17 18 g t k _ i n i t ( & a r g c , & a r g v ) ; 19 20 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 ) ; 21 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 ) , " K e y T i p s 1 " ) ; 22 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 ) ; 23 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 " , 24 G _ C A L L B A C K ( g t k _ m a i n _ q u i t ) , N U L L ) ; 25 26 g t k _ w i d g e t _ a d d _ e v e n t s ( w i n d o w , G D K _ K E Y _ P R E S S _ M A S K ) ; 27 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 ) , " key - p r e s s - e v e n t " , 28 G _ C A L L B A C K ( c b _ k e y _ p r e s s ) , N U L L ) ; 29 30 g t k _ w i d g e t _ s h o w _ a l l ( w i n d o w ) ; 31 g t k _ m a i n ( ) ;

(9)

10.3 ドラッグ&ドロップ 257 32 33 r e t u r n 0 ; 34 }

10.3

ドラッグ&ドロップ

ドラッグ&ドロップは,GUIアプリケーションにはなくてはならない便利な機能です.ここではドラッグ&ドロップの詳し い原理には触れず,実際のアプリケーションでの実装例を紹介します.

10.3.1

ドロップ機能の実装

まずウィジェットをドラッグ&ドロップのドロップ側,つまりデータの受け手として実装する方法を説明します.ウィジェッ

トにドロップの機能を設定するのは非常に簡単です.ドロップ機能を設定したいウィジェットに対して,関数gtk drag dest set

を使ってドロップの設定を行うだけです. v o i d g t k _ d r a g _ d e s t _ s e t (G t k W i d g e t * w i d g e t , G t k D e s t D e f a u l t s f l a g s , c o n s t G t k T a r g e t E n t r y * t a r g e t s , g i n t n _ t a r g e t s , G d k D r a g A c t i o n a c t i o n s ) ; 引数の第1ウィジェットには,ドロップ機能を設定したいウィジェットを指定します.第2引数には,列挙体GtkDestDefault

で定義された値(表10.1を参照)を指定します.大抵の場合は,GTK DEST DEFAULT ALLを指定しておけばよいでしょう.

表10.1 GtkDestDefaultの値

値 説明

GTK DEST DEFAULT MOTION ドラッグ動作中にドラッグ可能なウィジェットかどうか調べる.

GTK DEST DEFAULT HIGHLIGHT ドラッグ中にハイライト表示する.

GTK DEST DEFAULT DROP ドロップ動作が起きたときにドロップ可能なウィジェットかどうか調べる.

GTK DEST DEFAULT ALL 上記をすべて行う.

第3引数はドロップされるデータとして受け付けるデータ形式を構造体GtkTargetEntry型の変数で指定し,第4引数には その数を指定します. t y p e d e f s t r u c t { g c h a r * t a r g e t ; g u i n t f l a g s ; g u i n t i n f o ; } G t k T a r g e t E n t r y;

targetにはドロップを受け付けるデータのMIME型を与えます.そしてflagsには,GtkTargetFlagsで定義された値(表

10.2を参照)もしくは0を与えます.0を指定すると,ドラッグ側のアプリケーションやウィジェットを制限しません.infoに

はドロップされたデータを識別するための値を任意に指定します.

表10.2 GtkTargetFlagsの値

値 説明

GTK TARGET SAME APP 同一のアプリケーションでのみ操作を許可する.

GTK TARGET SAME WIDGET 同一のウィジェットでのみ操作を許可する.

GTK TARGET OTHER APP 他のアプリケーションでも操作を許可する.

GTK TARGET OTHER WIDGET 他のウィジェットでも操作を許可する.

関数の最後の引数には,コピーや移動などのどの操作に対して反応するかを,列挙体GdkDragActionで定義された値(表

10.3を参照)の論理和で指定します.

drag-data-receivedシグナルに対するコールバック関数

以上のように関数gtk drag dest setを使ってドロップの設定を行えば,そのウィジェットにはドロップの機能が設定され,

(10)

表10.3 GdkDragActionの値 値 説明 GDK ACTION DEFAULT 何の意味も持たない(指定してはいけない). GDK ACTION COPY データをコピーする. GDK ACTION MOVE データを移動する. GDK ACTION LINK リンクを作成する. GDK ACTION PRIVATE ソース側に動作を確認する. GDK ACTION ASK ユーザに動作を確認する. しかし,このままでは受け取ったデータに対して何も操作を行えません.そこで,drag-data-receivedシグナルに対する コールバック関数を定義して,その関数内でドラッグデータを操作することにします.drag-data-receivedシグナルに対する コールバック関数のプロトタイプ宣言は次のようになっています. v o i d u s e r _ f u n c t i o n (G t k W i d g e t * w i d g e t , G d k D r a g C o n t e x t * d r a g _ c o n t e x t , g i n t x , g i n t y , G t k S e l e c t i o n D a t a * d a t a , g u i n t i n f o , g u i n t t i m e , g p o i n t e r u s e r _ d a t a ) ; いろいろな引数がありますが,基本的には第6引数のdataと第7引数infoからドラッグデータの情報を得ることができま

す.第7引数のinfoには,構造体GtkTargetEntryのメンバinfoで指定した値が入ります.構造体GtkSelectionDataは次の ように定義されています. t y p e d e f s t r u c t { G d k A t o m s e l e c t i o n ; G d k A t o m t a r g e t ; G d k A t o m t y p e ; g i n t f o r m a t ; g u c h a r * d a t a ; g i n t l e n g t h ; G d k D i s p l a y * d i s p l a y ; } G t k S e l e c t i o n D a t a; ドロップデータを表示するサンプルプログラム ソース10–3–1に,ドロップデータの情報をターミナルに表示するプログラムを示します(図10.1).いろいろなデータをド ロップして,どのような情報が表示されるかを調べてみるといいでしょう.

ここではwindowウィジェットに対して,71–73行目で関数gtk drag dest setによってドロップ機能の設定を行っています.

12–19行目で定義した変数target tableで,Webデータもドロップの対象としています.また,74–75行目でdrag-data-received

シグナルに対するコールバック関数を設定しています.コールバック関数の実体は23–55行目です. ドロップ処理が終了したときには,関数gtk drag finishを呼び出します. v o i d g t k _ d r a g _ f i n i s h (G d k D r a g C o n t e x t * c o n t e x t , g b o o l e a n s u c c e s s , g b o o l e a n del , g u i n t 3 2 t i m e _ ) ; ドラッグ側でデータを削除するように促すには,第3引数をTRUEにします.

(11)

10.3 ドラッグ&ドロップ 259 図10.1 ドロップ操作のサンプル ソース10-3-1 ドロップ機能の実装: dnd-sample1.c 1 # i n c l u d e <g t k / g t k . h > 2 3 e n u m 4 { 5 D R O P _ U R I _ L I S T , 6 D R O P _ X _ M O Z _ U R L , 7 D R O P _ H T M L , 8 D R O P _ T E X T _ P L A I N , 9 D R O P _ S T R I N G 10 } ; 11 12 s t a t i c G t k T a r g e t E n t r y t a r g e t _ t a b l e [ ] = 13 { 14 { " t e x t / uri - l i s t " , 0 , D R O P _ U R I _ L I S T } , 15 { " t e x t / x - moz - u r l " , 0 , D R O P _ X _ M O Z _ U R L } , 16 { " t e x t / h t m l " , 0 , D R O P _ H T M L } , 17 { " t e x t / p l a i n " , 0 , D R O P _ T E X T _ P L A I N } , 18 { " S T R I N G " , 0 , D R O P _ S T R I N G } 19 } ; 20 21 s t a t i c g u i n t n t a r g e t s = s i z e o f ( t a r g e t _ t a b l e ) / s i z e o f ( t a r g e t _ t a b l e [ 0 ] ) ; 22 23 s t a t i c v o i d 24 c b _ d r a g _ d a t a _ r e c e i v e d (G t k W i d g e t * w i d g e t , 25 G d k D r a g C o n t e x t * c o n t e x t , 26 g i n t x , 27 g i n t y , 28 G t k S e l e c t i o n D a t a * d a t a , 29 g u i n t i n f o , 30 g u i n t t i m e , 31 g p o i n t e r u s e r _ d a t a ) 32 { 33 g c h a r * r e c e i v e d ; 34 i n t n ; 35 36 g _ p r i n t ( " d a t a - >t a r g e t = % s \ n " , g d k _ a t o m _ n a m e ( d a t a - >t a r g e t ) ) ; 37 g _ p r i n t ( " d a t a - >t y p e = % s \ n " , g d k _ a t o m _ n a m e ( d a t a - >t y p e ) ) ; 38 g _ p r i n t ( " d a t a - >l e n g t h = % d \ n " , d a t a - >l e n g t h ) ; 39 g _ p r i n t ( " d a t a - >f o r m a t = % d \ n " , d a t a - >f o r m a t ) ; 40 g _ p r i n t ( " i n f o = % d \ n " , i n f o ) ; 41 42 i f ( d a t a - >l e n g t h > 0 & & d a t a - >f o r m a t = = 8 ) 43 { 44 g _ p r i n t ( " R e c e i v e d s t r i n g = " ) ; 45 r e c e i v e d = g _ s t r c h o m p ( d a t a - >d a t a ) ; 46 f o r ( n = 0 ; n < d a t a - >l e n g t h ; n + + ) 47 { 48 i f ( r e c e i v e d [ n ] ! = ’\ 0 ’) g _ p r i n t ( " % c " , r e c e i v e d [ n ] ) ; 49 } 50 g _ p r i n t ( " \ n " ) ; 51 g t k _ d r a g _ f i n i s h ( c o n t e x t , T R U E , F A L S E , t i m e ) ; 52 r e t u r n; 53 } 54 g t k _ d r a g _ f i n i s h ( c o n t e x t , F A L S E , F A L S E , t i m e ) ; 55 } 56 57 i n t 58 m a i n (i n t a r g c , c h a r * * a r g v ) 59 {

(12)

60 G t k W i d g e t * w i n d o w ; 61 G t k W i d g e t * l a b e l ; 62 63 g t k _ i n i t ( & a r g c , & a r g v ) ; 64 65 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 ) ; 66 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 ) , " D r a g a n d D r o p S a m p l e 1 " ) ; 67 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 ) ; 68 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 " , 69 G _ C A L L B A C K ( g t k _ m a i n _ q u i t ) , N U L L ) ; 70 71 g t k _ d r a g _ d e s t _ s e t ( w i n d o w , 72 G T K _ D E S T _ D E F A U L T _ A L L , t a r g e t _ t a b l e , n t a r g e t s - 1 , 73 G D K _ A C T I O N _ C O P Y | G D K _ A C T I O N _ M O V E ) ; 74 g _ s i g n a l _ c o n n e c t ( w i n d o w , " d r a g - d a t a - r e c e i v e d " , 75 G _ C A L L B A C K ( c b _ d r a g _ d a t a _ r e c e i v e d ) , N U L L ) ; 76 77 l a b e l = g t k _ l a b e l _ n e w ( " D r o p h e r e " ) ; 78 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 ) , l a b e l ) ; 79 80 g t k _ w i d g e t _ s h o w _ a l l ( w i n d o w ) ; 81 g t k _ m a i n ( ) ; 82 83 r e t u r n 0 ; 84 }

10.3.2

ドラッグ機能の実装

次に,ドラッグ機能の実装について説明します.ウィジェットにドラッグ機能を設定するには,関数gtk drag source setを

使用します. v o i d g t k _ d r a g _ s o u r c e _ s e t (G t k W i d g e t * w i d g e t , G d k M o d i f i e r T y p e s t a r t _ b u t t o n _ m a s k , c o n s t G t k T a r g e t E n t r y * t a r g e t s , g i n t n _ t a r g e t s , G d k D r a g A c t i o n a c t i o n s ) ;

また,GtkIconViewウィジェットのそれぞれのアイコンにドラッグ機能を持たせるには,関数gtk icon view model drag source

を使用します. v o i d g t k _ i c o n _ v i e w _ e n a b l e _ m o d e l _ d r a g _ s o u r c e (G t k I c o n V i e w * i c o n _ v i e w , G d k M o d i f i e r T y p e s t a r t _ b u t t o n _ m a s k , c o n s t G t k T a r g e t E n t r y * t a r g e t s , g i n t n _ t a r g e t s , G d k D r a g A c t i o n a c t i o n s ) ; この2つの関数は,第2引数以降は全く同じです.第2引数ではどのボタンでドラッグを行うかを,列挙体GdkModifierType

で定義された値で指定します.第3引数から第5引数までは,関数gtk drag dest setの引数と同様です.

drag-data-getシグナルに対するコールバック関数 そして,ドラッグが起こったときにドラッグ用のデータを設定するために,drag-data-getシグナルに対するコールバック 関数を設定し,そのコールバック関数内でデータの設定を行います.drag-data-getシグナルに対するコールバック関数のプロ トタイプ宣言は次のようになります. v o i d u s e r _ f u n c t i o n (G t k W i d g e t * w i d g e t , G d k D r a g C o n t e x t * d r a g _ c o n t e x t , G t k S e l e c t i o n D a t a * d a t a , g u i n t i n f o , g u i n t t i m e , g p o i n t e r u s e r _ d a t a ) ;

この関数の第3引数のdataに対して,関数gtk selection data setを使用してドラッグデータを設定します. v o i d g t k _ s e l e c t i o n _ d a t a _ s e t (G t k S e l e c t i o n D a t a * s e l e c t i o n _ d a t a ,

(13)

10.3 ドラッグ&ドロップ 261 g i n t f o r m a t , c o n s t g u c h a r * d a t a , g i n t l e n g t h ) ; 第1引数には,drag-data-getシグナルに対するコールバック関数の第3引数dataを指定します.そして第2引数には,第 3引数dataのメンバtargetを指定します.第3引数はデータ1単位のビット数を指定します.通常は8(ビット)とします. 第4引数にはドラッグデータを指定し,第5引数にはその長さを指定します. ドラッグ機能を設定したサンプルプログラム ソース10–3–2は,アイコンビューウィジェットの各アイコンにドラッグ機能を設定したプログラムです.図10.2はプログ ラムの実行画面です.上段のアイコンを下段のフレーム内にドラッグ&ドロップすると,アイコンのラベルをターミナルに出力 します. 図10.2 ドラッグ&ドロップアプリケーション ソース10-3-2 ドラッグ機能の実装: dnd-sample2.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 r i n g . h > 3 4 e n u m 5 { 6 D R O P _ U R I _ L I S T , 7 D R O P _ X _ M O Z _ U R L , 8 D R O P _ H T M L , 9 D R O P _ T E X T _ P L A I N , 10 D R O P _ S T R I N G 11 } ; 12 13 s t a t i c G t k T a r g e t E n t r y t a r g e t _ t a b l e [ ] = 14 { 15 { " t e x t / uri - l i s t " , 0 , D R O P _ U R I _ L I S T } , 16 { " t e x t / x - moz - u r l " , 0 , D R O P _ X _ M O Z _ U R L } , 17 { " t e x t / h t m l " , 0 , D R O P _ H T M L } , 18 { " t e x t / p l a i n " , 0 , D R O P _ T E X T _ P L A I N } , 19 { " S T R I N G " , 0 , D R O P _ S T R I N G } 20 } ; 21 22 s t a t i c g u i n t n t a r g e t s = s i z e o f ( t a r g e t _ t a b l e ) / s i z e o f ( t a r g e t _ t a b l e [ 0 ] ) ; 23 24 e n u m 25 { 26 C O L U M N _ N A M E , 27 C O L U M N _ P I X B U F , 28 N _ C O L U M N S 29 } ; 30 31 s t a t i c v o i d 32 a d d _ d a t a (G t k I c o n V i e w * i c o n v i e w ) 33 { 34 G d k P i x b u f * f o l d e r _ p i x b u f ; 35 G d k P i x b u f * f i l e _ p i x b u f ; 36 G t k L i s t S t o r e * s t o r e ; 37 G t k T r e e I t e r i t e r ; 38 39 f o l d e r _ p i x b u f = g d k _ p i x b u f _ n e w _ f r o m _ f i l e ( " f o l d e r . p n g " , N U L L ) ;

(14)

40 f i l e _ p i x b u f = g d k _ p i x b u f _ n e w _ f r o m _ f i l e ( " f i l e . p n g " , N U L L ) ; 41 42 s t o r e = G T K _ L I S T _ S T O R E ( g t k _ i c o n _ v i e w _ g e t _ m o d e l ( i c o n v i e w ) ) ; 43 44 g t k _ l i s t _ s t o r e _ c l e a r ( s t o r e ) ; 45 46 g t k _ l i s t _ s t o r e _ a p p e n d ( s t o r e , & i t e r ) ; 47 g t k _ l i s t _ s t o r e _ s e t ( s t o r e , & i t e r , 48 C O L U M N _ N A M E , " f o l d e r . p n g " , 49 C O L U M N _ P I X B U F , f o l d e r _ p i x b u f , -1); 50 g _ o b j e c t _ u n r e f ( f o l d e r _ p i x b u f ) ; 51 52 g t k _ l i s t _ s t o r e _ a p p e n d ( s t o r e , & i t e r ) ; 53 g t k _ l i s t _ s t o r e _ s e t ( s t o r e , & i t e r , 54 C O L U M N _ N A M E , " f i l e . p n g " , 55 C O L U M N _ P I X B U F , f i l e _ p i x b u f , -1); 56 g _ o b j e c t _ u n r e f ( f i l e _ p i x b u f ) ; 57 } 58 59 s t a t i c G t k W i d g e t* 60 c r e a t e _ i c o n _ v i e w _ w i d g e t (v o i d) 61 { 62 G t k W i d g e t * i c o n v i e w ; 63 G t k L i s t S t o r e * s t o r e ; 64 65 s t o r e = g t k _ l i s t _ s t o r e _ n e w ( N _ C O L U M N S , G _ T Y P E _ S T R I N G , G D K _ T Y P E _ P I X B U F ) ; 66 i c o n v i e w = g t k _ i c o n _ v i e w _ n e w _ w i t h _ m o d e l ( G T K _ T R E E _ M O D E L ( s t o r e ) ) ; 67 g _ o b j e c t _ u n r e f ( s t o r e ) ; 68 69 r e t u r n i c o n v i e w ; 70 } 71 72 s t a t i c v o i d 73 s o u r c e _ d r a g _ d a t a _ g e t (G t k W i d g e t * w i d g e t , 74 G d k D r a g C o n t e x t * c o n t e x t , 75 G t k S e l e c t i o n D a t a * d a t a , 76 g u i n t i n f o , 77 g u i n t t i m e , 78 g p o i n t e r u s e r _ d a t a ) 79 { 80 G L i s t * r o o t , * l i s t , * s t r i n g _ l i s t = N U L L ; 81 G t k T r e e M o d e l * m o d e l ; 82 G S t r i n g * s t r i n g ; 83 84 m o d e l 85 = G T K _ T R E E _ M O D E L ( g t k _ i c o n _ v i e w _ g e t _ m o d e l ( G T K _ I C O N _ V I E W ( w i d g e t ) ) ) ; 86 r o o t = g t k _ i c o n _ v i e w _ g e t _ s e l e c t e d _ i t e m s ( G T K _ I C O N _ V I E W ( w i d g e t ) ) ; 87 88 f o r ( l i s t = r o o t ; l i s t ; l i s t = g _ l i s t _ n e x t ( l i s t ) ) 89 { 90 G t k T r e e P a t h * p a t h ; 91 G t k T r e e I t e r i t e r ; 92 g c h a r * n a m e ; 93 94 p a t h = (G t k T r e e P a t h * ) l i s t - >d a t a ; 95 g t k _ t r e e _ m o d e l _ g e t _ i t e r ( m o d e l , & i t e r , p a t h ) ; 96 g t k _ t r e e _ m o d e l _ g e t ( m o d e l , & i t e r , C O L U M N _ N A M E , & n a m e , -1); 97 s t r i n g _ l i s t = g _ l i s t _ a p p e n d ( s t r i n g _ l i s t , n a m e ) ; 98 } 99 s t r i n g = g _ s t r i n g _ n e w ( (c o n s t g c h a r * ) s t r i n g _ l i s t - >d a t a ) ; 100 f o r ( l i s t = g _ l i s t _ n e x t ( s t r i n g _ l i s t ) ; l i s t ; l i s t = g _ l i s t _ n e x t ( l i s t ) ) 101 { 102 s t r i n g = g _ s t r i n g _ a p p e n d ( s t r i n g , " \ n " ) ; 103 s t r i n g = g _ s t r i n g _ a p p e n d ( s t r i n g , (c o n s t g c h a r * ) l i s t - >d a t a ) ; 104 } 105 g t k _ s e l e c t i o n _ d a t a _ s e t ( d a t a , d a t a - >t a r g e t , 8 , 106 s t r i n g - >str , s t r l e n ( s t r i n g - >s t r ) ) ; 107 g _ s t r i n g _ f r e e ( s t r i n g , F A L S E ) ; 108 } 109 110 s t a t i c v o i d 111 c b _ d r a g _ d a t a _ r e c e i v e d (G t k W i d g e t * w i d g e t , 112 G d k D r a g C o n t e x t * c o n t e x t , 113 g i n t x , 114 g i n t y , 115 G t k S e l e c t i o n D a t a * d a t a ,

(15)

10.3 ドラッグ&ドロップ 263 116 g u i n t i n f o , 117 g u i n t t i m e ) 118 { 119 g c h a r * r e c e i v e d ; 120 i n t n ; 121 122 i f ( ( d a t a - >l e n g t h >= 0 ) & & ( d a t a - >f o r m a t = = 8 ) ) 123 { 124 g _ p r i n t ( " R e c e i v e d s t r i n g = " ) ; 125 r e c e i v e d = g _ s t r c h o m p ( d a t a - >d a t a ) ; 126 f o r ( n = 0 ; n < d a t a - >l e n g t h ; n + + ) 127 { 128 i f ( d a t a - >d a t a [ n ] ! = ’\ 0 ’) g _ p r i n t ( " % c " , d a t a - >d a t a [ n ] ) ; 129 } 130 g _ p r i n t ( " \ n " ) ; 131 r e t u r n; 132 } 133 g t k _ d r a g _ f i n i s h ( c o n t e x t , F A L S E , F A L S E , t i m e ) ; 134 } 135 136 i n t 137 m a i n (i n t a r g c , c h a r * * a r g v ) 138 { 139 G t k W i d g e t * w i n d o w ; 140 G t k W i d g e t * v b o x ; 141 G t k W i d g e t * i c o n v i e w ; 142 G t k W i d g e t * f r a m e ; 143 G t k W i d g e t * l a b e l ; 144 145 g t k _ i n i t ( & a r g c , & a r g v ) ; 146 147 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 ) ; 148 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 ) , " D r a g a n d D r o p S a m e p l e 2 " ) ; 149 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); 150 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 ) ; 151 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 " , 152 G _ C A L L B A C K ( g t k _ m a i n _ q u i t ) , N U L L ) ; 153 154 v b o x = g t k _ v b o x _ n e w ( F A L S E , 0 ) ; 155 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 ) ; 156 157 f r a m e = g t k _ f r a m e _ n e w ( " " ) ; 158 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 ) , f r a m e , T R U E , T R U E , 0 ) ; 159 g t k _ f r a m e _ s e t _ s h a d o w _ t y p e ( G T K _ F R A M E ( f r a m e ) , G T K _ S H A D O W _ I N ) ; 160 161 i c o n v i e w = c r e a t e _ i c o n _ v i e w _ w i d g e t ( ) ; 162 g t k _ i c o n _ v i e w _ s e t _ t e x t _ c o l u m n ( G T K _ I C O N _ V I E W ( i c o n v i e w ) , C O L U M N _ N A M E ) ; 163 g t k _ i c o n _ v i e w _ s e t _ p i x b u f _ c o l u m n ( G T K _ I C O N _ V I E W ( i c o n v i e w ) , 164 C O L U M N _ P I X B U F ) ; 165 g t k _ i c o n _ v i e w _ s e t _ i t e m _ w i d t h ( G T K _ I C O N _ V I E W ( i c o n v i e w ) , 1 2 8 ) ; 166 167 g t k _ i c o n _ v i e w _ e n a b l e _ m o d e l _ d r a g _ s o u r c e ( G T K _ I C O N _ V I E W ( i c o n v i e w ) , 168 G D K _ B U T T O N 1 _ M A S K , 169 t a r g e t _ t a b l e , 170 n t a r g e t s , 171 G D K _ A C T I O N _ C O P Y | 172 G D K _ A C T I O N _ M O V E ) ; 173 174 g t k _ i c o n _ v i e w _ s e t _ s e l e c t i o n _ m o d e ( G T K _ I C O N _ V I E W ( i c o n v i e w ) , 175 G T K _ S E L E C T I O N _ M U L T I P L E ) ; 176 g _ s i g n a l _ c o n n e c t ( i c o n v i e w , " d r a g - d a t a - g e t " , 177 G _ C A L L B A C K ( s o u r c e _ d r a g _ d a t a _ g e t ) , N U L L ) ; 178 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 ( f r a m e ) , i c o n v i e w ) ; 179 a d d _ d a t a ( G T K _ I C O N _ V I E W ( i c o n v i e w ) ) ; 180 181 f r a m e = g t k _ f r a m e _ n e w ( " " ) ; 182 g t k _ w i d g e t _ s e t _ s i z e _ r e q u e s t ( f r a m e , -1 , 8 0 ) ; 183 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 ) , f r a m e , T R U E , T R U E , 0 ) ; 184 g t k _ f r a m e _ s e t _ s h a d o w _ t y p e ( G T K _ F R A M E ( f r a m e ) , G T K _ S H A D O W _ I N ) ; 185 186 g t k _ d r a g _ d e s t _ s e t ( f r a m e , 187 G T K _ D E S T _ D E F A U L T _ A L L , t a r g e t _ t a b l e , n t a r g e t s , 188 G D K _ A C T I O N _ C O P Y | G D K _ A C T I O N _ M O V E ) ; 189 g _ s i g n a l _ c o n n e c t ( f r a m e , " d r a g - d a t a - r e c e i v e d " , 190 G _ C A L L B A C K ( c b _ d r a g _ d a t a _ r e c e i v e d ) , N U L L ) ; 191

(16)

192 l a b e l = g t k _ l a b e l _ n e w ( " D r o p h e r e " ) ; 193 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 ( f r a m e ) , l a b e l ) ; 194 195 g t k _ w i d g e t _ s h o w _ a l l ( w i n d o w ) ; 196 g t k _ m a i n ( ) ; 197 198 r e t u r n 0 ; 199 }

10.3.3

GtkIconView

ウィジェットでのドラッグ&ドロップの実装

最後に,アイコンビューウィジェット間でアイコンをドラッグ&ドロップすることにより,コピーおよび移動を行うプログラ ムを紹介します(ソース10–3–3). 図10.3上段はプログラムの実行初期の画面です.マウスの左ボタンでドラッグ&ドロップを行うとアイコンをコピーし,シ フトキーを押しながらマウスの左ボタンでドラッグ&ドロップを行うとアイコンを移動します. この例ではドラッグ&ドロップの対象とするデータをこのアプリケーションのアイコンビューウィジェットに限定するため に,7–8行目のGtkTargetEntryのメンバflagsをGTK TARGET SAME APPに設定しています.また,アクションが移動

だった場合のために,drag-data-deleteシグナルに対するコールバック関数を設定し,123–143行目で定義されたコールバッ ク関数内でドラッグ側のアイコンの削除を行っています.このプログラムでは105–108行目のように,データの受け取り側で アイコンを削除することも可能です. 図10.3 ドラッグ&ドロップの実装 ソース10-3-3 GtkIconViewウィジェットでのドラッグ機能の実装: dnd-sample3.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 r i n g . h > 3 4 s t a t i c 5 G t k T a r g e t E n t r y t a r g e t _ t a b l e [ ] = 6 { 7 { " S T R I N G " , G T K _ T A R G E T _ S A M E _ A P P , 0} , 8 { " t e x t / p l a i n " , G T K _ T A R G E T _ S A M E _ A P P , 0 } 9 } ; 10 11 s t a t i c g u i n t n t a r g e t s = s i z e o f ( t a r g e t _ t a b l e ) / s i z e o f ( t a r g e t _ t a b l e [ 0 ] ) ; 12 13 e n u m 14 { 15 C O L U M N _ N A M E , 16 C O L U M N _ P I X B U F , 17 N _ C O L U M N S 18 } ; 19 20 s t a t i c v o i d 21 s o u r c e _ d r a g _ d a t a _ g e t (G t k W i d g e t * w i d g e t ,

(17)

10.3 ドラッグ&ドロップ 265 22 G d k D r a g C o n t e x t * c o n t e x t , 23 G t k S e l e c t i o n D a t a * d a t a , 24 g u i n t in f o , 25 g u i n t ti m e , 26 g p o i n t e r u s e r _ d a t a ) 27 { 28 G L i s t * r o o t , * l i s t , * s t r i n g _ l i s t = N U L L ; 29 G t k T r e e M o d e l * m o d e l ; 30 G S t r i n g * s t r i n g ; 31 32 m o d e l 33 = G T K _ T R E E _ M O D E L ( g t k _ i c o n _ v i e w _ g e t _ m o d e l ( G T K _ I C O N _ V I E W ( w i d g e t ) ) ) ; 34 r o o t = g t k _ i c o n _ v i e w _ g e t _ s e l e c t e d _ i t e m s ( G T K _ I C O N _ V I E W ( w i d g e t ) ) ; 35 36 f o r ( l i s t = r o o t ; l i s t ; l i s t = g _ l i s t _ n e x t ( l i s t ) ) 37 { 38 G t k T r e e P a t h * p a t h ; 39 G t k T r e e I t e r i t e r ; 40 g c h a r * n a m e ; 41 42 p a t h = (G t k T r e e P a t h * ) l i s t - >d a t a ; 43 g t k _ t r e e _ m o d e l _ g e t _ i t e r ( m o d e l , & i t e r , p a t h ) ; 44 n a m e = g t k _ t r e e _ m o d e l _ g e t _ s t r i n g _ f r o m _ i t e r ( m o d e l , & i t e r ) ; 45 s t r i n g _ l i s t = g _ l i s t _ a p p e n d ( s t r i n g _ l i s t , n a m e ) ; 46 } 47 i f ( s t r i n g _ l i s t ) 48 { 49 s t r i n g = g _ s t r i n g _ n e w ( (c o n s t g c h a r * ) s t r i n g _ l i s t - >d a t a ) ; 50 f o r ( l i s t = g _ l i s t _ n e x t ( s t r i n g _ l i s t ) ; l i s t ; 51 l i s t = g _ l i s t _ n e x t ( l i s t ) ) 52 { 53 s t r i n g = g _ s t r i n g _ a p p e n d ( s t r i n g , " ," ) ; 54 s t r i n g = g _ s t r i n g _ a p p e n d ( s t r i n g , (c o n s t g c h a r * ) l i s t - >d a t a ) ; 55 } 56 g t k _ s e l e c t i o n _ d a t a _ s e t ( d a t a , d a t a - >t a r g e t , 8 , 57 s t r i n g - >str , s t r l e n ( s t r i n g - >s t r ) ) ; 58 g _ s t r i n g _ f r e e ( s t r i n g , F A L S E ) ; 59 } 60 } 61 62 s t a t i c v o i d 63 c b _ d r a g _ d a t a _ r e c e i v e d (G t k W i d g e t * w i d g e t , 64 G d k D r a g C o n t e x t * c o n t e x t , 65 g i n t x , 66 g i n t y , 67 G t k S e l e c t i o n D a t a * d a t a , 68 g u i n t i n f o , 69 g u i n t t i m e ) 70 { 71 G t k W i d g e t * s o u r c e ; 72 73 s o u r c e = g t k _ d r a g _ g e t _ s o u r c e _ w i d g e t ( c o n t e x t ) ; 74 i f ( s o u r c e = = w i d g e t ) 75 { 76 g t k _ d r a g _ f i n i s h ( c o n t e x t , F A L S E , F A L S E , t i m e ) ; 77 r e t u r n; 78 } 79 i f ( ( d a t a - >l e n g t h >= 0 ) & & ( d a t a - >f o r m a t = = 8 ) ) 80 { 81 G t k T r e e M o d e l * s r c _ m o d e l ; 82 G t k T r e e M o d e l * d s t _ m o d e l ; 83 g c h a r * * s t r l i s t ; 84 g c h a r * r e c e i v e d ; 85 i n t n ; 86 87 s r c _ m o d e l = g t k _ i c o n _ v i e w _ g e t _ m o d e l ( G T K _ I C O N _ V I E W ( s o u r c e ) ) ; 88 d s t _ m o d e l = g t k _ i c o n _ v i e w _ g e t _ m o d e l ( G T K _ I C O N _ V I E W ( w i d g e t ) ) ; 89 90 r e c e i v e d = g _ s t r c h o m p ( (g c h a r * ) d a t a - >d a t a ) ; 91 s t r l i s t = g _ s t r s p l i t ( r e c e i v e d , " ," , 0 ) ; 92 93 f o r ( n = 0 ; s t r l i s t [ n ] ; n + + ) 94 { 95 G t k T r e e I t e r i t e r ; 96 G d k P i x b u f * p i x b u f ; 97 g c h a r * n a m e ;

(18)

98 99 g t k _ t r e e _ m o d e l _ g e t _ i t e r _ f r o m _ s t r i n g ( s r c _ m o d e l , 100 & i t e r , s t r l i s t [ n ] ) ; 101 g t k _ t r e e _ m o d e l _ g e t ( s r c _ m o d e l , & i t e r , 102 C O L U M N _ N A M E , & n a m e , 103 C O L U M N _ P I X B U F , & p i x b u f , -1); 104 105 i f ( c o n t e x t - >a c t i o n = = G D K _ A C T I O N _ M O V E ) 106 { 107 g t k _ l i s t _ s t o r e _ r e m o v e ( G T K _ L I S T _ S T O R E ( s r c _ m o d e l ) , & i t e r ) ; 108 } 109 110 g t k _ l i s t _ s t o r e _ a p p e n d ( G T K _ L I S T _ S T O R E ( d s t _ m o d e l ) , & i t e r ) ; 111 g t k _ l i s t _ s t o r e _ s e t ( G T K _ L I S T _ S T O R E ( d s t _ m o d e l ) , & i t e r , 112 C O L U M N _ N A M E , n a m e , 113 C O L U M N _ P I X B U F , p i x b u f , -1); 114 } 115 g _ s t r f r e e v ( s t r l i s t ) ; 116 g t k _ d r a g _ f i n i s h ( c o n t e x t , T R U E , F A L S E , t i m e ) ; 117 118 r e t u r n; 119 } 120 g t k _ d r a g _ f i n i s h ( c o n t e x t , F A L S E , F A L S E , t i m e ) ; 121 } 122 123 s t a t i c v o i d 124 c b _ d r a g _ d a t a _ d e l e t e (G t k W i d g e t * w i d g e t , 125 G d k D r a g C o n t e x t * d r a g _ c o n t e x t , 126 g p o i n t e r u s e r _ d a t a ) 127 { 128 G t k T r e e M o d e l * m o d e l ; 129 G L i s t * r o o t , * l i s t ; 130 131 m o d e l 132 = G T K _ T R E E _ M O D E L ( g t k _ i c o n _ v i e w _ g e t _ m o d e l ( G T K _ I C O N _ V I E W ( w i d g e t ) ) ) ; 133 r o o t = g t k _ i c o n _ v i e w _ g e t _ s e l e c t e d _ i t e m s ( G T K _ I C O N _ V I E W ( w i d g e t ) ) ; 134 f o r ( l i s t = r o o t ; l i s t ; l i s t = g _ l i s t _ n e x t ( l i s t ) ) 135 { 136 G t k T r e e P a t h * p a t h ; 137 G t k T r e e I t e r i t e r ; 138 139 p a t h = (G t k T r e e P a t h * ) l i s t - >d a t a ; 140 g t k _ t r e e _ m o d e l _ g e t _ i t e r ( m o d e l , & i t e r , p a t h ) ; 141 g t k _ l i s t _ s t o r e _ r e m o v e ( G T K _ L I S T _ S T O R E ( m o d e l ) , & i t e r ) ; 142 } 143 } 144 145 s t a t i c v o i d 146 a d d _ d a t a (G t k I c o n V i e w * i c o n v i e w ) 147 { 148 G d k P i x b u f * f o l d e r _ p i x b u f ; 149 G d k P i x b u f * f i l e _ p i x b u f ; 150 G t k L i s t S t o r e * s t o r e ; 151 G t k T r e e I t e r i t e r ; 152 153 f o l d e r _ p i x b u f = g d k _ p i x b u f _ n e w _ f r o m _ f i l e ( " . / f o l d e r . p n g " , N U L L ) ; 154 f i l e _ p i x b u f = g d k _ p i x b u f _ n e w _ f r o m _ f i l e ( " . / f i l e . p n g " , N U L L ) ; 155 156 s t o r e = G T K _ L I S T _ S T O R E ( g t k _ i c o n _ v i e w _ g e t _ m o d e l ( i c o n v i e w ) ) ; 157 158 g t k _ l i s t _ s t o r e _ c l e a r ( s t o r e ) ; 159 160 g t k _ l i s t _ s t o r e _ a p p e n d ( s t o r e , & i t e r ) ; 161 g t k _ l i s t _ s t o r e _ s e t ( s t o r e , & i t e r , 162 C O L U M N _ N A M E , " f o l d e r . p n g " , 163 C O L U M N _ P I X B U F , f o l d e r _ p i x b u f , -1); 164 g _ o b j e c t _ u n r e f ( f o l d e r _ p i x b u f ) ; 165 166 g t k _ l i s t _ s t o r e _ a p p e n d ( s t o r e , & i t e r ) ; 167 g t k _ l i s t _ s t o r e _ s e t ( s t o r e , & i t e r , 168 C O L U M N _ N A M E , " f i l e . p n g " , 169 C O L U M N _ P I X B U F , f i l e _ p i x b u f , -1); 170 g _ o b j e c t _ u n r e f ( f i l e _ p i x b u f ) ; 171 } 172 173 s t a t i c G t k W i d g e t*

(19)

10.3 ドラッグ&ドロップ 267 174 c r e a t e _ i c o n _ v i e w _ w i d g e t (v o i d) 175 { 176 G t k W i d g e t * i c o n v i e w ; 177 G t k L i s t S t o r e * s t o r e ; 178 179 s t o r e = g t k _ l i s t _ s t o r e _ n e w ( N _ C O L U M N S , G _ T Y P E _ S T R I N G , G D K _ T Y P E _ P I X B U F ) ; 180 i c o n v i e w = g t k _ i c o n _ v i e w _ n e w _ w i t h _ m o d e l ( G T K _ T R E E _ M O D E L ( s t o r e ) ) ; 181 g _ o b j e c t _ u n r e f ( s t o r e ) ; 182 183 g t k _ i c o n _ v i e w _ s e t _ t e x t _ c o l u m n ( G T K _ I C O N _ V I E W ( i c o n v i e w ) , C O L U M N _ N A M E ) ; 184 g t k _ i c o n _ v i e w _ s e t _ p i x b u f _ c o l u m n ( G T K _ I C O N _ V I E W ( i c o n v i e w ) , 185 C O L U M N _ P I X B U F ) ; 186 g t k _ i c o n _ v i e w _ s e t _ i t e m _ w i d t h ( G T K _ I C O N _ V I E W ( i c o n v i e w ) , 1 2 8 ) ; 187 188 g t k _ i c o n _ v i e w _ e n a b l e _ m o d e l _ d r a g _ s o u r c e ( G T K _ I C O N _ V I E W ( i c o n v i e w ) , 189 G D K _ B U T T O N 1 _ M A S K | 190 G D K _ S H I F T _ M A S K , 191 t a r g e t _ t a b l e , 192 n t a r g e t s , 193 G D K _ A C T I O N _ C O P Y | 194 G D K _ A C T I O N _ M O V E ) ; 195 g t k _ d r a g _ d e s t _ s e t ( i c o n v i e w , 196 G T K _ D E S T _ D E F A U L T _ A L L , t a r g e t _ t a b l e , n t a r g e t s , 197 G D K _ A C T I O N _ C O P Y | G D K _ A C T I O N _ M O V E ) ; 198 g t k _ i c o n _ v i e w _ s e t _ s e l e c t i o n _ m o d e ( G T K _ I C O N _ V I E W ( i c o n v i e w ) , 199 G T K _ S E L E C T I O N _ M U L T I P L E ) ; 200 g _ s i g n a l _ c o n n e c t ( i c o n v i e w , " d r a g - d a t a - g e t " , 201 G _ C A L L B A C K ( s o u r c e _ d r a g _ d a t a _ g e t ) , N U L L ) ; 202 g _ s i g n a l _ c o n n e c t ( i c o n v i e w , " d r a g - d a t a - r e c e i v e d " , 203 G _ C A L L B A C K ( c b _ d r a g _ d a t a _ r e c e i v e d ) , N U L L ) ; 204 g _ s i g n a l _ c o n n e c t ( i c o n v i e w , " d r a g - d a t a - d e l e t e " , 205 G _ C A L L B A C K ( c b _ d r a g _ d a t a _ d e l e t e ) , N U L L ) ; 206 207 r e t u r n i c o n v i e w ; 208 } 209 210 i n t 211 m a i n (i n t a r g c , c h a r * * a r g v ) 212 { 213 G t k W i d g e t * w i n d o w ; 214 G t k W i d g e t * h b o x ; 215 G t k W i d g e t * i c o n v i e w ; 216 G t k W i d g e t * f r a m e ; 217 218 g t k _ i n i t ( & a r g c , & a r g v ) ; 219 220 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 ) ; 221 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 ) , " D r a g a n d D r o p S a m p l e 3 " ) ; 222 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 ) ; 223 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 " , 224 G _ C A L L B A C K ( g t k _ m a i n _ q u i t ) , N U L L ) ; 225 226 h b o x = g t k _ h b o x _ n e w ( F A L S E , 0 ) ; 227 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 ) , h b o x ) ; 228 229 f r a m e = g t k _ f r a m e _ n e w ( " " ) ; 230 g t k _ w i d g e t _ s e t _ s i z e _ r e q u e s t ( f r a m e , 3 0 0 , -1); 231 g t k _ b o x _ p a c k _ s t a r t ( G T K _ B O X ( h b o x ) , f r a m e , T R U E , T R U E , 0 ) ; 232 g t k _ f r a m e _ s e t _ s h a d o w _ t y p e ( G T K _ F R A M E ( f r a m e ) , G T K _ S H A D O W _ I N ) ; 233 234 i c o n v i e w = c r e a t e _ i c o n _ v i e w _ w i d g e t ( ) ; 235 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 ( f r a m e ) , i c o n v i e w ) ; 236 a d d _ d a t a ( G T K _ I C O N _ V I E W ( i c o n v i e w ) ) ; 237 238 f r a m e = g t k _ f r a m e _ n e w ( " " ) ; 239 g t k _ w i d g e t _ s e t _ s i z e _ r e q u e s t ( f r a m e , 3 0 0 , -1); 240 g t k _ b o x _ p a c k _ s t a r t ( G T K _ B O X ( h b o x ) , f r a m e , T R U E , T R U E , 0 ) ; 241 g t k _ f r a m e _ s e t _ s h a d o w _ t y p e ( G T K _ F R A M E ( f r a m e ) , G T K _ S H A D O W _ I N ) ; 242 243 i c o n v i e w = c r e a t e _ i c o n _ v i e w _ w i d g e t ( ) ; 244 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 ( f r a m e ) , i c o n v i e w ) ; 245 246 g t k _ w i d g e t _ s h o w _ a l l ( w i n d o w ) ; 247 g t k _ m a i n ( ) ; 248 249 r e t u r n 0 ;

(20)

250 }

10.4

オリジナルストックアイテムの作成

ここでは,独自のストックアイテムを作成する方法を解説します.独自のストックアイテムを作成できれば,既存の関数を 使って,自分で作ったアイコンを使用したボタンやツールバーなどを簡単に作れます.しかしわざわざストックアイテムを作成 しなくても,既存の関数をいくつか組み合わせることで,独自のアイコンを使用したボタンなどを作ることは可能です.では独 自のストックアイテムを作成する利点は何でしょうか. それはメニューの作成です.UIマネージャでは,メニューに表示するアイコンをストックアイテムで指定するので,独自のス トックアイテムを作成することで,UIマネージャの枠組を保ったまま,オリジナルのメニューを作成できるようになるのです.

10.4.1

ストックアイテム作成

オリジナルストックアイテムの作成は次のような流れになります. 1. GtkIconFactoryの生成 2. アイコン情報の設定 3. ストックアイテムの登録 4. ストックアイテムの有効化 GtkIconFactoryの生成 GtkIconFactoryは,新しく作成するストックアイテムを管理するオブジェクトです.新しいストックアイテムの作成は,ス トックアイテムの情報をこのオブジェクトに登録することに相当します.このオブジェクトを作成するには次の関数を使用し ます. G t k I c o n F a c t o r y* g t k _ i c o n _ f a c t o r y _ n e w (v o i d) ; アイコン情報の設定 ここでいうアイコン情報とは,アイコン画像のファイル名もしくはアイコンのGdkPixbufデータのことを指します.この アイコン情報はGtkIconSourceを経由してGtkIconSetに渡します.それぞれのウィジェットの作成には,次の関数を使用し ます. G t k I c o n S o u r c e* g t k _ i c o n _ s o u r c e _ n e w (v o i d) ; G t k I c o n S e t* g t k _ i c o n _ s e t _ n e w (v o i d) ; アイコン情報は,アイコン画像のファイル名もしくはアイコンのGdkPixbufデータのどちらかを指定します.どちらを使用 するかによって以下の関数を使い分けます.なお,アイコン画像のファイル名は絶対パスで指定する必要があります. v o i d g t k _ i c o n _ s o u r c e _ s e t _ f i l e n a m e (G t k I c o n S o u r c e * s o u r c e , c o n s t g c h a r * f i l e n a m e ) ; v o i d g t k _ i c o n _ s o u r c e _ s e t _ p i x b u f (G t k I c o n S o u r c e * s o u r c e , G d k P i x b u f * p i x b u f ) ; そして,アイコン情報をセットしたGtkIconSource型の変数を,次の関数でGtkIconSet型の変数に渡します. v o i d g t k _ i c o n _ s e t _ a d d _ s o u r c e (G t k I c o n S e t * i c o n _ s e t , c o n s t G t k I c o n S o u r c e * s o u r c e ) ; ストックアイテムの登録 次にアイコン情報をセットしたGtkIconSet型の変数とストックID(ストックアイテムを特定するための文字列)を組にし て,GtkIconFactroy型の変数に登録します. v o i d g t k _ i c o n _ f a c t o r y _ a d d (G t k I c o n F a c t o r y * f a c t o r y , c o n s t g c h a r * s t o c k _ i d , G t k I c o n S e t * i c o n _ s e t ) ;

(21)

10.4 オリジナルストックアイテムの作成 269 ストックアイテムの有効化 GtkIconFactoryにストックアイテムを登録しただけでは,プログラムの中で使うことができません.登録した新しいストッ クアイテムを有効にするためには,次の関数を呼び出す必要があります. v o i d g t k _ i c o n _ f a c t o r y _ a d d _ d e f a u l t (G t k I c o n F a c t o r y * f a c t o r y ) ; (a)標準のストックアイテム (b)独自のストックアイテム 図10.4 独自のストックアイテムを使用したメニュー

10.4.2

サンプルプログラム

オリジナルストックアイテムを使用したメニューのサンプルプログラムを,ソース10–4に示します.プログラムの実行結果 は図10.4になります. ソース10-4 オリジナルストックアイテムのサンプルプログラム: customstockitem-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 c b _ q u i t (G t k A c t i o n * a c t i o n , g p o i n t e r u s e r _ d a t a ) ; 4 5 t y p e d e f s t r u c t 6 { 7 g c h a r * l o c a t i o n ; 8 g c h a r * s t o c k _ i d ; 9 } C u s t o m S t o c k I c o n ; 10 11 / * 12 * 実 行 環 境 に 応 じ てM a k e f i l e内 のI C O N _ P A T Hを 修 正 し て く だ さ い. 13 * / 14 s t a t i c C u s t o m S t o c k I c o n c u s t o m _ i c o n _ l i s t [ ] = 15 { 16 { I C O N _ P A T H " i m a g e s / n e w . p n g " , " c u s t o m - s t o c k - n e w " } , 17 { I C O N _ P A T H " i m a g e s / o p e n . p n g " , " c u s t o m - s t o c k - o p e n " } , 18 { I C O N _ P A T H " i m a g e s / s a v e . p n g " , " c u s t o m - s t o c k - s a v e " } , 19 { I C O N _ P A T H " i m a g e s / s a v e a s . p n g " , " c u s t o m - s t o c k - s a v e a s " } , 20 { I C O N _ P A T H " i m a g e s / p r i n t . p n g " , " c u s t o m - s t o c k - p r i n t " } , 21 { I C O N _ P A T H " i m a g e s / q u i t . p n g " , " c u s t o m - s t o c k - q u i t " } , 22 { N U L L , N U L L } 23 } ; 24 25 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 [ ] = 26 { 27 { " F i l e M e n u 1 " , N U L L , " _ F i l e " } , 28 { " N e w " , G T K _ S T O C K _ N E W , " _ N e w " , " <c o n t r o l > N " , N U L L , N U L L } , 29 { " O p e n " , G T K _ S T O C K _ O P E N , " _ O p e n " , " <c o n t r o l > O " , N U L L , N U L L } , 30 { " S a v e " , G T K _ S T O C K _ S A V E , " _ S a v e " , " <c o n t r o l > S " , N U L L , N U L L } , 31 { " S a v e A s " , G T K _ S T O C K _ S A V E _ A S , " S a v e _ a s " , " <s h i f t > <c o n t r o l > S " , 32 NU L L , N U L L } , 33 { " P r i n t " , G T K _ S T O C K _ P R I N T , " _ P r i n t " , " <c o n t r o l > P " , N U L L , N U L L } , 34 { " Q u i t " , G T K _ S T O C K _ Q U I T , " _ Q u i t " , " <c o n t r o l > Q " , N U L L , 35 G _ C A L L B A C K ( c b _ q u i t ) } , 36 37 { " F i l e M e n u 2 " , N U L L , " F i l e _ C u s t o m " } , 38 { " c N e w " , " c u s t o m - s t o c k - n e w " , 39 " _ N e w " , " <alt > <c o n t r o l > N " , N U L L , N U L L } , 40 { " c O p e n " , " c u s t o m - s t o c k - o p e n " ,

(22)

41 " _ O p e n " , " <alt > <c o n t r o l > O " , N U L L , N U L L } , 42 { " c S a v e " , " c u s t o m - s t o c k - s a v e " , 43 " _ S a v e " , " <alt > <c o n t r o l > S " , N U L L , N U L L } , 44 { " c S a v e A s " , " c u s t o m - s t o c k - s a v e a s " , 45 " S a v e _ a s " , " <alt > <s h i f t > <c o n t r o l > S " , N U L L , N U L L } , 46 { " c P r i n t " , " c u s t o m - s t o c k - p r i n t " , 47 " _ P r i n t " , " <alt > <c o n t r o l > P " , N U L L , N U L L } , 48 { " c Q u i t " , " c u s t o m - s t o c k - q u i t " , 49 " _ Q u i t " , " <alt > <c o n t r o l > Q " , N U L L , G _ C A L L B A C K ( c b _ q u i t ) } , 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 54 c o n s t g c h a r * u i _ i n f o = 55 " <ui > " 56 " <m e n u b a r n a m e = ’M e n u B a r ’ >" 57 " <m e n u a c t i o n = ’F i l e M e n u 1 ’ >" 58 " <m e n u i t e m a c t i o n = ’N e w ’/ >" 59 " <m e n u i t e m a c t i o n = ’O p e n ’/ >" 60 " <m e n u i t e m a c t i o n = ’S a v e ’/ >" 61 " <m e n u i t e m a c t i o n = ’S a v e A s ’/ >" 62 " <m e n u i t e m a c t i o n = ’P r i n t ’/ >" 63 " <s e p a r a t o r / >" 64 " <m e n u i t e m a c t i o n = ’Q u i t ’/ >" 65 " </m e n u > " 66 " <m e n u n a m e = ’F i l e M e n u 2 ’ a c t i o n = ’F i l e M e n u 2 ’ >" 67 " <m e n u i t e m a c t i o n = ’c N e w ’/ >" 68 " <m e n u i t e m a c t i o n = ’c O p e n ’/ >" 69 " <m e n u i t e m a c t i o n = ’c S a v e ’/ >" 70 " <m e n u i t e m a c t i o n = ’c S a v e A s ’/ >" 71 " <m e n u i t e m a c t i o n = ’c P r i n t ’/ >" 72 " <s e p a r a t o r / >" 73 " <m e n u i t e m a c t i o n = ’c Q u i t ’/ >" 74 " </m e n u > " 75 " </m e n u b a r > " 76 " </ui > " ; 77 78 s t a t i c v o i d 79 c b _ q u i t (G t k A c t i o n * a c t i o n , g p o i n t e r u s e r _ d a t a ) 80 { 81 G O b j e c t * w i n d o w = G _ O B J E C T ( u s e r _ d a t a ) ; 82 83 g _ o b j e c t _ u n r e f ( g _ o b j e c t _ g e t _ d a t a ( w i n d o w , " f a c t o r y " ) ) ; 84 g _ o b j e c t _ u n r e f ( g _ o b j e c t _ g e t _ d a t a ( w i n d o w , " u i " ) ) ; 85 g t k _ m a i n _ q u i t ( ) ; 86 } 87 88 s t a t i c v o i d 89 c r e a t e _ c u s t o m _ s t o c k s (G t k I c o n F a c t o r y * f a c t o r y , 90 C u s t o m S t o c k I c o n * l i s t ) 91 { 92 G t k I c o n S o u r c e * s o u r c e ; 93 G t k I c o n S e t * i c o n s e t ; 94 i n t n ; 95 96 f o r ( n = 0 ; l i s t [ n ] . l o c a t i o n ! = N U L L ; n + + ) 97 { 98 s o u r c e = g t k _ i c o n _ s o u r c e _ n e w ( ) ; 99 i c o n s e t = g t k _ i c o n _ s e t _ n e w ( ) ; 100 g t k _ i c o n _ s o u r c e _ s e t _ f i l e n a m e ( s o u r c e , l i s t [ n ] . l o c a t i o n ) ; 101 g t k _ i c o n _ s e t _ a d d _ s o u r c e ( i c o n s e t , s o u r c e ) ; 102 g t k _ i c o n _ f a c t o r y _ a d d ( f a c t o r y , l i s t [ n ] . s t o c k _ i d , i c o n s e t ) ; 103 g t k _ i c o n _ s o u r c e _ f r e e ( s o u r c e ) ; 104 g t k _ i c o n _ s e t _ u n r e f ( i c o n s e t ) ; 105 } 106 g t k _ i c o n _ f a c t o r y _ a d d _ d e f a u l t ( f a c t o r y ) ; 107 } 108 109 s t a t i c G t k U I M a n a g e r* 110 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 ) 111 { 112 G t k U I M a n a g e r * u i ; 113 G t k A c t i o n G r o u p * a c t i o n s ; 114 115 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 " ) ; 116 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 ,

(23)

10.5 プログラムオプションの解析 271 117 (g p o i n t e r) p a r e n t ) ; 118 u i = g t k _ u i _ m a n a g e r _ n e w ( ) ; 119 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 ) ; 120 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 ) ; 121 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 ) , 122 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 ) ) ; 123 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 ) ; 124 125 r e t u r n u i ; 126 } 127 128 i n t 129 m a i n (i n t a r g c , c h a r * * a r g v ) 130 { 131 G t k W i d g e t * w i n d o w ; 132 G t k I c o n F a c t o r y * f a c t o r y ; 133 G t k W i d g e t * m e n u b a r ; 134 G t k U I M a n a g e r * u i ; 135 136 g t k _ i n i t ( & a r g c , & a r g v ) ; 137 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 ) ; 138 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 ) , 139 " C u s t o m G t k S t o c k I t e m S a m p l e " ) ; 140 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 2 0 , -1); 141 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 ) ; 142 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 " , 143 G _ C A L L B A C K ( g t k _ m a i n _ q u i t ) , N U L L ) ; 144 145 f a c t o r y = g t k _ i c o n _ f a c t o r y _ n e w ( ) ; 146 c r e a t e _ c u s t o m _ s t o c k s ( f a c t o r y , c u s t o m _ i c o n _ l i s t ) ; 147 g _ o b j e c t _ s e t _ d a t a ( G _ O B J E C T ( w i n d o w ) , " f a c t o r y " , f a c t o r y ) ; 148 149 u i = c r e a t e _ m e n u ( w i n d o w ) ; 150 g _ o b j e c t _ s e t _ d a t a ( G _ O B J E C T ( w i n d o w ) , " u i " , u i ) ; 151 m e n u b a r = 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 " ) ; 152 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 ) ; 153 154 g t k _ w i d g e t _ s h o w _ a l l ( w i n d o w ) ; 155 g t k _ m a i n ( ) ; 156 157 r e t u r n 0 ; 158 }

10.5

プログラムオプションの解析

アプリケーションを実行する際に,最低限必要な引数のほかにオプションを設定してアプリケーションの動作をコントロール したり,パラメータを変えたりすることがあります.この節ではそんなオプションの設定やコマンド引数の解析を簡単に行って くれるGOptionContextについて,ソース10–5を例に解説します.

10.5.1

コマンドラインオプションの設定

コマンドラインオプションの設定は構造体GOptionEntryで行います.構造体GOptionEntryは次のように定義されてい ます. t y p e d e f s t r u c t { c o n s t g c h a r * l o n g _ n a m e ; g c h a r s h o r t _ n a m e ; g i n t f l a g s ; G O p t i o n A r g a r g ; g p o i n t e r a r g _ d a t a ; c o n s t g c h a r * d e s c r i p t i o n ; c o n s t g c h a r * a r g _ d e s c r i p t i o n ; } G O p t i o n E n t r y;

まず long nameとshort nameでオプションを指定する文字列を指定します.long nameにはハイフン2つの後に続

く文字列を,short nameにはハイフンに続く 1文字を指定します.3つ目のメンバflagsは,列挙体 GOptionFlagsで

定義された値(表10.4を参照)を指定します.特別な使い方をしない限りは,G OPTION FLAG NOALIASもしくは

表 10.1 GtkDestDefault の値
表 10.3 GdkDragAction の値 値 説明 GDK ACTION DEFAULT 何の意味も持たない(指定してはいけない) . GDK ACTION COPY データをコピーする. GDK ACTION MOVE データを移動する. GDK ACTION LINK リンクを作成する. GDK ACTION PRIVATE ソース側に動作を確認する. GDK ACTION ASK ユーザに動作を確認する. しかし,このままでは受け取ったデータに対して何も操作を行えません.そこで, drag-da
表 10.5 GOptionArg の値

参照

関連したドキュメント

[r]

・高濃度 PCB 廃棄物を処理する上記の JESCO (中間貯蔵・環境安全事業㈱)の事業所は、保管場所の所在

日本への輸入 作成日から 12 か月 作成日から 12 か月 英国への輸出 作成日から2年 作成日から 12 か月.

日本への輸入 作成日から 12 か月 作成日から 12 か月 英国への輸出 作成日から2年 作成日から 12 か月.

2019年6⽉4⽇にX-2ペネ内扉に,AWJ ※1 にて孔(孔径約0.21m)を開ける作業中,PCV内 のダスト濃度上昇を早期検知するためのダストモニタ(下記図の作業監視⽤DM①)の値が作 業管理値(1.7×10

2019年6⽉4⽇にX-2ペネ内扉に,AWJ ※1 にて孔(孔径約0.21m)を開ける作業中,PCV内 のダスト濃度上昇を早期検知するためのダストモニタ(下記図の作業監視⽤DM①)の値が作 業管理値(1.7×10

2019年6月4日にX-2ペネ内扉に,AWJ ※1 にて孔(孔径約0.21m)を開ける作業中,PCV内 のダスト濃度上昇を早期検知するためのダストモニタ(下記図の作業監視用DM①)の値が作 業管理値(1.7×10

2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月.  過去の災害をもとにした福 島第一の作業安全に関する