You are on page 1of 94

Hell Window!

GTK alap felhasznli felletek C, C++, Python nyelv u fejlesztse s tesztelse Pfeiffer Szilrd 1 2013. janur 3.

1A

knyv ltrejttt a FSF.hu Alaptvny a Szabad Szoftver Plyzat[5] keretben tmogatta

Tartalomjegyzk
I Bevezets
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1
2 2 2 2 3 3 3 3 4 4 4 4 5 5 5 5 7 7 7 8 9 10 10 11 13 13 13 14 14 14 15 16 16 16 16 17 17 17 18 19 19 19 20

1. Gimp Tool Kit 1.1. ltalnossgok . . . . . . 1.1.1. Trtnete . . . . . 1.1.2. Elrhet osge . . . 1.2. Rszegysgek . . . . . . . 1.2.1. GTK . . . . . . . 1.2.2. GDK . . . . . . . 1.2.3. GLib . . . . . . . 1.2.4. Cairo . . . . . . . 1.2.5. Pango . . . . . . . 1.3. Nyelvi vltozatok . . . . . 1.3.1. GTK minus minus 1.3.2. PyGobject . . . . . 1.3.3. sszehasonlts . . 1.4. Kapcsold projektek . . . 1.4.1. Automata tesztels

2. Alapvet o ismeretek 2.1. A fejleszts fogalmai . . . . . . . . . . 2.1.1. A GTK+ objektum-orientltsga 2.1.2. A GTK alapfogalmai . . . . . . 2.1.3. A GTK+ m ukdsi sajtossgai 2.2. A tesztels fogalmai . . . . . . . . . . . 2.2.1. Az ATK koncepcija . . . . . . 2.2.2. A Dogtail m ukdse . . . . . . 3. A fejleszts menete 3.1. Gimp Tool Kit . . . . . . . 3.1.1. Beszerzse . . . . 3.1.2. Fordtsa . . . . . 3.2. Sajt alkalmazsok . . . . 3.2.1. Fordts s linkels 3.2.2. Futtats . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

4. Els o ablakunk 4.1. Kdolsi alapismeretek . . . . . . 4.1.1. Forrskd formzsa . . . 4.1.2. Elnevezsi konvencik . . 4.1.3. Fejlcfjlok s importls 4.2. Minimlisan alkalmazs . . . . . 4.2.1. Forrskd . . . . . . . . . 4.2.2. Fordts s futtats . . . . 4.2.3. Eredmny . . . . . . . . . 4.3. Tesztels . . . . . . . . . . . . . . 4.3.1. Forrskd . . . . . . . . . 4.3.2. Futtats . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

5. Szignlkezels dihjban 5.1. Fogalmak . . . . . . . . . . . . . . . 5.2. Szignlkezels . . . . . . . . . . . . . 5.2.1. C, illetve C++ nyelv u vltozat 5.2.2. Python nyelv u vltozatok . . . 5.2.3. Fordts s futtats . . . . . . 5.2.4. Eredmny . . . . . . . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

21 21 22 22 26 27 27

II

Alapvet o widgetek
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

28
29 29 29 29 29 30 30 30 32 32 33 36 36 38 40 40 40 40 41 41 41 41 41 41 43 43 44 45 45 45 45 46 46 46 47 48 48 48 50 51 51 51 51 51 52

6. Ablakok 6.1. Bevezets . . . . . . . . . . . . . 6.1.1. Popup s toplevel ablakok 6.1.2. Window s dialg . . . . . 6.1.3. Modalits . . . . . . . . . 6.1.4. Tranziencia . . . . . . . . 6.2. Hasznlat . . . . . . . . . . . . . 6.2.1. Ltrehozs . . . . . . . . 6.2.2. Minimlis plda . . . . . 6.2.3. Tartalmi elemek . . . . . 6.2.4. Vezrl o elemek . . . . . . 6.2.5. Megjelents . . . . . . . 6.2.6. Bezrs . . . . . . . . . . 6.2.7. Esemnykezels . . . . . 6.2.8. Sajt esemnykezel o . . . 6.3. Platformfgg o sajtossgok . . . . 6.3.1. Ablakkezel o . . . . . . . 6.3.2. Vezrl o elemek . . . . . . 6.4. A kd . . . . . . . . . . . . . . . 6.4.1. Fordts s linkels . . . . 6.4.2. Futtats . . . . . . . . . . 6.4.3. Eredmny . . . . . . . . . 6.5. Tesztels . . . . . . . . . . . . . . 6.5.1. Keress . . . . . . . . . . 6.5.2. Sttuszok . . . . . . . . . 6.5.3. Interfszek . . . . . . . . 6.5.4. Tulajdonsgok . . . . . .

7. Kontnerek 7.1. Fogalmak . . . . . . . . . . . . . . . 7.1.1. Kontnerek . . . . . . . . . . 7.1.2. Mretezs . . . . . . . . . . . 7.1.3. Elrendezs . . . . . . . . . . 7.2. Alapm uveletek . . . . . . . . . . . . 7.2.1. Ltrehozs . . . . . . . . . . 7.2.2. Elem hozzadsa . . . . . . . 7.2.3. Elem eltvoltsa . . . . . . . 7.3. Pa(c)kols . . . . . . . . . . . . . . . 7.3.1. Elemek elhelyezkedse . . . . 7.3.2. Trkz, pnyvzs s szegly 7.4. A kd . . . . . . . . . . . . . . . . . 7.4.1. Fordts s linkels . . . . . . 7.4.2. Futtats . . . . . . . . . . . . 7.4.3. Eredmny . . . . . . . . . . . 7.5. Tesztels . . . . . . . . . . . . . . . . 7.5.1. Gyerekek keresse . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

ii

8. Megjelent o eszkzk 8.1. Fogalmak . . . . . . . . . . . . 8.1.1. Igazts s helykitlts . 8.1.2. Widgetek . . . . . . . . 8.1.3. Szvegformzs . . . . 8.1.4. Widgetek sszefggsei 8.2. Alapm uveletek . . . . . . . . . 8.2.1. Ltrehozs . . . . . . . 8.2.2. Megjelents . . . . . . 8.2.3. Kezels . . . . . . . . . 8.3. Halad m uveletek . . . . . . . . 8.3.1. GtkLabel . . . . . . . . 8.3.2. GtkTooltip . . . . . . 8.4. Tesztels . . . . . . . . . . . . . 8.4.1. Objektum . . . . . . . . 8.4.2. llapotok . . . . . . . . 8.4.3. Interfszek . . . . . . . 8.4.4. Viszonyok . . . . . . . 9. Egysoros beviteli mez ok 9.1. Fogalmak . . . . . . . . . . . 9.1.1. Beviteli mez ok tpusai 9.1.2. Interfsz . . . . . . . . 9.2. Alapm uveletek . . . . . . . . 9.2.1. Ltrehozs . . . . . . 9.2.2. Tartalom kezelse . . . 9.2.3. Csak olvashat md . 9.2.4. Jelszavak kezelse . . 9.2.5. Szignlok . . . . . . . 9.3. Halad m uveletek . . . . . . . 9.3.1. Ikonok . . . . . . . . 9.3.2. Folyamatindiktor . . 9.3.3. Irnymutat szveg . . 9.3.4. Buffer . . . . . . . . . 9.3.5. Formzs . . . . . . . 9.4. Tesztels . . . . . . . . . . . . 9.4.1. Keress . . . . . . . . 9.4.2. Interfszek . . . . . . 9.4.3. llapotok . . . . . . . 9.4.4. Tulajdonsgok . . . . 9.4.5. Akcik . . . . . . . . 10. Vlasztson alapul adatbevitel 10.1. Fogalmak . . . . . . . . . . . 10.1.1. Beviteli mez ok tpusai 10.2. Alapm uveletek . . . . . . . . 10.2.1. Ltrehozs . . . . . . 10.2.2. Kezels . . . . . . . . 10.2.3. Szignlok . . . . . . . 10.3. Halad m uveletek . . . . . . . 10.4. Tesztels . . . . . . . . . . . . 10.4.1. Keress . . . . . . . . 10.4.2. Sttuszok . . . . . . . 10.4.3. Akcik . . . . . . . . 10.4.4. Viszonyok . . . . . . 10.4.5. Interfszek . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

53 53 53 53 54 54 54 54 56 57 57 57 57 58 58 58 58 59 60 60 60 61 61 61 62 62 62 62 62 62 63 63 63 64 65 65 65 66 66 66 67 67 67 68 68 69 70 70 70 70 70 70 71 71

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

iii

III

sszetett widgetek
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

72
73 73 73 73 73 73 74 74 77 80 80 80 80 80 80 81 82 86 87 88 89

11. Tblzatos megjelents alapjai 11.1. Fogalmak . . . . . . . . . . 11.1.1. Modell-nzet-vezrl o 11.1.2. Modell . . . . . . . 11.1.3. Nzet . . . . . . . . 11.1.4. Elemek elrse . . . 11.2. Alapm uveletek . . . . . . . 11.2.1. Ltrehozs . . . . . 11.2.2. Kezels . . . . . . . 11.2.3. Szignlok . . . . . . 11.3. Tesztels . . . . . . . . . . . 11.3.1. Keress . . . . . . . 11.3.2. Interfszek . . . . . 11.3.3. llapotok . . . . . . 11.3.4. Akcik . . . . . . . A. Licencelsi felttelek Trgymutat Tblzatok jegyzke brk jegyzke Kdrszletek jegyzke Irodalomjegyzk

iv

rsz I

Bevezets

1. fejezet

Gimp Tool Kit


1.1.
1.1.1.

ltalnossgok
Trtnete

Mint megannyi szoftver a nylt forrs tbb, mint negyedszzados trtnetben a GTK+ is felhasznli elgedetlensg eredmnyeknt szletett. Peter Mattis s Spencer Kimball, a Kaliforniai Egyetem (Berkeley) hallgati az azta is a nylt forrs szoftverek egyik zszlshajjnak szmt kpszerkeszt o program, a GIMP fejlesztse kzben szembesltek az akkori id okben amgy is csak kis szmban rendelkezsre ll grakus felhasznli fellet kszt o eszkzk hinyossgival. Ezek lekzdsre dntttek gy egybirnt a Motif hasznlata helyett , hogy belekezdenek egy sajt fggvnyknyvtr fejlesztsbe. Az azta nagykorv lett GTK+ tbb zben is komoly talakulson ment keresztl. Ezek kzl taln a legmeghatrozbb, hogy az eredetileg GUI eszkzkszletknt indult projekt jcskn tllpett eredeti keretein. Ennek lehet osgt a modulris felpts teremtette meg, mely ks obb mg tbb zben hasznra vlt a projektnek. Azon rszek, melyek nem kzvetlenl fggenek ssze a grakus felhasznli felletek fejlesztsvel, vagy msutt is hasznosak lehetnek, kln modulokban kaptak helyet, egy exibilis eszkzkszletet hozva gy ltre, melyb ol mindenki pontosan annyit s csak annyit hasznl fel, amennyire felttlenl szksge van. A legutbbi f overzi vagyis a GTK+ 3 , melyr ol a tovbbiak sz lesz majd, nem csupn folytatja a hagyomnyokat, de igyekszik mindinkbb kiszlesteni a modularits adta el onyok alkalmazsi terleteit.

1.1.2.

Elrhet osge

A GTK+ tbbfle formban, tbbfle opercis rendszerre s grakus szerverre is elrhet o. A forma alatt ez esetben az rtend o, hogy a fggvnyknyvtr nem csupn forrskdknt, hanem binris vltozatban is letlthet o. Ez nyilvn nem klnsebb meglepets, mr csak azrt sem, mert nylt forrs szoftverr ol van sz. Itt rdemes megjegyezni, hogy a licenc a GTK+ annak fgg osgei, illetve szmos kapcsold fggvnyknyvtr esetn a GNU Lesser General Public License, rvidtve az LGPL, ami sszefoglalva annyit tesz, hogy nylt, illetve zrt forrs szoftverek egyarnt fejleszthet oek a GUI eszkzkszlet hasznlatval, azzal a kittellel, hogy a fggvnyknyvtr ltalunk hasznlt esetleges mdostsokat is tartalmaz vltozatnak forrst gyfeleinknek krsre t kell adnunk. A szoksjog, illetve a sajt rdeknk azt diktlja ugyanakkor, hogy a javtsok miel obb bekerljenek a fejleszt ok ltal karbantartott vltozatba. Visszatrve az elrhet osghez a forrskd mind verzikezel o rendszeren (Git) keresztl, mind archv llomnyok formjban letlthet o. A binris vltozatok tekintetben elmondhat, hogy mindaddig, amg GNU /Linux alap rendszereken dolgozunk, klnsebb nehzsgekbe nem fogunk tkzni, hiszen nagy valszn usggel az ltalunk hasznlt disztribci mind a fejlesztshez (devel), mind a hibajavtshoz (debug) szksges csomagokat tartalmazza. Ugyanakkor a GTK+ egy multiplatform eszkz, vagyis joggal vrhat el, hogy tbb opercis rendszeren is m ukdjenek az ltalunk megrt kdok. A mr emltett GNU /Linux disztribcikon tl melyet a tovbbiakban els odlegesen, de kzel sem kizrlagosan hasznlunk majd a GTK+ mind a Microsoft Windows, mind pedig az Apple Mac OS X rendszerein elrhet o. A hasznlhat grakus szerverekr ol elljrban annyit rdemes megemlteni, hogy a GTK+ portabilitsnak kt alappillre kzl az els o az a megolds, mely a felhasznl fellet pt okveinek a GTK+ ltal hasznlt terminolgival lve widget implementcijt elvlasztja az azok megjelentsre szolgl rajzol primitvek megvalststl. Ennek rvn biztosthat, hogy a GTK+ forrskd tlnyom rsznek vltozatlansga mellett csupn egy jabb, gynevezett backend hozzadsval alkalmass tehet o egy jabb grakus szerver, vagy alrendszer (pl: X11, frame buffer, HTML5, . . . ) al.

1.2.

Rszegysgek

A GTK 1 szervezsr ol fontos elljrban megemlteni, hogy pldartk uen vlasztja szt a funkcionalits egyes elemeit, jl elhatrolt implementcis rszegysgre, melyek fejlesztse egymstl fggetlenl, a GNOME projekttel egyttm ukdsben folyik. Ez a megolds szmos el onye mellett jr termszetesen nhny nehzsggel is. A modulok csak publikus interfszeiken keresztl tudnak egymssal kommuniklni. Ez egyrszr ol fggetlensget jelent a modulok belgynek tekinthet o implementcis rszleteinek tern, viszont komoly ktttsg a publikus fellet oldaln, lvn annak vltozatlansgtl nem csak a kls o projektek, de az egyes GTK modulok is fggenek. A hosszan fenntartand llandsg hatsait jl pldzza, hogy a GTK+ csak hat v utn indtott j f overzit (3.x), mely felszmolta a korbbi vltozattal val helyenknt csaknem teljesen felesleges kompatibilitst. Az azta eltelt id oben2 viszont vajmi kevs projekt dnttt gy, hogy tll az j verzira, mg azzal egytt sem, hogy az egyszer ubb alkalmazsok tekintetben ez klnsebben komoly er oforrst nem ignyel. Clszer uen teht ezek az inkompatibilis vltsok nem lehetnek tl gyakoriak. A kvetkez okben sorra vesszk, mik azok a rszegysgek, melyek egytt a GTK C nyelv u vltozatt alkotjk, s melyek termszetesen a tovbbi nyelvi vltozatok alapjul szolglnak.

1.2.1.

GTK

A GTK+ a grakus felhasznl felletek (GUI ) fejlesztshez szksges felleti elemek (beviteli mez ok, rdigombok, listk, dialgus ablakok, . . . ), azaz widgetek trhza, vagyis a GTK keretrendszer lelke. A fggvnyknyvtr a korbban lertaknak megfelel oen csak a kzvetlenl szksges implementcit, vagyis a widgetek kirajzolshoz, interakciinak, adattrolsnak megvalstshoz szksges kdok sszessgt jelenti. Ett ol persze nmikpp tbbet, de err ol ks obb (1.4.1) esik sz.

1.2.2.

GDK

A GIMP Drawing Kit (GDK ) a GTK+ rszeknt terjesztett alacsony szint u rajzolsi s ablakkezelsi feladatok megvalstsra, egyszersmind a magasabb szint u rutinok ell trtn o elfedsre szolgl fggvnyknyvtr. A GDK fontos szerepet tlt be a GTK klnbz o platformok kztti hordozhatsgnak megteremtsben, lvn az ltala nyjtott viszonylag sz uk kr u funkcionalitst jraimplementlva a GTK+ alkalmas lehet egy jabb grakus krnyezetben val futsra. Ezen funkcik alatt a mr emltett rajzolsi primitveken tl tbbek kztt rasztergrakai feladatok, kurzor megjelentse, illetve alacsony szint u ablakesemnyek implementlsa rtend o. A fentieknek ksznhet o, hogy az eredetileg csak az X Window System3 (X11) felett m ukdni kpes GDK, mra nemcsak egyb Linux alap szerveren (Wayland), de ms opercis rendszereken (Windows, Mac OS X ), s ot akr webbngsz oben is m ukdni kpes4 . A grakus alrendszer portolsa mellett felmerl o problmk jelentkeny rszt a GLib fggvnyknyvtr oldja meg.

1.2.3.

GLib

A GLib a GNOME projekt egyik fundamentlis eleme, mely trtnetileg ugyan kt odik a GTK+-hoz, mra azonban teljesen nllv vlt. Eredend oen a GTK+ ltal hasznlt, de attl fggetlenl is ltjogosultsggal br, platformfggetlen kdok kiemelse egy kln fggvnyknyvtrba, melyet szmos a GNOME, vagy a GTK projektekhez akr nem is kapcsold szoftver5 alkalmaz. A meglehet osen szertegaz funkcionalitscsomag melyet a Glib megtestest, rviden a kvetkez oben foglalhat ssze; C programozsi nyelven rt standard fggvnyknyvtrak nem, vagy csak rszben elrhet o, esetleg nehzkesen hasznlhat eszkzk sszessge. A teljessg ignye nlkl megemltend oek a GLib adattroli (lncolt listk, fk, dinamikus tmbk, hash tblk, . . . ), hordozhat adattpusai (guint32, gboolean, . . . ), memria allokcis fggvnyei (g_new, g_allocator_new, g_slice_alloc, . . . ), gyakran hasznlt formtumok (dtum, id o, URI, fjl- s knyvtrnv, . . . ) kezelsre szolgl eszkzei, konverzis algoritmusai (base64, endianness, karakterkdols, . . . ) szles krben alkalmazott mdszerek implementcii (XML, Glob, Regex, . . . ). Mindezeken tl a GLib tartalmaz nhny kln is emltsre mlt alrendszert.
1 a GTK rvidts alatt a tovbbiakban az ltalnossgban vett grakus felhasznli fellet fejleszt oi eszkzt, mg GTK+ alatt ennek C nyelv u vltozatt rtjk 2 a 3.0.0 verzi megjelense id opontja 2011. februr 3 a Linux alap rendszerek, a GDK szletsnek idejben, gyakorlatilag kizrlagos grakus szervere 4 ezen szolgltatshoz elrshez websocket tmogatsra van szksg a bngsz oben, illetve a Broadway elnevezs u backend bekapcsolsra a GTK+ fordtsakor 5 pldnak okrt a Compiz, a Midnight Commander, vagy a syslog-ng

GObject A GLib Object System egy C nyelven rt objektumorientlt keretrendszer, mely megvalst szmos olyan funkcit (szrmaztats, virtulis fggvnyek, tpus, objektumok memria menedzsmentje, . . . ) melyek pldul a C++, vagy a Java esetn nyelvi szinten adottak. A GObject, mint osztly szolgl pldul alapjul a GTK+ ltal implementlt minden egyes widgetnek. A kp ezzel azonban mg kzel sem teljes. A GObject implementl szmos alapvet o fontossg egyszer u (gdouble, gint, . . . ) s sszetett tpust, illetve tmogatja ezek felhasznlst sajt tpusok ltrehozsakor, illetve a GObject-b ol szrmaz osztlyokban adattagknt val elhelyezst. Emellett megvalst egy az objektumok llapotvltozsainak kvetsre szolgl kommunikcis alrendszert (signal). Fentiek ltrehozsakor kifejezett cl volt a rugalmas b ovthet osg s a knny u adaptlhatsg ms nyelvekre. Ez utbbi a ks obb (1.3) emltsre kerl o nyelvi vltozatok egyszer u megvalsthatsgnak el ofelttele. GModule A GModule egy dinamikus modulok betltsre szolgl fggvnyknyvtr, mely rendelkezsre ll mindazon rendszereken, ahol a GLib is, elfedve ez egyes opercis rendszer klnbz osgeit ezen a terleten. GThread A GThread clja er osen hasonlatos az imnt emltett GModule-hoz, vagyis biztostani egy, a platformok sajtossgaitl fggetlen megoldst ezttal nem a dinamikus modulbetlts, hanem a szlkezels tekintetben. GIO Az eddigieket folytatva a GIO is egy, a multiplatformos programozs sorn gyakran felmerl o problma jelesl a fjlok, fjlrendszerek, meghajtk kezelse megoldsra szletett. A megfelel o POSIX hvsokkal eddig is megvalsthat volt egy kvzi platformfggetlen fjlkezels, gy ennek nmagban nem lenne szmottev o haszna. A GIO ugyanakkor tbb, mint egy egyszer u POSIX hvsokat burkol fggvnyhalmaz. A GObject-re tmaszkodva egy magasabb szint u, dokumentumkzpont interfszt valst meg.

1.2.4.

Cairo

A Cairo egy eszkzfggetlen6 ktdimenzis vektorgrakai fggvnyknyvtr, melyet kifejezetten a hardveres gyorstkkal val egyttm ukdsre terveztek, s mellyel a GDK a ktdimenzis rajzolsi feladatait vgzi. rdemes megemlteni, hogy a Cairo nem a GNOME, hanem a freedesktop.org projekt rsze.

1.2.5.

Pango

A Pango szvegek kpi formban trtn o el olltsrt (rendering) s megjelentsrt (lay out) felel os a GTK -n bell, de termszetesen a GTK -tl fggetlenl is hasznlhat, lvn a fggvnyknyvtr az el obbiekhez hasonlan szmos platformot tmogat.

1.3.
1.3.1.

Nyelvi vltozatok
GTK minus minus

A gtkmm, illetve annak fgg osgei adjk a GTK projekt C++ nyelv u vltozatt. Ezek a fggvnyknyvtrak wrapperek az eredeti C vltozat fltt, az ebb ol fakad el onykkel s korltokkal egytt. Ezen kdok jelentkeny rsze wrapper mivoltukbl kvetkez oen generlt, ugyanakkor szmos helyen ahol ez funkcionalitshoz a programozsi nyelvhez leginkbb illeszked o megvalstshoz szksges eredeti kdot is tartalmaz. A C, illetve C++ nyelv u vltozatok a lehet o legkisebb mrtkben trnek el egymstl. Ez egyben azt is jelenti, hogy az egyes nyelvi vltozatok nem tartalmaznak a tbbihez kpest tbblet funkcionalitst. Nem lehet azonban eltekinteni az egyes programozsi nyelvek adta lehet osgek el onyeit ol, htrnyaitl, melyek knnyebb vagy nehezebb teszik a GTK adott nyelven val hasznlatt. Libsigc++ A gtkmm implementcijnl hasznlt fggvnyknyvtr, ami lehet ov teszi a szignlkezels tpusbiztos megvalstst, mely a C vltozatnl a nyelvi sajtossgok okn nem adott.
6 rtsd

hardvereszkzkt ol fggetlen

GTK+ Nyelv: Implementci mdja: Objektumorinentlt technikk hasznlata: Licenc: Ismertebb projektek: C natv

gtkmm C++ wrapper

PyGObject Python binding

kzvetett LGPL Evolution, Firefox, Gimp, . . .

natv LGPL GParted, Inkscape, . . .

natv LGPL gedit

1.1. tblzat. A GTK+, gtkmm, PyGObject sszehasonltsa

1.3.2.

PyGobject

A Python vltozat ahogy szmos ms egyb nyelvi varici is alapjai gykeresen megvltoztak a GTK+ j f overzijnak megjelensvel. A korbbi a gtkmm ltal is alkalmazott mdszer, az eredeti vltozatot rejti el, burkolja be (wrap), vagy egy kztes rteget kpez a C, illetve a cl nyelv esetnkben a Python kztt. Ezen rteg tbb-kevsb termszetesen automatk (pl: genertor szkriptek) rvn jn ltre, ugyanakkor igaz az, hogy nem kzvetlenl az eredeti kdbzist hasznlja a burkol rteg ltrehozsra. Kvetkezskppen a GTK+ publikus felletben bekvetkez o vltozsokat az egyes wrappereknek rendre kvetnik kell, holott a GTK+ kdjnak rsakor is adottak azok a metaadatok, melyek mondjuk egy Perl, vagy Python elksztshez szksgesek. GObject Introspection Az el obbi gondolatot tovbb f uzve juthatunk el ahhoz a kzenfekv o krdshez, hogy mirt nincsenek az emltett metaadatok rgtn a GTK+ illetve a GLib, Pango s a tbbi fgg osg kdja mellett, ahonnan kinyerve azokat az egyes nyelvi vltozatokat egyszer uen generlni lehetne. A GObject Introspection pontosan ezt clozza. Egy binding elksztshez szksges adatok a C nyelv u vltozatok kdjban egy erre a clra meghatrozott formtumban megjegyzsknt szerepelnek, a klnbz o nyelv u vltozatok pedig ezt felhasznlva jnnek ltre.

1.3.3.

sszehasonlts

Az egyes vltozatoknak megvannak a maguk jellemz oen a programozsi nyelv sajtossgaibl kvetkez o el onyei. Ilyenek lehetnek pldul a C nyelv, illetve a fordtk szles kr u elterjedtsge, a C++ azon sajtossga, hogy a nyelv nyjtotta mdszereket, mint pldul az rkltets, itt kzvetlenl hasznlhatjuk ki, vagy a Python nyelv u fejleszts sebessge. Mg mondjuk a C nyelv esetben bizonyos funkcik kiss nehzkesen hasznlhatak, addig a C++ objektumorientlt megkzeltse mellett ugyanez a funkci jtszi knnyedsggel elrhet o, vagy ppen a Python nyjtotta szkript krnyezet ad knnyebb, rugalmasabb kezelhet osget. Az emltett hrom vltozat tekintetben a f obb ismrveket a 1.1 tblzat tartalmazza.

1.4.
1.4.1.

Kapcsold projektek
Automata tesztels

A grakus felletek kapcsn sajnlatosan elhanyagolt terlet az automata tesztels, azon nyilvnval tny ellenre is, hogy a felhasznl pp ezeken a felleteken keresztl ri el az rdemi funkcionalitst s nyeri els o benyomsait a szoftverrel kapcsolatban, gy ennek megjelense, valamint helyes m ukdse dnt o az alkalmazs ks obbi sikeressgnek tekintetben. Ezzel egytt igaz tovbb, hogy teljes kr u (end-to-end) megvalstott tesztels mindenkppen a felhasznl felletr ol indtott akcival kell induljon s az ugyanott tapasztalt reakci ellen orzsvel kell vgz odjn. A GTK felhasznlsval fejlesztett felletek tesztelsnl rendelkezsnkre ll a megfelel o keretrendszer, mely lehet osget teremt, hogy az elkszlt felleti elemek m ukdst automatk segtsgvel teszteljk. A ks obbiek sorn bemutatsra kerl o mintapldk esetn mindentt kitrnk majd az azok kapcsn felmerl o tesztelsi feladatok megoldsnak mikntjre. Most azonban lssuk nagy vonalakban hogyan is m ukdik ez a tesztelsi keretrendszer.

Accessibility Tool Kit Els ore taln egymstl tvoli terletnek t unik a szoftverek akadlymentestse (accessibility), valamint a felhasznl ket. Ez pedig az a kvetelmny, aminek a szoftver mindkt cl felletek automata tesztelse, egy valami mgis sszekti o elrse rdekben eleget kell tegyen, ami nem ms, mint az alkalmazs vezrelhet osge bizonyos felhasznli interakcik kizrsa mellett is. Az automata tesztels esetn ez gyakorlatilag az sszes eszkz (billenty uzet, egr, . . . ) kizrst jelenti, hiszen a felhasznlt ez esetben teljes egszben a tesztelst vgz o szoftver helyettesti. A szoftverek akadlymentestsnek biztostsa egy specilis megkzeltst ignyel, mely a fogyatkossggal l o emberek szoftverekkel vgzett munkjnak megknnytst helyezi el otrbe. Ehhez az ATK csupn annyit tesz, hogy denil egy interfszt, melyen keresztl az adott szoftvert el lehet rni. Indulva onnan, hogy egy adott alkalmazst ki lehet vlasztani az sszes aktulisan fut alkalmazs kzl, folytatva azzal, hogy le lehet krdezni az ltala megnyitott ablakokat, az abban lv o felleti elemeket (widget), egszen odig, hogy az ltaluk trolt rtkeket (egy beviteli mez o szvege, folyamatindiktor rtke, . . . ), illetve llapotokat (rdigomb kivlasztott llapota, beviteli mez o szerkeszthet osge, . . . ) rni olvasni lehet, rajtuk akcikat (gomb lenyomsa, menelem kivlasztsa) vgezhetnk. Gail Lvn az ATK lnyegben csak egy interfsz denci, ahhoz minden esetben7 tartozik egy implementci, mely az adott felletfejleszt oi rendszer m ukdst megfelelteti az ATK ltal deniltaknak. A GTK esetn ez az implementci a Gail. Dogtail A Dogtail egy Python nyelven rt s Python nyelven hasznlhat tesztautomatizcis eszkz, illetve keretrendszer. Segtsgvel ltrehozhatk felhasznli felletek a mr emltett ATK interfszen keresztl tesztel o szkriptek, tbbfle formban s mdon is. Ami a mdot illeti, lehet osgnk van egyrszr ol effektve forrskd azaz egy Python szkript formjban ltrehozni a tesztjeinket, vagy gymond felvtelt kszteni magrl a tesztelsr ol, majd az gy rgztett esemnyeket mint tesztet visszajtszani. Ha az el obbi mdszernl maradunk amir ol a tovbbi rszekben is sz esik , akkor is kt lehet osg addik, hiszen a Dogtail rendelkezik egy procedurlis, illetve egy objektumorientlt megkzelts u API-val, melyek tetszs szerint hasznlhatak a tesztek elksztsekor. Accerciser Mind az automata tesztel o szkriptek megrsakor, mind egy konkrt alkalmazs felletnek feltrkpezsre, mind pedig az ATK interfsszel trtn o ismerkedsre alkalmas eszkz az Accerciser, mely az akadlymentestett szoftverek feltrkpezsre szolgl eszkz s mint ilyen pontosan azon adatok megjelentsre s mdostsra, valamint azon akcik vgrehajtsra alkalmas, amire a Dogtail szkriptek rvn kpesek vagyunk.

7 mr amennyiben az adott grakus felletfejleszt oi rendszer mint amilyen a GTK+, vagy mondjuk a Qt biztostani kvnja az ATK -n keresztli elrst

2. fejezet

Alapvet o ismeretek
2.1.
2.1.1.

A fejleszts fogalmai
A GTK+ objektum-orientltsga

Ebben a fejezetben arra prblunk mlyebben is rvilgtani, hogy br a GTK+ ugyan C nyelven rdott, mgis szmos az objektum-orientlt nyelvek esetn megszokott terminolgit hasznl, s ot ezeket a nyelvi eszkzk adta mrtkben meg is valstja. Ezrt az objektum-orientlt fejleszts fogalmait, kifejezseit joggal hasznljuk mg akkor is, ha GTK+ nyelv u fejlesztsr ol esik sz. Azzal egytt, hogy az objektum-orientlt mechanizmusokat nyelvi szinten a C nem, csak a C++, illetve a Python tmogatja lehetsges ezekkel lni ezen vltozat esetn is. Lssuk mik lennnek ezek s hogyan vlik lehet ov alkalmazsuk a GTK+ esetn. Egysgbezrs Az objektum-orientlt alapelvek kzl C nyelven is viszonylag jl biztosthat elvr ol beszlnk. A GTK+ meg is teszi, amit ebben a tekintetben meg lehet. Az adatstruktrkat jelen esetben widgeteket s az azokon m uveleteket vgz o ket a klvilg el fggvnyeket a lehet osgekhez mrten egysgknt kezeli, valamint elrejti o ol. A GTK+ minden sajt makrt/fggvnyt GTK/gtk prexszel lt el (a GLib esetn ez pusztn csak egy kis, illetve nagy g bet u). Egy adott rszterlet pldul egy widget sajt nvtrrel is rendelkezhet, azaz jabb prexet vezethet be1 . Ezeket egymstl, illetve a valdi funkcit jell o nevekt ol _ (alhzs) jellel vlasztjuk el. A C++ wrapper esetn kihasznlva a kzenfekv o nyelvi lehet osget a prexek szerept termszetesen a nvterek, illetve az osztlyok veszik t2 . Ezen prexelt makrk/fggvnyek els o paramtere minden esetben a prex ltal meghatrozott tpus objektum, el osegtve ezzel is ezen fggvnyek, illetve az ltaluk kezelt objektumok egy egysgknt val kezelst. A privt adatok klvilg ell val elrejtsre a C nyelven erre a clra szles krben alkalmazott tltszatlan mutatkat3 (opaque pointer) hasznlja a GTK+, ami lehet ov teszi az objektum ltal hasznlt adatszerkezetek, implementcis mdszerek elfedst a publikus interfsz hasznl kdok ell. rkl ods Megoldott a widgetek egymsbl trtn o szrmaztatsa, s ot felhasznli widgetek is denilhatak a mr meglv oekre tmaszkodva. Az kd jrahasznostst jl mutatja az a tny, hogy a GObject osztly mely nmagban is szmos se. Meg hasznos funkcival rendelkezik minden widget, illetve szmos ms a GTK -ban hasznlt nem vizulis elemnek o kell jegyezni, hogy a gtkmm, illetve a PyGObject esetn lvn ezen esetekben az objektum-orientltsgot tmogatja mag a nyelv termszetesen a szrmaztats nagysgrenddel egyszer ubb, de mintapldkat felhasznlva nmi rutinnal a GTK+ esetn sem ignyel klnsebb er ofesztst. A widgetek rklsi fjrl mr itt rdemes megjegyezni, hogy az nem csupn kt szint u. A GObject tpus a fa cscspontja, de kzte s az egyes widgettpusok kztt adott esetben mg szmos csompont tallhat az rklsi fban. A hasonl funkcionalits, kvetkezskpp rendszerint hasonl megjelens u widgetek (9.1) rtelemszer uen egymsbl se az szrmaznak. Ez mg a leghtkznapibb esetekben is igaz. A szmok kezelsre is alkalmas widget (spin button) o egyszer u, egy sornyi szveg befogadsra alkalmas beviteli mez ot megvalst widget (entry).
1a

GtkWindow tpushoz tartoz fggvnyek prexe gtk helyett gtk_window Window tpus a gtkmm esetn Gtk nvtren bell szerepl o Window nev u osztly 3 a mdszer egyebek mellett pimpl (pointer to implementation idiom) nven is ismert
2a

(a) Egysoros beviteli mez o[9]

(b) Szmbeviteli mez o[9]

2.1. bra. rkl ods hasonl funkcij widgetek kztt A mechanizmus tovbbi el onye az interfszek4 kialaktsnak lehet osge. A GTK+ a 3-as f overzit megel oz oen trekedett arra, hogy a klnbz o widgetek azonos funkcit megvalst rszeit (kattinthat, szerkeszthet o, grgethet o elemek) egysges programozsi felleten keresztl rhetjk el, ezt kvet oen ez a tendencia tovbb er osdik. Polimorzmus Hasonlan az rkl odshez pusztn nyelvi szinten itt sem rhet o el teljes kr u megolds C nyelv esetn. Ugyanakkor a f o momentum, vagyis a szrmazsi hierarchia egyes osztlyainak specikus viselkedse egy adott funkcit megvalst metdusok tekintetben elrhet o. A widgeteket ler struktrkban ugyanis a szrmaztatott osztlyokbl fellrhatak az egyes funkcikat implementlhat fggvnyek mutati5 . Az gy ltrejv o tbbalaksg br kzel sem tkletes, m szmos gyakorlati problmt megold. Ezen fell a GTK+ minden widgettpushoz mondhatni osztlyhoz denil egy-egy makrt, melyek segtsgvel futsid oben ellen orizhet o egy adott widget, azaz objektum tnyleges tpusa, hasonlan ahhoz, amire a dynamic_cast hasznlata ad lehet osget a C++-ban. Azt a mechanizmust, melynek rvn lehet ov vlik a GTK+-ban a futs idej u tpusellen orzs, a mr emltett GObject osztly implementlja, az ebb ol szrmaz sajt osztlyainknak nem csupn lehetsges, de szksges is a hasznlata.

2.1.2.
Widget

A GTK alapfogalmai

A fogalmat egyrszt, mint gy ujt ofogalmat hasznljuk a grakus felhasznli felletek programozsa sorn a felhasznl felletek egyes grakai elemeinek megnevezsre6 , mint amilyen pldul egy rdidomb, egy szvegbeviteli mez o, vagy sosztlynak a neve is mg ha az akr egy kp. Msrszr ol a GtkWidget minden ez el obbi rtelemben vett widget o szrmaztats a C esetben nyelvi szinten nem is tmogatott melyb ol minden egyes elem szrmazik. A GtkWidget osztly, mint a widget fogalom objektum-orientlt lekpezse a felhasznl fellet egyes elemeinek tulajdonsgait, illetve az azokhoz kapcsold m uveleteket zrja egysgbe, biztostva egyttal az ltala implementlt funkcik jrahasznosthatsgt ppgy, mint a fellbrlhatsgukat. Lssuk, hogy ezen ltalnossgban megfogalmazott elvek mgtt mi is rejt ozik. Tulajdonsgok A mindennapi felhasznls ez esetben ugye a mindennapi szoftverfejleszts sorn taln a leggyakrabban felmerl o krds nyilvn csak azt kvet oen, hogy megismerkedtnk milyen tulajdonsgokkal brnak a klnbz o widgettpusok , hogy mik ezen tulajdonsgok aktulis rtki konkrt objektumaink esetn. Ezen tulajdonsgok (property), illetve ezek rtkei hatrozzk meg widgeteink megjelenst, a felhasznli interakcikkal, illetve ms widgetekkel sszefgg o viselkedst. Ezek a tulajdonsgok lehetnek egszen kzenfekv oek, mint amilyen pldul egy beviteli mez oben szerepl o szveg, egy folyamatindiktor szzalkban vett rtke, egy rdigomb be-, kikapcsolt llapota. Lehetnek teljesen ltalnosak, mint amilyen widgetek neve, lthatsga, mretei, a tartalmaz kontnerben elfoglalt helyzetk, igaztsuk. Tkrzhetnek valamilyen llapotot, mint hogy a widget fkuszban van-e, fogad-e a felhasznli interakcikat s termszetesen szmos csak az adott widgettpusra vonatkoz tulajdonsgot. Szignl Lvn egy alapvet oen esemnyvezrelt eszkzr ol beszlnk a fent emltett tulajdonsgok rtkeinl mr csak a widget ltal denilt esemnyek (event) bekvetkezsr ol, vagy ppen elmaradsrl val rtesls lehet fontosabb. Klnsen azon esetekben mikor az esemny szmunkra valamilyen szempontbl jelent osggel brnak, kvetkezskpp arra reektlni szeretnnk. Ez persze nem mindig van gy, hiszen mondjuk adatok bevitelre szolgl ablakban egy rdigomb
kifejezs alatt a Java nyelv interfsz, illetve a C++ absztrakt osztlya rtend o hasonl eredmnyre vezet, mint a C++ virtual kulcsszavnak hasznlata esetn 6 ebben az rtelemben a window gadget kifejezs rvidtse
5 ami 4a

llapotnak vltozsa nem felttlenl rdekes, inkbb csak annak akkori rtke, mikor az ablakon tallhat nyugtz gombot (pl: Ok, Alkalmaz, . . . ) lenyomtuk s az ablakban megadott adatoknak megfelel oen szeretnnk eljrni. Ellenben ez utbbi esemnyr ol mrmint hogy a gomb lenyomsra kerlt csaknem minden esetben rteslni szeretnnk. A widgetek esemnyeinek bekvetkeztr ol a GObject osztly ltal implementlt rtestsi rendszer, a szignlok (signal), rvn ll mdunkban tudomst szerezni. Ezen mechanizmus keresztl valsthat meg az esemnyekhez kezel ofggvnyek (callback) kapcsolsa, ahol a felhasznl akcira a megfelel o reakcit vlthatjuk ki. Az imnt emltett nyugtz gomb lenyomsnak hatsra pldnak okrt bezrhatjuk az ablakot, vagy pp hibaablakot dobhatunk fel, ha a bevitt adatok a validci sorn nem bizonyultak helyesnek. Itt rdemes megjegyezni, hogy a GObject nem csupn a GtkWidget se, hanem ms GTK -s elemeknek is, melyek jellemz osztly o oen nem hagyomnyos widgetek, ugyanakkor ki szeretnk hasznlni a GObject osztly szolgltatsait. Az olyan elemeknek is lehetnek teht szignljai, melyek nem jelennek meg kzvetlenl a felleten, amire egy adattrol (pl: GtkTreeModel, TextBuffer) objektum lehet j plda. Ezen osztlyok pldnyai is szignlokon keresztl kommuniklnak, gy adnak pldul jelzst arrl, hogy a trolt elemekben vltozs llt be. A GTK szignl kulcsszavnak jelentse (jel, jelzs) teht jl tkrzi funkcijt. Minden widgethez tartoz(hat)nak klnbz o esemnyek mint amilyen egy gomb esetn annak lenyomsa (vagy ppen felengedse), egy beviteli mez onl az abba trtn o rs melyekr ol a widgetek jellemz oen GDK rvn, egy alacsony szint u7 esemny formjban tudomst szereznek, majd elvgzik a megfelel o m uveleteket gomb jrarajzols, beviteli mez obe karakter rsa a karakter megjelentse majd rtestst kldenek a program tbbi rsze fel, immr egy magasabb szinten8 rtestst. Ezt az rtestst, avagy jelzst nevezzk szignlnak. A szignlokhoz alapvet oen hrom tevkenysghez kapcsoldik. Ezek kzl kett o leginkbb csak a sajt widgetek fejlesztse sorn kerl el o, mg a harmadik gyakorlatilag mg a legegyszer ubb esetekben is nlklzhetetlen. Ez utbbi a fggvnyek kapcsolsa (connect) az esemnyekhez, ezt azonban meg kell el ozze a a msik kt emltett m uvelet. Id orendi sorrendben ez a szignlok regisztrcija register) ahol meg kell adunk az esemnynk nevt, illetve paramtereit , illetve a szignlok kldse, kibocstsa (emit), ahol a regisztrci sorn megadott nevet, valamint paramtereket szksges megadni. Az esemnykezel ok kapcsolsakor ezt a nevet hasznljuk fel, meghvsukkor pedig ezek a paramtereket kapjuk meg. Callback Amennyiben egy adott widgethez kapcsold valamilyen esemnyr ol (event) tudomst kvnunk szerezni a program futsa sorn, ezt gy tehetjk meg, hogy a widget megfelel o tpus jelzshez (signal) esemnykezel o fggvnyt (callback) kapcsolunk. Itt minden olyan m uvelet elvgezhet o, ami nem a widgethez, hanem annak programunkban betlttt szerephez kt odik. A korbbi pldnl maradva ha egy adatok bevitelre szolgl ablak Ok gombjnak lenyomsnl szksges lehet a felhasznl ltal megadott adatok szintaktikai, illetve szemantikai ellen orzse, az ellen orztt adatok mentsre, majd az ablak bezrsra, problma esetn hibaablak feldobsra, valamint a beviteli folyamat jrakezdsre, akkor azt a kezel o fggvnyben mind megtehetjk. Egybirnt az egyes tulajdonsgok (property) megvltozsa szintn esemnyek min osl, vagyis ezekhez is mdunk van fggvnyeket csatolnunk.

2.1.3.

A GTK+ mukdsi sajtossgai

Main Loop Az esemnyek kezelse kapcsn megvlaszoland az a trivilisan add krds, hogy az egyes widgetek hogyan szereznek tudomst a rajtuk a felhasznlk, vagy ppen az automata tesztel o eszkzk ltal vgrehajtott akcikrl. A vlasz pedig pp ugyanabban rejlik, mint brmely ms felhasznli felletek fejlesztsre szolgl eszkzkszlet esetn, azaz az esemnyvezrelt m ukdsi modellben. Ez nem jelent ms mint, hogy a GTK+ mindaddig vrakozik, amg valamilyen forrsbl esemny nem rkezik (pl: egr mozgatsa, gombjainak lenyomsa, billenty u felengedse, . . . ). Amennyiben egy esemny bekvetkezik meghatrozza, melyik widgetet rintett az esemny ltal, meghvja a widget megfelel o esemnykezel o fggvnyt, majd jabb vrakozsba kezd. Ennek a vrakozsi ciklusnak az implementcija main loop. A GTK+ tulajdonkppeni f ociklusa a Glib fggvnyknyvtrban implementlt, a GTK+ ezt jra felhasznlva ciklizl, vrva a grakus szerver legyen az a Linux, a Mac OS X, vagy a Windows megfelel o alrendszere zeneteire. Mindezt a GDK -n keresztl teszi, mely mint azt az el oz o rszben is emltettk egy vkony burkol rteg az ablakoz rendszer kr. A main loop teht az ami az imnt emltett kapcsolaton t eljuttatja az ablakoz rendszer alacsony szint u esemnyeit a GDK ltal standardizlt formban az egyes widgetekhez, hogy ezek a feldolgozst kvet oen egy magasabb szint u esemnyt vltsanak ki a tbbi widget, illetve az applikci ms rszei fel.
7 billenty u 8 beviteli

lenyomsa, felengedse, egrkattints, . . . mez o rtknek vltozsa, kattints, . . .

Referencia-szmlls A GTK+ segtsgvel ltrehozott felletek ahogy azt a ks obbiekben ltni fogjuk nem widgetek szrvny halmazt, hanem egymssal szoros sszefggsben ll (szl o-gyerek, modell-nzet-vezrl o kapcsolat) elemek hlzatt jelentik. Ennek okn az megoldand feladat, hogy az egymshoz valamilyen szempont alapjn kt od o elemek egyms oly mdon tudjk hivatkozni, hogy hivatkozsok ltrejtte, illetve megsz unse egyttal a widgetek memria menedzsmentjre is megoldst adjon. Ennek bevett mdszere a referencik tartsa a hivatkozott elemekre, mellyel a GTK+ is l. Minden GObjectb ol szrmaz osztly gy a GtkWidget is rendelkezik referencia-szmmal, mely tulajdonkppen azt fejezi ki, hogy hnyan hivatkoznak az adott elemre. A GTK+ pontosabban ez esetben a GLib lebeg o referencit (oating reference) alkalmaz, mely azt jelenti, hogy az objektum ltrejttekor annak referencija 1 lesz, br a widgetre ekkor mg nem hivatkozik semelyik msik widget sem, azaz ezt a referencit gymond nem birtokolja senki. Amikor egy widgetre megszletik ez els o valdi hivatkozs, pldul egy kontner osztlyba mint amilyen egy kznsges ablak is tesszk a widgetet, vagyis ltrejn az els o valdi hivatkozs az elemre, akkor az a hivatkoz birtokba kerl. A referencia-rtk vltozatlanul 1 marad, viszont a lebeg o referencia elsllyesztsre (sink) kerl. Minden ezt kvet o esetben a kontnerb ol trtn o eltvolts cskkenti, ahhoz val hozzads pedig nveli a referencia rtkt. rdemes felhvni a gyelmet arra, hogy az elmondottak alapjn, ha hozzadtuk widgetnket egy kontnerhez, majd pedig eltvoltjuk bel ole azt, akkor annak referencija 0-ra cskken, ami maga utn vonja a widget destruktornak lefutst. Ezt elkerlhetjk, ha az eltvolts el ott explicit mdon nveljk a referencit, amit aztn cskkentennk kell, ha egy msik osztly birtokba adjuk a widgetet. Szl o-gyerek kapcsolat A szl o-gyerek kapcsolat a mr emltett kontnerek azaz a GtkContainer, illetve az abbl szrmaz osztlyok viszonylatban merl fel. Ezen elemek teszik lehet ov a widgetek felleten val elrendezst (ablakok, tblzatok, gombok, . . . ), egymsba gyazst. A kontner teht az a widget, amely tovbbi widgetet, vagy widgeteket tartalmazhatnak. Ilyen rtelemben egy szl o-gyerek kapcsolatot valstanak meg, ahol minden szl onek lehetnek gyermekei, de egy gyermek widgetnek minden esetben csak egy szl oje van, vagyis a szl ok s a gyerekek egy fa hierarchit alkotnak. Ez a szerkezet tbb szempontbl is fontos szerepet jtszik a GTK+ m ukdse sorn. Egyrszr ol a referencia-szmllsnl mr emltett mdon, azaz ha egy widgetet hozzadunk egy kontnerhez, akkor az gymond tart r egy referencit vagy a referenciaszm nvelsvel, vagy lebeg o referencia elsllyesztsvel , majd elereszti azt a kontnerb ol val eltvoltsakor. Msrszr ol egy mg nem ismertetett a szl o- s gyerekwidgetek viszonynak tulajdonsgait rgzt o mechanizmust tesz lehet ov, melyr ol a ks obbiekben mg rszletesebben esik sz. Elljrban csak annyit, a widgetek sajt tulajdonsgain (property) tl, lteznek olyanok is melyek szl o widgetekkel val kapcsolatra jellemz oek, mint pldul a gyerek widgetek elhelyezkedse a kontnerben (pozci, trkz, kiterjeds, . . . ). Interfszek A GTK+, er ostve az objektum-orientlt megkzeltst, olyan absztrakcis rtegeket denil, amiket az adott funkcit (szveg bevitel, aktivlhatsg, igazts) betlt o widgetek implementlnak. Az ilyen tpus ltalnostsok komoly haszonnal brnak, mikor az adott funkcit egysges felleten keresztl, a konkrt implementci rszleteivel nem tr odve, szeretnnk kezelni. Fggetlenl attl, hogy pldul egy, vagy tbbsoros beviteli mez or ol legyen sz, a karaktereket pp gy szeretnnk kiolvasni mindkt esetben. ppgy igaz ez az elrendezs (orientation) tekintetben, hisz amennyiben a megfelel o widgetek jellemz oen a kontnerek megvalstjk ezt, az elrendezsre vonatkoz interfszt, a vzszintes, illetve fgg oleges orientci futs kzben is knnyedn vlthat (ip). Van egy olyan interfsz, amit minden egyes fellettel rendelkez o widget (GtkWidget) s szmos fellettel nem rendelkez o objektum (GObject) is implementl (GtkBuildable). Ezen osztlyon keresztl valsulnak meg a legalapvet obb funkcik, mint amilyenaz objektumok nevnek, tulajdonsgok rtknek lekrdezse, belltsa, a gyerek widgetek ltrehozsa9 .

2.2.

A tesztels fogalmai

A tesztelsi feladatok elltsa kapcsn a GTK ismerete bizonyos esetekben nem rt, mg ms esetekben nem sokat hasznl. Ez azon egyszer u oknl fogva van gy, mivel a tesztels sorn a megkzelts mer oben eltr o, lvn a tesztelshez hasznlt rendszer nem kzvetlenl a GTK+-ra , hanem az ATK -ra pt.

2.2.1.

Az ATK koncepcija

A mr emltett ATK koncepcijban nmikppen klnbzik a GTK+-t ol. Lvn ezt az interfszt a fogyatkossggal el o emberek szksgleteinek kielgtsre terveztk, els osorban nem magukra a widgetekre, vagy azok kapcsolataira, felleti
9 mra

a Glade elnevezs u felhasznli felletek tervezsre szolgl alkalmazs is ezt az interfszt hasznlja

10

megjelensre, hanem az ltaluk hordozott informcikra koncentrl. Ezen informcik rejt ozhetnek termszetesen a widgetek ltal megjelentett szvegekben, vagy szmszer u rtkekben ppgy, mint a widgetek aktulis llapotban (aktv, szerkeszthet o, lthat, . . . ), ugyanakkor persze az egyms kzi viszonyok (tartalmazs, vezrls, . . . ) is meghatrozak lehetnek. Ezen interfszek, llapotok, illetve viszonyok fggetlenek a konkrt implementcitl. Brmely widgetkszlet szmra implementlhatak, s ot implementlandak, ami annyit tesz, hogy az egyes widgetkszletek logikja mg ha nagyjbl egyezik is az ATK logikjval, szmos ponton kisebb-nagyobb eltrsek tapasztalhatak, amiket szksges valamilyen, a widgetkszlet s az ATK kztt elhelyezked o, azokat sszekt o (bridge) implementcival thidalni. Interfszek A kifejezetten a funkcionalitson alapul megkzelts egyenes kvetkezmnyei az ATK interfszei. Ezek gyakorlatilag a grakus felhasznli fellet elemeit legf obb funkciik szerint csoportost eszkzk. Egy adott GTK widget termszetesen megvalsthat tbb interfsz is, lvn tbbfle funkcit is betlthet. Egy egyszer u pldval megvilgtva a helyzetet egy kznsges gomb (GtkButton) egyszerre valstja meg a szveg (AtkText), illetve a kpek (AtkImage) lekrdezsre szolgl interfszeket, hiszen a gombon kp s felirat egyarnt elhelyezhet o. llapotok Bizonyos esetekben nem a widget ltal tartalmazott adat legyen az szm, vagy szveg, esetleg kp hordozza az informcit, hanem widget valamilyen szempont szerinti llapota. ltalnossgban vve ilyen llapot lehet egy widget lthatsga, egy ablak tmretezhet osge, egy beviteli mez o szerkeszthet osge, vagy akr egy rdigomb aktv mivolta. Az llapotok mindegyike binris, azaz igaz vagy hamis rtkkel rhat le. Ennek megfelel oen az ATK ltal denilt llapotok egy bithalmazt alkotnak, melyek lerjk egy adott widget konkrt id opillanatban vett llapott. Viszonyok Tesztelsi szempontokbl ltezik mg egy jelent osggel br tulajdonsgtpus, mely azonban nem konkrt widgetek paramtereit, hanem azok egymshoz kt od o viszonyt rjk le. gyis, mint egy felirat (label) s a hozz kt od o widget sszetartozst, a vezrl o s vezrelt widget kztt fennll viszonyt, vagy ppen a fk megjelentsre hasznlt widget esetn a az elemek szl o-gyerek kapcsolatait. Az egyes viszonyok (relation) hasonlan az imnt emltett llapotokhoz szintn kt rtkeket vehetnek fel, br ellenttben azokkal az llapotokkal az egyes viszonyok csak egy msik widgettel egytt van rtelmk. Az ellenttes el ojel u viszonyok, mint a vezrl o s vezrelt widget egyidej uleg is igazak lehetnek, ms-ms widgetekkel sszefggsben.

2.2.2.

A Dogtail mukdse

A Dogtail a szoftverek akadlymentestsnek megvalstsra hasznlta technolgiai mdszereket (assistive technologies) alkalmazza a tesztelend o alkalmazsok vezrlsre.

2.2. bra. Akadlymentestett szoftverek elrse[1]

11

A m ukds modell (2.2 bra) vgeredmnyben nem tl bonyolult. Az applikci kzvetlenl nem szlthat meg. Ahogy ezt hang alap vezrlst megvalst, illetve kperny oolvas szoftverek is teszik, az AT SPI -n (Assistive Technologies Service Provider Interface) keresztl szltjk meg a megfelel o szoftvert. Amennyiben ez egy GTK+ felhasznlsval fejlesztett alkalmazs, akkor a krsre a Gail (1.4.1) nev u alrendszert futtatva vlaszol, az ATK interfszben lertaknak megfelel oen. Ez a mechanizmus adja az alapjt az automata tesztelsnek is. Maga a teszt is az AT-SPI interfszt hasznlja arra, hogy a tesztelend o applikcival kommunikljon, ezen keresztl krdezi le a korbban emltett llapotokat, viszonyokat, illetve szltja meg az egyes widgetek ltal implementlt interfszeket. Az gy vezrels al vont szoftver egyes elemeinek llapott, illetve tulajdonsgait kvetve vonhatak le kvetkeztetsek arra nzvst, hogy az adott szoftver a kvnalmaknak megfelel oen m ukdik-e.

12

3. fejezet

A fejleszts menete
3.1. Gimp Tool Kit
3.1.1. Beszerzse
A GTK+ beszerzsre alapvet oen kt mdszer knlkozik. Az egyik megolds, hogy hagyatkozunk az ltalunk hasznlt opercis rendszerre s az ltala biztostott, vagy legalbbis arra elrhet o vltozatot teleptjk. A msik lehet osg, hogy letltjk a GTK+ s a fgg osgek forrskdjt s nmi nehzsget vllalva ezeket fordtjuk le. El obbi eset b osgesen megfelel amennyiben mg csak most ismerkednk a GTK+ fggvnyknyvtrral, illetve nem akarunk tlsgosan belebonyoldni az grakus alkalmazsok fejlesztsbe. Elkerlhetetlenl az utbbit kell azonban vlasztanunk, ha az tlagnl jobban el szeretnnk merlni a GTK+ rejtelmeiben, ha esetleg hibkat javtannk, vagy vltozsokat eszkzlnnk magn a grakus eszkzkszleten. Binris vltozat A GTK vltozatok beszerzse nem jelent klnsebb feladatot, amennyiben valamelyik npszer u Linux disztribcit hasznljuk, hiszen azok nagy valszn usggel mr amgy is teleptve vannak az ltalunk hasznlt rendszeren, lvn vlhet oleg mr hasznlunk ezen eszkzk segtsgvel fejlesztett szoftvereket. A fejlesztshez, illetve tesztelshez a binris vltozatokon tl fejleszt oi csomagokra is szksges lesz, amit rpm, illetve deb alap disztribcik esetn rendre az albbi parancsok kiadsval tehetnk meg:
sudo yum install gtk-devel-package sudo apt-get install gtk-dev-package

GTK+. A GTK+ fejlcfjlokat s egyb llomnyokat melyekr ol a ks obbiekben (3.2.1) mg rszletesebben is esik sz a Debian/Ubuntu, illetve Fedora rendszereken a libgtk-3-dev, illetve a gtk3-devel csomagok tartalmazzk. gtkmm. A fenti csomagok termszetesen csak a C nyelv u vltozat azaz a GTK+ hasznlathoz elegend oek, amennyiben a C++ nyelvet ezzel egytt a gtkmm fggvnyknyvtrat kvnjuk hasznlni, tovbbi csomagokra (libgtkmm-3.0-dev, vagy gtkmm3-devel) is szert kell tennnk. PyGObject. Amennyiben a GTK alap fejlesztssel a Python nyelv rvn ismerkednnk a mr emltett fordtott nyelvek helyett, akkor a fenti csomagokat nem, a python-gi, vagy a python-gobject csomagokat viszont be kell szereznnk. Dogtail. Az automata tesztek ksztshez szksges Python fggvnyknyvtr a Dogtail llomnyait az azonos nev u csomag tartalmazza, melyek installlsa a fentiekhez hasonlan trtnik. Forrskd A GTK forrsnak beszerzsre szintn tbb mdszer knlkozik. Egyrszr ol az ltalunk hasznlt Linux disztribci biztost eszkzket forrscsomagok teleptsre. A korbbi deb, illetve rpm alap rendszerek pldjnl maradva ez rendre az albbiak szerint trtnik.
apt-get source gtk-src-package yumloader --source gtk-src-package

Lehet osg van termszetesen az egyes verzik letltsre a GNOME projekt weboldalrl is, 13

wget http://ftp.gnome.org/pub/gnome/sources/gtk+/major.minor/gtk+-major.minor.micro.tar.gz wget http://ftp.gnome.org/pub/gnome/sources/gtk+/major.minor/gtk+-major.minor.micro.tar.bz2

valamint hasznlhatak e clra egyes projektek verzikel oi is, ha szeretnnk mindig az aktulis forrskddal dolgozni.
git clone git://git.gnome.org/gtk+

Ha azonban magunk szeretnnk a teljes GTK -t fordtani legyen sz a C, vagy a C++ nyelv u vltozatrl szmolnunk kell azzal, hogy szmos egyb komponens (GLib, Pango, Cairo, ATK, . . . ) fordtsra, illetve az frisstseket kvet o jrafordtsra vlik szksgess, ami meglehet osen id oignyes s fradsgos feladat, amit a Linux disztribcin sszellti mr megtettek helyettnk. gy clszer u kezdetben ezt kihasznlni s a sajt fordtsba csak akkor belekezdeni, ha arra felttlenl szksgnk.

3.1.2.

Fordtsa

Amennyiben a korbban emltett nehzsgek ellenre mgis nekivgunk a GTK sajt fordtsnak, akkor sem vagyunk magunkra hagyva. A GNOME projekt rsze egy JHBuild elnevezs u szoftver1 , amit a GNOME projekt moduljaibl sszelltott halmazok mint amilyen a GTK s annak fgg osgei letltsre, frisstsre, fordtsra s fordts eredmnyeknt ltrejtt futtatsi krnyezetben val munkra hasznlhatunk. Mindenekel ott azonban szksgnk lesz nhny olyan eszkzre, amik a Linux alap rendszereken fordtsi feladatok elltsra kvzi szabvnynak szmtanak. A GNOME sok ms fejlesztsi projekthez hasonlan az Autotoolst2 hasznlja moduljainak fordtshoz. Ennek rszleteibe nem clunk ezen dokumentum keretben elmerlni, mr csak azrt sem, mert a JHBuild ezen, fordtshoz szksges, fgg osgek teleptst megoldja helyettnk.
jhbuild sanitycheck jhbuild bootstrap

Az parancs futtatsnak hatsra ellen orzsre kerl a kongurciban megadott knyvtrak rhatsga, a szksges fordtsi eszkzk teleptett mivolta. Ezt kvet oen kerlhet sor a forrskdok letltsre, a fordts el otti kongurlsra, magra fordtsra, valamint az elkszlt binris llomnyok teleptsre. Ehhez a kvetkez o parancsokat hasznlhatjuk.
jhbuild update jhbuild make

A fordts vgeztvel lehet osgnk van az jlag ltrejtt krnyezetbe gymond belpni, vagy kzvetlenl parancsokat futtatni. Ez gyakorlatilag ennyit tesz, hogy szmos krnyezeti vltoz belltsnak eredmnyeknt sajt a fordtand alkalmazsaink s a fordts eredmnyeknt ltrejtt futtatand llomnyok is a az j krnyezetben ltrehozott fggvnyknyvtrakat fogjk hasznlni a rendszeren tallhat vltozatuk helyett.
jhbuild run jhbuild shell

Ennek akkor van leginkbb haszna, ha szeretnnk az ltalunk fejlesztett alkalmazst a rendszeren elrhet o GTK vltozaton kvl a legfrissebb verzin is kiprblni, GTK valamely moduljn szeretnnk vltoztatni s ennek hatst ltni alkalmazsunkra, vagy ppen csak nyomon kvetnnk a GTK vltozsaik, aktulis fejlesztseit mg miel ott azok az ltalunk hasznlt disztribciban is megjelenik.

3.2.

Sajt alkalmazsok

Mivel a tovbbiakban rszletesen foglalkozunk majd a GTK alap alkalmazsok ltrehozsval, itt most csak a legfontosabb parancsokat vesszk szmba, melyek rvn a C, illetve C++ nyelv u forrsfjlokbl futtathat binris llomnyokat hozhatunk ltre.

3.2.1.

Fordts s linkels

Akr a rendszeren tallhat, akr JHBuild, vagy ms eszkz rvn ltrehozott krnyezetben lv o GTK vltozatot is hasznlunk, az albbi parancssorok segtsgvel fordthatak le forrsfjljaink.
gcc gtk_sourcefile.c -o gtk_binary pkg-config --cflags --libs gtk+-3.0 g++ gtkmm_sourcefile.cc -o gtkmm_binary pkg-config --cflags --libs gtkmm-3.0
1 teleptse 2a

a korbbiaknak lertaknak megfelel on trtnik GNU fordtsi rendszere, mely tulajdonkppen az Automake, Autoconf, Libtool egyttese.

14

Ahhoz, hogy a GTK+, illetve gtkmm fordtsi fgg osgeit ne magunknak kelljen megadnunk a pkg-config parancsot hvhatjuk segtsgl, hogy a GCC rszre a megfelel o paramtereket meg tudjuk adni. A -cflags paramter hatsra a fordtshoz, mg a -libs eredmnyekpp a linkelshez szksges opcikat kapjuk vissza. A parancs kt ` (backtick) kz zrt. aminek hatsra a program kimenete rsze lesz a fordt parancssornak, amivel pont az kvnt hatst rjk el.

3.2.2.

Futtats

Ezek utn mr csak az rmteli pillanat van htra, mikor a kt klnbz o nyelven s fggvnyknyvtrral lekdolt teljesen azonos funkcij programunkat lefuttatjuk a ./gtk_binary, illetve a ./gtkmm_binary paranccsal. Amennyiben a Python nyelv u vltozat mellett tesszk le voksunkat a fordts, mint lps kimarad, a futtats trtnhet kzvetlenl (./gtk_script.py), amennyiben van az adott fjlon futtatsi jog, vagy a Python interpreternek paramterknt (python gtk_sctipt.py). A tovbbiakban ezt az utbbi smt kvetjk. Ezzel tl is vagyunk azon a rvid ttekintsen ami utn mr pp ideje nekiltnunk els o ablakunk implementlsnak, futtatsnak s tesztelsnek.

15

4. fejezet

Els o ablakunk
4.1. Kdolsi alapismeretek

A nagyobb nylt forrs projektek a kdols, kdszervezs sorn egy meghatrozott konvencit kvetnek, br egy olyan mret u projekt esetn, mint a GNOME az egyes rszterleteken lehetnek eltrsek, azzal egytt is, hogy az azonossgok nyilvn er os tbbsgben vannak. Lssuk mik ezek a GNOME, illetve a GTK projektek esetn.

4.1.1.

Forrskd formzsa

A GTK fejleszt oi a GNU coding standard[2], illetve a Linux kernel coding style[3] irnyelveit alkalmazzk, ami mindaddig csak az olvasst, megrtst el osegt o mdszertani eszkz, amg nem ll szndkunkban a GTK fejlesztsbe, javtsba belefogni, ugyanakkor kt oknl fogva mgis rdemes megemlteni. Ha mg nem ismerkedtnk meg egyetlen kdolsi konvencival sem, akkor az emltett kett o mind npszer usgk, mind letisztult mivoltuk okn alkalmas vlaszts lehet. A msik ok, hogy nhny a fejleszts sorn hasznos informci ezen konvencikbl kvetkezik.

4.1.2.

Elnevezsi konvencik

A GNOME projekten bell nem csak formzsi, de elnevezsi konvencik is hasznlatosak. Ezek az egyes funkcit megvalst szoftverelemekre (pl: fggvnyek, makrk, . . . ) vonatkoznak, amik kzl a az albbiak mr a legegyszer ubb pldk esetn is felt unnek. az egyes nevek rszekre oszthatak, a rszek meghatrozott sorrendben kvetik egymst, ahol kezdve a GNOME megfelel o projektjvel (pl: atk, gtk, . . . ), folytatva a vonatkoz osztly nevvel (pl: entry, label, . . . ), befejezve a megvalstott m uvelettel (pl: get, set, . . . ), illetve a m uvelet trgyval (pl: text, value, . . . ), a rszeket alhzsjel (_) vlasztja el, az egyes rszek rendszerint vagy csak kis-, vagy csak nagybet uket, illetve szmokat tartalmaznak. Fentieknek megfelel oen egy a GTK+ ltal implementlt rdigomb aktv mivoltt lekrdez o fggvny neve a gtk el otaggal kezd odik, amit a osztlynv, vagyis a radio_button, majd lekrdezsr ol lvn sz get akcinv kvet, vgl pedig a tulajdonsg neve (actvie) zr. Alhzs jelekkel sszef uzve gtk_radio_button_get_active. A C++, illetve a Python nyelv u vltozatok esetn is hasonl az elnevezs mdszertana a nyelvb ol fakad sajtossgok okozta eltrssel termszetesen. A gtkmm esetn a projektek nevt tartalmaz prexum szerept a Gtk nvtr veszi t, mg az osztlyok neve a C++ osztlyok neve lesz. A tagfggvnyek az el obbi kt el otag (pl: gtk_entry) nlkli nevek lesznek (pl: set_text). A PyGobject esetn a nvtr szerept a Gtk modulnv veszi t, a Python osztlyok nevei ugyanazt a szerepet tltik be, mint a C++ esetn.

16

4.1.3.

Fejlcfjlok s importls

Szaktva az el oz o f overzinl (2.x) megszokottaktl az j f overzi (3.x) esetn, a C, illetve a C++ vltozat egyarnt csak egyetlen llomny beszerkesztsre (include) van lehet osg s szksg. A korbbiakban az egyes widgetekhez tartoz fejlcllomnyok (pl: gtk/gtkentry.h) beszerkesztsre kln-kln volt lehet osg fgg oen attl, melyekre van, illetve melyekre nincs szksgnk. Most azonban kzvetlenl csak a gtk/gtk.h szerkeszthet o be, a tbbi fejlcllomny esetn hibazenetet kapunk. gy mind a C, mind a C++ vltozat azonos mdon m ukdik, ami egybirnt hasonlt a Python modul importjra.

4.2.

Minimlisan alkalmazs

Ennyi bevezet o utn lssuk egyms mellett (4.1. Kdrszlet) a hrom nyelvi vltozat (C, C++, illetve Python) kdjt szmba vve azok hasonlsgait s klnbz osgeit. Ami taln els o ltsra is felt un o, hogy messze a GTK+ vltozat kds ur usge a legnagyobb, vagyis a C nyelv u vltozat ignyli ugyanazon funkcionalits mellett a legtbb kdsor (18 sor) begpelst, s egyben a legtbb munkt is. Ez persze nem jelenthet klnsebb meglepetst ha van nmi tapasztalatunk az interpretlt, illetve a fordtott, a procedurlis, illetve az objektum kzpont nyelvek esetn elrhet o fejlesztsi sebessg tern.

4.2.1.

Forrskd

Els o kzeltsben a mr emltett formai klnbsgek lehetnek szembetl oek, ugyanakkor szmos, a tartalmat, megvalstst rint o eltrs is felfedezhet o ebben a mg oly kevst kdsort tartalmaz pldban. Ezek megrtse nagyban knnyti az egyes nyelvi vltozatok kztti tjrst s ne utols sorban a GTK koncepcionlis sajtossgaira is rvilgt. Lssuk teht sorrl sorra az imnt olvasott kdok magyarzatt.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

# include <gtk / gtk .h> int main ( int argc , char * argv []) { GtkWidget * window ; gtk_init (& argc ,& argv ); window = gtk_window_new ( GTK_WINDOW_TOPLEVEL ); g_signal_connect ( G_OBJECT ( window ), " delete event ", G_CALLBACK ( gtk_main_quit ), NULL ); gtk_widget_show ( window ); gtk_main(); return 0; }

# include <gtkmm .h> int main ( int argc , char * argv []) { Gtk :: Main kit (argc , argv ); Gtk :: Windowwindow ; window . show (); Gtk :: Main :: run (); return 0; }

from gi. repositoryimportGtk if __name__ == " __main__ ":

window = Gtk . Window () window . connect (" delete event ", Gtk . main_quit ) window . show () Gtk . main ()

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

Kdrszlet 4.1. Minimlisan szksges kd GTK+, gtkmm, illetve PyGobject hasznlata mellett 1. sor A header fjlok beszerkesztsnek klnbz osgeir ol az el oz oekben esett sz, gy erre itt csak azt megemltend o trnk ki, hogy a Python vltozat import parancsnak azt a vltozatt alkalmazzuk, ami a leger osebb hasonlsgot eredmnyezi a msik kt nyelvi vltozattal, mr ami a gtk kulcssz forrskdban trtn o megjelenseinek helyt illeti. 4. sor Ez a sor a programjaink belpsi pontja, azaz itt kezd odik meg a futtats, mr legalbbis ami a C/C++ vltozatot illeti. A Python nyelv esetn az import parancs mr vgrehajtsra kerlt mire ide jutunk, s ot erre a kdsorra voltakppen nincs is felttlenl szksges[4, fej. 27.4.], leginkbb csak a msik kt pldhoz val mg er osebb hasonlsg vgett kerlt be ez a kdsor. Fontoss a main fggvnyek tulajdonkppen csak a parancssori paramterek GTK -nak trtn o tads8 szempontjbl vlnak. 6. sor A C nyelvi verziban knytelenek vagyunk blokk elejn deklarlni azt a vltozt ami ez esetben widgetnk cmt tartalmazza majd mivel az ISO C90 szabvny mg nem, majd csak az ISO C99 tmogatja a blokkon bell kifejezs utn elhelyezett vltoz deklarcikat. Ezt viszont sem 3.0-nl korbbi GCC, sem pedig a Microsoft Visual Studio C fordtja nem tmogatja, vagyis problmba tkznnk a C++ pldban hasznlt mdszerrel, gy a biztonsg kedvrt maradunk a hagyomnyoknl, azaz loklis vltozk deklarcija csak blokkok kezdetn szerepel. 8. sor Eljutottunk vgre az els o GTK specikus hvshoz, mely a Python vltozatbl teljesen hinyzik, mg a C, illetve a C++ verziban funkcijuk azonos, mgis van kztk egy rnyalatnyi klnbsg. A GTK+ esetn az argc, valamint az argv vltozk cmeit adjuk t, biztostand, hogy az init fggvny a GTK sajt paramtereit 1 el tudja tvoltani a tmbb ol s azok szmval cskkenteni tudja argc rtkt. Erre a C++-os vltozat esetn erre azrt nincs szksg,
1a

GTK ltal rtelmezett parancssori paramtereket sszefoglalja itt olvasshat.

17

mert mg ha nem is ltszik, mindkt vltozra referencia addik t a Gtk::Main konstruktornak. A Python vltozat esetn nincs init jelleg u fggvnyhvs, mivel az inicializls a modul (gi.repository.Gtk) importlsval implicit mdon megtrtnik, msrszr ol a parancssori paramterek a sys modulon keresztl brhol hozzfrhet oek, azok paramterknt val tadsa gy felesleges. 10. sor Els o widgetnk ltrehozsa a mr emltett nevezktan szerinti fggvnyek meghvsval trtnik. Minden widgettpushoz ltezik egy, mondjuk gy konstruktor, melyet meghvva egy j az adott tpushoz tartoz widgetet kapunk vissza. A hvs mikntje termszetesen fgg a nyelvt ol magtl, illetve attl is, hogy a nyelv esetn hasznlhat-e, illetve hasznljuk-e az objektumok-orientlt megkzeltst. A C nyelvi vltozat esetn a gtk_widgettpusnv_new forma hasznlatos, addig a C++ esetben a prexek szerept a nvterek veszik t, teht ltalnos formban a Gtk::WidgetTpusNv::WidgetTpusNv rhat le a konstruktor. A Python szintn nvterekkel operl, ahol azok hatrait a modulok jelentik, melyek neveit egymstl, illetve fggvnyeikt ol pont (.) vlasztja el, vagyis a konstruktor Gtk.WidgetTpusNv formban rhat le. A klnbsg nem is annyira a nevekben, mint inkbb a memria kezelsben rejlik, hiszen egy jlag ltrehozott objektum felszabadtsrl C esetn magunknak kell gondoskodnunk, mg a C++ a t ole megszokott mdon felszabadtja a loklis vltozkat. Ugyanakkor rdemes itt visszautalni a korbbiakban mr emltett referencia szmllsra, illetve a lebeg o referencira, melyek rvn a klnbz o nyelvi vltozat esetn md van arra, hogy csak a legfels o szint u elemr ol kelljen ebben a tekintetben magunknak gondoskodnunk, a GTK a tbbi elem memriakezelst maga menedzseli. Az ablak ltrehozsban meg egy klnbsg fedezhet o fel a C, illetve a msik kt vltozat kztt.Ez pedig a paramterkezels mikntje. El obbi esetben meg kell mondanunk az ablak tpust (toplevel) hiszen a C nyelv nem tesz lehet ov a paramterek esetn alaprtelmezett rtkt , mg a msik kt esetben erre nincs szksg. Ez a paramter ugyan mindkt esetben ltezik alaprtelmezett rtkk, pont az, amit a C vltozat esetn hasznlunk. 11. sor Anlkl, hogy a szignlok kezelsnek rejtelmeiben elmerlnnk egy gondolatnyi kitr ot rdemes ezen kdsor a kapcsn tenni. Els oknt azt rdemes tisztzni mire szolgl a delete-event szignl. Ez a szignl akkor vltdik ki, amikor az ablakunk felhasznl interakci hatsra zrdik be. Ez tbbfle interakcit is jelenthet opercis rendszert ol s ablakkezel ot ol fgg oen , de alapvet oen az ablak jobb fels o sarkban2 lv o X gomb, vagy az Alt+F4 billenty uk lenyomsra kell gondolnunk. A C, illetve a Python nyelv u vltozat ezen esemny bekvetkeztekor a GTK f ociklust szeretn lelltani, ami annak rvn r el, hogy a delete-event szignlra a nyelvi vltozatnak megfelel o main_quit fggvnyt kti fel. Figyelembe vve, hogy a delete-event alaprtelmezett szignlkezel oje megsznteti (destroy) az ablakot, ez az eljrs logikus, lvn egy programnak f oablak nlkl nincs igazn sok rtelme. A C++ vltozat viszont ugyanebben a tekintetben ltszlag semmilyen lpst sem tesz, ugyanakkor meggyelhetjk, hogy nhny sorral lejjebb (15. sor) a run fggvnyek paramterknt tadja azt ablakot, ami nagyon hasonl eredmnyre vezet. Egszen pontosan nem csak az tadott ablak megsz unsekor, de az eltntetsekor (hide) is ki fog lpni a f ociklus. 13. sor Ezek utn nem rhet meglepetsknt bennnket, hogy mirt nincs szksg a C++ vltozat esetn az megjelent o fggvny meghvsra, ezt az tadott ablakra a f ociklust elindt run fggvny megteszi, ami logikus is hiszen ha nincs egyetlen lthat ablakunk sem, akkor nehz olyan felhasznl interakci kezdemnyezni legalbbis a felhasznli felleten keresztl , ami a f ociklus kilpst eredmnyezn. 15. sor A hvsok a korbban mr rszletezett GTK main loopot indtjk, azaz itt kezd odik meg az az esemnyvezrelt szakasz, mely a vlasztott nyelvt ol fgg oen a gtk_main_quit, a Gtk::Main::quit, vagy a Gtk.main_quit meghvsig tart. Ezekben a minimlis pldkban erre az egyetlen md a futtatskor megjelen o ablak bezrsa, hiszen az imnt emltett fggvnyeket az ennek hatsra kivltd delete-event szignlhoz rendeltk. Miutn a szignlt kezel o fggvny lefutott a GTK f ociklusa (main loop) kilp, azaz a run fggvny futsa befejez odik, a program futtatsa az azt kvet o soron folytatdhat. 17. sor Visszatrsi rtknk mindhrom esetben 0, amit a rendelkezsre ll nyelvi mdszerek legegyszer ubbikvel rnk el, ezzel jelezvn a hv flnek, hogy a futs rendben lezajlott.

4.2.2.

Fordts s futtats

A korbbiakban mr emltett metodika mellet a mostani forrskdok3 fordtsa a kvetlez okpp nz ki:
gcc gtk_minimal.c -o gtk_minimal pkg-config --cflags --libs gtk+-3.0 g++ gtkmm_minimal.cc -o gtkmm_minimal pkg-config --cflags --libs gtkmm-3.0

A futtats tekintetben prblkozzunk a ./gtk_minimal, illetve a ./gtkmm_minimal, illetve a python3 gtk_minimal.py parancsokkal abban a knyvtrban, ahol a forrsllomnyaink is tallhatak.
2 Mac 3 termszetesen

OS X, illetve az jabb Ubuntu verzik esetn bal fels o sarok csak a C, illetve a C++ vltozat fordtand a Python nem

18

4.2.3.

Eredmny

Nagy meglepetst nem vrhatunk egy ilyen mret u applikcitl, viszont az azrt kell tudnunk rtkelni, hogy a legrosszabb esetben is alig msfl tucat kdsorbl egy m ukd o grakus felhasznl felletet lehet ltrehozni, melynek eredmnye az albbi kpeken lthat.

4.1. bra. Minimlis mintapldk kperny okpi C, C++, Python vltozat Tulajdonkppen csak egy puszta ablakot kapunk, brmilyen gomb, vagy egyb elem nlkl. Minden dszts az ablak fejlce, a cmsor szvege, a minimalizl, maximalizl s a bezr gombok egyarnt az ablakkezel onek s nem a GTK -nak ksznhet oek. Ez utbbi gombhoz kt odik az egyetlen GTK szempontjbl is rdemleges4 m uvelet, ami a mr tbb zben is emltett delete-event szignlt fogja kivltani, ami a vgs o soron a program futsnak befejezshez vezet.

4.3.

Tesztels

Els ore taln azt gondolhatjuk, hogy a fenti ablakon igazn nincs mit tesztelni, egy feladat mgis akad, mgpedig az, hogy a fut applikcit, illetve annak egyetlen ablakt megtalljuk, majd bezrjuk, ami mint ltni fogjuk azrt ez is jelent nmi feladatot.

4.3.1.

Forrskd

Az ablakok tesztelsre szolgl programok forrskdjai (6.16. Kdrszlet) mindssze kt sorban trnek el egymstl, ami a gyakorlatban nem jelent rdemi klnbsget, ugyanakkor rmutat arra, hogy a Dogtail hasznlatval kt API is rendelkezsnkre ll az applikcik tesztelshez. Ezek a tree, illetve a procedural API. El obbi egy objektumorientlt megkzeltst alkalmazva teszi lehet ov, hogy a felhasznl fellet egyes elemeit gombok, ablakok, menk elrjk, azokon m uveleteket vgezznk, illetve a kztk fennll sszefggseket feltrjuk. Utbbi az ablakokra, illetve azok elemeire melyeket nevkkel hivatkozhatunk ad fkuszt, illetve vgez egyb m uveleteket, aminek rvn egyszer uen vezrelhetjk a tesztelend o alkalmazst.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

fromdogtailimportprocedural importunittest classGtkDemoTest ( unittest . TestCase ): defsetUp ( self ): fromdogtailimportutils self . pid = utils . run (gtk3 demo ) self . app = procedural . focus . application (gtk3 demo ) deftearDown ( self ): import os , signal , time os. kill ( self .pid , signal . SIGTERM ) time . sleep (0.5) deftestGtkDemo ( self ): pass fromdogtailimporttree importunittest classGtkDemoTest ( unittest . TestCase ): defsetUp ( self ): fromdogtailimportutils self . pid = utils . run (gtk3 demo ) self . app = tree . root . application (gtk3 demo ) deftearDown ( self ): import os , signal , time os. kill ( self .pid , signal . SIGTERM ) time . sleep (0.5) deftestGtkDemo ( self ): pass if __name__ == __main__ : unittest . main ()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

if __name__ == __main__ : unittest . main ()

Kdrszlet 4.2. Minimlisan szksges teszt tree, illetve procedural API hasznlata mellett
4a

minimalizlsa s a maximalizls az ablakkezel o hatskrbe tartoznak

19

A kvetkez o kd a fejlesztsi pldtl nmikppen eltr oen nem szortkozik a minimlisan szksges kdsorok ismertetsre, ennl egy kicsit tovbb megy. Ennek oka kett os. Egyrszr ol minimlisan alig nhny sorra van szksg, msrszr ol igyeksznk egy, a vals letben is hasznlhat kddal szolglni, aminek rsze egy tesztelsi kertrendszer (framework), ebben az esetben a Python unittest modulja. Nem mellesleg a Dogtail sajt tesztjei is ezt a modult alkalmazzk, a kvetkez okben ismertetettekhez nagyon hasonl, esetenknt teljesen azonos mdon. Ahogy a korbbiakban, gy itt sem ismertetjk a nyelvi eszkzkb ol add sajtossgokat, hacsak annak nincs kifejezett hatsa a tesztelsre, gy a unittest modul is csak olyan mrtkben kerl ismertetsre, amennyire az a megrts szempontjbl szksges. Tesztelend o alkalmazsnak a GTK dem programjt vlasztottuk, ami csaknem minden widgetre ad pldt s rsze azon fejleszt oi korbban mr emltett csomagnak, mely a C nyelv u fordtshoz szksges. 1. sor A kt klnbz osget ad sor egyike, ahol az Dogtail el obbiekben emltett procedural, illetve tree moduljait importljuk. Az egyes pldkban az importlt modulnak megfelel o mdszereket, illetve eszkzket alkalmazzuk. 1. sor A tesztelsre szolgl osztlyunk a Python beptett unittest nev u moduljnak TestCase osztlybl szrmazik, vagyis ezen modult hasznljuk a tesztek implementlsra. Maga a modul termszetesen nem felttlenl szksges a Dogtail alap tesztelshez, ugyanakkor szmos olyan eszkzt nyjt melynek a ks obbiekben mg hasznt ltjuk. 2. sor A unittest modul TestCase osztlybl szrmaz osztlyok setUp, illetve tearDown (11. sor) nev u fggvnyei a tesztfuttatsa sorn automatikusan meghvdnak minden egyes teszteset el ott, illetve utn, lehet osget adva a sszes tesztesetre nzve kzs el okszt o, illetve utmunkk elvgzsre. Ebben az esetben az el okszts nem ll msbl, mint hogy a utils modul megfelel o fggvnynek segtsgvel elindtjuk a GTK+ dem alkalmazst, amit az egyes tesztelsi feladatok bemutatsra hasznlunk majd fel. 4. sor Itt trtnik a GTK+ dem alkalmazsnak tnyleges futtatsa, ahol a visszatrsi rtkknt kapott folyamatazonostt (PID) eltesszk ks obbi hasznlatra (13. sor). 11. sor Ahogy arrl sz esett a setUp fggvnyhez hasonlan egy specilis fggvny, amit Python unittest modulja automatikusan hv meg, minden egyes teszteset lefutst kvet oen. 13. sor A korbban elmentett (4. sor) folyamatazonostt felhasznlva kldnk kilpsre (termination) felszlt szignlt a GTK+ dem programjnak, mivel annak f oablaka nem tartalmaz olyan elemet (pl: menpont, gomb, . . . ), melynek segtsgvel a kilpst el lehetne rni. 14. sor Levezetsknt 5 msodperc vrakozs kvetkezik minden tesztesetet kvet oen elkerlend o az AT-SPI tlterhelst. 16. sor Ez a fggvny voltakppen csak demonstrcis jelleggel kapott helyet ebben a pldaprogramban, bemutatand, hogy a nevkben test el otaggal rendelkez o fggvnyeket a Python unittest modulja tesztnek tekinti s ennek ket. megfelel oen futtatja o 20. sor A unittest modul main fggvnye pldnyostja a TestCase osztly leszrmazottjait azaz a teszteset implementcikat tartalmaz objektumokat hoz ltre , majd futtatja az azokban lv o az el obbiekben emltett nevezktan szerinti tesztfggvnyeket. Bizonyos krlmnyek megfelel oen pldul, hogy a fggvnyek futsa sorn keletkezett-e kivtel hibsnak, vagy sikeresnek tekinti e teszteket. A unittest modul szmos funkci rvn knnyti meg a tesztel oi munkt, melynek rszleteir ol a modul dokumentcijban olvashatunk, illetve a tovbbi rszekben lesz sz.

4.3.2.

Futtats

Az imnt ismertetett tesztfuttatsa rendkvl egyszer u eredmnyre vezet, lvn mindsszesen egy tesztesetet (GtkDemoTest) s azon bell is csak egyetlen tesztet (testGtkDemo) tartalmaz, mely remnyeink szerint sikeresen fut majd le. A szkript futtatsa mg ebben az egyszer u esetben is tbbflekpp lehetsges, mr ami a megadhat paramtereket illeti. A paramterek nlkl a szkript az sszes tesztesetnek sszes tesztfggvnyt futtatja, ugyanakkor lehet osg van paramterknt egy teszteset, vagy akr egy azon belli tesztfggvny megadsra is. El obbi rvn a megadott teszteset sszes tesztfggvnye futtathat, mg az utbbi eset egy konkrt tesztfggvny futtatsra hasznlhat.
python dogtail_minimal_tree.py python dogtail_minimal_tree.py GtkDemoTest python dogtail_minimal_tree.py GtkDemoTest.testGtkDemo

A tesztesetek lefutsnak mikntjr ol maga a teszt szolgltat informcit futtatskor megjelentve az sszes futtatott teszteset szmt, a futtats idejt, a sikeresen, a sikertelenl, illetve a hibsan lefutott teszteket. Utbbi kt esetben a hiba okval, illetve a hozzjuk tartoz hvslistval (backtrace) egytt, ami alapjul szolglhat a hibakeressnek.

20

5. fejezet

Szignlkezels dihjban
Ebben a rszben a szignlok kezelsnek elmleti krdseir ol, illetve gyakorlatrl esik sz, amihez egy j pldaprogramot vesznk grcs o al, ami forrskdjt tekintve nmikpp ugyan bonyolultabb a korbbiakban trgyaltaktl, m ukdsre nzve azonban nem sokban klnbzik attl.

5.1.

Fogalmak

El oszr is a korbban mr megismert alapfogalmakat vesszk jra el o, most azonban ltalnos ismertetsk helyett a tmnkhoz konkrtan kapcsold specikumaikat vzoljuk fel. Main Loop. Ahogy arrl az el oz o rszekben mr sz esett ms felletprogramozsi nyelvekhez teljesen hasonlan a GTK is esemnyvezrelt (event-driven) mdon m ukdik. Ez annyit tesz, hogy felhasznli interakcik bekvetkeztig gyelmen kvl hagyva az temezett esemnyeket s nhny, a ks obbi rszekben rszletezend o funkcit , a GTK a sajt f ociklusban (main loop) vrakozik, lnyegben teht a szoftver futst maguk a bekvetkez o esemnyek vezrlik, hiszen ezek hjn a vrakozs sosem r vget. Felhasznli interakci lehet pldul az egr megmozdtsa, vagy egy kattints, esetleg egy billenty u lenyomsa, vagy ppen felengedse. Ahhoz, hog az alkalmazs az esemnyvezrelt szakasza megkezd odhessen be kell lpni a GTK f ociklusba. Erre, az el oz o rszben taglalt minimalista alkalmazsok forrskdjbl mr ismer os gtk_main(), gtkmm esetn a Gtk::Main::run(), illetve a Python vltozat esetn a Gtk.main() fggvny szolgl. Ha az imnt emltett esemnyek kzl brmelyik bekvetkezik, az addig alv f ociklus gymond felbred, azonostja az esemnyhez tartoz felleti elemet, majd a bekvetkezett esemnyt tovbbtja (propagate) az azonostott widget, vagy widgetek fel. A vezrls ezt kvet oen a f ociklusba tr vissza, ahol folytatdik a vrakozs a kvetkez o esemnyre. Signal. A szignl voltakppen egy nvvel azonostott, a bekvetkezett esemny tovbbtsra szolgl zenet, amit az osztly denil, hogy pldnyai rtesthessk az esemnyek bekvetkeztr ol az az irnt rdekl od oket. Ilyen zenetb ol szmos ltezik, hisz az egyes widgettpusokon klnbz o esemnyek lehetnek rtelmezettek. Gomb esetn a r trtn o kattints, egy legrdl o mennl az egr menelem fl trtn o mozgatsa, mg egy widgetnl pldul annak tmretezse. Minden ilyen esemny rendelkezik sajt nvvel, melynek rvn hivatkozni tudunk r (pl: button-pressed, enter-notify-event, size-request). A szignlok rkl odnek, azaz egy specikus widget, mint amilyen mondjuk se a Button, vagy akr annak az egy RadioButton, vagy egy CheckButton, minden olyan szignllal rendelkezik, amivel o se az a Widget tpus rendelkezett. o A szignlok egyrszr ol arra szolglnak, hogy a GTK rendszern bell az egyes widgetek egymssal kommuniklhassanak. Ha pldul egy gombot lenyomunk, akkor azt (illetve annak rszeit) jra kell rajzolni, ha egy menelemet kivlasztunk, azt t kell sznezni, illetve az esetleges almenpontokat ki kell rajzolni, mg tmretezsnl az egyes widgetek helyignyt jra ki kell szmolni. Msfel ol ha a program ri valamely esemny bekvetkezsr ol rteslni szeretnnek, megadhatnnk esemnykezel o fggvnyeket, melyek ezen esetekben meghvdnak. Callback. Ezen esemnykezel o fggvnyek elnevezse a GTK terminolgiban callback. Az egyes esemnyekhez tartoz kezel ofggvnyek prototpusai a szignl fajtjtl fggenek. A C nyelv u vltozat esetn els o paramterk jellemz oen az a Widget pontosabban szlva Object, hiszen a szignlkezels ezen a szinten kerlt implementlsra a Glib-ben melyen az esemny kivltdott. Ezt a paramtert kvetik a szignlhoz kapcsold egyb jellemz ok, az utols pedig a szignl bektsekor megadott, gynevezett user data, amir ol a pldaprogram kapcsn rszletesebben szlunk. Elljrban csak annyit, hogy ez egy meglehet osen knyelmetlen s gyakorta nehzkesen hasznlhat megolds, melyre a C++, illetve Python nyelv u vltozatok knlnak knyelmes alternatvt.

21

5.2.

Szignlkezels

Az el oz o szm mdszertantl eltrve az albbiak szerint elemezzk a kdokat: kln-kln vesszk szmba ez egyes nyelvi vltozatok sajtossgait el oszr a C, illetve a C++ nyelv u verzinak fogunk neki, ezt kvet oen bemutatjuk mennyiben ms a helyzet, Python nyelv u vltozatokban a kdot nem sorfolytonosan, hanem a futs logikja szerint kvetjk, lvn egy kicsit is bonyolultabb esetben mint amilyennek az albbi plda is mondhat mr ez a logikusabb

5.2.1. C, illetve C++ nyelvu vltozat


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62

# include <gtk / gtk .h> staticvoidon_button_clicked ( GtkWidget * widget , gpointerdata ) { g_print ("%s\n", ( constchar *) data ); }

# include <gtkmm .h> # include <iostream > voidon_button_clicked ( constGlib :: ustring & hello_msg ) { std :: cout<< hello_msg<< std :: endl ; } classMyWindow : publicGtk :: Window { protected : virtualboolon_delete_event ( GdkEventAny * event ) { std :: cout<< " deleteeventoccurred " << event<< std :: endl ; returntrue ; } public : MyWindow () : !") button (" HelloWindow {

staticgbooleanon_delete_event ( GtkWidget * widget , GdkEvent *event , gpointer data ) { g_print (" deleteeventoccurred \n"); returnTRUE ; } GtkWidget * my_window_new () { GtkWidget * window = gtk_window_new ( GTK_WINDOW_TOPLEVEL ); !"); GtkWidget * button = gtk_button_new_with_label (" HelloWindow g_signal_connect ( G_OBJECT ( window ), " delete event ", G_CALLBACK ( on_delete_event ), NULL ); g_signal_connect ( G_OBJECT ( window ), " destroy ", G_CALLBACK ( gtk_main_quit ), NULL ); g_signal_connect ( G_OBJECT ( button ), " clicked ", G_CALLBACK ( on_button_clicked ), !"); " HelloWindow g_signal_connect_swapped ( G_OBJECT ( button ), " clicked ", G_CALLBACK ( gtk_widget_destroy ), G_OBJECT ( window )); gtk_container_add ( GTK_CONTAINER ( window ), button ); gtk_widget_show ( button ); returnwindow ; }

button . signal_clicked (). connect ( sigc :: bind ( sigc :: ptr_fun ( on_button_clicked ), !" )); " HelloWindow button . signal_clicked (). connect ( sigc :: mem_fun (* this ,& MyWindow :: hide )); add ( button ); button . show (); } private : Gtk :: Buttonbutton ; };

int main ( int argc , char * argv []) { GtkWidget * window ; gtk_init (& argc ,& argv ); window = my_window_new (); gtk_widget_show ( window ); gtk_main(); return 0; }

int main ( int argc , char * argv []) { Gtk :: Main kit (argc , argv ); MyWindowwindow ; Gtk :: Main :: run ( window ); return 0; }

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62

Kdrszlet 5.1. Szignlok kezelse C, illetve C++ nyelven

ltalnossgok 1 - 2 sor Az fejlcllomnyok beszerkesztsnek sajtossgairl mr esett sz, gy az egyedli specikum itt a C++ vltozat ltal beszerkesztett iostream fejlcfjl, amire csupn a kperny ore trtn o rshoz lesz szksg. A GTK+ esetn mivel a gtk.h minden szksges fejlc llomnyt maga felsorol hasznlni tudjuk a Glib erre a clra hasznlatos fggvnylt (g_print). 22

50 - 62 sor A main fggvnyben alkalmazottak gyakorlatilag teljesen azonosak a korbbi minimlis pldnl ismertetettekkel, gy itt err ol leginkbb csak annyit rdemes megjegyezni, hogy a C++ vltozat lve a nyelv adta lehet osgekkel egy sajt osztly segtsgvel zrja egysgbe egy gombbal kiegsztett ablakunkat, mg a C vltozatban egy a sajt ablak ltrehozsra szolgl fggvny segtsgvel igyekeztnk ezt mdszert valamelyest kvetni. Termszetesen a GTK+ esetn is van md szrmaztatsra, de nem oly kzenfekv o mdon, mint amikor a C++ nyelvet hasznljuk, ennl fogva ennek ismertetse mg vrat magra. Szignlok a GTK+ nyelvu kdban 24 - 25 sor A ltrehozott ablak, illetve gomb trolsra szolgl vltozk tpusa GtkWidget, a specikusabb GtkWindow, illetve GtkButton helyett. Ennek magyarzata, hogy minden olyan fggvny a GTK+-ban, melynek segtsgvel egy j widgetet hozhatunk ltre gyakorlatilag a _new vg u metdusok egy GtkWidget tpus objektumra mutatval tr vissza. Ennek tbb oka is van. Egyrszr ol knyelmi, hogy elkerlhessk a folytonos tpusknyszertseket, hisz szmos esetben olyan fggvnyeket hasznlunk, melyek amgy is GtkWidgeteket kezelnek, teht ilyen tpusra mutatt vesznek t els o paramterknt. Msrszr ol ha egy specikus mondjuk GtkButton-t kezel o fggvnyt akarunk hvni, akkor vagy fordtsi vagy ami inkbb javasolt futs idej u tpusknyszerts alkalmazand (pl: GTK_BUTTON, GTK_WINDOW), aminek megvan az a komoly el onye, hogy ha sikerlt a mutatnkat, vagy a mutatott objektumot valamilyen mdon korrumplni, akkor arra viszonylag hamar fny tud derlni. Szignlkezel o fggvnyek felktse. 27. sor Az els o szignlbekts. Viszonylagos egyszer usge ellenre szmos aprsgra rdemes gyelmet fordtani. Az els o maga a g_signal_connect kulcssz, ami fggvnynek t unhet, pedig ugyangy, mint a g_signal_connect_swapped, makr, amik a g_sinal_connect_data fggvnyt burkoljk. A soron kvetkez o rdekessg a G_OBJECT makr, ami futs idej u tpusellen orzst hajt vgre a neki megadott paramteren, majd egy GObject tpusra mutatval tr vissza. A megrgztt C++ programozk joggal krdezhetik, mi szksg erre, hisz egyfel ol majd elvgzi a tpusellen orzst a fordt, meg ht a GtkWindow tpus gy is leszrmazottja a GObject osztlynak. Ez gy is lenne, na de s-, illetve szrmaztatott osztlyokrl csak logikai rtelemben lehet sz, a tpusellen ez itt C, teht o orzs teht nem vgezhet o, s ot minden esetben a hvott fggvnynek megfelel o tpusknyszert o makrt clszer u alkalmazni. A msodik paramter a szignl neve, amivel azt adjuk meg, hogy az el oz o paramterknt megadott object melyik szignljra is szeretnnk kezel o fggvnyt (callback) ktni. A harmadik paramter azon fggvny cme, aminek meghvdst ki szeretnnk vltani az esemny bekvetkezsekor. A fggvnynevet itt is egy makr segtsgvel adjuk t, ami az el oz oekhez hasonlan C nyelvi hinyossgokra vezethet o vissza. Mivel a meghvand callbackek prototpusai igen sokflk lehetnek (ami magbl a pldbl is ltszik valamelyest s ezek mind kln tpusnak min oslnek a C nyelvben ezrt ahnyfle callback varici ltezik, annyifle g_signal_connect fggvnyre lenne szksg. Knnyen belthat, hogy a jogos lustasg ms irnyba vitte a GTK+ fejleszt oit. A G_CALLBACK tulajdonkppen egy fordtsi idej u tpusknyszerts egy ltalnos fggvnytpusra, amivel ugyan megoldottuk, hogy csak egyetlen g_signal_connect_data fggvnyre legyen szksg, de elvesztettnk minden nem u tpusbiztossgot. Ha pldul egy az adott szignlnak nem megfelel o tpus fggvnyt adunk meg paramterknt, amit a pldabeli fggvnynevek felcserlsvel knnyen megtehetnk, csnya meglepetsekben lesz rsznk, de csak futsid oben. Nem hagyhatjuk tovbb gyelmen kvl a C nyelv azon sajtossgt sem, hogy az tadott fggvnyparamterek tvtele nemktelez o, azaz ha kevesebb paramterrel denilunk egy fggvny, mit amennyivel hvni szeretnnk voltakppen nem kvetnk el b unt, ez viszont tovbb bonyoltja a helyzetet. Az utols paramter az gynevezett user data, ami arra szolgl, hogy az esemnykezel o fggvnynknek olyan adatokat adjunk t, amik az esemny megtrtntb ol nem kvetkeznek. Ilyenek lehetnek pldul ms widgetek cmei, ahogy azt ltni is fogjuk. Ez esetben az tadott paramter NULL, ami szintn egy makr ami egy jl nevelt ((void*) 0) kifejezsre fejt odik ki C kd esetn. Zrszknt ehhez a sorhoz csak annyit, hogy a delete_event esemnyt az ablakkezel o vltja ki, akkor, amikor az ablakot valamilyen mdon (billenty uzet, men, egr) bezrjuk. A delete-event szignl blokkolsa. 12. sor Ez a delete_event szignlkezel o fggvnye, aminek nhny ms szignlkezel o fggvnyhez hasonlan egy gboolean rtkkel kell visszatrnie, ami azt hatrozza meg, hogy az ltalunk a szignlkezel oben vgrehajtottak utn a GTK lefuttassa-e sajt szignlkezel o rutinjt, vagy sem. Jelentse voltakppen teht az, hogy a sajt magunk a szignlt mindenre kiterjed oen kezeltk-e. Ennek megfelel oen ha a visszatrsi rtk 0 azaz logikai hamis , akkor vgrehajtdik a GTK+ adott szignlhoz kapcsold alaprtelmezett kezel o fggvnye, ellenkez o esetben rtelemszer uen arra utastjuk a GTK -t, hogy a szignl tovbbi feldolgozstl tekintsen el. Itt rdemes felhvni a gyelmet arra, hogy mivel a C nyelvben a C++-al ellenttben , nincs bool tpus annak analgijra deniltk a gboolean tpust (ami tulajdonkppen egy int) s a kt megfelel o logikai rtket makrknt (TRUE, FALSE). Ebben a konkrt esetben (delete_event szignl) az alaprtelmezett szignlkezel o a gtk_widget_destroy fggvny, vagyis ha nem ktnk fel sajt szignlkezel o fggvnyt, vagy logikai hamis rtkkel trnk vissza a kezel o 23

fggvnyb ol, akkor a window objektum megsemmisl, az ablak bezrul. Logikai igaz rtk visszaadsval elrhet o, hogy hiba prbljuk akr a jobb fels o sarok x gombjnak megnyomsval, akr valamilyen billenty ukombinci rvn bezrni az ablakot ez a prblkozs sikertelen lesz, ellenben minden ilyen prblkozs egy jabb sor kirst eredmnyezi. Az ablak bezrsa. 29. sor Az el oz ohz teljesen hasonl mdon itt a destroy szignlra ktnk be esemnykezel ot, ami a widget letciklusnak vgn vltdik ki. Egy kontnerben lv o widget esetn ez a kontnerb ol val eltvolts kvetkezmnye mr ha valaki nem tart kln referencit az eltvoltott widgetre , legfels o szint u widgetek (toplvel) esetn mint amilyenek az ablakok is ez jellemz oen a gtk_widget_destroy fggvny meghvsnak folyomnya, lvn az ilyen widgetek automatikusan nem semmislnek meg, err ol neknk explicit mdon kell gondoskodnunk (35. sor). A destroy szignl kezelse ltalnossgban nzve ritka, jelen esetben is csak az a szerepe, hogy a program valamilyen mdon ki tudjon lpni. Az ablak bezrsa alaprtelmezetten ugyan ezt eredmnyezn, de a delete-event szignlra kttt kezel ofggvnyben nem hogy ezt nem tesszk meg, de mg az ablak bezrdsst is meggtoljuk. Mikor a destroy szignlra kttt kezel ofggvny meghvdik, ablakunk pp megsz un oflben van, ugyanakkor ha ez az eset ll is fenn a programunk futsa annak ellenre sem rne vget, hogy az ablakunk bezrdik, hiszen a main loopbl nem lpnnk ki. Ezen helyzet elkerlsre esemnykezel oknt a main loopbl val kilpsre szolgl gtk_main_quit fggvnyt ktjk fel. rdemes megjegyezni, hogy br a gtk_main_quit fggvny dencija (void (*) ()) nem felel meg tkletesen a destroy szignl ltal elvrtaknak (void (*) (GtkWidget *, gpointer)) ez voltakppen nem jelent problmt, hiszen a tpusok klnbz osgt a G_CALLBACK makr ltal alkalmazott tpusknyszerts elrejti a fordt el ol, futsid oben pedig a gtk_main_quit egsz egyszer uen nem veszi t a szignlkezel ot meghv kdtl a kt fggvnyparamtert. 35. sor A 32. sortl csak a meghvand esemnykezel o fggvnyben, illetve az annak tadand paramterekben sorrendjben tr el. Ahogy az a fggvny nevb ol (g_signal_connect_swapped) kvetkezik, arrl van sz, hogy a gomb lenyomsakor meghvand callback jelen esetben a gtk_widget_destroy paramtereiben a user_data, illetve az az object, amin az esemny kivltdik, felcserlsre kerl. Kicsit konkrtabban fogalmazva a user_data lesz a callback els o paramtere s a gomb a msodik. Mivel itt a callback a gtk_widget_destroy fggvny, ami paramterknt mondjuk gy, a trlend o widgetet vrja, a user_data pedig az ablakunk, nem nehz kitallni, hogy a gombra val kattints eredmnyeknt az ablak meg fog sz unni, de csak azutn, hogy a Hell Window! zenet megjelent a konzolban. Gomb lenyomsnak kezelse. 32. sor Esemnykezel o fggvny bektse a gomb clicked szignljra, ami a gomb lenyomsakor hvdik meg, aminek egyetlen klnlegessge, hogy itt a szignlkezel o dencija pontosan megfelel a szignl ltal elvrtaknak, ugyanakkor a G_CALLBACK makr mgis szksges, mivel a g_signal_connect azt a tpust vrja, amire az on_button_clicked fggvnyt a makr knyszerti. 4. sor A fenti llts miszerint az ablak csak a kirst kvet oen sz unik meg csak azrt igaz, mert a on_button_clicked fggvny, mint esemnykezel o el obb kerl felktsre, mint a gtk_widget_destroy, valamint azrt, mert az esemnykezel ok alapvet oen a felkts sorrendjben kerlnek meghvsra. Fordtott esetben el obb hvdna meg a destroy az ablakra, ami sok egyb mellett lekti az esemnykezel o fggvnyeket, gy a kirst nem is ltnnk. Egyebek. 39. sor A nyomgomb hozzadsa az ablakhoz. 41 - 57 sor A ltrehozott widgetek megjelentse. 43. sor Belps az esemnyvezrelt szakaszba. Fentiek ismeretben nagy biztonsggal jsolhatjuk meg pldaprogramunk m ukdst. Az elindtott alkalmazs egy ablakot jelent meg, melyben egy Hell Window! felirat gomb lesz. Az ablak bezrsval hiba prblkozunk egr, vagy billenty uzet segtsgvel, ezen ksrletek eredmny csupn egy-egy delete event occurred sor a konzolban. Ha azonban le tallnk nyomni gombunkat az ablak hirtelen elt unik a konzolban egy Hell Window! felirat jelenik meg s a program kilp. Lssuk, hogy rhetnk ehhez teljesen hasonl funkcionalitst C++-ban.

24

Szignlok a gtkmm nyelvu kdban Szignlkezel o fggvnyek felktse. 50 - 62 sor Ahogy azt az ltalnossgokat taglal rszben emltettk Gtk::Window helyett MyWindow tpust hasznlunk f oablakunk ltrehozshoz. Mivel azonban a MyWindow publikusan szrmazik a Gtk::Window tpusbl ez a gtkmm szmra nem jelent klnbsget. A C vltozathoz kpest a szrmaztats itt nem csupn logikai, vagyis minden a C++-an megszokott el ony knnyedn realizlhat. Erre plda, hogy a szrmaztats miatt nincs szksg semmilyen tpusknyszertsre mikor a Gtk::Main::run fggvnyt hvjuk, ami pedig egy Gtk::Window referencit vesz t paramterknt. 21 - 44 sor Sajt osztlyunk konstruktorban megtehetjk mindazokat a lpseket, melyeket a C nyelv u vltozat esetn a my_window_new fggvnyben implementltunk. gy is mint a szignlok felktse, a gomb hozzadsa az ablakhoz, a widgetek megjelentse. Az egysgbezrs ezen el onyn tl a szrmaztatsbl fakad rmket is lvezhetjk, ugyanakkor persze az ebb ol fakad ktelessgeknek is eleget kell tenni. Ez esetben ez a konstruktor meghvst sosztly konstruktornak explicit hvsnak hinyban a Gtk::Window jelenti, ami rejtett mdon megy vgbe. Az o azon konstruktora fut le, ami paramterek nlkl is hvhat. Msrszr ol viszont az adattagknt trolt GtkButtont (button) is inicializlnunk kell. Itt is lehetne kzvetve, implicit mdon hvni a paramter nlkli konstruktort, azonban kzenfekv obb azt a vltozatot hasznlni, amivel egyszerre a gomb feliratt (label) is megadhatjuk, gy egy hvs a ks obbiekben megsprolhat. Kln szt rdemelnek a szignlok bektsei. Klnsebb programoz gniusz nem kell, hogy felfedezzk a szignlok elrshez egy signal_szignlnv szerkezet u hvst hasznljuk fel. Az ilyen hvsok egy, a Glib::SignalProxyBase osztlybl szrmaz objektumot adnak vissza, amik connect nev u metdusai valstjk meg azt, amit a GTK+ esetn a g_signal_connect makr tett meg, vagyis egy adott widget, adott szignljra esemnykezel o felktst. El onye ennek a mdszernek, hogy tpusbiztos, azaz a connect paramterknt csak olyan fggvnyt (slot) fogad el, melynek tpusa megfelel az adott szignlnl lertakkal. Tovbbi el ony, hogy a slotokhoz nem csupn egy user data csatolhat, hanem tetszs szerinti szm, s ezek tpusa is ellen orzsre kerl fordtskor. Amennyiben azonban sikerl csupn egy aprsgot is elrnunk a szignl bektsnl, vagy a slot tpusnak megadsnl a sablonokkal (template) trtn o megvalstsnak hla , akkor jellemz oen tbb oldalas, nehezen kibogarszhat hibazenettel tallhatjuk szemben magunkat. 32 - 35 sor Lssuk akkor miknt is rhet o el ugyanaz gtkmm esetn, mint ami korbban GTK+ hasznlatval. Els o pillantsra is szembeszk o, hogy mindkt sorban tallunk olyan hvst, amik nem a Gtk nvtrben deniltak. Ennek az az oka, hogy a gtkmm a szignlkezelst egy kls o libsigc++ nev u fggvnyknyvtrral valstja meg. A kt esemnykezel o felktse kztti klnbsget az esemnykezel o fggvnyek tpusa adja lssuk ezt rszletesebben. 32. sor Ha a megadni kvnt fggvny nem kt odik objektumhoz legyen ez egy osztly statikus tagfggvnye, vagy akr egy tisztn C nyelv u kdbl szrmaz fggvny slot ltrehozshoz a sigc::ptr_fun alkalmazand. Ebben a konkrt esetben a slot ltrehozsn tl, paramtereket is hozzkapcsolunk a clicked esemny bekvetkeztekor meghvand fggvnyhez. Ennek eszkze a sigc::bind, melynek els o paramtere egy slot, a tovbbiak pedig a csatoland paramterek. Itt csupn egy ilyen van, a gomb lenyomsnak hatsra kirand zenet szvege. Ez persze kiss knyszeredett, hiszen a paramter rtke soha nem vltozik, gy ennek igazi hasznt ezen a plda alapjn mg nehz beltni. 4. sor Esemnykezel o fggvnynk a lehet o legegyszer ubb, csupn azt szemllteti miknt is kell az tadott paramtereket hasznlni. Ez esetben annak rtkt a standard kimenetre kirni. M ukdst s funkcijt tekintve a C-s vltozat azonos nev u fggvnyvel analg. 35. sor Ha a megadni kvnt esemnykezel o egy osztly tagfggvnye, akkor a sigc::mem_fun hasznlhat arra, hogy ket slotot hozzunk ltre az osztly egy pldnybl, illetve az osztly tagfggvnyb ol, ebben a sorrendben tadva o a fggvnynek, utbbit a teljes nvtrlistval egytt. Termszetesen az imnt emltett sigc::bind, az el obbiekhez hasonlan mdon itt is alkalmazhat. Ez a hvs pp ugyanazt a clt szolglja, mint a GTK+ vltozat azonos sorszm sora, azaz hogy az alkalmazsunkbl annak ellenre is ki lehessen lpni, hogy az ablak bezr gombjnak hatsra a itt sem trtnik semmi egyb, mint kirdik a delete event occurred szveg a standard kimenetre. Mg legutbb a gtk_widget_destroy fggvnyt ktttk fel esemnykezel oknt, itt a Gtk::Widget osztly hide fggvnyt hasznljuk, aminek hatsra a GTK f ociklusa kilp, mivel annak futtatsakor (59. sor) megadtuk ablakunkat paramterknt. tgondolva a m ukdst jogosnak tekinthet o, hiszen lthat f oablak hinyban a tovbbi m ukdsnek nem sok rtelme van, ugyanakkor a C vltozat gtk_widget_destroy fggvnye helyett a C++ vltozatban a delete hvssal lehetne gymond jelezni, hogy az ablakunkra nincs tovbb szksg, viszont ez nem clszer u, hiszen az a main fggvnyben egy loklis vltoz.

25

A delete-event szignl blokkolsa. 12. sor A GTK+ vltozathoz kpesti komoly klnbsg, hogy itt a delete-event szignl blokkolsa nem egy felkttt esemnykezel on keresztl valsul meg ezrt is nincs a kdban olyan sor, ami erre a szignlra vonatkozna , hanem az alaprtelmezett esemnykezel o kerl fellrsra. A m ukds megrtsnek kulcsa a virtual kulcsszban rejlik. Minden szignlhoz tartozik ugyanis egy az adott widget ltal implementlt alaprtelmezett esemnykezel o fggvny, ami alkalmasint fellbrlhat (ovverride). Ha ezt megtesszk, azzal a szignl kezelsnek teljes folyamatt mi irnytjuk, ami mellett komoly rvek szlhatnak, de nem rt krltekint onek lenni. m ebben az esetben a cl pont annak a demonstrlsa, hogy a gtkmm szabad kezet ad abban, hogy egy szrmaztatott widget miknt kvnja sosztly esemnyeit. A visszatrsi rtk szerepe ugyanaz, gy a m kezelni az o ukds is azonos az el oz o GTK+ nyelv u pldval. A szignlkezelsr ol sszegzskppen annyit, hogy alapvet oen kt lehet osg knlkozik arra, hogy az egyes widgetek esemnyei kezeljk: Callbackeket kapcsolni azon widgetek azon esemnyihez, melyek szmunkra rdekesek s ezekben megtenni a megfelel o lpseket Fellbrlni a widget sajt esemnykezel ojt az rkl ods mechanizmusai tjn. Erre mindkt vltozat esetn van lehet osg, m a GTK+ megoldsa kiss krlmnyes s nehezebben megrthet o, gy annak ismertetse valmely ks obbi rszre marad. A C++ nyelvi eszkzeit kihasznlva a gtkmm viszont ezt oly knnyedn oldja meg, hogy kr lett volna kihagyni a bemutatst annak ellenre is, hogy a mdszerre ritkn van szksg, hiszen tbbnyire arrl van sz, hogy a klnbz o widgetpldnyok azonos szignljainak kivltdsakor ms-ms irnyba szeretnnk terelni a program futst. A fellbrls rvn viszont arra nylik lehet osg, hogy a szignl kezelsnek mdjt vltoztassuk meg. Ha nem kvnunk egyebet tenni, mint ami amgy is trtnne, hvjuk meg a fellbrlt fggvny szl oosztlybeli vltozatt. Ha azonban ez el ott, vagy utn mg valami msra is szksgnk van, megtehetjk, hogy csak a fggvny kzepr ol hvjuk a szl o metdust, vagy akr el is hagyhatjuk az ha tudjuk mit s f oknt hogyan szeretnnk kezelni.

5.2.2. Python nyelvu vltozatok


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

from gi. repositoryimportGtk defon_button_clicked ( button , hello_msg ): print ( hello_msg ) defon_delete_event ( my_window , event ): ") print (" deleteeventoccurred returnTrue defmy_window_new (): my_window = Gtk . Window () my_window . connect (" destroy ", Gtk . main_quit ) my_window . connect (" delete event ", on_delete_event ) ") button = Gtk . Button (" HelloWindow button . connect (" clicked ", on_button_clicked ," HelloWindow ") button . connect_object (" clicked ", Gtk . Widget . destroy , my_window ) my_window . add ( button ) returnmy_window if __name__ == " __main__ ": my_window = my_window_new () my_window . show_all () Gtk . main ()

from gi. repositoryimportGtk defon_button_clicked ( button , hello_msg ): print ( hello_msg ) classMyWindow ( Gtk . Window ): defdo_delete_event (self , event ): ") print (" deleteeventoccurred returnTrue def__init__ ( self ): Gtk . Window . __init__ ( self ) self . connect (" destroy ", Gtk . main_quit ) ") self . button = Gtk . Button (" HelloWindow self . button . connect (" clicked ", on_button_clicked ," HelloWindow ") self . button . connect_object (" clicked ", Gtk . Widget . destroy , self ) self . add ( self . button )

if __name__ == " __main__ ": my_window = MyWindow () my_window . show_all () Gtk . main ()

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

Kdrszlet 5.2. Szignlok kezelse Python nyelven Elljrban annyit rdemes megjegyezni a Python vltozat kapcsn, hogy az itt alkalmazott megoldsok a C, illetve C++ vltozatbl mr ismertek, logikjuk hol a GTK+, hol pedig a gtkmm megoldsaira emlkeztetnek fgg oen termszetesen attl is, hogy kihasznljuk-e a Python nyelv adta objektum-orientltsg lehet osgeit , tvzve azok el onyeit. Kihasznlva a korbbiakban lertakat, itt mr csak a kifejezett nyelv specikus rszeket ismertetjk, a csupn szintaktikai elemekben eltr o rszletekre nem trnk ki. ltalnossgok. 1. sor A Gtk szimblumok importlsa, csakgy, mint a korbbi, minimlis pldban.

26

24 - 29 sor Ez a rsz gyakorlatilag azonos a korbbi, minimlis pldnl ismertetettekkel, azzal a klnbsggel, hogy a delete-event szignl helyet az ablakunk destroy szignljra ktjk r a programbl val kilpshez vezet o main_quit fggvnyt, melynek magyarzat pp az, mint a korbban C vltozatnl, err ol azonban mg esik sz. A delete-event szignl blokkolsa. 14. sor A korbbiakhoz hasonlan a delete-event szignl elnyomsra fgg oen attl, hogy objektum-orientlt megkzeltst alkalmazunk-e vagy sem kt lehet osg knlkozik. Vagy egy szignlkezel o fggvnyt ktnk fel, amiben logikai igaz rtkkel (True) trnk vissza, azt mondva ezzel a GTK szignlt feldolgoz kdjnak, hogy ezt az esemnyt kezeltk, vagy sajt osztlyunkban rjuk fell az alaprtelmezett esemnykezel ot (do_delete_event), amiben hasonlkppen jrunk el. Mivel a Python nyelvben gyakorlatilag minden fggvny virtulis ezt minden tovbbi nlkl megtehetjk. 7. sor A kezel o fggvny a nyelvi klnbsgekt ol eltekintve teljesen azonos a C, illetve C++ nyelv u vltozatokval, vagyis mindkt fggvny paramterknt megkapja a kezelt esemnyt ler adatstruktrt, illetve azt az objektumot amin az esemny kivltdott. Kicsit korrektebbl fogalmazva az objektum-orientlt vltozat valjban azon objektumra kap referencit, melynek osztlyhoz a kezel o fggvny tartozik, de ebben az esetben ez a kett o egybeesik. Gomb lenyomsnak kezelse. 17. sor Mivel a Python esetn a widgetek a C++ vltozathoz hasonlan valdi objektumok, az esemnykezel o fggvnyek bektse az objektumon keresztl trtnik. Az esemnykezel o fggvnyek els o paramtere maga az objektum lesz. A szignl bektsekor megadott tovbbi paramterek a kezel o fggvnynek addnak t. A C vltozattal ellenttben ahol csak egy paramter adhat meg a Python kpes egyszerre tbb paramter tadsra is ppgy, mint a gtkmm ugyanakkor itt termszetesen olyan szigoran vett tpusellen orzsr ol nem beszlhetnk, mint a C++ nyelv esetn. Az ablak bezrsa. 18. sor Az ablak bezrsnak logikja azonos a C vltozatnl elmondottakkal, vagyis az ablak destroy szignljnak kezel ojeknt a main_quit fggvnyt adjuk meg, azaz az esemny bekvetkeztekor a Gtk f ociklusa, egyszersmind a programunk is kilp. 13. sor Ezt gy rjk el, hogy gombunk clicked szignljnak kivltsra meghjuk az ablak destroy fggvnyt. Hasonlan a C vltozathoz, itt is alkalmazunk nmi cselt. Mivel ott csak egy paramter adhat t pontosabban kett o, hiszen az els o maga az objektum, aminek a szignljra a kezel ofggvnyt felktttk , a paramtereket meg kell fordtanunk, hogy az ltalunk megadott adat kerljn az els o helyre, vagyis ez legyen a gtk_widget_destroy ltal megkapott egyetlen paramter. Voltakppen a connect_object ugyanezt a clt szolglja, gy ellenttben a connect fggvnnyel ennek csak egy paramtere van, mely ez esetben maga az ablakunk, amit a destroy fggvnynek adunk t.

5.2.3.

Fordts s futtats

A korbbiakhoz hasonlan az albbi parancssorok segtsgvel fordthatak elemzett programjaink:


gcc gtk_signal.c -o gtk_signal pkg-config --cflags --libs gtk+-3.0 g++ gtkmm_signal.cc -o gtkmm_signal pkg-config --cflags --libs gtkmm-3.0

Prblkozzunk ezttal a ./gtk_signal, ./gtkmm_signal, illetve python gtk_signal.py parancsokkal abban a knyvtrban, ahol a fordtst elkvettk, illetve a Python forrst tartjuk.

5.2.4.

Eredmny

Brmily hihetetlen ezttal sem trtnik sok egyb, mint a korbbi minimlis plda esetn. A klnbsg remlhet oleg annyi, hogy a meglepetssel teli borzongst legutbb ablakunk vratlan felbukkansa, mg most a bennnk szikraknt felvillan megrts okozza.

27

rsz II

Alapvet o widgetek

28

6. fejezet

Ablakok
6.1. Bevezets

Ebben a rszben a GTK -ban ltrehozhat klnbz o ablaktpusok kzs vonsait, valamint eltrseit, illetve ezek okait vesszk sorra. Kitrnk egyrszr ol az egyes ablaktpusok ltrehozsnak sajtossgaira, azok widgetekkel val feltltsre, msrszr ol a felhasznl interakcik kezelsre, ezzel egytt az ablakok bezrsnak mdjaira is, szem el ott tartva termszetese a C, C++, illetve Python nyelv u vltozat azonossgait, klnbz osgeit.

6.1.1. Popup s toplevel ablakok


A popup ablakra, mint tpusra ugyan ritkn lesz kzvetlenl szksgnk, rdemes tudni, hogy a GTK ebben a tekintetben kt fajta ablakot klnbztet meg. A popup (felugr, felbukkan) ablakokat, melyekre valamilyen specilis clt szolgl sajt kszts u widgetekt ol eltekintve csak nhny plda ltezik (menu, tooltip), valamint a toplevel (legkls o, legfels o szint u) ablakokat, melyek csaknem minden GTK -s, illetve sajt fejleszts u ablak alapjul szolglnak. Ha teht az ablakra, illetve a hozz kapcsold fogalmakra gondolunk, tbbsgben egy toplevel ablakra gondolunk, s nem a popup1 tpusakra, melyekr ol taln nem is feltteleznnk els o rnzsre, hogy ablakok. Az ablakkezel o ezt az informcit hasznlja fel annak eldntsre, hogy az adott ablakot milyen kerettel, dekorcival lssa el, illetve hogy ltalnossgban menedzselje e ablakot. Utbbi azaz a toplevel ablakok esetben alaprtelmezetten az ablakkezel o keretet, illetve a belltsoktl fgg oen azon pldul bezr, teljes mrtre vlt, minimalizl gombot jelent meg. A popup tpus ablakokat az ablakkezel o nemcsak hogy nem dekorlja, de nem is menedzseli azokat, kvetkezskpp teht szmos az ablakkezel o hatskrbe tartoz funkci, mint amilyen pldul a minimalizls, vagy a maximalizls nem is rhet o el. Br kzenfekv o megoldsnak ltszik a popup tpus arra, ha egy dekorci nlkli ablakot ksztsnk, mgse ezt tegyk, az ilyen tpus megjelensbeli sajtossgok belltsra lteznek kln fggvnyek. Minden GtkWindow egyben kontner is, pontosabban fogalmazva egy GtkBin, azaz tartalmazhat egy tovbbi elemet gyerekknt, ami termszetesen szintn lehet egy kontner, gy biztostva, hogy szmos elemet helyezhessnk el az elksztett ablakon bell.

6.1.2. Window s dialg


A window tpus azon bell is ahogy trgyaltuk a toplevel window kzvetlen szl oje a dialog tpusnak, szmottev o klnbsg tulajdonkppen nincs is a kett o kztt. Egy dialog nem ms, mint egy olyan window, melybe a GTK+ fejleszt oi nhny hasznos elemet helyeztek el. Konkrtabban fogalmazva minden dialgba egy fgg oleges elrendezs u kontner widget (GtkBox), abba pedig egy, a gombok elhelyezsre szolgl kontner (GtkButtonBox tpus action_area), valamint egy szepartor (GtkSeparator) kerl, ebben a sorrendben mindkt esetben a kontner aljra helyezve2 . Ebb ol kvetkezik, hogy minden, amit egy dialgusba annak elkszlt utn tenni akarunk az a gombsor, valamint a vzszintes szepartor fltt jelenik meg, fggetlenl attl, hogy azt a pack_start(), vagy a pack_end() fggvny segtsgvel helyezzk el a kontnerben. A dialog tpus teht a szepartor ltal fgg olegesen kett osztott window, ahol az als rsz (action_area), ami ltalban a gombokat tartalmazza (pl.: Ok, Mgse, Sg, . . . ), a fels o (content_area) pedig azokat az elemeket tartalmazza, amik a felhasznli szmra a szksges akcihoz (pl.: adatbevitel, hibazenet megjelentse, . . . ) szksges.

6.1.3.

Modalits

A tbb ablakkal trtn o prhuzamos interakci tiltsra szolgl a window modal tulajdonsga. Amennyiben egy ablak modlis csak az abban az ablakban elhelyezked o widgetekbe trtnhet pldul bevitel, csak azokon vltdhat ki vala1 Ms 2A

eszkzkszletek a popups gy ujt ofogalom al soroljk a dialgusokat, a GTK esetn azonban egy dialgus ablak mindig egy toplevel GtkBox tpus pack_end() fggvnyt hvva.

29

milyen felhasznl ltal kezdemnyezett esemny. Ezt kihasznlva biztosthatjuk pldul, hogy egy adatbeviteli ablak3 bezrsig ne vltozzon semmilyen, a felhasznl ltal mdosthat, widget tartalma a httrben. Modalitsnak kt formjt klnbztetjk meg. Egyrszr ol amir ol eddig is sz esett a csak az applikcira vonatkoz modalitst, mely lehet ov teszi, hogy ms applikcik ablakaihoz minden tovbbi nlkl hozzfrhetnk. Msrszr ol a teljes rendszerre rvnyes modalitst, ahol a modlis ablakon kvli ablakokkal folytatott minden nem u felhasznl interakci tiltott. Ez utbbi mdszert csak a legszksgesebb esetben mr ha van ilyen clszer u alkalmazni s az el obbi is csak akkor fogadhat el fellettervezsi szempontbl, ha az applikci egyb rszeihez val hozzfrs adatvesztst, vagy ms komoly hibt okozna. Amennyiben mgis a modalits mellett dntnk, ami nem ritka, hiszen az adatbevitelre, mdostsra hasznlt ablakok majd mindegyike ilyen, fontos egyrtelm uv tenni a felhasznl szmra, hogy miknt hagyhatja el azt az ablakot, ami korltozza az applikci ms rszeihez val hozzfrst. Egy ilyen menekl o tvonal biztostsnak kzenfekv o mdja lehet pldul egy Mgse felirat gomb.

6.1.4.

Tranziencia

A dialgusok rendszerint tranziensek arra az ablakra, melyb ol szrmaznak, azaz arra az ablakra melyen azt a m uveletet vltottuk ki, aminek hatsra a dialgus megjelent. Ezen bellts alapjn az ablakkezel o kpes a dialgusunkat el otrben, a szl oablak fltt tartani4 , valamint ha arra krjk, akkor a szl o ablakhoz kpest kzpen megjelenteni (6.2.1). Ez a funkci azonban nem csak az ablakok helyes megjelentshez szksges, a megszntetskkor is hasznos, hiszen a destroy-with-parent tulajdonsgon (property) keresztl lehet osg van arra utastani a GTK -t, hogy egy ablak megsz unsekor azokat az ablakokat is szntesse meg, melyek erre a szl oablakra nzve tranziensek. Ez leginkbb akkor hasznos, hogy ha egy bizonytalan ideig ltez o ablakra szeretnnk tranziensek lenni5 . gy nem kell tr odnnk azzal, hogy ablakaink esetleg rvn maradnak.

6.2.
6.2.1.

Hasznlat
Ltrehozs

Mind a GtkDialog, mind pedig a GtkWindow tpus ltrehozsa mr ami formai rszt illeti , teljesen hasonl az sszes tbbi widgethez, van azonban egy rdemi klnbsg, amire rdemes kitrni. Az ablakok igaz ez termszetesen az sszes tbbi GtkWindow tpusbl szrmaz widgetre is (pl.: GtkMessageDialog, GtkAboutDialog, . . . ) termszetknl fogva nem kerlnek bele ms kontnerbe, hiszen pont ezek azok a tpusok, amik widgeteket tartalmaznak. Ellenttben azonban a tbbi tpussal, ahol a referenciaszmlls megoldja a problmt, itt a ltrejtt widgetek felszabadtsrl magunknak kell gondoskodnunk. Paramterek A GtkDialog ltrehozsban mr valamivel nagyobb a klnbsg, fgg oen attl, hogy GTK+-t, vagy gtkmmet hasznlunk, br gy sem szmottev o. Minkt esetben meg kell adnunk a cmsor szvegt, valamint azt az ablakot, amire tranziensek kvnunk lenni. GTK+ esetn ahogy ltszik lehet osgnk van NULL rtk megadsra, ami azt jelenti, hogy nem kvnunk ezzel a lehet osggel lni. A gtkmm is lehetsges ez, ha az albb lthat konstruktort helyett azt hvjuk, amelyb ol hinyzik a parent paramter.
GtkWidget * gtk_window_new ( GtkWindowTypetype );

explicitWindow ( WindowTypetype = WINDOW_TOPLEVEL ); classWindow ( Gtk . Window ): def__init__ (self , type = Gtk . WindowType . TOPLEVEL , ** kwds ):

Kdrszlet 6.1. Window ltrehozsa Ahogy arrl sz esett (6.1.1) a GTK kt tpust klnbztet meg a popup s toplevel window melyek kzl az el obbi olyannyira ritkn hasznlt, hogy a C++ nyelv u vltozat esetn az alaprtelmezett paramtere is van a tpus konstruktornak, ahol a tpus alaprtelmezett rtke toplevel.
lehet pldul a szerkeszts menpontok belltsok almenjnek hatsra megjelen o ablak. belltsok esetn ha rosszul, vagy egyltaln nem adjuk meg a szl oablakot el ofordulhat, hogy egy jonnan ltrehozott s megjelentett dialgusunk a mr ltez o ablakok alatt, vagy kztt kerl megjelentsre, ami felhasznli szempontbl roppant zavar 5 Erre lehet plda egy nem modlis ablak, ami a programfutsa sorn is megsz unhet
4 Helytelen 3 Ilyen

30

A C, illetve a Python vltozat flags paramtere egyben tartalmazza a gtkmm modal (6.1.3) s a destroy-with-parent (6.1.4) rtket egy bitmask rtkben. Ez utbbi belltsra ugyan van lehet osg gtkmm esetn is, a C++ nyelvi eszkzeinek korrekt hasznlata mellett nemigen van szksg6 .
GtkWidget * gtk_dialog_new_with_buttons ( constgchar *title , GtkWindow * parent , GtkDialogFlagsflags , constgchar * first_button_text , ...); Gtk :: Dialog :: Dialog ( constGlib :: ustring & title , Gtk :: Window & parent , boolmodal = false , booluse_separator = false ); classDialog ( Gtk . Dialog , Container ): def__init__ (self , title =None , parent =None , flags =0, buttons =None , _buttons_property =None , ** kwars ):

Kdrszlet 6.2. Dialog ltrehozsa Pozci Egy ablak kperny on elfoglalt pozcijnak megadsra alapvet oen kt lehet osg knlkozik. Az egyik, ha el ore mg az ablak megjelentse el ott megadjuk, a kvnt elhelyezkedst. Ehhez a GTK annyiban tud segtsgnkre lenni, hogy vlaszthatunk nhny el ore denilt elhelyezkedsi pozci kzl, gy nem szksges a pixelben megadott koordintk kiszmtsra id ot s energit pazarolni7 . A set_position fggvny mg a megjelentst megel oz oen azaz window esetn a show, daialog esetn pedig a run meghvsa el ott mdunkban ll az albbi elhelyezkedsi smk kzl a megfelel ot kivlasztani. WIN_POS_NONE Nincs befolyssal a megjelentst ablak pozcijra nincs. WIN_POS_CENTER A megjelentend o ablak a teljes kperny ohz kpest kzpen jelenik meg. WIN_POS_MOUSE A megjelentend o ablak az egr aktulis pozcija alatt jelenik meg. WIN_POS_CENTER_ALWAYS A megjelentend o ablak a teljes kperny ohz kpest kzpen jelenik meg s tmretezst kvet oen is ott marad8 . WIN_POS_CENTER_ON_PARENT A megjelentend o ablak a set_transient_for fggvnnyel belltott szl ojhez kpest kzpen jelenik meg. Ha gy ltjuk a fenti lehet osgek nem felelnek meg maradktalanul cljainknak, akkor lehet osgnk van arra, hogy ablakunkat a kvnt pozcira mozgassuk. Megjegyzend o, hogy ez a mozgats csupn egy krs az ablakkezel o fel, amit az gyelmen kvl is hagyhat. Az ablakkezel ok jelentkeny rsze ezt meg is teszi amennyiben ezzel a mdszerrel kvnjuk az ablak kezdeti pozcijt meghatrozni, viszont honorlja krsnket, ha az ablak korbban mr megjelentsre kerlt. Az ablak elhelyezkedsnek megadsa x, y koordintkkal trtnik egy vlasztott referenciaponthoz kpest, mely lehet az ablak brmely sarokpontja, az lek kzppontja s az ablak kzppontja egyarnt. A mozgats maga a move fggvnnyel trtnik, a referenciapontot pedig a gravity rtke hatroz meg. Egy ablak pozcijnak nem csak a belltsra, de lekrdezsre is szksg lehet, ugyanakkor ebben a tekintetben adott egy komoly megszorts, amivel mindenkpp szksges szmolni. A get_position fggvny ltal visszaadott rtkek a mr korbban emltett mdon fggenek egyrszr ol a gravity rtkt ol, msrszr ol pedig az ablakkezel ot ol. Elmletben, ha a visszakapott x, illetve y rtket tadnnk a set_position fggvnyek azt kellene tapasztalnunk, hogy az ablak egy helyben marad, gyakorlatban viszont azt tapasztalhatjuk, hogy az ablak valamennyit elmozdul. Ennek oka az ablakkezel o ltal az ablak kr rajzolt dekorci, illetve annak geometrija, amit a GTK+ csak j kzeltssel tud becslni. Ez pldul akkor okozhat gondot, ha programunk ablakainak mrett s elhelyezkedst menteni szeretnnk, majd azt visszalltannk a kvetkez o futtatsnl. rdemes teht krltekint onek lenni. Mret s arny A kontnerek mretnek meghatrozsrl s elemeik (children) elhelyezkedsr ol lertak (7.3) a bels o elrendezsk arnyait tmretezskor is megtart ablakok kialaktsakor vlnak igazn fontoss. Egy ablak mrett, ha ms erre vonatkoz belltst nem tesznk pp gy mint mint minden ms kontnert a benne lv o elemek mretigny hatrozza meg, ugyanakkor lehet osg van ennek az alaprtelmezs szerinti m ukdsnek a mdostsra. Egyrszr ol a set_default_size fggvny rvn, melynek megadhat az ablak alaprtelmezett vzszintes s fgg oeges mrete pixelben. Ennek hatsa, hogy az ablak els o megjelentskor9 legalbb ilyen mret u lesz. Ha azonban az ablakban trolt widgetek mretignye azt indokolja, akkor a megadott szlessg s magassg rtkeknl nagyon
6 Ha egy ablakra egy tranziens dialgust akarunk megjelenteni, az nyugodtan lehet adattag, aminek megszntetsr ol az ablak destruktorban gondoskodhatunk. 7 Ami nem minden esetben kzenfekv o feladat, hiszen adott esetben nem csak a kperny o felbontsval, sajt ablakunk mreteivel, de a szl oablak, vagy ppen a desktop szlessg s magassg rtkeivel is foglalkozni kell. 8 A legtbb esetben ez a vlaszts nem szerencss, lvn nem felttlenl m ukdik ez a md minden ablakkezel o rendszer esetn. 9 Egy esetleges eltntetskor hide az ablak mrete gymond mentsre kerl, azaz az alaprtelmezett mret nem kerl jra alkalmazsra, ha az ablakot eltntetjk hide, majd jra megjelentjk.

31

mretben kerl megjelentsre. Ezt a m ukdst termszetesen a size request megadsa rvn is elrhetnnk, de az alaprtelmezett mret belltsa esetn a felhasznl cskkenteni tudja az ablak mrett, ha megadottak szerinti mretre nincs felttlenl szksg. Az ablak tmretezse kapcsn kt felhasznli szempontbl rdemleges krds merl fel. Az egyik, hogy engedjk-e az ablak tmretezst a felhasznlnak. Erre a krdsre adott vlasz leginkbb azon mlik, hogy mennyi id ot kvnunk az ablak tervezsvel tlteni, illetve mennyire van a felhasznlnak ignye az tmretezsre. Ha id onk korltos s valjban nincs szksg a mret megvltoztatsra, akkor szerencsnk van, nyugodtan tilthatjuk ezt az interakci. Ha viszont ez nem lehetsges pldul azrt, mert az alkalmazsunk f oablakrl, vagy egy olyan dialgusrl van sz, melyben egy lista jelenik meg, aminek hasznos lehet a lehet o legtbb helyet biztostani , akkor id ot s energit kell szlnunk az egyes widgetek viselkedsnek megtervezsre. t kell gondolnunk mely elemeknek foglaljk el (expand, ll) azt a helyet, ami az tmretezs rvn rendelkezsre ll majd. Egy-egy feleslegesen megnyl widget mondjuk egy teljes kperny ot elfoglal beviteli mez o, amibe mondjuk csak egy IP cmet szeretnnk rni pp annyira szerencstlenl mutat, mint amennyire zavar az, ha hiba nveljk az ablak mrett, a lista, amib ol tbb sort szeretnnk ltni, mgsem n o. Ha mgis az tmretezs tiltsa mellett dntennk, akkor ezt a set_resizable fggvny hvsval tudjuk elrni. A msik rdemleges krds a programbl trtn o tmretezs, amire ugyan megoldhat (resize), de er osen ellenjavallt usability szempontbl. A fentieknl is rszletesebb belltsok a set_geometry_hints fggvnnyel tehet ok meg. Az ablak minimlis s a maximlis vzszintes, illetve fgg oeges irnyban kln-kln llthatak, ahogy az tmretezs lpskze is, s ot az ablak mretarnynak 10 (aspect ratio) lehetsges legkisebb s legnagyobb rtke is megadhat.

6.2.2.

Minimlis plda

Ennyi bevezet o utn lssuk egy olyan pldt, ami a lehet o legkevesebb kdsor mellet, mg ha meglehet osen korltozott funkcionalits br, de m ukd o alkalmazst eredmnyez. Az albbi C, C++, illetve Python nyelv u kd nem tesz egyebet, ltrehoz egy ablakot, amit meg is jelent azltal, majd tadja a vezrlst a GTK -nak azltal, hogy futtatja a main loopot,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

# include <gtk / gtk .h> int main ( int argc , char * argv []) { GtkWidget * window ; gtk_init (& argc ,& argv ); window = gtk_window_new ( GTK_WINDOW_TOPLEVEL ); g_signal_connect ( G_OBJECT ( window ), " delete event ", G_CALLBACK ( gtk_main_quit ), NULL ); gtk_widget_show ( window ); gtk_main(); return 0; }

# include <gtkmm .h> int main ( int argc , char * argv []) { Gtk :: Main kit (argc , argv ); Gtk :: Windowwindow ; window . show (); Gtk :: Main :: run (); return 0; }

from gi. repositoryimportGtk if __name__ == " __main__ ":

window = Gtk . Window () window . connect (" delete event ", Gtk . main_quit ) window . show () Gtk . main ()

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

Kdrszlet 6.3. Miniml plda GtkWindowhoz A vltozatok br egyformnak t unnek, nhny aprsgban mgis eltrnek egymstl. Ezek egy rsze, mint a window vltoz deklarlsnak helye, vagy paramterezse, a programozsi nyelv sajtossgaibl kvetkezik. Msok viszont, mint a main loop futtatsnak mdja, illetve a fggvny elnevezse mr a nyelvi vltozat megalkotinak beltsn m ulik. A programok m ukdse azonos, csupn a technikai megvalstsban vannak eltrsek. Ezekr ol korbban mr sz esett, gy itt ezeket nem rszletezzk, inkbb sorra vesszk miknt vehetnk hasznlatba egy frissen ltrehozott ablakot, mit kell tennnk, ha elemeket szeretnnk elhelyezni az ablakban, ha vezrl o gombokkal szeretnnk ltnnk el, majd a megjelentst utn a felhasznl interakcikat szeretnnk kvetni, illetve azokra reaglni.

6.2.3.

Tartalmi elemek

Egy ablak tpusa szerint nem ms, mint egy kontner, pontosabban fogalmazva egy GtkBin (7.1.1), amibe tovbbi elemeket tehetnk. Praktikusan ez az elem egy jabb kontner, rendszerint egy GtkBox. A GtkDialog esetn, mint azt a korbbiakban (6.1.2) kifejtettk, a kontnerbe helyezett GtkBox mr adott. Az gy egy ablakba kerl o widgetekre nem csak abban az rtelemben tekintnk csoportknt, hogy mindegyikk szl oje toplevel widget szinten ugyanaz az ablak, de vannak bizonyos tulajdonsgok, melyek ugyan konkrtan a widgetre vonatkoznak, de sszefggsben llnak az ablak ms widgeteinek bizonyos tulajdonsgaival, de mindig csak az azonos ablakban lv o ms widgetekivel, vagyis erre csoport nzve zrtak.
10 szlessg/magassg

lebeg opontos szmknt adott rtke

32

Fkusz widget Egy adott ablakban11 egy adott pillanatban legfeljebb egy olyan widget lehet, melyen fkuszban (keyboard focus) van. Ha van ilyen widget, akkor minden az ablak ltal fogadott billenty uzet esemny (billenty u lenyomsa, felengedse, . . . ) hozz kerl tovbbtsra. gy rthet o is, hiszen ha pldul gpelnk valamit a billenty uzeten, akkor annak eredmnyt rtelemszer uen csak egy beviteli mez oben szeretnnk ltni. A widgetek tbbsge valamilyen lthat mdon is jelzi azt az llapotot, hogy aktulis fkuszban van. Ez az szvegbevitelre szolgl widgetek (GtkEntry, GtkTextView, . . . ) esetn abban nyilvnul meg, hogy a kurzort ltjuk villogni a beviteli mez oben, egyb esetekben ezt egy vkony fekete keret jelzi. A fkusz egyik widgetr ol a msikra trtn o mozgatsra a szoksok mdszer, azaz a tab, illetve a kurzormozgat billenty uk hasznlhatak. Az egyes widgetek kztt trtn o vlts is testre szabhat a GtkContainer set_focus_chain fggvnyvel, de erre valban ritkn lehet szksg.

6.1. bra. Billenty uzet fkusz jelzse a widgeten[6]

Az egyes widgetekre kln-kln engedhet o, vagy tilthat, hogy fkuszba kerlhessenek, a can-focus tulajdonsg lltsval. Az egyes widgettpusok esetben az alaprtelmezs szerinti rtk rendszrint megfelel a cljainknak12 . Ha kdbl szeretnnk tmozgatni a fkuszt az egyik widgetr ol a msikra, vagy csak azt kvnjuk elrni, hogy az ablak megjelentsekor legyen olyan widget ami fkuszban van, akkor a grab_focus fggvnyt kell alkalmaznunk, aminek el ofelttele a can-focus tulajdonsg igaz rtke, azaz fkuszlhatnak kell lennie, ami viszont bizonyos widgetek (pl.: GtkFrame) esetn nem lehetsges. Alaprtelmezett widget esetn csaknem mindig hasznlt tulajdonsg az alaprtelmezett widget. Ez ellenttben a fkusszal, ami inkbb egy logikai tulajdonsg, a felletre nincs, csak a m ukdsre van hatssal. Egy ablakon bell nevb ol is kvetkez oen legfeljebb egy olyan widget lehet, mely rendelkezik ezzel a tulajdonsggal, ez rendszerint a dialgus jvhagy (afrmative) gombja, jellemz oen az Ok gomb.

6.2. bra. Gombok szoksok sorrendje egy dialgusban[6]

Hatsa abban ll, hogy az alaprtelmezett widget vagyis ami esetn a has-default tulajdonsg rtke igaz aktivldik akkor, ha egy egysoros beviteli mez o van fkuszban (GtkEntry) s akkor Entert nyomunk, ez is csak akkor, ha az GtkEntry activates-default tulajdonsga szintn igaz rtk u. Tbbsoros beviteli mez o (GtkTextView) esetn ez nem m ukd okpes, hiszen ott az Enter lenyomsa soremelst jelent. Az alaprtelmezett widgetnek a billenty uzetr ol val hasznlat knyelmesebb ttelben van szerepe, hiszen ha minden szksges mez ot kitltttnk egy dialgusban, akkor nem kell a megfelel o gombig egrrel, vagy Tab billenty u(k) lenyomsval elnaviglnunk, csak egyszer uen az Enter letsre aktivldik az alaprtelmezett widget. Ahhoz, hogy egy widget egyltaln szmtsba kerljn, mint potencilis alaprtelmezett widget, ahhoz el oszr a can-default tulajdonsgnak kell igaznak lenni, ilyen widget tbb is lehet egy ablakon bell, melyek kzl aktulisan alaprtelmezett GtkWidget osztly garb_default fggvnyvel tehetnk egyet, gy annak has-default rtkkel igazz vlik, mg az ablak korbbi alaprtelmezett widgete, mr ha volt ilyen, esetn a tulajdonsg rtke termszetesen hamis lesz.

6.2.4.

Vezrl o elemek

Amennyiben a szksges tartalmi elemeket elhelyeztk az ablakban, a vezrl o elemekkel is hasonlan kell eljrnunk. A klnbz o clokra hasznlt ablakok klnbz o vezrl o elemeket kvnnak meg, amik az egyes tpusokknt er os hasonlsgot mutatnak. Egy f oablak csak kivteles esetekben tartalmaz az eddigiekben trgyalt gombokat, a vezrls ltalban menkkel, a toolbaron elhelyezett gombokkal trtnik (?? bra).
11 Itt 12 Ez

ablak alatt a toplevel s nem a popup ablakokat rtjk. az rtk egy GtkEntry esetn igaz, mg egy Gtkabel esetn hamis alaprtelmezs szerint.

33

(a) F oablak

(b) Dialgus

6.3. bra. Tipikus ablakszerkezetek[6]

A f oablakbl nyl klnbz o cl ablakok, melyek pldul egy adott elem tulajdonsgainak belltsra, egy bonyolultabb funkci lpsenknt trtn o megvalstsra, az alkalmazs egsznek kongurlsra, egy folyamat nyomkvetsre, esetleg a felhasznl informlsra, gyelmeztetsre szolglnak, kzvetlenl, vagy kzvetve a GtkDialog ket. Tipikus plda erre egy elem tulajdonsgainak szerkesztsre hasznlt tpusbl szrmznak, sajt gombsorral ltjuk el o dialgus (?? bra). GtkDialog A C, illetve a Python nyelv u vltozat mutat nmi klnbz osget a C++ vltozathoz kpest a gombok hozzadsnak mikntjben. El obbiek esetn ugyanis tbb gombot is hozzadhatunk egyszerre a dialgoshoz, egyms utn sorolva a button_text s a response_id paramtereket. A paramterlistt a C vltozat esetn NULL rtkkel kell zrnunk, klnben vltozatos programhibkkal fogunk szembeslni, erre a Python esetn nincs szksg, mivel itt a hvott fl tisztban van az tadott paramterek szmval.
GtkWidget * gtk_dialog_add_button ( GtkDialog * dialog , constgchar * button_text , gintresponse_id ); void gtk_dialog_add_buttons ( GtkDialog * dialog , constgchar * first_button_text , ...); Button * Gtk :: Dialog :: add_button ( constGlib :: ustring & button_text , intresponse_id ); Button * Gtk :: Dialog :: add_button ( constGtk :: StockID & stock_id , intresponse_id ); defadd_button (self , text response ): defadd_buttons (self , * args ):

Kdrszlet 6.4. Gombok hozzadsa GtkDialoghoz[6] A vlasztott nyelvi vltozattl fggetlenl igaz, hogy a button_text paramtere vagy az ltalunk vgyott felirat szvege lehet, vagy egy stock ID (Ok gomb esetn pldul GTK_STOCK_OK).

6.4. bra. Egy tipikus gombsor

Egy fenti elrendezs u amgy meglehet osen szokvnyos gombsor az albbi kdrszletekkel hozhat ltre az egyes nyelvek esetn. Az eltrs nem szmottev o, nem tartalmaz semmilyen olyan klnbz osget, ami a korbbiakban mr ne kerlt volna ismertetsre.

34

cancel_button = gtk_dialog_add_button ( GTK_DIALOG ( dialog ), GTK_STOCK_CANCEL , GTK_RESPONSE_CANCEL ); ok_button = gtk_dialog_add_button ( GTK_DIALOG ( dialog ), GTK_STOCK_OK , GTK_RESPONSE_OK ); gtk_widget_grab_default ( ok_button ); help_button = gtk_dialog_add_button ( GTK_DIALOG ( dialog ), GTK_STOCK_HELP , GTK_RESPONSE_HELP );

cancel_button = dialog -> add_button ( Gtk :: Stock :: Cancel , Gtk :: Response :: Cancel ); ok_button = dialog -> add_button ( Gtk :: Stock ::Ok , Gtk :: Response :: Ok ); ok_button -> grab_default(); help_button = dialog -> add_button ( Gtk :: Stock :: Help , Gtk :: Response :: Help );

cancel_button = dialog . add_button ( Gtk . STOCK_CANCEL , Gtk . ResponseType . CANCEL ); ok_button = dialog . add_button ( Gtk . STOCK_OK , Gtk . ResponseType .OK ); ok_button . grab_default (); help_button = dialog . add_button ( Gtk . STOCK_HELP , Gtk . ResponseType . HELP );

Kdrszlet 6.5. Tipikus gombsor hozzadsa GtkDialoghoz[6]

GtkMessageDialog Ltezik a GtkDialog tpusnak egy a gombok hozzadsa szempontjbl rdekes sajtossggal br specializlt vltozata, melyet a felhasznlval trtn o kommunikci cljaira hasznlunk, s mely ennek megfelel oen rendszerint csak az zenet szvegt, illetve a vlasz megadshoz szksges vezrl o elemeket tartalmazza.

(a) Informcis zenetablak

(b) Hiba zenetablak

6.5. bra. Tipikus zenetablakok

Az brkon lthat dialgusokat a szvegezst ol eltekintve csak tpusuk klnbzteti meg egymstl. A bal oldali (??) egy informcis ablak, mg a jobb oldali (??) egy hibadialgus. Az egyik szembetl o klnbsg az ablakok kztt az ikon, amit az zenetablak tpusa hatroz meg. A fenti kt tpuson kvl mg kt sajt ikonnal rendelkez o tpus (question s warning) ltezik, illetve kszthetnk ikon nlkli vltozatot, aminl mdunk van sajt ikon megadsra. Az zenetablak tpus eltrse, vagy inkbb specialitsa a GtkDialog tpushoz kpest nem csak a tpus megadsnak lehet osgre korltozdik. A kifejezetten a szoftver s a felhasznl kztti zenetvlts cljt szolgl widget rendelkezik beptett elemekkel az zenet megjelentsre. A felhasznlval kzlni kvntakat egy els odleges s egy msodlagos (primary-text, secondary-text) rszre bonthatjuk, ahol az el obbi egy rvid, csak a helyzet leglnyegesebb elemit tartalmaz, egy mondatos sszefoglalja a kzlni kvnt informcinak, vagy a javasolt kvnt m uveletnek, mg az utbbi ennek mlyebb, rszletekbe men o kifejtse lersa, ami tjkoztatja a felhasznlt a felmerlt helyzet okairl, esetleges mellkhatsairl. Az esetek tbbsgben a felhasznlnak mr az els odleges szveg elolvasst kvet oen meg kell tudni hoznia dntst, a msodlagos szveg a dnts altmasztsra, az esetleges ktsgek eloszlatsra szolgl. A harmadik specialits a gombok felhelyezsnek mikntje a vezrl o elemek szempontjbl is emltsre mlt. Azzal egytt, hogy dialog tpusnl ismertetett mdszer az rkl ods okn termszetesen itt is hasznlhat, mivel azonban a leggyakrabban hasznlt gombkombincik szma er osen korltos, gy ezek kzl ltrehozskor vlaszthatunk. Lehetsges rtkek eredmnyeknt vagy egyedliknt a Bezrs, Ok, Mgse gombok, vagy a Ok/Cancel, Igen/Nem prosok kerlnek a dialgusra.

35

GtkWidget * gtk_message_dialog_new ( GtkWindow * parent , GtkDialogFlags flags , GtkMessageType type , GtkButtonsType buttons , constgchar * message_format , ...)G_GNUC_PRINTF (5, 6); GtkWidget * gtk_message_dialog_new_with_markup ( GtkWindow * parent , GtkDialogFlags flags , GtkMessageType type , GtkButtonsType buttons , constgchar * message_format , ...)G_GNUC_PRINTF (5, 6);

explicit MessageDialog ( constGlib :: ustring & message , booluse_markup = false , MessageTypetype = MESSAGE_INFO , ButtonsTypebuttons = BUTTONS_OK , boolmodal = false );

def__init__ (self , parent =None , flags =0, message_type = Gtk . MessageType .INFO , buttons = Gtk . ButtonsType .NONE , message_format =None , ** kwars ):

MessageDialog ( Gtk :: Window & parent , constGlib :: ustring & message , booluse_markup = false , MessageTypetype = MESSAGE_INFO , ButtonsTypebuttons = BUTTONS_OK , boolmodal = false );

Kdrszlet 6.6. MessageDialog ltrehozsa A C, illetve a Python nyelv u vltozatok, ellenttben a C++-os megvalstssal nem egyetlen paramterknt vrjk az zenetablak els odleges szvegt, hanem egy printf-stlus formtumlert s az annak megfelel o paramtereket vesznek t. Ennek tpusbiztossgrl a C vltozat esetn a G_GNUC_PRINTF makr gondoskodik, mr amennyiben a GNU C fordtt hasznljuk. Ebben az esetben fordtsi idej u gyelmeztetst kapunk ha paramtereink nem felelnek meg a formtumlerban megadottaknak.

6.2.5.

Megjelents

Tbb lehet osg knlkozik, ha egy ablakot, illetve annak tartalmt szeretnnk megjelenteni. Hasznlhatjuk egyrszr ol, a GtkWidget, a GtkWindow, illetve a GtkDialog tpus ltal adott mdszereket. GtkWidget A korbban (??) mr trgyalt show fggvnyt, ami megjelenti a windowt, de csak a windowt, annak gyerekeit nem. Lvn a window egy kontner tpus, helyezhetnk el tovbbi widgeteket benne, amiknek a megjelentsr ol vagy mr korbban gondoskodnunk kell mondjuk egy show hvssal , vagy megtehetjk a szl o s az sszes gyerek megjelentst egyszerre a show_all (??) fggvnnyel. GtkWindow Egy ablak esetn nem csupn a puszta megjelents lehet szempont, hanem az is, hogy a felhasznl az ablakot szre is vegye. Ez az estek tlnyom tbbsgben adott, hiszen valamilyen felhasznli interakci rvn jelenik meg az j ablak. Ha viszont nem err ol van sz akkor szksges lehet az megjelentsen tl ms ablakok ltali takars megszntetsre, a tlcrl val felhozatalra, az aktulis desktopra trtn o mozgatsra, a fkusz (6.2.3) tadsra, mely m uveletek mind fgghetnek mind a platformtl, mind az ablakkezel ot ol, mind pedig a felhasznli belltsoktl. Erre hasznlhat a present fggvny. Kezeljk azonban kell o vatossggal ezt a fggvnyt, hiszen mindannyian bosszankodtunk mr egy kell o indok nlkl, vratlanul megjelen o ablak miatt. GtkDialog Egy window tpus ablak esetn mivel jellemz oen nincsenek az ablakon gombok s nem modlisak nincs igazn szksgnk arra, hogy a kd futsnak szempontjbl helyben kivrjuk a felhasznl reakcit. A dialog tpus ezzel szemben ltalban egy felhasznli interakci rvn jelenik meg (pl.: egy elem tulajdonsgait, vagy az applikci belltsait szerkeszt o ablak) s jelent os rszben valamilyen dnts el lltja a felhasznlt (klnsen igaz ez az zenet ablakoknl, ahol krst tesznk fel), melynek eredmnyr ol szeretnnk rteslni. A GtkDialog tpus run fggvnye ahogy azt a kvetkez oekben (6.2.7) rszletesen is trgyaljuk pontosan ezt a clt szolglja. Egyrszr ol vrakozik a felhasznl interakci amihez termszetesen szksges a main loop futtatsa majd visszatrsi rtkknt az ablak futtatsnak eredmnyt, vagyis a kivlasztott vezrl o elem az ablak elksztsekor megadott response id-t adja vissza. Mint lthat, a fggvny nem kifejezetten a dialgus megjelentst szolglja, az hasznos mellkhatsknt mgis megtrtnik.

6.2.6.

Bezrs

A window teht leginkbb a bezrs kapcsn llt kihvst elnk, melyet fgg oen attl, mit szeretnnk elrni annak hatsra, hogy a felhasznl az ablak bezrst kezdemnyezte, tbb lehetsges megolds, az egyes megoldsokra, pedig tbb mdszer is knlkozik.

36

Blokkols Kezdjk a legegyszer ubbnek ltsz esettel, vagyis azzal, hogy semmilyen hatsa ne legyen annak ha felhasznl az ablak bezrst kezdemnyezi. Nyilvn megfontoland, hogy ezt tegyk, hiszen a felhasznl sem vletlenl akarja, amit akar, de ha mondjuk azt szeretnnk kiknyszerteni, hogy a f oablakunkbl csak a Fjl menpont Kilps almenpontjra kattintva lehessen bezrni, akkor ez egy lehetsges megolds13 . A feladat megoldsa a korbban (??) mr trgyalt delete-event szignl kezelsben rejlik. Ahogy arrl sz esett ez a szignl vltdik minden ablakon (toplevel window), illetve minden az ablakban lv o widgeten, mikor a felhasznl az ablak bezrst kezdemnyezi. A szignl kt kln emltsre is mlt sajtossggal is rendelkezik: 1. A szignlt kezelni kvn fggvnynek egy bool rtkkel kell visszatrnie, ami azt jelzi a GTK fel, hogy az adott fggvny kezelte-e az esemnyt, egyszersmind nincs szksg a tovbbi kezel o fggvny meghvsra. A GTK kvetkezskpp addig hvja sorra az szignlra feliratkozott fggvnyeket (signal handler) kztk ha van ilyen, akkor az alaprtelmezett szignlkezel o fggvnyt (default signal handler) amg egyikk true rtkkel nem tr vissza. 2. Ha minden ilyen fggvny false rtkkel tr vissza, azaz a szignl tovbbi propaglst kri a GTK -tl, akkor konkrtan a delete-event esetben a GDK alaprtelmezett esemnykezel oje (default event handler) fut le, ami meghvja az ablak destruktort. Fentiek alapjn ahhoz, hogy megel ozzk az ablak bezrst vagyis hogy ne trtnjen semmi el kell rnnk, hogy az alaprtelmezett esemnykezel o ne hvdjon meg, azaz az ltalunk felkttt szignlkezel o true rtkkel kell hogy visszatrjen, jelezve azt, hogy az esemnyt kezeltk, a tovbbi szignlkezel o fggvnyek meghvsra nincs szksg. Ebben az esetben ez azt is jelenti, hogy az alaprtelmezett esemnykezel o sem hvdik meg. Ehhez denilnunk kell a szignlkezel o fggvnyeket, ami a korbbi (6.3. kdrszlet14 ) pldt kiegsztve az albbihoz hasonl mdon tehetnk meg,
2 3 4 5 6 7 8 9 10 11 12

# include <iostream > gboolean on_delete_event ( GtkWidget * widget , GdkEvent *event , gpointeruser_data ) { g_print (" on_delete_event \n"); returnTRUE ; } } bool on_delete_event ( GdkEventAny * event ) { std :: cout<< " on_delete_event " << std :: endl ; returntrue ; print (" on_delete_event ") returnTrue defon_delete_event ( widget , event ):

2 3 4 5 6 7 8 9 10 11 12

Kdrszlet 6.7. Szignlkezel o fggvny perzisztens ablakhoz majd ezeket a fggvnyeket a delete-event szignlra be is kell ktnnk15 .
12 13

g_signal_connect ( G_OBJECT ( window ), " delete event ", G_CALLBACK ( on_delete_event ), NULL );

window . signal_delete_event (). connect ( sigc :: ptr_fun ( on_delete_event ));

window . connect (" delete event ", on_delete_event )

12 13

Kdrszlet 6.8. Szignlkezel o fggvny bektse perzisztens ablakhoz Ha az adott szignl alaprtelmezett szignlkezel o fggvnnyel is rendelkezik ami a widget osztly-lerjban kerl megadsra s magunk akarjuk a szignlt kezelni, akkor szksgess vlik, hogy a sajt kezel o fggvnynk mg az alaprtelmezett el ott hvdjk meg, ami tovbbi praktikk bevetst ignyli, amir ol egy msik rszben esett rszletesebben sz. Ha a sajt szignlkezel o fggvny rst kiss tlznak talljuk egy olyan egyszer u feladat elltsra, mint egy true rtkkel val visszatrs, akkor nem tvednk, s ot a GTK+ fejleszt oi is gondoltak erre s megalkottk a gtk_true, illetve a gtk_false nev u fggvnyeket, melyek semmi egyebet nem tesznek, mint a nevknek megfelel o rtkkel trnek vissza, gy a fenti plda szignlkezel o fggvnyei elhagyhatk, hiszen azok GTK+ ltal adott ekvivalens funkcij fggvnyekkel helyettesthet oek.
g_signal_connect ( G_OBJECT ( window ), " delete event ", G_CALLBACK ( gtk_true ), NULL );

Kdrszlet 6.9. Egyszer ustett szignlkezel o fggvny bektse


13 Ne becsljk azonban al se a felhasznli tallkonysgot, se a felhasznli krnyezetek vltozatossgt. Semmikpp ne hagyatkozzunk arra, hogy egy adott mdszer a felhasznl szmra vlemnynk szerint nem rhet o el. 14 A sorszmozs az eredeti pldba val beilleszts pontjt mutatja. 15 A sorszmozs az eredeti pldba val beilleszts pontjt mutatja.

37

Eltntets Folytassuk msodikknt azzal az eshet osggel, ha el szeretnnk tntetni az ablakot, aminek a bezrst a felhasznl kezdemnyezte. Az el oz o szitucihoz hasonlan most is tbb mdszer addik a feladat megoldsra. A fent trgyalt perzisztens ablakot eredmnyez o szignlkezel ok (6.7. kdrszlet) ismeretben a legnyilvnvalbb megolds, hogy mg miel ott visszatrnnk az adott fggvnyekb ol a hide fggvny segtsgvel eltntetjk az adott ablakot. A megolds j s m ukd okpes megolds lehet, ugyanakkor szmolnunk kell azzal, hogy az ablak csak elt unik, de nem felttlenl semmisl meg. A mr korbban is hasznlt minimlis plda azon kiegsztst is gyelembe vesszk, ahol a delete-event szignlra a main loop futst megszakt fggvnyt hvjuk, akkor azt fogjuk tapasztalni, hogy az ablakunk elt unik ugyan, de a mgttes m ukds mr nagyban attl fgg a kt implementcit (6.7. kdrszlet) miknt vontuk ssze. Ha a sajt szignlkezel o fggvnynket ktjk be el obb a delete-event szignlra, akkor az a visszatrsi rtke rvn lelltja a szignl tovbbi kezelst, vagyis a szignlkezel o fggvnyek sornak meghvst is, gy az ablak a sajt kezel o fggvnynk (on_delete_event), a hide hvssal kiegsztve eltnteti az ablakot, de a kvetkez o szignlkezel o ami kilptetn a main loopot mr nem hvdik meg. Ha a felkts sorrendje fordtott, akkor el obb kilp a main loop s csak ezutn hvdik meg sajt fggvnynk, ami egyrszr ol elrejti az ablakot, msrszr ol blokkolja a tovbbi kezelst, aminek vgs o soron nem lehet hatsa, hiszen a main loop mr kilpett. Amennyiben a clunk csupn az ablak eltntetse egyszer ubben is elrhetjk ugyanezt, hiszen a hide fggvny kzvetlenl pontosabban egy beptett GTK+ keresztl is bekthet o a delete-event szignlra. Ezt knyelmi funkcit a gtkmm esetn elvesztjk hasonlan az el oz o pldhoz , mivel az ltalunk hasznlni kvnt szignlkezel o fggvny deklarcija nem egyezik meg az el orttal, gy teht ezt a knyelmet a tpusbiztossg oltrn fel kell ldozni.
g_signal_connect_swapped ( G_OBJECT ( window ), " delete event ", G_CALLBACK ( gtk_widget_hide_on_delete_event ), window );

Kdrszlet 6.10. Egyszer ustett szignlkezel o fggvny bektse Ha nem ragadunk le a knnyen rthet o, m nem tl letszer u minimlis pldnknl, akkor az mondhat el, hogy ablakokat legyenek azok GtkWindow, vagy GtkDialog tpusak , valamilyen felhasznli interakcira reaglva hozunk fel, valamilyen kezel o fggvnyben. Az bezrskori elrejts akkor lehet hasznos szmunkra, ha nem akarjuk jra s jra elkszteni az ablakot az adott felhasznli m uveletre. Erre lehet plda mondjuk egy nvjegy (about) ablak, aminek a tartalma nem vltozik a program futsa sorn, gy azt az alkalmazs indulsakor, vagy az els o megtekintskor ltrehozzuk, utna mr elegend o csak elrejteni, vagy jra megjelenteni. Msik plda lehet egy sttusz jelleg u informcikat megjelent o ablak, amiben gymond gy ujteni tudjuk az adatokat s ha a felhasznl be is zrja az ablakot, mi az elrejts utn az adatgy ujtst s az ablak tartalmnak frisstst tovbb fojtatjuk, majd az jbli megjelentskor mr a napraksz informcik jelennek meg. Megszntets Mint az a fentiekb ol mr kiderlt fggetlenl attl, hogy GtkWindow, GtkDialog, vagy ezekb ol szrmaz tpusokrl van-e sz , a delete-event szignl kivltdst ha egyebet nem tesznk az ablak destruktornak meghvs fogja automatikusan kvetni, ami az esetek tlnyom tbbsgben meg is felel a cljainknak.

6.2.7.
Szinkron

Esemnykezels

A GtkDialog s a GtkWindow tpusok kztti eltrsek (6.2.4) kzl a legszmottev obb mivel ehhez tartozik a legtbb beptett szolgltats , a vezrl o elemek, azaz a gombok kezelse. A GtkDialog nem csupn arra ad lehet osget, hogy a gombokat egy erre a clra kszlt kontnerbe helyezzk el ezt magunk is megtehetnnk minden klnsebb er ofeszts nlkl , hanem az ezeken vgzett felhasznli interakcikat is egyszer uen nyomon kvethetjk. Vlaszthatunk az adott (kd)krnyezetben szmunkra knyelmesebb szinkron, illetve aszinkron esemnykezels kzl. El obbi esetn helyben16 tudjuk kezelni az esemnyeket, utbbi viszont esemnykezel o fggvnyek megrst s bektst teszi szksgess.
16 Az

ablak ltrehozsnak helyn.

38

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

# include <gtk / gtk .h> int main ( int argc , char * argv []) { GtkWidget * dialog ; gtk_init (& argc ,& argv ); dialog = gtk_dialog_new(); gtk_dialog_run ( GTK_DIALOG ( dialog )); return 0; }

# include <gtkmm .h> int main ( int argc , char * argv []) { Gtk :: Main kit (argc , argv ); Gtk :: Dialogdialog ; dialog . run (); return 0; }

from gi. repositoryimportGtk if __name__ == " __main__ ":

dialog = Gtk . Dialog () dialog . run ()

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Kdrszlet 6.11. Miniml plda GtkDialoghoz A run fggvny (12.) egyrszr ol fggvnyeket kt be a szksges szignlokra (response, unmap, delete-event, destroy), majd egy sajt main loopot futtatsn bell kezeli az emltett esemnyeket. Ha ezek kzl brmelyik bekvetkezik, akkor a main loop futsa megszakad, s a run fggvny a megfelel o rtkkel visszatr. Ennek kezelse tipikusan egy if, vagy egy switch szerkezeten bell trtnik. Ha a fenti minimlis pldt a korbbi, gombok hozzadst tartalmaz forrssal (6.5. kdrszlet) egsztjk ki17 , mondjuk az albbihoz hasonl mdon kezelhetjk a felhasznli dnts eredmnyeknt kapott vlaszt (response).
12 13 14 15 16 17 18 19 20 21 22

gintresult = gtk_dialog_run ( GTK_DIALOG ( dialog )); switch ( result ) { caseGTK_RESPONSE_OK : do_application_specific_something(); break ; default : do_nothing_since_dialog_was_cancelled(); break ; } gtk_widget_destroy ( dialog );

intresult = dialog . run (); switch ( result ) { case Gtk :: RESPONSE_OK : do_application_specific_something (); break ; default : do_nothing_since_dialog_was_cancelled (); break ; }

result = dialog . run () if result == Gtk . ResponseType .OK: do_application_specific_something () else : do_nothing_since_dialog_was_cancelled ();

12 13 14 15 16 17 18 19 20 21 22

Kdrszlet 6.12. Miniml plda GtkDialoghoz Itt az egyszer usg kedvrt csak az Ok, illetve a tbbi gomb kerltek megklnbztetsre, gy ha a Mgse, illetve a Sg gomb aktivldott, akkor is a switch szerkezet default ga (18) fut le. Krds azonban, hogy ha az imnt megismert delete-event szignl vltdik ki az ablak bezrdsnak hatsra, annak mi lesz az eredmnye. A vlasz egyszer u, hiszen a switch els o gra (15) nem futhatunk r, teht marad itt is a default g. Ha kln szeretnnk kezelni ezt az esetet, akkor a RESPONSE_DELETE_EVENT konstans kezelsre kell egy j gat beillesztennk. Nem minden esetet fedtnk azonban le, elkpzelhet o ugyanis, hogy a dialg felszabadul, mg a run fggvny fut. Ebben az esetben a visszatrsi rtk RESPONSE_NONE lesz, gy ezt az esetet is meg lehet klnbztetni a tbbit ol, azonban mgsem tancsos. Helyette, ha mindenkppen meg akarjuk szaktani a run futst, akkor a resposne fggvnyt hvhatjuk, aminek eredmnyeknt a run a resposne-nak paramterknt tadott rtkkel tr vissza. Az lelmesebbek meggyelhetik, hogy dialog pldaprogrambl (6.11. kdrszlet) a window hasonl pldjhoz (6.3. kdrszlet) kimaradt a show fggvny hvsa, ami annak tudhat be, hogy a run ezt megteszi helyettnk, ahogy a dialgusunkat is modliss teszi a run futsnak idejre. Aszinkron Ha valamilyen oknl fogva lemondank a run adta knyelemr ol, lehet osgnk van az aszinkron kezelsre. Ebben az esetben a run helyett a show fggvnyt hvjuk, illetve egy sajt fggvnyt melyben elvgezzk a szmunkra szksges m uveleteket ktnk be a response szignlra. Ezt a mdszert hasznlva ebben a fggvnyben kell gondoskodnunk az ablak felszabadtsrl is, mr amennyiben nem csak a delete-event esemny hatsra szeretnnk, hogy ez megtrtnjen. A response szignl paramterei kztt a response_id is szerepel, gy a fggvny tartalma hasonl lehet a run hvst kvet o kdhoz (6.12. kdrszlet). M ukdsben azonban van nmi klnbsg, hiszen a delete-event alaprtelmezett m ukdsnek megvltoztatsra pldul nincs md. Az aszinkron a megoldsra lehet egy msik plda, ha a lehetsges vlasztsok mindegyike ugyanazzal az eredmnnyel kell jrjon, pldul be kell zrdjon az ablak. Ennek olyan leginkbb helyzetekben van realitsa, ahol csupn egy (pl.: Bezrs) gomb jelenik meg az ablakon. Erre lehet plda egy olyan zenetablak (MessageDialog), amiben nem egy krdst tesznk fel, hanem csupn informljuk a felhasznlt.
g_signal_connect_swapped ( G_OBJECT ( dialog ), " response ", G_CALLBACK ( gtk_widget_destroy ), dialog );

Kdrszlet 6.13. Egyszer ustett response-kezel o fggvny bektse


17 A

vltozk deklarciinak hozzadsa szksges a fordthatsg rdekben.

39

6.2.8.

Sajt esemnykezel o

Ha a fentiekben vzoltak valamilyen oknl fogva nem elgtenk ki ignyeinket, vagy mr egybknt is alkalmasabb md sosztly esemnykezel szernek ltszik egy sajt widget implementlsa akkor nem kell egyebet tennnk, minthogy az o o fggvnyt felldeniljuk a nyelvi vltozatnak megfelel o mdon.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

staticgboolean my_window_delete_event ( GtkWidget * widget , GdkEventAny * event ) { returnTRUE ; } staticvoid my_window_class_init ( MyWindowClass * class ) { GtkWidgetClass * widget_class ; widget_class = ( GtkWidgetClass*) class ; widget_class -> delete_event = my_window_delete_event ; }

classMyWindow ( Gtk . Window ): classMyWindow : publicGtk :: Window { (self , widget , event ): virtualboolon_delete_event ( GdkEventAny * event ) defon_delete_event Gtk . main_quit () { returntrue ; } };

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

Kdrszlet 6.14. Esemnykezel o felldenilsa sajt widgetosztlyban Az objektum-orientlt megvalstsok esetn ez egy lnyegesen kisebb er ofesztst ignyl o feladat. Ahogy ezt a fenti kdrszlet is mutatja a C vltozatbl pp csak a leglnyesebb rsz emelhet o ki egy j tucatnyi sorban18 , addig a csaknem teljes rtk u C++, Python kdok ennek a felt sem teszi ki.

6.3.

Platformfgg o sajtossgok

Br a GTK a GDK 19 , illetve a Glib fggvnyknyvtrakon keresztl komoly platformfggetlensget biztost, mgis szmolnunk kell a klnbsgekkel, klnsen az ablakok kezelse kapcsn. Ezek kzl itt csak a kt legfontosabbat emeljk ki.

6.3.1.

Ablakkezel o

Bizonyos rtelemben maga a az ablakkezel o is egy platform, hisz ahogy az opercis rendszerek a t olk elvrt funkcikat mint amilyen pldul a fjlkezels a maguk mdjn valstjk meg, gy az ablakkezel o rendszerek is sajt szisztmjuk szerint teszik ezt. Bizonyos funkcik csak nhny ablakkezel o implementl, addig msokat csaknem minden ilyen rendszer megvalst, br arra nem szmthatunk, hogy az egyes megvalstsok minden rszletben megegyeznek. Az ablakkezel ok klnbz osgei fejlesztsi oldalrl azzal a kvetkezmnnyel jrnak, hogy mg akkor is szembe kell nznnk a platformok sajtossgai ltal okozott nehzsgekkel, ha egybknt alkalmazsunkat nem hasznljuk tbb klnbz o20 opercis rendszer alatt. Mg az olyan egyszer u s szles krben megvalstott funkcik kapcsn, mint amilyen maximalizls, vagy a minimalizls (maximize, iconify) ktelkednnk kell a mgttes implementci megltben, illetve gyelembe kell vennnk az egyes megvalstsok klnbz osgeit, vagyis nem alapozhatunk ezen fggvnyek meghvst kvet oen arra, hogy az ablak abba az llapotba kerl, amire szmtottunk. Akr az el obbiek emltett funkcikra, akr mondjuk az ablak el otrben tartsra (keep_above), akr teljes kperny omretre nagytsra (fullscreen), akr az sszes munkaterlet (desktop) val egyszerre trtn o meg megjelentsre (stick) krjk az ablakkezel ot, nem bizonyos, hogy krsnk teljesl. Ennek csak az egyik oka az, hogy az ablakkezel o nem tmogatja az adott funkcit, a msik pedig, hogy krsnket kvet oen valaki ms az el oz o, vagy ppen mindkett ot ol eltr o llapot llt be. Ennl fogva gyelnnk kell arra, hogy egy ilyen helyzetre programunk fel legyen kszlve. Az ablak dekorcija a msik olyan terlet, ahol krseket (hint) intzhetnk az ablakkezel o fel. Hasonlan azonban a fent trgyaltakhoz itt is igaz, hogy clszer u ellen orizni felttelezseinket arra vonatkozlag, hogy krsnk gy s abban a formban hajtdik vgre, ahogy azt mi elgondoltuk. Szmos olyan eset lehetsges az ablak dekorcijn tallhat bezr gomb megjelentsnek tiltstl (deletable), az ablak taskbarbl trtn o kihagysig (skip_taskbar_hint) melynek implementcis rszletei teljes egszben az ablakkezel ot ol fggenek.

6.3.2.

Vezrl o elemek

A GTK alaprtelmezs szerint a gombokat a GNOME Human Interface Guideline[6] (HIG) ltal javasolt elrendezst alkalmazza, vagyis a jvhagy (afrmative) gomb a jobb oldalon a szls o pozciba kerl, mg a menekl o gomb (cancel) ett ol balra kerl. Ha eltr o gymond alternatv elrendezst szeretnnk, akkor azt a set_alternative_button_order fggvny segtsgvel egy korbbi pldt (6.5. kdrszlet) kiegsztve az albbi mdon llthatjuk be.
teljes C kd egy ?? soros .c, illetve egy ?? soros .h llomnybl ll. Drawing Kit 20 Ebben a tekintetben a Linux alap rendszereket kzel azonosnak tekinthetjk
19 GIMP 18 A

40

gtk_dialog_set_alternative_button_order ( GTK_DIALOG ( dialog ), GTK_RESPONSE_OK , GTK_RESPONSE_CANCEL , GTK_RESPONSE_HELP , -1);

dialog . set_alternative_button_order_from_array ( intalt_resp [] = { Gtk :: RESPONSE_OK , Gtk :: RESPONSE_CANCEL , Gtk :: RESPONSE_HELP }; size_talt_resp_size = sizeof ( alt_resp ) / sizeof ( int ); std :: vector <int > alt_resp_vector ( alt_resp , alt_resp + alt_resp_size ); dialog -> set_alternative_button_order_from_array ( alt_resp_vector ); [ Gtk . ResponseType .OK , Gtk . ResponseType . CANCEL , Gtk . ResponseType . HELP ] )

Kdrszlet 6.15. Alternatv gombsorrend belltsa Amennyiben az zenetablakoknl megismert (6.2.4) pros gombok (Ok/Cancel, Igen/Nem) valamelyikt hasznljuk, akkor ezt a sorrendlltst a GTK megteszi helyettnk.

6.4.
6.4.1.

A kd
Fordts s linkels

A korbbiakhoz hasonlan az albbi parancssorok segtsgvel fordthatak programjaink.


gcc gtk_sourcefile.c -o gtk_binary pkg-config --cflags --libs gtk+-3.0 g++ gtkmm_sourcefile.cc -o gtkmm_binary pkg-config --cflags --libs gtkmm-3.0

6.4.2.

Futtats

A futtatssal ezttal is a forrsfjlok egyszersmind a fordts knyvtrban rdemes prblkoznunk, a pldaprogram nevt ol fgg oen a ./futtathat_binris parancs kiadsval.

6.4.3.

Eredmny

Brmily hihetetlen ezttal sem trtnik semmi egyb, mint a korbbiakban. Remlhet oleg azonban a klnbsg mgis rzkelhet o annyiban, hogy legutbb a meglepetssel teli borzongst ablakunk vratlan felbukkansa, mg most a bennnk szikraknt felvillan megrts okozza.

6.5.
6.5.1.

Tesztels
Keress

Applikci keresse Fejleszts kzben mr amennyiben a felhasznli felletet kdbl s nem egy fellettervez o program segtsgvel hozzuk ltre az egyes widgetek ltrehozskor mdunkban ll egyttal valamilyen vltozval hivatkoznunk rjuk, gy a ks obbiekben nincs szksgnk arra, hogy az egyes widgeteket a felhasznli felleten bell keresgessk. Tesztelskor ugyanakkor a felletet kszen kapjuk gy az els o feladat azon elemek megtallsa, amiken ks obb valamilyen m uveleteket szeretnnk vgezni.
classGtkDemoTest ( unittest . TestCase ): defsetUp ( self ): fromdogtailimportutils self . pid = utils . run (gtk3 demo ) self . app = procedural . focus . application (gtk3 demo ) classGtkDemoTest ( unittest . TestCase ): defsetUp ( self ): fromdogtailimportutils self . pid = utils . run (gtk3 demo ) self . app = tree . root . application (gtk3 demo )

Kdrszlet 6.16. Alapvet o elemek keresse teszt tree, illetve procedural API hasznlata mellett Ahogy az a korbbi minimlis tesztelsi pldban is ltszott az els o lps a tesztels sorn, hogy a kvnt applikcit megtalljuk a sok egyb fut alkalmazs kztt. Ha ezzel megvagyunk, akkor az applikcin bell kereshetjk meg annak ablakait, azokon bell pedig az egyes widgeteket. El obbire a clra szolgl a Dogtail tree moduljnak application fggvnye. A fggvny mindssze egy paramter vesz t, a keresett applikci nevt. Ez a nv jellemz oen br nem minden esetben megegyezik annak az applikci indtshoz futtatott llomny nevvel. Mint a ks obbekben is csaknem mindig, a ksrletezs segt leginkbb az applikci feldertsben, a keresshez hasznland nevek meghatrozsban. Ehhez egyrszr ol hasznlhatjuk a korbban mr emltett Accercisert, ami voltakppen egy grakus felhasznli fellet, ami az akadlymentesthez hasznlt API ltal megszerezhet o informcikat jelenti meg struktrlt formban. Msrszr ol hasznlhatjuk a Dogtailt, a konkrt esetben a Root osztly applications fggvnyt, ami az sszes az accessibilty alrendszer szmra lthat applikcival tr vissza.

41

Az application fggvny a tree modul Application osztlynak egy, az applikcihoz tartoz pldnyval tr vissza, vagy ha az applikcit az jraprblkozsokat kvet oen melyek szmt a Config osztly searchCutoffCount tulajdonsga, mg a prblkozsok kztt tartand sznet mrtkt ugyanezen osztly searchBackoffDuration tulajdonsga hatroz meg nem tallja SearchError kivtelt dob. ltalnos keress A findChild fggvny els o paramtere egy felttelhalmaz (predicate). Amennyiben a keress sorn ennek a falttelhalmaznak megfelel o elemet tallunk a kzvetlen vagy kzvetett leszrmazottak kztt fgg oen a recursive paramter rtkt ol , akkor a fggvny az els o ilyennel visszatr. Amennyiben nem tall megfelel o elemet s a retry paramter rtke True, akkor jra prblkozik a config objektumban foglalt belltsoknak megfelel oen. Amennyiben a retry rtke False rtelem szer uen sszesen egy prblkozs trtnik. Ha a requireResult paramter rtke True, akkor SearchError kivtelt dob, ha nem akkor egyszer uen None rtkkel tr vissza. Megjegyzend o, hogy mindkt paramter alaprtelmezett rtke True, azaz a Dogtail tbbszr is prblkozik s sikertelensg esetn SearchError kivtelt dob.
classGenericPredicate ( Predicate ): def__init__ (self , name = None , roleName = None , description = None , label = None , debugName = None ):

Kdrszlet 6.17. Node keresse GenericPredicate, illetve findChild fggvny segtsgvel Ahogy ltszik a findChild fggvnynek tadott GenericPredicate objektum voltakppen a keressi feltteleket zrja egy egysgbe. Ezek a felttelek a nv (name), a szerep neve (roleName) , lers (description), illetve felirat (label). A m ukdsr ol fontos megjegyezni, hogy a felttelhalmazban az utols felttel (label) el onyt lvez a tbbivel szemben, vagyis amennyiben ezt felttelt megadjuk a msik hrom nem rvnyesl. Ha viszont csak az els o hrom paramter hasznljuk azok egymssal s kapcsolatba kerlnek, vagyis csak olyan elem lehet a keress eredmny, ami minden felttelnek megfelel. A felttelhalmazban megadott paramterek rtkeinek ksrleti ton meghatrozst a mr tbb alkalommal emltett Accerciser alkalmazs tud segteni. Egyrszr ol megjelenti az egyes applikcikat, azok ablakait, illetve a tovbbi gyerekelemeket fa hierarchiba szervezve. Msrszr ol az egyes amik mind egy-egy Node tpus objektumot jelentenek kapcsn megmutatja mik az objektum tulajdonsgi, llapotai, a rajta vgrehajthat akcik. Termszetesen a ks obbiekben az egyes widgettpusok ismertetsekor ezen rtkekre mi is ki fogunk trni. Az ltalnos keress szempontjbl az imnt emltett nhny paramter, illetve a Node osztly ezeknek megfelel o paramterei rdemlegesek. A nv attribtum (name) a widget tpustl amit a role, illetve annak szveges formja a roleName reprezentl , fgg oen vesz fel rtket. Ablakok esetn annak cmsort, cmkk esetn azok szvegt, olyan widgetek esetn, amikhez cmkt kapcsoltunk szintn a cmke szvegt. A nevek felvett rtkeinek rszleteire, valamint a tpusnevekre az egyes widgettpusok trgyalsakor trnk. Maga a nv explicit mdon is bellthat a GTK, pontosabban az ATK rvn, hiszen ez utbbi interfszen keresztl trtnik az accessibilty rteggel trtn o kapcsolattarts. Minden GtkWidget objektumhoz tartozik egy AtkObject objektum, amit a get_accessible fggvny segtsgvel krhetnk. Az AtkObject a set_name fggvny rvn adhat olyan nv, amire a Dogtail hasznlata sorn is hivatkozni tudunk. A mr emltett Predicate osztlynak pldnyait felhasznlhatjuk arra is, hogy csupn annyit tudjuk egy adott Node gyerekeknt, ami megfelel a predicate ltal megfogalmazott felttelhalmaznak. Ehhez a Predicate osztly satisfiedByNode fggvnyt kell hvnunk, arra azzal a Node objektummal paramterknt, amire a vizsglatot el szeretnnk vgezni. Egy adott Node objektumrl ugyanez a dnts a satisfies fggvny hvsval hozhat meg aminek viszont a predicate a paramtere. Specializlt keress Ltezik szmos specializcija, leszrmazottja a Predicate osztlynak, amik a gyakran hasznlt keressek egyszer ustsre szolglnak. Ezek kzl minden rszben azokat vesszk sorra, amik az adott rsz szempontjbl rdekesek. Itt teht az applikcik s ablakok keressre szolglok szrmaztatsokat ismertetjk. Applikci. A Root osztly application fggvnye az Application osztly a tree modul Node osztlybl szrma se, melyet egy keress eredmnyeknt visszakaphatunk (Application, zik, ami gyakorlatilag minden olyan osztlynak o Root, Window).
defapplication (self , appName ): returnroot . findChild ( predicate . IsAnApplicationNamed ( appName ), recursive = False )

Kdrszlet 6.18. Applikci keresse application fggvnnyel, illetve IsAnApplicationNamed objektummal Ahogy ltszik az application fggvny nem ms, mint egy specializci, ami tulajdonkppen Node osztly findChild ltalnos keres ofggvnyt hvja paramterknt egy IsAnApplicationNamed osztly egy objektumval, ami a Predicate osztlybl szrmazik s pldnyostskor a keresend o applikci nevt veszi t paramterknt.

42

Ablak. Hasonlan az applikci keresshez az ablakok keressre is ltezik a Predicate osztlybl szrmaz sajt osztly. Mind a IsAWindowNamed, mind a IsADialogNamed konstrulshoz csak az ablak cmsort kell megadnunk. A kt kln osztlyra mindssze azrt van szksg, mert a GtkWindow s a GtkDialog tpusok a Dogtail reprezentci ms roleName rtkkel rendelkeznek (frame, dialog), ahogy az a egyezst vizsgl fggvnnyek implementcijbl is ltszik.
classIsAWindowNamed ( Predicate ): def__init__ (self , windowName ): ... def_genCompareFunc ( self ): defsatisfiedByNode ( node ): returnnode . roleName == frame andstringMatches ( self . windowName , node . name ) returnsatisfiedByNode classIsADialogNamed ( Predicate ): def__init__ (self , dialogName ): ... def_genCompareFunc ( self ): defsatisfiedByNode ( node ): returnnode . roleName == dialog andstringMatches ( self . dialogName , node . name ) returnsatisfiedByNode

Kdrszlet 6.19. Ablak keresse specializlt Predicate objektummal

6.5.2.

Sttuszok

Az ablakok kapcsn fggetlenl attl, hogy GtkWindow, vagy GtkDialog tpusrl van sz van nhny tulajdonsg, amit ebben a rszben a fejlesztsi oldalrl mr trgyaltunk s most a visszaellen orzskre is kitrnk. Az sttuszok alapvet oen kt rtk uek s mint ilyenek egy llapot halmazt alkotnak, ami egy adott Node objektumra egy adott pillanatban jellemz o. Ez az llapot-, vagy sttuszhalmaz a getState fggvny segtsgvel krdezhet o le, majd ezt kell megvizsglnunk, hogy a szmunkra aktulisan rdekes llapot rsze-e a halmaznak.
@property defstatename ( self ): returnself . getState (). contains ( pyatspi . STATE_STATENAME )

Kdrszlet 6.20. Node sttuszvizsglathoz szksges fggvny smja Ltezik nhny olyan a ks obbiekben rszletezett sttusz, amikre a Node osztly implementlja a megfelel o lekrdez o fggvnyt, azon esetekben azonban, ahol ez nem ll rendelkezsre magunknak kell a megoldsrl gondoskodnunk. Az ablakok szempontjbl az tmretezhet osg (resizable), a modalits (modal), valamint az az llapot, hogy a vizsglt ablak aktulisan az aktv ablak (active) ablak-e az rdemleges llapotok.

6.5.3.

Interfszek

A GTK koncepcijt taglal rszben esett nhny sz rla, a GTK akadlymentesthez szksges implementcit az ATK ltal denilt interfsznek megfelel oen nyjtja. A Dogtail voltakppen egy Python nyelven rdott absztrakci ezen rteg fl, ami elrejti annak rszleteit s egy magasabb szinten, a felhasznli felletek tesztelshez megfelel o mdon kezeli az akadlymentestsi rteg ltal nyjtott funkcionalitsokat. Komponens Az egyik ATK ltal denilt interfsz a AtkComponent, aminek segtsgvel az egyes objektumok pozcijrl, illetve mretr ol szerezhetnk informcikat. A Dogtail ezen interfsz rszleteit elrejti ellnk, kihasznlva a Python nyelv adottsgait egy-egy tulajdonsg (property) kiolvassval frhetnk hozz az AtkComponent osztly ltal szolgltatott rtkekhez. Ezek az rtkek a Node pozcija (position), mrete (size), illetve ezek sszessgt jelent o kiterjeds (extents), ami mind az x, y, mind pedig a szlessg, magassg rtkeket tartalmazza. Br ezek az rtkek minden Node esetn elrhet oek, az ablakokon kvl ahol ezen rtkek rvn ellen orizni tudjuk az alaprtelmezett mretet, illetve a szl o ablakhoz kpesti pozcit , klnsebb jelent osgk nincs. Akcik Vannak esetek, amikor sem nem informcikat kinyerni, sem nem informcikat bevinni nem akarunk a tesztelend o alkalmazsba, ehelyett inkbb a mozgsban szeretnnk azt tartani, bizonyos akcik rvn. Pldnak okrt ilyen lehet egy gomb megnyomsa, ami tovbb mozdtja a tesztelend o alkalmazst. A vgrehajthat akcikat, illetve azok kezelst az AtkAction interfsz fogja ssze. Ezt az interfszt a queryAction fggvny segtsgvel krdezhet o le.

43

Az interfsz abban nyjt segtsget, hogy az nActions attribtumbl az adott elemen keresztl kiolvashatjuk a vgrehajthat akcik szmt, br ez kvetkezik az akcikat tartalmaz dict (actions) szmossgbl is, ami az akcik neveihez magukat az akcikat reprezentl osztlyok (dogtail.tree.Action pldnyait rendeli. Ezek tartalmazzk a az akci nevt (name), lerst (description) attribtumknt, illetve egy paramter nlkli fggvnyt (do), ami rvn az akcit vgrehajthatjuk. Ez utbbi a Node osztly doActionNamed fggvnye rvn is megtehet o, ha ismerjk az akci nevt, mivel ez a fggvnynek tadand egyetlen paramter. A fggvnyek visszatrsi rtke, hogy az akcit sikerlt-e vgrehajtani. A GtButton tpus objektumaira, azaz jelen esetben a dialgusok kapcsn trgyalt gombokra igaz, hogy vgrehajthat rajtuk a click akci, ami a gombra val kattints kivltdst eredmnyezi. Ennek hasznt termszetesen akkor ltjuk, amikor egy dialgus ablak beviteli mez oinek kitltsvel vgeztnk s szeretnnk a norml gymenetnek megfelel oen az Ok gombot megnyomni, ekkor hasznlhatjuk a doActionNamed(click), vagy a do(click) fggvnyhvst fgg oen attl, hogy a gombhoz tartoz Node, vagy annak action interfsze ll rendelkezsnkre.

6.5.4.

Tulajdonsgok

Azon informcik szmra, amik sem a klnbz o ATK ltal denilt interfszeken, sem az sttuszok rvn, sem ms mdokon nem rhet oek el, adott egy nv rtk prokat tartalmaz adatszerkezet. Az adatszerkezet lekrdezhet o dict (get_attributes), illetve list (getAttributes) formjban is, ahol a a lista elemei a nevek s az rtkek szveges vltozatainak kett osponttal (:) elvlasztott rtkei, mg a sztr rtelemszer uen a neveket kulcsknt, az rtkeket a kulcsokhoz rendelt rtkknt tartalmazza. Az attribtumlista minden Node esetn tartalmazza annak a grakus eszkzkszletnek nevt, aminek rvn a tesztelt alkalmazst ltrehoztk. A GTK esetn teht a toolkit nvhez nem meglep o mdon a gtk rtk prosul. Egybirnt az eszkzkszlet neve elrhet o a Node toolkitName nev u tulajdonsgn keresztl, ehhez hasonlan az eszkzkszlet verzija pedig a toolkitVersion tulajdonsgon keresztl.

44

7. fejezet

Kontnerek
Mr a legegyszer ubb felhasznli fellet lttn is knnyen belthat, hogy a korbbi pldaprogramjaink kiss snttanak, mgpedig abban a tekintetben, hogy nincs olyan vals letben is hasznlt program amiben egy-egy widget lenne csupn. ket a felleten Ha viszont tbb widgetet szeretnnk elhelyezni egy ablakban kzenfekv o krds, hogy miknt tudnk o csoportokba rendezni. Erre a krdsre keressk a vlaszt ebben a rszben.

7.1.

Fogalmak

A korbbiakhoz hasonlan itt is rdemes el oszr tisztzni nhny alapfogalmat s csak utna kezdeni bele az rdemi munkba.

7.1.1.

Kontnerek

A widgetek a felleten trtn o csoportokba csoportokba rendezse kontnerek (container) segtsgvel valsul meg. Ezek olyan lthatatlan widgetek, melyekbe ms widgeteket helyezhetnk (pack). sl szolgl minden olyan szrmazA GtkContainer egy nmagban nem hasznlhat absztrakt osztly, ami csupn o tatott osztlynak, melyet widgetek trolsra lehet hasznlni. sosztllyal tallkozhatunk a ks Alapvet oen kt olyan o obbiekben, melyek tovbbi szrmaztats alapjul szolglnak. Ezek a GtkBin s a GtkBox. A GtkBin radsul absztrakt osztly, azaz csak tovbbi szrmaztats cljra hasznlhat, pldnyostani nem lehet. Br a GtkBin s a GtkBox osztlyok csupn a bennk trolhat elemek szmossgban klnbznek egymstl, szerepk mgis gykeresen eltr o. El obbi mindssze egy elem trolsra alkalmas, vagyis nem klasszikus trolknt hasznlatos, hanem rendszerint valamilyen dekortor funkcit ad hozz a benne trolt elemhez (pl: GtkWindow, GtkFrame, GtkButton, . . . ). Utbbi kontnerek a widgetek vzszintesen, illetve fgg oleges rendezett trolst teszik lehet ov. Egy elemu kontnerek A GtkBin jelent osge a tovbbi szrmaztatsoknl jelentkezik majd, hisz az olyan nlklzhetetlen tpusoknak, mint az sosztlya. ablak (GtkWindow), a gomb (GtkButton), vagy a frame (GtkFrame) mind a GtkBin az o Tbb elemu kontnerek A felleti elrendezs kialaktsakor jtszanak fontos szerepet, a bennk tallhat widgetek amit a GTK kontner gyerekeknek (children) nevez elrendezsn tl azok mrett s kontneren belli pozcijt is meghatrozza. Ilyen tpusok pldul maga a GtkBox, vagy a tblzatos megjelentst szolgl GtkGrid.

7.1.2.

Mretezs

A GtkContainer osztly legfontosabb funkcionalitsa amit a szrmaztatott osztlyok is felhasznlnak az, hogy meg tudja hatrozni a benne tallhat elemek mrett. Ezt persze nem teljesen nllan teszi, hanem megkrdezni a benne tallhat widgeteket, hogy mekkora helyre lenne szksgk. Minden egyes widget sajt hatskrben llapthatja meg, hogy mekkora az a vzszintes, illetve fgg oleges kiterjeds, ami az ignyeinek legjobban megfelelne, illetve amire minimlisan szksge van. Ez a mechanizmus fentr ol lefel, azaz a gykrt ol a levelek fel terjed abban a fa hierarchiban, melynek gykere az ablak, kzbls o elemeit a kontnerek, leveleit pedig a widgetek alkotjk. A legegyszer ubb mdszer nyilvn az, hogy a kontnerek amilyen maga az ablak is sszeadjk a gyermekeik (a fban kzvetlenl alattuk lv o elemek) mretignyt s azt sajtjukknt propagljk. A m ukdsi modell azonban nem ilyen egyszer u, ugyanis az egyes widgetek vertiklis helyignye vltozhat annak fggvnyben, hogy mennyi hely 45

ll rendelkezsre horizontlisan. Kzenfekv o plda erre egy tbbsoros cmke, ami a vzszintes hely nvekedse esetn kevesebb sorban azaz kisebb fgg oleges helyen is elfr. Az egyes widgetek vgleges mretnek meghatrozsa ennek okn tbb temben trtnik az albbiak szerint. A kontner el oszr lekrdezi kzvetlen gyermekei ltal preferlt minimlis (minimal) s szokvnyos (natural) szlessgignyt (size request), majd ezt sszegezve adja tovbb, mint sajt vzszintes helyignyt. Ezt kvet oen a minimlis horizontlis helyignyt, mint rendelkezsre ll helyet megadva a kontner lekrdezi gyermekei fgg oleges helyignyt. Ezzel meghatrozsra kerlt a minimlis vzszintes, illetve az ahhoz tartoz fgg oleges helyigny, aminl kisebb helyen az adott kontner nem fr el. Ezt kvet oen a legfels o szint u kontner, vagyis maga az ablak alaprtelmezett, vagy a minimlis mrte alapjn ha az utbbi nagyobb az el obbinl megfelel oen jrakezdi a fgg oleges helyign lekrdezst. Ezek utn a kontner a sztosztja a rendelkezsre ll vzszintes helyet az ltala tartalmazott widgetek kztt, majd ennek megfelel oen jra megkezd odik a fgg oleges helyigny lekrdezse. Nhny ciklust kvet oen adott az egyes widgetek a helyzethez szabott helyignye.

7.1.3.

Elrendezs

A legtbb esetben egy ablak tbb helyet tud rendelkezsre tudja bocsjtani mint, amit a benne lv o widgetek ignyeltek. A krds teht abban ll, hogy mi legyen akkor miknt jelentse meg a kontner a sajt widgeteit, ha tbb a hely, mint amennyire felttlenl szksg volna. Ilyen eset pldul akkor llhat el o, ha ez ablak tmretezhet o s azt a felhasznl nagyobbra nyjtja, mint amekkora hely a benne lv o widgetek kirajzolshoz elgsges. Ezt az esetet szablyozzk, a kontner s a trolt elem viszonyt meghatroz tulajdonsgok (pl: ll, expand, packtype). Ezek a tulajdonsgok voltakppen nem a kontnerhez, hanem a benne trolt widgethez nem kt odnek, a widget viszonyt a kontnerhez hatrozzk meg. Megadsuk akkor trtnik, amikor egy widgetet szeretnnk egy kontnerben pldul egy GtkBoxban elhelyezni, trolsukrl pedig a kontner gondoskodik. GtkBox A boxokat, leginkbb gy kpzelhetjk el, mint egy mindkt vgn zrt dobozokat amikbe kzpr ol a kt vge fel lehet pakolni. A hasonlat mr csak azrt is helytll, mert az egyes elemek a dobozban trtn o elhelyezse csak egymst kvet oen, gymond egymsra pakolva lehetsges. Annyiban viszont sntt a plda, hogy a GTK esetn rendkvl ritka br egyltalban nem lehetetlen hogy elemeket vegynk ki egy kontnerb ol. GtkGrid A grid egy rcs vagy ha gy tetszik tblzatos formt megvalst kontner, aminek segtsgvel widgeteinket rcs alakzatban sorokba s oszlopokba rendezhetjk. Az egyes oszlopok, illetve sorok azonos szlessg uek, illetve magassgak, ennek rvn alakul ki egy tblzatos forma, ahol az egyes cellkban a tblzatba rakott widgetek helyezkednek el. Hasonlan a boxokhoz az oszlopok s a sorok kztt megadhat trkz (column-spacing, row-spacing), illetve megoldhat, hogy az sszes oszlop, illetve sor azonos szlessg u, illetve magassg (column-homogeneous, row-homogeneous)legyen . A fentiekb ol taln nem kvetkezik els o ltsra, de ez egy oszlopos, illetve egy soros GtkGrid tkletesen megvalstja a fgg oleges, illetve a vzszintes elrendezs u GtkBox funkcionalitst. GtkOrientable A korbban emltett kontnertpusok mindegyik implementl egy, az orientcira vonatkoz interfszt, aminek rvn lehet ov vlik az orientci exibilis kezelse, akr futsid oben trtn o megvltoztatsa. Ennek el onyeit a mobilalkalmazsok terjedsnek fnyben nem igazn kell rszletezni.

7.2.
7.2.1.

Alapmuveletek
Ltrehozs

A GtkContainer, illetve a GtkBin absztrakt osztlyok, gy ebben a formjukban nem, csak a szrmaztatott osztlyok rvn pldnyosthatak. A szrmaztatott osztlyok kzl ebben a rszben a legnpszer ubbet a vzszintes vagy fgg oleges elrendezst s megvalst GtkBox, illetve a rcs, formt implementl GtkGrid osztlyt vesszk grcs o al.

46

GtkBox Ltrehozskor a doboz elrendezst1 (orientation) tl mg egy paramtert kell megadunk (spacing), ami az elemek kztt hagyand trkz mrett adja meg pixelben. Ltezik a kt lehetsges orientcinak megfelel o sajt tpus is (GtkHBox, GtkVBox), amik ltrehozskor nem vrjk az orientcit, mint paramter, viszont megadand egy bool tpus paramter (homogeneous), aminek TRUE rtke esetn minden egyes elem azonos helyet foglal majd el a kontnerben, ahol a mret a rtelemszer uen a legnagyobb helyigny u widget mrete lesz. Ezek a tpusok jlag rt kdokban mr nem javallottak, helyettk a GtkBox tpus ajnlott, ami ugyanolyan egyszer uen hasznlhat, mint a kt orientcinak megfelel oen specializlt tpus, ugyanakkor generikusabb megoldst knl. A ltrehozst kvet oen termszetesen ezen tpus objektumainak is megadhat a homogeneous tulajdonsg. GtkGrid Ltrehozskor a GtkGrid a egyetlen paramtert sem vr. Mg a vzszintes elrendezs u boxoknl a widgetek szlessge, a fgg olegeseknl a magassga, addig a tblzatoknl mindkett o azonos ha a homogeneous paramter rtke TRUE.

7.2.2.

Elem hozzadsa

Ezen fggvnyek kzs sajtossga, hogy paramterknt tveszik azt a widgetet, melyet a kontnerbe kvnunk helyezni. A korbban emltett szl o-gyerek viszonyok ltal kialaktott fa hierarchibl sajtossgaibl kvetkezik, hogy egy elem nem lehet tbb szl onek gyermeke klnben erd o szerkezetr ol beszlnnk fa hierarchia helyett , azaz egy widgetet sszesen egy kontnerben helyezhetnk el. Ha esetleg ezt msodszor is megprblnnk mg miel ott a korbbi kontnerb ol eltvoltottuk volna akkor futs idej u hibazenetet kapunk. Ne feledjk, a GTK rendelkezik referenciaszmllsi metdussal, azaz minden egyes objektum (GtkObject) esetnkben GtkWidget rendelkezik egy referenciaszmmal. Ha egy widgetet egy kontnerbe helyeznk, annak referencijt a kontner, annak rendje s mdja szerint, nveli eggyel. Ez a referencia mindaddig megmarad, mg a widgetet el nem tvoltjuk, vagy a kontner valamilyen oknl fogva meg nem sz unik, ami jellemz oen akkor kvetkezik be ha az egsz ablakot megszntetjk (destroy). Itt rdemes visszatrni a lebeg o referencia (oating reference) fogalmhoz. Egy widget referenciaszmlljnak rtke ltrehozskor egy. Ezt a kontner amibe a widgetet helyezzk nem nveli meg, csupn a lebeg o referencit sllyeszti el, vagyis a kvetkez o referencit nvel o m uvelet tnylegesen nvelni fogja a referenciaszmll rtkt, nvels hinyban a kvetkez o referencia cskkent o m uvelet pldul a kontnerb ol val eltvolts a widget megsemmislshez (destroy) vezet. Ez hasznos abban a szokvnyos esetben ha egy adott widgettel egytt annak minden gyerekt is meg szeretnnk semmisteni, ugyanakkor odagyelst ignyel abban a ritka esetben, amikor egy kontnerb ol gy szeretnnk eltvoltani egy elemet, hogy az ne semmisljn meg. GtkContainer Az add nev u fggvny egyetlen paramtert, az elhelyezni kvnt widgetet veszi t. Ritkn, leginkbb csak egyszer u kontnereknl alkalmazott hvs, lvn olyan alaprtelmezett paramterek hasznl a widget elhelyezsre, amik a felhasznl cljainak a legtbb esetben nem felelnek meg. Hasznlhat ugyan a szrmaztatott, bonyolultabb kontnerek esetn is (pl: GtkBox, GtkGrid), de clszer ubb ezen esetekben az azokhoz tartoz, specikus fggvnyt alkalmazni, lvn az sokkal rugalmasabban paramterezhet oek. GtkBin Ebbe a tpusba elemet csak a GtkContainer add fggvnyvel tehetnk. Ha tbbszr hvjuk meg a fggvnyt anlkl, hogy a korbban elhelyezett gyereket eltvoltottuk volna futsi hibt kapunk, hiszen a GtkBin csak egyetlen elem trolsra kpes. GtkBox Ahogy arrl a bevezet oben sz volt a GtkBox tpus olyan, mint egy kt vgn zrt doboz, amibe kzpr ol pakolhatunk kt irnyba. Ennek megfelel oen kt olyan fggvny van, amivel elemeket akr tbbet is helyezhetnk a boxba, az egyikkel az egyik irnya, elrendezst ol fgg oen fel, illetve balra, a msikkal a msik irnyba, elrendezst ol fgg oen le, illetve jobbra. A pack_start fellr ol lefel, illetve balrl jobbra haladva tlti meg a kontnert gy, hogy az egymst utn elhelyezett elemek egyms alatt, illetve balrl-jobbra egyms mellett jelennek meg a boxba trtn o behelyezs sorrendjben. A pack_end hvs ezekkel pp ellenttesen, alulrl felfel, illetve jobbrl balra haladva helyez elemeket a trolba, szintn a hvs sorrendjben. Ahogy a GtkContainer esetn, itt is megadand a boxba helyezend o widget, de ezen tl itt a kontneren belli elhelyezkedst meghatroz rtkek is. Az expand s fill bool tpus paramterek, amik a korbban mr emltett
1 rtsd

vzszintes vagy fgg oleges orientcij dobozrl van-e sz

47

felesleges hely kitltsre vonatkoznak. El obbi azt hatrozza meg, hogy a widget a kontneren bell rendelkezsre ll helyet kitltse-e, vagyis ha egyltalban van szabad hely, akkor azt ignyelje-e magnak (TRUE), vagy lemondjon rla (FALSE) a tbbi a kontnerben lv o widget javra. Az expand paramter annak belltsra szolgl, hogy a rendelkezsre ll illetve az expand okn elnyert helyre mi mdon rajzolja ki magt a widget. Ha a paramter rtke TRUE, akkor a widget maga tlti ki ezt a helyet, azaz a felttlenl szksgesnl nagyobb helyen rajzoldik ki, mg ha az rtk FALSE, akkor csak a minimlisan szksges helyre rajzoldik s a maradk rszt gymond resen hagyja. A pack fggvnyek utols paramtere a padding nevet viseli, ami a widget krl (fgg oleges elrendezs esetn fell s alul, fgg oleges elrendezs esetn jobbrl s balrl) hagyand res hely rtkt adja meg pixelben. Ha els ore nem is teljesen egyrtelm u, mit jelent ez a gyakorlatban, a kvetkez o fejezet illusztrcijbl minden vilgoss vlik. GtkGrid Az attach fggvny ami a tblzatok esetn elem elhelyezsre szolgl bizonyos szempontbl bonyolultabb, bizony szempontbl egyszer ubb, mint a korbbi fggvnyek. A tblzatnl termszetesen vzszintes, illetve fgg oleges pozcit is meg kell adnunk, ahov a widget sznjuk, viszont sem fill, sem expand paramtereket nem kell megadni, lvn ezek a paramterek widgetenknt kln-kln nem llthatak. Msrszr ol lehet osg van arra, hogy egy adott widget tbb oszlopot illetve tbb sort is elfoglaljon. Ez esetben a left s right, illetve a top s a bottom paramterek rtknek klnbsge nem egynl nagyobb.

7.2.3.

Elem eltvoltsa

A szrmaztatott tpusok, legalbbis azok, amelyekkel ebben a rszben foglalkozunk (GtkGrid, GtkBin, GtkBox) nem ignyelnek az eltvolts sorn semmilyen extra m uveletet, gy a GtkContainer funkcionalitsra tmaszkodnak. GtkContainer A remove fggvny rtelemszer uen az eltvoltani kvnt widgetet vrja paramterknt s ahogy azt emltettk az ltala tartott referencit meg is sznteti. Ez egyben azt is jelenti egyben, hogy az eltvoltott widgetre az utols hisz tbbnyire csak a kontnere tart referencit egy widgetre referencia s ezzel maga a widget is megsz unik. Ha ezt az esetet el akarjuk kerlni, akkor mg az eltvolts el ott a referenciaszm nvelsr ol magunknak kell gondoskodnunk. Vagyis, ha kt lpsben (remove s add) akarunk egy widgetet thelyezni egyik kontnerb ol a msikba, akkor az eltvolts el ott nvelnnk, a hozzads utn pedig cskkentennk kell a referencit. Utbbira azrt van szksg, mert az j szl oelem maga is nvel egyet a referencin, gy ha mi, az ltalunk korbban megnvelt referencit nem cskkentennk, a widget soha nem sz unne meg. Hasonlan a GtkBinhez itt sincs specikus fggvny az eltvoltsra, hanem a GtkContainer remove fggvnyt hvjuk.

7.3.
7.3.1.

Pa(c)kols
Elemek elhelyezkedse

Fogalmak Lssuk mire j vgl is ez a hrom opci (homogeneous, expand, ll) s mikt fggenek ssze egymssal. Homogenits. A kontner tulajdonsga, ami a gyerekek mretnek egymshoz val viszonyt hatrozza meg. Jelentse egyenl osg abban az rtelemben, hogy minden egyes elem a kontnerben pontosan ugyanakkora helyet foglal majd el. Ez a hely a termszetesen a legnagyobb helyignnyel rendelkez o widget mrete lesz, hiszen csak gy biztosthat, hogy minden elem kifrjen, ugyanakkor azonos helyet foglaljon el. Terjeszkeds. A terjeszkeds (expand) azt hatrozza meg, hogy az adott widget megprbl-e helyet szerezni magnak a kontnerben a tbbi widget rovsra. Gyakorlatban ez annyit tesz, hogy a kontner ltal elfoglalt hely szabadon maradt rsze vagyis amennyivel a kontner nagyobb, mint a benne lv o elemek minimlis mretnek sszege , ezen tulajdonsggal rendelkez o widgetek kztt kerl elosztsra. Kitlts. A gyerek ltal elfoglalhat terlet kitltsnek (ll) mdjt ler tulajdonsg. Gyakorlatilag azt hatrozza megy, hogy az adott widget megrajzolsakor a rendelkezsre ll teljes helyet kihasznlja a rendszer, fggetlenl attl, hogy ehhez a mennyisg u helyhez miknt jutott a widget (expand, homogeneous, . . . ), vagy csak a minimlis szksges helyet hasznlja fel, mg a maradkot resen hagyja. 48

Igazts. A igazts (align) azt hatrozza megy, hogy a kontnerbe helyezett elem GtkBox esetn a kontneren bell, GtkGrid esetn a celln bell merre igazodjk. Az igaztani lehet el ore (start), vagy htra (end), ami termszetesen fgg oen az orientcitl vzszintes, vagy fgg oleges bal, vagy jobb oldalt, illetve az als vagy a fels o rszt jelenti. GtkBox A kvetkez o bra azt szemllteti, hogy miknt vltoztatja meg a homogenits az expand, ll) tulajdonsgok fggvnyben az elemek elhelyezkedst a kontneren bell.

7.1. bra. Mretarnyos s homogn elhelyezsnek a kontneren bell[8]

Ahogy korbban a kdsorokat, most a widgetek sorait vesszk sorra a minl jobb megrts kedvrt. Mretarnyos elhelyezkeds. expand = FALSE, fill = FALSE A kontnerben lv o elemek ahogy fentiekben fogalmaztunk nem akarnak egyms rovsra helyet szerezni (epxand), gy a rendelkezsre ll vzszintes helyet nem is tltik ki, vagyis ezzel a megoldssal az egsz elemsorra nzve a szlekre trtn o igaztst (pack_start esetn balra zrt, mg pack_end esetn jobbra zrt) alakthat ki. expand = TRUE, fill = FALSE Az sszkp, leginkbb az alatta tallhat sor miatt kiss csalka, mivel az elemek kiss rendezetlennek t unnek, ehelyett viszont arrl van sz, hogy minden egyes elem megszerezte magnak a sajt minimlis mretignynek arnyban az expand paramter okn rendelkezsre ll plusz helyet s az gy alloklt (size allocation) trrszen bell kzpen helyezkedik el. expand = TRUE, fill = TRUE Az egyes elemek nem csak hogy kiterjeszkednek (expand), hanem a korbban fel nem hasznlt terletre, de ki is tltik (fill) azt, azaz annak teljes mretben rajzoljk is ki magukat. Ezzel a megoldssal az elemsorra igaz, hogy az elemek kztt a kontner spacing, illetve a kontnerbe helyezskori padding paramter rtkvel meghatrozottaktl eltekintve trkz nincs. Ahogy az az brbl s taln a magyarzatbl is kit unik az fill opci lltsnak semmi teteje anlkl, hogy az expand be ne lenne kapcsolva, hisz e nlkl nincs semmilyen plusz terlt, amire a widget magt megnagyobbtva rajzolhatn. Homogn elhelyezkeds. expand = TRUE, fill = FALSE A kontnerben lv o elemek a mr hasznlt kifejezssel lve hiba akarnak egyms rovsra helyet szerezni (epxand) a kontnerben, a kontner a rendelkezsre ll vzszintes helyet egyenl oen osztja el kzttk. Ezzel a megoldssal az egsz elemsorra igaz, hogy az elemek azonos helyet foglalnak el, de ezen helyen bell csak a minimlisan szksges terletre rajzoljk ki magukat. expand = TRUE, fill = TRUE A fentiekhez kpest az eltrs csupn annyi, hogy az egyes elemek ki is hasznljk ha gy tetszik kitltik (fill) az egyenl oen kiporcizott trrszt, maximlis mretben rajzolva ki magukat. A klnbsg az el oz o sorhoz kpes pp az, mint a nem homogn kontnerek esetn ugyanazon paramterezs esetn.

49

GtkGrid A GtkGrid tpus szempontjbl ugyanaz a kt sajt tulajdonsg (homogeneous, spacing) szmottev o, mint az imnt GtkBox tpus esetn amiket a fentiekhez hasonlan befolysol msik kt paramter. Ezek a paramterek viszont ugyangy a kontner s a widget viszonyt hatrozzk meg, mint az expand s a fill s azokhoz hasonl mdon is m ukdnek, ugyanakkor a GtkWidget tulajdonsgai, teht ott is troldnak. Kiterjeds. Az expand nll tulajdonsgknt is ltezik s szerepe gyakorlatilag ugyanaz, mint a GtkBox tpus esetn, ugyanakkor mgis van egy szmottev o klnbsg. Az expand voltakppen msik kt tulajdonsg (hexpand, vexpand) amik a vzszintes s a fgg oleges kiterjeds szablyozzk , egyttes kezelsre szolgl, amik kln-kln is ltez o s rtelmezett tulajdonsgai a widgetnek. Igazts. A fill gyerek-tulajdonsg ebben a formban nem ltezik, mint a GtkWidget tpus tulajdonsga, viszont helyette kt tgabban rtelmezett tulajdonsgot is hasznlhatunk. Ez a tulajdonsg az igazts (align), amit szintn megadhatunk kln vzszintes s fgg oleges (halign, valign) rtelmezsben. A tulajdonsg ngy rtket vehet fel, amik kzl egy a FILL, ami megegyezik a korbban rszletezett fill gyerek-tulajdonsg m ukdsvel. A mssga, illetve rugalmassga abban ll, hogy a msik hrom rtk (START, END, CENTER) rvn nem csak azt rhetjk el, hogy a widget a rendelkezsre ll, felesleges vagy ppen szndkoltan megszerzett (expand) helyet kitltse, hanem azt is, hogy annak elejn, vgn, vagy ppen kzepn helyezze el magt. A pozci termszetesen fgg az orientcitl, gy a START rtk jelenthet bal oldalt, vagy ppen fels o pozcit, ahogy az END jobb oldalt, vagy az res trrsz aljt.

7.3.2.

Trkz, pnyvzs s szegly

Fogalmak Trkz. A kontner tulajdonsga, ami az benne elhelyezett elemek egymstl vett tvolsgt, vagyis ez egyes elemek kztti trkzt hatrozza meg. Fontos megjegyezni, hogy a kontner els o eleme el ott s utols elem utn ez a trkz nem jelenik meg, csakis az elemek kztt. Ennek megfelel oen az egy elem u kontnerek ezen tulajdonsggal nem is rendelkeznek. Pnyvzs s szegly. Ha a kontnerben az egyes elemek kztt nem egyenl o trkzt szeretnnk megadni, akkor lehet osg van az egyes widgetek esetn kln-kln, csak az adott widgetre vonatkoz, a widgetet krlvev o trkzt megadni. Ez a fajta trkz minden esetben megjelenik a widget megfelel o oldaln s a mr emltett trkzhz hasonlan szintn fgg az orientcitl. A GtkBox tpus esetn csak egy az orientcitl fgg o irnyban rtelmezett trkz megadsra van lehet osg, amit pnyvzsnak (padding) neveznk s a widget mindkt oldaln megjelenik. A GtkGrid tpus ett ol eltr oen lehet osget ad az oldalanknti (top, bottom, left, right) szeglyrtk (margin) megadsra kln-kln, de kezelhetjk az sszes oldal egyben is. GtkBox

7.2. bra. Tr az elemek kztt s krl a kontnerben[8]

Tr az elemek kztt.

50

expand = TRUE, fill = FALSE Ez a plda nem mutatja meg igazn jl azt, hogy az elemek kztt jelenik meg az a trkz, amit a kontner ltrehozsakor megadtunk, hiszen elemek nem tltik ki (fill) maximlisan a szmukra rendelkezsre ll teret. expand = TRUE, fill = TRUE Mivel itt mindkt rtk TRUE, a widgetek a rendelkezsre ll teret teljes egszben kihasznljk maguk megrajzolsra, eltekintve termszetesen a kzttk megjelen o 10 pixelnyi trkzt ol (spacing). rdemes kln gyelmet fordtani a kt szls o elemre, azoknak is az ablak szlhez kzelebb es o rszre a kvetkez o megoldssal val sszehasonltshoz. Tr az elemek krl. expand = TRUE, fill = FALSE A padding megadsval a trkz nem az elemek kztt, hanem azok krl jelenik meg. Ez azt jelenti, hogy minden elem jobb s bal oldaln (fgg oleges elrendezs esetn fell s alul) egyarnt jelentkezik a megadott trkz, ennek okn kzttk annak fgg oen a fill rtkt ol a ktszerese. expand = TRUE, fill = TRUE Ez az az eset amikor igazn jl lthat a widgetek kztt s az azok mellett megjelen o trkz 2:1 arnya. Az el obb a szls o widgetek elhelyezkedsnl meggyelteket most hasznosthatjuk, ha szrevesszk itt a szls o widgetek nem tudnak a kontner szlig kiterjeszkedni, lvn kt oldalrl ki vannak prnzva (padding) 10-10 pixellel. GtkGrid Az imnt lertak a GtkGrid, illetve a GtkWidget tpus sajt tulajdonsgainak hasznlatval annyiban vltoznak, hogy a pnyvzs (padding) helyett, szeglyezst alkalmazhatunk, vagyis minden oldal esetben kln-kln is megadhatjuk a widgetet krlvev o trkzt (margin-top, margin-bottom, margin-left, margin-right), amiket szintn kezelhetnk egytt (margin), ami rskor az sszes rtket fellrja, mg olvasskor a legnagyobb rtket adja vissza.

7.4.

A kd

A fenti pldaprogramok forrsa a GTK+ oldaln rhet ok el.

7.4.1.

Fordts s linkels

A korbbiakhoz hasonlan az albbi parancssor segtsgvel fordthat a pldaprogram:


gcc gtk_packbox.c -o gtk_packbox pkg-config --cflags --libs gtk+-3.0

7.4.2.

Futtats

Prbljuk ezttal a ./gtk_packbox 1|2|3 paranccsal abban a knyvtrban, ahol a fordtst elkvettk, ahol a paramter a teszt sorszma, abban a sorrendben, ahogy azokat itt is ismertettk (a 3. termszetesen csak rads).

7.4.3.

Eredmny

Ha netn gy rezzk mgsem vilgos mi is trtnik, mikor s mirt a kontnerekbe pakols kapcsn, ne adjuk fel. Els ore taln az egsz mechanizmus jelent osge sem szembet un o, ugyanakkor rdemes prblkozni, azaz venni a forrst s jtszani a klnbz o rtkekkel (ll, expand, spacing, padding), illetve a ltrehozott ablak tmretezsvel.

7.5.

Tesztels

Amint azt mr megllaptottuk, a kontnerek segtsgvel alakthatjuk ki a felhasznli fellet szerkezett. Ezen eszkzk teszik lehet ov, hogy a widgeteket egymsba gyazzunk, ezek hatrozzk meg a widgetek kontnerekben val elhelyezkedst, ms widgetekhez val viszonyt. Az gy ltrejv o szl o-gyerek viszonyok fa hierarchit hatroznak meg, aminek gykerben maga az applikci ll, msodik szintjn az applikci egyes ablakai, ezek alatt pedig az ablakokon belli widgetek, a felleti elrendezsnek megfelel oen. A kontnerek ltal kialaktott szerkezet termszetesen a tesztels sorn is tetten rhet o, br nem szabad megfeledkeznnk arrl, hogy a felhasznli fellet tesztelsnek alapjul szolgl a szoftverek akadlymentestshez (accessibility) megalkotott rteg nmikpp msknt tekint a widgetekre s a widgetek kztti sszefggsekre, mint azt a GTK teszi. Utbbi termszetesen er osen szoftverfejleszt oi szemszget kpviseli, mg az el obbi a felhasznli gondolatvilgbl indul ki, a felhasznlk ltal rtelmezett fogalmakbl, szerkezetb ol, sszefggsekb ol, tulajdonsgokbl ptkezik, ebb ol addnak azok az eltrsek, amiket a ks obbikben folyamatosan szmba vesznk.

51

7.5.1.

Gyerekek keresse

Az el oz o rszben emltett GenericPredicate nem csak sz urt keressek lebonyoltsra alkalmas. Az alaprtelmezett paramterekkel ltrehozott objektum hasznlatnak eredmnye a gyakorlatban pont az, hogy az gy ltrejtt elvrsoknak minden elem megfelel. Egy adott Node findChild fggvnynek tadva az el obbi mdszerrel ltrehozott predicate objektumot, annak gyerekeit kaphatjuk vissza. Amennyiben a findChild fggvny recursive paramtere True, akkor az sszeg gyereket, amennyiben False, akkor csak a kzvetlen gyerekeket. Azt mr elljrban is rdemes megjegyezni, hogy a GTK widgetek ltal ltrehozott hierarchia, illetve az accessibility eszkzk ltal lekrdezhet o elemek hierarchija nem egyezik meg tkletesen. Bizonyos elemek esetn eltrsek lehetnek, amiket azt adott helyen rszleteznk.

52

8. fejezet

Megjelent o eszkzk
sA szveges adatbevitel legegyszer ubb mdjairl ugyan volt sz az el oz o rszben a kp azonban kzel sem teljes, hiszen ablakok rendszerint nem csupn beviteli mez okb ol llnak, hiszen magukbl a mez okb ol igencsak nehezen lehetne rjnni arra, hogy voltakppen a mez okbe mit is kellene rnunk. Ebben a rszben nhny nlklzhetetlen, teljesen ltalnosan hasznlt megjelent o widgetet vesznk grcs o al, gy is mint a cmkk, kpek, sg-, vagy lerbuborkok.

8.1.
8.1.1.

Fogalmak
Igazts s helykitlts

sknt szolgl osztlyt (GtkMisc), ami nmagban nem pldnyosthat, csupn a bel A GTK+ denil egy olyan o ole szrmaz osztlyok (GtkLabel, GtkImage, GtkArrow) kzs belltsait fogja ssze. Mindssze kt tulajdonsgrl igazts (align), helykitlts (padding) van sz tulajdonkppen, amik a widget tartalmnak elhelyezkedst befolysoljk magn a widgeten bell, azaz fggetlenl a widget kontnerben elfoglalt helyt ol s annak paramtereit ol. Ez taln nmikpp kdsen hangzik, de a szrmaztatott osztlyok ismeretben hamar vilgoss vlik. Fontos mr itt megjegyezni, hogy a GtkMisc nmikpp idejtmlt, szolgltatsai egyszer ustett ugyanakkor a gyakorlati alkalmazs szempontjbl mgis ugyanannyira kielgt o formban a GtkWidget tpus ltal is implementltak, gy ezen tpus tulajdonsgainak hasznlata jlag rt kdokban ellenjavallt. Kt oknl fogva mgis clszer u ezzel a tpussal foglalkozni. Az egyik a kzenfekv o ok, hogy a GtkMisc mg mindig rsze a GTK+ fggvnyknyvtrnak s meglehet osen rgen az, ennek okn pedig szmos korbbi kdban tallkozhatunk vele.

8.1.2. Widgetek
Cmkk Taln a legfontosabb s leggyakrabban hasznlt kiegszt o widgetek a cmkk, ahol rtelemszer u az igazts (alignment) jelentse,ami azonos azzal, amit a szvegszerkeszt o szoftverek esetn megszokhattunk. A helykitlts (padding) m ukdse a kontnereknl mr trgyaltakkal egyezik meg.

8.1. bra. Cmke[9]

Kpek A GTK mint minden ms felhasznl fellet fejlesztshez hasznlt eszkzkszlet lehet ov teszi kpek megjelentst a felhasznl felletek rszeknt. Az igazts s a helykitlts funkcija ebben az esetben is rtelemszer u. Kpek termszetesen tbb forrsbl is szrmazhatnak. A felhasznli felleten termszetesen megjelenthetnk kls o forrsbl szrmaz kpeket, ikonokat, animcikat, melyeket fjlbl tlthetnk be, ugyanakkor a GTK maga is szllt szmos olyan ikont, ami nehezen nlklzhet o mg a legegyszer ubb felleteken sem. Ilyenek pldul a leggyakrabban el ofordul gombok ( Ok, Mgsem, Alkalmaz, . . . ), az zenetablakok ( hiba, gyelmeztet o, informcis, . . . ) ikonjai.

53

8.2. bra. Kp[9]

Beptett ikonok. Ezek a beptett (stock) ikonok a szles krben hasznlt menelemek, illetve eszkzkszletek ikonjait jelentik, amikre azonostk segtsgvel (id) hivatkozhatunk kpek, gombok, dialgusok ltrehozsnl. A beptett ionokat sajtjainkra lecserlhetjk, illetve sajt stock ikonok regisztrlsra is lehet osg van. Ikonhalmazok. Egy adott azonosthoz tartoz ikon mretbeli (mennek, gombnak, dialgusnak, . . . megfelel o mret), illetve a widgetek lehetsges llapotainak (norml, kivlasztott, aktv, . . . ) megfelel o varicik ikonhalmazokat hoznak ltre, melyekben az egyes elemek a beptett ikonokhoz hasonlan cserlhet oek. Buborkok Nmikpp mltatlanul hanyagolt widget a sg-, vagy ms nven lerbubork (tooltip), pedig egy magra valamit is ad applikci nem nlklzheti ezt az eszkzt, lvn ez a felhasznl informlsnak egyik leginkbb bevett mdszere.

8.3. bra. Bubork[7]

8.1.3.

Szvegformzs

A GTK, pontosabban szlva a bevezet o rszben mr emltett Pango, rendelkezik egy sajt ler (markup) nyelvvel, a szvegek formzst teszi lehet ov a felhasznl felleten. Ezen nyelv segtsgvel llthatjuk be a szveg megvltoztatni kvnt paramtereit, gy mint bet u tpusa, mrete, stlusa, szne s gy tovbb. Ezen tulajdonsgok lerst magval a szveggel egytt adjuk meg.
<span foreground="blue"size="100">Blue text</span>is <i>cool</i>!

A pldban el oszr a Blue text szveg sznt, illetve mrett lltjuk t ignyeknek megfelel oen, gy hogy a kvnt szveg kr az egyes tulajdonsgok (foreground, size), illetve azok rtkeinek lerst helyezzk el. Ezzel a mdszerrel ez egyes tulajdonsgokat kln-kln adhatjuk meg, ugyanakkor a gyakran, s jellemz oen egymagukban hasznlt belltsokhoz (flkvr, d olt, alhzott) lteznek nll lerk is (b, i, u), ahogy ez a cool szvegrsznl is ltszik.

8.1.4. Widgetek sszefggsei


Bizonyos tpus widgetek sajtja, hogy nem nmagukban lteznek, hanem vagy valamilyen csoportnak tagjai, vagy egy konkrt widgettel llnak valamilyen sszefggsben. Ez utbbi igaz a cmkk esetn is, amiknl megadhat, hogy melyik msik widget az, amire vonatkoznak, amit lernak. Ez az sszefggs egyes widgettpusok esetn (pl: gombok) esetn automatikus, mg ms esetekben (pl: beviteli mez ok, listk, . . . ) magunknak kell megadnunk. Ezen kapcsolat megadsnak kzvetlen el onye egyrszr ol a tesztels sorn mutatkozik meg, ahol a cmke segt a lert widget megtallsban, msrszr ol a felhasznl fellet billenty uzetr ol trtn o hasznlatt knnyti meg, ahogy arrl a ks obbiekben sz esik.

8.2.
8.2.1.

Alapmuveletek
Ltrehozs

Az ebben a fejezetben trgyalt widgetek esetn hasonlan a korbbiakhoz a ltrehozs maga nem klnsebben bonyolult feladat. Nmi rutint csak a ltrehozst kvet o testreszabs ignyel, amihez szksges az alapvet o m ukdsi 54

sajtossgok tisztzsa. A kezdeti belltsokat kvet oen jellemz oen ezen widgetek nemigen vltoznak, gyhogy ezt kvet oen mr csak a widget kontnerbe val behelyezse jelenthet kihvst. GtkLabel A legegyszer ubb eset, ha szeretnnk valamilyen statikus szveget, mindenfle formzs nlkl megjelenteni a felhasznli felleten. Erre a problmra a megolds is rendkvl egyszer u. Mindhrom nyelvi vltozatban esetn csupn egyetlen paramtert kell megadnunk a cmkt ltrehoz fggvnynek, ez pedig a cmke szvege.
GtkWidget * gtk_label_new ( constgchar * label ); GtkWidget * gtk_label_new_with_mnemonic ( constgchar * label ); explicit Label ( constGlib :: ustring & label , boolmnemonic = false ); Label ( constGlib :: ustring & label , floatxalign , floatyalign , boolmnemonic = false ); Label ( constGlib :: ustring & label , Alignxalign , Alignyalign = ALIGN_CENTER , boolmnemonic = false ); def__init__ (self , label =None , ** kwds ):

Kdrszlet 8.1. Cmke ltrehozsa Ahogy ltszik a klnbz o nyelvi vltozatoknl a cmkk mr ltrehozskor ennl vltozatosabban paramterezhet o. A ltrehozs kvet oen pedig tovbbi nyilvn paramterek is llthatak. Ks obbiekben megltjuk mik ezek a paramterek s milyen haszonnal brnak a htkznapi hasznlat sorn, most vegyk sorra a ltrehozs paramtereit. label A cmke szvege. ltalnossgban vve a cmkk szvegeinek megalkotsnl clszer u valamilyen egysges irnyelvet kvetni. A GNOME ltal kvetett irnyelvek szerint a GtkLabel tpus felhasznlsi terletein legyen az a beviteli mez ok cmki, jell ongyzetek szvegei, vagy ms egyb a mondatok els o szava rand nagybet uvel, mg a tbbi kisbet us. mnemonic A cmkk leggyakoribb felhasznlsa a beviteli mez ok illetve jell ongyzetek cmkzse. Ezen esetekben a cmkk szvegben megjellhetnk egy karakter gy, hogy egy alhzst karakter runk el a szvegben (pl: "_Label text"), s azt a karaktert ks obb a cmke ltal hivatkozott widget elrsre hasznlhatjuk. A gyakorlatban ez a billenty uzetr ol trtn o navigcit ezzel egytt a felhasznli fellet hatkonyabb hasznlatt segti el o azltal, hogy a widget, az el obb emltett pldnl maradva, az Alt+L billenty uvel aktivlhat lesz. A cmke ltal hivatkozott widget alaprtelmezs szerint az a widget pontosabban az a kontner lesz amibe a cmkt helyeztk, vagy annak els o olyan szl oje, ami implementlja a GtkActivatable interfszt. Az olyan widgetek, amik maguk is tartalmaznak cmkt (pl: gombok, jell ongyzetek, . . . ) ez a felttel kzenfekv oen adott, mivel a widget implementlja a GtkActivatable interfszt. Amennyiben nem ez a helyzet, hanem pldul egy beviteli mez ot cmkznk, akkor magunknak kell megadnunk a kapcsold widgetet a set_mnemonic_widget fggvny segtsgvel, aminek rtelemszer uen az aktivland widget a paramtere. Az aktivlskor a belltott widget az aktivls hatsra fkuszba kerl, ami egy beviteli mez onl pldul azzal az el onnyel jr, hogy a nem kell vltogatnunk az egr s a billenty uzet kztt a fellet hasznlatakor. xalign, yalign A vzszintes, illetve fgg oleges igazts 0 s 1 kztti lebeg opontos rtkekkel adhatak meg, ahol a 0 a bal oldalt, illetve a fels o pozcit, az 1 pedig a jobb oldalt, illetve az als pozcit jelenti. Mind a vzszintes, mind a fgg oleges igazts alaprtelmezett rtke 0,5. Ez az esetek jelentkeny rszben nem felel meg az ignyeknek, hiszen a cmkket tbbnyire balra, esetenknt jobbra igaztjuk, vagyis az xalign tulajdonsgot rtke 0, illetve 1 kell legyen. Br a GtkMisc osztly, illetve annak tulajdonsgai mg rvnyben vannak, a GTK fejleszt oi nem ajnljk hasznlatukat jlag rt kdban, lvn a GtkWidget tpus korbban mr emltett halign, valamint valign ket. tulajdonsgai helyettestik o xpad, ypad Az itt megadott rtknek megfelel oen a vzszintesen, illetve fgg olegesen ad trkzt a widget kr. Hasonlan azonban az el obbiekhez ennek a mdszernek a hasznlata sem javasolt j kdokban, helyette a GtkWidget margin tulajdonsga lltand. GtkImage Ahogy arrl sz esett a bevezet oben, kpek ltrehozsra szmos md knlkozik. Ezek kzl most csak a npszer ubbeket vesszk szmba. Az els o s taln legfontosabb a fjlbl val betlts, amire a new_from_file fggvnyt hasznlhatjuk.

55

Amennyiben a megadott fjl betltse valamilyen oknl fogva sikertelen (pl: fjl nem ltezik, jogosultsgi problmk, . . . ), akkor egy olyan kpet kapunk vissza, ami a betltsi hibra utal. Amennyiben a fjl betltse sorn felmerl o hibkat magunk szeretnnk kezelni egy alacsonyabb szint u megoldst kell vlasztanunk, ami egybirnt a GTK fjlbl val betlts vgz o fggvny htterben is ll. Ezt a megolds nem meglep o mdon a GDK adja, hiszen a kifejezetten grakai kdok itt kapnak helyet. A GdkPixbuf tpus szintn rendelkezik fjlbl val betltsre alkalmas fggvnnyel (new_from_file), ami a GtkImage hasonl fggvnnyel szemben hiba esetn a nyelvi vltozatnak megfelel o hibajelzs trtnik. A C nyelv u vltozat esetn a hibt egy GError tpus vltozban kaphatjuk vissza, mg a C++, illetve Python vltozat esetn kivl vltdik ki. A harmadik eset amikor egy beptett ikont szeretnnk kpknt hasznlni, amit megtehetnk a new_from_stock fggvny hasznlva, ami paramterknt a beptett ikon (stock icon) nevt veszi t paramterknt, ppgy, ahogy teszi azt a gomb ltrehozskor. GtkTooltip A sgbubork funkcija s megadsa is hasonlt nmikpp cmkhez, hiszen mindkt widget egy msik widget azonostsra, szerepnek tisztzsra szolgl. Mindkt widget valamilyen szveges lerst ad hozz tartoz felleti elemr ol, a cmke rvidebb, mg a sgbubork rendszerint hosszabb formban. Ennek okn a sgbubork megadsnak legegyszer ubb mdja azonos a cmke ltrehozsnl lertakkal, vagyis csupn a kvnt szveget kell megadnunk paramterknt. Mivel a sgbubork csak konkrt widgethez tartozhat, a fggvny a GtkWidget tpus fggvnye (set_tooltip_text).

8.2.2.

Megjelents

GtkLabel Formzs. A cmkk szvegnek formzsra a bevezet oben emltett Pango Markup Language elnevezs u lernyelv hasznlhat. A cmkk ltrehozsa gy trtnik, hogy a megadott szveget alaprtelmezetten nem tekintjk ler nyelven megfogalmazottnak, azaz a use-markup tulajdonsg rtke FALSE. Ez azonban a nvkonvencinak megfelel oen a set_use_markup fggvnnyel megvltoztathat. Ezzel azonban kell o vatossggal kell bnnunk. Amennyiben a use-markup tulajdonsg rtke TRUE, a cmke szvege meg kell feleljen ler nyelv szablyainak. Ez kt esetben kritikus. Az egyik, ha a szveg olyan elemeket tartalmaz, amik a ler nyelvben is rtelmezettek. Ebben az esetben az ilyen elemeket gy kell megvltoztatnunk (escape), hogy ler nyelvnek megfeleljen, ugyanakkor a jelentse ne vltozzon. A Glib markup_escape_text fggvnye pontosan a lertakat implementlja. Ezen fggvnyt minden olyan esetben hasznland, amikor nem statikus szvegr ol van sz, hanem a szveg pldul felhasznltl szrmazik. Ilyen lehet pldul egy korbban bekrt nv, ami tartalmazhat pldul kisebb, vagy nagyobb jelet. A msik kritikusnak mondhat eset, ha a ler nyelv u szveget egy printf tpus formtumlerval akarjuk ltrehozni. Ehhez a szintn a Glib rszeknt elrhet o markup_printf_escaped fggvny nyjt segtsget. Trdels. Hosszabb szveg u cmkk hasznlata esetn ami jellemz oen akkor fordul el o, ha egy magyarz szveget akarunk pldul egy zenetablakban megjelenteni clszer u trdelnnk a szveget elkerlend o, hogy a szveg helyignye miatt a cmke s ezzel egytt az zenetablak vzszintes helyignye arnytalanul megn ojn, ami esetleg ahhoz vezethet, hogy az ablak kilg a munkaterletr ol, gy annak egyes funkci legrosszabb esetben a bezr gomb elrhetetlenn vljanak. Erre termszetesen tbb mdszer is knlkozik. Magunk is megadhatunk a szvegben trdelst azltal, hogy sortrst tesznk a szvegbe. Ez egyszer ubb estekben megteszi, de nem tl elegns megolds, mivel nem szmol a megjelentend o cmke szmra aktulisan rendelkezsre ll hellyel, vagyis ha a cmkt tartalmaz ablak mrett nveljk, a sortrs helye nem vltozik, a szveg nem hasznlja ki a rendelkezsre ll helyet, cskkenteni pedig csak addig lehet az ablak mrett, amg el nem rjk a leghosszabb sor minimlis helyignyt. A problma akkor igazn szembet un o, ha cmke szvege nem statikus, hanem valamilyen felhasznltl szrmaz adat (pl: objektum neve, IP cm, . . . ), vagy valamilyen mdszerrel sz ur lista (pl: hibs elemek listja) szerepel benne. Clravezet o a GTK, konkrtabban a Pango ltal nyjtott ksz megolds hasznlata. Ez lehet ov teszi a cmke klnbz o mdokon trtn o automatikus trdelst. Ehhez el oszr is engedlyeznnk kell ezt a funkcit (set_line_wrap), msrszr ol vlasztanunk kell trdelsi mdot. Ez utbbi alaprtelmezetten a szhatrokon val trdels (PANGO_WORD), ami helyett a set_line_wrap_mode fggvny meghvsval bellthatunk karakterenknti (PANGO_WORD), illetve vegyes (PANGO_WORD_CHAR), ami azt jelenti, hogy egy sz kifr a rendelkezsre ll helyen a sor vgn, akkor szhatron trtnik meg a sortrs, ha nem, akkor az adott szbl annyi karaktert tesznk az adott sorba amennyi mg oda kifr. Rszben megmutats. Ha a rendelkezsre ll hely csekly s a cmke valamely rszletb ol (eleje, vge, esetleg mindkett o egytt) kvetkeztethetnk a cmke teljes szvegre1 , akkor elegend o lehet csak a tnylegesen informcit hordoz rszt megmutatnunk. A feleslegesnek tlt rszeket pedig gymond kihagyhatjuk.
elnevezsi konvencik esetn a nevek els o rsze mindig azonos, vagyis ez nem hordoz rdemben informcit, gy helysz uke esetn rdemes csak a szvegek vgt megmutatni
1 bizonyos

56

Ez a kihagys a gyakorlatban gy trtnik, hogy megadjuk, melyik az a rsze a cmknek (eleje, kzepe, vagy vge) amit elhagyhatnak tlnk s hely sz ukben a tnyleges szveg helyett csak a kihagys jelz o karakter (ellipsis: . . . ) runk ki. A belltsra szolgl fggvny rtelemszer uen a set_ellipsize, paramtere pedig az elhanyagols pozcija, ami lehet a cmke eleje (PANGO_ELLIPSIZE_START), kzepe (PANGO_ELLIPSIZE_MIDDLE), vge (PANGO_ELLIPSIZE_END), illetve mdunk van kikapcsolni ezt a funkcit (PANGO_ELLIPSIZE_NONE). Szlessg. Az el oz o kt funkci hasznlatakor kt tulajdonsg rvn kontrolllhatjuk a cmke szvegnek szlessgt. Az egyik (width-chars) a szveg kvnt szlessgt adja meg karakterekben, mg a msik (max-width-cars) rvn a maximlis szlessget hatrozhatjuk meg szintn karakterekben. Mindkt tulajdonsg esetn megadhat -1, mint szlessg, ami automatikus szlessgkalkulcit jelent, ami rthet o okoknl fogva az alaprtelmezett rtk.

8.2.3.

Kezels

GtkLabel Kijells. Alaprtelmezetten a cmkk nem kijellhet oek s ez a m ukds a legtbb esetben meg is felel a kvnalmaknak. Vannak azonban olyan esetek, ahol kifejezetten zavar, ha a szvegeket nem lehet kijellni s ezzel egytt msolni sem. Ilyen eset pldul, amikor hibazeneteket jelentnk meg cmkk segtsgvel. Az ehhez hasonl esetekben a felhasznl szmra roppant bosszant, hogy br a hibazenet lthat, mgsem lehet az egyszer uen tmsolni pldul egy hibabejelent ou rlapra. Ennek elkerlsre a cmkt kijellhet ov tehetjk (set_selectable, m clszer u ezt csak akkor megtenni, ha a cmke fontos s manulisan nehzkesen reproduklhat informcit tartalmaz, mivel a kijellhet osg egyben fkuszlhatsgot is jelent, ami billenty uzetr ol val kezelst megnehezti.

8.3.

Halad muveletek

8.3.1. GtkLabel
Hivatkozs. A cmkk formzsnak egy specilis esete, amikor hivatkozst szeretnnk a szvegben elhelyezni. A HTML esetn hasznlatos mdszert alkalmazhatjuk a Pango ler nyelv esetn is, vagyis a hivatkozs szvege <a> nyit-, illetve </a> zrelem kztt helyezkedik el, mg a hivatkozs a href attribtum rtkeknt adhat meg. A hivatkozsok pp gy viselkednek, mint ahogy azt a bngsz ok esetn megszoktuk, vagyis a hivatkozs szvege alhzott, szne pedig megvltozik a hivatkozs els o aktivlsa utn. A hivatkozs aktivlsnak esemnyt magunk is kezelhetjk, a activate-link szignl segtsgvel. A kezel ofggvnyben a kvnt m uveletsor hajthat vgre, annak fggvnyben, hogy a cmke melyik hivatkozsa kerlt aktivlsra, amit az rtket a kezel ofggvny paramtereknt is megkapunk. A fggvny visszatrsi rtke hasonlan a delete-event szignlhoz azt fejezi, ki, hogy az esemnyt kezeltk-e. Ezrt az ott lertak ennek az szignlnak a kezelsnl is alkalmazhatak.

8.3.2. GtkTooltip
Testre szabott sgablak. Formzs. A korbban lert formz nyelv a sgablakok szvegben is alkalmazhat. A GtkWidget osztly set_toolip_markup fggvnye paramterknt ilyen lernyelv u szveget vesz t paramterknt s annak megfelel oen formzza a sgablakban megjelen o szveget. Sajt ablak. Amennyiben ennl is tovbb szeretnnk menni esetleg kpeket helyeznnk el a sgablakban akkor sajt sgablakra van szksgnk. Ezt a sajt ablakot a korbban mr ismertetett mdszerekkel hozhatjuk ltre s abban gyakorlatilag brmit elhelyezhetnk. A megjelentsr ol, eltntetsr ol, illetve ezek id oztsr ol tovbbra is a GTK gondoskodik, neknk csak a tartalmat kell biztostanunk. Az elkszlt ablak bellthat a GtkWidget osztly set_tooltip_window nev u fggvnyvel, aminek a belltand ablak a paramtere, vagy a nyelvnek megfelel o NULL rtk, ami az alaprtelmezett ablak visszalltst jelenti. Amennyiben a szoksos srga sgablak tmt szeretnnk viszontltni, az ablak nevt gtk-tooltip rtkre kell lltanunk, amit knnyedn megtehetnk a GtkWidget osztly set_name fggvnyvel.

57

8.4.
8.4.1.

Tesztels
Objektum

A Dogtail Node tpusa ltal reprezentlt objektum az amin keresztl gyakorlatilag minden informci elrsre lehet osgnk van, amire a tesztels sorn szksgnk lehet. Szmos esetben kzvetlenl az objektum fggvnynek meghvsa, vagy attribtum kiolvassa rvn, ms esetekben valamilyen interfszen keresztl. El obbiekb ol nhnyat vesznk a tovbbikban sorra. Keress. Az ebben a rszben trgyalt widgettpusok kzl a GtkTooltip a legegyszer ubb s egyszersmind a leggyakoribb esetben nem valdi tpus, mint ahogy azt a fejlesztsr ol szl rszben trgyaltuk, ennek okn a tesztels sorn sem jelenik meg kln tpusknt, kiolvassra Node objektumbl kzvetlenl van lehet osg. A GtkLabel s a GtkImage tpus objektumok az akadlymentests szempontjbl betlttt szerepnek neve (roleName) label, illetve icon. Az ilyen tpus elemek keressnl teht ezeket az rtkeket kell megadni a roleName paramternek. A msik keressi lehet osg, hogy az objektum nevre keresnk. A cmke esetn az objektum Sgszveg. Az egyes widgethez tartoz sgbubork szvegt rendkvl egyszer uen megllapthatjuk, ez a textttNode objektum description attribtumnak rtke.

8.4.2.

llapotok

GtkLabel Tbbsoros szveg. A cmkk alapvet oen alkalmasak tbbsoros megjelentsre, gy egy llapot ezen widgetek kapcsn bizonyos lesz mgpedig a MULTI_LINE, amit a korbbiakban ismertetetteknek megfelel oen a getState fggvnnyel tudunk lekrdezni. Ltezik egy msik ezzel ellenttes rtelm u sttusz is, ami a cmkk esetn termszetesen sosem lesz rsze az llapothalmaznak, ez pedig a SIGNLE_LINE. Fkuszlhatsg. A cmkk kapcsn fontos lehet, hogy a szveget ki lehessen jellni, ami egyttal magval vonja, hogy az adott widget fkuszlhatv is vlik, ami alaprtelmezs szerint nem igaz. Ezt a m ukdst teht ellen orizni is tudjuk a megfelel o llapoton (FOCUSABLE) megltn keresztl.

8.4.3.

Interfszek

Csak olvashat szveg A csak olvashat szvegek kezelsre az ATK egy kln interfszt denilt (AtkText). Az olyan elemekhez, amik az akadlymentests s ppgy a tesztels szempontjbl is csak olvasni szoks, az ATK megvalst implementci csak olvassi hozzfrst ad, annak ellenre is, hogy termszetesen megvalsthat lenne, az rst biztost implementci is. Ilyen elemek pldul a cmkk, a tblzatos megjelentst biztost widgetek egyes celli, illetve minden olyan elem, ami rhat hozzfrst is ad, mint pldul egy egysoros beviteli mez o. Az interfszen keresztl nem csupn a szveget magt, de annak egyes rszeit, illetve az egyes rszek formzsi paramtereit is elrhetjk. A queryText fggvnnyel lekrdezhet o interfsz objektum szmos szolgltatst nyjt, br ezek jelentkeny rszre mint amilyen pldul a szvegrszek kezelse a cmkk sorn nem, vagy csak nagyon ritkn lesz szksgnk, gy ezekkel majd egy ks obbi rszben foglalkozunk. A legfontosabb informci termszetesen maga a szveg, esetenknt annak hossza, el obbi a getText fggvnyen, utbbi a characterCount attribtum rvn rhet o el. A getText fggvny esetn fontos krlmny, hogy az kt ktelez o paramterrel is rendelkezik, a kvn szveg kezdeti- s vgpozcijnak indexvel, ahol a msodik paramter esetn a 1 rtk a szveg vgt jelenti. Mivel teljes szveg a leggyakrabban rdekl odsre szmot tart rtk, a Dogtail ehhez a text interfszt, illetve annak m ukdst elrejt o elrst is biztost a Node osztly text tagja rvn, aminek kiolvassa a queryText().getText(0, -1) szerinti hvsval kzel egyenrtk u. A klnbsg az, hogy text attribtum kiolvassa kezeli azt a helyzetet, hogy az adott objektum nem implementlja a text interfszt, ilyen esetben None rtkkel tr vissza, mg ilyen esetekben a queryText fggvnyhvs minden ms interfsz lekrdezshez hasonlan NotImplementedError kivtelt dob. A szveg, amit a text interfszen keresztl kiolvashatunk csak a nyers szveget tartalmazza aze egyszer u kezels rdekben annak formzsi paramtereit nem. Ha azt szeretnnk megtudni, hogy az egyes karakterek miknt vannak formzva, akkor a text interfsz getAttributeRun fggvnyt hasznlhatjuk, aminek egyetlen paramter a karakter sorszma, visszatrsi rtke pedig egy lista, ami els o eleme egy jabb lista, ami a karakter formzsi paramtereinek tartalmazza, msik kt eleme pedig annak szvegrsznek a kezd o s vgpozcija, ami ugyanezen paramterekkel lett formzva.

58

Kp A kpek kezelsre ltezik egy kln interfsz az ATK fggvnyknyvtrban, amihez tartoz implementcit a Dogatil egy Node objektumra a queryImage fggvnnyel krdezhetnk le. Az interfsz sajnos nem nyjt klnsebben szles kr u szolgltatsokat, mindssze a kp mrett, elhelyezkedst s lerst ll mdunkban lekrdezni. Sajnlatosan a Dogatil ehhez nem sok segtsge nyjt, ezrt is kell az Image interfszt elkrnnk s azt magunknak kezelnnk. Ez az interfsz viszont mr tvisz minket a Dogtail alatt meghz AT SPI 2 vilgba, aminek rszleteiben nem clunk elmerlni, gy itt csak azokat a hvsokat ismertetjk, amikre a kpek tesztelsnl szksgnk lehet. Az el obb emltett paramterek kzl a legegyszer ubb a kp mrete, amit a getImageDescription paramter nlkli fggvny hvsa rvn krdezhetnk le, ami az x, illetve y irny pixelben vett mretek listjt adja vissza. A pozci lekrdezse is teljesen hasonlan m ukdik, mret helyett az x, y koordintkat visszakapva a listban, viszont a pozci maga relatv s hogy mire relatv azt a getImagePosition fggvnynek paramterknt kell tadnunk. Ez a paramter lehet a pyatspi modul WINDOW_COORDS, vagy DESKTOP_COORDS rtke, aminek megfelel oen vagy az ablakhoz, vagy maghoz a munkaterlethez kpest rtelmezend oek a koordintk. Lehet osg vagy a kt rtkpr egyttes lekrdezsre is a getImageExtents fggvnnyel, ami ugyanazt a paramter veszi t, mint a getImagePosition s szintn egy listval tr vissza, aminek els o kt eleme a relatv koordintkat, msodik kt elem pedig a mreteket tartalmazza. Ezen rtkekb ol messzemen o kvetkeztetseket levonni nem lehet. Klnsen akkor vagyunk bajban ha kt azonos mret u ikon kztt szeretnnk klnbsget tennnk a tesztels sorn, ami nem ritka plda, hiszen szoks klnbz o szn u ikonokkal mondjuk valamilyen llapotot jelezni. Ebben az esetben mentsvrunk a kp lersa lehet, amit a Node imageDescription rtke tartalmaz s amit alkalmazsunk fejlesztsekor az AtkObject set_image_description fggvnnyel llthatunk be.

8.4.4.

Viszonyok

Az egyes widgetek kztt bizonyos vonatkozsokban sszefggsek llhatnak fenn. Ezeket az sszefggseket amiket szabad fordtsban nevezhetnk viszonyoknak (relation) , a Dogtail segtsgvel is le tudjuk krdezni. Tlnyom tbbsgben nem is viszonyokrl, hanem viszonyprokrl beszlnk, amik kztt 1 : 1 s 1 : N tpus kapcsolatok egyarnt vannak. ltalnossgban az mondhat el, hogy minden egyes Accessible objektum tbbfle viszonyban is lehet, tbb ms objektummal. Els o krben teht azt tudhatjuk meg, hogy mik azok a viszonyok, amikkel sszekapcsoljk az adott objektumot ms objektumokkal. Ennek lekrdezsre a getRelationSet fggvny szolgl, ami egy kontnert ad vissza, benne a viszonyok lersra szolgl Atspi.Relation objektumokkal. Ezen objektumokbl kiderthet o a viszony tpusa a getRelationType fggvny hvsval, valamint, hogy a hny objektummal ll fenn az adott viszony, amit a getNTargets fggvny visszatrsi rtke ad meg. Az N darab objektum egyesvel a getTarget fggvny rvn rhet o el paramterknt egy sorszmot tadva. Az egyik viszony, a cmkre s az ltala felcmkzett widgetre vonatkozik, ahol termszetesen tbb cmke is vonatkozhat ugyanarra widgetre, viszont egy cmke egyszerre csak egy widgetet vonatkozhat. Ez kvetkezik a GtkLabel osztly set_mnemonic_widget fggvny hasznlatbl is, hiszen paramterknt csak egy widget adhat meg. A viszony tpusa ebben az irnyban pyatspi.RELATION_LABEL_FOR, ahol teht a getNTargets fggvny mindig egyet ad vissza, mg az ellenkez o irnyban a viszony tpusa pyatspi.RELATION_LABELLED_BY, ahol tbb cl is lehetsges, de ez nem jellemz o. Erre a gyakran hasznlt viszonyprra a Node osztly is ad megoldst, a relation interfsz kzvetlen hasznlatnl szmottev oen egyszer ubbet. Egy adott Node cmkinek listja a labeller, az adott Node ltal cmkzett objektum pedig a labelee attribtum keresztl rhet o el.

2a

rvidts az angol Assistive Technology Service Provider Interface kifejezst takarja

59

9. fejezet

Egysoros beviteli mez ok


Most, hogy mr tl vagyunk a kontnerek mibenltnek megtrgyalsn, ideje azzal foglalkozni milyen widgeteket lehet a kontnerekben elhelyezni. Az els o s taln legkzenfekv obb megolds erre a krdsre egy beviteli mez o, hiszen ablakaink jelentkeny rszt arra hasznljuk, hogy a felhasznltl adatokat krjnk be. Ez a rsz a beviteli mez okkel ltalnos s az egysoros beviteli mez ok konkrt fejlesztsi s tesztelsi krdseivel foglalkozik.

9.1.
9.1.1.

Fogalmak
Beviteli mez ok tpusai

Az adatbevitelre szolgl widgetek szmos szempont szerint csoportosthatak. Ezek kzl csak a legkzenfekv obbeket vesszk rviden sorra, azokat addig a mrtkig, amg ezen rsz szempontjbl rdekesek. Bevitt adat tpusa szerint Gyakorlatilag minden adat bevihet o szvegknt, ugyanakkor nem mindig ez a leginkbb clravezet o mdszer. Felhasznli szempontbl egy resen ll szveges beviteli mez o meglehet osen ktsgbeejt o ltvny. Ilyen esetben ugyanis semmi nem utal arra, hogy voltakppen a beviteli mez ot milyen tpus, formtum, hosszsg, kdols szveggel lehet feltlteni. Emiatt mindig clszer u a lehet o legspecikusabb widgetet alkalmazni. Emellett persze az is igaz, hogy a leggyakoribb beviteli eszkznk mgiscsak a szveges beviteli mez o marad.

(a) Szvegbeviteli mez o[9]

(b) Szmbeviteli mez o[9]

9.1. bra. Szveg s szm bevitele

Szveg. A szveg bevitele teht a legltalnosabb szksglet, amit egy UI kapcsn elkpzelni lehet, mgis szmos olyan funkci ltezik, ami egy szveges bevitelt lehet ov tev o widgetnek teljestenie kell. Ilyen pldul kijells, a msols, a beilleszts, beszrs, a unicode karakterek kezelse, a hasznlt bet utpus-paramterek megadsnak lehet osge akr karakterenknt. Erre a GTK szveges bevitelre alkalmas widgetei termszetesen mind kpesek, s ot, de err ol majd ks obb. Szm. Szmok bevitele gyakorlatilag a szvegbevitel egyfajta specializcija, legalbbis a bevitel ellen orzsnek tekintetben. Szmok bevitele esetn nyilvn csak szmjegyeket, illetve a szmok bevitelhez kapcsold egyb karaktereket (tizedes vessz o, el ojel, . . . ) engednk bevinni. Emellett egy widget nyjthat mg egyb knyelmi szolgltatsokat is amik megknnytik a fejleszt ok munkjt, min pldul a minimlis, maximlis elfogadhat rtk, tizedes jegyek szmnak meghatrozsa, lpskz megadsa az rtk lpsenknti megvltoztatshoz, vagy akr szmknt val bellts, illetve lekrdezs lehet osge. Sorok szma szerint A sorok szma szerint mindssze kt tpus megklnbztetsnek van ltjogosultsga. Az egy, illetve a tbb sor kezelsre alkalmas widgetek mind a felhasznls krben, mind a kezels mdjban, mind pedig a tesztelsben gykeresen eltrnek 60

egymstl. Egysoros beviteli mez ok. Ezen beviteli mez ok esetn a trolt, illetve megjelentett rtket jellemz oen egy egysgknt kezeljk. Egyszer u, nhny tz karakternyi, adatot krnk be ezen widgetek segtsgvel, gy sem klnsebb szvegszerkesztsi, sem pedig ltvnyos megjelentsi funkcikat nem kell a widgetnek elltnia. Ennek megfelel oen sem a hasznlat, sem pedig a tesztels nem jelent alapesetben klns kihvst. Tbbsoros beviteli mez ok. Lvn ezek a widgetek gyakorlatilag egy egyszer ubb szvegszerkeszt o alkalmazsknt is felfoghatak, akr komplett fjltartalmak kezelsre is alkalmasak, akr olyan extra funkcik ignybevtele mellett, mint a tartalom formtumnak megfelel o szintaxis kiemels (syntax highlight). Ennek megfelel oen a kezels sem annyira kzenfekv o, mint az egysoros widget esetn. Tesztelsi szempontbl azonban mindaddig amg csak a tartalmat egyben akarjuk kiolvasni, vagy berni nem lesz igazn nehz dolgunk.

9.1.2.

Interfsz

Azon widgetek kezelshez, melyek valamilyen tartalom szerkesztsre szolglnak fggetlenl attl, hogy ez a tartalom szm vagy akr szveg, egy vagy tbb sort foglal el a GTK egy interfszt (GtkEditable) denil. Ez az interfsz meghatroz szmos olyan m uveletet (insert_text, select_text, get_position, . . . ), illetve szignlt (changed, delete-text, insert-text), amiket az interfsz megvalst widgetnek implementlnia kell. Ennek eredmnyeknt ezen widgetek egy egysges felleten (API ) keresztl kezelhet oek s csak a specikumok tekintetben kell az interfszt implementl widgethez tartoz fggvnyt, szignlt hasznlnunk.

9.2.
9.2.1.

Alapmuveletek
Ltrehozs

A ltrehozs formai elemei a korbbi rszek ismeretben nem okozhatnak meglepetst, gy a tartalmi elemekre koncentrlunk. Mindkt widget esetben van mire. GtkEntry A GtkEntry osztly esetben ltezik egy paramter nlkli konstruktor fggvny (new), ami voltakppen semmit klnset nem tesz. Ltrehoz egy olyan GtkEntry objektumot, ami a tulajdonsginak alaprtelmezett rtkeit veszi fel, ami pontosan megfelel a htkznapi hasznlat szksgleteinek. A msik konstruktor fggvny egy GtkEntryBuffer objektumot vesz t paramterknt, aminek segtsgvel lehet ov vlik a buffer ltal trolt adat megjelentse tbb klnbz o GtkEntry pldnyban. A GtkEntryBuffer voltakppen az egysoros beviteli mez o adattrolja, az ehhez szksges kevs szm tulajdonsggal (text, length, max-length) s szignllal (deleted-text, inserted-text), valamint az ezen tulajdonsgok belltsra, lekrdezsre a szoksos nevezktan szerint , illetve a szignlok kivltsra szolgl fggvnyekkel. GtkSpinButton A GtkSpinButton, br a GtkEntry osztlybl szrmazik, annak specializcija, attl mgis jelentkeny mrtkben eltr, mind a ltrehozs, mind a ks obbi kezels tekintetben. Ltrehozsra egy hrom paramteres fggvny szolgl, aminek minden paramtere szorul nmi magyarzatra. adjustment A GtkAdjustment egy olyan vals szmot reprezentl, ami nem csupn egy magban ll rtk hiszen erre megfelelne egy egyszer u gdouble is , hanem bizonyos paramterekkel van sszerendelve. Ezek a paramterek, a konstruktor fggvnynek val tads sorrendjben, a kvetkez ok. value A konkrt rtk. lower, upper Az rtk ltal felvehet o minimlis, maximlis rtk. step increment, page increment Az rtk felhasznl ltal trtn o nvelsekor, cskkentse sorn hasznland lpskz. Konkrtan a le, fel, valamint a page down, page up billenty uk lenyomsakor a step increment, illetve a page increment rtkvel cskken, illetve n o az rtk. A widget maga is tartalmaz egy fel-le nyl prost, ami az rtk nvelsre, cskkentsere szolgl s szintn a step increment rtket hasznlja. page size A GtkSpinButton esetben nem hasznlt bellts. digits A widget ltal az rtk megjelentsekor hasznlt tizedes jegyek szma.

61

climb rate Az rtk felhasznl ltali ismtl od o nvelsekor, cskkentsekor bizonyos lpsszm utn hasznland gyorstsi arny. Gyakorlatban a folyamatosan lenyomott le, fel, page down, page up billenty uk, illetve a widget fel le nyilai hatsra lp letben ez a mechanizmus.

9.2.2.

Tartalom kezelse

A tartalom kezelse alapvet oen ktflekpp trtnhet; szveg szerint, illetve rtk szerint. Termszetesen a GtkEntry esetn csak a szveg elrse lehetsges, mg a GtkSpinButton esetn mindkt md elrhet o, lvn a GtkSpinButton voltakppen GtkEntry. A fggvnyek nevei rtelemszer uen GtkEntry esetn get_text, illetve set_text, a get_value, set_value, illetve get_value_as_int, set_value_as_int.

9.2.3.

Csak olvashat md

Egy alapvet oen adatok bekrsre szolgl widget esetn a szerkeszthet osg tiltsa ugyan ritka, de nem szokatlan m uvelet. Ennek lehet osgt a korbban mr emltett a GtkEntry s GtkSpinButton ltal is implementlt GtkEditable interfsz biztostja. rtelemszer uen a set_editable fggvny az, amit hvva a szerkeszthet osget llthatjuk.

9.2.4.

Jelszavak kezelse

A jelszavak kezelsnek szempontjbl kt fggvnyt, illetve az ltaluk mdostott tulajdonsgot kell megismernnk. Az els o tulajdonsg visibility, ami alaprtelmezetten TRUE rtket vesz fel , meghatrozza, hogy a beviteli mez oben, az annak rtkl adott szveget fogjuk ltni, vagy ehelyett az azzal megegyez o szm egyforma karaktert. Utbbi esetben ez a karakter, a msik megemltend o tulajdonsg (invisible-char) rvn adhat meg. Ennek alaprtelmezett rtkt a GTK hatrozza meg a rendszeren elrhet o bet ukszleteknek megfelel oen.

9.2.5.

Szignlok

A szignlok tekintetben ltalban csupn a beviteli mez o tartalmnak mdostsa az, ami az rdekl odsnkre szmot tart. Ez a vltozs ugyanakkor tbbfle is lehet. Egyrszr ol szvegszer u vltozs egy szveges beviteli mez o esetn, az rtk vltozsa szm bevitelre szolgl widget esetn. Ez utbbi esetben megklnbztethet oek azok az helyzetek, amikor a szveg rsa vezetett az rtk vltozshoz, illetve az az eset, amikor a widget sajt funkciit (fel/le nyl, page up/down billeny uk, . . . ) kihasznlva nveljk, illetve cskkentjk az rtket. Szveg vltozsa A GtkEditable tpus ezzel egytt teht az interfszt implementl GtkEntry, illetve az abbl szrmaz GtkSpinButton changed szignlja minden esetben kivltdik, amikor a beviteli mez o tartalma megvltozik, pontosabban megvltozott. A szignlt kezel o fggvny mr csak azt kvet oen hvdik meg, miutn a szveg mr megvltozott, vagyis a szignlkezel o fggvnyben lekrdezve mr az j rtket kapjuk. Mivel a szignl voltakppen minden billenty u letst kvet oen legyen az bers vagy trls meghvdik, clszer u a kezel ofggvnyben implementltak kapcsn ezt gyelembe venni, pldul a lefuts id oignyt a lehet osg szerinti minimumon tartani. Mg ha a kd lefutsa gyors is, attl rdemes vakodni, hogy minden egyes billenty u lenyomsra vgrehajtsuk azt a m uveletet (validci, ms felleti elemek vltoztatsa, . . . ), amit elegend o akkor megtennnk, ha a beviteli mez o elvesztette a fkuszt. Az erre alkalmas szignl is adott (focus-out), a bevitt adatokra vonatkoz validci (pl: IP cm, regulris kifejezs), vagy ppen a tartalom egyb widgetekre gyakorolt hatsa szablyainak clszer uen amgy sem magbl a hatsbl kell kiderlnik. Erre alkalmas eszkz inkbb valamely sg, ami egy ks obbi rszben kerl ismertetsre, ugyanakkor a hiba jelzsre hasznlhatak a korbban ismertetett ikonok. rtk vltozsa A GtkSpinButton kt szignllal is szolgl a trolt rtk megvltozsnak jelzsre. A value-changed minden olyan esetben kivltdik, miutn a trolt rtk megvltozik, brmi legyen is annak az oka, mg a change-value szignl csak abban az esetben ha a GtkSpinButton tartalma nem szveg bersnak hatsra, hanem a billenty uzetr ol trtn o vezrls (fel/le nyilak, page up/dowm, . . . ) kvetkezmnyeknt vltozik meg.

9.3.
9.3.1.

Halad muveletek
Ikonok

Beviteli mez onkben lehet osg van ikonok megjelentsre a szvegmez o mindkt oldaln. Ugyanakkor nem csupn megjelentsr ol van sz, hiszen az ikonok klnbz o m uveleteit is kezelni tudjuk, ami szmos hasznos, knyelmes s

62

ltvnyos funkci megvalstsra ad lehet osget.

9.2. bra. Ikonok hasznlata szvegbeviteli mez oben

keress. Egy-egy ikonnal jelezhetjk a beviteli mez o kt oldaln, hogy a bert rtket keresni szeretnnk valamely tartalomban legyen az egy tbb soros beviteli mez o, egy fjl, vagy brmi ms , mg a msik ikon szolglhat a keressi kifejezs trlsre. jelszbevitel. A jelszavak bevitelekor ikonnal jelezhetjk, hogy a megjelen o karakterek nem vletlenl nem az ltalunk bertakat mutatjk, a msik ikon pedig gyelmeztetsl szolglhat, hogy ha a caps lock be van kapcsolva1 . fjlmuveletek. Fjlnevek bevitelekor jelezhetjk a felhasznl fel, hogy e mez oben szerepl o fjlv mire szolgl majd voltakpp. Ezen tlmen oen az ikonra kattintva felhozhatjuk a fjlvlasztsra szolgl dialgust.

9.3.2.

Folyamatindiktor

A beviteli mez o httereknt hasznlhatunk folyamatindiktort, amivel jelezhetjk egy a beviteli mez o tartalmval sszefgg o folyamat llst. Amennyiben a folyamatot magt akarjuk rzkeltetni, viszont nem ismerjk annak vgt, illetve aktulis llst, akkor vlaszthatunk egy olyan mdot ahol a folyamatindiktor a beviteli mez o kt vge kztt pulzl, ahol a progress_pulse fggvny hvsval mozdthatjuk tovbb a folyamatindiktort a progress-pulse-step tulajdonsg ltal meghatrozott (0 s egy kztti rtk) mrtkben.

9.3. bra. Ikonok hasznlata szvegbeviteli mez oben Amennyiben a folyamat llapota pontosan ismert, akkor az brhoz hasonl eredmny ahol az indiktor a folyamat llapotnak mrtkben foglalja el a htteret , a progress-fraction tulajdonsg lltsval rhet o el, ahol az rtk 0 s 1 kztt a folyamat kszenlte.

9.3.3.

Irnymutat szveg

Egy beviteli mez ok esetn legyen az szveg vagy szm bevitelre sznva nincs kevsb felhasznlbart viselkeds, mint hogy a widget semmilyen utalst nem tartalmaz arra nzvst, mit is kellene voltakpp tartalmazni. Erre termszetesen alkalmas megolds az el oz o rszben megismert cmke, illetve sgbubork, de a GtkEntry, valamint az abbl szrmaz widgetek is rendelkeznek egy emltsre rdemes megoldssal. Ez pedig nem ms, mint hogy a beviteli mez obe egy olyan szveget rhatunk, ami addig ltszik, amg felhasznl a mez obe rni nem kezd, vagy az rs vgeztvel resen hagy. Ez a szveg szolglhat mintul a berand adat tartalmra, formjra s teszi ezt anlkl, hogy felhasznli interakcit ignyelne, mint a sgbubork. Ezen szveg a megadsra az GtkEntry osztly set_paceholder_text fggvnye szolgl.

9.3.4.

Buffer

A GtkEntry tpus esetn az adattrol rteg (model) elvlasztsra kerlt a megjelentst, illetve vezrlst (view, controller) vgz o rtegt ol, ami a tulajdonkppeni GtkEntry. Egy GtkEntry ltrehozhat paramterek nlkl, vagy adattrolst vgz o tpus a GtkEntryBuffer egy pldnynak megadsval. Ez egyrszt lehet ov teszi, hogy tbb, a megjelentst vgz o widget osztozzon ugyanazon az adattroln eltr o kijells, vagy ppen kurzorpozci mellet. Msrszr ol leszrmazva a GtkEntryBuffer buffer tpusbl, magunk is implementlhatunk adattrolt melyek a legklnbz obb ignyeknek tehetnek eleget.
1 Ezt

funkcit kszen kapjuk a GtkEntry esetn, be-, illetve kikapcsolsa a caps-lock-warning tulajdonsg lltsval lehetsges.

63

9.3.5.

Formzs

A GtkSpinButton esetn magunk is meghatrozhatjuk, hogy a trolt adatot milyen formtumban fogadjuk el, illetve milyen formban jelentjk meg. Ehhez nem kell egyebet tennnk, mint az input, illetve az output szignlokra megfelel o kezel o fggvnyeket ktni.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

staticgboolean on_output ( GtkSpinButton * spin ) { GtkAdjustment * adjustment = gtk_spin_button_get_adjustment ( spin ); gdoublevalue = gtk_adjustment_get_value ( adjustment ); gintdigits = gtk_spin_button_get_digits ( spin ); gchar * buf = g_strdup_printf (" %0.* f", digits , value ); if ( strcmp (buf , gtk_entry_get_text ( GTK_ENTRY ( spin )))) gtk_entry_set_text ( GTK_ENTRY ( spin ), buf ); g_free ( buf ); returnTRUE ; }

staticgint on_input ( GtkSpinButton *spin , gdouble * new_val ) { gchar * err = NULL ; * new_val = g_strtod ( gtk_entry_get_text ( GTK_ENTRY ( spin )), & err ); if (* err ) returnGTK_INPUT_ERROR ;

returnTRUE ; }

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

Kdrszlet 9.1. Az input s output szignlok felldenilsa az alaprtelmezett m ukdst implementlva 2. sor Az input s az output szignl kezelsre szolgl fggvny annyiban tr el egymstl, amennyiben a feladat. Az input szignlt kezel o plusz paramtere (new_value) az input kezel o fggvnyhez kpest , a szvegknt elrhet o rtk lebeg opontos szmknt trtn o visszaadsra szolgl. 15. sor A visszatrsi rtk TRUE rtke mindkt esetben azt jelenti, hogy a szignlt sikeresen kezeltk, az talaktst elvgeztk. A FALSE visszatrsi rtk esetn a hv az alaprtelmezett talakt fggvnyt aminek m ukdse azonos a bemutatottal hvja meg. Az input szignl esetn lehetsges mg egy visszatrsi rtk (GTK_INPUT_ERROR), amit arra hasznlunk, hogy a hv fel jelezzk, a GtkSpinButton szvege nem rtelmezhet o. Ezrt is gint ezen fggvny visszatrsi rtknek tpusa, mg a msik gboolean, hisz ott csak azt kzlhetjk a GtkSpinButton a berst azt ltalunk kvnt formtumban megtettk-e vagy sem. 11. sor Az input esetn alaprtelmezetten a GtkSpinButton szvegt decimlis szmrendszerbeli tizedes trtt prbljuk alaktani. Ha ez sikerl TRUE rtkkel trnk vissza, ha nem, akkor a visszatrsi rtk GTK_INPUT_ERROR jelezvn, hogy kezeltk az input szignlt, de az talakts sikertelen volt, gy az alaprtelmezetten input szignlt kezel o fggvnyt szksgtelen meghvni. Az output szignl kezelsekor pp ez el obbiek ellenkez oje trtnik. A GtkSpinButton aktulis szmszer u rtkt alaktjuk a megfelel o formtum szvegg, ez esetben a digits tulajdonsgnak megfelel o szm tizedes jeggyel decimlis formban. Ezt rjuk vissza a beviteli mez obe. A visszars viszont csak akkor trtnik meg, ha az a korbbi rtkt ol klnbzik. Az input s output szignlok felhasznlsra kzenfekv o plda lehet, hogy ha nem decimlis szmrendszerben szeretnnk a szmokat megjelenteni. Ez esetben a g_strtod fggvny helyett ami csak tzes szmrendszerbeli szmokkal m ukdik a g_strtoull fggvny hasznlhat, ami a paramterknt kapott szmrendszerrel kpes dolgozni, illetve a g_strdup_printf fggvny esetn a formtum lert kell a szmrendszernek megfelel oen mdostani (pl: %.*x tizenhatos szmrendszer esetn). Ett ol tgabban is rtelmezhetjk a be-, illetve kimenet mdostst. Lehet osgnk van akr arra is, hogy a GtkSpinButton ne szmokat troljon, hanem szvegeket, pldul a hnapok neveit.

64

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

staticgint on_input ( GtkSpinButton *spin , gdouble * new_val ) { staticgchar * month [12] = { " January ", " February ", " March ", " April ", " May ", " June ", " July ", " August ", " September ", " October ", " November ", " December " }; constgchar * text = gtk_entry_get_text ( GTK_ENTRY ( spin )); gint i; for (i = 1; i <= sizeof ( month ) / sizeof (* month ); i ++) if (! strcmp ( month [i - 1], text )) { * new_val = i; returnTRUE ; } * new_val = 0.0; returnGTK_INPUT_ERROR ; }

staticgint on_output ( GtkSpinButton * spin ) { staticgchar * month [12] = { " January ", " February ", " March ", " April ", " May ", " June ", " July ", " August ", " September ", " October ", " November ", " December " }; GtkAdjustment * adjustment = gtk_spin_button_get_adjustment ( spin ); gintvalue = gtk_adjustment_get_value ( adjustment ); constgchar * text = gtk_entry_get_text ( GTK_ENTRY ( spin ));

if ( value && strcmp ( month [i - 1], text )) { gtk_entry_set_text ( GTK_ENTRY ( spin ), month [i - 1]); } returnTRUE ; }

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

Kdrszlet 9.2. Az input s output szignlok felldenilsa hnapok megjelentshez Ebben az esetben nem trtnik ms, mint hogy a formzst nmikpp tovbbgondoljuk. Az input szignl kezelsekor ahogy a korbbi pldban is , megprbljuk a bert szveget a formtumnak megfelel oen rtelmezni. Ez korbban annyit jelentett, hogy tizenhatos szmrendszerbeli szmknt prbltuk a szveget rtelmezni, most viszont mivel az rtkkszletnk kicsi ellen orizzk, hogy a bert szveg az rtkkszlet (hnapok nevei) valamelyik eleme-e. Ha igen, akkor a hnap sorszma lesz az j rtknk, ha nem akkor GTK_INPUT_ERROR rtkkel trnk vissza. A formzs vagyis az output szignl kezelse , sorn mindssze az aktulis rtknek megfelel o szveget kapja rtkl a GtkSpinButton, feltve ha eddig nem ez volt az rtke. Termszetesen egy ilyen formzsi megoldsnl clszer u a GtkSpinButton minimum s maximum rtkt az ltalunk kezelt rtkek szmossgnak megfelel oen belltani, ami a hnapok esetn egyet jelent, mint minimum rtket s tizenkett ot, mint maximumot.

9.4.

Tesztels

Lvn a beviteli mez ok a leggyakrabban hasznlt widgetek, tesztelsk is pp ily gyakran fordul el o. Ennek kapcsn megismerkednk nhny a tesztels sorn hasznlt alapfogalommal, amik a ks obbiekben is folyamatosan visszatrnek.

9.4.1.

Keress

Az ebben a rszben trgyalt kt widgettpushoz az szveg-, illetve szmbeviteli mez o tartoz objektumok keressekor a GenericPredicate roleName paramternek text, illetve spin button adand meg. A GtkEntry keresshez ltezik egy specializlt Predicate osztly is, a IsATextEntryNamed, aminek egyetlen paramtere a beviteli mez o neve.

9.4.2.

Interfszek

rhat szvegek Az adatbevitelre szolgl widgetekb ol rtelemszer uen nem, vagy nem csak kiolvasni szeretnnk rtkket, hanem rni is, gy ismerve a text interfsz adta lehet osgeket, ehhez egy msik interfszre lesz szksgnk. Az ATK EditableText nven denilja azt az interfszt ami lehet ov teszi, hogy szvege rjunk, szrjunk be, vagy illessznk be a beviteli mez obe. A legegyszer ubb esetben, amikor csak egy adott szveggel szeretnnk fellrni a beviteli mez o aktulis tartalmt erre az interfszre nem lesz szksgnk, a korbban a text interfsznl ismertetett text attribtumnak val rtkads pontosan gy m ukdik, ahogy azt elvrjuk. Termszetesen ennek megvan a megfelel oje a queryEditableText fggvnyhvs rvn beszerezhet o editable text interfszben is, mgpedig a setTextContents fggvny, aminek paramterl a berand szveget kell tadnunk. Szveg beszrsra is van lehet osg a insertText fggvnnyel, aminek paramterei a beszrs pozcija, a beszrand szveg, illetve a beszrand karakterek szma. A vglap m uveletek szintn ezen az interfszen keresztl rhet oek el. A msolst (copyText), trlst (deleteText), illetve kivgst (cutText) vgz o fggvnyi kt paramtert vesznek t, a szvegrsz kezd o-, illetve vgpozcijt amin a m uveletet vgre akarjuk hajtani. A beilleszts (pasteText) fggvnynek csak egy paramterre, a beilleszts helyre van szksge. Szmok Azon widgettpusokat, amiket szmok bevitelre hasznlunk nyilvnvalan a tesztels sorn is gy szeretnnk kezelni, mg akkor is ha voltakppen szvegknt is kiolvashatnnk, vagy berhatnnk az adatot, aztn a konverzit megejthetnnk 65

magunk. Az ATK szerencsnkre denil a szmok kezelsre hasznlatos interfszt (AtkValue), gy ezzel klnsebb gondunk nem is lesz. Az interfsz azonban nem csupn annyit nyjt, hogy szmknt rhatjuk, olvashatjuk az objektum tartalmt, de lehet osget ad a mez o ltal elfogadott intervallum als, illetve fels o hatrnak kiolvassra is. Az interfsz lekrdezse a mr megszokott elnevezsi konvenci szerinti fggvnnyel trtnik (queryValue), rajta keresztl az intervallum als hatrt a minimumValue, fels o hatrt a maximumValue, mg aktulis rtkt a currentValue attribtumon keresztl rhetjk el. El obbi kett ot csak olvassra, mg utbbit rsra s olvassra egyarnt. Gyakori esetr ol lvn sz ezen feladatok a Dogatil Node osztlyn keresztl is elvgezhet oek, rendre a minValue, maxValue, illetve a value attribtumok segtsgvel. Ez utbbi megolds el onye, hogy megsprolhatjuk az interfsz lekrdezst, illetve nem kell e kivtelkezelssel sem foglalkoznunk, mivel ha az interfsz nem implementlt, akkor lekrdezskor a NotImplementedError kivtel helyett egyszer uen csak None rtket kapunk.

9.4.3.

llapotok

Mivel a beviteli mez oket trgyaltunk ebben a rszben, amik termszetknl fogva rhatak, ugyanakkor lehet osg van arra a szerkeszthet osg letiltsra, kzenfekv oen addik, hogy ezt az llapotot le is lehessen krdezni. Ezt minden tovbbi nlkl meg is lehet tenni a mr ismert getState fggvnynek a pyatspi.EDITABLE rtket megadva paramterknt. Egy msik llapot is kzenfekv oen addik a trgyalt widgetek tpusbl, mgpedig, hogy csak egy sornyi adat fogadsra kpesek, vagyis a pyatspi.SINGLE_LINE llapot mindig rsze a widget llapothalmaznak, mg a pyatspi.MULTI_LINE sosem.

9.4.4.

Tulajdonsgok

Mivel sem a text, sem pedig az editable text interfsz nem ad mdot r mdot, a mr emltett tulajdonsgok (attribute) kzl olvashat ki a GtkEntry osztly set_paceholder_text fggvnye rvn belltott szveget, placeholder-text kulcs alatt.

9.4.5.

Akcik

A gombokhoz hasonlan a beviteli mez ok is rendelkeznek egy rajtuk kivlthat akcival, ez pedig a az alaprtelmezett widget aktivlsa. Amennyiben a vonatkoz tulajdonsg (activates-default) igaz, az Node objektumon az activate akci.

66

10. fejezet

Vlasztson alapul adatbevitel


A szveges adatbevitel leginkbb kzenfekv o mdjnak trgyalsa mr megtrtnt. Ott a szveget szabadon, illetve a validcinak megfelel oen vlaszthattuk meg, ezttal viszont olyan adatok bevitelvel foglalkozunk, ahol az rtkkszlet lnyegesen sz ukebb, mint ami egy GtkEntry, vagy akr egy GtkSpinButton esetn szoksos. Az ebben a rszben bemutatand widgetek akkor hasznlatosak, ha a vlaszthat rtkek szma kicsi, adott esetben csupn kett o, de nem tbb, mint egy tucat.

10.1.
10.1.1.

Fogalmak
Beviteli mez ok tpusai

Ahogy arrl sz volt a szveges bevitelr ol szl rszben, specilis esetek specilis widgeteket kvnnak, lvn az ilyen helyzetekben maguk a widgetek jval inkbb testreszabhatak, mint egy ltalnos helyzetnek is megfelel o szveges beviteli mez o. A testreszabott widgetek megjelense, beviteli mdszereik knnyen alkalmazkodhatnak az ignyekhez. Binris vltozk A specializci egyik vglete, amikor a bevinni kvnt adat mindssze kt rtket vehet fel. Az ilyen binris adatok szp szmban fordulnak el o, legyen sz akr egy opci ki-, vagy bekapcsolt rtkr ol, vagy ms igaz hamis jelleg u adatrl.

10.1. bra. Jell ongyzet[9]

Az opcikat rdemes lehet csoportokba szervezni, ahol az egyes elemek valamilyen logika mentn egyv tartoznak, ugyanakkor az ltaluk felvett rtkek fggetlenek egymstl. Ilyen helyzetekben is alkalmazhat ez a widgettpus, lehet osg szerint fgg oleges elrendezsben, nyolcnl nem nagyobb elemszm csoportokban. Egymst kizr elemek Kis elemszm. Olyan esetekben, amikor nhny lehet osg ha md van r, nem tbb, mint nyolc kzl vlaszthatunk oly mdon, hogy az egyes esetek klcsnsen kizrjk egymst, clszer u a felhasznlnak minden lehet osget megmutatni, megknnytend o a vlasztst, viszont nem engednnk meg, hogy egyszerre egy elemnl tbbet ki lehessen vlasztani. Kzepes elemszm. Amennyiben az elemek szma meghaladja az imnt emltetteket, a felhasznli felleten trtn o elhelyezs gy, hogy az elemek egyid oben lthatak legyenek mr nehzkes. Ezen oknl fogva olyan megolds alkalmazand, ahol alapvet oen csak az aktulisan kivlasztott elem ltszik, ugyanakkor md van az sszes lehet osg ttekintsre is.

67

10.2. bra. Rdigombok[9]

10.3. bra. ComboBox[9]

Vlasztott rtk Nincs vlaszts. Azon esetekben, ahol nem tudunk megfelel o alaprtelmezett rtket adni indulskpp, lehet osg van arra, hogy aktulisan ne legyen egyetlen lehetsges elem sem kivlasztott llapotban. Ezt a helyzetet kezelnnk kell, vagyis az bevitt adatok validcijnak erre a helyzetre is ki kell terjednie. Inkonzisztens llapot. A binris adatok bevitelre egyttal termszetesen megjelentsre is szolgl widgetek lehetsges llapotainak szma, eltr oen attl amit els ore gondolnnk, hrom. A kt kzenfekv o llapoton tl ltezik egy inkonzisztens llapot is, ami sem egyik sem msik llapotnak nem felel meg. Gyakorlatban ennek akkor van jelent osge, amikor eltr o rtkeket egyszerre szeretnnk megmutatni.

10.4. bra. Inkonzisztens llapot jell ongyzetek esetn[6]

10.2.
10.2.1.

Alapmuveletek
Ltrehozs

A ltrehozs nem rejt magban klnsebb bonyodalmakat, hiszen maguk a widgetek is rendkvl egyszer unek mondhatk, ugyanakkor egy-egy gondolat erejig mgis rdemes megllni. GtkCheckButton Az ehhez a tpushoz tartoz widgetek ltrehozsnl rdemben csak egy paramtert kell megadnunk, mgpedig a jell ongyzet szvegt. A szveggel szemben azonban tmasztunk nhny kvetelmnyt, amiket clszer u a felhasznli fellet ksztse kzben gyelembe venni. Az els o kifejezetten a szvegre vonatkozik, ami szerint a szveg els o szavt nagy-, mg a tbbit kisbet uvel kezdjk. A msik csak kzvetetten vonatkozik a szvegre magra, annyi lenne az elvrs, hogy minden jell ongyzet llthat legyen kzvetlenl billenty uzetr ol is, amit a cmkknl mr emltett mdszerrel (mnemonic) rhetnk el.

68

GtkWidget * gtk_check_button_new ( void ); GtkWidget * gtk_check_button_new_with_label ( constgchar * label );

classCheckButton ( Gtk . ToggleButton ): CheckButton (); explicitCheckButton ( constGlib :: ustring & label boolmnemonic = false ); def__init__ (self , label =None , stock =None , use_stock =False , use_underline =False , ** kwds ):

GtkWidget * gtk_check_button_new_with_mnemonic ( constgchar * label );

Kdrszlet 10.1. CheckButton ltrehozsa A mnemonic, valamint a use_underline paramterek clja azonos, a cmkknl korbban emltett mdszer miszerint a kzvetlen elrst biztost billenty ut alhzs jel (_) el ozi meg engedlyezsre szolglnak. A use_underline tulajdonsg hamis rtke esetn az alhzs jelknt ltszdik, teht a kzvetlen elrshez a use_underline tulajdonsg rtknek igaznak kell lennie. A Python nyelv u vltozat a konstrulskor lehet osget ad a beptett ikonok (stock icon) megadsra, akr a label paramter rtkeknt, amennyiben a use_stock paramter rtke igaz. Amennyiben az utbbi rtk hamis a label paramter rtke sz szerint jelenik meg, akkor is ha az egy beptett ikon neve is egyben. A GtkRadioButton Mivel a rdigomb tpus kzvetlen leszrmazottja az imnt trgyalt GtkCheckButton tpusnak, nem meglep o mdon ltrehozsa is nagyban hasonlt a jell ongyzetek ltrehozsval, legalbbis ami a cmke szvegt illeti. Mivel ezt a widgetet csoportban hasznljuk lvn egymst kizr lehet osgek kzl vlasztunk a csoportot valamilyen mdon meg kell tudnunk adni. A gyakorlatban a rdigomb-csoportok kdbl trtn o ltrehozsa gy trtnik, hogy az els o rdigombot gymond nmagban, csoport nlkl hozzuk ltre, a tovbbi rdigombok esetn pedig az els o elem ltrejttekor automatikusan elkszlt csoportot hasznljuk fel. A csoportot a get_group fggvny segtsgvel krdezhetjk le s a visszakapott csoportot adhatjuk t az jabb rdigombok ltrehozsakor paramterknt. Ha a rdigomb mr korbban elkszlt, vagy a cmke megadsval hoztuk ltre, akkor a csoport termszetesen utlag is tllthat (set_group). GtkComboBoxText Amennyiben az elemek tl nagy szma, vagy a helyhiny miatt gy dntnk, hogy az egymst kizr elemek kzl nem rdigombok csoportjbl egyet megjellve akarunk vlasztani, akkor az elemeket listba szervezhetjk, ahol csak az aktulisan kivlasztott elem jelenik meg a felleten. A ltrehozs sorn csupn egy dntst kell meghoznunk, hogy az elem kztti vlasztst lehet ov tesszk-e gy is, hogy az elem szvegt a felhasznl egy egysoros beviteli mez obe (GtkEntry) gpelhesse be.
GtkWidget * gtk_combo_box_text_new ( void ); GtkWidget * gtk_combo_box_text_new_with_entry ( void ); explicitComboBoxText ( boolhas_entry = false ); classComboBoxText ( Gtk . ComboBox ): def__init__ (self , ** kwds ): @staticmethod@ defnew_with_entry ():

Kdrszlet 10.2. ComboBoxText ltrehozsa Amint ltszik az egyes nyelvi vltozatok valamelyest eltrnek egymstl, m az eltrs nem szmottev o. Voltakppen a nyelvi klnbz osgeknek megfelel o konstruktorok megvalstsokrl beszlnk. A C++ vltozat esetn paramterknt vesszk t annak rtkt, hogy a ComboBoxText tartalmazzon-e beviteli mez ot, vagy csak vlasztani lehessen az elemek kztt, mg a C vltozat erre kt fggvnyt ad, ahogy a Python is1 .

10.2.2.

Kezels

GtkCheckButton Billentyuzetr ol trtn o hasznlat. A hasznlhatsg szempontjbl fontos kiemelni, hogy minden jell ongyzetnek adjunk meg kzvetlen elrst biztost billenty ut (mnemonic key), mivel az nagyban knnyti s gyorstja a billenty uzetr ol trtn o hasznlatot. Ez termszetesen nem csak a GtkCheckButton, de az abbl szrmaz GtkRadioButton esetn is igaz. GtkComboBoxText Elemek hozzadsa. Elemek hozzadsra alapvet oen hrom md knlkozik, amib ol kett o tulajdonkppen a harmadik specializlt esete. Adhatunk j elemet a mr meglv o elemek el (prepend_text), mg (append_text), vagy beszrhatjuk az a mr meglv o elemek kz (insert_text). El obbi kt esetben csupn a szveget kell megadnunk, hiszen itt
1 a Python vltozat __init__ fggvnye is tartalmazhatna alaprtelmezett paramtert a beviteli mez ore vonatkozan, viszont a C vltozathoz a kt kln metdus (a konstruktor s egy statikus metdus) ll kzelebb

69

az j elem pozcija adott, mg a harmadik esetben paramterknt az j elem pozcijt is meg kell adni. Amennyiben pozciknt nullnl kisebb rtket adunk meg, akkor az j elem a meglv o elemek mg, amennyiben nullt, akkor a meglv o elemek el, mg pozitv szm esetn az adott pozcira szrdik be. Elemek trlse. Elemek trlsre szintn kt md knlkozik. Egyrszr ol trlhetnk egyes elemeket a pozcijuk alapjn (remove), vagy trlhetjk egyszerre akr az sszes elemet is (remove_all). Kivlasztott elem. A kivlasztott elem szvegnek lekrdezsre a get_active_text fggvny szolgl, aminek m ukdse kzenfekv onek t unhet, mgsem az, mivel az implicit mdon fgg a widget bizonyos llapotaitl. Egyrszr ol, ha a widget rendelkezik sajt beviteli mez ovel (10.2), akkor minden esetben az abban lv o rtkkel tr vissza, ha nem, akkor a kivlasztott elem szvegvel, illetve ha nincs kivlasztva elem, akkor a nyelvi vltozatnak megfelel o rtkkel. Ez Python esetn egy None rtk, a C esetn egy NULL pointer, mg a C++ esetn egy res Glib::ustring objektum.

10.2.3.

Szignlok

GtkRadioButton se a GtkToggleButton mindssze egy szignllal rendelkezik (toggled), A GtkRadioButton, pontosabban szlva annak o ami a gomb llapotnak vagy ha gy tetszik rtknek megvltozsa utn vltdik ki, ahogy az a nevb ol s a korbban ismertetett hasonl clt szolgl szignlok m ukdsb ol is kvetkezik. A szignl klnsebb gyelmet csak a rdigombok esetn rdemel, mivel itt midig kt widget szignlja vltdik ki kzvetlenl egyms utn. Ez annak kvetkezmnye, hogy az azonos csoportba tartoz rdigombok klcsnsen kizrjk egymst, gy ha az egyikk aktvv vlik, akkor a korbban aktv llapot gomb elveszti aktv sttuszt. A szignlok kezelsekor teht gyelni kell arra, hogy ezen dupln megkapott szignlok esetn a megfelel o m uveleteket csak egyszer hajtsuk vgre.

10.3.

Halad muveletek

GtkCheckButton Inkonzisztens llapot. A GtkToggleButton tpusbl szrmaz osztlyok (GtkCheckButton, GtkRadioButton) esetn az inkonzisztens llapot (10.1.1) hasznlatakor arra kell tekintettel lennnk, hogy ezen llapot belltsa csak a widget megjelentsre van hatssal, az aktv llapot rtkt nem vltoztatja meg. Ezen tlmen oen az inkonzisztens llapot megszntetsr ol is magunknak kell gondoskodnunk, mivel azt a felhasznli interakci (egrkattints, gyorsbillenty u, . . . ) nem mdostja, annak hatsra csak az aktv llapot vltozik, pontosan ugyangy vltakozik, mintha az inkonzisztens llapot be sem lenne lltva.

10.4.
10.4.1.

Tesztels
Keress

Az ebben a rszben trgyalt widgettpusokra vonatkoz specikus Predicate osztly nincs, gy a findChild fggvny esetn a GenericPredicate osztlyt hasznlhatjuk, ahol a jell ongyzet esetn check box, rdigomb esetn radio button, a GtkComboBoxText osztly esetn pedig combo box adand meg a roleName paramter rtkeknt.

10.4.2.

Sttuszok

A trgyalt widgetek (a GtkToggleButton s annak leszrmazottjai) esetn gyakorlatilag egy rdemleges krds van, mgpedig a widget aktulis llapota. Ez egyrszr ol lekrdezhet o az ablakok kapcsn mr ismertetett getState fggvnyt hasznlva, a fggvnyek pyatspi.STATE_CHECKED llandt tadva paramterknt, illetve a Dogtail Node objektum check attribtumnak kiolvassval. Az inkonzisztens llapotra a Dogtail egyel ore nem ad burkolfggvnyt, gy marad a getState fggvny hvsa pyatspi.STATE_INDETERMINATE paramterrel.

10.4.3.

Akcik

A jell ongyzet s a rdigomb rtknek mdostsra a click akcit hasznlhatjuk, amit vagy az action interfszen keresztl rhetnk el, vagy egsz egyszer uen meghvjuk a Node objektum click fggvnyt.

70

10.4.4.

Viszonyok

A rdigombok mindegyike rendelkezik egy olyan viszonnyal (relation), ami a tbbi rdigombhoz kti, amikkel egy csoportban van, belerte magt a rdigombot is aminek a viszonyrl sz van. A cmkknl mr emltett getRelationSet, illetve getTarget fggvnyekkel az sszetartoz rdigombok megkaphatak, a pyatspi.RELATION_MEMBER_OF viszonytpust felhasznlva.

10.4.5.

Interfszek

A GtkComboBox tpus s annak leszrmazottai kzttk az ebben a rszben trgyalt GtkComboBoxText aktv elemnek lekrdezsre s belltsra tbb lehet osg is knlkozik. Ezek kzk egy a selection interfsz. Az interfsz azon widgetek kezelsre alkalmas, amik nmagukban tbb elem megjelentsre s a kztk trtn o vlasztsokra hasznlatosak, hiszen itt merl fel a krds, hogy a widget melyik eleme van aktulisan kivlasztva, illetve hogy hogyan lehetne valamelyik elemet kivlasztani. Ahogy arrl korbban sz esett az egyes felleti elemek ltal alkotott fa szerkezet2 visszakszn a tesztelshez hasznlt objektumoknl is, s ot esetenknt mg ennl tbbr ol is sz van. A fa hierarchia legals szintjn ll widgetek ugyanis nem felttlenl llnak a tesztels sorn hasznlt Node objektumok hierarchijnak legaljn. Klnsen igaz az nmagukban tbb elemb ol val vlasztst lehet ov tev o widgetek3 esetn, ahol a vlaszthat elemek valamilyen formban a Node elemeiknt jelennek meg. Konkrtan a ComboBox widgetnek megfelel o Node mindig rendelkezik egy menu, mg az a ComboBox elemszmnak megfelel o mennyisg u menu item tpus (roleName) gyerekkel. Utbbiak kzl vlaszthatjuk ki az aktv elemet a selection interfsszel. A querySelection fggvny ltal visszaadott interfsz selectChild fggvnye vlasztja ki a megadott sorszm gyerekelemet. Az aktulisan kivlasztott elemek az interfsz getSelectedChild fggvnye segtsgvel krdezhet oek le, ami paramterknt azt vrja, hogy hnyadik kivlasztott elemre vagyunk kvncsiak. Ez az rtk kisebb, mint az nSelectedChildren attribtum rtk, ami az aktulisan kivlasztott elemek szmt tartalmazza. A Dogtail a Node objektum rszeknt is knl szmos fggvnyt kijellt elemek kezelsre. Egy adott gyerekelem kivlasztsa a hozz tartoz Node (menu item) select fggvnynek meghvsval lehetsges. Az isSelected attribtum az adott gyerekelem kivlasztott mivoltrl rulkodik, mg egy szl o kivlasztott elemei4 a selectedChildren attribtum rvn rhet oek el. rdemleges krlmny, hogy a ComboBox widgethez tartoz Node objektum name attribtumnak rtke az aktulisan kivlasztott elem rtkt veszi fel, gy a nv csak krlmnyesen hasznlhat fel a Node megkeressekor. Kzenfekv oen csak a roleName hasznlhat, ami viszont egyedileg csak akkor azonost, ha az adott rszfa alatt csak ez az egy ilyen elem tallhat, amit a rszfa sz uktsvel tudunk eszkzlni.

kontnerek s elemeik egymssal 1 : N viszonyban llnak, sszessgben fa szerkezetet alkotva rdigombok is lehet ov tesznek vlasztst, de csak tbb azonos widget rvn 4 GtkComboBox esetn az elmondottak alapjn a hozz tartoz Node gyereke ahol a roleName menu hasznland e tekintetben
3a

2a

71

rsz III

sszetett widgetek

72

11. fejezet

Tblzatos megjelents alapjai


Elrkeztnk a GTK egyik legrugalmasabb, legszlesebb kr u funkcikkal felruhzhat, ugyanakkor legkomplexebb eszkzhez. A widget objektumok egytteseknt egyszerre teszi lehet ov az adatok megjelentst, bevitelt, az elemek kivlasztst, keresst, sz urst, rendezst. Alapvet o funkcija azonos tpus objektumok tulajdonsgainak tblzatos formban trtn o megjelentse, illetve kezelse, ahol a sorok az egyes objektumokhoz reprezentljk, mg az oszlopok az objektum egy adott tulajdonsghoz tartoznak.

11.1.
11.1.1.

Fogalmak
Modell-nzet-vezrl o

A widget m ukdse a modell-nzet-vezrl o elvet kveti, vagyis elvlik egymstl az adatok trolsra, illetve megjelentsre, valamint vezrlsre szolgl rteg. Ez egyfel ol rugalmassgot tesz lehet ov a m ukds tekintetben, a performancia javulst is eredmnyezheti kell o krltekints mellett, ugyanakkor sajnlatos mdon bonyoltja az implementcit. Eddigiekben is tallkoztunk mr ezt a mintt kvet o widgetekkel (GtkEntry, GtkComboBoxText), ugyanakkor ezen widgetek esetn br a httrben ugyan ez a minta hzdik meg a hasznlat sorn ennek hatsait elkerlhetjk. Most azonban a nzet s a modell elvlasztsa ktelez o, hatsi nem megkerlhet oek.

11.1.2.

Modell

A modell-nzet-vezrl o mintban a modell jelenti adattrol rteget, a GTK terminolgia annyiban eltr, hogy a modell egy absztrakt osztly, ami a nzet irnyba trtn o adatszolgltatshoz szksges fggvnyeket, illetve szignlokat rja le. A tnyleges adattrolknak ezen absztrakt osztlyt kell megvalstaniuk, vagyis sajt bels o adatreprezentcijukat elrejtve a klvilg ez esetben a nzetet megvalst widget fel a modell ltal deniltak megfelel oen kell m ukdnik. A GTK a modell kt implementcijt is biztostja, egyet a lista, egyet a fa szerkezettel rendelkez o adatok szmra, ezzel egytt termszetesen ha a sajt adattrolnkat tartjuk performancia vagy egyb okoknl fogva alkalmasabbnak, azt minden tovbbi nlkl hasznlhatjuk, ha implementljuk a GtkTreeModel osztly ltal lert alkalmazsprogramozsi felletet (API ).

11.1.3.

Nzet

A nzet (view) a megjelentst vgz o rteg a modell-nzet-vezrl o mintban. A modellben trolt adatokat, valamint az adatok vltozst jelz o szignlokat felhasznlva vgzi adatok megjelentst, szmos, az adatok tpusra, formtumra vonatkoz paramternek megfelel oen. Maga a nzet alaktja ki a tblzatos megjelensi formt, annak oszlopaival s soraival, az ezek metszspontjaiban tallhat cellkkal, kezelve a megjelentskor azt a helyzetet, hogy a modellben trolt adatok mennyisge tbbszrse lehet annak, amit a nzet egy id oben megjelenteni kpes. Egy modellhez tbb nzet is rendelhet o, vagyis ugyanazon adatok tbb klnbz o formban is megmutathatjuk a felhasznli fellet ms-ms rszein, vagy ugyanott az eltrsek hangslyozsa vgett. A nzet klnbsge jelentheti pldul, hogy ms-ms modellbeli oszlopok megjelentse trtnik, ms sorrendben, vagy sz ursnek, rendezsnek vetjk al a elemeket, esetlen eltr o szvegformzsi paramtereket alkalmazunk. Mindezt gy tehetjk meg, hogy az adattrol nem kell lemsolnunk, vagyis az applikci memriaignye nem n o.

11.1.4.

Elemek elrse

Maga a modell denilja az adattrol elemeihez sorok s ezen bell cellk hozzfrst, illetve az adattrol elemeinek bejrst lehet ov tev o eszkzket, valamint mdszereket. Ezen eszkzk kzl hrom is rendelkezsnkre ll az adattrol egyes elemire val hivatkozsra, amik mind alkalmazsi terletkben, mind m ukdskben eltrnek egymstl. 73

Bejr. Az els o s egyben a leggyakrabban hasznlt ezek kzl a bejr (iterator), ami az adattrol egy elemhez legyen az lista vagy fa ad hozzfrst. A bejrn keresztl kzvetlenl rhatjuk vagy olvashatjuk a vonatkoz sor egyes elemeit, cellit. A bejrk er osen kt odnek a hivatkozott adattrolhoz, egy adott modellre vonatkoz bejr ms modell esetn nem hasznlhat fel. A bejr az adott elemre (itt sor) nzve csak addig br rvnyes hivatkozssal, amg az adattrol szerkezete vltozatlan. Egyszer ubben fogalmazva egy bejr csak addig rvnyes, amg az adattrolhoz jabb elemet nem adunk (amivel egybirnt jabb bejr jn ltre), vagy vesznk el bel ole. A trolt adatokhoz val hozzfrs termszetesen a szerkezetet nem rinti, gy az sem aktulisan hozzfrst biztost, sem ms bejrkat nem rvnytelent. tvonal. A modell egy eleme megadhat a modellben elfoglalt pozcijval is, ezt teszi az tvonal (path) lersra szolgl objektum. A modellben elfoglalt pozci sz szerint az jelenti, hogy az adott elem hnyadik az eleme sorban, a C nyelvi hagyomnyoknak megfelel oen nulltl kezdve a szmllst. Ha nem listban, hanem fban gondolkodunk, akkor ez annyi elemet jelent amilyen mlyen (depth) az adott sor elhelyezkedik a fban. Az elem sorozata pedig a fa gykert ol indulva az adott rszfban a sor indexe.

11.1. bra. tvonal fa szerkezeten bell[6] Az brn a William Field rtket tartalmaz sor tvonalt az 1, 0, 2 sorozat rja le, hiszen a legfels o szinten lv o msodik elem, els o gyereknek, harmadik gyermeke. Az tvonal nem kt odik a modellhez, gy egy tvonal brmelyik modellel egytt rtelmezhet o. Ha az tvonalnak megfelel o sor ltezik az adattrolban, akkor visszakaphatjuk a mutatott sorhoz tartoz bejrt, amin keresztl mr hozzfrhetnk az adatokhoz. Mivel nincs kt ods a modellel, maga az tvonal objektum mindig rvnyes, csak egy adott modell esetn nem garantlt, hogy az tvonalon tallhat sor. Referencia. A referencia (row reference) olyan hivatkozs az adattrol egy sorra, ami mindaddig rvnyes marad, amg maga a sor ltezik. A bejrval ellenttben teht hiba vltozik az adattrol szerkezete hozzads, vagy trls rvn a referencia rvnyes marad, eltekintve attl ha pp az adott sort trltk. A referencia hasonlan a bejrhoz kt odik az adattrolhoz, csak egy adott modellen rvnyes. Az rvnyessg lekrdezhet o, az objektum mind tvonall, mind pedig bejrv talakthat. Ez utbbi rvn a modell adataihoz val hozzfrs is biztostott. A knyelemnek, amit ez a fajta m ukds ad, a performancia oldaln kell az rt megzetnnk, gy ezen elemek nagy mennyisg u hasznlata sebessgbeli problmkhoz vezethet.

11.2.
11.2.1.
Modell

Alapmuveletek
Ltrehozs

A GTK ltal implementlt listk kezelsre hasznlhat adattrol (GtkListStore) legegyszer ubben gy kpzelhet o el, mint egy tblzat. Ezen tblzat alapvetse, hogy egyforma tpus elemek klnbz o pldnyainak soronknti megjelentsre szolgl, jelentsenek az elemek br fjlokat, elektronikus leveleket, vagy ppen t uzfalszablyokat. A sorokban az egyes elemek tulajdonsgai szerepelnek, azaz minden oszlop tpusa azonos, amik soronknt eltr o rtkeket vehetnek fel. Ennek megfelel oen a ltrehozs sorn meg kell adnunk az oszlopok szmossgt, illetve az egyes oszlopok tpust. Ez lnyegben nem jelent komoly feladatot, ugyanakkor viszont ez egyes nyelvi vltozatok kztt komoly eltrsek tapasztalhatak, ami leginkbb a nyelvi sajtossgoknak ksznhet oek.

74

GtkListStore * gtk_list_store_new ( gintn_columns , ...); GtkListStore * gtk_list_store_newv ( gintn_columns , GType * types ); staticGlib :: RefPtr < ListStore > create ( constTreeModelColumnRecord & columns ); classListStore ( Gtk . ListStore , TreeModel , TreeSortable ): def__init__ (self ,* column_types ):

Kdrszlet 11.1. GtkListStore ltrehozsa Ahogy ltszik a (C nyelvi vltozat elvrja t olnk, hogy megadjuk hny oszlopa lesz az elksztend o adattrolnknak (store). A vltoz hosszsg paramterlistj fggvnynl csak akkor van mdunk hvottknt rjnni, hogy mikor van vge a tpusok felsorolsnak, ha van olyan rtk, amit az tvett tpus (GType) elemei nem vehetnek fel. Hasonl a helyzet az tadott tmb kapcsn is. gy viszont nem marad ms vlasztsunk mint az oszlopok szmt el ore kzlni. A msik kt nyelvi vltozat kzenfekv o mdszereket ad egy kontner mretnek, illetve az tadott paramterek szmnak lekrdezsre gy annak kln megadsra explicit mdon nincs szksg. Kln emltst rdemel a fggvnyek visszatrsi rtke, azaz az adattrol nyelvi vltozatnak megfelel o reprezentcija. Mindhrom esetben igaz, hogy a visszakapott rtk egy referencia-szmllt objektumok, lvn a GtkListStore a GObject tpusbl szrmazik, viszont ez az egyes nyelveken klnbz o mdokon jelenik meg. A C vltozat egy mutatval tr vissza, ahogy az szoks a widgetek esetn is, a klnbsg mindssze annyi, hogy a specikus tpusra kapunk mutatt, ahogy ez a tbbi GObject tpusbl szrmaz osztly esetn is igaz lesz. Itt a referencia nvelse csak akkor trtnik meg, ha azt explicit mdon krjk, vagy azt adattrolval hvott objektum pldul a nzet maga megteszi. A C++ vltozat egy intelligens mutatval (smart pointer) tr vissza, ami msolsakor implicit mdon maga biztostja a referenciaszm nvelst, gy ezzel neknk nem kell tr odnnk. A Python nyelvi szinten rendelkezik referencia-szmllsi megoldssal, gy itt nem szksges az objektumok allokcijnak s felszabadtsnak rszleteivel tr odnnk. A referencia-szmlls mr csak azrt is fontos, mert egy modellre tbb nzetet is csatolhatunk, amiknek egyenknt nvelik a referencia rtkt, hogy biztostsk az adattrol objektum fennmaradst addig, amg a nzet ezt hasznlja. Az adattrol nem widget, vagyis az alapfogalmak kztt emltett lebeg o referencia szerinti m ukds itt nincs rvnyben, kvetkezskpp az adattrol referenciaszmnak rtke egy lesz ltrehozskor s mr ez els o nzet modellhez val csatlakoztatsa azt eredmnyezi, hogy referenciaszm eggyel n o. gy teht minden csatolt nzet megsz unse utn az adattrol referenciaszmnak rtke jra egy lesz, teht az nem sz unik meg automatikusan. Ha azt szeretnnk, hogy a modell a nzetek megsz untvel maga is megsz unjn, akkor a nzet(ek) csatolsa utn magunknak kell cskkentennk a referencia rtkt. Mivel a referencia-szmlls funkcijt a GObject tpus adja, ennek unref fggvnyt kell hvnunk.
typedefenum { structModelColumns : publicGtk :: TreeModel :: ColumnRecord classModel ( object ): { ModelColumns () { add ( col_id ); add ( col_name ); } Gtk :: TreeModelColumn < unsigned int > col_id ; Gtk :: TreeModelColumn < Glib :: ustring > col_name ; }; ModelColumnsColumns ; store = Gtk :: ListStore :: create ( Columns ); store = Gtk . ListStore (int , str ) COL_ID = 1 COL_NAME = 2 NUM_COLS = 3

COL_ID , COL_NAME , NUM_COLS } ModelColumns ; store = gtk_list_store_new ( NUM_COLS , G_TYPE_UINT , G_TYPE_STRING );

Kdrszlet 11.2. Plda GtkListStore ltrehozsra A gyakorlatban minden nyelvi vltozat esetn kialakult a nyelv sajtossgaihoz idomul mdszer, amivel a ks obbiekben a trol knnyel kezelhet ov vlik, aminek alapjait rtelemszer uen a ltrehozskor tesszk le. A C nyelvi vltozat esetn egy sorszmozott tpus (enum) tud rajtunk leginkbb segteni, ahol a tpus egyes elemeinek nevei utalnak funkcijukra. Az el otagknt hasznlhatunk a trolra utal (pl: STORE_NAMES) szveget, majd folytathatjuk a COL rvidtssel, ami az rtk oszlopsorszm mivoltt jelenti, mg az uttag az oszlopban trolt adatra vonatkozhat. Ezzel olyan nevet kapunk, amit a ks obbiekben a trolba val rs, illetve az onnan val olvass esetn ndokumentlv teszi a kdot, ellenttben a puszta sorszmokkal, amik magic numbert alkotnak a kdban. A C++ vltozat maga ad egy osztlyt (TreeModel::ColumnRecord) ami az oszlopok lersra szolgl. A gyakorlatban szrmaztats rvn rjk el, hogy trol konstruktora az pp elksztend o objektumra specikus oszloplert kaphasson. Ebben a szrmaztatott osztlyban nincs ms dolgunk ahogy az a pldban is ltszik , mint publikus tagknt mivel a ks obbiekben ezen objektum adattagjait hasznljuk az rs, olvass m uveletnl az oszlopok azonostsra felsorolni s ezeket a konstruktorban hozzadni az objektum privt kontnerhez (add). Ezen kontner mrete lekrdezhet o a size fggvnnyel, aminek rvn a trol is tudni fogja voltakppen hny oszloppal is rendelkeznk. A Python vltozat jfent a legegyszer ubb, de legalbbis a legrvidebb, gy bizonyos rtelemben ezzel jrunk a legjobban. jdonsgot a msik kt vltozathoz kpest nem tartalmaz, megjegyezni is csak annyit rdemes vele kapcsolatban, hogy az oszlopokhoz hasznlt sajt osztly helyett ha szrmaztatunk a GtkListStore tpusbl, akkor azon bell denilhatjuk a nvvel azonostott oszlopsorszmokat. A C vltozathoz hasonlan itt is rdemes klns gyelmet fordtani arra, hogy az oszlopok sorszmai s a tpusok helyes sorrendben legyenek, klnben futs kzben vratlan s nehezen visszanyomozhat hibkba tkzhetnk.

75

Nzet A nzet (view) ltrehozsa nmagban egy rendkvl egyszer u feladat, hiszen ez akr paramter nlkl is lehetsges, vagy paramterknt tadhat egy modell, ami termszetesen ks obb is bellthatunk, vagy tllthatunk (set_model).
GtkWidget * gtk_tree_view_new ( void ); GtkWidget * gtk_tree_view_new_with_model ( GtkTreeModel * model ); TreeView (); classTreeView ( Gtk . TreeView , Container ): def__init__ (self , model = None ):

explicitTreeView ( constGlib :: RefPtr < TreeModel >& model );

Kdrszlet 11.3. GtkTreeView ltrehozsa A teljes modell-nzet-vezrl o szerkezet nzet rsznek csak egy rsze maga a GtkTreeView, ugyanakkor a feladat rdemi rszt nem ez, hanem az oszlopok hozzadsa jelenti. Amint az a modell felptsb ol kvetkezik, az oszlopok ket megjelentennk. Ez az eszkz az oszlop a azonos tpus rtkeket tartalmaznak, teht azonos eszkzzel is kell o hozz tartoz osztly pedig a GtkTreeViewColumn , ami gondoskodik az oszlop, illetve fejlcnek megjelentsr ol, az oszlop tmretezhet osgr ol, nem gondoskodik azonban a sorok s oszlopok metszspontjaknt add cellk megjelentsr ol, ezt egy kln osztly vgzi.
GtkTreeViewColumn * gtk_tree_view_column_new ( void ); TreeViewColumn (); explicitTreeViewColumn ( constGlib :: ustring & title ); GtkTreeViewColumn * gtk_tree_view_column_new_with_area ( GtkCellArea * area ); TreeViewColumn ( constGlib :: ustring & title , CellRenderer & cell );

classTreeViewColumn ( Gtk . TreeViewColumn ): GtkTreeViewColumn * template < classT_ModelColumnType > def__init__ (self , gtk_tree_view_column_new_with_attributes ( TreeViewColumn ( title =, constgchar *title , constGlib :: ustring & title , cell_renderer =None , GtkCellRenderer *cell , constTreeModelColumn < T_ModelColumnType >& column ); ** attributes ): ...)G_GNUC_NULL_TERMINATED ;

Kdrszlet 11.4. GtkTreeViewColumn ltrehozsa Ahogy ltszik GtkTreeViewColumn ltrehozhat akr paramterek megadsa nlkl is, br ennek csak akkor nincs sok rtelme, hiszen a ltrehozst kvet oen gy is megadjuk a paramtereket, amikre a ltrehozskor is lehet osgnk lett volna. Az oszlop kapcsn kzenfekv o paramter az oszlop fejlcnek szvege (title), a cella kirajzolst vgz o objektum (renderer). Ezt a rajzolst vgz o objektum paramterei kvetik, amik kzl messze a legfontosabb, hogy a modell melyik oszlopban tallhat az adat, aminek a kperny on val megjelentse a feladat lesz. Az egyes nyelvi vltozatokban lteznek fggvnyek (insert_column, insert_column_with_attributes) az imnti pldban ltott paramtersorrenddel, amik egyrszt elksztik a GtkTreeViewColumn, illetve GtkCellRenderer objektumokat, majd az oszlopot hozz is adjk nzethez, az els o paramterknt megadott pozcira. Az oszlopok sorrendje teht a hozzadsakor mr meghatrozott vlik, hiszen az egyms utn a nzethez hozzadott (append_column) oszlopok hasonlan a kontnerekbe helyezett widgetekhez egyms mellett, balrl jobbra helyezkednek majd el, a beszrt oszlopoknl (insert_column) a helyet egy ktelez oen megadand paramter hatrozza meg.
renderer = gtk_cell_renderer_text_new(); gtk_tree_view_insert_column_with_attribute ( GTK_TREE_VIEW ( view ), -1, "ID", renderer , " text ", COL_ID , NULL ); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_insert_column_with_attributes ( GTK_TREE_VIEW ( view ), -1, " Name ", renderer , " text ", COL_NAME , NULL ); view . append_column ( "ID", Columns . col_id ); renderer = Gtk . CellRendererText () column = Gtk . TreeViewColumn ( "ID", renderer , text = Model . COL_ID ) tree . append_column ( column ) renderer = Gtk . CellRendererText () column = Gtk . TreeViewColumn ( " Name ", renderer , text = Model . COL_NAME ) tree . append_column ( column )

view . append_column ( " Name ", Columns . col_name );

Kdrszlet 11.5. Plda GtkTreeView ltrehozsra Az oszlopok hozzadsnak kt fontos krdst segt tisztzni a fenti plda. Az els o az oszlop pozcija. Mint arrl sz esett az append_column fggvny minden eseteben az eddigi oszlopok utn f uzi az j oszlopot, ahogy ez a nevb ol is kvetkezik, mg az insert_column a megadott pozcira szrja be azt, kivve ha a pozci 1, mert ez esetben az append_column fggvnnyel azonos mdon m ukdik. Visszatrsi rtkk az j oszlop pozcija ami alapjn ks obb a nzet vissza tudja adni neknk magt az oszlopot. Elkerlend o, hogy ez rtk kompromittldjon, clszer u az oszlopokat mindig a sor vgre hozzf uzni. A msik krds, hogy miknt szerez tudomst a GtkCellRenderer objektum, hogy honnan szerzend o be a megjelentend o adat, illetve mik lennnek annak megjelentsi paramterei. Az append_column, illetve az insert_column fggvnyeknek tadott utols kt paramter nem az oszlopnak, hanem a GtkCellRenderer objektumnak szl paramterek s azt mondjk meg, hogy a ltrejtt GtkCellRendererText objektum az egyes sorok esetn az adattrl mely 76

oszlopbl vegye a sajt text paramternek rtkt. Nem meglep o mdon a GtkCellRendererText objektum a text attribtumnak rtkt jelenti meg a sor s az oszlop ltal meghatrozott cellban. Lthat, hogy szmok megjelentse pp ugyanezt a metdust hasznljuk ami azrt lehetsges, mert a modellb ol egy ltalnos adattrolba (GValue) olvassuk ki a cella rtkt, amit aztn karakterlnc formra konvertlva vesznk ki ebb ol a trolbl. Amennyiben az talakts sikeres, a GtkCellRendererText is hasznlhat. A modell egy celljban trolt rtk alapjn trtn o megjelents nem csak azt teszi lehet ov, hogy a megjelentend o szveget adjuk meg a modell valamelyik oszlopban ami egyrszr ol rtelemszer u, msrszr ol a m ukdshez elgedetlen is de pldul annak el ott-, vagy httrsznt (foreground, background) is. Klnbz o adattpusok ms-ms megjelentst ignyelnek, ami egyttal ms GtkCellRenderer osztly is jelent. Kpek megjelentsre a GtkCellRendererPixbuf osztly illetve annak pixbuf tulajdonsga, gbooleann rtkek jell ongyzetszer u megjelentsre a GtkCellRendererToggle, illetve annak active tulajdonsga hasznlhat. Amennyiben folyamatindiktort jelentennk meg a cellban, annak rtkt a value, szvegt pedig text tulajdonsg kell tartalmazza. Ezen GtkCellRenderer osztlyok, illetve az emltett paramtereik pp gy adhatak meg, mint ahogy a GtkCellRenderer s annak text attribtuma a fenti pldban.

11.2.2.
Modell

Kezels

Hozzads. Az adattrol feltltsnek els o lpse az j sor hozzadsa. Ennek legegyszer ubb mdja az, ha az eddigi elemek mg egy j elemet szrunk be. Ez minden tovbbi nlkl megtehet o az adattrol (store)1 bejrt visszaad append fggvnyvel. Termszetesen ppgy lehet osg van a meglv o elemek el (prepend), vagy adott pontra trtn o beszrsra (insert), br ezek gyakorlati jelent osge kisebb. Fk esetn ugyanezen fggvnyek ugyangy lteznek, egy eltrssel. Ez pedig az, hogy a els o paramterknt a szl o elemhez tartoz bejrt kell megadni, illetve ha legfels o szint u elemet szeretnnk, akkor a nyelvi vltozatnak megfelel o null rtket kell tadni.
void gtk_list_store_append ( GtkListStore * list_store , GtkTreeIter * iter ); void gtk_list_store_insert_before ( GtkListStore * list_store , GtkTreeIter *iter , GtkTreeIter * sibling ); iteratorappend (); defappend (self , row = None ): iteratorinsert ( constiterator & sibling ); definsert_before (self , sibling , row = None ):

Kdrszlet 11.6. Elem hozzadsa listhoz


void gtk_list_store_append ( GtkListStore * list_store , GtkTreeIter *iter , GtkTreeIter * parent ); void gtk_list_store_insert_before ( GtkListStore * list_store , GtkTreeIter *iter , GtkTreeIter * parent , GtkTreeIter * sibling ); iteratorappend ( constTreeNodeChildren & parent ); iteratorinsert ( constiterator & sibling ); defappend (self , parent , row = None ): definsert_before (self , parent , sibling , row = None ):

Kdrszlet 11.7. Elem hozzadsa fhoz A klnbsg ez egyes nyelvek kztt taln nem ltvnyos, de egy ponton mindenkppen szmottev o. A C++, illetve Python nyelv u megvalsts az j bejrt visszaadja, mg a C megoldsban egy kimeneti paramterben kapjuk vissza. Ez els ore csak formai eltrsnek t unhet, de ennl azrt mlyebb oka van. Az el obbi kt nyelv esetn a bejrok objektumok, lvn az utbbi nyelv esetben err ol nem lehet sz, mindssze egy struktra. Az paramterknt elvrt mutat, mivel kimeneti paramterr ol beszlnk, egy ltez o bejr struktrra kell mutasson, amit az append, insert_before s egyb fggvnyek tltenek ki a megfelel o rtkekkel, amit ezt kvet oen vehetnk az adatok elrshez hasznlatba. Feltlts. Az elem hozzadsra hasznlt fggvnyek deklarcijbl ltszik, hogy a Python nyelv esetn lehet osg van egy lpsben hozzadni egy j elemet az adattrolhoz s egyszersmind megadni az j sor egyes oszlopokba es o rtkeit, a row paramter rvn. A C illetve C++ vltozat ezt kt lpsben vgzi, el oszr hozzadja az j elemet az adattrolhoz, majd csak ezt kvet oen ad rtket a cellknak. Ez nem teljesen fedi a valsgot, mivel a C nyelv esetn is van md az egy lpses megoldsra, ami nem is meglep o, hiszen a Python vltozatban sem lenne klnben erre lehet osg. A C nyelvi fggvny neve insert_with_values, ami paramterezst tekintve sszef uzse az insert s a feltltsre szolgl set fggvnyeknek. A C++ esetn a valsg megegyezik a ltszattal, vagyis csak a kt lpcs os megolds ltezik, illetve a helyzet mg ett ol is egy kicsikt bonyolultabb.
1 megjegyzend o,

hogy az elem hozzadst nem a modell denilja, ez csak olvasshoz ad interfszt

77

classTreeRow : publicTreeIter { void gtk_tree_store_set ( GtkTreeStore * tree_store , GtkTreeIter *iter , ...); void gtk_tree_store_set_value ( GtkTreeStore * tree_store , GtkTreeIter *iter , gint column , GValue * value ); template <classColumnType > void set_value ( int column , constColumnType & data ) const ; template <classColumnType > void set_value ( constTreeModelColumn < ColumnType >& column , constColumnType & data ) const ; template <classColumnType > inlineTreeValueProxy < ColumnType > operator []( constTreeModelColumn < ColumnType >& column ); def__setitem__ (self , key , value ): }; classTreeModel ( Gtk . TreeModel ): defset_row (self , treeiter , row ): classTreeModelRow ( object ): defset_value (self , treeiter , column , value ):

Kdrszlet 11.8. Sor rtkeinek belltsa

rtkads cellnak. A rtkad fggvnyek kzs nevez oje vagyis ami minden nyelvi vltozat esetn elrhet o az a mdszer, ami egyszerre csak az adott sor adott oszlopban tallhat rtket lltja be (set_value). Az eltrs abban ll, hogy mg a GTK+ esetn az rtk belltst vgz o fggvny az adattrolhoz kt odik, addig a C++ s Python esetn a sor reprezentlsra szolgl kln osztlyok (TreeRow, TreeModelRow) keresztl valsul meg az rkads. Ez persze leginkbb formai klnbsgeket eredmnyez a hrom nyelv esetn a gyakorlati m ukds szempontjbl nincs szmottev o eltrs. A C vltozatban alkalmazott GValue osztly rszleteit mivel a gyakorlatban nem ez a mdszer hasznlatos a ks obbiekre halasztjuk. Elljrban csak annyit, hogy a GValue egy olyan adattrol megolds, ami kpes klnbz o tpus adatokat tartalmazni, mg erre a hagyomnyos tpusok (int, double, . . . ) erre nem kpesek. Felhasznlsuk ltalban a generikus algoritmusokban trtnik, ahol csak futsid oben ismert az adott oszlop tpusa. Mindhrom nyelv esetn az rtket bellt fggvnynek paramterknt megadand az oszlop sorszma, illetve maga a belltand rtk, pontosabban GTK+ esetn annak cme, mg gtkmm esetn annak referencija. Ehhez kpest az indexel o opertor hasznlata csak annyiban ms, hogy a sort reprezentl objektum az adott oszlop szmval indexelve a konkrt cellt rjk el, majd ennek adunk rtket. A gtkmm indexel o opertorra ktfleknt is implementlt, az egyik esetn numerikus adhatjuk meg az oszlop sorszmt, mg a msik esetben a modellt ler osztly (ModelColumns) megfelel o adattagjnak (col_id) segtsgvel, ahol az olvashatsg szempontjbl mindenkppen ez utbbi preferlt.
GValue id = G_VALUE_INIT ; g_value_init(&id , G_TYPE_INT ); g_value_set_int(&id , 42); gtk_list_store_set_value (store , & tree_iter , COL_ID , &id ); row . set_value ( Columns . col_id , 42); row . set_value (0, 42); row [ Columns . col_id ] = 42; row [ Model . COL_ID ] = 42 row . set_value ( Model . COL_ID , 42)

Kdrszlet 11.9. Plda sor egy rtknek belltsra

rtkads teljes sornak. Teljes sorok egyidej u kitltsre is van lehet osg, azonban csak a C, valamint a Python vltozat esetn, ami komoly hinyossga a C++ vltozatnak. Ezen hinyossgok okozta nehzsgekkel az egyszer ubb felhasznls esetn nem tallkozunk, gy ezzel csak ks obb foglalkozunk. A msik kt nyelv jcskn eltr o mdszerekkel ri el az egy lpses belltst s mindkt esetben lehet osg van rszleges belltsra is.
gtk_list_store_set (store , & tree_iter , COL_ID , 42, COL_NAME ," John Doe ", -1); store . set_row ( tree_iter , [42 , John Doe ]) store [ tree_iter ] = [42 , John Doe ]

Kdrszlet 11.10. Plda teljes sor belltsra A GTK+ egy vltoz paramterhosszsg paramterlistj fggvnnyel oldja meg a problmt, ahol a paramterekben az oszlop sorszmok s a belltand rtkek prjai kvetik egymst, amit egy 1 rtk zr. Erre azrt van szksg, hogy a set fggvny paramtereinek kiolvassakor tudja, mikor fejeztk be a az oszlopsorszm-rtk prok felsorolst. Erre a negatv rtk kivlan alkalmas, hiszen az oszlopok sorszmozsa nulltl kezd odik, vagyis negatv rtket nem vehet fel. Egybirnt a zrrtk elmaradsa kellemetlen meglepseket eredmnyez, mivel a set fggvny az oszlopsorszm helyn kapott negatv rtkig olvassa a vermet, gy erre rdemes klns gyelmet fordtani. A Python vltozat ett ol jval kevsb krlmnyes megoldst alkalmaz. A set_row fggvnynek paramterknt, az indexel o opertor rvn visszakapott TreeModelRow objektumnak pedig rtkl adhatjuk a sor eleminek listjt, ahol a

78

sorrendnek kvetnie kell az adattrol ltrehozsakor megadottakat, mg a C vltozatban szabadon vlaszthatjuk meg a sorrendet, hiszen az oszlopok sorszmaikkal azonostottak. Lekrdezs. A feltlts kapcsn mr tettnk emltst a lekrdezsr ol, hiszen az objektum-orientlt megoldsok sorokat reprezentl osztlyai (TreeRow, TreeModelRow) nemcsak rshoz, hanem olvasshoz is ad interfszt. Lnyegben teht ezen esetek nem szorulnak klnsebb magyarzatra, viszont a C nyelv sajtossgai, illetve az egyes nyelvi vltozatok kuszasgai miatt mgis rdemes kis kitr ot tenni.
void gtk_tree_model_get ( GtkTreeModel * tree_model , GtkTreeIter *iter , ...); void gtk_tree_model_get_value ( GtkTreeModel * tree_model , GtkTreeIter *iter , gint column , GValue * value ); classTreeRow : publicTreeIter { classTreeModel ( Gtk . TreeModel ): def get (self , treeiter , * columns ): template <classColumnType > ColumnType get_value ( constTreeModelColumn < ColumnType >& column ) const ; template <classColumnType > inlineTreeValueProxy < ColumnType > classTreeModelRow ( object ): operator []( constTreeModelColumn < ColumnType >& column ) const ; def__getitem__ (self , key ): };

Kdrszlet 11.11. Sor rtkeinek lekrdezse Cella lekrdezse. Minden nyelvi vltozat ad lehet osget az egyes cellk rtknek lekrdezsre. A C vltozat egyrszr ol az imnt megismert GValue tpus rvn (get_value, msrszt egy vltoz hosszsg paramterlistj fggvny rvn, amit a teljes sorok lekrdezsnl rszleteznk. A msik kt vltozat a mr emltett indexel o opertort hasznlja az elemek lekrdezsre, aminek csak formai vltozata gtkmm get_value fggvnye. Teljes sor lekrdezse. A GTK+ a set fggvnyhez hasonlan oszlopsorszm s rtkprokat sorozatt vrja paramterknt, amit szintn egy 1 rtknek kell zrni. A klnbsg a kt fggvny kztt abbl addik, hogy itt az rtkeket ki szeretnnk nyerni az adattrolbl, teht a trol adott oszlopnak tpusval azonos tpus vltoz cmt kell tadnunk az oszlopsorszmot kvet oen, amibe az rtk trolsra kerl. Karakterlncok esetn (G_TYPE_STRING) ami a leggyakoribb felhasznls egy gchar * tpus vltoz cme adand t a set fggvnynek, amiben egy jlag alloklt memriaterlet cmt kapjuk vissza, amit a felhasznls vgeztvel fel kell szabadtanunk (g_free). Mutat tpus oszlop (G_TYPE_POINTER) esetn sem a trolba trtn o behelyezs, sem az onnan trtn o lekrdezskor nem trtnik msols mr csak azrt sem mert a konkrt tpusrl, illetve annak msolsnak mdjrl a GTK+ mit sem tud , a mutatott memriaterlet menedzsmentjr ol magunknak kell gondoskodnunk. A Python jfent egy nagysgrenddel egyszer ubb megoldst knl, hiszen a get fggvnynek tadhatjuk a lekrdezend o oszlopok listjt, ami a sor megfelel o oszlopaiban lv o rtkek listjval tr vissza. Egybirnt Python indexel o opertornl megszokottak itt is rvnyeslnek, vagyis akr intervallumokat is megadhatunk index gyannt. Vezrl o A nzet vezrlse szempontjbl szmottev o jelent osggel br az elemek kivlasztsa. Maga a nzet az ltala megjelentett sorok kivlasztsval kapcsolatos teend oket egy kln osztlyra bzza (GtkTreeSelection), amit a nzet ltrejttvel egy id oben, automatikusan kszt el, gy ezzel neknk nem kell tr odnnk. Egy adott nzethez tartoz objektum a nevezktannak megfelel oen a get_selection fggvnnyel krdezhet o le. Mdok. Az objektum viszonylag sz uk, de annl hasznosabb funkcionalitshalmazzal rendelkezik. Ezek kzl mindjrt az els o az elemek kivlasztsnak mdja (mode), ami meghatrozza, hogy egyszerre hny elem lehet kivlasztva. A SELECTION_NONE rtk azt jelenti, hogy egy elem sem, a SELECTION_SINGLE, hogy legfeljebb egy elem, a SELECTION_BROWSE, hogy egy s csak egy, a SELECTION_MULTIPLE pedig, hogy akrhny elem lehet kivlasztva egy id oben. Kivlasztott elemek kezelse. El obbiek komoly hatssal vannak a GtkTreeSelection osztly msik funkcijra, a kivlasztott elemek kezelsre. Ez egyfel ol jelenti a kivlasztott elemek hozzadst (select_iter, select_path, select_all) s elvtelt (unselect_iter, unselect_path, unselect_all), illetve az aktulisan kivlasztott elemek lekrdezsre. A kivlaszts esetn ha a md szerint legfeljebb egy elem lehet kivlasztva, ha volt korbban kivlasztott elem az elveszti kivlasztott mivoltt s az j elem nyeri el ezt mg, ha md szerint tbb elem kivlasztsa is lehetsges, akkor a korbbiak mellet az j elem is kivlasztsra kerl. Ha egy elem kivlasztsa sem engedlyezett, akkor a fggvnyhvs hatstalan. A kivlaszts megszntetsnl a mdtl fggetlenl megsz unik az elem kivlasztott llapota.

79

kivlasztott elemek lekrdezse. Mindssze kt fggvny van, amivel a kijellt elemek lekrdezhet oek. Az egyik (get_selected) csak abban az esetben m ukdik, ha legfeljebb egy elemet lehet kivlasztani s eredmnyeknt egy bejrt kapunk vissza, mg a msik get_selected_rows minden esetben helyes eredmnyre vezet, de felesleges bonyoltst jelent, klnsen a C vltozat esetn, ahol visszatrsi rtkt a kijellt elemek tvonalait tartalmaz listt termszetesen fel is kell szabadtani.

11.2.3.
Vezrl o

Szignlok

A kivlasztst vezrl o osztly mindssze egy, de annl nlklzhetetlenebb szignlt (changed) nyjt, ami akkor vltdik ki, amikor a kivlasztott elem mennyisgben vltozs ll be. A vltozst a rendszer csak egyszer jelzi, vagyis ha szmos elem ki volt vlasztva s meghvjuk az unselect_all fggvnyt, akkor mindssze egyszer vltdik ki a changed szignl, nem pedig annyiszor, ahny elem korbban kivlasztva volt. Termszetesen ha egyesvel (unselect_iter) cskkentjk a kivlasztott elemek szmt, akkor ennek megfelel oen a szignl kivltdsra is tbbszr kerl sor. Ne feledjk, ha a kijellt elemeket akarjuk trlni, akkor az egyes elemek trlse rvnytelentheti a tbbi elemet. Trlni teht mindig a lentebb lv o elemeket kell el oszr, mivel ez a fenti elemek tvonalt nem vltoztatja.

11.3.
11.3.1.

Tesztels
Keress

Els oknt az fontos tisztzni, hogy a GtkTreeView ltal megjelentett adatokra fggetlenl attl, hogy a hozztartoz modell GtkListStore vagy GtkTreeStore az akadlymentestsi rteg, mint tblzatra tekint, ami ks obb szmos m ukdsi sajtossgra lesz majd hatssal. Els oknt arra, hogy miknt rjk el magt a GtkTreeView objektumnak megfelel o Node objektumot, az GtkTreeModel ltal elrhet o adatokat, illetve az oszlopok fejlceit. A nzetnek egy nll Node felel meg, aminek roleName rtke table, vagy tree table, el obbi ha listrl, utbbi ha frl van sz. Ezen objektumnak kt tpus gyereke van. Az egyik az egyes oszlopok fejlceit reprezentl Node, amiknl a roleName rtk table column header. Ezen gyerekek mindig a nzetnek megfelel o Node els o n elemt jelentik, ahol az n a nzet aktulisan lthat oszlopainak szma. Az ezeket kvet o gyerekek a cellkat reprezentljk, roleName rtkk table cell, szmossguk megfelel a lthat oszlop s a sorok szmnak szorzatval. Az oszlopfejlceket s a cellkat reprezentl Node objektumok nevei felveszik azt az rtket, amit szvegesen tartalmaznak, gy megtallsuk ennek megfelel oen trtnhet. Ezen objektumok rejtenek teht minden informcit, illetve rajtuk keresztl rhetnk minden olyan funkcit amire a nzet vezrlshez szksg lesz.

11.3.2.

Interfszek

Nzet. A nzet Node objektuma implementlja az table interfszt, ami egyrszr ol a tblzat ltalnos adataihoz enged hozzfrst, mint amilyen a sorok szma (nRows), az oszlopok szma (nColumns), az oszlop fejlce (columnHeader). Msrszr ol hozzfrhetnk az egyes cellkhoz x, illetve y pozci alapjn (getAccessibleAt). Cellk. Az egyes cellk mr amik a GtkCellRendererText segtsgvel rajzoldnak ki implementljk a text interfszt ennek megfelel oen az ltaluk megjelentett rtkek a korbbiakban megismerteknek megfelel oen olvashatak ki. A GtkCellRendererPixbuf osztlyt hasznl cellk az image interfszen keresztl rhet oek el, gy biztostva informcikat a megjelentett kpekr ol.

11.3.3.

llapotok

A GtkCellRendererToggle cellk rtkei a GtkCheckButton hasznlatakor bemutatott pyatspi.STATE_TOGGLE sttusz alapjn krdezhet oek le.

11.3.4.

Akcik

A GtkCellRendererToggle cellk rtkei a GtkCheckButton kapcsn megismert toggle akci rvn mdosthat.

80

A. Fggelk

Licencelsi felttelek
Ez a m u a Creative Commons Nevezd meg!-gy add tovbb! licencnek hatlya alatt ll. A kvetkez oket teheted a muvel:. szabadon msolhatod terjesztheted bemutathatod s el oadhatod a m uvet szrmazkos m uveket (feldolgozsokat) hozhatsz ltre Az albbi felttelekkel:. Nevezd meg! A szerz o vagy a jogosult ltal meghatrozott mdon fel kell tntetned a m uhz kapcsold informcikat (pl. a szerz o nevt vagy lnevt, a M u cmt). gy add tovbb! Ha megvltoztatod, talaktod, feldolgozod ezt a m uvet, az gy ltrejtt alkotst csak a jelenlegivel megegyez o licenc alatt terjesztheted. Az albbi gyelembevtelvel:. Elengeds A szerz oi jogok tulajdonosnak engedlyvel brmelyik fenti felttelt ol eltrhetsz. Ms jogok A kvetkez o jogokat a licenc semmiben nem befolysolja: A fentiek nem befolysoljk a szabad felhasznlshoz f uz od o, illetve az egyb jogokat. A szerz o szemlyhez f uz od o jogai Ms szemlyeknek a m uvet vagy a m u hasznlatt rint o jogai, mint pldul a szemlyisgi jogok vagy az adatvdelmi jogok. Jelzs Brmilyen felhasznls vagy terjeszts esetn egyrtelm uen jelezned kell msok fel ezen m u licencfeltteleit. Ez a Legal Code (jogi vltozat, vagyis a teljes licenc) szvegnek kzrthet o nyelven megfogalmazott kivonata, teljes vltozata a Creative Commons oldaln rhet o el.

81

Trgymutat
rkl ods, 7, 23, 25 tltszatlan mutat, 7 ablak modalits, 29 pozci, 31 tpus, 30 popup, 29, 30, 33 toplevel, 29, 30, 33 tranziencia, 30, 31 ablakkezel o, 19 bezrs, 19 minimalizls, 19 Accerciser, 6 ATK, 6 AtkObject, 42, 59 fggvnyek set_image_description, 59 set_name, 42 Atspi.Accessible, 59 Atspi.AccessibleAtspi.Accessible fggvnyek getState, 43 Autoconf, 14 Automake, 14 automata tesztels, 5 Autotools, 14 billenty u enter, 33 tab, 33 binris csomag, 13 C, 5, 13 C++, 4, 13 Cairo, 4 callback, 9 deb, 13 dinamikus modulbetlts, 4 Dogtail, 6, 13 procedural, 19 focus.application, 20 GtkDemoTest, 20 tree, 19 root.application, 20 utils run, 20 dogtail.Config tulajdonsgok searchBackoffDuration, 41 searchCutoffCount, 41 dogtail.Node fggvnyek satisfies, 42 tulajdonsgok name, 42 roleName, 42 dogtail.Nodedogtail.Node fggvnyek findChild, 42 dogtail.Predicate, 42 fggvnyek satisfiedByNode, 42 dogtail.Rootdogtail.Root fggvnyek application, 42 dogtail.tree fggvnyek applications, 41 application, 41 egysgbezrs, 7 fkusz billenty uzet, 33 fordts, 18, 27 fordtsi idej u tpusellen orzs, 8 futtats, 18, 27 Gail, 6 GDK backend Broadway, 3 Wayland, 3 X11, 3 GIMP, 2 Git, 2 GLib fggvnyek print, 22 makrk G_GNUC_PRINTF, 36 NULL, 23 OBJECT, 23 tpusok gboolean, 23 GObject, 4 GObject, 79 fggvnyek signal_connect_data, 23 unref, 75 makrk signal_connect, 23 signal_connect_swapped, 24 82

tagfggvnyek connect, 27 connect_object, 27 GObject Introspection, 5 gomb jvhagy, 40 menekl o, 40 grakus szerver Wayland, 3 X11, 3 GTK, 13 GTK, 3 fejlcfjlok, 17 GDK, 3, 4 GLib, 3 GIO, 4 GModule, 4 GObject, 4 GThread, 4 kdolsi konvencik, 16 formzs, 16 nevezktan, 16 Gtk fggvnyek false, 37 init, 17 main, 18 main_quit, 24 true, 37 konstansok RESPONSE_DELETE_EVENT, 39 RESPONSE_NONE, 39 WIN_POS_ALWAYS, 31 WIN_POS_CENTER, 31 WIN_POS_CENTER_ON_PARENT, 31 WIN_POS_MOUSE, 31 WIN_POS_NONE, 31 tagfggvnyek main_quit, 25, 27 GtkBin, 29, 32, 45 GtkBox, 29, 45 fggvnyek pack_end, 29, 47 pack_start, 29, 47 gyerek tulajdonsgok expand, 32, 4649 fill, 32, 4649 pack-type, 46, 49 padding, 47, 50, 51 tulajdonsgok homogeneous, 4749 spacing, 47, 50 GtkButton fggvnyek new_with_label, 23 szignlok clicked, 2325, 27 destroy, 27 GtkButtonBox, 29 GtkComboBoxText fggvnyek 83

append_all, 69 get_active_text, 70 insert_all, 69 new, 69 new_with_entry, 69 prepend_all, 69 remove, 70 remove_all, 70 GtkContainer, 33, 45 fggvnyek add, 47 add, 48 remove, 48 remove, 48 set_focus_chain, 33 GtkDialog, 29, 30, 34 bels o elemek action_area, 29 content_area, 29 fggvnyek run, 31, 36, 39 set_alternative_button_order, 40 set_alternative_button_order_from_array, 40 szignlok response, 39 GtkEditable, 61 fggvnyek set_editable, 62 GtkEntry, 33 fggvnyek get_text, 62 new, 61 new_with_buffer, 61 set_invisible_char, 62 set_placeholder_text, 63 set_text, 62 set_visible, 62 tulajdonsgok activates-default, 33 caps-lock-warning, 63 invisible-char, 62 placeholder-text, 63 progress-fraction, 63 progress-pulse, 63 progress-pulse-step, 63 text, 62 visibility, 62 GtkEntryBuffer, 61, 63 GtkGrid, 45 fggvnyek attach, 48 tulajdonsgok column-homogeneous, 46, 48, 50 column-spacing, 46, 50 row-homogeneous, 46, 48, 50 row-spacing, 46, 50 GtkImage, 53 GtkLabel, 53 fggvnyek new, 55 new_with_mnemonic, 55

GtkMessageDialog, 35 GtkMisc tulajdonsgok xalign, 55 xpad, 55 yalign, 55 ypad, 55 gtkmm, 4, 7 GtkRadioButton, 70 GtkSeparator, 29 GtkSpinButton, 64 szignlok input, 64 output, 64 tulajdonsgok value, 62 GtkStockId, 34 GtkTextView, 33 GtkToggleButton szignlok toggled, 70 tulajdonsgok active, 70 inconsistent, 70 GtkTooltip, 54 GtkWidget, 8 fggvnyek destroy, 2325, 47 get_accessible, 42 grab_focus, 33 hide, 25, 31, 38 show, 18, 31, 36, 39 show_all, 36 szignlok delete-event, 23, 2527, 38, 39 destroy, 24, 39 unmap, 39 tulajdonsgok can-default, 33 can-focus, 33 expand, 48 halign, 48, 49 has-default, 33 hexpand, 48 valign, 48, 49 vexpand, 48 GtkWindow, 29, 30 fggvnyek fullscreen, 40 get_position, 31 iconify, 40 maximize, 40 move, 31 new, 18, 23 present, 36 resize, 32 set_default_size, 31 set_deletable, 40 set_geometry_hints, 32 set_keep_above, 40 set_position, 31

set_resizable, 32 set_skip_taskbar_hint, 40 set_transient_for, 31 stick, 40 tulajdonsgok destroy-with-parent, 30 gravity, 31 modal, 29, 30, 36 size-request, 31 transient-for, 30 type, 29 GUI, 3 GUI eszkzkszlet, 2 interfsz, 10 kontner, 45 size allocation, 49 size request, 31 lebeg o referencia, 10, 18, 47, 75 libsigc++, 4 libsigc++ fggvnyek bind, 25 mem_fun, 25 ptr_fun, 25 tpusok slot, 25 Libtool, 14 licenc LGPL, 2 Linux, 2, 3 Mac OS X, 2, 3 Main, 17 fggvnyek quit, 18 run, 18 main loop, 9, 21, 36, 39 Motif, 2 nyelv vltozatok gtkmm, 13 PyGObject, 13 nyelvi vltozatok GTK+, 13 opercis rendszer Linux, 2, 3 Mac OS X, 2, 3, 9 Windows, 2, 3, 9 Pango, 4 POSIX, 4 PyGObject, 5, 7 Python, 5, 13 Python os kill, 20 signal SIGTERM, 20 84

time sleep, 20 unittest, 19 main, 20 setUp, 20 tearDown, 20 TestCase, 20 referencia-szmlls, 10, 48, 75 rpm, 13 SignalProxyBase tagfggvnyek connect, 25 szl o-gyerek kapcsolat, 10 szlkezels, 4 szignl, 21, 23 alaprtelmezett esemnykezel o fggvny, 23, 26 blokkolsa, 23, 26, 27 esemnykezel o fggvnyek sorrendje, 24 esemnykezel o felktse, 23, 25, 27 tpusknyszerts, 23, 24 teszt szkript futtats, 20 widget, 8 szignlok, 8 delete-event, 18, 19 tulajdonsgok, 8 Windows, 2, 3 wrapper, 4

85

Tblzatok jegyzke
1.1 A GTK+, gtkmm, PyGObject sszehasonltsa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

86

brk jegyzke
2.1 2.2 4.1 6.1 6.2 6.3 6.4 6.5 7.1 7.2 8.1 8.2 8.3 9.1 9.2 9.3 10.1 10.2 10.3 10.4 rkl ods hasonl funkcij widgetek kztt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Akadlymentestett szoftverek elrse[1] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Minimlis mintapldk kperny okpi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Billenty uzet fkusz jelzse a widgeten[6] . . . Gombok szoksok sorrendje egy dialgusban[6] Tipikus ablakszerkezetek[6] . . . . . . . . . . Egy tipikus gombsor . . . . . . . . . . . . . . Tipikus zenetablakok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 11 19 33 33 34 34 35 49 50 53 54 54 60 63 63 67 68 68 68 74

Mretarnyos s homogn elhelyezsnek a kontneren bell[8] . . . . . . . . . . . . . . . . . . . . . . Tr az elemek kztt s krl a kontnerben[8] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Cmke[9] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Kp[9] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bubork[7] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Szveg s szm bevitele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ikonok hasznlata szvegbeviteli mez oben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ikonok hasznlata szvegbeviteli mez oben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Jell ongyzet[9] . . . . . . . . . . . . . . . . . Rdigombok[9] . . . . . . . . . . . . . . . . ComboBox[9] . . . . . . . . . . . . . . . . . . Inkonzisztens llapot jell ongyzetek esetn[6] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

11.1 tvonal fa szerkezeten bell[6] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

87

Kdrszletek jegyzke
4.1 Minimlisan szksges kd GTK+, gtkmm, illetve PyGobject hasznlata mellett . . . . . . . . 4.2 Minimlisan szksges teszt tree, illetve procedural API hasznlata mellett . . . . . . . . . . 5.1 Szignlok kezelse C, illetve C++ nyelven . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2 Szignlok kezelse Python nyelven . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.1 Window ltrehozsa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2 Dialog ltrehozsa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3 Miniml plda GtkWindowhoz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.4 Gombok hozzadsa GtkDialoghoz[6] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.5 Tipikus gombsor hozzadsa GtkDialoghoz[6] . . . . . . . . . . . . . . . . . . . . . . . . . 6.6 MessageDialog ltrehozsa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.7 Szignlkezel o fggvny perzisztens ablakhoz . . . . . . . . . . . . . . . . . . . . . . . . . . 6.8 Szignlkezel o fggvny bektse perzisztens ablakhoz . . . . . . . . . . . . . . . . . . . . . 6.9 Egyszer ustett szignlkezel o fggvny bektse . . . . . . . . . . . . . . . . . . . . . . . . . 6.10 Egyszer ustett szignlkezel o fggvny bektse . . . . . . . . . . . . . . . . . . . . . . . . . 6.11 Miniml plda GtkDialoghoz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.12 Miniml plda GtkDialoghoz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.13 Egyszer ustett response-kezel o fggvny bektse . . . . . . . . . . . . . . . . . . . . . . . . 6.14 Esemnykezel o felldenilsa sajt widgetosztlyban . . . . . . . . . . . . . . . . . . . . . 6.15 Alternatv gombsorrend belltsa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.16 Alapvet o elemek keresse teszt tree, illetve procedural API hasznlata mellett . . . . . . . . . 6.17 Node keresse GenericPredicate, illetve findChild fggvny segtsgvel . . . . . . . . . 6.18 Applikci keresse application fggvnnyel, illetve IsAnApplicationNamed objektummal 6.19 Ablak keresse specializlt Predicate objektummal . . . . . . . . . . . . . . . . . . . . . . 6.20 Node sttuszvizsglathoz szksges fggvny smja . . . . . . . . . . . . . . . . . . . . . 8.1 Cmke ltrehozsa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.1 Az input s output szignlok felldenilsa az alaprtelmezett m ukdst implementlva . . 9.2 Az input s output szignlok felldenilsa hnapok megjelentshez . . . . . . . . . . . 10.1 CheckButton ltrehozsa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.2 ComboBoxText ltrehozsa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.1 GtkListStore ltrehozsa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2 Plda GtkListStore ltrehozsra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.3 GtkTreeView ltrehozsa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.4 GtkTreeViewColumn ltrehozsa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.5 Plda GtkTreeView ltrehozsra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.6 Elem hozzadsa listhoz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.7 Elem hozzadsa fhoz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.8 Sor rtkeinek belltsa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.9 Plda sor egy rtknek belltsra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.10Plda teljes sor belltsra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.11Sor rtkeinek lekrdezse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 19 22 26 30 31 32 34 35 36 37 37 37 38 39 39 39 40 41 41 42 42 43 43 55 64 65 69 69 75 75 76 76 76 77 77 78 78 78 79

88

Irodalomjegyzk
[1] GNOME Accessibility Developers Guide. stable/. http://developer.gnome.org/accessibility-devel-guide/

[2] GNU Coding Standards. http://www.gnu.org/prep/standards/standards.html. [3] Linux kernel coding style. http://www.kernel.org/doc/Documentation/CodingStyle. [4] The Python Standard Library. http://docs.python.org/py3k/library. [5] FSF.hu Alaptvny. Szabad szabad-szoftver-palyazat-2011. szoftver plyzat 2011. http://fsf.hu/2011/09/27/

[6] Calum Benson, Adam Elman, Seth Nickell, and Colin z Robertson. GNOME Human Interface Guidelines. http: //library.gnome.org/devel/hig-book/. [7] Murray Cumming et al. Programming with gtkmm 3. The GNOME Project. http://developer.gnome.org/ gtkmm-tutorial/unstable/. [8] Tony Gale, Ian Main, and the GTK team. GTK+ 2.0 Tutorial. The GNOME Project. http://library.gnome. org/devel/gtk-tutorial/stable/. [9] The GNOME Project. GTK+ 3 Reference Manual. http://developer.gnome.org/gtk3/stable/. [10] Havoc Pennington. GTK+ / Gnome Application Development. New Riders Publishing, 1999. http://developer. gnome.org/doc/GGAD/ggad.html. [11] Read the Docs project. The Python GTK+ 3 Tutorial. http://python-gtk-3-tutorial.readthedocs.org.

89

You might also like