You are on page 1of 371

gtk 2007/10/21 14:22 page 1 #1

Pere Lszl
A GNU/Linux programozsa
grakus felleten
Vltozat: 1.16
gtk 2007/10/21 14:22 page 2 #2
(c) 20062007 Pere Lszl
A szerz o hozzjrul a jelen m u vltozatlan formban trtn o
sokszorostshoz, belertve az elektronikus vagy nyomdai formban
kszlt msolatok ksztst s terjesztst is. A hozzjruls nem
terjed ki a m u mdostott formban val terjesztsre, belertve, de nem
korltozva a m u b ovtsre s rszletekben trtn o reproduklsra.
gtk 2007/10/21 14:22 page 3 #3
Tartalomjegyzk
1. Bevezets 7
1.1. A pldaprogramokrl . . . . . . . . . . . . . . . . . . . . . . . 8
2. Az els o lpsek 9
2.1. Programozs Unix krnyezetben . . . . . . . . . . . . . . . . . 9
2.1.1. A hasznlt alkalmazsok . . . . . . . . . . . . . . . . . 9
2.1.2. A munkamenet . . . . . . . . . . . . . . . . . . . . . . . 11
2.1.3. Tbb kperny oelem elhelyezse . . . . . . . . . . . . . 14
2.1.4. Tulajdonsgok s esemnyek . . . . . . . . . . . . . . . 16
2.1.5. A visszahvott fggvnyek szerkesztse . . . . . . . . . 18
2.2. Programozs Windows krnyezetben . . . . . . . . . . . . . . 20
2.2.1. A MinGW krnyezet . . . . . . . . . . . . . . . . . . . . 20
2.3. Az objektumorientlt programozs . . . . . . . . . . . . . . . 24
2.3.1. rkl ods s tbbalaksg . . . . . . . . . . . . . . . . 24
2.3.2. A tpusknyszerts . . . . . . . . . . . . . . . . . . . . 25
2.3.3. Az objektumtulajdonsgok . . . . . . . . . . . . . . . . 26
2.3.4. Az ltalnos tpus vltoz . . . . . . . . . . . . . . . . 28
2.4. Kapcsolat a kperny oelemek kzt . . . . . . . . . . . . . . . . 29
3. Egyszer u felhasznli felletek ksztse 33
3.1. Egyszer u kperny oelemek . . . . . . . . . . . . . . . . . . . . 34
3.1.1. A cmke . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.1.2. A kp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.1.3. A nyomgomb . . . . . . . . . . . . . . . . . . . . . . . . 38
3.1.4. A kapcsolgomb . . . . . . . . . . . . . . . . . . . . . . 41
3.1.5. A beviteli mez o . . . . . . . . . . . . . . . . . . . . . . . 43
3.1.6. A forgatgomb . . . . . . . . . . . . . . . . . . . . . . . 45
3.1.7. A kombinlt doboz . . . . . . . . . . . . . . . . . . . . . 46
3.1.8. A jell ongyzet . . . . . . . . . . . . . . . . . . . . . . . 50
3.1.9. A rdigomb . . . . . . . . . . . . . . . . . . . . . . . . 52
3.1.10.A mensv . . . . . . . . . . . . . . . . . . . . . . . . . 52
3.1.11.A felbukkan men . . . . . . . . . . . . . . . . . . . . 56
3
gtk 2007/10/21 14:22 page 4 #4
4
3.1.12.Az eszkzsv . . . . . . . . . . . . . . . . . . . . . . . . 60
3.2. Doboz jelleg u elemek . . . . . . . . . . . . . . . . . . . . . . . 60
3.2.1. Az ablak . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
3.2.2. A fgg oleges doboz . . . . . . . . . . . . . . . . . . . . . 63
3.2.3. A vzszintes doboz . . . . . . . . . . . . . . . . . . . . . 64
3.2.4. A tblzat . . . . . . . . . . . . . . . . . . . . . . . . . . 64
3.2.5. A keret . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
3.3. ltalnos eszkzk . . . . . . . . . . . . . . . . . . . . . . . . . 65
3.3.1. Az objektum . . . . . . . . . . . . . . . . . . . . . . . . . 65
3.3.2. Az ltalnos kperny oelem . . . . . . . . . . . . . . . . 68
4. A G programknyvtr 73
4.1. A G programknyvtr tpusai . . . . . . . . . . . . . . . . . . 73
4.2. Az ltalnos cl makrk . . . . . . . . . . . . . . . . . . . . . 75
4.3. A hibakeresshez hasznlhat eszkzk . . . . . . . . . . . . 76
4.4. A dinamikus memriakezels . . . . . . . . . . . . . . . . . . 79
4.5. A karakterlncok kezelse . . . . . . . . . . . . . . . . . . . . 80
4.5.1. A karakterlncok kezelse egyszer uen . . . . . . . . . 81
4.5.2. Az Unicode karakterlncok . . . . . . . . . . . . . . . . 86
4.5.3. A magas szint u karakterlnc-kezels . . . . . . . . . . 97
4.6. Az iterlt adattpusok . . . . . . . . . . . . . . . . . . . . . . . 101
4.6.1. A ktszeresen lncolt lista . . . . . . . . . . . . . . . . 102
4.6.2. A fa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
4.6.3. A kiegyenslyozott binris keres ofa . . . . . . . . . . . 110
4.7. llomnykezels . . . . . . . . . . . . . . . . . . . . . . . . . . 114
4.7.1. Az llomnynevek kezelse . . . . . . . . . . . . . . . . 115
4.8. A parancssori kapcsolk kezelse . . . . . . . . . . . . . . . . 117
5. Osztlyok ksztse 129
5.1. Egyszer u osztly ksztse . . . . . . . . . . . . . . . . . . . . 129
5.2. Tulajdonsgok rendelse az osztlyhoz . . . . . . . . . . . . . 142
5.3. Tagok elrejtse . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
6. XML llomnyok kezelse 149
6.1. Az XML llomny szerkezete . . . . . . . . . . . . . . . . . . . 149
6.2. Az XML programknyvtr egyszer u hasznlata . . . . . . . . 152
6.2.1. A fordts el otti bellts . . . . . . . . . . . . . . . . . 152
6.2.2. A fejllomnyok betltse . . . . . . . . . . . . . . . . . 153
6.2.3. A dokumentum ltrehozsa s mentse . . . . . . . . . 153
6.2.4. A dokumentum betltse . . . . . . . . . . . . . . . . . 156
6.2.5. A dokumentum b ovtse . . . . . . . . . . . . . . . . . 157
6.2.6. A bejrs s a lekrdezs . . . . . . . . . . . . . . . . . 160
6.2.7. A dokumentum mdostsa . . . . . . . . . . . . . . . . 167
6.3. Az XPath eszkztr . . . . . . . . . . . . . . . . . . . . . . . . 170
gtk 2007/10/21 14:22 page 5 #5
5
6.3.1. Egyszer u XPath kifejezsek kirtkelse . . . . . . . . 172
6.3.2. Az sszetett eredmny u XPath kifejezsek . . . . . . . 176
6.3.3. Az XPath m uveleti jelek s fggvnyek . . . . . . . . . 177
7. Tbbablakos alkalmazsok 179
7.1. Az ablakok megnyitsa, bezrsa . . . . . . . . . . . . . . . . 179
7.2. A fggvnyhvssal ltrehozhat ablakok . . . . . . . . . . . . 182
7.2.1. Az zenet-ablakok . . . . . . . . . . . . . . . . . . . . . 183
7.2.2. Az llomnynv-ablak . . . . . . . . . . . . . . . . . . . 187
7.2.3. A bet utpus-ablak . . . . . . . . . . . . . . . . . . . . . 191
7.2.4. A sznvlaszt-ablak . . . . . . . . . . . . . . . . . . . . 194
8. sszetett kperny oelemek 201
8.1. Az alkalmazs-ablak . . . . . . . . . . . . . . . . . . . . . . . . 201
8.1.1. Az elmozdthat eszkzsv . . . . . . . . . . . . . . . . 201
8.1.2. A f o kperny oelem . . . . . . . . . . . . . . . . . . . . . 207
8.1.3. Az llapotsor . . . . . . . . . . . . . . . . . . . . . . . . 208
8.2. A szvegszerkeszt o . . . . . . . . . . . . . . . . . . . . . . . . . 209
8.2.1. A szveg olvassa s rsa . . . . . . . . . . . . . . . . 211
8.2.2. A szvegbejrk . . . . . . . . . . . . . . . . . . . . . . 216
8.2.3. A szvegjelek . . . . . . . . . . . . . . . . . . . . . . . . 226
8.2.4. A cetlik . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
8.2.5. A kurzor s a kijellt szveg . . . . . . . . . . . . . . . 246
8.2.6. A szveg mdostsnak gyelse . . . . . . . . . . . . 254
8.3. A raktrak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
8.3.1. Az ltalnos raktr . . . . . . . . . . . . . . . . . . . . . 254
8.3.2. A lista szerkezet u raktr . . . . . . . . . . . . . . . . . 262
8.3.3. A fa szerkezet u raktr . . . . . . . . . . . . . . . . . . . 268
8.4. A cellarajzolk . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
8.4.1. A szveges cellarajzol . . . . . . . . . . . . . . . . . . . 272
8.4.2. A kpmegjelent o cellarajzol . . . . . . . . . . . . . . . 279
8.4.3. A kapcsol cellarajzol . . . . . . . . . . . . . . . . . . 281
8.4.4. A folyamatjelz o cellarajzol . . . . . . . . . . . . . . . . 286
8.5. A cellaelrendezs . . . . . . . . . . . . . . . . . . . . . . . . . . 287
8.6. A kombinlt doboz . . . . . . . . . . . . . . . . . . . . . . . . . 293
8.7. A fa kperny oelem . . . . . . . . . . . . . . . . . . . . . . . . . 298
8.7.1. Az oszlopok nomhangolsa . . . . . . . . . . . . . . . 301
8.7.2. A fa kperny oelem belltsai . . . . . . . . . . . . . . . 308
8.7.3. A fa kperny oelem hasznlata . . . . . . . . . . . . . . 311
8.7.4. A fa kperny oelem jelzsei . . . . . . . . . . . . . . . . 322
8.8. Az ikonmez o . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
8.8.1. Az ikonmez o cellarajzoli . . . . . . . . . . . . . . . . . 338
8.8.2. Az ikonmez o jelzsei . . . . . . . . . . . . . . . . . . . . 338
gtk 2007/10/21 14:22 page 6 #6
6
9. Kiegszt o eszkzk 341
9.1. A forrsprogram terjesztse . . . . . . . . . . . . . . . . . . . . 341
9.2. A programvltozatok kvetse . . . . . . . . . . . . . . . . . . 342
9.2.1. Klnbsgi llomnyok . . . . . . . . . . . . . . . . . . 342
9.3. j forrs-llomnyok . . . . . . . . . . . . . . . . . . . . . . . 345
9.3.1. Ikonok elhelyezse a programcsomagban . . . . . . . . 346
9.4. Tbbnyelv u programok ksztse . . . . . . . . . . . . . . . . 348
gtk 2007/10/21 14:22 page 7 #7
1. fejezet
Bevezets
A grakus felhasznli fellet ksztsre alkalmas programknyvtrak
ltalban igen sok, nem ritkn tbb ezer, esetleg tbb tzezer fggvnyt
biztostanak a programoz szmra, amelyekhez sok adattpus, elemi s
sszetett adatszerkezet trsul, tovbb bonyoltva a programoz munk-
jt.
A nyelvi szerkezethez meglehet osen komoly jelentstani rteg kapcsol-
dik. Bizonyos m uveleteket csak bizonyos sorrendben lehet elvgezni, az
egyes kperny olemek kzti rokonsgi, rkl odsi rendszert is gyelembe
kell venni s gy tovbb.
Nyilvnval, hogy egy ilyen sszetett nyelvi szerkezet hasznlathoz
nem kell annak minden elemt tkletesen ismerni. A programoz a
munkja sorn felhasznlhatja a teljes eszkztrat m uszaki alapossg-
gal ler dokumentcit, kikeresheti azokat a kulcsszavakat, szablyo-
kat, amelyeket nem tud segtsg nlkl felidzni.
Egy dolgot azonban nem szabad szem el ol tvesztennk! A dokumen-
tci segti a munkt, a hatkony programozshoz azonban ismeretekre,
tapasztalatra van szksgnk. Nem trolhatunk minden ismeretet a
knyvekben, a program rshoz valamilyen szinten ismernnk kell az
eszkzket, amelyeket ignybe kvnunk venni. A grakus felhasznli
fellettel tmogatott alkalmazsok ksztse sorn a hatkony progra-
mozshoz olyan mennyisg u nyelvi tudsra van szksgnk, amely akr
beszlt nyelvek esetn is elegend o arra, hogy kifejezzk magunkat. Aki
teht hatkonyan akar ilyen alkalmazsokat kszteni, esetleg annyit
knyszerl tanulni, hogy az beszlt nyelvek esetn mr az alap- vagy
kzpfok nyelvvizsghoz is elegend o volna.
7
gtk 2007/10/21 14:22 page 8 #8
8
1.1. A pldaprogramokrl
A grakus felhasznli felletet hasznl programok ltalban sok sor-
nyi C programkdot tartalmaz, viszonylag nagymret u programok. A
programozk klnfle eszkzkkel prblnak meg rr lenni a bo-
nyolultsgon, klnfle mdszerekkel prbljk meg rthet o mret u r-
szekre szabdalni a programkdot. Az egyik el oszeretettel hasznlt md-
szer a static kulcssz hasznlata, amelyet a bemutatott pldaprogra-
mokban is hasznlunk, mgpedig a kvetkez o formban:
1 static void
2 fill_store_with_filenames(GtkListStore
*
store)
3 {
4 ...
5 }
A fggvnyek ltrehozsakor a static kulcssz azt jelzi, hogy a fggvny
csak az adott llomny fordtsa sorn rhet o el, a fggvny hatkre
az llomnyra (fordtsi egysgre), korltozdik. A pldaprogramokban a
hatkr ilyen formban trtn o korltozsval jelltk, hogy a fggvny
helyi, klnleges feladatot lt el, ellenttben az ltalnos feladatot ellt,
kiterjedt hatkr u fggvnyekkel, amelyek az alkalmazs tvoli rszei
kzt teremtenek kapcsolatot.
gtk 2007/10/21 14:22 page 9 #9
2. fejezet
Az els o lpsek
Ebben a fejezetben ttekintjk hogyan kszthetnk egyszer u grakus
alkalmazst a GTK+ programknyvtr segtsgvel. Nyilvnval, hogy
ezek az ismeretek nem elegend oek ahhoz, hogy sszetett grakus alkal-
mazsokat ksztsnk, de ahogyan ltni fogjuk egyszer ubb alkalma-
zsokat meglep oen knnyen kszthetnk.
2.1. Programozs Unix krnyezetben
A GTK Unix krnyezetben termszetes knnyedsggel hasznlhat, a
szksges alkalmazsok s programknyvtrak egyszer uen telepthet ok,
az elksztett alkalmazs lefordtsa ltalban nem jelent gondot. Mind
ezen okok miatt rdemes valamilyen Unix krnyezetben megkezdennk
a munkt.
2.1.1. A hasznlt alkalmazsok
A knyvben er oteljesen tmaszkodunk a Glade szerkeszt oprogramra,
ami lehet ov teszi, hogy a grakus felhasznli fellet elemeit felptsk,
hogy a programot megrajzoljuk. Grakus felhasznli felletet a Glade
nlkl is kszthetnnk, de tagadhatatlan, hogy a programmal egysze-
r ubben s gyorsabban kszthetjk el a programjainkat.
A GTK+ programknyvtrrl s az egyb tmogat programknyvt-
rakrl rszletes fejleszt oi lers ll a rendelkezsnkre, amelyet legegy-
szer ubben a devhelp program segtsgvel rhetnk el. A devhelp prog-
ramot lthatjuk a 2.1. brn.
rdemes megemlteni a gtk-demo programot, ami a GTK+ program-
knyvtr nhny eszkzt mutatja be. A programban egy id oben gyel-
hetjk meg a pldaprogram futst s a forrsprogramot, ami nagyszer u
9
gtk 2007/10/21 14:22 page 10 #10
10
2.1. bra. A dokumentcit megjelent o devhelp program
lehet osget biztost arra, hogy az egyszer ubb programozi fogsokat el-
sajtthassuk.
A programozs kzben nyilvnvalan szksgnk lesz egy szvegszer-
keszt o programra, amellyel a programunk forrsllomnyait szerkeszt-
jk. Termszetesen minden programoz a jl bevlt szvegszerkeszt o
programjt rszesti el onyben, gyelnnk kell azonban arra, hogy olyan
szvegszerkeszt ot vlasszunk, amelyik kpes rzkelni, ha a szerkesztett
llomny megvltozott.
Bizonyos forrsllomnyokat ugyanis a Glade s a szvegszerkeszt o
program segtsgvel egyarnt s gyelnnk kell, hogy e programok ne
rjk fell egyms munkjt. Szerencss megolds, ha a szvegszerkesz-
t oben megnyitott sszes llomnyt mentjk, miel ott a Glade f oablakban
a forrsprogramok rst krnnk, hogy a Glade a szvegszerkeszt o ab-
lakban lthat legfrissebb programvltozatot mdostsa, majd, amikor
a szvegszerkeszt o jelzi, hogy a szerkesztett llomnyok egyike-msika
megvltozott, egyszer uen krjk az llomny jraolvasst. A gvim gra-
kus szvegszerkeszt o pldul egy zenetet jelent meg, amikor a szveg-
szerkeszt o ablakot kivlasztjuk, ha az llomny megvltozott. Az zenet
megjelensekor krhetjk a programot, hogy olvassa jra az llomnyt.
Mivel a gvim az llomny jraolvassa utn nem vltoztatja meg a kurzor
helyt a szvegben, a programozsi munkt igen knyelmesen folytathat-
juk onnan, ahol megszaktottuk.
gtk 2007/10/21 14:22 page 11 #11
11
2.1.2. A munkamenet
A Glade szerkeszt oprogram a glade vagy a glade-2 parancs kiadsval
indthat attl fgg oen, hogy melyik vltozata van teleptve a szmtg-
pnkre. Indts utn a program nhny egyszer u ablakot jelent meg a
kperny on, amelyek a f oablak, a paletta s a tulajdonsgok nevet viselik.
2.2. bra. A Glade f oablaka
A f oablak (2.2. bra) szokvnyos alkalma-
zsablak, menivel, ikonjaival a szoksos
mdon vgezhetjk a munkt, a kzpen ta-
llhat munkaterleten pedig a ltrehozott
grakus elemeket vlaszthatjuk ki.
Kezdjk meg a munkt a f oablakban! V-
lasszuk ki a projekt men j menpontjt,
hogy j programot kszthessnk. Ekkor a
Glade megkrdezi, hogy GTK+ vagy GNOME
programot kvnunk-e kszteni. Egyszer u
programok esetben gyakorlatilag mindegy
melyik lehet osggel lnk a GNOME n-
hny kln eszkzt biztost, de ezeket most
mg nem hasznljuk szabadon dnthe-
tnk.
Ha ltrehoztuk az j projektet, vlasszuk ki a projekt men bellt-
sok menpontjt, hogy a programunk legfontosabb tulajdonsgait be-
llthassuk. A projekt belltsok ablak (2.3. bra) nhny eleme olyan
informcit tartalmaz, amire a ks obbiekben szksgnk lesz.
A projekt knyvtr mez oben megadhatjuk, hogy a programunk forrs-
llomnyai melyik knyvtrba kerljenek. Ez termszetesen nem az a
knyvtr, ahol a program a telepts utn elrhet o, hanem az a knyvtr,
ahol a fejleszt omunkt vgezzk.
A program neve mez oben megadhatjuk, hogy a programunknak mi lesz
a neve, vagyis milyen programnv begpelsvel indthat el maga a prog-
ram.
A projekt llomny mez oben megadhatjuk, hogy a projekt knyvtron
bell melyik llomnyba kerljenek a Glade szmra elengedhetetlenl
fontos adatok. Ez a projektllomny olyan formban tartalmazza a mun-
knkat, amit a Glade kpes beolvasni s a ks obbiekben szerkeszteni. A
projekt llomnyra a programnak a futsakor nem felttlenl van szk-
sge, ha azonban a program grakus elemein a ks obbiekben a Glade
segtsgvel vltoztatni szeretnnk ezt az llomnyt kell megnyitnunk.
gtk 2007/10/21 14:22 page 12 #12
12
2.3. bra. A projekt legfontosabb belltsai
A nyelv mez oben megadhatjuk, hogy a Glade milyen programozsi
nyelven ksztse el a programunk vzt. Amint lthatjuk a C, C++ s
az Ada programozsi nyelvek kzl vlaszthatunk, azaz a Glade ilyen
nyelv u fejlesztsekben kpes a segtsgnkre lenni. E knyvben a C
nyelv u programozssal foglalkozunk, ez azonban termszetesen nem je-
lenti azt, hogy a msik kt programozsi nyelv hasznlata esetben gy-
keresen ms mdszereket kellene hasznlnunk.
Tetszs szerint lltsunk be egy nevet az j programunk szmra ez
a programfejleszts egyik legnehezebb lpse , majd az ok gomb lenyo-
msa utn vegyk szemgyre a paletta ablakot.
A paletta ablak (2.4. bra) tartalmazza azokat a kperny oelemeket
(widget), amelyeket a grakus felhasznli felleten elhelyezhetnk.
A paletta nagy vonalakban a rajzolprogamok esetben mr megszokott
mdon m ukdik. Az ablak bal fels o sarkban tallhat nylra kattintva
egy kijell o eszkzhz jutunk, ami lehet ov teszi, hogy a mr elhelyezett
kperny oelemek kivlasszuk s mdostsuk, az ablak als rszn lthat
ikonokra kattintva pedig kivlaszthatjuk, hogy milyen kperny oelemeket
kvnunk elhelyezni a munkafelleten. Az elhelyezhet o elemek csopor-
tokba vannak rendezve. Megklnbztetnk GTK alap, GTK tovbbi s
GNOME elemeket. A csoportok kzt tallhat az elavult csoport, ami a
m ukd o, de j fejlesztsre nem ajnlott elemeket tartalmaz.
Miel ott egyetlen elemet is elhelyeznnk, szksgnk van legalbb egy
ablakra, ami az elemeket tartalmazni fogja. A Glade tbbfle ablak ltre-
hozst tmogatja, kezdetben azonban ksrletezznk a lehet o legegysze-
gtk 2007/10/21 14:22 page 13 #13
13
r ubb, res ablak ltrehozsval! Kattintsunk a paletta ablak GTK alap
eszkzsvjnak els o, ablakot formz ikonjra, ezzel hozzunk ltre egy
j ablakot a kperny on! Az ikonokra lva az egrkurzorral, egy kis se-
gdablak (n. tooltip) jelenik meg az ikon szveges lersval. Ez nagyon
megknnyti a megfelel o elem kivlasztst.
2.4. bra. A pa-
letta
Ha rkattintottunk az j ablak ltrehozsra szol-
gl ikonra, azonnal megjelenik egy j szerkeszt oab-
lak a kperny on (2.5. bra), amelybe a kperny oele-
meket elhelyezhetjk. Az j ablak neve egyben meg-
jelenik a f oablak kzps o terletn, ahol a ks obbiek-
ben brmikor kivlaszthatjuk, hogy a tulajdonsgait
megvltoztassuk.
Helyezznk most el egy nyomgombot az ablakban!
Ezt igen egyszer uen megtehetjk: elg, ha a palettn
bell kivlasztjuk a nyomgomb ltrehozsra szol-
gl ikont, majd a szerkeszt o ablak kzps o rszre
kattintva elhelyezzk a nyomgombot. Ezzel az egy-
szer u mdszerrel egy ablakba csak egyetlen kper-
ny oelemet helyezhetnk el, de a cljainknak most ez
is megfelel.
A szerkeszt oablakban elhelyezett kperny oeleme-
ket knnyedn tudjuk trlni is. Ehhez kattintsunk
a paletta bal fels o rszn tallhat nyl alak ikonra,
majd kattintsunk a szerkeszt oablak azon kperny o-
elemre, amelyet trlni szeretnnk. Ha kijelltk a
kperny oelemet a sarkaiban megjelen o fekete ngy-
zetek ezt jelzik a Del billenty u lenyomsval trl-
het o.
Ha elksztettk az egyetlen nyomgombot tartal-
maz ablakunkat mentsk a projektllomnyt. Eh-
hez vlasszuk a projekt men ments menpontjt
vagy kattintsunk az eszkzsv ments ikonjra. A Glade nem r kln
zenetet, ha a mentst sikeresen elvgezte.
2.5. bra. A szerkeszt oablak
Ezek utn utastanunk kell a programot,
hogy hozza ltre a projekthez tartoz prog-
ramllomnyokat. Erre a m uveletre a pro-
jekt men elkszts menpontja vagy az
eszkzsv elkszts ikonja hasznlhat.
A kvetkez o feladatunk a program leford-
tsa. Ehhez el oszr nyissunk egy parancs-
sort, majd menjnk a projekt alapknyvt-
rba, hogy a megfelel o parancsokat knyel-
mesen kiadhassuk!
Az els o futtatand parancs a ./autogen.sh, ami a Glade ltal ltreho-
gtk 2007/10/21 14:22 page 14 #14
14
zott autogen.sh hjprogramot futtatja. Ez a program az automake s az
autoconf programcsomagok segtsgvel ltrehozza a fordtst vezrl o
llomnyokat s a ./configure parancs kiadsval elvgzi a fordts
el otti belltst. A ks obbi fejlesztsi munka sorn a ./autogen.sh pa-
rancsot ltalban nem kell kiadnunk, de a ./configure parancsot a
fordtshoz minden szmtgpen hasznlnunk kell, ahol a teleptst el
akarjuk vgezni.
2.6. bra.
A kvetkez o feladat a make program futtatsa, amelyet
a make parancs kiadsval krhetnk. A make program az
aktulis knyvtrban tallhat Makefile llomnyt hasz-
nlva lefordtja a programunkat. Ez nagyobb projekt esetn
hosszadalmas is lehet.
A sikeres fordts utn a programunk elrhet o a projekt
alapknyvtrban tallhat src/ alknyvtrban. Ha kiadjuk
a make install parancsot, a make telepti a programunkat,
ehhez azonban rendszergazdai jogokra van szksgnk.
Adjuk ki teht a megfelel o parancsokat az llomnyok ltrehozsra, a
program fordtsra s futtassuk a ksz programot (a pldbl a paran-
csok kiadsnak hatsra megjelen o nhny sort eltvoltottuk helyta-
karkossg cljbl):
$ ./autogen.sh
$ make
$ src/projekt1
Az utols paranccsal elindtott program a 2.6. brn lthat. A program
egyetlen nyomgombot tartalmaz ablakot jelent meg s gyakorlatilag
semmire nem hasznlhat. A nyomgomb lenyomsakor nem trtnik
semmi, s ot az ablak bezrsakor a program tovbb fut. E programbl
csak a Ctrl + c billenty ukombinci lenyomsval lehet kilpni.
2.1.3. Tbb kperny oelem elhelyezse
A kvetkez okben megvizsgljuk hogyan lehet egy ablakon bell tbb kp-
erny oelemet elhelyezni. Meglep o, de ez nem olyan egyszer u, mint aho-
gyan gondolnnk, a Glade s a GTK+ programknyvtr ugyanis nem
engedi meg, hogy az ablakon bell tbb elem helyezkedjen el, csak akkor,
ha azok klnleges elemekben, gynevezett dobozokban vannak.
Ha kilptnk volna a Glade programbl indtsuk el jra s nyissuk meg
a projektet a projekt men megnyits menpontjval. A megnyits utn
folytathatjuk a grakus felhasznli fellet szerkesztst.
Els oknt trljk az ablakban elhelyezett nyomgombot gy, hogy azt
kzben kimsoljuk a vglapra! Jelljk ki a nyomgombot, majd v-
lasszuk a szerkeszts men kivgs menpontjt. Ekkor a nyomgomb
gtk 2007/10/21 14:22 page 15 #15
15
elt unik a szerkszt oablakbl, de a vglapon megmarad, hogy ks obb a
szerkeszts men beilleszts menpontjval jra elrhet o legyen.
Most helyezznk el az ablakban egy kt sort tartalmaz fgg oleges do-
bozt! Vlasszuk ki a paletta ablakban a fgg oleges dobozt, kattintsunk
a szerkeszt oablak kzepre megadva, hogy hov szeretnnk elhelyezni
a fgg oleges dobozt , majd a megjelen o ablakban lltsuk be, hogy kt
sorbl ll fgg oleges dobozt szeretnnk ltrehozni. Ha megadtuk hny
sorbl lljon a fgg oleges doboz, a szerkeszt oablakot a Glade kt rszre
osztva jelenti meg, jelezve ezzel, hogy most mr kt kperny oelem sz-
mra van benne hely.
2.7. bra. Rszekre osztott szer-
keszt oablak
Most osszuk kt egyms mellett tallhat
rszre a szerkeszt oablak als sort! Ehhez
vlasszuk ki a paletta vzszintes dobozt jelz o
ikonjt s kattintsunk a szerkeszt oablak
kzps o rsznek als sorba. Ha a megje-
len o ablakban megadjuk, hogy kt oszlopot
szeretnnk ltrehozni, a Glade az als sort
kt rszre osztva jelli, hogy most mr kt
kperny oelemnek van helye az ablak als
sorban.
Ilyen mdon a szerkeszt oablakot tetsz ole-
ges szm rszre oszthatjuk egymsbagya-
zott vzszintes s fgg oleges dobozok elhelyezsvel.
Helyezzk most vissza az el obbiekben eltvoltott nyomgombot az als
sor jobb oldalon tallhat rszbe! Ehhez jelljk ki a szerkeszt oablak
jobb als rszt egy kattintssal, majd vlasszuk ki a szerkeszts men
beilleszt menpontjt. Az el obb eltvoltott nyomgomb jra megjelenik,
de most a szerkeszt oablaknak csak egy rszt foglalja el.
Helyezznk el a visszamsolt nyomgomb mellett egy j nyomgombot!
Ehhez vlasszuk ki a nyomgomb ikont a paletta ablakbl s kattintsunk
a szerkeszt oablak bal als rszre. A megjelen o nyomgomb a kettes sz-
mot viseli, hogy meg tudjuk klnbztetni a kt egyforma kperny oele-
met. Ezt lthatjuk a 2.7. brn.
2.8. bra.
Most helyezznk el egy tetsz oleges kperny oelemet
a szerkeszt oablak fels o terletn tallhat rszre gy,
hogy kivlasztjuk a megfelel o ikont, majd a szerkeszt o-
ablak adott terletre kattintunk. Elhelyezhetnk pl-
dul egy cmkt, amely egy megvltoztathatatlan sz-
veget tartalmaz.
A projekthez tartoz llomnyokat jra ltre kell hoz-
nunk, ha elkszltnk a felhasznli fellet szerkesz-
tshez. Ehhez el oszr kattintsunk az eszkzsv men-
ts s elkszts ikonjaira vagy vlasszuk az ezeknek megfelel o menpon-
tokat a projekt menb ol. Ha ezt megtettk, a mdostott projekt elkszl,
gtk 2007/10/21 14:22 page 16 #16
16
azt a make parancs kiadsval lefordthatjuk s a mr bemutatott mdon
telepthetjk vagy helyben futtathatjuk.
A program j vltozatnak kperny okpe a 2.8. brn lthat. A prog-
ram ezen vltozata az el oz o vltozathoz hasonlan szintn nem hasznl-
hat semmire, mg kilpni sem lehet bel ole tisztessgesen, viszont alapul
szolglhat egy kvetkez o, fejlettebb vltozat elksztshez.
2.1.4. Tulajdonsgok s esemnyek
A kvetkez okben belltjuk nhny kperny oelem alapvet oen fontos tu-
lajdonsgait s esemnyeket rendelnk az egyes nyomgombokhoz.
A kperny oelemek tulajdonsgainak belltsra a tulajdonsgok ab-
lak hasznlhat, amely mindig az ppen kijellt kperny oelem tulajdon-
sgait mutatja. Az ablak a 2.9 brn lthat. Itt a szerkeszt okperny on
elhelyezett cmke legfontosabb tulajdonsgait olvashatjuk le.
2.9. bra. A cmke tulajdonsgai
Az ablak fels o rszn tallhat nv
mez oben a kperny oelem neve lt-
hat. Ez az elksztett C nyelv u prog-
ramban egy vltoz neve lesz, s erre
a nv megvltozatatsnl gyelnnk
kell. Nem adhatunk meg pldul ke-
zetes bet ut tartalmaz nevet (br a
Glade ezt a problmt gyesen meg-
oldja az kezetes bet uk kicserls-
vel), hiszen a C programozozsi nyelv-
ben ez nem megengedett.
Lejjebb tallhat az osztly mez o,
ahol a kperny oelem tpusra utal
kifejezst olvashatjuk
1
. Ezt a mez ot
nem lehet megvltoztatni.
A kvetkez o mez o a cmke nevet vi-
seli. Ez tartalmazza azt a szveget,
ami a kperny on megjelenik, ezt teht
szabadon megvltoztathatjuk s lta-
lban meg is kell vltoztatnunk. Mra
a GTK+ knyvtr tkletesen kezeli az
Unicode szabvnyt, ezrt a megfelel o
nyelvi belltsok esetn nyugodtan
hasznlhatunk kezetes karaktereket
is a kperny oelemek tulajdonsgai-
nak megadsakor, viszont az is igaz,
1
A GTK programknyvtr objektumorientlt programozsi mdszertant hasznl annak
ellenre, hogy ezt a C programozsi nyelv nem tmogatja, ezrt nevezzk osztlynak a
kperny oelem tpust.
gtk 2007/10/21 14:22 page 17 #17
17
hogy a j programokat angol nyelven
rjk s csak az elkszltk utn for-
dtjk le klnbz o nyelvekre az zeneteket.
A 2.9. brn lthat kperny okphez hasonl adatok jelennek meg ak-
kor is, ha a szerkeszt oablakban a nyomgombra kattintunk. A cmke
mez oben trva a szveget termszetesen a nyomgombon megjelen o sz-
veget mdosthatjuk.
Ha a kperny oelemek kinzett belltottuk, a kvetkez o lpsknt az
egyes kperny oelemekhez esemnyeket rendelhetnk. Vlasszuk ki vala-
melyik nyomgombot s a tulajdonsgok ablak fels o terletn vlasszuk
ki a jelzsek flet. Ekkor a 2.10. brn lthat kp trul a szemnk el.
2.10. bra. A jelzsek kezelse
Az brn lthat terleten a jelz-
sek kezelst llthatjuk be. A GTK+
knyvtr a grakus felhasznli fe-
llet trtnseit esemnyeknek (sig-
nal) nevezi. A felhasznli program
bellthatja, hogy az egyes esem-
nyek bekvetkeztekor mi trtnjen,
vagyis pontosabban bellthatja, hogy
a GTK+ programkknyvtr az egyes
esemnyek bekvetkeztekor az alkal-
mazs melyik fggvnyt hvja meg.
Ezeket, a GTK+ ltal az esemnyek
hatsra hvott fggvnyeket vissza-
hvott (callback) fggvnyeknek ne-
vezzk. A 2.10. brn lthat me-
z okben az zeneteket s a visszah-
vott fggvnyeket rendelhetjk egy-
mshoz.
Az ablak fels o rszn tallhat tb-
lzatban az egymshoz rendelt jelzsfggvny prok kzl vlogatha-
tunk, hogy mdostsuk oket. Ez a tblzat termszetesen res, ha mg
nem rendeltnk egyetlen jelzshez sem visszahvott fggvnyt.
Az ablak als rszben a jelzs mez oben vlaszthatjuk ki melyik jelzs-
hez kvnunk fggvnyt rendelni, a kezel o mez obe pedig a visszahvott
fggvny nevt rhatjuk be. Az objektum mez obe egy vltoz nevt r-
hatjuk be, amelyet a hvs sorn a visszahvott fggvny megkap. Ezt a
mez ot egyszer ubb programok esetben resen hagyhatjuk.
Ha a jelzs, kezel o s objektum mez oket kitltttk, az als rszen tall-
hat hozzads nyomgombbal az j jelzsfggvny prost elhelyezhet-
jk a tblzatban, amely a projekt adott kperny oeleme szmra rv-
nyes prosokat tartalmazza. Hasonl mdon, a kijells utn termsze-
tesen el is tvolthatjuk a tblzat egyes sorait a trls nyomgombbal.
Ksztsnk most visszahvott fggvnyeket a kt nyomgombhoz! Kat-
gtk 2007/10/21 14:22 page 18 #18
18
tintsunk a tulajdonsgok ablak jelzsek rszn tallhat jelzs mez o mel-
letti nyomgombra. Ekkor egy j ablak jelenik meg, amelyben kivlaszt-
hatjuk melyik jelzs szmra kvnunk visszahvott fggvnyt kszteni.
Vlasszuk ki a clicked jelzst. A nyomgombok esetben akkor kelet-
kezik ez a jelzs, amikor a felhasznl a nyomgombra kattint.
Amint kivlasztottuk a clicked jelzst, a Glade a kezel o mez obe berja
a javasolt fggvnynevet a visszahvott fggvny szmra. Ezt a nevet
termszetesen megvltoztathatjuk, de erre inkbb csak akkor van szk-
sg, ha egyazon visszahvott fggvnyt akarunk hasznlni tbb clra. Az
egyszer usg kedvrt most fogadjuk el a felajnlott nevet s a hozzads
nyomgomb segtsgvel rendeljk hozz a jelzshez a visszahvott fgg-
vnyt. Termszetesen szerencss, ha a visszahvott fggvny nevt meg-
jegyezzk, br ha logikusan neveztk el a kperny oelemeket s elfogad-
tuk a felajnlott fggvnynevet, elg knny u lesz felismerni a fggvnyt
a programkd mdostsa sorn.
Ezek utn mentsk el a projektllomnyt s jra hozzuk ltre az llo-
mnyokat.
2.1.5. A visszahvott fggvnyek szerkesztse
Az alapbelltsok esetben a Glade a projekt f oknyvtrban tallhat
src/ alknyvtrban helyezi el a callbacks.c, valamint a callbacks.h
llomnyokat, amelyekben megtallhatjuk a visszahvott fggvnyeket s
a deklarciikat.
A Glade segtsgvel ltrehozott visszahvott fggvnyeket ezekben az
llomnyokban meg kell keresnnk s a fgvnyek trzst meg kell r-
nunk, a Glade ugyanis csak az res fggvnyeket helyezi el ezekben az
llomnyokban.
Szerencsre a Glade elg fejlett, nem rja fell teljes egszben a
callbacks.c s a callbacks.h llomnyokat akkor sem, ha a forrst
jra ltrehozzuk a grakus felhasznli fellet mdostsa utn. Az j
fggvnyeket ilyenkor ltrehozza, de az ltalunk mdostott llomnyban
nem tesz krt.
1. plda. Vizsgljuk most meg a callbacks.h llomnyt! A kvetkez o
sorokat talljuk:
1 #include <gnome.h>
2
3
4 void
5 on_button3_clicked(GtkButton
*
button,
6 gpointer user_data);
gtk 2007/10/21 14:22 page 19 #19
19
Amint lthat az llomny csak egyetlen fggvny, az ltalunk a Glade
segtsgvel ltrehozott visszahvott fggvny tpust tartalmazza.
Nem minden visszahvott fggvny tpusa egyezik meg egymssal, van-
nak egyszer ubb s vannak bonyolultabb argumentumokkal rendelkez o
visszahvott fggvnyek. A Glade gondoskodik arrl, hogy az adott jelzs-
hez a megfelel o tpus fggvnyt hozza ltre.
2. plda. Vizsgljuk meg most a callbacks.c llomnyt, amely a k-
vetkez o sorokat tartalmazza:
1 #ifdef HAVE_CONFIG_H
2 # include <config.h>
3 #endif
4
5 #include <gnome.h>
6
7 #include "callbacks.h"
8 #include "interface.h"
9 #include "support.h"
10
11
12 void
13 on_button3_clicked(GtkButton
*
button,
14 gpointer user_data)
15 {
16
17 }
Amint lthat egyszer uen csak ki kell tltennk a mr el oksztett fgg-
vnyt a fggvnytrzs megrsval. A Glade gondoskodott a megfelel o fej-
llomnyok betltsr ol s elksztette a fggvnyt. Mdostsuk most az
llomnyt, a kvetkez okppen:
1 #ifdef HAVE_CONFIG_H
2 # include <config.h>
3 #endif
4
5 #include <stdio.h>
6 #include <gnome.h>
7
8 #include "callbacks.h"
9 #include "interface.h"
10 #include "support.h"
gtk 2007/10/21 14:22 page 20 #20
20
11
12
13 void
14 on_button3_clicked(GtkButton
*
button,
15 gpointer user_data)
16 {
17 printf("Igen\n");
18 exit(EXIT_SUCCESS);
19 }
Amint ltjuk gondoskodtunk a stdlib.h betltsr ol s elhelyeztk a
fggvnyben az exit() fggvny hvst.
A gtk_exit() fggvny nagyon hasonlt a C programknyvtr exit()
fggvnyre, azaz a programbl val kilpsre hasznlhat. A GTK prog-
ramknyvtr jabb vltozatainak dokumentcija szerint a gtk_exit()
fggvny elavult, helyette az eredeti, szabvnyos exit() knyvtri fgg-
vnyt javasolt hasznlni.
2.2. Programozs Windows krnyezetben
2.2.1. A MinGW krnyezet
A MinGW (Minimalist GNU for Windows, kismret u GNU Windows sz-
mra) fejleszt o s futtatkrnyezet a Cygwin krnyezetnl kisebb, a se-
gtsgvel fordtott alkalmazsok jobban illeszkednek a Windows kr-
nyezetbe. A MinGW krnyezet teleptse s karbantartsa azonban nem
olyan egyszer u, odagyelst s nmi hozzrtst ignyel. A kvetkez o ol-
dalakon a teleptshez s a hasznlathoz szksges legfontosabb isme-
reteket mutatjuk be.
A telepts els o lpseknt az MSYS alaprendszer teleptst kell elv-
geznnk. Ez a knyv megrsakor a MSYS-1.0.10.exe llomny [?] fut-
tatsval vgezhet o el. A telepts sorn a program alaprtelmezs szerint
a C:\msys\1.0 knyvtrba msolja a szksges llomnyokat s ltre-
hoz egy indtikont a kperny on.
Az MSYS rendszer ikonjval egy parancssoros felletet kapunk ezt
lthatjuk a 2.11. kp als, vilgos ablakaknt , amivel de tl sok prog-
ram nem rhet o el, hiszen a fejleszt ok clja egy kimondottan egyszer u
rendszer elksztse volt.
Ha a teleptett krnyezetben nem csak futtatni, hanem mdostani is
akarjuk a programjainkat, akkor kvetkez o lpsknt teleptsk az MSYS
szoftverfejleszt o csomagjt (msys software development kit), ami jelenleg
az msysDTK-1.0.1.exe llomny [?] llomny futtatsval vgezhet o el.
gtk 2007/10/21 14:22 page 21 #21
21
A telepts szintn a C:\msys\1.0 knyvtrban trtnik, gy az MSYS
parancssorban vlnak elrhet ov a fejlesztshez szksges programok
programok.
Az MSYS fejleszt okrnyezet legfontosabb elemei az autoconf, az
automake, a futtatsukhoz szksges Perl rendszer s az scp gyfl.
Ezek a programok szksgesek lehetnek, ha a fejleszts sorn pldul
j forrsllomnyt szeretnnk az alkalmazshoz adni, de az egyszer ubb
mdostsok elvgzshez nincs rjuk szksg. Az MSYS fejleszt okr-
nyezet viszont nem tartalmaz C fordtt, ezrt a kvetkez o lps ennek a
teleptse legyen.
Az MSYS alaprendszer teleptsekor ltrejn a C:\msys\1.0\mingw
knyvtr, ami a fordtprogramokat, a programknyvtrakat s a fejl-
lomnyokat fogja tartalmazni. Ezt a knyvtrat az MSYS parancssorbl
/mingw nven rhetjk el, ami nem meglep o, hiszen az MSYS rendszer
gykrknyvtra a C:\msys\1.0.
Miel ott azonban lernnkn hogyan msolhatjuk be a fordtprogramot
s a szksges programknyvtrakat, rdemes megemltennk, hogy
azoknak termszetes helye a Windows knyvtrszerkezetben a \mingw
knyvtr tetsz oleges, ltalunk meghatrozott meghajt gykrknyvt-
rban. Ha azt akarjuk pldul, hogy a fortprogram s a knyvtrak a
C:\mingw knyvtrban legyenek s ez a knyvtr az MSYS rendszerben
a /mingw/ knyvtrban jelenjen meg, akkor az MSYS parancssorban a
vim szvegszerkeszt oben el kell ksztennk a megfelel o /etc/fstab l-
lomnyt. Ehhez az MSYS a /etc/fstab.sample pldllomnnyal jrul
hozz, ami magtl rtet od ov teszi a munkt. Az egyszer usg rdekben
megtehetjk azonban, hogy a fordtprogramokat s a programknyvt-
rakat egyszer uen a C:\msys\1.0\mingw knyvtrban csomagoljuk ki,
ehhez ugyanis nem kell az /etc/fstab llomnyt mdostanunk.
A programfordtshoz szksges llomnyok teleptshez egyszer uen
ki kell csomagolnunk nhny llomnyt a /mingw/ knyvtrba az MSYS
tar s gzip programjaival. Fontos azonban, hogy ezeket az llomnyokat
a /mingw/ knyvtrba csomagoljuk ki, ne pedig az MSYS gykrknyv-
trban, mert gy nem m ukdnek a programok.
Csomagoljuk ki az MSYS futtatkrnyezetet, ami jelenleg
az mingw-runtime-3.9.tar.gz llomnyban [?] tallhat.
A C nyelv u programok fordtshoz szksgnk lesz az as-
semblerre s a szerkeszt oprogramra is, amelyek jelenleg a
binutils-2.16.91-20060119-1.tar.gz llomnyban [?] tallhatk.
Hasonlkppen kell kicsomagolnunk a C fordtt, amit a knyv rsa-
kor a gcc-core-3.4.5-20060117-1.tar.gz llomny [?] tartalmaz.
Hasonl mdon kell kicsomagolnunk a Windows programoz fellet
(application programming interface) elemeit elrhet ov tev o program-
knyvtrakat s fejllomnyokat, amelyet jelenleg a w32api-3.6.tar.gz
llomnyban van.
gtk 2007/10/21 14:22 page 22 #22
22
2.11. bra. Egyszer u program futtatsa MinGW krnyezetben
gtk 2007/10/21 14:22 page 23 #23
23
Ha idig eljutottunk, akkor megpihenhetnk egy kicsit, hiszen ett ol a
pillanattl fogva kpesek vagyunk a szabvnyos C programknyvtr ele-
meit tartalmaz C programokat termszetes Windows EXE llomnyokk
fordtani s azokat szveges ablakban le is futtathatjuk. Ha a Vim hon-
lapjrl [?] letltjk a szvegszerkeszt o Windows vltozatt, akkor k-
nyelmesen, kln ablakban szerkeszthetjk is a forrsprogramokat. Ezt
lthatjuk a 2.11. brn. A kp bal als rszn lthatjuk az MSYS pa-
rancssor s a gvim szvegszerkeszt o indtsra hasznlhat ikonokat, a
kperny o jobb fels o rszn pedig a szvegszerkeszt oben szerkesztett C
programot. A kp als rszn a vilgos szn u MSYS parancsort s a lefu-
rtott program futtatsakor megjelen o szveges ablakot, ami stt sznnel
jelenik meg.
Ha szksgnk van r, ezek utn hasonlan egyszer u mdon tele-
pthetjk fel a C++ fordtt (gcc-g++-3.4.5-20060117-1.tar.gz), az
Ada fordtt (gcc-ada-3.4.5-20060117-1.tar.gz), a FORTRAN77
fortt (gcc-g77-3.4.5-20060117-1.tar.gz), a Java fordtt
(gcc-java-3.4.5-20060117-1.tar.gz) s az Objective C fordtt
(gcc-objc-3.4.5-20060117-1.tar.gz), amelyek a C fordtval meg-
egyez o helyr ol [?] tlthet ok le.
A telepts kvetkez o lpseiben azokat a programknyvtrakat kell fel-
msolnunk, amelyek lehet ov teszik a grakus fellettel elltott prog-
ramok lefordtst s futtatst. Mivel sokfle programknyvtrra lesz
szksgnk, ez a munka egy kiss id otrabl, lehangol lehet, kln-
sen azrt, mert a szksges programknyvtrak listja a GTK s Gnome
fejlesztse sorn vltozhat. Knnyen hasznlhat receptet nem tudunk
teht adni arra, hogy milyen llomnyokat tltsnk le s teleptsnk,
nhny tanccsal azonban segthetjk a munkt.
Szerencss, ha a telepts el ott a Glade segtsgvel Linux alatt elk-
sztk s kiprblunk egy GTK projektet. Ha ezzel a klnleges prog-
ramknyvtrat nem hasznl alkalmazson prbljuk ki a fordtst,
knnyebb dolgunk lesz, mintha egy bonyolult alkalmazssal prblkoz-
nnk.
Kezdjk a GTK programknyvtr s a hasznlathoz szksges prog-
ramknyvtrak teleptsvel. Szerencss, ha a programknyvtrak .zip
llomnyvgz odssel ksztett tmrtett vltozatait tltjk le, ezeket
ugyanis kevesebb munkval s gyorsabban tudjuk kitmrteni, mintha
az .exe vltozatok futtatsval vgeznnk el a teleptst. Az llomnyo-
kat abba a knyvtrba csomagoljuk ki, amelyik az MSYS rendszeren a
/mingw/ nven elrhet o s ahov a C fordtprogramot is elhelyeztk.
Ne feledjk el, hogy a programok fordtshoz a programknyvtrak
fejlesztst tmogat vltozatait is ki kell csomagolnunk. Ezeknek az llo-
mnyoknak a nevben a dev rvidts utal arra, hogy a futtatshoz nem
szksgesek, a fejleszts sorn azonban elengedhetetlen a hasznlatuk.
Mindenkppen szksgnk lesz a G programknyvtrra (ami je-
gtk 2007/10/21 14:22 page 24 #24
24
lenleg a glib-2.12.1.zip s a glib-dev-2.12.1.zip llomnyok-
ban [?] tallhat), a G programknyvtrnak pedig szksge van
az intl programknyvtrra (jelenleg a gettext-0.14.5.zip s a
gettext-dev-0.14.5.zip llomnyokban [?] tallhat).
2.3. Az objektumorientlt programozs
A ks obbiekben (a 73. oldalon tallhat 4.1. szakaszban) rszletesen be-
mutatjuk milyen fontosabb tpusokat vezet be a G programknyvtr s
a knyv tovbbi rszeiben azt is bemutatjuk milyen f obb tpusai vannak
a GTK+ programknyvtrnak. Nhny fontos alapfogalmat s jellemz o
technikt azonban mr a legegyszer ubb programok elksztse el ott is
rdemes megismernnk. Ezekr ol a fontos alapfogalmakrl olvashatunk
a kvetkez o nhny oldalon.
2.3.1. rkl ods s tbbalaksg
A GTK+ programknyvtr objektumorientlt mdszertan alapjn kszlt,
azt is mondhatnnk, hogy a GTK+ objektumorientlt program.
Bizonyra sokan felkapjk a fejket erre a kijelentsre, hiszen tud-
jk, hogy a GTK+ C programozsi nyelven rdott s sokan hallottk
mr, hogy a C programozsi nyelv nem objektumorientlt. Ez a kije-
lents azonban csak egy kis helyesbtssel igaz; azt mondhatjuk, hogy a
C programozsi nyelv nem tmogatja az objektumorientlt programozsi
mdszertant, objektumorientlt szemlletet. Attl azonban, hogy a nyelv
nem tmogatja mg lehet objektumorientlt programot rni C nyelven s
pontosan ezt teszik a GTK+ alkoti.
Az objektumorientlt programozsi szemllet lnyeges eleme, hogy a
programoz ltal ltrehozott s hasznlt objektumok osztlyokba cso-
portosthatk s az osztlyok kzti rokonsgi kapcsolatok (az rkl ods)
segtsgvel a program szerkezete egyszer usthet o. Ennek megfelel oen
a GTK+ programknyvtr ltal kezelt sszes adattpus kztk a kp-
erny oelemeket ler adattpusok , jl tgondolt rkl odsi rendszerbe
vannak szervezve. A GTK+ ltal hasznlt osztlyok rkl odsi rendszere
a ??. oldalon tallhat.
Az objektumorientlt programozsi mdszertan egyik nagy el onye a
tbbalaksg (polimorzmus) lehet osge. A tbbalaksg azt jelenti,
hogy a m uveletek nem csak egy adott adatszerkezet esetben adnak he-
lyes eredmnyt, tbbfle adatszerkezet kezelsre is hasznlhatk. lta-
lnos szablyknt elmondhat, hogy az objektumorientlt programozs
esetben egy adott osztlyhoz tartoz adattpuson (objektumon) minden
m uvelet elvgezhet o, amely az osztly szl oosztlyain elvgezhet o. Ennek
a tbbalaksgnak a pontos megrtst segti a kvetkez o plda.
gtk 2007/10/21 14:22 page 25 #25
25
3. plda. A ??. oldalon kezd od o rkl odsi rendszer szerint a GtkButton
osztly a GtkWidget osztly kzvetett leszrmazottja. Ez a tbbalaksg
szablyai szerint azt jelenti, hogy minden m uvelet, amely elvgezhet o a
GtkWidget tpussal, elvgezhet o a GtkButton tpussal is.
Ha teht egy fggvny GtkWidget tpus adatszerkezetet fogad, kpes
GtkButton adatszerkezetet is fogadni, gy nincs szksg kt kln fgg-
vnyre.
Azok a programozsi nyelvek amelyek tmogatjk az objektumorientlt
programozst nyilvn kezelik a tbbalaksg krdst. Nem gy van ez
azonban a C programozsi nyelvben, amely nem tmogatja az objektum-
orientlt programozsi szemlletet. A GTK+ alkotinak megoldst kellett
tallniuk e problmra.
2.3.2. A tpusknyszerts
Az objektumorientlt programozsi mdszertant tmogat nyelvekben a
tbbalaksg termszetes rsze a nyelvnek, a C programozsi nem ll
ilyen eszkz a rendelkezsnkre. A G programknyvtr alkoti a tpus-
knyszerts eszkzvel tettk elrhet ov a tbbalaksgot a C progra-
mozsi nyelvet hasznl programozk szmra.
A G programknyvtr minden osztlyt a C nyelv struktra tpus-
konstrukcis eszkzvel kezel, a tbbalaksgot pedig tpusknyszer-
tst (cast, tpus) vgz o makrkkal biztostja s a GTK+ programknyvtr
is hasonl eszkzket hasznl. A GTK+ programknyvrban pldul min-
den kperny oelem tpushoz s minden osztlyhoz azonos nev u makrk
llnak a rendelkezsnkre a tpusknyszertshez. A GtkWidget tpus-
hoz pldul a GTK_WIDGET() makr szolgl a tpusknyszerts s gy a
tbbalaksg megvalstsra. Lthat, hogy a tpusbl gy kapjuk meg
a tpusknyszert o makr nevt, hogy a tpus nevt csupa nagybet uvel
rjuk, a szhatrokat pedig alhzs karakterrel jelljk.
4. plda. A 181. oldalon tallhat 29. plda 34. sorban a GtkButton
*
tpus button nev u vltozra az ltalnosabb GtkWidget
*
tpus-
knt van szksgnk, ezrt hasznljuk a tpusknyszertsre szolgl
GTK_WIDGET() makrt.
A tpusknyszertst vgz o makrk azonban nem csak egyszer uen meg-
vltoztatjk a mutatk tpust, de az rkl odsi rendszernek az osz-
tlyok gyermek-szl o viszonyainak gyelembe vtelvel ellen orzst is
vgeznek. A tpusknyszerts teht a futsi id oben vgzett tpusellen or-
zssel egytt fejlett mdon biztostja a tbbalaksgot a programjaink
szmra.
gtk 2007/10/21 14:22 page 26 #26
26
2.3.3. Az objektumtulajdonsgok
A G programknyvtr az objektumok szmra egy tulajdonsg-rendszert
biztost, ami az objektumorientlt programozs sorn hasznlt rkl o-
dsi rendszert is gyelembe veszi. A programoz az egyes objektumokhoz
nvvel, tpussal s rtkkel rendelkez o tulajdonsgokat (properties) ren-
delhet, a programknyvtr pedig egyszer uen hasznlt eszkzket biztost
a tulajdonsgok karbantartsra.
A tulajdonsgok kezelse sorn programknyvtr fggvnyei gye-
lembe veszik az rkl odsi rendszert. Ha egy objektum adott nev u tu-
lajdonsgt le akarjuk krdezni, vagy meg akarjuk vltoztatni, akkor a
programknyvtr akkor is kpes megtallni az adott tulajdonsgot, ha
azt valamelyik szl oosztly vezette be s az objektum csak rklte azt.
2.12. bra. Forgats
Mindazonltal az objektumtulajdonsgok keze-
lse kevsb fontos, mint ahogyan azt els o pil-
lantsra gondolnnk s ennek tbb oka is van.
A legtbb alkalmazs elksztshez a tulajdons-
gok alaprtelmezett rtke teljesen megfelel o, fe-
lesleges azokat vltoztatni, radsul a fontos tu-
lajdonsgok lekrdezsre s megvltoztatsra a
GTK+ programknyvtr kln fggvnyt biztost,
ami feleslegess teszi a tulajdonsgok kzvetlen el-
rst. Radsul a Glade program knyelmes s kln tanuls nlkl
hasznlhat eszkzket biztost a fontosabb tulajdonsgok kezelsre,
gy leginkbb csak akkor van szksgnk a tulajdonsgok kzvetlen el-
rsre, ha a kevsb fontos tulajdonsgokat a program futsa sorn
meg akarjuk vltoztatni. Ha pldul a cmke szvegt nem vzszintesen
akarjuk megjelenteni(2.12. bra), hasznlhatjuk a Glade programot a
belltsra, a forgats szgnek tulajdonsgt csak akkor kell kzvet-
lenl elrnnk, ha azt akarjuk, hogy a cmke a program futsa sorn
forogjon.
ppen azrt azt javasoljuk az olvasnak, hogy ha gyors sikereket akar
lrni, akkor egyszer uen ugorja t a knyv ezen szakaszt s csak akkor
trjen ide vissza, ha megbizonyosodott arrl, ppen ezekre az eszkzkre
van szksge.
A G programknyvtr az objektumok tulajdonsgainak belltsra s
lekrdezsre a kvetkez o kt fggvnyt biztostja.
void g_object_get(gpointer objektum, const gchar
*
nv1,
mutat1, ..., NULL); A fggvny segtsgvel az objektumok
tulajdonsgait krdezhetjk le a nevk alapjn.
A fggvny els o paramtere mutat, az objektumot jelli a memri-
ban.
A fggvny tovbbi paramterei tulajdonsgneveket jell o muta-
gtk 2007/10/21 14:22 page 27 #27
27
tk, amelyek utn a megfelel o tpus rtk hordozsra hasznl-
hat memriaterleteket jell o mutatk. Ez utbbi mutatk jellik
ki azokat a memriaterleteket, ahov a fggvny a tulajdonsgok
aktulis rtkt elhelyezi.
A nevekb ol s mutatkbl ll prok sort utols paramterknt
egy NULL rtkkel kell lezrnunk.
void g_object_set(gpointer objektum, const gchar
*
nv1,
rtk1, ..., NULL); A fggvny segtsgvel az objektumok
tulajdonsgait mdosthatjuk.
A fggvny els o paramtere mutat, amely a belltani kvnt ob-
jektumot jelli a memriban.
A fggvny tovbbi paramtere nv/rtk prokat adnak, ahol a nv
a megvltoztatand tulajdonsg nevt jelli a memriban, az rtk
pedig az adott tulajdonsgnak megfelel o tpus rtk.
A nevekb ol s rtkekb ol ll prokat utols paramterknt NULL
rtkkel kell lezrnunk.
A G programknyvtr ltal tmogatott tulajdonsgok lekrdezst s
belltst mutatja be a kvetkez o kt plda.
5. plda. A program futsa sorn szeretnnk lekrdezni, hogy a bevi-
teli mez oben a szvegkurzor hnyadik karakternl ll. A kvetkez o sorok
bemutatjk hogyan tehetjk ezt meg.
1 void
2 on_entry001_move_cursor(GtkEntry
*
entry,
3 GtkMovementStep step,
4 gint count,
5 gboolean extend_selection,
6 gpointer user_data)
7 {
8 gint position;
9
10 g_object_get(entry,
11 "cursor-position", &position, NULL);
12 g_message("%s(): %d", __func__, position);
13 }
A programrszlet egy visszahvott fggvnyt mutat be, amit a GTK+ prog-
ramknyvtr akkor hv, amikor a beviteli mez oben a szvegkurzort el-
mozdtjuk, a kurzormozgat billenty uk valamelyikvel. A kurzor helyt
termszetesen mskor is lekrdezhetjk.
gtk 2007/10/21 14:22 page 28 #28
28
A fggvny a 1011. sorban hvja a g_object_get() fggvnyt, hogy a
szvegkurzor pozcijt ami egy egsz rtk lekrdezze. A program ez
utn a 12. sorban kirja a kapott rtket a szabvnyos kimenetre.
6. plda. Szeretnnk a program futsakor korltozni egy beviteli mez o-
ben a berhat, megjelenthet o karakterek szmt. A kvetkez o nhny
sor bemutatja hogyan tehetjk ezt meg.
1 void
2 on_entry002_realize(GtkWidget
*
widget,
3 gpointer user_data)
4 {
5 g_object_set(widget, "max-length", 3, NULL);
6 }
A programrszlet egy visszahvott fggvnyt mutat be, amit a GTK+ prog-
ramknyvtr akkor hv, amikor a beviteli mez o elkszlt, de mg nem je-
lent meg a kperny on. Ez a tny nem befolysolja a fggvny m ukdst,
annak csak egy ltez o beviteli mez ore van szksge ahhoz, hogy az adott
tulajdonsgok belltsa.
A fggvny az 5. sorban hvj a g_object_set() fggvnyt, hogy a ka-
rakterek szmt korltoz egsz tpus tulajdonsgot belltsa. A beviteli
mez ok ezen tulajdonsgt egybknt a Glade segtsgvel is bellthat-
juk, ha a program futsa sorn lland rtken akarjuk tartani.
2.3.4. Az ltalnos tpus vltoz
A G programknyvtr a GValue tpust biztostja klnfle tpus rtkek
ltalnos hordozjaknt.
7. plda. A kvetkez o sorok bemutatjk hogyan hasznlhatjuk a GValue
tpust egy objektum tulajdonsgainak lekrdezsre. (A program az 5.
plda alacsony szint u eszkzkkel ksztett vltozata.)
1 void
2 on_entry001_move_cursor(GtkEntry
*
entry,
3 GtkMovementStep step,
4 gint count,
5 gboolean extend_selection,
6 gpointer user_data)
7 {
8 GValue int_val = {0,};
9 gint position;
10
gtk 2007/10/21 14:22 page 29 #29
29
11 g_value_init(&int_val, G_TYPE_INT);
12 g_object_get_property(G_OBJECT(entry),
13 "cursor-position", &int_val);
14 position = g_value_get_int(&int_val);
15
16 g_message("%s(): %d", __func__, position);
17 }
8. plda. A kvetkez o pldaprogram bemutatja hogyan llthatjuk be a
GValue tpus segtsgvel egy objektum tulajdonsgt. (A program a 6.
plda alacsonyszint u eszkzkkel ksztett vltozata.)
1 void
2 on_entry002_realize(GtkWidget
*
widget,
3 gpointer user_data)
4 {
5 GValue int_val = {0,};
6
7 g_value_init(&int_val, G_TYPE_INT);
8 g_value_set_int(&int_val, 3);
9 g_object_set_property(G_OBJECT(widget),
10 "max-length", &int_val);
11 }
A plda 5. sorban egy GValue tpus vltozt hozunk ltre, ami az ob-
jektumtulajdonsg rtkt hordozni fogja. Mivel a dokumentci szerint
gint tpus, a 7. sorban belltjuk a GValue tpust G_TYPE_INT t-
pusra, majd a 8. sorban a g_value_set_int() fggvny segtsgvel
belltjuk az rtket is.
Az objektum tulajdonsgnak belltsa a 9-10. sorban lthat, ahol
a g_object_set_property() fggvnnyel belltjuk az adott nev u tu-
lajdonsg rtkt. Figyeljk meg, hogy a tbbalaksgnak ksznhe-
t oen a beviteli mez ot a fggvny a G programknyvtr objektumaknt
(G_OBJECT()) kapja meg, mgis kpes kiderteni, hogy tulajdonkppen
beviteli mez or ol van sz, amelynek van ilyen nven bejegyzett tulajdon-
sga.
2.4. Kapcsolat a kperny oelemek kzt
Amikor a visszahvott fggvnyeket szerkesztjk szksgnk van az l-
talunk ksztett felhasznli felletek egyb elemeire is. Ha pldul a
felhasznl rkattint az ltalunk ksztett ablak egy nyomgombjra, a
visszahvott fggvnyben szksgnk van az adott ablak szvegbeviteli
gtk 2007/10/21 14:22 page 30 #30
30
mez ojnek aktulis rtkre, gy meg kell tallnunk magt a szvegbevi-
teli mez ot.
Erre a clra a Glade egy segdfggvnyt hoz ltre, amely alaprtelme-
zs szerint a projekt alapknyvtrnak src/ alknyvtrban tallhat a
support.c llomnyban. A fggvny deklarcija ugyanebben a knyv-
trban, a support.h llomnyban van. (A Glade mindkt llomnyt au-
tomatikusan fellrja, gy mdostanunk ezeket nem szabad.)
GtkWidget
*
lookup_widget(GtkWidget
*
ind, const gchar
*
nv);
A fggvny a kperny oelemek kzt keres nv szerint, lehet ov teszi,
hogy az ablakon belli kperny oelemeket megtalljuk.
visszatrsi rtk A fggvny visszatrsi rtke a keresett
kperny oelemet jell o mutat, ha a keress sikeres volt, NULL,
ha nem.
ind A keress kiindulpontja. A keresett elemnek a kiindulponttal
azonos ablakban kell lennie, klnben a fggvny nem tallja
meg.
nv A keresett kperny oelem neve, amelyet a Glade tulajdonsgok
szerkesztsre alkalmas ablakban adtunk meg.
A fggvny hasznlathoz a support.h llomnyt be kell tltennk.
9. plda. Ksztsnk most egy ablakot, amelyben egy nyomgomb s kt
beviteli mez o tallhat. A beviteli mez oknek adjuk az entry1 s entry2
nevet! Ksztsnk visszahvott fggvnyt a nyomgombhoz, amelyben ki-
rjuk a beviteli mez okben ppen olvashat szveget a szabvnyos kime-
netre!
Mivel a nyomgomb lenyomshoz tartoz visszahvott fggvny pa-
ramterknt megkapja a nyomgombot a memriban kijell o mutatt,
a nyomgombbal kzs ablakban tallhat kperny oelemek knnyedn
megkereshet ok a lookup_widget() fggvny segtsgvel. Ezt mutatja
be a kvetkez o nhny sor.
1 #ifdef HAVE_CONFIG_H
2 # include <config.h>
3 #endif
4
5 #include <stdio.h>
6 #include <gnome.h>
7
8 #include "callbacks.h"
9 #include "interface.h"
gtk 2007/10/21 14:22 page 31 #31
31
10 #include "support.h"
11
12 void
13 on_button1_clicked(GtkButton
*
button,
14 gpointer user_data)
15 {
16 GtkWidget
*
entry1 = lookup_widget(GTK_WIDGET(button),
17 "entry1");
18 GtkWidget
*
entry2 = lookup_widget(GTK_WIDGET(button),
19 "entry2");
20 gchar
*
text1 = gtk_entry_get_text(GTK_ENTRY(entry1));
21 gchar
*
text2 = gtk_entry_get_text(GTK_ENTRY(entry2));
22
23 g_message("text1 = %s\n", text1);
24 g_message("text2 = %s\n", text2);
25 }
A plda egy teljes llomnyt mutat be, amelyet a Glade program s a
programoz kzsen hoztak ltre. Az llomny els o sorait a Glade k-
sztette, ppen gy, mint a fggvny prototpust. A programoznak a
fggvny trzst kellett elksztenie a 1624. sorok megrsval.
A fggvny 1617., valamint a 1819. sorokban lekrdezi kt kper-
ny oelem memriabeli cmt a lookup_widget() fggvny hvsval. A
fggvny hvshoz a programoznak a rendelkezsre llt a kt kper-
ny oelem neve (entry1 s entry2), valamint az ugyanezen ablakban meg-
tallhat nyomgomb tpus kperny oelem cme a button vltozban.
Azt is mondhatnnk, hogy a programoz azokat az entry1 s entry2
nev u kperny oelemeket kereste meg, amelyek ppen abban az ablakban
voltak, mint amelyikben az adott nyomgomb megjelent.
A pldaprogram ezek utn lekrdezi a kt kperny oelem aktulis sz-
vegt a 2021. sorokban, majd kirja a kapott karakterlncokat a szab-
vnyos kimenetre a 2324. sorokban.
gtk 2007/10/21 14:22 page 32 #32
32
gtk 2007/10/21 14:22 page 33 #33
3. fejezet
Egyszer u felhasznli
felletek ksztse
A kvetkez o oldalakon az egyszer ubb kperny oelemekr ol, a bel olk k-
szthet o egyszer u felhasznli felletekr ol olvashatunk, miel ott azonban
ezeket ismertetnnk szt kell ejtennk a GTK+ programknyvtr nhny
sajtossgrl.
3.1. bra. Klnfle t-
mk
El oszr is tudnunk kell, hogy a GTK+ se-
gtsgvel ksztett alkalmazsok grakus fel-
hasznli felletnek kinzete a felhasznl
ltal menet kzben mdosthat, a Glade se-
gtsgvel ksztett programjaink tmzha-
tk. Ha a felhasznl elindtja a GNOME t-
makezel ojt a munkaasztal menjvel vagy
a gnome-theme-manager parancs kiadsval,
az alkalmazsok kinzett akr futtats kz-
ben is meg tudja vltoztatni. A GNOME tma-
kezel ot a 3.2. brn lthatjuk, a 3.1. brn
pedig nhny pldt lthatunk a hasznlhat
tmk kzl.
Az ppen hasznlt tma belltsainak s
a hasznlt nyelvnek megfelel oen a progra-
munk grakus fellete nagymrtkben meg-
vltozhat, az egyes kperny oelemek magass-
gt, szlessgt teht nem ismerhetjk el ore.
Fontos, hogy gy szerkesszk meg a programunk grakus fellett, hogy
kzben a vltoz krlmnyeket is gyelembe vegyk. Fontos, hogy meg-
rtsk, a Glade s a GTK+ nha taln bonyolultnak t un o viselkedsnek
az az oka, hogy a fejleszt oik folyamatosan gyelembe vettk a vltoz k-
33
gtk 2007/10/21 14:22 page 34 #34
34
3.2. bra. A GNOME tmakezel oje
rlmnyeket, amelyek kzt az ltalunk ksztett alkalmazsoknak m u-
kdnik kell.
3.3. bra. A kperny o-
elem fja
Tudnunk kell azt is, hogy a kperny oelemek sokf-
lekppen egymsba gyazhatk, gy nem mindig egy-
rtelm u szmunkra, hogy a kpen lthat grakus
felhasznli felletek milyen elemekb ol llnak. Mr
a kevsb sszetett felhasznli felletek ksztsekor
is segtsgnkre lehet kperny oelemek kzti viszonyo-
kat grakusan brzol ablak, amelyek a nzet men
widget fa mutatsa menpontjval rhetnk el. Ez az
ablak nagymrtkben megknnyti az egyes kperny o-
elemek kivlasztst. A 3.1. brn lthat ablak szerke-
zett lthatjuk pldakppen a 3.3. brn, ahol jl meg-
gyelhetjk, hogy a nyomgombokon bell egy-egy kp
s egy-egy cmke tallhat.
Szem el ott kell tartanunk azt is, hogy a GTK+ prog-
ramknyvtr objektumorientlt programozsi mdszer-
tan alapjn kszlt, ami tbbek kzt azt eredmnyezi,
hogy az egyes kperny oelemek sok kzs tulajdonsg-
gal rendelkeznek.
3.1. Egyszer u kperny oelemek
A kvetkez o oldalakon olyan kperny oelemekkel foglalkozunk, amelyek
kezelse egyszer u s amelyek a legegyszer ubb alkalmazsokban is elen-
gedhetetlenek.
gtk 2007/10/21 14:22 page 35 #35
35
Azokat a kperny oelemeket, amelyek kimondottan ms kperny oele-
mek hordozsra kszltek, a kvetkez o szakaszban trgyaljuk. Szintn
nem itt emltjk az sszetett, bonyolult kezels u kperny oelemeket s
azokat sem, amelyekre csak ritkn van szksgnk.
3.1.1. A cmke
A cmke minden bizonnyal a legegyszer ubb kperny oelem, hiszen csak
egy egyszer u szveget tartalmaz, amely a legtbb alkalmazs esetn egy-
ltaln nem vltozik a program futsa sorn. A GTK+ programknyvtr-
ban a cmkk kezelsre hasznlatos tpus a GtkLabel.
A cmkre pldt a 3.5. brn lthatunk a 36. oldalon.
3.4. bra. A cmke tulajdon-
sgai
A 3.9. brn lthatjuk a Glade cmkk bell-
tsra hasznlhat ablakt. Itt legfell a nv s
osztly tulajdonsgok belltsra szolgl beviteli
mez oket lthatjuk. Ezek a mez ok minden kper-
ny oelemnl hasonl jelentssel brnak, nem csak
a cmkk tulajdonsgainak belltsakor jelennek
meg.
A nv annak a vltoznak a nevt adja meg,
amelybe a Glade a kperny oelem ltrehozsakor
a kperny oelem memriabeli cmt elhelyezi az
interface.c llomny megfelel o fggvnyben.
Igaz ugyan, hogy ezt az llomnyt nem fogjuk kz-
vetlenl mdostani, de nyilvnval, hogy a C nyelv
vltoznevekre vonatkoz korltozsait be kell tar-
tanunk, azaz nem hasznlhatunk pldul keze-
tes karaktereket vagy szkzt az itt megadott nv-
ben. A nv mez o tartalma azrt is fontos lehet, mert
a Glade ltal ksztett lookup_widget() fggvny
e mez o alapjn keres, ha teht a ks obbiekben a
programunk el akarja rni ezt a kperny oelemet, akkor ezt a nevet tud-
nunk kell. Szerencss teht, ha olyan egyedi, knnyen megjegyezhet o
nevet vlasztunk, ami a C programozsi nyelv vltozneveknt is meg-
llja a helyt.
A nv alatt tallhat osztly a kperny oelem tpust hatrozza meg,
nem mdosthat, tjkoztat jelleg u.
A kvetkez o fontos beviteli mez o a cmke, ahov a cmkben megjelen-
tend o szveget rhatjuk be. A kperny oelemek tulajdonsgainak kezelse
sorn ez a mez o is tbbszr felbukkan, hiszen nem csak a cmkben
jelenthet o meg lland szveg, hanem pldul a nyomgombokban, je-
ll ongyzetekben, rdigombokban is. E mez obe termszetesen tetsz ole-
ges Unicode kdols, akr egszen hossz, szkzkkel s rsjelekkel
tagolt szveget is rhatunk.
gtk 2007/10/21 14:22 page 36 #36
36
A cmkvel kapcsolatban ltalban felmerl a krds, hogy milyen nyel-
ven ksztsk el a felhasznli felletet, magyarul vagy angolul ksztsk
el a grakus felhasznli fellet elemeit. A tbbnyelv u programok ksz-
tsnek sszetett problmakrt a 348. oldalon tallhat 9.4. szakaszban
rszletesen trgyaljuk.
Ezek alatt az alhzs (use underline) mez oben bellthatjuk, hogy a
cmkben kvnjuk-e hasznlni az alhzst karakterek jellsre. Ha
igen, a cmke szvegben egy alhzs karaktert kell elhelyeznnk az
el ott a karakter el ott, amelyet al kvnunk hzni. Az alhzst egyb-
knt ltalban a gyorsbillenty uk jellsre hasznljuk.
A stlus (use markup) mez o meghatrozza, hogy kvnjuk-e hasznlni a
bet uk formzsra a Pango programknyvtr ltal biztostott XML-szer u
nyelvet, amelynek segtsgvel a bet uk megjelenst szabadon vltoztat-
hatjuk a cmknt bell. Ha hasznljuk a stlust, a cmke szvegben r-
hatunk olyan kifejezseket, amelyek a bet uk mrett, stlust, sznt m-
dostjk (mint pldul <span foreground="red">szveg</span>, vagy
<span size="larger">szveg</span> esetleg a d olt bet uk jellsre
hasznlhat <i></i> pros). A hasznlhat kifejezsekr ol b ovebben a
Pango programknyvtr dokumentcijban olvashatunk, amelyet elr-
hetnk pldul a devhelp program segtsgvel (2.1. bra).
3.5. bra. Cmkk,
beviteli mez ok s nyo-
mgombok
Az igazts mez oben bellthatjuk, hogy a cmke szvege
a rendelkezsre ll terlet mely rszn, milyen rendezs-
sel jelenjen meg. A kiadvnyszerkeszt o programok eset-
ben megszokott rendezsek kzl vlaszthatunk. A sort-
rs mez oben kivlaszthatjuk, hogy a cmkben ha nem
ll rendelkezsre elegend o hely a szveg szmra auto-
matikusan j sorban kezd odjn-e a szveg. A kijellhet o
mez oben bellthatjuk, hogy a cmkre kattintva megje-
lenthet o legyen-e a kurzor. Ha igen, a felhasznl kpes
lesz a cmke tartalmt a vglapra msolni, de vltoztatni
termszetesen ekkor sem tudja.
A cmkket a programunknak ltalban nem kell kl-
nsebb eszkzkkel kezelnie, azaz lteznek ugyan a cmkk megjelens-
nek megvltoztatsra fggvnyek, de ezekre ltalban nincsen szks-
gnk. Egyedl taln a cmke szvege az, amelyet nhny alkalmazsban
a futs kzben meg kell vltoztatnunk. A cmkk szvegnek megvltoz-
tatsra szolgl fggvny a kvetkez o:
void gtk_label_set_text(GtkLabel
*
cmke, const gchar
*
szveg);
A fggvny segtsgvel megvltoztathatjuk a cmke szvegt. A
fggvny els o paramtere a cmkt, msodik paramtere pedig az
j cmkeszveget jelli a memriban.
gtk 2007/10/21 14:22 page 37 #37
37
3.1.2. A kp
A grakus felleten megjelen o kpek a cmkkhez hasonlan passzv
kperny oelemek, amelyek a szmtgp vezrlsre nem hasznlhatk,
egyszer uen csak a felhasznli felleten val eligazodst segtik. A mo-
dern alkalmazsok felhasznli felletein a kpek sok helyen el ofordul-
nak. Tallkozunk velk a dialgusablakokban, a nyomgombokon, az
eszkzsvok nyomgombjain, a menkben s gy tovbb.
Habr a kpek egyszer u kperny oelemnek t unnek, kezelsk sokszor
nem is olyan egyszer u. A GTK+ programknyvtr tbbfle vektor- s pi-
xel grakus llomnyformtumot tmogat, kezeli a felhasznl ltal be-
llthat tmkat, kpes egyszer ubb s sszetettebb rajzolsi m uvelete-
ket vgezni a memriba tlttt kpeken. Mindezek a kpessgei hat-
kony eszkzz teszik a programknyvtrat a hozzrt o programoz kez-
ben, ugyanakkor azonban kiss elbonyoltjk a kpek kezelst. Az egy-
szer usg kedvrt a kvetkez o nhny bekezdsben a kpek kezelsre
szolgl egyszer ubb eszkzket mutatjuk csak be, az sszetett eszkzk
hasznlatra pedig a ks obbiekben visszatrnk.
3.6. bra. A kp belltsa
A GTK+ programknyvtr a kpek
megjelentsre a GtkImage tpust
hasznlja, ami a GtkWidget osztly
leszrmazottjaknt kperny oelemnek
min osl. A GtkImage kezelse kzben
a programknyvtr kezeli a tmkat,
ami azt eredmnyezi, hogy ha a k-
pet tmhoz kttt er oforrsbl hoz-
zuk ltre, akkor a tma megvltozta-
tsakor a fut alkalmazsokban a k-
pek megvltoznak az j tma ltal el o-
rt kpre, ami nyilvn jelent osen m-
dostja az alkalmazs megjelenst.
A GTK+ programknyvtr ugyanak-
kor fejlett mdon kezeli a kpek mre-
tt is, az adott tmnak megfelel o m-
don tbbfle jellemz o kpmretet lt-
rehozva. A vektor grakus kpform-
tumok klnsen alkalmasak arra,
hogy ugyanazt a kpet klnfle mretben jelentsk meg a nyomgom-
bokban, a menkben s gy tovbb, ha azonban a kp nem vektor gra-
kus formtumban ll a rendelkezsnkre, a programknyvtr akkor is
kpes a tbb mret kezelsre. ltalban egyszer uen kln-kln llo-
mnyban troljuk a klnfle alapmretre el oksztett kpeket s mindig
a megfelel o llomnybl lltjuk el o a kperny on megjelen o vltozatot.
Amikor a Glade segtsgvel egy j kpet helyeznk el az ablakban, a
gtk 2007/10/21 14:22 page 38 #38
38
tulajdonsgok belltsra szolgl ablakban klnsebb nehzsg nl-
kl bellthatjuk a kp megjelenst (3.6. bra). A kp belltst vgz o
listk alatt hasonlan egyszer uen llthatjuk be a kp mrett, mgpedig
nhny el ore ltrehozott mretkategribl vlasztva.
Nem ilyen egyszer u a munknk azonban, ha a Glade ltal felajnlott
ikonok kzt egyet sem tallunk, amely megfelelne az ignyinknek. Ilyen-
kor a legegyszer ubb, ha a kp megjelenst a program futsakor, a meg-
felel o fggvnyek hvsval lltjuk be. A kp belltsra hasznlhat
legegyszer ubb fggvnyek a kvetkez ok.
3.1.3. A nyomgomb
A nyomgomb viszonylag egyszer u kperny oelem, aminek kevs bellt-
hat tulajdonsga van s viszonylag kevs fajta esemnyt kpes kivl-
tani. Azonban az is igaz, hogy a nyomgombokat sok helyen, sok kln-
fle megjelenssel s jelentssel hasznljuk, ami indokoltt teszi, hogy
egy kicsit rszletesebben foglalkozzunk ezzel a kperny oelemmel.
A GTK+ programknyvtrban az egyszer u nyomgombok kezelsre
hasznlt tpus a GtkButton, amelyre a 3.5. brn lthatunk pldt a 36.
oldalon, a Glade nyomgombok tulajdonsgainak belltsra hasznl-
hat ablakt pedig a 3.7. brn talljuk.
3.7. bra. A nyomgomb tu-
lajdonsgai
A tulajdonsgok ablak fels o rszn a szoksos
elemeket lthatjuk, amelyek a nv s az osztly be-
lltsra hasznlhatk. Ezeket a tulajdonsgokat
minden kperny oelem esetben hasonlan kezel-
jk, mr ejtettnk rluk szt.
A kvetkez o mez o a keret szlessge mez o,
ahol egy egsz szmot llthatunk be. rde-
kes mdon a nyomgomb, azaz a GtkButton t-
pus ms kperny oelemek hordozsra alkalmas,
a GtkContainer osztly leszrmazottja. Minden
GtkContainer tulajdonsgai kzt bellthatjuk a
keret szlessgt, ami megadja, hogy az adott kp-
erny oelem krl azaz a kperny oelemen kvl
hny kppontnyi res helyet hagyjunk. Ennek
a tulajdonsgnak a nyomgombok esetben nem
sok jelent osge van, mert ha a nyomgombokat el
akarjuk tvoltani a krnyezetkt ol, akkor ltal-
ban inkbb az oket magukba foglal kperny oele-
mek tulajdonsgait kell mdostanunk.
A sablon gomb mez oben el ore ltrehozott nyomgombok kzl vlogat-
hatunk. Ha itt a rendelkezsnkre ll sablonokbl kivlasztunk egyet, a
nyomgombon bell egy cmke s egy ikon kerl egyms mell. A nyom-
gomb szvege a sablonnak megfelel oen, az alkalmazs szmra belltott
gtk 2007/10/21 14:22 page 39 #39
39
nyelven jelenik meg fggetlenl attl, hogy msutt mit lltunk be. Nem
csak a nyomgomb szvege vltozik automatikusan a nyelvnek megfe-
lel oen, hanem az ikon is a megfelel o tma szerint jelenik meg, ahogyan
a 3.1. brn is lthatjuk.
Ha a sablon gomb cmke mellett nem lltunk be semmit, a cmke me-
z onl llthatjuk be a nyomgombban megjelen o szveget. Az a karak-
ter, amely el alhzs karaktert runk, a kperny on alhzva jelenik
meg. gy jelezhetjk, hogy az adott nyomgomb melyik gyorsbillenty uvel
rhet o el. Ha a sablon gomb mez onl nem lltunk be semmit, az ikon
mez onl vlaszthatunk ki kpet a nyomgomb szmra. Ha itt nem v-
lasztunk ikont, a nyomgombban csak a cmke szvege jelenik meg. Ha
a cmke szvegt s az ikont is belltjuk, akkor a nyomgombban a sz-
veg s az ikon egyms mellett jelenik mint, mint ahogyan azt a sablon
gomboknl mr meggyelhettk.
3.8. bra. Nyomgombok ikonnal
A nyomgombbok esetben klns fontos-
sga van az alaprtelmezett kperny oelem-
nek. Az alaprtelmezett nyomgombot a fel-
hasznl gy is aktivlhatja a billenty uzettel,
hogy el oz oleg nem vlasztja ki. Ha az ablak
egy nyomgombjnl belltjuk az alaprtel-
mezett lehet s alaprtelmezett tulajdonsgo-
kat a Glade tulajdonsgszerkeszt o ablakban,
akkor a nyomgombot aktivlhatjuk az Enter
gomb lenyomsval akkor is, ha nem az adott
nyomgomb a kivlasztott kperny oelem. (Iga-
zbl azoknl a kperny oelemeknl, amelyek
aktivljk az alaprtelmezett nyomgombot, be kell lltanunk a alapr-
telmezettet aktivlja tulajdonsgot.)
Mint mr emltettk, a nyomgombok ms kperny oelemek hordoz-
sra alkalmas eszkzk, ezrt teljesen szabadon bellthatjuk mit szeret-
nnk megjelenteni a nyomgombokon bell s azt is, hogy a nyomgomb
bels o rsznek elemei egymshoz kpest hogyan helyezkedjenek el. A 3.8
pldul olyan nyomgombokat tartalmaz, amelyek kizrlag egy ikont
tartalmaznak. Ha be szeretnnk lltani a nyomgomb tartalmt, a szer-
keszt oablakban a jobb egrgombbal kell kattintanunk a nyomgombra s
a nyomgombtartalom eltvoltsa (remove button contents) menpontot
kell vlasztanunk. Ezek utn el tudjuk helyezni a nyomgombon bell a
kvnt kperny oelemet vagy a tbb kperny oelem elhelyezsre hasznl-
hat dobozt.
Ha azonban azrt szeretnnk belltani a nyomgombon bell meg-
jelen o elemeket, hogy az alkalmazs ablaknak fels o rszn megjelen o
eszkzsv nyomgombjaiban az ikonok alatt a nyomgomb jelentsnek
szveges lersa is megjelenjen, akkor felesleges ezt a bonyolult m uvelet-
sort elvgeznnk. Az eszkzsv megjelense, az, hogy az eszkzsv nyo-
gtk 2007/10/21 14:22 page 40 #40
40
mgombjaiban a kpek s a cmkk hogyan jelenjenek meg, a felhasznl
ltal belltott krnyezett ol fgg. (Az eszkzsvban elhelyezett nyom-
gombokra a 201. oldalon, az alkalmazs-ablak bemutatsakor visszat-
rnk.)
A tulajdonsgok ablak jelzsek lapjn a szoksos mdon llthatjuk be
a nyomgomb jelzseihez tartoz visszahvott fggvnyek nevt, amelye-
ket a Glade a callbacks.c llomnyban el is helyez. A nyomgombok
ltal kldtt legfontosabb jelzsek a kvetkez ok:
clicked A nyomgomb akkor kldi ki ezt a jelzst, ha a felhasznl a
egrrel vagy a billenty uzet segtsgvel aktivlja a nyomgombot.
A legtbb esetben csak ezt az egy jelzst hasznljuk fel az alkalma-
zsokban.
enter A jelzs akkor keletkezik, amikor az egrmutat a nyomgomb
fl r.
leave A jelzs akkor keletkezik, amikor az egrmutat a nyomgomb
terlett elhagyja.
pressed A jelzs akkor keletkezik, amikor a nyomgomb lenyomdik.
released A jelzs akkor keletkezik, amikor a nyomgomb felemelkedik.
Ez a jelzs nem alkalmas a clicked jelzs helyettestsre, mert
akkor is jelentkezik, ha a felemelkeds nem jelez rvnyes nyom-
gomblenyomst (mert pldul a felhasznl az egr gombjt nem a
nyomgomb felett engedte fel).
Az egyszer u nyomgombok kezelsre meglehet osen kevs fggvnyt
hasznlunk. Ehelytt csak egyetlen fggvnyre trnk ki, ami a nyom-
gombban megjelen o szveg megvltoztatsra szolgl.
void gtk_button_set_label(GtkButton
*
gomb, const gchar
*
szveg); A fggvny segtsgvel a nyomgombban megjelen o
cmkt vltoztathatjuk meg. A fggvny els o paramtere a nyo-
mgombot jelli a memriban, a msodik paramtere pedig a
nyomgomb j szvegt tartalmaz karakterlncot.
10. plda. A kvetkez o sorok kt visszahvott fggvnyt mutatnak be,
amelyek kzl az els ot akkor hv a GTK+, amikor az egrmutat a nyo-
mgomb fl r, a msodikat pedig akkor, amikor amikor elhagyja a te-
rletet.
1 void
2 on_button_window_funy_enter(GtkButton
*
button,
3 gpointer user_data)
gtk 2007/10/21 14:22 page 41 #41
41
4 {
5 gtk_button_set_label(button, "OK");
6 }
7
8 void
9 on_button_window_funy_leave(GtkButton
*
button,
10 gpointer user_data)
11 {
12 gtk_button_set_label(button, "Mgsem");
13 }
A program roppant mulatsgos, ellenllhatatlanul humoros hatst
azonban csak akkor fejti ki, ha nagyobb alkalmazsba ptjk s gyel-
mesen tanulmnyozzuk a felhasznl arckifejezst a hasznlata kz-
ben.
3.1.4. A kapcsolgomb
A kapcsolgombok olyan nyomgombok, amelyek meg orzik a benyo-
mott vagy ppen kiengedett llapotukat, amg a felhasznl jra
le nem nyomja oket. A kapcsolgombok kezelsre a GTK+ program-
knyvtr a GtkToggleButton tpust biztostja a programoz szmra. A
GtkToggleButton a GtkButton leszrmazottja, gy a tbbalaksgnak
ksznhet oen a kapcsolgombokkal a nyomgombok minden m uvelete
elvgezhet o, radsul a kapcsolgomb a nyomgomb minden tulajdon-
sgval rendelkezik.
A Glade tulajdonsgok belltsra szolgl ablakban a kapcsolgom-
bok esetben egy lnyeges tulajdonsg jelenik meg a kapcsolgombokhoz
kpest, mgpedig az alaprtelmezs szerint benyomva, ami rtelemsze-
r uen azt hatrozza meg, hogy a nyomgomb indulskor lenyomott l-
lapotban legyen-e. Kevsb fontos, j tulajdonsgknt a kapcsolgom-
bot inkonzisztens llapotban kapcsolhatjuk. Az inkonzisztens llapot-
ban kapcsolt nyomgomb gy jelenik meg a kperny on, ami a felhasz-
nl szmra rzkelteti, hogy a nyomgomb bekapcsolva s kikapcsolva
sincs.
A kapcsolgomb hasznlatt megknnyti a kvetkez o jelzs:
toggled Ez a jelzs akkor keletkezik, amikor a felhasznl a kapcso-
lgomb llapott megvltoztatja, azaz a kapcsolgombok ki- vagy
bekapcsolja.
A kapcsolgomb kezelsben a legfontosabb fggvnyek a kvetkez ok.
void gtk_toggle_button_set_active(GtkToggleButton
*
kapcsolgomb, gboolean bekapcsolva); A fggvny segtsg-
gtk 2007/10/21 14:22 page 42 #42
42
vel a kapcsolgomb llapott bellthatjuk, azaz a kapcsolgombot
be- s kikapcsolhatjuk.
A fggvny els o paramtere a kapcsolgombot jelli a memriban,
a msodik paramtere pedig meghatrozza, hogy a fggvny a kap-
csolgombot be- vagy kikapcsolja. Ha a fggvnynek msodik para-
mterknt TRUE rtket adunk, bekapcsolja a kapcsolgombot, ha
FALSE rtket, akkor pedig kikapcsolja azt.
gboolean gtk_toggle_button_get_active(GtkToggleButton
*
kapcsolgomb); A fggvny segtsgvel lekrdezhetjk a kap-
csolgomb llapott.
A fggvny paramtere a kapcsolgombot jelli a memriban, a
visszatrsi rtke pedig megadja, hogy a kapcsolgomb be van-e
kapcsolva. A visszatrsi rtk TRUE, ha a kapcsolgomb be van
kapcsolva, FALSE, ha nincs.
void gtk_toggle_button_set_inconsistent(GtkToggleButton
*
kapcsolgomb, gboolean bellts); A fggvny segtsgvel
a kapcsolgombot inkonzisztens llapotba llthatjuk. Az inkon-
zisztens llapot kapcsolgomb ugyangy m ukdik, azaz be- s
kikapcsolhat, mintha nem volna inkonzisztens llapotban, de
a felhasznl szmra a GTK+ programknyvtr egyrtelm uen
jelzi, hogy a kapcsolgomb sem bekapcsolt, sem pedig kikapcsolt
llapotban nincs. Az inkonzisztens llapotot az alkalmazs tudja
kikapcsolni s ezt ltalban a kapcsolgomb tkapcsolsakor teszi.
A fggvny els o paramtere a kapcsolgombot jelli a memriban,
a msodik paramtere pedig meghatrozza, hogy a kapcsolgombot
inkonzisztens llapotba akarjuk-e kapcsolni vagy ppen meg akar-
juk szntetni az inkonzisztens llapotot.
gboolean gtk_toggle_button_get_inconsistent(GtkToggleButton
*
kapcsolgomb); A fggvnnyel lekrdezhetjk, hogy a kapcsol-
gomb inkonzisztens llapotban van-e.
A fggvny paramtere a kapcsolgombot jelli a memriban, a
visszatrsi rtke pedig megadja, hogy a kapcsolgomb inkonzisz-
tens llapotban van-e.
11. plda. A kvetkez o fggvny bemutatja hogyan tudjuk kezelni a
kapcsolgomb inkonzisztens llapott.
1 void
2 on_button_window_togglebutton3_toggled(
3 GtkToggleButton
*
togglebutton,
4 gpointer user_data)
gtk 2007/10/21 14:22 page 43 #43
43
5 {
6 gtk_toggle_button_set_inconsistent(togglebutton,
7 FALSE);
8 if (gtk_toggle_button_get_active(togglebutton))
9 g_message("Be van kapcsolva.");
10 else
11 g_message("Ki van kapcsolva.");
12 }
A bemutatott fggvnyt a GTK+ programknyvtr akkor hvja, ha a kap-
csolgombot a felhasznl tkapcsolja. A 67. sorban kikapcsoljuk a
kapcsolgomb inkonzisztens llapott, a 8. sorban pedig lekrdezzk,
hogy a kapcsolgomb be van-e kapcsolva.
3.1.5. A beviteli mez o
A beviteli mez o rvid szvegrszletek begpelsre alkalmas viszonylag
egyszer u kperny oelem. A GTK+ programknyvtrban a beviteli mez ok
kezelsre hasznlt tpus a GtkEntry.
3.9. bra. A beviteli mez o tu-
lajdonsgai
A beviteli mez ore pldt a 3.5. brn lthatunk
a 36 oldalon.
A 3.9. brn lthatjuk a Glade beviteli mez ok be-
lltsra hasznlhat ablakt, ahol a szoksos tu-
lajdonsgokon (nv, osztly) kvl a legfontosabb
tulajdonsgok a kvetkez ok.
A szerkeszthet o mez oben bellthatjuk, hogy a
felhasznl a szvegmez oben tallhat szveget a
billenty uzet segtsgvel mdosthatja-e.
A szveg lthat mez oben bellthatjuk, hogy a
szveg, ami a beviteli mez oben tallhat elolvas-
hat legyen-e a kperny on. Ha pldul a beviteli
mez o jelsz begpelsre szolgl, szerencssebb,
ha a szveg lthat tulajdonsgok nem-re llt-
juk. Ilyen esetben a takarjel (invisible char) mez o-
ben megadott karakter jelenik meg a bet uk helyn
a kperny on.
A max hossz mez oben azt adhatjuk meg, hogy
legfeljebb hny karakternyi szveget tartalmazhas-
son a beviteli mez o. Ennl hosszabb szveget a felhasznl nem tud be-
gpelni a beviteli mez obe, mert a GTK+ erre nem ad lehet osget. Ha itt a
0 ll, a bert szveg tetsz olegesen hossz lehet.
A szveg mez oben megadhatjuk, hogy mi legyen a szerkeszt omez o kez-
deti tartalma. Amikor a szerkeszt omez o megjelenik a kperny on ezt a
szveget mr tartalmazni fogja.
gtk 2007/10/21 14:22 page 44 #44
44
Az alaprtelmezettet aktivlja (activates default) mez oben bellthatjuk,
hogy ez a szerkeszt omez o az alaprtelmezett kperny oelemet aktivlja-e,
ha lenyomjuk az Enter billenty ut a szveg begpelsekor. Ha ezt a me-
z ot igen-re lltjuk, s a felhasznl begpelte a beviteli mez o tartalmt,
megnyomhatja az Enter billenty ut s gy aktivlhatja az ablak alaprtel-
mezett kperny oelemt (pldul az OK felirattal elltott nyomgombot.)
A beviteli ez ok ltal kldtt legfontosabb zenetek a kvetkez ok:
activate A beviteli mez o akkor kldi ezt az zenetet, ha a felhasznl
lenyomta benne az Enter billenty ut. A mez o ezt az zenetet attl
fggetlenl elkldi, hogy egybknt aktivlja-e az ablak alaprtel-
mezett kperny oelemt.
backspace A beviteli mez o akkor kldi ezt az zenetet, ha a felhasznl
lenyomja a beviteli mez on a backspace billenty ut.
move-cursor A beviteli mez o akkor kldi ezt a jelzst, ha a felhasznl
a beviteli mez oben a kurzor helyt megvltoztatja valamelyik billen-
ty uvel.
toggle-overwrite Ez az zenet akkor keletkezik, ha a felhasznl va-
lamelyik irnyban tkapcsol a beszrsfellrs zemmdok kzt.
A beviteli mez ok kezelse kzben a kvetkez o nhny fggvny kln-
sen hasznos lehet.
gchar
*
gtk_entry_get_text(GtkEntry
*
mezo);
A fggvny segtsgvel a beviteli mez ob ol kiolvashatjuk a szveget,
amelyet ppen tartalmaz. Termszetesen ez a legfontosabb, beviteli
mez ot kezel o fggvny.
visszatrsi rtk A visszatrsi rtk egy mutat, amely azt
a memriaterletet jelli amelyben a beviteli mez oben ppen
tallhat szveg karakterlncknt megtallhat.
Ezt a memriaterletet semmilyen mdon nem szabad mdos-
tanunk vagy felszabadtanunk.
mezo A kiolvasand beviteli mez o cme.
void gtk_entry_set_text(GtkEntry
*
mezo, const gchar
*
szveg);
A fggvny segtsgvel megvltoztathatjuk a beviteli mez oben ta-
llhat szveget.
mezo A mdostand beviteli mez o cme.
szveg A mez oben elhelyezend o j szveg cme.
gtk 2007/10/21 14:22 page 45 #45
45
void gtk_editable_select_region(GtkEditable
*
mezo, gint
kezdet, gint vg);
A fggvny a beviteli mez oben tallhat karakterek kijellsre szol-
gl.
mezo A beviteli mez ot jelli a memriban. Mivel a fggvny a
GtkEditable ltalnos tpust hasznlja, tpusknyszertsre
van szksg a GTK_ENTRY() makr segtsgvel.
kezdet Az els o karakter szma, amelyet ki szeretnnk jellni. A
karakterek szmozsa 0-tl indul.
vg Ez els o karakter szma, amelyet mr nem akarunk kijellni.
3.1.6. A forgatgomb
A forgatgomb szmjelleg u rtkek bevitelre szolgl, a beviteli mez ohz
nagyon hasonl kperny oelem, amelyet a 3.10. brn lthatunk. Ahogy
meggyelhetjk, a forgatgomb egyltaln nem gy nz ki, mint ahogyan
a forgatgombok ltalban kinznek, sokkal inkbb egy beviteli mez ore
hasonltanak, ami kt nyomgombbal van kiegsztve. A GTK+ program-
knyvtr a forgatgombok kezelsre a GtkSpinButton tpust biztostja
a rendelkezsnkre.
3.10. bra. A for-
gatgomb
A forgatgombok tulajdonsgainak belltsa kzben a
Glade tulajdonsgok ablakban bellthatjuk a forgatgomb-
ban bellthat s berhat szm legkisebb s legnagyobb r-
tkt, a lpskzt, amivel a nyomgombok nvelik s csk-
kentik az rtket, a lapkzt, amivel a PgUp s PgDwn billen-
ty uk nvelik s cskkentik az rtket s mg nhny egyszer u
tulajdonsgot.
A GtkSpinButton hasznlatt segti a changed zenet kl-
dse, amelyet a forgatgomb a beviteli mez ot ol rklt, s ame-
lyet akkor kld, amikor a forgatgomb rtke megvltozik.
Tudnunk kell azonban, hogy a forgatgomb nem csak akkor
kldi ezt az zenetet, ha az rtk valban megvltozott s nem is mindig
azonnal rkezik az zenet.
A GtkSpinButton tpus a GtkEntry tpus kzvetlen leszrmazottja, gy
a beviteli mez oknl hasznlt fggvnyek a forgatgombok kezelsre is
hasznlhatk, de a GTK+ programknyvtr a forgatgombok kezelsre
kln fggvnyeket is biztost. A forgatgombok kezelse kzben hasz-
nosak lehetnek a kvetkez o fggvnyek:
void gtk_spin_button_set_value(GtkSpinButton
*
forgatgomb, gdouble rtk); A fggvny segtsgvel bellt-
hatjuk a forgatgombban megjelen o szm rtkt.
gtk 2007/10/21 14:22 page 46 #46
46
A fggvny els o paramtere a forgatgombot jelli a memriban,
msodik paramtere pedig a forgatgomb j rtkt adja meg. Az,
hogy az j rtk hny tizedes pontossggal jelenik meg a forgat-
gombban, a forgatgomb belltstl fgg, amelyet a Glade segt-
sgvel is megvltoztathatunk.
gdouble gtk_spin_button_get_value(GtkSpinButton
*
forgatgomb); A fggvny segtsgvel lekrdezhetjk a for-
gatgomb ltal kpviselt rtket.
A fggvny paramtere a forgatgombot jelli a memriban, a
visszatrsi rtke pedig megadja a forgatgomb rtkt.
gint gtk_spin_button_get_value_as_int(GtkSpinButton
*
rtk); A fggvny segtsgvel a forgatgomb rtkt egsz
szmknt krdezhetjk le.
A fggvny paramtere a forgatgombot jelli a memriban, a
visszatrsi rtke pedig megadja a forgatgomb rtkt.
3.1.7. A kombinlt doboz
A kombinlt doboz hasonlt a beviteli mez ohz, ugyanakkor lehet ov teszi
a felhasznlnak, hogy a felajnlott szveges rtkek kzl menszer uen
vlasszon. Innen szrmazik a kombinlt doboz (combobox) kifejezs is, az
sszetett jellegre utal.
A GTK+ programknyvtrban a kombinlt doboz meglehet osen zava-
rosan jelenik meg s ezen sajnos a Glade program hasznlata sem segt
jelent osen. Mindazonltal maga a kperny oelem a felhasznl szempont-
jbl igen egyszer u, ezrt az egyszer u kperny oelemek kzt trgyaljuk a
beviteli mez ovel egybeptett menszer u eszkzket, az olvasnak pedig
azt javasoljuk, hogy ha nehzsgeket okoz e szakasz megrtse, egysze-
r uen lapozzon el ore s folytassa az ismerkedst a tbbi kperny oelem-
mel.
A GTK+ programknyvtr rgebbi vltozataiban (2.4 vltozat el ott) a
GtkCombo tpust biztostotta a programoz szmra a kombinlt doboz
ltrehozsra. Mra azonban ez a tpus elavultt vlt a dokumentci
nem javasolja j programban val hasznlatra s mivel a programo-
zi fellete jelent osen eltr a modernebb eszkzk fellett ol, a hasz-
nlatt nem trgyaljuk. Annyit rdemes azonban megjegyeznnk, hogy
a GtkCombo tpust nem szabad sszekevernnk a kvetkez o oldalakon
bemutatott tpusokkal, mert slyos programhibk lehetnek a tpuskeve-
reds kvetkezmnyei.
Hasonlkppen elavult eszkz a GtkOptionMenu tpus ltal ltrehozott
egyszer u kperny oelem, ami megjelensben nagyon hasonlt a kombi-
nlt dobozra, s amelyet szintn nem trgyalunk rszletesen.
gtk 2007/10/21 14:22 page 47 #47
47
A GTK+ programknyvtr jabb vltozatai (2.4 s jabb) a
GtkComboBox tpust javasoljk a kombinlt doboz jelleg u kper-
ny oelem megvalstsra. A GtkComboBox tpus leszrmazottja a
GtkComboBoxEntry tpus, ami nem csak a menszer u vlasztst teszi
lehet ov, hanem megengedi a felhasznlnak, hogy a vlaszts helyett
egyszer uen berja a mez obe a szveget.
A helyzetet jelent osen bonyoltja, hogy mind a GtkComboBox, mind pe-
dig a GtkComboBoxEntry tpust ktflekppen hozhatjuk ltre. Ha egy-
szer u programot szeretnnk rni, lehetsges, hogy szerencssebb a kom-
binlt doboz kizrlag szveget kezel o vltozatval dolgoznunk. Ekkor
vltozatlanul a GtkComboBox, illetve GtkComboBoxEntry tpusrl beszl-
hetnk, a kperny oelemek kezelse azonban sokkal egyszer ubb lesz. Saj-
nos azonban az egyszer usgnek ra is van. Ha az egyszer ustett mdszer-
rel hozzuk ltre a kombinlt dobozt, ks obb csak nhny primitv fgg-
vnnyel vezrelhetjk a kperny oelemet, el ofordulhat, hogy a program
fejleszts ks obbi szakaszban kell rbrednnk, hogy a kperny oelem-
mel vgzett munknkat el or ol kell kezdennk.
A Glade a GtkComboBox s GtkComboBoxEntry kperny oelemeket min-
dig az egyszer ustett csak szveges mdszerrel hozza ltre, ezrt e
szakaszban ezeknek a kezelst mutatjuk be el oszr.
A GtkComboBox tpus kezelse kzben a kvetkez o zenetek fontosak
lehetnek:
realize Minden GtkWidget elkldi ezt az zenetet, amikor ltrehozzuk,
a GtkComboBox esetben azonban ennek az zenetnek klnsen
fontos szerepe lehet, hiszen knnyen el ofordulhat, hogy a kombinlt
doboz listjt a ltrehozsa utn fel akarjuk tlteni elemekkel.
changed A GtkComboBox ezt az zenetet kldi, ha a felhasznl meg-
vltoztatja a kivlasztott elemet a listban. Ha a vltozst azonnal
kezelni akarjuk s nem akarunk pldul az ablak bezrsig vrni
ehhez az zenethez kell csatlakoznunk.
A Glade segtsgvel ltrehozott szerkeszthet o kombinlt doboz
(GtkComboBoxEntry) s csak vlasztsra hasznlhat kombinlt doboz
(GtkComboBox) kperny oelemek szerkesztsre az albbi fggvnyeket
hasznlhatjuk:
void gtk_combo_box_append_text(GtkComboBox
*
doboz, const
gchar
*
szveg); A fggvny segtsgvel a kombinlt dobozhoz
tartoz lista vghez adhatunk hozz j szvegsort.
A fggvny els o paramtere a kombinlt dobozt, msodik param-
tere a listhoz hozzadand szveget jelli a memriban.
void gtk_combo_box_insert_text(GtkComboBox
*
doboz, gint
hely, const gchar
*
szveg); E fggvny segtsgvel a kombi-
gtk 2007/10/21 14:22 page 48 #48
48
nlt dobozhoz tartoz lista tetsz oleges pontjra szrhatunk be j
szveges rtket.
A fggvny els o paramtere a kombinlt dobozt, harmadik param-
tere pedig a beszrand szveget jelli a memriban. A fggvny
msodik paramtere megadja, hogy a lista hnyadik helyre kvn-
juk a szveget beszrni. A lista elemeinek szmozsa 0-tl kezd odik.
void gtk_combo_box_prepend_text(GtkComboBox
*
doboz, const
gchar
*
szveg); Ennek a fggvnynek a segtsgvel j szveg-
sort helyezhetnk el a kombinlt dobozhoz tartoz lista legels o
helyre, az els o elem el.
A fggvny els o paramtere a kombinlt dobozt, msodik param-
tere pedig a beszrand szveget jelli a memriban.
void gtk_combo_box_remove_text(GtkComboBox
*
doboz, gint
hely); A fggvny segtsgvel a kombinlt dobozhoz tartoz
listbl tvolthatjuk el a megadott sorszm szvegsort.
A fggvny els o paramtere a kombinlt dobozt jelli a memri-
ban, msodik paramtere pedig megadja, hogy hnyadik szvegsort
akarjuk eltvoltani a listbl. A sorok szmozsa 0-tl kezd odik.
gchar
*
gtk_combo_box_get_active_text(GtkComboBox
*
doboz);
A fggvny segtsgvel lekrdezhetjk a kombinlt dobozban
lthat szveget. A GtkComboBox esetben ez a szveg a kombinlt
dobozhoz tartoz lista valamelyik eleme vagy ha sem a program,
sem a felhasznl nem vlasztott elemet a NULL rtkkel jelzett
res szveg, a GtkComboBoxEntry esetn azonban tetsz oleges, a
felhasznl ltal begpelt szveg lehet.
A fggvny paramtere a kombinlt dobozt jelli a memriban,
visszatrsi rtke pedig egy dinamikusan foglalt memriaterletre
mutat ahol a szveget tallhatjuk vagy NULL, ha nincs megjele-
ntett szveg.
void gtk_combo_box_set_active(GtkComboBox
*
doboz, gint
hely); A fggvny segtsgvel meghatrozhatjuk, hogy a kombi-
nlt dobozban a hozz tartoz lista hnyadik eleme jelenjen meg
aktv elemknt. A kombinlt doboz ltrehozsakor a realize
zenet visszahvott fggvnyben mindig rdemes ennek a
fggvnynek a hvsval kivlasztani valamelyik elemet, ellenkez o
esetben a kombinlt doboz resen jelenik meg s gy a felhasznl-
nak mindenkppen ki kell vlasztania valamelyik elemet.
A fggvny els o paramtere a kombinlt dobozt jelli a memriban,
msodik paramtere pedig megadja, hogy a lista hnyadik elemt
akarjuk aktvknt kijellni. Az elemek szmozsa 0-tl indul.
gtk 2007/10/21 14:22 page 49 #49
49
gint gtk_combo_box_get_active(GtkComboBox
*
doboz); A fgg-
vny segtsgvel lekrdezhetjk, hogy a kombinlt dobozban a
felhasznl a hozz tartoz lista hnyadik elemt vlasztotta ki.
Ennek a fggvnynek a hvsa csak a GtkComboBox tpus
nem szerkeszthet o kombinlt doboz esetben rtelmes, hiszen a
GtkComboBoxEntry tpus szerkeszthet o kombinlt doboz tar-
talmt a felhasznl trhatja.
A fggvny paramtere a kombinlt dobozt jelli a memriban, a
visszatrsi rtke pedig megadja, hogy a hozz tartoz lista hnya-
dik elemt vlasztotta ki a felhasznl. Az elemek szmozsa 0-tl
indul.
A kvetkez o plda bemutatja hogyan tlthetjk fel a kombinlt dobozt
elemekkel.
12. plda. A kvetkez o fggvny egy listban trolt adatszerkezetb ol ol-
vas ki szveges rtkeket s elhelyezi azokat egy kombinlt dobozba, a
hozz tartoz lista szveges rtkeiknt. Az ilyen jelleg u fggvnyeket l-
talban akkor hvjuk, amikor a kombinlt doboz elkszlt, de mg nem
jelent meg a kperny on, azaz a hvst a realize kezelsre ksztett
visszahvott fggvnyben kell elhelyezni.
1 gint
2 fill_comboboxentry_with_dictionary_titles(
3 GtkComboBoxEntry
*
entry)
4 {
5 GList
*
li;
6 dictionary
*
dic;
7 gint n = 0;
8
9 li = dictionaries;
10 while (li != NULL) {
11 dic = li->data;
12 if (dic->title != NULL) {
13 gtk_combo_box_append_text(entry, dic->title);
14 ++n;
15 }
16 li = li->next;
17 }
18
19 return n;
20 }
A fggvny a 9. sorban a dictionaries nev u globlis vltozval jelzett
gtk 2007/10/21 14:22 page 50 #50
50
lista els o elemt ol indulva a 1017. sorban tallhat ciklus elemein halad
vgig.
A lista elemei a listaelemek data mez oi dictionary tpus adatte-
rleteket jellnek a memriban. A dictionary adatszerkezet tartalmaz
egy karakteres mutat tpus, title nev u mez ot, amelynek rtkt a 13.
sorban rendre elhelyezzk a kombinlt dobozhoz tartoz listban.
3.1.8. A jell ongyzet
A jell ongyzet egyszer u kt esetleg hromllapot, nll kperny oelem,
amely egy egyszer u eldntend o krds megfogalmazsra hasznlhat.
A GTK+ programnyvtrban a jell ongyzet kezelsre szolgl tpus a
GtkCheckButton.
A jell ongyzetre pldt a 3.11. brn lthatunk.
3.11. bra. A jell o-
ngyzet
A Glade jell ongyzetek tulajdonsgainak belltsra
szolgl ablakt a 3.12 brn lthatjuk, ahol a szoksos
(nv, osztly, keret szlessg) tulajdonsgokon kvl a
kvetkez o fontos tulajdonsgokat llthatjuk be.
A sablon gomb mez o mellett kivlaszthatunk egy el ore
elksztett szveget s ikont. A nyomgombokhoz ha-
sonlan a jell ongyzetek esetben is automatikus k-
veti a szveg a belltott nyelvet, valamint az ikon a be-
lltott tmt, ha a sablon gomb mez oben egy sablont
kivlasztunk.
Ha a sablon gomb mez oben nem vlasztunk ki sem-
mit, a cmke mez oben vlaszthatjuk ki milyen szveg
jelenjen meg a jell ongyzet mellett. A jell ongyzethez
tartozik egy cmke, amely a Glade eszkzeivel kln is kezelhet o!
Ha a sablon gomb mez oben nem vlasztottunk ki semmit, az ikon mez o-
ben kivlaszthatunk egy ikont, amely a jell ongyzet mellett jelenik meg.
Ha az ikon mez oben egy ikont vlasztunk, a Glade automatikusan ltre-
hoz egy, a jell ongyzet mellett lthat ikont, amely kln is kijellhet o
s amelynek tulajdonsgai (pldul mrete) kln is llthatk.
Az alaprt. lenyomva mez oben bellthatjuk, hogy a jell ongyzet meg-
jelenskor be legyen-e kapcsolva, az ismeretlen (inconsistent) mez oben
pedig bellthatjuk, hogy a jell ongyzet megjelenskor a harmadik, is-
meretlen llapotot jelezze.
Az indiktor mez oben bellthatjuk, hogy jelenjen-e meg a jell ongyzet
ngyzete, amely az llapott jelli. Ha ezt a mez ot nem llapotra lltjuk,
a jell ongyzet llapott a GTK+ mskppen jelenti meg (lsd a 3.11
brt).
A GtkCheckButton tpus a GtkToggleButton tpus kzvetlen leszr-
mazottja, azrt a hasznlata a 3.1.4. szakaszban bemutatott kapcso-
lgomb hasznlathoz nagyon hasonlt. A jell ongyzetnek a kapcsol-
gtk 2007/10/21 14:22 page 51 #51
51
gombhoz hasonlan hrom llapota van, a toggled jelzst kldi az t-
kapcsolsakor s a legtbb esetben ugyanazokat a fggvnyeket hasznl-
juk a kt kperny oelem kezelsre. A knyv knnyebb megrtse rdek-
ben ebben az j krnyezetben is bemutatjuk a mr trgyalt eszkzket.
3.12. bra. A beviteli mez o
tulajdonsgai
A jell ongyzetek ltal kldtt legfontosabb jelzs
a kvetkez o:
toggled A jell ongyzet ezt az zenetet kldi, ha a
felhasznl megvltoztatja az llapott, azaz
tkapcsolja.
A jell ongyzet hasznlata kzben a kvetkez o
fggvnyek a legfontosabbak.
gboolean gtk_toggle_button_get_active(GtkToggleButton
*
jellongyzet);
A fggvny segtsgvel lekrdezhetjk, hogy
a jell ongyzet be van-e kapcsolva.
visszatrsi rtk A fggvny visszat-
rsi rtke TRUE, ha a jell ongyzet be
van kapcsolva s FALSE, ha a jell ongy-
zet ki van kapcsolva.
jellongyzet Megadja, hogy melyik jell o-
ngyzetet kvnjuk lekrdezni.
A fggvny nem csak a jell ongyze-
tek lekrdezsre alkalmas, a jell ongy-
zet cmnek tadsakor ezrt esetleg hasznlnunk kell a
GTK_TOGGLE_BUTTON() makrt.
void gtk_toggle_button_set_active(GtkToggleButton
*
jellongyzet, gboolean be);
A fggvny segtsgvel bellthatjuk, hogy a
jell ongyzet be legyen-e kapcsolva vagy sem.
jellongyzet Megadja, hogy melyik jell ongyzetet kvnjuk t-
kapcsolni.
A fggvny nem csak a jell ongyzetek lekrdezsre alkalmas,
a jell ongyzet cmnek tadsakor ezrt esetleg hasznlnunk
kell a GTK_TOGGLE_BUTTON() makrt.
be Megadja, hogy a jell ongyzetnek mi legyen az j llapota. Ha az
tadott rtk TRUE, a jell ongyzet bekapcsol, ha FALSE kikap-
csol.
gtk 2007/10/21 14:22 page 52 #52
52
3.1.9. A rdigomb
A rdigombok meglehet osen hasonltanak a jell ongyzetekre. A k-
lnbsg csak annyi, hogy amg a rdigombok egymstl fggetlenl
m ukdnek, a rdigombok csoportokba szervezhet ok s csoportonknt
klcsnsen kikapcsoljk egymst. A GTK+ programknyvtrban a r-
digombok kezelsre a GtkRadioButton tpus hasznlhat.
3.13. bra. A jell o-
ngyzet
A rdigombokra pldt a 3.13. brn lthatunk.
A rdigombok kezelse majdnem mindenben megegyezik
a jell ongyzetek kezelsvel, egyetlen egy klnbsg van.
A tulajdonsgokat bellt ablakban rdigombok esetben
megjelenik egy csoport mez o, ahol bellthatjuk, hogy a r-
digomb melyik csoportba tartozzk, azaz mely elemeket
kapcsoljon ki, ha bekapcsoljuk.
3.1.10. A mensv
A mensv ltszlag bonyolult eszkz, a ltrehozsa s be-
lltsa azonban ennek ellenre egyszer u. Ha a Glade prog-
ramot hasznljuk az alkalmazs felhasznli felletnek
ltrehozsra, egyszer uen csak meg kell szerkesztennk a
menrendszert s a visszahvott fggvnyek segtsgvel mr hasznl-
hatjuk is. A mensvot mutatja be a 3.14. bra.
3.14. bra. Menk s almenk
A mensvban megjelen o egyes men-
pontok legfontosabb eleme a menpont
szvege, amely egyrtelm uen s tmren
jelzi a menpont rendeltetst. Ha a me-
npontot sablon felhasznlsval hoztuk
ltre, a GTK+ programknyvtr gondos-
kodik arrl, hogy a menpont szvege a
felhasznl ltal belltott nyelven jelen-
jen meg. Ha viszont nem tallunk a cl-
jainknak megfelel o sablont, a menpont
szvegt kzzel kell bernunk, a fordts-
rl neknk kell gondoskodnunk.
A menpontok szvegben szoks egy bet ut alhzni, ezzel jelezve,
hogy a menpont melyik billenty ukombincival rhet o el. Az alhzst
gy jellhetjk, hogy az alhzand karakter el ott egy alhzs jelet, a
_ karaktert helyezzk el.
Azoknak a menpontoknak a szvege utn, amelyek prbeszdablakot
hoznak ltre, szoks hrom pontot elhelyezni. A felhasznl a pontokat
ltva mg a menpont aktivlsa el ott tudni fogja, hogy a menpont nem
azonnal fejti ki hatst, lesz mg alkalma beavatkozni. A hrom pont
teht megnyugtatja a felhasznlt, ezrt hasznos, rdemes hasznlnunk.
gtk 2007/10/21 14:22 page 53 #53
53
A menpont szvege el ott egy ikont jelenthetnk meg a menben. Az
ikon segti a felhasznlt a menben val eligazodsra, sokszor szk-
sgtelenn teszi, hogy a men pontjainak szvegt vgigolvassa. A GTK+
programknyvtr gondoskodik arrl is, hogy a menpontok el ott elhe-
lyezett ikonok mindig a felhasznl ltal belltott stlusnak megfelel o
formban jelenjen meg. Ennek ksznhet oen a felhasznl az alkalma-
zsokban a megszokott ikonokat ltja, ami tovbb knnyti a menben
val eligazodst.
A legfontosabb menkhz s menpontokhoz szoks gyorsbillenty ut
rendelni. Ha a menpont szerkesztse sorn gyorsbillenty ut rendelnk a
menponthoz, a GTK+ programknyvtr a gyorsbillenty u jelzst a me-
npont szvege utn, jobbra rendezve jelenti meg. Ez igen hasznos szol-
gltats, hiszen gy a felhasznl az alkalmazs sorn ltja, hogy az l-
tala hasznlt menponthoz milyen gyorsbillenty u tartozik s el obb-utbb
megjegyzi a leggyakrabban hasznlt eszkzkhz tartoz billenty ukom-
binciit.
A menpontok kzt tallunk olyat, amelyikhez almen tartozik. Az al-
men jelzsre a menpont jobb szln egy nyl jelenik meg. Az almen
jelzsre szolgl nyl automatikusan jelenik meg, ha az adott menpont
almenvel van elltva. A GTK+ programknyvtrban a menk gyakorla-
tilag tetsz oleges mlysgig egymsba gyazhatk.
Kszthetnk olyan menpontot is, amely sajt llapottal rendelkezik,
a jell ongyzetekhez s a rdigombokhoz hasonlan m ukdik. Az ilyen
menpontok bal szln az llapot jelzsre szolgl ikon jelenhet meg,
amelynek formja a felhasznl ltal belltott stlushoz igazodik.
3.15. bra. A menk belltsa
A menk kapcsn meg kell emlte-
nnk a GNOME egy fontos szolglta-
tst, aminek a segtsgvel a felhasz-
nl egy lpsben bellthatja az sszes
alkalmazs menrendszernek megjele-
nst. A gnome-ui-properties prog-
ram (lsd a 3.15. brt) segtsgvel a
menk kt fontos tulajdonsgt is bel-
lthatjuk.
Az ikonok megjelentse a men-
ben felirat jell ongyzettel a felhasz-
nl bellthatja, hogy az alkalmazsok
meniben megjelenjenek-e az ismer os
menpontok megtallst megknnyt o
ikonok. Klnsen lass u szmtgpe-
ken hasznos, hogy az ikonokat ilyen
egyszer uen kikapcsolhatjuk, hiszen ez
lnyegesen meggyorsthatja a menk megjelentst. Igaz azonban az is,
hogy a GTK+ jabb vltozatai el obb megjelentik a ment s csak ks obb
gtk 2007/10/21 14:22 page 54 #54
54
helyezik el bennk az ikonokat, ha az ikonok megjelentse az adott sz-
mtgpen tlsgosab lass.
A szerkeszthet o mengyorstk jell ongyzetet bekapcsolva a felhasz-
nl engedlyezheti a menpontok mellett tallhat gyorsbillenty uk meg-
vltoztatst. Ehhez egyszer uen ki kell jellnie a menpontot azaz le
kell grdtenie a ment, majd az egrkurzorral az adott menpontra kell
llnia majd le kell nyomnia a gyorsbillenty uknt hasznlni kvnt bil-
lenty ukombincit. Az j gyorbillenty u azonnal megjelenik a menben
s termszetesen azonnal hasznlhatv is vlik.
Taln rdemes mg megemltennk, hogy a menk bemutatott bel-
ltsai, az ikonok elrejtse s a gyorsbillenty uk trsnak engedlyezi
azonnal rvnyeslnk, az ppen fut alkalmazsok megjelense s vi-
selkedse azonnal kveti a belltsokat.
A menk szerkesztse
A Glade a menk szerkesztst nagyon egyszer uv teszi. Ha egy mens-
vot helyeznk el az ablakban s kijelljk, a tulajdonsgok ablakban egy
menk szerkesztse. . . felirat nyomgomb jelenik meg. Ha erre a nyo-
mgombra kattintunk megjelenik a men szerkeszt o ablak (3.16. bra).
Ebben az ablakban gyakorlatilag mindent bellthatunk, ami a menk
kezelshez szksges.
Az ablak bal oldalnak nagy rszt elfoglal tblzatban a mensv
menpontjait ltjuk. A tblzatban az egyes menpontok egyms alatt,
a szerkezetet mutat hierarchikus rendben jelennek meg. A tblzat alatt
tallhat nyomgombok segtsgvel a kijellt menpontot mozgathatjuk
felfel, lefel, illetve kijjebb s beljebb. A nyomgombok hasznlatval
brmikor trendezhetjk a menpontokat, ami igen megknnyti a prog-
ram felhasznli felletnek kialaktst.
Az ablak jobb oldalnak fels o rszn, a sablon elem cmke mellett be-
llthatjuk, hogy a kijellt menpontot a GTK+ programknyvtr milyen
sablonbl hozza ltre. Ennek az eszkznek a segtsgvel az alkalma-
zsokban megszokott menket (fjl, szerkeszts stb.) egy pillanat alatt
elkszthetjk.
A cmke mez oben bellthatjuk a menpont szvegt, a nv mez oben
a menpont kezelsekor hasznlt vltoz nevt, a kezel o mez oben pedig
a menpont aktivizlsakor meghvott fggvny nevt. gyeljnk arra,
hogy a nv, illetve a kezel o mez oben ne hasznljunk kezetes karaktere-
ket, hiszen a C programozsi nyelv nem engedlyezi az kezetes vltoz,
illetve fggvnyneveket.
Az ikon mez oben bellthatjuk, hogy milyen ikon jelenjen meg a me-
npont el ott. Nyilvnval, hogy ha a menponthoz sablont rendelnk
a sablon elem mez oben, ez a mez o nem hasznlhat, hiszen a sablon
gtk 2007/10/21 14:22 page 55 #55
55
felhasznlsval ltrehozott menpontok mindig a sablon ltal meghat-
rozott ikonnal jelennek meg.
3.16. bra. A men szerkeszt o ablak
A segdszveg me-
z oben egy rvid, n-
hny szavas lerst
rendelhetnk a me-
nponthoz, amelyet
a felhasznl mr
akkor is lt, amikor
mg nem aktivlta a
menpontot. A segd-
szveg nagymrtkben
megknnytheti az al-
kalmazssal ismerked o
felhasznl munk-
jt, ezrt rdemes
hasznlni.
Az ablak jobb olda-
ln tallhat hozzad
(add) nyomgomb se-
gtsgvel j menpon-
tot szrhatunk be a
tblzatba kijellt me-
npont al. Hasonl a
rendeltetse a gyermek hozzads (add child) nyomgombnak, amellyel
a kijellt elem gyermekeknt szrhatunk be j menpontot. A gyermek
hozzadsa nyomgomb tulajdonkppen csak meggyorstja a munkn-
kat, hiszen a menhz adott menpontot brmikor beljebb a hierarchia
mlyebb szintjre mozgathatjuk a tblzat alatt tallhat nyomgomb-
sor segtsgvel.
Az ablak jobb oldaln tallhat elvlaszt hozzadsa (add separator)
nyomgomb segtsgvel a menpontokat elvlaszt vonalat szrhatunk
be a bal oldalon kijellt menpont al. A menpontokat elvlaszt vonal
megknnyti a menben val eligazodst a menpontok csoportosts-
val. Elvlasztjelet egybknt gy is kszthetnk, hogy beszrunk egy
j menpontot s egyszer uen kitrljk a nevt.
Az ablak jobb oldalnak aljn tallhat elem tpusa rszben jell o-
ngyzetet s rdigombot rendelhetnk a menponthoz, a gyorsbillenty u
rszben pedig rtelem szer uen a menponthoz tartoz gyorsbillenty ut l-
lthatjuk be.
A menszerkeszt o ablak aljn tallhat mgsem nyomgomb segts-
gvel bezrhatjuk a menszerkeszt ot a vltoztatsok elvetsvel. Az OK
gombbal szintn bezrhatjuk az ablakot, de a vltoztatsok elfogads-
val.
gtk 2007/10/21 14:22 page 56 #56
56
Az ablak aljn lthat alkalmaz nyomgomb is igen hasznos. Ezzel a
gombbal rvnyesthetjk a vltoztatsokat anlkl, hogy az ablakot be-
zrnnk. gy a vltoztatsokat kiprblhatjuk, megvizsglhatjuk mikp-
pen fog kinzni a programunk a ments s fordts utn.
A programoz szempontjbl amint azt mr emltettk a menk
hasznlata igen egyszer u. A GTK+ hvja a menszerkeszt oben megadott
fggvnyt, amint a felhasznl aktivlta az adott menpontot. Egyetlen
nehzsget a sajt llapottal rendelkez o menpontok hasznlata jelent-
het. A jell ongyzeteket s rdigombokat tartalmaz mensorok llapo-
tt el kell krdeznnk a visszahvott fggvnyben. Ennek a m uveletnek
az elvgzsre mutat be egy megoldst a kvetkez o plda.
13. plda. A jell ongyzettel elltott mensorok llapota kiderthet o, ha
a menpontra GtkCheckMenuItem tpussal hivatkozunk. Ezt mutatja be
a kvetkez o programrszlet, amely egy jell ongyzettel elltott mensor
visszahvott fggvnye.
1 void
2 on_cimzett_activate(GtkMenuItem
*
menuitem,
3 gpointer user_data)
4 {
5 GtkCheckMenuItem
*
item;
6 item = GTK_CHECK_MENU_ITEM(menuitem);
7 if (gtk_check_menu_item_get_active(item))
8 printf("%s(): Men bekapcsolva.\n", __func__);
9 else
10 printf("%s(): Men kikapcsolva.\n", __func__);
11 }
Ugyanez a mdszer vltoztats nlkl hasznlhat akkor is, ha nem jel-
l ongyzetet, hanem rdigombot tartalmaz mensort kezelnk a vissza-
hvott fggvnnyel.
3.1.11. A felbukkan men
A felbukkan men (popup menu) olyan men, amely az egrgomb meg-
nyomsnak hatsra az egrmutat aktulis helyn jelenik meg. A fel-
bukkan men ltalban kontextusrzkeny, azaz hatsa arra a kp-
erny oelemre vonatkozik, amelyikre kattintva a ment megjelentettk.
A 3.17. brn pldul a felbukkan men hatsa arra az ikonra vonat-
kozik, amelyre kattintottunk, amelyen a felbukkan men bal fels o sarka
tallhat.
gtk 2007/10/21 14:22 page 57 #57
57
3.17. bra. A felbukkan men
Ha a programunkat a Glade segtsgvel
ksztjk, a felbukkan menket is ugyan-
gy szerkeszthetjk, mint a mensorban
tallhat menket. Egyszer uen vlasszuk
ki a felbukkan men ikont a paletta ab-
lakbl, vagy vlasszuk ki a mr ltreho-
zott felbukkan ment dupla kattintssal
a Glade f oablakban s mris szerkeszt-
hetjk a felbukkan men menpontjait.
A Glade minden felbukkan men sz-
mra ltrehoz egy fggvnyt, amelyet hvva
a felbukkan ment ltrehozhatjuk. A me-
nt ltrehoz fggvny nevt megkaphat-
juk, ha a felbukkan men neve el elhelyezzk a create_ (create, lt-
rehoz) el otagot.
A felbukkan menk hasznlata sorn a legfontosabb fggvnyek a
kvetkez ok:
GtkWidget
*
create_xxx(void); A Glade ltal ltrehozott fggvny,
amely a felbukkan men ltrehozst vgzi. A fggvny nevben
az xxx helyn a felbukkan men neve tallhat. Fontos lehet tud-
nunk, hogy a fggvny ltrehozza ugyan a felbukkan ment, de azt
a kperny on nem jelenti meg. A men megjelentst kln fgg-
vny hvsval kell krnnk.
A fggvny visszatrsi rtke a ltrehozott ment jelli a memri-
ban.
void gtk_menu_popup(GtkMenu
*
men, GtkWidget
*
szlo_men,
GtkWidget
*
szlo_mensor, GtkMenuPositionFunc
fggvny, gpointer adat, guint gomb, guint32 idopont);
A fggvny segtsgvel az el oz oleg ltrehozott ment felbukkan
menknt megjelenthetjk a kperny on. A fggvny a men meg-
jelentse utn azonnal visszatr, a program futsa folytatdik. Ha
a felhasznl kivlasztja a felbukkan men valamelyik menpont-
jt, a Glade menszerkeszt ojben belltott visszahvott fggvny
lefut.
A fggvny paramterei a kvetkez ok:
men A ment amelyet meg akarunk jelenteni jelli a memri-
ban.
szlo_men A menhz tartoz szl omen, ha a men egy msik
men almenjeknt jelenik meg. Ezt a paramtert ltalban
nem kell hasznlnunk, a helyn a NULL rtket adhatjuk meg.
gtk 2007/10/21 14:22 page 58 #58
58
szlo_mensor A szl o men adott mensort jelli a memri-
ban. A legtbb esetben itt is NULL rtket adhatunk meg.
fggvny A men megjelensi helyt kiszmt fggvny mutatja.
A legtbb esetben itt is NULL rtket adhatunk meg.
adat A men megjelensi helyt kiszmt fggvnynek tadand
adatokat jell o mutat. A legtbb esetben itt a NULL rtket
hasznljuk.
gomb Annak az egrgombnak a sorszma, amelynek hatsra a
men megjelentst krjk. Ha a men nem az egr nyom-
gombjnak lenyomsa hatsra jelenik meg, hasznlhatjuk a 0
rtket.
idopont A men megjelenst kivlt esemny bekvetkeztnek
id opontja a GTK+ sajt id obrzolsi rendszere szerint. Ha
az esemny bekvetkezsnek ideje ismeretlen, hasznlhatjuk
a gtk_get_current_event_time() fggvny ltal visszaadott
rtket.
A felbukkan men ltrehozst ltalban olyan visszahvott fggvny-
ben vgezzk el, amelyet a GTK+ valamilyen kperny oelemre val kat-
tintskor hv. A kvetkez o zenet pldul nagyon alkalmas felbukkan
men ltrehozsra:
button_press_event Ezt az zenetet gyakorlatilag brmilyen tpus
kperny oelem kpes kivltani. Az zenet az egr valamelyik nyo-
mgombjnak lenyomsakor keletkezik, ha az egrmutat az adott
kperny oelem felett helyezkedik el
1
.
Az zenet hatsra visszahvott fggvny visszatrsi rtke logi-
kai tpus (gboolean), fontos szerepet kap az adott kperny oelem
letben.
Ha az ltalunk ksztett visszahvott fggvny visszatrsi rtke
logikai igaz (TRUE), a GTK+ az egr lenyomst nem kezeli. Az igaz
visszatrsi rtkkel teht azt jelezhetjk, hogy az egr gombjnak
lenyomst elintztk, azzal a programknyvtrnak nem kell fog-
lalkoznia. Ha a visszatrsi rtk hamis (FALSE), a GTK+ program-
knyvtr az egrgomb lenyomst az adott kperny oelemnek megfe-
lel o mdon feldolgozza, azaz az egrgomb lenyomsa kifejti szoksos
hatst.
Az egr lenyomsakor hvott fggvny paramterknt megkapja a le-
nyoms krlmnyeit jelz o GdkEventButton adatszerkezetet. Ennek a
tpusnak a legfontosabb elemei a kvetkez ok:
1
A GTK+ elnevezsi rendszere szerint a button (gomb) mindig az mutateszkz, az egr
nyomgombjt jelenti. A billenty uzet gombjait a key (billenty u) szval jelli a program
gtk 2007/10/21 14:22 page 59 #59
59
GdkEventType type Az esemny tpusa, amely egr gombjnak lenyo-
msa esetn mindig GDK_BUTTON_PRESS.
guint32 time Az esemny bekvetkeztnek id opontja a GTK+ sajt id o-
formtumban kifejezve.
gdouble x, y Az esemny bekvetkeztnek pontos helye a kperny o-
elem sajt koordintarendszerben. A koordintarendszer 0, 0 helye
a kperny oelem bal fels o sarkban van, az x s y rtkek jobbra,
illetve lefel nvekednek kppontokknt 1-el.
gdouble x_root, y_root Az esemny bekvetkeztnek helye a kper-
ny o sajt koordintarendszerben, amely hasonlan pl fel, mint a
kperny oelem koordintarendszere, de azzal ellenttben a 0, 0 pont
a kperny o bal fels o sarkban tallhat.
guint button Az esemnyt kivlt egrgomb sorszma. Az 1-es sorsz-
mot viseli az egr bal oldali, a 2-es szorszmot a kzps o, illetve a
3-as sorszmot a jobb oldali nyomgomb.
A kvetkez o plda bemutatja hogyan tudunk felbukkan ment lt-
rehozni s megjelenteni a kperny on. A plda nem tartalmazza azokat
a visszahvott fggvnyeket, amelyek a felbukkan men egyes men-
pontjainak kivlasztsakor futnak, mivel ezek a fggvnyek a szoksos
mdon m ukdnek.
14. plda. A kvetkez o fggvny a Glade programmal kszlt, egy tet-
sz oleges tpus kperny oelemhez tartozik, a button_press_event ese-
mny bekvetkeztekor fut le. A bemutatott fggvny egy felbukkan me-
nt hoz ltre s jelent meg az egr jobb gombjnak lenyomsa utn.
1 gboolean
2 on_iconview_button_press_event(GtkWidget
*
widget,
3 GdkEventButton
*
event,
4 gpointer user_data)
5 {
6 GtkWidget
*
menu_widget;
7
8 /
*
9
*
Ha az esemny nem egrgomb lenyoms vagy nem a
10
*
jobb egrgomb lenyomsa, visszatrnk s krjk,
11
*
hogy az esemnyt a GTK+ kezelje.
12
*
/
13 if (event->type != GDK_BUTTON_PRESS ||
14 event->button != 3)
15 return FALSE;
gtk 2007/10/21 14:22 page 60 #60
60
16
17 /
*
18
*
Ltrehozzuk a ment s megjelenttetjk ott, ahol
19
*
a felhasznl lenyomta az egrgombot.
20
*
/
21 menu_widget = create_popup_menu1();
22 gtk_menu_popup(GTK_MENU(menu_widget),
23 NULL,
24 NULL,
25 NULL,
26 NULL,
27 event->button,
28 event->time);
29 /
*
30
*
Mindent megcsinltunk, nem maradt tennival.
31
*
/
32 return TRUE;
33 }
Figyeljk meg, hogy a gtk_menu_popup() fggvny paramtereit milyen
egyszer uen adhatjuk meg! Csak nhny paramterre van szksg s azo-
kat is kinyerhetjk a GtkEventButton tpus esemnylerbl.
3.1.12. Az eszkzsv
Az eszkzsv (toolbar) az ablak fels o rszn megjelen o vzszintes sv,
amely ltalban ikonokkal elltott nyomgombokat tartalmaz az alkal-
mazs legfontosabb szolgltatsainak elrsre. Az eszkzsvra mutat
be pldt az 52. oldalon lthat 3.14. bra. Amint ltjuk az eszkzsv-
ban nem csak nyomgombokat helyezhetnk el, itt is a szoksos mdon
hasznlhatjuk a kperny oelemeket.
Az eszkzsv ltrehozsra s kezelsre a 201. oldalon, az alkalmazs-
ablak bemutatsakor rszletesen is kitrnk.
3.2. Doboz jelleg u elemek
A kvetkez o oldalakon olyan kperny oelemekr ol lesz sz, amelyek kimon-
dottan ms kperny oelemek hordozsra kszltek. Amint azt mr lt-
tuk, a nyomgombban is elhelyezhet ok ms kperny oelemek, de a nyo-
mgomb els odleges feladata nem kperny oelemek hordozsa, mg az itt
bemutatott eszkzk els odlegesen ilyen feladatokat ltnak el.
gtk 2007/10/21 14:22 page 61 #61
61
3.2.1. Az ablak
A legfontosabb doboz jelleg u kperny oelem vitathatatlanul az ablak,
amely lehet ov teszi, hogy az alkalmazs a felhasznl ltal knyelmesen
kezelhet o kperny oelemeket helyezzen el a kperny on. A GTK+ program-
knyvtr az ablakok kezelsre a GtkWindow tpust hasznlja.
3.18. bra. Az ab-
lak
A 3.18. brn egy res ablakot lthatunk. Az ablak k-
zps o rszn tallhat res fehr terlet (client area) az
alkalmazs fennhatsga al tartozik, kizrlag az abla-
kot megnyit alkalmazs szmra van fenntartva. Az alkal-
mazs szmra fenntartott terletet egy szegly veszi k-
rl. Ennek a szeglynek a kezelst az ablakkezel o (win-
dow manager) vgzi. Az alkalmazs korltozottan beleszl-
hat ugyan, hogy az ablakkezel o mikppen vgezze feladatt,
de a szegly ltrehozsa s kezelse nem az o feladata. p-
pen ezrt az ablak krl lthat szegly kinzete, hasznlata
fggetlen az alkalmazstl.
Ebb ol kvetkezik, hogy a Glade ltal ksztett alkalmaz-
sok kiss mskpp jelennek meg az egyes ablakkezel okkel
futtatva oket, viszont futnak a klnfle ablakkezel o rend-
szereken (pldul KDE, FVWM, Afterstep stb.). Az alkalmazsnak a GTK+
(s mg nhny ms) programknyvtrra van szksgk, az azonban,
hogy melyik ablakkezel ot hasznljuk, mellkes.
Az ablak tulajdonsgainak belltsra szolgl ablak a 3.19. brn
lthat. Itt a szoksos tulajdonsgokon (nv, osztly) kvl a kvetkez o
fontos jellemz oket llthatjuk be.
A keret szlessg mez o sok ms kperny oelem esetben megjelenik,
de az ablakok esetben klnsen nagy jelent osge van. A keret szles-
sg mez oben megadhatjuk, hogy az ablak bels o szln hny kppontnyi
helyet hagyjuk az ablak tartalma krl. Ez a jellemz o teht a nyom-
tatott szveg kezelsekor hasznlt marghoz hasonlt. rdemes mindig
legalbb 10 kppontnyi keretet belltani az ablakokhoz, mert klnben
egyszer uen csnya lesz az alkalmazs megjelense.
A fejlc mez oben bellthatjuk, hogy az ablak fels o rszn a cmsorban
milyen szveg jelenjen meg. A cmsor megjelentse az ablakkezel o fel-
adata, ezrt soha nem lehetnk biztosak abban, hogy ez a szveg meg is
jelenik a kperny on, s abban sem, hogy ha megjelenik, akkor olvashat
lesz. Lehetsges pldul, hogy a felhasznl ltal hasznlt ablakkezel o
nem kpes megjelenteni az kezetes karaktereket. rdemes megeml-
tennk azt is, hogy az alkalmazs a sajt ablakai cmsort brmikor
tllthatja a gtk_window_set_title() fggvny segtsgvel.
Fontos informcit tartalmaz a tpus mez o is. Itt llthatjuk be azt, hogy
az ablakot az ablakkezel o kezelje-e, vagy egyszer uen hagyja gyelmen k-
vl. Ha itt a top level rtket lltjuk be, az ablakot az ablakkezel o el-
gtk 2007/10/21 14:22 page 62 #62
62
ltja kerettel, a felhasznl pedig keret segtsgvel kezelheti. Ha a tpus
mez oben a popup rtket lltjuk be, az ablakkezel o egyszer uen gyel-
men kvl hagyja az ablakot, amely ennek megfelel oen nem kap szeglyt,
amelynek a segtsgvel mozgatni, mretezni lehetne. Nyilvnval, hogy
az alkalmazsok ablakai szmra a top level tpust kell hasznlnunk, mg
a popup stlus azok szmra a kperny oelemek szmra van fenntartva,
amelyek valamelyik ablakhoz vannak ugyan rendelve, de elhagyhatjk a
befogad ablak terlett (pldul menk).
3.19. bra. Az ablak bellt-
sai
A pozci mez oben bellthatjuk, hogy az ablak
hol jelenjen meg. Sokszor knyelmes, ha az j ab-
lak az egrkurzornl jelenik meg, mert gy knny u
azonnal bezrni, vagy eszttikus, ha a kperny o
kzepn t unik fel. Mindenesetre az itt belltott r-
tk csak egy krst fogalmaz meg az ablakkezel o-
nek, hogy valjban hol jelenik meg az ablak, az az
ablakkezel o belltsaitl is fgghet.
A modlis (modal) mez oben bellthatjuk, hogy
az ablak mennyire akadlyozza a felhasznlt a
ms ablakokra val tkapcsolsban. A modlis
ablakok amg a kperny on vannak akadlyozzk,
hogy a felhasznl az adott alkalmazs ms ab-
lakait hasznlja, azokat rzketlenn teszik. (Sze-
rencsre a GNU/Linux rendszereken ismeretlen az
gynevezett rendszer modlis ablak fogalma. Ez
az ablaktpus kpes a mgtte lthat teljes kp-
erny ot letiltani, hogy a fogt er oteljesen csikorgat
felhasznl knytelen legyen az adott ablakkal fog-
lalkozni.)
Az alap szlessg s alap magassg mez okben
bellthatjuk, hogy mennyi legyen az ablak kp-
pontban mrt szlessge s magassga kezdetben.
Ha ezeket a jellemz oket nem lltjuk be, az ablak
ppen akkora lesz, amekkora terleten a benne ta-
llhat elemek elfrnek. A legtbb esetben felesleges belltani a magas-
sgot s a szlessget, hiszen nem tudhatjuk, hogy az adott felhaszn-
li belltsok mellett (pldul klnlegesen nagy bet uk) mekkora helyre
van szksg az adott ablak megjelentshez.
A mretezhet o (resizable) mez oben bellthatjuk, hogy a felhasznlnak
lehet ov kvnjuk-e tenni, hogy az ablak mrett az alkalmazs futsa
kzben megvltoztassa.
Az automata megsemmists (auto-destroy) a ltszat ellenre nem tl
bonyolult vagy veszlyes tulajdonsgot takar, egyszer uen azt jelenti, hogy
az ilyen tulajdonsggal rendelkez o ablakok megsemmislnek, ha az oket
ltrehoz ablak (ugyanannak az alkalmazsnak egy msik ablaka) meg-
gtk 2007/10/21 14:22 page 63 #63
63
semmisl.
Az ablakok kezelsre a 179. oldalon tallhat 7.1. szakaszban, a tbb
ablakot hasznl alkalmazsok trgyalsa sorn visszatrnk.
3.2.2. A fgg oleges doboz
Amint lttuk a kperny oelemek elhelyezsre alkalmas kperny oelek leg-
tbbje (pldul ablak, nyomgomb) csak egyetlen kperny oelem hordoz-
sra kpes. Az ilyen kperny oelemekben is elhelyezhetnk azonban tbb
kperny oelemet, ha fgg oleges vagy vzszintes dobozt hasznlunk. A fg-
g oleges s vzszintes dobozok szerepe ppen az, hogy egyms alatt, illetve
egyms mellett tbb kperny oelemet hordozzanak. Mivel a fgg oleges s
vzszintes dobozokban is lehetnek fgg oleges, illetve vzszintes dobozok,
tetsz olegesen sszetett szerkezetek pthet ok a segtsgkkel.
3.20. bra. A fgg oleges do-
boz tulajdonsgai
A fgg oleges doboz segtsgvel kperny oeleme-
ket helyezhetnk egyms al. A GTK+ program-
knyvtr esetben a fgg oleges dobozok kezelsre
hasznlhat tpus a GtkVBox. A fgg oleges dobo-
zok tulajdonsgainak belltsra hasznlhat ab-
lakot a 3.20. brn lthatjuk. Itt a szoksos tulaj-
donsgok mellett (nv, osztly) a kvetkez o fontos
tulajdonsgokat is bellthatjuk.
A keret szlessge ms kperny oelemek esetben
is llthat, a fgg oleges dobozok esetben azon-
ban klnsen fontos ez a jellemz o. Ahogy az ab-
lakoknl mr meggyelhettk, ez a jellemz o meg-
adja, hogy a doboz bels o rszn hny kppont-
nyi helyet hagyjunk resen. Itt ltalban rdemes
mintegy 5 kppontnyi tvolsgot belltani. Fontos
megjegyeznnk, hogy a fgg oleges doboz szegly
csak egy keret, nagyobbra lltsa nem nveli a t-
volsgot az egyms alatt elhelyezett elemek kztt.
A mret jellemz o megadja, hogy hny elem elhe-
lyezsre alkalmas a doboz, azaz a doboz terlete hny egyms alatti
rszterletre oszlik.
A homogn jellemz o megadja, hogy az egyes terletek ktelez oen azonos
mret uek-e. Eszttikai okokbl sokszor azonos mret u helyre helyezzk
a klnfle mret u elemeket, hogy gy tblzatos formban egyms al
vagy mell kerljenek az elemek. Ilyen esetben ezt a mez ot igen rtkre
kell lltanunk.
A helykz jellemz o megadja, hogy az egyes rszek kzt hny kppontnyi
helyet hagyunk ki. ltalban ezt a jellemz ot is rdemes nhny kppont-
nyi rtkkel nvelnnk, hogy az egyes kperny oelemek ne kerljenek tl
kzel egymshoz.
gtk 2007/10/21 14:22 page 64 #64
64
3.2.3. A vzszintes doboz
A vzszintes doboz kperny oelemek egyms mell helyezst teszi lehe-
t ov. A GTK+ knyvtr esetben a vzszintes dobozok hasznlatra a
GtkHBox tpus szolgl.
A vzszintes dobozok rtelemszer uen mindenben megegyeznek a fg-
g oleges dobozokkal, az egyetlen klnbsg a bennk tallhat o elemek
vzszintes elrendezse.
3.2.4. A tblzat
A tblzat hasonlt a fgg oleges s a vzszintes dobozokhoz, de nem csak
sorai, illetve oszlopai vannak, hanem sorai s oszlopai is. A GTK+ tbl-
zatok kezelsre hasznlhat tpusa a GtkTable.
A tblzat kezelsre hasznlhat fggvnyek legtbbjt csak akkor ta-
llhatjuk hasznosnak, ha a felhasznli felletet nem a Glade segtsg-
vel, hanem kzzel a megfelel o fggvnyek hvsval hozzuk ltre.
3.2.5. A keret
3.21. bra. A keret
A keret igen egyszer u, egyetlen kperny oelem hor-
dozsra alkalmas kperny oelem, amely segts-
gnkre lehet az ablak tartalmnak csoportosts-
ban. A GTK+ keretek kezelsre hasznlhat tpusa
a GtkFrame.
A keret legfontosabb feladata, hogy nhny kper-
ny oelemet egybefogva, a tbbi kperny oelemt ol elk-
lntve jelentsen meg. A keret rendelkezik egy cm-
kvel, amely ltalban a kperny oelemek csoportjt
ltja el kln nvvel, hogy knnyebben hivatkozhas-
sunk r. A keret egy lehetsges megjelensi formjt mutatja be a 3.21.
bra.
A keretek hasznlata kzben hasznos lehet a kvetkez o fggvny:
void gtk_frame_set_label(GtkFrame
*
keret, const gchar
*
szveg); A fggvny segtsgvel bellthatjuk a keret cmk-
jeknt megjelen o szveget. A fggvny msodik paramtere egy
szveget jell a memriban, ami az els o paramlterknt jelzett keret
cmkjeknt a kperny on megjelenik.
Ha a cmke szvegt flkvr bet utpussal szeretnnk megjelenteni,
akkor hasznlhatjuk a <b>szveg</b> formt ennek jelzsre.
gtk 2007/10/21 14:22 page 65 #65
65
3.3. ltalnos eszkzk
A GTK+ programknyvtr hasznlata sorn sokszor hvunk olyan fgg-
vnyeket, amelyek tbbfle adatszerkezetet, tbbfle kperny oelemet is
kpesek kezelni. A kvetkez o oldalakon ezek kzl a fggvnyek kzl
vesszk sorra a legfontosabbakat.
3.3.1. Az objektum
A GTK+ minden kperny oeleme a GtkWidget tpus a G program-
knyvtr objektumtpusra, a GObject tpusra pl. A G programknyv-
tr a GObject tpust biztostja az objektumorientlt programozs alapt-
pusaknt.
A G programknyvtr a GObject tpus vltozk az objektumok
szmra egy hivatkozsszmllt rendel, hogy az objektumok ltrehoz-
st s megsemmistst tmogassa. A programknyvtr minden objek-
tumhoz egy hivatkozsszmllt rendel, ami kezdetben 1 s amelyet a
programunk nvelhet, illetve cskkenthet. Ha a hivatkozsszmll r-
tke 0, a programknyvtr az adott objektumot megsemmisti, a hozz
tartoz memriaterletet felszabadtja. Ezzel az eszkzzel az objektumok
megsemmistse automatizlhat, a programoznak teht nem kell nyil-
vntartania azt, hogy az egyes objektumokhoz tartoz memriaterlete-
ket mikor lehet felszabadtani.
A G programknyvtr hivatkozsszmlljrl tudnunk kell, hogy an-
nak kzvetlen kezelse a GTK+ kperny oelemek esetben nem szeren-
css. A GTK+ a kperny oelemek hivatkozsszmlljnak kezelsre sa-
jt rendszert valst meg, amelyet a G programknyvtrral val kzvetlen
kezels megzavar. Mindazonltal lteznek olyan tpusok is, amelyeket a
G programknyvtr hivatkozsszmllk kezelsre alkalmas fggvnye-
ivel kezelhetnk.
A G programknyvtr a hivatkozsszmllkon kvl egy adatterletet
is rendel minden objektumhoz. Az adatterlethez a programunk nvvel
s rtkkel rendelkez o vltoz szer u bejegyzseket adhat hozz s ezeket
a vltozkhoz hasonl bejegyzseket brmikor lekrdezhet. Ez a rend-
szer a GTK+ programknyvtr kperny oelemeinek kezelse sorn is igen
hasznos lehet, hiszen a segtsgvel knnyen elkerlhetjk a globlis vl-
tozk hasznlatt.
Az ltalnos hatkr u, globlis ltozk hasznlata igen szerencstlen
a grakus felhasznli felletek ksztse sorn, hiszen a globlis vl-
toz hasznlata lehetetlenn teszi, hogy a globlis vltoz segtsgvel
lert kperny oelemb ol pldul ablakbl egy id oben tbbet is megje-
lentsnk a kperny on. Ha pldul egy globlis vltozban troljuk a
szvegszerkeszt oben megnyitott llomny nevt, akkor mivel csak egy
gtk 2007/10/21 14:22 page 66 #66
66
globlis vltoznk van csak egy ablakot jelenthetnk meg.
Megoldst jelenthet, ha a szvegszerkeszt o kperny oelem, vagy a sz-
vegszerkeszt ot magba foglal ablak adatterlethez a G programknyv-
tr segtsgvel egy bejegyzst rendelnk, ami tartalmazza az llomny-
nevet. gy minden szvegszerkeszt ohz, minden ablakhoz sajt llomny-
nevet rendelhetnk s mindig egyrtelm u lesz, hogy melyik llomnynv
tartozik az adott szvegszerkeszt ohz.
A GObject tpus kezelsre hasznlhat fggvnyek kzl a legfonto-
sabbak a kvetkez ok.
gpointer g_object_get_data(GObject
*
objektum, const gchar
*
nv); A fggvny segtsgvel az objektumhoz tartoz adatterlet
bejegyzsei kzt kereshetnk nv szerint.
A fggvny els o paramtere az objektumot jelli a memriban, a
msodik paramtere pedig a keresett bejegyzs nevt adja meg.
A fggvny visszatrsi rtke az objektumhoz tartoz adatterlet
adott nev u bejegyzst jelli a memriban. Ha a paramterknt
tadott nven nem tallhat bejegyzs, a visszatrsi rtk NULL.
void g_object_set_data(GObject
*
objektum, const gchar
*
nv, gpointer adat); A fggvny segtsgvel az objektum-
hoz tartoz adatterlethez adhatunk j bejegyzst vagy egy mr
meglv o bejegyzs rtkt vltoztathatjuk meg.
A fggvny els o paramtere az objektumot jelli a memriban, a
msodik paramtere pedig a ltrehozand vagy megvltoztatand
bejegyzs nevt hatrozza meg. Ha a msodik paramter ltal meg-
hatrozott nven mg nem ltezik bejegyzs, a G programknyvtr
ltrehozza, ha pedig mr ltezik ilyen bejegyzs, akkor egyszer uen
megvltoztatja az rtkt.
A fggvny harmadik paramtere a bejegyzs rtkt jelli a mem-
riba. Az objektumot adatterleteinek minden bejegyzse egy mu-
tatrtket hordoz, ami tetsz oleges tpus rtk hordozsra teszi
kpess az adatterletet.
void g_object_set_data_full(GObject
*
objektum, const
gchar
*
nv, gpointer adat, GDestroyNotify fggvny);
A fggvny a g_object_set_data() fggvnyhez hasonlan j
bejegyzst hoz ltre vagy megvltoztatja a mr meglv o bejegyzs
rtkt, az egyetlen klnbsg a negyedik paramterknt tadott
mutat kezelsben mutatkozik.
A negyedik paramter egy fggvnyt jell a memriban, amelyet a
G programknyvtr akkor hv, ha az adatterlet bejegyzse megvl-
tozik, azaz, amikor a bejegyzst megvltoztatjuk vagy az adatterlet
gtk 2007/10/21 14:22 page 67 #67
67
objektumt megsemmistjuk. A negyedik paramter ltal jellt fgg-
vnyt nyilvn arra hasznlhatjuk, hogy az adatterlet bejegyzse
ltal kijellt adatterletet felszabadtsuk vagy a hivatkozsszml-
ljt cskkentsk.
A grakus fellettel rendelkez o programokban igen hasznosnak bizo-
nyulhatnak a g_object_set_data() s a g_object_get_data() fgg-
vnyek, mgpedig azrt, mert a visszahvott fggvnyek paramterlistja
kttt, a globlis vltozk hasznlata viszont igen htrnyos kvetkez-
mnyekkel jr.
Amikor egy j ablakot, j felbukkan ment jelentnk meg, akkor l-
talban olyan informcikkal rendelkeznk amelyekre szksgnk lehet
az ablak, a men kezelse sorn. Amikor pldul a felhasznl szmra
egy felbukkan ment jelentnk meg, mert a programunk egy ikonjra
kattintott, nyilvnvalan tudjuk, hogy a felbukkan men melyik llo-
mnyt jelz o ikon felett jelent meg. A felbukkan men egyes menpont-
jainak visszahvott fggvnyeiben szksgnk van erre az informcira,
tudnunk kell, hogy a felhasznl melyik llomnyt akarja trlni, tne-
vezni, megnyitni s gy tovbb.
Kezd o programoznak komoly nehzsget jelent a kiegszt o inform-
cik tadsa a visszahvott fggvnynek. A visszahvott fggvnyek hv-
st a Glade ltal ksztett kd alapjn a GTK programknyvtr vgzi, gy
a visszahvott fggvny paramtereinek megvltoztatsa nehzkes (br
erre volna md), klnsen, ha a visszahvott fggvnyt a Glade segt-
sgvel rendeljk a jelzsekhez. Hasznlhatnnk globlis vltozkat is,
amelyekben az ablakok, menk megjelentsekor trolhatnnk a kieg-
szt o informcikat s amelyekb ol a visszahvott fggvnyek kiolvashat-
nk azokat. A globlis vltozk hasznlata nha megolds jelenthet, de
egyrszt nem tl kellemes a globlis vltozktl hemzseg o program fej-
lesztse, msrszt igen nehz a globlis vltozkban trolt kiegszt o in-
formcikat kezelni, ha megengedjk, hogy az ablakokbl egyszerre tbb
is ltezzen (br termszetesen ez is megoldhat).
Igen egyszer u, ugyanakkor problmamentes megoldst a
g_object_set_data() s a g_object_get_data() fggvnyek je-
lenthetnek, ahogyan a kvetkez o plda is bemutatja.
15. plda. Tegyk fel, hogy a programunk tartalmaz egy ablakot hl-
zati er oforrsok szerkesztsre s ez az ablak mskppen kell, hogy vi-
selkedjen akkor, amikor egy meglv o er oforrst szerkesztnk s megint
mskppen, amikor egy j er oforrst hozunk ltre.
A kvetkez o fggvny az j hlzati er oforrs ltrehozsra hasznlt
menpont visszahvott fggvnyt mutatja be.
1 void
2 on_new_network_resource_activate(GtkMenuItem
*
menuitem,
gtk 2007/10/21 14:22 page 68 #68
68
3 gpointer user_data)
4 {
5 GtkWidget
*
window;
6 window = create_network_resource_window();
7
8 g_object_set_data(G_OBJECT(window),
9 "purpose",
10 "insert");
11 gtk_widget_show(window);
12 }
A fggvny a 6. sorban ltrehozza az j ablakot, amely egy GtkWidget
tpus objektum. Mivel a GtkWidget tpus a GObject tpus leszrma-
zottja, adatot kapcsolhatunk hozz a g_object_set_data() fggvny
segtsgvel, amelyet meg is tesznk a 810. sorokban.
Mivel j hlzati er oforrsrl van sz, nem pedig ltez o er oforrs szer-
kesztsr ol, szksgtelen, hogy az ablakhoz hozzrendeljk egy meglv o
er oforrst ler adatszerkezetet. Egyszer uen csak azt a tnyt kell trol-
nunk, hogy az ablakot j hlzati er oforrs ltrehozsra hoztuk ltre.
Nyilvnval, hogy az ilyen mdon elksztett ablak s az abban tall-
hat sszes kperny oelem visszahvott fggvnye lekrdezheti az ablak-
hoz tartoz "purpose" mez o tartalmt a g_object_get_data() fgg-
vny segtsgvel s gy megtudhatja milyen clra szolgl az ablak.
3.3.2. Az ltalnos kperny oelem
A GTK+ programknyvtr az objektumorientlt mdszertan rtelmben
minden kperny oelemet a GtkWidget tpus utdjaknt hoz ltre, ezrt
a programknyvtr minden kperny oeleme kezelhet o GtkWidget tpus
objektumknt. Nyilvnval, hogy a kperny oelemek kezelse sorn igen
fontosak azok az ltalnosan hasznlhat fggvnyek, amelyek a kper-
ny oelemeket GtkWidget tpus obejtumokknt kezelik.
A GTK+ programknyvtr a kperny oelemek megjelentsre, elrejt-
sre s megsemmistsre a kvetkez o fggvnyeket biztostja.
void gtk_widget_destroy(GtkWidget
*
widget); A fggvny se-
gtsgvel a kperny oelemeket megsemmisthetjk, a trolsukra
hasznlt memriaterletet felszabadthatjuk. A legtbb esetben
csak az ablakokat kell megsemmistennk ennek a fggvnynek
a hvsval, mert az ablak megsemmistse kvetkeztben a GTK+
programknyvtr megsemmisti az ablakon bell tallhat sszes
kperny oelemet.
A fggvny paramtere a megsemmistend o kperny oelemet jelli a
memriban.
gtk 2007/10/21 14:22 page 69 #69
69
void gtk_widget_show(GtkWidget
*
elem); A fggvny segtsgvel
gondoskodhatunk arrl, hogy a kperny oelem megjelenjen a kper-
ny on, azaz hogy a GTK+ programknyvtr megjelentse a kperny o-
elemet a monitoron.
Azok a kperny oelemek, amelyeket nem jelentnk meg egyszer uen
nem ltszanak a kperny on, gy a felhasznl nem ltja s nem
tudja kezelni oket. Tudnunk kell viszont, hogy a kperny oelemek
csak akkor jelenhetnek meg a kperny on, ha megjelennek azok a
kperny oelemek, amelyek hordozzk oket, azaz ha ltszanak az ab-
lakok, keretek, dobozok, amelyekben elhelyeztk oket.
A fggvny paramtere azt a mr ltrehozott kperny oelemet
jelli a memriban, amelyet meg kvnunk jelenteni.
void gtk_widget_hide(GtkWidget
*
elem); A fggvny segtsgvel
az adott kperny oelemet elrejthetjk a kperny or ol. Az elrejtett kp-
erny oelem s a benne tallhat sszes kperny oelem szintn
egyszer uen elt unik a kperny or ol, gy azokat a felhasznl nem
lthatja s nem hasznlhatja.
A fggvny azonban nem semmisti meg a kperny oelemet, gy azt
ks obb, a gtk_widget_show() fggvnnyel vltozatlan formban
jra megjelenthetjk.
A fggvny paramtere az elrejtend o kperny oelemet jelli a mem-
riban.
void gtk_widget_show_all(GtkWidget
*
elem); A fggvny segts-
gvel a kperny oelemet elrejthetjk. Ez a fggvny annyiban k-
lnbzik a mr bemutatott gtk_widget_show() fggvnyt ol, hogy
a megadott kperny oelemen bell tallhat sszes kperny oelemet
egyenknt megjelenti, gy azok akkor is megjelennek a kperny on,
ha el oz oleg nem jelentettk volna meg.
A fggvny paramtere a megjelentend o kperny oelemet jelli a
memriban.
void gtk_widget_hide_all(GtkWidget
*
elem); A fggvny segts-
gvel a kperny oelemet elrejthetjk. A fggvny annyiban kln-
bzik a gtk_widget_hide() fggvnyt ol, hogy a kperny oelemen
bell tallhat sszes kperny oelemet egyenknt elrejti.
A fggvny paramtere az elrejteni kvnt kperny oelemet jelli a
memriban.
A Glade program ltal ksztett, ablakokat ltrehoz fggvnyek a kp-
erny oelemeket egyenknt megjelentik a gtk_widget_show() fggvny
segtsgvel, de nem jelentik meg magt az ablakot, ami az sszes
gtk 2007/10/21 14:22 page 70 #70
70
kperny oelemet hordozza. gy az ablak s a benne tallhat kper-
ny oelemek nem jelennek meg, azonban ha az ablakot megjelentjk a
gtk_widget_show() fggvnnyel, minden kperny oelem megjelenik. Ezt
mutatja be a 181. oldalon tallhat 29. plda.
A Glade hasznlata sorn a kperny oelemek belltsra szolgl tu-
lajdonsgok ablakban az ltalnos flre kattintva a lthat felirattal el-
ltott kapcsolval bellthatjuk, hogy az adott kperny oelem kezdetben
megjelenjen-e. Ha ezzel a kapcsolval a kperny oelem megjelentst ki-
kapcsoljuk, a kperny oelem kezdetben nem jelenik meg, mert a Glade
ltal ksztett fggvny nem kapcsolja be a kperny oelem lthatsgt a
gtk_widget_show() fggvny hvsval.
A GTK+ programknyvtr lehet osget biztost arra is, hogy az egyes
kperny oelemeket rzketlenn tegyk. Az rzketlen kperny oelemeket
a felhasznl nemtudja hasznlni, az ilyen kperny oelemek ugyanis nem
m ukdnek. Az rzketlen kperny oelemek azonban nem rejtettek, azaz a
kperny on tovbbra is lthatk. A programknyvtr rnykolt, szrk-
tett rajzolattal jelzi ugyan a felhasznlnak, hogy a kperny oelemet nem
lehet hasznlni, de az elemet nem tvoltja el.
void gtk_widget_set_sensitive(GtkWidget
*
elem, gboolean
rzkeny); A fggvny segtsgvel a kperny oelemeket rz-
ketlenn tehetjk s az rzketlen kperny oelemek normlis
megjelentst s m ukdst visszallthatjuk.
A fggvny els o paramtere a megvltoztatand kperny oelemet je-
lli a memriban. A msodik paramter meghatrozza, hogy a kp-
erny oelem rzkeny vagy tiltott legyen-e. Ha a msodik paramter
rtke FALSE, a kperny oelem hasznlatt a fggvny tiltja.
A Glade programban, a kperny oelemek belltsra hasznlhat tu-
lajdonsgok ablakban az ltalnos lapon az rzkeny felirattal elltott
kapcsolval bellthatjuk, hogy a kperny oelem kezdetben hasznlhat
legyen-e.
A GTK+ programknyvtr igen fejlett mdon kezeli az egyes kper-
ny oelemek mrett. A programknyvtr ltal ltrehozott kperny oelemek
mrete ltalban ppen akkora, amekkora a helyes megjelenshez s a
hasznlathoz szksges. Mivel a kperny oelemek mrett er oteljesen be-
folysolja a felhasznl ltal beltott megjelensi stlus, a kperny o sz-
mra el ort bet umret s mg jnhny krlmny, a program kszt-
sekor ltalban nem tudhatjuk, hogy mekkora mretben kell az egyes
kperny oelemeket megjelenteni.
Meghatrozhatja s lekrdezheti viszont a kperny oelemek legkisebb
mrett a programoz, ha gy tallja, hogy a kperny oelem alaprtelme-
zett mrete tlsgosan kicsiny. Erre a kvetkez o fggvny hasznlhat.
void gtk_widget_set_size_request(GtkWidget
*
elem, gint
gtk 2007/10/21 14:22 page 71 #71
71
szlessg, gint magassg); A fggvny segtsgvel bellthat-
juk, hogy a kperny oelem mekkora mretet krjen a grakus
fellett ol, azaz bellthatjuk mekkora legyen a kperny oelem leg-
kisebb mrete. A kperny oelem a megadott mretnl nagyobb is
lehet, elg ha a felhasznl egyszer uen nagyobbra lltja az ablakot,
amelyben a kperny oelem megjelenik.
A fggvny els o paramtere a kperny oelemet jelli, a msodik a
szlessget, a harmadik pedig a magassgot adja meg kppontban.
Ha a msodik vagy a harmadik paramter 1, akkor a szlessg
vagy a magassg nem vltozik. Ha pldul a kperny oelemnek csak
a szlessgt akarjuk megvltoztatni, akkor magassgknt 1-et
adunk meg. Ez elg hasznos, hiszen sok kperny oelem tartalmaz
szveget, feliratot, gy a magassgt nem szerencss megvltoztatni.
void gtk_widget_get_size_request(GtkWidget
*
elem, gint
*
szlessg, gint
*
magassg); A fggvny segtsgvel lekr-
dezhetjk, hogy a kperny oelem lehet o legkisebb mrete hny
kppont.
A fggvny els o paramtere a kperny oelemet jelli a memri-
ban, a msodik s harmadik paramtere pedig a memriaterletet,
ahov a szlessget, illetve a magassgot a fggvny elhelyezi. Ha a
magassgra vagy a szlessgre nincs szksgnk, egyszer uen NULL
rtk u mutatt kell tadnunk a megfelel o paramter helyn.
A Glade program tulajdonsgok ablakban az ltalnos lapon megad-
hatjuk a kperny oelem legkisebb szlessgt s magassgt is.
Az ltalnos kperny oelemek kezelsre hasznosak lehetnek mg a k-
vetkez o fggvnyek is.
gboolean gtk_widget_activate(GtkWidget
*
elem); A fggvny se-
gtsgvel a kperny oelemet aktivlhatjuk, mestersgesen olyan
llapotba hozhatjuk, mintha a felhasznl lenyomta volna az Enter
billenty ut a kperny oelemen.
gboolean gtk_widget_is_focus(GtkWidget
*
elem); A fggvny se-
gtsgvel megllapthatjuk, hogy a kperny oelem az ablakn bell
rendelkezik-e a billenty uzetgyels jogval. Az a kperny oelem ame-
lyik rendelkezik a billenty uzetgyels jogval a felhasznl ltal le-
nyomott billenty uk kdjt megkapja feldolgozsra feltve, hogy az
ablak, amelyben helyet foglal ppen aktv.
A fggvny paramtere a vizsglni kvnt kperny oelemet jelli a
memriban, a visszatrsi rtke pedig megadja, hogy rendelkezik-
e a billenty uzetgyels jogval.
gtk 2007/10/21 14:22 page 72 #72
72
void gtk_widget_grab_focus(GtkWidget
*
elem); A fggvny se-
gtsgvel megadhatjuk, hogy melyik kperny oelem kapja meg a bil-
lenty uzetgyels jogt.
Ahhoz, hogy a fggvny paramtere ltal kijellt kperny oelem va-
lban megkapja a felhasznl ltal lenyomott billenty uk kdjt, a
kperny oelemnek kpesnek kell lennie fogadni oket. A legtbb kp-
erny oelem esetben ez a viselkeds alaprtelmezs szerint ssze-
r uen van belltva a beviteli mez ok pldul kpesek fogadni a bil-
lenty ukdokat, a keretek azonban nem , de ezt a tulajdonsgot a
Glade tulajdonsgok ablakban is bellthatjuk a fkuszban lehet
kapcsolval.
A klnfle kperny oelemek megjelense fgghet attl, hogy f-
kuszban vannak-e, de ez a hasznlt stlustl is fgg.
void gtk_widget_set_name(GtkWidget
*
elem, const gchar
*
nv); A fggvny segtsgvel bellthatjuk a kperny oelem
nevt. A nvnek els osorban a megjelens szempontjbl van sze-
repe, a felhasznl ugyanis bellthatja, hogy az egyes nevekhez
milyen megjelens tartozzon. ltalban nem szksges, hogy ezt a
fggvnyt hasznljuk.
const gchar
*
gtk_widget_get_name(GtkWidget
*
elem); A fgg-
vny segtsgvel lekrdezhetjk, hogy a kperny oelemhez milyen
nv tartozik, gy ltalnosan hasznlhat fggvnyeket kszthe-
tnk, amelyek a kperny oelemeket nevknek megfelel o mdon ke-
zelik.
gtk 2007/10/21 14:22 page 73 #73
4. fejezet
A G programknyvtr
A G programknyvtr jnhny olyan fggvnyt s makrt is biztost,
amelyek ksrtetiesen hasonltanak a C programknyvtr szabvnyos
fggvnyeire, de nem pontosan egyeznek meg velk. Ha rszletesen ta-
nulmnyozzuk ezeket az eszkzket, akkor ltjuk, hogy a vltoztatsok-
nak egyrtelm uen a szmtgpek fejl odse az oka. A G programknyvtr
ltalnosabb, sszetettebb eszkzket biztost, mint a C programknyv-
tr, mivel a szmtgpprocesszorok megnvekedett sebessge ma mr
lehet ov teszi, hogy bonyolultabb fggvnyeket rjunk, a mai szmtg-
pek operatv memrijnak mrete lehet ov teszi, hogy nagyobb mem-
riaterleteket foglaljunk s gy tovbb. A G programknyvtr sok fgg-
nyt azrt rdemes hasznlni, mert azok C programknyvtrnl megszo-
kott bosszant aprsgoktl mentesek.
A G programknyvtr igen kiterjedt, sok makrt s fggvnyt bizto-
st az alkalmazsprogramoz szmra. Mi a kvetkez o oldalakon csak a
legfontosabbakat, a legltalnosabban hasznlt eszkzket mutatjuk be.
Az rdekl od o olvas a G programknyvtr dokumentcijban napraksz
informcikat kaphat a tbbi eszkzr ol is.
4.1. A G programknyvtr tpusai
A G programknyvtr bevezet nhny egyszer u tpust, amelyet rdemes
megismernnk, annl is inkbb, mivel a G programknyvtr s a GTK+
programknyvtr fggvnyei egyarnt hasznljk ezeket. A G program-
knyvtr ltal bevezetett alaptpusok a kvetkez ok:
gboolean Logikai rtket hordoz tpus, amelynek rtke TRUE vagy
FALSE lehet.
73
gtk 2007/10/21 14:22 page 74 #74
74
gpointer Tpus nlkli mutat (void
*
). Amikor a gpointer tpust
hasznljuk a felletes szemll onek gy t unik, hogy nem mutatt,
hanem valamilyen ms rtket hasznlunk, fontos azonban tud-
nunk, hogy a hvott fggvnyek ilyen esetben kvetni tudjk a mu-
tatt s meg tudjk vltoztatni a memria tartalmt az adott helyen.
Ezzel az j tpussal a cm szerinti paramtertadshoz hasonlan
kimen o paramtereket hozhatunk ltre a fggvnyek szmra.
gconstpointer Tpus nlkli lland mutat (const void
*
), amelyet
akkor hasznlunk, ha a hvott fggvny fel jelezni szeretnnk, hogy
a mutat kvetsvel elrt memriaterletet nem szabad mdos-
tani.
gchar Ugyanaz, mint a C programozsi nyelv char tpusa, de a G prog-
ramknyvtr (s a GTK+ programknyvtr) legtbb fggvnye ezt a
tpust hasznlja, ezrt szerencss, ha mi is ezt hasznljuk.
Meggyelhet o, hogy a G programknyvtr jnhny egyszer u C t-
pust tnevez amelyet az ltalunk ksztett alkalmazsban k-
nyelmi okokbl neknk is kvetnnk kell.
guchar Ugyanaz, mint unsigned char.
gint Ugyanaz, mint a int.
guint Ugyanaz, mint a unsigned int.
gshort Ugyanaz, mint a short.
gushort Ugyanaz, mint az unsigned short.
glong Ugyanaz, mint a long.
gulong Ugyanaz, mint a unsigned long.
gint8 El ojeles egsz tpus, amely garantltan pontosan 8 bites, rtke
mindig 128 s 127 kz esik.
guint8 El ojel nlkli egsz tpus, amely garantltan 8 bites, rtke min-
dig 0 s 255 kz esik.
gint16 El ojel nlkli 16 bites egsz, amelynek rtke mindig 32768 s
32767 kz esik.
guint16 El ojel nlkli 16 bites egsz, amelynek rtke mindig 0 s 65535
kz esik.
gint32 El ojeles 32 bites egsz, amelynek rtke mindig 2147483648 s
2147483647 kz esik.
gtk 2007/10/21 14:22 page 75 #75
75
guint32 El ojel nlkli egsz, amelynek rtke mindig 0 s 4294967295
kz esik.
gint64 El ojeles 64 bites egsz, amelynek rtke mindig
9223372036854775808 s 9223372036854775807 kz esik. Ez a t-
pus csak akkor elrhet o, ha a C fordt tmogatja a long long
int tpust, de mivel a C programozsi nyelv j szabvnyai ezt
ktelez ov teszik, a G programknyvtr dokumentcija szerint
minden rendszeren hasznlhatjuk a gint64 tpust.
guint64 El ojel nlkli 64 bites egsz, amelynek rtke mindig 0 s
18446744073709551615 kz esik. Ez igen nagy szm, ha nem elg,
akkor viszont baj van.
gfloat Ugyanaz, mint a C programozsi nyelv float tpusa.
gdouble Ugyanaz, mint a double tpus.
gsize El ojel nlkli 32 bites egsz, amely a klnfle egyszer u s ssze-
tett tpusok mretnek trolsra kszlt.
gssize El ojeles 32 bites egsz, amely klnfle egyszer u s sszetett t-
pusok mretnek trolsra kszlt. Mivel ez a tpus el ojeles, k-
pes negatv mretek trolsra is, vagyis nem csak mretek hanem
klnfle hibakdok trolsra is hasznlhat (hiszen nyilvnval,
hogy semminek nem lehet negatv a mrete).
A klnfle tpusok ltal hordozott legnagyobb s legkisebb rtkek
makrknt is elrhet ok. A makrk neve logikusan kvetkezik a tpusok
nevb ol: G_MININT, G_MAXINT, G_MAXUINT, G_MINSHORT, G_MAXSHORT,
G_MAXUSHORT, G_MINLONG, G_MAXLONG, G_MAXULONG, G_MININT8,
G_MAXINT8, G_MAXUINT8, G_MININT16, G_MAXINT16, G_MAXUINT16,
G_MININT32, G_MAXINT32, G_MAXUINT32, G_MININT64, G_MAXINT64,
G_MAXUINT64, G_MAXSIZE, G_MINFLOAT, G_MAXFLOAT, G_MINDOUBLE,
G_MAXDOUBLE.
4.2. Az ltalnos cl makrk
A G programknyvtr ltalnos cl makri kzl a legfontosabbak a
kvetkez ok.
G_OS_WIN32 Ez a makr akkor ltezik, ha a programot a Windows
rendszerek valamelyikn fordtjuk le, teht a segtsgvel oper-
cis rendszer fgg o programrszeket kszthetnk, olyan sorokat,
amelyek csak Windows rendszeren kerlnek a programba, vagy
csak Windows rendszeren nem kerlnek a programba (#ifdef s
#ifndef el ofeldolgoz parancsok).
gtk 2007/10/21 14:22 page 76 #76
76
G_OS_BEOS E makr csak akkor ltezik, ha a programunkat BeOS ope-
rcis rendszeren fordtjk le.
G_OS_UNIX Ez a makr csak akkor ltezik, ha a programunkat a szmos
UNIX vltozat valamelyikn fordtjk.
G_DIR_SEPARATOR Az a karakter, amely az adott opercis rendszeren a
knyvtrnevek elvlasztsra szolgl (/ vagy \).
G_DIR_SEPARATOR_S A knyvtrnevek elvlasztsra szolgl bet u ka-
rakterlncknt ("/" vagy "\").
G_IS_DIR_SEPARATOR(c) A makr igaz rtket ad vissza, ha a param-
terknt tadott karakter az adott opercis rendszeren a knyvtr-
nevek elvlasztsra hasznlatos.
TRUE A logikai igaz rtk.
FALSE A logikai hamis rtk.
MIN(a, b) Ez a makr a kt szm kzl a kisebbet adja vissza.
MAX(a, b) A makr a kt szm kzl a nagyobbat adja vissza.
ABS(a) A szm abszolt rtke.
CLAMP(x, alacsony, magas) A makr a hrom szm kzl az els o r-
tkt adja vissza, de csak akkor, ha az az als s a fels o hatr kz
esik, klnben magt az als, illetve fels o hatrt (termszetesen at-
tl fgg oen, hogy a szm melyik oldalon lg ki a megadott tarto-
mnybl).
4.3. A hibakeresshez hasznlhat eszkzk
A G programknyvtr jnhny olyan eszkzt is biztost, amelyek segtik
a programhibk feldertst s kijavtst. A kvetkez o felsorols ezek
kzl az eszkzk kzl csak azokat mutatja be, amelyek hasznlatt
knny u megtanulni s amelyeket az Interneten felelhet o programokban
sokszor hasznlnak. Mindenkppen javasolhat ezen eszkzk haszn-
lata, hiszen a segtsgkkel viszonylag kevs munka befektetsvel na-
gyon megknnythetjk a hibakeresst a programjainkban.
g_assert(kifejezs) A programhibk feldertsre igen kit un oen
hasznlhat ez a makr. A makr megvizsglja, hogy a paramter-
knt megadott kifejezs igaz logikai rtket ad -e. Ha igen, a prog-
ram futsa zavartalanul folytatdik, ha nem, akkor egy hibazenet
gtk 2007/10/21 14:22 page 77 #77
77
jelenik meg a szabvnyos hibacsatornn s a program futsa meg-
szakad. A hibazenetben a makr pontos helye s maga a kifejezs
is megjelenik, gy azonnal lthatjuk, hogy mi okozta a problmt.
Ha a makr helyn a G_DISABLE_ASSERT makr ltezik, a lefor-
dtott programbl a hibaellen orzs kimarad, sem a program m-
rett nem nveli, sem a program futst nem lasstja. A prog-
ram vgs o, kiprblt vltozatban teht rdemes ltrehoznunk a
G_DISABLE_ASSERT makrt, hogy ezt a hibakeres o eszkzt kihagy-
juk.
A g_assert() makrt ltalban a fggvnyek elejn hasznljuk,
hogy ellen orizzk a paramterek rtkt, azaz megfogalmazzuk az
ltalunk rt programrszek helyes futsnak el ofeltteleit. Ha a
program megfelel o pontjain a megfelelel o ellen orzseket elhelyezzk
a hibakeress sokkal egyszer ubb vlik, de termszetesen csak ak-
kor, ha nem a hiba jelentkezsekor kezdjk el berni a fggvnyek
elejre az el ofelttelek ellen orzst, hanem akkor, amikor a fggv-
nyeket megalkotjuk.
g_assert_not_reached() A makr hibazenetet r a szabvnyos hiba-
csatornra, majd megszaktja a program futst. A makr haszn-
lata megegyezik a g_assert() makr hasznlatval, azzal a k-
lnbsggel, hogy ennek a makrnak nincsen paramtere.
g_return_if_fail(kifejezs) A makr gyelmeztet o zenetet r a
szabvnyos hibacsatornra s befejezi a fggvny vgrehajtst a
return segtsgvel, ha a megadott kifejezs hamis logikai rt-
ket kpvisel. Ezt a makrt csak olyan fggvnyben hasznlhatjuk,
amelynek visszatrsi tpusa void.
g_return_val_if_fail(kifejezs,rtk) A makr gyelmeztet o
zenetet r a szabvnyos hibacsatornra s befejezi a fggvny
vgrehajtst a return segtsgvel, ha a megadott kifejezs ha-
mis logikai rtket kpvisel. A makr msodik paramtereknt
megadott kifejezs meghatrozza a visszatrsi rtket.
g_return_if_reached() A makr gyelmeztet o zenetet r a szabv-
nyos hibacsatornra s befejezi a fggvny vgrehajtst.
g_return_val_if_reached(rtk) A makr gyelmeztet o zenetet r
a szabvnyos hibacsatornra s befejezi a fggvny vgrehajtst.
A makr paramtere meghatrozza a visszatrsi rtket.
g_message(formtumszveg, ...) A makr segtsgvel zeneteket
jelenthetnk meg a szabvnyos hibacsatornn. A makr gondos-
kodik arrl, hogy az zeneteket azonnal megjelenjenek, gy nem kell
hvnunk a fflush() fggvnyt.
gtk 2007/10/21 14:22 page 78 #78
78
A makr argumentumai a printf() knyvtri fggvny argumen-
tumaival egyeznek meg, az ott megszokott mdon hasznlhatjuk a
formtumszveget a kirt szveg formtumnak meghatrozsra.
g_warning(formtumszveg, ...) A makr a g_message() makr-
hoz hasonlkppen m ukdik, de nem egyszer u zenetek, hanem
gyelmeztetsek kirsra hasznljuk. A makr a kirt szveg mel-
lett jelzi azt is, hogy gyelmeztetsr ol van sz, amely nem kritikus
ugyan, de hibs m ukdsre utal.
g_critical(formtumszveg, ...) A makr a g_message() s a
g_warning() makrhoz hasonlkppen m ukdik, de kritikus hi-
bazenetek kirsra hasznljuk.
4.1. bra. A programhibt jelz o ablak
Amikor az alkalma-
zs futst megsza-
ktjuk, a GTK+ prog-
ramknyvtr egy ab-
lakot jelent meg a
kperny on ennek jel-
zsre. Ezt az abla-
kot lthatjuk a 4.1.
brn. Amint ltjuk
az ablakban kivlaszt-
hatja a felhasznl,
hogy bezrja-e a prog-
ramot, jraindtja azt vagy hibajelentst r a fejleszt oknek.
Ha a programot bezrjuk a program egyszer uen kilp, ha azonban a
programot jraindtjuk, a program ablaka jra megjelenik a kperny on.
Ez a lehet osg azonban komoly flrertseket eredmnyezhet, ha a prog-
ramot nem teleptettk a szmtgpre. Amikor ugyanis a program j-
raindtst kezdemnyezzk a bal szls o nyomgomb lenyomsval, a
programunk teleptett vltozata indul el. Ha teht a programot a mdo-
sts utn nem teleptjk, hanem helyben indtjuk el, akkor a prog-
ramhiba jelzse utn mr a teleptett vltozat indul el. A tapasztalat azt
mutatja, hogy ltalban ez a jelensg ll az el oszr nem m ukdik, aztn
minden rendben van jelleg u hibk mgtt.
Ha az ablak jobb oldali nyomgombjval a hibajelents feladsa mel-
lett dntnk, megjelenthetjk a hiba rszletes lerst, ami egy kln
ablakban t unik fel. Ezt az ablakot mutatja be a 4.2. bra.
A hiba rszletes lerst ad ablak kzps o rszn lthat szveges le-
rsban nem knny u kiigazodni, de az ott olvashat informcik nagy-
mrtkben megknnythetik a hiba behatrolst. A listbl megtudhat-
juk, hogy milyen fggvnyhvsok voltak rvnyben a hiba bekvetkez-
tekor, azaz melyik fggvnyek hivsa okozta a hibt. Klnsen hasznos
gtk 2007/10/21 14:22 page 79 #79
79
4.2. bra. A programhiba rszletes lersa
ez az informci akkor, ha a hibt nem a hibakeres o makrk valamelyik
vltotta ki, amikor a programhiba ratlanul kvetkezett be.
4.4. A dinamikus memriakezels
A G programknyvtr nhny eszkze memriafoglalsra s a foglalt me-
mria felszabadtsra szolgl. Fontos, hogy ismerjk ezeket a fggv-
nyeket, hiszen egyrszt egszen biztosan szksgnk lesz a programja-
inkba rjuk, msrszr ol viszont a G programknyvtr s a GTK+ prog-
ramknyvtr fggvnyei is ezeket az eszkzket hasznljk a dinamikus
memriakezelsre.
A C programozsi nyelv szabvnyos programknyvtrban tallhat
memriafoglal fggvnyekkel malloc() , realloc() szemben a G
programknyvtr hasonl clokra szolgl fggvnyei g_malloc() ,
g_realloc() soha nem adnak vissza NULL rtket. Ha a memriafog-
lals nem jr sikerrel, a G programknyvtr fggvnyei megszaktjk a
program futst, de nem adnak vissza NULL rtk u mutatt. Ennek meg-
felel oen nem szksges a visszatrsi rtket ellen oriznnk. (Lteznek
viszont a g_try_malloc() s a g_try_realloc() fggvnyek, amelyek
problma esetn szintn NULL rtket adnak vissza.)
g_new(tpus, darabszm) A makr segtsgvel memrit foglalha-
tunk adott tpus adatszerkezetek trolsra. A makr els o para-
mtere az adott tpus neve, a msodik paramtere pedig megha-
trozza, hogy hny darab elemet szeretnnk elhelyezni a lefoglalt
memriaterleten. A makr visszatrsi rtknek tpusa az els o
paramter ltal meghatrozott tpust jell o mutat.
gtk 2007/10/21 14:22 page 80 #80
80
Nyilvnval, hogy ez a makr a C++ nyelv new kulcsszavhoz hason-
lan hasznlhat memriaterletek foglalsra. Mivel makrrl van
sz, a szerz onek alkalma volt tpust fogadni paramterknt (szveg-
szer u paramterbehelyettests), ezrt valban knyelmesen hasz-
nlhat eszkzr ol van sz.
g_new0(tpus, darabszm) Ugyanaz, mint a g_new() makr, de a
foglalt memriaterletet 0 rtk u bjtokkal tlti fel, miel ott vissza-
adn a memriacmet.
gpointer g_malloc(gulong mret); A fggvny m ukdsben ha-
sonlt a malloc() knyvtri fggvnyhez, azaz a paramternek
megfelel o mret u memrit lefoglalja, majd visszaadja az els o fog-
lalt memriabjt cmt, azonban ahogyan azt mr emltettk a
g_malloc() soha nem ad vissza NULL rtk u mutatt.
gpointer g_malloc0(gulong mret); Ugyanaz, mint a g_malloc()
, de a lefoglalt memriaterletet 0 rtk u bjtokkal tlti ki.
gpointer g_realloc(gpointer memria, gulong mret); A fgg-
vny hasonlt a malloc() knyvtri fggvnyhez, azaz a megadott
cmen tallhat dinamikusan foglalt memriaterlet mrett a meg-
adott mret ure egszti ki. A fggvny ltal visszaadott mutat nem
felttlenl egyezik meg az els o argumentumknt megadott muta-
tval, a fggvny ugyanis szksg esetn tmsolja az alkalmazs
adatterlett egy j memriacmre.
A g_realloc() els o argumentuma lehet NULL rtk u is, ekkor a
fggvny felttelezi, hogy mg nem foglaltunk memriaterletet s
gy a viselkedse a g_malloc() fggvny viselkedshez vlik ha-
sonlatoss.
void g_free(gpointer memria); A fggvny segtsgvel a lefog-
lalt dinamikus memriaterletet szabadthatjuk fel. A g_free() a
free() knyvtri fggvnnyel szemben vdett a NULL rtk u muta-
tkkal szemben.
A bemutatott fggvnyek segtsgvel a dinamikus memriafoglals s
felszabadts igen egyszer u s viszonylag biztonsgos, ezrt mindenkp-
pen javasolhat, hogy a C programknyvtrok hasonl fggvnyei helyett
ezeket hasznljuk.
4.5. A karakterlncok kezelse
A C programknyvtr nem biztost tl sok eszkzt a karakterlncok keze-
lsre, radsul a biztostott fggvnyeknek is van nhny hinyossga.
gtk 2007/10/21 14:22 page 81 #81
81
A C programknyvtr karakterlncokat kezel o fggvnyei nem vdet-
tek a NULL rtk u mutatk ellen, azaz ha a fggvnyeknek ilyen muta-
tt adunk, a program futsa azonnal megszakad. Ez klnsen kezd o
programozk szmra meglehet osen nehzz s veszlyess teheti a
fggvnyek hasznlatt. A G programknyvtr karakterlncok kezel-
sre alkalmas fggvnyek ugyanakkor vdettek a NULL rtk u mutatk
ellen. A vdelem nyilvnvalan lasstja a program futst, hiszen a hvott
fggvnyeknek a paramterknt tadott mutatkat a hasznlatuk el ott
ellen oriznik kell, de ma mr a legtbb esetben olyan gyors processzoro-
kat hasznlunk, hogy az a tbbletmunka nem okoz jelent os lassulst a
program futsban.
A C programknyvtr msik nagy hinyossga az, hogy a karakterln-
cokat kezel o fggvnyek csak a 8 bites karakterbrzolst tmogatjk.
A mai opercis rendszerek s alkalmazsok a tbbnyelv u m ukds r-
dekben ltalban Unicode kdolst hasznlnak, amelyet a C program-
knyvtr nem tmogat. A G programknyvtr karakterlncokat kezel o
fggvnyei az Unicode szabvny UTF-8 vltozatt hasznljk a karakter-
brzolsra. Az UTF-8 az Unicode legelterjedtebb vltozata, a segtsgvel
knnyen kezelhetjk a magyar nyelv karaktereit is. Mivel maga a GTK+
programknyvtr is ezeket a fggvnyeket hasznlja, a GTK+ program-
knyvtr segtsgvel ksztett grakus felhasznli fellet maradktala-
nul tmogatja a magyar nyelvet.
A karakterlncokat kezel o fggvnyek kzl nhny dinamikusan fog-
lalt memrit hasznl. Ezek a fggvnyek termszetesen a g_malloc()
fggvnnyel foglalnak memriaterletet, amelyet a g_free() fgg-
vnnyel szabadthatunk fel.
4.5.1. A karakterlncok kezelse egyszer uen
A G programknyvtr a karakterlncok kezelsre ktfle eszkzt is biz-
tost. Az egyszer ubb eszkztr olyan fggvnyeket tartalmaz, amelyek a
C programknyvtrhoz hasonlan egyszer u, 0 rtkkel lezrt karakterso-
rozatokat hasznl a karakterlncok trolsra. Ezek a fggvnyek para-
mterknt s visszatrsi rtkknt gchar tpus mutatkat hasznlnak.
Az eszkztr legfontosabb fggvnyei a kvetkez ok.
gchar
*
g_strdup(const gchar
*
szveg); A fggvny az strdup()
knyvtri fggvnyhez hasonlkppen m ukdik, azaz lemsolja a
paramterknt kapott karakterlncot egy dinamikusan foglalt me-
mriaterletre s visszaadja a lefoglalt memriaterlet cmt.
A g_strdup() fggvny azonban az strdup() fggvnnyel ellentt-
ben vdett a NULL rtk u mutatval szemben, ha ilyen mutatt kap,
a visszaadott mutat szintn NULL rtket lesz.
gtk 2007/10/21 14:22 page 82 #82
82
gchar
*
g_strndup(const gchar
*
szveg, gsize mret); A fgg-
vny dinamikusan foglalt memriaterletre msolja a megadott ka-
rakterlncnak legfeljebb a msodik paramter ltal meghatrozott
szm karaktert. A fggvny mindenkppen lezrja 0 karakterrel
a visszaadott cmen tallhat karakterlnsot, akkor is, ha emiatt a
msodik paramternl eggyel tbb memriabjtot kell lefoglalnia.
A g_strndup() vdett a NULL rtk u mutatk ellen, ha ilyet kap a
visszatrsi rtk szintn NULL rtk u lesz.
gchar
*
g_strnfill(gsize mret, gchar karakter); A fggvny a
megfelel o mret u memriaterletet foglalja, majd elhelyez benne egy
adott mret u karakterlncot, amely egyforma karakterekb ol ll.
gchar
*
g_stpcpy(gchar
*
cl, const char
*
forrs); A fggvny
a forrsterleten tallhat karakterlncot lemsolja a clterletre
s visszaadja a clterletre msolt karakterlncot lezr nulla r-
tk u bjt cmt, hogy a karakterlncot knnyen b ovthessk.
gchar
*
g_strstr_len(const gchar
*
ebben, gssize hossz,
const gchar
*
ezt); A fggvny az adott karakterlncban legfel-
jebb az adott hosszig keresi a msodik karakterlncot. A fggvny
visszatrsi rtke a megtallt karakterlnc vagy NULL, ha a
karakterlnc nem tallhat.
gchar
*
g_strrstr(const gchar
*
ebben, const gchar
*
ezt);
Karakterlnc keresse karakterlncban a karakterlnc vgr ol
indulva. A fggvny visszatrsi rtke a megtallt karakterlnc
els o bjtjra mutat vagy NULL, ha a karakterlnc nem tallhat.
gchar
*
g_strrstr_len(const gchar
*
ebben, gssize mret,
const gchar
*
ezt); Karakterlnc keresse jobbrl a mret
korltozsval.
gboolean g_str_has_prefix(const gchar
*
szveg, const
gchar
*
elotag); A fggvny igaz rtket ad vissza, ha az
els o paramterrel jelzett karakterlnc a msodik paramterrel
jelzett karakterlnccal kezd odik.
gboolean g_str_has_suffix(const gchar
*
szveg, const
gchar
*
vgzods); A fggvny igaz rtket ad vissza, ha az
els o paramterrel jelzett karakterlnc a msodik paramterrel
jelzett karakterlnccal vgz odik.
gchar
*
g_strdup_printf(const gchar
*
formtum, ...); Ez a ki-
t un oen hasznlhat fggvny a printf() fggvnyhez hasonl pa-
ramtereket fogad s formzott karakterlncok kiratsra hasznl-
gtk 2007/10/21 14:22 page 83 #83
83
hat. A printf() fggvnnyel ellenttben azonban nem a szabv-
nyos kimenetre rja a fggvny a karaktereket, hanem az ltala fog-
lalt memriaterletre, amelyet a hasznlat utn fel kell szabadta-
nunk a g_free() fggvny segtsgvel.
Klnsen hasznos e fggvny akkor, ha grakus fellettel ltjuk
el a programunkat, hiszen ekkor az zeneteket nem a szabvnyos
kimenetre rjuk, hanem elhelyezzk a memriban, hogy a gra-
kus fellet fggvnyeivel megjelenthessk valamelyik kperny ole-
men bell.
Ha a programunkba csak a glib.h llomnyt tltttk be s
nem tltttk be pldul a gtk.h llomnyt , szksges lehet a
glib/gprintf.h llomny betltsre.
gint g_printf(gchar const
*
formtum, ...); A fggvny a
printf() szabvnyos knyvtri fggvnnyel megegyez o m uk-
ds u.
gint g_fprintf(FILE
*
fjl, gchar const
*
formtum, ...); A
fggvny az fprintf() szabvnyos knyvtri fggvnnyel meg-
egyez o m ukds u.
gint g_sprintf(gchar
*
memria, gchar const
*
formtum,
...); A fggvny az sprintf() szabvnyos knyvtri fggvnnyel
megegyez o m ukds u.
gint g_snprintf(gchar
*
memria, gulong mret, gchar const
*
formtum, ...); A fggvny az snprintf() szabvnyos knyv-
tri fggvnnyel megegyez o m ukds u.
gchar
*
g_strreverse(gchar
*
szveg); A fggvny segtsgvel a
karakterlnc bjtjainak sorrendjt az ellenkez ojre fordthatjuk.
gchar
*
g_strchug(gchar
*
szveg); A fggvny segtsgvel a ka-
rakterlnc elejn tallhat szkzket, tabultor karaktereket s
hasonl fehr karaktereket tvolthatjuk el. A fggvny a megfe-
lel o szm bjttal a memria eleje fel mozgatja a karakterlncot,
de ami az elejn tallhat rtktelen karakterek szmval rvidebb
lesz. A fggvny nem vltoztatja meg a karakterlnc trolsra eset-
leg lefoglalt dinamikus memria mrett.
A fggvny paramtere a megvltoztatand karakterlncot jelli a
memriban, a visszatrsi rtke pedig pontosan megegyezik a pa-
ramterrel.
gchar
*
g_strchomp(gchar
*
szveg); A fggvny nagyon hasonlt a
g_strchug() fggvnyhez, de nem a szveg elejn, hanem a vgn
tallhat rtktelen karaktereket tvoltja el.
gtk 2007/10/21 14:22 page 84 #84
84
g_strstrip(szveg) Ez a makr a karakterlnc elejn s vgn ta-
llhat rtktelen karaktereket is eltvoltja a g_strchug() s a
g_strchomp() fggvnyek hvsval.
gchar
*
g_strescape(const gchar
*
forrs, const gchar
*
kivtelek); A fggvny segtsgvel a karakterlncban ta-
llhat klnleges karaktereket az ltalnosan hasznlt klnleges
jellsre cserlhetjk le. A fggvny az jsor karaktert a \n kt-
karakteres jelre cserli, a tabultor karaktert a \t jellel cserli
fel s gy tovbb. A fggvny a karakterlncrl msolatot kszt
egy dinamikusan foglalt memriaterletre, hiszen a csere sorn a
karakterlnc hossza nvekedhet.
A fggvny els o paramtere a karakterlncot jelli a memriban, a
msodik paramtere pedig egy karakterlncot, ami kivtelknt fel-
sorolja azokat a karaktereket, amelyek klnlegesek ugyan, mgis
mdosts nlkl msolandk. A fggvny visszatrsi rtke a ka-
rakterln msolatt tartalmaz dinamikusan foglalt memriater-
letet jelli a memriban.
gchar
*
g_strcompress(const gchar
*
forrs); A fggvny segt-
sgvel a klnleges jellssel elltott karaktereket alakthat-
juk egyszer u formjukra. Ennek a fggvnynek a m ukdse a
g_strescape() fggvny m ukdsnek ellentettje.
A fggvny els o paramtere az talaktand karakterlncot jelli a
memriban, a visszatrsi rtke pedig a dinamikusan foglalt me-
mriaterletet jelli, ahova a fggvny az egyszer ustett karakter-
lncot elhelyezte.
gchar
*
g_strcanon(gchar
*
szveg, const gchar
*
rvnyes_karakterek, gchar helyettesto); A fggvny
az els o paramtervel jelzett karakterlncban kicserli mindazokat
a karaktereket, amelyek nem szerepelnek a msodik paramte-
rvel jelzett karakterlncban a harmadik paramterknt tadott
karakterre.
A fggvny visszatrsi rtke az els o paramtervel egyezik meg. A
fggvny nem kszt msolatot a karakterlncrl, hiszen a karak-
terlnc hossza nem vltozik.
gchar
**
g_strsplit(const gchar
*
szveg, const gchar
*
hatrolszveg, gint n); A fggvny feldarabolja az els o
paramtere ltal jelzett karakterlncot a msodik paramtere ltal
jelzett karakterlnc mentn. A msodik paramter ltal jelzett
karakterlnc teht a mez oelvlaszt, amely lehet egy vagy tbb
karakteres. Ha a msodik paramter ltal jelzett karakterlnc
gtk 2007/10/21 14:22 page 85 #85
85
pldul a "\t ", akkor a mez oket egy tabultor karakter s az
utna kvetkez o szkz vlasztja el.
A fggvny a darabols sorn ltrehozott rszeket dinamikusan fog-
lalt memriaterleteken helyezi el, a cmket egy szintn dinami-
kus memriaterleten elhelyezett tmbbe teszi, amelynek vgt
NULL rtk u mutat jelli. A visszatrsi rtk, a tmb cme te-
ht ppen olyan adatszerkezetet jell, amilyen a szabvny szerint
a main() fggvny msodik paramtere.
Ha a fggvny els o paramtere 0 hosszsg karakterlncot jell, a
visszatrsi rtkknt tadott tmb els o eleme NULL rtk u, azaz az
res karakterlncot az res tmbbel jelljk.
A fggvny harmadik paramtervel a feldarabols utn kapott
rszlncok szmt korltozhatjuk. Ha az elemek szma a harma-
dik paramternl nagyobb lenne, az utols rszlnc a teljes fenn-
marad karakterlncot tartalmazni fogja. Ha nem akarunk korltot
megadni a rszlncok szmra nzve, harmadik paramterknt 1-
nl kisebb rtket kell megadnunk.
A fggvny visszatrsi rtke ltal jellt tmbt knnyedn vgig-
jrhatjuk egyszer u ciklussal, megsemmistsre a szvegrszek s
a tmb trolsra hasznlt memriaterlet felszabadtsra pe-
dig hasznlhatjuk a g_strfreev() fggvnyt, amelynek formja a
kvetkez o:
void g_strfreev(gchar
**
karakterlnc_tmb); A fggvny segt-
sgvel felszabadthatjuk a dinamikus memriaterleteket, ame-
lyekre az els o paramterknt tadott mutatval jellt tmb elemei
mutatnak, valamint magnak a tmbnek a trolsra hasznlt,
szintn dinamikusan foglalt memriaterletet.
Fontos, hogy mind a tmbnek, mind az elemeivel jellt memriate-
rleteknek dinamikusan foglalt memriaterleten kell elhelyezked-
nik, ellenkez o esetben a program futsa azonnal megszakad.
gchar
**
g_strsplit_set(const gchar
*
szveg, const gchar
*
hatroljelek, gint n); A fggvny hasznlata s m ukdse
megegyezik a g_strsplit() fggvny hasznlatval s m ukds-
vel azzal a klnbsggel, hogy ez a fggvny mindig egy karakteres
mez oelvlaszt jeleket hasznl. A fggvny msodik paramtere
teht olyan karakterlncokat jell, amely tartalmazza mindazokat
a karaktereket, amelyeket hatroljelknt akarunk hasznlna. Ha
a msodik paramter ltal jelzett karakterlnc pldul a "\t ",
akkor a mez oket a tabultor karakter vagy a szkz vlasztja el.
gchar
*
g_strconcat(const gchar
*
szveg, ...); E fggvny se-
gtsgvel karakterlncokat msolhatunk egyms utn. A fggvny
gtk 2007/10/21 14:22 page 86 #86
86
tetsz oleges szm paramtert fogad, melyek azokat a karakterln-
cokat jellik a memriban, amelyeket egyms utn akarunk m-
solni. Az utols paramternek NULL rtk unek kell lennie, ellen-
kez o esetben a ltrehozott karakterlnc vgn memriaszemt jele-
nik meg s a program futsa esetleg memriahibval meg is szakad.
A fggvny visszatrsi rtke egy dinamikusan foglalt memriate-
rletet jell a memriban, ami az egyms utn msolt karakter-
lncokat tartalmazza.
gchar
*
g_strjoin(const gchar
*
elvlaszt, ...); A fggvny
hasznlata s m ukdse megegyezik a g_strconcat() fggvny
hasznlatval s m ukdsvel azzal a klnbsggel, hogy ez a fgg-
vny az egyms utn msolt karakterlncok kz elvlasztjelknt
az els o paramter ltal jellt karakterlncot msolja.
Fontos, hogy ennek a fggvnynek is NULL rtket kell tadnunk
utols paramterknt.
4.5.2. Az Unicode karakterlncok
A szmtstechnika jkori trtnetre igen jellemz o az Unicode szabvny
elterjedt hasznlata, ami lehet ov teszi, hogy a klnfle nemzetek nyel-
veiben hasznlt bet uket s rsjeleket egysgesen kezeljk. A magyar
anyanyelv u felhasznlknak s programozknak valszn uleg nem kell
bizonygatni, hogy milyen fontos a nemzeti karakterkszletek egyszer u s
szabvnyos kezelse, hiszen szmukra a szabvny tbb vtizede megol-
datlan problmra ad megnyugtat megoldst.
Az Unicode szabvny a karakterlncok brzolsra hromfle megol-
dst ajnl. Az UCS32 vltozat minden karakter trolsra 32 bites kd-
szavakat hasznl, gy a szveg trolsra ppen ngyszer akkora me-
mriaterletet hasznl, mint az ASCII kdols. Az UTF-16 vltozat az
eurpai kultra ltal gyakran hasznlt karakterek kdjt 16 biten t-
rolja, a ritkbb karakterek trolsra pedig 32 bitet. Ennek a vltozatnak
a htrnya a bonyolultsga vltoz hosszsg kdszavakat nyilvn
bonyolultabb kezelni, mint az lland hosszsg kdszavakat el onye
pedig az, hogy ugyanaz a szveg kisebb helyen elfrhet.
Az Unicode szabvny harmadik vltozata a legelterjedtebb UTF-8, ami
gyakorisguktl fgg oen 8, 16 vagy 32 bites kdszavakat rendel a karak-
terekhez. E vltozat nagy el onye a takarkossg mellett az, hogy az
angol nyelv u szveg karaktereihez ppen azokat a kdszavakat rendeli,
amelyeket az ASCII kdols is hasznl. Az angol nyelv u ASCII kdols
szveg teht egyben Unicode szveg is.
A G programknyvtr teljes mrtkben tmogatja az UTF-8 kdolst s
az UTF-16 s UCS32 kdolsa szvegeket talaktsra is biztost esz-
kzket. A GTK+ programknyvtr minden fggvnye az UTF-8 kdolst
gtk 2007/10/21 14:22 page 87 #87
87
hasznlja, gy az magyar nyelv u szveg kezelse nem jelenthet problmt
feltve persze, hogy a programoz a megfelel o fggvnyeket hasznlja a
programjban.
Az UTF-8 kdols kapcsn mg azt rdemes megemltennk, hogy a
GNU C fordt helyesen kezeli az ilyen kdolssal ksztett karakterlnc-
llandkat a programforrsban, ha teht a szvegszerkeszt o programunk
ilyen kdolst hasznl, akr magyar nyelv u kezetes szvegeket is elhe-
lyezhetnk a kett os idz ojelek kzt. Termszetesen nem szerencss ke-
zetes karaktereket hasznlni a forrsprogramban, de lehetsges.
A G programknyvtr az Unicode karakterek kezelsre a gunichar t-
pust hasznlja. A gunichar olyan 32 bites tpus, ami brmelyik Unicode
karakter trolsra hasznlhat, a 32 bites rtk bizonyos kombincija
azonban nem megengedett, nem kdol rvnyes Unicode karaktert. A G
programknyvtr gunichar tpusnak kezelsre a kvetkez o fggvnye-
ket hasznljuk elterjedten:
gboolean g_unichar_validate(gunichar c); A fggvny igaz rt-
ket ad vissza, ha a paramterknt tadott rtk rvnyes Unicode
karakter.
gboolean g_unichar_isalnum(gunichar c); Igaz rtket ad vissza,
ha a paramterknt tadott rtk bet ut vagy szmot kdol.
gboolean g_unichar_isalpha(gunichar c); Igaz rtket ad vissza,
ha a paramterknt tadott rtk bet ut kdol.
gboolean g_unichar_iscntrl(gunichar c); Igaz rtket ad vissza,
ha a paramterknt tadott rtk vezrl okarakter kdja.
gboolean g_unichar_isdigit(gunichar c); Igaz rtket ad vissza,
ha a paramterknt tadott rtk szmjegy kdja.
gboolean g_unichar_isgraph(gunichar c); Igaz rtket ad vissza,
ha a paramterknt tadott rtk olyan karakter kdja, ami nyom-
tathat, de nem szkz.
gboolean g_unichar_islower(gunichar c); Igaz rtket ad vissza,
ha a paramterknt tadott rtk kisbet u kdja.
gboolean g_unichar_isprint(gunichar c); Igaz rtket ad vissza,
ha a paramterknt tadott rtk nyomtathat karakter kdja. Ez a
fggvny igaz rtket ad a szkz kdjra.
gboolean g_unichar_ispunct(gunichar c); Igaz rtket ad vissza,
ha a paramterknt tadott rtk rsjel vagy ms szimblum kdja.
gtk 2007/10/21 14:22 page 88 #88
88
gboolean g_unichar_isspace(gunichar c); Igaz rtket ad vissza,
ha a paramterknt tadott rtk szkz, tabultor, sorvgjel vagy
hasonl, helyet jell o karakter kdja.
gboolean g_unichar_isupper(gunichar c); Igaz rtket ad vissza,
ha a paramterknt atadott rtk nagybet ut kdol.
gboolean g_unichar_isxdigit(gunichar c); Igaz rtket ad vissza,
ha a paramterknt tadott rtk a 16-os szmrendszer szmjegye.
gboolean g_unichar_istitle(gunichar c); igaz rtket ad vissza,
ha a paramterknt tadott rtk cmszer u bet u. (Az Unicode szab-
vnyban nem csak kis- s nagybet uk, hanem cmszer u bet uk is
vannak. A cmek szavait ltalban nagybet uvel kezdjk.)
gboolean g_unichar_isdefined(gunichar c); Igaz rtket ad
vissza, ha a paramterknt tadott rtkhez az Unicode szabvny
valamilyen karaktert rendel, ha a paramterknt tadott rtk nem
kihagyott karakter.
gboolean g_unichar_iswide(gunichar c); Igaz rtket ad vissza,
ha a paramterknt tadott rtk olyan karaktert kdol, amely
dupla szlessg u helyet foglal.
gunichar g_unichar_toupper(gunichar c); A paramterknt ka-
pott rtket nagybet us formra alaktva adja vissza.
gunichar g_unichar_tolower(gunichar c); A paramterknt ka-
pott rtket kisbet us formra alaktva adja vissza.
gunichar g_unichar_totitle(gunichar c); A paramterknt t-
adott rtket cmformra kdolva adja vissza.
gint g_unichar_digit_value(gunichar c); A fggvny visszaadja,
hogy a paramterknt kapott rtk ltal kdolt karakter milyen r-
tket kpvisel a tzes szmrendszerben.
gint g_unichar_xdigit_value(gunichar c); Visszaadja, hogy a
paramterknt kapott rtk ltal kdolt karakter milyen rtket
kpvisel a tizenhatos szmrendszerben.
GUnicodeType g_unichar_type(gunichar c); A fggvny vissza-
adja, hogy a paramterknt kapott rtk milyen jelleg u jelentst
hordoz az Unicode szabvny szerint. A fggvny a kvetkez o
kategrikat klnbzteti meg: G_UNICODE_CONTROL, G_UNI-
CODE_FORMAT, G_UNICODE_UNASSIGNED, G_UNICODE_PRIVA-
TE_USE, G_UNICODE_SURROGATE, G_UNICODE_LOWERCASE_LET-
TER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_OTHER_LETTER,
gtk 2007/10/21 14:22 page 89 #89
89
G_UNICODE_TITLECASE_LETTER, G_UNICODE_UPPERCASE_LET-
TER, G_UNICODE_COMBINING_MARK, G_UNICODE_ENCLOSING_MARK,
G_UNICODE_NON_SPACING_MARK, G_UNICODE_DECIMAL_NUMBER,
G_UNICODE_LETTER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNI-
CODE_CONNECT_PUNCTUATION, G_UNICODE_DASH_PUNCTUATION,
G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_FINAL_PUNCTU-
ATION, G_UNICODE_INITIAL_PUNCTUATION, G_UNI-
CODE_OTHER_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION,
G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_MODIFIER_SYMBOL,
G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNI-
CODE_LINE_SEPARATOR, G_UNICODE_PARAGRAPH_SEPARATOR,
G_UNICODE_SPACE_SEPARATOR.
GUnicodeBreakType g_unichar_break_type(gunichar c);
A fggvny visszaadja, hogy a paramterknt tadott r-
tk az Unicode szabvny szerint milyen jelleg u hatro-
ljel. A fggvny a kvetkez o kategrikat klnbzteti
meg: G_UNICODE_BREAK_MANDATORY, G_UNICODE_BREAK_CAR-
RIAGE_RETURN, G_UNICODE_BREAK_LINE_FEED, G_UNI-
CODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_SUR-
ROGATE, G_UNICODE_BREAK_ZERO_WIDTH_SPACE, G_UNI-
CODE_BREAK_INSEPARABLE, G_UNICODE_BREAK_NON_BREAK-
ING_GLUE, G_UNICODE_BREAK_CONTINGENT, G_UNI-
CODE_BREAK_SPACE, G_UNICODE_BREAK_AFTER, G_UNI-
CODE_BREAK_BEFORE, G_UNICODE_BREAK_BEFORE_AND_AFTER,
G_UNICODE_BREAK_HYPHEN, G_UNICODE_BREAK_NON_STAR-
TER, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNI-
CODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_QUO-
TATION, G_UNICODE_BREAK_EXCLAMATION, G_UNI-
CODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NUMERIC, G_UNI-
CODE_BREAK_INFIX_SEPARATOR, G_UNICODE_BREAK_SYMBOL,
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_PREFIX,
G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_COMPLEX_CON-
TEXT, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_UNKNOWN,
G_UNICODE_BREAK_NEXT_LINE, G_UNICODE_BREAK_WORD_JOINER,
G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HAN-
GUL_V_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNI-
CODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HAN-
GUL_LVT_SYLLABLE.
Az Unicode karakterlncok kezelsre a G programknyvtr a szok-
sos, 0 karakterrel lezrt, karaktertmbt hasznlja, paramterknt lta-
lban gchar
*
mutatt adva t a fggvnyeknek. A C nyelvben megszo-
kott karakterlncok teht Unicode karakterlncok is lehetnek, feltve,
hogy a megfelel o kdsorozatot hasznljuk. Mivel a G programknyvtr
gtk 2007/10/21 14:22 page 90 #90
90
az UTF-8 kdolst rszesti el onyben, az ASCII karakterlncok egyben
Unicode karakterlncok is.
Az Unicode karakterlncok kezelsre hasznlt fggvnyek a legtbb
esetben egy egsz szmot is fogadnak, ami megadja, hogy a karakterlnc
hny bjtbl ll. Ha ennek a paramternek a helyn 1-et adunk t, a
fggvnyek a karakterlnc mrett a lezr 0 rtk u bjt alapjn llapt-
jk meg. Az Unicode karakterlncok kezelsre hasznlatos fggvnyek
kzl a legfontosabbak a kvetkez ok:
g_utf8_next_char(mutat); E makr az UTF-8 karakterlnc kvet-
kez o elemnek cmt adja vissza. Mivel az UTF-8 vltoz hosszsg
kdszavakat hasznl a karakterlncon bell, ez a makr elengedhe-
tetlenl fontos, ha a karaktereket vgig akarjuk jrni.
A makr paramtere egy mutat, ami UTF-8 karakterlncot jell, a
visszatrsi rtke pedig szintn egy mutat, ami a kvetkez o karak-
ter elejre mutat. Nem szabad szem el ol tveszteni, hogy az UTF-8
karakterlncon bell nem minden bjthatr jell j karaktert, azaz
a karakterlncon bell tallhat rszlncok nem okvetlenl rv-
nyes UTF-8 karakterlncok.
gunichar g_utf8_get_char(const gchar
*
szveg); A fggvny se-
gtsgvel az UTF-8 karakterlnc els o karakternek kdjt kaphat-
juk meg. A g_utf8_next_char() makr s a g_utf8_get_char()
fggvny segtsgvel az UTF-8 karakterlnc karaktereit bejrhat-
juk.
A fggvny paramtere a karakterlncot jelli a memriban, a
visszatrsi rtke pedig a karakterlnc els o karakternek kdja.
gunichar g_utf8_get_char_validated(const gchar
*
szveg,
gssize mret); A fggvny m ukdsben s hasznlatban
hasonlt a g_utf8_get_char() fggvnyre, de azzal szemben fel
van ksztve hibs UTF-8 karakterlncok kezelsre is.
A fggvny els o paramtere UTF-8 karakterlncok jell a memri-
ban, msodik paramtere pedig a karakterlnc hosszt adja meg
(vagy 1 a 0 rtkkel lezrt karakterlnc esetn).
A fggvny visszatrsi rtke a karakterlnc els o karakternek
kdja vagy negatv hibakd, ha a karakterlnc elejn nem tallhat
rvnyes UTF-8 karakter.
gchar
*
g_utf8_offset_to_pointer(const gchar
*
szveg,
glong n); A fggvny segtsgvel megkereshetjk, hogy az
UTF-8 karakterlnc adott sorszm karaktere pontosan milyen
memriacmen kezd odik.
gtk 2007/10/21 14:22 page 91 #91
91
A fggvny els o paramtere UTF-8 karakterlncot jell a memri-
ban, msodik paramtere pedig megadja, hogy hnyadik karaktert
keressk. A fggvny visszatrsi rtke egy mutat, ami a keresett
sorszm karakter elejt jelli a memriban.
A fggvny a G programknyvtr jabb vltozataiban (2.10) a m-
sodik paramterknt negatv rtket is kpes elfogadni, azaz a se-
gtsgvel visszafel is haladhatunk a szvegben.
glong g_utf8_pointer_to_offset(const gchar
*
szveg, const
gchar
*
karakter); A fggvny segtsgvel megllapthatjuk,
hogy az UTF-8 karakterlnc adott rsze hnyadik karakterhelyre
esik.
A fggvny els o paramtere UTF-8 karakterlncot jell a memri-
ban, a msodik paramtere pedig a karakterlnc valamelyik karak-
ternek elejre mutat. A fggvny visszatrsi rtke megadja, hogy
a msodik paramterknt tadott mutat hnyadik karakterre mu-
tat a karakterlncon bell.
A G programknyvtr jabb vlozata (2.10) lehet ov teszik, hogy a
msodik paramter kisebb legyen, mint az els o paramter. Ilyenkor
a visszatrsi rtk negatv.
gchar
*
g_utf8_prev_char(const gchar
*
karakter); A fggvny
segtsgvel megllapthatjuk, hogy az UTF-8 karakterlncban hol
tallhat az el oz o karakter.
A fggvny paramtere egy UTF-8 karakterlnc belsejbe mutat de
nem felttlenl kell karakter elejre mutatnia , visszatrsi rtke
pedig az el oz o karakter elejt jelzi a memriban.
A fggvnynek termszetesen nem ll mdjban leellen orizni, hogy
a paramterknt tadott mutat el ott folytatdik-e a karakterlnc,
ezrt, ha nem vagyunk vatosak knnyen idegen memriaterletre
tvedhetnk.
gchar
*
g_utf8_find_prev_char(const gchar
*
szveg_eleje,
const gchar
*
karakter); A fggvny m ukdse s hasznlata
hasonlt a g_utf8_prev_char() fggvnyre, de e fggvny kpes
leellen orizni, hogy a karakterlncban van-e az adott karakterlnc
el ott karakter.
A fggvny els o paramtere UTF-8 karakterlncot jell a memri-
ban, msodik paramtere pedig a karakterlncon bellre mutat, de
nem felttlenl kell karakter elejre mutatnia. A fggvny visszat-
rsi rtke a msodik paramter ltal jellt karakter el otti karak-
terre mutat a memriban vagy NULL rtk u, ha nincs ilyen karak-
ter (mert mr a karakterlnc elejre rtnk).
gtk 2007/10/21 14:22 page 92 #92
92
gchar
*
g_utf8_find_next_char(const gchar
*
karakter, const
gchar
*
szveg_vge); A fggvny segtsgvel megkereshetjk
az UTF-8 karakterlnc kvetkez o karaktert.
A fggvny els o paramtere az UTF-8 karakterlnc valamelyik ka-
rakterre mutat br nem okvetlenl kell a karakter els o bjtjra
mutatnia , msodik paramtere pedig a karakterlnc vgt jelli. A
fggvny visszatrsi rtke az els o paramter ltal jellt karakter-
lnc utni karakter els o bjtjt jelli vagy NULL rtk, ha mr nem
tallhat tbb karakter.
glong g_utf8_strlen(const gchar
*
szveg, gssize mret); A
fggvny segtsgvel megllapthatjuk, hogy az UTF-8 karakterlnc
hny karakterb ol ll.
A fggvny els o paramtere UTF-8 karakterlncot jell a memri-
ban, msodik paramtere pedig megadja, hogy a karakterlnc hny
bjtnyi memriaterletet foglal el vagy 1 a 0 rtkkel lezrt ka-
rakterlnc esetben. A fggvny visszatrsi rtke megadja, hogy a
karakterlncban hny karakter tallhat.
gchar
*
g_utf8_strncpy(gchar
*
cl, const gchar
*
forrs,
gsize n); A fggvny az strncpy() szabvnyos knyvtri fgg-
vnyhez hasonlan legfeljebb adott szm karakter msolsra
hasznlhat, de azzal ellenttben az UTF-8 karakterlncban
tallhat karakterek szmt veszi gyelembe.
gchar
*
g_utf8_strchr(const gchar
*
szveg, gssize mret,
gunichar karakter); A fggvny a karakterlncban karaktert
keres o strchr() szabvnyos knyvtri fggvny UTF-8 karakter-
lncok kezelsre tovbbfejlesztett vltozata.
A fggvny els o paramtere UTF-8 karakterlncot jell a memri-
ban, msodik paramtere pedig a karakterlnc mrett adja meg
bjtban vagy 1 a 0 rtkkel lezrt karakterlncok esetben. A fgg-
vny harmadik paramtere megadja, hogy milyen karaktert kere-
snk a karakterlncban.
A fggvny visszatrsi rtke a keresett karakter els o el ofordul-
sra mutat a karakterlncban vagy NULL rtk, ha a karakter nem
tallhat.
gchar
*
g_utf8_strrchr(const gchar
*
szveg, gssize mret,
gunichar karakter); A fggvny m ukdse megegyezik a
g_utf8_strchr() fggvny m ukdsvel, de azzal szemben a ka-
rakter utols el ofordulst jell o mutatt adja vissza, azaz jobbrl
balra keres.
gtk 2007/10/21 14:22 page 93 #93
93
gchar
*
g_utf8_strreverse(const gchar
*
szveg, gssize
mret); A fggvny segtsgvel az UTF-8 karakterlncban
tallhat karakterek sorrendjt ellenttre vltoztathatjuk.
A fggvny els o paramtere UTF-8 karakterlncot jell a memri-
ban, msodik paramtere pedig a karakterlnc hosszt adja meg
bjtban vagy 1 a 0 rtkkel lezrt karakterlnc hasznlata esetn.
A fggvny visszatrsi rtke egy dinamikusan lefoglalt memriate-
rletre mutat, ahol a karakterlnc tallhat mgpedig megfordtva.
gboolean g_utf8_validate(const gchar
*
szveg, gssize
mret, const gchar
**
vge); A fggvny segtsgvel meglla-
pthatjuk, hogy az adott karakterlnc rvnyes UTF-8 karakterlnc-
e, kveti-e a szabvnyt. Mivel a G s a GTK+ programknyvtrak
sok fggvnye, kztk az itt felsorolt fggvnyek is felttelezik, hogy
a kezelt adatterlet rvnyes UTF-8 karakterlncot tartalmaz, ez a
fggvny igen fontos lehet a munknk sorn. ltalban elmondhat-
juk, hogy minden kls o forrsbl szrmaz karakterlncot legalbb
egyszer ellen oriznnk kell ezzel a fggvnnyel.
A fggvny els o paramtere az ellen orizni kvnt karakterlnc elejt
jelli a memriban, a msodik paramtere pedig megadja, hogy
hny bjtnyi helyet foglal a karakterlnc a memriban, esetleg 1
a 0 rtkkel lezrt karakterlnc hasznlata esetn.
A fggvn harmadik paramtere egy mutatt jell a memriban,
ahova a fggvny elhelyezi a karakterlnc vgt jelz o mutatt. Ha a
karakterlncban olyan rsz tallhat, ami nem teljesti a szabvnyt,
a fggvny a harmadik paramterrel jelzett mutatba a balrl sz-
mtott els o rvnytelen karakter cmt helyezi el.
A fggvny visszatrsi rtke TRUE, ha a karakterlnc csak rv-
nyes UTF-8 karaktereket tartalmaz, FALSE, ha a fggvny hibt ta-
llt. Szintn FALSE rtket ad vissza a fggvny, ha a karakterlnc
hosszt megadtuk, de a fggvny a karakterlncot lezr 0 rtket
mg a jelzett hossz elrse el ott megtallta.
gchar
*
g_utf8_strup(const gchar
*
szveg, gssize mret); A
fggvny segtsgvel az UTF-8 karakterlncot nagybet us formra
alakthatjuk.
A fggvny els o paramtere az UTF-8 karakterlncot jelli a me-
mriban, msodik paramtere pedig megadja a karakterlnc m-
rett bjtban vagy 1 a 0 rtkkel lezrt karakterlncok esetben.
A fggvny visszatrsi rtke dinamikus foglalt memriaterletre
mutat, ahol megtallhatjuk a karakterlnc nagybet us formra ala-
ktott msolatt.
gtk 2007/10/21 14:22 page 94 #94
94
gchar
*
g_utf8_strdown(const gchar
*
szveg, gssize mret);
A fggvny segtsgvel az UTF-8 karakterlncot kisbet us formra
alakthatjuk.
A fggvny els o paramtere az UTF-8 karakterlncot jelli a mem-
riban, msodik paramtere pedig megadja a karakterlnc mrett
bjtban vagy 1 a 0 rtkkel lezrt karakterlncok esetben. A fgg-
vny visszatrsi rtke dinamikusan foglalt memriaterletet jell
a memriban, ahol a szveg kisbet us formra alaktott msolatt
tallhatjuk.
gchar
*
g_utf8_casefold(const gchar
*
szveg, gssize
mret); A fggvny segtsgvel az UTF-8 karakterlncot olyan
formra alakthatjuk, ami fggetlen a szvegen belli kis- s
nagybet uk hasznlattl. Erre a m uveletre ltalban azrt van
szksgnk mert a karakterlncokat a kis- s nagybet uk kzti
klnbsg gyelmen kvl hagysval akarjuk sszehasonltani
(esetleg sorba rakni, ami vgs o soron ugyanaz). Ilyenkor mindkt
karakterlncot talaktjuk e fggvnnyel, majd az sszehasonl-
tst elvgezzk a megfelel o fggvnnyel (hasznlhatjuk pldul a
g_utf8_collate() fggvnyt.)
A fggvny els o paramtere az UTF-8 karakterlncot jelli a mem-
riban, msodik paramtere pedig megadja a karakterlnc mrett
bjtban vagy 1 a 0 rtkkel lezrt karakterlncok esetben. A fgg-
vny visszatrsi rtke dinamikusan foglalt memriaterletet jell
a memriban a karakterlnc talaktott msolatval.
gchar
*
g_utf8_normalize(const gchar
*
szveg, gssize
mret, GNormalizeMode zemmd); Az Unicode szabvny szerint
ugyanazt a karakterlncot tbb formban is brzolhatjuk. E
fggvny segtsgvel a karakterlncot alapformjra, egyszer u
megjelensi formjra alakthatjuk. A G programknyvtr do-
kumentcija szerint az sszehasonltsok, rendezsek s egyb
fontos feldolgozsi lpsek el ott rdemes a karakterlncokat alap-
formjukra hozni, hogy az brzols klnbsgei ne befolysoljk
a feldolgozst.
A fggvny els o paramtere az UTF-8 karakterlncot jelli a mem-
riban, a msodik paramtere pedig megadja a karakterlnc mre-
tt bjtban, esetleg 1 a 0 rtkkel lezrt karakterlnc hasznlata
esetn. A fggvny harmadik paramtere megadja, hogy az tala-
ktst hogyan akarjuk elvgezni. Itt a kvetkez o llandk egyikt
hasznlhatjuk:
G_NORMALIZE_DEFAULT Ennek az llandnak a hatsra a fgg-
vny az alapformra alaktst gy vgzi el, hogy az lehet oleg ne
gtk 2007/10/21 14:22 page 95 #95
95
mdostsa magt a szveget. A szveget ebben az zemmdban
a fggvny a lehet o legjobban elemeire bontott kdszavakkal
trolja.
G_NORMALIZE_DEFAULT_COMPOSE Ugyanaz mint az el oz o, de ebben
az zemmdban a fggvny a lehet o legsszetettebb kdokkal
trolja a szveget.
G_NORMALIZE_ALL Ennek az llandnak a hatsra a fggvny er os
talaktsokat is vgez, amelynek hatsra a formzsra vonat-
koz informcik elveszhetnek.
G_NORMALIZE_ALL_COMPOSE Ugyanaz mint az el oz o, de a fggvny
a lehet o legsszetettebb kdokat hasznlja.
Az sszetett s kevsb sszetett kdok kapcsn rdemes tudnunk,
hogy az Unicode szabvny lehet ov teszi a karakterek egysgbe fog-
lalst s talaktst, gy az karakter pldul trolhat sajt
kdjval (sszetett kd) s az a bet u, valamint a hossz kezet
sszegeknt (elemekre bontott kd). Az sszetett kd rvidebb ka-
rakterlncot eredmnyez s knnyebb feldolgozni, az elemeire bon-
tott kd pedig szisztematikusabb, szablyosabb.
A formzsra vonatkozan rdemes tudnunk, hogy az Unicode
ugyanannak a karakternek esetleg tbb formjt is tmogathatja. A
ngyzet jellsre pldul kln karaktert tartalmaz, ami a
2
for-
mban eleve fels o indexben van. Ha a karakterlnc alapformra
hozsa sorn az er os talaktst vlasztjuk a fggvny minden ka-
raktert az alapformval helyettest (a pldnk esetben ez a 2), gy a
formzs adta klnbsgek elvesznek.
Nyilvnval, hogy az talakts sorn a karakterlnc memriban
elfoglalt mrete megnvekedhet, gy nem meglep o, hogy a fggvny
ltal visszatrsi rtkknt adott mutat dinamikusan foglalt me-
mriaterletet jell a memriban, ami a karakterlnc talaktott
msolatt tartalmazza.
gint g_utf8_collate(const gchar
*
szveg1, const gchar
*
szveg2); A fggvny kt UTF-8 karakterlnc sszehason-
ltst vgzi el. A fggvny az sszehasonlts el ott a kis- s
nagybet uk kzti klnbsget nem trli el a g_utf8_casefold()
fggvny segtsgvel (azaz a kis- s nagybet uk kzti klnbsget
gyelembe veszi), de a karakterlncokat alapformra hozza a
G_NORMALIZE_ALL zemmdban.
A fggvny paramterei az szehasonltand karakterlncokat je-
lli a memriban, visszatrsi rtke pedig negatv, ha az els o ka-
rakterlnc kisebb, pozitv, ha nagyobb s 0, ha azonos a msodik
karakterlnccal.
gtk 2007/10/21 14:22 page 96 #96
96
gchar
*
g_utf8_collate_key(const gchar
*
szveg, gssize
mret); A fggvnyt akkor hasznlhatjuk, ha egy karakterlncot
sok ms karakterlnccal akarunk sszehasonltani. Ilyen esetben
gyorsabb, ha a g_utf8_collate() ismtelt hvsa helyett e fgg-
vny segtsgvel talaktjuk a karakterlncokat olyan formra,
amely az egyszer u strcmp() szabvnyos knyvtri fggvnnyel
sszehasonlthat. (A sebessgnvekeds nyilvn abbl kvetkezik,
hogy a sok karakterlnccal sszehasonltand karakterlncot csak
egyszer kell talaktani.)
A fggvny visszatrsi rtke dinamikusan foglalt memiaterletre
mutat, ahol az els o paramterknt tadott karakterlnc talaktott
msolatt tallhatjuk.
gchar
*
g_utf8_collate_key_for_filename(const gchar
*
llomnynv, gssize mret); E fggvny hasznlata meg-
egyezik a g_utf8_collate_key() m ukdsvel, a klnbsg csak
annyi, hogy ez a fggvny olyan szablyokat hasznl, ami llo-
mnynevek esetben logikusabb sorrendet ad, mert klnlegesen
kezeli az llomnynevekben tallhat . karaktert s a szmokat.
Karakterlncok esetben elemi feladat, hogy a karakterlnc elemeit
sorra vgigjrjuk. Ezt az ASCII karakterlncok esetben egyszer uen meg-
tehetjk, az UTF-8 karakterlncok esetben azonban kiss bonyolultabb
a feladatunk. A kvetkez o plda bemutatja hogyan jrhatunk vgig egy
UTF-8 karakterlncot a G programknyvtr segtsgvel.
16. plda. A kvetkez o fggvny a paramterknt kapott UTF-8 karak-
terlnc karaktereit vgigjrja s feldolgozza a G programknyvtr segt-
sgvel.
1 gchar
*
2 option_to_variable_name(gchar
*
option)
3 {
4 gunichar c;
5 GString
*
variable = g_string_new("OPTION");
6
7 do {
8 c = g_utf8_get_char(option);
9 option = g_utf8_next_char(option);
10 switch(c) {
11 case :
12 case -:
13 g_string_append_unichar(variable, _);
14 break;
15 default:
gtk 2007/10/21 14:22 page 97 #97
97
16 g_string_append_unichar(variable, c);
17 }
18 } while (c != \0);
19
20 return g_string_free(variable, FALSE);
21 }
A fggvny a 8. sorban a g_utf8_next_char() fggvny segtsgvel
a soron kvetkez o karaktert olvassa a karakterlnc elejr ol, a 9. sorban
pedig a g_utf8_next_char() makr segtsgvel a kvetkez o karakterre
lp. A plda 18. sorban meggyelhetjk, hogy a karakterlnc vgt a
szoksos mdon, a 0 rtk gyelsvel rzkelhetjk. (A plda tovbbi
rszeire a ks obbiekben visszatrnk.)
4.5.3. A magas szint u karakterlnc-kezels
A G programknyvtr egy sszetettebb eszkztrat is biztost a karak-
terlncok kezelsre a GString tpus segtsgvel. Ez az eszkztr sok,
magas szint u szolgltatst nyjt fggvnyt tartalmaz amelyek kpesek
a karakterlncok mretnek folyamatos nyomonkvetsre. A GString
tpus karakterlncok mrete igny szerint nvekszik, gy igen knny u a
hasznlatuk.
A GString struktra a kvetkez o elemekb ol ll:
A GString struktra
gchar
*
str A 0 rtk u bjttal lezrt karakterlnc.
gsize len A karakterlnc aktulis hossza.
gsize allocated_len A foglalt memriaterlet hossza.
A struktra str eleme egy olyan mutat, amely a szoksos formban
0 bjttal lezrt karaktersorozatknt trolja a karakterlncot. A G prog-
ramknyvtr minden fggvnye garantlja, hogy a befejez odse utn a
karakterlnc a megfelel o mdon le lesz zrva, gy a karakterlncok az
alacsonyszint u fggvnyekkel, s ot a C programknyvtr fggvnyeivel is
hasznlhatjuk. A karakterlnc mretnek nvekedsekor az str mutat
rtke megvltozhat, hiszen ha a karakterlnc b ovtse az adott helyen
nem lehetsges, akkor a b ovtst vgz o fggvnynek t kell helyeznie a
karakterlncot ms helyre.
A GString len mez oje a karakterlnc hosszt adja meg bjtban mrve.
Ebbe a hosszba nem szmt bele a karakterlncot lezr 0 bjt, ahogyan
azt mr a C programknyvtr esetben is megszokhattuk.
A GString tpus karakterlncok kezelsre hasznlhat fggvnyek
kzl a legfontosabbak a kvetkez ok:
gtk 2007/10/21 14:22 page 98 #98
98
GString
*
g_string_new(const gchar
*
kezdortk); A fggvny
segtsgvel j karakterlncot, j GString struktrt hozhatunk
ltre.
A fggvny paramtere a karakterlnc kezdeti rtkt, visszatrsi
rtke pedig a ltrehozott karakterlncot jelli a memriban.
GString
*
g_string_new_len(const gchar
*
kezdortk, gssize
hossz); A fggvny segtsgvel j karakterlncot hozhatunk ltre
a kezdeti rtk hossznak megadsval.
A fggvny els o paramtere a karakterlnc kezd ortkt jelli a me-
mriban, msodik paramtere pedig a kezd ortk hosszt adja
meg. Az els o paramter ltal jellt memriaterleten legalbb annyi
bjtnyi adatterletnek kell elrhet onek lennie, amennyit a msodik
paramterrel el ortunk.
A fggvny visszatrsi rtke a ltrehozott karakterlncot jelli a
memriban.
GString
*
g_string_sized_new(gsize kezdohossz); A fggvny se-
gtsgvel gy hozhatunk ltre karakterlncot, hogy megadjuk a
kezd ohosszt, az a mretet, amelyet a ltrehozskor le szeretnnk
foglalni a trolsra. A karakterlnc a ks obbiekben hosszabb is
lehet ennl, ez csak a ltrehozskor lefoglalt mret. Nyilvn akkor
lehet hasznos ez a fggvny, ha a ltrehozott karakterlnc a ks ob-
biekben fokozatosan nvekszik s a hatkonyabb memriakezels
rdekben szeretnnk mr a ltrehozskor gondoskodni a nagyobb
memriaterletr ol.
A fggvny paramtere a lefoglaland memriaterlet mrete,
visszatrsi rtke pedig a ltrehozott karakterlnc helye a mam-
riban.
GString
*
g_string_assign(GString
*
karakterlnc, const
gchar
*
rtk); A fggvny segtsgvel j rtket trolhatunk a
karakterlncban. A fggvny a karakterlnc rtkt megsemmisti
s j rtket helyez el benne.
A fggvny els o paramtere a megvltoztatand karakterlncot, m-
sodik paramtere az j rtket jelli a memriban.
A fggvny visszatrsi rtke az els o paramterrel egyezik meg.
void g_string_printf(GString
*
karakterlnc, const gchar
*
formtum, ...); E fggvny segtsgvel a szabvnyos knyv-
tr sprintf() fggvnyhez hasonlan rathatunk szveget a
memriban elhelyezett terletre, de itt clterletknt a GString
adatszerkezetet hasznlhatjuk, ami automatikusan akkora terle-
tet foglal, amekkorra a karakterlnc trolshoz szksges.
gtk 2007/10/21 14:22 page 99 #99
99
A fggvny els o paramtere a karakterlncot jelli a memriban,
ahol az eredmny el akarjuk helyezni. A karakterlnc eredeti tar-
talma trl odik.
A fggvny msodik s tovbbi paramterei jelentskben meg-
egyeznek a szabvnyos knyvtr printf() fggvnycsaldjnak
paramtereivel.
void g_string_append_printf(GString
*
karakterlnc, const
gchar
*
formtum, ...); E fggvny m ukdse megegyezik a
g_string_printf() fggvny m ukdsvel, azzal a klnbsggel,
hogy ez a fggvny nem trli a karakterlnc eredeti tartalmt,
hanem annak a vghez rja hozz a szveget.
GString
*
g_string_append(GString
*
karakterlnc, const
gchar
*
szveg); E fggvnnyel a karakterlncot a vghez
hozzf uztt karakterekkel b ovthetjk.
A fggvny els o paramtere a b ovtend o karakterlncot jelli a me-
mriban, a msodik paramtere pedig a 0 rtkkel lezrt szveget,
amelyet a karakterlnc vghez kvnunk hozzf uzni. A fggvny
visszatrsi rtke az els o paramterrel egyezik meg.
GString
*
g_string_append_c(GString
*
karakterlnc, gchar
c); A fggvny segtsgvel egy karaktert msolhatunk a karak-
terlnc vgre. Mivel ez a fggvny nem tmogatja az Unicode
kdolst, helyette inkbb a kvetkez o fggvny ajnlhat.
A fggvny els o paramtere a b ovtend o karakterlncot jelli a me-
mriban, msodik paramtere pedig a karakter, amellyel b ovteni
kvnjuk a karakterlncot. A fggvny visszatrsi rtke az els o
paramterrel egyezik meg.
GString
*
g_string_append_unichar(GString
*
karakterlnc,
gunichar c); Ennek a fggvnynek a segtsgvel egy Unicode
karaktert rhatunk a karakterlnc vgre.
A fggvny els o paramtere a b ovtend o karakterlncot jelli a me-
mriban, msodik paramtere pedig megadja, hogy milyen Uni-
code karakterrel szeretnnk b ovteni a karakterlncot. A fggvny
visszatrsi rtke az els o paramterrel egyezik meg.
GString
*
g_string_prepend(GString
*
karakterlnc, const
gchar
*
szveg); E fggvny segtsgvel a karakterlnc elejt
b ovthetjk gy, hogy az eredeti karakterlnc az eredmnyl kapott
karakterlnc vgn jelenjen meg.
A fggvny els o paramtere a b ovtend o karakterlncot, msodik
paramtere pedig a 0 rtkkel lezrt, a karakterlnc elejre mso-
gtk 2007/10/21 14:22 page 100 #100
100
land szveget jelli a memriban. A fggvny visszatrsi rtke
az els o paramtervel egyezik meg.
GString
*
g_string_prepend_c(GString
*
karakterlnc,
gchar c); Ennek a fggvnynek a m ukdse megegyezik a
g_string_append_c() fggvny m ukdsvel, de nem a karakter-
lnc vgre, hanem az elejre msolja a karaktert.
GString
*
g_string_prepend_unichar(GString
*
karakterlnc,
gunichar c); Ennek a fggvnynek a m ukdse megegyezik
a g_string_append_unichar() fggvny m ukdsvel, de az
Unichar karaktert nem a karakterlnc vgre, hanem az elejre
msolja.
GString
*
g_string_insert(GString
*
karakterlnc, gssize
hely, const gchar
*
szveg); A fggvny segtsgvel a karak-
terlnc belselybe msolhatunk szveget gy, hogy a bemsolt
szveg el ott s utn az eredeti karakterlnc megmaradjon.
A fggvny els o paramtere a karakterlncot, harmadik paramtere
pedig a 0 rtkkel lezrt, bemsoland szveget jelli a memriban.
A fggvny msodik paramtere megadja, hogy az eredeti karak-
terlnc hnyadik bjtjtl kezd odjn a bemsolt szveg. A szveg
bjtjainak szmozsa 0-tl kezd odik, de a fggvny nem tmogatja
az Unicode karaktereket, mivel az Unicode szvegben a karakterek
nem minden esetben egy bjtnyi helyet foglalnak.
A fggvny visszatrsi rtke az els o paramterrel egyezik meg.
GString
*
g_string_insert_c(GString
*
karakterlnc, gssize
hely, gchar c); E fggvnnyel j karaktert szrhatunk be a
karakterlncba.
A fggvny els o paramtere a karakterlncot jelli a memriba,
msodik paramtere pedig megadja, hogy hnyadik bjthoz szeret-
nnk beszrni az j karaktert. A fggvny harmadik paramtere a
beszrand karaktert adja meg, visszatrsi rtke pedig megegye-
zik az els o paramterrel.
GString
*
g_string_insert_unichar(GString
*
karakterlnc,
gssize hely, gunichar c); E fggvny segtsgvel j Unicode
karaktert szrhatunk be a karakterlncba. A fggvny a beszr-
and karaktert Unicode karakterknt kezeli, de a karakterlncot
egyszer u bjtsorozatknt, gy Unicode karakterlncok kezelsre
nem igazn praktikus a hasznlata.
A fggvny paramterei s visszatrsi rtke a
g_string_insert_c() fggvny paramtereihez s visszatrsi
rtkhez hasonl.
gtk 2007/10/21 14:22 page 101 #101
101
GString
*
g_string_erase(GString
*
karakterlnc, gssize
hely, gssize hossz); A fggvny segtsgvel a karakterlnc
megadott bjtjait trlhetjk.
A fggvny els o paramtere a mdostand karakterlncot jelli a
memriban, msodik paramtere megadja, hogy hnyadik bjttl
kvnjuk kezdeni a trlst, harmadik paramtere pedig azt, hogy
hny bjtnyi szveget akarunk eltvoltani. A bjtok szmozsa itt
is 0-tl indul.
A fggvny visszatrsi rtke megegyezik az els o paramter rtk-
vel.
GString
*
g_string_truncate(GString
*
karakterlnc, gsize
hossz); E fggvny segtsgvel a karakterlncot megadott
hosszsgra vghatjuk.
A fggvny els o paramtere a karakterlncot jelli a memriban,
msodik paramtere pedig megadja, hogy a karakterlnc vgnek
levgsa utn hny bjtnyi szveget tartalmazzon a karakterlnc
(nem szmolva a karakterlncot lezr 0 rtket).
A visszatrsi rtk az els o paramterrel egyezik meg.
gchar
*
g_string_free(GString
*
karakterlnc, gboolean
felszabadt); Ennek az egybknt igen hasznos fggvnynek a
segtsgvel a GString tpus karakterlncot megsemmisthetjk,
mgpedig gy, hogy ha szksgnk van magra a szvegre, azt
megtarthatjuk.
A fggvny paramtere a megsemmistend o karakterlncot jelli a
memriban, msodik paramtere pedig megadja, hogy magt a
szveget is meg akarjuk-e semmisteni.
Ha a msodik paramter rtke TRUE, akkor a fggvny magt a
szveget is megsemmisti, a trolsra hasznlt memriaterletet
felszabadtja. Ekkor a fggvny visszatrsi rtke NULL.
Ha a msodik paramter rtke FALSE, a fggvny a szveg karak-
tereinek trolsra hasznlt memriaterletet nem szabadtja fel.
Ekkor a fggvny visszatrsi rtke egy mutat, ami dinamikusan
foglalt memriaterletre mutat, ahol a 0 rtkkel lezrt karakter-
lncot tallhatjuk.
4.6. Az iterlt adattpusok
A kvetkez o oldalakon olyan adatszerkezetekr ol olvashatunk, amelyek
arra szolglnak, hogy sok egyforma adatszerkezetet tartsanak nyilvn a
gtk 2007/10/21 14:22 page 102 #102
102
memriban. Ezeket az eszkzket ltalban iterlt adatszerkezeteknek
nevezzk.
sszetett programokban ltalban tbb listt, ft, keres oft haszn-
lunk a program ltal hasznlt adatok kezelsre. A G programknyvtr
ebben hathats segtsget tud nyjtani a programoz szmra a kvet-
kez o oldalakon bemutatott adatszerkezetek, fggvnyek segtsgvel.
4.6.1. A ktszeresen lncolt lista
A G programknyvtr GList tpusa ktszeresen lncolt lineris lista
megvalstsra hasznlhat. A GList struktra szerkezete a kvetkez o:
A GList struktra
gpointer data A listaelem adatterlete.
GList
*
next A kvetkez o elem.
GList
*
prev Az el oz o elem.
A struktra bemutatott komponenseihez szabadon hozzfrhetnk s
hasznlhatjuk az rtkket.
A G programknyvtr dupln lncolt listk kezelsre hasznlatos
fggvnyei kzl a legfontosabbak a kvetkez ok:
GList
*
g_list_append(GList
*
lista, gpointer adat);
A fggvny segtsgvel j elemet szrhatunk be a lista vgre.
A fggvny els o paramtere a listt jelli a memriba. Ez a para-
mter NULL rtk u res lista esetn.
A fggvny msodik paramtere az j elem ltal hordozott adatokat
jelli a memriban.
A fggvny visszatrsi rtke a lista j cme. Amikor a fggvny se-
gtsgvel j elemet helyeznk el egy res listban azaz a fggvny
els o paramtere NULL rtk u a lista els o elemnek cme megvlto-
zik, a visszatrsi rtket teht fel kell hasznlnunk.
GList
*
g_list_prepend(GList
*
lista, gpointer adat); A fgg-
vny segtsgvel j elemet helyezhetnk el a lista elejre.
A fggvny m ukdsben s hasznlatban megegyezik a
g_list_append() fggvny m ukdsvel s hasznlatval, azzal a
klnbsggel, hogy a fggvny mindig a lista elejre helyezi el az j
elemet. A lista els o elemnek cme amelyet a visszatrsi rtk ad
meg mindig megvltozik a fggvny hvsnak hatsra.
gtk 2007/10/21 14:22 page 103 #103
103
GList
*
g_list_insert(GList
*
lista, gpointer adat, gint
hely);
A fggvny segtsgvel j elemet helyezhetnk el a listban adott
sorszm helyre.
A fggvny els o paramtere a listt jelli a memriban, msodik
paramtere pedig az j listaelem ltal hordozott adatokat jelli.
A fggvny harmadik paramtere megadja, hogy az j listaelem h-
nyadik helyre kerljn a listn bell. Ha ez a szm negatv, vagy
nagyobb mint a listban tallhat elemek szma, az j elem a lista
vgre kerl.
A fggvny visszatrsi rtke a lista els o elemnek cme, amely
megvltozhat a fggvny hvsnak hatsra (nyilvnvalan akkor,
ha az els o elem el helyeznk el j elemet).
GList
*
g_list_insert_before(GList
*
lista, GList
*
kvetkezo, gpointer adat);
A fggvny segtsgvel j elemet szrhatunk be a listba adott elem
el.
A fggvny els o paramtere a listt az els o elemet jelli a me-
mriba, msodik paramtere annak az elemnek a cme, amely el
szeretnnk elhelyezni az j elemet, harmadik paramtere az j elem
ltal hordozott adatot jelli.
A fggvny visszatrsi rtke az els o elem cme, amely megvltoz-
hat, ha az els o elem el szrunk be j elemet.
GList
*
g_list_insert_sorted(GList
*
lista, gpointer adat,
GCompareFunc fggvny);
A fggvny segtsgvel j elemet helyezhetnk el a listban rende-
zett mdon. Ha mindig ezzel a fggvnnyel helyeznk el j elemeket
a listban a lista mindvgig rendezett marad.
A fggvny els o paramtere a listt, msodik paramtere pedig az
elhelyezend o j elem ltal hordozott adatot jelli a memriban.
A fggvny harmadik paramtere annak a fggvnynek a cme,
amelyet a fggvny az elemek sszehasonltsra hasznlhat, amely
a sorrendet meghatrozza. Ennek az sszehasonlt fggvnynek
a m ukdse meg kell, hogy egyezzen a strcmp() knyvtri fgg-
vnnyel, azaz 0 rtket kell visszaadnia, ha a kt elem megegyezik,
pozitv rtket kell visszaadnia, ha az els o elem a nagyobb, illetve
negatv rtket kell visszaadnia, ha a a msodik elem a nagyobb.
Az sszehasonlt fggvnyt a q_list_insert_sorted() fggvny
a kt sszehasonltand elem adatterlett jell o mutatval hvja.
gtk 2007/10/21 14:22 page 104 #104
104
gint GCompareFunc(gconstpointer a, gconstpointer b);
Az elemek sszehasonltst vgz o fggvny, amelyet neknk kell
elksztennk, ha rendezett listt akarunk ltrehozni. A fggvny
paramtere a kt sszehasonltand adatterletet jellik a memri-
ban, visszatrsi rtke pedig az sszehasonlts eredmnyt adja
meg.
A fggvnynek 0 rtket kell visszaadnia, ha az els o s msodik
paramter ltal jelzett terleten tallhat adat a sorrend szempont-
jbl egyenrtk u, pozitv rtket, ha az els o nagyobb, illetve negatv
rtket, ha az els o kisebb mint a msodik.
GList
*
g_list_remove(GList
*
lista, gconstpointer adat);
A fggvny segtsgvel adott adatot hordoz elemet tvolthatunk el
a listbl. A fggvny els o paramtere a listt, msodik paramtere
az eltvoltand elem ltal hordozott adatot jelli a memriban. A
fggvny mindig csak az els o tallt elemet tvoltja el, a keresst az
els o tallat utn befejezi.
A fggvny visszatrsi rtke a lista els o elemnek cmt adja meg,
amely megvltozhat, ha ppen az els o elemet tvoltjuk el a listbl.
A fggvny hasznlatnak kapcsn fel kell hvnunk a gyelmet arra,
hogy az nem a listban tallhat adatterletek tartalmt hason-
ltja ssze a msodik paramter ltal jellt terleten tallhat adat-
tartalommal, hanem a listaelemek adatterleteinek mutatjt ha-
sonltja ssze a msodik paramterrel. A fggvnynek teht nem
olyan adatterletet kell jellnie, amilyet el akarunk tvoltani, ha-
nem azt az adatterletet, amit el akarunk tvoltani.
GList
*
g_list_delete_link(GList
*
lista, GList
*
elem);
A fggvny segtsgvel adott elemet tvolthatunk el a listbl.
A fggvny els o paramtere a listt, msodik paramtere pedig az
eltvoltand elemet jelli a memriban.
A lista visszatrsi rtke a lista els o elemnek cme, amely megvl-
tozhat, ha ppen az els o elemet tvoltjuk el a listbl.
GList
*
g_list_remove_all(GList
*
lista, gconstpointer
adat);
A fggvny m ukdse s hasznlata megegyezik a
g_list_remove() fggvny m ukdsvel s hasznlatval, az-
zal a klnbsggel, hogy ez a fggvny minden adott adatterletet
hordoz elemet eltvolt, nem csak az els ot.
void g_list_free(GList
*
lista); A fggvny megsemmisti a lis-
tt, minden elemet eltvolt a listbl.
gtk 2007/10/21 14:22 page 105 #105
105
A fggvny paramtere a megsemmistend o lista els o elemt jelli a
memriban.
Fontos tudnunk, hogy a fggvny az egyes elemek ltal hordozott
adatterleteket nem szabadtja fel, ha azokat dinamikus memria-
foglalssal vettk hasznlatba magunknak kell gondoskodnunk a
felszabadtsukrl miel ott a fggvnyt hvnnk.
guint g_list_length(GList
*
lista);
A fggvny megszmllja a listban tallhat elemek szmt. Az
els o paramter a lista els o elemnek cmt adja meg, a visszatrsi
rtk pedig a lista hossza.
GList
*
g_list_reverse(GList
*
lista);
A fggvny a lista elemeinek sorrendjt megfordtja.
A fggvny els o paramtere a listt jelli a memriban, a vissza-
trsi rtke pedig az els o elem cmt adja meg, ami valszn uleg
megvltozik a m uvelet hatsra.
GList
*
g_list_sort(GList
*
lista, GCompareFunc fggvny);
A fggvny sorba rendezi a lista elemeit.
Az els o paramter a lista cme, a msodik paramter pedig az ele-
mek sszehasonltst vgz o fggvny, amelyet mr bemutattunk a
g_list_insert_sorted() fggvny kapcsn.
A fggvny visszatrsi rtke a lista els o elemnek cme, amely
megvltozhat a m uvelet hatsra.
GList
*
g_list_concat(GList
*
lista1, GList
*
lista2);
A fggvny segtsgvel kt listt egyesthetnk. A fggvny a m-
sodik paramter ltal jellt listt az els o paramter ltal jellt lista
vgre illeszti.
A fggvny ltal visszaadott rtk az egyestett listt jelli a mem-
riban. A visszaadott rtk valszn uleg ha az els o lista nem volt
res megegyezik az els o paramterrel.
void g_list_foreach(GList
*
lista, GFunc fggvny,
gpointer paramter);
A fggvny bejrciklust valst meg, amelynek segtsgvel meg-
hvhatunk egy ltalunk ksztett fggvnyt a lista minden elemvel.
A fggvny els o paramtere a listt jelli a memriban, msodik
paramtere pedig a meghvand fggvny cmt adja meg.
A msodik paramterrel meghatrozott fggvny kt paramtert
kap, az els o az adott listaelem adatterlett jelli, a msodik pedig
gtk 2007/10/21 14:22 page 106 #106
106
a g_list_foreach() fggvnynek harmadik paramterknt meg-
adott adatterlet. A harmadik paramter lehet NULL rtk is.
void (
*
GFunc)(gpointer data, gpointer paramter);
A fggvnyt neknk kell megvalstani, ha a g_list_foreach()
fggvnnyel minden listaelemet vgig akarunk jrni.
A fggvny els o paramtere az aktulis listaelem adatterlett jelli,
msodik paramtere pedig a q_list_foreach() szmra tadott
kln adatterletet jelli.
GList
*
g_list_first(GList
*
elem);
A fggvny a lista tetsz oleges elemnek felhasznlsval megkeresi
az els o elemet.
GList
*
g_list_last(GList
*
elem);
A fggvny a lista tetsz oleges elemnek felhasznlsval megkeresi
az els o elemet.
GList
*
g_list_previous(GList
*
elem);
Ez az eszkz valjban makr, amely adott elem cmb ol el olltja a
megel oz o elem cmt. Az els o elem amely el ott nincs jabb lista-
elem esetben a makr NULL rtket ad vissza.
GList
*
g_list_next(GList
*
elem);
Ez a makr adott elem cmb ol el olltja a rkvetkez o elem cmt.
Az utols elem esetben a makr NULL rtket ad vissza.
GList
*
g_list_nth(GList
*
lista, guint n);
Ez a fggvny megkeresi az adott sorszm elemet a listban.
A fggvny els o paramtere megadja a lista els o elemnek cmt, a
msodik pedig azt, hogy hnyadik elemet keressk.
A fggvny visszatrsi rtke a keresett elemet jelli a memri-
ban. Ha a keresett elem nem ltezik a lista rvidebb , a visszat-
rsi rtk NULL.
gpointer g_list_nth_data(GList
*
lista, guint n);
A fggvny hasonlt a g_list_nth() fggvnyre, de azzal ellentt-
ben nem a keresett listaelemet, hanem a keresett listaelem ltal
hordozott memriaterletet jelli a memriban.
gyeljnk r, hogy a fggvny visszatrsi rtke lehet NULL, ha a
lista rvidebb annl, hogy a keresett elemet meg lehetne tallni.
gtk 2007/10/21 14:22 page 107 #107
107
GList
*
g_list_find(GList
*
lista, gconstpointer adat);
A fggvny segtsgvel kikereshetjk azt a listaelemet, amely a
megadott adatterletet hordozza.
A fggvny els o paramtere a lista els o elemnek, msodik param-
tere pedig a keresett adatterletnek a cmt hatrozza meg.
A fggvny visszatrsi rtke a lista elemnek cmt adja meg,
amely az adott adatterletet hordozza vagy NULL, ha az adatter-
let nem tallhat.
gyelnnk kell arra, hogy a fggvny nem hasonltja ssze a lis-
taelemek adatterleteit a paramterknt megadott adatterlettel,
csak a listaelemek adatterleteinek cmt hasonltja ssze a meg-
adott adatterlet cmvel.
GList
*
g_list_find_custom(GList
*
lista, gconstpointer
adat, GCompareFunc fggvny);
A fggvny segtsgvel adott adattartalmat hordoz listaelemet ke-
reshetnk ki a listbl.
A fggvny els o paramtere a lista els o elemnek cme, a msodik
paramtere pedig a keresett adattartalmat jelli a memriban.
Ez a fggvny sszehasonltja a lista egyes elemei ltal hordozott r-
tkeket a megadott rtkkel az sszehasonltsra a harmadik para-
mterknt megadott fggvnyt hasznlva fel. E fggvny m ukdst
mr bemutattunk a g_list_insert_sorted() fggvny kapcsn.
A fggvny visszatrsi rtke a megtallt listaelem cme vagy NULL,
ha az elem nem tallhat.
gint g_list_position(GList
*
lista, GList
*
elem);
A fggvny megadja, hogy az adott listaelem a lista hnyadik eleme.
A fggvny els o paramtere a lista els o elemnek cme, msodik
paramtere pedig a keresett listaelem cme.
A fggvny visszatrsi rtke a keresett elem sorszma, vagy 1,
ha a keresett elem nem tallhat.
gint g_list_index(GList
*
lista, gconstpointer adat);
A fggvny m ukdse megegyezik a q_list_position() fggvny
m ukdsvel, azzal ellenttben azonban nem adott elemet, hanem
adott memriaterletet adatknt hordoz elemet keres.
17. plda. A kvetkez o pldaprogram a dupln lncolt lista hasznlatt
mutatja be. A program egy parancssoros felhasznli fellet szmra biz-
tostja a mr begpelt s kiadott parancsok visszakeressnek (command
history) lehet osgt.
gtk 2007/10/21 14:22 page 108 #108
108
1 static GList
*
history = NULL;
2 static GList
*
actual = NULL;
3
4 void
5 history_add_command(gchar
*
command)
6 {
7 history = g_list_append(history, g_strdup(command));
8 actual = g_list_last(history);
9 }
10
11 gchar
*
12 history_get_prev_command(void)
13 {
14 gchar
*
command;
15
16 if (actual == NULL)
17 return NULL;
18 else
19 command = actual->data;
20
21 if (actual->prev != NULL)
22 actual = actual->prev;
23
24 return command;
25 }
26
27 gchar
*
28 history_get_next_command(void)
29 {
30 gchar
*
command;
31
32 if (actual == NULL)
33 return NULL;
34 else
35 command = actual->data;
36
37 if (actual->next != NULL)
38 actual = actual->next;
39
40 return command;
41 }
42
43 gchar
*
gtk 2007/10/21 14:22 page 109 #109
109
44 history_get_first_command(void)
45 {
46 actual = g_list_first(history);
47 return history_get_prev_command();
48 }
49
50 gchar
*
51 history_get_last_command(void)
52 {
53 actual = g_list_last(history);
54 return history_get_next_command();
55 }
A program 1. sorban egy vltozt hozunk ltre, amely a lista els o ele-
mre fog mutatni. A listt ezzel a mutatval tartjuk nyilvn. A 2. sorban
tallhat mutat azt az aktulis elemet tartja nyilvn, amelyet a felhasz-
nl ppen hasznl a bngszs sorn.
A program 49. sorban lthatjuk azt a fggvnyt, amellyel j ele-
meket helyeznk el a listban. A 7. sorban lthat rtkads a
g_list_append() fggvny segtsgvel j elemet helyez el a lista v-
gre. Figyeljk meg a fggvny visszatrsi rtknek hasznlatt s a
fggvnynek tadott, adattartalmat jell o mutatt, amely ebben az eset-
ben egyszer u karakterlncot jell a memriban.
A 1125. sorban tallhat fggvny segtsgvel az aktulis elem el otti,
a 2741. sorokban lthat fggvny segtsgvel pedig az aktulis elem
utni bejegyzs adatterlett krdezhetjk le. Figyeljk meg, hogy az
adattartalom lekrdezse mellett a fggvnyek 22., illetve a 38. sorok-
ban mdostjk az aktulis elemet kijell o mutatt, ami azt eredmnyezi,
hogy ezekkel a fggvnyekkel vgiglpkedhetnk a lista elemein. Figyel-
jk meg azt is, hogy a 8. sorban az j elemet elhelyez o fggvny szintn
mdostja az aktulis elemet, azaz, ha j elemet helyeznk el a listban,
akkor egyben az aktulis elem a lista vgre ll.
A 4348., illetve az 5055. sorokban lthat fggvnyekkel a lista ele-
jr ol, illetve a vgr ol krhetjk le az adattartalmat, egyben az aktulis
elemet is mozgatva.
4.6.2. A fa
A G programknyvtr GNode tpusa ltalnos fk kezelst teszi lehe-
t ov, ahol a fa egyes csompontjainek tetsz oleges szm leszrmazottja
lehet. A programknyvtr a fa minden egyes csompontjhoz egy mu-
tatt rendel, amely az adott csompont ltal hordozott adatokat jelli a
memriban, gy a GNode ltalnosan hasznlhat, rugalmas eszkzknt
gtk 2007/10/21 14:22 page 110 #110
110
tetsz oleges konkrt feladat megoldsra hasznlhat. (Ha a csompon-
tokhoz tartoz adatok gyors visszakeresse a cl, akkor lehetsges, hogy
a 110. oldalon tallhat 4.6.3. szakaszban bemutatott binris keres ofra
van szksgnk.)
A fa csompontjainak adatait ler GNode struktra elemei a kvetke-
z ok:
A GNode struktra
gpointer data A csomponthoz tartoz adatterlet.
GNode
*
next A csompont melletti kvetkez o csom-
pont.
GNode
*
prev A csompont melletti el oz o csompont.
GNode
*
parent A csompont szl oje.
GNode
*
children A csompont els o leszrmazottja.
Amint lthatjuk a csompont leszrmazottait gy tudjuk megkeresni,
hogy a children mez o tartalmbl meghatrozzuk az els o leszrmazott
helyt, majd a leszrmazottban tallhat next mez o segtsgvel vgig-
jrjuk az egy szinten tallhat csompontokat.
4.6.3. A kiegyenslyozott binris keres ofa
A G programknyvtr a GTree tpus segtsgvel biztostja a kiegyensly-
zott binris keres oft a programoz szmra. A kiegyenslyozott binris
keres ofa amelyet sokszor egyszer uen keres ofnak neveznk adatok
gyors visszakeresst teszi lehet ov a memriban elhelyezett adatszer-
kezetb ol.
A keres ofa minden csompontja valamilyen sszetett adatszerkeze-
tet hordoz s minden keres ofa valamilyen keressi kulcs alapjn te-
szi lehet ov az adatok gyors visszakeresst. A kulcs ltalban a hor-
dozott sszetett adatszerkezet valamelyik kitntetett eleme, gy a kere-
s ofa sszetett adatszerkezetek kitntetett mez oje alapjn teszi lehet ov
a visszakeresst. Nincs azonban semmi akadlya annak, hogy egy adat-
szerkezet egy id oben tbb keres ofban szerepeljen, gy a visszakeresst
tbb kulcs, tbb mez o alapjn is lehet ov tehetjk.
A G programknyvtr a kiegyenslyozott binris keres ofk kezelsre
a kvetkez o fggvnyeket biztostja.
GTree
*
g_tree_new(GCompareFunc fggvny); A fggvny segts-
gvel j keres oft hozhatunk ltre.
A fggvny paramtere azt a fggvnyt jelli a memriban, ame-
lyet a keres ofa egyes elemeinek sszehasonltsra hasznlunk. Az
sszehasonltst vgz o fggvny megadsa lehet ov teszi, hogy a ke-
res oft tetsz oleges adattpusok, tetsz oleges keressi kulcsok alap-
jn kezeljk.
gtk 2007/10/21 14:22 page 111 #111
111
A fggvny visszatrsi rtke az j binris keres oft jelli a mem-
riban.
gint GCompareFunc(gconstpointer a, gconstpointer b); Az ele-
mek sszehasonltst vgz o fggvny, amely a kt sszehasonl-
tand kulcsot kapja paramterknt.
A fggvny visszatrsi rtknek 0-nak kell lennie, ha a fggvny
a kt kulcsot megegyez onek tli, negatvnak, ha az els o kulcs ki-
sebb, mint a msik s pozitvnak, ha az els o kulcs nagyobb mint a
msodik.
GTree
*
g_tree_new_with_data(GCompareDataFunc fggvny,
gpointer adat); A fggvny segtsgvel j binris keres oft
hozhatunk ltre. Azok a binris keres ofk, amelyeket ezzel a
fggvnnyel hozunk ltre annyiban klnbznek a g_tree_new()
fggvnnyel ltrehozott keres ofktl, hogy az sszehasonltst
vgz o fggvny egy kln argumentumot is kap.
A fggvny els o paramtere a kulcsok sszehasonltst vgz o fgg-
vnyt jelli a memriban, a msodik paramter pedig megadja azt
a mutatt, amelyet az sszehasonlt fggvny a kulcsok mellett
paramterknt megkap.
A fggvny visszatrsi rtke az j binris keres oft jelli a mem-
riban.
gint GCompareDataFunc(gconstpointer a, gconstpointer b,
gpointer adat); Az elemek sszehasonltst vgz o fggvny,
amely a kt sszehasonltand kulcson kvl egy kln mutatt is
kap paramterknt.
A fggvny els o s msodik paramtere a kt sszehasonl-
tand kulcsot jelli a memriban, a harmadik paramtere pe-
dig azt a memriaterletet, amelyet a keres ofa ltrehozsakor a
g_tree_new_with_data() fggvny msodik paramtereknt meg-
adtunk.
A fggvnynek 0 rtket kell visszaadnia, ha a kt kulcsot megegye-
z onek tli, negatv rtket, ha az els o kulcs rtke kisebb, pozitv
rtket, ha az els o kulcs rtke nagyobb, mint a msodik kulcs r-
tke.
GTree
*
g_tree_new_full(GCompareDataFunc fggvny,
gpointer adat, GDestroyNotify kulcsfelszabadt,
GDestroyNotify adatfelszabadt); A fggvny segtsgvel j
binris keres oft hozhatunk ltre gy, hogy a keres ofban tallhat
adatelemeket felszabadt fggvnyeket is meghatrozhatjuk.
A fggvny egyes paramterei s a visszatrsi rtke a kvetkez ok:
gtk 2007/10/21 14:22 page 112 #112
112
fggvny A kulcsok sszehasonltst vgz o fggvny cme a me-
mriban.
adat Az adatot jelli a memriban, amelyet a kulcsokat sszeha-
sonlt fggvny paramterknt megkap.
kulcsfelszabadt A kulcsok trolsra szolgl memriaterle-
tet felszabadt fggvny cme a memriban. A G program-
knyvtr akkor hvja ezt a fggvnyt, amikor elemet tvoltunk
el a keres ofbl s gy felszabadthat az elemhez tartoz kulcs
memriaterlete.
Ha nem akarjuk hasznlni ezt a szolgltatst, akkor NULL rt-
ket is megadhatunk.
adatfelszabadt Az adatterletek felszabadtsra hasznlt
fggvny cme. A G programknyvtr akkor hvja ezt a fgg-
vnyt, amikor elemet tvoltunk el a keres ofbl s ezrt az
elemhez tartoz adatterletet fel lehet szabadtani.
Ha nem akarjuk ezt a szolgltatst hasznlni NULL rtket is
megadhatunk.
visszatrsi_rtk A fggvny visszatrsi rtke az j binris
keres oft jelli a memriban.
void g_tree_insert(GTree
*
fa, gpointer kulcs, gpointer
rtk); A fggvny segtsgvel j elemet szrhatunk be a kere-
s ofba. Az elem beszrshoz meg kell adnunk az elem s a kulcs
rtkt. Ha a megadott kulcs mr ltezik a fban, akkor a rgi rtk
eltvoltsa utn az j rtk kerl a fba, viszont a rgi kulccsal.
A rgi elem eltvoltsa sorn, ha az rtk felszabadtshoz meg-
adtuk a fggvnyt a g_tree_new_full() fggvnnyel , akkor a
fggvny hvja az rtk memriaterletnek felszabadtst vgz o
fggvnyt. Ha a fa ltrehozsakor megadtuk a kulcs felszabadtst
vgz o fggvnyt, akkor a fellrs sorn a fggvny felszabadtja az
j kulcsot.
Vegyk szre, hogy fellrsrl csak akkor beszlhetnk, ha az j
kulcs s a rgi kulcs rtke az sszehasonltst vgz o fggvny sze-
rint megegyezik, de ez nyilvnvalan nem jelenti azt, hogy a kt
kulcs ugyanazon a memriaterleten tallhat, hogy ugyanaz a me-
mriacmk.
A fggvny els o paramtere a mr ltrehozott binris keres oft, a
msodik paramtere a kulcsot, a harmadik paramtere pedig a t-
roland rtket jelli a memriban.
void g_tree_replace(GTree
*
fa, gpointer kulcs, gpointer
rtk); A fggvny segtsgvel j elemet helyezhetnk el a
gtk 2007/10/21 14:22 page 113 #113
113
keres ofban. A fggvny a g_tree_insert() fggvnyt ol abban
klnbzik, hogy ha a kulcs mr ltezik a fban, akkor ez a
fggvny az j kulcsot tartja meg s a rgit szabadtja fel.
A fggvny els o paramtere a mr ltrehozott keres oft, msodik
paramtere a kulcsot, harmadik paramtere pedig a troland r-
tket jelli a memriban.
gint g_tree_nnodes(GTree
*
fa); A fggvny segtsgvel lekrdez-
hetjk, hogy a keres ofa hny kulcs/rtk prt tartalmaz.
A fggvny paramtere a keres oft jelli a memriban, visszatrsi
rtke pedig megadja, hogy hny elem tallhat a fban.
gint g_tree_height(GTree
*
fa); A fggvny segtsgvel lekrdez-
hetjk a keres ofa magassgt, amely egyben azt is meghatrozza,
hogy legrosszabb esetben hny lps kell a keresett elem megtal-
lshoz. Az res keres ofa magassga 0, az egy elemet tartalmaz
keres ofa magassga 1 s gy tovbb.
A fggvny paramtere a keres oft jelli a memriban, a visszat-
rsi rtke pedig megadja a fa magassgt.
gpointer g_tree_lookup(GTree
*
fa, gconstpointer kulcs); A
fggvny segtsgvel a fban a kulcs rtke alapjn kereshetnk.
A fggvny els o paramtere a binris keres oft jelli a memriban,
a msodik paramtere pedig a keresett kulcsrtket. A keres ofa lt-
rehozsakor megadott sszehasonlt fggvny ezt a memriater-
letet fogja sszehasonltani a fban trolt kulcsrtkekkel, amg a
keress egyezst nem tall vagy meg nem bizonyosodik rla, hogy a
kulcsrtk nem tallhat a fban.
A fggvny visszatrsi rtke kulcshoz tartoz rtket jelli a me-
mriban vagy NULL, ha a kulcsrtk nem tallhat.
void g_tree_foreach(GTree
*
fa, GTraverseFunc fggvny,
gpointer adat); A fggvny segtsgvel bejrhatjuk a keres of-
ban trolt elemeket. A fggvny a kulcsok nvekv o sorrendjben
bejrja a keres ofa elemeit s a megadott mutat segtsgvel
minden csomponttal meghvja az ltalunk megadott fggvnyt.
A fggvny paramterei a kvetkez ok:
fa A keres oft jelli a memriban.
fggvny A fggvny, amelyet a keres ofa minden elemvel meg
akarunk hvni. Ez a fggvny nem mdosthatja a keres ofa
szerkezett, nem helyezhet el j elemeket s nem tvolthat el
elemeket.
gtk 2007/10/21 14:22 page 114 #114
114
adat Mutat, amelyet a msodik paramterrel meghatrozott fgg-
vnynek t szeretnnk adni paramterknt.
Ha a bejrst arra szeretnnk hasznlni, hogy a segtsgvel bi-
zonyos felttelnek megfelel o elemeket eltvoltsunk a keres ofbl,
akkor az egyez o elemeket egy kln adatszerkezetben pldul
dupln lncolt listban el kell helyeznnk, majd amikor a
g_tree_foreach() fggvny visszatr a listban szerepl o eleme-
ket el kell tvoltanunk a keres ofbl.
gboolean GTraverseFunc(gpointer kulcs, gpointer rtk,
gpointer adat); A keres ofa bejrsa sorn meghvott fggvny
tpusa. Ilyen tpus fggvny mutatjt kell a g_tree_foreach()
fggvny msodik paramtereknt tadnunk.
A fggvny els o s msodik paramtere az aktulis kulcsot s rt-
ket jelli a memriban. A harmadik paramter az a mutat, ame-
lyet a bejrs indtsakor megadtunk.
A fggvnynek TRUE rtket kell visszaadnia ahhoz, hogy a bej-
rst megszaktsa. Ha a fggvny FALSE rtket ad vissza a bejrs
folytatdik.
void g_tree_remove(GTree
*
fa, gconstpointer kulcs); A fgg-
vny segtsgvel a keres ofban tallhat elemet eltvolthatjuk a
kulcsrtk ismeretben. Ha a fa ltrehozsakor megadtuk az rtk
s/vagy kulcs felszabadtst vgz o fggvnyt, a g_tree_remove()
meghvja ezeket is.
A fggvny els o paramtere a keres oft, msodik paramtere pedig
az eltvoltand elem kulcsrtkt jelli a memriban.
void g_tree_destroy(GTree
*
fa); A fggvny segtsgvel a tel-
jes keres oft megsemmisthetjk. Ha a fa ltrehozsakor meg-
adtuk a kulcs s/vagy elem felszabadtst vgz o fggvnyt a
g_tree_destroy() minden elemre elvgzi a felszabadtst is.
A fggvny paramtere a megsemmistend o ft jelli a memriban.
4.7. llomnykezels
A G programknyvtr nhny kit un o eszkzt biztost a programoz sz-
mra az llomnyok kezelsre. Az eszkzk egy rsze az llomnynevek
opercis rendszert ol fgetlen kezelsben nyjt hathats segtsget, egy
msik rsze pedig az esemnyvezrelt programozsba jl beilleszthet o,
prhuzamos programozsra is felksztett eszkztrat biztost az llo-
mnykezels segtsre. A kvetkez o oldalakon ezekr ol az eszkzkr ol
olvashatunk.
gtk 2007/10/21 14:22 page 115 #115
115
4.7.1. Az llomnynevek kezelse
A G programknyvtr az llomnyok nevnek s elrsi tjuknak a ke-
zelsre a kvetkez o a hasznlt opercis rendszert ol fggetlenl hasz-
nlhat fggvnyeket biztostja.
gchar
*
g_build_path(const gchar
*
elvlaszt, const gchar
*
nv1, ...); A fggvny segtsgvel a knyvtrbejegyzst eleme-
ib ol pthetjk fel. Klnsen alkalmas ez a fggvny arra, hogy
az elrsi tbl ami esetleg tbb knyvtrnevet is tartalmaz s
az llomny nevb ol el olltsuk a teljes elrsi utat, ami alapjn az
llomny megnyithatjuk.
A fggvny els o paramtere a knyvtrak nevt az elrsi tban
elvlaszt jelet tartalmaz karakterlnc. Itt kit un oen hasznlhatjuk
a mr bemutatott G_DIR_SEPARATOR_S llandt.
A fggvny tovbbi paramterei azok a karakterlncok, amelyekb ol
a teljes elrsi utat el o akarjuk lltani. Az utols paramternek
NULL rtk unek kell lennie.
A fggvny visszatrsi rtke olyan dinamikusan foglalt memria-
terletre mutat, ahol a teljes llomnynevet talljuk a szoksos m-
don 0 rtkkel lezrva.
gchar
*
g_build_filename(const gchar
*
nv1, ...); Ez a fgg-
vny nagyon hasonlt a g_build_path() fggvnyhez, de a hasz-
nlata kzben nem kell s nem is lehet megadni az elvlaszt-
jelet, a fggvny mindig az adott opercis rendszernek megfelel o
jelet vlasztja.
Nem szabad elfelejtennk, hogy a fggvny utols paramternek
NULL rtk unek kell lennie.
gchar
*
g_find_program_in_path(const gchar
*
progamnv); A
fggvny segtsvel az svny (path) ltal meghatrozott helyeken
kereshetnk futtathat programllomnyokat. Ez a fggvny ppen
gy keresi a megadott llomnyt, mint azok az eszkzk, ame-
lyekkel a programokat elindthatjuk, gy is mondhatnnk, hogy
ugyanazt a programot fogja megtallni amelyiket elindtannk.
A fggvny paramtere a program neve, visszatrsi rtke pedig a
program teljes elrsi tjt tartalmaz dinamikusan foglalt mem-
riaterlet, ha a program az svny valamelyik pontjn megtallhat,
NULL, ha nem.
gchar
*
g_path_get_basename(const gchar
*
teljes_nv); E
fggvny segtsgvel az llomny teljes elrsi tjbl el ollthat-
juk az llomnynevet, az llomny nevnek knyvtrnv nlkli
rszt.
gtk 2007/10/21 14:22 page 116 #116
116
A fggvny paramtere az llomny teljes elrsi tja, visszatrsi
rtke pedig olyan mutat, ami a dinamikus memriaterletet jelli
a memriban, ahol a fggvny az llomny nevt elhelyezte.
gchar
*
g_path_get_dirname(const gchar
*
teljes_nv); E fgg-
vny nagyon hasonlt a g_path_get_basename() fggvnyhez, de
azzal ellenttben a teljes nv knyvtrnv rszt adja vissza, nem
pedig az llomnynv rszt.
gboolean g_path_is_absolute(const gchar
*
nv); E fggvnnyel
megllapthatjuk, hogy az llomnynv abszolt elrsi utat
tartalmaz-e.
A fggvny paramtere az llomny nevt jell o mutat, visszatrsi
rtke pedig igaz, ha a nv abszolt elrsi utat tartalmaz.
Gyakran el ofordul, hogy a felhasznl sajt knyvtrban tallhat l-
lomnyt szeretnnk megnyitni vagy ms mdon hasznlni attl fgget-
lenl, hogy a program munkaknyvtra ppen mi. Ilyenkor a legegysze-
r ubb, ha az llomnyra a teljes ms nven abszolt elrsi ttal hi-
vatkozunk. Ezt mutatja be a kvetkez o plda.
18. plda. A kvetkez o programrszlet bemutatja hogyan llthatjuk el o
a felhasznl sajt knyvtrban tallhat llomny abszolt elrsi t-
jt a sajt knyvtr nevnek lekrdezsvel.
1 gchar
*
filename;
2
3
4 filename = g_build_path(G_DIR_SEPARATOR_S,
5 g_getenv("HOME"),
6 ".bash_history", NULL);
7
8 if (g_stat(filename, &stat_buf) != 0){
9 g_warning("Unable to stat file %s", filename);
10 g_free(filename);
11 return NULL;
12 }
A programrszletben az 5. sorban lthatjuk a g_getenv() fggvny hv-
st. E fggvny a krnyezeti vltozk lekrdezsre hasznlhat s mivel
a hagyomny szerint a HOME krnyezeti vltoz a felhasznl sajt knyv-
trnak ebszolt elrsi tjt tartalmazza, a fggvny a szmunkra na-
gyon hasznos.
Az llomny teljes elrsi tjt a knyvtrnvb ol s az llomny nevb ol
a 46. sorokban lltjuk el o s a 8. sorban kezdjk hasznlni.
gtk 2007/10/21 14:22 page 117 #117
117
Figyeljk meg a 10. sorban, hogy az llomnynevet trol terletet a
hasznlat utn fel kell szabadtanunk. A g_getenv() fggvny azonban
nem dinamikusan foglalt memriaterlet cmt adja vissza, ezrt ezt a
terletet nem is szabad felszabadtanunk.
4.8. A parancssori kapcsolk kezelse
A parancssorban a programnak tadott kapcsolk s paramterek egy-
szer u felhasznli felletet biztostanak a felhasznl szmra, amellyel
a program viselkedst, m ukdst befolysolhatja. A felhasznl sz-
mra nagyon fontos a parancssorban megadhat kapcsolk hasznlata
mg akkor is, ha a program egybknt rendelkezik grakus felhasznli
fellettel, de egyszer ubb programok esetn el ofordulhat, hogy a program
viselkedst egyedl a parancssori paramterek segtsgvel lehet vez-
relni. A G programknyvtr nhny egyszer uen hasznlhat eszkzt biz-
tost a parancssori kapcsolk rtelmezsre. A kvetkez o oldalakon arrl
olvashatunk hogyan hasznlhatjuk ezeket az eszkzket.
A programok kapcsolira a kapcsolk rvid vagy hossz nevvel hi-
vatkozhatunk. A rvid kapcsolnevek egyetlen bet ub ol llnak (pldul
-h vagy -v), amelyeket egybe is rhatunk (pldul -hv). A hossz neve-
ket mindig kt kt ojellel vezetjk be (pldul --help) vagy --version.
A hossz neveket soha nem rhatjuk egybe. Nyilvnval, hogy a rvid
neveket a gpels egyszer ustsre, a hossz neveket pedig az olvashat-
sg rdekben hasznljuk, a rvid neveket teht els osorban az interaktv
hasznlat sorn, a hossz neveket pedig a hjprogramok ksztsekor
rszestjk el onyben.
Bizonyos kapcsolk rtket is kaphatnak. Az rtket a rvid kapcsolk
utn szkzzel elvlasztva rjuk (pldul -O 5), a hossz nevek utn pe-
dig az egyenl osgjellel jelljk (pldul --optimization=5). A kapcsolk
szmra szm jelleg u, szveges vagy llomnynv jelleg u rtket szoks
megadni.
Fontos tudnunk, hogy a legtbb program gy a G programknyvtr se-
gtsgvel ksztett programok is felttelezik, hogy a programnak nem
adunk kapcsolkat a klnleges, -- rtk u argumentum utn. Ez az esz-
kz teszi lehet ov, hogy a programnak olyan szveges argumentumokat
adjunk t, amelyek kt ojellel kezd odnek. Ha pldul az rm programmal
a -fjl llomnyt akarjuk trlni, akkor az rm -- -fjl parancsot kell
begpelnnk, mert az rm program felttelezi, hogy a -- utni argumen-
tumok mindegyike llomnynv.
Lthat, hogy a parancssori argumentumok rtelmezse nem egyszer u
s ha be akarjuk tartani a legkisebb meglepets elvt (amely igen fon-
tos a felhasznlk megelgedettsgnek szempontjbl), szerencss, ha
az ltalunk ksztett alkalmazs a tbbi programhoz hasonlan krlte-
gtk 2007/10/21 14:22 page 118 #118
118
kint o mdon kezeli az argumentumait. Ebben nyjt komoly segtsget a
G programknyvtr nhny eszkze.
A programok kapcsolinak tulajdonsgait a G programknyvtr a
GOptionEntry struktrban trolja, amely a kvetkez o komponenseket
tartalmazza:
A GOptionEntry struktra
const gchar
*
long_name A kapcsol hossz neve.
gchar short_name A kapcsol rvid neve.
gint flags A kapcsol lthatsga.
GOptionArg arg Az rtk tpusa.
gpointer arg_data Az rtk.
const gchar
*
description A kapcsol lersa.
const gchar
*
arg_description Az argumentum jele.
A struktra elemei a kvetkez o jelentssel brnak:
long_name A kapcsol hossz neve a -- jelek nlkl.
short_name A kapcsol rvid neve a - jel nlkl (egyetlen bet u).
flags A kapcsol nhny egyszer u tulajdonsgt hatrozza meg ez az
elem. Itt a kvetkez o llandkbl binris vagy kapcsolattal ksztett
rtk adhat meg:
G_OPTION_FLAG_HIDDEN Ha ezt az bitet bekapcsoljuk a kapcsol
rejtett lesz, nem jelenik meg a --help kapcsol hatsra kirt
sgben.
G_OPTION_FLAG_IN_MAIN Ha ezt a bitet bekapcsoljuk a kapcsol
mindig a kapcsolk kzponti szakaszban szerepel, akkor is,
ha ms szakaszban hoztuk ltre (e knyvben nem trgyaljuk a
kapcsolk szakaszokra osztst, az alpontok ltrehozst).
G_OPTION_FLAG_REVERSE A ki- s bekapcsolhat kapcsolknl
hasznlatos ez a bit, amely arra utal, hogy a kapcsol hatsa
ellentes, ha hasznljuk a program adott szolgltatst kikap-
csoljuk.
Ha a bemutatott klnleges tulajdonsgokat nem kvnjuk meg-
adni, akkor ennek a mez onek a helyn hasznljuk a 0 rtket!
arg Ez a mez o azt hatrozza meg, hogy a kapcsol milyen rtket kap-
hat, milyen tpus rtket lehet megadni a parancssorban a kap-
csol utn. Itt a kvetkez o llandkat hasznlhatjuk:
G_OPTION_ARG_NONE A kapcsol rtket nem kaphat, egyszer uen
csak be- s kikapcsolni lehet.
gtk 2007/10/21 14:22 page 119 #119
119
G_OPTION_ARG_STRING A kapcsol rtkknt karakterlncot kap-
hat.
G_OPTION_ARG_INT A kapcsol rtkknt egsz szmot kaphat.
G_OPTION_ARG_CALLBACK A kapcsolhoz egy fggvny cmt kell
megadnunk, amely a kapcsol szveges rtkt kirtkeli.
G_OPTION_ARG_FILENAME A kapcsolhoz rtkknt llomnynevet
adhatunk meg.
G_OPTION_ARG_STRING_ARRAY A kapcsolhoz rtkknt karakter-
lncokbl ll listt adhatunk meg.
G_OPTION_ARG_FILENAME_ARRAY A kapcsol rtke llomnyne-
vekb ol ll lista lehet.
arg_data A mez o a kapcsolhoz tartoz terlet memriabeli cmt ha-
trozza meg. Ennek a cmnek az rtelmezse attl fgg, hogy a arg
mez o milyen tpust mutat:
G_OPTION_ARG_NONE Az arg_data mez o rtke egy gboolean t-
pus vltozt jell a memriban, ahol a G programknyvtr
jelzi, hogy ez a kapcsol be volt -e kapcsolva vagy sem.
G_OPTION_ARG_STRING Az arg_data mez o rtke egy gchar
*
t-
pus mutatt jell a memriban, ahov a G programknyvtr
a kapcsolhoz rendelt rtket elhelyezi.
G_OPTION_ARG_INT Az arg_data mez o rtke egy gint tpus vl-
tozt jell a memriban, ahov a G programknyvtr a kap-
csolhoz rendelt szm jelleg u rtket elhelyezi.
G_OPTION_ARG_CALLBACK Az arg_data mez o rtke egy gboolean
(
*
GOptionArgFunc)(const gchar
*
kapcsolnv, const
gchar
*
rtk, gpointer csoport, GError
**
hiba);
tpus fggvnyt jell a memriban, amelyet a G program-
knyvtr meghv, ha a felhasznl az adott kapcsolt hasznlta
a program indtsakor.
G_OPTION_ARG_FILENAME Az arg_data mez o rtke egy gchar
*
tpus mutatt jell a memriban, ahov a G programknyv-
tr a kapcsolhoz rendelt llomnynevet elhelyezi.
G_OPTION_ARG_STRING_ARRAY Az arg_data rtke egy gchar
**
tpus mutatt jell a memriban, ahov a G programknyv-
tr a karakterlncok cmeit tartalmaz tblzat cmt elhelyezi.
G_OPTION_ARG_FILENAME_ARRAY Az arg_data rtke egy gchar
**
tpus mutatt jell a memriban, ahov a G program-
knyvtr az llomnynevek cmeit tartalmaz tblzat cmt el-
helyezi.
gtk 2007/10/21 14:22 page 120 #120
120
description A kapcsolhoz tartoz magyarzszveget jelli a mem-
riban, amelyet a G programknyvtr a --help kapcsol hatsra
kir a kapcsol neve mell.
arg_description A kapcsol rtknek jele, amelyet a G program-
knyvtr a --help kapcsol hatsra megjelentett sgban hasz-
nl.
A bemutatott struktra segtsgvel lerhatjuk a programunk kapcsol-
inak tulajdonsgait, a kvetkez o fggvnyekkel pedig kezelhetjk a prog-
ram indtsakor a felhasznl ltal megadott kapcsolkat:
GOptionContext
*
g_option_context_new(const gchar
*
szveg); A fggvny segtsgvel j krnyezetet hozhatunk
ltre a parancssori argumentumok kezelsre. Minden program
szmra legalbb egy ilyen krnyezetet ltre kell hoznunk.
A fggvny argumentumaknt tadott karakterlnc a --help hat-
sra megjelen o sgszveg elejn jelenik meg (lsd a 19. pldt).
void g_option_context_free(GOptionContext
*
krnyezet); A
fggvny segtsgvel a parancssori argumentumok kezelsre
ltrehozott krnyezetet semmisthetjk meg, ha mr nincs r
szksgnk. A fggvnynek tadott argumentum az a mutat,
amelyet a g_option_context_new() fggvny adott vissza.
gboolean g_option_context_parse(GOptionContext
*
krnyezet, gint
*
argc, gchar
***
argv, GError
**
hiba);
A fggvny a programnak tadott parancssori kapcsolk s argu-
mentumok rtelmezst vgzi el. A fggvny argumentumai a k-
vetkez ok:
krnyezet A fggvny els o paramtere a krnyezet mutatja, ame-
lyet a g_option_context_new() fggvnnyel hoztunk ltre.
argc A fggvny msodik paramtere a main() fggvny ha-
gyomnyosan argc nvvel ltrehozott els o argumentumt
amely a program argumentumainak szmt adja meg jelli a
memriban. A g_option_context_parse() fggvny a prog-
ram argumentumainak szmt megvltoztatja, mert eltvoltja
a mr rtelmezett kapcsolkat.
argv A fggvny harmadik paramtere a main() fggvny hagyo-
mnyosan argv nev u msodik argumentumnak cme.
hiba A fggvny utols paramtere egy GError tpus mutat,
ahova a fggvny a hiba lerst helyezi el, ha a program para-
mtereinek rtelmezse nem sikeres.
gtk 2007/10/21 14:22 page 121 #121
121
A fggvny visszatrsi rtke megadja, hogy a program paramte-
reinek rtelmezse az adott krnyezet szerint sikeres volt -e. Ha a
fggvny visszatrsi rtke TRUE a felhasznl ltal begpelt kap-
csolk megfeleltek a krnyezetnek, ha FALSE a kapcsolk rtelme-
zse sorn a fggvny hibt tallt.
A fggvny az rtelmezett kapcsolkat eltvoltja a program argu-
mentumai kzl, ezrt a megmaradt argumentumokat pldul a
kapcsolk utn tallhat llomnyneveket knnyedn tudjuk ke-
zelni.
Ha a fggvny hibt tallt az argumentumok rtelmezse kzben, a
hiba lerst tartalmaz adatszerkezet cmt elhelyezi az utols ar-
gumentum ltal jellt memriacmre (lsd a 19. plda programjt).
void g_option_context_set_ignore_unknown_options(GOptionContext
*
krnyezet, gboolean melloz); A fggvny segtsgvel bel-
lthatjuk, hogy az adott krnyezetben gyelmen kvl kvnjuk -e
hagyni az ismeretlen kapcsolkat.
void g_option_context_add_main_entries(GOptionContext
*
krnyezet, const GOptionEntry
*
kapcsolk, const gchar
*
nv); A fggvny segtsgvel a krnyezethez adhatjuk a hasz-
nlni kvnt kapcsolk lerst. A fggvny argumentumai a
kvetkez ok:
krnyezet Az els o argumentum a krnyzetet jelli a memriban,
amelyhez a kapcsolk listjt hozz kvnjuk adni.
kapcsolk A kapcsolk listjt tartalmaz tmbt kijell o mutat.
Ezek a kapcsolk kerlnek be a krnyezetbe a fggvny futsa
sorn.
A kapcsolkat tartalmaz tmb utols elemnek NULL rtk u-
nek kell lennie.
nv A fggvny utols paramtere megadja, hogy a magyarzsz-
vegek fordtshoz milyen adatbzisra, milyen programnvre
kell hivatkozni. Ez a karakterlnc a legtbb esetben megegye-
zik az alkalmazs nevvel.
19. plda. A kvetkez o plda bemutatja hogyan fogadhatjuk a parancs-
sorban megadott argumentumokat a G programknyvtr ltal biztostott
eszkzk segtsgvel. A bemutatott programrszlet futtatst mutatjk
be a kvetkez o sorok:
$ src/hbasic --help
Usage:
hbasic [OPTION...] [FILE]
gtk 2007/10/21 14:22 page 122 #122
122
Basic language interpreter and compiler with debugging options.
Help Options:
-?, --help Show help options
Application Options:
-y, --debug-parser Debug parser.
-d, --dump Dump program and exit.
-O, --optimization=level Optimization level.
$
Figyeljk meg, hogy a kapcsolk magyarzatt a szoksos formban
kirta a program. Ez a szolgltats automatikus, a G programknyvtr
fggvnyei biztostjk.
Figyeljk most meg, hogy mi trtnik, ha olyan kapcsolt hasznlunk,
amelyre a program nincs felkszlve:
$ src/hbasic -n
**
(hbasic:7644): WARNING
**
: Error parsing command line options:
Unknown option -n
$
Amint ltjuk a helytelen kapcsol hatsra a program futsa megsza-
kadt. A helytelen kapcsol rzkelst elvgzi a G programknyvtr, de
azt, hogy mi trtnjk ilyen esetben, azt magunknak kell eldntennk.
Vizsgljuk most meg a programrszletet, amely a parancssori kapcso-
lk elemzst vgzik!
1 gboolean debug = FALSE;
2 gboolean dump = FALSE;
3 gint optm = 0;
4
5 int main(int argc, char
*
argv[]){
6 GError
*
error = NULL;
7 GOptionContext
*
context;
8 static GOptionEntry entries[] =
9 {
10 {
11 "debug-parser", y,
12 0,
13 G_OPTION_ARG_NONE, &debug,
14 "Debug parser.", NULL
15 },
16 {
gtk 2007/10/21 14:22 page 123 #123
123
17 "dump", d,
18 0,
19 G_OPTION_ARG_NONE, &dump,
20 "Dump program and exit.", NULL
21 },
22 {
23 "optimization", O,
24 0,
25 G_OPTION_ARG_INT, &optm,
26 "Optimization level.", "level"
27 },
28 {NULL}
29 };
30
31 context = g_option_context_new ("[FILE]\n\n"
32 "Basic language interpreter and compiler "
33 "with debugging options.");
34
35 g_option_context_add_main_entries(context,
36 entries,
37 PACKAGE);
38 if (!g_option_context_parse(context, &argc, &argv,
39 &error)){
40 g_warning("Error parsing command line options: %s",
41 error->message);
42 exit(EXIT_FAILURE);
43 }
44
45 g_option_context_free(context);
46
47 return yyparse();
48 }
A programrszlet 829. sorban lthatjuk a program ltal fogadott kap-
csolk tulajdonsgait ler tmbt. Figyeljk meg a 28. sorban a tmb
utols elemt jell o NULL rtket, amely igen fontos szerepet tlt be. A
tmb 13., 19. s 25. sorban gyelhetjk meg a hivatkozsokat azokra
a vltozkra, amelyekben a G programknyvtr a kapcsolkhoz rendelt
rtkeket elhelyezi.
A programban meggyelhetjk hogyan hozzuk ltre a kapcsolk rtel-
mezsre szolgl krnyezetet (3133. sor), hogyan helyezzk el benne
a kapcsolk lerst (3537. sor), hogyan rtelmezzk a kapcsolkat s
hogyan vizsgljuk meg, hogy az rtelmezs tallt -e hibt (3843. sor) s
hogyan szabadtjuk fel a lefoglalt er oforrsokat (45. sor).
gtk 2007/10/21 14:22 page 124 #124
124
El ofordulhat, hogy a Glade programmal ksztett, grakus fellettel
rendelkez o program szmra szeretnnk jabb parancssori kapcsolkat
ltrehozni. Ekkor a kvetkez o fggvnyeket szintn rdemes megismer-
nnk:
void gtk_init(int
*
argc, char
***
argv); E fggvny a GTK+
programknyvtr kezdeti belltsra szolgl, amelyet a GTK+ prog-
ramknyvtr szolgltatsainak ignybe vtele el ott mindenkppen
meg kell hvni (azonban nem felttlenl ezzel a fggvnnyel).
Ha a grakus fellethez nem lehet kapcsoldni, akkor a
gtk_init() megszaktja a program futst. Ha ez a viselkeds nem
felel meg, a GTK+ kezdeti belltst ms fggvny hvsval kell el-
vgeznnk.
A gtk_init() argumentumai a szabvnyos main() fggvny argu-
mentumainak cme. A fggvny a mutatkon keresztl megkeresi
az argumentumokat s az ltala feldolgozott kapcsolkat s szve-
ges argumentumokat eltvoltja. Ez a roppant intelligens viselkeds
lehet ov teszi, hogy a gtk_main() visszatrse utn mr ne kell-
jen foglalkoznunk azokkal az argumentumokkal, amelyeket a GTK+
programknyvtr fogad.
A gtk_init() fggvny hvst a Glade program elhelyezi a main.c
llomnyban, de ez bizonyos esetekben egszen biztosan nem felel
meg a cljainknak, ezrt el kell tvoltanunk s ms fggvnnyel
kell helyettestennk.
gboolean gtk_init_check(int
*
argc, char
***
argv); A fgg-
vny m ukdse megegyezik a a gtk_init() fggvny m ukdsvel
egy apr klnbsgt ol eltekintve. Ez a fggvny nem szaktja meg a
program futst, ha nem lehet kapcsoldni a grakus felhasznli
fellethez, egyszer uen csak FALSE rtket ad vissza.
Nyilvnval, hogy ha a programunkat karakteres felleten is hasz-
nlhatv akarjuk tenni, akkor a gtk_main() fggvny hvst
le kell cserlnnk a gtk_init_check() fggvny hvsra s ha
FALSE rtket kapunk vissza, akkor gondoskodnunk kell a karak-
teres felhasznli fellet elindtsrl.
gboolean gtk_init_with_args(int
*
argc, char
***
argv,
char
*
paramter_lers, GOptionEntry
*
kapcsolk, char
*
nyelv, GError
**
hiba); Ez a fggvny szintn a GTK+ prog-
ramknyvtr kezdeti belltst vgzi el. Akkor hasznljuk, ha a
programunk szmra sajt kapcsolkat szeretnnk ltrehozni. A
fggvny argumentumainak s visszatrsi rtknek jelentse a
kvetkez o:
gtk 2007/10/21 14:22 page 125 #125
125
visszatrsi rtk Igaz, ha a grakus fellethez sikerlt csatla-
kozni, hamis, ha nem.
argc A main() fggvny els o paramternek cme.
argv A main() fggvny msodik paramternek cme.
paramter_lers A karakterlnc, amelyet a program a --help
kapcsol hatsra megjelen o sgszvegben a program neve
utn kir. Ebben a karakterlncban ltalban a kapcsolkon
kvli paramtereket pldul bemen o llomny s a prog-
ram funkcijnak egysoros lerst szoks megadni.
kapcsolk A program ltalunk ksztett kapcsolinak lerst
megad tmb. A gtk_init_with_args() fggvnyt ltalban
azrt hasznljuk, mert sajt parancssori kapcsolkat szeret-
nnk ltrehozni, amelyet itt adhatunk meg.
nyelv A nyelv szveges kdja, amelyet a --help kapcsol hatsra
megjelen o sgszveg lefordtsakor szeretnnk megadni. En-
nek a kapcsolnak a helyn ltalban NULL rtket adunk meg
az alaprtelmezett nyelv kivlasztsra.
hiba Annak a mutatnak a cme, ahov a fggvny az esetleges
hiba meghatrozst elhelyezi vagy NULL, ha nem krjk ezt a
szolgltatst.
A kvetkez o plda bemutatja hogyan alakthatjuk t a Glade ltal k-
sztett programot gy, hogy az ltalunk ltrehozott kapcsolkat s para-
mtereket is fogadja a GTK+ programknyvtr kapcsoli mellett.
20. plda. A kvetkez o programrszlet a Glade ltal ksztett main.c l-
lomny mdostott vltozatt mutatja be. A rszlet tartalmazza a prog-
ram sajt kapcsolinak feldolgozst vgz o fggvnyt s azoknak a fgg-
vnyeknek a hvst, amelyek a grakus felhasznli fellet kezdeti be-
lltsra szolglnak.
1 static void
2 program_init (int
*
argc, char
***
argv)
3 {
4 gboolean hasX;
5 GError
*
error = NULL;
6 static GOptionEntry entries[] = {
7 {
8 "height", h,
9 0, G_OPTION_ARG_INT, &option_height,
10 "The height of the created image.", "PIXELS"
11 },
12 {
gtk 2007/10/21 14:22 page 126 #126
126
13 "width", w,
14 0, G_OPTION_ARG_INT, &option_width,
15 "The width of the created image.", "PIXELS"
16 },
17 {
18 "output", o,
19 0, G_OPTION_ARG_STRING, &option_outfilename,
20 "The output file name.", "FILENAME"
21 },
22 {
23 NULL
24 }
25 };
26
27 hasX = gtk_init_with_args(argc, argv,
28 "filename - convert binary to printable image",
29 entries,
30 NULL,
31 &error);
32
33 if (!hasX)
34 g_error("Could not connect to the screen.");
35
36 if (error != NULL)
37 g_error("Init error: %s", error->message);
38
39 if (
*
argc < 2)
40 g_error("Missing input file.");
41 else
42 option_infilename = (
*
argv)[1];
43 }
44
45 int
46 main (int argc, char
*
argv[])
47 {
48 GtkWidget
*
window1;
49
50 #ifdef ENABLE_NLS
51 bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);
52 bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
53 textdomain (GETTEXT_PACKAGE);
54 #endif
55
56 /
*
gtk 2007/10/21 14:22 page 127 #127
127
57
*
Handling options.
58
*
/
59 program_init (&argc, &argv);
60
61 /
*
62
*
The following code was added by Glade to create one
63
*
of each component (except popup menus), just so
64
*
that you see something after building the project.
65
*
Delete any components that you dont want shown
66
*
initially.
67
*
/
68 window1 = create_window1();
69 gtk_widget_show(window1);
70 gtk_main ();
71 return 0;
72 }
A plda 141. soraiban tallhat a init_program() fggvny, ami a
program s a GTK+ programknyvtr kezdeti belltst elvgzi. A fgg-
vny a main() argumentumainak cmt kapja meg, hogy a feldolgozott
kapcsolkat elvtolthassa.
A 625. sorok kzt a program szmra bevezetett kapcsolk ler-
st lthatjuk. Figyeljk meg, hogy a programnak hrom jabb kap-
csolt hozunk ltre, amelyek egsz s karakterlnc tpus argumentu-
mokat is fogadnak. A 9., 14. s 19. sorok szerint ezeknek a kapcsol-
argumentumoknak a trolsra globlis vltozkat hasznlunk. (A kap-
csolk kezelsre a globlis vltozk tkletesen alkalmasak, hiszen nyil-
vnvalan csak egy pldnyban lteznek.)
A GTK+ programknyvtr kezdeti rtknek belltsra a 2731. sor-
ban hvott gtk_init_with_args() fggvnyt hasznljuk. A fggvny-
nek tadott karakterlnc (28. sor) tansga szerint a programunk min-
denkppen kell, hogy kapjon egy llomnynevet, amihez nem tartozik
kapcsol. Ez a bemen o llomny neve.
A kezdeti bellts utn a 3342. sorokban megvizsgljuk az ered-
mnyt. Ha a gtk_init_with_args() visszatrsi rtke hamis azaz
nem sikerlt kapcsoldni a grakus fellethez a 34. sorban hibazene-
tet runk ki, majd kilpnk. (A g_error() makr megszaktja a program
futst.)
Ha a kezdeti bellts nem sikerlt mert pldul a felhasznl hibs
formban adta meg a kapcsolkat a gtk_init_with_args() a hiba
jellegt ler adatszerkezet cmt elhelyezi a GError tpus struktrban,
aminek a cmt a 36. sorban vizsgljuk. Hiba esetn a 37. sorban kirjuk
a hiba szveges lerst, majd kilpnk. (A GError struktra message
mez oje a szveges lerst jell o mutat.)
gtk 2007/10/21 14:22 page 128 #128
128
A gtk_init_with_args() az sszes argumentumot eltvoltja, miutn
feldolgozta, ha teht a felhasznl a program neve utn nem adott meg
bemen o llomnynevet, akkor az argc vltoz rtke 1 lesz. A 3942.
sorokban megvizsgljuk, hogy maradt-e argumentum. Ha igen, akkor azt
troljuk egy globlis vltozban (42. sor), ha nem, hibazenetet runk ki
s kilpnk (40. sor).
A main() fggvnyt a 4572. sorokban lthatjuk. Ez a Glade ltal el-
helyezett sorokat ppen gy tartalmazza, mint a mdostsokat, amelyek
ahhoz szksgesek, hogy a program a sajt kapcsoli kezelje.
Az 5054. sorok kzt a tbbnyelv u felhasznli fellettel rendelkez o
programok tmogatshoz szksges fggvnyhvsokat tartalmazza,
ahogyan azt a Glade elhelyezte az llomnyban.
A program_init fggvny hvst az 59. sorban lthatjuk. Figyeljk
meg, hogy a fggvny argumentumknt a main() argumentumainak c-
mt kapja meg, hogy a feldolgozott kapcsolkat eltvolthassa.
A 6171. sorok kzt a grakus felhasznli fellet megjelentshez
szksges sorokat lthatjuk, ahogyan azokat a Glade elksztette. A
program ezen rszr ol a 7.1. szakaszban olvashatunk rszletesebben.
A program parancssori kapcsolirl szl rsz vgn rdemes egy szt
ejtennk arrl, hogy hogyan vlasszuk meg a kapcsolkat, milyen r-
vid s hossz neveket hasznljunk a jellskre. A legfontosabb alapelv-
nek, a legkisebb meglepets elvnek itt is rvnyeslnie kell. A kapcso-
lkat gy kell megvlasztanunk, hogy a tapasztalt felhasznlt ne rje
meglepets. A legjobb, ha olyan kapcsolkat, olyan neveket hasznlunk,
amelyekhez a felhasznlnak ms programokat hasznlva volt alkalma
hozzszokni.
gtk 2007/10/21 14:22 page 129 #129
5. fejezet
Osztlyok ksztse
A G programknyvtrat hasznl programoz el obb utbb eljut odig,
hogy sajt osztlyokat ksztsen gy teljes mrtkben kihasznlja az ob-
jektumorientlt programozs adta el onyket. A kvetkez o oldalakon arrl
olvashatunk, hogy milyen eszkzkkel tmogatja a G programknyvtr
az objektumorientlt programozst.
Tudnunk kell azonban, hogy a GTK+ segtsgvel osztlyok ltreho-
zsa nlkl is kszthetnk programokat. Az osztlyok segtsgvel a
programjainkat egyszer ubben, hatkonyabban elkszthetjk kln-
sen ami a bonyolult, sszetett alkalmazsokat illeti , de nem okvetlenl
kell hasznlnunk ezeket az eszkzket. Ha az olvas gy rzi, hogy az
itt bemutatott eszkzk megismerse nehzsgeket okoz nyugodtan t-
lpheti az egsz fejezetet, az osztlyok ltrehozsnak krdst ks obbre
halasztva.
5.1. Egyszer u osztly ksztse
Az osztlyok ltrehozst el oszr egy egyszer u pldn keresztl vizsgl-
juk meg. A plda csak a legszksgesebb eszkzket hasznlja s egy
valban egyszer u osztlyt hoz ltre. Nagyon fontos, hogy az itt bemu-
tatott eszkzket pontosan ismerjk, hiszen a bonyolultabb osztlyok,
kinomultabb eszkzk hasznlathoz mindezek az ismeretek szksge-
sek.
A plda a PipObject nev u egyszer u osztlyt kt llomnyban, egy fejl-
lomnyban s egy C llomnyban hozza ltre. A fejllomny tartalmazza
mindazokat a dencikat, amelyek az osztly hasznlathoz szksge-
sek, ezt az llomnyt teht be kell majd tltennk az #include utasts-
sal valahnyszor az osztlyt hasznljuk.
129
gtk 2007/10/21 14:22 page 130 #130
130
1 #ifndef PIPOBJECT_H
2 #define PIPOBJECT_H
3
4 #ifdef HAVE_CONFIG_H
5 # include <config.h>
6 #endif
7
8 #include <glib-object.h>
9 #include <pip/pip.h>
10 #define DEBUG
11 #define WARNING
12 #include <pip/macros.h>
13
14 #define PIP_TYPE_OBJECT \
15 (pip_object_get_type())
16
17 #define PIP_OBJECT(obj) \
18 (G_TYPE_CHECK_INSTANCE_CAST((obj), \
19 PIP_TYPE_OBJECT, \
20 PipObject))
21
22 #define PIP_OBJECT_CLASS(klass) \
23 (G_TYPE_CHECK_CLASS_CAST((klass), \
24 PIP_TYPE_OBJECT, \
25 PipObjectClass))
26
27 #define PIP_IS_OBJECT(obj) \
28 (G_TYPE_CHECK_INSTANCE_TYPE((obj), \
29 PIP_TYPE_OBJECT))
30
31 #define PIP_IS_OBJECT_CLASS(klass) \
32 (G_TYPE_CHECK_CLASS_TYPE((klass), \
33 PIP_TYPE_OBJECT))
34
35 #define PIP_OBJECT_GET_CLASS(obj) \
36 (G_TYPE_INSTANCE_GET_CLASS((obj), \
37 PIP_TYPE_OBJECT, \
38 PipObjectClass))
39
40 typedef struct _PipObject PipObject;
41 typedef struct _PipObjectClass PipObjectClass;
42
43 struct _PipObject
gtk 2007/10/21 14:22 page 131 #131
131
44 {
45 GObject parent_instance;
46 gboolean disposed;
47 };
48
49 struct _PipObjectClass
50 {
51 GObjectClass parent_instance;
52 };
53
54 /
****************************************************
55
*
Public declarations.
*
56
* *
57
* *
58
****************************************************
/
59 GType pip_object_get_type(void);
60 GObject
*
pip_object_new (void);
61 #endif
Az llomny 12. soraiban a fejllomnyt vd o el ofeldolgoz utastso-
kat olvashatjuk. Ez a szerkezet a szoksos mdon vdi az llomnyt a
tbbszrs betltst ol, a vge az llomny utols sorban olvashat.
Ezek utn a 412. sorokban a szksges fejllomnyok betltst lt-
hatjuk. Be kell tltennk mindazokat a fejllomnyokat, amelyek a dek-
larcikat tartalmazzk a rendszeren tallhat programknyvtrakhoz
s az alkalmazsunk egyb rszeihez. Ha osztlyt ksztnk, akkor min-
denkppen szksgnk lesz a glib-object.h llomnyban tallhat
deklarcikra, gy ezt az llomnyt valszn uleg be kell tltennk.
El ofordulhat viszint, hogy magasabb szint u szolgltatsokat haszn-
lunk s gy nem kell kzvetlenl hivatkoznunk a glib-object.h llo-
mnyra. Ha pldul betltjk a gtk/gtk.h llomnyt, akkor mr nincs
szksg arra, hogy a glib-object.h llomnyt betltsk, hiszen a
GTK+ programknyvtr a G programknyvtr objektumrendszerre pl.
A plda 1012. sorai az zenetek kirst segt o makrk deklarcciit
tartalmazaz, amelyeket az olvasnak megnak kell elksztenie.
Ezek utn a 14. sortl kezd od oen nhny igen fontos makr dekla-
rcijt olvashatjuk. E mkr nmelyikt az osztly ezen egyszer u, els o
vltozata nem haszhlja, mgis rdemes oket mr most elkszteni, mert
a ks obbiekben igen hasznosnak fognak bizonyulni. A makrk a G s
GTK+ programknyvtraknl meggyelhet o nvsmt hasznljk, hogy
knnyebb legyen megjegyezni oket.
A 1415. sorok a PIP_TYPE_OBJECT makrt hozzk ltre. Ez a makr
igen fontos, az ltalunk ltrehozott osztlyhoz tartoz tpusazonostt
gtk 2007/10/21 14:22 page 132 #132
132
adja vissza. A G programknyvtr GType tpus, szm jelleg u azonos-
tt rendel minden tpushoz gy minden osztlyhoz is. Az ltalunk lt-
rehozott osztly tpust a PIP_TYPE_OBJECT makr adja vissza, azaz
valahnyszor az ltalunk ltrehozott osztly tpusra akarunk hivat-
kozni ezt a makrt kell hasznlnunk. Figyeljk meg azonban, hogy a
PIP_TYPE_OBJECT makr csak a pip_object_get_type() fggvny h-
vst rja el o, azaz a feladatot elnapoltuk, de nem oldottuk meg. A teljes
megoldst a pip_object_get_type() fggvny megvalstsval fogjuk
elkszteni.
A 1720. sorokban a PIP_OBJECT() makr ltrehozst lthatjuk. A
makr a G_TYPE_CHECK_INSTANCE_CAST() makr segtsgvel vgez t-
pusknyszertst az ltalunk ltrehozott osztlyra (azaz pontosabban az
ilyen osztly objektumt jell o mutatra). Ez a makr szintn fontos, mr
lttuk milyen sokszor hasznljuk ezeket a tpusknyszert o makrkat.
A tpusknyszertshez a 19. sorban felhasznljuk az imnt bemuta-
tott PIP_TYPE_OBJECT makrt, ami az ltalunk ltrehozott tpus tpus-
azonostjt adja vissza. Szintn felhasznjuk a tpusknyszertshez a
PipObject tpusnevet, ami az osztlyt jelli (pontosabban az objektu-
mok trolsra szolgl adatszerkezet tpusnak neve). Ezt a tpusnevet
a ks obbiekben fogjuk ltrehozni.
A 2225. sorokban szintn egy tpusknyszert o makrt hozunk ltre,
ez azonban nem az objektum tpusr, hanem az osztly tpusra vltoz-
tatja az argumentum tpust. Ezt a makrt az osztly adatainak elrse-
kor hasznlhatjuk amire a ks obbiekben mg visszatrnk.
A 2729. sorokban ltrehozott PIP_IS_OBJECT() makr megvizsglja,
hogy a paramtereknt tadott mutat ltal jellt objektum az ltalunk
ltrehozott osztlyhoz tartozik -e. Fggvnyek paramtereinek ellen orz-
sekor, a polimorzmus megvalstsakor nyilvnval hasznos lehet egy
ilyen makr.
A tpusellen orzst a makr a 28. sorban tallhat
G_TYPE_CHECK_INSTANCE_TYPE() makr segtsgvel vgzi. Mr most
tudnunk kell err ol a makrrl, hogy a G programknyvtr ltal hasznlt
objektumot jell o mutatt vrja els o paramterknt, egy olyan mutatt,
ami egy GObject tpus adatszerkezetet jell a memriban. Ha nem
ilyen paramtert kap, a visszatrsi rtke hibs lehet, s ot az is el ofor-
dulhat ha az tadott memriaterlet mrete kisebb, mint a GObject
adatszerkezet mretnl kisebb , hogy a hvs miatt a programunk
slyos memriahiba miatt lell. Ha teht a PIP_IS_OBJECT() makrnak
tetsz oleges objektumot jell o mutatt adunk paramterknt semmi
problmnk nem lehet, nem adhatunk viszont t akrmilyen mutatt
bntetlenl. E krdsre az objektumok trolsnak bemutatsa sorn
mg visszatrnk.
A 3133. sorok kzt a PIP_IS_OBJECT_CLASS() tpusellen orz o mak-
rt hozzuk ltre. Ezzel a makrval az osztlyt ler adatszerkezet tpust
gtk 2007/10/21 14:22 page 133 #133
133
vizsglhatjuk meg ellenttben a PIP_IS_OBJECT() makrval, ami az ob-
jektum nem pedig az osztly tpust vizsglta.
A 3538. sorokban ltrehozott PIP_OBJECT_GET_CLASS() makr ki-
fejtst lthatjuk. Ez a makr egy PipObject tpus objektumot jell o
mutatt kap paramterl s visszaadja az objektum osztlyt a memri-
ban trol adatszerkezet cmt. Nyilvnval, hogy akkor hasznlhatjuk
ezt a makrt, ha az osztlyadatokat vagy az osztly metdusait akarjuk
elrni.
Mr az eddig bemutatott makrkbl is lthat, hogy a G programknyv-
tr az objektumot nyilvntartsra kt C nyelv u adatszerkezetet kt
C struktrt hasznl. Az egyik adatszerkezet az objektumot, a msik
adatszerkezet az osztlyt rja le. Az osztly lersra hasznlt adatszerke-
zetb ol mindig legfeljebb egy ltezik, az objektumot ler adatszerkezetb ol
pedig mindig annyi, ahny objektumot ltrehoztuk, azaz ahnyszor pl-
dnyostottuk az osztlyt (feltve persze, hogy egyetlen objektumot sem
semmistettnk meg). Az objektumorientlt programozsban jrtas olva-
sk szmra az osztlyok trolsra szolgl adatszerkezet kiss szokat-
lan lehet, hiszen ezeket az adatszerkezeteket az objektumorientlt prog-
ramozst tmogat nyelvek ltalban elrejtik a programoz el ol.
Nem kell azonban attl flnnk, hogy az osztly nyilvntartsra szol-
gl adatszerkezet hasznlata tlsgosan bonyolult lenne. A G program-
knyvtr az osztly els o pldnyostsakor (az els o adott osztlyhoz tar-
toz objektum ltrehozsakor) automatikusan ltrehozza az osztly tro-
lsra szolgl adatszerkezetet s valamikor az utols objektummegsem-
mistse utn fel is szabadtja azt. Mindez teht automatikusan trtnik,
a programoz pedig a megfelel o makr segtsgvel ami a pldnkban
a PIP_OBJECT_GET_CLASS() makr elrheti az osztlyadatokat s osz-
tlymetdusokat trol adatszerkezetet.
Az osztly objektumnak s az osztlynak a trolsra szolgl adat-
szerkezetek ltrehozst olvashatjuk a plda 4052. soraiban. Amint lt-
hatjuk a C nyelv struktrit hasznljuk ilyen clbl, ami elg nyilvn-
val, hiszen ezek a nyelvi elemek hasonltanak a leginkbb arra, amit az
objektumorientlt programozst tmogat nyelvekben hasznlunk.
Fontos krds azonban az rkl ods megvalstsa. A G program-
knyvtr tmogatja az rkl odst ami az objektumorientlt programozs
fontos alapeleme, ezrt az osztly s az objektum trolst is az rkl o-
ds tmogatsval kell elksztennk.
A pldban megvalstott PipObject osztly a GObject osztly leszr-
mazotta, azaz minden PipObject osztlyba tartoz objektum egyben a
GObject osztlyba tartoz objektum is. (A GObject osztly a G program-
knyvtr alaposztlya, minden osztly ennek az osztlynak a kzvetlen
vagy kzvetett leszrmazottja.) Az rkl ods brzolsra a G program-
knyvtr a C programozs egy bevett trkkjt hasznlja, amennyiben az
adatszerkezetek elejn a szl o adatszerkezetet tartalmazza.
gtk 2007/10/21 14:22 page 134 #134
134
A plda 45. sorban lthatjuk, hogy a PipObject objektum memriate-
rletnek elejn a GObject objektum adatszerkezete tallhat. Egy olyan
mutat teht, ami egy PipObject adatszerkezetet jell a memriban egy-
ben egy GObject objektum adatszerkezetet is jell. Ilyen mdon, a me-
mriamutatk segtsgvel megvalstottuk az rkl odst (a PipObject
adatszerkezet rklte a GObject adatszerkezet mez oit) s a tbbalak-
sgot (a mutat, ami PipObject tpust jelle egyben GObject tpust is
jell). gyelnnk kell azonban, hogy a 45. s az 51. sorokban meggyel-
het o smt hasznljuk, azaz a szl o mez oi a leszrmazott mez oi el ott,
az adatszerkezetek elejn megtallhatk legyenek, ezeket a mez oket az
egyes fggvnyek a cmk alapjn rik el, ha valami mst tettnk ide,
akkor minden remnytelenl sszekeveredik.
A pldnkban a PipObject a szl o objektumait csak egyetlen mez ovel,
a 46. sorban tallhat disposed taggal b ovti, mg az osztlyt egyltaln
nem b ovti, vltozatlanul hagyja.
A fejllomny vgn kt fggvny deklarcijt olvashatjuk. A
pip_object_get_type() fggvny a ltrehozott osztly szm jelleg u
azonostjt adja vissza, br ahogyan azt lttuk ezt a fggvnyt a leg-
tbbszr a PIP_TYPE_OBJECT makrn keresztl hasznljuk. A msik
fggvny a pip_object_new() , ami az osztly pldnyostst vgzi,
azaz az osztlyhoz tartoz objektumot hoz ltre. Ez tulajdonkppen csak
egy segdfggvny, hiszen ahogyan azt a ks obbiekben bemutatjuk a
pldnyostst a g_object_new() fggvnnyel is elvgezhetjk.
A fejllomny utn az osztlyt megvalst C llomnyt is bemutatjuk.
A C program a fejllomnyok betltst, egy globlis vltoz deklarcijt
s nhny alapvet oen fontos fggvny megvalstst tartalmazza.
1 #ifdef HAVE_CONFIG_H
2 # include <config.h>
3 #endif
4
5 #include "PipObject.h"
6 #include <pip/pip.h>
7 #define DEBUG
8 #define WARNING
9 #include <pip/macros.h>
10
11 /
*****************************************************
12
*
Static declarations.
*
13
* *
14
* *
15
*****************************************************
/
16 static GObjectClass
*
parent_class;
17 #define PIP_OBJECT_IS_DISPOSED(obj) ((obj)->disposed)
gtk 2007/10/21 14:22 page 135 #135
135
18 static void pip_object_class_init (PipObjectClass
*
);
19 static void pip_object_init (PipObject
*
);
20 static void pip_object_dispose (GObject
*
);
21 static void pip_object_finalize (GObject
*
);
22
23 /
**
24
*
pip_object_get_type:
25
*
@Returns: The registered type for #PipObject
26
*
27
*
Registers #PipObject as a new type of the GObject
28
*
system.
29
*
/
30 GType
31 pip_object_get_type(void)
32 {
33 static GType type = 0;
34
35 if (!type) {
36 PIP_DEBUG("Registering the PipObject class.");
37 static const GTypeInfo info = {
38 sizeof(PipObjectClass),
39 (GBaseInitFunc) NULL,
40 (GBaseFinalizeFunc) NULL,
41 (GClassInitFunc) pip_object_class_init,
42 (GClassFinalizeFunc) NULL,
43 NULL,
44 sizeof (PipObject),
45 0,
46 (GInstanceInitFunc) pip_object_init,
47 };
48
49 type = g_type_register_static (
50 G_TYPE_OBJECT,
51 "PipObject",
52 &info, 0);
53 }
54
55 return type;
56 }
57
58 /
**
59
*
pip_object_class_init:
60
*
61
*
Initializes the #PipObjectClass structure.
gtk 2007/10/21 14:22 page 136 #136
136
62
*
/
63 static void
64 pip_object_class_init(
65 PipObjectClass
*
klass)
66 {
67 GObjectClass
*
gobject_class = (GObjectClass
*
) klass;
68
69 PIP_DEBUG("Initializing the class.");
70 parent_class = g_type_class_peek_parent(klass);
71 /
*
72
*
The GObject virtual functions.
73
*
/
74 gobject_class->dispose = pip_object_dispose;
75 gobject_class->finalize = pip_object_finalize;
76 }
77
78 /
**
79
*
pip_object_init:
80
*
81
*
Instance initialization function.
82
*
/
83 static void
84 pip_object_init(
85 PipObject
*
self)
86 {
87 PIP_DEBUG("Initializing object %p.", self);
88 /
*
89
*
Initializing tags.
90
*
/
91 self->disposed = FALSE;
92 }
93
94 /
**
95
*
pip_object_dispose:
96
*
97
*
Drops all the references to other objects.
98
*
/
99 static void
100 pip_object_dispose(
101 GObject
*
object)
102 {
103 PipObject
*
self = PIP_OBJECT(object);
104
105 PIP_DEBUG("Disposing object %p", self);
gtk 2007/10/21 14:22 page 137 #137
137
106 /
*
107
*
The dispose function can be called multiple times.
108
*
/
109 if (self->disposed)
110 return;
111 self->disposed = TRUE;
112 /
*
113
*
Drop references here.
114
*
/
115
116 PIP_DEBUG("Calling the parents dispose function.");
117 G_OBJECT_CLASS(parent_class)->dispose(object);
118 }
119
120 /
**
121
*
pip_object_finalize:
122
*
123
*
Instance destructor function.
124
*
/
125 static void
126 pip_object_finalize(
127 GObject
*
object)
128 {
129 PipObject
*
self = PIP_OBJECT(object);
130
131 PIP_DEBUG("Destroying object %p", self);
132 /
*
133
*
Free the resources here.
134
*
/
135
136 PIP_DEBUG("Calling the parents finalize function.");
137 G_OBJECT_CLASS(parent_class)->finalize(object);
138 }
139
140 /
*****************************************************
141
*
Public functions.
*
142
* *
143
* *
144
*****************************************************
/
145
146 /
**
147
*
pip_object_new:
148
*
@returns: A new #PipObject
149
*
gtk 2007/10/21 14:22 page 138 #138
138
150
*
Creates a new #PipObject.
151
*
/
152 GObject
*
153 pip_object_new(void)
154 {
155 GObject
*
retval;
156
157 PIP_DEBUG("Creating a new object.");
158 retval = g_object_new(
159 PIP_TYPE_OBJECT, NULL);
160 return retval;
161 }
Az llomny legfontosabb fggvnye a 3056. sorok kzt olvashat
pip_object_get_type() fggvny, ami az j osztly nyilvntartsba
vtelt vgzi s amelyet amint azt a fejllomny bemutatsakor mr
lttuk ltalban a PIP_TYPE_OBJECT() makrn keresztl rnk el.
Ezt a fggvnyt igen sokszor hvjuk, a nyilvntartsba vtelt azon-
ban csak egyszer kell elvgezni, ezrt a fggvny egy statikus vlto-
zban (33. sor) trolja a G programknyvtr ltal adott tpusazono-
stt s egyszer uen visszaadja, ha a nyilvntarts mr el oz oleg meg-
trtnt. Az els o hvskor a 33. sor statikus vltozjnak rtke 0, gy
a fggvny az j osztlyt a 3752. sorok kzt nyilvntartsba veszi.
A nyilvntartsba vtel a GTypeInfo adatszerkezet ltrehozsval s a
g_type_register_static() fggvny hvsval trtnik.
Egyszer u osztlyrl lvn sz a tpusler GTypeInfo adatszerkezetben
csak ngy mez ot tltnk ki. A 38. s 44. sorokban az osztlyt s az osz-
tlyhoz tartoz objektumot tartalmaz adatszerkezet mrett adjuk meg.
Az osztlyt s az objektumokat a legtbb esetben dinamikus foglalt me-
mriaterleten hozzuk ltre, ezrt a G programknyvtrnak tudnia kell
mekkora helyet foglalnak ezek az adatszerkezet. Ez teht egyszer u, el-
tekintve taln attl, hogy ha ezeket a mez oket rosszul adjuk meg elg
misztikus s kiszmthatatlan hibkat okozhatunk, ezrt rdemes gyel-
mesen ellen orizni a mreteket.
A msik kt mez o a 41. s 46. sorokban olvashat fggvnymutatkat
kapja rtkl. A 41. sorban az osztly adatszerkezett az osztlyadato-
kat s osztlymetdusokat nyilvntart adatszerkezetet alapbelltst
vgz o fggvny cmt adjuk meg. Ezt a fggvnyt a G programknyvtr
az els o objektum ltrehozsa el ott hvja az osztly el oksztsre. A m-
sodik fggvny a 46. sorban lthat, az objektumok ltrehozsakor, az
objektum adatszerkezetnek alapbelltst vgzi el. Ezt a fggvnyt az
objektumorientlt programozsi mdszertan ltalban konstruktornak
hvja.
A tpus nyilvntartsba vtelt a 4952. sorokban a
gtk 2007/10/21 14:22 page 139 #139
139
g_type_register_static() fggvny vgzi. A fggvnynak els o
paramterknt a szl oosztly tpust adjuk t, amib ol termszete-
sen azonnal kvetkezik, hogy a szl oosztly nyilvntartsba vtele
mindig a leszrmazott osztly nyilvntartsba vtele el ott trtnik
(a g_type_register_static() fggvny hvsa el ott a paramterek
rtkt ki kell szmolni). A fggvny msodik paramtereknt az j
osztly nevt adjuk meg, harmadik paramreknt pedig az el oz oleg
ltrehozott tpusler adatszerkezet cmt. Az utols paramter csak
azt hatrozza meg, hogy absztrakt osztlyrl van -e sz, ezrt egyel ore
megelgedhetnk azzal, hogy itt 0 rtket adunk t.
A fggvny az 55. sorban visszaadja az osztly szm jelleg u azonost-
jt, amelyet a G programknyvtr az osztly nyilvntartsba vtele sorn
az osztlyhoz rendelt.
Az llomny msodik legfontosabb fggvnye az osztly alapbelltst
elvgz o pip_object_class_init() fggvny, amelyet a 6476. sorok
kzt olvashatunk. Itt szintn egy igen egyszer u, a legfontosabb felada-
tokra szortkoz megvalstst olvashatunk.
A fggvny paramterl az ltalunk ltrehozott osztlyat ler adat-
szerkezet cmt kapja paramterl. A paramter neve klass, amit a G
programknyvtrat hasznl programozk el oszeretettel hasznlnak a
class kulcssz helyett, mert a class a C++ nyelv foglalt kulcsszava g a
vltoznvknt val hasznlata lehetetlenn tenn, hogy a programot a
C++ fordtval is lefordtsuk. (A legtbb esetben persze nincs szksgnk
arra, hogy a programunkat C++ fordtval fordtsuk le, de erre is rdemes
gondolnunk amikor a programot elksztjk.)
A fggvny a 67. s a 70. sorokban kt mutatt hasznl kt osztly
adatszerkezetnek jellsre. Nagyon fontos, hogy ezt a kt mutatt s a
feladatukat pontosab megrtsk s radsul nem is teljesen nyilvnval
a szerepk, ezrt rdemes egy kiss rszletesebben foglalkoznunk velk.
A 67. sorban ltrehozott s inicializlt gobject_class mutat az l-
talunk ltrehozott osztly azaz a PipObject osztly lerjt jelli a
memriban de tpust tekintve megegyezik a szl oosztly adatszerke-
zetnek tpusval. Ezzel a mutatval az osztlyunknak a szl oosztlytl
rklt osztlyadatait s osztlymetdusait rhetjk el. Erre nyilvnva-
lan a dinamikus kts s a virtulis fggvnyek megvalstsa sorn
van szksgnk.
A msik mutat (70. sor) a szl oosztly adatszerkezett jelli, tpusa
szintn a szl oosztly adatszerkezetnek megfelel o. A 67. s a 70. sorban
tallhat mutatk tpusa taht megyegyezik ami knnyen flrerthet ov
teszi a szerepket , a 67. sor mutatja azonban a mi osztlyunkat, mg
a 70. sor mutatja a a szl o osztly adatszerkezett jelli, ami igen nagy
klnbsg.
A 70. sorban a szl o osztly adatszerkezett jell o mutatt egy stati-
kus vltozba troljuk ks obbi felhasznlsra. gy az llomny fggv-
gtk 2007/10/21 14:22 page 140 #140
140
nyeiben brmikor hivatkozhatunk a szl o metdusaira, ami mg ennl
az egyszer u pldnl is igen hasznos.
A pip_object_class_init() fggvny kt fontos sora a virtulis
fggvnyek fellrst vgz o kt rtkads a 7475. sorokban. A GObject
osztly tbbek kzt kt virtulis a leszrmazott osztlyban fellr-
hat fggvnyt hoz ltre dispose() s finalize() nven az objektum
megsemmistsnek automatizlsra. Ezeket a fggvnyeket a GObject
hozza ltre s hvja, a hvs sorn azonban a fggvnyek cmt a GObject
osztly osztlyler adatszerkezetb ol veszi a fggvnyek cmt ahova a
GObject osztlykonstruktora nyilvnvalan elhelyezte azokat. Ez a md-
szer lehet ov teszi, hogy a leszrmazott fggvnyek cmt fellrja, azaz
virtulis fggvnyknt fellbrlja a fggvny megvalstst.
A 7475. sorokban az ltalunk ltrehozott PipObject osztly rklt
dispose() s finalize() fggvnyeit rjuk fell a sajt fggvnyek-
cmnek megadsval. Figyeljk meg, hogy termszetesen nem a szl o
osztly adatszerkezett mdostjuk az katasztrfhoz vezetne hanem
a sajt osztlyunk adatszerkezett, azt GObject osztlylerknt kezelve
a PipObjectClass adatszerkezet elejn tallhat GObjectClass tpus
terlet mdostsval.
Igen fontos az is, hogy mit is csinlnak a dispose() s a finalize()
fggnyek. Ezek a G programknyvtr ktfzis objektummegsemmist o
rendszernek rszt kpezik, azaz desttruktorknt hasznlhatjuk oket.
A legtbb objektumorientlt nyelvben a destruktorok rendszere egy-
szer u, az objektum megsemmistse el ott a destruktor automatikusan
meghvdik, hogy a programoz felszabadthassa a konstruktorban fog-
lalt er oforrsokat. A G programknyvtr esetben a nagyobb rugalmas-
sg rdekben a megsemmists folyamata ktfzis. El oszr az objek-
tum osztlyhoz tartoz dispose() fggvny hvdik meg, utna pedig
az objektum osztlyhoz tartoz finalize() fggvny (ez utn persze
a G programknyvtr felszabadtja az objektum trolsra hasznlt me-
mriaterletet). A szoksos eljrs az, hogy a dispose() fggvnyben a
g_object_unref() fggvnnyel felszabadtjuk az objektum ltal foglalt
objektumokat, a finalize() fggvnyben pedig felszabadtjuk az egyb
er oforrsokat. Ilyen mdon az objektumok referenciaszmlli kzt meg-
gyelhet o krkrssg nem okoz problmt a megsemmistskkr.
Tudnunk kell viszont, hogy a G programknyvtr nem garantlja, hogy
a dispose() fggvnyt csak egyszer hvja a megsemmists sorn, ezrt
e fggvnynek el kell viselnie, hogy az objektum megsemmistse sorn
tbbszr is meghvdik. A szoksos eljrs az, hogy egy logikai vltozt
helyeznk el az objektumban, ami trolni fogja, hogy a dispose() fgg-
vny lefutott-e. Szoks az is, hogy a kvlr ol hvhat fggvnyek elejn
ellen orizzk ennek a vltoznak az rtkt, hogy rzkelhessk a hv
egy olyan objektumot prbl meg hasznlni, aminek a megsemmistse
mr elkezd odtt.
gtk 2007/10/21 14:22 page 141 #141
141
A pldnkban az objektumban elhelyezett disposed tagot hasznljuk
annak jelzsre, hogy a dispose() vgrehajtsa megkezd odtt. A vltoz
deklarcijt a fejllomny 46. sorban tallhatjuk. Ezt a tagot az objek-
tum kezdeti belltsa sorn a C llomny 91. sorban hamis rtkre
lltjuk, majd a dispose() fggvny vdelmre hasznljuk a 109111.
soraiban.
A dispose() s a finalize() fggvnyekben tallhatunk egy rde-
kes s elterjedten hasznlt mdszert arra is, hogy a virtulis fggvnyb ol
a szl o virtulis fggvnyt hvva a munka egy rszt thartsuk. A
finalize() fggvnyben pldul a 116. sorban miutn elvgeztk az
osztlyra jellemz o feladatokat a szl o hasonl fggvnyt hvjuk. Ehhez
az osztly kezdeti belltsa sorn belltott parent_class vltozt hasz-
nljuk fel. Hasonl mdszert hasznlhatunk a finalize() fggvnyben,
ahol az objektum megsemmistse sorn a destruktor futsa utn hvjuk
a szl o destruktort. Ez a viselkeds az objektumorientlt programozst
tmogat nyelvekben gy pldul a C++ nyelvben is automatikus, a
destruktor utn a szl o destruktora fut, itt azonban neknk kell err ol
gondoskodnunk.
rdemes mg egy pillantst vetnnk a 152161. sorok kzt megvals-
tott fggvnyre, ami knyelmi szolgltatsknt egy objektumot hoz ltre
az ltalunk ltrehozott PipObject osztly pldnyaknt. A visszatrsi
rtk tpusa a szl o tpusval megegyez o, ami megknnyti a hv felada-
tt vagy legalbbis segti a rugalmas program ksztst.
A ltrehozott osztlyt egyszer uen kiprblhatjuk ha ltrehozunk egy
objektumot s azonnal meg is semmistjuk a kvetkez o sorok segtsg-
vel.
1 GObject
*
object;
2
3 object = pip_object_new();
4 g_object_unref(object);
E sorok hatsra az zeneteket megjelent o makrk a kvetkez o soro-
kat rjk a szabvnyos kimenetre:
pip_object_new(): Creating a new object.
pip_object_get_type(): Registering the PipObject class.
pip_object_class_init(): Initializing the class.
pip_object_init(): Initializing object 0x8071490.
pip_object_dispose(): Disposing object 0x8071490
pip_object_dispose(): Calling the parents dispose function.
pip_object_finalize(): Destroying object 0x8071490
pip_object_finalize(): Calling the parents finalize function.
gtk 2007/10/21 14:22 page 142 #142
142
A sorok vgigkvetse segthet az osztly s az objektum lterhozs-
nak s megsemmistsnek megrtsben. Elg egyszer u programrl l-
vn sz a folyamat magtl rtet od o.
5.2. Tulajdonsgok rendelse az osztlyhoz
A G programknyvtr komoly segtsget nyjt a tulajdonsgok kezels-
hez, amit mindenkppen rdemes kihasznlnunk.
Az osztly nyilvntartsba vtelekor megadhatjuk, hogy milyen tulaj-
donsgokkal kvnjuk felruhzni az osztlyt, az osztly hasznlata sorn
pedig bellthatjuk s lekrdezhetjk az egyes objektumok tulajdons-
gait. A G programknyvtr a tulajdonsgok kezelse kzben az rkl o-
dsi hierarchit is gyelemb veszi, azaz megkeresi, hogy az adott ob-
jektumhoz tartoz osztly szl oi kzl melyik rendelkezik az adott nev u
tulajdonsggal s a megfelel o osztly fggvnyei segtsgvel lltja be a
tulajdonsg rtkt.
A tulajdonsgok hasznlathoz kt fggvnyt kell megvalstanunk
egyet a tulajdonsgok lekrdezsre, egyet a tulajdonsgok belltsra
s virtulis fggvnyknt nyilvntartsba vennnk. Ezek utn mr csak
egyszer uen ltrehozzuk s nyilvntartsba vesszk az egyes tulajdons-
gokat. A tulajdonsgok hasznlatra a kvetkez o lista alapjn kszthet-
juk fel az ltalunk ltrehozott osztlyt:
1. A tulajdonsgokat valahol trolnunk kell. A legegyszer ubb esetben
minden tulajdonsg szmra ltrehozunk egy-egy mez ot az objek-
tumban, ahogy a kvetkez o sorok is bemutatjk:
1 struct _PipObject
2 {
3 GObject parent_instance;
4 gboolean disposed;
5 gchar
*
name;
6 gint ival;
7 };
A pldban kt tulajdonsg trolsra hoztunk ltre egy-egy tagvl-
tozt, egy karakterlnc s egy egsz tpus tulajdonsgot fogunk itt
trolni.
2. Ha tagvltozkat adtunk az osztlyhoz, akkor gondoskodnunk kell
arrl, hogy ezek alapbelltsa megtrtnjen az objektum kezdeti
rtknek belltsakor. Ezt mutatjk be a kvetkez o sorok:
gtk 2007/10/21 14:22 page 143 #143
143
1 static void
2 pip_object_init(
3 PipObject
*
self)
4 {
5 PIP_DEBUG("Initializing %p", self);
6 /
*
7
*
Initializing tags.
8
*
/
9 self->disposed = FALSE;
10 self->name = NULL;
11 self->ival = 0;
12 }
3. A G programknyvtr minden tulajdonsghoz egy egsz szmot ren-
del azonostul. Ezekr ol az azonostkrl neknk kell gondoskod-
nunk, amire a legclravezet obb mdszer egy enum tpus ltrehozsa
a C llomnyban. (Azrt a C llomnyban, hogy a tpus kvlr ol ne
legyen lthat.)
1 typedef enum {
2 PropertyName = 1,
3 PropertyIval
4 } MyProperties;
A tulajdonsgokhoz rendelt azonostszmoknak 0-nl nagyobbak-
nak kell lennik, ezrt az enum tpus els o tagjnak rtkt 1-re ll-
tottuk.
Az enum tpusnak nevet is adtunk, ezt azonban nem fogjuk hasz-
nlni. Ha viszont elhagynnk a nevet, akkor a C fordt gyelmez-
tetne a nv hinyra a fordts sorn.
4. A kvetkez o lps a tulajdonsgok lekrdezsekor hvand fggvny
elksztse. Ezt mutatjk be a kvetkez o sorok:
1 static void
2 pip_object_get_property(
3 GObject
*
object,
4 guint property_id,
5 GValue
*
value,
6 GParamSpec
*
pspec)
7 {
8 PipObject
*
self = PIP_OBJECT(object);
9
gtk 2007/10/21 14:22 page 144 #144
144
10 switch (property_id) {
11 case PropertyName:
12 g_value_set_string(value, self->name);
13 break;
14
15 case PropertyIval:
16 g_value_set_int(value, self->ival);
17 break;
18
19 default:
20 G_OBJECT_WARN_INVALID_PROPERTY_ID(
21 object, property_id, pspec);
22 }
23 }
Amint lthat a fggvny egyszer uen visszaadja a szm azonost-
nak megfelel o tulajdonsg rtkt a GValue tpus argumentumban
trolva.
5. Hasonlkppen kszthetjk el a tulajdonsgok belltsra szol-
gl fggvnyt is.
1 static void
2 pip_object_set_property(
3 GObject
*
object,
4 guint property_id,
5 const GValue
*
value,
6 GParamSpec
*
pspec)
7 {
8 PipObject
*
self = (PipObject
*
) object;
9
10 switch (property_id) {
11 case PropertyName:
12 g_free(self->name);
13 self->name = g_value_dup_string(value);
14 break;
15
16 case PropertyIval:
17 self->ival = g_value_get_int(value);
18 break;
19
20 default:
21 G_OBJECT_WARN_INVALID_PROPERTY_ID(
22 object, property_id, pspec);
gtk 2007/10/21 14:22 page 145 #145
145
23 }
24 }
Amint ltjuk a fggvny egyszer uen csak eltrolja a kapott rtket a
megfelel o helyre, egybknt semmi mst nem tesz. A gyakorlatban
termszetesen ennl bonyolultabb megoldsokat is hasznlunk, hi-
szen az objektum tulajdonsgnak megvltoztatsa ms feladatok-
kal is egytt jrhat.
6. Utols lpsknt az osztly kezdeti belltst vgz o fggvnyben
nyilvntartsba vesszk a kt virtulis fggvnyt s ltrehozzuk a
kt tulajdonsgot.
1 static void
2 pip_object_class_init(
3 PipObjectClass
*
klass)
4 {
5 GObjectClass
*
gobject_class =
6 (GObjectClass
*
) klass;
7 GParamSpec
*
pspec;
8
9 pip_object_parent_class =
10 g_type_class_peek_parent(klass);
11 /
*
12
*
The GObject virtual functions.
13
*
/
14 gobject_class->dispose = pip_object_dispose;
15 gobject_class->finalize = pip_object_finalize;
16 gobject_class->set_property =
17 pip_object_set_property;
18 gobject_class->get_property =
19 pip_object_get_property;
20 /
*
21
*
Registering properties.
22
*
/
23 pspec = g_param_spec_string (
24 "name",
25 "Name",
26 "The name of the object.",
27 NULL,
28 G_PARAM_READWRITE);
29 g_object_class_install_property(
30 gobject_class,
31 PropertyName,
gtk 2007/10/21 14:22 page 146 #146
146
32 pspec);
33
34 pspec = g_param_spec_int (
35 "ival",
36 "Ival",
37 "Some integer value.",
38 0,
39 G_MAXINT,
40 0,
41 G_PARAM_READWRITE);
42 g_object_class_install_property(
43 gobject_class,
44 PropertyIval,
45 pspec);
46 }
A plda a 1619. sorokban nyilvntartsba veszi a tulajdonsgok
belltsra s lekrdezsre szolgl fggvnyeket, majd a 2345
sorokban kt tulajdonsgot rendel az osztlyhoz.
A bemutatott mdon ltrehozott tulajdonsgokat bellthatjuk a
g_object_new() s a g_object_set() fggvnyekkel s lekrdezhetjk
a g_object_get() fggvnnyel.
1 object = pip_object_new();
2 g_object_set(object,
3 "name", "the name",
4 "ival", 10,
5 NULL);
6
7 g_object_get(object,
8 "name", &name,
9 "ival", &ival,
10 NULL);
11 PIP_MESSAGE("name = %s", name);
12 PIP_MESSAGE("ival = %d", ival);
5.3. Tagok elrejtse
Az osztlyok ltrehozsnak egyik clja az egysgbe zrs, az objektum
bizonyos tagjainak elrejtse a klvilg el ol. Az eddig bemutatott eszkzk
alapjn ltrehozott osztlyok azonban nem teszik lehet ov az adattagok
elrejtst, ezrt ezt kln kell megvalstanunk.
gtk 2007/10/21 14:22 page 147 #147
147
A G programknyvtr a rejtett tagok ltrehozsra a
g_type_class_add_private() fggvnyt, hasznlatra pedig a
G_TYPE_INSTANCE_GET_PRIVATE() kart biztostja. A rejtett tago-
kat azonban egyszer uen, sajt eszkzkkel is megvalsthatjuk. Taln a
legegyszer ubb mdszer az, ha az osztly egyik tagjaknt ltrehozunk egy
mutatt, ahol az objektum ltrehozsa sorn egy foglalt memriaterlet
cmt troljuk. Ez a foglalt memriaterlet egy olyan struktrt fog
jellni, amit az osztlyt megvalst C llomnyban denilunk, gy
elemei az osztly C llomnyn kvl ismeretlenek lesznek. E mdszer
hasznlatt mutatja be rszletesebben a kvetkez o felsorols:
1. Hozzunk ltre egy mutatt az osztly denilsakor. A mutat jell-
jn egy struktrt, ami az sszes rejtett tagot fogja hordozni:
1 struct _PipObject
2 {
3 GObject parent_instance;
4 struct _PipObjectPrivate
*
priv;
5 };
Ezt a szerkezetet a C fordt problma nlkl lefodtja annak elle-
nre, hogy a _PipObjectPrivate struktrt mg nem deniltuk
hiszen a mutat mrete nem fgg a jellt memriaterlet tpustl.
A fejllomnyt teht a fordtskor brmely llomnyba betlthetjk,
nincs szksgnk a rejtett tagokat hordoz struktra dencijra.
2. Az osztly C llomnyban deniljuk ltre a rejtett tagokat hordoz
struktrt, s ot az a legjobb, ha mindjrt egy tpust is ltrehozunk e
clra:
1 typedef struct _PipObjectPrivate PipObjectPrivate;
2 struct _PipObjectPrivate {
3 gboolean disposed;
4 };
A pldban a struktrnak csak egyetlen mez oje van az objek-
tumban teht csak egyetlen rejtett tag lesz , de ezt ks obb knnyen
b ovthetjk.
3. Az objektum kezdeti belltst vgz o fggvnyben foglaljunk he-
lyet a rejtett tagok szmra s vgezzk el azok kezdeti rtknek
belltst is:
1 static void
2 pip_object_init(PipObject
*
self)
gtk 2007/10/21 14:22 page 148 #148
148
3 {
4 PIP_DEBUG("Initializing %p", self);
5 self->priv = g_new(PipObjectPrivate, 1);
6 self->priv->disposed = FALSE;
7 }
4. Az objektum megsemmistse sorn termszetesen gondoskodnunk
kell e terlet felszabadtsrl is, de ez nem okozhat nehzsget:
1 static void
2 pip_object_finalize(GObject
*
object)
3 {
4 PipObject
*
self = PIP_OBJECT(object);
5
6 g_free(self->priv);
7 self->priv = NULL;
8
9 G_OBJECT_CLASS(pip_object_parent_class)->
10 finalize(object);
11 }
5. Az osztly C llomnyban az objektumok mez oi kzl a rejtett me-
z oket is igen egyszer uen, a mutat kvetsvel elrhetjk, a tagok
elrejtst teht hatkonyan vgeztk el:
1 PipObject
*
self = PIP_OBJECT(object);
2
3 if (self->priv->disposed)
4 return;
A plda sorai a disposed rejtett tag rtkre hivatkozik a priv nev u
mutatn keresztl.
A rejtett tagok ltrehozsa sorn persze felmerlhet a krds, hogy mi-
rt van egyltaln szksg arra, hogy egyes mez oket elzrjunk a klvilg
el ol. Erre a krdsre mindenki az lettapasztalatnak, vrmrsekletnek
megfelel oen adhat vlaszt, van azonban egy megkzelts, amit rdemes
megfontolnunk.
Gondoljunk gy a rejtett tagok ltrehozsra mint egy nyelvi eszkzre,
ami lehet ov teszi annak jelzst, hogy az adott tagok kvlr ol val el-
rse nem szerencss. Brki tteheti a C llomnyba ltrehozott tagokat
a fejllomnyba a nyilvnos tagok kz, mindenki szmra nyilvnval
azonban, hogy az eredeti szerz onek nem ez volt az elkpzelse.
gtk 2007/10/21 14:22 page 149 #149
6. fejezet
XML llomnyok kezelse
Az XML (extensible markup language, b ovthet o jell onyelv) egyszer u,
szabvny ltal szablyozott nyelv, ami kit un oen hasznlhat adatok sz-
veges trolsra. Az XML rugalmas nyelvi szerkezetet hasznl, ember l-
tal is olvashat formban rja le az adatszerkezeteket, szveges trolst
r el o, gy akr egy egyszer u szvegszerkeszt o programmal is mdost-
hat. Nem csoda, hogy sok szabvny s alkalmazs pl az XML llo-
mnyok hasznlatra. rdemes megismerkednnk az XML llomnyok
kezelsre hasznlhat nhny eszkzzel, amelyek hatkony adattrolst
tesznek lehet ov a programoz szmra.
Az XML programknyvtr (libxml vagy ms nven libxml2) hatkony
s szabvnyos eszkztrat biztost XML llomnyok kezelsre. Maga a
programknyvtr nem pl a G programknyvtrra, nem rsze a G s
GTK+ programknyvtrak csaldjnak, ezrt az adatszerkezetei, vala-
mint a fggvnyeinek elnevezse idegenszer u az eddig bemutatott esz-
kzkkel sszehasonltva. Radsul a hasznlathoz a megfelel o fejl-
lomnyokat be kell tltennk s a programknyvtr programhoz val
szerkesztsr ol is kln kell gondoskodnunk. A nehzsgeket azonban
knnyen lekzdhetjk, nembeszlve arr ol, hogy a munka mindenkppen
megri a fradtsgot, hiszen nhny egyszer u fggvnyhvs segtsgvel
nagyszer uen hasznlhat adattrol eszkzhz juthatunk.
Miel ott azonban rszletesen megismerkednnk az XML programknyv-
trral, rdemes nhny szt ejtennk az XML llomnyok szerkezetr ol.
6.1. Az XML llomny szerkezete
Az XML llomny alapjban vve szveges, felptse, nyelvtani szerke-
zete egyszer u, ezrt rdemes nhny plda alapjn megismernnk.
Az els o plda egy nhny sort tartalmaz XML llomnyt mutat be:
149
gtk 2007/10/21 14:22 page 150 #150
150
<?xml version="1.0" encoding="UTF-8"?>
<doc>
<style name="Normal">
<font>Times</font>
<color>black</color>
</style>
<paragraph/>
</doc>
Az llomny elejn az els o sorban a <? ?> jelek kzt az xml kulcs-
szt talljuk, valamint a version (vltozat) s a encoding (kdols) tu-
lajdonsgot. Ez a sor jelzi, hogy az 1.0 szabvnyvltozatnak megfelel o
XML szabvnynak megfelel o llomnyrl van sz, ahol a karakterek k-
dolssra az UTF-8 szabvnyvltozatot hasznljuk. Az XML szabvny
szerint az llomny elejn ezeket az adatokat meg kell adnunk, ezrt a
legtbb XML llomny elejn ezt a sort vagy egy nagyon hasonl sort
olvashatjuk.
Az XML llomnyokban a < > jelek kz rt szavakat, gynevezett tago-
kat (tag, cdula, cmke) gyelhetnk meg. A < > jelek kz az adott tag
nevt kell rnunk, valamint minden taghoz zrtagot kell ltrehoznunk.
A zrtag neve megegyezik a tag nevvel, azzal a klnbsggel, hogy a
zrtag nevnek a / jellel kell kezd odnie. A <doc> tag zrtagja pldul
a </doc>, a <font> tag zrtagja pedig a </font> lesz.
A tagokbl s a zrtagokbl ll kifejezsek egymsbagyazhatk, az
egymsbagyazott rszekb ol faszerkezet alakthat ki. A fa gykere az
XML dokumentum gykrtagja, amelyb ol minden XML dokumentum ki-
zrlak egyet tartalmazhat. A kvetkez o sorok egy hibs XML llomnyt
mutatnak be:
<?xml version="1.0" encoding="UTF-8"?>
<doc></doc>
<font></font>
A plda soraiban a 2. s a 3. sor is gykrelem s mivel csak egyetlen
gykrelem lehet, az llomny hibs. A kvetkez o sorokban a hibt jav-
tottuk:
<?xml version="1.0" encoding="UTF-8"?>
<font>
<doc></doc>
</font>
A plda gykreleme a font nev u tag, annak leszrmazottja pedig a
doc nev u tag a 3. sorban.
Az XML llomnyba a tagok s zrtagok kz szveget is rhatunk. A
szveg az adott tag szveges rtke lesz. A rvidsg rdekben azokat a
gtk 2007/10/21 14:22 page 151 #151
151
tagokat s zrtagokat, amelyek kzt egyetlen karakter sincs, sszevon-
juk. Az sszevont kezd o- s zrtag a tag nevt tartalmazza, ezt pedig
a / jel kveti. A <paragraph/> pldul a <paragraph></paragraph>
sszevont vltozata, azaz egy res, paragraph nev u tagpr.
Minden tagnak tetsz oleges jellemz oje, attribtuma is lehet. Az attrib-
tumokat a kezd o tag zr > karaktere el, a tag neve utn kell rnunk,
mgpedig gy, hogy megadjuk az attribtum nevt, majd egy = jel utn a
" " vagy a jelek kz rt rtkt. A kvetkez o sorok ezt mutatjt be:
<?xml version="1.0" encoding="UTF-8"?>
<database type="dictionary" version="1.0">
<title>Magyar Angol Sztr</title>
</database>
A plda 2. sorban meggyelhetjk, hogy a database nev u tagnak kt
attribtuma van, egy type s egy version nev u. A database tagon
bell tallhat a title nev u leszrmazottja, amelynek nincsen egyetlen
attribtuma sem, csak szveges rtke.
Az XML szabvny szerint a tagok neveiben bet uk s szmjegyek is
llhatnak, a nevek azonban nem kezd odhetnek szmjeggyel. A nevek
bet uinek esetben gyelembe kell vennnk a kis- s nagybet uk kzti
klnbsget. A bet uk hasznlatt nem kell az angol nyelv bet uire kor-
ltoznunk, gyakorlatilag tetsz oleges termszetes nyelv karakterkszlete
hasznlhat. (Termszetesn a legtbb esetben az angol nyelvet vesszk
alapul, hogy a tagok nevei knnyen rthet ov tegyk az llomny szerke-
zett.)
A tagok neveiben az elvlasztsra az alhzs karaktert (_), az elvlasz-
tjelet (-) s a pontot (.) hasznlhatjuk. Ms rsjelet pldul id oz ojelet,
szkzt a tag neve nem tartalmazhat. A tagok neve radsul nem kez-
d odhet az xml karakterekkel sem kis- sem nagybet ukkel, sem pedig
azok kombinciivel , mert az ilyen nevek az XML szabvnyokat kezel o
W3C szmra vannak fenntartva.
A tagok atribtumainak neveire ugyanazok a szablyok vonatkoznak,
mint a tagok neveire s a legtbb esetben szintn valamilyen angol szt
vlasztunk, ami jl kifejezi, hogy mit ad meg az adott jellemz o.
Nyilvnvalan flrertsre adna lehet osget, ha a tagok szveges r-
tkben, a kezd o s a zrtag kzt a < karaktert tartalmaz szveget r-
nnk, vagy az attribtumok szveges rtkben a " jelet hasznlnnk. Az
ilyen problmk elkerlsre az XML szabvny karakterazonostkat (en-
tity reference, entitsazonost) hasznl. A szabvny ltal meghatrozott
XML karakterazonostkat s jelentsket a 6.1. tblzatban mutatjuk
be.
gtk 2007/10/21 14:22 page 152 #152
152
Rvidts Jelents
&lt; Kisebb mint: <.
&gt; Nagyobb mint: >.
&amp; Ampersand: &.
&quot; Kett os idz ojel: "
&apos; Aposztrf: .
6.1. tblzat. Az XML karakterazonostk s a jelentsk
6.2. Az XML programknyvtr egyszer u hasz-
nlata
Az XML programknyvtr nem tartozik szorosan a G vagy a GTK prog-
ramknvtrhoz, amit az eltr o fggvnynevek s klnll fejllomnyok
is jeleznek, ezrt a programknyvtr hasznlatrl az alkalmazs meg-
rsakor kln kell gondoskodnunk.
6.2.1. A fordts el otti bellts
A programknyvtr hasznlatnak els o lpseknt gondoskodnunk kell
arrl, hogy a fordts el otti belltsokat vgz o configure program az
XML programknyvtrat megkeresse, a programknyvtr fejllomnyai-
nak s a lefordtott programknyvtrat tartalmaz llomnynak a helyt
feljegyezze. Ehhez a kvetkez o sorokat helyezzk el a configure.in l-
lomnyban:
pkg_modules="libxml-2.0"
PKG_CHECK_MODULES(PACKAGE, [$pkg_modules])
AC_SUBST(PACKAGE_CFLAGS)
AC_SUBST(PACKAGE_LIBS)
A PKG_CHECK_MODULES() makr hatsra a configure program a
pkg-config program segtsgvel megkeresi s feldolgozza az XML prog-
ramknyvtr legfontosabb adatait tartalmaz libxml-2.0.pc llomnyt.
Az llomnyrszlet utols kt sorban lthat AC_SUBST() makrk ha-
tsra a C fordt a fordts el otti bellts sorn elksztett Makefile
alapjn megkapja az XML programknyvtr hasznlathoz a fordts s
a szerkeszts sorn szksges kapcsolkat.
A bemutatott mdszerrel egy id oben tbb programknyvtr hasznlatt
is lehet ov tehetjk. A kvetkez o sorok pldul kt programknyvtrra
vonatkoznak:
pkg_modules="gtk+-2.0 >= 2.0.0 libxml-2.0"
gtk 2007/10/21 14:22 page 153 #153
153
PKG_CHECK_MODULES(PACKAGE, [$pkg_modules])
AC_SUBST(PACKAGE_CFLAGS)
AC_SUBST(PACKAGE_LIBS)
Az els o sor alapjn a fordtshoz felhasznljuk a GTK programknyvtrat
(legalbb 2.0.0 vltozattal) s az XML programknyvtrat is. Radsul a
pkg-config program a programknyvtrak kzti fgg osgeket is gye-
lembe veszi, gy minden programknyvtrat megkeres, amire a megadott
programknyvtrak hasznlathoz szksgnk van.
A configure.in llomny mdostsa utn futtatnunk kell az
autoconf s az automake programokat, hogy az j belltsoknak meg-
felel o llomnyok elkszljenek. Ha az alkalmazst a Glade segtsgvel
hoztuk ltre, akkor a projektknyvtrban tallhat autogen.sh program
elvgzi helyettnk ezt a feladatot, elegend o teht csak ezt futtatnunk.
Ha ezek utn a projektknyvtr configure nev u programjt futtat-
juk, az megkeresi az XML programknyvtrat s gondoskodik a helyes
Makefile llomnyok elksztsr ol.
6.2.2. A fejllomnyok betltse
Az XML programknyvtr ltal ltrehozott tpusok s fggvnyek hasz-
nlathoz termszetesen be kell tltennk a megfelel o fejllomnyokat.
Maga a programknyvtr igen sok eszkzt hoz ltre, az ltalunk bemu-
tatott pldk lefordtshoz azonban elegend o a kvetkez o sorokat elhe-
lyezni a forrsprogram elejn:
#include <libxml/xmlmemory.h>
#include <libxml/parser.h>
#include <libxml/xpathInternals.h>
#include <libxml/tree.h>
Ezek a fejllomnyok a legfontosabb fggvnyeket tartalmazzk, amelyek
lehet ov teszik az XML llomnyok ltrehozst, betltst, valamint ha-
tkony eszkzket adnak az XML llomnyban tallhat adatok lekrde-
zsre s megvltoztatsra is.
6.2.3. A dokumentum ltrehozsa s mentse
Az XML programknyvtr segtsgvel tbbek kzt sszetett adatszerke-
zeteket hozhatunk ltre a memriban s azokat XML llomnyknt el is
menthetjk. A memriban trolt dokumentumok ltrehozshoz s az
XML llomnyok mentshez a kvetkez o fggvnyeket rdemes ismer-
nnk.
gtk 2007/10/21 14:22 page 154 #154
154
int xmlKeepBlanksDefault(int val); A fggvny segtsgvel befo-
lysolhatjuk, hogy az XML programknyvtr hogyan kezelje az el-
hagyhat szkzket s jsor karaktereket.
A fggvny paramtere 0 vagy 1. Ha 0 rtket adunk, az XML prog-
ramknyvtr nem tartja meg az elhagyhat karaktereket, ha 1 r-
tket, akkor viszont igen. A fggvny visszatrsi rtke megadja a
fggvny hvsa el otti belltst.
Nagyon fontos, hogy ennek a fggvnynek a hvsa befolysolja az
XML programknyvtr ltal ltrehozott XML llomnyok trdelst.
Ha a fggvnyt 1 argumentummal hvjuk a ltrehozott llomnyban
a programknyvtr nem hasznl automatikus beljebb rst (autoin-
dentation) a szerkezet jellsre. A legjobb, ha a munka megkezdse
el ott mindig hvjuk ezt a fggvnyt mgpedig 0 paramterrel.
A fggvnyt szintn rdemes 0 paramterrel meghvni miel ott XML
llomnyt tltennk be, hogy az XML programknyvtrat felkszt-
sk a beljebb rssal szerkesztett llomny kezelsre. Ha az in-
dentlsra hasznlt jsor karakterek s szkzk szveges rtk-
knt megjelennek a dokumentumban, akkor valszn uleg elfelejtet-
tk ezt a fggvnyt hasznlni.
xmlDocPtr xmlNewDoc(const xmlChar
*
vltozat); A fggvny se-
gtsgvel j XML dokumentumot hozhatunk ltre a memriban.
A fggvny argumentuma szveges rtket jell a memriban, ami
megadja a hasznlt XML szabvny vltozatnak szmt. Ha a para-
mter rtke NULL, a fggvny az "1.0" karakterlncot hasznljuk
vltozatknt.
A fggvny visszatrsi rtke a ltrehozott dokumentumot jelli a
memriban. Ezt az rtket meg kell tartanunk, mert ezzel tudjuk
mdostani s menteni a dokumentumot.
void xmlFreeDoc(xmlDocPtr doc); A fggvny segtsgvel megsem-
misthetjk a memriban elhelyezett dokumentumot, felszabadt-
hatjuk a trolsra hasznlt memriaterleteket.
A fggvny argumentuma a megsemmistend o dokumentumot jelli
a memriban.
int xmlSaveFormatFileEnc(const char
*
fjlnv, xmlDocPtr
doc, const char
*
kdols, int formtum); A fggvny segt-
sgvel a memriban tallhat XML dokumentumot elmenthetjk
llomnyba vagy kirathatjuk a szabvnyos kimenetre. A mentsre
az XML programknyvtr tbbfle lehet osget is biztost, de a
legtbb esetben elegend o ennek az llomnynak a hasznlata.
gtk 2007/10/21 14:22 page 155 #155
155
A fggvny els o paramtere az llomny neve, amelybe a dokumen-
tumot menteni akarjuk. A fggvny az llomnyt automatikusan
ltrehozza, ha ltezne, akkor pedig trli.
Ha a dokumentumot a szabvnyos kimenetre akarjuk kiratni, ak-
kor az llomny neveknt a "-" rtket kell megjellnnk.
A fggvny msodik paramtere a menteni kvnt dokumentumot
jelli a memriban.
A dokumentum harmadik paramtere a dokumentum kdolst
meghatroz karakterlncot jelli a memriban. Az XML program-
knyvtr ezt a karakterlncot elhelyezi a dokumentum szvegben.
A legtbb esetben a harmadik paramter helyn a "UTF-8" llandt
hasznljuk.
A fggvny negyedik paramtere megadhatjuk, hogy hasznlni
akarjuk-e az XML programknyvtr automatikus szvegformzst.
A legtbb esetben itt az 1 rtket adjuk meg, hogy az XML program-
knyvtr automatikusan formzza az XML llomnyt szkzkkel
s jsor karakterekkel.
xmlNodePtr xmlNewDocNode(xmlDocPtr doc, xmlNsPtr ns,
const xmlChar
*
nv, const xmlChar
*
tartalom); A szab-
vny szerint minden XML dokumentumban pontosan egy gy-
krcsompontnak vagy ms nven gykrelemnek kell lennie. A
gykrcsompontot ezzel a fggvnnyel hozhatjuk ltre.
A fggvny els o paramtere a dokumentumot jelli a memriban.
A fggvny msodik paramtere az el oksztett nvteret jelli a me-
mriban, amelyet a gykrelemhez kvnunk rendelni. Egyszer ubb
esetekben - ha nem akarunk nvteret hasznlni a msodik para-
mter helyn NULL rtket adunk meg. (A nvterek hasznlatra a
ks obbiekben mg visszatrnk.)
A fggvny harmadik paramtere a gykrcsompont nevt jelli a
memriban.
A fggvny negyedik paramtere a gykrelem tartalmt jelli a me-
mriban. A legtbb esetben a gykrelemet tartalom nlkl hozzuk
ltre, gy a negyedik paramter rtke NULL.
A fggvny visszatrsi rtke a ltrehozott csompontot jelli a me-
mriban. Ezt a mutatt el kell helyeznnk a dokumentumban az
xmlDocPtr ltal jellt memriaterlet children mez oben.
A kvetkez o plda bemutatja hogyan hozhatunk ltre XML dokumen-
tumot az XML programknyvtr segtsgvel.
21. plda. A kvetkez o sorok ltrehoznak s llomnyba mentenek egy
egyszer u XML dokumentumot.
gtk 2007/10/21 14:22 page 156 #156
156
1 void doc_create(void)
2 {
3 xmlDocPtr document = NULL;
4
5 document = xmlNewDoc("1.0");
6 document->children = xmlNewDocNode(document, NULL,
7 "root", NULL);
8
9 if (!xmlSaveFormatFileEnc("tmp.xml", document,
10 "UTF-8", 1)){
11 g_error("Error saving document: %m");
12 }
13 }
A fggvny ltal ltrehozott llomny tartalma a kvetkez o:
1 <?xml version="1.0" encoding="UTF-8"?>
2 <root/>
Amint lthat az llomny tartalma nagyon egyszer u, viszont kveti az
XML szabvnyt, gy knnyen feldolgozhat s b ovthet o.
6.2.4. A dokumentum betltse
Az XML llomnyok szabvnyos nyelvtan alapjn plnek fel s gy
minden klnsebb el okszts nlkl automatikusan rtelmezhet ok. Az
XML programknyvtr termszetesen tartalmazza a megfelel o fggvnye-
ket XML llomnyok rtelmezsre, betltsre. Ha XML llomnyt aka-
runk betlteni, hasznlhatjuk a kvetkez o fggvnyt.
xmlDocPtr xmlParseFile(const char
*
fjlnv); A fggvny se-
gtsgvel memriban elhelyezett dokumentumot hozhatunk be
az llomnyban elhelyezett vagy a szabvnyos bemenetr ol olvasott
sorok rtelmezsvel. A beolvasott dokumentumot a ks obbiekben
mdosthatjuk s kirhatjuk.
A fggvny paramtere a betltend o llomny nevt jelli a mem-
riban. Ha az llomny neve helyn a "-" nevet adjuk meg, a fgg-
vny az adatsorokat a szabvnyos bemenetr ol olvassa.
A fggvny visszatrsi rtke a fggvny ltal ltrehozott s a me-
mriban elhelyezett dokumentumot jelli, ha az adatsorok beol-
vassa s rtelmezse sikeres volt, NULL rtk, ha a m uvelet kz-
ben hiba trtnt. Ha az llomny nem teljesti az XML szabvnyt, a
visszatrsi rtk NULL.
gtk 2007/10/21 14:22 page 157 #157
157
6.2.5. A dokumentum b ovtse
Az XML programknyvtr sszetett, rugalmasan hasznlhat eszkz-
ket biztost az XML dokumentumban tallhat adatok lekrdezsre s
mdostsra. Az eszkzk kzl az egyszer usg rdekben csak az ok-
vetlenl szksges s egyszer u fggvnyeket vesszk sorra.
A kvetkez o fggvnyek segtsgvel j csompontokat hozhatunk ltre
a dokumentumban s bellthatjuk a ltrehozott csompontok tulajdon-
sgait.
xmlChar
*
xmlEncodeEntitiesReentrant(xmlDocPtr doc, const
xmlChar
*
szveg); A fggvny segtsgvel a dokumentumban
elhelyezend o szvegben a tiltott karaktereket helyettesthetjk a
szabvny ltal el ort rvidtskkel. A dokumentum lekrdezse
sorn az eredeti szveg termszetesen visszallthat.
A fggvny els o paramtere a dokumentumot, msodik paramtere
pedig az talaktand o szveget jelli a memriban.
A fggvny visszatrsi rtke az talaktott szveget jelli a mem-
riban, ami dinamikusan foglalt memriaterleten van. Ezt a me-
mriaterletet hasznlat utn felszabadthatjuk az xmlFree() vagy
a free() fggvnnyel.
void xmlFree(void
*
memria); A fggvny az XML programknyvtr
ltal lefoglalt dinamikus memraterletek felszabadtsra szolgl,
m ukdsben tulajdonkppen megegyezik a szabvnyos program-
knyvtr free() fggvnyvel.
Ez a fggvny egyszer uen csak felszabadtja a memriaterletet, az
sszetett XML adatszerkezetek megsemmistsre ms fggvnye-
ket kell hasznlnunk.
xmlNodePtr xmlNewChild(xmlNodePtr szlo, xmlNsPtr nvtr,
const xmlChar
*
nv, const xmlChar
*
tartalom); A fgg-
vny segtsgvel j elemet, j csompontot hozhatunk ltre a
dokumentumban.
A fggvny els o paramtere az j elem szl oelemt jelli a memri-
ban. Az j elem ennek a csompontnak a leszrmazottjaknt, ezen
az elemen bell jn ltre. Ha a szl oelemnek mr vannak leszr-
mazottjai, akkor az j csompont az utols helyre kerl, a meglv o
leszrmazottak utn utolsknt jelenik meg. Ez fontos lehet, hiszen
az XML llomnyban sokszor a csompontok sorrendje is szmt.
A fggvny msodik paramtere az j elem szmra el oz oleg ltre-
hozott nvteret jelli a memriban. Ha a msodik paramter r-
tke NULL, az j csompont a szl o nvtert rkli, ezrt a legtbb
gtk 2007/10/21 14:22 page 158 #158
158
esetben egyszer uen NULL rtket adunk meg nvtrknt. A nvterek
hasznlatra a ks obbiekben mg visszatrnk.
A fggvny harmadik paramtere az j elem nevt hatrozza meg.
A nvnek a szabvny ltal meghatrozott feltteleknek kell megfe-
lelnie.
A fggvny negyedik paramtere az j csompont ltal hordozott
szveget jelli a memriban vagy NULL, ha az elemen bell nem
akarunk szveget elhelyezni.
A negyedik paramter ltal kijellt szvegnek a szabvny alap-
jn nem szabad tiltott karaktereket tartalmaznia. Ha nem
vagyunk biztosak benne, hogy a szveg megfelel-e a szab-
vnynak, a megfelel o talaktsokat el kell vgeznnk a
xmlEncodeEntitiesReentrant() fggvny segtsgvel. gy t unik
azonban, hogy az XML programknyvtr a dokumentcival ellen-
ttben automatikusan elvgzi a tiltott karakterek cserjt, ha ezt a
fggvnyt hasznljuk.
A fggvny visszatrsi rtke a ltrehozott j elemet jelli a mem-
riban.
xmlAttrPtr xmlSetProp(xmlNodePtr elem, const xmlChar
*
nv, const xmlChar
*
szveg); A fggvny segtsgvel j
tulajdonsgot rendelhetnk a dokumentum elemeihez s meghat-
rozhatjuk a tulajdonsg rtkt.
A fggvny els o paramtere azt az elemet jelli a memriban, ami-
nek a tulajdonsgt be szeretnnk lltani.
A fggvny msodik paramtere a tulajdonsg nevt jelli a mem-
riban. A nvnek a szabvny szerint kell felplnie, amit program-
knyvtr nem ellen oriz.
Ha az els o paramter ltal jellt elem mr rendelkezik a msodik
paramter ltal meghatrozott nev u tulajdonsggal, a fggvny a
tulajdonsg rtkt fellrja, ha nem, a fggvny j tulajdonsgot
hoz ltre.
A fggvny harmadik paramtere a tulajdonsg szveges rtkt je-
lli a memriban. Az xmlSetProp() a xmlNewChild() fggvny-
hez hasonlan automatikusan lecserli a szvegben tallhat tiltott
karaktereket a megfelel o rvidtsre, br ezt a szolgltatst a doku-
mentci nem rszletezi.
A fggvny visszatrsi rtke olyan memriacm, ami a tulajdon-
sg trolsra szolgl adatszerkezetet jelli a memriban. Ezt a
memriacmet ltalban egyszer uen eldobjuk.
gtk 2007/10/21 14:22 page 159 #159
159
int xmlUnsetProp(xmlNodePtr elem, const xmlChar
*
nv); A
fggvny segtsgvel a csompont adott nven bejegyzett tulajdon-
sgt trlhetjk.
A fggvny els o paramtere a mdostand elemet, a msodik para-
mtere pedig a trlend o tulajdonsg nevt jelli a memriban.
A fggvny visszatrsi rtke 0, ha a m uvelet sikerlt, 1 hiba ese-
tn.
Az XML dokumentum egyszer u b ovtsre szolgl fggvnyek haszn-
latt mutatja be a kvetkez o plda.
22. plda. A kvetkez o fggvny nhny j csompontot hoz ltre a pa-
ramterknt kapott mutat ltal jellt dokumentumban a gykrelemb ol
indulva.
1 void add_test(xmlDocPtr doc)
2 {
3 xmlChar
*
tmp;
4 xmlNodePtr node;
5
6 node = xmlNewChild(doc->children, NULL, "if", NULL);
7 xmlSetProp(node, "type", "numeric");
8
9 tmp = xmlEncodeEntitiesReentrant(doc, "8 < 9");
10 xmlNewChild(node, NULL, "condition", tmp);
11 xmlFree(tmp);
12
13 xmlNewChild(node, NULL, "true", "a");
14 xmlNewChild(node, NULL, "false", "b");
15 }
Ha a fggvny olyan dokumentumot kap, amelyben csak a gykrelem
tallhat meg, a kvetkez o dokumentumot kapjuk eredmnyl:
1 <?xml version="1.0" encoding="UTF-8"?>
2 <root>
3 <if type="numeric">
4 <condition>8 &lt; 9</condition>
5 <true>a</true>
6 <false>b</false>
7 </if>
8 </root>
A programrszlet m ukdse jl kvethet o az XML llomny segtsgvel.
gtk 2007/10/21 14:22 page 160 #160
160
6.2.6. A bejrs s a lekrdezs
Az XML programknyvtr az XML dokumentumot a memriban ssze-
tett adatszerkezetben trolja. A dokumentumot a programknyvtr
xmlDocPtr tpus mutatval jellt xmlDoc tpus adatszerkezetben t-
rolja. Az adatszerkezet felptse nem igazbl fontos, csak egyetlen
eleme van, ami mindenkppen emltsre rdemes, mgpedig a xmlNode
tpus adatszerkezetet kijell o xmlNodePtr tpus, children nev u mu-
tat, ami a dokumentum gykrelemt jelli a memriban.
A dokumentum nagyobbrszt az xmlNode tpus adatszerkezetekben
trolt csompontok halmazbl ll, amelyek a bennk tallhat muta-
tk segtsgvel faszerkezetbe vannak rendezve. Ha a dokumentumban
keresni akarunk, be akarjuk jrni, mdostani szeretnnk, akkor meg
kell ismerkednnk a dokumentumelemek trolsra szolgl xmlNode
adatszerkezettel s azzal is, hogyan hivatkoznak az ilyen adatszerkezetek
egymsra a bennk tallhat xmlNodePtr tpus mutatk segtsgvel.
Az xmlNode adatszerkezet legfontosabb elemei a kvetkez ok:
A xmlNode struktra
void
*
_private Szabadon hasznlhat.
xmlElementType type A csompont tpusa.
const xmlChar
*
name A csompont neve.
struct _xmlNode
*
children Az els o leszrmazott.
struct _xmlNode
*
last Az utols leszrmazott.
struct _xmlNode
*
parent A szl o.
struct _xmlNode
*
next A kvetkez o testvr.
struct _xmlNode
*
prev Az el oz o testvr.
struct _xmlDoc
*
doc A dokumentum.
xmlNs
*
ns Nvtr.
xmlChar
*
content A szvegtartalom.
struct _xmlAttr
*
properties A tulajdonsgok.
unsigned short line A sor szma a fjlban.
Az egyes rszek pontos jelentst trgyalja a kvetkez o lista:
_private Az alkalmazsprogramoz szmra fenntartott mez o, amelyet
a programunkban arra hasznlunk amire csak akarunk. Mindazo-
kat az adatokat, amelyeket a csompontokhoz kvnunk rendelni,
el kell helyeznnk egy tetsz oleges memriaterleten pldul egy
struktrban , majd a memriaterlet cmt egyszer uen el kell he-
lyeznnk ebben a mez oben.
type Az xmlNode tpusa, ami megadja, hogy az XML llomny milyen jel-
leg u elemt trolja ez a csompont. rdemes megemltennk, hogy
az XML programknyvtr szerz oi bevett programozi fogs szerint
gtk 2007/10/21 14:22 page 161 #161
161
minden lnyegesebb adatszerkezetk msodik elemben elhelyezik
ezt a tpusmez ot, gy a dinamikus adatterleteken elhelyezett ada-
tok tpusa mindig kiderthet o.
Az xmlNode tpus adatszerkezet type mez ojben a kvetkez o l-
landk egyikt tallhatjuk:
XML_ELEMENT_NODE A csompont az XML llomny egy elemt, egy
csompontjnak adatait tartalmazza. A memriban elhelye-
zett dokumentum legtbb csompontja ilyen tpus.
XML_TEXT_NODE A csompont a dokumentum egy szveges rszt,
szvegelemt tartalmazza. Ha pldul a dokumentumban a
<a>
<b/>
Hell!
</a>
sorokat talljuk, akkor a memriban elhelyezett adatszerke-
zetben lesz egy XML_ELEMENT_NODE tpus xmlNode adatszer-
kezet az a elem szmra, s ennek lesz kt kzvetlen leszrma-
zottja, egy a b elem szmra, valamint egy XML_TEXT_NODE t-
pus, a szveg szmra. Ez a felpts nagyon sszer u, viszont
kvetkezik bel ole, hogy a
<a>Hell!</a>
rszletet brzol adatszerkezetben is kt csompont lesz, egy
az a elem, egy pedig a szvegtartalom szmra, azaz a szveg
nem az elem tulajdonsga, hanem a leszrmazottja. Ez term-
szetesen nem csak az XML programknytrban van gy, hanem
elterjedt vezrelvnek tekinthet o.
XML_CDATA_SECTION_NODE A csompont az XML dokumentum
adatblokk tpus elemt brzolja. Az adatblokk olyan sz-
vegelem, amelyen bell a tiltott karaktereket nem kell rvid-
tskre cserlni, mert azokat az XML rtelmez oprogram nem
kezeli. Az ilyen szerkezet akkor lehet hasznos, ha az XML llo-
mnyba hosszabb szveges rtket szeretnnk trolni pldul
egy msik XML llomny tartalmt s nem szeretnnk a tiltott
karakterek cserjvel vesz odni.
XML_COMMENT_NODE A csompont az XML llomny egy megjegyz-
st trolja.
name A csompont neve, ami az XML_ELEMENT_NODE tpus esetn meg-
egyezik az XML elem nevvel.
gtk 2007/10/21 14:22 page 162 #162
162
children Az adott csompont els o leszrmazottjt jell o mutat, ha a
csompontnak van leszrmazottja, NULL, ha nincs.
Az XML programknyvtr szerz oi a fa trolst bevett szoks sze-
rint ktszeresen lncolt lista segtsgvel troljk. Ennl a mdszer-
nl a sz ul o egy mutatval hivatkozik az els o s egy mutatval az
utols leszrmazottjra, a tbbi leszrmazott elhelyezkedsr ol vi-
szont nincs informcija. Ezeket a leszrmazottakat kizrlag azrt
tudjuk megtallni, mert ktszeresen lncolt listba vannak ren-
dezve.
A szl o kzvetlen leszrmazottait a testvreket (sibling, testvr)
teht listba szervezzk, a lista elejn s vgn tallhat leszr-
mazottakat pedig nyilvntartsba vesszk a szl o megfelel o mez o-
jben.
last Az utols kzvetlen leszrmazott a leszrmazottak listjban.
parent Hivatkozs a szl ore.
next A kvetkez o testvr a listban, ha van ilyen, NULL, ha nincs.
prev Az el oz o testvr, ha ltezik, NULL, ha nem.
doc A memriban elhelyezett dokumentumot jell o mutat, amelyben
ez a csompont tallhat.
ns A nvtr mutatja.
content A csompont szveges tartalma. Ha a csompont type mez oj-
nek rtke XML_TEXT_NODE, akkor magt a szveget ez a mez o jelli
a memriban.
properties Az elem tulajdonsgait tartalmaz listt jell o mutat. A tu-
lajdonsgok trolsra szolgl adatszerkezetekre a tovbbiakban
visszatrnk.
line Az llomny sornak szma, aminek az elemzse sorn ez a cso-
mpont ltrejtt. A felhasznl szmra kirt zenetekben rdemes
megemlteni a sor szmt is, hogy legalbb a minimlis eslyt meg-
adjuk szmra a hivatkozott rsz megtallsra.
23. plda. A kvetkez o fggvny rekurzvan bejrja a dokumentum cso-
mpontjait s kirja az egyes csompontokhoz tartoz szvegrtkeket.
1 void
2 print_nodes_rec(xmlNodePtr node)
3 {
4 xmlNodePtr child_node;
gtk 2007/10/21 14:22 page 163 #163
163
5
6 if (node == NULL)
7 return;
8
9 if (node->type == XML_TEXT_NODE)
10 printf("%s\n", node->content);
11
12 child_node = node->xmlChildrenNode;
13 while (child_node != NULL) {
14 print_nodes_rec(child_node);
15 child_node = child_node->next;
16 }
17 }
A fggvny a 9. sorban megvizsglja, hogy az aktulis csompont szve-
get reprezentl-e, ha igan, a 10. sorban kirja a csompont szvegrtkt.
Ezek utn a fggvny a 1216. sorok kztt bejrja a csompont sszes
leszrmazottjt s rekurzv fggvnyhvssal (14. sor) azoknak is kirja a
szveges rtkt.
Az XML programknyvtr az XML elemek tulajdonsgainak trolsra
az xmlAttr struktrt hasznlja, a struktra memriabeli cmt pedig
az xmlAttrPtr tpus mutatban trolja. A programknyvtr az XML
elemek tulajdonsgait listba rendezi s az elem adatait trol adatszer-
kezet properties mez ojvel jelli. Az xmlAttr struktra legfontosabb
mez oi a kvetkez ok:
A xmlAttr struktra
void
*
_private Szabadon hasznlhat.
xmlElementType type Mindig XML_ATTRIBUTE_NODE.
const xmlChar
*
name A tulajdonsg neve.
struct _xmlNode
*
children Az rtk csompont cme.
struct _xmlNode
*
last Mindig NULL.
struct _xmlNode
*
parent A szl o.
struct _xmlNode
*
next A kvetkez o tulajdonsg.
struct _xmlNode
*
prev Az el oz o tulajdonsg.
struct _xmlDoc
*
doc A dokumentum.
xmlNs
*
ns Nvtr.
Amint az a tblzatbl is lthat, az XML programknyvtr tulajdon-
sgok trolsra hasznlt xmlAttr struktrja nagyon hasonlt a cso-
mpontok trolsra hasznlt xmlNode struktrjval. Az egyes mez ok
rtelmezse a kvetkez o:
gtk 2007/10/21 14:22 page 164 #164
164
void
*
_private E mez o a xmlNode struktra azonos mez ojvel hason-
lan az alkalmazsprogramoz szmra van fenntartva. Arra hasz-
nlhatjuk teht, amire csak akarjuk.
xmlElementType type Az adatstruktra tpusa, amelynek segtsgvel
azonosthatjuk a xmlAttr typus adatszerkezetet a memriban.
Itt mindig az XML_ATTRIBUTE_NODE rtket talljuk.
const xmlChar
*
name A tulajdonsg nevt hordoz karakterlnc helye
a memriban.
struct _xmlNode
*
children A tulajdonsg rtke. A tulajdonsgok
rtkt az XML programknyvtr a tulajdonsgok rtkt xmlNode
tpus szveges rtk u (a type mez oben XML_TEXT_NODE rtket
hordoz) adatszerkezetekben helyezi el, amelyek cmt e mez o hor-
dozza.
struct _xmlNode
*
last Ennek a mez onek az rtke lnyegtelen, csak
a hasonlsg rdekben szerepel a struktrban.
struct _xmlNode
*
parent A sz ul o csompont cme. A szl o az a cso-
mpont, amelyhez ez a tulajdonsg tartozik.
struct _xmlAttr
*
next A szl ocsomponthoz tartoz kvetkez o tulaj-
donsg cme a memriban, ha van ilyen, NULL, ha nincs.
struct _xmlAttr
*
prev Az el oz o tulajdonsg cme vagy NULL.
struct _xmlDoc
*
doc A dokumentum cme, amelyhez ez a tulajdonsg
szerepel.
xmlNs
*
ns A nvtr cme a memriban.
A kvetkez o nhny plda bemutatja a memriban elhelyezett doku-
mentum kezelsnek nhny jellegzetes lpst.
24. plda. A kvetkez o fggvny a 23. plda tovbbfejlesztett vltozata,
ami a csompontok bejrsa sorn nem csak azok szveges rtkeit, ha-
nem tulajdonsgait is kirja.
1 void
2 print_nodes_rec(xmlNodePtr node)
3 {
4 xmlNodePtr child_node;
5 xmlAttrPtr attr_ptr;
6
7 if (node == NULL)
8 return;
gtk 2007/10/21 14:22 page 165 #165
165
9
10 printf("%s = ", node->name);
11
12 if (node->type == XML_TEXT_NODE)
13 printf("%s\n", node->content);
14 else
15 printf("\n");
16
17 attr_ptr = node->properties;
18 while (attr_ptr != NULL) {
19 printf(" %s = %s\n",
20 attr_ptr->name,
21 attr_ptr->children->content);
22 attr_ptr = attr_ptr->next;
23 }
24
25 child_node = node->xmlChildrenNode;
26 while (child_node != NULL) {
27 print_nodes_rec(child_node);
28 child_node = child_node->next;
29 }
30 }
A fggvny a 10. sorban kirja az aktulis csompont nevt. Az XML
programknyvtr gondoskodik rla, hogy a nv cmt hordoz mutat
soha ne legyen NULL rtk u, ezrt itt nem kell elen orzst vgeznnk.
A kvetkez o lpsben a 1215. sorokban a nv utn ugyanabba a
sorba kirjuk a csomponthoz tartoz szvegrtket, ha gy talljuk,
hogy szveges rtket hordoz csompontrl van sz. Ha a csompont
nem szveges, egyszer uen egy jsor karakter runk ki, hogy a kimenet
olvashatbb legyen.
A fggvny a 1723. sorokban kirja a csomponthoz tartoz tulajdon-
sgok nevt s rtkt. Ehhez a 18. sorban kezd od o ciklus segtsgvel
vgigjrjuk a tulajdonsgokat trol listt a 17. sorban olvashat kindu-
lponttl a 22. sor lpskzvel. Ha a csompontnak nincsen egyetlen
tulajdonsga sem, akkor a ciklusmag termszetesen egyszer sem fut le.
A tulajdonsgok nevt a 20. sor alapjn a tulajdonsgot trol adat-
szerkezetnl, rtkt a 21. sor alapjn a tulajdonsg leszrmazottjaknt
szerepl o szveges csompont megfelel o mez ojb ol olvassuk ki.
A csompontok rekurzv bejrsa a mr ismertetett mdon a fgg-
vny 2529. soraiban lthat.
A fggvny kimenetnek bemutatshoz tegyk fel, hogy egy XML llo-
mny tartalmazza a kvetkez o sorokat:
gtk 2007/10/21 14:22 page 166 #166
166
1 <document type="article" year="2006">
2 <author>
3 <first-name>Lisa</first-name>
4 <last-name>Simpson</last-name>
5 </author>
6 <title>What a Family?!</title>
7 </document>
Ha a fggvnynek a document nev u elemet reprezentl csompontot
adjuk t paramterknt, a kvetkez o sorokat rja a kimenetre:
document =
type = article
year = 2006
author =
first-name =
text = Lisa
last-name =
text = Simpson
title =
text = What a Family?!
Meggyelhetjk, hogy a fggvny a tulajdonsgokat kt karakterrel bel-
jebb rja, hogy megklnbztethessk azokat az elemekt ol, amelyek a sor
elejn kezd odnek.
Az is jl lthat, hogy az elemek csompontjainak szveges rtkt k-
ln csompontban trolja a programknyvtr. A szveges rtket hordoz
csompontok neve minden esetben text.
25. plda. A kvetkez o fggvny visszaadja a csomponthoz tartoz
XML elem nevt:
1 xmlChar
*
2 xml_node_get_name(xmlNodePtr node)
3 {
4 if (node->type != XML_TEXT_NODE)
5 return g_strdup(node->name);
6 else
7 return g_strdup(node->parent->name);
8 }
A fggvny megvizsglja, hogy szveges jelleg u csompontrl van-e sz,
ha igen, akkor nem a csompont, hanem a szl o nevt adja vissza.
A fggvny a karakterlnc msolsra a g_strdup() fggvnyt hasz-
nlja s nem az XML programknyvtr hasonl clra hasznlhat
gtk 2007/10/21 14:22 page 167 #167
167
xmlCharStrdup() vagy xmlStrdup() fggvnyt. A vlaszts tulajdon-
kppen zls krdse.
26. plda. A kvetkez o fggvny bemutatja hogyan kszthetnk rkl-
het o tulajdonsgokat az XML elemek szmra.
1 xmlChar
*
2 xml_node_get_class(xmlNodePtr node)
3 {
4 xmlAttrPtr attr_ptr;
5
6 if (node == NULL)
7 return g_strdup("");
8
9 attr_ptr = node->properties;
10 while (attr_ptr != NULL) {
11 if (strcmp(attr_ptr->name, "class") == 0)
12 return g_strdup(attr_ptr->children->content);
13 attr_ptr = attr_ptr->next;
14 }
15
16 return xml_node_get_class(node->parent);
17 }
A fggvny a 914. sorokban megvizsglja, hogy a csompontnak van-e
class nev u tulajdonsga. Ha van, akkor visszaadja annak rtkt a 12.
sorban, miutn lemsolta.
Ha a fggvny nem tallta meg a keresett tulajdonsgot, jra prbl-
kozik a csompont szl ojvel, azaz a class tulajdonsg rklhet o. Ha
viszont a keress sorn a fggvny elri a dokumentum gykert, a 7.
sorban visszaadja az alaprtelmezett rtket, ami az res karakterlnc
msolata. (Nyilvnval, hogy azrt msoljuk le az res karakterlncot,
hogy a hvnak ne kelljen azon gondolkodnia, hogy felszabadtsa-e a me-
mriaterletet.)
6.2.7. A dokumentum mdostsa
Ahogyan mr lttuk az xmlNewDocNode() , xmlNewChild() fggvnyek-
kel a dokumentumban csompontokat hozhatunk ltre, amelyeket az
xmlSetProp() fggvnnyel j tulajdonsgokkal lthatunk el, gy a do-
kumentumot lpsr ol-lpsre felpthetjk. A kvetkez o oldalakon olyan
fggvnyeket vesznk sorra, amelyekkel a mdosts bonyolultabb lp-
seit is elvgezhetjk.
gtk 2007/10/21 14:22 page 168 #168
168
El ofordulhat pldul, hogy a dokumentum faszerkezett alulrl felfel
szeretnnk felpteni, mert a program algoritmusnak ez a termszetes
sorrendje. (A nyelvtani elemz ok legelterjedtebb csoportja pldul ponto-
san gy m ukdik, azaz egy ft pt fel alulrl felfel.) Ilyen esetben is
hasznlhatjuk a kvetkez o fggvnyeket:
xmlNodePtr xmlNewNode(xmlNsPtr nvtr, const xmlChar
*
nv); A fggvnnyel j csompontot hozhatunk ltre anl-
kl, hogy meghatroznnk, hogy a dokumentum melyik rszre fog
kerlni.
A fggvny els o paramtere a hasznlni kvnt nvteret jelli a me-
mriban vagy NULL, ha nem kvnunk nvteret meghatrozni.
A fggvny msodik paramtere a ltrehozand csompont nevt
jelli a memriban, rtke nem lehet NULL. A fggvny a nvr ol
dinamikus terletre elhelyezett msolatot kszt, gy a karakterln-
cot nem kell meg oriznnk. (Az xmlNewNodeEatName() hasonlan
m ukdik, de felhasznlja a nevet.)
A fggvny visszatrsi rtke a ltrehozott csompontot je-
lli a memriban. Az j csompont type mez ojnek rtke
XML_ELEMENT_NODE, azaz az j csompont az XML llomny egy
elemt reprezentlja.
xmlNodePtr xmlNewText(const xmlChar
*
szveg); A fggvny j
szveges csompontot hozhatunk ltre.
A fggvny paramtere a csompontban trolt szveget jelli a me-
mriban. A fggvny a szvegr ol msolatot kszt dinamikus me-
mriaterletre, gy azt nem kell meg oriznnk.
A fggvny visszatrsi rtke a ltrehozott j csompontot jelli a
memriban.
E fggvny kapcsn rdemes megemltennk, hogy nem szeren-
css, ha kzzel, az XML programknyvtr megkerlsvel prb-
lunk meg szveges csompontot ltrehozni, mert a programknyv-
tr a szveges csompontok nevnek (text) trolsra egyetlen me-
mriaterletet hasznl s ki is hasznlja, hogy az sszes szveges
csompontok neve mindig ugyanarra a memriaterletre mutat.
xmlNodePtr xmlNewComment(const xmlChar
*
szveg); A fggvny
segtsgvel j, megjegyzst tartalmaz csompontot hozhatunk
ltre, amelyet ks obb a dokumentum megfelel o rszre elhelyezhe-
tnk.
A fggvny paramtere a megjegyzs szvegt jelli a memriban.
A fgvny err ol a szvegr ol msolatot kszt, gy azt nem kell meg-
oriznnk.
gtk 2007/10/21 14:22 page 169 #169
169
A fggvny visszatrsi rtke az j csompontot jelli a memri-
ban.
xmlNodePtr xmlNewCDataBlock(xmlDocPtr doc, const xmlChar
*
szveg, int hossz); A fggvny segtsgvel j, adatblokk
tpus csompontot hozhatunk ltre. Az adatblokk olyan csom-
pont, amelyen bell a tiltott karaktereket nem kell rvidtseikre
cserlni.
A fggvny els o paramtere a dokumentumot jelli a memriban.
Ha itt NULL rtket adunk meg, a csompontban a dokumentum
nyilvntartsa helyrelltdik, amikor a csompontot a megfelel o
szl o megadsval elhelyezzk a dokumentumban.
A fggvny msodik paramtere az j csompont szvegt jelli a
memriban, harmadik paramtere pedig megadja, hogy legfeljebb
milyen hosszon ksztsen a fggvny msolatot a szvegr ol.
A fggvny visszatrsi rtke a ltrehozott j csompontot jelli a
memriban.
xmlNodePtr xmlAddChild(xmlNodePtr szlo, xmlNodePtr j); A
fggvnnyel j elemet helyezhetnk el a dokumentumban, az elem
helyeknt a leend o szl ocsompont meghatrozsval. A fggvny
hvsakor fel kell kszlnnk arra, hogy az az j elemet bizonyos
esetekben megsemmisti.
A fggvny els o paramtere a leend o szl ot, msodik paramtere
pedig az elhelyezend o j elemet jelli a memriban.
Ha az j csompont szveges s a szl ocsompont utols gyermeke
szintn az, akkor a fggvny az j csompont szvegt az utols
gyermekcsompont szveghez hozzmsolja s az j csompontot
felszabadtja. Ilyen esetben a fggvny a szl o utols o gyermeknek
cmt adja vissza.
Ha a szl o szveges tpus, a fggvny nem gyermekknt helyezi el
az j csompontot a szveges csompontoknak nem lehet gyerme-
kk , hanem megksrli a szl o szvegrtkt a gyermek szvegr-
tkvel b ovteni s szintn felszabadtja az j elemet. Ilyen esetben
a fggvny a szl o cmt adja vissza.
Ha a gyermekcsompont csomponttulajdonsgot r le a type me-
z ojnek rtke XML_ATTRIBUTE_NODE , a fggvny nem a gyerme-
kek kz, hanem a tulajdonsgok kz illeszti be, de miel ott meg-
tenn trli az esetleges azonos nev u, ltez o tulajdonsgot. A vissza-
trsi rtk ilyen esetben az j csompont cme.
Minden ms esetben a fggvny beilleszti az utols gyermek utn
az j csompontot s visszaadja annak cmt.
gtk 2007/10/21 14:22 page 170 #170
170
xmlNodePtr xmlAddNextSibling(xmlNodePtr testvr,
xmlNodePtr j); A fggvny segtsgvel j elemet helyezhe-
tnk el a dokumentumban a testvrnek megadsval.
A fggvny els o paramtere megadja melyik csompont utn sze-
retnnk beilleszteni a csompontot, a msodik paramtere pedig az
j csompontot jelli a memriban.
A fggvny visszatrsi rtke az j elem memriacme, de ennl a
fggvnynl is szmtanunk kell arra, hogy a szveges csomponto-
kat a programknyvtr egymsbaolvasztja, az j elemet megsemmi-
sti s annak az elemnek a cmt adja vissza, amelyek sszeolvasz-
totta az j elemet.
xmlNodePtr xmlAddPrevSibling(xmlNodePtr testvr,
xmlNodePtr j); A fggvny hasznlata s m ukdse meg-
egyezik az xmlAddNextSibling() fggvny hasznlatval s
m ukdsvel, azzal a klnbsggel, hogy ez a fggvny a megadott
csompont el illeszti be a csompontot.
xmlNodePtr xmlAddSibling(xmlNodePtr testvr, xmlNodePtr
j); E fggvny hasznlata s m ukdse megegyezik a
xmlAddNextSibling() fggvny hasznlatval s m ukds-
vel, azzal a klnbsggel, hogy ez a fggvny a testvrcsompontok
listjnak vgre, utols testvrknt illeszti be az j csompontot.
6.3. Az XPath eszkztr
Az XPath egy egyszer u nyelv, amelyet kimondottan az XML adatszerke-
zetekben val keressre fejlesztettek ki. Az XPath nyelv segtsgvel kije-
llhetjk, megszmllhatjuk, talakthatjuk az XML nyelven lert adatok
elemeit a csompontokat, csomponttulajdonsgokat, a csompontok-
hoz tartoz szveges rtkeket. Az XPath teht tulajdonkppen egy fejlett
lekrdez onyelv, ami igen hatkonyan hasznlhat az XML llomnyok
kezelsre.
Az XML programknyvtr tmogatja az XPath nyelvet, gy magas szint u
eszkztrat biztost a programoz szmra a memriban trolt XML
dokumentumokban val keressre. Miel ott azonban az XML program-
knyvtr ide vonatkoz fggvnyeit megismernnk, rdemes nhny szt
ejteni magrl az XPath nyelvr ol.
Az XPath az XML csompontokon a UNIX llomnyrendszerhez hason-
lan rtelmezi az svny fogalmt, amennyiben a gykrcsompont neve
a / jel s a csompontok nevb ol svnyt szintn a / jellel kszthetnk.
Valjban ahogyan az XPath elnevezs is jelzi (path, svny) a nyelv
legegyszer ubb kifejezsei egy svnyt adnak meg az XML faszerkezetben.
gtk 2007/10/21 14:22 page 171 #171
171
A /a/b pldul a gykrelemb ol elrhet o a elemen bell tallhat b ele-
met jelli. A UNIX knyvtrszerkezetnl megszokott jellshez hasonl
a .. jelentse is, ami az XPath nyelvben a szl oelemet jelli.
A csompontokbl kszlt svny esetben azonban gondolnunk kell
arra, hogy a UNIX llomnyrendszerrel szemben az XML llomny adott
helyn tbb azonos nev u csompont lehet. Az XPath az egyszer u svny
esetben mindig az els o illeszked o nev u csompontot vlasztja. A
/database/document/title
kifejezs segtsgvel pldul egy csomponthalmazt azonost, amelyben
a gykrelemben tallhat sszes document elem sszes title eleme
beletartozik.
Az svny megadsakor hivatkozhatunk a csompontok rtkre is.
Ehhez a csompont neve el egyszer uen csak a @ karaktert kell r-
nunk, jelezve, hogy nem csompontrl, hanem csomponttulajdonsgrl
van sz. A /document/@version pldul a document nev u csompont
version nev u tulajdonsgt jelli.
Vegyk szre, hogy a /@version kifejezsnek pldul nem sok rtelme
van, hiszen a / csompont nem ltez o XML elem csak a faszerkezet
kezd opontjnak jellse s gy tulajdonsgai sem lehetnek. Ugyangy a
/document/@version/title kifejezs is rtelmetlen, hiszen a tulajdon-
sgokon bell nem lehet jabb csompontokat elhelyezni.
A
*
helyettest okaraktert mind a csompontok, mind pedig a tulajdon-
sgok neveinek helyettestsre hasznlhatjuk. A
/database/
*
/@
*
kifejezs pldul olyan csomponthalmazt jell, amelybe beletartozik a
database nev u gykrelem sszes leszrmazottjnak sszes csompont-
tulajdonsga. Nemhasznlhatjuk viszont a
*
karaktert a csompont vagy
tulajdonsg nevnek karaktereivel keverve, azaz a
*
a s a @a
*
egyarnt
hibs.
Az XPath nyelv kifejez oerejt nagymrtkben megnveli a [] zrjelpr,
aminek a segtsgvel a kivlasztott csompontok listjt sz urhetjk. A
szgletes zrjelek kzt hivatkozhatunk a csompontok s a csompont-
tulajdonsgok rtkre, hasznlhatunk m uveleti jeleket s fggvnyeket,
gy az XPath kifejezs segtsgvel igen pontosan megfogalmazhatjuk,
hogy pontosan milyen csompontokat keresnk. A
/database/document[@type=article]/author/first-name
/database/document/author[first-name = Bart]/../title
kifejezsekkel pldul lekrdezhetjk azoknak a szerz oknek a keresztne-
vt, akik cikk tpus dokumentumot rtak, illetve azoknak a dokumen-
tumoknak a cmt, amelyeknek szerz oje a Bart keresztnvre hallgat. A
fggvnyek segtsgvel a kifejezsek tovbb nomthatk. A
gtk 2007/10/21 14:22 page 172 #172
172
/database/document[contains(author, Hom)]/title
/database/document[position()=2]/author
kifejezsek segtsgvel pldul kivlaszthatjuk azoknak a dokumentu-
moknak a cmt, amelyek szerz ojnek a nevben szerepel a Hom karak-
terlnc, illetve a sorrendben msodik dokumentum szerz ojt. Ez utbbi
kifejezst, az azonos nev u csompontok sorban elfoglalt hely megadst
rvidthetjk a
/database/document[2]/author
formban.
A sz ur okifejezsek kapcsn fontos, hogy szt ejtsnk a csompontok
rtkr ol. Az XPath kifejezsekben a csompontok szveges rtke az
rtk, amelyet a csompont nevhez rendelnk az sszes leszrmazott
csompont szveges rtknek s magnak a csompontnak a szveges
rtknek egyms utn val msolsval kaphat meg. Ha pldul egy
XML llomny rszlete
<a><b>egy</b><c>ketto</c>hrom</a>
akkor a a csompontnvhez az egykettohrom szveges rtk tartozik.
Ha kizrlag az adott csomponthoz tartoz szveges rtket akarjuk le-
krdezni, akkor a text() XPath fggvnyt kell hasznlnunk. A
/database/document[position()=1]/text()
kifejezs pldul az els o document nev u csomponthoz tartoz szveget
adja, amibe nem rtend o bele a leszrmazott csompontok rtke.
Ahogy lthat a fggvnyeket nem csal a [] jelek kzt hasznlhatjuk.
A klnfle XPath fggvnyeknek klnfle visszatrsi rtkei vannak,
gy el ofordulhat, hogy az XPath kifejezs nem csompontot, nem is cso-
mpontok halmazt adja, hanem pldul szmrtket. A
count(/database/document)
szmrtkknt megadja, hogy az adatbzisban hny dokumentumrl t-
rolunk adatokat.
Az XPath fggvnyekre a ks obbiekben mg visszatrnk, el obb azon-
ban bemutatjuk a legfontosabb fggvnyeket, amelyek az XPath kifeje-
zsek kirtkelshez szksgesek.
6.3.1. Egyszer u XPath kifejezsek kirtkelse
Az XML programknyvtr kvetkez o fggvnyei segtsgvel az XPath ki-
fejezsek kirtkelhjet ok, a memriban elhelyezett XML dokumentum-
ban trolt adatok egyszer uen lekrdezhet ok:
gtk 2007/10/21 14:22 page 173 #173
173
xmlChar
*
xmlGetNodePath(xmlNodePtr node); A fggvny segts-
gvel az adott csomponthoz tartoz svnyt llapthatjuk meg.
A fggvny argumentuma a csompontot jelli a memriban,
visszatrsi rtke pedig egy olyan dinamikusan foglalt memriate-
rletre mutat, amelyben olyan XPath kifejezs van elhelyezve, ami-
nek eredmnye ppen az argumentum ltal kijellt csompont. A
fggvny hiba esetn NULL rtket ad vissza.
xmlXPathContextPtr xmlXPathNewContext(xmlDocPtr doc); Az
XML programknyvtr az XPath kifejezseket az XPath krnyezet
(context, szvegkrnyezet, kontextus) gyelembevtelvel hajtja
vgre. Miel ott teht XPath kifejezsek kirtkelshez fognnk, leg-
albb egy XPath krnyezetet ltre kell hoznunk ezzel a fggvnnyel.
A fggvny argumentuma a memriban elhelyezett dokumentu-
mot, visszatrsi rtke pedig a ltrehozott XPath krnyezetet jelli
a memriban.
void xmlXPathFreeContext(xmlXPathContextPtr kontextus); A
fggvny segtsgvel az XPath krnyezetet semmisthetjk meg, ha
mr nincs szksgnk r.
A fggvny argumentuma a megsemmistend o krnyezetet jelli a
memriban.
xmlXPathObjectPtr xmlXPathEvalExpression(const xmlChar
*
kifejezs, xmlXPathContextPtr kontextus); A fggvny
segtsgvel a karakterlncknt megadott XPath kifejezst az adott
krnyezet alapjn kirtkelhetjk, azaz kiszmthatjuk az rtkt.
A fggvny els o paramtere a karakterlncknt brzolt XPath ki-
fejezst, msodik paramtere pedig az XPath krnyezetet amelyet
az xmlXPathNewContext() fggvnnyel hoztunk ltre jelli a me-
mriban.
A fggvny visszatrsi rtke az XPath kifejezs kirtkelsnek
eredmnyt trol sszetett adatszerkezetet jelli a memriban, ha
a paramterknt meghatrozott XPath kifejezs hibtlan, NULL r-
tk, ha a kifejezsben nyelvtani hiba volt. Mivel a kirtkels ered-
mnye szveges, szm jelleg u, s ot csomponthalmaz is lehet, az
eredmny kezelse nem mindig egyszer u.
Az XPath kifejezsek kirtkelse sorn kapott xmlXPathObjectPtr
tpus adatszerkezet rszletes rtelmezsre a ks obbiekben vissza-
trnk.
void xmlXPathFreeObject(xmlXPathObjectPtr obj); A fgg-
vny segtsgvel az XPath kifejezs kirtkelsekor kapott
gtk 2007/10/21 14:22 page 174 #174
174
xmlXPathObjectPtr tpus mutatval jelzett adatszerkezetet
felszabadthatjuk.
A fggvny paramtere a felszabadtand adatszerkezetet jelli a
memriban.
xmlChar
*
xmlXPathCastToString(xmlXPathObjectPtr val); A
fggvny segtsgvel az XPath kifejezs eredmnyt karakterlnc-
knt krdezhetjk le.
A fggvny paramtere az XPath kifejezs kirtkelsekor ka-
pott mutat a xmlXPathEvalExpression() visszatrsi rtke
visszatrsi rtke pedig az XPath lekrdezs szveges eredmnye
vagy NULL rtk hiba esetn.
Ez a fggvny nem NULL rtket ad, ha a krdses XPath kifejezs-
nek nem szveges az rtke azaz ha pldul a keresett csompont
nem ltezik , hanem egy 0 hosszsg karakterlncot hoz ltre s
annak a mutatjt adja visszatrsi rtkknt.
Ha az XPath kifejezs rtke csomponthalmaz, akkor a fggvny a
csompontok kzl csak a legels ot veszi gyelembe, annak a szve-
ges rtkt adja.
A dokumentci szerint a fggvny visszatrsi rtke dinamikusan
foglalt memriaterletre mutat amelyet fel kell szabadtanunk az
xFree() fggvnnyel ha az XPath kifejezs eredmnye nem sz-
veges jelleg u volt. Az XML programknyvtr forrst tbngszve
viszont arra kell rbrednnk, hogy az xmlXPathCastToString()
mindig dinamikusan foglalt memriaterletet ad vissza, amit min-
dig fel kell szabadtanunk. Ez megknnyti a munknkat, s egyben
jelzi, hogy az XML programknyvtr dokumentcija sajnos nem
csak sz ukszav, de helyenknt hibs is.
Ez a lekrdezs rtkt szveges alakra hozza akkor is, ha az erede-
tileg szm jelleg u volt, hasznlhatjuk teht, ha a szmra szvegknt
van szksgnk.
double xmlXPathCastToNumber(xmlXPathObjectPtr val); A fgg-
vny segtsgvel az XPath kifejezs kirtkelsi rtkt krdezhet-
jk le szm formban.
A fggvny paramtere a kifejezs kirtkelsnek eredmnyt je-
lli a memriban, visszatrsi rtke pedig a kifejezs rtke szm
formban.
int xmlXPathCastToBoolean(xmlXPathObjectPtr val); A fgg-
vny segtsgvel az XPath kifejezs rtkt krdezhetjk le logikai
rtkknt.
gtk 2007/10/21 14:22 page 175 #175
175
A fggvny paramtere a kifejezs eredmnyt jelli a memriban,
visszatrsi rtke pedig 1 vagy 0, aszerint, hogy az rtk logikai
igaz, vagy hamis rtket kpvisel.
A bemutatott fggvnyek segtsgvel, a xmlXPathObjectPtr mutat
ltal kijellt adatszerkezet szerkezetnek pontos ismerete nlkl is elv-
gezhetnk lekrdezseket. Ezt mutatja be a kvetkez o plda.
27. plda. A kvetkez o fggvny az XPath kifejezs kirtkelsnek le-
het o legegyszer ubb mdjt mutatja be, csak a legszksgesebb fggv-
nyek hvsval.
1 void
2 xpath_search(xmlDocPtr document,
3 const gchar
*
path)
4 {
5 xmlXPathContextPtr xpath_ctx;
6 xmlXPathObjectPtr xpath_obj;
7 xmlChar
*
string;
8
9 xpath_ctx = xmlXPathNewContext(document);
10
11 xpath_obj = xmlXPathEvalExpression(path, xpath_ctx);
12 string = xmlXPathCastToString(xpath_obj);
13 g_message("%s=%s", path, string);
14
15 xmlFree(string);
16 xmlXPathFreeObject(xpath_obj);
17 xmlXPathFreeContext(xpath_ctx);
18 }
Az XPath kifejezs kirtkelse s a szveges rtk kinyerse knnyen
vgigkvethet o a fggvny olvassval. A fggvny hvsa sorn a 22.
plda XML adatszerkezete esetben a fggvny a kvetkez o sorokat rta
ki:
1
**
Message: /root/if/condition=8 < 9
2
**
Message: /root/if/@type=numeric
Figyeljk meg, hogy a lekrdezs sorn az eredeti karakterlncokat kap-
tuk vissza, a tiltott karakterek rvidtseit az XML programknyvtr az
eredeti karakterekre cserlte le.
gtk 2007/10/21 14:22 page 176 #176
176
6.3.2. Az sszetett eredmny u XPath kifejezsek
Az XPath kifejezsek eredmnyt az XML programknyvtr az
xmlXPathObject tpus struktrban helyezi el, a struktra cmt pedig
az xmlXPathObjectPtr tpus mutatban adja t. A struktra legfonto-
sabb mez oi a kvetkez ok:
Az xmlXPathObject struktra
xmlXPathObjectType type Az eredmny tpusa.
xmlNodeSetPtr nodesetval Az elemhalmaz rtk.
int boolval A logikai rtk.
double floatval A szm jelleg u rtk.
xmlChar
*
stringval A karakterlnc rtk.
A struktra type eleme meghatrozza, hogy az eredmny milyen jel-
leg u. Itt tbbek kztt a kvetkez o llandk egyikt tallhatjuk meg:
XPATH_UNDEFINED Az eredmny ismeretlen tpus, nem hordoz rtket.
XPATH_NODESET Az eredmny tpusa csomponthalmaz, rtkt a
nodesetval mez o jelli a memriban.
XPATH_BOOLEAN Az eredmny logikai tpus, rtke a boolval mez oben
tallhat.
XPATH_NUMBER Az eredmny szm tpus, rtke a floatval mez oben
tallhat.
XPATH_STRING Az eredmny karakterlnc tpus, rtke stringval me-
z oben tallhat mutatval jelzett memriaterleten tallhat.
XPATH_XSLT_TREE Az eredmny tpusa csomponthalmaz, rtke a
nodesetval mez oben tallhat.
Ha az XPath kifejezs eredmnye csomponthalmaz, akkor az ered-
mnyl kapott xmlXPathObject adatszerkezet xmlNodeSetPtr tpus
mutatja egy xmlNodeSet adatszerkezetet jell a memriban. Az
xmlNodeSet ahogyan a neve is mutatja csomponthalmazok tro-
lsra hasznlhat adatszerkezet, ami a kvetkez o mez okb ol ll:
Az xmlNodeSet struktra
int nodeNr A csompontok szma.
int nodeMax A foglalt terlet mrtke.
xmlNodePtr
*
nodeTab A csompontok cmt trol tmb cme.
Ezen ismeretek birtokban knnyen rhatunk olyan fggvnyt, ami az
XPath kifejezs eredmnyeknt kapott csomponthalmazt vgigjrja. Ezt
mutatja be a kvetkez o plda.
gtk 2007/10/21 14:22 page 177 #177
177
28. plda. A kvetkez o fggvny argumentumknt az XPath kifejezs
eredmnyt kapja, az abban trolt csompontok mindegyikt vgigjrja,
az rtkket kir fggvnyt meghyvja.
1 void
2 print_nodeset(xmlXPathObjectPtr xpath_obj)
3 {
4 xmlNodeSetPtr cur;
5 int n;
6
7 g_assert(xpath_obj->type == XPATH_NODESET);
8
9 cur = xpath_obj->nodesetval;
10 for (n = 0; n < cur->nodeNr; n++)
11 g_message("Val: %s",
12 xmlNodeGetContent(cur->nodeTab[n]));
13 }
A fggvnyt csak olyan xmlXPathObjectPtr mutatval hvhatjuk, ami
csomponthalmaz jelleg u adatokat hordoz s ezt a fggvny a 7. sorban
ellen orzi is.
A fggvny a 1012. sorokban tallhat ciklussal vgigjrja az argu-
mentum ltal jellt adatszerkezetben az XPath kifejezs eredmnyben
tallhat sszes csompontot s kirja ezek szveges rtkt.
6.3.3. Az XPath m uveleti jelek s fggvnyek
Az XPath kifejezsekben az XML programknyvtr szveges s szm jel-
leg u llandk, m uveleti jelek opertorok s fggvnyek hasznlatt
is lehet ov teszi. A szveges llandkat a " " vagy a jelek kz kell
rnunk, a szm jelleg u llandkat pedig a szoksos formban adhatjuk
meg. Mivel a C programozsi nyelv karakterlncait a " " jelekkel kell ha-
trolnunk, szerencss, ha az XPath karakterlnc tpus llandihoz a
jeleket hasznljuk (pldul "concat(hello, , vilag)"). Az
XPath kifejezs eredmnynek tpusa termszetesen magtl a kifejezs-
t ol fgg oen alakul.
A szm jelleg u rtkeken a szoksos mdon hasznlhatjuk a ngy alap-
m uvelet jelt +, -,
*
, / s a ( ) zrjeleket.
"boolean", "ceiling", "count", "concat", "contains", "id", "false", "oor",
"last", "lang", "local-name", "not", "name", "namespace-uri", "normalize-
space", "number", "position", "round", "string", "string-length", "starts-
with", "substring", "substring-before", "substring-after", "sum", "true",
"translate",
gtk 2007/10/21 14:22 page 178 #178
178
gtk 2007/10/21 14:22 page 179 #179
7. fejezet
Tbbablakos alkalmazsok
E fejezetben azokrl az eszkzkr ol lesz sz, amelyek segtsgvel tbb
ablakot hasznl alkalmazsokat kszthetnk. A bemutatott eszkzk
szksgesek az ablakok nyitshoz s zrshoz, illetve ahhoz, hogy az
egyes ablakokhoz tartoz programrszek adatokat cserljenek egyms-
sal.
7.1. Az ablakok megnyitsa, bezrsa
Ha a Glade segtsgvel tbb ablakot ksztnk, a program fordtsa utn
az sszes ablak megjelenik a kperny on. A legtbb esetben termszetesen
nem kvnjuk megnyitni az sszes ablakot az alkalmazs indtsakor, gy
nyilvnval, hogy valamit tennnk kell.
A Glade alaprtelmezs szerint a projekt alapknyvtrban tallhat
src/ alknyvtrban lv o main.c llomnyban helyezi el az ablakok meg-
nyitsrt felel os programrszt. A kvetkez o sorok ezt a rszt brzoljk.
1 /
*
2
*
The following code was added by Glade to create one
3
*
of each component (except popup menus), just so
4
*
that you see something after building the project.
5
*
Delete any components that you dont want shown
6
*
initially.
7
*
/
8 window1 = create_window1 ();
9 gtk_widget_show (window1);
10 window2 = create_window2 ();
11 gtk_widget_show (window2);
179
gtk 2007/10/21 14:22 page 180 #180
180
A programrszlet magyarzatnak fordtsa:
1 /
*
2
*
A kvetkezo programrszt a Glade azrt hozta ltre,
3
*
hogy minden kpernyoelembol egy megjelenjen (kivve
4
*
a lebego menket), s legyen valami a kpernyon a
5
*
program ltrehozsa utn. Trlje ki brmelyik
6
*
elemet amelyet kezdetben nem akar megjelenteni.
7
*
/
A programrszletb ol megtudhatjuk, hogy a Glade ezt az llomnyt nem
rja fell, ezrt nyugodtan mdosthatjuk.
Azt is megtudhatjuk, hogy hogyan tudunk j ablakot nyitni. A Glade
minden ablak szmra ltrehoz egy fggvnyt, ami ltrehozza az abla-
kot. Az ablakot ltrehoz fggvny neve szemmel lthatan tartalmazza
magnak az ablaknak a nevt. A pldban a window1 s window2 nev u
ablakok ltrehozsra a create_window1() , illetve create_window2()
fggvnyek hasznlhatk. A fggvnyek visszatrsi rtke GtkWidget
*
tpus.
Az ablakok ltrehozsra, megjelentsre s bezrsra hasznlhatk
a kvetkez o fggvnyek.
GtkWidget
*
create_xxx(void);
Az ilyen nvvel elltott fggvnyeket a Glade hozza ltre
az interface.c llomnyban. A fggvnyek deklarcija az
interface.h llomnyban vannak.
A fggvnyek ltrehozzk az adott nev u ablakot (az ablak neve az
xxx helyn tallhat) s az ablakban tallhat sszes kperny o-
elemet. Az ablak megjelentsr ol azonban a fggvnyek nem gon-
doskodnak, azaz az elksztett ablak nem jelenik meg a kperny on,
amg err ol kln nem gondoskodunk.
Az ablakokat ltrehoz fggvnyeket tbbszr is meghvhatjuk egy-
ms utn, hogy tbb egyforma ablakot hozzunk ltre.
void gtk_widget_show(GtkWidget
*
elem); Amint azt mr a 3.3.2.
oldalon lthattuk, e fggvny segtsgvel megjelenthetjk a kp-
erny oelemeket a kperny on.
Az ablakok kapcsn annyit kell mg tudnunk err ol a fggvnyr ol,
hogy a Glade ltal ltrehozott, ablakok ltrehozsra szolgl fgg-
vnyek a Glade tulajdonsgok ablaknak lthat kapcsolja alap-
jn meghvjk ezt a fggvnyt az ablak bels o kperny oelemeinek
megjelentsre. Amikor teht a gtk_widget_show() fggvnnyel
megjelentjk magt az ablakot, megjelennek a hozz tartoz kp-
erny oelemek is.
gtk 2007/10/21 14:22 page 181 #181
181
A fggvny paramtere azt a mr ltrehozott kperny oelemet
jelli a memriban, amelyet meg kvnunk jelenteni.
void gtk_widget_show_all(GtkWidget
*
elem); A fggvny m uk-
dse megegyezik a gtk_widget_show() fggvny m ukdsvel, de
a kperny oelemben tallhat bels o kperny oelemeket is megjelenti,
akkor is, ha azok megjelentsr ol mg nem gondoskodtunk.
Az Glade segtsgvel ksztett ablakok megjelentsre ezt a fgg-
vnyt ltalban nem szerencss hasznlni, mivel feleslegesen jrja
vgig a bels o kperny oelemeket, amelyeket a Glade ltal ksztett
fggvny mr megjelentett s amelyek csak azrt nem ltszanak a
kperny on, mert maga az ablak nem ltszik.
void gtk_widget_destroy(GtkWidget
*
elem); Amint azt a 3.3.2.
oldalon lttuk, ezt a fggvny kperny oelemek megsemmistsre
hasznlhatjuk. Ha valamelyik ablakot be akarjuk zrni, akkor l-
talban nem egyszer uen eldugjuk oket a felhasznlk el ol (lsd a
gtk_widget_hide() fggvnyt a 3.3.2. oldalon), hanem megsem-
mistjk a teljes tartalmukkal egytt e fggvny segtsgvel.
A fggvny paramtere a megsemmistend o kperny oelemet jelli a
memriban.
7.1. bra. Tbbablakos alkalmazs
Ksztsnk a Glade segtsgvel egy pro-
jektet, amely kt ablakot tartalmaz! Az els o
ablak tartalmazzon egy nyomgombot a
msodik ablak megnyitsra, a msodik
ablak pedig tartalmazzon egy nyomgom-
bot a sajt ablak bezrsra. Az alkalma-
zst a 7.1. bra mutatja be.
A kvetkez o plda bemutatja hogyan
tudjuk a visszahvott fggvnyekben a
megfelel o m uveleteket megvalstani.
29. plda. A kvetkez o programrszlet-
ben lthatjuk hogyan tudunk j ablakot
nyitni s ablakot bezrni, illetve hogyan
tudunk a programbl kilpni a visszah-
vott fggvnyek segtsgvel.
1 /
*
2
*
j ablak nyitsa ms ablakban tallhat
3
*
nyomgomb segtsgvel.
4
*
/
5 void
6 on_open_clicked(GtkButton
*
button,
gtk 2007/10/21 14:22 page 182 #182
182
7 gpointer user_data)
8 {
9 GtkWidget
*
window2;
10
11 window2 = create_window2();
12 gtk_widget_show(window2);
13 }
14
15 /
*
16
*
Kilps a programbl.
17
*
/
18 void
19 on_exit_clicked(GtkButton
*
button,
20 gpointer user_data)
21 {
22 exit(EXIT_SUCCESS);
23 }
24
25 /
*
26
*
Ablak bezrsa az ablakban tallhat nyomgomb
27
*
segtsgvel.
28
*
/
29 void
30 on_close_clicked(GtkButton
*
button,
31 gpointer user_data)
32 {
33 GtkWidget
*
window2;
34 window2 = lookup_widget(GTK_WIDGET(button),
35 "window2");
36 gtk_widget_destroy(window2);
37 }
38
A programrszletben lthat visszahvott
fggvnyek m ukdse knnyedn megrt-
het o a bemutatott ismeretek alapjn.
7.2. A fggvnyhvssal ltrehozhat ablakok
A kvetkez o nhny oldalon olyan ablakokrl lesz sz, amelyeket nem
a Glade segtsgvel, hanem a megfelel o fggvnyek hvsval hozunk
ltre s kezelnk. Ezek a segdeszkzk egyszer ubb teszik a munkn-
kat, hiszen nem kell neknk megtervezni az ablakokat, azokat a GTK+
gtk 2007/10/21 14:22 page 183 #183
183
programknyvtr tartalmazza.
7.2.1. Az zenet-ablakok
Sokszor el ofordul, hogy nem akarunk bonyolult ablakot kszteni, csak
egy egyszer u zenetet szeretnnk megjelenteni a felhasznl szmra.
Termszetesen megtehetjk, hogy a printf() vagy az fprintf() fgg-
vny segtsgvel a szabvnyos kimenetre vagy a szabvnyos hibacsator-
nra kldnk egy zenetet, de ezt a felhasznl nem ltja, ha a prog-
ramunkat nem a parancssorbl indtotta el, hanem egy men vagy ikon
segtsgvel.
Az is megoldst jelenthet, ha az zenet szmra ksztnk egy egy-
szer u ablakot. Ha a Glade segtsgvel ksztnk egy ablakot, amelyben
egy cmke s nhny nyomgomb van, az zenetet el tudjuk helyezni a
cmkben. Ez azonban kiss bonyolult s fraszt mdszer, f oleg, ha az
zeneteinket tbbfle formban szeretnnk megjelenteni.
7.2. bra. A hibazenet ablak
Knyelmes s tetszet os megoldst jelenthet a
GTK+ zenetek megjelentsre szolgl abla-
kainak hasznlata. Ezek az zenet-ablakok n-
hny egyszer u fggvny segtsgvel megjelent-
het ok s eltvolthatk s mivel tbbfle for-
mban llnak a rendelkezsnkre, mindig az
adott zenet jelleghez igazthatk. A GTK+ se-
gtsgvel zenetek megjelentsre hasznlhat
zenet-ablakokat lthatunk a 7.2. s 7.3. br-
kon. Figyeljk meg, hogy az zenet jellegnek
megfelel o ablakcm s ikon jelenthet o meg s az zenetnek megfelel oen
egy vagy tbb nyomgomb is megjelenthet o az ablakokban. Ha tbb nyo-
mgomb is tallhat az ablakban, termszetesen knnyen ki tudjuk de-
rteni, hogy a felhasznl melyik nyomgombot hasznlta az ablak bez-
rsra.
7.3. bra. A krds ablak
Tudnunk kell, hogy az zenet-ablakok modli-
sak, azaz amg zenet ablak lthat a kperny on,
addig a felhasznl nem tudja az alkalmazsunk
egyb elemeit hasznlni. Ez roppant hasznos, hi-
szen gy a felhasznl nem tud tovbblpni, amg
az adott zenetet nem zrja le, amg az adott kr-
dsre nem vlaszolt. Az zenet-ablakok e tulaj-
donsga biztostja a programoz szmra, hogy
a program adott pontjn a vlasz mr biztosan
elrhet o legyen, ami egyrtelm uen megknnyti a
program megrst.
Az zenet-ablakok hasznlata kzben a kvetkez o fggvnyek s llan-
dk a legfontosabbak.
gtk 2007/10/21 14:22 page 184 #184
184
GtkWidget
*
gtk_message_dialog_new(GtkWindow
*
szlo,
GtkDialogFlags kapcsolk, GtkMessageType tpus,
GtkButtonsType gombok, const gchar
*
formzszveg,
...); A fggvny segtsgvel j zenet-ablakot kszthetnk a
megadott formban, a megadott szveggel.
A fggvny szmra a printf() fggvnyhez hasonl mdon for-
mzszveggel s tetsz oleges szm argumentummal adhatjuk
meg az ablakban megjelentend o szveget, ezrt ezt a fggvnyt igen
knnyen hasznlhatjuk egyszer u zenetek megjelentsre grakus
felhasznli felleten.
A fggvny argumentumai s visszatrsi rtke a kvetkez ok:
visszatrsi rtk A fggvny ltal ltrehozott ablakot jelli a
memriban.
szlo A ltrehozand ablak szl oablakt jelli a memriban. Az
zenet ablakok mindig rendelkeznek egy szl oablakkal, amely
az alkalmazsunk valamelyik ablaka.
kapcsolk Az ablak viselkedst befolysol kapcsolk. Itt ltal-
ban csak a GTK_DIALOG_DESTROY_WITH_PARENT llandt ad-
juk meg, amely arra ad utastst, hogy a ltrehozand ablakot
meg kell semmisteni, ha a szl oablak megsemmisl.
tpus A ltrehozand zenet-ablak tpusa, amely meghatrozza az
ablak cmt s az abban tallhat ikon kinzett. Itt a kvetkez o
llandk egyikt hasznlhatjuk:
GTK_MESSAGE_INFO Tjkoztat jelleg u ablak.
GTK_MESSAGE_WARNING Figyelmeztets jelleg u ablak.
GTK_MESSAGE_QUESTION Krdst megfogalmaz ablak.
GTK_MESSAGE_ERROR Hibazenetet hordoz ablak.
gombok Meghatrozza, hogy milyen nyomgombok jelenjenek meg
a ltrehozott ablakban. Itt a kvetkez o llandk egyikt hasz-
nlhatjuk:
GTK_BUTTONS_OK Egy darab OK felirat nyomgomb.
GTK_BUTTONS_CLOSE Egy darab bezr felirat nyomgomb.
GTK_BUTTONS_CANCEL Egy darab mgsem felirat nyom-
gomb.
GTK_BUTTONS_YES_NO Egy igen s egy nem felirat u nyom-
gomb.
GTK_BUTTONS_OK_CANCEL Egy OK s egy mgsem felirat
nyomgomb.
gtk 2007/10/21 14:22 page 185 #185
185
A nyomgombok a felhasznl ltal belltott nyelven megfogal-
mazott szveget s a felhasznl ltal belltott tmnak meg-
felel o ikont tartalmazzk.
formzszveg Ez a paramter formjban s jelentsben meg-
egyezik a printf() szabvnyos knyvtri fggvnynl hasznlt
formzszveggel, meghatrozva az zenet ablakban megjelen o
szveget.
... A formzszvegben hivatkozott rtkek sora, ahogyan azt a
printf() fggvnynl is meggyelhettk.
gint gtk_dialog_run(GtkDialog
*
ablak);
A fggvny felfggeszti az alkalmazs futst kivve az adott ab-
lak kezelst amg az ablakot valamely elemvel be nem zrja a
felhasznl. A fggvny segtsgvel az alkalmazs megvrhatja
amg a felhasznl az adott zenet-ablakkal van elfoglalva.
E fggvny hvsa utn ltalban a gtk_widget_destroy() fgg-
vnyt hvjuk, hogy a dialgusablakot megsemmistsk.
A fggvny visszatrsi rtke s argumentuma a kvetkez ok:
visszatrsi rtk A fggvny visszatrsi rtke megadja,
hogy az ablak milyen krlmnyek kzt zrdott be. A fgg-
vny a kvetkez o llandk egyikt adja vissza:
GTK_RESPONSE_DELETE_EVENT Az ablak nem nyomgomb ha-
tsra zrult be.
GTK_RESPONSE_OK A bezrs az OK felirat nyomgomb se-
gtsvel trtnt.
GTK_RESPONSE_CANCEL Bezrs a mgsem nyomgombbal.
GTK_RESPONSE_CLOSE Bezrs a bezr nyomgombbal.
GTK_RESPONSE_YES Bezrs az igen nyomgombbal.
GTK_RESPONSE_NO Bezrs a nem nyomgombbal.
ablak A megjelentend o ablakot jelli a memriban.
Az zenet-ablakok kapcsn rdemes megemltennk, hogy
az zenet ablakokhoz tovbbi nyomgombok adhatk a
gtk_dialog_add_buttons() fggvny segtsgvel. Errl a fggvnyr ol
a GTK+ dokumentcijban olvashatunk rszletesebben.
30. plda. A kvetkez o fggvny bemutatja, hogyan hozhatunk ltre
egyszer u zenetablakot. Figyeljk meg, hogy az zenet-ablak ltrehoz-
shoz ki kellett dertennk a szl oablak cmt, s ezt a szoksos mdon,
a Glade ltal ksztett lookup_widget() fggvny segtsgvel tettnk
meg. Az is meggyelhet o a programrszletben, hogy az zenet-ablakot a
bezrs utn gtk_widget_destroy() fggvny segtsgvel megsemmi-
stettk, hogy ne foglaljon feleslegesen memrit.
gtk 2007/10/21 14:22 page 186 #186
186
1 void
2 on_item_error_activate(GtkMenuItem
*
menuitem,
3 gpointer user_data)
4 {
5 GtkWidget
*
window;
6 GtkWidget
*
dialog;
7
8 window = lookup_widget(GTK_WIDGET(menuitem), "app1");
9 dialog = gtk_message_dialog_new (GTK_WINDOW(window),
10 GTK_DIALOG_DESTROY_WITH_PARENT,
11 GTK_MESSAGE_ERROR,
12 GTK_BUTTONS_CLOSE,
13 "A hibazenet szvege: %s: %s",
14 "llomnynv", g_strerror(errno));
15 gtk_dialog_run (GTK_DIALOG (dialog));
16 gtk_widget_destroy (dialog);
17 }
31. plda. A kvetkez o programrszletben mr nem csak egy egyszer u
zenetet fogalmazunk meg, hanem egy krdst tesznk fel a felhasznl-
nak, ezrt tudnunk kell, hogy a felhasznl melyik nyomgombot nyomta
le az ablak bezrsakor. Ennek megfelel oen a 16. sorban elmentjk a
gtk_dialog_run() fggvny visszatrsi rtkt s kirtkeljk 1928.
sorokban.
1 void
2 on_item_question_activate(GtkMenuItem
*
menuitem,
3 gpointer user_data)
4 {
5 GtkWidget
*
window;
6 GtkWidget
*
dialog;
7 gint response;
8
9 window = lookup_widget(menuitem, "app1");
10 dialog = gtk_message_dialog_new (GTK_WINDOW(window),
11 GTK_DIALOG_DESTROY_WITH_PARENT,
12 GTK_MESSAGE_QUESTION,
13 GTK_BUTTONS_YES_NO,
14 "A krds szvege...");
15 response = gtk_dialog_run (GTK_DIALOG (dialog));
16 gtk_widget_destroy (dialog);
17
18 switch (response) {
gtk 2007/10/21 14:22 page 187 #187
187
19 case GTK_RESPONSE_YES:
20 printf("Rendben.\n");
21 break;
22 case GTK_RESPONSE_NO:
23 printf("Nem?\n");
24 break;
25 default:
26 printf("Nincs vlasz...\n");
27 }
28 }
7.2.2. Az llomnynv-ablak
Sokszor el ofordul, hogy az alkalmazsunk valamilyen llomny- vagy
knyvtrnevet szeretne megtudakolni a felhasznltl. Ehhez a feladat-
hoz egy igen knyelmes s knnyen kezelhet o eszkzt biztost a GTK+
programknyvtr az llomnynv-ablakkal amelyet a 7.4. brn ltha-
tunk.
7.4. bra. Az llomnynv ablak
Az brn lthat, hogy az
llomny vagy knyvtr ki-
vlasztsakor a felhasznl
megnzheti, hogy milyen llo-
mnyok s knyvtrak tall-
hatk az egyes adathordozn,
adathordozkat illeszthet be
a knyvtrszerkezetbe s az
ikonok segtsgvel knnyen
felismerheti az egyes llom-
nyok tpust.
Az llomnynv ablak egy
gyorskeres o szolgltatssal is
fel van szerelve. Ha a felhasz-
nl elkezdi begpelni a kere-
sett llomnynevet, a bal ol-
dalon tallhat lista folyamatosan mutatja a tallatokat. Ennek a szol-
gltatsnak ksznhet oen a felhasznlnak nem kell vgigbngsznie a
listt, elegend o, ha a keresett nv els o nhny bet ujt begpeli.
sszessgben elmondhat, hogy az llomnynv-ablak igen fejlett s
knyelmes eszkzt biztost mind a programoz, mind pedig a felhasznl
szmra s mivel kevs olyan alkalmazs van, amelyik egyltaln nem
kezel llomnyokat, mindenkppen rdemes megismerkedni vele.
Az llomnynv ablak kezelsre hasznlhatk a kvetkez o fggvnyek.
GtkWidget
*
gtk_file_chooser_dialog_new(const gchar
gtk 2007/10/21 14:22 page 188 #188
188
*
cmsor, GtkWindow
*
szlo, GtkFileChooserAction
jelleg, const gchar
*
elso_gomb, GtkResponseType
elso_vlasz, ...);
A fggvny llomnynv-ablak ltrehozsra hasznlhat. A fgg-
vny a megadott rtkeknek megfelel oen ltrehoz s megjelent egy
j ablakot, amelyben a felhasznl llomny- vagy knyvtrnevek
kzl vlaszthat.
visszatrsi rtk A fggvny visszatrsi rtke az jo-
nan ltrehozott ablakot jelli a memriban. Ez az ab-
lak ugyanolyan mdon hasznlhat a gtk_dialog_run() s
a gtk_widget_destroy() fggvnyekkel, mint az zenet-
ablakok.
cmsor A szveg, amely az jonan ltrehozott ablak cmmezejben
fog megjelenni.
szlo Az jonan ltrehozott ablak szl oablaka, melynek szerepe s
hasznlata megegyezik az zenet-ablakoknl megismert szl o
ablak szerepvel s hasznlatval.
jelleg Megadja, hogy milyen jelleg u feladatot lsson el az
llomnynv-ablak. A jelleg meghatrozza, hogy milyen mdon
viselkedjen az j ablak, pldul azzal, hogy meghatrozza me-
lyik llomnyokat tudja kivlasztani a felhasznl. Itt a kvet-
kez o llandk kzl vlaszthatunk:
GTK_FILE_CHOOSER_ACTION_OPEN Az llomnynvre megnyi-
ts cljbl van szksge az alkalmazsnak, a felhasznl
teht a ltez o llomnyok kzl vlaszthat.
GTK_FILE_CHOOSER_ACTION_SAVE Az llomnynvre ments
cljbl van szksge az alkalmazsnak, a felhasznl te-
ht vlaszthat nem ltez o llomnyt is.
GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER Az alkalmazs-
nak knyvtrnvre van szksge.
GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER Az alkalmazs
knyvtrat szeretne ltrehozni, ezrt csak nem ltez o
llomnynevek vlaszthatk.
elso_gomb Az ablak aljra helyezend o els o nyomgomb azonos-
tja. A GTK+ alaprtelmezs szerint nem helyez nyomgom-
bokat az llomnynv-ablak aljra, ezrt legalbb egy nyom-
gombrl gondoskodnunk kell.
Itt igen sok fle azonostt megadhatunk, de a legfontosabbak
a kvetkez ok:
GTK_STOCK_APPLY Elfogad.
gtk 2007/10/21 14:22 page 189 #189
189
GTK_STOCK_CANCEL Mgsem.
GTK_STOCK_HELP Segtsg.
GTK_STOCK_NEW j.
GTK_STOCK_NO Nem.
GTK_STOCK_OK Ok.
GTK_STOCK_OPEN Megnyits.
GTK_STOCK_PRINT Nyomtats.
GTK_STOCK_REMOVE Trls.
GTK_STOCK_SAVE Ments.
GTK_STOCK_YES Igen.
A nyomgombok a felhasznl ltal belltott nyelven, a fel-
hasznl ltal belltott tmnak megfelel o ikonnal jelennek
meg.
elso_vlasz A nyomgombnak megfelel o vlasz, amely megadja,
hogy ha a felhasznl az adott nyomgombot lenyomja, a
gtk_dialog_run() milyen rtket adjon vissza.
Itt a kvetkez o rtkek kzl vlaszthatunk (hogy mit rtnk az
egyes llandkon, az viszont a beltsunkra van bzva, hiszen
a mi programunk fogja kirtkelni a vlaszt):
GTK_RESPONSE_OK Ok.
GTK_RESPONSE_CANCEL Mgsem.
GTK_RESPONSE_CLOSE Bezr.
GTK_RESPONSE_YES Igen.
GTK_RESPONSE_NO Nem.
GTK_RESPONSE_APPLY Elfogad.
GTK_RESPONSE_HELP Segtsg.
... A tovbbi helyeken tetsz oleges szm tovbbi nyomgombot s
vlaszt adhatunk meg. A nyomgombok az ablak als rszn
balrl jobbra haladva jelennek meg.
Fontos viszont, hogy az utols nyomgombjelents pros utn
egy NULL rtket kell megadnunk.
gboolean gtk_file_chooser_set_current_folder(GtkFileChooser
*
ablak, const gchar
*
knyvtrnv);
A fggvny segtsgvel bellthatjuk, hogy az llomnynv-ablak
melyik knyvtrat mutatja. A legtbb esetben a gtk_dialog_run()
hvsa el ott hasznljuk ezt a fggvnyt, ha meg akarunk bizonyo-
sodni arrl, hogy az ablak egy adott knyvtrat mutat indulskor.
visszatrsi rtk Ha sikerlt belltani a knyvtrat TRUE, ha
nem FALSE.
gtk 2007/10/21 14:22 page 190 #190
190
ablak Az lltani kvnt llomnynv-ablakot jelli a memriban.
knyvtrnv A knyvtr neve.
gchar
*
gtk_file_chooser_get_filename(GtkFileChooser
*
ablak);
A fggvny segtsgvel megtudhatjuk, hogy mi a teljes neve an-
nak a knyvtrnak vagy llomnynak, ami ppen ki van vlasztva.
Ezt a fggvnyt ltalban a gtk_dialog_run() fggvny utn hv-
juk, amikor a felhasznl mr kivlasztotta az llomnynevet s
lenyomta valamelyik nyomgombot.
ablak A lekrdezend o llomnynv-ablakot jelli a memriban.
visszatrsi rtk A kivlasztott llomny teljes elrsi tja
vagy NULL, ha a felhasznl nem jellt ki llomnynevet.
Ha a visszatrsi rtk nem NULL, akkor a g_free() fggvny
segtsgvel fel kell szabadtanunk, ha mr nincs szksgnk
r.
Az llomnynv-ablak mg sok ms hasznos eszkzt is tartalmaz.
Ezekr ol b ovebben a GTK+ programknyvtr dokumentcijban olvas-
hatunk.
A kvetkez o plda bemutatja hogyan kszthetnk s hasznlhatunk
egyszer uen llomnynv-ablakot.
32. plda. A kvetkez o programrszlet bemutatja hogyan jelenthetnk
meg llomnynv krsre hasznlhat ablakot s hogyan hasznlhatjuk
fel a felhasznl ltal vlasztott llomnynevet.
1 void
2 on_item_filename_activate(GtkMenuItem
*
menuitem,
3 gpointer user_data)
4 {
5 GtkWidget
*
window;
6 GtkWidget
*
dialog;
7 gchar
*
filename;
8
9 window = lookup_widget(GTK_WIDGET(menuitem),
10 "window2");
11 dialog = gtk_file_chooser_dialog_new("Ablak cme...",
12 GTK_WINDOW(window),
13 GTK_FILE_CHOOSER_ACTION_OPEN,
14 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
15 GTK_STOCK_OK, GTK_RESPONSE_OK,
16 NULL);
gtk 2007/10/21 14:22 page 191 #191
191
17
18 if (gtk_dialog_run(GTK_DIALOG(dialog)) ==
19 GTK_RESPONSE_OK){
20 filename = gtk_file_chooser_get_filename(
21 GTK_FILE_CHOOSER(dialog));
22 printf("A vlasztott llomny: %s\n", filename);
23 }else{
24 printf("Nincs vlasztott llomnynv.\n");
25 }
26
27 if (filename != NULL)
28 g_free (filename);
29
30 gtk_widget_destroy(dialog);
31 }
7.2.3. A bet utpus-ablak
Grakus alkalmazst ksztve szksgnk lehet olyan eszkzre, amely
lehet ov teszi a felhasznl szmra, hogy bet utpust vlasszon. A GTK+
knyvtr erre a clra egy knnyen kezelhet o, egyszer u ablakot, a be-
t utpus ablakot biztostja. Ez az ablak igen egyszer uen s knyelmesen
ltrehozhat a megfelel o fggvnyek hvsval.
7.5. bra. A bet utpus-ablak
A 7.5. bra a bet utpus-ablakot mu-
tatja be. Jl lthat, hogy a kezelse
egyszer u s knyelmes. Meggyelhet-
jk, hogy egy el onzeti kpen be is mu-
tatja, hogy az adott bet utpus milyen
rskpet ad a kperny on. Az el onzet-
ben lthat szveg szabadon vltoztat-
hat. Alaprtelmezs szerint ez a sz-
veg az rvzt ur o tkrfrgp, amely-
nek sok rtelme ugyan nincs, de tartal-
mazza a magyar nyelvre jellemz o keze-
tes karaktereket. Ezt a szveget a meg-
felel o fggvny segtsgvel tetsz oleges
szveges rtkre megvltoztathatjuk.
A bet utpus-ablak ltrehozshoz s
a hasznlathoz a kvetkez o fggv-
nyekre van szksgnk:
GtkWidget
*
gtk_font_selection_dialog_new(const gchar
*
cm);
gtk 2007/10/21 14:22 page 192 #192
192
A fggvny segtsgvel j, bet utpus kivlasztsra szolgl abla-
kot hozhatunk ltre. A fggvnynek paramterknt tadott cm a
ltrehozott ablak cmmezejben megjelen o szveget adja meg.
void gtk_font_selection_dialog_set_preview_text(GtkFont-
SelectionDialog
*
ablak, const gchar
*
szveg);
A fggvny segtsgvel a bettpus-ablakban a vlasztott bet u tu-
lajdonsgainak bemutatsra szolgl szveget llthatjuk be. A
fggvny els o paramtere az ablakot jelli, a msodik pedig a sz-
veget, ami az ablakban meg fog jelenni.
gchar
*
gtk_font_selection_dialog_get_font_name(GtkFont-
SelectionDialog
*
ablak);
A fggvny segtsgvel megllapthatjuk, hogy a felhasznl milyen
bettpust vlasztott. A fggvny paramtere a bettpus-ablakot
jelli a memriban, mg a visszatrsi rtke megadja a vlasztott
bettpus nevt.
A fggvny ltal visszaadott mutat egy memriaterletet jell a me-
mriban, amelyet neknk kell felszabadtanunk, ha mr nincs r
szksgnk.
33. plda. A kvetkez o pldaprogrambemutatja hogyan hozhatunk ltre
bet utpust kr o ablakot s hogyan hasznlhatjuk fel a felhasznl ltal
kivlasztott bettpus nevt.
1 void
2 on_new_font_window_activate(GtkMenuItem
*
menuitem,
3 gpointer user_data)
4 {
5 GtkWidget
*
dialog;
6 gchar
*
fontname;
7
8 dialog = gtk_font_selection_dialog_new("Bettpusok");
9 if (gtk_dialog_run (GTK_DIALOG (dialog)) !=
10 GTK_RESPONSE_OK){
11 gtk_widget_destroy(dialog);
12 return;
13 }
14
15 fontname = gtk_font_selection_dialog_get_font_name(
16 GTK_FONT_SELECTION_DIALOG(dialog));
17 printf("A vlasztott bettpus: %s\n", fontname);
18
19 g_free(fontname);
gtk 2007/10/21 14:22 page 193 #193
193
20 gtk_widget_destroy (dialog);
21 }
A knyvben nem trnk ki rszletesen arra, hogy hogyan hasznlhat-
juk a bet utpus vlaszt ablakban kivlasztott bet utpus nevt, de egy
pldaprogramon keresztl bemutatjuk hogyan llthatjuk be vele egy tet-
sz oleges kperny oelem alaprtelmezett bet utpust.
34. plda. A kvetkez o sorok egy visszahvott fggvnyt mutatnak be,
amely egy bet utpus-ablakban lehet osget ad a felhasznlnak arra,
hogy egy kperny oelem alaprtelmezett bet utpust megvltoztassa.
1 void
2 on_textview_window_button_font_clicked(
3 GtkButton
*
button,
4 gpointer user_data)
5 {
6 GtkWidget
*
text_view;
7 GtkWidget
*
dialog;
8 gchar
*
fontname;
9 PangoFontDescription
*
font_desc;
10
11 text_view = lookup_widget(GTK_WIDGET(button),
12 "textview");
13 /
*
14
*
A jelenlegi betutpus lekrdezse s a betutpus
15
*
vlaszt ablak ltrehozsa.
16
*
/
17 fontname = pango_font_description_to_string(
18 text_view->style->font_desc);
19 dialog = gtk_font_selection_dialog_new(
20 "Bet utpus kivlasztsa");
21 gtk_font_selection_dialog_set_font_name(
22 GTK_FONT_SELECTION_DIALOG(dialog), fontname);
23 g_free(fontname);
24
25 /
*
26
*
A betutpus vlaszt ablak megjelentse.
27
*
/
28 if (gtk_dialog_run(GTK_DIALOG(dialog)) !=
29 GTK_RESPONSE_OK){
30 gtk_widget_destroy(dialog);
31 return;
32 }
gtk 2007/10/21 14:22 page 194 #194
194
33
34 /
*
35
*
A kivlasztott betutpus rvnyestse.
36
*
/
37 fontname = gtk_font_selection_dialog_get_font_name(
38 GTK_FONT_SELECTION_DIALOG(dialog));
39 font_desc = pango_font_description_from_string(
40 fontname);
41 gtk_widget_modify_font(text_view, font_desc);
42
43 /
*
44
*
Az er oforrsok felszabadtsa.
45
*
/
46 g_free(fontname);
47 gtk_widget_destroy(dialog);
48 }
FIXME: ezt meg kell rni rszletesre, mert mshol nem mutatjuk be eze-
ket az eszkzket...
7.2.4. A sznvlaszt-ablak
Szintn igen egyszer uen ltrehozhat s nagyon hasznos a sznvlaszt-
ablak, amely a 7.6. brn lthat.
7.6. bra. A sznvlaszt-ablak
Az ablakban tallhat szn-
hromszg segtsgvel tetsz o-
leges sznt kivlaszhatunk. A
hromszget krbeforgathatjuk
a kerk segtsgvel s a h-
romszg brmely pontjra kat-
tintva kivlaszthatunk egy tet-
sz oleges sznt. Az oldalt lthat
szn neve mez obe sznek angol
neveit vagy a hrom alapszn
kdjt rhatjuk. (Sznek neveit
GNU/Linux rendszereken a sz-
nadatbzis tartalmazza, ame-
lyet ltalban az rgb.txt l-
lomnyban tallunk a grakus
kiszolgl valamelyik knyvt-
rban.)
Roppant hasznos eszkz a kp als rszn lthat, pipettt formz
ikon, amelynek segtsgvel a kperny o brmely pontjnak sznt be-
llthatjuk a sznhromszgn. Az ikonra kattintva egy pipetta alak
gtk 2007/10/21 14:22 page 195 #195
195
egrkurzort kapunk, amelyek brmely alkalmazs brmely pontjra kat-
tintva elmenthetjk annak sznt. Ha valamelyik program vagy kp szne
megtetszik azt azonnal be is llthatjuk a sajt alkalmazsunk rszre.
A GTK+ programknyvtr a sznek kezelsre a GdkColor tpust hasz-
nlja, amelyet a GDK programknyvtr valst meg. A GdkColor tpust
szmtalan fggvny hvsakor hasznlhatjuk a sznek kezelsre, az egy-
szer u kperny oelemek esetben azonban ltalban nincs szksgnk a
sznek hasznlatra.
A sznvlaszt ablak kezelst kiss komplikltt teszi a hasznlt sok-
fle tpus. A sznvlaszt ablak ltrehozsakor egy GtkWidget tpust ka-
punk, amely valjban egy prbeszdablak cme a memriban. A prbe-
szdablak tpusa tulajdonkppen GtkColorSelectionDialog, ami ren-
delkezik egy colorsel nev u, GtkColorSelection mez ovel. Ezt a mez ot
tudjuk a sznvlaszt ablak kezelsre hasznlni. A fggvnyek utn be-
mutatott pldaprogram remlhet oleg rthet obb teszi ezt a tpuskavalk-
dot.
A sznvlaszt-ablak ltrehozsakor s hasznlatakor a kvetkez o fgg-
vnyek a legfontosabbak:
gint gdk_color_parse(const gchar
*
spec, GdkColor
*
szn); A
fggvny segtsgvel a grakus felhasznli fellet nyilvntarts-
bl kereshetnk ki neve alapjn egy sznt. A fggvny kikeresi a
sznt s a GdkColor tpus adatszerkezetet a megfelel oen kitltve
elrhet ov teszi a szmunkra. A GdkColor adatszerkezet rendelke-
zik hrom uint16 (el ojel nlkli 16 bites egsz) mez ovel red, green
s blue nven, amelyek rendre a vrs, zld s kk sznkomponen-
seket hordozzk.
A fggvny els o paramtere a szn neve, amelyet a sznadatbzisban
keresnk.
A fggvny msodik paramtere azt a memriaterletet jellik,
ahov a kikeresett sznt gpi formban elhelyezi a fggvny. A
gdk_color_parse() erre a memriaterletre r, a mutatnak teht
egy GdkColor tpus adatszerkezet hordozsra alkalmas mem-
riaterletet kell jellnie.
A fggvny visszatrsi rtke igaz, ha a sznt sikeresen megtallta
az adatbzisban, illetve hamis, ha a szn nem tallhat.
GtkWidget
*
gtk_color_selection_dialog_new(const gchar
*
cm); A fggvny segtsgvel j sznvlaszt ablakot hozha-
tunk ltre. A fggvnynek tadott paramter a sznvlaszt ablak
cmsorban megjelen o szveget hatrozza meg.
void gtk_color_selection_set_has_opacity_control(GtkCo-
lorSelection
*
vlaszt, gboolean tltszsg); A fgg-
vny segtsgvel bellthatjuk, hogy a sznvlaszt ablakban
gtk 2007/10/21 14:22 page 196 #196
196
jelenjen-e meg az tltszsg belltsra szolgl eszkz. A
fggvny els o paramtere a sznvlaszt ablak sznvlaszt rsze
(colorsel komponense), a msodik paramtere pedig egy logikai
rtk, amely meghatrozza, hogy megjelenjen-e az tltszsg az
ablakban.
void gtk_color_selection_set_current_color(GtkColorSe-
lection
*
vlaszt, const GdkColor
*
szn); A fggvny
segtsgvel bellthatjuk a sznvlaszt ablakban lthat sznt. A
fggvny els o paramtere a sznvlaszt ablak sznvlaszt rsze
(colorsel komponense), msodik paramtere pedig a megjelen-
tend o sznt jelli a memriban.
void gtk_color_selection_set_current_alpha(GtkColorSelec-
tion
*
vlaszt, guint16 alpha); A fggvny segtsgvel
bellthatjuk a sznvlaszt ablakban megjelen o tltszsgot
(valjban tltszatlansgot).
A fggvny els o paramtere a sznvlaszt ablak sznvlaszt rsze
(colorsel komponense), msodik paramtere pedig az tltszs-
got jell o szm. Ez utbbi 0 (teljesen tltsz) s 65535 (teljesen t-
ltszatlan) rtk kzti egsz szm lehet.
void gtk_color_selection_get_current_color(GtkColorSelec-
tion
*
vlaszt, GdkColor
*
szn); A fggvny segtsgvel a
sznvlaszt ablakban belltott sznt krdezhetjk le. A fggvny
els o paramtere a sznvlaszt ablak sznvlaszt rsze, a msodik
paramtere pedig azt a memriaterletet jelli a memriban,
ahova a fggvny a belltott sznt el fogja helyezni.
guint16 gtk_color_selection_get_current_alpha(GtkColorSe-
lection
*
vlaszt); A fggvny segtsgvel lekrdezhetjk a
sznvlaszt ablakban belltott tltszsgot. A fggvny param-
tere a sznvlaszt ablak sznvlaszt rsze, a visszatrsi rtke
pedig a belltott tltszsg-rtk.
A sznvlaszt ablak ltrehozst, belltst s a felhasznl ltal be-
lltott rtkek lekrdezst mutatja be a kvetkez o pldaprogram.
35. plda. A kvetkez o programrszlet szn s tltszsgrtk bellt-
sra alkalmas ablakot helyez el a kperny on, majd a felhasznl ltal
belltott rtkeket kirja a szabvnyos kimenetre. A program az ablakot
kezdetben teljesen tltszatlan zld sznre lltja. A zld szn a grakus
felhasznli fellet adatbzisbl szrmazik.
1 void
2 on_new_color_window_activate(GtkMenuItem
*
menuitem,
gtk 2007/10/21 14:22 page 197 #197
197
3 gpointer user_data)
4 {
5 GtkWidget
*
dialog;
6 GdkColor color;
7 GtkColorSelectionDialog
*
color_sel_dialog;
8 guint16 alpha;
9
10 /
*
11
*
Kikeressk a zld sznt (biztosan megtallhat).
12
*
/
13 gdk_color_parse("Green", &color);
14
15 /
*
16
*
Ltrehozzuk a prbeszdablakot s az egyszerubb
17
*
hasznlat rdekben kt klnbz o tpus
18
*
vltozban is elhelyezzk a mutatjt.
19
*
/
20 dialog = gtk_color_selection_dialog_new("Sznek");
21 color_sel_dialog = GTK_COLOR_SELECTION_DIALOG(dialog);
22
23 /
*
24
*
A prbeszdablak alapbelltsa.
25
*
/
26 gtk_color_selection_set_has_opacity_control(
27 GTK_COLOR_SELECTION(color_sel_dialog->colorsel),
28 TRUE);
29 gtk_color_selection_set_current_color(
30 GTK_COLOR_SELECTION(color_sel_dialog->colorsel),
31 &color);
32 gtk_color_selection_set_current_alpha(
33 GTK_COLOR_SELECTION(color_sel_dialog->colorsel),
34 65535);
35
36 /
*
37
*
Ha a felhasznl az OK gombot nyomta meg kirjuk a
38
*
belltott rtkeket, ha nem, egyszeruen
39
*
eltntetjk az ablakot.
40
*
/
41 if (gtk_dialog_run(GTK_DIALOG(dialog)) ==
42 GTK_RESPONSE_OK){
43 gtk_color_selection_get_current_color(
44 GTK_COLOR_SELECTION(color_sel_dialog->colorsel),
45 &color);
46 alpha = gtk_color_selection_get_current_alpha(
gtk 2007/10/21 14:22 page 198 #198
198
47 GTK_COLOR_SELECTION(
48 color_sel_dialog->colorsel));
49 printf("A szn: \n"
50 " vrs = %u\n"
51 " zld = %u\n"
52 " kk = %u\n"
53 "tltszsg: %u\n",
54 color.red,
55 color.green,
56 color.blue,
57 alpha);
58 }
59 gtk_widget_destroy(dialog);
60 }
A program knnyen megrthet o, ha gyelmesen ttanulmnyozzuk s
meggyeljk a fggvnyben tallhat vltozk tpust.
Nem trgyaljuk rszletesen, hogy hogyan lehet belltani az egyes kp-
erny oelemek szneit, de a kvetkez o pldban bemutatunk egy fgg-
vnyt, amely kzvetlenl mdostja egy kperny oelem megjelenst a
httrszn belltsval.
36. plda. A kvetkez o fggvny megjelent egy sznvlaszt-ablakot, be-
lltja az ablakban a szvegszerkeszt o kperny oelem htternek sznt s
megvltoztatja a szvegszerkeszt o htternek sznt, ha a felhasznl j
sznt vlaszt ki.
1 void
2 on_textview_window_button_color_clicked(
3 GtkButton
*
button,
4 gpointer user_data)
5 {
6 GtkWidget
*
text_view;
7 GtkWidget
*
dialog;
8 GdkColor color;
9 GtkColorSelectionDialog
*
color_sel_dialog;
10
11 text_view = lookup_widget(GTK_WIDGET (button),
12 "textview");
13 dialog = gtk_color_selection_dialog_new("Httrszn");
14 color_sel_dialog = GTK_COLOR_SELECTION_DIALOG(dialog);
15
16 /
*
17
*
A prbeszdablak alapbelltsa.
gtk 2007/10/21 14:22 page 199 #199
199
18
*
/
19 gtk_color_selection_set_current_color(
20 GTK_COLOR_SELECTION(color_sel_dialog->colorsel),
21 &text_view->style->base[0]);
22
23 /
*
24
*
A dialgusablak futtatsa s a szn belltsa.
25
*
/
26 if (gtk_dialog_run(GTK_DIALOG(dialog)) ==
27 GTK_RESPONSE_OK){
28 gtk_color_selection_get_current_color(
29 GTK_COLOR_SELECTION(color_sel_dialog->colorsel),
30 &color);
31 // El otr s httrsznek.
32 //gtk_widget_modify_fg(text_view, GTK_STATE_NORMAL,
33 // &color);
34 //gtk_widget_modify_bg(text_view, GTK_STATE_NORMAL,
35 // &color);
36 // Szveg karaktereinek szne.
37 //gtk_widget_modify_text(text_view,
38 // GTK_STATE_NORMAL, &color);
39
40 // A szveg htternek szne.
41 gtk_widget_modify_base(text_view, GTK_STATE_NORMAL,
42 &color);
43 }
44 gtk_widget_destroy(dialog);
45 }
gtk 2007/10/21 14:22 page 200 #200
200
gtk 2007/10/21 14:22 page 201 #201
8. fejezet
sszetett kperny oelemek
Ebben a fejezetekben azokrl a kperny oelemekr ol lesz sz, amelyek fel-
ptskben vagy hasznlatukban sszetettek, bonyolultak. Az ilyen kp-
erny oelemeket nem egyszer bonyolult fggvnyek, sszetett programok
kezelik, ezrt az ilyen kperny oelemek nem egyszer komoly programozi
tudst tesznek szksgess.
8.1. Az alkalmazs-ablak
Ha a Glade segtsgvel GNOME alkalmazst ksztnk, a paletta ab-
lakbl vlaszthatjuk a gnome alkalmazs ablak eszkzt, amely sszett,
tbb kperny oelemet tartalmaz ablak ltrehozsra hasznlhat. Ezt az
ablaktpust mutatja be a 8.1. bra.
A GNOME alkalmazs ablak fels o rszben egy mensor foglal helyet.
Ebben a mensorban a Glade a szoksos mdon menket s menpon-
tokat helyez, de a ltrehozs utn lehet osgnk nylik a men mdost-
sra is. Ehhez ki kell jellnnk a mensvot, majd a tulajdonsgok ab-
lakban a menk szerkesztse nyomgombra kell kattintanunk. A menk
szerkesztsr ol b ovebben az 52. oldalon tallhat 3.1.10. szakaszban ol-
vashattunk.
8.1.1. Az elmozdthat eszkzsv
A mensor alatt egy eszkzsvot ltunk. A Glade az alkalmazs-ablak
eszkzsvjban a szoksos elemeket elhelyezi, de brmelyik nyomgom-
bot trlhetjk s j nyomgombokat is ltrehozhatunk. Az eszkzsvon
bell hasznlatos nyomgombokbl tbbfle is a rendelkezsnkre ll.
Egyszer u nyomgombok, kapcsol jelleg u bennmarad nyomgombok
201
gtk 2007/10/21 14:22 page 202 #202
202
s rdigomb jelleg u nyomgombok is elrhet ok kln, az eszkzsv sz-
mra. A paletta ablakban mg elvlaszt elemeket is tallunk, amelyek
az eszkzsv nyomgombjainak csoportostsra hasznlhatk. Az esz-
kzsv a megfelel o mdon elhelyezve elmozdthat, az alkalmazs
terletn bell vzszintesen s fgg olegesen is megjelenhet, ezrt elmoz-
dthat eszkzsvrl beszlhetnk.
8.1. bra. A GNOME alkal-
mazs ablak
A GTK programknyvtr az eszkzsv kezelsre
a GtkToolbar tpust biztostja a programoz sz-
mra. A GtkToolbar meglehet osen egyszer u kp-
erny oelem, a programoznak nem sok munkt je-
lent a hasznlata. ltalban elegend o, ha az eszkz-
sv belltsait a Glade tulajdonsgok ablakban
a program megrsakor elvgezzk, a programunk-
ban pedig kizrlag az eszkzsvban tallhat nyo-
mgombok visszahvott fggvnyeivel foglalkozunk.
A Glade tulajdonsgok ablakban az eszkzsv
belltsai kzl fellr ol az els o emltsre mlt a
keret szlessge mez o, ahol bellthatjuk, hogy az
eszkzsv krl hny kppontnyi res helyet aka-
runk kihagyni. Ennek a mez onek az alaprtelmezett
rtke 0, ami tulajdonkppen meg is felel a legtbb
alkalmazs szmra. Ms dobozok krl szoks n-
hny kppontnyi helyet kihagyni, az eszkzsv ese-
tben azonban ez a szegly nem volna eszttikus. A
kvetkez o fontos tulajdonsg a mret, ami meghatrozza, hogy az esz-
kzsvban hny kperny oelemnek tartunk fel helyet. Ez a tulajdonsg is
hasonlkppen llthat az sszes doboz jelleg u kperny oelem esetben,
a klnbsg taln csak annyi, hogy az eszkzsv esetben ezt a tulaj-
donsgot rendszeresen vltoztatjuk is, hiszen ltalban elg sokig tart,
amg a programoz eldnti, hogy mit is akar elhelyezni az eszkzsv-
ban. Szerencsre a Glade elg rugalmasan kezeli az eszkzsv mrett,
a benne megjelen o elemek sorrendjt pedig knnyedn megvltoztathat-
juk a vglap segtsgvel, amelyet a Glade szerkeszt oablakban a jobb
egrgombbal rhetnk el.
A tulajdonsgok ablak kvetkez o mez oje az elhelyezkeds feliratot vi-
seli. Itt bellthatjuk, hogy az eszkzsv vzszintesen vagy fgg olegesen
jelenjen-e meg a kperny on. A legtbb esetben a vzszintes megjelenst
vlasztjuk, amit aztn a felhasznl a program futsa kzben megvltoz-
tathat. A stlus mez oben bellthatjuk, hogy az eszkzsv nyomgomb-
jai hogyan jelenjenek meg. Vlaszthatjuk az ikonszer u s a szvegszer u
megjelenst, valamint, ha az utbbit vlasztva meghatrozhatjuk, hogy
a nyomgombok cmki az ikonok mellett, vagy az ikonok alatt jelenjen-e
meg. A nyomgombok megjelenst szintn megvltoztathatja a felhasz-
nl, a program hasznlata sorn.
gtk 2007/10/21 14:22 page 203 #203
203
A segdszveg kapcsol segtsgvel bellthatjuk, hogy a nyom-
gombokhoz tartoz segdszvegek kzismert nevkn a tippek
megjelenjenek-e az eszkzsvban. Ezt a kapcsolt ltalban bekapcsolva
tartjuk, hiszen a segdszvegek kikapcsolsa nem sok el onnyel kecseg-
tet.
A nyl megjelentse (show arrow) kapcsolval meghatrozhatjuk, hogy
mi trtnjk, ha az eszkzsv nem fr el az alkalmazs ablakban. Ha
a nyl megjelentse menpontot kivlasztjuk, a csonkolt eszkzsv jobb
szln egy nyl alak szimblum jelenik meg, amelynek segtsgvel a fel-
hasznl az ppen nem lthat nyomgombok funkciit is elrheti. Nyil-
vnval, hogy ezt a szolgltatst sem rdemes kikapcsolnunk, ha csak
valamilyen klnleges clunk nincs ezzel.
Az eszkzsvban ltalban nyomgombokat helyeznk el. A GTK+
programknyvtr klnfle, kimondottan az eszkzsv szmra ksztett
nyomgombokat biztost erre a clra. Termszetesen tehetnk egyszer u
nyomgombokat is az eszkzsvba, de nhny tulajdonsguk miatt az
eszkzsvba sznt nyomgombtpusok knyelmesebbek.
Az eszkzsv szmra ksztett egyszer u nyomgomb tpusa a
GtkToolButton, ami leginkbb a GtkButton tpus egyszer u nyo-
mgombra hasonlt. A kapcsolgomb eszkzsvba sznt vltozata a
GtkToggleToolButton, ami a GtkToolButton leszrmazottja, attl csak
abban klnbzik, hogy ha lenyomjuk bennmarad. J plda az eszkz-
sv kapcsolgombjnak alkalmazsra a klnfle kiadvnyszerkeszt o
programok eszkzsvjainak alhzott, d olt s flkvr nyomgombjai,
amelyek a szveg bet uvltozatnak belltsra hasznlhatk.
Az eszkzsv szmra tervezett rdigomb, a GtkRadioToolButton
ami a GtkToggleToolButton leszrmazottjaknt, attl csak abban k-
lnbzik, hogy az egyazon csoportba tartoz rdigombok egymst ki-
kapcsoljk. J plda az alkalmazsukra a kiadvnyszerkeszt o program
jobbra, balra s kzpre rendez o nyomgombjai.
Ritkbban hasznlatos, de azrt hasznos a menk megjelentsre is
hasznlhat GtkMenuToolButton, amit a 8.2. brn lthatunk. Az ilyen
nyomgombok mellett egy nyl is megjelenik, amit a felhasznl arra
hasznlhat, hogy egy ment jelentsen meg. A GtkMenuToolButton a
GtkToolButton leszrmazottja, s gy a szoksos mdon is hasznlhat,
ha nem a nylra, hanem magra a nyomgombra kattintunk.
Az eszkzsv elemeinek csoportostsra szolgl hasznlhat a
GtkSeparatorToolItem, amit a 8.2. bra kt nyomgombja kzt is meg-
gyelhetnk. Az ilyen elvlasztelemek segtsgvel az eszkzsv elemet
jobbra rendezhetjk, ha magnak az elvlaszt elemnek a rajzolst ki-
kapcsoljuk, a nyjtst viszont engedlyezzk.
A Glade tulajdonsgok ablakban az eszkzsv nyomgombjainak min-
den tpusnl bellthatjuk a sablon gomb mez oben, hogy a nyomgomb
melyik el ore elksztett sablon alapjn kszljn el. Ez a mez o a szoksos
gtk 2007/10/21 14:22 page 204 #204
204
mdon hatrozza meg a nyomgombbon bell megjelen o ikon formjt
s a nyomgomb cmkjt, gyelembe vve a belltott stlust s nyelvet.
8.2. bra. A men-gomb
Ha nem lltjuk be a nyomgomb sablont,
akkor cmke s az ikon mez okben be kell l-
ltanunk a nyomgombban megjelen o szve-
get, illetve kpet. Fontos tudnunk, hogy esetleg
akkor is rdemes belltanunk mind az ikon,
mind pedig a cmke mez ok rtkt, ha a Glade
szerkeszt oablakban valamelyik nem jelenne
meg, hiszen az alkalmazs futtatsa kzben az
eszkzsv megjelense esetleg megvltozhat.
Az eszkzsv nyomgombjainak tulajdons-
gai kzt bellthatjuk, hogy az adott nyom-
gomb fontos-e. Ha a nyomgomb fontos s a
felhasznl belltsai alapjn a nyomgom-
bok ikonjai alatt vagy mellett meg kell jelen-
teni a cmkket is, akkor a GTK+ programknyvtr a cmkket is elhelyezi
a nyomgombon bell. gy is mondhatnnk, hogy a cmkk kizrlag
csak a fontos nyomgombokban jelennek meg.
Szintn az eszkztr sszes nyomgombja rendelkezik a vzszintesen
megjelenik s a fgg olegesen megjelenik tulajdonsgokkal, amelyeket ki-
s bekapcsolva meghatrozzuk, hogy a nyomgomb megjelenjen-e ami-
kor az eszkzsv vzszintes, illetve fgg oleges helyzetben van.
Az eszkzsv nyomgomjai kzl a kapcsolgombok s a rdigombok
esetben is megtallhat az alaprtelmezs szerint benyomva, ami meg-
hatrozza, hogy a nyomgomb kezdetben lenyomva jelenjen-e meg.
A rdigombok esetben megjelenik egy j s meglehet osen fontos tu-
lajdonsg, amelyet a tulajdonsgok ablak csoport mez ojben adhatunk
meg. A csoport mez obe rt nv segtsgvel meghatrozhatjuk, hogy me-
lyek azok a rdigombok, amelyek kikapcsoljk egymst. Az egy cso-
portba tartoz rdigombok kzl mindig csak egy lehet bekapcsolva.
Az eszkzsv nyomgombjai ugyanazokat az zeneteket kldik, mint
amelyeket az egyszer u nyomgombok esetben megszoktunk. Ezek kzl
a legfontosabbak a kvetkez ok:
clicked Ezt az zenetet az eszkzsv minden nyomgombja kpes kl-
deni, amikor a felhasznl a nyomgombot aktivlta a billenty uzet-
tel vagy az egrrel.
toggled A kapcsolgombok s a rdigombok kldik ezt az zenetet,
amikor a felhasznl tkapcsolta oket. rdemes megemltennk,
hogy a rdigombok akkor is kldik ezt az zenetet, ha a felhasz-
nl a csoport egy msik rdigombjval kikapcsolja oket, azaz ami-
kor a felhasznl egy rdigombra kattintva tkapcsolja annak l-
lapott, akkor kt rdigomb is kldi a toggled zenetet.
gtk 2007/10/21 14:22 page 205 #205
205
show_menu A menvel elltott nyomgomb kldi ezt az zenetet, ami-
kor a felhasznl a mellette tallhat nylra kattintva megjelenti a
nyomgombhoz tartoz ment.
Az eszkzsv nyomgombjai rdekes mdon nem a GtkButton leszr-
mazottai, gy hasonltanak ugyan a szoksos nyomgombokra, de a nyo-
mgombok kezelsre szolgl fggvnyek nem hasznlhatk az esetk-
ben. Az eszkzsv fggvnyeinek kezelsre a kvetkez o fontosabb fgg-
vnyeket hasznlhatjuk.
void gtk_tool_button_set_label(GtkToolButton
*
nyomgomb,
const gchar
*
cmke); A fggvny segtsgvel a nyomgombban
megjelen o cmke szvegt megvltoztathatjuk. Ha a fggvny m-
sodik paramternek rtke NULL, a GTK+ programknyvtr nem
jelent meg cmkt a nyomgombbon bell.
void gtk_tool_button_set_icon_widget(GtkToolButton
*
nyomgomb, GtkWidget
*
ikon); A fggvny segtsgvel
megvltoztathatjuk a nyomgombon bell megjelen o ikont. A
nyomgombban ikonknt a msodik paramter ltal kijellt kper-
ny oelem jelenik meg. A kpek ltrehozsrl a 37. oldalon kezd od o
3.1.2. szakaszban olvashatunk rszletesebben.
void gtk_toggle_tool_button_set_active(GtkToggleToolButton
*
nyomgomb, gboolean lenyomva); A fggvny segtsgvel be-
llthatjuk, hogy az eszkzsvban megjelen o kapcsolgombok s
rdigombok be legyenek-e nyomva. Ha a msodik paramter r-
tke TRUE, a nyomgomb bekapcsolt, ha viszont FALSE, kikapcsolt
llapotba kerl.
gboolean gtk_toggle_tool_button_get_active(GtkToggleToolButton
*
nyomgomb); A fggvny segtsgvel lekrdezhetjk, hogy az esz-
kzsvban tallhat kapcsol- illetve rdigombok benyomott
llapotban vannak-e. A fggvny visszatrsi rtke TRUE, ha a
nyomgomb benyomott llapotban van, FALSE, ha nem.
void gtk_menu_tool_button_set_menu(GtkMenuToolButton
*
nyomgomb, GtkWidget
*
men); A fggvny segtsgvel a
menvel szerelt nyomgombhoz rendelhetjk hozz a ment.
A kvetkez o plda bemutatja a menvel felszerelt nyomgomb haszn-
latt.
37. plda. A kvetkez o sorok bemutatjk hogyan rendelhetnk ment
az eszkzsv nyomgombjhoz.
gtk 2007/10/21 14:22 page 206 #206
206
1 void
2 on_menutoolbutton1_realize(
3 GtkWidget
*
widget,
4 gpointer user_data)
5 {
6 GtkWidget
*
menu;
7 menu = create_popup_menu1();
8 gtk_menu_tool_button_set_menu(
9 GTK_MENU_TOOL_BUTTON(widget),
10 menu);
11 }
A pldaprogramban lthat fggvnyt a GTK+ programknyvtr akkor
hvja, amikor a menvel szerelt nyomgombot ltrehozta. A fggvny a
7. sorban hvja a Glade ltal ltrehozott fggvnyt, hogy ltrehozza a
felbukkan ment, amelyet a Glade menszerkeszt ojben ksztettnk.
A program ezek utn a 810. sorokban a nyomgombhoz rendeli a fel-
bukkan ment, ami ezutn automatikusan megjelenik, ha a felhasznl
a nyomgomb melletti nylra kattint.
8.3. bra. j dokk szalag ltrehozsa
Az elmozdthat eszkzsvok ksz-
tshez a Glade a Bonobo prog-
ramknyvtr ltal ltrehozott s ke-
zelt BonoboDock tpust hasznlja.
A BonoboDock doboz jelleg u kp-
erny oelem, ami tbb elmozdthat
BonoboDockItem kperny oelem hor-
dozsra alkalmas. Ha gyelmesen
megvizsgljuk a Glade ltal ltreho-
zott alkalmazs-ablak felptst, ak-
kor lthatjuk, hogy az eszkzsv azrt
mozdthat el, mert egy mozgathat
BonoboDockItem kperny oelemen be-
ll van.
Ha az alkalmazsunk szmra j el-
mozdthat eszkzsvot akarunk ltre-
hozni, akkor a Glade widget fa ablak-
ban ki kell vlasztanunk a BonoboDock elemet s az egr jobb gombjval
megjelentett felbukkan men segtsgvel j BonoboDockItem kper-
ny oelemet kell ltrehoznunk. Az j kperny oelemben ezutn a szoksos
mdon helyezhetnk el egy j eszkzsvot (GtkMenuBar), az eszkzsvon
bell pedig a nyomgombokat.
El ofordulhat, hogy az elmozdthat eszkzsvot ideiglenesen el akarjuk
gtk 2007/10/21 14:22 page 207 #207
207
rejteni. Ekkor nem magt az eszkzsvot kell elrejtennk hiszen ak-
kor az res szalag megmarad a kperny on hanem a BonoboDockItem
kperny oelemet. Ezt mutatja be a kvetkez o pldaprogram.
38. plda. A kvetkez o pldaprogram bemutatja hogyan rejthetjk el az
elmozdthat eszkzsvot.
1 void
2 on_show_software_project_toolbar_activate(
3 GtkMenuItem
*
menuitem,
4 gpointer user_data)
5 {
6 GtkWidget
*
toolbar;
7 GtkCheckMenuItem
*
item;
8 gboolean visible;
9
10 item = GTK_CHECK_MENU_ITEM(menuitem);
11 visible = gtk_check_menu_item_get_active(item);
12 toolbar = lookup_widget(GTK_WIDGET(menuitem), "bar");
13
14 if (visible)
15 gtk_widget_show(toolbar->parent);
16 else
17 gtk_widget_hide(toolbar->parent);
18 }
A fggvny egy kapcsolt tartalmaz menpont zenetkezel o fggvnye,
amelyet a GTK+ programknyvtr akkor hv, ha a felhasznl aktivlta a
menpontot.
A fggvny a 1011. sorokban lekrdezi, hogy a menpont bekapcsolt,
vagy kikapcsolt llapotban van-e, majd a 12. sorban kiderti az eszkzsv
memriabeli cmt.
A fggvny ezek utn a menpont llapottl fgg oen megjelenti vagy
elrejti az eszkzsv kperny oelem kperny obeli szl ojt, azt a kperny o-
elemet, amely az eszkzsvot magba foglalja. Figyeljk meg a 15. s
17. sorokban, ahogyan a GtkWidget adatszerkezetben tallhat parent
mez o segtsgvel megjelentjk, illetve elrejtjk a szl o kperny oelemet!
8.1.2. A f o kperny oelem
Az eszkzsv alatt egy res terlet tallhat. Itt helyezhetjk el azokat
a kperny oelemeket, amelyeket ebben a f oablakban kvnunk megjele-
nteni. Ha pldul szvegszerkeszt o programot akarunk csinlni, akkor
egy szvegszerkeszt o kperny oelemet helyezhetnk el itt, ha valamilyen
gtk 2007/10/21 14:22 page 208 #208
208
egyszer u alkalmazst terveznk, akkor pedig nhny egyszer u kper-
ny oelemb ol kszthetnk sszetett grakus felhasznli felletet ezen a
helyen.
8.1.3. Az llapotsor
A f o kperny oelem alatt az alkalmazs-ablakban egy llapotsor tallhat.
Az llapotsorban egy folyamatjelz o s egy zenetsv van egyms mel-
lett. A folyamatjelz oben jelezhetjk a hosszabb adatfeldolgozs llst,
az zenetsvban pedig szveges zeneteket jelenthetnk meg a felhasz-
nl tjkoztatsra.
A GNOME programknyvtr a GnomeAppBar tpust biztostja az alkal-
mazsok als sorban megjelen o llapotsor kezelsre. Az llapotsor-
ban egy folyamatjelz o s egy szveges zenetsv tallhat egyms mellet,
amelyeket egyszer u eszkzkkel kezelhetnk.
39. plda. A kvetkez o pldaprogram az llapotsorban tallhat folya-
matjelz o hasznlatt mutatja be.
1 void
2 on_progress_activate(GtkMenuItem
*
menuitem,
3 gpointer user_data)
4 {
5 GtkWidget
*
appbar;
6 gfloat p;
7
8 appbar = lookup_widget(GTK_WIDGET(menuitem), "bar");
9 for (p = 0; p <= 1.0; p += 0.01){
10 gnome_appbar_set_progress_percentage(
11 GNOME_APPBAR(appbar), p);
12 gtk_main_iteration();
13 usleep (10000);
14 }
15 }
A program a 1011. sorban belltja a folyamatjelz o ltal mutatott r-
tket, azonban ahhoz, hogy az j rtk meg is jelenjen a kperny on, a
programnak vissza kell adnia a vezrlst, hogy a GTK+ programknyv-
tr jrarajzolhassa a kperny ot. Ezt a gtk_main_iteration() fggvny
hvsval rjuk el, amely feldolgozza a GTK+ szmra sszegy ult zene-
teket, elvgzi a felgylemlett feladatokat, majd visszaadja a vezrlst.
40. plda. Az zenetsvban megjelen o szveges zeneteket veremsze-
r uen tudjuk elhelyezni s eltvoltani. A kvetkez o kt fggvny bemu-
gtk 2007/10/21 14:22 page 209 #209
209
tatja hogyan tudunk egy zenetet megjelenteni s a legutbbi zenetet
eltvoltani.
1 /
*
2
*
Az llapotsorban j zenetet megjelent o fggvny.
3
*
/
4 void
5 on_appbar_message_activate(GtkMenuItem
*
menuitem,
6 gpointer user_data)
7 {
8 GtkWidget
*
appbar;
9 static gint n = 1;
10 gchar
*
message;
11
12 appbar = lookup_widget(GTK_WIDGET(menuitem), "bar");
13 message = g_strdup_printf("Az %d. zenet...", n);
14 gnome_appbar_push(GNOME_APPBAR(appbar), message);
15 g_free(message);
16 n++;
17 }
18
19 /
*
20
*
Az llapotsor legutbbi zenett eltvolt fggvny.
21
*
/
22 void
23 on_appbar_message_remove_activate(GtkMenuItem
*
menuitem,
24 gpointer user_data)
25 {
26 GtkWidget
*
appbar;
27
28 appbar = lookup_widget(GTK_WIDGET(menuitem), "bar");
29 gnome_appbar_pop(GNOME_APPBAR(appbar));
30 }
A pldaprogram magtl rtet od o mdon hasznlja a GNOME kt fgg-
vnyt a szveg megjelentsre s eltvoltsra a program 14., illetve
29. soraiban.
8.2. A szvegszerkeszt o
A szvegszerkeszt o tbbsoros szvegek, nagyobb llomnyok szerkeszt-
sre hasznlhat kperny oelem, amely igen nagy mret u szveg kezel-
sre is alkalmas, fejlett felhasznli fellettel rendelkez o kperny oelem. A
gtk 2007/10/21 14:22 page 210 #210
210
GTK+ programknyvtrban a szvegszerkeszt o kperny oelem kezelsre
a GtkTextView tpus szolgl. A szvegszerkeszt o kperny oelem megle-
het osen sszetett eszkz. A kezelsre hasznlt fggvnyeket, tpusokat,
a tulajdonsgait s szolgltatsait egy-egy feladatcsoportra koncentrlva
tbb rszletben trgyaljuk.
A szvegszerkeszt oben megjelen o szveg trolsra a szvegmemria,
ms nven szvegpuffer hasznlhat. Minden szvegszerkeszt ohz tarto-
zik egy szvegmemria, de egy szvegmemrihoz tbb szvegszerkeszt o
is tartozhat. Ez utbbi esetben a szveg a kperny o tbb helyn is fel-
t unhet, a felhasznl ugyanazt a szveget tbb szvegszerkeszt oben is
szerkesztheti. A GTK+ programknyvtrban a szvegmemria kezelsre
a GtkTextBuffer tpust hasznlhatjuk.
8.4. bra. A cetlik hasznlata
A szvegmemria kezelsre sokszor
hasznljuk a szvegbejrt, amely a sz-
veg egy adott pontjnak kijellsre hasz-
nlhat a szvegmemriban. A szveg-
bejr segtsgvel bejrhatjuk a teljes
szveget, ami a szvegmemriban tall-
hat, a segtsgvel kijellhetjk a sz-
veg egyes pontjait. A szvegbejrk fon-
tos tulajdonsga, hogy a szvegmem-
ria tartalmnak megvltoztatsval rv-
nyket vesztik, azaz a szvegbejrkat
hossz tv munkra nem hasznlhat-
juk. A GTK+ programknyvtrban a sz-
vegbejrk kezelsre a GtkTextIter tpus szolgl.
Ha a szveg egyes elemeit hossz tvon szeretnnk megjelellni, gy,
hogy a szveg adott pontjra a szvegmemria vltozsa utn is rta-
lljunk, a szvegjelet kell hasznlnunk. A szvegbejrval szemben a
szvegjel a szvegmemria megvltozsa utn is hasznlhat marad. A
GTK+ programknyvtr a szvegjelek kezelsre a GtkTextMark tpust
biztostja a programoz szmra.
A szvegszerkeszt o igen hatkony s magas szint u eszkz, ami tbbek
kzt abban is megnyilvnul, hogy kpes klnfle megjelensi formkat
rendelni a szveg egyes rszeihez. A 8.4 brn lthatjuk, hogy a szveg-
szerkeszt oben a szveg egyes rszei klnfle el otr- s httrsznekkel
jelenhetnek meg, a szvegszerkeszt o tbbfle bet utpust, bet uvltozatot
vagy ppen alhzst hasznlhat egy id oben. Az ilyen feladatokra a cet-
liket hasznlhatjuk. A cetlik a szveg egyes rszeihez rendelhet ok, hogy
az adott szvegrsz a cetlinek megfelel o tulajdonsgokkal jelenjen meg.
A GTK+ programknyvtr a szvegben hasznlhat cetlik kezelsre a
GtkTextTag struktrt biztostja a programoz szmra.
gtk 2007/10/21 14:22 page 211 #211
211
8.2.1. A szveg olvassa s rsa
Ha szvegszerkeszt o kperny oelemet hasznlunk, akkor mg a legegy-
szer ubb alkalmazsban is szksgnk van arra, hogy a szvegszerkesz-
t oben megjelen o szveghez hozzfrjnk, hogy a szvegszerkeszt obe sz-
veget helyezznk el s a felhasznl ltal megvltoztatott tartalmat on-
nan kiolvassuk.
A szvegszerkeszt o tartalmnak belltsa viszonylag egyszer u, a sz-
veg kiolvasshoz pedig a szvegszerkeszt ohz tartoz szvegmemri-
ban szvegbejrkat kell elhelyeznnk, hogy a kztk tallhat szveget
kiolvassuk. A kvetkez o fggvnyek szksgesek a szvegszerkeszt o tar-
talmnak belltsra s kiolvassra.
GtkTextBuffer
*
gtk_text_view_get_buffer(GtkTextView
*
szvegszerkeszto); A fggvny segtsgvel lekrdezhetjk
a szvegszerkeszt ohz tartoz szvegmemria cmt. A legtbb
szvegkezel o m uveletet a szvegmemrin tudjuk elvgezni.
A fggvny argumentuma a szvegszerkeszt ot jelli a memriban,
a visszatrsi rtke pedig a szvegmemria cmt adja meg. Minden
szvegszerkeszt ohz egy szvegmemria tartozik, de a szvegmem-
ria egyszerre tbb szvegszerkeszt ohz lehet rendelve.
void gtk_text_buffer_set_text(GtkTextBuffer
*
szmemria,
const gchar
*
szveg, gint hossz); A fggvny segtsgvel
bellthatjuk a szvegmemria tartalmt. A fggvny trli a sz-
vegmemribl a benne tallhat szveget s bemsolja a msodik
paramter ltal jellt szveget. A harmadik paramter a szveg
hosszt adja meg, ha az rtke 1, akkor a fggvny felttelezi,
hogy a szveg vgt 0 rtk u bjt jelzi.
A szvegnek mint a GTK+ knyvtr legtbb fggvnye esetben
UTF-8 kdolsnak kell lennie.
void gtk_text_buffer_get_start_iter(GtkTextBuffer
*
szmemria, GtkTextIter
*
bejr); A fggvny segtsgvel
egy ltez o szvegbejrt bellthatunk gy, hogy az a szvegme-
mriban tallhat szveg legvgre a lezr 0 rtk u bjtra
mutasson.
A fggvny els o argumentuma a szvegmemrit jelli a memri-
ban, a msodik pedig egy olyan memriaterletet, ahol a szvegbe-
jrnak foglaltunk helyet. A fggvny a msodik argumentummal
jellt memriaterletet mdostja, gy annak rhatnak kell lennie.
void gtk_text_buffer_get_end_iter(GtkTextBuffer
*
szmemria, GtkTextIter
*
bejr); A fggvny segts-
gtk 2007/10/21 14:22 page 212 #212
212
gvel egy ltez o szvegbejrt llthatunk be gy, hogy az a
szvegmemria legels o karaktert jellje.
gchar
*
gtk_text_buffer_get_text(GtkTextBuffer
*
szmemria,
const GtkTextIter
*
eleje, const GtkTextIter
*
vge,
gboolean rejtett); A fggvny segtsgvel a szvegmemriban
a kt bejr kzti szveget msolhatjuk ki dinamikusan foglalt
memriaterletre.
A fggvny els o argumentuma a szvegmemrit jelli a memri-
ban, a msodik s harmadik argumentuma pedig a kimsoland
szveg elejt, illetve vgt jell o szvegbejrt. A fggvny utols ar-
gumentuma egy logikai rtk, amely meghatrozza, hogy a szveg
rejtett karakterei is jelenjenek -e meg a kimsolt terleten.
A fggvny visszatrsi rtke a dinamikusan foglalt memriater-
letre mutat, ahova a fggvny a krt szvegrszt kimsolta. Hasz-
nlat utn ezt a memriaterletet fel kell szabadtanunk.
Magtl rtet odik, hogy ha a fggvnynek tadott kt szvegbejr
a szvegmemria elejre s vgre mutat, akkor a teljes szveget
kimsolhatjuk a szvegmemribl.
void gtk_text_buffer_insert(GtkTextBuffer
*
szmemria,
GtkTextIter
*
bejr, const gchar
*
szveg, gint hossz);
A fggvny segtsgvel j szvegrszletet helyezhetnk el a sz-
vegmemriban tallhat szvegben. A fggvny paramtereinek
rtelmezse a kvetkez o:
szmemria Azt a szvegmemrit jelli a memriban, amelyben az
j szvegrszt be akarjuk szrni.
bejr Azt a szvegbejrt jelli a memriban, amely meghat-
rozza, hogy szveg mely rsznl jelenjen meg az j szvegrsz.
szveg A beszrand karakterlncot jelli a memriban.
hossz A beszrand szvegrsz hossza. Ha ennek a paramternek
-1 az rtke, a fggvny felttelezi, hogy a beszrand szveg-
rsz vgt 0 rtk u bjt jelli.
A fggvny a beszrand szvegrszr ol msolatot kszt, ezrt a t-
rolsra szolgl memriaterletet a ks obbiekben felszabadthat-
juk.
A szvegszerkeszt o kperny oelemben tallhat szveg belltst s ki-
olvasst lthatjuk a kvetkez o kt pldban, amely ezeket a fontos l-
pseket mutat be.
41. plda. A kvetkez o programrszlet a szvegszerkeszt o mez oben ta-
llhat szveget llomnyba rja.
gtk 2007/10/21 14:22 page 213 #213
213
1 int
2 save_textview_to_file(
3 GtkWidget
*
parent,
4 GtkTextView
*
text_view,
5 char
*
filename){
6
7 int output_file;
8 int written;
9 GtkWidget
*
dialog;
10 GtkTextBuffer
*
text_buffer;
11 GtkTextIter start;
12 GtkTextIter end;
13 gchar
*
text;
14 size_t size;
15
16 /
*
17
*
A kimen o llomny megnyitsa.
18
*
/
19 output_file = open(filename,
20 O_WRONLY | O_CREAT,
21 S_IRUSR | S_IWUSR);
22
23 if (output_file == -1){
24 dialog = gtk_message_dialog_new(GTK_WINDOW(parent),
25 GTK_DIALOG_DESTROY_WITH_PARENT,
26 GTK_MESSAGE_ERROR,
27 GTK_BUTTONS_CLOSE,
28 "A fjl nem nyithat meg rsra: %s: %m.",
29 filename);
30 gtk_dialog_run(GTK_DIALOG(dialog));
31 gtk_widget_destroy(dialog);
32 close(output_file);
33 return -1;
34 }
35
36 /
*
37
*
A szveg kiolvassa a szvegszerkeszt ob ol.
38
*
/
39 text_buffer = gtk_text_view_get_buffer(text_view);
40 gtk_text_buffer_get_start_iter(text_buffer, &start);
41 gtk_text_buffer_get_end_iter(text_buffer, &end);
42 text = gtk_text_buffer_get_text(text_buffer,
43 &start,
gtk 2007/10/21 14:22 page 214 #214
214
44 &end,
45 TRUE);
46 /
*
47
*
A szveg rsa. Az strlen() fggvny itt nem a
48
*
karakterek szmt, hanem a foglalt memria mrett
49
*
adja meg.
50
*
/
51 size = strlen(text);
52 if ((written=write(output_file, text, size)) != size){
53 dialog = gtk_message_dialog_new(GTK_WINDOW(parent),
54 GTK_DIALOG_DESTROY_WITH_PARENT,
55 GTK_MESSAGE_ERROR,
56 GTK_BUTTONS_CLOSE,
57 "Hiba az llomny rsa kzben: %s: %m",
58 filename);
59 gtk_dialog_run(GTK_DIALOG(dialog));
60 gtk_widget_destroy(dialog);
61 written = -1;
62 }
63
64 /
*
65
*
A memriaterlet felszabadtsa, az llomny
66
*
lezrsa.
67
*
/
68 g_free(text);
69 close(output_file);
70 return written;
71 }
A bemutatott fggvny a megjegyzsek segtsgvel knnyen megrthet o,
receptknt felhasznlhat.
42. plda. A kvetkez o fggvny beolvassa az llomny tartalmt s el-
helyezi egy szvegszerkeszt oben.
1 int
2 load_file_to_textview(GtkWidget
*
parent,
3 GtkTextView
*
text_view,
4 char
*
filename){
5 GtkWidget
*
dialog;
6 GtkTextBuffer
*
text_buffer;
7 struct stat for_size;
8 char
*
buffer;
9 int input_file;
gtk 2007/10/21 14:22 page 215 #215
215
10
11 /
*
12
*
A bemen o llomny mretnek megllaptsa.
13
*
/
14 if (stat(filename, &for_size) != 0){
15 dialog = gtk_message_dialog_new(GTK_WINDOW(parent),
16 GTK_DIALOG_DESTROY_WITH_PARENT,
17 GTK_MESSAGE_ERROR,
18 GTK_BUTTONS_CLOSE,
19 "A fjl mrete nem llapthat meg: %s: %m",
20 filename);
21 gtk_dialog_run(GTK_DIALOG(dialog));
22 gtk_widget_destroy(dialog);
23 return -1;
24 }
25
26 /
*
27
*
Az llomny megnyitsa.
28
*
/
29 buffer = g_malloc(for_size.st_size);
30 input_file = open(filename, O_RDONLY);
31 if (input_file == -1){
32 dialog = gtk_message_dialog_new(GTK_WINDOW(parent),
33 GTK_DIALOG_DESTROY_WITH_PARENT,
34 GTK_MESSAGE_ERROR,
35 GTK_BUTTONS_CLOSE,
36 "A fjl nem nyithat meg olvassra: %s: %m",
37 filename);
38 gtk_dialog_run(GTK_DIALOG(dialog));
39 gtk_widget_destroy(dialog);
40 g_free(buffer);
41 return -1;
42 }
43
44 /
*
45
*
Az llomny tartalmnak beolvassa.
46
*
/
47 if (read(input_file, buffer, for_size.st_size) !=
48 for_size.st_size){
49 dialog = gtk_message_dialog_new(GTK_WINDOW(parent),
50 GTK_DIALOG_DESTROY_WITH_PARENT,
51 GTK_MESSAGE_ERROR,
52 GTK_BUTTONS_CLOSE,
53 "A fjl nem nyithat meg olvassra: %s: %m",
gtk 2007/10/21 14:22 page 216 #216
216
54 filename);
55 gtk_dialog_run(GTK_DIALOG(dialog));
56 gtk_widget_destroy(dialog);
57 close(input_file);
58 g_free(buffer);
59 return -1;
60 }
61
62 /
*
63
*
A szveg elhelyezse a szvegszerkeszt oben.
64
*
/
65 text_buffer = gtk_text_view_get_buffer(text_view);
66 gtk_text_buffer_set_text(text_buffer,
67 buffer,
68 for_size.st_size);
69
70 /
*
71
*
Az llomny rezrsa, a memria felszabadtsa.
72
*
/
73 close(input_file);
74 g_free(buffer);
75 return for_size.st_size;
76 }
A program az el oz o plda programjhoz hasonl mdon knnyen meg-
rthet o, egyszer u lpseket tartalmaz.
8.2.2. A szvegbejrk
A kvetkez okben ismertetjk a szvegbejrk a GtkTextIter struk-
trk kezelsre hasznlhat fggvnyeket. A szvegbejrkat kezel o
fggvnyek kapcsn meg kell jegyeznnk, hogy a szvegsor kifejezs
nmikppen klnbz o jelents u lehet a szvegmemria s a szvegszer-
keszt o kperny oelem szempontjbl. A szvegszerkeszt o kperny oelem
ugyanis a korltozott szlessge miatt sokszor tbb sorra trdeli a szve-
get, ami a szvegmemriban egyetlen sorban tallhat. A szvegmem-
ria sorait a kznapi rtelemben teht inkbb bekezdseknek tekinthet-
jk, olyan szvegegysgeknek, amelyeknek az elejn s a vgn letttk
az Enter billenty ut (azaz ahov jsor karaktert helyeztnk, hogy mg za-
varosabb legyen a sorok s bekezdsek kzti klnbsg).
rdemes azt is megjegyeznnk, hogy a szvegbejrk mozgatsra
hasznlhat fggvnyek mindig hamis logikai rtket adnak vissza, ha
a szvegbejr a mozgats sorn elrte a szvegmemria vgt, de nem
gtk 2007/10/21 14:22 page 217 #217
217
felttlenl adnak vissza hamis rtket, ha a szvegbejr elrte a szveg-
memria elejt. Ezt a ltszlag rtelmetlen asszimetrit az magyarzza,
hogy a szvegbejr ltalban az utna kvetkez o karaktert jellemzi, s
a szvegmemria vgn tallhat szvegbejr utn nyilvnvalan nem
tallhat egyetlen karakter sem, ami nem mindig mondhatunk el a sz-
vegmemria elejre mozgatott szvegbejr kapcsn.
A GTK+ programknyvtr a kvetkez o fggvnyeket biztostja a szveg-
bejrk hasznlatra:
GtkTextBuffer
*
gtk_text_iter_get_buffer(const GtkTextIter
*
bejr); A fggvny segtsgvel lekrdezhetjk, hogy a szveg-
bejrhoz melyik szvegmemria tartozik.
gint gtk_text_iter_get_offset(const GtkTextIter
*
bejr);
A fggvny segtsgvel lekrdezhetjk, hogy az adott szvegbejr
hnyadik karakternl tallhat. A karakterek szmozsa 0-tl
kezd odik.
gint gtk_text_iter_get_line(const GtkTextIter
*
bejr); A
fggvny segtsgvel lekrdezhetjk, hogy a szvegbejr hnya-
dik sorban tallhat. A sorok szmozsa 0-tl kezd odik.
gint gtk_text_iter_get_line_offset(const GtkTextIter
*
bejr); A fggvny segtsgvel lekrdezhetjk, hogy a szveg-
bejr a soron bell hnyadik karakternl tallhat. A karakterek
szmozsa a soron bell is 0-tl kezd odik.
gint gtk_text_iter_get_line_index(const GtkTextIter
*
bejr); A fggvny segtsgvel lekrdezhetjk, hogy a szveg-
bejr a soron bell hnyadik bjtnl tallhat. (A szvegmemria
UTF-8 kdolst hasznl, ahol nem minden karakter kdja 1 bjtos.)
Az adatbjtok szmozsa 0-tl kezd odik.
gunichar gtk_text_iter_get_char(const GtkTextIter
*
bejr); A fggvny segtsgvel lekrdezhetjk a szveg-
bejrnl tallhat karaktert. A fggvny a szvegbejrt nem
mozgatja.
gchar
*
gtk_text_iter_get_text(const GtkTextIter
*
eleje,
const GtkTextIter
*
vge); A fggvny segtsgvel lekrhetjk
a szvegmemribl a szvegbejrk kzti szveget. A fggvny
visszatrsi rtke egy olyan mutat, amely arra a dinamikusan
foglalt memriaterletre mutat, amelyre a fggvny kimsolta a
szvegbejrk kzti szvegrszletet.
GSList
*
gtk_text_iter_get_marks(const GtkTextIter
*
bejr); A fggvny segtsgvel lekrhetjk, a szvegmemri-
ban az adott szvegbejrval egyez o helyen tallhat szvegjelek
gtk 2007/10/21 14:22 page 218 #218
218
listjt. A fggvny visszatrsi rtke egyszeresen lncolt listt
jell a memriban, amelyben adatknt megtallhatk mindazok a
szvegjelek, amelyek a szvegmemria adott helyn tallhatk.
GSList
*
gtk_text_iter_get_toggled_tags(const GtkTextIter
*
bejr, gboolean bekapcsolva); A fggvny segtsgvel
lekrdezhetjk a szvegmemria adott terletre vonatkoz cetlik
listjt. Ha a fggvny msodik paramtere TRUE, akkor a fggvny
azoknak a cetliknek a listjt adja, amelyek az adott ponton be
vannak kapcsolva, ha FALSE, akkor azokat, amelyek az adott
helyen nincsenek bekapcsolva.
A fggvny visszatrsi rtke egyszeresen lncolt listt jell a me-
mriban, amely adatknt tartalmazza a cetliket, amelyek az adott
ponton kifejtik hatsukat.
gboolean gtk_text_iter_begins_tag(const GtkTextIter
*
bejr, GtkTextTag
*
cetli); A fggvny segtsgvel le-
krdezhetjk, hogy a szvegmemria adott pontjn kezd odik-e a
megadott cetli hatsa a szvegre. Ha a fggvny visszatrsi rtke
TRUE az azt jelenti, hogy a szvegbejr el ott a megadott cetli nincs
hatssal a szvegre, utna azonban igen.
Ha a fggvnynek msodik paramterknt nem egy cetli cmt, ha-
nem NULL rtket adunk meg, akkor a fggvny igaz rtket ad
vissza, ha brmelyik cetli hatsa az adott ponton kezd odik.
gboolean gtk_text_iter_ends_tag(const GtkTextIter
*
bejr, GtkTextTag
*
cetli); A fggvny hasznlata meg-
egyezik a gtk_text_iter_begins_tag() fggvny hatsval, de
akkor ad igaz rtket, ha a cetli hatsa az adott ponton fejez odik
be.
gboolean gtk_text_iter_toggles_tag(const GtkTextIter
*
bejr, GtkTextTag
*
cetli); A fggvny igaz rtket ad
vissza, ha a szvegmemria adott pontjn az adott cetli hatsa
kezd odik vagy befejez odik. Ha a fggvny msodik paramtere
nem egy cetlit jell a memriban, hanem NULL rtket kpvisel, a
fggvny igaz rtket ad, ha brmelyik cetli hatsa az adott ponton
kezd odik vagy fejez odik be.
gboolean gtk_text_iter_has_tag(const GtkTextIter
*
bejr,
GtkTextTag
*
cetli); A fggvny segtsgvel megvizsglhatjuk,
hogy a szvegmemria adott helyn a megadott cetli kifejti-e a ha-
tst. Ha a cetli a szveg adott pontjn kifejti a hatst, a fggvny
TRUE rtket ad vissza, klnben pedig FALSE a visszatrsi rtk.
gtk 2007/10/21 14:22 page 219 #219
219
GSList
*
gtk_text_iter_get_tags(const GtkTextIter
*
bejr); A fggvny segtsgvel lekrdezhetjk a szveg adott
pontjra rvnyes cetlik listjt. A fggvny visszatrsi rtke egy
olyan egyszeresen lncolt listt jell a memriban, amely adatknt
a szveg adott pontjra rvnyes cetliket tartalmazza. A listban a
cetlik nvekv o fontossgi sorrendben tallhatk meg.
gboolean gtk_text_iter_starts_word(const GtkTextIter
*
bejr); A fggvny igaz rtket ad vissza, ha a szvegbe-
jr sz elejn tallhat.
gboolean gtk_text_iter_ends_word(const GtkTextIter
*
bejr); A fggvny igaz rtket ad vissza, ha a szvegbe-
jr sz vgn tallhat.
gboolean gtk_text_iter_inside_word(const GtkTextIter
*
bejr); A fggvny igaz rtket ad vissza, ha a szvegbe-
jr sz belsejben tallhat.
gboolean gtk_text_iter_starts_line(const GtkTextIter
*
bejr); A fggvny igaz rtket ad vissza, ha a szvegbe-
jr sor elejn tallhat.
gboolean gtk_text_iter_ends_line(const GtkTextIter
*
bejr); A fggvny igaz rtket ad vissza, ha a szvegbe-
jr a sor vgn van.
gboolean gtk_text_iter_starts_sentence(const GtkTextIter
*
bejr); A fggvny igaz rtket ad vissza, ha a szvegbejr
mondat elejn tallhat.
gboolean gtk_text_iter_ends_sentence(const GtkTextIter
*
bejr); A fggvny igaz rtket ad vissza, ha a szvegbejr
mondat vgn tallhat.
gboolean gtk_text_iter_inside_sentence(const GtkTextIter
*
bejr); A fggvny igaz rtket ad vissza, ha a szvegbejr
mondaton bell tallhat.
gboolean gtk_text_iter_is_cursor_position(const
GtkTextIter
*
bejr); A fggvny igaz rtket ad vissza,
ha a szvegbejr olyan helyen van, ahol a kurzor is megjelenhet.
A fggvny teht nem azt jelzi, hogy a szvegbejr s a kurzor
ugyanazon a helyen van, hanem azt, hogy a kurzor akr ott is
lehetne, ahol a szvegbejr ppen van.
gtk 2007/10/21 14:22 page 220 #220
220
gint gtk_text_iter_get_chars_in_line(const GtkTextIter
*
bejr); A fggvny segtsgvel lekrdezhetjk a karakte-
rek szmt abban a sorban, amelyben a szvegbejr is van. A
karakterek szmba az jsor karakter is beleszmt.
gint gtk_text_iter_get_bytes_in_line(const GtkTextIter
*
bejr); A fggvny segtsgvel lekrdezhetjk, hogy hny
bjtnyi szveg van a sorban, amelyben a szvegbejr is tall-
hat. (Az UTF-8 kdolst hasznlva a karakterek szma s az
adatbjtok szma nem felttlenl egyezik meg egymssal.) Az
adatbjtok szmba az jsorkarakter ltal foglalt adatbjtok szma
is beletartozik.
gboolean gtk_text_iter_is_end(const GtkTextIter
*
bejr);
A fggvny igaz rtket ad vissza, ha a szvegbejr a szvegmem-
ria legvgn tallhat.
gboolean gtk_text_iter_is_start(const GtkTextIter
*
bejr); A fggvny igaz rtket ad vissza, ha a szvegbe-
jr a szvegmemria elejn tallhat.
gboolean gtk_text_iter_forward_char(GtkTextIter
*
bejr);
A fggvny egy karakterrel mozgatja a szvegbejrt a szveg vge
fel. A fggvny visszatrsi rtke igaz, ha a mozgats sikeres volt
azaz a szvegbejr nem a szvegmemria vgn volt.
gboolean gtk_text_iter_backward_char(GtkTextIter
*
bejr); A fggvny egy karakterrel mozgatja a szvegbejrt a
szveg eleje fel. A fggvny visszatrsi rtke igaz, ha a mozgats
sikeres volt, hamis, ha a szvegbejr mr a szvegmemria els o
karakternl el ott tallhat.
gboolean gtk_text_iter_forward_chars(GtkTextIter
*
bejr,
gint n); A fggvny segtsgvel a szvegbejrt tetsz oleges
szm karakterrel mozgathatjuk el ore, a szveg vge fel. A fgg-
vny TRUE rtket ad vissza, ha a szvegbejrt a kvnt szm
karakterrel sikerlt a szveg vge fel mozgatni, FALSE rtket, ha
a mozgats sorn a szvegbejr elrte a szvegmemria vgt.
gboolean gtk_text_iter_backward_chars(GtkTextIter
*
bejr, gint n); A fggvny hasonlan m ukdik a
gtk_text_iter_forward_chars() fggvnyhez, de nem a szveg
vge, hanem a szveg eleje fel mozgatja a szvegbejrt.
gboolean gtk_text_iter_forward_line(GtkTextIter
*
bejr);
A fggvny segtsgvel a szvegbejrt a szvegmemria kvetkez o
sornak elejre mozgathatjuk. A fggvny TRUE rtket ad vissza,
gtk 2007/10/21 14:22 page 221 #221
221
ha a szvegmemriban a kvetkez o sor elejre lehetett mozgatni a
szvegbejrt, FALSE rtket, ha a szvegmemriban mr nincsen
kvetkez o sor. Ez utbbi esetben a fggvny a szvegbejrt a
szvegmemria vgre mozgatja.
gboolean gtk_text_iter_backward_line(GtkTextIter
*
bejr); A fggvny segtsgvel a szvegbejrt a szveg-
memria el oz o sornak elejre mozgathatjuk. Ha a szvegbejr
a szvegmemria els o sorban tallhat, de nem a sor elejn, a
fggvny a szvegbejrt a sor elejre mozgatja. A fggvny TRUE
rtket ad vissza, ha a szvegbejr a fggvny hatsra elmozdult,
FALSE rtket, ha a szvegbejr a fggvny hvsakor mr az els o
sor elejn volt.
Vegyk szre, hogy a fggvny akkor is adhat vissza igaz rtket, ha
a szvegbejrt nem sikerlt az el oz o sorba mozgatni, csak az adott
sor elejre. Ez nmikppen megneheztheti a programoz munkjt,
akinek erre az eshet osgre is gondolnia kell.
gboolean gtk_text_iter_forward_lines(GtkTextIter
*
bejr,
gint n); A fggvny hasznlata s m ukdse megegyezik a
gtk_text_iter_forward_line() fggvny hasznlatval s m u-
kdsvel, de nem egy, hanem tetsz oleges sornyi mozgatst tesz
lehet ov.
gboolean gtk_text_iter_backward_lines(GtkTextIter
*
bejr, gint n); A fggvny hasznlata s m ukdse megegye-
zik a gtk_text_iter_backward_line() fggvny hasznlatval
s m ukdsvel, de nem egy, hanem tetsz oleges sornyi mozgatst
tesz lehet ov.
gboolean gtk_text_iter_forward_word_end(GtkTextIter
*
bejr); A fggvny segtsgvel a szvegbejrt a sz v-
gre mozgathatjuk. Ha a szvegbejr mr a sz vgn tallhat,
akkor a fggvny a szvegbejrt a kvetkez o sz vgre moz-
gatja, gy a fggvnyt jra s jra hvva a teljes szvegmemrit
bejrhatjuk.
A fggvny TRUE rtket ad vissza, ha a szvegbejrt sikerlt el-
mozdtani s az a mozgats utn mg nem rte el a szvegmemria
vgt.
gboolean gtk_text_iter_backward_word_start(GtkTextIter
*
bejr); A fggvny segtsgvel a szvegbejrt a sz elejre
mozgathatjuk. Ha a szvegbejr a fggvny hvsakor mr a sz
elejn volt, a fggvny a szvegbejrt az el oz o sz elejre mozgatja,
gy a fggvnyt jra s jra hvva a teljes szveg bejrhat.
gtk 2007/10/21 14:22 page 222 #222
222
A fggvny TRUE rtket ad vissza, ha a szvegbejrt sikerlt el-
mozdtani.
gboolean gtk_text_iter_forward_word_ends(GtkTextIter
*
bejr, gint n); A fggvny hasznlata s m ukdse a
gtk_text_iter_forward_word_end() fggvny hasznlathoz
s m ukdshez hasonl, de nem egy, hanem tetsz oleges szm
sznyi mozgatst tesz lehet ov.
gboolean gtk_text_iter_backward_word_starts(GtkTextIter
*
bejr, gint count); A fggvny hasznlata s m ukdse a
gtk_text_iter_forward_word_start() fggvny hasznlathoz
s m ukdshez hasonl, de nem egy, hanem tetsz oleges szm
sznyi mozgatst tesz lehet ov.
gboolean gtk_text_iter_forward_cursor_position(GtkText-
Iter
*
bejr); A fggvny segtsgvel a szvegbejrt egy
kurzorpozcival mozgathatjuk a szveg vge fel. A fggvny m uk-
dse nem teljesen egyezik meg a gtk_text_iter_forward_char()
fggvny m ukdsvel, mert a karakter s a kurzorpozci fogalma
bizonyos esetekben nem azonos. Bizonyos nyelvek nhny rsjele
tbb karakterb ol ll, ahol kurzor nem llhat az rsjelet alkot
karakterek kz.
A fggvny TRUE rtket ad vissza, ha a szvegbejr mozgatsa
sikeres volt s a mozgats sorn nem rtk el a szvegmemria
vgt.
gboolean gtk_text_iter_backward_cursor_position(GtkText-
Iter
*
bejr); A fggvny segtsgvel a szvegbejrt egy
kurzorpozcival mozgathatjuk a szveg eleje fel. (A kurzorpozci
fogalmt lsd az el oz o fggvnynl.)
A fggvny TRUE rtket ad vissza, ha a szvegbejr mozgatsa
sikeres volt.
gboolean gtk_text_iter_forward_cursor_positions(GtkText-
Iter
*
iter, gint count); A fggvny m ukdse s hasznlata
megegyezik a gtk_text_iter_forward_cursor_position()
fggvny m ukdsvel s hasznlatval, de nem egy, hanem
tetsz olegesen sok kurzorpozcival mozgathatjuk a szvegbejrt.
gboolean gtk_text_iter_backward_cursor_positions(GtkText-
Iter
*
bejr, gint count); A fggvny m ukdse s haszn-
lata megegyezik a gtk_text_iter_backward_cursor_position()
fggvny m ukdsvel s hasznlatval, de nem egy, hanem tet-
sz olegesen sok kurzorpozcival mozgathatjuk a szvegbejrt.
gtk 2007/10/21 14:22 page 223 #223
223
gboolean gtk_text_iter_backward_sentence_start(GtkText-
Iter
*
bejr); A fggvny segtsgvel a bejr a mondat elejre
mozgathat. Ha a bejr mr a mondat elejn van, a fggvny az
el oz o mondat elejre kerl. A fggvny visszatrsi rtke TRUE, ha
a bejrt sikerlt elmozdtani.
gboolean gtk_text_iter_forward_sentence_end(GtkTextIter
*
bejr); A fggvny segtsgvel a bejr a mondat vgre
mozgathat. Ha a bejr mr a fggvny hvsakor is a mondat
vgn tallhat, a fggvny a bejrt a kvetkez o mondat vgre
mozgatja. A fggvny TRUE rtket ad vissza, ha a bejrt sikerlt
elmozdtani s az a mozgats sorn nem rte el a szvegmemria
vgt.
gboolean gtk_text_iter_backward_sentence_starts(GtkText-
Iter
*
bejr, gint count); A fggvny hasznlata megegyezik
a gtk_text_iter_backward_sentence_start() fggvny hasz-
nlatval, de lehet ov teszi, hogy a bejrt tbb mondatnyi
tvolsgba mozgassuk.
gboolean gtk_text_iter_forward_sentence_ends(GtkTextIter
*
bejr, gint count); A fggvny hasznlata megegyezik a
gtk_text_iter_forward_sentence_start() fggvny hasznla-
tval, de lehet ov teszi, hogy a bejrt tbb mondatnyi tvolsgba
mozgassuk.
void gtk_text_iter_set_offset(GtkTextIter
*
bejr, gint
szmll); A fggvny segtsgvel a bejr a szvegmemria
adott sorszm karakterhez mozgathat. A fggvny msodik
paramtere meghatrozza, hogy a szvegmemria hnyadik karak-
terhez mozgatjuk a szvegbejrt. A karakterek szmllsa 0-tl
indul.
void gtk_text_iter_set_line(GtkTextIter
*
bejr, gint
sor_szma); A fggvny segtsgvel a szvegbejrt a szveg-
memria adott sorszm sornak elejre mozgathatjuk. A sorok
szmozsa 0-tl indul.
void gtk_text_iter_set_line_offset(GtkTextIter
*
bejr,
gint karakter_szm); A fggvny segtsgvel a szvegbej-
rt az aktulis soron bell, annak adott sorszm karakterre
mozgathatjuk. A soron belli karakterek szmozsa 0-tl indul.
void gtk_text_iter_set_line_index(GtkTextIter
*
bejr,
gint bjt_szm); A fggvny segtsgvel a szvegbejrt az
aktulis soron bell, annak adott sorszm bjtjra mozgathatjuk.
A soron belli bjtok szmozsa 0-tl indul.
gtk 2007/10/21 14:22 page 224 #224
224
void gtk_text_iter_forward_to_end(GtkTextIter
*
bejr); A
fggvny segtsgvel a bejrt a szvegmemria vgre mozgathat-
juk.
gboolean gtk_text_iter_forward_to_line_end(GtkTextIter
*
bejr); A fggvny segtsgvel a bejrt a sor vgre mozgat-
hatjuk. Ha a szvegbejr a fggvny hvsakor mr a sor vgn
tallhat, a fggvny a bejrt a kvetkez o sor vgre mozgatja. A
fggvny TRUE rtket ad vissza, ha a bejr mozgatsa sikeres volt
s a bejr a mozgats sorn nem rte el a szvegmemria vgt.
gboolean gtk_text_iter_forward_to_tag_toggle(GtkTextIter
*
bejr, GtkTextTag
*
tag); A fggvny segtsgvel a bejrt
a szveg vge fel, arra a helyre mozgathatjuk, ahol az adott cetli
hatkre kezd odik vagy befejez odik. Ha a szvegbejr aktulis
helyn kezd odik vagy fejez odik be az adott cetli hatkre, a fgg-
vny a kvetkez o hasonl pontra mozgatja a bejrt. Ha a fggvny
msodik paramternek rtke NULL rtk, a fggvny nem egy
konkrt cetli hatkrnek elejt vagy vgt keresi, egyszer uen
csak a legkzelebbi, tetsz oleges cetli hatkrnek elejt vagy vgt
keresi.
A fggvny TRUE rtket ad vissza, ha a keress sikeres volt s a
bejrt sikerlt elmozdtani.
gboolean gtk_text_iter_backward_to_tag_toggle(GtkTextIter
*
bejr, GtkTextTag
*
cetli); A fggvny m ukdse s hasz-
nlata megegyezik a gtk_text_iter_forward_to_tag_toggle()
m ukdsvel s hasznlatval, de ez a fggvny a szveg eleje fel
keres.
gboolean gtk_text_iter_forward_find_char(GtkTextIter
*
bejr, GtkTextCharPredicate
*
fggvny, gpointer
adat, const GtkTextIter
*
hatr); A fggvny segtsgvel
a szvegmemriban adott karakter vagy karakterosztly kvetkez o
el ofordulst kereshetjk meg a szvegbejr aktulis helyt ol a
szveg vge fel haladva. A fggvny paramtereinek rtelmezse a
kvetkez o:
bejr A fggvny ezt a bejrt mozgatja a szveg vge fel, ennek
a bejrnak az aktulis helyt ol keres el orefel.
fggvny A keress sorn ez a fggvny fogja eldnteni, hogy a
keresett karaktert megtalltuk-e. Ennek a fggvnynek TRUE
rtket kell visszaadni, ha a keresett karaktert megtalltuk.
adat A fggvny, amely a keresett karaktert azonostja, megkapja
ezt a mutatt is paramterknt.
gtk 2007/10/21 14:22 page 225 #225
225
hatr A fggvny addig vgzi a keresst, amg ezt a keressi hatrt
el nem ri. Ha a fggvny ezen paramternek rtke NULL, a
fggvny a keresst a szvegmemria vgig folytatja.
visszatrsi_rtk A fggvny visszatrsi rtke TRUE, ha a ke-
ress sikerrel jrt, azaz, ha a fggvny azrt fejezte be, mert a
karakter azonostst vgz o fggvny TRUE rtket adott vissza.
gboolean GtkTextCharPredicate(gunichar karakter, gpointer
adat); A karakter vagy karakterosztly azonostsra szolgl
fggvny, amelyet a programoz biztost a keresshez. A fggvny
els o paramtere a vizsgland karakter, a msodik param-
tere pedig a keress elejn megadott mutat, amely tetsz oleges
adatterletet jell a memriban.
A fgvnynek TRUE rtket kell visszaadnia, ha a karaktert azono-
stotta.
gboolean gtk_text_iter_backward_find_char(GtkTextIter
*
bejr, GtkTextCharPredicate
*
fggvny, gpointer
adat, const GtkTextIter
*
hatr); A fggvny m ukdse s
hasznlata megegyezik a gtk_text_iter_forward_find_char()
fggvny m ukdsvel s hasznlatval, de ez a fggvny a szveg
eleje fel keres.
gboolean gtk_text_iter_forward_search(const GtkTextIter
*
bejr, const gchar
*
szveg, GtkTextSearchFlags
kapcsolk, GtkTextIter
*
kezdete, GtkTextIter
*
vge,
const GtkTextIter
*
hatr); A fggvny segtsgvel a szveg-
memriban a szveg vge fel kereshetnk adott szvegrszletet.
A fggvny paramtereinek rtelmezse a kvetkez o:
bejr A keress kezd opontjt jell o szvegbejr.
szveg A keresett karakterlnc.
kapcsolk A kapcsolk, amelyek meghatrozzk a keress mdjt.
Mivel a GTK+ jelenlegi vltozatai nem tmogatjk a lthatatlan
szvegrszek hasznlatt s e knyvben nem foglalkozunk a
szvegbe gyazott kperny oelemekkel, ennek a paramternek
a helyn egyszer uen 0 rtket adunk meg.
kezdete A szvegbejr helye a memriban, ahov a fggvny a
megtallt szvegrsz elejnek helyt elhelyezi.
vge A szvegbejr helye a memriban, ahov a fggvny a meg-
tallt szvegrsz vgnek helyt elhelyezi.
hatr A keress fels o hatrt jelz o szvegbejr helye a memri-
ban. Ha ennek a paramternek NULL az rtke, a keress a
szvegmemria vgig tart.
gtk 2007/10/21 14:22 page 226 #226
226
visszatrsi_rtk A fggvny TRUE rtket ad vissza, ha a ke-
ress sikeres volt, azaz a fggvny tallt egyez o szvegrszt.
gboolean gtk_text_iter_backward_search(const GtkTextIter
*
bejr, const gchar
*
szveg, GtkTextSearchFlags
kapcsolk, GtkTextIter
*
kezdete, GtkTextIter
*
vge,
const GtkTextIter
*
hatr); A fggvny m ukdse s haszn-
lata megegyezik a gtk_text_iter_forward_search() fggvny
m ukdsvel s hasznlatval, de ez a fggvny a szveg eleje fel
keres.
gboolean gtk_text_iter_equal(const GtkTextIter
*
a, const
GtkTextIter
*
b); A fggvny igaz rtket ad vissza, ha a pa-
ramterknt megadott szvegbejrk a szvegmemria egyazon
helyre mutatnak. A GTK+ dokumentcija szerint ez a fggvny
igen hatkony, gyors algoritmust hasznl.
gint gtk_text_iter_compare(const GtkTextIter
*
a, const
GtkTextIter
*
b); A szvegbejrkat sszehasonlt fggvny. A
fggvny 0 rtket ad vissza, ha a kt szvegbejr egyazon helyet
jelli a szvegmemriban, negatv rtket ad vissza, ha az els o
szvegbejr a szveg elejhez kzelebb, pozitv rtket, ha tvolabb
van.
gboolean gtk_text_iter_in_range(const GtkTextIter
*
bejr, const GtkTextIter
*
eleje, const GtkTextIter
*
vge); A fggvny TRUE rtket ad vissza, ha az els o szvegbejr
a msodik s harmadik paramterknt megadott szvegbejrk
kzt tallhat. A msodik s harmadik szvegbejrnak a megfelel o
sorrendben kell lennie, azaz a harmadik paramterknt megadott
szvegbejrnak a szveg vghez kzelebb kell lennie, mint a
msodik paramterknt megadott szvegbejrnak.
void gtk_text_iter_order(GtkTextIter
*
a, GtkTextIter
*
b);
A fggvny a megadott kt szvegbejrt sorrendbe lltja, azaz,
ha szksges megcserli, hogy a msodik szvegbejr kzelebb
legyen a szvegmemria vghez, mint az els o.
8.2.3. A szvegjelek
Amint azt mr emltettk, a szvegjelek a GtkTextMark struktrk
a szveg egyes helyeinek hossz tv megjellsre hasznlhatk. A
GtkTextMark a GtkTextIter tpushoz hasonlan hasznlhat, azzal el-
lettben azonban a szveg megvltoztatsa utn is rvnyes marad. Amg
gtk 2007/10/21 14:22 page 227 #227
227
a GtkTextIter adatszerkezetet ltalban egy fggvnyen bell hasznl-
juk ott hozzuk ltre s ott is semmistjk meg, amg a szveg nem vl-
tozhat meg , addig a GtkTextMark lettartama ltalban tbb fggvnyt
is tlel nem abban a fggvnyben semmistjk meg, amelyikben lt-
rehozzuk. A GtkTextMark ezen tulajdonsga tbb, a kezelsre szolgl
fggvny kapcsn meggyelhet o, a GtkTextMark adatszerkezetet nvvel
lthatjuk el, dinamikusan foglalt memriaterletre kerl, tulajdonsgai
kzt a szveg megvltozsa esetn kvetend o eljrs is szerepel s gy
tovbb.
A GtkTextMark adatszerkezet hasznlathoz elengedhetetlenl szk-
sges fggvnyek a kvetkez ok:
GtkTextMark
*
gtk_text_buffer_create_mark(GtkTextBuffer
*
szmemria, const gchar
*
nv, const GtkTextIter
*
bejr, gboolean balra); A fggvny segtsgvel j szveg-
jelet hozhatunk ltre a szvegmemria adott pontjnak jellsre.
A fggvny visszatrsi rtknek s paramtereinek jelentse a
kvetkez o:
visszatrsi rtk A fggvny visszatrsi rtke az jonan lt-
rehozott szvegjelet jelli a memriban.
szmemria A szvegmemrit jelli a memriban. A szvegjel en-
nek a szvegmemrinak egy pontjt jelli, ehhez a szveg-
memrihoz tartozik. A szvegmemriban a GTK nyilvntar-
tst vezet az sszes szvegjelr ol, a szvegmemriban tallhat
sszes szvegjel kikereshet o, lekrdezhet o.
nv A szvegjel nevt jelli a memriban. A nv alapjn a szveg-
jel a szvegmemribl kikereshet o, mert a szvegmemriban
adott egy id oben mindig csak egy szvegjel ltezhet.
Ha ennek a paramternek az rtke NULL, a szvegjelet nv
nlkl hozzuk ltre.
bejr A szvegjel helyt jelli a memriban. A szvegjelet teht
egy szvegbejr segtsgvel hozhatjuk ltre e fggvnnyel.
balra Ennek a paramternek a segtsgvel megadhatjuk, hogy mi
trtnjk, ha pontosan ennek a szvegjelnek a helyre illesz-
tnk be j karaktereket.
Ha ez a paramter TRUE rtk u, a beszrt karakterekt ol balra
lesz megtallhat a szvegjel. Ha e paramternek az rtke
FALSE a szvegjel a beszrt karaktert ol jobbra tallhat, az j
karakterek a szvegjel bal oldalra kerlnek, a szvegjelet ma-
guk el ott tolva. Ilyen mdon viselkedik pldul az a szvegjel
is, ami a kurzor helyt jelli a memriban, hiszen a kurzor
gtk 2007/10/21 14:22 page 228 #228
228
mindig az j karaktert ol jobbra toldik legalbbis a balrl
jobbra olvasand rsok esetn
1
.
void gtk_text_buffer_delete_mark(GtkTextBuffer
*
szmemria, GtkTextMark
*
szvegjel); A fggvny segt-
sgvel a szvegjel trlhet o a szvegmemribl. A szvegjel
trlse utn a szvegjel trlt llapotba kerl, tovbb mr nem
hasznlhat.
A szvegjel trlse sorn a fggvny a g_object_unref() fgg-
vny segtsgvel cskkenti a szvegjel hivatkozsszmlljt. Ha
ezt a szmllt nem nveltk a g_object_ref() fggvnnyel, a
gtk_text_buffer_delete_mark() hatsra a hivatkozsszmll
0-ra cskken, a szvegjel megsemmisl, a trolsra szolgl me-
mriaterlet felszabadul.
A szvegmemribl trlt szvegjelek visszalltsra nincs md.
A fggvny els o paramtere a szvegmemrit jelli a memriban,
amelyekhez a szvegjel tartozik, msodik paramtere pedig magt a
szvegjelet.
void gtk_text_buffer_delete_mark_by_name(GtkTextBuffer
*
szmemria, const gchar
*
nv); A fggvny segtsgvel a
szvegjelet nevnek megadsval trlhetjk, azaz hatsa ugyanaz,
mint a gtk_text_buffer_delete_mark() fggvny, a szvegjelre
azonban nevvel nem pedig cmvel hivatkozhatunk.
A fggvny els o paramtere a szvegmemrit jelli a memriban,
amelyben a szvegjel tallhat, msodik paramtere pedig a szveg-
jel nevnek helyt adja meg.
void gtk_text_buffer_get_iter_at_mark(GtkTextBuffer
*
szmemria, GtkTextIter
*
bejr, GtkTextMark
*
szvegjel); A fggvny a szvegjelek s szvegbejrk kzti
talaktst valstja meg, segtsgvel szvegbejrt kszthe-
tnk ami a szvegnek pontosan arra a pontjra mutat, ahol a
szvegbejr tallhat.
A fggvny els o paramtere a szvegmemrit, msodik paramtere
pedig a belltand szvegbejrt jelli a memriban. A msodik
paramternek a memrinak olyan pontjra kell mutatnia, ahov a
fggvny egy szvegjel adatszerkezetet elemeit rhatja.
A fggvny harmadik paramtere a szvegjelet jelli a memriban.
1
A szvegszerkeszt o kperny oelem balrl jobbra olvasand nyelvek kezelsre is kpes,
s ot a szveg irnya szakaszrl-szakaszra vltozhat is.
gtk 2007/10/21 14:22 page 229 #229
229
GtkTextMark
*
gtk_text_buffer_get_mark(GtkTextBuffer
*
szmemria, const gchar
*
nv); A fggvny segtsgvel a
szvegmemrihoz tartoz szvegjelet kereshetjk ki a nevnek
alapjn a memribl.
A fggvny els o paramtere a szvegmemrit, msodik paramtere
a szvegjel nevt jelli a memriban. A fggvny visszatrsi rtke
a szvegjelet jelli a memriban, ha a keress sikeres volt, NULL
rtk, ha nem.
void gtk_text_buffer_move_mark(GtkTextBuffer
*
szmemria,
GtkTextMark
*
szvegjel, const GtkTextIter
*
bejr); A
fggvny segtsgvel meglv o szvegjelet mozgathatunk a szveg
j pontjra.
A fggvny els o paramtere a szvegmemrit, msodik paramtere
az elmozdtand szvegjelet jelli a memriban.
A fggvny harmadik paramternek egy szvegbejrt kell jellnie
a memriban, ami a szvegnek arra a helyre mutat, ahov a sz-
vegjelet t akarjuk helyezni.
void gtk_text_buffer_move_mark_by_name(GtkTextBuffer
*
szmemria, const gchar
*
nv, const GtkTextIter
*
bejr); A fggvny a gtk_text_buffer_move_mark() fgg-
vnyhez hasonlan a szvegjel mozgatsra hasznlhat, azzal
szemben azonban a szvegjelre nevvel, nem pedig cmvel hivat-
kozhatunk.
GtkTextBuffer
*
gtk_text_mark_get_buffer(GtkTextMark
*
szvegjel); A fggvny segtsgvel lekrdezhetjk, hogy a
szvegjel melyik szvegmemrihoz tartozik.
Meggyelhetjk, hogy a szvegjelek kezelsre hasznlatos fggv-
nyek mindegyiknek paramterknt meg kell adnunk a szvegme-
mria cmt is, ez azonban a szvegjel cmnek ismeretben ezzel a
fggvnnyel lekrdezhet o. A szvegjelek kezelse kzben teht ele-
gend o lehet magnak a szvegjel cmnek nyilvntartsa.
A fggvny paramtere a szvegjelet jelli a memriban, visszat-
rsi rtke pedig azt a szvegmemrit, amelyben a szvegjel meg-
tallhat.
A szvegjelek legfontosabb tulajdonsgainak lekrdezsre s megvl-
toztatsra a kvetkez o fggvnyeket hasznlhatjuk.
gboolean gtk_text_mark_get_deleted(GtkTextMark
*
szvegjel); A fggvny segtsgvel lekrdezhetjk, hogy
a szvegjel trlt llapotban van-e. Ne felejtsk azonban
gtk 2007/10/21 14:22 page 230 #230
230
el, hogy ha a szvegjel hivatkozsszmlljt nem nvel-
tk, akkor a gtk_text_buffer_delete_mark() vagy a
gtk_text_buffer_delete_mark_by_name() fggvny hvs-
nak hatsra a szvegjel nem csak egyszer uen trlt llapotba
kerl, hanem meg is semmisl.
A fggvny paramtere a szvegjelet jelli a memriban, visszat-
rsi rtke pedig megadja, hogy a szvegjel trlve van-e.
const gchar
*
gtk_text_mark_get_name(GtkTextMark
*
szvegjel); A fggvny segtsgvel lekrdezhet o a szveg-
jel neve.
A fggvny paramtere a szvegjelet jelli a memriban, a vissza-
trsi rtke pedig a szvegjelhez tartoz nevet jelli a memriban
vagy NULL, ha a szvegjelnek nincs neve.
A visszatrsi rtk ltal jelzett memriaterletet nem szabad m-
dostani.
void gtk_text_mark_set_visible(GtkTextMark
*
szvegjel,
gboolean lthat); A fggvny segtsgvel bellthatjuk, hogy
a szvegjel lthat legyen-e, megjelenjen-e a kperny on. A lthat
szvegjelek helyn egy fgg oleges vonal jelenik meg a kperny on.
Az ilyen vonalak klnsen hasznosak a program belvse sorn.
A fggvny els o paramtere a szvegjelet jelli a memriban, m-
sodik paramternek rtke pedig TRUE vagy FALSE, aszerint, hogy
a szvegjelet meg akarjuk-e jelenteni, illetve el akarjuk-e rejteni.
cfuncgboolean gtk_text_mark_get_visibleGtkTextMark *szvegjel A
fggvny segtsgvel lekrdezhetjk, hogy a szvegjel lthat-e.
A fggvny paramtere a szvegjelet jelli a memriban, visszat-
rsi rtke pedig megadja, hogy a szvegjel helyn a GTK+ program-
knyvtrnak egy fgg oleges vonalat kell-e megjelentenie feltve
persze, hogy a szvegjelhez tartoz szveg ppen ltszik a kper-
ny on.
gboolean gtk_text_view_move_mark_onscreen(GtkTextView
*
szvegszerkeszto, GtkTextMark
*
szvegjel); A fggvny
segtsgvel a szvegjelet a kperny on lthat szvegterletre
mozgathatjuk.
A szvegszerkeszt o kperny oelemet ltalban grget osvokkal moz-
gathatan helyezzk el a kperny on, gy el ofordulhat, hogy a sz-
vegszerkeszt ohz tartoz szvegmemrinak csak egy rsze ltszik
a kperny on. gy termszetesen az is el ofordulhat, hogy a szveg-
memria adott pontjn tallhat szvegjel a szvegszerkeszt o kp-
gtk 2007/10/21 14:22 page 231 #231
231
erny oelem lthat terletn kvl tallhat. Ez a fggvny az ilyen
szvegjeleket a lthat terletre mozgatja.
A fggvny els o paramtere a szvegszerkeszt ot, msodik param-
tere pedig a szvegszerkeszt ohz tartoz szvegmemria egy szveg-
jelt jelli a memriban.
A fggvny visszatrsi rtke TRUE, ha a szvegjelet el kellett moz-
dtani, hogy a szveg lthat terletre kerljn, FALSE, ha a sz-
vegjel a fggvny hvsa el ott is a lthat terleten bell volt.
void gtk_text_view_scroll_mark_onscreen(GtkTextView
*
szvegszerkeszto, GtkTextMark
*
szvegjel);
A fggvny m ukdse nagyon hasonlt a
gtk_text_view_move_mark_onscreen() fggvny m ukds-
vel, de azzal ellenttben nem a szvegjelet, hanem a szveget
mozgatja. Ez a fggvny a szvegszerkeszt o kperny oelem mozga-
tsra szolgl vzszintes s fgg oleges grget osvok segtsgvel
a szveget helyzett gy lltja be, hogy a szvegjellel jellt pont a
kperny on lthat legyen.
A fggvny els o paramtere a szvegszerkeszt ot, msodik param-
tere a szvegjelet jelli a memriban. A visszatrsi rtk megha-
trozza, hogy szksg volt-e a szveg grgetsre.
8.2.4. A cetlik
Amint azt mr emltettk, a cetlik a szvegmemria egyes rszeihez ren-
delhet ok, hogy gy a szveg adott rsznek megjelenst mdostsk. A
cetlik segtsgvel a szveg bet utpust, bet umrett s bet uvltozatt,
a sznt s ms tulajdonsgait is megvltoztathatjuk. Ha viszont a teljes
szvegszerkeszt o kperny oelem bet utpust meg akarjuk vltoztatni, ak-
kor szerencssebb, ha nem cmkt hozunk ltre, hanem a 193. oldalon
tallhat 34. pldnak megfelel o mdon jrunk el.
A cetlik kezelsra hasznlatos legfontosabb fggvnyek a kvetkez ok.
GtkTextTag
*
gtk_text_buffer_create_tag(GtkTextBuffer
*
szmemria, const gchar
*
cetlinv, const gchar
*
nv1,
rtk1, const gchar
*
nv2, rtk2, ..., NULL); A fgg-
vny segtsgvel j cmkt hozhatunk ltre a szvegmemria
szmra. A cetli a szveg megjelensnek tbb tulajdonsgt is be-
folysolhatja. A fggvny paramtereinek s visszatrsi rtknek
jelentse a kvetkez o:
visszatrsi rtk A fggvny visszatrsi rtke a ltrehozott
cmkt jelli a memriban.
gtk 2007/10/21 14:22 page 232 #232
232
Ha a cetli ltrehozsakor nevet is megadtunk, a cetlire ez-
zel a nvvel is hivatkozhatunk, nincs felttlenl szksgnk
a visszatrsi rtk trolsra.
szmemria A szvegmemrit jelli a memriban, amelynek sz-
mra az adott cmkt ltrehozzuk. A cetli ennek a szvegmem-
rinak a szvegrszeihez rendelhet o a ltrehozsa utn.
cetlinv A cetli neve. Ha ennek a paramternek az rtke egy ka-
rakterlncot jell a memriban, a cmkre a ks obbiekben ez-
zel a nvvel is hivatkozhatunk, ami roppant knyelmes hasz-
nlatot tesz lehet ov.
Ha ennek a paramternek az rtke NULL, a cmkre nvvel
nem hivatkozhatunk, csak a visszatrsi rtkknt kapott mu-
tatval.
nv1 Az szveg els o befolysolt tulajdonsgnak neve. A hasznl-
hat tulajdonsgokra a ks obbiekben rszletesen kitrnk.
rtk1 A befolysolt tulajdonsg rtke, amelynek tpusa a tu-
lajdonsg nevt ol fgg. A fggvnynek tetsz oleges szm
nv/rtk prt tadhatunk, gy a cetli a szvegrsz tbb tu-
lajdonsgt is befolysolhatja.
A nv/rtk tulajdonsgprok felsorolsa utn az utols para-
mternek NULL rtk unek kell lennie, gy kell jellnnk a lista
vgt.
void gtk_text_buffer_insert_with_tags(GtkTextBuffer
*
szmemria, GtkTextIter
*
bejr, const gchar
*
szveg,
gint hossz, GtkTextTag
*
cetli1, GtkTextTag
*
cetli2,
..., NULL); A fggvny segtsgvel j szvegrszt helyezhetnk
el a szvegmemriban gy, hogy az j szvegrszre rvnyes
cetliket is meghatrozhatjuk. A fggvny m ukdse s hasznlata
hasonlt a 212. oldalon bemutatott gtk_text_buffer_insert()
fggvny m ukdshez s hasznlathoz, azzal a klnbsggel,
hogy ez a fggvny a cetliket is gyelembe veszi.
A fggvnynek paramterknt megadhatjuk azoknak a cetliknek a
helyt a memriban, amelyeket az j szvegrszre rvnyesteni
szeretnnk. A listt egy NULL rtkkel kell lezrnunk, ami a fgg-
vny utols paramtereknt ll.
void gtk_text_buffer_insert_with_tags_by_name(GtkTextBuffer
*
szmemria, GtkTextIter
*
bejr, const gchar
*
szveg,
gint hossz, const gchar
*
nv1, const gchar nv2, ...,
NULL); A fggvny segtsgvel j szvegrszt helyezhetnk el a
szvegmemriban gy, hogy az j szvegrszre rvnyes cetlik
nevt is megadjuk. A fggvny m ukdse s hasznlata hasonlt
gtk 2007/10/21 14:22 page 233 #233
233
a 212. oldalon bemutatott gtk_text_buffer_insert() fggvny
m ukdshez s hasznlathoz, azzal a klnbsggel, hogy ez a
fggvny a cetliket is gyelembe veszi.
A fggvnynek a paramterknt megadhatjuk azoknak a cetliknek
a nevt, amelyet az j szvegrszre rvnyesteni akarunk. A ne-
vek listjt egy NULL rtkkel kell lezrnunk, ami a fggvny utols
paramtereknt ll.
void gtk_text_buffer_apply_tag(GtkTextBuffer
*
szmemria,
GtkTextTag
*
cetli, const GtkTextIter
*
eleje, const
GtkTextIter
*
vge); A fggvny segtsgvel a szvegmemria
adott szvegrszhez rendelhetnk cmkt.
A fggvny els o paramtere a szvegmemrit, a msodik param-
tere pedig az rvnyesteni kvnt cmkt jelli a memriban. A
harmadik s negyedik paramterek azokat a szvegbejrkat jel-
lik a memriban, amelyek meghatrozzk, hogy a cmkt a szveg
mely rszn kvnjuk alkalmazni.
void gtk_text_buffer_apply_tag_by_name(GtkTextBuffer
*
szmemria, const gchar
*
nv, const GtkTextIter
*
eleje, const GtkTextIter
*
vge); A fggvny segtsg-
vel a szvegmemria adott szvegrszhez rendelhetnk cmkt,
mgpedig a cmkre nevvel hivatkozva.
A fggvny els o paramtere a szvegmemrit jelli a memriban.
A msodik paramter az rvnyesteni kvnt cetli nevt jelli a me-
mriban. A harmadik s negyedik paramterek azokat a szvegbe-
jrkat jellik a memriban, amelyek meghatrozzk, hogy a cm-
kt a szveg mely rszn kvnjuk alkalmazni.
void gtk_text_buffer_remove_tag(GtkTextBuffer
*
szmemria,
GtkTextTag
*
cetli, const GtkTextIter
*
eleje, const
GtkTextIter
*
vge); A fggvny segtsgvel a szvegmemria
adott szvegrszn a cetli hatst megsz untethetjk.
A fggvny paramtereinek rtelmezse megegyezik a
gtk_text_buffer_apply_tag() fggvny paramtereinek r-
telmezsvel.
void gtk_text_buffer_remove_tag_by_name(GtkTextBuffer
*
szmemria, const gchar
*
nv, const GtkTextIter
*
eleje, const GtkTextIter
*
vge); A fggvny segtsgvel a
szvegmemria adott szvegrszn a cetli hatst megsz untethet-
jk, mgpedig gy, hogy a cmkre a nevvel hivatkozunk.
gtk 2007/10/21 14:22 page 234 #234
234
A fggvny paramtereinek rtelmezse megegyezik a
gtk_text_buffer_apply_tag_by_name() fggvny paramte-
reinek rtelmezsvel.
void gtk_text_buffer_remove_all_tags(GtkTextBuffer
*
szmemria, const GtkTextIter
*
eleje, const
GtkTextIter
*
vge); A fggvny segtsgvel a szvegmem-
ria adott szvegrszn az sszes cetli hatst megsz untethetjk,
hogy a szveg a szvegszerkeszt o alaprtelmezett bet utpusval
jelenjen meg.
A fggvny els o paramtere a szvegmemrit jelli a memriban,
msodik s harmadik paramtere pedig azokat szvegbejrkat je-
lli a memriban, amelyek a mdostani kvnt szvegrszlet elejt
s vgt jellik.
Miel ott rtrnnk a cetlik ltal befolysolt szvegtulajdonsgok nev-
nek s lehetsges rtkeinek rszletes ismertetsre, egy pldaprogram
segtsgvel bemutatjuk a leggyakrabban hasznlt szvegformz eszk-
zket.
43. plda. A kvetkez o programrszlet bemutatja a szerkeszt o ltreho-
zsakor meghvott fggvnyt, ami a szvegszerkeszt oben megjelen o sz-
vegmemria szmra ltrehoz nhny cmkt, majd feltlti a szvegme-
mrit olyan tartalommal, ami bemutatja a cetlik hatst. A program
hatsra megjelen o kperny oelemet a 210. oldalon tallhat 8.4. brn
lthatjuk.
1 void
2 on_textview_realize(GtkWidget
*
widget,
3 gpointer user_data)
4 {
5 GtkTextBuffer
*
text_buffer;
6 GtkTextIter iter;
7
8 text_buffer = gtk_text_view_get_buffer(
9 GTK_TEXT_VIEW(widget));
10
11 /
*
12
*
El otrszneket meghatroz cetlik.
13
*
/
14 gtk_text_buffer_create_tag(text_buffer, "blue",
15 "foreground", "blue", NULL);
16 gtk_text_buffer_create_tag(text_buffer, "red",
17 "foreground", "red", NULL);
18 gtk_text_buffer_create_tag(text_buffer, "yellowish",
gtk 2007/10/21 14:22 page 235 #235
235
19 "foreground", "#ffaa44", NULL);
20 /
*
21
*
Httrszneket meghatroz cetlik.
22
*
/
23 gtk_text_buffer_create_tag(text_buffer, "blue-back",
24 "foreground", "white",
25 "background", "blue", NULL);
26 gtk_text_buffer_create_tag(text_buffer, "red-back",
27 "foreground", "white",
28 "background", "red", NULL);
29 gtk_text_buffer_create_tag(text_buffer,
30 "yellowish-back",
31 "foreground", "white",
32 "background", "#ffaa44", NULL);
33 /
*
34
*
Betucsaldokat meghatroz cetlik.
35
*
/
36 gtk_text_buffer_create_tag(text_buffer,
37 "family-sans", "family", "Sans", NULL);
38 gtk_text_buffer_create_tag(text_buffer,
39 "family-helv", "family", "Helvetica", NULL);
40 gtk_text_buffer_create_tag(text_buffer,
41 "family-times", "family", "Times", NULL);
42 gtk_text_buffer_create_tag(text_buffer,
43 "family-mono", "family", "Monospace", NULL);
44 /
*
45
*
Pontos betutpust meghatroz cetlik.
46
*
/
47 gtk_text_buffer_create_tag(text_buffer, "complex",
48 "font", "Times Italic 16", NULL);
49 /
*
50
*
Alhzsokat meghatroz cetlik.
51
*
/
52 gtk_text_buffer_create_tag(text_buffer,
53 "underline-single",
54 "underline", PANGO_UNDERLINE_SINGLE, NULL);
55 gtk_text_buffer_create_tag(text_buffer,
56 "underline-double",
57 "underline", PANGO_UNDERLINE_DOUBLE, NULL);
58 gtk_text_buffer_create_tag(text_buffer,
59 "underline-low",
60 "underline", PANGO_UNDERLINE_LOW, NULL);
61 gtk_text_buffer_create_tag(text_buffer,
62 "underline-error",
gtk 2007/10/21 14:22 page 236 #236
236
63 "underline", PANGO_UNDERLINE_ERROR, NULL);
64
65 /
*
66
*
A cetlik hatst bemutat szvegrszek elhelyezse.
67
*
/
68 gtk_text_buffer_get_end_iter(text_buffer, &iter);
69
70 gtk_text_buffer_insert_with_tags_by_name(text_buffer,
71 &iter, "Kk betuszn, ", -1,
72 "blue", NULL);
73 gtk_text_buffer_insert_with_tags_by_name(text_buffer,
74 &iter, "vrs betuszn, ", -1,
75 "red", NULL);
76 gtk_text_buffer_insert_with_tags_by_name(text_buffer,
77 &iter, "srgs betuszn...\n", -1,
78 "yellowish", NULL);
79
80 gtk_text_buffer_insert_with_tags_by_name(text_buffer,
81 &iter, "Kk httrszn, ", -1,
82 "blue-back", NULL);
83 gtk_text_buffer_insert_with_tags_by_name(text_buffer,
84 &iter, "vrs httrszn, ", -1,
85 "red-back", NULL);
86 gtk_text_buffer_insert_with_tags_by_name(text_buffer,
87 &iter, "srgs httrszn...\n", -1,
88 "yellowish-back", NULL);
89
90 gtk_text_buffer_insert_with_tags_by_name(text_buffer,
91 &iter, "Kk rgpbetuk.\n", -1,
92 "blue", "family-mono", NULL);
93
94 gtk_text_buffer_insert_with_tags_by_name(text_buffer,
95 &iter, "El ort betutpus.\n", -1,
96 "complex", NULL);
97
98 gtk_text_buffer_insert_with_tags_by_name(text_buffer,
99 &iter, "Egyszeres alhzs, ", -1,
100 "underline-single", NULL);
101 gtk_text_buffer_insert_with_tags_by_name(text_buffer,
102 &iter, "dupla, ", -1,
103 "underline-double", NULL);
104 gtk_text_buffer_insert_with_tags_by_name(text_buffer,
105 &iter, "alacsony, ", -1,
106 "underline-low", NULL);
gtk 2007/10/21 14:22 page 237 #237
237
107 gtk_text_buffer_insert_with_tags_by_name(text_buffer,
108 &iter, "hibajelz o.\n", -1,
109 "underline-error", NULL);
110 }
A fggvny a 1463. sorok kzt hozza ltre a megjelentst befolysol
cetliket, a 70109. sorok kzt pedig elhelyezi a szvegmemriban azokat
a szvegrszeket, amelyek bemutatjk a cetlik hatst.
A kvetkez o lista a cetlik lehetsges tulajdonsgait sorolja fel. A lis-
tban els o helyen a tulajdonsg nevt, msodik helyen a tulajdon-
sg tpust olvashatjuk. A nv s a tulajdonsgnak megfelel o r-
tk a gtk_text_buffer_create_tag() fggvny segtsgvel a cetli
ltrehozsakor megadhat, vagy ks obb a cetli tulajdonsgaknt a
g_object_set() fggvnnyel bellthat, illetve a g_object_get()
fggvnnyel lekrdezhet o.
Meggyelhet o, hogy az egyes tulajdonsgok mellett mindig megta-
llhat a tulajdonsg rvnyessgt meghatroz logikai rtk is. A
"background" bven pldul bellthatjuk a httrsznt, de mellette
megtallhat a "background-set" is, amivel ki-, illetve bekapcsolhat-
juk a httrszn tulajdonsg gyelembe vtelt az adott cetli esetben.
Az ilyen logikai rtket hordoz tulajdonsgok alaprtelmezett rtke a
hamis, ami automatikusan igazra vltozik, amint belltjuk a hozzjuk
tartoz tulajdonsgot.
"background", gchararray A szveg httrsznnek neve karakterlnc-
knt megadva. A nv megadsakor hasznlhatjuk a HTML nyelv-
ben szoksos, 16-os szmrendszert hasznlt formt is (pldul
#13acf0).
Az alaprtelmezett rtk a NULL, azaz a httrszn a szvegszer-
keszt o kperny oelem httrsznnek megfelel o.
"background-full-height", gboolean Logikai rtk, ami megadja,
hogy a szveg htternek szne a teljes sormagassgban
megjelenjen-e, vagy csak a karakter magassgig terjedjen a ha-
tsa.
Az alaprtelmezett rtk a FALSE.
"background-full-height-set", gboolean Logikai rtk, amely meg-
adja, hogy az el oz o tulajdonsg kifejtse-e a hatst.
Az alaprtelmezett rtk jelzi, hogy az el oz o tulajdonsgot
belltottuk-e.
"background-gdk", GdkColor A szveg htternek szne GdkColor t-
pus segtsgvel megadva.
gtk 2007/10/21 14:22 page 238 #238
238
"background-set", gboolean Logikai rtk, ami megadja, hogy a ht-
trszn bellts kifejtse-e a hatst.
Az alaprtelmezett rtk jelzi, hogy a httrsznt belltottuk-e.
"background-stipple", GdkPixmap A szveg kperny ore rajzolsakor
a httr mintja, a szveg mgtt megjelen o kp.
Alaprtelmezs szerint a httr egyszn u.
"background-stipple-set", gboolean Logikai rtk, ami megadja,
hogy a szveg rajzolsakor a httr mintjt gyelembe kell-e venni.
Alaprtelmezs szerint ez a tulajdonsg megadja, hogy a httr min-
tt megadtuk-e.
"direction", GtkTextDirection A szveg rsnak s olvassnak
irnya, amelynek lehetsges rtkei a kvetkez ok:
GTK_TEXT_DIR_NONE Ismeretlen irny, amellyel esetleg jelezhetjk,
hogy a szveget jobbrl balra s balrl jobbra sem szerencss
elolvasni.
GTK_TEXT_DIR_LTR A szveg rsa s olvassa balrl jobbra trt-
nik.
GTK_TEXT_DIR_RTL Jobbrl balra halad szveg.
Az alaprtelmezett rtk a GTK_TEXT_DIR_NONE.
"editable", gboolean Logikai rtk, amely megadja, hogy a szvegnek
ez a rsze mdosthat-e.
Az alaprtelmezett rtk a TRUE.
"editable-set", gboolean Logikai rtk, ami megadja, hogy az el oz o
tulajdonsgot gyelembe kell-e venni.
Alaprtelmezett esetben ez a tulajdonsg megadja, hogy az
"editable" tulajdonsgot belltottuk-e.
"family", gchararray A bet ucsald neve karakterlncknt megadva.
Hasznlhatjuk pldul a Sans, Helvetica, Times, Monospace neve-
ket.
A tulajdonsg alaprtelmezett rtke a NULL.
"family-set", gboolean Logikai rtk, ami megadja, hogy a bet ucsa-
ld nevt gyelembe kell-e venni.
Az alaprtelmezett rtk megadja, hogy a bet ucsaldot megadtuk-e.
gtk 2007/10/21 14:22 page 239 #239
239
"font", gchararray A hasznland bet utpus neve pldul Sans Ita-
lic 12 , ahogyan a bet utpus-ablak (lsd a 191. oldalon) lekrde-
zsekor azt megkaphatjuk.
Az alaprtelmezett rtk a NULL.
"font-desc", PangoFontDescription A bet utpus a Pango program-
knyvtr adatszerkezetnek segtsgvel megadva.
"foreground", gchararray A szveg el otrszne, azaz a bet uk szne ka-
rakterlncknt, a nvvel megadva.
"foreground-gdk", GdkColor A szveg szne GdkColor tpus segtsg-
vel megadva.
"foreground-set", gboolean Logikai rtk, ami megadja, hogy a sz-
veg sznt gyelembe kell-e venni.
Az alaprtelmezett rtk megadja, hogy a bet uk sznt megadtuk-e.
"foreground-stipple", GdkPixmap A bet uk rajzolsakor maszkknt
hasznland kp.
"foreground-stipple-set", gboolean Logikai rtk, ami megadja,
hogy a bet uk rajzolsakor a maszkot hasznlnunk kell-e.
Az alaprtelmezett rtk megadja, hogy az el oz o tulajdonsgot
belltottuk-e.
"indent", gint A behzs mrtke, ami megadja, hogy a bekezds
a szvegmemria sora els o sort hny kppontnyi rtkkel kell
beljebb kezdeni, mint a tbbi sort. Ez a tulajdonsg lehet negatv is,
ami jelzi, hogy az els o sort a lapszlhez kzelebb kell kezdeni.
A behzst a szvegszerkeszt o kperny oelem tulajdonsgai kzt a
Glade programban is be lehet lltani, gy, ha minden bekezdsnl
azonos mret u behzst akarunk hasznlni, akkor esetleg ott rde-
mes a belltst elvgezni.
Az alaprtelmezett rtk 0.
"indent-set", gboolean Logikai rtk, ami meghatrozza, hogy a be-
lltott behzst gyelembe kell-e venni.
Az alaprtelmezett rtk megadja, hogy a behzst belltottuk-e.
"invisible", gboolean Logikai rtk, ha igaz, az adott szvegrsz rej-
tett, nem ltszik a kperny on.
gtk 2007/10/21 14:22 page 240 #240
240
"invisible-set", gboolean Logikai rtk, ami meghatrozza, hogy az
el oz o tulajdonsgot gyelembe kell-e venni.
Alaprtelmezett llapotban ez a tulajdonsg megadja, hogy a szveg
lthatsgt megadtuk-e.
"justification", GtkJustification A szveg rendezse, ami a k-
vetkez ok egyike lehet:
GTK_JUSTIFY_LEFT A szveg balra rendezett.
GTK_JUSTIFY_RIGHT A szveg jobbra rendezett.
GTK_JUSTIFY_CENTER A szveg kzpre rendezett.
GTK_JUSTIFY_FILL A szveg sorkizrt.
A rendezst a szvegszerkeszt o kperny oelem tulajdonsgaknt a
Glade programban is bellthatjuk.
Az alaprtelmezett rtk a GTK_JUSTIFY_LEFT.
"justification-set", gboolean Logikai rtk, ami megadja, hogy a
belltott rendezst gyelembe kell-e venni.
Az alaprtelmezett rtk megadja, hogy a rendezst belltottuk-e.
"language", gchararray A szveg nyelvnek szabvnyos kdja karak-
terlncknt.
Az alaprtelmezett rtk a NULL.
"language-set", gboolean Logikai rtk, ami megadja, hogy a szveg
nyelvt gyelembe kell-e venni.
Az alaprtelmezett rtk megadja, hogy a szveg nyelvt gyelembe
vettk-e.
"left-margin", gint A bal oldali marg az resen hagyand kppon-
tok szmval megadva. Ez a tulajdonsg nem lehet negatv. Tud-
nunk kell, hogy a bal oldali marg a szvegszerkeszt o kperny oelem
tulajdonsgaknt is bellthat a Glade programmal, gy ha minde-
ntt azonos bal margt akarunk hasznlni, szerencssebb ott elv-
gezni a belltst.
Az alaprtelmezett rtk a 0.
"left-margin-set", gboolean Logikai rtk, ami meghatrozza, hogy
a bal oldali marg belltst gyelembe kell-e venni.
Az alaprtelmezett rtk megadja, hogy a margt belltottuk-e.
"name", gchararray A cetli neve vagy NULL, ha a cetlit nv nlkl hoz-
tuk ltre.
gtk 2007/10/21 14:22 page 241 #241
241
"paragraph-background", gchararray A bekezdshez a szvegme-
mria sorhoz tartoz httr sznnek neve.
Az alaprtelmezett rtk a NULL.
"paragraph-background-gdk", GdkColor A bekezdshez tartoz ht-
trszn GdkColor tpus adatszerkezetknt.
"paragraph-background-set", gboolean Logikai rtk, ami megadja,
hogy a bekezdshez tartoz httrsznt gyelembe kell-e venni.
Az alaprtelmezett rtk megadja, hogy a bekezds htternek sz-
nt belltottuk-e.
"pixels-above-lines", gint Szm jelleg u tulajdonsg, aminek a se-
gtsgvel megadhatjuk, hogy a szveg bekezdsei a szvegmem-
ria sorai felett hny kppontnyi res helyet kell kihagyni. Ennek
a tulajdonsgnak az rtke nem lehet negatv.
A szveg bekezdsei felett kihagyand hely mrett a szvegszer-
keszt o tulajdonsgai kzt is bellthatjuk a Glade segtsgvel, gy
ha minden bekezds felett ugyanakkora helyet akarunk kihagyni, a
bellts ott is elvgezhet o.
Az alaprtelmezett rtk 0.
"pixels-above-lines-set", gboolean Logikai rtk, ami meghat-
rozza, hogy az el oz o tulajdonsgot gyelembe kell-e venni.
Az alaprtelmezett rtk megadja, hogy a bekezdsek felett kiha-
gyand terlet mrett megadtuk-e.
"pixels-below-lines", gint Szm jelleg u tulajdonsg, ami megadja,
hogy a szveg bekezdsei a szvegmemria sorai alatt hny kp-
pontnyi helyet kell kihagyni. Ez a tulajdonsg a bekezdsek felett
kihagyand hely mrethez hasonlan nem lehet negatv.
A bekezdsek alatt kihagyand terlet magassgt a szvegszer-
keszt o kperny oelem tulajdonsgai kzt a Glade programban is be
lehet lltani.
Az alaprtelmezett rtk 0.
"pixels-below-lines-set", gboolean Logikai rtk, ami megadja,
hogy az el oz o tulajdonsgot gyelembe kell-e venni.
Az alaprtelmezett rtk megadja, hogy a bekezds alatt kihagyand
res hely mrett megadtuk-e.
"pixels-inside-wrap", gint Szm jelleg u rtk, ami megadja, hogy a
szvegszerkeszt o kperny oelemsorai kzt hny kppont magassg
gtk 2007/10/21 14:22 page 242 #242
242
res helyet kell kihagynunk, mekkora legyen a sorkz. E tulajdon-
sg nem lehet negatv rtk u.
A sorok kzt kihagyand res hely magassgt a szvegszerkeszt o
kperny oelemek tulajdonsgai kzt is megtallhat s a Glade prog-
rammal be is llthatjuk. Ha a szveg minden rszre rvnyes azo-
nos rtket akarunk hasznlni, akkor a belltst rdemes lehet ott
elvgezni.
Az alaprtelmezett rtk a 0.
"pixels-inside-wrap-set", gboolean Logikai rtk, ami megadja,
hogy a sortv belltst gyelembe kell-e venni.
Az alaprtelmezett rtk megadja, hogy a sortvot belltottuk-e.
"right-margin", gint Szm jelleg u tulajdonsg, ami megadja a jobb
oldalon kihagyand res terlet szlessgt a jobb margt kp-
pontban mrve. Ez a tulajdonsg nem lehet negatv.
A Glade segtsgvel a szvegszerkeszt o kperny oelem hasonl tu-
lajdonsga bellthat.
Az alaprtelmezett rtk 0.
"right-margin-set", gboolean Logikai rtk, ami megadja, hogy a
jobb oldali marg mretnek belltst gyelembe kell-e venni.
Az alaprtelmezett rtk megadja, hogy a jobb margt belltottuk-e.
"rise", gint E szm jelleg u jellemz o segtsgvel bellthatjuk a fels o
index mrtkt, vagyis azt, hogy a szveg bet uinek alapvonala hny
kppontnyival legyen magasabban a normlis szveg alapvonal-
nl.
E tulajdonsg a Pango programknyvtr bels o mrtkegysgt hasz-
nlja, amelyet meg kell a PANGO_SCALE rtkvel, hogy a kppontok
szmt kapjuk.
Az alaprtelmezett rtk 0.
"rise-set", gboolean Logikai rtk, ami megadja, hogy az el oz o tulaj-
donsgot gyelembe kell-e vennnk.
Az alaprtelmezett rtk megadja, hogy a fels o index mrtkt
belltottuk-e.
"scale", gdouble Szm jelleg u rtk, ami megadja, hogy a bet umre-
tet milyen mrtkben kell nvelnnk, illetve cskkentennk. Ez az
rtk relatv, a tma ltal belltott bet umretet mdostja, gy az
1, 2 pldul azt jelenti, hogy a szveget az alaprtelmezett mretnl
1, 2-szeresre nvelt bet umrettel kell rnunk.
gtk 2007/10/21 14:22 page 243 #243
243
A Pango programknyvtr nhny szm jelleg u llandt
hoz ltre a knnyebb hasznlat s az egysges stlus r-
dekben. Ezek az llandk nvekv o sorrendben a kvetke-
z ok: PANGO_SCALE_XX_SMALL, PANGO_SCALE_X_SMALL, PAN-
GO_SCALE_SMALL, PANGO_SCALE_MEDIUM, PANGO_SCALE_LARGE,
PANGO_SCALE_X_LARGE, PANGO_SCALE_XX_LARGE.
Az alaprtelmezett rtk 1, ami nem mdostja a bet umretet.
"scale-set", gboolean Logikai rtk, ami megadja, hogy az el oz o tu-
lajdonsgot gyelembe kell-e venni.
Az alaprtelmezett rtk megadja, hogy a bet umretet mdost r-
tket megadtuk-e.
"size", gint Szm jelleg u rtk, ami megadja, hogy hny kppont
nagysg bet uket kell hasznlnunk. A "scale" tulajdonsggal el-
lenttben ez a tulajdonsg abszolt, nem az alaprtelmezett bet u-
mrethez kpest hatrozza meg a cetli ltal el ort bet umretet.
Ez a tulajdonsg a Pango programknyvtr bels o mrtkegysg-
ben rtend o, a PANGO_SCALE llandval megszorozva alakthatjuk a
kppontok szmt megad rtkre.
Az alaprtelmezett rtk 0, de alaprtelmezett esetben amikor a
tulajdonsgot nem lltottuk be e tulajdonsg sem mdostja a
szveg megjelentst.
"size-points", gdouble A hasznland bet umretet pont mrtkegy-
sgben megad szm jelleg u rtk.
Az alaprtelmezett rtk 0.
"size-set", gboolean Logikai rtk, ami megadja, hogy a bet umret
abszolt rtknek belltst gyelembe kell-e venni.
Alaprtelmezett esetben meghatrozza, hogy a bet umret abszolt
rtkt meghatroztuk-e.
"stretch", PangoStretch A bet uk vzszintes nyjtst meghatroz
tulajdonsg. A Pango programknyvtr a kvetkez o lland-
kat hozza ltre a vzszintes nyjts rtknek meghatrozsra:
PANGO_STRETCH_ULTRA_CONDENSED, PANGO_STRETCH_EXTRA_CON-
DENSED, PANGO_STRETCH_CONDENSED, PANGO_STRETCH_SEMI_CON-
DENSED, PANGO_STRETCH_NORMAL, PANGO_STRETCH_SEMI_EXPAN-
DED, PANGO_STRETCH_EXPANDED, PANGO_STRETCH_EXTRA_EXPAN-
DED, PANGO_STRETCH_ULTRA_EXPANDED.
"stretch-set", gboolean Logikai rtk, ami megadja, hogy a vzszin-
tes nyjts rtkt gyelembe kell-e venni.
gtk 2007/10/21 14:22 page 244 #244
244
Alaprtelmezett esetben megadja, hogy a vzszintes nyjtst
belltottuk-e.
"strikethrough", gboolean Logikai rtk, ami megadja, hogy a szve-
get t kell-e hzni egy vzszintes vonallal.
Az alaprtelmezett rtk termszetesen FALSE.
"strikethrough-set", gboolean Logikai rtk, ami megadja, hogy a
szveg kihzst gyelembe kell-e venni.
Alaprtelmezett esetben megadja, hogy a kihzst belltottuk-e.
"style", PangoStyle A bet ustlust megad tulajdonsg. A Pango prog-
ramknyvtr a kvetkez o PangoStyle tpus llandkat hozza
ltre a bet ustlus meghatrozsra: PANGO_STYLE_NORMAL, PAN-
GO_STYLE_OBLIQUE, PANGO_STYLE_ITALIC.
Az alaprtelmezett rtk a PANGO_STYLE_NORMAL.
"style-set", gboolean Logikai rtk, ami megadja, hogy a bet ustlust
gyelembe kell-e venni.
Alaprtelmezett esetben megadja, hogy a bet ustlust belltottuk-e.
"tabs", PangoTabArray A tabultorpozcikat bellt tulajdonsg.
A Pango programknyvtr a tabultorpozcik belltsra a
PangoTabArray adatszerkezetben trolja. Ilyen adatszerkezetet a
legknnyebben a pango_tab_array_new_with_positions() fgg-
vny segtsgvel hozhatunk ltre.
"tabs-set", gboolean Logikai rtk, ami megadja, hogy a "tabs" tu-
lajdonsg alapjn megadott tabultorpozcikat gyelembe kell-e
venni.
Alaprtelmezett esetben megadja, hogy a tabultorpozcikat
belltottuk-e.
"underline", PangoUnderline A szveg alhzst meghatroz tulaj-
donsg. A Pango programknyvtr a kvetkez o PangoUnderline
tpus llandkat hozza ltre az alhzs belltsra: PAN-
GO_UNDERLINE_NONE, PANGO_UNDERLINE_SINGLE, PANGO_UNDER-
LINE_DOUBLE, PANGO_UNDERLINE_LOW, PANGO_UNDERLINE_ERROR.
"underline-set", gboolean Logikai rtk, ami megadja, hogy a bell-
tott alhzst gyelembe kell-e venni.
Alaprtelmezett esetben megadja, hogy az alhzs tpust
belltottuk-e.
gtk 2007/10/21 14:22 page 245 #245
245
"variant", PangoVariant A kiskapitlis bet uvltozat belltsra
szolgl tulajdonsg. A Pango programknyvtr a kvetkez o
PangoVariant tpus llandk segtsgvel teszi lehet ov a
kiskapitlis vltozat belltst: PANGO_VARIANT_NORMAL, PAN-
GO_VARIANT_SMALL_CAPS.
"variant-set", gboolean Logikai rtk, ami megadja, hogy az el oz o tu-
lajdonsgot gyelembe kell-e venni.
Alaprtelmezett esetben megadja, hogy a kiskapitlis vltozatot
meghatroz "variant" tulajdonsgot belltottuk-e.
"weight", gint Szm jelleg u rtk a bet uk vastagsgnak meg-
hatrozsra. Minl magasabb rtket kpvisel ez a tulaj-
donsg, a bet uk annl robusztusabbak lesznek. A Pango
programknyvtr a kvetkez o szm jelleg u llandkat hozza
ltre a bet uk vastagsgnak meghatrozsra (a nvekv o
vastagsg sorrendjben): PANGO_WEIGHT_ULTRALIGHT, PAN-
GO_WEIGHT_LIGHT, PANGO_WEIGHT_NORMAL, PANGO_WEIGHT_SEMI-
BOLD, PANGO_WEIGHT_BOLD, PANGO_WEIGHT_ULTRABOLD, PAN-
GO_WEIGHT_HEAVY.
Az alaprtelmezett rtk a PANGO_WEIGHT_NORMAL ami 400-as szm-
rtknek felel meg.
"weight-set", gboolean Logikai rtk, ami meghatrozza, hogy az
el oz o tulajdonsgot gyelembe kell-e venni.
Alaprtelmezett esetben megadja, hogy a bet uvastagsgot meghat-
roz tulajdonsgot belltottuk-e.
"wrap-mode", GtkWrapMode A szveg trdelst meghatroz tulajdon-
sg. A trdels mdja meghatrozza, hogy a szvegmemria
(GtkTextBuffer) sorai milyen mdon jelenjenek meg a kperny on,
a szvegszerkeszt o kperny oelemben (GtkTextView).
A GTK programknyvtr a kvetkez o GtkWrapMode tpus lland-
kat hozza ltre a trdels meghatrozsra:
GTK_WRAP_NONE A trdels tiltsa. Ha ezt az zemmdot hasznl-
juk, a szvegmemria sorai a kperny on egy sorban jelennek
meg, a szvegszerkeszt o kperny oelem olyan szless vlik,
hogy a leghosszabb sorok is kifrjenek. A Glade a szvegszer-
keszt o kperny oelemhez vzszintes grget osvot is ltrehoz, gy
segtve a hossz sorok megjelentst.
GTK_WRAP_CHAR Trdels karakterhatron. Ilyen zemmdban a
szvegszerkeszt o a szvegmemria sorait a megjelentshez tet-
sz oleges ponton trdelheti, akr sz belsejben is. A trdels
gtk 2007/10/21 14:22 page 246 #246
246
csak a megjelentst rinti azaz a szvegszerkeszt o nem he-
lyez el jsor karaktereket a szvegben azonban gy is megne-
heztheti az olvasst, hogy a szavak eldarabolva jelennek meg.
GTK_WRAP_WORD A trdels a szhatrok gyelembe vtelvel. Eb-
ben az zemmdban a szvegszerkeszt o a szvegmemria tar-
talmt gy jelenti meg, hogy szksg esetn a szhjatrokon
j sort kezd. A szveg gy olvashat marad, hiszen a szavak
nem daraboldnak, sztredkek nem kerlnek t a kvetkez o
sorba.
Ebben az zemmdban a szvegmemria sorai a kperny on ne-
kezdsekhez hasonlan viselkednek, a szvegszerkeszt o szles-
sgnek megfelel oen esetleg tbb sorban jelennek meg. Innen
ered az, hogy a GTK programknyvtr dokumentcijban a
sor s a bekezds fogalma kiss egybemosdik.
GTK_WRAP_WORD_CHAR Ebben a mdban a trdels szhatron, ha
szksges szavak belsejben trtnik.
A trdels mdjt a Glade program segtsgvel az egsz szvegre
bellthatjuk.
Az alaprtelmezett rtk a GTK_WRAP_NONE.
"wrap-mode-set", gboolean Logikai rtk, ami megadja, hogy az el oz o
tulajdonsgot gyelembe kell-e venni.
Alaprtelmezett esetben megadja, hogy az adott cetli szmra a sz-
veg trdelst belltottuk-e.
8.2.5. A kurzor s a kijellt szveg
A GtkTextView kperny oelem a megjelentett szvegmemriban mindig
ltrehoz kt GtkTextMark szvegjelet, amelyek fontosak lehetnek a prog-
ramoz szmra is. A insert nev u szvegjel a szvegkurzor helyt jelli
ha nincsen kijellt szveg, s a kijellt szveg elejt jelli, ha a felhasznl
az egrrel vagy a billenty uzettel kijell egy szvegrszt. Ez utbbi esetben
a selection_bound nev u szvegjel a kijellt szveg vgre mutat.
A szvegkurzor s a kijellt szveg kezelsben hasznunkra lehetnek a
kvetkez o fggvnyek:
GtkTextMark
*
gtk_text_buffer_get_insert(GtkTextBuffer
*
szvegmemria);
Ez a fggvny a szvegkurzor helyt jelz o szvegjel lekr-
dezsre hasznlhat. Ugyanezt a hatst rhetjk el, ha a
gtk_text_buffer_get_mark() fggvny segtsgvel az insert
nev u szvegjelet krdezzk le.
gtk 2007/10/21 14:22 page 247 #247
247
A fggvny paramtere a szvegjelet jelli a memriban, amelynek
a szvegkurzort jell o szvegjelt szeretnnk megkeresni a memri-
ban. A fggvny visszatrsi rtke a szvegjelet jelli a memri-
ban.
GtkTextMark
*
gtk_text_buffer_get_selection_bound(GtkTextBuffer
*
szvegmemria);
Ez a fggvny az el oz o fggvnyhez hasonlan hasznlhat, a kije-
llt szveg vgt jelz o szvegjel megkeressre hasznlhat.
gboolean gtk_text_buffer_get_has_selection(GtkTextBuffer
*
szvegmemria);
A fggvny segtsgvel megllapthatjuk, hogy a szvegmemri-
ban van-e a felhasznl ltal kijellt szveg.
A fggvny paramtere a szvegmemrit jelli, visszatrsi rtke
pedig TRUE, ha a szvegben van kijellt rsz, illetve hamis, ha nincs.
gboolean gtk_text_buffer_get_selection_bounds(GtkTextBuffer
*
szvegmemria, GtkTextIter
*
eleje, GtkTextIter
*
vge);
A fggvny segtsgvel kt szvegbejrt llthatunk be, hogy azok
a kijellt szveg elejre s vgre mutassanak.
A fggvny els o paramtere a szvegmemrit jelli a memriban,
msodik paramtere azt a terletet, ahol a kijellt szveg elejre
lltand szvegbejrt elhelyeztk, harmadik paramtere pedig r-
telemszer uen azt a memriterletet, ahov a fggvny a kijellt
szveg vgre mutat szvegmemrit el fogja helyezni.
A fggvny visszatrsi rtke igaz logikai rtk, ha legalbb egy
karakternyi kijellt szveg van a szvegmemriban.
void gtk_text_buffer_select_range(GtkTextBuffer
*
szvegmemria, const GtkTextIter
*
eleje, const
GtkTextIter
*
vge);
E fggvny segtsgvel a szvegmemria adott rszt kijellhet-
nnk, ppen gy, mintha a kijellst a felhasznl vgezte volna
el az egrrel vagy a billenty uzettel.
A fggvny els o paramtere a szvegmemrit, msodik paramtere
a kijellend o szveg elejt jelz o bejrt, harmadik paramtere pedig
a kijellend o szveg vgt jelz o bejrt jelzi a memriban.
A szvegmemria kezelse sorn hasznos lehet a kvetkez o jelzsek
ismerete.
gtk 2007/10/21 14:22 page 248 #248
248
changed A szvegmemria akkor kldi ezt a jelzst, amikor a szvegme-
mriban tallhat szveg megvltozik.
A jelzs visszahvott fggvnynek tpusa a kvetkez o:
void nv(GtkTextBuffer
*
szvegmemria, gpointer
adat); A fggvny els o paramtere a szvegmemrit jelzi a
memriban, amelyik a jelzst kldte. A fggvny msodik
paramtere egy mutat, amelyet a fggvny nyilvntartsba
vtelekor a programoz adhat meg.
mark-set A szvegmemria akkor kldi ezt a jelzst, amikor a szveg-
memrihoz tartoz valamelyik szvegjelet a program elmozdtja a
helyr ol. Akkor, ha a szvegjel az eredeti helyn marad, de a szveg
megvltoztatsa j szvegrsz beszrsa vagy szvegrszlet tr-
lse miatt a szvegjel a szveggel egytt elmozdul, ez a jelzs nem
jelenik meg.
A jelzshez visszahvott fggvnyknt a kvetkez o fggvnytpus
kapcsolhat:
void nv(GtkTextBuffer
*
szvegmemria, GtkTextIter
*
szvegbejr, GtkTextMark
*
szvegjel, gpointer
adat);
Ilyen visszahvott fggvnyt kszthetnk a szvegjelek mozg-
snak meggyelsre.
A fggvny els o paramtere a szvegmemrit, msodik para-
mtere a szvegjel j helyt jelz o szvegbejrt jelli a memri-
ban. A fggvny harmadik paramtere a szvegjelet jelli a me-
mriban. A GTK programknyvtr a alaprtelmezs szerint a
szvegjel mozgatsa utn hvja a visszahvott fggvnyt, gy az
a fggvny hvsakor mr a megfelel o helyet jelli a szvegben.
A fggvny utols paramtere a programoz ltal a visszahvott
fggvny nyilvntartsba vtelekor megadott mutat.
44. plda. El ofordulhat, hogy szeretnnk visszahvott fggvnyt ksz-
teni, amit a GTK programknyvtr akkor hv meg, ha a felhasznl a sz-
vegkurzort elmozdtja a helyr ol. Ezt a feladatot megfelel o tpus vissza-
hvott fggvny nyilvntartsba vtelvel oldhatjuk meg. A visszahvott
fggvny bejegyzst clszer u a szvegszerkeszt o kperny oelem ltreho-
zsakor, a realize jelzshez rendelt visszahvott fggvnyben elvgezni:
1 void
2 on_textview_realize(GtkWidget
*
widget,
3 gpointer user_data)
4 {
gtk 2007/10/21 14:22 page 249 #249
249
5 GtkTextBuffer
*
buffer;
6
7 buffer = gtk_text_view_get_buffer(
8 GTK_TEXT_VIEW(widget));
9 g_signal_connect((gpointer) buffer, "mark-set",
10 G_CALLBACK(mark_set_callback), NULL);
11 }
A fggvny el obb lekrdezi a szvegszerkeszt o kperny oelemhez tartoz
szvegmemria cmt a 78. sorban, majd a szvegmemria mark-set
jelzshez rendeli a mark_set_callback fggvnyt a 910. sorokban. Ez
utbbi fggvnyt ez utn a GTK programknyvtr minden esetben hvja,
ha a szvegmemria valamelyik szvegjelt j helyre kell ttenni.
A szvegkurzor mozgst gyeli visszahvott fggvnyt a kvetkez o for-
mban kszthetjk el:
1 void
2 mark_set_callback(GtkTextBuffer
*
textbuffer,
3 GtkTextIter
*
iter,
4 GtkTextMark
*
mark,
5 gpointer user_data)
6 {
7 gchar
*
name = gtk_text_mark_get_name(mark);
8
9 if (name == NULL || strcmp(name, "insert") != 0)
10 return;
11
12 g_message("%s(): insert moved", __func__);
13 }
A fggvny a 7. sorban lekrdezi az ppen mozgatott szvegjel nevt,
majd a 9. sorban megvizsglja a nevet. Ha a nevet jell o mutat rtke
NULL azaz a szvegjelnek nincsen neve vagy a nv nem egyezik meg a
insert karakterlnccal, a fggvny a 10. sorban visszatr.
A fggvny 12. sorra mr csak akkor kerl a vezrls, ha az ppen
mozgatott szvegjel neve insert, ami mindig a szvegkurzor helyt jelli.
A vglap az alkalmazsok kzti kapcsolattarts egyik fontos s igen
knyelmes formja, ami nagymrtkben megknnyti a felhasznl mun-
kjt. gy is tekinthetnk a vglap tmogatsra, mint a programoz
elemi udvariassgra, amit a felhasznl joggal vrhat el minden eset-
ben.
Linux rendszereken a vglapnak legalbb kt vltozatt szoks hasz-
nlni. Ha a felhasznl az alkalmazsban kijell egy szvegrszt vagy gra-
kus elemet, akkor azt minden klns el okszlet nlkl beillesztheti a
gtk 2007/10/21 14:22 page 250 #250
250
kzps o egrgomb lenyomsval. Ett ol fggetlenl egy msik vglapot
is szoks hasznlni, ami a szerkeszts men megfelel o menpontjain,
vagy azok gyorsbillenty uin keresztl hasznlhat.
A szvegszerkeszt o kperny oelem automatikusan kezeli a kzps o
egrgomb segtsgvel elrhet o vglapot, a msik, menpontok segts-
gvel elrhet o vglap azonban csak a programoz segtsgvel kezelhet o.
A vglapok nyilvntartsra a GTK programknyvtr a GtkClipBoard
tpust hozza ltre. Szerencsre a legtbb alkalmazsban elegend o a k-
vetkez o fggvny ismerete a vglap lekrdezsre:
GtkClipboard
*
gtk_clipboard_get(GdkAtom atom);
A fggvny segtsgvel az ignyinknek megfelel o vglapot cmt
krdezhetjk le. A fggvny paramtereknt meg kell adnunk, hogy
melyik vglap cmt szeretnnk visszatrsi rtkknt megkapni. A
vglap hasznlathoz elegend o, ha a kvetkez o kt lland egyikt
hasznljuk paramterknt:
GDK_SELECTION_PRIMARY Ennek az llandnak a hatsra az egy-
szer ubb, a kzps o egrgomb hasznlatn alapul vglap c-
mt kapjuk vissza. Ezt a vglapot a szvegszerkeszt o kper-
ny oelem automatikusan kezeli.
GDK_SELECTION_CLIPBOARD Ennek a vltoznak a hatsra a szo-
ksos, a szerkeszts men hasznlatn alapul vglap cmt
kapjuk vissza.
gboolean gtk_text_buffer_delete_selection(GtkTextBuffer
*
szvegmemria, gboolean interaktv, gboolean
szerkesztheto);
A fggvny segtsgvel a kijellt szveget trlhetjk. A trls nem
rinti a vglap tartalmt, gy ezt a fggvnyt ltalban a szerkesz-
ts men trls menpontjnak visszahvott fggvnyben hvjuk.
A fggvny visszatrsi rtknek s paramtereinek jelentse a k-
vetkez o:
visszatrsi rtk A fggvny visszatrsi rtk igaz, ha a tr-
ls sikeres volt.
szvegmemria Az els o paramter a szvegmemrit jelli, amely-
ben a mdostst el akarjuk vgezni.
interaktv Ez a paramter logikai rtk, ami jelzi, hogy a m uve-
letet a felhasznl kzvetlen krsre kell-e elvgezni. Ha en-
nek a paramternek az rtke igaz, akkor a fggvny meg fogja
vizsglni, hogy a kijellt szveg mdosthat-e, ha hamis, ak-
kor nem. Ennek az az oka, hogy a nem mdosthat szveget
gtk 2007/10/21 14:22 page 251 #251
251
a felhasznl nem mdosthatja, maga az alkalmazs azonban
igen.
szerkesztheto Ez a paramter megadja, hogy a szvegmemrit
alaprtelmezett esetben ha ms nem mdostja szerkeszt-
het onek kell lennie. Ett ol a fggvnyt ol fggetlenl a kijellt
szvegrsz lehet szerkeszthet o vagy vdett is, hiszen ezt a tu-
lajdonsgot a cetlik segtsgvel is bellthatjuk.
void gtk_text_buffer_paste_clipboard(GtkTextBuffer
*
szvegmemria, GtkClipboard
*
vglap, GtkTextIter
*
hov, gboolean szerkesztheto);
A fggvny segtsgvel a vglap tartalmt a szvegbe illeszthet-
jk. Ezt a fggvnyt ltalban a szerkeszts men beilleszts me-
npontjnak visszahvott fggvnyben hvjuk.
A fggvny argumentumainak jelentse a kvetkez o:
szvegmemria Annak a szvegmemrinak a cme, ahov a vg-
lap tartalmt be akarjuk illeszteni.
vglap A vglap cme, amelynek tartalmt a szvegmemriba
be akarjuk illeszteni.
hov A szvegbejr cme, ami kijelli azt a helyet a szvegben,
ahov a vglap tartalmt be kvnjuk illeszteni. Ez a param-
ter lehet NULL rtk u is, ami jelzi, hogy a szveget a szoksos
helyre, a szvegkurzorhoz illesztjk be.
szerkesztheto Logikai rtk, ami megadja, hogy a szvegmem-
rit alaprtelmezs szerint mdosthatnak tekintjk-e. A sz-
veg adott rsze ennek a paramternek az rtkt ol fggetlenl
is lehet mdosthat is s vdett is, hiszen ezt a tulajdonsgot
a cetlik segtsgvel adott szvegrszekre is bellthatjuk.
void gtk_text_buffer_copy_clipboard(GtkTextBuffer
*
szvegmemria, GtkClipboard
*
vglap);
A fggvny segtsgvel a szvegmemria kijellt szvegt a vg-
lapra msolhatjuk. Ezt a fggvnyt ltalban a szerkeszts men
msols menpontjnak visszahvott fggvnyben hasznljuk.
A fggvny els o paramtere a szvegmemrit, msopdik pedig a
hasznlni kvnt vglapot jelli a memriban.
void gtk_text_buffer_cut_clipboard(GtkTextBuffer
*
szvegmemria, GtkClipboard
*
vglap, gboolean
szerkesztheto);
A fggvny segtsgvel a szvegmemria kijellt szvegt a vg-
lapra msolhatjuk s a szveget ezzel egyid oben trlhetjk. Ezt
gtk 2007/10/21 14:22 page 252 #252
252
a fggvnyt ltalban a szerkeszts men kivg menpontjnak
visszahvott fggvnyben hasznljuk.
A fggvny els o paramtere a szvegmemrit, msodik param-
tere pedig a vglapot jelli. A fggvny harmadik paramtere meg-
adja, hogy a szvegmemrit alaprtelmezs szerint mdosthat-
nak tekintjk-e.
A kvetkez o fggvny a szvegmemrit kezel o vglap hasznlatt
mutatja be.
45. plda. A kvetkez o fggvnyek a szerkeszts men szoksos men-
pontjainak visszahvott fggvnyeiknt a vglap kezelst vgzik sz-
vegszerkeszt o kperny oelem s a hozz tartoz szvegmemria tmoga-
tsra.
1 void
2 on_cut1_activate(GtkMenuItem
*
menuitem,
3 gpointer user_data)
4 {
5 GtkWidget
*
widget;
6 GtkTextBuffer
*
text_buffer;
7 GtkClipboard
*
clipboard;
8
9 widget = lookup_widget(GTK_WIDGET(menuitem),
10 "textview");
11 text_buffer = gtk_text_view_get_buffer(
12 GTK_TEXT_VIEW(widget));
13 clipboard = gtk_clipboard_get(
14 GDK_SELECTION_CLIPBOARD);
15
16 gtk_text_buffer_cut_clipboard(text_buffer, clipboard,
17 TRUE);
18 }
19
20
21 void
22 on_copy1_activate(GtkMenuItem
*
menuitem,
23 gpointer user_data)
24 {
25 GtkWidget
*
widget;
26 GtkTextBuffer
*
text_buffer;
27 GtkClipboard
*
clipboard;
28
29 widget = lookup_widget(GTK_WIDGET(menuitem),
30 "textview");
gtk 2007/10/21 14:22 page 253 #253
253
31 text_buffer = gtk_text_view_get_buffer(
32 GTK_TEXT_VIEW(widget));
33 clipboard = gtk_clipboard_get(
34 GDK_SELECTION_CLIPBOARD);
35
36 gtk_text_buffer_copy_clipboard(text_buffer,
37 clipboard);
38 }
39
40
41 void
42 on_paste1_activate(GtkMenuItem
*
menuitem,
43 gpointer user_data)
44 {
45 GtkWidget
*
widget;
46 GtkTextBuffer
*
text_buffer;
47 GtkClipboard
*
clipboard;
48
49 widget = lookup_widget(GTK_WIDGET(menuitem),
50 "textview");
51 text_buffer = gtk_text_view_get_buffer(
52 GTK_TEXT_VIEW(widget));
53 clipboard = gtk_clipboard_get(
54 GDK_SELECTION_CLIPBOARD);
55
56 gtk_text_buffer_paste_clipboard(text_buffer,
57 clipboard, NULL, TRUE);
58 }
59
60
61 void
62 on_delete1_activate(GtkMenuItem
*
menuitem,
63 gpointer user_data)
64 {
65 GtkWidget
*
widget;
66 GtkTextBuffer
*
text_buffer;
67
68 widget = lookup_widget(GTK_WIDGET(menuitem),
69 "textview");
70 text_buffer = gtk_text_view_get_buffer(
71 GTK_TEXT_VIEW(widget));
72
73 gtk_text_buffer_delete_selection(text_buffer, TRUE,
74 TRUE);
gtk 2007/10/21 14:22 page 254 #254
254
75 }
A programrszletben meggyelhetjk a szerkeszts men kivg (118.
sorok), msol (2138. sorok), beilleszt (4158. sorok) s trl (6175. so-
rok) menpontjainak visszahvott fggvnyeit.
8.2.6. A szveg mdostsnak gyelse
A szvegszerkeszt o kperny oelemben szerkesztett szveget ltalban l-
lomnyban troljuk, az llomny mentsnek, betltsnek s a prog-
rambl val kilpsnek a megszervezse kzben pedig ltalban tudnunk
kell, hogy a szveg a betlts ta mdosult-e.
A mdosts gyelsre sajt eszkzket is kszthetnk, sokkal hat-
konyabb s gyorsabb azonban az albbi kt fggvny hasznlata:
void gtk_text_buffer_set_modified(GtkTextBuffer
*
szvegmemria, gboolean mdosult);
A fggvny segtsgvel bellthatjuk, hogy a szveg mdosult-e. l-
talban arra hasznljuk ezt a fggvnyt, hogy minden ments vgn
belltsuk a mdosultsg rtkt hamisra. A szvegmemria auto-
matikusan mdosult llapotba kapcsoldik, amikor a felhasznl
megvltoztatja a szvegt.
A fggvny els o paramtere a szvegmemrit jelli, a msodik pa-
ramtere pedig megadja a mdosult jellemz o j rtkt, ami TRUE,
illetve FALSE lehet.
gboolean gtk_text_buffer_get_modified(GtkTextBuffer
*
szvegmemria);
A fggvny segtsgvel lekrdezhetjk a szvegmemria mdosult
jellemz ojt.
8.3. A raktrak
A GTK+ nhny sszetett kperny oelem ikonmez o, fa stb. kezelshez
raktrakat (store, raktr) hasznl. A raktrakban adatokat helyezhetnk
el, amelyeket az adott kperny oelem megjelent, kezel. Ha ilyen ssze-
tett kperny oelemeket akarunk hasznlni a programunkban, ltre kell
hoznunk s kezelnnk kell a megfelel o raktrat.
8.3.1. Az ltalnos raktr
A GTK programknyvtr a GtkListStore tpussal lista szerkezet u rak-
trat, a GtkTreeStore tpussal pedig fa szerkezet u raktrat hoz ltre a
gtk 2007/10/21 14:22 page 255 #255
255
programoz szmra. Mindkt tpus megvalstja a GtkTreeModel in-
terfszt, gy mindkt tpus talakthat GtkTreeModel, ltalnos rak-
tr tpuss a GTK_TREE_MODEL() tpusknyszert o makr segtsg-
vel. Ez rendkvl fontos, mert az adatokat megjelent o kperny oelemek
GtkTreeModel tpust fogadnak el az adatok tadsakor.
A GTK programknyvtr a GtkTreeModel tpushoz bejrknt a
GtkTreeIter tpust biztostja, amellyel gy a GtkListStore s a
GtkTreeStore tpus raktrakat is bejrhatjuk. Hasonlkppen hasz-
nlhatk a lista s fa szerkezet u raktrak elemeinek bejrsra a
GtkTreePath tpus svnyler adatszerkezetek is. A bejrkat lta-
lban helyi vltozknt rvid lettartammal, az svnylerkat pedig a
legtbb esetben hosszabb lettartam eszkzknt kiterjedtebb hatkr-
rel hasznljuk (hasonlan a GtkTextIter s GtkTextMark adatszerke-
zetekhez).
A raktrak kezelsekor sokszor hasznlunk szveges svnylert, ami
az llomnylerhoz hasonlan, szveges formban hatrozza meg a rak-
tr egy bizonyos pontjt. A szveges svnyler kett ospontokkal elv-
lasztott egsz szmok sorozata. A "1:2" pldul a raktr 1 sorszm
sornak 2 sorszm leszrmazottjt jelli a fa szerkezet u raktrban. Az
elemek szmozsa 0-tl indul, gy a "0:0:0" pldul a legels o sor legels o
leszrmazottjnak legels o leszrmazottja.
A GTK programknyvtr a kvetkez o fggvnyeket biztostja a
GtkTreeIter tpus fabejrk kezelsre:
gboolean gtk_tree_model_get_iter_from_string(GtkTreeModel
*
raktr, GtkTreeIter
*
bejr, const gchar
*
svnyler);
A fggvny segtsgvel a szveges svnylerbl llthatunk el o
fabejrt.
A fggvny els o paramtere a raktrat, msodik paramtere pedig
azt a terletet jelli a memriban, ahov a fggvny a fabejrt
elhelyezi. Ez utbbi paramternek olyan terletet kell jellnie a me-
mriban, amely elegend oen nagymret u egy fabejr trolsra. A
fggvny harmadik paramtere egy szveges svnylert jell (pl-
dul "1:0:3"), ami alapjn a fabejr elkszl.
A fggvny visszatrsi rtke TRUE, ha az adott svnyler alapjn
a fabejrt el lehetett kszteni, egybknt pedig FALSE.
gboolean gtk_tree_model_get_iter_first(GtkTreeModel
*
raktr, GtkTreeIter
*
bejr);
A fggvny segtsgvel a bejr legels o elemt jell o fabejrt llt-
hatjuk el o.
gtk 2007/10/21 14:22 page 256 #256
256
A fggvny els o paramtere a a raktrat, msodik paramtere pe-
dig a bejr elhelyezsre kijellt memriaterletet jelli. A fgg-
vny visszatrsi rtke TRUE, ha a bejrt sikerlt kitlteni, FALSE,
ha nem. Ez utbbi kizrlag akkor kvetkezhet be, ha a raktrban
egyetlen elem sem tallhat.
gboolean gtk_tree_model_iter_next(GtkTreeModel
*
raktr,
GtkTreeIter
*
bejr);
A fggvny segtsgvel a bejrt a kvetkez o, azonos szinten ta-
llhat elemre llthatjuk. A fggvny a bejrt nem az ltala jellt
faelemnek leszrmazottjra, hanem a kvetkez o elemre lltja.
A fggvny els o paramtere a raktrat jelli a memriban. A m-
sodik paramter azt a bejrt jelli, amelyet a kvetkez o elemre sze-
retnnk tlltani.
A fggvny visszatrsi rtke TRUE, ha az adott elem utn volt k-
vetkez o elem, klnben pedig FALSE. Ez utbbi esetben a fggvny
a bejrt rvnytelen rtk ure lltja.
gboolean gtk_tree_model_iter_children(GtkTreeModel
*
raktr, GtkTreeIter
*
bejr, GtkTreeIter
*
szlo);
E fggvny segtsgvel az adott bejr ltal jellt faelem els o le-
szrmazottjt kereshetjk ki.
A fggvny els o paramtere a raktrat jelli a memriban. A m-
sodik paramter azt a bejrt jelli, amelyet a harmadik paramter
ltal jellt bejr els o gyermekre akarunk lltani. Ha a fggvny
harmadik paramternek rtke NULL, a fggvny a msodik para-
mterrel jellt bejrt a raktr legels o elemre lltja. Ez klnsen
a faelemeket bejr ciklus elejn lehet hasznos.
A fggvny visszatrsi rtke TRUE, ha a bejrt sikerlt belltani,
FALSE, ha nem.
gboolean gtk_tree_model_iter_has_child(GtkTreeModel
*
raktr, GtkTreeIter
*
bejr);
A fggvny segtsgvel lekrdezhetjk, hogy az adott elemnek van-
e leszrmazottja.
A fggvny els o paramtere a raktrat, a msodik eleme a fabejrt
jelli a memriban. A visszatrsi rtk TRUE, ha a msodik para-
mter ltal jellt bejrnak van leszrmazottja, FALSE, ha nincs.
gint gtk_tree_model_iter_n_children(GtkTreeModel
*
raktr,
GtkTreeIter
*
bejr);
gtk 2007/10/21 14:22 page 257 #257
257
A fggvny segtsgvel lekrdezhetjk, hogy az adott raktrelem-
nek hny leszrmazottja van.
A fggvny els o paramtere a raktrat, msodik eleme a fabejrt
jelli a memriban. Ha ez utbbi paramter rtke NULL, a fgg-
vny a raktr gykerben tallhat elemek szmt adja vissza.
A visszatrsi rtk megadja a raktr adott helyn tallhat elem
leszrmazottjainak szmt.
gboolean gtk_tree_model_iter_nth_child(GtkTreeModel
*
raktr, GtkTreeIter
*
bejr, GtkTreeIter
*
szlo, gint
n);
A fggvny segtsgvel a bejrt az adott elemadott sorszm gyer-
mekre llthatjuk.
A fggvny els o paramtere a raktrat, msodik paramtere a bel-
ltand bejrt jelli a memriban. A fggvny harmadik param-
tere a bejrt jelli, amelynek az adott sorszm gyermekt keres-
sk. Ha ez a paramter NULL, a fggvny az adott sorszm gyk-
relemt keresi meg. A negyedik paramter a keresett gyermek sor-
szmt adja meg. Az elemek szmozsa 0-tl kezd odik.
A fggvny visszatrsi rtke TRUE, ha a keresett sorszm gyer-
mek megtallhat volt, FALSE, ha nem. Ebben az esetben a fgg-
vny a msodik paramtere ltal jellt bejrt rvnytelen rtk ure
lltja.
gboolean gtk_tree_model_iter_parent(GtkTreeModel
*
raktr,
GtkTreeIter
*
bejr, GtkTreeIter
*
gyermek);
A fggvny segtsgvel az adott elem szl oelemt kereshetjk ki.
A fggvny els o paramtere a raktrat, msodik paramtere a bel-
ltand bejrt jellil a memriban. A fggvny harmadik param-
tere egy bejrt jell a memriban, ami azt az elemet jelli, amely-
nek szl ojt keressk.
A fggvny visszatrsi rtke TRUE, ha a harmadik paramter l-
tal jellt elemnek van szl oje, FALSE, ha az elem gykrelem. Ez
utbbi esetben a fggvny a msodik paramtere ltal jellt bejrt
rvnytelen rtk ure lltja.
gchar
*
gtk_tree_model_get_string_from_iter(GtkTreeModel
*
raktr, GtkTreeIter
*
bejr);
A fggvny segtsgvel az adott bejr ltal jellt elem szveges
svnylerjt kaphatjuk meg.
A fggvny els o paramtere a raktrat, msodik eleme pedig a be-
jrt jelli a memriban.
gtk 2007/10/21 14:22 page 258 #258
258
A fggvny visszatrsi rtke egy dinamikusan foglalt memriate-
rletet jell a memriban, ami a szveges svnylert tartalmazza
karakterlncknt.
A GtkTreePath tpus svnylerk a GtkTreeIter fabejrkhoz ha-
sonlan a raktr egy elemt azonostjk, de az svnylerk hasznlata
kzben nem szabad szem el ol tvesztennk, hogy azok nem garantljk,
hogy az adott elem ltezik a raktrban. Ha pldul a megfelel o fgvnnyel
az svnylert a kvetkez o elemre lltjuk lehetsges, hogy olyan svny-
lert kapunk, ami nem jell elemet a raktrban, mgpedig egyszer uen
azrt, mert nincsen kvetkez o elem. Az svnylerkat kezel o fggvnyek
teht az adott m uveletet akkor is elvgzik, ha az eredmnyl kapott s-
vnyler a m uvelet utn rvnytelen helyre mutat.
A GTK programknyvtr a kvetkez o fggvnyek segtsgvel tmogatja
a GtkTreePath tpus svnylerk hasznlatt:
GtkTreePath
*
gtk_tree_model_get_path(GtkTreeModel
*
raktr, GtkTreeIter
*
bejr); A fggvny segtsgvel
svnylert llthatunk el o az latala jellt elem megadsval.
A fggvny els o paramtere a raktrat jelli a memriban. A m-
sodik paramtere azt a fabejrt jelli, ami meghatrozza, hogy a
ltrehozott svnyler a raktr melyik elemt jellje.
A fggvny visszatrsi rtke a dinamikusan foglalt memriater-
leten ltrehozott fabejrt jelli a memriban. Ezt az adatszerkeze-
tet a gtk_tree_path_free() fggvny segtsgvel semmisthetjk
meg.
gboolean gtk_tree_model_get_iter(GtkTreeModel
*
raktr,
GtkTreeIter
*
bejr, GtkTreePath
*
svny); A fggvny
segtsgvel a fabejrt az svny ltal meghatrozott elemre
llthatjuk.
A fggvny els o paramtere a raktrat, msodik paramtere pedig a
belltand bejrt jelli a memriba, mg a harmadik paramter
az elemet jell o svny cme.
A fggvny visszatrsi rtke TRUE, ha az elemet sikerlt megta-
llni s gy a bejr belltsa lehetsges volt, ellenkez o esetben vi-
szont FALSE.
GtkTreePath
*
gtk_tree_path_new(void); Ennek a fggvnynek a
segtsgvel egy j svnylert hozhatunk ltre. A fggvny nem
tl hasznos, hiszen nem tudjuk meghatrozni, hogy az svny a
raktr melyik elemt jellje.
A fggvny visszatrsi rtke a dinamikusan foglalt memriater-
leten elhelyezett svnylert jelli a memriban.
gtk 2007/10/21 14:22 page 259 #259
259
GtkTreePath
*
gtk_tree_path_new_from_string(const gchar
*
svny); E fggvny segtsgvel j svnylert hozhatunk ltre
a szveges svnyler alapjn.
A fggvny paramtere a szveges svnylert jelli a memriban.
A visszatrsi rtk a dinamikus memriaterletre mutat, ahol a
fggvny az j svnylert ltrehozta.
gchar
*
gtk_tree_path_to_string(GtkTreePath
*
svny); A
fggvny segtsgvel szveges svnylert hozhatunk ltre az
svnyler alapjn.
A fggvny els o paramtere az svnylert jelli a memriban, ami
alapjn a szveges svnylert ltrehozzuk. A fggvny visszatrsi
rtke dinamikusan foglalt memriaterletet jell, ahol a fggvny
a szveges svnylert elhelyezte a memriban.
GtkTreePath
*
gtk_tree_path_new_first(void); A fggvny a leg-
els o elemet jell o svnyt lltja el o, hatsa megegyezik a
gtk_tree_path_new_from_string() fggvny hatsval, ha an-
nak a "0" szveges svnylert adjuk paramterknt.
void gtk_tree_path_append_index(GtkTreePath
*
svny, gint
n); Ennek a fggvnynek a segtsgvel az svnyhez j elemet
fzhetnk, azaz elrhetjk, hogy az svny az addig jellt elem
n-edik gyermekt jellje.
A fggvny els o paramtere az svnylert jelli a memriban, a
msodik paramtere pedig a hozzf uzend o szm jelleg u rtket adja
meg. A msodik paramter meghatrozza, hogy az svny az eredeti
rtk hnyadik gyermekt jellje.
void gtk_tree_path_prepend_index(GtkTreePath
*
svny gint
n); A fggvny segtsgvel az svny elejre j rtket helyez-
hetnk el. Ez a fggvnyt nyilvnvalan nem tl gyakran fogjuk
hasznlni.
gint gtk_tree_path_get_depth(GtkTreePath
*
svny); A fgg-
vny segtsgvel lekrdezhetjk az svny mlysgt.
A fggvny paramtere az svnylert jelli a memriban, a
visszatrsi rtke pedig megadja az svny mlysgt.
GtkTreePath
*
gtk_tree_path_copy(const GtkTreePath
*
svny); A fggvny segtsgvel egy j svnylert hozha-
tunk ltre a megadott svnyler lemsolsval.
A fggvny paramtere a mintaknt hasznlt svnyt jelli a me-
mriban, mg a visszatrsi rtke a msolatknt ltrehozott j
svnyt, ami dinamikusan foglalt memriaterleten van elhelyezve.
gtk 2007/10/21 14:22 page 260 #260
260
gint gtk_tree_path_compare(const GtkTreePath
*
a, const
GtkTreePath
*
b); A fggvny segtsgvel kt svnylert
hasonlthatunk ssze.
A fggvny kt paramtere a kt sszehasonltand svnylert je-
lli a memriban, visszatrsi rtke pedig a strcmp() szabvnyos
knyvtri fggvnyhez hasonlan negatv, 0 vagy pozitv rtket ad,
annak megfelel oen, hogy az els o svnyler kisebb, a kt svnyle-
r egyenl o, vagy az els o svnyler nagyobb.
void gtk_tree_path_next(GtkTreePath
*
svny); A fggvny se-
gtsgvel az svnylert a kvetkez o raktrelemre llthatjuk. Ez a
fggvny az svnylert az azonos mlysgben tallhat kvetkez o
elemre lltja, nem nveli az svnyler mlysgt.
A fggvny paramtere az tlltand svnyleart jelli a memri-
ban.
gboolean gtk_tree_path_prev(GtkTreePath
*
svny); A fgg-
vny segtsgvel az svnylert az azonos szintn lv o el oz o elemre
llthatjuk, ha az svny nem az adott szinten tallhat 0 sorszm
elemet jelli.
A fggvny paramtere az tlltand svnylert jelli a memri-
ban, visszatrsi rtke pedig megadja, hogy az svny tlltsa
sikeres volt-e.
gboolean gtk_tree_path_up(GtkTreePath
*
svny); A fggvny
segtsgvel az svnylert egy szinttel feljebb, a gykr fel moz-
gathatjuk, ha az svnyler nem gykrelemet jellt.
A fggvny paramtere az tlltand svnyt jelli a memriban,
visszatrsi rtke pedig jelzi, hogy az tllts sikeres volt-e.
void gtk_tree_path_down(GtkTreePath
*
svny); A fggvny se-
gtsgvel az svnyler mlysgt eggyel nvelhetjk, tllthatjuk
az eddig jelzett elem 0 sorszm elemre.
A fggvny paramtere az tlltand svnylert jelli a memri-
ban.
gboolean gtk_tree_path_is_ancestor(GtkTreePath
*
svny,
GtkTreePath
*
laszrmazott); A fggvny segtsgvel megl-
lapthatjuk, hogy az egyik svny a msik svny leszrmazottjt
jelli-e.
A fggvny igaz logikai rtket ad, ha az els o paramterknt jelzett
svny a msodik paramterknt jelzett svny ose.
gtk 2007/10/21 14:22 page 261 #261
261
Az svnylerkat s fabejrkat kezel o fggvnyek bemutatsa utn
sorra vesszk a raktrak kezelsre hasznlhat fggvnyeket. A GTK
programknyvtr igen sok fggvnyt biztost a GtkTreeModel tpus l-
talnos raktr kezelsre. Nem szabad azonban elfelejtennk, hogy az
ltalnos raktr valjban egy lista vagy fa szerkezet u raktr, ezrt nem
tallunk pldul ltalnos raktrat ltrehoz fggvnyt, ltrehozni csak
lista vagy fa szerkezet u raktrat tudunk.
gint gtk_tree_model_get_n_columns(GtkTreeModel
*
raktr); A
fggvny segtsgvel lekrdezhetjk, hogy az ltalnos raktrban
hny oszlopba vannak rendezve az adatok.
GType gtk_tree_model_get_column_type(GtkTreeModel
*
raktr, gint oszlop); A fggvny segtsgvel lekrdezhetjk,
hogy az ltalnos raktr adott oszlopnak milyen a tpusa.
A fggvny els o paramtere a raktrat jelli a memriban, a mso-
dik paramtere pedig megadja, hogy hnyadik oszlop tpust akar-
juk lekrdezni. Az oszlopok szmozsa 0-tl indul.
A fggvny visszatrsi rtke megadja az adott oszlop tpust. A
visszatrsi rtkknt kapott GType tpusrl b ovebben a 263. olda-
lon olvashatunk.
void gtk_tree_model_get(GtkTreeModel
*
raktr, GtkTreeIter
*
bejr, oszlop1, mutat1, ..., -1); Ennek a fggvnynek
a segtsgvel a raktr bejrval megadott pontjrl olvashatjuk ki
az egyes oszlopok tartalmt.
A fggvny els o paramtere a raktrat, msodik paramtere a sort
kijell o bejrt jelli a memriban.
A fggvny tovbbi paramterei az olvasand oszlop szmt, vala-
mint az olvasott rtkek elhelyezsi cmeit megad prok, amelyek-
b ol tetsz olegesen sokat megadhatunk. A fggvny utols param-
tere ktelez oen 1, a paramterlista vgt jelzi.
void gtk_tree_model_foreach(GtkTreeModel
*
raktr,
GtkTreeModelForeachFunc fggvny, gpointer adat); En-
nek a fggvnynek a segtsgvel a raktr minden sort, minden
gt bejrhatjuk, minden soron, minden gon meghvva egy adott
fggvnyt.
A fggvny els o paramtere a bejrand raktrat, a msodik az ele-
meken meghvand fggvnyt jelli a memriban. A fggvny har-
madik paramtere egy tetsz oleges mutat, amelyet a msodik para-
mter ltal jelzett fggvnynak paramterknt t szeretnnk adni.
gtk 2007/10/21 14:22 page 262 #262
262
gboolean (
*
GtkTreeModelForeachFunc)(GtkTreeModel
*
raktr,
GtkTreePath
*
svny, GtkTreeIter
*
bejr, gpointer
adat); A gtk_tree_model_foreach() fggvnynek msodik
paramterknt tadott mutat tpusa, gy is mondhatnnk, hogy
ilyen tpus fggvnyt tudunk hvni az ltalnos raktr automati-
kus bejrsa sorn. A fggvny paramterei s visszatrsi rtke
a kvetkez o:
visszatrsi rtk A fggvnynek TRUE visszatrsi rtkkel
kell jeleznie, ha a raktr tovbbi elemeit mr nem kell bejrni,
illetve FALSE rtkkel, ha ksz a kvetkez o elem feldolgozsra.
raktr Az ppen bejrt raktrat jell o mutat.
svny Az aktulis elemet jell o svny.
bejr Az aktulis elemet jell o bejr.
adat A programoz ltal meghatrozott mutat, amelyet a bej-
rs kezdemnyezsekor a gtk_tree_model_foreach() fgg-
vny harmadik paramtereknt megadott.
8.3.2. A lista szerkezet u raktr
8.5. bra. Lista szerkezet u rak-
tr ktfle nzetben
Amint arrl az el oz o bekezdsekben olvas-
hattunk, a lista szerkezet u raktr, azaz a
GtkListStore tpus segtsgvel klnfle
adatokat trolhatunk lista formban. Ezt a le-
het osget ltalban arra hasznljuk, hogy a
vltoz adatokat megjelent o sszetett kper-
ny oelemeknek a megjelentend o adatlistt t-
adjuk.
A 8.5. brn egyszer u lista szerkezet u rak-
tr kt megjelentsi formjt lthatjuk. Fell
listaknt, a kp als rszn pedig ikonlista
formjban jelentettk meg ugyanazokat az
adatsorokat. A raktrban kt sornyi adat ta-
llhat, az els o oszlop szveges, a msodik k-
pet, a harmadik pedig egy lebeg opontos sz-
mot tartalmaz. Amint meggyelhetjk az ikon-
mez oben csak az els o kt oszlop, a szveges s
az ikon jelleg u lthat.
A lista szerkezet u raktr amelynek kezelsre a GtkListStore tpust
hasznlhatjuk teht tbboszlopos, klnfle tpus adatrszeket trol
sszetett adatszerkezet, ami leginkbb egy tblzatra hasonlt.
A GTK programknyvtr GtkListStore kezelsre ltrehozott legegy-
szer ubb s legfontosabb fggvnyei a kvetkez ok:
gtk 2007/10/21 14:22 page 263 #263
263
GtkListStore
*
gtk_list_store_new(gint oszlopszm, ...); A
fggvny segtsgvel egy j lista szerkezet u raktrat kszthetnk
az oszlopok szmnak, s az egyes oszlopokban elhelyezend o ada-
tok tpusnak megadsval.
A fggvnynek megadott els o paramter a listban szerepl o oszlo-
pok szmt adja meg.
A fggvny tovbbi paramterei a lista oszlopainak tpust hatroz-
zk meg. Ezeknek a paramtereknek a szma magtl rtet od oen
meg kell, hogy egyezzen a lista oszlopainak szmval.
Az oszlopok tpust a G programknyvtr GType tpusnak segts-
gvel adhatjuk meg. A legfontosabb GType tpus llandk a kvet-
kez ok:
G_TYPE_STRING Karakterlnc trolsra alkalmas tpus. Akkor
hasznljuk ezt a kulcsszt, ha az adott mez oben karakterlncot
akarunk megjelenteni, trolni.
A GTK+ programknyvtr a karakterlncrl msolatot kszt,
amikor azt a lista tpus raktrban elhelyezzk s a msolat
trolsra hasznlt memriaterletet felszabadtja, amikor az
adott sort a listbl eltvoltjuk.
G_TYPE_BOOLEAN Logikai rtk trolsra alkalmas tpus.
G_TYPE_INT Egsz szmok trolsra hasznlhat oszlopot ltre-
hoz kulcssz.
G_TYPE_DOUBLE Lebeg opontos szmok trolsra alkalmas oszlo-
pot ltrehoz kulcssz.
G_TYPE_POINTER Mutatk trolsra alkalmas oszlopot ltrehoz
kulcssz.
GDK_TYPE_PIXBUF Kp, ikon trolsra alkalmas tpus. Akkor
hasznljuk ezt a kulcsszt, ha az adott oszlopban kpet aka-
runk trolni, megjelenteni. (Ikonok ltehozsra legegyszer ub-
ben a gdk_pixbuf_new_from_file() fggvny hasznlhat.)
A GTK valjban a GDK programknyvtr nem kszt mso-
latot az ilyen elemekr ol, de egy hivatkozsi-szm nyilvntarts
segtsgvel gondoskodik arrl, hogy azok ne semmisljenek
meg, amg a lista tpus raktrban szerepelnek.
A fggvny visszatrsi rtke a ltrehozott lista tpus raktrat je-
lli a memriban.
void gtk_list_store_clear(GtkListStore
*
raktr);
A fggvny segtsgvel a raktrbl az sszes elemet sszes sort
trlhetjk. A fggvnynek tadott paramter a raktrat jelli a
memriban.
gtk 2007/10/21 14:22 page 264 #264
264
void gtk_list_store_append(GtkListStore
*
raktr,
GtkTreeIter
*
bejr);
A fggvny segtsgvel a lista tpus raktrba j sort helyezhetnk
el. Az j sor a lista vgn, az utols ltez o elem utn jn ltre.
A fggvnynek tadott els o paramter a raktrat jelli a memri-
ban, ahov az j sort el akarjuk helyezni. A fggvny msodik
paramtere egy bejrt jell a memriba, ahov a fggvny az j
elem kijellsre, mdostsra hasznlhat adatokat helyezi el. A
fggvny a msodik paramterrel jellt memriaterletet mdostja,
ezrt annak egy GtkTreeIter tpus vltozt kell jellnie.
Amint ltjuk a fggvny egy j sort helyez el a listban, de az j
sorba adatokat nem tesz. Az adatokat a fggvny ltal kitlttt be-
jr segtsgvel egy kl fggvny hvsval (az albb bemutatott
gtk_list_store_set() fggvnnyel) rhatjuk be az j sorba.
void gtk_list_store_prepend(GtkListStore
*
raktr,
GtkTreeIter
*
bejr);
A fggvny m ukdse s hasznlata megegyezik a
gtk_list_store_append() fggvny m ukdsvel s haszn-
latval, azzal ellenttben azonban nem a lista vgre, hanem a lista
elejre helyezi el az j sort.
void gtk_list_store_set(GtkListStore
*
raktr, GtkTreeIter
*
bejr, szm1, rtk1, ..., -1);
A fggvny segtsgvel a lista szerkezet u raktr adott sorban tall-
hat adatokat mdosthatjuk. ltalban ezt a fggvnyt hasznljuk
arra, hogy a listban ppen elhelyezett j sort adatokkal feltltsk.
A fggvny els o paramtere a lista szerkezet u raktrat jelli a me-
mriban, msodik paramtere pedig a bejrt, amelyet a mdos-
tani kvnt sor kivlasztsra hasznlunk.
A fggvny tovbbi paramterei az adott sorban elhelyezend o ada-
tokat adjk meg, mgpedig oszlopszm, rtk formban. Az osz-
lopok szmozsa 0-tl indul, az rtknek pedig rtelemszer uen meg
kell felelni a raktr adott oszlopnak tpusnak.
Az oszlopszmokbl s rtkekb ol tetsz olegesen sokat megadha-
tunk, a lista vgt azonban az oszlopszm helyn megadott 1 r-
tkkel kell jellnnk. Ennek az utols paramternek az elhagysa
slyos programhibhoz vezethet.
Mr ezzel a nhny fggvnnyel is kszthetnk lista szerkezet u rakt-
rat, ahogyan ezt a kvetkez o plda is bemutatja.
gtk 2007/10/21 14:22 page 265 #265
265
46. plda. A kvetkez o programrszlet egy lista szerkezet u raktr ltre-
hozst s adatokkal val feltltst mutatja be. A fggvny ltal ltre-
hozott raktr ktfle megjelensi formjt lthatjuk a 8.5. brn.
1 static GtkListStore
*
2 dull_list_store(void)
3 {
4 static GtkListStore
*
list_store = NULL;
5 GdkPixbuf
*
pixbuf1,
*
pixbuf2;
6 GtkTreeIter iter;
7
8 /
*
9
*
Ha mr ltrehoztuk a raktrat egyszeruen
10
*
visszaadjuk.
11
*
/
12 if (list_store != NULL)
13 return list_store;
14
15 pixbuf1 = gdk_pixbuf_new_from_file(
16 PIXMAP_DIR "server.png",
17 NULL);
18 pixbuf2 = gdk_pixbuf_new_from_file(
19 PIXMAP_DIR "client.png",
20 NULL);
21
22 /
*
23
*
j raktr hrom oszloppal.
24
*
/
25 list_store = gtk_list_store_new(3,
26 G_TYPE_STRING,
27 GDK_TYPE_PIXBUF,
28 G_TYPE_DOUBLE);
29
30 /
*
31
*
Kt sornyi adatot elhelyeznk a raktrban.
32
*
/
33 gtk_list_store_append(list_store, &iter);
34 gtk_list_store_set(list_store, &iter,
35 0, "Els o bejegyzs",
36 1, pixbuf1,
37 2, 42.0,
38 -1);
39
40 gtk_list_store_append(list_store, &iter);
gtk 2007/10/21 14:22 page 266 #266
266
41 gtk_list_store_set(list_store, &iter,
42 0, "Msodik bejegyzs",
43 1, pixbuf2,
44 2, 4.20,
45 -1);
46
47 return list_store;
48 }
A pldaknt bemutatott fggvny egy j lista szerkezet u raktrat hoz
ltre s feltlti adatokkal.
Magt a lista ltrehozst a 2528. sorokban olvashatjuk. Figyeljk
meg, hogy a lista hrom oszlopot tartalmaz, amelyek kzl az els o ka-
rakterlnc, a msodik kp, a harmadik pedig szm jelleg u.
A fggvny a raktrban kt sort helyez el. Az els o adatsort sort a 33.
sorban hvott gtk_list_store_append() fggvny helyezi el a raktr-
ban s a 3438. sorban hvott gtk_list_store_set() tlti fel adatok-
kal.
A raktr msodik sort a 4045. sorok kzt hozzuk ltre s tltjk fel
adatokkal.
8.6. bra. Automatikus kiegszts be-
viteli mez ohz
A beviteli mez ok felszerelhet ok gyne-
vezett automatikus kiegsztssel, ame-
lyek segtik a felhasznlt a szveg be-
rsban. Az automatikus kiegszts
valjban egy lista, amelyb ol a GTK
programknyvtr a mr bert szveg
alapjn az egyez o szvegsorokat auto-
matikusan megjelenti, hogy a felhasz-
nlnak ne kelljen a teljes szveget be-
gpelnie. Az automatikus kiegsztsre
pldt a 8.6. brn lthatunk.
Az automatikus kiegszts lterho-
zsa s hasznlata viszonylag egyszer u, ezrt a szksges fggvnyeket
nem trgyaljuk rszletesen, csak egy pldn keresztl mutatjuk be ket.
A kvetkez o plda bemutatja hogyan kszthetnk automatikus kiegsz-
tst beviteli mez ohz egy SQL kiszolgln tallhat adatok alapjn.
47. plda. A kvetkez o fggvny egy SQL lekrdezst hajt vgre, majd
a lekrdezs sorn kapott adatokbl egy lista szerkezet u raktrat hoz
ltre, hogy azt felhasznlja az adott beviteli mez ohz rendelt automatikus
kiegszts ltrehozsra. Az SQL kiszolglval vel munkra e knyvben
nem trnk rszletesen, az ilyen clra hasznlt fggvnyekr ol az olvas
ms forrsbl [1] tjkozdhat.
gtk 2007/10/21 14:22 page 267 #267
267
1 void
2 sql_create_entry_completion(
3 GtkEntry
*
entry,
4 PGconn
*
connection,
5 const gchar
*
sql_command)
6 {
7 GtkEntryCompletion
*
entry_completion;
8 GtkListStore
*
list_store;
9 GtkTreeIter tree_iter;
10 PGresult
*
result;
11 ExecStatusType status;
12 gint n, ntuples;
13
14 result = PQexec(connection, sql_command);
15 status = PQresultStatus(result);
16 if (status != PGRES_TUPLES_OK) {
17 g_warning("%s(): %s", __func__,
18 PQresultErrorMessage(result));
19 PQclear(result);
20 return;
21 }
22
23 list_store = gtk_list_store_new(1, G_TYPE_STRING);
24
25 ntuples = PQntuples(result);
26 for (n = 0; n < ntuples; ++n) {
27 gtk_list_store_append(list_store, &tree_iter);
28 gtk_list_store_set(list_store, &tree_iter,
29 0, PQgetvalue(result, n, 0),
30 -1);
31 }
32 PQclear(result);
33
34 entry_completion = gtk_entry_completion_new();
35 gtk_entry_completion_set_model(entry_completion,
36 GTK_TREE_MODEL(list_store));
37 gtk_entry_completion_set_text_column(
38 entry_completion, 0);
39 gtk_entry_set_completion(entry, entry_completion);
40 }
A fggvny paramterknt a beviteli mez o, az SQl kiszolgl fel felptett
kapcsolatot ler adatszerkezet, valamint a hasznland SQL parancsot
gtk 2007/10/21 14:22 page 268 #268
268
kijell o mutatkat kap. A paramterek ilyen mdon trtn o megvlasz-
tsa ltalnos felhasznlhatsgot klcsnz a fggvnynek.
A fggvny a 14. sorban az SQL parancsot elkldi a kiszolglnak,
majd a 1520. sorokban megvizsglja, hogy a parancs vgrehajtsa hi-
bamentes volt-e. Ha hiba lpett fel, akkor a fggvny a 1718. sorokban
egy gyelmeztetst r ki az SQL programknyvtr ltal adott hibalerssal
(18. sor), hogy a programozt gyelmeztesse a problmra.
Ezek utn a fggvny a 23. sorban ltrehoz egy lista szerkezet u rak-
trat egyetlen szveges mez ovel, majd egy ciklus segtsgvel a 2630.
sorok kzt elhelyezi a raktrban a lekrdezs sorn kapott sorok els o
oszlopt. Az jabb s jabb elemek ltrehozst a 27., a szveges rtk
belltst pedig a 2830. sorok tartalmazzk.
A fggvny ezek utn a 32. sorban felszabadtja az SQL parancs ered-
mnyt trol adatszerkezetet, hiszen a szvegsorok ekkor mr a lista
szerkezet u raktrban vannak.
A kvetkez o lps az automatikus kiegszts ltrehozsa s belltsa.
A fggvny a 34. sorban a gtk_entry_completion_new() fggvny se-
gtsgvel ltrehozza az j automatikus kiegsztst, majd a 3536. so-
rokban a gtk_entry_completion_set_model() fggvny hvsval be-
lltja, hogy a kiegszts az adatokat az ppen ltrehozott lista szerke-
zet u raktrbl vegye.
Kvetkez o lpsknt a 3738. sorban a gtk_entry_comple-
tion_set_text_column() fggvny segtsgvel belltjuk, hogy az au-
tomatikus kiegszts a lista szerkezet u raktr melyik oszlopbl trtn-
jen. Ez igen fontos lps, semmikppen nem szabad elfelejtennk!
Az utols feladat az automatikus kiegszts beviteli mez ohz rende-
lse, amelyet a 39. sorban a gtk_entry_set_completion() hvsval
vgznk el.
8.3.3. A fa szerkezet u raktr
Az ltalnos raktr msik megjelensi formja a fa szerkezet u raktr,
amelyben a lista szerkezet u raktrhoz hasonl mdon tbb oszlopban
trolhatunk adatok az egyes sorokhoz leszrmazottakat is rendelve. A fa
szerkezet u raktr kezelsre a GTK programknyvtr a GtkTreeStore
tpust biztostja a programoz szmra.
A fa szerkezet u raktr kezelsre ltrehozott fggvnyek kzl a legfon-
tosabbak a kvetkez ok:
GtkTreeStore
*
gtk_tree_store_new(gint oszlopszm, ...); A
fggvny segtsgvel j fa szerkezet u raktrat hozhatunk ltre.
A fggvny els o paramtere a ltrehozand raktr oszlopainak sz-
mt kell megadnunk, mg a tovbbi paramterei az egyes oszlopok
tpust adjk meg. Mindig pontosan annyi tpust kell megadnunk,
gtk 2007/10/21 14:22 page 269 #269
269
ahny oszlop ltrehozst az els o paramter el or. A a fggvny
paramtereinek rtelmezse megegyezik a gtk_list_store_new()
fggvny (263). oldal) paramtereinek rtelmezsvel.
A fggvny visszatrsi rtke az jonan ltrehozott fa szerkezet u
raktrat jelli a memriban.
void gtk_tree_store_clear(GtkTreeStore
*
raktr); A fggvny
segtsgvel a fa szerkezet u raktrbl az sszes elemet trlhetjk.
A fggvny paramtere a fa szerkezet u raktrat jelli a memriban.
void gtk_tree_store_append(GtkTreeStore
*
raktr,
GtkTreeIter
*
bejr, GtkTreeIter
*
szlo); A fggvny
segtsgvel egy j sort helyezhetnk el a fa szerkezet u rak-
trban. Ez a fggvny a fa megadott eleme leszrmazottainak
vgre msol egy j sort, amelynek rtkeit az albb bemutatott
gtk_list_store_set() fggvnnyel kell belltanunk.
A lista s fa szerkezet u raktrak kezelsre hasznlhat fgg-
vnyek ltalban azonos paramterezs uek, de ez a fggvny
klnbzik a lista szerkezet u raktrban j elemet elhelyez o
gtk_list_store_append() fggvnyt ol, hiszen ha a fban szeret-
nnk j elemet elhelyezni, akkor meg kell adnunk az j elem szl o-
jt is.
A fggvny els o paramtere a fa szerkezet u raktrat jelli a memri-
ban. A msodik paramter azt a bejrt jelli, amelyet a fggvny
az ltala ltrehozott j elemre fog lltani, mg a harmadik para-
mter annak a bejrnak a cmt adja meg, amelyik kijelli azt az
elemet, amelynek az j elem az utols leszrmazottja lesz. Ha ez
utbbi paramter rtke NULL, akkor a fggvny az j elemet a fa
szerkezt u raktr gykerben hozza ltre.
void gtk_tree_store_prepend(GtkTreeStore
*
raktr,
GtkTreeIter
*
bejr, GtkTreeIter
*
szlo); A fggvny
segtsgvel a fa szerkezet u raktrban j elemet hozhatunk ltre,
mgpedig valamelyik elem els o leszrmazottjaknt.
A fggvny paramtereinek rtelmezse s a m ukdse is megegye-
zik a gtk_tree_store_append() fggvnynl meggyeltekkel, az-
zal a klnbsggel, hogy ez a fggvny nem a leszrmazottak list-
jnak vgn, hanem az elejn hozza ltre az j elemet.
void gtk_tree_store_set(GtkTreeStore
*
raktr, GtkTreeIter
*
bejr, ..., -1); A fggvny segtsgvel a fa szerkezet u
raktr adott eleme ltal hordozott adatokat llthatjuk be. E fgg-
vnynek a hasznlata megegyezik a lista szerkezet u raktr hason
fggvnynek hasznlatval.
gtk 2007/10/21 14:22 page 270 #270
270
A fggvny els o paramtere a raktrat, msodik paramtere pedig a
mdostand elemre lltott bejrt jelli a memriban. A fggvny
tovbbi paramterei a mdostand oszlopok szmbl s a raktr-
ban elhelyezend o j rtkb ol ll prok. A paramterlista vgt a 1
rtkkel kell jeleznnk.
8.4. A cellarajzolk
A cellarajzolk a GTK programknyvtr ltal biztostott, klnfle adat-
tpusokat megjelent o eszkzk, amelyek az adatokat megjelent o kper-
ny oelem egyes rszeihez rendelhet ok a klnfle adatok megjelentsre.
A 8.7. brn lthatjuk hogyan jelennek meg klnfle cellarajzolk a
kperny on.
8.7. bra. A cellarajzolk munka
kzben
Az brn kt kombinlt dobozt lthatunk.
Mindkt dobozban egy kp s egy karakter-
lnc jelenik meg. Ezt a szerkezetet gy hoz-
tuk ltre, hogy a kombinlt dobozhoz kt cel-
larajzolt rendeltnk, egy, a bal oldalon meg-
jelen o kpet kszt o cellarajzolt s t ole balra
egy szveget megjelent o cellarajzolt. A plda
mindkt cellarajzolja a megjelentend o ada-
tot egy lista szerkezet u raktr megfelel o t-
pus oszlopbl veszi, gy a kombinlt dobozhoz tartoz lista minden
sorban a lista szerkezet u raktr megfelel o sorban trolt kp s szveg
jelenik meg.
A cellarajzolk, a fa s lista szerkezet u raktrak s az sszetett adat-
szerkezetek megjelentsre hasznlhat kperny oelemekb ol teht olyan
sszetett viselkeds u rendszert kszthetnk, ami elg rugalmasak ah-
hoz, hogy az ignyeinknek megfelel o formban tegyk lehet ov az adat-
kezelst a felhasznl szmra. Ennek azonban ra is van, hiszen a cel-
larajzolk hasznlata nem mindig egyszer u.
A GTK programknyvtr a cellarajzolk alaptpusaknt a
GtkCellRenderer tpust hozza ltre. Ilyen tpus adatszerkezetet
ltalban nem hozunk ltre, konkrt cellarajzolknt ltalban a
GtkCellRenderer leszrmazottjaiknt megvalstott s a kvetkez o
oldalakon bemutatott tpusokat hasznljuk. gy is gondolhatunk teht
a GtkCellRenderer tpusra mint az objektumorientlt programozs egy
absztrakt osztlyra, ami nem pldnyosthat, kizrlag az rkl ods
segtsgvel hasznlhat.
A GtkCellRenderer a GtkObject leszrmazottja, teht nem kp-
erny oelem, hiszen nem a GtkWidget osztly leszrmazottjaknt k-
szlt. A GtkObject viszont a GObject kzvetett leszrmazottja, gy a
GtkCellRenderer s leszrmazottai kezelhet ok a G programknyvtr
gtk 2007/10/21 14:22 page 271 #271
271
tulajdonsgok trolsra hasznlt g_object_set() s g_object_get()
fggvnyeivel.
A G programknyvtr ltal kezelt tulajdonsgok amelyeket a doku-
mentciban a properties cm alatt tallhatunk radsul igen fontos
szerepet tltenek be a cellarajzolk m ukdsben. Ennek az az oka, hogy
a cellarajzol kpes arra, hogy a konkrt cella tulajdonsgait lista vagy
fa szerkezet u raktrbl olvassa.
Ha pldul a lista kperny oelem els o oszlopnak a megjelentsre sz-
veges cellarajzolt hozunk ltre s a listhoz rendelt msodik oszlopban
klnfle sznek angol nyelv u neveit helyezzk el, akkor megtehetjk,
hogy a els o oszlopban megjelen o cellarajzol httrsznt bellt tulaj-
donsgt a lista szerkezet u raktr msodik oszlophoz rendeljk s gy
elrjk, hogy a kperny on minden sor a megfelel o httrsznnel jelenjen
meg.
A kvetkez o lista a GtkCellRenderer legfontosabb tulajdonsgait tar-
talmazza. Ezeket a tulajdonsgokat minden cellarajzol esetben hasz-
nlhatjuk. A tulajdonsgok kzl nhny nagyon hasonlt a 237. oldalon
bemutatott tulajdonsgokhoz, ezrt ezeket csak vzlatosan rjuk le.
"cell-background", gchararray A cellban hasznlt httrszn neve,
vagy szveges HTML kdja.
"cell-background-gdk", GdkColor A cellban hasznlt httrszn
GdkColor tpussal megadva.
"cell-background-set", gboolean Logikai rtk, ami megadja, hogy a
httrsznt gyelembe kell-e venni a cella rajzolsakor.
"height", gint A cella magassga kppontban mrve. Ezt a tulajdon-
sgot csak akkor kell megadnunk, ha nem akarjuk, hogy a GTK
programknyvtr automatikusan lltsa be a magassgot. Az alap-
rtelmezett rtk 1, ami jelzi, hogy a cella mindig a szksges ma-
gassg helyet foglalja el.
"is-expanded", gboolean Logikai rtk, ami megadja, hogy az adott
cella nyitva vagy zrva van-e. Ha a cellkat a kperny on faknt
jelentjk meg, akkor az egyes gakat, alpontokat kinyithatjuk s
becsukhatjuk ennek a tulajdonsgnak a segtsgvel.
"sensitive", gboolean Logikai rtk, ami megadja, hogy az adott cella
rzkeny-e a felhasznl ltal keltett ingerekre.
"visible", gboolean Logikai rtk, ami megadja, hogy a cella lthat-
e, esetleg rejtett.
gtk 2007/10/21 14:22 page 272 #272
272
"width", gint A cella szlessge kppontokban mrve. Ezt a tulajdon-
sgot csak akkor kell belltanunk, ha azt akarjuk, hogy a cella sz-
lessgt a GTK programknyvtr ne automatikusan lltsa be. En-
nek a tulajdonsgnak az alaprtelmezett rtke 1, ami jelzi, hogy
a cella szlessge automatikusan lltand.
"xalign", gfloat FIXME: Nem m ukdik?
"xpad", guint A cella bal oldaln resen hagyand terlet szlessge
kppontban mrve. Ennem a tulajdonsgnak a segtsgvel egy osz-
lopon bell rzkeltethetjk az alrendeltsgi viszonyokat, a faszer-
kezetet, ami igan hasznos lehet ha pldul kombinlt dobozhoz tar-
toz listt ksztnk.
"yalign", gfloat FIXME: Nem m ukdik?
"ypad", guint A cella fels o rszn resen hagyand terlet magassga
kppontban mrve.
A cellarajzolk tulajdonsgainak belltsra a ks obbiekben, a konk-
rt cellarajzolk s kperny oelemek trgyalsa kzben rszletesen is be-
mutatjuk.
8.4.1. A szveges cellarajzol
A szveges cellarajzol az adatsorokat szveges formban jelenti meg
a kperny on mint ahogyan azt az egyszer u kombinlt dobozban, egy-
szer u listkban is meggyelhetjk. A GTK programknyvtr a szveges
cellarajzol ksztsre s hasznlatra a GtkCellRendererText tpust
biztostja a programoz szmra.
8.8. bra. A szve-
ges cellarajzol
A szveges cellarajzol a szveg egyszer u megjelentsnl
tbbre is kpes. Ha pldul a szveges cellarajzolt hasznl-
juk egy listban a lehet osget adhatunk a felhasznlnak
a szveg trsra, befolysolhatjuk a szveg s a httr
sznt, meghatrozhatjuk a cellban megjelen o szveg tr-
delst, azaz az egyszer u listnl sszetettebb viselkeds u
s megjelens u kperny oelemet kszthetnk, ami jobban
megfelel az ignyeinknek. A szerkeszthet o cellarajzol meg-
jelenst mutatja be a 8.8. bra, ahol a cellarajzolt szer-
keszts kzben gyelhetjk meg. A szveges cellarajzol lt-
rehozsra a kvetkez o fggvnyt hasznlhatjuk:
GtkCellRenderer
*
gtk_cell_renderer_text_new(void);
A fggvny segtsgvel j szveges cellarajzolt hozhatunk ltre. A
fggvny visszatrsi az j cellarajzolt jelli a memriban. Ahhoz,
gtk 2007/10/21 14:22 page 273 #273
273
hogy a cellarajzolt hasznlni is tudjuk azt egy cellk hasznlatra
felksztett kperny oelemhez kell rendelnnk.
A kvetkez o lista a szveges cellarajzol tulajdonsgait mutatja be. A
tulajdonsgok kzt vannak olyanok, amelyeket a cetlikkel kapcsolatban
is hasznlhatunk, s amelyeket emiatt mr rszletesen bemutattunk
a 8.2.4. oldalon kezd od o listban. Ezeket a tulajdonsgokat csak vz-
latosan ismertetjk.
"attributes", PangoAttrList Ennek a tulajdonsgnak a segtsgvel
a szveg sszes jellemz ojt egyszerre adhatjuk meg. Erre a legtbb
esetben nincs szksg, hiszen a tulajdonsgokat egyenknt, kln-
kln is bellthatjuk.
Ezt a tulajdonsgot PangoAttrList adatszerkezetknt kell meg-
adnunk, amelyet a pango_attr_list_new() fggvny segtsgvel
hozhatunk ltre.
"background", gchararray A szveg httrsznnek neve, vagy HTML
kdja.
"background-gdk", GdkColor A szveg htternek szne GdkColor
adatszerkezet segtsgvel megadva.
"background-set", gboolean Logikai rtk, ami megadja, hogy a ht-
trsznt gyelembe kell-e venni.
"editable", gboolean Logikai rtk, ami megadja, hogy a szveges cel-
larajzol lehet ov teszi-e, hogy a felhasznl megvltoztassa, trja
a cellban megjelen o szveget.
Ha ennek a tulajdonsgnak az rtke igaz, a felhasznl a szvegre
kattintva egy beviteli mez ot jelenthet meg, amivel a szveget a szo-
ksos mdon megvltoztathatja.
"editable-set", gboolean Logikai rtk, ami meghatrozza, hogy az
el oz o tulajdonsgot gyelembe kell-e venni.
"ellipsize", PangoEllipsizeMode Ez a tulajdonsg meghatrozza,
hogy mit kell tenni, ha a cella rajzolshoz rendelkezsre ll ter-
letre nem fr ki a szveg. A tulajdonsg a kvetkez o llandk egyikt
veheti fel rtkknt:
PANGO_ELLIPSIZE_NONE Ennek az llandnak a hatsra a Pango
programknyvtr semmilyen klnleges lpst nem tesz, a sz-
veg vge egyszer uen nem fog megjelenni a kperny on. Ez az
alaprtelmezett rtk.
gtk 2007/10/21 14:22 page 274 #274
274
PANGO_ELLIPSIZE_START Ennek az llandnak a segtsgvel elr-
hetjk, hogy a Pango programknyvtr a szveg elejr ol a meg-
felel o szm bet ut eltvoltsa s ezt az eltvoltott karakterek
helyn megjelentett . . . karakterekkel jelezze.
PANGO_ELLIPSIZE_MIDDLE A szveg rvidtse a szveg kzepnek
eltvoltsval s a . . . jelek bersval. Ez a mdszer kl-
nsen az llomnyok elrsi tjnak rvidtsre hasznlhat,
hiszen ott a szveg eleje s vge fontosabb, mint a kzepe.
PANGO_ELLIPSIZE_END A szveg rvidtse a szveg vgnek lev-
gsval s a . . . karakterek elhelyezsvel.
"ellipsize-set", gboolean Logikai rtk, ami jelzi, hogy a rvidts
mdjt gyelembe kell-e venni.
"family", gchararray A hasznland bet ucsald neve.
"family-set", gboolean Logikai rtk, ami jelzi, hogy a belltott bet u-
csaldot gyelembe kell-e venni.
"font", gchararray A bet utpus teljes neve.
"font-desc", PangoFontDescription A bet utpus a Pango program-
knyvtr adatszerkezeteknt megadva.
"foreground", gchararray A el otrszn neve.
"foreground-gdk", GdkColor Az el otrszn a GDK programknyvtr
adatszerkezeteknt megadva.
"foreground-set", gboolean Logikai tpus, ami megadja, hogy az el o-
trsznt gyelembe kell-e venni.
"language", gchararray A hasznlt nyelv szveges kdja.
"language-set", gboolean Logikai rtk, ami megadja, hogy a nyelvet
gyelembe kell-e venni.
"markup", gchararray A megjelentend o szveg a Pango program-
knyvtr jell onyelvt is gyelembe vve.
Ha a szveges cellarajzolban klnfle egyszer u szvegtpusokat,
szneket akarunk hasznlni a szveg kiemelsre, de nem akarunk
az itt bemutatott tulajdonsgok hasznlatval vesz odni, akkor j
tlet lehet a Pango jell onyelv hasznlata. Ha viszont azt akarjuk,
hogy a cellarajzol a szveg kirsakor gyelembe vegye a jell onyelv
elemeit, akkor a szveget a "markup" tulajdonsghoz rendelve kell
megadnunk.
gtk 2007/10/21 14:22 page 275 #275
275
"rise", gint A szveg alapvonaltl mrt tvolsga.
"rise-set", gboolean Logikai rtk, ami megadja, hogy az el oz o tulaj-
donsgot gyelembe kell-e venni.
"scale", gdouble A bet umret nagytsnak mrete.
"scale-set", gboolean Logikai rtk, ami megadja, hogy a bet utpus
nagytsnak rtkt gyelembe kell-e venni.
"single-paragraph-mode", gboolean Logikai rtk, ami megadja,
hogy a megjelentend o szveget mindenkppen egy bekezdsknt
kell-e megjelenteni.
"size", gint A hasznland bet umret.
"size-points", gdouble A hasznland bet umret pont mrtkegysg-
ben.
"size-set", gboolean Logikai rtk, ami megadja, hogy a bet umretet
gyelembe kell-e venni.
"stretch", PangoStretch A vzszintes nyjts mrtke.
"stretch-set", gboolean Logikai rtk, ami meghatrozza, hogy a
nyjtst gyelembe kell-e venni.
"strikethrough", gboolean Logikai rtk, ami megadja, hogy a szve-
get t kell-e hzni.
"strikethrough-set", gboolean Logikai rtk, ami megadja, hogy az
thzs belltst gyelembe kell-e venni.
"style", PangoStyle A bet ustlus.
"style-set", gboolean Logikai rtk, ami megadja, hogy a belltott
bet ustlust gyelembe kell-e venni.
"text", gchararray A megjelentend o szveg karakterlncknt meg-
adva.
Ha a szveges cellarajzol segtsgvel olyan szveget akarunk meg-
jelenteni, amelyben a Pango programknyvtr jell onyelvt nem
akarjuk gyelembe venni, akkor a megjelentend o szveget ehhez
a tulajdonsghoz kell rendelnnk.
"underline", PangoUnderline Az alhzs tpusa.
"underline-set", gboolean Logikai rtk, ami megadja, hogy az lh-
zs mdjt gyelembe kell-e venni.
gtk 2007/10/21 14:22 page 276 #276
276
"variant", PangoVariant A bet uvltozat.
"variant-set", gboolean Logikai rtk, ami megadja, hogy a bet uvl-
tozatot gyelembe kell-e venni.
"weight", gint A bet uvastagsg.
"weight-set", gboolean Logikai rtk, ami megadja, hogy a belltott
bet uvastagsgot gyelembe kell-e venni.
"width-chars", gint A cella szlessge a megjelenthet o karakterek
szmban megadva. Az alaprtelmezett rtk 1, ami jelzi, hogy ezt
a tulajdonsgot nem kell gyelembe venni.
"wrap-mode", PangoWrapMode A trdels mdja.
"wrap-width", gint A trdels helye az egy sorban megjelentend o ka-
rakterek szmval megadva. Az alaprtelmezett rtk 1, ami jelzi,
hogy a szveget nem kell trdelni.
Azoknak a szveges cellarajzolknak a kezelsre, amelyekben a fel-
hasznl megvltoztathatja a szveget, fontos a kvetkez o jelzs.
"edited" Ezt a jelzst a cellarajzol akkor kldi, amikor a felhasznl
befejezte a cella tartalmnak szerkesztst. Ehhez a jelzshez csat-
lakoznunk kell, hogy a raktrban trolt szveget megvltoztassuk.
A jelzs csatlakoztathat fggvny tpusa a kvetkez o:
void nv(GtkCellRendererText
*
cellarajzol, const
gchar
*
svny, const gchar
*
szveg, gpointer
adat);
Ilyen tpus fggvnyt kell csatlakoztatnunk az edited jelzs-
hez, hogy a GTK programknyvtr jelezze a cella megvltoz-
tatsa utn, hogy mit rt a cellba a felhasznl. A fggvny
paramterei a kvetkez ok:
cellarajzol A szvegmegjelent o cellarajzol, amelyik az
zenetet ltrehozte.
Klnsen hasznos ez a paramter akkor, ha kperny o-
elem tbb cellarajzoljhoz is ugyanazt a visszahvott fgg-
vnyt rendeljk, hiszen a GtkCellRendererText tpus
a GObject leszrmazottja, gy a g_object_set() fgg-
vnnyel adatokat rendelhetnk hozz, amit a visszahvott
fggvnyben a g_object_get() fggvnnyel lekrdezhe-
tnk.
Ha pldul tudnunk kell a visszahvott fggvnyben, hogy a
raktr melyik oszlopt kell mdostanunk, a cellarajzolk-
hoz hozzrendelhetjk a nekik megfelel o oszlopszmokat.
gtk 2007/10/21 14:22 page 277 #277
277
svny Ez a paramter meghatrozza, hogy a cellarajzol l-
tal rajzolt sorok kzl melyiket vltoztatta meg a felhasz-
nl. Ez a szveges formban megadott svny lista- s fa
szerkezet u raktrban is hasznlhat formban adja meg a
szerkesztett cella pontos helyt.
szveg A felhasznl ltal bert szveg, a cella j tartalma. Ezt
a szvget kell elhelyeznnk a raktrban.
adat A visszahvott fggvny nyilvntartsba vtelekor meg-
adott mutat, amelyet a programoz olyan rtk tad-
sra hasznl, amilyenre a visszahvott fggvnyben szk-
sge van.
A legegyszer ubb programok esetben pldul arra hasznl-
hatjuk ezt a mutatt, hogy a raktr memriabeli cmt t-
adjuk.
A szveges cellarajzl "edited" jelzsnek kezelst a 48. plda
mutatja be.
A kvetkez o plda bemutatja hogyan hozhatunk ltre szerkeszthet o
szveget tartalmaz cellarajzolt.
48. plda. A kvetkez o fggvnyek egy olyan listaszer u kperny oelemet
kezelnek, amelyben szerkeszthet o szveges cellarajzl is van. A fggv-
nyekben olyan eszkzket is hasznlunk, amelyeknek rszletes lerst
csak a ks obbiekben adjuk meg.
A plda els o fggvnye az a visszahvott fggvny, amelyet a GTK prog-
ramknyvtr akkor hv, amikor a felhasznl befejezte a cella szerkesz-
tst. Ha ezt a fggvnyt nem hoznnk ltre, a felhasznl ltal ltreho-
zott szveg nem kerlne vissza a raktrba, gy a szerkeszts vgn jra
megjelenne az eredeti szveg a kperny on. Ezt nyilvn nem akarjuk, a
visszahvott fggvnyt teht mindenkppen ltre kell hoznunk.
1 static void
2 cell_edited(GtkCellRendererText
*
cell,
3 const gchar
*
path_string,
4 const gchar
*
new_text,
5 GtkTreeStore
*
tree_store)
6 {
7 GtkTreePath
*
path;
8 GtkTreeIter iter;
9
10 path = gtk_tree_path_new_from_string(path_string);
11 gtk_tree_model_get_iter(GTK_TREE_MODEL(tree_store),
12 &iter, path);
13 gtk_tree_store_set(tree_store, &iter,
gtk 2007/10/21 14:22 page 278 #278
278
14 0, new_text,
15 -1);
16 gtk_tree_path_free(path);
17 }
A fggvny els o hrom paramtere a szveges cellarajzol, a szerkesz-
tett cella helyt megad karakterlnc s a szerkeszts sorn a felhasznl
ltal bert j szveg az "edited" jelzshez tartoz, a GTK program-
knyvtr ltal adott paramterek. A harmadik paramter a fa szerkezet u
raktrat jelli a memriban. Ezt a paramtert a visszahvott fggvny
nyilvntartsba vtelekor mi magunk adtuk meg.
A fggvny a 10. sorban a szerkesztett elem helyt ler szveges s-
vnylerbl egy svnyt, a 1112. sorokban pedig ebb ol az svnyb ol
egy bejrt hoz ltre.
Ezek utn a visszahvott fggvny a 1315. sorokban a bejr segts-
gvel trolja a raktrban a felhasznl ltal bert j szveget.
Utols lpsknt a 16. sorban megsemmistjk az svnyt, hiszen arra
a tovbbiakban mr nincsen szksgnk.
A kvetkez o fggvny egy fa kperny oelem ltrehozsakor hvott fgg-
vnyt mutat be. A fggvny elkszti s belltja a kperny oelemben meg-
jelen o cellarajzolkat. A fa kperny oelemre a ks obbiekben, a 298. olda-
lon tallhat a 8.7. szakaszban visszatrnk.
1 void
2 on_editable_text_treeview_realize(
3 GtkWidget
*
widget,
4 gpointer user_data)
5 {
6 GtkTreeViewColumn
*
column;
7 GtkCellRenderer
*
renderer;
8
9 /
*
A raktr.
*
/
10 GtkTreeStore
*
tree_store;
11 tree_store = gtk_tree_store_new(2,
12 G_TYPE_STRING,
13 G_TYPE_STRING);
14 fill_tree_store(tree_store);
15
16 /
*
Az els o oszlop.
*
/
17 column = gtk_tree_view_column_new();
18 gtk_tree_view_append_column(GTK_TREE_VIEW(widget),
19 column);
20 gtk_tree_view_column_set_title(column, "Cm1");
21
gtk 2007/10/21 14:22 page 279 #279
279
22 /
*
Az els o cellarajzol.
*
/
23 renderer = gtk_cell_renderer_text_new();
24 g_object_set(G_OBJECT(renderer), "editable",
25 TRUE, NULL);
26 g_signal_connect(renderer, "edited",
27 G_CALLBACK(cell_edited), tree_store);
28 gtk_tree_view_column_pack_start(column, renderer,
29 FALSE);
30 gtk_tree_view_column_add_attribute(column, renderer,
31 "text", 0);
32
33 /
*
A msodik oszlop.
*
/
34 column = gtk_tree_view_column_new();
35 gtk_tree_view_append_column(GTK_TREE_VIEW(widget),
36 column);
37 gtk_tree_view_column_set_title(column, "Cm2");
38
39 /
*
A msodik cellarajzol.
*
/
40 renderer = gtk_cell_renderer_text_new();
41 gtk_tree_view_column_pack_start(column, renderer,
42 TRUE);
43 gtk_tree_view_column_add_attribute(column, renderer,
44 "text", 1);
45
46 gtk_tree_view_set_model(GTK_TREE_VIEW(widget),
47 GTK_TREE_MODEL(tree_store));
48 }
A szerkeszthet o cellarajzolt a 23. sorban hozzuk ltre, szerkeszthe-
t ov pedig az "editable" tulajdonsg belltsval a 2425. sorokban
tesszk. A szerkesztsre alkalmas cellarajzol "edited" jelzshez a 26
27. sorokban csatlakozunk, ahol meggyelhetjk a cellarajzol ltal meg-
jelentett adatokat hordoz raktr paramterknt trtn o tadst is.
A fggvny tovbbi rszei ahhoz szksgesek, hogy a kt oszlopot meg-
jelent o cellarajzolk a megfelel o formban megjelenjenek a kperny on.
Ezekre az eszkzkre mg visszatrnk.
8.4.2. A kpmegjelent o cellarajzol
A kpmegjelent o cellarajzol ahogyan a neve is mutatja kpek meg-
jelentst teszi lehet ov cellkat tartalmaz kperny oelemeken bell.
A GTK programknyvtr a GtkCellRendererPixbuf tpust hasznlja a
kpmegjelent o cellarajzol hasznlatra.
gtk 2007/10/21 14:22 page 280 #280
280
A kpmegjelent o cellarajzol ltrehozsra a kvetkez o fggvnyt hasz-
nlhatjuk:
GtkCellRenderer
*
gtk_cell_renderer_pixbuf_new(void);
Ennek a fggvnynek a segtsgvel j kpmegjelent o cellarajzolt
hozhatunk ltre. A fggvny visszatrsi rtke az j cellarajzolt
jelli a memriban.
A kvetkez o lista a kpmegjelent o cellarajzol tulajdonsgait, azok ne-
veit s tpust, valamint jelentst mutatja be.
"follow-state", gboolean Logikai rtk, ami meghatrozza, hogy a
cella szne ami fgg attl, hogy a cella ki van-e jellve s az egr-
kurzor a cella felett tallhat-e befolysolja-e a kp sznt.
"icon-name", gchararray A megjelentend o ikon neve.
Ha a cellarajzolval a belltott tmnak megfelel o ikonokat aka-
runk megjelenteni, akkor az adatokat tartalmaz raktrban ikonok
nevt kell elhelyeznnk s az oszlopot ehhez a tulajdonsghoz kell
ktnnk.
Ez a tulajdonsg csak akkor fejti ki hatst, ha a "stock_id" s a
"pixbuf" tulajdonsgok nincsenek belltva.
"pixbuf", GdkPixbuf A megjelentend o kp a GDK programknyvtr
GdkPixbuf tpus adatszerkezeteknt.
"pixbuf-expander-closed", GdkPixbuf A faszerkezet u megjelents
esetn a leszrmazottal is rendelkez o sorok el ott egy kp jelenik
meg, ami jelzi, hogy az g becsukott, vagy kinyitott llapotban van-
e.
A becsukott llapot jelzsre megjelen o kpet ennek a tulajdonsg-
nak a segtsgvel hatrozhatjuk meg GDK programknyvtr adat-
szerkezetnek megadsval.
"pixbuf-expander-open", GdkPixbuf A kinyitott llapotot jelz o kp
(lsd az el oz o tulajdonsgot).
"stock-detail", gchararray FIXME: hogyan is?
"stock-id", gchararray Az el ore elksztett s tmtl fgg o ikon azo-
nostneve.
Ha a kpmegjelent o cellarajzol segtsgvel ilyen ikonokat aka-
runk megjelenteni, akkor a raktrban az ikonok nevt kell elhe-
lyeznnk s a megfelel o oszlopot ehhez a tulajdonsghoz kell ren-
delnnk.
gtk 2007/10/21 14:22 page 281 #281
281
"stock-size", guint Az el ore elksztett ikonok mrete. Ennek a tulaj-
donsgnak a megadsakor a kvetkez o llandkat hasznlhatjuk:
GTK_ICON_SIZE_INVALID Ismeretlen ikonmret.
GTK_ICON_SIZE_MENU A menkben, a menpontok el ott megjelen o
ikonoknak megfelel o mret.
GTK_ICON_SIZE_SMALL_TOOLBAR Az eszkzsvban meggyelhet o
cskkentett mret u ikonoknak megfelel o mret.
GTK_ICON_SIZE_LARGE_TOOLBAR Az eszkzsvban meggyelhet o
nagyobb mret ikonoknak megfelel o mret.
GTK_ICON_SIZE_BUTTON A nyomgombokban hasznlt ikonoknak
megelel o mret.
GTK_ICON_SIZE_DND A Drag&Drop m uveletek kzben az egrmu-
tat mellett meggyelhet o ikonoknak megfelel o mret.
GTK_ICON_SIZE_DIALOG Az zenetablakokban az zenet jellegt
jelz o ikonoknak megfelel o mret.
A kpmegjelent o cellarajzol hasznlatt a FIXME plda mutatja be
rszletesebben.
8.4.3. A kapcsol cellarajzol
A kapcsol cellarajzol logikai igaz, illetve logikai hamis rtk megjelen-
tsra hasznlhat. A 8.9. brn kapcsol cellarajzolt lthatunk a sorok
elejn, a szveges cellarajzol el ott.
8.9. bra. A kapcsol cellaraj-
zol
A kapcsol cellarajzol jell ongyzetknt vagy
rdigombknt jeleni meg a kperny on, jelli az
adott oszlopban tallhat logikai rtket s le-
het osget ad a felhasznlnak, hogy az rtket
egy egyszer u kattintssal megvltoztassa. Mag-
tl rtet odik, hogy a kapcsol cellarajzol akkor
lehet klnsen hasznos a programoz szmra,
ha egy id oben sok logikai rtket kell megjelen-
tenie a kperny on, hiszen a kpen is bemutatott
mdszerrel, egy listban elhelyezve az rtkeket,
szinte tetsz oleges sok rtk jelenthet o meg.
A kapcsol cellarajzol segtsgvel radsul
nem csak jell ongyzetknt s rdigombknt jelenthetjk meg a kap-
csol cellarajzolt, hasznlhatjuk ezeknek az kperny oelemeknek az in-
konzisztens llapott is, ami lehet ov teszi a be nem lltott llapot jelz-
st is.
A kapcsol cellarajzol kezelsre hasznosak lehetnek a kvetkez o
fggvnyek:
gtk 2007/10/21 14:22 page 282 #282
282
GtkCellRenderer
*
gtk_cell_renderer_toggle_new(void); A
fggvny segtsgvel j kapcsol cellarajzolt kszthetnk. A
fggvny visszatrsi rtke egy mutat, ami az j cellarajzolt
jelli a memriban.
gboolean gtk_cell_renderer_toggle_get_radio(GtkCellRendererToggle
*
rajzol);
Ennek a fggvnynek a segtsgvel lekrdezhetjk, hogy a kapcsol
cellarajzol jell ongyzetknt vagy rdigombknt fog-e megjelenni
a kperny on.
A fggvny argumentuma a cellarajzolt jelli a memriban, a
visszatrsi rtke pedig azt, hogy rgigombknt (logikai igaz r-
tk) vagy jell ongyzetknt (logikai hamis rtk) jelenik-e meg.
void gtk_cell_renderer_toggle_set_radio(GtkCellRendererToggle
*
rajzol, gboolean rdigombknt);
Ennek a fggvnynek a segtsgvel bellthatjuk, hogy a kapcsol
cellarajzol jell ongyzetknt vagy rdigombknt jelenjen-e meg a
kperny on.
A fggvny els o paramtere a kapcsol cellarajzolt jelli a memri-
ban, a msodik paramtere pedig megadja, hogy az rdigombknt
(logikai igaz rtk) vagy jell ongyzetknt (logikai hamis rtkknt)
jelenjen-e meg a kperny on. A kapcsol cellarajzolk alaprtelmezs
szerint jell ongyzetknt jelennek meg a kperny on, ha ez megfelel
a cljainknak, nem kell ezt a fggvnyt hasznlnunk.
Tudnunk kell azt is, hogy a kapcsol jell ongyzet megjelense nem
mdostja a viselkedst, s ot maga a cellarajzol nem kapcsoldik
t amikor a felhasznl rkattint, egyszer uen csak meghvja a meg-
felel o visszahvott fggvnyt. A programoznak kell gondoskodnia
arrl, hogy a visszahvott fggvnyben megvltoztassa a kapcsol
cellarajzol rtkt, ahogyan az is, hogy az tkapcsol rdigomb-
szer uen kikapcsolja az esetleg bekapcsolt egyb rdigombokat.
A kapcsol cellarajzolk esetben a kvetkez o tulajdonsgokat rdemes
ismernnk:
"activatable", gboolean Logikai rtk, ami megadja, hogy az adott
kapcsol cellarajzolt a felhasznl tkapcsolhatja-e, azaz az adott
kapcsolgomb rzkeny legyen-e.
Az alaprtelmezett rtk a TRUE, ami azt jelzi, hogy a kapcsol-
gombra kattintskor meghvdik a megfelel o visszahvott fggvny,
amiben a programoznak magnak kell gondoskodnia az tkapcso-
lsrl.
gtk 2007/10/21 14:22 page 283 #283
283
"active", gboolean Logikai rtk, ami megadja a kapcsol cellarajzol
llapott. Amikor lista vagy fa szerkezet u raktr logikai rtket t-
rol oszlopainak megjelentsre hasznljuk a cellarajzolt, ezt a
tulajdonsgot hozz szoktuk rendelni a raktr valamelyik oszlop-
hoz.
E tulajdonsg alaprtelmezett rtke a FALSE, amit nyilvn ritkn
hasznlunk, hiszen az llapotot mindig magunk lltjuk be.
"inconsistent", gboolean Logikai rtk, ami megadja, hogy a cella-
rajzol inkonzisztens llapotban van-e. Ha a kapcsol cellarajzol
inkonzisztens llapott is hasznlja a programunk, akkor szeren-
css ezt a tulajdonsgot is hozz rendelni a raktr egy oszlophoz.
E tulajdonsg alaprtelmezett rtke a FALSE, ami jelzi, hogy a cel-
larajzol nincs inkonzisztens llapotban s ami gy ltalban meg is
felel az ignyeinknek.
"radio", gboolean Logikai rtk, ami jelzi, hogy a kapcsol cellarajzol
rdigombknt jelenik-e meg, vagy jell ongyzetknt.
Az alaprtelmezett rtk a FALSE, ami jelzi, hogy a kapcsol cella-
rajzol jell ongyzetknt jelenik meg a kperny on.
A kapcsol cellarajzol hasznlathoz ismernnk kell a kvetkez o jel-
zst:
toggled Ezt a jelzst akkor kldi a kapcsol cellarajzol, amikor a fel-
hasznl kattintssal tkapcsolja az llapott. Mivel a cellarajzol
magtl nem vltoztatja meg az llapott, ezt a jelzst mindenkp-
pen kezelnnk kell, ha a cellarajzolt tkapcsolhat mdon akarjuk
kezelni a programunkban.
A jelzshez hasznlhat visszahvott fggvny tpusa a kvetkez o:
void nv(GtkCellRendererToggle
*
cellarajzol, gchar
*
svny, gpointer adat);
A fggvny paramtere a kvetkez ok:
cellarajzol Ez a paramter egy mutat, ami azt a cellaraj-
zolt jelli a memriban, amely a jelzst ltrehozta. Ha a
visszahvott fggvny tbb cellarajzol zeneteit is kezeli
(azaz tbb oszlop jelzseit is fogadja), arra hasznlhatjuk
ezt a paramtert, hogy azonostsuk az oszlopot pldul gy,
hogy a cellarajzolhoz a ltrehozsakor adatokat rendelnk
a g_object_set_data() fggvnnyel.
svny Ez a karakterlnc megadja a konkrt cellhoz vezet o
svnyt, ami lista s fa szerkezet u raktrakban is kpes
egyrtelm uen azonostani, hogy a felhasznl melyik sorra
kattintott.
gtk 2007/10/21 14:22 page 284 #284
284
adat Ez a paramter egy mutat, azt az rtket adja meg, amit
a visszahvott fggvny nyilvntartsba vtelekor megad-
tunk.
A legtbb esetben arra hasznljuk ezt a paramtert, hogy
a visszahvott fggvnynek tadjuk a raktr cmt, ami az
adatokat tartalmazza.
A kvetkez o plda vltoztathat rtk u kapcsol cellarajzolt mutat be.
A plda sorai tartalmaznak olyan fggvnyhvsokat is, amelyeket csak
aks obbiekben mutatunk be rszletesebben, de a magyarzat alapjn a
m ukdse ennek ellenre megrthet o.
49. plda. A kvetkez o fggvny egy lista kperny oelemet valst meg.
A lista els o oszlopa a tkapcsolhat jell ongyzeteket, msodik oszlopa
szveges magyarzatot tartalmaz. A program kperny okpe a 8.9. brn
lthat.
1 static void
2 cell_toggled(GtkCellRendererToggle
*
cell,
3 gchar
*
path_str,
4 GtkTreeModel
*
model)
5 {
6 GtkTreeIter iter;
7 gboolean value;
8 GtkTreePath
*
path =
9 gtk_tree_path_new_from_string(path_str);
10
11 gtk_tree_model_get_iter(model, &iter, path);
12 gtk_tree_model_get(model, &iter,
13 0, &value, -1);
14
15 value ^= 1;
16
17 gtk_list_store_set(GTK_LIST_STORE (model), &iter,
18 0, value, -1);
19 gtk_tree_path_free(path);
20 }
21
22 void
23 on_toggle_treeview_realize(GtkWidget
*
widget,
24 gpointer user_data)
25 {
26 GtkTreeViewColumn
*
column;
27 GtkCellRenderer
*
renderer;
28 GtkTreeIter iter_level0;
gtk 2007/10/21 14:22 page 285 #285
285
29
30 /
*
A raktr.
*
/
31 GtkTreeStore
*
list_store;
32 list_store = gtk_list_store_new(2,
33 G_TYPE_BOOLEAN,
34 G_TYPE_STRING);
35 fill_list_store(list_store);
36
37 /
*
Az oszlop.
*
/
38 column = gtk_tree_view_column_new();
39 gtk_tree_view_append_column(GTK_TREE_VIEW(widget),
40 column);
41 gtk_tree_view_column_set_title(column,
42 "Bevsrllista");
43
44 /
*
Az els o cellarajzol.
*
/
45 renderer = gtk_cell_renderer_toggle_new();
46 g_signal_connect(renderer, "toggled",
47 G_CALLBACK(cell_toggled), list_store);
48 gtk_tree_view_column_pack_start(column, renderer,
49 FALSE);
50 gtk_tree_view_column_add_attribute(column, renderer,
51 "active", 0);
52
53 /
*
A msodik cellarajzol.
*
/
54 renderer = gtk_cell_renderer_text_new();
55 gtk_tree_view_column_pack_start(column,
56 renderer, TRUE);
57 gtk_tree_view_column_add_attribute(column, renderer,
58 "text", 1);
59
60 gtk_tree_view_set_model(GTK_TREE_VIEW(widget),
61 GTK_TREE_MODEL(list_store));
62 }
A plda 2262. sorai kzt gyelhetjk meg a fa kperny oelem ltreho-
zsakor visszahvott fggvnyt, ami a kperny oelem megjelentse el ott
elkszti s belltja a kperny on megjelentend o oszlopokat.
A fggvny a 3234. sorokban ltrehoz egy lista tpus kperny oele-
met, amelynek els o oszlopa logikai, msodik oszlopa pedig karakterlnc
tpus rtket hordoz.
A fggvny 3842. soraiban ltrehozunk egy oszlopot, amelyet aztn
hozzrendelnk a fa kperny oelemhez. Ezekre a lpsekre a ks obbiek-
ben, a fa kperny oelem bemutatsa sorn rszletesen is visszatrnk.
gtk 2007/10/21 14:22 page 286 #286
286
A kapcsol cellarajzolt a 45. sorban hozzuk ltre. A 4647. so-
rok kzt a kapcsol cellarajzol toggled jelzshez hozzrendeljk a
cell_toggled() fggvny hvst. Figyeljk meg, hogy a nyilvntar-
tsba vett visszahvott fggvnynek paramterknt minden hvskor t-
adjuk a list_store mutat rtkt, gy a visszahvott fggvny kpes
lesz megvltoztatni a lista szerkezet u raktr tartalmt.
A fggvny a 48. sorban a ltrehozott cellarajzolt hozzrendeli a kp-
erny oelem oszlophoz. Erre a lpsre a fa kperny oelem bemutatsa
sorn visszatrnk, ahogyan a fggvny 5051. sorban meggyelhet o
fggvnyhvsra is, amelynek sorn a kapcsol cellarajzol llapott (a
"active" tulajdonsg) hozzrendeljk a lista szerkezet u raktr els o osz-
lophoz.
A fggvny tovbbi soraiban el oszr elksztjk s belltjuk a szveges
cellarajzolt (5358. sorok), majd a lista tpus raktrat hozzrendeljk
a fa kperny oelemhez.
A plda 120. soraiban tallhat a visszahvott fggvny, amit a 4647.
sorokban vettnk nyilvntartsba, hogy a GTK programknyvtr meg-
hvja, amikor a kapcsol cellarajzolt a felhasznl tkapcsolja.
A fggvny a 89. sorokban a paramterknt kapott szveges lerbl
ltrehoz egy svnyt ami a felhasznl ltal aktivlt cellt azonostja. A
fggvny ezek utn a 11. sorban belltja a helyi vltozknt ltrehozott
fabejrt a raktr kezelsre.
Ezek utn a kvetkez o lps a raktr olvassa (1213. oldal), a logikai
rtk ellentettjnek kiszmtsa (15. sor) s az rtk visszarsa (1718.
sor). Figyeljk meg, hogy a fggvny a raktr legels o (0 sorszm) oszlo-
pt olvassa s rja, ami jelzi, hogy csak egy cellarajzol, a legels o oszlopot
kezel o cellarajzol kezelsre van felksztve.
Ezek utn a fggvny a 19. sorban megsemmisti a mr szksgtelen
svnyt.
A visszahvott fggvny kapcsn meggyelhetjk, hogy az kizrlag a
raktr adott elemnek ellentettjre lltst vgzi el, nem kld zenetet
a mdostsrl, nem gondoskodik arrl, hogy a kperny o kvesse a vl-
toztatst. Erre nincs is szksg, a cellarajzol automatikusan kveti a
raktr mdostsait.
8.4.4. A folyamatjelz o cellarajzol
A folyamatjelz o cellarajzol segtsgvel a felhasznlt tbb egyid oben
zajl esemny el oreheledtrl tjkoztathatjuk. Ilyen jelleg u eszkzre vi-
szonylag ritkn van szksgnk, ha azonban sok szlon fut programot
ksztnk ez az eszkz nagymrtkben nvelheti programunk hasznlha-
tsgt. A folyamatjelz o cellarajzol ltrehozsra a kvetkez o fggvnyt
hasznlhatjuk:
gtk 2007/10/21 14:22 page 287 #287
287
GtkCellRenderer
*
gtk_cell_renderer_progress_new(void); A
fggvny segtsgvel j folyamatjelz o cellarajzolt hozhatunk
ltre. A fggvny visszatrsi rtke az j cellarajzolt jelli a
memriban.
A folyamatjelz o cellarajzol legfontosabb tulajdonsgait s azok tpust
a kvetkez o lista mutatja be.
"text", gchararray A folyamatjelz o cellarajzol terletn megjelen o
szveg. Ha ezt a tulajdonsgot belltjuk a cellarajzol ltal elfog-
lalt terletet ktszeresen is hasznosthatjuk.
"value", gint A folyamatjelz o cellarajzolban megjelentett szmjelleg u
rtk, ami 0 s 100 kztt a cellban megjelen o sv hosszt adja meg
szzalkos formban.
8.5. A cellaelrendezs
A cellarajzolkat ahhoz, hogy megjelenjenek el kell helyeznnk a
kperny on, erre pedig a cellaelrendezseket hasznlhatjuk. A GTK prog-
ramknyvtr a cellaelrendezs kezelsre a GtkCellLayout tpust hozza
ltre. A GtkCellLayout egy interfsz, amelyet mindazoknak az eszkzk-
nek meg kell valstaniuk, amelyek cellarajzolk segtsgvel kvnnak
adatokat megjelenteni.
A cellarajzol fontos, de nem az egyetlen tulajdonsga az, hogy tbb
cellarajzol befogadsra is alkalmas, gy egyetlen cellaelrendezsen be-
ll tbb cellarajzol is megjelenthet o. A cellaelrendezs msik fontos k-
pessge az, hogy a benne elhelyezett cellarajzolk tulajdonsgait ame-
lyeket a konkrt cellarajzolk esetben mr rszletesen bemutattunk
kpes raktrakbl, azok megfelel o sorainak s oszlopainak olvassval
belltani. Ennek a kpessgnek ksznhet o, hogy a cellaelrendezsben
a cellarajzolk az egyes sorokban vagy oszlopokban klnfle adatokat
kpesek megjelenteni.
A cellarajzolk hasznlatt a kvetkez okppen foglalhatjuk ssze. El o-
szr ltre kell hoznunk egy raktrat, amelyben elhelyezzk a megjelen-
tend o adatokat, majd ltre kell hoznunk a cellarajzolkat, amelyek meg-
jelentik ezeket az adatokat. A kvetkez o lpsknt olyan kperny oelemre
van szksgnk, amely megvalstja a cellaelrendezs interfszt, majd
ebben a cellaelrendezsben el kell helyeznnk a cellarajzolkat. Utols
lpsknt a cellarajzol megfelel o fggvnyeinek segtsgvel be kell ll-
tanunk, hogy az a cellarajzol mely tulajdonsgait olvassa a raktr egyes
oszlopaibl. A munka ktsgtelenl bonyolult egy kiss, viszont igen ru-
galmasan hasznlhat eszkzknt sszetett, az ignyeinkhez alakthat
felhasznli felletet eredmnyez.
gtk 2007/10/21 14:22 page 288 #288
288
A kvetkez o fggvnyek segtsgvel a cellaelrendezsben a cellarajzo-
lk elhelyezhet ok s a raktr fel a megfelel o kapcsolatok felpthet ok:
void gtk_cell_layout_pack_start(GtkCellLayout
*
cellaelrendezs, GtkCellRenderer
*
cellarajzol,
gboolean nyjt); A fggvny segtsgvel a cellaelrendezs-
ben j cellarajzolt helyezhetnk el. Egy cellaelrendezsben tbb
cellarajzol is lehet, a cellarajzol azonban csak egy cellaelrende-
zsben jelenthet o meg. E fggvny a cellarajzolt a cellaelrendezs
elejn, annak els o elemeknt szrja be.
A fggvny els o paramtere a cellaelrendezst, msodik paramtere
pedig a cellarajzolt jelli a memriban.
A fggvny harmadik paramtere logikai rtk, ami megadja, hogy
az adott cellarajzol mrett szksg esetn nyjtani lehet-e. Ha ez
a paramter TRUE rtk u, a cellarajzol mrete nvelhet o, ha FALSE,
akkor nem. A cellaelrendezs az esetleges helytbbletet egyenl o
arnyban osztja el a nyjthat mdon elhelyezett cellarajzolk kzt.
void gtk_cell_layout_pack_end(GtkCellLayout
*
cellaelrendezs, GtkCellRenderer
*
cellarajzol,
gboolean nyjt); E fggvny m ukdse megegyezik a
gtk_cell_layout_pack_start() fggvny m ukdsvel, de a
cellarajzolt nem a cellaelrendezs elejre, hanem a vgre helyezi
el.
void gtk_cell_layout_set_attributes(GtkCellLayout
*
cellaelrendezs, GtkCellRenderer
*
cellarajzol, ...,
NULL); A fggvny segtsgvel bellthatjuk, hogy az egyes benne
elhelyezett cellarajzolkban milyen mdon jelentse meg a raktr
elemeit. A fggvny a cellaelrendezs szmra esetlegesen mr
belltott sszes kapcsolatokat megsznteti s a paramterknt
megadott rtkekkel helyettesti.
A fggvny els o paramtere a cellaelrendezst, a msodik param-
tere pedig a cellarajzolt jelli a memriban.
A fggvny tovbbi paramterei prok, amelyeknek els o tagja az
adott cellarajzol tulajdonsgnak neve, msodik tagja pedig egy
szm, ami megadja, hogy az adott tulajdonsgot a hasznlt raktr
melyik oszlopa alapjn kell vltoztatni.
A fggvny paramtereiknt megadott prok vgn egy NULL rtket
kell megadnunk, ellenkez o esetben a program futsa megszakad-
hat.
voidgtk_cell_layout_add_attribute(GtkCellLayout
*
cellaelrendezs, GtkCellRenderer
*
cellarajzol, const
gtk 2007/10/21 14:22 page 289 #289
289
gchar
*
tulajdonsgnv, gint oszlopszm); A fggvny m u-
kdse hasonlt a gtk_cell_layout_set_attributes() fggvny
m ukdsvel, de e fggvny segtsgvel a kapcsolatokat egyen-
knt, fokozatosan vehetjk nyilvntartsba, mert az a fggvny
a meglv o kapcsolatokat nem trli, csak egy j kapcsolatot vesz
nyilvntartsba. Nyilvnval, hogy ezt a fggvnyt akkor clszer u
hasznlni, ha a cellarajzol llapott csak egy rtk mdostja.
A cellaelrendezs hasznlatt a kvetkez o plda mutatja be, ahol cella-
elrendezsknt egy, a ks obbiekben bemutatott tpust hasznlunk.
50. plda. A kvetkez o programrszlet a cellaelrendezs hasznlatt
mutatja be. Az albbi sorok egy cellaelrendezst hoznak ltre s abban
kt cellarajzolt helyeznek el, valamint megteremtik a kapcsolatot a raktr
s a cellaelrendezs kzt.
1 col = gtk_tree_view_column_new();
2 gtk_tree_view_append_column(GTK_TREE_VIEW(widget), col);
3 gtk_tree_view_column_set_title(col, "Cm");
4
5 renderer = gtk_cell_renderer_pixbuf_new();
6 gtk_tree_view_column_pack_start(col, renderer, FALSE);
7 gtk_tree_view_column_add_attribute(col, renderer,
8 "pixbuf", 0);
9
10 renderer = gtk_cell_renderer_text_new();
11 gtk_tree_view_column_pack_start(col, renderer, TRUE);
12 gtk_tree_view_column_add_attribute(col, renderer,
13 "text", 1);
A programrszlet 1. sorban egy, a kperny on megjelenthet o fa kper-
ny oelem oszlopt reprezentl adatszerkezetet hozunk ltre. Ezt az esz-
kzt a ks obbiekben a 8.7. szakaszban mutatjuk be, egyel ore elg annyit
tudnunk rla, hogy cellaelrendezsknt is hasznlhat.
A rszlet 2. sorban a cellarajzolknt hasznlhat oszlopot elhelyez-
zk egy kperny olemben, hogy a kperny on megjelenjen, majd a 3. sor-
ban belltjuk a cmt. Ezek a lpsek egy konkrt programban fontosak,
a cellaelrendezsek m ukdsnek megrtse szempontjbl azonban l-
nyegtelenek.
El ofordulhat, hogy az adatokat tartalmaz raktr egyes osz-
lopai s a cellarajzolk tulajdonsgai kzt nem tudunk egy-
szer u kapcsolatot megfogalmazni, azaz a megjelents miknt-
jt nem tudjuk a gtk_tree_view_column_add_attribute()
gtk_cell_layout_set_attributes() fggvny segtsgvel megfo-
galmazni.
gtk 2007/10/21 14:22 page 290 #290
290
8.10. bra. A cella adatfggvny ha-
tsa
Nha a megjelentend o adatokat a megje-
lents el ott t kell alaktanunk. Egy konk-
rt alkalmazs esetben pldul knnyen
lehet, hogy a raktrban trolt szmokat
mrtkegysggel akarjuk megjelenteni egy
sajt fggvny meghvsval. Az is lehet,
hogy az adatokat az rtkkt ol fgg oen
ms-ms formban akarjuk a kperny ore
rajzolni, lehetsges pldul, hogy a nega-
tv szmokat piros, mg a pozitv szmokat
fekete bet ukkel akarjuk szedni, hogy bizo-
nyos sorokra felhvjuk a gyelmet.
Ezekre az esetekre lthatunk pldt a 8.10. brn. Az bra kltsg
oszlopa szm jelleg u rtket tartalmaz, a kperny on val megjelents-
kor azonban a pnznemet is utna kell rnunk. A 0 rtket tartalmaz
soroknl viszont mind a pnznem, mind pedig a szm elmarad, a sz-
veges cellarajzolval egyetlen bet ut sem rajzolunk. Radsul az oszlop
bet utpusa is vltozik annak fggvnyben, hogy milyen jelleg u sorban
vagyunk. Az sszestett rtket jelz o sorban flkvr d olt bet uvel szed-
jk az rtket, ami nyilvnvalan sokkal olvashatbb teszi a kperny on
megjelentett adatokat.
Ilyen jelleg u megoldsokat gy kszthetnk, hogy a megjelentett ada-
tok s a cellarajzolk kz bekelnk egy sajt kszts u fggvnyt,
ami minden sorra kiolvassa a raktr adatait s belltja a cellarajzol
tulajdonsgait. A fggvnyt el kell ksztennk, majd a cellaelrendezs
ltrehozsa utn nyilvntartsba kell vetetnnk. Ehhez a kvetkez o esz-
kzkre van szksgnk.
void gtk_cell_layout_set_cell_data_func(GtkCellLayout
*
cellaelrendezs, GtkCellRenderer
*
cellarajzol,
GtkCellLayoutDataFunc fggvny, gpointer adatok,
GDestroyNotify felszabadt); Ennek a fggvnynek a
segtsgvel a raktr adatai s a cellarajzol kzs sajt kszts u
cella adatfggvnyt helyezhetnk. A cella adatfggvnyt a GTK
minden megjelentend o sorra meghvja, feladata, hogy a raktrbl
az adatokat kiolvassa s a cellarajzol tulajdonsgait melyek meg-
hatrozzk a megjelentend o adatokat s a megjelnts formjt is
belltsa.
A fggvny els o paramtere a cellaelrendezst, msodik param-
tere pedig a cellarajzolt jelli a memriban. A fggvny harmadik
paramtere a cella adatfggvny cme, negyedik paramtere pedig
a cella adatfggvnynek tadand kiegszt o adatokat tartalmaz
memriaterletet jelli a memriban. Ez utbbi paramter rtke
lehet NULL, ha a szoksos paramtereken kvl nem akarunk mst
gtk 2007/10/21 14:22 page 291 #291
291
tadni a cella adatfggvnynek.
A fggvny tdik paramtere egy olyan fggvny, ami a cella adat-
fggvnynek tadand kiegszt o adatokat felszabadt fggvny,
amelyet a GTK akkor hv, ha a kiegszt o adatokra mr nincs szk-
sg. Ha ilyen felszabadt fggvnyt nem akarunk hasznlni ez a
paramter is lehet NULL.
void fggvnynv(GtkCellLayout
*
cellaelrendezs,
GtkCellRenderer
*
cellarajzol, GtkTreeModel
*
raktr,
GtkTreeIter
*
bejr, gpointer adatok); Ilyen tpus fgg-
vnyt kell ksztennk cella adatfggvnyknt.
A fggvny els o s msodik paramtere a cellaelrendezst s a cella-
rajzolt jelli a memriban. A harmadik paramter a raktr cme,
ahonnan az adatokat a fggvnynek ki kell olvasnia.
A negyedik paramter egy bejrt jell a memriban. A bejr a
raktr azon sort azonostja, amelynek rajzolsra ppen szksg
van. Azt, hogy a raktr melyik oszlopaibl olvassa a cella adatfgg-
vny az adatokat, neknk kell eldntennk. A legtbb esetben tbb
oszlop rtkre is szksgnk van annak eldntsre, hogy mi s
f oleg milyen formban jelenjen meg a cellarajzolban.
A fggvny tdik paramtere a kiegszt o adatokat jelli a mem-
riban. A kiegszt o adatokat a cella adatfggvny nyilvntartsba
vtelekor hatrozhatjuk meg.
void fggvny(gpointer adatok); Ilyen tpus fggvnyt kell fel-
szabadt fggvnyknt kszteni, ha a kiegszt o adatok automa-
tikus felszabadtsra is szksgnk van.
A fggvny paramtere a felszabadtand o kiegszt o adatokat jelli
a memriban. Lthatjuk, hogy felszabadt fggvnyknt egyszer u
esetben akr a g_free() fggvny is megadhat.
A kvetkez o plda a cella adatfggvny elksztst s megvalstst
mutatja be a 8.10. brn. lthat kperny okpet el ollt program egy
rszletnek segtsgvel.
51. plda. A kvetkez o sorok egy cella adatfggvnyt mutatnak be. A
fggvny egyszer u, kiegszt o adatokat nem fogad, a szveges cellarajzol
ltal megjelentend o szveget s annak formjt hatrozza meg.
1 static void
2 render_cost(
3 GtkCellLayout
*
cell_layout,
4 GtkCellRenderer
*
cell,
gtk 2007/10/21 14:22 page 292 #292
292
5 GtkTreeModel
*
tree_model,
6 GtkTreeIter
*
iter,
7 gpointer data)
8 {
9 gboolean placeholder;
10 gboolean commission;
11 gboolean sumline;
12 gchar
*
designation;
13 gint cost;
14 gchar
*
text;
15
16 gtk_tree_model_get(tree_model, iter,
17 ColumnIsPlaceholder, &placeholder,
18 ColumnIsCommission, &commission,
19 ColumnDesignation, &designation,
20 ColumnCost, &cost,
21 ColumnIsTotal, &sumline,
22 -1);
23
24 text = g_strdup_printf(_("%d Ft"), cost);
25
26 g_object_set(G_OBJECT(cell),
27 "text", cost <= 0 ? "" : text,
28 "foreground", placeholder ? "Gray" : "Black",
29 "editable", !commission && !sumline &&
30 !placeholder,
31 "weight", sumline ? PANGO_WEIGHT_BOLD :
32 PANGO_WEIGHT_NORMAL,
33 "style", sumline ? PANGO_STYLE_ITALIC :
34 PANGO_STYLE_NORMAL,
35 NULL);
36
37 g_free(text);
38 }
A fggvny 1622. soraiban a raktr ppen rajzolt sornak tbb oszlo-
pt is olvassuk, hogy eldntsk mit s hogyan kell megjelenteni a cel-
larajzolban. A 2635. sorokban a cellarajzol tulajdonsgait lltjuk be
egy lpsben. A tulajdonsgok kzt a 27. sorban megtallhat a megjele-
ntend o szveg is, ami az res karakterlnc, ha a megjelentend o szm 0
vagy kisebb rtk u.
A cella adatfggvny nyilvntartsba vtelt mutatja be kvetkez o n-
hny sor.
gtk 2007/10/21 14:22 page 293 #293
293
1 renderer = gtk_cell_renderer_text_new();
2 gtk_tree_view_column_pack_start(column, renderer,
3 FALSE);
4 gtk_cell_layout_set_cell_data_func(
5 GTK_CELL_LAYOUT(column),
6 renderer,
7 (GtkCellLayoutDataFunc ) render_cost,
8 NULL, NULL);
Az 1. sorban ltrehozzuk a cellarajzolt, a 23. sorban nyilvntartsba
vesszk, a 48. sorokban pedig bejegyezzk a cella adatfggvnyt. A 8.
sorban meggyelhetjk, hogy sem kiegszt o adatokra, sem pedig az azo-
kat felszabadt fggvnyre nincs szksgnk.
A cella adatfggvny kapcsn rdemes megemltennk, hogy azt a GTK
a cella rajzolsa el ott mindig hvja, rdemes teht egyszer u, gyors fgg-
vnyt hasznlni. Nyilvnval, hogy rdemes gy megtervezni a raktrban
trolt adatszerkezeteket, hogy a cella adatfggvny egyszer uen elvgez-
hesse a feladatt, azaz amit csak lehet rdemes el ore kiszmtani.
8.6. A kombinlt doboz
A kombinlt doboz hasznlatnak alapjait mr bemutattuk a 3.1.7. ol-
dalon, ahol az egyszer usg kedvrt kizrlag az egyszer u, csak szveges
adatokat megjelent o vltozatokkal foglalkoztunk. A kombinlt dobozban
azonban klnfle cellarajzolkat is elhelyezhetnk, gy az egyszer u lista
helyett sokkal kifejez obb s tegyk hozz szebb kperny oelemet nyer-
hetnk. Ezt mutatja be a 8.11. bra, ahol kpet s szveget egyarnt
megjelent kombinlt dobozt lthatunk.
8.11. bra. A kombi-
nlt doboz
A kombinlt doboz kezelsre a GTK programknyv-
tr ahogyan azt mr emltettk a GtkComboBox
tpust hasznlja. A Glade program ltal ltreho-
zott programok azonban az ilyen kperny oelemeket a
gtk_combo_box_new_text() fggvnnyel hozza ltre. Az
e fggvnnyel ltrehozott kombinlt dobozokban azon-
ban csak szveges rtkek jelenthet ok meg. Ha ssze-
tettebb megjelens u kombinlt dobozokat akarunk hasz-
nlni, akkor azokat magunknak kell elksztennk.
Szerencsre a Glade lehet osget biztost arra, hogy az ltala nem tmo-
gatott kperny oelemeket is hasznljuk a felhasznli felletbe. Ha ilyen
terveink vannak, akkor a kperny oelemek szerkesztse kzben egyedi
(custom-made, rendelsre ksztett) kperny oelemet kell hasznlnunk.
gtk 2007/10/21 14:22 page 294 #294
294
Ehhez az ablakban a egyni felleti elem nven szerepl o kperny oele-
met kell elhelyeznnk, s meg kell rnunk a ltrehoz fggvnyt, ami a
kperny oelemet ltrehozza s visszaadja az j kperny oelem memriac-
mt. Igen fontos, hogy a ltrehoz fggvny egy GtkWidget tpus elemet
jell o memriacmet adjon vissza, mert ha nem a megfelel o memriac-
met kapja a Glade ltal ksztett, az adott ablakot ltrehoz fggvny, a
program futsa megszakad.
A kombinlt doboz kperny oelemet brzol GtkComboBox megvalstja
a GtkCellLayout interfszt, ezrt a benne megjelen o adatokat cellaraj-
zolk segtsgvel brzolhatjuk. Ehhez a mr bemutatott eszkzkn
kvl a kvetkez o fggvnyekre van szksgnk.
GtkWidget
*
gtk_combo_box_new(void); E fggvnnyel kombinlt
dobozt hozhatunk ltre. Azrt kell ezt a fggvnyt hasznlnunk,
mert a Glade a gtk_combo_box_new_text() fggvnnyel hozza
ltre a kombinlt dobozokat, gy azokat csak szveges rtkek meg-
jelentsre hasznlhatjuk.
A fggvny visszatrsi rtke az j kombinlt dobozt jelli a me-
mriban.
void gtk_combo_box_set_model(GtkComboBox
*
doboz,
GtkTreeModel
*
raktr); A fggvny segtsgvel bellthat-
juk, hogy a kombinlt dobozban melyik raktr sorai jelenjenek
meg.
A fggvny els o paramtere a kombinlt dobozt, msodik param-
tere pedig a raktrat jelli a memriban.
gboolean gtk_combo_box_get_active_iter(GtkComboBox
*
doboz, GtkTreeIter
*
bejr); A fggvny segtsgvel le-
krdezhetjk, hogy a felhasznl a raktr melyik elemt vlasztotta
ki a kombinlt doboz segtsgvel.
A fggvny els o paramtere a kombinlt dobozt jelli a memri-
ban. A msodik paramter arra a bejrra mutat, amelyet az pen
kivlasztott elemre akarunk lltani. A fggvny visszatrsi rtke
igaz logikai rtket kpvisel, ha a kombinlt dobozban volt kivlasz-
tott elem, gy a bejrt sikerlt belltani. Ha nem volt kivlasztott
elem, a visszatrsi rtk hamis.
A kvetkez o pldaprogram a ??. brn lthat sszetett megjelens u
kombin ult doboz ltrehozst mutatja be.
52. plda. E plda bemutatja hogyan kszthetnk olyan kombinlt do-
bozt, amiben a vlaszthat elemeket egy kp s a mellette megjelen o sz-
veg jelkpezi.
gtk 2007/10/21 14:22 page 295 #295
295
Az els o fggvny egy lista szerkezet u raktrat kszt, amiben kt oszlop
tallhat. Az els o oszlop egy kpet, a msodik pedig egy szveges rtket
tartalmaz.
1 typedef struct _country country;
2 struct _country {
3 gchar
*
short_code;
4 gchar
*
name;
5 };
6
7 static GtkListStore
*
8 languages_list_store_new(void)
9 {
10 GtkListStore
*
list_store;
11 GdkPixbuf
*
pixbuf;
12 GtkTreeIter tree_iter;
13 gint n;
14 gchar
*
file;
15 country countries[] = {
16 { "HU", "Magyar" },
17 { "DE", "Nmet" },
18 { "UK", "Angol" },
19 { "US", "Amerikai Angol" },
20 { NULL, NULL }
21 };
22 /
*
23
*
A raktr ltrehozsa.
24
*
/
25 list_store = gtk_list_store_new(2,
26 G_TYPE_OBJECT,
27 G_TYPE_STRING);
28 /
*
29
*
A raktr feltltse.
30
*
/
31 for (n = 0; countries[n].short_code != NULL; ++n) {
32 file = g_strdup_printf(PIXMAP_DIR "flag-%s.png",
33 countries[n].short_code);
34 pixbuf = gdk_pixbuf_new_from_file(file, NULL);
35 gtk_list_store_append(list_store, &tree_iter);
36 gtk_list_store_set(list_store, &tree_iter,
37 0, pixbuf,
38 1, countries[n].name,
39 -1);
40 g_free(file);
gtk 2007/10/21 14:22 page 296 #296
296
41 }
42
43 return list_store;
44 }
A fggvny a 1520. sorok kzt olvashat rtkeket helyezi el a 2527.
sorokban ltrehozott raktrban, azaz igazbl a 34. sorban ltrehozott
kpet, amelyet az eredeti adatszerkezetben elhelyezett nv alapjn hoz
ltre. Ezt a fggvnyt receptknt hasznlhatjuk lland adatokat tartal-
maz lista szerkezet u raktrak ltrehozsra.
A kvetkez o fggvnyt a kombinlt doboz ltrehozsra hasznljuk. A
fggvny els o paramtere a ltrehozand kperny oelem nevt hatrozza
meg, mg a tbbi paramtert a Glade programban hatrozhatjuk meg.
A fggvny visszatrsi rtke igen fontos, a fggvny ltal ltrehozott
kperny oelemet jelli a memriban. A Glade ilyen fggvnyeket hasznl
a programoz ltal ltrehozott, egyedi kperny oelemek el olltsra.
1 GtkWidget
*
2 create_combo_box_complex(
3 gchar
*
widget_name,
4 gchar
*
string1,
5 gchar
*
string2,
6 gint int1,
7 gint int2)
8 {
9 GtkWidget
*
widget;
10 GtkCellRenderer
*
renderer;
11 GtkListStore
*
list_store;
12 /
*
13
*
A raktr s a kombinlt doboz ltrehozsa.
14
*
/
15 list_store = languages_list_store_new();
16 widget = gtk_combo_box_new();
17 /
*
18
*
Az els o cellarajzol.
19
*
/
20 renderer = gtk_cell_renderer_pixbuf_new();
21 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(widget),
22 renderer, FALSE);
23 gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(widget),
24 renderer, "pixbuf", 0);
25 /
*
26
*
A msodik cellarajzol.
27
*
/
gtk 2007/10/21 14:22 page 297 #297
297
28 renderer = gtk_cell_renderer_text_new();
29 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(widget),
30 renderer, TRUE);
31 gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(widget),
32 renderer, "text", 1);
33 /
*
34
*
A raktr belltsa.
35
*
/
36 gtk_combo_box_set_model(GTK_COMBO_BOX(widget),
37 GTK_TREE_MODEL(list_store));
38 gtk_combo_box_set_active(GTK_COMBO_BOX(widget), 0);
39
40 return widget;
41 }
A fggvnyben el obb ltrehozzuk a raktrat s a kombinlt dobozt a 15.,
illetve a 16. sorokban. A fggvny tovbbi soraiban kt cellarajzolt ho-
zunk ltre, egyet kp, egyet pedig szveg megjelentsre a 20., illetve a
28. sorban.
A cellarajzolkat ezeket utn a gtk_cell_layout_pack_start() fgg-
vny segtsgvel elhelyezzk az el oz oleg ltrehozott kombinlt dobozban
(2122. s 2930. sorok). Figyeljk meg, hogy mivel a kombinlt doboz
megvalstja a GtkCellLayout interfszt, a GTK_CELL_LAYOUT() tpus-
knyszert o makrt hasznlhatjuk a fggvny hvsakor! Meggyelhetjk
azt is, hogy a szveget nyjthat mdon, a kpet viszont lland szles-
sggel helyezzk el a cellaelrendezsben. Ez clszer u dnts, hiszen gy a
szveg balra zrtan, egy vonalban kezd odve jelenik meg minden sorban.
A kvetkez o feladat a megjelentend o oszlopok kijellse, amelyet a
gtk_cell_layout_add_attribute() fggvnnyel vgznk el a kt cel-
larajzolval a 2324., illetve a 3132. sorokban. Figyeljk meg, hogy a
belltsok alapjn a cellaelrendezs a kp jelleg u cellarajzol "pixbuf"
tulajdonsgt a 0, a szveges cellarajzol "text" tulajdonsgt pedig az
1 sorszm oszlopbl veszi.
Igen fontos a 36-37. sorokban olvashat fggvnyhvs, amelynek a
segtsgvel megadjuk, hogy a kombinlt dobozban melyik raktr adatai
jelenjenek meg.
Fontosak viszont az ezek utn lthat fggvnyhvsok. Az 5. sorban
egy kp jelleg u cellarajzolt, a 10. sorban pedig egy szveges cellarajzolt
hozunk ltre. Mindkt cellarajzolt elhelyezzk a cellaelrendezsben. A
kpet megjelent o cellarajzolt a 6. sorban nem nyjthat mdon, a sz-
veges cellarajzolt pedig a 11. sorban nyjthat mdon helyezzk el a
cellaelrendezsben.
A kvetkez o fontos lps cellarajzol s az ltala megjelentend o ada-
tok kzti kapcsolat felptse. A kp jelleg u cellarajzol "pixbuf" nev u
gtk 2007/10/21 14:22 page 298 #298
298
tulajdonsgt a megjelentend o raktr 0 sorszm oszlophoz ktjk a
78. sorokban, mg a szveges cellarajzol "text" nev u tulajdonsgt a
raktr 1 sorszm oszlopbl vesszk a 1213. sor szerint.
8.7. A fa kperny oelem
A fa kperny oelem a GTK programknyvtr sszetettebb kperny oele-
meinek egyike, listk, fk, szveges, illetve grakus adatok megjelent-
sre egyarnt alkalmas. A fa kperny oelem segtsgvel a programunkat
knnyen kezelhet ov, a felhasznli felletet kifejez ov tehetjk. A GTK
programknyvtr a fa kperny oelem kezelsre a TreeView tpust bizto-
stja a programoz szmra [2]. A fa kperny oelemet a 8.12. bra mutatja
be.
8.12. bra. A fa kperny oelem
A fa kperny oelemen bell tbb
oszlopot jelenthetnk meg. Eh-
hez a GTK programknyvtr a
GtkTreeViewColumn tpust biztostja.
A GtkTreeViewColumn megvalstja a
GtkCellLayout interfszt, gy benne
egy vagy tbb cellarajzolt is elhelyez-
hetnk. Ebb ol kvetkezik, hogy a fa
kperny oelem egy oszlopban akr
tbbfle adat is megjelenthet o, azaz
a fa egy oszlopn bell tbb oszlop is
lehet. Ezt gyelhetjk meg a 8.12.brn,
ahol a fa els o oszlopban egy kp s egy
szveg is megjelenik.
A fa kperny oelem hasznlatt a kvetkez okppen foglalhatjuk ssze.
A Glade segtsgvel el kell helyeznnk az ablakban a fa kperny oelemet
s a ltrehozst jelz o jelzshez (a "realize" jelzshez) egy visszahvott
fggvnyt kell kapcsolnunk, hogy a fban megjelentett adatokat s a
fa kperny oelem oszlopait el okszthessk. A visszahvott fggvnyben
el kell ksztennk a fa kperny oelem oszlopait a GtkTreeViewColumn
adatszerkezeteket s mindegyikben el kell helyeznnk a megfelel o cella-
rajzolkat.
Ezek utn el kell ksztennk a fban megjelentett adatokat trol
raktrat. Ennek kapcsn tudnunk kell, hogy a fa kperny oelem rzkeli,
hogy lista vagy fa szerkezet u raktrat jelentnk-e meg a segtsgvel.
Ha a fa kperny oelem gy rzkeli, hogy fa szerkezet u raktrat akarunk
megjelenteni, akkor az els o oszlop el ott megfelel o mret u helyet hagy ki
az egyes gak nyitott s zrt llapott jelz o kis kpek szmra. A kp-
erny oelem a helyet akkor is kihagyja, ha a fa szerkezet u raktr trt-
netesen egyetlen kinyithat gat sem tartalmaz, azaz listaszer uen van
gtk 2007/10/21 14:22 page 299 #299
299
adatokkal feltltve.
Ha ltrehoztuk a raktrat s az adatokat megjelent o cellarajzolkat is
elhelyeztk a fa kperny oelem oszlopaiba, akkor a raktrat a kperny o-
elemhez rendelhetjk s ezzel tulajdonkppen hasznlhatv is tesszk
azt.
A fa kperny oelem kezelsre szolgl fggvnyek kzl a legfontosab-
bak a kvetkez ok.
GtkTreeViewColumn
*
gtk_tree_view_column_new(void); A fgg-
vny segtsgvel j oszlopot hozhatunk ltre. A fggvny vissza-
trsi rtke az j oszlopot reprezentl adatszerkezetet jelli a me-
mriban.
GtkTreeViewColumn
*
gtk_tree_view_column_new_with_attribu-
tes(const gchar
*
cm, GtkCellRenderer
*
cellarajzol,
..., NULL); A fggvny segtsgvel j oszlopot hozhatunk ltre,
mgpedig gy, hogy egyben belltjuk a cmt, az oszlopban meg-
jelen o cellarajzolt s bellthatjuk a cellarajzolban megjelen o
adatok oszlopnak szmt is.
A fggvny els o paramtere az oszlop cmt megad karakterlnc
cme a memriban. A fa kperny oelem fejlcben az oszlop felett
ez a szveg fog megjelenni a kperny on.
A fggvny msodik paramtere az oszlopban elhelyezend o cellaraj-
zol. Nyilvnvalan akkor rdemes ezt az egyszer ustett fggvnyt
hasznlnunk az oszlop ltrehozsra, ha az oszlopban csak egy cel-
larajzolt akarunk elhelyezni.
A fggvny tovbbi paramterei a cellarajzol tulajdonsgaibl s
a hozzjuk rendelt oszlopszmbl llnak. A prok megadjk, hogy
az oszlopban tallhat cellarajzol a fa kperny oelemhez rendelt
raktr mely oszlopait jelentse meg s milyen formban. A pro-
kat megad paramterek utn utols paramterknt a NULL rtket
kell megadnunk.
A fggvny visszatrsi rtke az j oszlopot kezel o adatszerkezetet
jelli a memriban.
gint gtk_tree_view_append_column(GtkTreeView
*
fa,
GtkTreeViewColumn
*
oszlop); A fggvny segtsgvel a fa
kperny oelemhez j oszlopot adhatunk, ami a mr elhelyezett
oszlopoktl jobbra, utolsknt fog megjelenni a kperny on.
A fggvny els o paramtere a fa kperny oelemet, msodik param-
tere pedig az elhelyezend o oszlopot jelli a memriban. A fggvny
visszatrsi rtke megadja, hogy az j oszlop elhelyezse utn hny
oszlop van a fban.
gtk 2007/10/21 14:22 page 300 #300
300
void gtk_tree_view_set_model(GtkTreeView
*
fa,
GtkTreeModel
*
raktr); A fggvny segtsgvel bellthat-
juk, hogy a fa kperny oelemben melyik raktr adatai jelenjenek
meg.
A fggvny els o paramtere a belltand ft, msodik paramtere
pedig a megjelentend o raktrat jelli a memriban.
A kvetkez o plda bemutatja hogyan jelenthetnk meg adatokat szve-
ges s kpi formban egyarnt a fa kperny oelemben. A plda fggvnyei
ltal ltrehozott kperny o kpt a 8.12. kpen lthat.
53. plda. A kvetkez o fggvny az adatok megjelentst vgz o oszlopo-
kat s cellarajzolkat helyezi el a fa kperny oelemben.
1 static void
2 add_header_to_treeview_simple(GtkTreeView
*
tree_view)
3 {
4 GtkTreeViewColumn
*
column;
5 GtkCellRenderer
*
renderer;
6
7 column = gtk_tree_view_column_new();
8 gtk_tree_view_column_set_title(column, "Hely");
9 renderer = gtk_cell_renderer_pixbuf_new();
10 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(column),
11 renderer, FALSE);
12 gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(column),
13 renderer, "icon-name", 0);
14 renderer = gtk_cell_renderer_text_new();
15 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(column),
16 renderer, FALSE);
17 gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(column),
18 renderer, "text", 1);
19 renderer = gtk_cell_renderer_text_new();
20 gtk_tree_view_append_column(tree_view, column);
21
22 column = gtk_tree_view_column_new_with_attributes(
23 "Knyvtr", renderer,
24 "text", 2, NULL);
25 gtk_tree_view_append_column(tree_view, column);
26 }
A fggvny kt oszlopot hoz ltre a paramtere ltal jellt fa kperny o-
elemen bell.
Az els o oszlop egy kp- s egy szveges cellarajzolt tartalmaz, ezrt
a gtk_tree_view_column_new() fggvnnyel hozzuk ltre (7. sor) s
gtk 2007/10/21 14:22 page 301 #301
301
cellaelrendezsknt kezelve elhelyezzk benne a kt cellarajzolt a 10
11. s a 1516. sorokban. Az els o oszlopot a 20. sorban helyezzk el a fe
kperny oelemben.
A msodik oszlop csak egy szveges cellarajzolt tartalmaz, ezrt az
egyszer ustett gtk_tree_view_column_new_with_attributes() fgg-
vnnyel hozzuk ltre a 2224. sorokban. A msodik oszlopot a 25. sorban
helyezzk el a fn bell.
A kvetkez o fggvny a fa kperny oelem ltrehozsakor, a "realize"
jelzs hatsra hvdik meg.
1 void
2 on_treeview1_realize(GtkWidget
*
widget,
3 gpointer user_data)
4 {
5 GtkTreeStore
*
tree_store;
6 add_header_to_treeview(GTK_TREE_VIEW(widget));
7 tree_store = storage_tree_store_new();
8
9 gtk_tree_view_set_model(GTK_TREE_VIEW(widget),
10 GTK_TREE_MODEL(tree_store));
11 }
A fggvny a plda el oz o fggvnyt a 6. sorban hvja, hogy a kper-
ny oelemben az oszlopokat s a cellarajzolkat elhelyezze. Ezek utn a
7. sorban hvjuk a fa szerkezet u raktrat ltrehoz s adatokkal feltlt o
fggvnyt, amelyet a rvidsg kedvrt most nem mutatunk be.
Utols lpsknt a 910. sorban az adatokkal felszerelt fa szerkezet u
raktrat a fa kperny oelemhez rendeljk.
8.7.1. Az oszlopok nomhangolsa
A kvetkez o nhny fggvny segtsgvel a fa kperny oelem oszlopait -
nomhangolhatjuk, olyan megjelens ure s viselkeds ure llthatjuk, ami
a legjobban megfelel az ignyeinknek.
void gtk_tree_view_column_set_spacing(GtkTreeViewColumn
*
oszlop, gint keret); A fggvny segtsgvel bellthatjuk,
hogy az oszlopban az egyes cellarajzolk kzt hny kppontnyi
helyet akarunk kihagyni.
A fggvny els o paramtere az oszlopt jelzi a memriban, a mso-
dik paramtere pedig megadja, hogy a belselyben hny kppontnyi
res rsz jelenjen meg az egyes cellarajzolk kzt.
gtk 2007/10/21 14:22 page 302 #302
302
void gtk_tree_view_column_set_visible(GtkTreeViewColumn
*
oszlop, gboolean lthat); A fggvny segtsgvel bellt-
hatjuk, hogy az adot oszlop lthet legyen-e a kperny on.
A fggvny els o paramtere az oszlopot jelzi a memriban, a m-
sodik paramtere pedig megadja, hogy az oszlop megjelenjen-e a
kperny on. Ha a msodik paramter rtke FALSE, az oszlop nem
ltszik a kperny on.
void gtk_tree_view_column_set_resizable(GtkTreeViewColumn
*
oszlop, gboolean mretezheto); A fggvny segtsgvel
bellthatjuk, hogy az adott oszlop mretezhet o legyen-e, azaz a
felhasznl az oszlop mrett megvltoztathatja-e a fejlcben az
oszlopok kzti elvlasztjel mozgatsval.
A fggvny els o paramtere a fa kperny oelemet jelli a memri-
ban, msodik paramtere pedig megadja, hogy az oszlop mretez-
het o legyen-e. Alaprtelmezs szerint az oszlopok nem mretezhe-
t ok.
void gtk_tree_view_column_set_sizing(GtkTreeViewColumn
*
oszlop, GtkTreeViewColumnSizing mretezs); A fggvny
segtsgvel bellthatjuk, hogy a fa kperny oelem adott oszlopnak
szlessge hogyan alakuljon a kperny on.
A fggvny els o paramtere az oszlopot jelli a memriban, a m-
sodik paramtere pedig a kvetkez o llandk egyike lehet:
GTK_TREE_VIEW_COLUMN_GROW_ONLY A belltott szlessghez k-
pest a GTK programknyvtr a szlessget legfeljebb nvelheti,
ha szksges.
GTK_TREE_VIEW_COLUMN_AUTOSIZE Az oszlop szlessgt a GTK
programknyvtr automatikusan lltja be.
GTK_TREE_VIEW_COLUMN_FIXED Az oszlop szlessge lland.
gint gtk_tree_view_column_get_width(GtkTreeViewColumn
*
oszlop); A fggvny segtsgvel az oszlop aktulis szlessge
lekrdezhet o.
A fggvny paramtere a fa kperny oelem egy oszlopt jelli, a
visszatrsi rtke pedig megadja, hogy az oszlop hny kppontnyi
szlessg u helyet foglal a kperny on.
void gtk_tree_view_column_set_fixed_width(GtkTreeViewColumn
*
oszlop, gint szlessg); A fggvny segtsgvel bellthat-
juk hogy mekkora legyen az oszlop szlessga, ha az oszlopot
lland szlessggel jelentjk meg.
gtk 2007/10/21 14:22 page 303 #303
303
A fggvny els o paramtere az oszlopot jelli a memriban, a m-
sodik paramtere pedig a szlessget adja meg kppontban. A sz-
lessgnek 0-nl nagyobbnak kell lennie.
void gtk_tree_view_column_set_min_width(GtkTreeViewColumn
*
oszlop, gint szlessg); A fggvny segtsgvel bellthat-
juk, hogy az oszlop legalbb mekkora szlessggel jelenjen meg a
kperny on, ha a szlessge vltozhat.
A fggvny els o paramtere az oszlopot jelli a memriban, a m-
sodik paramtere pedig megadja a lehet o legkisebb szlessget. A
msodik paramter rtke lehet 1 is, ami azt jelenti, hogy az osz-
lop tetsz olegesen kis szlessggel jelenhet meg.
void gtk_tree_view_column_set_max_width(GtkTreeViewColumn
*
oszlop, gint szlessg); A fggvny segtsgvel megadhat-
juk, hogy legfeljebb milyen szlessggel jelenjen meg az oszlop, ha
az oszlop szlessge vltoz lehet.
A fggvny els o paramtere a belltand oszlopot jelli a mem-
riban, a msodik paramter pedig megadja az oszlop legnagyobb
szlessgt. Ha a msodik paramter rtke 1, az oszlop szlessge
tetsz olegesen nagy lehet.
void gtk_tree_view_column_set_title(GtkTreeViewColumn
*
oszlop, const gchar
*
cm); A fggvny segtsgvel bellt-
hatjuk a fa kperny oelem oszlopnak cmt.
A fggvny els o paramtere az oszlopot, a msodik paramtere pe-
dig az oszlop j cmt jelli a memriban.
void gtk_tree_view_column_set_expand(GtkTreeViewColumn
*
oszlop, gboolean nyjt); A fggvny segtsgvel bellthat-
juk, hogy a fa kperny oelem oszlopa nyjthat legyen-e, azaz,
ha a fa kperny oelem szlesebb a szksgesnl, akkor az adott
oszlop szlessgt nvelni kell-e. Alaprtelmezs szerint az oszlopok
szlessge nem nvekszik ilyen esetben, a felesleges szlessget a
GTK programknyvtr az utols oszlop szlessgnek nvelsvel
hasznlja fel.
A fggvny els o paramtere az oszlop cme, a msodik paramtere
pedig logikai rtk, ami megadja, hogy az oszlop szlessgt nvelni
kell-e.
void gtk_tree_view_column_set_clickable(GtkTreeViewColumn
*
oszlop, gboolean aktv); A fggvny segtsgvel megad-
hatjuk, hogy az adott oszlop fejlcbeli cme aktv legyen-e, azaz
rzkelje-e, ha a felhasznl az egrrel rkattint.
gtk 2007/10/21 14:22 page 304 #304
304
A fggvny els o paramtere az oszlopot jelli a memriban, a m-
sodik paramtere pedig logikai rtk, ami megadja, hogy az oszlop
fejlce rzkeny legyen-e.
void gtk_tree_view_column_set_widget(GtkTreeViewColumn
*
oszlop, GtkWidget
*
elem); A fggvny segtsgvel tetsz oleges
kperny oelemet helyezhetnk el a fa kperny oelem oszlopnak
fejlcben. Alaprtelmezett esetben a fejlcben az oszlop cmt
megjelent o cmke jelenik meg.
A fggvny els o paramtere az oszlopot, a msodik a fejlcben elhe-
lyezend o kperny oelemet jelli a memriban.
void gtk_tree_view_column_set_alignment(GtkTreeViewColumn
*
oszlop, gfloat xalign); A fggvny segtsgvel megadhat-
juk, hogy az oszlop fejlcben tallhat cmke a fejlc melyik rszn
jelenjen meg.
A fggvny els o paramtere az oszlopot jelli a memriban, a m-
sodik paramtere pedig egy 0, 0 s 1, 0 kz es o szm, ami megadja,
hogy a cmke a rendelkezsre ll terlet mely rszn jelenjen meg.
A 0, 0 rtk hatsra a cmke bal oldalon, az 1, 0 rtk hatsra jobb
oldalon, a 0, 5 rtk hatsra pedig kzpen jelenik meg.
void gtk_tree_view_column_set_reorderable(GtkTreeViewColumn
*
oszlop, gboolean rendezheto); A fggvny segtsgvel meg-
adhatjuk, hogy a fa kperny oelem adott oszlopa a tbbi oszlophoz
kpest elmozdthat legyen-e. Ha az sszes oszlopot elmozdthatra
lltjuk, a felhasznl az egr segtsgvel az oszlopok fejlct
vzszintesen elmozdthatja, gy az oszlopok sorrendjt tetsz olegesen
mdosthatja.
A fggvny els o paramtere az oszlopot jelli a memriban, a m-
sodik paramtere pedig egy logikai rtk, ami megadja, hogy az osz-
lop elmozdthat legyen-e.
void gtk_tree_view_column_set_sort_column_id(GtkTreeViewColumn
*
oszlop, gint azonost); A fggvny segtsgvel megadhat-
juk, hogy a fa kperny oelemben megjelen o raktr melyik oszlopa
szerint kell rendezni a kperny oelem sorait, ha a felhasznl az
adott oszlop fejlcre kattint. Ha ezt a tulajdonsgot belltjuk, az
adott oszlop fejlcre kattintva a sorba rendezs automatikusan
megtrtnik.
A fggvny els o paramtere az oszlopot jelli a memriban, a m-
sodik paramtere pedig megadja, hogy az adott oszlop aktivlsa
esetben melyik oszlop szerint kell rendezni a sorokat.
gtk 2007/10/21 14:22 page 305 #305
305
void gtk_tree_view_column_set_sort_indicator(GtkTreeViewColumn
*
oszlop, gboolean megjelenik); E fggvny segtsgvel az
oszlop fejlcben megjelen o, lefel vagy felfel mutat nyilat kap-
csolhatjuk be. Ez a nyl azt jelzi a felhasznlnak, hogy a fa
kperny oelem sorai az adott oszlop szerint vannak rendezve.
Ha egyszer uen csak azt akarjuk, hogy a felhasznl
az oszlopokat a fejlcre kattintssal rendezhesse, ak-
kor erre a fggvnyre nincsen szksgnk, csak a
gtk_tree_view_column_set_sort_column_id() fggvnyt kell
hasznlnunk.
Ha be akarjuk lltani a rendezst jelz o nyl irnyt, az albb ismer-
tetett gtk_tree_view_column_set_sort_order() fggvnyt kell
hasznlnunk.
A fggvny els o paramtere az oszlopot jelli a memriban, a m-
sodik paramtere pedig megadja, hogy a rendezst jelz o nyl be
legyen-e kapcsolva.
void gtk_tree_view_column_set_sort_order(GtkTreeViewColumn
*
oszlop, GtkSortType sorrend); A fggvny segtsgvel be-
llthatjuk, hogy a fejlcben a rendezst jelz o nyl milyen irnyba
mutasson. Ez a fggvny a sorokat nem rendezi, egyszer uen csak
belltja, hogy melyik irnyba mutasson a nyl.
A fggvny els o paramtere az oszlopot jelli a memriban, a m-
sodik paramtere pedig meghatrozza a rendezst jelz o nyl irnyt.
Itt a kvetkez o llandk egyikt hasznlhatjuk.
GTK_SORT_ASCENDING A nyl nvekv o sorrendet jelez, felfel mutat.
GTK_SORT_DESCENDING A nyl cskken o sorrendet mutat, lefel
mutat.
A fa kperny oelem oszlopainak tulajdonsgt a G programknyvtr
tulajdonsgok kezelsre alkalmas eszkzeivel a g_object_set() s
g_object_get() is bellthatjuk s lekrdezhetjk. A tulajdonsgokat
a kvetkez o lista mutatja be, a rvidsg kedvrt csak vzlatosan, hiszen
a legtbbjket a fggvnyek kapcsn mr rszletesen is ismertettk.
"alignment", gfloat Az oszlop fejlcben tallhat cmke rendezse.
"clickable", gboolean Logikai rtk, ami megadja, hogy a fejlc
rzkelje-e ha a felhasznl rkattint.
"expand", gboolean Logikai rtk, ami megadja, hogy a felesleges sz-
lessgb ol az adott oszlop rszesljn-e.
gtk 2007/10/21 14:22 page 306 #306
306
"fixed-width", gint Az oszlop szlessge, ha az oszlop lland szles-
sg u.
"max-width", gint Az oszlop legnagyobb szlessge, ha az oszlop sz-
lessge vltoz, 1 a tetsz olegesen nagy szlessg jellsre.
"min-width", gint Az oszlop legkisebb szlessge, ha az oszlop szles-
sge vltoz, 1 a tetsz olesen kicsi szlessg jellsre.
"reorderable", gboolean Logikai rtk, ami megadja, hogy az oszlop a
tbbi oszlophoz kpest thelyezhet o legyen-e.
"resizable", gboolean Logikai rtk, ami megadja, hogy a felhasznl
megvltoztathassa-e az oszlop szlessgt.
"sizing", GtkTreeViewColumnSizing A szlessg automatikus megl-
laptsnak mdja, ami lehet GTK_TREE_VIEW_COLUMN_GROW_ONLY,
GTK_TREE_VIEW_COLUMN_AUTOSIZE, vagy
GTK_TREE_VIEW_COLUMN_FIXED.
"sort-indicator", gboolean Logikai rtk, ami megadja, hogy fejlc-
ben megjelenjen-e a rendezst jelz o nyl.
"sort-order", GtkSortType A fejlcben tallhat nyl irnya, ami lehet
GTK_SORT_ASCENDING vagy GTK_SORT_DESCENDING.
"spacing", gint Megadja, hogy az oszlopon bell elhelyezett cellarajzo-
lk kztt hny kppontnyi szlessg u res helyet kell megjelen-
teni.
"title", gchararray Az oszlop cme, ami alaprtelmezs szerint a fej-
lcben elhelyezett cmkben is megjelenik.
"visible", gboolean Logikai rtk, ami megadja, hogy a fa kperny o-
elem adott oszlopa ltszik-e a kperny on vagy rejtett.
"widget", GtkWidget
*
A fejlcben megjelen o kperny oelem cme.
Alaprtelmezett esetben a fejlcben egy cmke jelenik meg az osz-
lop cmvel.
"width", gint Csak olvashat tulajdonsg, ami megadja, hogy az oszlop
szlessge az adott pillanatban hny kppontnyi.
Szerencss, ha az alkalmazsban tallhat sszes fa sszes oszlopa
hasonlkppen m ukdik s gy a felhasznlt a legkevesebb meglepets
ri. Ezt legknnyebben gy rhetjk el, ha az alkalmazs minden fa kp-
erny oelemnek minden oszlopt ugyanazzal a fggvnnyel hozzuk ltre.
Ezt mutatja be a kvetkez o plda.
gtk 2007/10/21 14:22 page 307 #307
307
54. plda. A kvetkez o sorok egy egyszer u fggvnyt mutatnak be, ame-
lyek a fa kperny oelemhez j oszlopot ad hozz. Az j oszlop egy szveges
cellarajzolt is tartalmaz az adatok megjelentsre.
1 GtkTreeViewColumn
*
2 tree_view_column_text_create(
3 GtkTreeView
*
tree_view,
4 gint column_number,
5 gchar
*
title)
6 {
7 GtkTreeViewColumn
*
column;
8 GtkCellRenderer
*
renderer;
9 /
*
10
*
Az oszlop.
11
*
/
12 column = gtk_tree_view_column_new();
13 gtk_tree_view_append_column(tree_view, column);
14 gtk_tree_view_column_set_sort_column_id(column,
15 column_number);
16 g_object_set(G_OBJECT(column),
17 "title", title,
18 "clickable", TRUE,
19 "reorderable", TRUE,
20 "resizable", TRUE,
21 "expand", TRUE,
22 NULL);
23 /
*
24
*
A cellarajzol.
25
*
/
26 renderer = gtk_cell_renderer_text_new();
27 gtk_tree_view_column_pack_start(column, renderer,
28 TRUE);
29 gtk_tree_view_column_add_attribute(column, renderer,
30 "text", column_number);
31 return column;
32 }
A fggvny els o paramtere a fa kperny oelemet jelli a memriban. A
msodik paramter megadja, hogy a ltrehozand oszlop a fhoz tartoz
raktr hnyadik oszlopt jelentse meg. A fggvny harmadik paramtere
az j oszlop cmt megad karakterlnco jelli a memriban.
gtk 2007/10/21 14:22 page 308 #308
308
8.7.2. A fa kperny oelem belltsai
A fa kperny oelem megjelense s viselkedse jnhny fggvny s tu-
lajdonsg segtsgvel nomhangolhat. A kvetkez okben el oszr a -
nomhangolsra hasznlhat fggvnyeket vesszk sorra.
void gtk_tree_view_set_enable_search(GtkTreeView
*
fa,
gboolean gyorskeress); A fggvny segtsgvel bellthatjuk,
hogy a fa kperny oelem tmogassa-e a szavak begpelsn alapul
gyorskeresst. Ha a gyorskeresst bekapcsoljuk, a felhasznl
egyszer uen elkezdheti begpelni a keresett szveget, a fa pedig
minden billenty ulets utn a legjobb tallathoz ugrik.
A fggvny els o paramtere a kperny oelemet jelli a memriban,
msodik paramtere pedig egy logikai rtk, ami megadja, hogy
tmogatjuk-e a begpelsen alapul gyorskeresst.
void gtk_tree_view_set_enable_tree_lines(GtkTreeView
*
fa,
gboolean vonalak); A fggvny segtsgvel bellthatjuk, hogy a
fban a leszrmazottakat vonalak jelljk-e.
A fggvny els o paramtere a kperny oelemet jelli a memriban,
a msodik paramtere pedig egy logikai rtk, ami megadja, hogy a
vonalakat meg kvnjuk-e jelenteni.
void gtk_tree_view_set_fixed_height_mode(GtkTreeView
*
fa,
gboolean egysges); A fggvny segtsgvel felgyorsthatjuk
a fa kperny oelem m ukdst a sorok magassgnak egysgesre
lltsval. Csak akkor hasznlhatjuk azonban ezt a fggvnyt, ha
a fa kperny oelem valban azonos magassg sorokat tartalmaz s
az oszlopok szlessge is lland.
A fggvny els o paramtere a fa kperny oelemet jelli a memri-
ban, a msodik paramtere pedig egy logikai rtk, ami megadja,
hogy egysges sormagassgot akarunk-e hasznlni.
void gtk_tree_view_set_grid_lines(GtkTreeView
*
fa,
GtkTreeViewGridLines hely); A fggvny segtsgvel bel-
lthatjuk, hogy a fa kperny oelemben a sorokat s az oszlopokat
elvlassza-e egy szaggatott vonal.
A fggvny els o paramtere a fa kperny oelemet jelli a memri-
ban. A msodik paramter megadja, hogy hol jelenjenek meg szag-
gatott vonalak. Itt a kvetkez o llandk egyikt hasznlhatjuk:
GTK_TREE_VIEW_GRID_LINES_NONE A szaggatott vonalak megjele-
ntsnek tiltsa.
GTK_TREE_VIEW_GRID_LINES_HORIZONTAL Csak vzszintes vona-
lak jelennek meg.
gtk 2007/10/21 14:22 page 309 #309
309
GTK_TREE_VIEW_GRID_LINES_VERTICAL Csak fgg oleges vonalak
jelennek meg.
GTK_TREE_VIEW_GRID_LINES_BOTH Mind vzszintes, mind pedig
fgg oleges vonalak is megjelennek.
void gtk_tree_view_set_headers_clickable(GtkTreeView
*
fa,
gboolean rzkeny); A fggvny segtsgvel egy lpsben
bellthatjuk, hogy az oszlopok fejlcei rzkenyek legyenek-e
a felhasznl kattintsra. Ezt a tulajdonsgot oszloponknt is
bellthatjuk.
A fggvny els o paramtere a fa kperny oelemet jelli a memri-
ban, a msodik paramtere pedig logikai rtk, ami meghatrozza,
hogy a fejlc oszlopokat jelz o rszei rzkenyek legyenek-e.
void gtk_tree_view_set_headers_visible(GtkTreeView
*
fa,
gboolean lthat); A fggvny segtsgvel bellthatjuk, hogy a
fejlc megjelenjen-e a fa kperny oelem fels o rszn.
A fggvny els o paramtere a kperny oelemet jelli a memriban,
a msodik paramtere pedig logikai rtk, ami meghatrozza, hogy
a kperny oelem fels o rszn megjelenjen-e a fejlc.
void gtk_tree_view_set_hover_expand(GtkTreeView
*
fa,
gboolean automatikus_nyits); A fggvny segtsgvel be-
llthatjuk, hogy hasznlni akarjuk-e a fban megjelentett gak
automatikus kinyitst. Ha ezt a lehet osget hasznljuk a fel-
hasznlnak nem kell lenyomnia az egr gombjt az egyes gak
kinyitshoz, elg ha egyszer uen a kinyitand g fl ll az egrrel.
A fggvny els o paramtere a ft jelli a memriban, a msodik pa-
ramtere pedig logikai rtk, ami meghatrozza, hogy hasznljuk-e
az automatikus nyits lehet osgt.
void gtk_tree_view_set_hover_selection(GtkTreeView
*
fa,
gboolean automatikus_kijells); A fggvny segtsgvel
megadhatjuk, hogy hasznlni akarjuk-e az automatikus kijellst
a fban. Ha lnk ezzel a lehet osggel, akkor a felhasznlnak nem
kell lenyomnia az egr gombjt ahhoz, hogy az adott sort kijellje,
elg, ha egyszer uen a sor fl ll az egrrel. Ezt a lehet osget csak
olyan fk esetben hasznlhatjuk, ahol egyszerre csak egy sor lehet
kijellve.
A fggvny els o paramtere a kperny oelemet jelli a memriban,
a msodik paramtere pedig megadja, hogy hasznlni akarjuk-e az
automatikus kijellst.
gtk 2007/10/21 14:22 page 310 #310
310
void gtk_tree_view_set_reorderable(GtkTreeView
*
fa,
gboolean trakhat); A fggvny segtsgvel bellthatjuk,
hogy engedlyezhni akarjuk-e a felhasznl szmra, hogy a fa
kperny oelemben megjelen o sorokat az egrrel trendezze. Ha en-
gedlyezzk ezt a lehet osget, a felhasznl a lista szerkezet u raktr
elemeinek sorrendjt megvltoztathatja, a fa szerkezet u raktrban
pedig akr az elemek leszrmazsi rendjt is mdosthatja.
A felhasznl ltal kezdemnyezett mdosts sorn a fa kperny o-
elem valban trendezi a raktr tartalmt. Ha err ol azonnal r-
teslni akarunk, akkor a raktr "row_inserted" (sor beszrsa
megtrtnt) s a "row_deleted" (sor trlse megtrtnt) jelzsek-
hez kell a megfelel o tpus visszahvott fggvnyt rendelnnk.
A fggvny els o paramtere a fa kperny oelemet jelli a memri-
ban, a msodik paramtere pedig egy logikai rtk, ami megadja,
hogy a sorok trendezhet ok legyenek-e.
void gtk_tree_view_set_rules_hint(GtkTreeView
*
fa,
gboolean sznez); A fggvny segtsgvel bellthatjuk, hogy az
egy sorhoz tartoz oszlopok azonostst megknnyt o sznezssel
akarjuk-e megjelenteni az adatokat. Ha ezt a lehet osget hasznl-
juk a fa egyes sorai enyhn eltr o httrsznnel jelennek meg, hogy
az olvas knnyebben kvethesse a sorokat az olvass sorn.
A fggvny els o paramtere a fa kperny oelemet jelli a mem-
riban, a msodik paramtere pedig megadja, hogy hasznlni
kvnjuk-e a sznezst.
void gtk_tree_view_set_search_column(GtkTreeView
*
fa,
gint oszlop); A fggvny segtsgvel megadhatjuk, hogy a
gyorskeress zemmdban a keress a fa kperny oelemhez tartoz
raktr melyik oszlopban trtnjen.
A fggvny els o paramtere a fa kperny oelemet jelli a memri-
ban, a msodik paramtere pedig megadja, hogy a gyorskeresskor
a raktr hnyadik oszlopban kell keresni. Az oszlopok szmozsa
0-tl indul.
void gtk_tree_view_set_search_entry(GtkTreeView
*
fa,
GtkEntry
*
beviteli_mezo); A fggvny segtsgvel megad-
hatjuk, hogy a fa a gyorskeressre melyik beviteli mez ot hasznlja.
Alaprtelmezett esetben a fa egy beptett beviteli mez ot hasznl,
ami csak a keress ideje alatt jelenik meg.
A fggvny els o paramtere a fa kperny oelemet, a msodik para-
mtere pedig a hasznlni kvnt beviteli mez ot jelli a memriban.
Ha a msodik paramter rtke NULL, a fa jra a beptett beviteli
mez ot kezdi hasznlni.
gtk 2007/10/21 14:22 page 311 #311
311
8.7.3. A fa kperny oelem hasznlata
A fa kperny oelem kapcsn mindenkppen emltsre rdemesek azok az
eszkzk, amelyek segtsgvel a fa kperny oelem llapott, tartalmt le-
krdezhetjk. Az ilyen clokra hasznlhat fggvnyeket mutatjuk be a
kvetkez o oldalakon. Nyilvnval, hogy els osorban nem a fa kperny o-
elem G programknyvtr ltal kezelt tulajdonsgairl lesz sz hiszen
azokat ltalban mi magunk lltunk be s ezek klnben is egyszer uen
lekrdezhet ok a g_object_get() fggvny segtsgvel hanem a fel-
hasznl ltal mdosthat llapotrl s tartalomrl. Szintn fontosak
azok a fggvnyek, amelyek segtsgvel a fa kperny oelemet hasznlat
kzben vezrelhetjk. A lekrdezsre szolgl fggvnyek mellett azokat
a fggvnyeket is megtalljuk a kvetkez o oldalakon, amelyekkel a m u-
kdst menet kzben befolysolhatjuk.
A munka sorn nyilvnvalan igen fontos, hogy lekrdezhessk a fa
kperny oelemben megjelentett raktr cmt. Erre hasznlhatjuk a k-
vetkez o fggvnyt.
GtkTreeModel
*
gtk_tree_view_get_model(GtkTreeView
*
fa); A
fggvny segtsgvel lekrdezhetjk a raktr cmt, amelynek az
adatait az adott pillanatban a fa kperny oelem megjelenti.
A fggvny paramtere a fa kperny oelemet jelli a memriban, a
visszatrsi rtke pedig a fban megjelen o raktr cmt adja meg,
ha a fhoz rendeltnk raktrat vagy NULL rtk, ha nem.
Ha a viszatrsi rtkknt kapott cmr ol meg akarjuk tudni,
hogy az lista szerkezet u vagy fa szerkezet u raktrat jell-e a
memriban, akkor hasznljuk a GTK_IS_LIST_STORE() s a
GTK_IS_TREE_STORE() makrkat.
Ha be akarjuk lltani, hogy a fban melyik raktr tar-
talmt akarjuk megjelenteni, akkor a mr bemutatott
gtk_tree_view_set_model() fggvnyt kell hasznlnunk.
Termszetesen nagyon fontos az is, hogy a felhasznl a fa kperny o-
elemen bell megjelen o sorok kzl melyiket vlasztotta ki. A GTK prog-
ramknyvtr a fa kperny oelemhez a kijells kezelsre kln tpust, a
GtkTreeSelection tpust hasznlja. A GtkTreeSelection tpus keze-
lsre szolgl fggvnyek kzl a legfontosabbak a kvetkez ok.
GtkTreeSelection
*
gtk_tree_view_get_selection(GtkTreeView
*
fa); E fggvny segtsgvel lekrdezhetjk a fa kperny oelemhez
tartoz, a kijellst kezel o adatszerkezet cmt.
A fggvny paramtere a fa kperny oelemet jelli a memriban,
a visszatrsi rtke pedig megadja hol talljuk a kijellst kezel o
adatszerkezetet.
gtk 2007/10/21 14:22 page 312 #312
312
void gtk_tree_selection_set_mode(GtkTreeSelection
*
vlaszts, GtkSelectionMode md); A fggvny segts-
gvel bellthatjuk, hogy a fa kperny oelem milyen mdon tegye
lehet ov a sorok kijellst a felhasznl szmra.
A fggvny els o paramtere a kijellst kezel o adatszerkezetet jelli
a memriban, a msodik paramtere pedig a kvetkez o llandk
egyike lehet:
GTK_SELECTION_NONE A fban a felhasznl egyetlen sort sem je-
llhet ki.
GTK_SELECTION_SINGLE A felhasznl legfeljebb egy sort jellhet
ki, gy a kijellt sorok szma mindig 0 vagy 1 lesz.
GTK_SELECTION_BROWSE A fban a felhasznl egy sort jellhet ki.
Ha gy jelentjk meg a ft, hogy el otte egyetlen sort sem jell-
tnk ki, akkor nem lesz kijellt sor, de a felhasznl az ltala
vgzett kijellst csak gy vonhatja vissza, hogy egy msik sort
jell ki. gy, ha a fa megjelentse el ott kijellnk egy sort, ak-
kor a fban mindig pontosan egy kijellt sor lesz.
A fa kperny oelemnek ez az alaprtelmezett kijellsi mdja.
GTK_SELECTION_MULTIPLE Ebben az zemmdban tetsz oleges
szm sor kijellhet o.
Ebben az zemmdban a felhasznl j elemet jellhet ki anl-
kl, hogy a mr kijellt elemek kijellst visszavonn, ha le-
nyomja a Ctrl billenty ut, s ot a sorok egsz tartomnya is kije-
llhet o a Shift billenty u segtsgvel.
GtkSelectionMode gtk_tree_selection_get_mode(GtkTreeSelection
*
vlaszts); A fggvny segtsgvel lekrdezhetjk, hogy a fa
kperny oelem milyen mdon teszi lehet ov a felhasznlnak a
sorok kijellst.
A fggvny paramtere a kijellst kezel o adatszerkezetet je-
lli a memriban, a visszatrsi rtke pedig az el oz o a
gtk_tree_selection_set_mode() fggvnynl bemutatott l-
landk egyike.
gboolean gtk_tree_selection_get_selected(GtkTreeSelection
*
vlaszts, GtkTreeModel
**
raktr, GtkTreeIter
*
bejr); A fggvny segtsgvel lekrdezhetjk, hogy a fa
kperny oelemben van-e kijellt elem s ha van, akkor a fhoz
tartoz raktr melyik sora van kijellve. Ezt a fggvnyt kiz-
rlag akkor hasznlhatjuk, ha a fa egy id oben legfeljebb csak
egy sor kijellst teszi lehet ov, azaz, ha a kijellsi mdja
GTK_SELECTION_SINGLE vagy GTK_SELECTION_BROWSE.
gtk 2007/10/21 14:22 page 313 #313
313
A fggvny els o paramtere a kijellst kezel o adatszerkezetet jelli
a memriban. A msodik paramtere annak a mutatnak a helyt
jelli, ahov a fa kperny oelemhez tartoz raktr cmt el akarjuk
helyezni. Ennek a paramternek az rtke lehet NULL is, ekkor a
fggvny a raktr cmt nem adja meg a fggvny.
A harmadik paramter egy bejr cmt jelli a memriban. A fgg-
vny ezt a bejrt a kijellt sorra lltja. A harmadik paramter is
lehet NULL, ekkor a fggvny nem adja meg, hogy melyik elem van
kijellve, csak a visszatrsi rtkt hasznlhatjuk fel.
A fggvny visszatrsi rtke megadja, hogy van-e kijellt elem,
azaz igaz logikai rtk u, ha a felhasznl kivlasztott egy elemet a
kperny on.
GList
*
gtk_tree_selection_get_selected_rows(GtkTreeSelection
*
vlaszts, GtkTreeModel
**
raktr); A fggvny segtsgvel
lekrdezhetjk a fa kperny oelemben kijellt sorok listjt. A
fggvny egy egy listt hoz ltre, amelyben GtkTreePath tpus
elemek vannak, mindegyikk egy kijellt sort jellve a fhoz tartoz
raktrban.
A fggvny els o paramtere a kijellst kezel o adatszerkezetre mu-
tat, a msodik paramter pedig azt a mutatt jelli a memri-
ban, ahova a fa kperny oelemhez tartoz raktr cmt akarjuk el-
helyezni. Ez utbbi paramter rtke lehet NULL is.
A fggvny visszatrsi rtke a fggvny ltal ltrehozott egyszere-
sen lncolt listt jell a memriban. A lista elemei GtkTreePath
tpus adatszerkezeteket jellnek a memriban.
Ha a listt meg akarjuk semmisteni, minden GtkTreePath t-
pus elemet fel kell szabadtanunk a gtk_tree_path_free() fgg-
vnnyel, majd a listt is meg kell semmistennk a g_list_free()
fggvnnyel.
gint gtk_tree_selection_count_selected_rows(GtkTreeSelection
*
vlaszts); A fggvny segtsgvel lekrdezhetjk, hogy hny
sor van kijellve a fa kperny oelemben.
A fggvny paramtere a kijellst kezel o adatszerkezetet jelli a
memriban, a visszatrsi rtke pedig megadja, hogy az adott pil-
lanatban hny sor van kijellve.
void gtk_tree_selection_select_path(GtkTreeSelection
*
vlaszts, GtkTreePath
*
svny); A fggvny segtsg-
vel az svnnyel jelzett elemet kijellhetjk.
gtk 2007/10/21 14:22 page 314 #314
314
A fggvny els o paramtere a kijellst kezel o adatszerkezetet, a
msodik paramtere pedig a kijellend o sor helyt meghatroz s-
vnyt jelli a memriban.
void gtk_tree_selection_unselect_path(GtkTreeSelection
*
vlaszts, GtkTreePath
*
svny); A fggvny segtsgvel
a kperny oelem adott sorn a kijellst megszntethetjk. Ha a
sor nincs kijellve a fggvny nem vltoztatja meg a kperny oelem
llapott.
A fggvny els o paramtere a kijellst kezel o adatszerkezetet, a
msodik paramtere pedig a sort meghatroz svnyt jelli a me-
mriban.
gboolean gtk_tree_selection_path_is_selected(GtkTreeSelection
*
vlaszts, GtkTreePath
*
svny); A fggvny segtsgvel
lekrdezhetjk, hogy az adott svny ltal kijellt sor ki van-e
jellve.
A fggvny els o paramtere a kijellst kezel o adatszerkezetet, a
msodik paramtere pedig az svnyt jelli a memriban. A fgg-
vny visszatrsi rtke igaz, ha az adott sor ki van jellve.
void gtk_tree_selection_select_iter(GtkTreeSelection
*
vlaszts, GtkTreeIter
*
bejr); A fggvny segtsg-
vel a bejrval jellt sort kijellhetjk ppen gy, mintha a
felhasznl jellte volna ki azt.
A fggvny els o paramtere a kijells kezelsre hasznlt adatszer-
kezetet, a msodik paramtere pedig a bejrt jelli a memriban.
void gtk_tree_selection_unselect_iter(GtkTreeSelection
*
vlaszts, GtkTreeIter
*
bejr); A fggvny segtsgvel
a fa kperny oelemhez tartoz raktrban a bejrval jellt sor
kijellst a fban visszavonhatjuk.
A fggvny els o paramtere a kijellst kezel o adatszerkezetet, a
msik paramtere pedig a bejrt jelli a memriban.
gboolean gtk_tree_selection_iter_is_selected(GtkTreeSelection
*
vlaszts, GtkTreeIter
*
bejr); A fggvny segtsgvel
lekrdezhetjk, hogy a bejrval jelzett sor ki van-e jellve.
A fggvny els o paramtere a fa kperny oelemhez tartoz, a kijel-
ls kezelsre hasznlt adatszerkezetet jelli a memriban. A m-
sodik paramter a fa kperny oelemhez tartoz raktr egy sort je-
lli, a visszatrsi rtk pedig megadja, hogy az adott sor ki van-e
jellve.
gtk 2007/10/21 14:22 page 315 #315
315
void gtk_tree_selection_select_all(GtkTreeSelection
*
vlaszts); A fggvny segtsgvel a fa kperny oelem minden
sort kijellhetjk egy lpsben.
A fggvny paramtere a fa kperny oelemhez tartoz, a kijellt ele-
mek nyilvntartsra szolgl adatszerkezetet jelli a memriban.
void gtk_tree_selection_unselect_all(GtkTreeSelection
*
vlaszts); A fggvny segtsgvel a fa kperny oelemben
tallhat sszes sor kijellst megszntethetjk.
A fggvny paramtere a kijellt elemek nyilvntartsra szolgl
adatszerkezetet jelli a memriban.
void gtk_tree_selection_select_range(GtkTreeSelection
*
vlaszts, GtkTreePath
*
eleje, GtkTreePath
*
vge); A
fggvny segtsgvel a fa kperny oelem egyms utn kvetkez o
sorait, a sorok egy tartomnyt jellhetjk ki. Ehhez termszetesen
a fban el oszr engedlyeznnk kell a tbbszrs kijellst.
A fggvny els o paramtere a kijells kezelsre hasznlt adatszer-
kezetet jelli a memriban. A msodik paramter az els o kijellt
sort, a harmadik paramter pedig az utols kijellt sort azonost
bejrt jell o mutat.
void gtk_tree_selection_unselect_range(GtkTreeSelection
*
vlaszts, GtkTreePath
*
eleje, GtkTreePath
*
vge); A
fggvny segtsgvel a fa kperny oelemben tallhat sorok egy
tartomnyn szntethetjk meg a kijellst.
A fggvny paramtereinek jelentse megegyezik a
gtk_tree_selection_select_range() fggvny paramterei-
nek a jelentsvel.
A kvetkez o oldalakon a fa kperny oelemben tallhat kijellseket ke-
zel o eszkzk hasznlatt mutatjuk be pldkon keresztl.
55. plda. A kvetkez o igen egyszer u fggvny gy lltja be a fa kper-
ny oelemet, hogy abban a felhasznl egy id oben tbb sort is kijellhes-
sen.
1 inline void
2 w_tree_view_set_multiselect(GtkTreeView
*
tree_view)
3 {
4 GtkTreeSelection
*
selection;
5
6 selection = gtk_tree_view_get_selection(tree_view);
7 gtk_tree_selection_set_mode(selection,
gtk 2007/10/21 14:22 page 316 #316
316
8 GTK_SELECTION_MULTIPLE);
9 }
A fggvny igen egyszer u, az el oz o oldalakon trgyalt ismeretek alapjn
knnyen megrthet o.
56. plda. A kvetkez o fggvny bemutatja, hogy hogyan krdezhetjk
le s llthatjuk be a fa kperny oelemben kijellt sorok listjt.
1 gboolean
2 commissions_tree_view_refresh(GtkTreeView
*
tree_view)
3 {
4 GtkTreeModel
*
tree_model;
5 GtkTreeSelection
*
selection;
6 GList
*
selected,
*
li;
7 GtkTreePath
*
path;
8
9 tree_model = gtk_tree_view_get_model(tree_view);
10 g_assert(GTK_IS_TREE_STORE(tree_model));
11
12 /
*
13
*
A kijellt elemek listjnak mentse.
14
*
/
15 selection = gtk_tree_view_get_selection(tree_view);
16 selected = gtk_tree_selection_get_selected_rows(
17 selection, NULL);
18
19 /
*
20
*
A lista jraolvassa.
21
*
/
22 gtk_tree_store_clear(GTK_TREE_STORE(tree_model));
23 sql_fill_tree_store_list(GTK_TREE_STORE(tree_model),
24 connection, "SELECT
*
FROM commission_view;");
25
26 if (selected == NULL)
27 return TRUE;
28 /
*
29
*
A megfelel o elemek kijellse.
30
*
/
31 li = selected;
32 while (li != NULL) {
33 path = li->data;
34 gtk_tree_selection_select_path(selection, path);
35 li = li->next;
gtk 2007/10/21 14:22 page 317 #317
317
36 }
37 /
*
38
*
A lista felszabadtsa.
39
*
/
40 g_list_foreach(selected, gtk_tree_path_free, NULL);
41 g_list_free(selected);
42 return TRUE;
43 }
A fggvny menti a kijellt sorok listjt, jraolvassa a sorokat, majd
jra kijelli azokat a sorokat, amelyek a frissts el ott ki voltak jellve.
Nyilvnval, hogy ha a frissts sorn j sorok jelennek meg vagy csk-
ken a sorok szma, akkor nem biztos, hogy clszer u az ugyanazon helyen
megjelen o sorokat jra kijellni, gy sszetettebb fggvny segtsgvel
logikusabban m ukd o programot kszthetnk.
A fggvny a 1517. sorban lekrdezi a kijellt sorokra mutat sv-
nyek listjt a gtk_tree_selection_get_selected_rows() fggvny
segtsgvel, majd a 22. sorban trli a raktrat, hogy a 2324. sorban
jraolvassa.
A fggvny ezek utn a 3136. sorok kzt vgigjrja a frissts el ott
kijellt sorokat tartalmaz listt s a 34. sorban jra kijelli a sorokat.
Ezek utn mr csak a lista felszabadts van htra, amelyet a 4041.
sorokban olvashatunk.
A fa kperny oelemben a sorok kijellshez hasonlan hasonlan mo-
zoghatunk az oszlopok kztt is. Ha az egyes oszlopokban tallhat cel-
larajzolk szerkeszthet ok, akkor a GTK programknyvtr nem csak azt
jelzi, hogy melyik sor van kijellve, hanem azt is, hogy a soron bell me-
lyik az aktv oszlop. A fa kperny oelemen bell van egy kurzor, amelyet
a felhasznl a kurzormozgat billenty ukkel s az egrrel is mozgathat
s amelynek megjelense fgg a belltott stlustl. A kurzor helynek
lekrdezsre s belltsra a kvetkez o fggvnyeket hasznlhatjuk.
void gtk_tree_view_get_cursor(GtkTreeView
*
fa,
GtkTreePath
**
svny, GtkTreeViewColumn
**
oszlop); A
fggvny segtsgvel lekrdezhetjk, hogy a fa kperny oelemben a
kurzor melyik sorban s melyik oszlopban tallhat.
A fggvny els o paramtere a fa kperny oelemet jelli a memri-
ban. A msodik s a harmadik paramter egy-egy mutatt jell a
memriban, ahov a fggvny az aktv sort jell o svnyt s az ak-
tv oszlop cmt elhelyezi. Ha egyetlen sor vagy oszlop sem, akkor
a fggvny a msodik, illetve a harmadik paramterek ltal jellt
memriaterletekre NULL rtket helyez.
gtk 2007/10/21 14:22 page 318 #318
318
Ha a fggvny a msodik paramtervel jelzett memriaterletre a
NULL rtkt ol klnbz o rtket msol, akkor az egy jonan lt-
rehozott svnyt jell a memriban, amelyet hasznlat utn a
gtk_tree_path_free() fggvnnyel fel kell szabadtanunk.
void gtk_tree_view_set_cursor(GtkTreeView
*
fa,
GtkTreePath
*
svny, GtkTreeViewColumn
*
oszlop,
gboolean szerkeszts); A fggvny segtsgvel a fa kper-
ny oelem aktv celljt llthatjuk be.
A fggvny els o paramtere az svnyt jelzi, ami meghatrozza,
hogy a kurzor melyik sorba kerljn. A msodik paramter a fa
kperny oelem egy oszlopt jelli s gy meghatrozza, hogy a kur-
zor melyik oszlopba kerljn.
A fggvny harmadik paramtere meghatrozza, hogy a kurzor t-
helyezse utn az aktv cellt szerkeszteni akarjuk-e. Ha ennek a
paramternek igaz az rtke s a megfelel o cellarajzol szerkeszt-
het o, akkor a kurzor thelyezse utn a cella, amelyre a kurzort
helyeztk azonnal szerkeszthet o.
A kijellt elemek programbl val belltshoz hasonlan fontos, hogy
szablyozni tudjuk a fa mely gai legyenek nyitott llapotban. Erre a
kvetkez o fggvnyeket hasznlhatjuk.
void gtk_tree_view_expand_all(GtkTreeView
*
fa); E fggvny
segtsgvel a fa kperny oelem sszes gt kinyithatjuk.
void gtk_tree_view_collapse_all(GtkTreeView
*
fa); E fgg-
vny segtsgvel a fa kperny oelem sszes gt bezrhatjuk.
void gtk_tree_view_expand_to_path(GtkTreeView
*
fa,
GtkTreePath
*
svny); A fggvny segtsgvel a fa kper-
ny oelem egy adott sornak sszes szl ojt kinyithatjuk, hogy a fa
adott sora megjelenthet o legyen.
A fggvny els o paramtere a fa kperny oelemet jelli a memri-
ban, a msodik paramtere pedig azt svnyt jelzi, ami a kinyitand
sort jelli.
gboolean gtk_tree_view_expand_row(GtkTreeView
*
fa,
GtkTreePath
*
svny, gboolean mindet); A fggvny se-
gtsgvel a fa kperny oelem adott gt nyithatjuk ki.
A fggvny els o paramtere a fa kperny oelemet, a msodik para-
mtere a sort meghatroz svnyt jelli a memriban. A fggvny
harmadik paramtere megadja, hogy csak az adott sor kzvetlen
leszrmazottait akarjuk megjelenteni vagy az sszes kzvetett le-
szrmazottjt is ki akarjuk nyitni. Ha a harmadik paramter rtke
gtk 2007/10/21 14:22 page 319 #319
319
TRUE a fggvny a sor sszes kzvetlen s kzvetett leszrmazottjt
is kinyitja.
A fggvny visszatrsi rtke igaz, ha a sor kinyitsa lehetsges
volt, azaz a sor s a leszrmazottai is lteztek.
gboolean gtk_tree_view_collapse_row(GtkTreeView
*
fa,
GtkTreePath
*
svny); A fggvny segtsgvel a fa kper-
ny oelem adott sort bezrhatjuk.
A fggvny els o paramtere a fa kperny oelemet, msodik param-
tere pedig a bezrand sor svnyt jelli. A fggvny visszatrsi
rtke igaz, ha a m uvelet sikeres volt.
A fa kperny oelem hasznlata kzben szksgnk lehet az oszlopok le-
krdezsre. A kvetkez o nhny fggvny segtsgvel a mr ltrehozott
fa kperny oelem oszlopainak cmt krdezhetjk le ktflekppen is.
GtkTreeViewColumn
*
gtk_tree_view_get_column(GtkTreeView
*
fa, gint oszlopszm); A fggvny segtsgvel lekrdezhetjk
a fa kperny oelem adott sorszm oszlopnak cmt. A fggvny
az oszlopok szmozsakor a rejtett a kperny on nem lthat
oszlopokat sem hagyja ki.
A fggvny els o paramtere a fa kperny oelemet jelli a memri-
ban, a msodik paramtere pedig megadja, hogy hnyadik oszlop
cmt akarjuk megtudni. Az oszlopok szmozsa 0-tl indul.
A fggvny visszatrsi rtke a paramterrel jelzett oszlopot jelzi a
memriban ha a fban az adott sorszm oszlop megtallhat s
NULL ha nem.
GList
*
gtk_tree_view_get_columns(GtkTreeView
*
fa); A fgg-
vny segtsgvel a fa kperny oelemben tallhat sszes oszlop c-
mt krdezhetjk le egy lpsben.
A fggvny paramtere a ft jelli a memriban. A visszatrsi r-
tk egy a fggvny ltal ltrehozott egyszeresen lncolt listt je-
ll a memriban. A lista minden eleme egy, a fa kperny oelem
oszlopnak kezelsre szolgl GtkTreeViewColumn tpus adat-
szerkezetet jell a memriban. Ha a ft meg akarjuk semmis-
teni csak a fa trolsra szolgl memrit kell felszabadtanunk
a g_list_free() fggvny segtsgvel.
A bemutatott fggvnyek segtsgvel a kperny on megjelentett fa kp-
erny oelemek oszlopait elrhetjk. Az oszlopok cmnek segtsgvel az
oszlop sszes tulajdonsgt lekrdezhetjk, vagy akr meg is vltoztat-
hatjuk. Ennek a lehet osgnek a segtsgvel olyan fggvnyeket is k-
szthetnk, amelyekkel az alkalmazsunk sszes fa s lista szer u kper-
ny oelemnek belltst lehet ov teszi.
gtk 2007/10/21 14:22 page 320 #320
320
8.13. bra. A fa kperny oelem
oszlopainak kiolvassa
Ilyen eszkzt lthatunk a 8.13. brn, ahol
olyan ablakot mutatunk be, amelyben a fel-
hasznl az oszlopok megjelentst kapcsol-
hatja ki- s be. Az ablakban egy fa kperny o-
elem tallhat, amiben a belltand fa osz-
lopnevei ltszanak, soronknt egy. A megva-
lstshoz teht olyan programot kell kszte-
nnk, ami a belltand fa kperny oelem osz-
lopainak tulajdonsgait egy msik, a bell-
tsra hasznlt fa soraiban helyezi. A bell-
tsra hasznlt fa soraiben minnden oszlop-
nv el ott egy kapcsol cellarajzol is megjele-
nik, ami azt szablyozza, hogy a belltand
fa adott oszlopa megjelenjen-e a kperny on. A
megvalsts sorn teht nem csak az egyes
oszlopok neveit kell kiolvasnunk, hanem azt is, hogy az adott oszlop
megjelenik-e a kperny on, azaz lthat-e vagy rejtett.
Nyilvnval, hogy miutn a felhasznl elvgezte a belltst, az egyes
sorok rtkeit felhasznlva a belltand fa oszlopainak tulajdonsgait
be kell lltanunk.
Krds mg termszetesen az is, hogy a fa tulajdonsgait bellt ab-
lakot mikor jelentjk meg a kperny on s hogyan adjuk t neki a be-
lltand fa memriabeli cmt. Erre a feladatra a legalkalmasabbnak
a felhasznl szempontjbl legtermszetesebbnek a fa terletn meg-
jelenthet o felbukkan men t unik. A fa kperny oelemn el ohvott fel-
bukkan menk kezelsre a 324. oldalon tallhat 58 pldban trnk
mutatunk be egy lehetsges megvalstst.
A 8.13. brn lthat belltablak fggvnyeinek fontosabb rszeit a
kvetkez o plda mutatja be.
57. plda. A kvetkez o programrszlet egy fa kperny oelem (to_set)
oszlopainak memriacmt krdezi le, majd a cmek felhasznlsval ki-
olvassa az oszlopokhoz tartoz tulajdonsgokat, hogy azokat elhelyezze
egy lista szerkezet u raktrban.
1 list_store = gtk_list_store_new(3,
2 G_TYPE_BOOLEAN, // Lthat-e
3 G_TYPE_STRING, // Cm
4 G_TYPE_INT // Oszlop szma
5 );
6
7 columns = gtk_tree_view_get_columns(to_set);
8 for(li=columns, n=0; li != NULL; li = li->next, ++n)
9 {
gtk 2007/10/21 14:22 page 321 #321
321
10 g_object_get(G_OBJECT(li->data),
11 "visible", &visible,
12 "title", &title,
13 NULL);
14 gtk_list_store_append(list_store, &iter);
15 gtk_list_store_set(list_store, &iter,
16 0, visible,
17 1, title,
18 2, n,
19 -1);
20 }
21
22 g_list_free(columns);
A programrszlet 7. sorban ltrehozzuk a fa kperny oelem oszlopait tar-
talmaz listt, amelynek elemeit a 820. sorok kzt olvashat ciklusban
vgigjrjuk. A lista elemeit vgigjrva a 1013. sorban lekrdezzk az
oszlopok kt tulajdonsgt, majd a 1419. sorok kzt ezt a kt tulajdon-
sgot elhelyezzk a programrszlet 15. sorban ltrehozott lista szer-
kezet u raktrban. Ezt a raktrat a ks obbiekben megjelenthetjk egy
msik fa kperny oelemben.
A programrszlet 22. sorban a fa kperny oelem oszlopait jell o listt
megsemmistjk a g_list_free() fggvny segtsgvel.
A kvetkez o sorok bemutatjk hogyan msolhatjuk vissza a felhasznl
ltal mdostott tulajdonsgokat.
1 gtk_tree_model_get_iter_first(tree_model, &iter);
2
3 do {
4 gtk_tree_model_get(tree_model, &iter,
5 0, &visible,
6 2, &n,
7 -1);
8 column = gtk_tree_view_get_column(to_set, n);
9 g_object_set(G_OBJECT(column),
10 "visible", visible,
11 NULL);
12 } while(gtk_tree_model_iter_next(tree_model, &iter));
Az els o sorban a tulajdonsgokat tartalmaz raktr elejre llunk, majd
a 312. sorok kzt olvashat ciklus segtsgvel vgigjrjuk annak sszes
sort.
A ciklusban el oszr kiolvassuk, hogy a soron kvetkez o oszlop lthat-
sgt hogyan lltotta be a felhasznl (47. sorok), lekrdezzk a bell-
gtk 2007/10/21 14:22 page 322 #322
322
tand fa adott oszlopnak cmt (8. sor), majd a ,egfelel oen belltjuk az
oszlop lthatsgt (911. sorok).
8.7.4. A fa kperny oelem jelzsei
A fa kperny oelemek esetben klnsen fontosak a jelzsek, hiszen a
legtbb alkalmazs a fa kperny oelemeken vgzett m uveletek hatsra
klnfle m uveleteket kell, hogy elvgezzen. A legfontosabb jelzsek a
kvetkez ok s hatsukra meghvhat fggvnyek tpusa a kvetkez o.
"button-press-event" Ezt a jelzst a GTK programknyvtr akkor
kldi, amikor a felhasznl lenyomja az egr valamelyik gombjt
a fa kperny oelem felett. Valjban a GTK programknyvtr ezt az
esemnyt minden kperny oelem esetn kezeli, a fa kperny oelem
esetben azonban klnleges jelent osge van. A legtbb alkalma-
zsban a fa kperny oelem felett lenyomott egrbillenty u hatsra
egy felbukkan ment jelentnk meg, amelyik ppen arra a sorra
vonatkozik, amelyikre a felhasznl kattintott.
A jelzs hatsra visszahvott fggvny s az esemny feldolgozs-
hoz okvetlenl szksges fggvny tpusa a kvetkez o.
gboolean fggvny(GtkWidget
*
kpernyoelem,
GdkEventButton
*
esemny, gpointer adatok); Az egr-
kattints hatsra visszahvott fggvny, amelynek els o
paramtere a kperny oelemet jelli a memriban. A msodik
paramter szintn mutat, olyan adatszerkezetet jell, amely-
ben az esemny az egrkattints legfontosabb jellemz oi
vannak felsorolva.
A fggvny harmadik paramtere egy mutat, rtkt a vissza-
hvott fggvny nyilvntartsba vtelekor hatrozhatjuk meg.
A fggvny visszatrsi rtke igen fontos, meghatrozza, hogy
az esemnyt az egrkattintst a GTK programknyvtrnak
fel kell-e dolgoznia. Ha a fggvny visszatrsi rtke TRUE az
azt jelzi, hogy a fggvny az egrkattintst kezelte, nincs szk-
sg arra, hogy a GTK beptett esemnykezel oje az egrkattin-
tst a szoksos mdon kezelje. A fggvny a FALSE visszatrsi
rtkkel jelezheti, hogy a beptett esemnykezel o futtatsra
szksg van.
gboolean gtk_tree_view_get_path_at_pos(GtkTreeView
*
fa, gint x, gint y, GtkTreePath
**
svny,
GtkTreeViewColumn
**
oszlop, gint
*
cella_x, gint
*
cella_y); A fggvny segtsgvel lekrdezhetjk, hogy a
fa kperny oelem adott kppontja a raktr melyik elemt sort
gtk 2007/10/21 14:22 page 323 #323
323
tartalmazza. Ezt a fggvnyt ltalban akkor hasznljuk, ha
arra vagyunk kvncsiak, hogy az egrmutat alatt a fa melyik
sora s oszlopa tallhat.
A fggvny paramtereinek s visszatrsi rtknek jelentse
a kvetkez o:
fa A fa kperny oelemet jell o mutat.
x A lekrdezend o koordinta x rtke.
y A lekrdezend o koordinta y rtke.
svny Mutat, ami azt a helyet jelzi a memriban, ahov
a fggvny az adott ponton megjelen o sor svnyt tar-
talmaz memriaterlet cmt helyezi el. Ha a fggvny a
raktr sort megtallja s egy svny cmt helyezi el itt,
hasznlat utn az svnyt a gtk_tree_path_free() fgg-
vnnyel fel kell szabadtanunk.
oszlop Ha ez a paramter nem NULL, akkor olyan memria-
terletet jell, ahov a fggvny annak a az oszlopnak a
cmt helyezi el, amelyen bell a paramterknt tadott x
s y koordinta tartozik. Ezt az adatszerkezetet termszete-
sen nem szerencss felszabadtani, mert a fa kperny oelem
hasznlja.
cella_x, cella_y Ha ezeknek a paramtereknek az rtke
nem NULL, akkor a fggvny ezekre a helyekre elhelyezi
az x, y koordintk celln belli koordintarendszerre t-
szmtott rtkt. Ezekre az rtkekre ltalban nincsen
szksgnk, ezrt az utols kt paramter rtke ltalban
NULL.
visszatrsi_rtk A fggvny visszatrsi rtke igaz, ha
az adott koordintkon valban volt elem s gy az svnyt
sikerlt megllaptani. A visszatrsi rtk csak akkor ha-
mis, ha a felhasznl a fa kperny oelemen bell a sorok
alatt tallhat res helyre kattintott.
"row-activated" Ez a jelzs igen fontos, akkor jelentkezik, ha a fel-
hasznl a fa kperny oelem valamelyik sorra dupla kattintssal
kattint. A jelzst a GTK akkor is kldi, ha a sor aktv oszlopa nem
szerkeszthet o s a felhasznl a sort a billenty uzettel aktivlja.
A jelzs kezelsre a kvetkez o tpus visszahvott fggvny hasz-
nlhat:
void fggvny(GtkTreeView
*
fa, GtkTreePath
*
path,
GtkTreeViewColumn
*
column, gpointer adatok); Ilyen
fggvnyt hasznlhatunk a fa kperny oelem sornak aktivl-
shoz kapcsold visszahvott fggvnyknt.
gtk 2007/10/21 14:22 page 324 #324
324
A fggvny els o paramtere a fa kperny oelemet jelli a me-
mriban. A msodik paramter az aktivlt sort jell o svny,
a harmadik paramter pedig az aktivlt oszlopot memriabeli
cme. A visszahvott fggvnynek sem az svnyt, sem pedig az
oszlopot nem szabad felszabadtania.
A GTK nem kldi a "row-activated" jelzst, ha a felhasznl
a fa kperny oelemen bell megjelentett sorok alatti esetlege-
sen resen hagyott terletre kattint, ezrt a visszahvott fgg-
vny msodik s harmadik paramtere mindig rvnyes adat-
szerkezetet jell, azaz mindig ismert a sor s az oszlop, ahol az
aktivls trtnt.
A fggvny negyedik paramtere a fggvny nyilvntartsba v-
telekor meghatrozott memriacm, amelyet a programoz ki-
egszt o adatok tadsra hasznlhat.
A kvetkez o plda bemutatja hogyan jelenthetnk meg felbukkan me-
nt a fa kperny oelem felett, ha a felhasznl lenyomja az egr jobb egr-
gombjt.
58. plda. A kvetkez o fggvny egy fa kperny oelemhez tartoz vissza-
hvott fggvny, amelyet a GTK programknyvtr az egr gombjnak le-
nyomsakor a "button-press-event" esemny hatsra hv meg. A
fggvny megjelent egy felbukkan ment s a mennek tadja annak a
sornak az azonostjt, amelyen a felhasznl az egr gombjt lenyomta.
1 gboolean
2 on_commissions_treeview_button_press_event(
3 GtkWidget
*
widget,
4 GdkEventButton
*
event,
5 gpointer user_data)
6 {
7 GtkTreePath
*
path;
8 GtkTreeModel
*
tree_model;
9 GtkTreeIter iter;
10 gboolean found;
11 static GtkWidget
*
menu_widget = NULL;
12 gint
*
id = g_new(gint, 1);
13
14 if (event->type != GDK_BUTTON_PRESS ||
15 event->button != 3)
16 return FALSE;
17
18 found = gtk_tree_view_get_path_at_pos(
19 GTK_TREE_VIEW(widget),
gtk 2007/10/21 14:22 page 325 #325
325
20 (gint) event->x,
21 (gint) event->y,
22 &path, NULL,
23 NULL, NULL);
24
25 if (found) {
26 tree_model = gtk_tree_view_get_model(
27 GTK_TREE_VIEW(widget));
28 gtk_tree_model_get_iter(tree_model, &iter, path);
29 gtk_tree_model_get(tree_model, &iter, 0, id, -1);
30 gtk_tree_path_free(path);
31 } else {
32
*
id = -1;
33 }
34
35 if (menu_widget == NULL)
36 menu_widget = create_tree_view_popup_menu();
37 g_object_set_data(G_OBJECT(menu_widget), "tree_view",
38 widget);
39 g_object_set_data_full(G_OBJECT(menu_widget), "id",
40 id, g_free);
41
42 gtk_menu_popup(GTK_MENU(menu_widget),
43 NULL, NULL, NULL, NULL,
44 event->button, event->time);
45
46 return TRUE;
47 }
A fggvny a 11. sorban egy statikus mutatt hoz ltre, amiben a ltre-
hozott felbukkan men cmt trolja. Azrt szerencss statikus mutatt
hasznlni, mert a felbukkan men nem semmisl meg automatikusan
s gy a kvetkez o fggvnyhvskor is felhasznlhat.
A 12. sorban dinamikusan foglalunk memrit egy azonost trol-
sra. Ezt az azonostt fogjuk felhasznlni arra, hogy a felbukkan men
menpontjainak visszahvott fggvnyei szmra jelezzk, hogy a m uve-
letet melyik elemen kell elvgezni. A felbukkan menkek szmra t-
adott rtkeket statikus vltozban vagy dinamikusan foglalt memria-
terleten kell trolnunk, hiszen a fggvny vgrehajtsa utn is szks-
gnk van rjuk.
A fggvny 1416. sorban lthatjuk hogyan ellen orizhetjk le, hogy
a bekvetkezett esemny a jobb oldali nyomgomb lenyomsa volt-e. Ha
a fggvny gy tallja, hogy nem az egr nyomgombjnak lenyomsa,
hanema nyomgomb felengedse kvetkezett be, vagy a nyomgomb sor-
gtk 2007/10/21 14:22 page 326 #326
326
szma nem 3, azaz nem a jobb oldali gombrl van sz, akkor a 16. sorban
a fggvny hamis logikai rtket ad vissza. Ezzel jelzi a fggvny, hogy
az alaprtelmezett esemnykezel onek le kell futnia, hogy az esemnyt a
szoksos mdon kezelje.
Ha a jobb egrgomb lenyomsa kvetkezett be, akkor ezek utn a fgg-
vny a 1823. sorokban a gtk_tree_view_get_path_at_pos() fgg-
vny segtsgvel lekrdezi az egrmutat alatt tallhat sorhoz tartoz
svnyt. Ha a mvelet sikeres volt, azaz a felhasznl nem a sorok alatt
tallhat res terletre kattintott, akkor a 2630. sorban lekrdezzk a
fa kperny oelemhez tartoz raktrbl az adott sor els o oszlopban tall-
hat egsz tpus rtket s az svny trolsra hasznlt memriate-
rletet felszabadtjuk. Ha az egrgomb alatt nincs adatsor, az azonostt
trol adatterletre 1-et helyeznk.
Ezek utn, ha a felbukkan ment mg nem hoztuk ltre, a 36. sorban
ltrehozzuk. A kvetkez o lps a fa kperny oelem s az azonost tadsa
a felbukkan mennek. Ehhez a G programknyvtr g_object_set()
s g_object_set_full() fggvnyeit hasznljuk, amelyekkel a G prog-
ramknyvtr ltal kezelt adatszerkezetekhez rendelhetnk adatokat. Fi-
gyeljk meg, hogy a dinamikusan foglalt memriaterlet felszabadtsra
szolgl fggvnyt hogyan adjuk meg a 40. sorban!
Az utols lps a felbukkan men megjelentse a gtk_menu_popup()
fggvnnyel (4244. sorok), amely utn a fggvny igaz logikai rtket ad
vissza, amellyel jelzi a GTK programknyvtr szmra, hogy az esemny
kezelst elvgezte, az alaprtelmezett esemnykezel o futtatsra nincs
szksg.
A kvetkez o plda a fa kperny oelemen trtn o dupla kattints kezel-
sre szolgl visszahvott fggvny ksztst mutatja be.
59. plda. A kvetkez o visszahvott fggvny a fa kperny oelem brmely
sornak aktivlsakor (dupla kattints) hvdik meg. A fggvny megje-
lent egy j ablakot s tadja az ablaknak az aktivlt sor azonostjt.
1 void
2 on_this_treeview_row_activated(
3 GtkTreeView
*
treeview,
4 GtkTreePath
*
path,
5 GtkTreeViewColumn
*
column,
6 gpointer user_data)
7 {
8 GtkWidget
*
window;
9 gint
*
id = g_new(gint, 1);
10
11
*
id = w_tree_view_read_int(treeview, path, 0);
12
gtk 2007/10/21 14:22 page 327 #327
327
13 window = create_window2();
14 g_object_set_data_full(G_OBJECT(window),
15 "id", id, g_free);
16 gtk_widget_show(window);
17 }
A fggvny 9. sorban dinamikus memriafoglalssal ksztnk el o he-
lyet az aktivlt sor szm jelleg u azonostjnak trolsra. Mivel a megje-
lentend o ablaknak akkor is szksge lesz erre az azonostra, amikor ez
a visszahvott fggvny mr befejez odtt, a dinamikus memriafoglals
szerencss megolds.
A 11. sorban a raktrnak a felhasznl ltal aktivlt sorbl olva-
sunk. Az olvass sorn egy sajt kszts u fggvnyt hasznlunk, ame-
lyet brki knnyedn elkszthet a mr bemutatott eszkzk felhaszn-
lsval.
A 13. sorban ltrehozzuk az j ablakot a Glade ltal ksztett fgg-
vny segtsgvel, a 1415. sorokban hozzkapcsoljuk az azonostt, a
16. sorban pedig megjelentjk a kperny on.
8.8. Az ikonmez o
8.14. bra. Az ikonmez o
Az ikonmez o a kperny o olyan ter-
lete, ahol sorokba s oszlopokba rende-
zett ikonok s ikonfeliratok jelenthet ok
meg. A GTK+ programknyvtr esetben
az ikonmez o kezelsre hasznlt tpus a
GtkIconView. A 8.14. brn egy ikonmez ot
gyelhetnk meg, amely a httrtr knyv-
trbejegyzseit brzolja.
Az ikonmez o els o pillantsra bonyolult-
nak s nehezen kezelhet onek t unik, a
programoz szempontjbl mgis viszony-
lag egyszer u eszkz, amelyet nhny egy-
szer u fggvny segtsgvel kezelhetnk.
Az ikonmez o szmra a megjelentend o
adatokat a GtkTreeModel tpus adatszerkezetben adhatjuk meg, de
mivel a a GtkListStore tpus raktr hasznlhat GtkTreeModel t-
pusknt, egyszer u lista tpus raktrat is hasznlhatunk.
Az ikonmez o ksztshez s hasznlathoz elengedhetetlenl fontosak
a kvetkez o fggvnyek:
void gtk_icon_view_set_model(GtkIconView
*
icon_view,
GtkTreeModel
*
model);
gtk 2007/10/21 14:22 page 328 #328
328
A fggvny segtsgvel bellthatjuk, hogy az ikonmez o honnan ve-
gye a megjelentend o ikonok adatait. A fggvny els o paramtere a
belltand ikonmez ot, a msodik paramtere pedig adattrat jelli
a memriban.
Az ikonmez o egyszer u lista adatait kpes megjelenteni, ezrt a m-
sodik paramterknt tadott mutat ltalban GtkListStore t-
pus elemet jell a memriban.
Fontos megjegyeznnk, hogy ennek a fggvnynek a hvsa mg
nem elgsges a m ukdshez, hiszen azt is meg kell adnunk, hogy
az adott lista egyes oszlopai milyen adatokat tartalmaznak, hogy
az ikonlista a listn bell hol tallja a megjelentend o kpeket s
kpalrsokat.
void gtk_icon_view_set_text_column(GtkIconView
*
icon_view, gint oszlopszm);
A fggvny segtsgvel megadhatjuk, hogy az ikonmez ohz tartoz
lista szerkezet u raktr (GtkListStore) melyik oszlopa tartalmazza
a kpek alatt megjelentend o szvegeket. A fggvny els o param-
tere az ikonmez ot jelli a memriban, a msodik paramtere pedig
megadja, hogy a alrsknt megjelentend o szvegeket a lista me-
lyik oszlopban helyeztk el. Az oszlopok szmozsa 0-tl indul.
Ha az ikonmez o ltrehozsa sorn nem hasznljuk ezt a fggvnyt,
a megjelentett ikonok alatt nem lesz felirat.
void gtk_icon_view_set_pixbuf_column(GtkIconView
*
icon_view, gint oszlopszm);
A fggvny nagyon hasonl a gtk_icon_view_set_text_column()
fggvnyhez, de nem az ikonok alatt megjelen o szvegekre, hanem
magukra az ikonokra vonatkozik.
void gtk_icon_view_set_item_width(GtkIconView
*
icon_view,
gint szlessg);
A fggvny segtsgvel megadhatjuk, hogy az ikonmez o az ikonok
s az alrsok megjelentshez hny kppontnyi szlessg u kper-
ny oterletet hasznljon fel. A fggvny els o paramtere az ikonme-
z ot jelli a memriban, a msodik paramtere pedig a kperny on
megjelen o oszlopok kppontban mrt szlessge.
Ezt a fggvnyt tulajdonkppen nem ktelez o hasznlni, de igen
hasznos lehet, mert ha a GTK+ programknyvtrra bzzuk a szles-
sg megvlasztst, valszn uleg csaldunk.
A kvetkez o plda bemutatja az ikonmez o egyszer u hasznlatt, amely
az eddig bemutatott eszkzkkel is lehetsges.
gtk 2007/10/21 14:22 page 329 #329
329
60. plda. A kvetkez o programrszlet knyvtrbejegyzseket jelent
meg egy ikonmez oben. A knyvtrakat mappt, az llomnyokat doku-
mentumot formz ikon jelli. Ha a felhasznl egy mappt brzol
ikonra kattint dupln, az ikonmez o tartalma megvltozik, az adott knyv-
trban tallhat knyvtrbejegyzseket jelenti meg.
1 #ifndef PIXMAP_DIR
2 #define PIXMAP_DIR PACKAGE_DATA_DIR "/pixmaps/" \
3 PACKAGE "/"
4 #endif
5 /
*
6
*
Ez a fggvny feltlti a GtkListStore typus listt
7
*
a munkaknyvtrban tallhat knyvtrbejegyzsek
8
*
adataival.
9
*
A lista oszlopai a kvetkez ok:
10
*
0) A knyvtrbejegyzs neve.
11
*
1) A knyvtrbejegyzs ikonja(knyvtr vagy fjl).
12
*
2) Logikai rtk, amely igaz, ha a knyvtr-
13
*
bejegyzs knyvtr.
14
*
/
15 static void
16 fill_store_with_filenames(GtkListStore
*
store)
17 {
18 DIR
*
directory;
19 struct dirent
*
entry;
20 GdkPixbuf
*
pixbuf_folder;
21 GdkPixbuf
*
pixbuf_file;
22 GtkTreeIter iter;
23 /
*
24
*
Trljk a lista eredeti tartalmt.
25
*
/
26 gtk_list_store_clear(store);
27 /
*
28
*
Ltrehozzuk a kt hasznlt ikont.
29
*
/
30 pixbuf_folder = gdk_pixbuf_new_from_file(
31 PIXMAP_DIR "folder.png", NULL);
32 pixbuf_file = gdk_pixbuf_new_from_file(
33 PIXMAP_DIR "file.png", NULL);
34 /
*
35
*
Megnyitjuk a knyvtrat olvassra.
36
*
/
37 directory = opendir(".");
38 if (directory == NULL)
gtk 2007/10/21 14:22 page 330 #330
330
39 return;
40 /
*
41
*
Olvassuk a knyvtrat s elhelyezzk az elemeket a
42
*
listban.
43
*
/
44 while ((entry = readdir(directory)) != NULL ){
45 /
*
Beszrs...
*
/
46 gtk_list_store_append(store, &iter);
47 /
*
az j elem ltal hordozott adatok.
*
/
48 gtk_list_store_set(store,
49 &iter,
50 0, entry->d_name,
51 1, entry->d_type == DT_DIR
52 ? pixbuf_folder : pixbuf_file,
53 2, entry->d_type == DT_DIR,
54 -1);
55 }
56 }
57
58 /
*
59
*
Ez a fggvny egy j GtkListStore listt hoz ltre
60
*
az jonan ksztett GtkIconView tpus ikonmez o
61
*
szmra, majd a megfelel o fggvny hvsval kitlti
62
*
a munkaknyvtr elemeinek neveivel.
63
*
/
64 void
65 on_iconview_realize(GtkWidget
*
widget,
66 gpointer user_data)
67 {
68 GtkTreeStore
*
list_store; /
*
FIXME: tpus!
*
/
69
70 list_store = gtk_list_store_new(3,
71 G_TYPE_STRING,
72 GDK_TYPE_PIXBUF,
73 G_TYPE_BOOLEAN
74 );
75
76 gtk_icon_view_set_model(GTK_ICON_VIEW(widget),
77 GTK_TREE_MODEL(list_store));
78 gtk_icon_view_set_text_column(GTK_ICON_VIEW(widget),
79 0);
80 gtk_icon_view_set_pixbuf_column(GTK_ICON_VIEW(widget),
81 1);
82 gtk_icon_view_set_item_width(GTK_ICON_VIEW(widget),
gtk 2007/10/21 14:22 page 331 #331
331
83 100);
84
85 fill_store_with_filenames(list_store);
86 }
87
88 /
*
89
*
Ezt a fggvnyt akkor hvjuk, ha a felhasznl a
90
*
dupla kattintssal knyvtrat vlt. A fggvny
91
*
elvgzi a knyvtrvltst, majd a megfelel o
92
*
fggvnnyel jraolvassa a knyvtrbejegyzsek
93
*
listjt.
94
*
/
95 void
96 on_iconview_item_activated(GtkIconView
*
iconview,
97 GtkTreePath
*
path,
98 gpointer user_data)
99 {
100 GtkListStore
*
store;
101 GtkTreeIter iter;
102 gboolean is_dir;
103 gchar
*
name;
104 /
*
105
*
Az ikonmez oh oz tartoz lista.
106
*
/
107 store = GTK_LIST_STORE(
108 gtk_icon_view_get_model(GTK_ICON_VIEW(iconview)));
109 /
*
110
*
A kijellt elemhez tartoz bejr.
111
*
/
112 gtk_tree_model_get_iter(GTK_TREE_MODEL(store), &iter,
113 path);
114 gtk_tree_model_get(GTK_TREE_MODEL(store), &iter,
115 0, &name,
116 2, &is_dir,
117 -1);
118 /
*
119
*
Ha nem knyvtr, nem tudunk knyvtrat vltani.
120
*
/
121 if (!is_dir) {
122 g_free (name);
123 return;
124 }
125 /
*
126
*
Knyvtrvlts s jraolvass.
gtk 2007/10/21 14:22 page 332 #332
332
127
*
/
128 chdir(name);
129 fill_store_with_filenames(store);
130 }
A pldaprogram 14. sora az alkalmazshoz tartoz ikonokat trol
knyvtr pontos nevt adja meg. Az itt hasznlt eszkzkr ol b ovebben
olvashatunk a 346. oldalon kezd od o 9.3.1. szakaszban.
GtkTreeModel
*
gtk_icon_view_get_model(GtkIconView
*
ikonmezo); E fggvny segtsgvel lekrdezhetjk az ikon-
mez ohz tartoz raktr cmt.
A fggvny paramtere az ikonmez ot jelli a memriban, a vissza-
trsi rtke pedig az ikonmez ohz tartoz raktr cme a memri-
ban. A visszatrsi rtk lehet NULL is, ha az ikonmez ohz mg nem
adtunk raktrat.
gint gtk_icon_view_get_text_column(GtkIconView
*
ikonmezo); A fggvny segtsgvel lekrdezhetjk, hogy az
ikonmez o a hozz tartoz raktr melyik oszlopbl olvassa a megje-
lentend o szveges rtket. Az oszlop belltsra a mr bemutatott
gtk_icon_view_set_text_column() fggvnyt hasznlhatjuk
A fggvny paramtere az ikonmez ot jelli a memriban, vissza-
trsi rtke pedig megadja a szveges rtket tartalmaz oszlop
szmt. A visszatrsi rtk 1 is lehet, ha a szveges rtket tar-
talmaz oszlop szmt mg nem lltottuk be.
void gtk_icon_view_set_markup_column(GtkIconView
*
ikonmezo, gint oszlop); A fggvny segtsgvel bellthatjuk,
hogy az ikonmez o a hozz tartoz raktr melyik oszlopbl olvassa
a megjelentend o szveges rtket. Ha a szveges oszlop belltsra
ezt a fggvnyt hasznljuk, az ikonmez o a szveg megjelentsekor
a Pango jell onyelvet is rtelmezni fogja a szvegben.
A fggvny els o paramtere az ikonmez ot jelli a memriban, a
msodik paramtere pedig megadja, hogy a hozz tartoz raktr
melyik oszlopa tartalmazza a megjelentend o adatok Pango jell o-
nyelvet is tartalmaz o szveges rtkt.
gint gtk_icon_view_get_markup_column(GtkIconView
*
ikonmezo); A fggvny segtsgvel lekrdezhetjk, hogy a
Pango jell onyelvel ksztett szveges rtk szmra melyik oszlop
van belltva.
A fggvny paramtere az ikonmez ot jelli a memriban, a vissza-
trsi rtke pedig a jell onyelvet hasznl oszlop szma, ha azt
mr belltottuk, vagy 1, ha nem.
gtk 2007/10/21 14:22 page 333 #333
333
gint gtk_icon_view_get_pixbuf_column(GtkIconView
*
ikonmezo); A fggvny segtsgvel lekrdezhetjk, hogy az
ikonmez o a hozz tartoz raktr melyik oszlopbl olvassa a meg-
jelentend o adatok kp jelleg u rtkt. Ennek az oszlopnak a bel-
ltsra a mr bemutatott gtk_icon_view_set_pixbuf_column()
fggvnyt hasznlhatjuk.
A fggvny paramtere az ikonmez ot jelli a memriban, a vissza-
trsi rtke pedig megadja az ikonokat tartalmaz oszlop szmt.
Ha az ikonokat trol oszlop szmt mg nem lltottuk be, a vissza-
trsi rtk 1 lesz.
void gtk_icon_view_set_orientation(GtkIconView
*
ikonmezo,
GtkOrientation irny); A fggvny segtsgvel bellthatjuk,
hogy az ikonmez o a szveges rtket az ikonok alatt, vagy az ikonok
mellett jelentse-e meg.
A fggvny els o paramtere az ikonmez ot jelli a memriban, a
msodik paramtere pedig a megjelents mdjt hatrozza meg. E
msodik paramter a kvetkez o llandk egyike lehet:
GTK_ORIENTATION_HORIZONTAL A szveges rtk az ikonok mellett
jelenik meg.
GTK_ORIENTATION_VERTICAL A szveges rtk az ikonok alatt jele-
nik meg. Ez a bellts az alaprtelmezett megjelentsi md.
GtkOrientation gtk_icon_view_get_orientation(GtkIconView
*
ikonmezo); A fggvny segtsgvel lekrdezhetjk a megjelents
mdjt.
A fggvny paramtere az ikonmez ot jelli a memriban, a vissza-
trsi rke pedig az el oz o fggvnynl bemutatott llandk egyike,
amelyek megadjk, hogy a cmkk az ikonok mellett, vagy alatt je-
lennek meg.
void gtk_icon_view_set_spacing(GtkIconView
*
ikonmezo,
gint tvolsg); A fggvny segtsgvel bellthatjuk, hogy hny
kppontnyi res hely jelenjen meg az ikonok s a szveges rtkek
kzt a kperny on.
A fggvny els o paramtere az ikonmez ot jelli a memriban, a
msodik paramtere pedig megadja az ikonok s a szveges rtkek
kzt kihagyand res hely mrett.
void gtk_icon_view_set_row_spacing(GtkIconView
*
ikonmezo,
gint tvolsg); A fggvny segtsgvel bellthatjuk az ikon-
mez oben megjelen o sorok kzt kihagyand res hely mrett
kppontban mrve.
gtk 2007/10/21 14:22 page 334 #334
334
A fggvny els o paramtere az ikonmez ot jelli a memriban, a
msodik paramtere pedig a sorok kzti tvolsg mrett adja meg.
void gtk_icon_view_set_column_spacing(GtkIconView
*
ikonmezo, gint tvolsg); A fggvny segtsgvel bel-
lthatjuk, hogy az ikonmez o oszlopai kzt hny kppontnyi res
terlet jelenjen meg.
A fggvny els o paramtere az ikonmez ot jelli a memriban, a
msodik paramtere pedig az egyes oszlopok kzt kihagyand res
hely mrett hatrozza meg.
void gtk_icon_view_set_margin(GtkIconView
*
ikonmezo, gint
marg); A fggvny segtsgvel megadhatjuk, hogy az ikonmez on
bell, a szleken mekkora marg jelenjen meg. Az ikonmez o szlein
a marg minden irnyban alul fell, valamint jobb- s bal oldalon
azonos mret u marg jelenik meg.
A fggvny els o paramtere az ikonmez ot jelli a memriban, m-
sodik paramtere pedig a marg mrett adja meg.
void gtk_icon_view_set_reorderable(GtkIconView
*
ikonmezo,
gboolean trendezheto); A fggvny segtsgvel megadhatjuk,
hogy az ikonmez oben megjelen o ikonok sorrendjt a felhasznl az
egrrel trendezheti-e.
A fggvny els o paramtere az ikonmez ot jelli a memriban, m-
sodik paramtere pedig egy logikai rtk, ami meghatrozza, hogy a
felhasznl trendezheti-e az ikonok sorrendjt.
Az ikonmez oben a fa kperny oelemhez hasonlkppen a belltsok-
tl fgg oen egy vagy tbb elem lehet kijellve, s ot a fa kperny oelemhez
hasonlan kezelhetjk a kijellt elemet vagy elemeket. A legfontosabb
fggvnyek a kvetkez ok.
void gtk_icon_view_set_selection_mode(GtkIconView
*
ikonmezo, GtkSelectionMode md); A fggvny segtsg-
vel bellthatjuk, hogy az ikonmez oben egyszerre hny elem lehet
kijellve.
A fggvny els o paramtere az ikonmez ot jelli a memriban, a
msodik paramtere pedig a kijells mdjt hatrozza meg. Mso-
dik paramterknt a fa kperny oelemnl mr megismert llandkat
hasznlhatjuk:
GTK_SELECTION_NONE Az ikonmez oben egyetlen elem sem lehet ki-
jellve.
gtk 2007/10/21 14:22 page 335 #335
335
GTK_SELECTION_SINGLE Ebben az zemmdban a felhasznl leg-
feljebb egy elemet jellhet ki, de a kijellst teljesen meg is
szntetheti.
GTK_SELECTION_BROWSE Ebben az zemmdban a felhasznl
pontosan egy elemet jellhet ki, a kijellst azonban nem szn-
tetheti meg csak egy j elem kijellsvel, hogy mindig legyen
kijellt elem. A kijellsi mdok kzl ez az alaprtelmezett vi-
selkeds.
Amikor viszont az ikonmez o megjelenik a kperny on, alaprtel-
mezs szerint nincs egyetlen kijellt elem sem. A programoz-
nak magnak kell arrl gondoskodnia, hogy az ikonmez o lt-
rehozsakor kijelljn egy kperny oelemet, ha azt akarja, hogy
mindig legyen kijellt elem.
GTK_SELECTION_MULTIPLE Ebben az zemmdban egyszerre tbb
elem is ki lehet jellve.
GtkSelectionMode gtk_icon_view_get_selection_mode(GtkIconView
*
ikonmezo); A fggvny segtsgvel lekrdezhetjk az ikonmez o
kijellsi mdjt.
A fggvny paramtere az ikonmez ot jelli a memriban, a vissza-
trsi rtke pedig az el oz o fggvnynl bemutatott llandk egyike,
ami megadja az ikonmez o kijellsi mdjt.
void gtk_icon_view_selected_foreach(GtkIconView
*
ikonmezo, GtkIconViewForeachFunc fggvny, gpointer
adatok); A fggvny segtsgvel bejrhatjuk az ikonmez oben
kijellt elemeket s minden kijellt elemre meghvhatunk egy
fggvnyt.
A fggvny els o paramtere az ikonmez ot jelli a memriban. A
msodik paramter a kijellt elemekkel meghvand fggvny cme,
a harmadik paramter pedig a fggvnynek tadand kiegszt o in-
formcikat jelli a memriban.
void fggvny(GtkIconView
*
ikonmezo, GtkTreePath
*
svny,
gpointer adatok); Ilyen tpus fggvnyt tudunk meghvni az
ikonmez o kijellt elemeire.
A fggvny els o paramtere az ikonmez ot jelli a memriban. A
fggvny msodik paramtere egy svnyt hatroz meg. Az svny
a kijellt elemek kzl a soron kvetkez ot jelli az ikonmez ohz tar-
toz raktrban.
A fggvny harmadik paramtere a kiegszt o adatokat jelli a
memriban, amelyeket a gtk_icon_view_selected_foreach()
fggvny utols paramtereknt megadtunk.
gtk 2007/10/21 14:22 page 336 #336
336
gboolean gtk_icon_view_path_is_selected(GtkIconView
*
ikonmezo, GtkTreePath
*
svny); A fggvny segtsgve
lekrdezhetjk, hogy az ikonmez ohz tartoz raktr adott sora az
adott pillanatban ki van-e jellve.
A fggvny els o paramtere az ikonmez ot jelli a memriban, a
msodik paramtere pedig az svnyt, ami a vizsgland sort jelli
a raktrban. A fggvny visszatrsi rtke TRUE, ha a sor ki van
jellve, illetve FALSE, ha nincs.
GList
*
gtk_icon_view_get_selected_items(GtkIconView
*
ikonmezo); E fggvny segtsgvel egy lpsben krdezhet-
jk le az ikonmez oben kijellt sszes elem svnyt.
A fggvny paramtere az ikonmez ot jelli a memriban. A vissza-
trsi rtk a fggvny ltal ltrehozott listt jelli a memriban.
A lista minden eleme egy mutatt hordo, ami a raktr egy kijellt
sort jell o svny mutatja. Hasznlat utn a lista elemeiknt ka-
pott svnyeket meg kell semmistennk a gtk_tree_path_free()
fggvnnyel s a lista trolsra hasznlt memriaterletet is fel
kell szabadtanunk a g_list_free() fggvnnyel.
Az ikonmez oben a programunk segtsgvel az egyes elemek kijellst
megvltoztathatjuk. Erre a kvetkez o fggvnyeket hasznlhatjuk.
void gtk_icon_view_select_path(GtkIconView
*
ikonmezo,
GtkTreePath
*
svny); A fggvny segtsgvel az ikonmez oben
az ikonmez ohz tartoz raktr adott sort kijellhetjk.
A fggvny els o paramtere az ikonmez ot, msodik paramtere pe-
dig a kijellend o sort azonost svnyt jelli a memriban.
void gtk_icon_view_unselect_path(GtkIconView
*
ikonmezo,
GtkTreePath
*
svny); A fggvny segtsgvel az ikonmez o-
ben az ikonmez ohz tartoz raktr megadott sornak kijellst
megszntethetjk.
A fggvny els o paramtere az ikonmez ot, a msodik paramtere
pedig az ikonmez ohz tartoz raktr egy sort kijell o svnyt jelli
a memriban.
void gtk_icon_view_select_all(GtkIconView
*
ikonmezo); A
fggvny segtsgvel az ikonmez o sszes elemt egy lpsben
kijellhetjk.
A fggvny paramtere az ikonmez ot jelli a memriban, amiben
az sszes elemet ki akarjuk jellni.
gtk 2007/10/21 14:22 page 337 #337
337
void gtk_icon_view_unselect_all(GtkIconView
*
ikonmezo); A
fggvny segtsgvel az ikonmez oben tallhat sszes elem kije-
llst megszntethetjk.
A fggvny paramtere az ikonmez ot jelli a memriban.
A fa kperny oelemhez hasonlan az ikonmez oben is rtelmezhetjk a
kurzor fogalmt. A kurzor az ikonmez o egy elemt azonostja, az aktv
elemet, amelyet a felhasznl az Enter billenty u lenyomsval szerkeszt-
het, ha az ikonmez o szerkeszthet o. (A szerkeszthet o ikonmez o kszt-
sre a 8.8.1. szakaszban visszatrnk.) Az ikonmez o aktv elemt kijell o
kurzort a kvetkez o fggvnyekkel kezelhetjk:
void gtk_icon_view_set_cursor(GtkIconView
*
ikonmezo,
GtkTreePath
*
svny, GtkCellRenderer
*
cellarajzol,
gboolean szerkeszt); E fggvny segtsgvel bellthatjuk az
ikonmez ohz tartoz kurzort.
A fggvny els o paramtere az ikonmez ot jelli a memriban. A
msodik paramter az ikonmez oben tallhat valamelyik cellaranj-
zolt jelli vagy NULL. Ha magunk hoztuk ltre az ikonmez o cella-
ranjzolit, hogy szerkeszthet ov tegyk oket, akkor ltalban meg-
adjuk a cellarajzol cmt, ha pedig az eddig bemutatott egyszer ubb
eszkzkkel kezeljk az ikonmez ot, ltalban egyszer uen NULL r-
tket adunk meg a msodik paramter helyn.
A fggvny harmadik paramtervel meghatrozhatjuk, hogy
a kurzr thelyezse utn a cellarajzolban automatikusan
megkezd odjn-e a szerkeszts. Ha ennek a paramternek az rtke
igaz, a cellarajzol automatikusan szerkeszt o zemmdba kapcsol.
gboolean gtk_icon_view_get_cursor(GtkIconView
*
ikonmezo,
GtkTreePath
**
svny, GtkCellRenderer
**
cellarajzol);
A fggvny segtsgvel lekrdezhetjk az ikonmez o kurzornak
helyt.
A fggvny els o paramtere az ikonmez ot jelli a memriban. A
msodik paramtere azt a memriaterletet jelli, ahov a fggvny
a kurzor helyt jell o svny cmt elhelyezi. E paramter rtke
lehet NULL is, ekkor a fggvny nem adja vissza a kurzor helyt
jell o svnyt.
A fggvny harmadik paramtere azt a memriaterletet jelli,
ahova a fggvny az aktv cellarajzol cmt elhelyezi. E param-
ter rtke is lehet NULL.
A fggvny visszatrsi rtke jelzi, hogy a kurzor rvnyes-e, azaz
volt-e aktv elem az ikonmez oben.
gtk 2007/10/21 14:22 page 338 #338
338
8.8.1. Az ikonmez o cellarajzoli
Az ikonmez o kezelsre hasznlt GtkIconView tpus megvalstja a
GtkCellLayout interfszt s gy cellaelredezsknt hasznlva cellaraj-
zolk fogadsra is alkalmas. Ha az ikonmez oben tallhat adatok szer-
kesztst is lehet ov akarjuk tenni a felhasznl szmra, a legegysze-
r ubb, ha a cellarajzolkat magunk ksztjk el s magunk helyezzk el
az ikonmez oben.
8.8.2. Az ikonmez o jelzsei
Az ikonmez o hasznlatban a fa kperny oelemhez hasonlan fontos sze-
repet jtszanak a jelzsek. Az ikonmez o ltal kldtt legfontosabb jelz-
seket a kvetkez o lista mutatja be.
"button-press-event" A GTK programknyvtr akkor kldi ezt a jel-
zst, ha a felhasznl lenyomja (vagy felengedi) az egr valamelyik
nyomgombjt az ikonmez o terletn bell. Ezt a jelzst minden
kperny oelemnl hasznlhatjuk, de az ikonmez o esetben klnle-
ges jelent osge van, mert az ikonmez on ltalban olyan felbukkan
ment jelentnk meg, ami arra az elemre vonatkozik, amelyen az
egr gombjt a felhasznl lenyomta.
Az esemny kezelsre hasznlt fggvnyek kzl a legfontosabbak
a kvetkez ok.
gboolean fggvny(GtkWidget
*
kpernyoelem,
GdkEventButton
*
esemny, gpointer adatok); Ilyen
fggvnyt kell visszahvott fggvnyknt az esemnyhez
rendelnnk. A fggvny m ukdst, a paramterek s a
visszatrsi rtk jelentst a 322. oldalon mr bemutattuk.
GtkTreePath
*
gtk_icon_view_get_path_at_pos(GtkIconView
*
ikonmezo, gint x, gint y); Ennek a fggvnynek a se-
gtsgvel megllapthatjuk, hogy a felhasznl az ikonmez o
melyik elemre kattintott.
A fggvny els o paramtere az ikonmez ot jelli a memriban,
msodik s harmadik parammtere pedig megadja, hogy az
ikonmez o melyik pontjt akarjuk lekrdezni.
A fggvny visszatrsi rtke egy svnyt jell a memriban,
amely a megadott ponthoz tartoz elemet jelli az ikonmez ohz
tartoz raktrban. Ha a megadott koordintkon nem tallhat
elem, a fggvny NULL rtket ad vissza.
gboolean gtk_icon_view_get_item_at_pos(GtkIconView
*
ikonmezo, gint x, gint y, GtkTreePath
**
svny,
gtk 2007/10/21 14:22 page 339 #339
339
GtkCellRenderer
**
cellarajzol); Ennek a fggvny-
nek a segtsgvel szintn lekrdezhetjk az ikonmez o adott
koordintjhoz tartoz elemet, ez a fggvny azonban tbb
informcit is kpes szolgltatni.
A fggvny els o paramtere az ikonmez ot jelli a memriban,
msodik s harmadik paramtere pedig megadja a lekrde-
zend o koordintkat.
A fggvny negyedik paramtere azt a memriaterletet jelli,
ahov a fggvny a keresett elemet jell o svny cmt elhe-
lyezi. Ha erre az informcira nincs szksgnk a negyedik
paramter helyn NULL rtket is megadhatunk.
A fggvny tdik paramtere azt a memriaterletet adja meg,
ahov a fggvny a kperny o megadott helyn megjelen o cella-
rajzol cmt elhelyezi. Az tdik paramter helyn is megad-
hat NULL rtk, ha nincs szksgnk a cellarajzol cmre.
A fggvny visszatrsi rtke megadja, hogy az ikonmez o meg-
adott helyn volt-e cellarajzol.
"item-activated" Ezt az zenetet akkor kldi az ikonmez o, ha a fel-
hasznl valamelyik ikont dupla kattintssal kivlasztja. A legtbb
ikonmez o esetben ezt az zenetet is fogadnunk kell.
A jelzssel kapcsolatban hasznlhat6 fggvnyek a kvetkez ok.
void fggvny(GtkIconView
*
ikonmezo, GtkTreePath
*
svny, gpointer adatok); Ilyen tpus fggvnyt kell
ksztennk az esemny kezelsre.
A fggvny els o paramtere az ikonmez ot, a msodik param-
tere az aktivlt elemet jelz o svny helyt jelzi a memriban. A
fggvny harmadik paramtere a kiegszt o adatok cmt adja
meg. Ezt a mutatt a visszahvott fggvny nyilvntartsba v-
telekor adhatjuk meg.
void gtk_icon_view_item_activated(GtkIconView
*
ikonmezo, GtkTreePath
*
svny); Ennek a fggvny-
nek a segtsgvel a program aktivlhatja az ikonmez o egy
elemt ppen gy, mintha a felhasznl aktvivlta volna azt.
A fggvny els o paramtere az ikonmez ot, msodik paramtere
pedig az aktivland elemet kijell o svnyt jellli a memri-
ban.
gtk 2007/10/21 14:22 page 340 #340
340
gtk 2007/10/21 14:22 page 341 #341
9. fejezet
Kiegszt o eszkzk
A kvetkez o oldalakon az alkalmazsfejlszts nhny fontosabb lpst
s eszkzt ismerhetjk meg rszletesebben. Ezeknek az ismereteknek
a birtokban knnyyebb, grdlkenyebb tehetjk a munknkat az
elksztett alkalmazs min osgt pedig javthatjuk.
9.1. A forrsprogram terjesztse
A forrsprogramot mindig a szablyos mdon elksztett tmrtett llo-
mnyban kell publiklnunk, hogy a program fordts el otti belltsa s
fordtsa problmamentes legyen. Soha ne terjeszzk az ltalunk ksz-
tett alkalmazs forrsprogramjt olyan tmrtett llomnyban, amelyet
a tar program indtsval kzzel lltottunk el o!
A forrsprogram terjesztsre alkalmas llomny el olltsra a alkal-
mazs forrsnak knyvtrban tallhat Makefile llomny hasznl-
hat. A terjesztsi llomny ltrehozsra hasznlatos parancsokat teht
abban a knyvtrban kell kiadnunk, amelyikben a configure.in s a
autogen.sh llomny is tallhat.
Miel ott a forrsprogram terjesztsre alkalmas llomny el olltannk,
rdemes futtatnunk a make distcheck parancsot. A parancs hatsra
sszetett folyamat kezd odik, amelynek sorn kiderl hogy a ltrehozand
terjesztsi llomny hasznlhat lesz-e.
Az ellen orzs utn a make dist parancs hatsra a terjesztsi llo-
mny automatikusan ltrejn.
341
gtk 2007/10/21 14:22 page 342 #342
342
9.2. A programvltozatok kvetse
Az alkalmazs fejlesztse sorn az egyes vltozatokat szmmal (vers-
ion number, vltozat szma) ltjuk el. A Glade kezdetben a 0.1 vlto-
zatszmmal ltja el a programot s ezt a vltozatszmot el is helyezi a
configure.in llomnyban.
Ha nvelni akarjuk a vltozatszmot, egyszer uen csak t kell rnunk
azt a configure.in llomnyban, majd le kell futtatnunk az autogen.h
hjprogramot a ./autogen.sh parancs kiadsval. Ezzel a program vl-
tozatszma megvltozik a kvetkez okben ltrehozott terjesztsi llomny
mr az j vltozatszmot tartalmazza.
9.2.1. Klnbsgi llomnyok
Az alkalmazsok fejlesztst ma mr a legtbb esetben nem egy progra-
moz, hanem programozk egsz csoportja vgzi, ezrt fontos, hogy prog-
ramozk kzti kapcsolattarts minl zkken omentesebb legyen. Az egyes
programfejleszt ok ltal vgzett rszfeladatok sztosztsnak, a program-
mdostsok sszegy ujtsnek s nyilvntartsnak segtsre sok fejlett
program kszlt, a legtbbjk azonban tlsgosan bonyolultak ahhoz,
hogy nhny szban bemutassuk. Nhny szban bemutatjuk viszont a
diff s patch UNIX segdprogramokat, amelyek olyan egyszer uen hasz-
nlhatk a program vltozsainak gyelemmel kvetsre, hogy nhny
perc alatt elsajtthatjuk a hasznlatukat.
A diff program segtsgvel kt llomny vagy knyvtr klnbsgi
llomnyt llthatjuk el o. A klnbsgi llomnyban egy helyen olvas-
hatjuk a programoz ltal vgzett klnfle vltoztatsokat, s ot azokat
rvnyesthetjk azaz az eredeti programvltozatba a vltoztatsokat
bevezethetjk, hogy az j programvltozatot el olltsuk. A szabad szoft-
vereket fejleszt o kzssgben bevett szokss vlt a klnbsgi llom-
nyok elektronikus levlben val tovbbtsa, ha szabad szoftverek fej-
lesztsre adjuk a fejnket szinte biztos, hogy a megfelel o formj k-
lnbsgi llomnyt vrja t olnk a fejlesztst koordinl programoz.
A diff programnak paramterknt a kt sszehasonltand llomnyt
vagy knyvtrat kell tadnunk, el oszr mindig az eredetit, majd a mdo-
stottat. Ha a vltoztats kizrlag egy llomnyt rint, elegend o annak
a klnbsgi llomnyt megadni, ha azonban tbb llomnyt is mdo-
stottunk, akkor a teljes knyvtrszerkezetet ssze kell hasonltanunk.
A klnbsgi llomny elksztsekor ismernnk kell a diff program
kvetkez o kapcsolit:
-u Ennek a kapcsolnak a hatsra a diff egysgestett klnbsgi
llomny formtumot (unied diff format) hasznl, amit a legtbb
programoz megszokott s knnyen tud olvasni.
gtk 2007/10/21 14:22 page 343 #343
343
Fontos, hogy a klnbsgi llomnyt olyan formtumban kldjk
a tbbi fejleszt onek, ami szmukra megszokott, ellenkez o esetben
valszn uleg egyszer uen gyelmen kvl hagyjk a levelnket, eset-
leg az jrakldst krik. rdemes teht ellen oriznnk az alkalma-
zs dokumentcijban a megkvetelt klnbsgi llomny form-
tumat. Ha a dokumentci nem tr ki a klnbsgi llomny for-
mtumra, mindenkppen hasznljuk a -u kapcsolt.
-p E kapcsol hatsra a diff a klnbsgi llomnyban minden vl-
toztats mellett feltnteti azt is, hogy az melyik C fggvnyben ta-
llhat. Ezt a kapcsolt szintn rdemes hasznlnunk, hiszen nagy-
mrtkben megknnyti a vltoztatsok nyomon kvetst.
-r Ennek a kapcsolnak a hatsra a diff a vltoztatsok keresst
minden alknyvtrban elvgzi. Ha tbb llomnyt is mdostottunk
s a klnbsgi llomnyt kt knyvtr sszehasonltsval kszt-
jk el, ezt a kapcsolt mindenkppen hasznlnunk kell.
-N Ennek a kapcsolnak a hatsra a nem ltez o llomnyokat a diff
gy kezeli, mintha lteznnek, de egyetlen sort sem tartalmazn-
nak. E kapcsolnak nyilvnvalan akkor van szerepe, ha a program
forrsban nem csak a meglv o llomnyokat mdostottuk, hanem
j llomnyokat is ltrehoztunk. Ekkor mindenkppen meg kell ad-
nunk a -N kapcsolt, de mivel akkor sem okoz problmt, ha nem
hoztunk ltre j llomnyt, ltalban mindig hasznljuk.
-X E kapcsol utn megadhatjuk annak az llomnynak a nevt, ami
a klnbsgi llomny elksztsekor gyelmen kihagyand llom-
nyok neveit adja meg. Ez igen fontos kapcsol, hiszen a legtbb
programcsomag rengeteg olyan llomnyt tartalmaz, amelyek a for-
dtskor automatikusan jnnek ltre s ezrt a klnbsgk nem
lnyeges.
Ha egyszer uen sszehasonltjuk az eredeti s a mdostott program
forrsprogramjt tartalmaz knyvtrat ltalban tbb ezer, vagy
akr tbb tzezer sornyi klnbsgi llomnyt kapunk. Az ilyen k-
lnbsgi llomny publiklsa termszetesen hallos vtek volna,
ezrt a legtbb esetben szksgnk lesz egy, a kihagyand llom-
nyokat felsorol llomnyra.
Ha a fejleszt ok nem biztostottak ilyen llomnyt, mi is knyedn el-
kszthetjk. Egyszer uen t kell olvasnunk a klnbsgi llomnyt,
ki kell vlogatnunk azoknak az llomnyoknak a nevt, amelyeket
ki akarunk hagyni s fel kell sorolnunk a nevket az llomnyban.
-B Ennek a kapcsolnak a hatsra a program gyelmen kvl hagyja
azokat a vltoztatsokat, amelyek csak res sorok beszrsra s
gtk 2007/10/21 14:22 page 344 #344
344
trlsre vonatkoznak. Nem kell mindig hasznlnunk ezt a kapcso-
lt, de rdemes tudnunk rla, hogy van ilyen lehet osgnk, mer
nha szksgnk lehet r..
-b Ennek a fggvnynek a hatsra a diff gyelmen kvl hagyja azo-
kat a mdostsokat, amelyek csak a szkzk s tabultor karak-
terek szmban hoztak vltozst. Szintn nem szksges mindig
hasznlnunk a -b kapcsolt, de rdemes tudnunk rla.
A kvetkez o plda bemutatja hogyan hasznlhatjuk a diff programot
egy programcsomag mdostsainak kikeressre.
61. plda. A kvetkez o parancs a diff program segtsgvel sszeha-
sonltja az eredeti llomnyokat tartalmaz ak-0.1 knyvtrat a mdo-
stott llomnyok ak-0.1-hacked nev u knyvtrval, mikzben kihagyja
a dontdiff llomnyban felsorolt nev u llomnyokat.
diff -uprbN -X ak-0.1/dontdiff ak-0.1 ak-0.1-hacked/ >ak.diff
A dontdiff llomny tartalma a kvetkez o volt:
1
*
.tar.gz
2
*
.o
3
*
.log
4 .
*
swp
5 ak
Amint lthatjuk a gyelmen kvl hagyand llomnyok felsorolsakor
hasznlhatjuk az llomnynv helyettest okaraktereket, ami nyilvnva-
lan nagyon megknnyti a munknkat.
A klnbsgi llomny rvnyestsre a patch programot hasznlhat-
juk. A patch alaprtelmezs szerint a szabvnyos bemenetr ol alvassa be
a klnbsgi llomnyt, amelyben megtallja, hogy az egyes llomnyo-
kon milyen mdostsokat kell elvgeznie. A progrm ezek utn egyen-
knt ellen orzi, hogy a vltoztatsok krnyezete megegyezik-e az eredeti
llomnyban tallhat sorokkal s ha igen, akkor vgrehajtja a vltoz-
tatsokat. Ha a patch nem tudja rvnyesteni a vltoztatsokat, mert
azok elvgzse ta az eredeti llomny adott rsze megvltozott, akkor a
nem rvnyestett vltoztatsokat .rej nev u llomnyokba menti.
A vltoztatsok rvnyestse sorn ltalban szksgnk van a diff
kvetkez o kapcsoljra:
-p A kapcsol utn egy szmot kell megadnunk, ami meghatrozza,
hogy az eredeti llomnyok nevb ol a patch hny knyvtrnevet
tvoltson el.
gtk 2007/10/21 14:22 page 345 #345
345
Erre a kapcsolra akkor van szksgnk, ha a klnbsgi llo-
mnyt nem abban a knyvtrban akarjuk rvnyesteni, amelyik-
ben ksztettk. A legtbb esetben szksg van ennek a kapcsol-
nak a hasznlatra.
A kvetkez o plda bemutatja hogyan rvnyesthetjk a klnbsgi l-
lomnyt a patch program segtsgvel.
62. plda. Az el oz o plda alapjn legyen most az ak.tmp klnbsgi llo-
mny az ak-0.1 knyvtrban. Prbljuk meg rvnyesteni a klnbsgi
llomnyt a patch program segtsgvel (a rvidsg kedvrt a kimeneten
megjelen o sorok kzl nhnyat eltvoltottunk):
$ patch <ak.diff
cant find file to patch at input line 4
Perhaps you should have used the -p or --strip option?
The text leading up to this was:
--------------------------
|diff -uprbN -X ak-0.1/dontdiff ak-0.7/src/automaton.c ak-0.1-
hacked/src/automaton.c
|--- ak-0.1/src/automaton.c 2006-11-27 10:19:42.0000000 00 +01
00
|+++ ak-0.1-hacked/src/automaton.c 2006-11-27 10:54:10.0000000
00 +0100
...
--------------------------
File to patch: Ctrl + c
Amint lthatjuk a program nem tallta meg a mdostand llomnyt,
ezrt a Ctrl + c billenty ukombincival megszaktottuk a futst.
A kperny or ol azt is leolvashatjuk, hogy a patch azrt nem tallta meg
a keresett llomnyt, mert a ak-0.1-hacked/src knyvtrban kereste,
pedig az a src/ knyvtrban van. Nyilvnval, hogy a mdostand l-
lomnyok neveinek elejr ol el kell tvoltanunk egy knyvtrnevet a -p
kapcsol segtsgvel:
$ patch -p 1 <tmp.diff
patching file src/automaton.c
$
Amint lthat gy mr semmi sem akadlyozta a klnbsgi llomny
rvnyestst.
9.3. j forrs-llomnyok
Ha az alkalmazs ltrehozsakor gy dntnk, hogy j forrssllom-
nyokkal b ovtjk azt, az j llomnyokat ltre kell hoznunk, majd nyil-
vntartsba kell vennnk s a fordtst vezrl o llomnyokat is frisste-
nnk kell.
gtk 2007/10/21 14:22 page 346 #346
346
Az j forrsllomnyokat szerencss ugyanabban a knyvtrban lt-
rehozni, amelyikben a mr meglv o forrsprogramokat is troljuk. Ez a
knyvtr amint azt mr lttuk alaprtelmezett esetben az alkalmazs
forrsknyvtrnak src/ alknyvtra.
Ha ltrehoztuk az j forrsllomnyokat, azok neveit az adott knyv-
trban azaz az src/ alknyvtrban tallhat Makefile.am llo-
mnyba be kell rnunk. Ez nem okozhat komoly problmt, hiszen ebben
az llomnyban mr megtallhatk a Glade ltal ltrehozott llomnyok
nevei, gy egyszer uen csak b ovtennk kell a listt.
Utols lpsknt frisstennk kell a fordtst vezrl o llomnyokat az
autogen.sh hjprogram futtatsval.
Ezzel az j forrsllomnnyal kapcsolatos sszes feladatunkat elvgez-
tk, a kvetkez o fordtskor mr az j forrsllomnyok is lefordulnak
s a kvetkez o terjesztsi llomnybl sem fognak hinyozni.
9.3.1. Ikonok elhelyezse a programcsomagban
Amint azt mr lttuk a Glade szerkeszt oprogrammal ikonokat rendel-
hetnk az egyes kperny oelemekhez. A munka kzben a szmtgpre
teleptett ikonok kzl vlogathatunk.
Sokszor el ofordul azonban, hogy a rendszerre teleptett ikonok kzl
egyik sem fejezi ki pontosan az adott eszkz szerept, ezrt sajt ikont
szeretnnk felmsolni a szmtgpre az alkalmazsunk teleptsekor. A
Glade ebben is segt!
A Glade Projekt menjnek Belltsok menpontjnak segtsgvel
a kpek knyvtra mez oben bellthatjuk, hogy a programunk melyik
knyvtrban szeretnnk elhelyezni az ikonokat. Itt alaprtelmezs sze-
rint a pixmaps knyvtrnv szerepel, ami tkletesen meg is felel az ig-
nyeinknek.
Ha teht a programunk forrsknyvtrban ltrehozzuk a pixmaps al-
knyvtrat s ide msoljuk az ikonokat, amelyeket az alkalmazshoz k-
sztettnk, az ikonok felmsolsdnak a megfelel o knyvtrba a telep-
tskor. Ha meggyeljk a teleptskor megjelen o zeneteket, knnyen
nyomonkvethetjk ezt a m uveletet.
63. plda. Keressk ki a teleptskor megjelen o zenetek kzl azokat,
amelyek megmutatjk mi trtnik a pixmaps knyvtrban tallhat llo-
mnyokkal (a pldban a sorok nagy rszt eltvoltottuk, csak a lnye-
ges utastsokat hagytuk meg)!
$ make install
...
if test -d ./pixmaps; then \
/home/pipas/prg/install-sh -d /usr/share/pixmaps/prg; \
for pixmap in ./pixmaps/
*
; do \
gtk 2007/10/21 14:22 page 347 #347
347
if test -f $pixmap; then \
/usr/bin/install -c -m 644 $pixmap /usr/share/pixmaps/prg; \
fi \
done \
fi
...
$
Figyeljk meg, hogy a teleptst vgz o program megvizsglja, hogy
ltezik-e a pixmaps knyvtr, s ha igen, annak tartalmt egy jonan
ltrehozott knyvtrba msolja!
Az ikonok felmsolsa teht egyszer u m uvelet, a Glade ltal ltrehozott
llomnyokban tallhat utastsok elvgzik a munkt. A nehezebb fel-
adat az ikonok megkeresse a program futtatsakor, de ebben is segt a
Glade.
Az alkalmazs forrst alkot llomnyok ltrehozsakor a forrs-
knyvtrban ltrejn egy config.h llomny, amely a program legfon-
tosabb tulajdonsgait tartalmazza. Itt tbbek kzt megtallhatjuk a k-
vetkez o makrk ltrehozst:
PACKAGE A programcsomag neve.
VERSION A programcsomag vltozatnak szma.
A programcsomag fordtsa sorn a Makefile a C fordtnak a -D kap-
csolval utastst ad arra, hogy bizonyos makrkat hozzon ltre, miel ott
a fordtst elkezdi. A ltrehozott makrk kzl a legfontosabbak a kvet-
kez ok:
HAVE_CONFIG_H Ha a makr ltezik, a telepts el otti bellts ltrehozta
a config.h llomnyt.
PACKAGE_DATA_DIR A makr szveges rtke megadja a programunkhoz
tartoz adatknyvtrat, azt a knyvtrat, ahova az adatllomnyok
kerlnek a telepts sorn.
Az ikonllomnyok megkeresse ezek utn egyszer uen elvgezhet o.
Amikor be akarunk tlteni egy kpllomnyt, az itt bemutatott mak-
rk segtsgvel a fordtskor belltott knyvtrra kell hivatkoznunk. Ezt
mutatja be a kvetkez o plda.
64. plda. A kvetkez o sorok a 329. oldalon tallhat 60. pldaprogram
rszletei, bemutatjk hogyan derthetjk ki, hogy a teleptskor hova ke-
rltek a kpllomnyok, amelyek a programunkhoz tartoznak.
1 #ifndef PIXMAP_DIR
2 #define PIXMAP_DIR PACKAGE_DATA_DIR "/pixmaps/" \
gtk 2007/10/21 14:22 page 348 #348
348
3 PACKAGE "/"
4 #endif
5
6 ...
7
8 pixbuf_folder = gdk_pixbuf_new_from_file(
9 PIXMAP_DIR "folder.png", NULL);
A programrszlet 14. sorban ltrehozunk egy makrt, amelynek az r-
tke szveges, megadja a kpllomnyok trolsra hasznlt knyvtr
nevt. Figyeljk meg, hogy a makr kihasznlja, hogy a C programozsi
nyelv jabb vltozatai lehet ov teszik a fordtskor is ismert szveges
llandk egymshoz f uzst (konkatencijt) az egyms utn rs segt-
sgvel!
A makrt a programrszlet 9. sorban hasznljuk. Itt is az egymshoz
f uzs mdszert hasznljuk, amely egyesti a knyvtrnevet az llomny-
nvvel.
9.4. Tbbnyelv u programok ksztse
A magyar anyanyelv u felhasznlknak nagyon fontos lehet, hogy a fel-
hasznli fellet magyarul jelenjen meg, hiszen e nlkl sokan nem is
tudjk hasznlni a programunkat. A Glade hasznlata kzben a magyar
nyelv u felhasznli fellet elksztsre kt mdon is lehet osgnk van.
Az egyszer ubb mdszert kvetve a feliratokat, szvegeket magyar rjuk
a felhasznli felletbe, gy az elkszlt program kizrlag magyar ze-
neteket lesz kpes hasznlni. A knyv legtbb pldja ezzel a mdszerrel
kszlt, hogy a knyvbe braknt beillesztett kperny okpek magyar fel-
iratokkal jelenjenek meg mr a felhasznli fellet szerkesztse kzben
is. Valjban ez a mdszer igen szerencstlen mdon csak a magyarul
tud felhasznlk szmra teszi elrhet ov az elkszlt programot, ezrt
nem igazn javasolhat a hasznlata.
A magyar nyelv u felhasznli fellet ltrehozsra tkletes megoldst
a tbbnyelv u felhasznli fellet ltrehozsa (internationalization, i18n) a
GNU programok ltalban a gettext() eszkzcsaldot hasznljk. Erre
az eszkztrra pthetjk Glade segtsgvel ksztett programokat is.
A mdszer lnyege, hogy a felhasznli felletet angol nyelv u zenetek-
kel ltjuk el, az zeneteket kigy ujtjk a forrsllomnyokbl s lefordt-
juk magyarra, majd a telepts sorn a fordtst is teleptjk a szmt-
gpre. A felhasznl a LANG vagy LC_ALL krnyezeti vltoz belltsval
rhatja el o, hogy milyen nyelven kvnja a felhasznli felletet megjele-
nteni.
gtk 2007/10/21 14:22 page 349 #349
349
65. plda. Elksztettk a cyclops nev u programot, felksztettk az
angol s a magyar nyelv tmogatsra. Szeretnnk gy elindtani, hogy
magyarul jelenjen meg a felhasznli fellet. Hasznljuk a kvetkez o pa-
rancsot:
$ LANG=hu_HU.UTF-8 cyclops
$
A parancs futtatja a programot a LANG krnyezeti vltoz megfelel o bel-
ltsval.
Fontos, hogy ha tbbnyelv u tmogatssal ksztjk el a felhasznli
felletet, a Glade hasznlata kzben ragaszkodjunk az angol nyelv u sz-
vegek begpelshez. Ha magyar feliratokkal ltjuk el a felhasznli fel-
letet a program fordtsval s teleptsvel problmink lesznek.
A programok tbb nyelv u felhasznli fellettel val elltst tbb l-
psben, pldkon keresztl mutatjuk be.
Az els o lps a Glade megfelel o belltsa. Ehhez meg kell nyitnunk
a projektet, majd ki kell vlasztanunk a projekt men belltsok men-
pontjt. Az itt megjelen o prbeszdablak fels o rszn ki kell vlasztanunk
a C belltsok flet, hogy bekapcsolhassuk a gettext tmogats cm-
kvel elltott jell ongyzetet. Ez a jell ongyzet bekapcsolja a gettext
rendszert, amelyet a legtbb szabad szoftver hasznl a tbbnyelv u fel-
hasznli felletek el olltsra. Ha e belltst elvgeztk, a projektet
mentennk kell s az llomnyokat ltre kell hoznunk. Ha azonban a
tbbnyelv u tmogatst az utn hozzuk ltre, hogy a projektet mr ltre-
hoztuk, a Glade nem rja fell a configure.in llomnyt az j bellt-
sokkal. Ekkor pldul trlhetjk az llomnyt s jra ltrehozhatjuk a
projektllomnyokat, hogy a frissts megtrtnjen.
Ha a gettext tmogatst bekapcsoltuk a Glade segtsgvel szerkesz-
tett felhasznli fellet elemeit angol nyelven kell megrnunk, a fordtst
ks obb, ms eszkzkkel fogjuk elvgezni.
A kvetkez o lps a magyar nyelv tmogatsnak bekapcsolsa lesz.
A tmogatott nyelvek a tulajdonkppeni fordtsok listjt a
configure.in llomnyban a ALL_LINGUAS vltozban talljuk, itt kell
elhelyeznnk a magyar nyelv szabvnyos jellst, ami a hu rvidts.
Ezt a lpst mutatja be a kvetkez o plda.
66. plda. Keressk ki a tmogatott nyelvek listjt s helyezzk el a
magyar nyelvet benne! A Glade belltsval krtk a gettext tmogats
bekapcsolst, a projektet mentettk s az llomnyokat ltrehoztuk.
Vizsgljuk meg a configure.in llomnyt.
1 dnl Add the languages which your application supports
2 dnl here.
gtk 2007/10/21 14:22 page 350 #350
350
3 ALL_LINGUAS=""
4 AM_GLIB_GNU_GETTEXT
1 dnl Add the languages which your application supports
2 dnl here.
3 ALL_LINGUAS="hu"
4 AM_GLIB_GNU_GETTEXT
gtk 2007/10/21 14:22 page 351 #351
Irodalomjegyzk
[1] Pere Lszl. Linux: felhasznli ismeretek II. Kiskapu, Budapest,
2002.
[2] Tim-Philipp Mller. Gtk+ 2.0 tree view tutorial.
351
gtk 2007/10/21 14:22 page 352 #352
Trgymutat
, 151, 177
/, 76
\, 76
( ), 177
(
*
GFunc)(), 106
(
*
GOptionArgFunc)(), 119
(
*
GtkTreeModelForeachFunc)(),
262
*
, 171, 177
+, 177
-, 151, 177
., 151
.., 171
..., 185, 189
./autogen.sh, 13, 14, 342
./configure, 14
/, 150, 151, 170, 171, 177
<, 151
< >, 150
<? ?>, 150
<paragraph></paragraph>, 151
=, 151
>, 151
[], 171, 172
#ifdef, 75
#ifndef, 75
#include, 129
svny, 262, 323
rtk1, 232
_, 151
_PipObjectPrivate, 147
_private, 160
0.1, 342
1.0, 150
ablak, 185, 190
ABS(a), 76
AC_SUBST(), 152
activate, 44
adat, 114
adat, 112, 224, 262
adatfelszabadt, 112
ALL_LINGUAS, 349
arg, 118, 119
arg_data, 119
arg_description, 120
argc, 120, 128
argv, 120
autoconf, 14, 21, 153
autogen.h, 342
autogen.sh, 153, 346
automake, 14, 21, 153
backspace, 44
balra, 227
be, 51
bejr, 212, 224, 225, 227, 262
blue, 195
BonoboDock, 206
BonoboDockItem, 206, 207
boolval, 176
button_press_event, 58, 59
cmsor, 188
cella_x, 323
cella_y, 323
cetlinv, 232
changed, 45
changed, 47, 248
char, 74
352
gtk 2007/10/21 14:22 page 353 #353
353
children, 155
children, 160
children, 110, 162
CLAMP(x, alacsony, magas), 76
class, 139
clicked, 18, 40, 204
colorsel, 195, 196
configure, 152, 153
const void
*
, 74
const xmlChar
*
name, 164
content, 162
create_window1(), 180
create_window2(), 180
create_xxx(), 57, 180
data, 50
description, 120
dev, 23
devhelp, 9, 36
dictionary, 50
diff, 342344
dispose(), 140, 141
disposed, 134, 141
doc, 162
double, 75
edited, 276
elso_gomb, 188
elso_vlasz, 189
encoding, 150
enter, 40
enum, 143
exit(), 20
fggvny(), 291, 322, 323, 335,
338, 339
fggvny, 113
fggvny, 112, 224
fggvnynv(), 291
fa, 113
fa, 323
FALSE, 42, 51, 58, 70, 73, 76, 93,
101, 114, 121, 124, 189,
205, 218, 220, 221, 227,
230, 231, 237, 244, 254
258, 262, 283, 288, 302,
322, 336
fflush(), 77
finalize(), 140, 141
flags, 118
float, 75
floatval, 176
formzszveg, 185
fprintf(), 83, 183
free(), 80, 157
g_assert(), 77
g_assert(kifejezs), 76
g_assert_not_reached(), 77
g_build_filename(), 115
g_build_path(), 115
g_critical(formtumszveg,
...), 78
G_DIR_SEPARATOR, 76
G_DIR_SEPARATOR_S, 76, 115
G_DISABLE_ASSERT, 77
g_error(), 127
g_find_program_in_path(), 115
g_fprintf(), 83
g_free(), 80, 81, 83, 190, 291
g_getenv(), 116, 117
G_IS_DIR_SEPARATOR(c), 76
g_list_append(), 102, 109
g_list_concat(), 105
g_list_delete_link(), 104
g_list_find(), 107
g_list_find_custom(), 107
g_list_first(), 106
g_list_foreach(), 105, 106
g_list_free(), 104, 313, 319,
321, 336
g_list_index(), 107
g_list_insert(), 103
g_list_insert_before(), 103
g_list_insert_sorted(), 103,
105, 107
g_list_last(), 106
g_list_length(), 105
gtk 2007/10/21 14:22 page 354 #354
354
g_list_next(), 106
g_list_nth(), 106
g_list_nth_data(), 106
g_list_position(), 107
g_list_prepend(), 102
g_list_previous(), 106
g_list_remove(), 104
g_list_remove_all(), 104
g_list_reverse(), 105
g_list_sort(), 105
g_malloc(), 7981
g_malloc0(), 80
G_MAXDOUBLE, 75
G_MAXFLOAT, 75
G_MAXINT, 75
G_MAXINT16, 75
G_MAXINT32, 75
G_MAXINT64, 75
G_MAXINT8, 75
G_MAXLONG, 75
G_MAXSHORT, 75
G_MAXSIZE, 75
G_MAXUINT, 75
G_MAXUINT16, 75
G_MAXUINT32, 75
G_MAXUINT64, 75
G_MAXUINT8, 75
G_MAXULONG, 75
G_MAXUSHORT, 75
g_message(), 78
g_message(formtumszveg,
...), 77
G_MINDOUBLE, 75
G_MINFLOAT, 75
G_MININT, 75
G_MININT16, 75
G_MININT32, 75
G_MININT64, 75
G_MININT8, 75
G_MINLONG, 75
G_MINSHORT, 75
g_new(), 80
g_new(tpus, darabszm), 79
g_new0(tpus, darabszm), 80
G_NORMALIZE_ALL, 95
G_NORMALIZE_ALL_COMPOSE, 95
G_NORMALIZE_DEFAULT, 94
G_NORMALIZE_DEFAULT_COMPOSE,
95
G_OBJECT(), 29
g_object_get(), 26, 28, 146,
237, 271, 276, 305, 311
g_object_get_data(), 6668
g_object_new(), 134, 146
g_object_ref(), 228
g_object_set(), 27, 28, 146,
237, 271, 276, 305, 326
g_object_set_data(), 6668,
283
g_object_set_data_full(), 66
g_object_set_full(), 326
g_object_set_property(), 29
g_object_unref(), 140, 228
G_OPTION_ARG_CALLBACK, 119
G_OPTION_ARG_FILENAME, 119
G_OPTION_ARG_FILENAME_ARRAY,
119
G_OPTION_ARG_INT, 119
G_OPTION_ARG_NONE, 118, 119
G_OPTION_ARG_STRING, 119
G_OPTION_ARG_STRING_ARRAY,
119
g_option_context_add_main_entries(),
121
g_option_context_free(), 120
g_option_context_new(), 120
g_option_context_parse(), 120
g_option_context_set_ignore_unknown_options(),
121
G_OPTION_FLAG_HIDDEN, 118
G_OPTION_FLAG_IN_MAIN, 118
G_OPTION_FLAG_REVERSE, 118
G_OS_BEOS, 76
G_OS_UNIX, 76
G_OS_WIN32, 75
g_path_get_basename(), 115,
116
g_path_get_dirname(), 116
gtk 2007/10/21 14:22 page 355 #355
355
g_path_is_absolute(), 116
g_printf(), 83
g_realloc(), 79, 80
g_return_if_fail(kifejezs),
77
g_return_if_reached(), 77
g_return_val_if_fail(kifejezs,rtk),
77
g_return_val_if_reached(rtk),
77
g_snprintf(), 83
g_sprintf(), 83
g_stpcpy(), 82
g_str_has_prefix(), 82
g_str_has_suffix(), 82
g_strcanon(), 84
g_strchomp(), 83, 84
g_strchug(), 83, 84
g_strcompress(), 84
g_strconcat(), 85, 86
g_strdup(), 81, 166
g_strdup_printf(), 82
g_strescape(), 84
g_strfreev(), 85
g_string_append(), 99
g_string_append_c(), 99, 100
g_string_append_printf(), 99
g_string_append_unichar(), 99,
100
g_string_assign(), 98
g_string_erase(), 101
g_string_free(), 101
g_string_insert(), 100
g_string_insert_c(), 100
g_string_insert_unichar(),
100
g_string_new(), 98
g_string_new_len(), 98
g_string_prepend(), 99
g_string_prepend_c(), 100
g_string_prepend_unichar(),
100
g_string_printf(), 98, 99
g_string_sized_new(), 98
g_string_truncate(), 101
g_strjoin(), 86
g_strndup(), 82
g_strnfill(), 82
g_strreverse(), 83
g_strrstr(), 82
g_strrstr_len(), 82
g_strsplit(), 84, 85
g_strsplit_set(), 85
g_strstr_len(), 82
g_strstrip(szveg), 84
g_tree_destroy(), 114
g_tree_foreach(), 113, 114
g_tree_height(), 113
g_tree_insert(), 112, 113
g_tree_lookup(), 113
g_tree_new(), 110, 111
g_tree_new_full(), 111, 112
g_tree_new_with_data(), 111
g_tree_nnodes(), 113
g_tree_remove(), 114
g_tree_replace(), 112
g_try_malloc(), 79
g_try_realloc(), 79
G_TYPE_BOOLEAN, 263
G_TYPE_CHECK_INSTANCE_CAST(),
132
G_TYPE_CHECK_INSTANCE_TYPE(),
132
g_type_class_add_private(),
147
G_TYPE_DOUBLE, 263
G_TYPE_INSTANCE_GET_PRIVATE(),
147
G_TYPE_INT, 29
G_TYPE_INT, 263
G_TYPE_POINTER, 263
g_type_register_static(),
138, 139
G_TYPE_STRING, 263
G_UNICODE_BREAK_AFTER, 89
G_UNICODE_BREAK_ALPHABETIC,
89
G_UNICODE_BREAK_AMBIGUOUS, 89
gtk 2007/10/21 14:22 page 356 #356
356
G_UNICODE_BREAK_BEFORE, 89
G_UNICODE_BREAK_BE-
FORE_AND_AFTER, 89
G_UNICODE_BREAK_CARRI-
AGE_RETURN, 89
G_UNICODE_BREAK_CLOSE_PUNCTU-
ATION, 89
G_UNICODE_BREAK_COM-
BINING_MARK, 89
G_UNICODE_BREAK_COMPLEX_CON-
TEXT, 89
G_UNICODE_BREAK_CONTINGENT,
89
G_UNICODE_BREAK_EXCLAMATION,
89
G_UNICODE_BREAK_HAN-
GUL_L_JAMO, 89
G_UNICODE_BREAK_HAN-
GUL_LV_SYLLABLE, 89
G_UNICODE_BREAK_HAN-
GUL_LVT_SYLLABLE, 89
G_UNICODE_BREAK_HAN-
GUL_T_JAMO, 89
G_UNICODE_BREAK_HAN-
GUL_V_JAMO, 89
G_UNICODE_BREAK_HYPHEN, 89
G_UNICODE_BREAK_IDEOGRAPHIC,
89
G_UNICODE_BREAK_INSEPARABLE,
89
G_UNICODE_BREAK_INFIX_SEPA-
RATOR, 89
G_UNICODE_BREAK_LINE_FEED, 89
G_UNICODE_BREAK_MANDATORY, 89
G_UNICODE_BREAK_NEXT_LINE, 89
G_UNICODE_BREAK_NON_BREAK-
ING_GLUE, 89
G_UNICODE_BREAK_NON_STARTER,
89
G_UNICODE_BREAK_NUMERIC, 89
G_UNICODE_BREAK_OPEN_PUNCTU-
ATION, 89
G_UNICODE_BREAK_POSTFIX, 89
G_UNICODE_BREAK_PREFIX, 89
G_UNICODE_BREAK_QUOTATION, 89
G_UNICODE_BREAK_SPACE, 89
G_UNICODE_BREAK_SURROGATE, 89
G_UNICODE_BREAK_SYMBOL, 89
G_UNICODE_BREAK_UNKNOWN, 89
G_UNICODE_BREAK_WORD_JOINER,
89
G_UNICODE_BREAK_ZERO_WIDTH_SPACE,
89
G_UNICODE_CLOSE_PUNCTUATION,
89
G_UNICODE_COMBINING_MARK, 89
G_UNICODE_CONNECT_PUNCTU-
ATION, 89
G_UNICODE_CURRENCY_SYMBOL, 89
G_UNICODE_DASH_PUNCTUATION,
89
G_UNICODE_DECIMAL_NUMBER, 89
G_UNICODE_ENCLOSING_MARK, 89
G_UNICODE_FINAL_PUNCTUATION,
89
G_UNICODE_FORMAT, 88
G_UNICODE_INITIAL_PUNCTU-
ATION, 89
G_UNICODE_LETTER_NUMBER, 89
G_UNICODE_LINE_SEPARATOR, 89
G_UNICODE_LOWERCASE_LETTER,
88
G_UNICODE_MATH_SYMBOL, 89
G_UNICODE_MODIFIER_LETTER, 88
G_UNICODE_MODIFIER_SYMBOL, 89
G_UNICODE_NON_SPACING_MARK,
89
G_UNICODE_OPEN_PUNCTUATION,
89
G_UNICODE_OTHER_LETTER, 88
G_UNICODE_OTHER_NUMBER, 89
G_UNICODE_OTHER_PUNCTUATION,
89
G_UNICODE_OTHER_SYMBOL, 89
G_UNICODE_PARAGRAPH_SEPARA-
TOR, 89
G_UNICODE_PRIVATE_USE, 88
G_UNICODE_SPACE_SEPARATOR, 89
gtk 2007/10/21 14:22 page 357 #357
357
G_UNICODE_SURROGATE, 88
G_UNICODE_TITLECASE_LETTER,
89
G_UNICODE_UNASSIGNED, 88
G_UNICODE_UPPERCASE_LETTER,
89
g_unichar_break_type(), 89
g_unichar_digit_value(), 88
g_unichar_isalnum(), 87
g_unichar_isalpha(), 87
g_unichar_iscntrl(), 87
g_unichar_isdefined(), 88
g_unichar_isdigit(), 87
g_unichar_isgraph(), 87
g_unichar_islower(), 87
g_unichar_isprint(), 87
g_unichar_ispunct(), 87
g_unichar_isspace(), 88
g_unichar_istitle(), 88
g_unichar_isupper(), 88
g_unichar_iswide(), 88
g_unichar_isxdigit(), 88
g_unichar_tolower(), 88
g_unichar_totitle(), 88
g_unichar_toupper(), 88
g_unichar_type(), 88
g_unichar_validate(), 87
g_unichar_xdigit_value(), 88
G_UNICODE_CONTROL, 88
g_utf8_casefold(), 94, 95
g_utf8_collate(), 9496
g_utf8_collate_key(), 96
g_utf8_collate_key_for_filename(),
96
g_utf8_find_next_char(), 92
g_utf8_find_prev_char(), 91
g_utf8_get_char(), 90
g_utf8_get_char_validated(),
90
g_utf8_next_char(), 90, 97
g_utf8_normalize(), 94
g_utf8_offset_to_pointer(),
90
g_utf8_pointer_to_offset(),
91
g_utf8_prev_char(), 91
g_utf8_strchr(), 92
g_utf8_strdown(), 94
g_utf8_strlen(), 92
g_utf8_strncpy(), 92
g_utf8_strrchr(), 92
g_utf8_strreverse(), 93
g_utf8_strup(), 93
g_utf8_validate(), 93
g_value_set_int(), 29
g_warning(), 78
g_warning(formtumszveg,
...), 78
gboolean, 58, 73, 119, 237246,
271, 273276, 280, 282,
283, 305, 306
gchar, 74, 81
gchar
*
, 89, 119
gchar
**
, 119
gchararray, 237241, 271, 273
275, 280, 287, 306
GCompareDataFunc(), 111
GCompareFunc(), 104, 111
gconstpointer, 74
GDK_BUTTON_PRESS, 59
gdk_color_parse(), 195
gdk_pixbuf_new_from_file(),
263
GDK_SELECTION_CLIPBOARD, 250
GDK_SELECTION_PRIMARY, 250
GDK_TYPE_PIXBUF, 263
GdkColor, 195, 237, 239, 241,
271, 273, 274
GdkEventButton, 58
GdkPixbuf, 280
GdkPixmap, 238, 239
gdouble, 75, 242, 243, 275
GError, 120, 127
gettext(), 348
gettext, 349
gfloat, 75, 272, 305
gtk 2007/10/21 14:22 page 358 #358
358
gint, 74, 119, 239243, 245, 271,
272, 275, 276, 287, 306
gint16, 74
gint32, 74
gint64, 75
gint8, 74
glade, 11
glade-2, 11
GList, 102
glong, 74
GNode, 109, 110
gnome-theme-manager, 33
gnome-ui-properties, 53
GnomeAppBar, 208
GObject, 65, 66, 68, 132134, 140,
270, 276
gobject_class, 139
GObjectClass, 140
gombok, 184
GOptionEntry, 118
gpointer, 74
green, 195
gshort, 74
gsize, 75
gssize, 75
GString, 97, 98, 101
gtk-demo, 9
gtk_button_set_label(), 40
GTK_BUTTONS_CANCEL, 184
GTK_BUTTONS_CLOSE, 184
GTK_BUTTONS_OK, 184
GTK_BUTTONS_OK_CANCEL, 184
GTK_BUTTONS_YES_NO, 184
GTK_CELL_LAYOUT(), 297
gtk_cell_layout_add_attribute(),
289, 297
gtk_cell_layout_pack_end(),
288
gtk_cell_layout_pack_start(),
288, 297
gtk_cell_layout_set_attributes(),
288, 289
gtk_cell_layout_set_cell_data_func(),
290
gtk_cell_renderer_pixbuf_new(),
280
gtk_cell_renderer_progress_new(),
287
gtk_cell_renderer_text_new(),
272
gtk_cell_renderer_toggle_get_radio(),
282
gtk_cell_renderer_toggle_new(),
282
gtk_cell_renderer_toggle_set_radio(),
282
gtk_clipboard_get(), 250
gtk_color_selection_dialog_new(),
195
gtk_color_selection_get_current_alpha(),
196
gtk_color_selection_get_current_color(),
196
gtk_color_selection_set_current_alpha(),
196
gtk_color_selection_set_current_color(),
196
gtk_color_selection_set_has_opacity_control(),
195
gtk_combo_box_append_text(),
47
gtk_combo_box_get_active(),
49
gtk_combo_box_get_active_iter(),
294
gtk_combo_box_get_active_text(),
48
gtk_combo_box_insert_text(),
47
gtk_combo_box_new(), 294
gtk_combo_box_new_text(),
293, 294
gtk_combo_box_prepend_text(),
48
gtk_combo_box_remove_text(),
48
gtk_combo_box_set_active(),
48
gtk 2007/10/21 14:22 page 359 #359
359
gtk_combo_box_set_model(),
294
gtk_dialog_add_buttons(), 185
GTK_DIALOG_DESTROY_WITH_PARENT,
184
gtk_dialog_run(), 185, 186,
188190
gtk_editable_select_region(),
45
gtk_entry_comple-
tion_set_text_co-
lumn(), 268
GTK_ENTRY(), 45
gtk_entry_completion_new(),
268
gtk_entry_completion_set_model(),
268
gtk_entry_get_text(), 44
gtk_entry_set_completion(),
268
gtk_entry_set_text(), 44
gtk_exit(), 20
GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER,
188
GTK_FILE_CHOOSER_ACTION_OPEN,
188
GTK_FILE_CHOOSER_ACTION_SAVE,
188
GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
188
gtk_file_chooser_dialog_new(),
188
gtk_file_chooser_get_filename(),
190
gtk_file_chooser_set_current_folder(),
189
gtk_font_selection_dialog_get_font_name(),
192
gtk_font_selection_dialog_new(),
191
gtk_font_selection_dialog_set_preview_text(),
192
gtk_frame_set_label(), 64
gtk_get_current_event_time(),
58
GTK_ICON_SIZE_BUTTON, 281
GTK_ICON_SIZE_DIALOG, 281
GTK_ICON_SIZE_DND, 281
GTK_ICON_SIZE_INVALID, 281
GTK_ICON_SIZE_LARGE_TOOLBAR,
281
GTK_ICON_SIZE_MENU, 281
GTK_ICON_SIZE_SMALL_TOOLBAR,
281
gtk_icon_view_get_cursor(),
337
gtk_icon_view_get_item_at_pos(),
339
gtk_icon_view_get_markup_column(),
332
gtk_icon_view_get_model(),
332
gtk_icon_view_get_orientation(),
333
gtk_icon_view_get_path_at_pos(),
338
gtk_icon_view_get_pixbuf_column(),
333
gtk_icon_view_get_selected_items(),
336
gtk_icon_view_get_selection_mode(),
335
gtk_icon_view_get_text_column(),
332
gtk_icon_view_item_activated(),
339
gtk_icon_view_path_is_selected(),
336
gtk_icon_view_select_all(),
336
gtk_icon_view_select_path(),
336
gtk_icon_view_selected_foreach(),
335
gtk_icon_view_set_column_spacing(),
334
gtk_icon_view_set_cursor(),
337
gtk 2007/10/21 14:22 page 360 #360
360
gtk_icon_view_set_item_width(),
328
gtk_icon_view_set_margin(),
334
gtk_icon_view_set_markup_column(),
332
gtk_icon_view_set_model(),
327
gtk_icon_view_set_orientation(),
333
gtk_icon_view_set_pixbuf_column(),
328, 333
gtk_icon_view_set_reorderable(),
334
gtk_icon_view_set_row_spacing(),
333
gtk_icon_view_set_selection_mode(),
334
gtk_icon_view_set_spacing(),
333
gtk_icon_view_set_text_column(),
328, 332
gtk_icon_view_unselect_all(),
337
gtk_icon_view_unselect_path(),
336
gtk_init(), 124
gtk_init_check(), 124
gtk_init_with_args(), 124,
125, 127, 128
GTK_IS_LIST_STORE(), 311
GTK_IS_TREE_STORE(), 311
GTK_JUSTIFY_CENTER, 240
GTK_JUSTIFY_FILL, 240
GTK_JUSTIFY_LEFT, 240
GTK_JUSTIFY_RIGHT, 240
gtk_label_set_text(), 36
gtk_list_store_append(), 264,
266, 269
gtk_list_store_clear(), 263
gtk_list_store_new(), 263, 269
gtk_list_store_prepend(), 264
gtk_list_store_set(), 264,
266, 269
gtk_main(), 124
gtk_main_iteration(), 208
gtk_menu_popup(), 57, 60, 326
gtk_menu_tool_button_set_menu(),
205
gtk_message_dialog_new(), 184
GTK_MESSAGE_ERROR, 184
GTK_MESSAGE_INFO, 184
GTK_MESSAGE_QUESTION, 184
GTK_MESSAGE_WARNING, 184
GTK_ORIENTATION_HORIZONTAL,
333
GTK_ORIENTATION_VERTICAL, 333
GTK_RESPONSE_APPLY, 189
GTK_RESPONSE_CANCEL, 185, 189
GTK_RESPONSE_CLOSE, 185, 189
GTK_RESPONSE_DELETE_EVENT,
185
GTK_RESPONSE_HELP, 189
GTK_RESPONSE_NO, 185, 189
GTK_RESPONSE_OK, 185, 189
GTK_RESPONSE_YES, 185, 189
GTK_SELECTION_BROWSE, 312, 335
GTK_SELECTION_MULTIPLE, 312,
335
GTK_SELECTION_NONE, 312, 334
GTK_SELECTION_SINGLE, 312, 335
GTK_SORT_ASCENDING, 305, 306
GTK_SORT_DESCENDING, 305, 306
gtk_spin_button_get_value(),
46
gtk_spin_button_get_value_as_int(),
46
gtk_spin_button_set_value(),
45
GTK_STOCK_APPLY, 188
GTK_STOCK_CANCEL, 189
GTK_STOCK_HELP, 189
GTK_STOCK_NEW, 189
GTK_STOCK_NO, 189
GTK_STOCK_OK, 189
GTK_STOCK_OPEN, 189
GTK_STOCK_PRINT, 189
GTK_STOCK_REMOVE, 189
gtk 2007/10/21 14:22 page 361 #361
361
GTK_STOCK_SAVE, 189
GTK_STOCK_YES, 189
gtk_text_buffer_apply_tag(),
233
gtk_text_buffer_apply_tag_by_name(),
233, 234
gtk_text_buffer_copy_clipboard(),
251
gtk_text_buffer_create_mark(),
227
gtk_text_buffer_create_tag(),
231, 237
gtk_text_buffer_cut_clipboard(),
251
gtk_text_buffer_delete_mark(),
228, 230
gtk_text_buffer_delete_mark_by_name(),
228, 230
gtk_text_buffer_delete_selection(),
250
gtk_text_buffer_get_end_iter(),
211
gtk_text_buffer_get_has_selection(),
247
gtk_text_buffer_get_insert(),
246
gtk_text_buffer_get_iter_at_mark(),
228
gtk_text_buffer_get_mark(),
229, 246
gtk_text_buffer_get_modified(),
254
gtk_text_buffer_get_selection_bound(),
247
gtk_text_buffer_get_selection_bounds(),
247
gtk_text_buffer_get_start_iter(),
211
gtk_text_buffer_get_text(),
212
gtk_text_buffer_insert(),
212, 232, 233
gtk_text_buffer_insert_with_tags(),
232
gtk_text_buffer_insert_with_tags_by_name(),
232
gtk_text_buffer_move_mark(),
229
gtk_text_buffer_move_mark_by_name(),
229
gtk_text_buffer_paste_clipboard(),
251
gtk_text_buffer_remove_all_tags(),
234
gtk_text_buffer_remove_tag(),
233
gtk_text_buffer_remove_tag_by_name(),
233
gtk_text_buffer_select_range(),
247
gtk_text_buffer_set_modified(),
254
gtk_text_buffer_set_text(),
211
GTK_TEXT_DIR_LTR, 238
GTK_TEXT_DIR_NONE, 238
GTK_TEXT_DIR_RTL, 238
gtk_text_iter_backward_char(),
220
gtk_text_iter_backward_chars(),
220
gtk_text_iter_backward_cursor_position(),
222
gtk_text_iter_backward_cursor_positions(),
222
gtk_text_iter_backward_find_char(),
225
gtk_text_iter_backward_line(),
221
gtk_text_iter_backward_lines(),
221
gtk_text_iter_backward_search(),
226
gtk_text_iter_backward_sentence_start(),
223
gtk_text_iter_backward_sentence_starts(),
223
gtk_text_iter_backward_to_tag_toggle(),
gtk 2007/10/21 14:22 page 362 #362
362
224
gtk_text_iter_backward_word_start(),
221
gtk_text_iter_backward_word_starts(),
222
gtk_text_iter_begins_tag(),
218
gtk_text_iter_compare(), 226
gtk_text_iter_ends_line(),
219
gtk_text_iter_ends_sentence(),
219
gtk_text_iter_ends_tag(), 218
gtk_text_iter_ends_word(),
219
gtk_text_iter_equal(), 226
gtk_text_iter_forward_char(),
220, 222
gtk_text_iter_forward_chars(),
220
gtk_text_iter_forward_cursor_position(),
222
gtk_text_iter_forward_cursor_positions(),
222
gtk_text_iter_forward_find_char(),
224, 225
gtk_text_iter_forward_line(),
220, 221
gtk_text_iter_forward_lines(),
221
gtk_text_iter_forward_search(),
225, 226
gtk_text_iter_forward_sentence_end(),
223
gtk_text_iter_forward_sentence_ends(),
223
gtk_text_iter_forward_sentence_start(),
223
gtk_text_iter_forward_to_end(),
224
gtk_text_iter_forward_to_line_end(),
224
gtk_text_iter_forward_to_tag_toggle(),
224
gtk_text_iter_forward_word_end(),
221, 222
gtk_text_iter_forward_word_ends(),
222
gtk_text_iter_forward_word_start(),
222
gtk_text_iter_get_buffer(),
217
gtk_text_iter_get_bytes_in_line(),
220
gtk_text_iter_get_char(), 217
gtk_text_iter_get_chars_in_line(),
220
gtk_text_iter_get_line(), 217
gtk_text_iter_get_line_index(),
217
gtk_text_iter_get_line_offset(),
217
gtk_text_iter_get_marks(),
217
gtk_text_iter_get_offset(),
217
gtk_text_iter_get_tags(), 219
gtk_text_iter_get_text(), 217
gtk_text_iter_get_toggled_tags(),
218
gtk_text_iter_has_tag(), 218
gtk_text_iter_in_range(), 226
gtk_text_iter_inside_sentence(),
219
gtk_text_iter_inside_word(),
219
gtk_text_iter_is_cursor_position(),
219
gtk_text_iter_is_end(), 220
gtk_text_iter_is_start(), 220
gtk_text_iter_order(), 226
gtk_text_iter_set_line(), 223
gtk_text_iter_set_line_index(),
223
gtk_text_iter_set_line_offset(),
223
gtk_text_iter_set_offset(),
223
gtk 2007/10/21 14:22 page 363 #363
363
gtk_text_iter_starts_line(),
219
gtk_text_iter_starts_sentence(),
219
gtk_text_iter_starts_word(),
219
gtk_text_iter_toggles_tag(),
218
gtk_text_mark_get_buffer(),
229
gtk_text_mark_get_deleted(),
229
gtk_text_mark_get_name(), 230
gtk_text_mark_set_visible(),
230
gtk_text_view_get_buffer(),
211
gtk_text_view_move_mark_onscreen(),
230, 231
gtk_text_view_scroll_mark_onscreen(),
231
GTK_TOGGLE_BUTTON(), 51
gtk_toggle_button_get_active(),
42, 51
gtk_toggle_button_get_inconsistent(),
42
gtk_toggle_button_set_active(),
41, 51
gtk_toggle_button_set_inconsistent(),
42
gtk_toggle_tool_button_get_active(),
205
gtk_toggle_tool_button_set_active(),
205
gtk_tool_button_set_icon_widget(),
205
gtk_tool_button_set_label(),
205
GTK_TREE_MODEL(), 255
gtk_tree_model_foreach(),
261, 262
gtk_tree_model_get(), 261
gtk_tree_model_get_column_type(),
261
gtk_tree_model_get_iter(),
258
gtk_tree_model_get_iter_first(),
255
gtk_tree_model_get_iter_from_string(),
255
gtk_tree_model_get_n_columns(),
261
gtk_tree_model_get_path(),
258
gtk_tree_model_get_string_from_iter(),
257
gtk_tree_model_iter_children(),
256
gtk_tree_model_iter_has_child(),
256
gtk_tree_model_iter_n_children(),
256
gtk_tree_model_iter_next(),
256
gtk_tree_model_iter_nth_child(),
257
gtk_tree_model_iter_parent(),
257
gtk_tree_path_append_index(),
259
gtk_tree_path_compare(), 260
gtk_tree_path_copy(), 259
gtk_tree_path_down(), 260
gtk_tree_path_free(), 258,
313, 318, 323, 336
gtk_tree_path_get_depth(),
259
gtk_tree_path_is_ancestor(),
260
gtk_tree_path_new(), 258
gtk_tree_path_new_first(),
259
gtk_tree_path_new_from_string(),
259
gtk_tree_path_next(), 260
gtk_tree_path_prepend_index(),
259
gtk_tree_path_prev(), 260
gtk 2007/10/21 14:22 page 364 #364
364
gtk_tree_path_to_string(),
259
gtk_tree_path_up(), 260
gtk_tree_selection_count_selected_rows(),
313
gtk_tree_selection_get_mode(),
312
gtk_tree_selection_get_selected(),
312
gtk_tree_selection_get_selected_rows(),
313, 317
gtk_tree_selection_iter_is_selected(),
314
gtk_tree_selection_path_is_selected(),
314
gtk_tree_selection_select_all(),
315
gtk_tree_selection_select_iter(),
314
gtk_tree_selection_select_path(),
313
gtk_tree_selection_select_range(),
315
gtk_tree_selection_set_mode(),
312
gtk_tree_selection_unselect_all(),
315
gtk_tree_selection_unselect_iter(),
314
gtk_tree_selection_unselect_path(),
314
gtk_tree_selection_unselect_range(),
315
gtk_tree_store_append(), 269
gtk_tree_store_clear(), 269
gtk_tree_store_new(), 268
gtk_tree_store_prepend(), 269
gtk_tree_store_set(), 269
gtk_tree_view_append_column(),
299
gtk_tree_view_collapse_all(),
318
gtk_tree_view_collapse_row(),
319
gtk_tree_view_column_add_attribute(),
289
GTK_TREE_VIEW_COLUMN_AUTOSIZE,
302, 306
GTK_TREE_VIEW_COLUMN_FIXED,
302, 306
gtk_tree_view_column_get_width(),
302
GTK_TREE_VIEW_COLUMN_GROW_ONLY,
302, 306
gtk_tree_view_column_new(),
299, 300
gtk_tree_view_column_new_with_att-
ributes(), 299
gtk_tree_view_column_new_with_attributes(),
301
gtk_tree_view_column_set_alignment(),
304
gtk_tree_view_column_set_clickable(),
303
gtk_tree_view_column_set_expand(),
303
gtk_tree_view_column_set_fixed_width(),
302
gtk_tree_view_column_set_max_width(),
303
gtk_tree_view_column_set_min_width(),
303
gtk_tree_view_column_set_reorderable(),
304
gtk_tree_view_column_set_resizable(),
302
gtk_tree_view_column_set_sizing(),
302
gtk_tree_view_column_set_sort_column_id(),
304, 305
gtk_tree_view_column_set_sort_indicator(),
305
gtk_tree_view_column_set_sort_order(),
305
gtk_tree_view_column_set_spacing(),
301
gtk_tree_view_column_set_title(),
303
gtk 2007/10/21 14:22 page 365 #365
365
gtk_tree_view_column_set_visible(),
302
gtk_tree_view_column_set_widget(),
304
gtk_tree_view_expand_all(),
318
gtk_tree_view_expand_row(),
318
gtk_tree_view_expand_to_path(),
318
gtk_tree_view_get_column(),
319
gtk_tree_view_get_columns(),
319
gtk_tree_view_get_cursor(),
317
gtk_tree_view_get_model(),
311
gtk_tree_view_get_path_at_pos(),
322, 326
gtk_tree_view_get_selection(),
311
GTK_TREE_VIEW_GRID_LINES_BOTH,
309
GTK_TREE_VIEW_GRID_LINES_HORIZONTAL,
308
GTK_TREE_VIEW_GRID_LINES_NONE,
308
GTK_TREE_VIEW_GRID_LINES_VERTICAL,
309
gtk_tree_view_set_cursor(),
318
gtk_tree_view_set_enable_search(),
308
gtk_tree_view_set_enable_tree_lines(),
308
gtk_tree_view_set_fixed_height_mode(),
308
gtk_tree_view_set_grid_lines(),
308
gtk_tree_view_set_headers_clickable(),
309
gtk_tree_view_set_headers_visible(),
309
gtk_tree_view_set_hover_expand(),
309
gtk_tree_view_set_hover_selection(),
309
gtk_tree_view_set_model(),
300, 311
gtk_tree_view_set_reorderable(),
310
gtk_tree_view_set_rules_hint(),
310
gtk_tree_view_set_search_column(),
310
gtk_tree_view_set_search_entry(),
310
gtk_widget_activate(), 71
gtk_widget_destroy(), 68, 181,
185, 188
gtk_widget_get_name(), 72
gtk_widget_get_size_request(),
71
gtk_widget_grab_focus(), 72
gtk_widget_hide(), 69, 181
gtk_widget_hide_all(), 69
gtk_widget_is_focus(), 71
gtk_widget_set_name(), 72
gtk_widget_set_sensitive(),
70
gtk_widget_set_size_request(),
71
gtk_widget_show(), 69, 70, 180,
181
gtk_widget_show_all(), 69, 181
gtk_window_set_title(), 61
GTK_WRAP_CHAR, 245
GTK_WRAP_NONE, 245, 246
GTK_WRAP_WORD, 246
GTK_WRAP_WORD_CHAR, 246
GtkButton, 38, 41, 203, 205
GtkCellLayout, 287, 294, 297,
298, 338
GtkCellRenderer, 270, 271
GtkCellRendererPixbuf, 279
GtkCellRendererText, 272, 276
GtkCheckButton, 50
gtk 2007/10/21 14:22 page 366 #366
366
GtkCheckMenuItem, 56
GtkClipBoard, 250
GtkColorSelection, 195
GtkColorSelectionDialog, 195
GtkCombo, 46
GtkComboBox, 4749, 293, 294
GtkComboBoxEntry, 4749
GtkContainer, 38
GtkEditable, 45
GtkEntry, 43, 45
GtkEventButton, 60
GtkFrame, 64
GtkHBox, 64
GtkIconView, 327, 338
GtkImage, 37
GtkJustification, 240
GtkLabel, 35
GtkListStore, 254, 255, 262,
327, 328
GtkMenuBar, 206
GtkMenuToolButton, 203
GtkObject, 270
GtkOptionMenu, 46
GtkRadioButton, 52
GtkRadioToolButton, 203
GtkSeparatorToolItem, 203
GtkSortType, 306
GtkSpinButton, 45
GtkTable, 64
GtkTextBuffer, 210, 245
GtkTextCharPredicate(), 225
GtkTextDirection, 238
GtkTextIter, 210, 216, 226, 227,
255
GtkTextMark, 210, 226, 227, 246,
255
GtkTextTag, 210
GtkTextView, 210, 245, 246
GtkToggleButton, 41, 50
GtkToggleToolButton, 203
GtkToolbar, 202
GtkToolButton, 203
GtkTreeIter, 255, 258, 264
GtkTreeModel, 255, 261, 327
GtkTreePath, 255, 258, 313
GtkTreeSelection, 311
GtkTreeStore, 254, 255, 268
GtkTreeViewColumn, 298, 319
GtkTreeViewColumnSizing, 306
GtkVBox, 63
GtkWidget, 37, 47, 65, 68, 195,
207, 270, 294
GtkWidget
*
, 180, 306
GtkWindow, 61
GtkWrapMode, 245
GTraverseFunc(), 114
GTree, 110
GType, 132, 261, 263
GTypeInfo, 138
guchar, 74
guint, 74, 272, 281
guint16, 74
guint32, 75
guint64, 75
guint8, 74
gulong, 74
gunichar, 87
gushort, 74
GValue, 28, 29, 144
gvim, 10, 23
gzip, 21
hatr, 225
HAVE_CONFIG_H, 347
HOME, 116
hossz, 212
hu, 349
ind, 30
insert, 246, 249
int, 74
jellongyzet, 51
jelleg, 188
knyvtrnv, 190
kapcsolk, 184
kapcsolk, 225
kezdet, 45
gtk 2007/10/21 14:22 page 367 #367
367
kezdete, 225
klass, 139
kulcsfelszabadt, 112
LANG, 348, 349
last, 162
LC_ALL, 348
leave, 40
len, 97
libxml, 149
libxml2, 149
line, 162
long, 74
long long int, 75
long_name, 118
lookup_widget(), 30, 31, 35, 185
main(), 85, 120, 124, 125, 127,
128
make, 14, 16
make dist, 341
make distcheck, 341
make install, 14
Makefile, 153
malloc(), 79, 80
mark-set, 248, 249
MAX(a, b), 76
message, 127
mezo, 44, 45
mezo, 44
MIN(a, b), 76
move-cursor, 44
nv(), 248, 276, 283
nv, 30
nv, 227
nv1, 232
name, 161
new, 80
next, 110, 162
nodesetval, 176
ns, 162
NULL, 27, 30, 48, 66, 71, 7982, 85,
86, 91, 92, 101, 102, 106,
107, 112, 113, 115, 121,
123, 125, 154158, 162
165, 168, 169, 173, 174,
189, 190, 205, 218, 224,
225, 227, 229, 230, 232,
233, 237241, 249, 251,
256, 257, 269, 288, 290,
291, 299, 310, 311, 313,
317319, 323, 332, 337
339
oszlop, 323
PACKAGE, 347
PACKAGE_DATA_DIR, 347
PANGO_SCALE_LARGE, 243
PANGO_SCALE_MEDIUM, 243
PANGO_SCALE_SMALL, 243
PANGO_SCALE_X_LARGE, 243
PANGO_SCALE_X_SMALL, 243
PANGO_SCALE_XX_LARGE, 243
PANGO_SCALE_XX_SMALL, 243
PANGO_STRETCH_CONDENSED, 243
PANGO_STRETCH_EXPANDED, 243
PANGO_STRETCH_EXTRA_CONDEN-
SED, 243
PANGO_STRETCH_EXTRA_EXPANDED,
243
PANGO_STRETCH_NORMAL, 243
PANGO_STRETCH_SEMI_CONDENSED,
243
PANGO_STRETCH_SEMI_EXPANDED,
243
PANGO_STRETCH_ULTRA_EXPANDED,
243
PANGO_STRETCH_ULTRA_CONDEN-
SED, 243
PANGO_STYLE_ITALIC, 244
PANGO_STYLE_NORMAL, 244
PANGO_STYLE_OBLIQUE, 244
PANGO_UNDERLINE_DOUBLE, 244
PANGO_UNDERLINE_ERROR, 244
PANGO_UNDERLINE_LOW, 244
PANGO_UNDERLINE_NONE, 244
gtk 2007/10/21 14:22 page 368 #368
368
PANGO_UNDERLINE_SINGLE, 244
PANGO_VARIANT_NORMAL, 245
PANGO_VARIANT_SMALL_CAPS, 245
PANGO_WEIGHT_BOLD, 245
PANGO_WEIGHT_HEAVY, 245
PANGO_WEIGHT_LIGHT, 245
PANGO_WEIGHT_NORMAL, 245
PANGO_WEIGHT_SEMIBOLD, 245
PANGO_WEIGHT_ULTRABOLD, 245
PANGO_WEIGHT_ULTRALIGHT, 245
pango_attr_list_new(), 273
PANGO_ELLIPSIZE_END, 274
PANGO_ELLIPSIZE_MIDDLE, 274
PANGO_ELLIPSIZE_NONE, 273
PANGO_ELLIPSIZE_START, 274
PANGO_SCALE, 242, 243
pango_tab_array_new_with_positions(),
244
PangoAttrList, 273
PangoEllipsizeMode, 273
PangoFontDescription, 239, 274
PangoStretch, 243, 275
PangoStyle, 244, 275
PangoTabArray, 244
PangoUnderline, 244, 275
PangoVariant, 245, 276
PangoWrapMode, 276
parent, 207
parent, 162
parent_class, 141
patch, 342, 344, 345
PIP_IS_OBJECT(), 132, 133
PIP_IS_OBJECT_CLASS(), 132
PIP_OBJECT(), 132
pip_object_class_init(), 139,
140
PIP_OBJECT_GET_CLASS(), 133
pip_object_get_type(), 132,
134, 138
pip_object_new(), 134
PIP_TYPE_OBJECT(), 138
PIP_TYPE_OBJECT, 131, 132, 134
PipObject, 129, 132134, 139
141
PipObjectClass, 140
pkg-config, 152, 153
PKG_CHECK_MODULES(), 152
pressed, 40
prev, 162
printf(), 78, 82, 83, 99, 183185
priv, 148
properties, 162, 163
q_list_foreach(), 106
q_list_insert_sorted(), 103
q_list_position(), 107
raktr, 262
realize, 4749, 248
realloc(), 79
red, 195
released, 40
return, 77
rm, 117
scp, 21
selection_bound, 246
short, 74
short_name, 118
show_menu, 205
snprintf(), 83
sprintf(), 83, 98
static, 8
str, 97
strchr(), 92
strcmp(), 96, 103, 260
strdup(), 81
stringval, 176
strncpy(), 92
struct _xmlAttr
*
next, 164
struct _xmlAttr
*
prev, 164
struct _xmlDoc
*
doc, 164
struct _xmlNode
*
children,
164
struct _xmlNode
*
last, 164
struct _xmlNode
*
parent, 164
szveg, 44, 212, 225
szlo, 184, 188
gtk 2007/10/21 14:22 page 369 #369
369
szmemria, 212, 227, 232
tpus, 184
tar, 21, 341
text(), 172
text, 166, 168
toggle-overwrite, 44
toggled, 41, 204
toggled, 51, 283, 286
TreeView, 298
TRUE, 42, 51, 58, 73, 76, 93, 101,
114, 121, 189, 205, 218,
220227, 230, 231, 238,
247, 254258, 262, 282,
288, 319, 322, 336
type, 160162, 164, 168, 169, 176
uint16, 195
unsigned char, 74
unsigned int, 74
unsigned long, 74
unsigned short, 74
vg, 45
vge, 225
VERSION, 347
version, 150
vim, 21
visszatrsi rtk, 30, 44, 51,
125, 184, 185, 188, 189
visszatrsi rtk, 190
visszatrsi_rtk, 112, 225,
226
void, 77
void
*
, 74
void
*
_private, 164
window1, 180
window2, 180
x, 323
xFree(), 174
xml, 150, 151
XML_ATTRIBUTE_NODE, 163, 164,
169
XML_CDATA_SECTION_NODE, 161
XML_COMMENT_NODE, 161
XML_ELEMENT_NODE, 161, 168
XML_TEXT_NODE, 161, 162, 164
xmlAddChild(), 169
xmlAddNextSibling(), 170
xmlAddPrevSibling(), 170
xmlAddSibling(), 170
xmlAttr, 163, 164
xmlAttrPtr, 163
xmlCharStrdup(), 167
xmlDoc, 160
xmlDocPtr, 155, 160
xmlElementType type, 164
xmlEncodeEntitiesReentrant(),
157, 158
xmlFree(), 157
xmlFreeDoc(), 154
xmlGetNodePath(), 173
xmlKeepBlanksDefault(), 154
xmlNewCDataBlock(), 169
xmlNewChild(), 157, 158, 167
xmlNewComment(), 168
xmlNewDoc(), 154
xmlNewDocNode(), 155, 167
xmlNewNode(), 168
xmlNewNodeEatName(), 168
xmlNewText(), 168
xmlNode, 160, 161, 163, 164
xmlNodePtr, 160
xmlNodeSet, 176
xmlNodeSetPtr, 176
xmlNs
*
ns, 164
xmlParseFile(), 156
xmlSaveFormatFileEnc(), 154
xmlSetProp(), 158, 167
xmlStrdup(), 167
xmlUnsetProp(), 159
xmlXPathCastToBoolean(), 174
xmlXPathCastToNumber(), 174
xmlXPathCastToString(), 174
xmlXPathEvalExpression(),
173, 174
xmlXPathFreeContext(), 173
gtk 2007/10/21 14:22 page 370 #370
370
xmlXPathFreeObject(), 173
xmlXPathNewContext(), 173
xmlXPathObject, 176
xmlXPathObjectPtr, 173177
XPATH_BOOLEAN, 176
XPATH_NODESET, 176
XPATH_NUMBER, 176
XPATH_STRING, 176
XPATH_UNDEFINED, 176
XPATH_XSLT_TREE, 176
y, 323
gtk 2007/10/21 14:22 page 371 #371
371
Ajnls
Kedves Olvas!
Krem, engedjen meg nhny szt e knyv ltrejttr ol!
Cgnk a Blum Szoftver Mrnksg Kft. (www.blumsoft.com) 2005
ta foglalkozik nylt forrskd szoftverfejlesztssel Maemo krnyezet-
ben (www.maemo.org), melynek alapja a GTK+. A plattform azta szer-
ves rsze mindennapi fejlesztseinknek s feltehet oen szp jv o el ott ll
tbbek kztt a begyazott rendszerek (mobil eszkzk, m uszerek stb.)
piacn. Sajnos magyar nyelven elg kevs irodalom tallhat err ol az iz-
galmas terletr ol, gy n egy hinyptl m uvet tart a kezben. Pere
Lszl kollgnk egyni munkjnak tmogatsval szeretnnk haznk-
ban is npszer usteni ezt a programozsi krnyezetet. Ez ton szeretnk
ksznetet mondani munkjrt s a lehet osgrt, hogy szabadon letlt-
het o formban rendelkezsre bocstotta knyvt!
dvzlettel:
Blum Lszl
Cgvezet o
Veszprm, 2007 oktber 17

You might also like