A GTK haszn´alata
A http://www.gtk.org/tutorial/ - GTK tutorial alapj´an. A ford´ıt´as honlapja: http://gtk.pergamen.hu A ford´ıt´ast a Szegedi Tudom´anyegyetem Progamoz´as Alapjai c. kurzusa hat´as´ara kezdtem el, ´ gondolom hogy a C nyelv e´ rdemleges haszn´alat´ahoz erre is szuks´ ¨ eg van. ugy
Ny´ır˝o Bal´azs - mailto://
[email protected] Utolso´ friss´ıt´es: 2008. a´ prilis 18.
Tartalomjegyz´ek 1. Bevezeto˝ 1.1. A p´eldaprogramok leford´ıt´asa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2. Ismerked´es 2.1. Az els˝o program . . . . . . . . . . . . . . . . . . . . . 2.2. Hello´ vil´ag - egyszeru˝ p´elda . . . . . . . . . . . . . . ˝ p´elda . . . . . . 2.3. Hello´ vil´ag - k´et gomb, e´ letszerubb ¨ ˝ od´ ¨ ese 2.4. A szign´alok, esem´enykezel˝o fuggv´ enyek muk 2.4.1. Fontos gyakorlati p´elda . . . . . . . . . . . . 2.5. Esem´enyek . . . . . . . . . . . . . . . . . . . . . . . . ˝ l´ep´esenk´enti ismertet´ese . 2.6. A Hello world (egyszeru) ¨ 2.7. A szign´alkezel˝o fuggv´ enyekr˝ol b˝ovebben . . . . . .
3 5
. . . . . . . .
5 6 7 9 11 12 13 15 16
3. Felulet-elemek ¨ pozicion´al´asa, elrendez´ese e´ s csoportos´ıt´asa ˝ od´ ¨ ese . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1. A dobozok muk 3.2. A kont´enerekr˝ol r´eszletesebben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3. T´abl´azatok haszn´alata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17 17 17 24
4. A felhaszn´aloi ´ elemek a´ ttekint´ese 4.1. T´ıpuskonverzio´ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ¨ 4.2. A felulet-elemek hierarchi´aja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ¨ felulet-elemek ¨ 4.3. Ablak n´elkuli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
29 29 30 31
5. A gomb elemek 5.1. Az egyszeru˝ gomb . . . . . . . . . . . . . ´ 5.2. A k´et´all´asu´ v´altogombok (toggle buttons) 5.3. A kiv´alaszto´ pip´ak (check buttons) . . . . ´ 5.4. R´adiogombok . . . . . . . . . . . . . . . .
. . . .
32 32 36 37 38
6. Az Adjustment - Modos´ ´ ıto/be´ ´ all´ıto´ elem 6.1. Adjustment elem l´etrehoz´asa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ´ 6.2. A modos´ ıto´ elem egyszeru˝ haszn´alata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ´ ´ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3. Bels˝o modos´ ıtok
41 41 41 42
. . . .
. . . .
. . . .
1
. . . .
. . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
7. Intervallum elemek ¨ ıt˝os´av (scrollbar) . . . . . . . . . . . . . . 7.1. A gord´ ´ 7.2. Tologomb (scale widget) . . . . . . . . . . . . . . ¨ 7.3. Fuggv´ enyek e´ s szign´alok . . . . . . . . . . . . . . ´ ¨ 7.4. Altal´ anos fuggv´ enyek intervallum elemekhez . . 7.4.1. Friss´ıt´esi szab´alyok (update policy) . . . ´ 7.4.2. Modos´ ıto´ elemek el´er´ese, hozz´arendel´ese ˝ 7.4.3. Billentyuzet e´ s eg´er esem´enyek e´ szlel´ese 7.5. P´elda . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
43 43 47 48 48 48 48 49 49
8. Egy´eb felulet-elemek ¨ 8.1. Feliratok (Labels) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2. A ny´ıl (Arrows) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3. Tippek (tooltips) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.4. Folyamats´av (Progress bar) . . . . . . . . . . . . . . . . . . . . . . . . . 8.5. P´arbesz´ed ablakok (Dialogs) . . . . . . . . . . . . . . . . . . . . . . . . . ´ Vonalzok ´ (Rulers) . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.6. VAR: ´ Allapotjelz˝ ´ 8.7. VAR: o s´avok (Status bars) . . . . . . . . . . . . . . . . . . . ¨ 8.8. Szovegmez˝ ok (Text entries) . . . . . . . . . . . . . . . . . . . . . . . . . 8.9. L´eptet˝omez˝o (Spin buttons) . . . . . . . . . . . . . . . . . . . . . . . . . ´ 8.9.1. A l´eptet˝omez˝o e´ rt´ek´enek lek´erdez´ese, modos´ ıt´asa . . . . . . . . 8.9.2. A l´eptet˝omez˝o megjelen´es´enek e´ s viselked´es´enek szab´alyoz´asa ¨ ul˝ ¨ o menu¨ (Combo box) . . . . . . . . . . . . . . . . . . . . . . . . 8.10. Legord 8.11. Napt´ar (Calendar) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.12. Sz´ınkiv´alaszt´as (Color Selection) . . . . . . . . . . . . . . . . . . . . . . 8.13. F´ajl kiv´alaszt´as . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
53 53 56 58 59 63 67 67 67 70 71 72 78 80 88 91
9. T´arolo´ elemek (Container widgets) 9.1. Esem´enydoboz (EventBox) . . . . . . . . ¨ elem . . 9.2. Az Igaz´ıt´as (Alignment) felulet 9.3. Pozicion´alt t´arolo´ (Fixed container) . . . 9.4. Elrendez´es t´arolo´ (Layout Container) . . 9.5. Keretek (Frames) . . . . . . . . . . . . . 9.6. Ar´anytarto´ keret (Aspect Frame) . . . . 9.7. Osztott Ablak (Paned window) . . . . . 9.8. V´ar: Viewports . . . . . . . . . . . . . . ¨ ıthet˝o ablakok (Scrolled Windows 9.9. Gord´ 9.10. Gombt´arolo´ dobozok (button boxes) . . ¨ ar (Toolbar) . . . . . . . . . . . . 9.11. Eszkozt´ ¨ 9.12. Lapozo´ fulek (Notebooks) . . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
94 94 95 96 98 98 100 101 104 104 107 110 111
10. Menu¨ elemek (Menu widgets) 10.1. A menu¨ k´ezi fel´ep´ıt´ese (Manual menu creation) . . . . . 10.2. P´elda a menu¨ k´ezi elk´esz´ıt´es´ere (Manual menu example) 10.3. Az ElemGy´ar haszn´alata (Using ItemFactory) . . . . . . 10.3.1. A menu¨ elem (ItemFactory entries) . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
115 115 117 119 119
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
11. Scribble - p´elda egy egyszeru˝ rajzprogramra
120
12. Otthoni prob´ ´ alkoz´asok, e´ rdekes k´ıs´erletek 12.1. Kurucz Istv´an programjai . . . . . . . . . . . . . . . 12.1.1. Rajzol´as gombra - a gomb a´ tsz´ınez´ese . . . . 12.1.2. Gombba a´ gyazott gomb - ilyet is lehet . . . . ´ 12.1.3. Memoriaj´ at´ek SVG grafika felhaszn´al´as´aval
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
121 121 121 123 125
13. Feluletelemek ¨ tulajdons´againak be´all´ıt´asa (angolban: 133. o)
136
14. Jegyzetek
136
15. Tutorial Copyright and Permissions Notice
136
2
1.
Bevezeto˝
¨ o grafikus feluletet ¨ A GTK oktato´ magyar ford´ıt´as´anak c´elja a Linuxra k´eszul˝ haszn´alo´ programk´esz´ıt´es t´amogat´asa volt. Nyugodtan haszn´alj´ak el˝oad´asokon, gyakorlatokon, m´asolj´ak - e´ s e´ p´ıt˝o jelleggel seg´ıtsenek a jav´ıt´as´an. ¨ on ¨ om. ¨ Kosz ¨ ˝ ¨ ´ felulet ¨ A GTK egy fuggv´ enygyujtem´ eny (konyvt´ ar) grafikus felhaszn´aloi l´etrehoz´as´ara. Fejleszthetsz vele ´ u, ´ ak´ar z´art - fizet˝os programokat is, licensz e´ s jogd´ıjkolts´ ¨ egek n´elkul. ¨ A GTK eredetileg a ak´ar ny´ılt forr´askod ¨ de tobb ¨ projekt is haszn´alja, pl. a GNOME e´ s az XFCE is a GTK konyvt´ ¨ GIMP rajzprogramhoz k´eszult, arakra ¨ e´ pul. ´ ebben az oktatoban ´ ´ GTK-t lehet haszn´alni nagyon sok programoz´asi nyelv alol, a C-beli felhaszn´al´as´arol ´ lesz szo. Az oktato´ alapvet˝oen a GTK tutorial alapj´an halad, viszont saj´at meg´ıt´el´esem alapj´an bizonyos k´erd´esek ´ kifejt´ese b˝ovebb lesz az angol eredetin´el, m´as r´eszeit pedig ki fogom hagyni - szoval e´ rdemes megismerkedni az angol eredetivel is. ¨ ´ a GTK forr´as´at, A GTK konyvt´ ar haszn´alat´ahoz telep´ıteni kell a http://www.gtk.org/download/ oldalrol ˝ ´ om ´ csomagkezel˝oj´eb˝ol (Xubuntu, Synaptic) feltenni a e´ s leford´ıtani. Sz´amomra egyszerubb volt a disztribuci libgtk2.0 kezdetu˝ f´ajlokat, ebb˝ol is a libgtk2.0-dev az ami a C fejleszt´eshez kelleni fog. ´ e´ rdemes tudni, hogy Windows alatt is haszn´alhato. ´ GKT felulet-´ ¨ A GTK-rol ep´ıt˝o program a Glade, mely´ is - http://glade.gnome.org c´ımen el´erhet˝o. Itt tal´alhato´ nek l´etezik Windows-os e´ s Linuxos verzioja ´ http://mikcsabee.uw.hu/index.php?&lang= egy remek le´ır´as a keresztplatformos programoz´asrol: ´ m´asolatot k´esz´ıtettem a keresztplatform konvyt´ ¨ hun&modul=leirasok&read=3. Err˝ol az oldalrol arba, az ´ ¨ letolthet˝ ¨ oktatoval egyutt o. ¨ a DevCpp szabadon haszn´alhato´ (´es remek) C fejleszt˝oi kornyezetet ¨ Windows alatti fejleszt´eshez el˝oszor ¨ a http://www.bloodshed.net/devcpp.html oldalrol, ´ majd a Glade-et tolts ¨ uk ¨ le a telep´ıtsuk ´ http://gladewin32.sourceforge.net oldalrol. ¨ lehet m´eg a http://www.codeblocks.org/ Code::Block fejleszt˝oi kornye¨ Alternat´ıv fejleszt˝oi eszkoz zet. ´ grafikus felhaszn´aloi ´ feluletet ¨ ¨ Windows alatt ha a Glade-ben egy uj raktam ossze, a DevCpp-vel le tud´ ınuleg ˝ tam ford´ıtani v´egrehajthato´ .exe f´ajll´a. M´as Windowsos g´epeken a GTK valosz´ nem lesz rajta, ez´ert a ¨ eges dll f´ajlokat a program futtat´ashoz a GTK+/win32 Runtime Environment-et fel kell rakni. (vagy: a szuks´ ´ megold´as, nem prob´ ´ altam, csak tippelem hogy muk ˝ odne.) ¨ mell´e tenni, de ez bark´acsolos Ha a Glade-el k´esz´ıtesz programot, a DevCpp tapasztalatom szerint a Glade a´ ltal gener´alt projektf´ajl ¨ eletesen leford´ıtja a programot. Probl´ema lehet viszont az oktato´ programjaival: e´ rdemes a mell´ekelt alapj´an tok´ k´ep alapj´an a ford´ıto´ e´ s a linker parancssor´ahoz az al´abbiakat hozz´aadni – a be´all´ıt´asokat egy egyszeru˝ Glade ´ vettem ki (hogy l´assam mit kellene be´all´ıtani), viszont a windowsos kornyezeti ¨ ´ program projektf´ajlj´abol v´altozok ˝ odtek, ¨ ´ ˝ n´alam nem muk k´enytelen voltam a konkr´et C:/GTK utvonalat be´ırni (´ertelemszeruen ide a te GTK ´ ´ırd). utvonaladat
3
FORD´ IT´ O PARANCSSOR´ AHOZ: -mms-bitfields -mwindows -DHAVE_CONFIG_H -I"C:/GTK/include/gtk-2.0" -I"C:/GTK/lib/gtk-2.0/include" -I"C:/GTK/include/atk-1.0" -I"C:/GTK/include/pango-1.0" -I"C:/GTK/include/glib-2.0" -I"C:/GTK/lib/glib-2.0/include" -I"C:/GTK/include/cairo" -I"C:/GTK/include" -DPACKAGE_PREFIX=\"\" -DPACKAGE_DATA_DIR=\"\" -DPACKAGE_LOCALE_DIR=\"\" LINKER PARANCSSOR´ AHOZ: -L"C:/GTK/lib" -lgtk-win32-2.0 -lgdk-win32-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lpangowin32-1.0 -lgdi32 -lpango-1.0 -lgobject-2.0 -lgmodule-2.0 -lglib-2.0 -lintl -liconv A k´eperny˝ok´epen l´athato´ hogy a m´asodik p´eldaprogramot ´ıgy m´ar le tudtam ford´ıtani. ¨ ´ felulet ¨ ´ A le´ır´asban elemek, felulet-elemek alatt a grafikus felhaszn´aloi alkotoelemeit e´ rtem. P´eld´aul gom¨ ´ bok, gorget˝ os´avok, ablakok, pip´ak, r´adio-gombok. ¨ ¨ ´ A p´eldaprogramok tobbs´ ege fut´as kozben a standard kimenetre ´ır. Vagyis c´elszeru˝ valamilyen termin´alablakbol ¨ ind´ıtani a programokat (´es ne a h´att´erbe kuldve), hogy l´athato´ legyen a kimenet. ¨ A szign´al e´ s a jelz´es kifejez´est szinon´ımak´ent haszn´alom - van ahol nagyon sokszor el˝ofordul a szovegben, ´ e´ s nem b´ırtam m´ar a szoism´ etl´est. Hasznos oldalak: • FONTOS: A GTK aktu´alis, fejleszt˝oi le´ır´asa, e´ rdemes belen´ezni – http://library.gnome.org/devel/ gtk/unstable/ • FONTOS: A GTK hivatalos stabil le´ır´asa – http://library.gnome.org/devel/gtk/ ¨ • GTK szabv´anyos, programban haszn´alhato´ felulet elemei – pl. ok gomb, cancel gomb, ikonok: http: //www.gtk.org/api/2.6/gtk/gtk-Stock-Items.html • http://www.blumsoft.eu/Files/pere_gtk.pdf Pere L´aszlo´ Linux programoz´asa Grafikus felule¨ ten c. konyve ¨ 4
¨ ok ¨ - yo• http://www.yolinux.com/TUTORIALS/GTK+ProgrammingTips.html - GTK tippek, trukk ¨ os anyagokban is megtal´alod lementve. linux.com - kuls˝ ˝ • http://jimmac.musichall.cz/icons.php - Ikongyujtem´ eny, free - Icons by Jimmac • http://www.bravegnu.org/gtktext/gtktext-0.4.html - BraveGnu GTK Multiline Text Edi¨ os anyagokban bentvan. ting Widget - kuls˝ • http://www.gtkbook.com - Andrew Krause GTK+ oktatok ´ onyve ¨ - el´erheto˝ az Apress.com oldal´an, vagy az Amazonon. Aj´anlom, forr´askodok ´ kuls ¨ os ˝ anyagban. • http://developer.gnome.org/doc/GGAD/ - hivatalos Gnome - GTK programoz´asi konyv, ¨ SZA¨ ˝ ´ BADON LEGALISAN LETOLTHET O • http://www.ecn.wfu.edu/˜cottrell/cross-gtk/ Windowsos GTK programok k´esz´ıt´ese Linux alatt. ¨ os • http://http://www.ecn.wfu.edu/˜cottrell/gtk_win32/ nat´ıv MS kin´ezet windows alatt, kuls˝ anyagokban is megtal´alod. • ftp://ftp.gtk.org/pub/gtk • http://www.gtk.org/ ¨ ¨ Kitekint˝o – e´ rdemes e´ s hasznos a GTK tulajdons´agait m´as GUI fejleszt´es´ere alkalmas eszkozzel is osszeha´ sonl´ıtani, ismerni – tudni roluk: • http://www.fox-toolkit.org/ Fox-toolkit. C++, keresztplatformos • http://www.fltk.org/ - Fast light Toolkit, C++, keresztplatformos • http://trolltech.com/products/qt QT - Trolltech, C++ keresztplatformos.
1.1.
A p´eldaprogramok leford´ıt´asa
¨ ´ mellett egy Makefile f´ajlt l´atunk, ott el´eg ha kiadjuk a make parancsot, A /src konyvt´ arban ahol a forr´askod e´ s a programot a gcc az el˝ore megadott be´all´ıt´asoknak megfelel˝oen leford´ıtja. A programok k´ezi ford´ıt´as´at – ¨ p´eld´aul a kovetkez˝ o p´eldaprogram´et is – ´ıgy v´egezheted el: gcc -Wall begin_win01.c ‘pkg-config --cflags --libs gtk+-2.0‘ -o program A p´eldaprogramok ford´ıt´as´ahoz e´ rdemes a libgtk2.0-dev csomagot telep´ıteni.
2.
Ismerked´es
Tapasztalatok: ¨ ´ ¨ ¨ • A GTK programok alapesetben nem tobbsz´ aluak. Ha egy gomb lenyom´as´ahoz egy fuggv´ enyt rendelunk, ¨ es´et, e´ s ez mondjuk percekig eltarthat, a grafikus felulet ¨ pl. egy f´ajl letolt´ nem reag´al majd a felhaszn´alo´ ˝ esetleges eg´erklikkel´eseire, billentyuzet-bemenet´ ere. Erre van egyszeru˝ megold´as: a gombnyom´asra egy ´ sz´alat kell elind´ıtani, ´ıgy a grafikus felulett˝ ¨ ¨ ¨ fut egy esetleges hoszabb program. uj ol fuggetlen ul ¨ megv´altoztat´asa SEM tort´ ¨ enik meg egy hoszabb fuggv´ ¨ ¨ • A felulet eny lefut´asa kozben, ha egy sz´alt haszn´alunk ¨ es kozben ¨ - vagyis a fenti p´eld´an´al maradva hi´aba jelezn´enk azt a letolt´ hogy mondjuk hol tartunk, a gra¨ ´ ¨ ¨ fikus feluleten ez nem l´atszodik - az csak a fuggv´ eny lefut´asa ut´an frissul. ´ ¨ ´ anak valodi ´ jelent´es´et. P´eld´aul a HelloWorld p´eld´aban • Erdemes v´egiggondolni a kovetkez˝ o p´eld´ak kodj´ ´ - amivel a gombra tudunk hivatkozni. haszn´alt gomb l´etrehoz´asakor haszn´alunk egy *button v´altozot ¨ Mi a helyzet ha mondjuk 10 gombot akarunk elhelyezni egym´as alatt? Ha a gomb osszes tulajdons´ag´at ¨ egy alkalommal be tudjuk a´ ll´ıtani, e´ s tobbet nem akarunk a gombra hivatkozni, akkor el´eg egy *button ´ l´etrehozni, amivel ak´ar egym´as ut´an 10 gomb tulajdons´agait is be´all´ıthatjuk - egym´as ut´an. Ha v´altozot ¨ hely´er˝ol akarunk hivatkozni (pl. feliratokat cser´elni rajta) akkor e´ rdemes egy objektumra a program tobb ´ altozot ´ l´etrehoznunk. a fontosabb objektumoknak saj´at hivatkozo-v´
5
2.1.
Az elso˝ program
Most l´etrehozunk egy ablakot - a programot shell-b˝ol ind´ıtjuk, e´ s az ablakot egyenl˝ore a shell-ben futo´ program megszak´ıt´as´aval tudjuk bez´arni.
1 2 3
# i n c l u d e
/∗ ez minden GTK programba k e l l , ∗ fuggvenydefiniciok , valtozodeklaralasok
∗/
4 5
i n t main ( i n t argc , char ∗ argv [ ] ) {
6
/∗ egy mutato , amivel a f o a b l a k r a hivatkozunk ∗/ GtkWidget ∗ mutato ;
7 8 9 10
g t k i n i t (& argc , &argv ) ;
11 12
/∗ most epp az ablak−r a fog mutatni , ∗ de ha kesobb nem k e l l az a b l a k r a hivatkoznunk , ∗ a mutatot f e l h a s z n a l h a t j u k mas elem b e a l l i t a s a n a l i s . ∗/ mutato = gtk window new (GTK WINDOW TOPLEVEL ) ; /∗ mutato mar a l e t r e h o z o t t u j a b l a k r a mutat ∗/
13 14 15 16 17 18
gtk widget show ( mutato ) ;
19 20
gtk main ( ) ;
21 22
return 0;
23 24
} A programot ´ıgy ford´ıthatod le: gcc -Wall begin_win01.c ‘pkg-config --cflags --libs gtk+-2.0‘ -o program ´ ¨ ´ akat defini´al a GTK progAz els˝o sorban l´ev˝o #include v´altozokat, fuggv´ enyeket, struktur´ ram sz´am´ara. A gtk_init(&argc, &argv) a GTK alap´allapot´anak be´all´ıt´as´at v´egzi - sz´ınek, alapvet˝o megjelen´es, ¨ kozvetve az esem´enykezel˝ok be´all´ıt´asa.
6
2.2.
Hello´ vil´ag - egyszeru˝ p´elda
¨ A programot a helloworld konyvt´ arban tal´alod, e´ s a make paranccsal ford´ıthatod le. 1 2
# i n c l u d e
3 4 5 6 7 8 9 10 11 12 13 14 15 16
/∗ Ez a fuggveny a gomb lenyomasa h a t a s a r a f u t l e − ∗ a gomb ’ c l i c k e d ’ j e l z e s e t f i g y e l i , es ha a lenyomas megtortenik , ∗ l e f u t . A GTK−ban s o k f a j t a esemeny bekovetkezesehez ∗ rendelhetunk f i g y e l o fuggvenyt . ∗ A fuggveny k e t a d a t o t kepes fogadni : a f e l u l e t −elem , amelynel ∗ az esemeny b e k o v e t k e z e t t , es egy e s e t l e g e s parameter , de e z t most ∗ nem h a s z n a l j u k . ∗ ∗/ s t a t i c void h e l l o ( GtkWidget ∗ widget , gpointer data ) { g p r i n t ( ” uzenet : S z i a v i l a g − ez egy GTK−s program ! \ n” ) ; }
17 18 19 20 21 22 23 24 25 26 27 28 29
s t a t i c gboolean d e l e t e e v e n t ( GtkWidget ∗ widget , GdkEvent ∗ event , gpointer data ) { /∗ Ha FALSE e r t e k k e l t e r n e v i s s z a a ” d e l e t e e v e n t ” ( t o r l e s esemeny)− r e ∗ f i g y e l o fuggveny , a GTK ” d e s t r o y ” ( megsemmisites ) j e l z e s t adna k i . ∗ Mivel TRUE e r t e k k e l terunk v i s s z a , ez a z t j e l e n t i , hogy nem a k a r j u k ∗ hogy az a b l a k megsemmisuljon . ∗ ∗ Ennek t i p i k u s f e l h a s z n a l a s a a ’ B i z t o s hogy k i a k a r s z l e p n i a programbol ? ’ ∗ felugro ablak . ∗ ∗/
30
g p r i n t ( ” d e l e t e e v e n t − t o r l e s esemeny k o v e t k e z e t t be \n” ) ;
31 32
/∗ ha TRUE h e l y e t t FALSE e r t e k e t adsz v i s s z a a r e t u r n −a l , ∗ a f o a b l a k megsemmisul a ” d e l e t e e v e n t ”− e l . ∗ ∗/
33 34 35 36
r e t u r n TRUE ;
37 38
}
39 40 41 42 43 44 45
/∗ egy masik f i g y e l o fuggveny ∗/ s t a t i c void d e s t r o y ( GtkWidget ∗ widget , gpointer data ) { gtk main quit ( ) ; }
46 47 48 49 50 51 52
i n t main ( i n t argc , char ∗ argv [ ] ) { /∗ a GtkWidget a f e l u l e t e l e m e k t a r o l o t i p u s a ∗/ GtkWidget ∗window ; GtkWidget ∗ button ; 7
53 54 55 56 57
/∗ Ez minden GTK programban s z e r e p e l . A p a r a n c s s o r i ∗ p a r a m e t e r e k e t e r t e l m e z i , majd f o l y t a t o d i k a program f u t a s a . ∗ This i s c a l l e d i n a l l GTK a p p l i c a t i o n s . ∗/ g t k i n i t (& argc , &argv ) ;
58 59 60
/∗ u j a b l a k o t k e s z i t u n k ∗/ window = gtk window new (GTK WINDOW TOPLEVEL ) ;
61 62 63 64 65 66 67 68 69
/∗ Hozzarendelunk a t o r l e s esemenyhez ( d e l e t e e v e n t ) ∗ egy fuggvenyt : ha az a b l a k e z t k i b o c s a j t j a , ∗ akkor a fuggvenyben megadott u t a s i t a s o k fussanak l e . ∗ ∗ A fuggvenynek nem adunk a t egyeb p a r a m e t e r t (NULL) ∗ ∗/ g s i g n a l c o n n e c t ( G OBJECT ( window ) , ” d e l e t e e v e n t ” , G CALLBACK ( d e l e t e e v e n t ) , NULL ) ;
70 71 72 73 74 75 76 77 78
/∗ I t t a ” d e s t r o y ” ( megsemmisites ) esemeny f i g y e l e s e r e ∗ a l l i t u n k be egy fuggvenyt . ∗ Ez akkor f u t l e , ha v a l a h o l meghivjuk a ∗ g t k w i d g e t d e s t r o y ( ) fuggvenyt , vagy a ∗ ” d e l e t e e v e n t ”− e t f i g y e l o fuggveny FALSE e r t e k k e l t e r v i s s z a . ∗ ∗/ g s i g n a l c o n n e c t ( G OBJECT ( window ) , ” d e s t r o y ” , G CALLBACK ( d e s t r o y ) , NULL ) ;
79 80 81
/∗ B e a l l i t j u k az a b l a k b e l s o margojat . ∗/ g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( window ) , 1 0 ) ;
82 83 84
/∗ Uj gombot es f e l i r a t o t k e s z i t u n k ∗/ button = g t k b u t t o n n e w w i t h l a b e l ( ” S z i a Vilag , ez egy egyszeru GTK program ! ” ) ;
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
/∗∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗∗/ /∗∗ FONTOS : f i g y e l j u k meg a kovetkezo k e t fuggvenynel , ∗ hogy egy esemenyre ( c l i c k e d ) tobb f i g y e l o fuggvenyt i s ∗ meghatarozunk . Ha a gomblenyomas megtortenik , egymas ∗ utan k e t fuggveny i s l e f u t : az udvozloszoveg k i i r a s a , ∗ es a f o a b l a k k i k a p c s o l a s a ∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗∗/ /∗ ∗ A gomb lenyomasakor e l h a n g z i k a ” c l i c k e d ” ( lenyomva ) j e l z e s . ∗ Ehhez h o z z a r e n d e l j u k a h e l l o ( ) fuggvenyt : ha e l h a n g z i k a c l i c k e d , ∗ akkor fusson l e a f o r r a s k o d e l e j e n d e f i n i a l t h e l l o ( ) . ∗ NULL: semmilyen erdemi p a r a m e t e r t nem adunk most a t . ∗/ g s i g n a l c o n n e c t ( G OBJECT ( button ) , ” c l i c k e d ” , G CALLBACK ( h e l l o ) , NULL ) ;
101 102 103 104 105 106 107 108 109 110 111
/∗ Ennek a fuggvenynek a h a t a s a r a az a b l a k megsemmisul . ∗ A megsemmisules oka : a ” c l i c k e d ” esemeny h a t a s a r a ∗ l e f u t a g t k w i d g e t d e s t r o y ( window ) , v a g y i s ∗ elem megsemmisitese ( a b l a k ) fuggveny . ∗ A megsemmisitest vagy ennek a fuggvenynek a hivasa , ∗ vagy az a b l a k k e z e l o o k o z h a t j a . ∗ ∗/ g s i g n a l c o n n e c t s w a p p e d ( G OBJECT ( button ) , ” c l i c k e d ” , G CALLBACK ( g t k w i d g e t d e s t r o y ) , G OBJECT ( window ) ) ;
112 113 114
/∗ Az ablakba p a k o l j u k a gombot . ∗/ g t k c o n t a i n e r a d d (GTK CONTAINER ( window ) , button ) ; 8
115
/∗ A gomb m e g j e l e n i t e s e . ∗ Valojaban csak akkor v a l i k l a t h a t o v a , ha a s z u l o i s l a t h a t o . gtk widget show ( button ) ;
116 117 118
∗/
119
/∗ az a b l a k m e g j e l e n i t e s e . Ha sok gombot , f e l u l e t e l e m e t hasznalunk , es mindet ∗ valamilyen modon az ablakba rakjuk , e g y s z e r r e fognak m e g j e l e n n i . ∗ Azt i s l e h e t c s i n a l n i , hogy elobb az a b l a k o t j e l e n i t j u k meg , ∗ es utana a gombokat ahogy haladunk a programmal , de igy a f e l h a s z n a l o ∗ latni fogja a felulet felepuleset , valtozasat . ∗ ∗/ gtk widget show ( window ) ;
120 121 122 123 124 125 126 127
/∗ Minden GTK programnak t a r t a l m a z n i a k e l l a gtk main ( ) fuggvenyt . ∗ Ez v arakozik a f e l h a s z n a l o i bemenetre , p e l d a u l eger esemenyre , ∗ vagy b i l l e n t y u l e u t e s r e . ∗ ∗/ gtk main ( ) ;
128 129 130 131 132 133
return 0;
134 135
}
2.3.
Hello´ vil´ag - k´et gomb, e´ letszerubb ˝ p´elda
¨ ´ agot be´all´ıtunk, mint az el˝oz˝o p´eld´aban: az ablak m´eret´et, c´ımsort, m´ar dobozba pakoItt m´ar tobb apros´ lunk. ´ e´ s az esem´enyek hat´as´ara lefuto´ fuggv´ ¨ A p´elda megtekint´ese el˝ott e´ rdemes besz´elni a szign´alokrol enyekr˝ol. ¨ A GTK esem´enyvez´erelt - a gyakorlatban a gtk_main() fuggv´ eny v´arakozik, majd valamilyen esem´eny ¨ ¨ ´ bekovetkeztekor a program fut´asa egy adott fuggv´ enyben folytatodik. FONTOS: • a szign´alok fogalma itt nem ugyanaz, mint a UNIX-szeru˝ oprendszerek szign´aljai - de feladatuk hasonlo´ - egy esem´eny hat´as´ara jelz´est ad egy objektum, e´ s ha valaki(k) figyel(ik) ezt a jelz´est, reag´alhatnak r´a. ¨ (gomb lenyom´as -¿ clicked signal -¿ fuggv´ eny v´egrehajt´asa. ¨ • Az ablak elem egy objektumot k´epes t´arolni. Ez´ert el˝obb box-ot (doboz) teszunk bele, majd abban ¨ el a programunk felhaszn´aloi ´ felulet´ ¨ et fel´ep´ıteni. kezdjuk ¨ a shell-ben a gombok lenyom´as´ara ki´ırt szoveget! ¨ A programot parancssorbol ind´ıtsuk, e´ s figyeljuk A megjelen˝o ablak m´erete - hacsak nem adunk meg konkr´et e´ rt´eket - tapasztalatom szerint a benne l´ev˝o objek´ tumokhoz igazodik, vagyis akkora lesz, hogy amit belerakunk az elf´erjen. A lenti kodban l´athato´ egy p´elda, ˝ is be´all´ıthatjuk az ablak m´eret´et - viszont ´ıgy el˝ofordulhat olyan helyzet, hogy egy beraamivel sz´amszeruen ´ ¨ ıtett: ha az ablak fix kott elem nem jelenik meg, mert nem f´er el. Erdekes, hogy a gombok m´erete nem rogz´ ˝ akkor a gomb igyekszik kitolteni ¨ m´eretu, a rendelkez´esre a´ llo´ helyet, vagyis ha van hely, akkor megn˝o a gomb m´erete. ¨ A programot a helloworld2 konyvt´ arban tal´alod, e´ s egy make paranccsal le tudod ford´ıtani. 9
1
# i n c l u d e
2 3 4 5 6 7 8 9
/∗ A fuggvenynek a t a d o t t adat a szabvanyos kimenetre i r o d i k k i ∗/ void k i i r a s ( GtkWidget ∗ widget , gpointer data ) { g p r i n t ( ” Hello u j r a %s −t nyomtad meg\n” , ( gchar ∗ ) data ) ; } /∗∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗∗/
10 11 12 13 14 15 16 17 18 19 20 21
/∗ egy fuggveny , ami a d e l e t e e v e n t esemeny b e k o v e t k e z t e utan fog l e f u t n i , ∗ a d e l e t e e v e n t −hez kesobb k a p c s o l j u k , a neve akarmi l e h e t n e . ∗/ g i n t d e l e t e e v e n t f e l d o l g o z a s a ( GtkWidget ∗ widget , GdkEvent ∗ event , gpointer data ) { gtk main quit ( ) ; r e t u r n FALSE ; } /∗∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗∗/
22 23 24 25 26 27 28 29 30
i n t main ( i n t argc , char ∗ argv [ ] ) { /∗ A GtkWidget t i p u s b a n t a r o l h a t o k a kulonbozo gombok , ∗ ablakok , a g r a f i k u s f e l u l e t e l e me i ∗/ GtkWidget ∗window ; GtkWidget ∗ button ; GtkWidget ∗ box1 ;
31 32 33 34
/∗ Ez minden GTK programban meghivodik − f e l d o l g o z z a ∗ a k a p o t t p a r a n c s s o r i p a r a m e t e r e k e t ∗/ g t k i n i t (& argc , &argv ) ;
35 36 37
/∗ u j a b l a k o t hozunk l e t r e , es a m u t a t o j a t e l t a r t o l j u k ! ! window = gtk window new (GTK WINDOW TOPLEVEL ) ;
∗/
38 39 40 41
/∗ a b l a k meretenek f i x b e a l l i t a s a − ha nem adjuk meg , automatikusan ∗ a b e f o g l a l o elemek k o r u l i o p t i m a l i s m e r e t e t v e s z i f e l ∗/ g t k w i d g e t s e t s i z e r e q u e s t (GTK WIDGET( window ) , 3 0 0 , 160 ) ;
42 43 44 45 46
/∗ Az elobb t a r t a l m a t k a p o t t mutatot f e l h a s z n a l j u k , ∗ az a b l a k cimsoranak b e a l l i t a s a r a ∗/ g t k w i n d o w s e t t i t l e (GTK WINDOW ( window ) , ”Az e l s o gombom ! ” ) ;
47 48 49 50 51
/∗ A d e l e t e e v e n t esemenyt f e l d o l g o z o fuggveny b e a l l i t a s a , ∗ mely azonnal k i l e p a GTK−b o l ∗/ g s i g n a l c o n n e c t ( G OBJECT ( window ) , ” d e l e t e e v e n t ” , G CALLBACK ( d e l e t e e v e n t f e l d o l g o z a s a ) , NULL ) ;
52 53 54
/∗ MARGO b e a l l i t a s : az a b l a k k e r e t e , es a b e f o g l a l t objektumok k o z o t t i hely ∗/ g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( window ) , 5 0 ) ;
55 56 57 58 59 60 61 62
/∗ ∗ ∗ ∗ ∗ ∗
Egy dobozt hozunk l e t r e , amiben a f e l u l e t −elemeket t a r t j u k . Ez a doboz l a t h a t a t l a n − az elemek c s o p o r t o s i t a s a r a , elrendezesere szolgal . Dobozokkal l e h e t a f e l h a s z n a l o i f e l u l e t fobb t e r u l e t e i t k i a l a k i t a n i , p e l d a u l f e l s o menusor , kozepso s z e r k e s z t o f e l u l e t , a l s o s t a t u s z −s o r 10
∗ ekkor eg harom s o r b o l a l l o t a b l a z a t s z e r u s z e r k e z e t e t erdemes l e t r e h o z n i , ∗ amibe a gombokat , f e l i r a t o k a t , egyebeket p a k o l h a t j u k a m e g f e l e l o h e l y r e . ∗ ∗/ box1 = gtk hbox new ( FALSE , 0 ) ;
63 64 65 66 67
/∗ A l e t r e h o z o t t dobozt a f o ablakba helyezzuk . ∗/ g t k c o n t a i n e r a d d (GTK CONTAINER ( window ) , box1 ) ;
68 69 70
/∗ Uj gombot hozunk l e t r e ∗/ button = g t k b u t t o n n e w w i t h l a b e l ( ” 1 . gomb” ) ;
71 72 73
/∗ Esemeny−k e z e l e s meghatarozasa : ∗ Amikor a gombra k a t t i n t u n k , a k i i r a s fuggveny fog l e f u t n i . ∗/ g s i g n a l c o n n e c t ( G OBJECT ( button ) , ” c l i c k e d ” , G CALLBACK ( k i i r a s ) , ( g p o i n t e r ) ” 1 . gomb szoveg−parameter ” ) ;
74 75 76 77 78
/∗ A g t k c o n t a i n e r a d d h a s z n a l a t a h e l y e t t e g y e n l o r e a ∗ l a t h a t a t l a n dobozba t e s s z u k a gombot . ∗/ g t k b o x p a c k s t a r t (GTK BOX( box1 ) , button , TRUE, TRUE, 0 ) ;
79 80 81 82
/∗ E z z e l a m u v e l e t t e l j e l e z z u k a GTK−nak , ∗ hogy a gomb b e a l l i t a s a i t elvegeztuk , ∗ a gomb m e g j e l e n i t h e t o . ∗ Erdekes , hogy a f e l h a s z n a l o i f e l u l e t elemeinek l a t h a t o s a g a ∗ ki−be kapcsolhato , e z a l t a l a program f u t a s a soran ∗ a k e z e l o f e l u l e t e t igeny s z e r i n t akar t e l j e s e n a t r e n d e z h e t j u k ∗ − gombokat t u n t e t h e t u n k e l , u j elemeket j e l e n i t h e t u n k meg . ∗/ gtk widget show ( button ) ;
83 84 85 86 87 88 89 90 91 92
/∗ A masodik gombot l e t r e h o z z u k ∗/ button = g t k b u t t o n n e w w i t h l a b e l ( ” 2 . gomb” ) ;
93 94 95
/∗ B e a l l i t j u k hogy a k l i k k e l e s h a t a s a r a a k i i r a s fuggveny ∗ l e f u s s o n , a szoveges p a r a m e t e r r e l ∗/ g s i g n a l c o n n e c t ( G OBJECT ( button ) , ” c l i c k e d ” , G CALLBACK ( k i i r a s ) , ( g p o i n t e r ) ” 2 . gomb szoveg−parametere ” ) ;
96 97 98 99 100
g t k b o x p a c k s t a r t (GTK BOX ( box1 ) , button , TRUE, TRUE, 0 ) ;
101 102
/∗ A gombok m e g j e l e n i t e s i s o r r e n d j e nem igazan l e n y e g e s − ∗ j a v a s o l t v i s z o n t az a b l a k ( window ) u t o l j a r a t o r t e n o m e g j e l e n i t e s e , ∗ hogy minden elem e g y s z e r r e j e l e n j e n meg . ∗/
103 104 105 106
gtk widget show ( button ) ;
107 108
gtk widget show ( box1 ) ;
109 110
gtk widget show ( window ) ;
111 112
/∗ V e g t e l e n c i k l u s − varakozas a f e l h a s z n a l o i esemenyekre ∗/ gtk main ( ) ;
113 114 115
return 0;
116 117
}
2.4.
A szign´alok, esem´enykezelo˝ fuggv´ ¨ enyek muk ˝ od´ ¨ ese
´ azonos e´ rtelemben haszn´alom. A szign´al e´ s a jelz´es szot ˝ odik. ¨ ¨ A GTK esem´enyvez´erelten muk Vagyis a gtk_main() fuggv´ eny addig v´arakozik, am´ıg egy esem´eny ¨ ´ ¨ be nem kovetkezik, e´ s a vez´erl´es a´ tadodik az esem´enyt kezel˝o fuggv´ enyre (ha van). A program fut´as´anak
11
´ az oper´acios ´ rendszer szign´aljainak muk ˝ od´ ¨ es´ehez. A k´et rendir´any´ıt´asa a szign´alok elv´ere alapul, hasonloan ˝ od´ ¨ esi elvben hasonlo, ´ t´enylegesen k´et kul ¨ on ¨ dologrol ´ van szo. ´ szer muk ¨ Egy esem´eny bekovetkeztekor - p´eld´aul az eg´ergomb lenyom´asakor - a lenyomott gomb egy jelz´est bocs´ajt ¨ ¨ ok ¨ ol, ¨ ilyen p´eld´aul a destroy, e´ s vannak jelz´esek, ki. Vannak jelz´esek, melyeket minden felulet-elem or ´ ¨ ¨ melyek elem-specifikusak, p´eld´aul a toggled esem´eny - ami a v´alasztogombokn´ al kovetkezhet be (tobb le¨ ul ¨ lehet v´alasztani). het˝os´eg koz ¨ Ahhoz, hogy a gomb lenyom´asakor egy adott fuggv´ eny lefusson, az esem´enyek kezel´es´et be kell a´ ll´ıtani ¨ enjen). (mire mi tort´ ¨ A kovetkez˝ o p´eld´aban e´ rdemes megfigyelni az esem´enykezel´est: 1
gulong g s i g n a l c o n n e c t (
gpointer c o n s t gchar GCallback gpointer
2 3 4
∗ object , ∗name , func , func data ) ;
¨ ¨ A gyakorlatban ´ıgy haszn´altuk – a v´egrehajtando´ fuggv´ eny hely´ebe a fuggv´ eny nev´et kell ´ırni, id´ez˝ojelek ¨ n´elkul: 1
g signal connect (
2 3 4
G OBJECT ( mutato objektumra ) , ”esemeny neve , p l : c l i c k e d ” G CALLBACK( vegrehajtando fuggveny ) , ” szoveges parameter a v e g r e h a j t a n d o fuggvenynek ”
¨ ´ A harmadik param´eterben meghat´arozott vegrehajtando_fuggveny a kovetkez˝ o form´aju: 1 2 3 4 5 6 7 8 9
GtkWidget ∗ widget , gpointer callback data ) ; /∗∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗ FONTOS : a masodik parameter l e h e t NULL, ∗ ha semmit nem akarunk atadni , l e h e t mutato , ∗ s z o v e g e t t a r t a l m a z o tombre vagy egy f e l u l e t −elemre . ∗ de ha szamot , vagy akar egy fuggvenyt akarunk atadni , ∗ az i s l e h e t ! Barmi amire mutatni tudunk ! : − ) ) ∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗∗/ void vegrehajtando fuggveny (
¨ ¨ Ez az a fuggv´ eny, ami a clicked esem´eny hat´as´ara lefut. A fuggv´ eny els˝o param´etere a jelz´est kibocs´ajto´ ´ a m´asodik pedig a fuggv´ ¨ ¨ elem mutatoja, enynek a´ tadott adat. Ez egy a´ ltal´anos fuggv´ enyforma - van n´eh´any ¨ ¨ olyan felulet-elem, amely ett˝ol elt´er˝o fuggv´ enyh´ıv´asi form´at ig´enyel. A helloworld programban a fentiekt˝ol elt´er˝o szign´alkezel´est l´athatunk: 1 2 3 4
gulong g s i g n a l c o n n e c t s w a p p e d ( g p o i n t e r ∗ objektum , c o n s t gchar ∗nev , GCallback fuggveny , gpointer ∗ kapcsolodo objektum ) ; ¨ ¨ Ez ugyanarra valo´ mint a g_signal_connect(), csak a fuggv´ eny egy GTK felulet-elem objektumot kap ¨ param´eterul. ¨ ¨ ¨ onb ¨ oz˝ ¨ o sz´amu´ Mi´ert van k´et fuggv´ eny ugyanarra a feladatra? Hogy lehet˝os´eg legyen a fuggv´ enyeket kul ¨ ´ v´arnak/fogadnak param´eterrel megh´ıvni. A GTK fuggv´ enyek egy r´esze csak egy egyszeru˝ GtkWidget mutatot el param´eterk´ent – ezekhez haszn´alhato´ a g_signal_connect_swapped(), amivel a k´ıv´ant adatokat a ¨ c´elfuggv´ enyhez eljuttathatod. A ford´ıto´ megjegyz´ese: ¨ ¨ ¨ • Andrew Krause konyve 38. oldal´an m´ast ´ır err˝ol a fuggv´ enyr˝ol: a swapped fuggv´ eny felcser´eli a szign´alt ´ o´ fuggv´ ¨ kiv´alto´ objektum e´ s az adat param´eter sorrendj´et a jelz´eshez kapcsolod eny futtat´asakor. ¨ param´eter a´ tad´as´anak probl´em´aj´at egyenl˝ore csak glob´alis v´altozok ´ haszn´alat´aval tudtam meg• A tobb ¨ kerulni, ami nem ide´alis megold´as, de egyenl˝ore nem tudok jobbat. 2.4.1.
Fontos gyakorlati p´elda
´ aban van egy nagyon e´ rdekes r´eszlet: a szign´al figyel´es´enek be´all´ıt´asakor A l´eptet˝omez˝ok (spin buttons) forr´askodj´ ¨ ´ at adja a´ t: negyedik param´eterk´ent egy l´eptet˝omez˝o felulet-elem mutatoj´ 1 2 3
/∗ parameterek magyarazata : ∗ − mutato objektumra , ∗ − f i g y e l t esemeny neve , i t t : value changed
12
∗ − esemeny b e k o v e t k e z t e k o r v e g r e h a j t a n d o fuggveny neve : c h a n g e d i g i t s ∗ − egy a t a d h a t o parameter fuggvenynek , i t t egy leptetomezo mutatoja ∗ ∗/ g s i g n a l c o n n e c t ( G OBJECT ( a d j ) , ” value changed ” , G CALLBACK ( c h a n g e d i g i t s ) , /∗ j e l z e s r e l e f u t o fuggveny neve
4 5 6 7 8
∗/ ( gpointer ) spinner2 ) ;
9
/∗ az a d o t t programban mutato egy l e p t e t o m e z o r e
´ kot ¨ otts´ ¨ egk´ent tekintettem, pedig nem Ezt az´ert emeltem ki, mert eddig a ford´ıt´as sor´an erre a mutatora ¨ az. Hiszen b´armire mutathatunk – ak´ar egy sz´amot vagy egy fuggv´ enyt – b´armit a´ tadhatunk amire mutatni tudunk. ¨ ¨ ott, ¨ de ´ıgy a kot ¨ otts´ ¨ eget egy kicsit szabads´agg´a A szign´al kibocs´ajt´asakor lefuto´ fuggv´ eny param´eterez´ese kot lehet alak´ıtani.
2.5.
Esem´enyek
¨ ¨ Az esem´eny-k´eszletek az X esem´enymechanizmus´at kovetik – az esem´enyekhez azokat kezel˝o fuggv´ enyek ´ kapcsolhatok: event button_press_event button_release_event scroll_event motion_notify_event delete_event destroy_event expose_event key_press_event key_release_event enter_notify_event leave_notify_event configure_event focus_in_event focus_out_event map_event unmap_event property_notify_event selection_clear_event selection_request_event selection_notify_event proximity_in_event proximity_out_event visibility_notify_event client_event no_expose_event window_state_event ¨ A fentebb le´ırt g_signal_connect() fuggv´ eny haszn´alat´aval kapcsolhatsz ezekhez az esem´enyekhez ¨ ´ elt´er˝o viszont a kezel˝o kezel˝o fuggv´ enyt, az esem´eny nev´et megadva a name param´etern´el. A szign´alok´etol ¨ fuggv´ eny form´aja: 1 2 3
g i n t c a l l b a c k f u n c ( GtkWidget ∗ widget , GdkEvent ∗ event , gpointer callback data ) ; ´ ¨ ¨ A GdkEvent egy C union struktura, melynek t´ıpusa fugg a bekovetkezett esem´enyt˝ol. Egy jelz´es fi¨ esem´enyt´ıpus is kiv´althatja. P´eld´aul a button-press-event gyel´esekor e´ rdemes tudni, hogy a jelz´est tobb szign´alt a GDK_BUTTON_PRESS, a GDK_2BUTTON_PRESS e´ s a GDK_3BUTTON_PRESS esem´enyt´ıpus is kiadhatja. (forr´as: Krause) Minden lehets´eges esem´enyt´ıpusnak van egy type adattagja, amelyb˝ol megtudhatjuk hogy az esem´eny honnan sz´armazik. Esem´eny t´ıpusok: GDK_NOTHING GDK_DELETE 13
GDK_DESTROY GDK_EXPOSE GDK_MOTION_NOTIFY GDK_BUTTON_PRESS GDK_2BUTTON_PRESS GDK_3BUTTON_PRESS GDK_BUTTON_RELEASE GDK_KEY_PRESS GDK_KEY_RELEASE GDK_ENTER_NOTIFY GDK_LEAVE_NOTIFY GDK_FOCUS_CHANGE GDK_CONFIGURE GDK_MAP GDK_UNMAP GDK_PROPERTY_NOTIFY GDK_SELECTION_CLEAR GDK_SELECTION_REQUEST GDK_SELECTION_NOTIFY GDK_PROXIMITY_IN GDK_PROXIMITY_OUT GDK_DRAG_ENTER GDK_DRAG_LEAVE GDK_DRAG_MOTION GDK_DRAG_STATUS GDK_DROP_START GDK_DROP_FINISHED GDK_CLIENT_EVENT GDK_VISIBILITY_NOTIFY GDK_NO_EXPOSE GDK_SCROLL GDK_WINDOW_STATE GDK_SETTING ¨ P´elda – az el˝obbi esem´enyekhez ´ıgy kapcsolhatsz figyel˝o fuggv´ enyt: 1 2
g s i g n a l c o n n e c t ( G OBJECT ( button ) , ” b u t t o n p r e s s e v e n t ” , G CALLBACK ( g o m b o t l e n y o m t a k e z t c s i n a l d ) , NULL ) ; ´ van szo. ´ Ez felt´etelezi hogy egy button (gomb) -rol ¨ ´ Ha az eg´ergombot lenyomod a gomb felett, a gombot_lenyomtak_ezt_csinald() fuggv´ eny h´ıvodik ´ meg, melynek ez a deklar´acioja:
1 2 3
s t a t i c g i n t g o m b o t l e n y o m t a k e z t c s i n a l d ( GtkWidget ∗ f e l u l e t −elemre−mutato , GdkEventButton ∗esemeny , gpointer adat ) ; ´ A m´asodik param´etert az´ert deklar´alhattuk GdkEventButton t´ıpusunak, mert tudtuk hogy milyen t´ıpusu´ ¨ esem´eny okozta a fuggv´ eny h´ıv´as´at. A visszat´er´esi e´ rt´eknek hat´asa van arra, hogy a GTK esem´enykezel˝o elj´ar´asa mit kezd a k´es˝obbiekben ´ oli ´ bekovetkez´ ¨ az adott esem´eny ujb es´evel. A TRUE (igaz) visszat´er´esi e´ rt´ek az esem´eny rendben lezajlott ´ kezel´es´et jelenti, FALSE eset´en a norm´alis esem´enykezel´es folytatodik. Az oktato´ v´eg´en tal´alhato´ egy le´ır´as az Esem´ enykezel´ es ´ es a szign´ alok tov´abbi r´eszleteir˝ol. A Gd´ a fuggel´ ¨ ´ kEvent adatt´ıpusokrol ekben tal´alhato´ tov´abbi inform´acio. A GDK kiv´alaszt´as e´ s a ’fogd e´ s vidd’ (drag and drop) API-nak szint´en vannak esem´enyei, melyek a GTK¨ e´ rz´ekelhet˝ok. N´ezd meg a kibocs´ajto´ e´ s a figyel˝o elem szign´aljainak le´ır´as´at, hogy ban szign´alokon keresztul ¨ ¨ a kovetkez˝ o szign´alokhoz kezel˝o fuggv´ enyt ´ırhass:
1 2 3 4 5 6 7
selection received selection get drag begin event drag end event drag data delete drag motion drag drop 14
8 9
drag data get drag data received
2.6.
A Hello world (egyszeru) ˝ l´ep´esenk´enti ismertet´ese
A szign´alok e´ s esem´enyek elm´elete ut´an l´assuk a helloworld program r´eszleteit! ´ A program forr´askodja nagyon r´eszletesen kommentezett, - n´ezd meg k´erlek - itt az e´ rdekesebb r´eszeket ¨ meg. besz´eljuk 1 2 3 4 5 6 7
g i n t d e l e t e e v e n t ( GtkWidget ∗ widget , GdkEvent ∗ event , gpointer data ) { g p r i n t ( ” d e l e t e event occurred \n” ) ; r e t u r n TRUE ; } ¨ es esem´eny) esem´enyr˝ol az ablakkezel˝o e´ rtes´ıti a programot - e´ s eldonthetj ¨ ¨ A delete_event() (torl´ uk, ¨ ¨ hagyhatjuk – felhaszn´aloi ´ interakciot ´ kezdem´enyezhetunk ¨ hogy ekkor mit teszunk. Figyelmen k´ıvul (biztos ˝ ¨ ki akarsz l´epni? :-) – vagy ak´ar egyszeruen bez´arhatjuk az alkalmaz´ast. A fuggv´ eny visszat´er´esi e´ rt´ek´et˝ol ¨ ¨ fugg, hogy a GTK mit tesz. Ha TRUE-t adunk vissza, akkor nem akarjuk a programunk fut´as´at felfuggeszteni, ¨ enk hogy a destroy szign´al kiad´asra kerulj ¨ on ¨ e´ s a futo´ program meg´alljon. elkeruln´ ´ a destroy jelz´es kiad´as´at k´erjuk, ¨ e´ s lefut az ezt figyel˝o fuggv´ ¨ Ha a visszat´er´esi e´ rt´ek FALSE, a GTK-tol eny (ha az adott programban be´all´ıtottuk). ¨ Van m´eg egy fuggv´ eny amelyik a program bez´ar´as´ahoz vezet, ez pedig a gtk_main_quit() h´ıv´asa. Ezt az el˝obb eml´ıtett destroy-t defini´aljuk:
1 2 3 4 5
void d e s t r o y ( GtkWidget ∗ widget , gpointer data ) { gtk main quit ( ) ; } ´ ¨ Mint minden m´as C programban, a GTK-t haszn´alokban is lennie kell egy main() fuggv´ enynek. Ezek ´ ¨ ut´an GtkWidget t´ıpusu´ mutatokat deklar´alunk, melyek ablak e´ s gomb feluletelemekre mutatnak majd:
1 2
GtkWidget ∗window ; GtkWidget ∗ button ; ¨ ¨ eszletet inicializ´alja, a parancsEzut´an kovetkezik a gtk_init (&argc, &argv);. Ez a GTK eszkozk´ ´ kapott esetleges param´etereket e´ rtelmezi (befoly´asolhato´ a GTK program fut´asa ind´ıt´askor megadott sorbol ´ azt a list´abol ´ kiveszi, e´ s a param´eterek param´eterekkel). Ha olyan param´etert tal´al, amely a GTK-nak szol, ´ ´ o´ param´eterek megmaradnak, sz´am´at modos´ ıtja, mintha a param´eter ott sem lett volna. A nem GTK-nak szol ´ ezut´an feldolgozhatok. ´ a programbol ´ ablakot k´esz´ıtunk: ¨ Ezut´an uj
1
window = gtk window new (GTK WINDOW TOPLEVEL ) ; ´ ¨ enik a GtkWidget *window struktur´ ´ anak (ezentul ´ egy l´etez˝o struktur´ ´ ara mutat). Memoriafoglal´ as tort´ ¨ egy m´eg nem l´atszod ´ o´ ablak, amit rendszerint a GTK programunk v´ege fel´e elhelyezett L´etrejon ¨ gtk_widget_show(window) utas´ıt´assal jelen´ıtunk meg. ¨ Kovetkezz´ ek k´et p´elda, melyekkel egy objektumhoz egy szign´al kezel˝ot kapcsolhatunk – jelen esetben egy ¨ ablakhoz. A delete_event e´ s a destroy szign´alokat fogjuk figyelni. Az els˝o esem´eny akkor kovetkezik be, ¨ amikor az ablakkezel˝o rendszerrel akarjuk az ablakot megszuntetni, vagy megh´ıvjuk a gtk_widget_destroy() ¨ ¨ sor, ha a delete_event fuggv´ enyt az ablak objektummal. A destroy szign´al kibocs´ajt´as´ara akkor kerul ¨ esem´enyt kezel˝o fuggv´ enyb˝ol FALSE a visszat´er´esi e´ rt´ek. A G_OBJECT, G_CALLBACK egy-egy makro´ ame´ olvashatobb´ ´ a t´etel´eben van lyek t´ıpusk´enyszer´ıt´est (´es a programozo´ ellen˝orz´es´et) v´egeznek, illetve a kod ¨ szerepuk:
1 2 3 4
g s i g n a l c o n n e c t ( G OBJECT ( window ) , ” d e l e t e e v e n t ” , G CALLBACK ( d e l e t e e v e n t ) , NULL ) ; g s i g n a l c o n n e c t ( G OBJECT ( window ) , ” d e s t r o y ” , G CALLBACK ( d e s t r o y ) , NULL ) ; ¨ ¨ ´ ´ at a´ ll´ıtja be 10 pixel sz´elesre, ez A kovetkez˝ o fuggv´ eny az ablak (t´arolo-containter) objektum bels˝o margoj´ ¨ o minden elem az ablak sz´el´et˝ol minimum 10pixel t´avols´agra lesz: azt jelenti hogy az ablakba kerul˝
15
1
g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( window ) , 1 0 ) ; ¨ Vannak m´eg ehhez hasonlo´ – megjelen´est szab´alyozo´ – fuggv´ enyek, melyek r´eszletesebb ismertet´es´et a ¨ ¨ ¨ Feluletelemek tulajdons´againak be´all´ıt´as´an´al n´ezunk majd meg. A fenti fuggv´ enyben a GTK_CONTAINER() ´ amely t´ıpus k´enyszer´ıt´est v´egez. egy makro, ¨ ¨ ´ gombot k´esz´ıtunk: ¨ A kovetkez˝ o fuggv´ ennyel egy uj
1
button = g t k b u t t o n n e w w i t h l a b e l ( ” S z i a Vilag , ez egy egyszeru GTK program ! ” ) ; ¨ ´ ¨ ´ GtkWidget struktur´ ´ anak a memori´ ´ aban, inicializ´alja azt, e´ s A fuggv´ eny memoriater uletet rendel az uj ´ a memoriater ´ ¨ ¨ visszaad egy gomb-mutatot ulet kezd˝oc´ım´evel. A gomb "clicked" jelz´es´et k´et fuggv´ eny is ¨ ozl˝ ¨ oszoveget ¨ ´ırja ki a standard outputra, a m´asik pedig kil´ep a programbol. ´ figyelni fogja. Az els˝o az udv g s i g n a l c o n n e c t ( G OBJECT ( button ) , ” c l i c k e d ” , G CALLBACK ( h e l l o ) , NULL ) ;
1 2
´ a hello() fuggv´ ¨ Igy enyt a "clicked" szign´alhoz kapcsoltuk. Mivel param´etert nem akarunk a´ tadni a ¨ ¨ fuggv´ enynek, de az v´ar egyet – ez´ert a lehets´eges param´eter hely´ere NULL kerul. ´ ıtjuk meg: A kil´ep´est szint´en a "clicked" figyel´es´evel valos´ g s i g n a l c o n n e c t s w a p p e d ( G OBJECT ( button ) , ” c l i c k e d ” , G CALLBACK ( g t k w i d g e t d e s t r o y ) , G OBJECT ( window ) ) ;
1 2 3
¨ ´ sz´armazhat. A "destroy" szign´al vagy az ablakkezel˝o felulett˝ ol (window manager), vagy a programunktol ¨ ´ a "clicked" helz´eshez kapcsoljuk az ablak bez´ar´as´at. A jelz´est A kovetkez˝ o utas´ıt´assal a fentihez hasonloan ¨ figyel˝o fuggv´ enyek sorrendben futnak le, teh´at el˝obb a hello(), majd a gtk_widget_destroy(). Egy ¨ ´ ´ as sorrendj´eben. Mivel a jelz´eshez ak´arh´any figyel˝o fuggv´ enyt kapcsolhatsz, mind v´egrehajtodik a kapcsolod´ ¨ gtk_widget_destroy() fuggv´ eny csak GtkWidget *widget-et fogad el param´eterk´ent, a ¨ g_signal_connect_swapped() fuggv´ enyt haszn´aljuk a g_signal_connect() helyett. ¨ ¨ ¨ ¨ A kovetkez˝ o fuggv´ eny a gomb ablakba helyez´es´ere szolg´al – ezt a fuggv´ enyt´ıpust r´eszletesebben a Felulet¨ elemek pozicion´al´asa, elrendez´ese e´ s csoportos´ıt´asa c. fejezetben t´argyaljuk. A fuggv´ eny jelzi a GTK sz´am´ara, ¨ lesz elhelyezve. hogy a gomb az ablakon belul 1
g t k c o n t a i n e r a d d (GTK CONTAINER ( window ) , button ) ; ¨ A GTK CONTAINER egyszerre egy felulet elemet tartalmazhat – vagyis jelen esetben az ablakba nem he¨ ¨ ¨ lyezhetunk k´et gombot. K´es˝obb megismerunk majd olyan elrendez˝o elemeket, melyekkel egym´as mell´e tobb ¨ ¨ feluletelemet is elhelyezhetunk. ¨ ¨ az ablakban – ezeA p´eldaprogram minden szign´al-kezel˝o fuggv´ eny´et defini´altuk, a gombot elhelyeztuk ¨ a GTK-t, hogy a l´etrehozott ablakot e´ s gombot jelen´ıtse meg. Mivel az ablakot jelen´ıtjuk ¨ meg kut´an megk´erjuk utolj´ara, az ablak e´ s a gomb egyszerre jelenik meg. Ha a programban el˝obb az ablakot jelen´ıten´enk meg, majd ¨ ut´ana a gombot, akkor a felhaszn´alo´ ezt l´atn´a, vagyis el˝obb az ures ablak jelenne meg, majd benne a gomb. Na¨ felulet ¨ elem van, gombok, menuk ¨ – az ablakot szokt´ak utolj´ara megjelen´ıteni, gyobb programokn´al – ahol tobb ´ egy k´esz felulet ¨ fogadja, ne egy a´ talakulo: ´ hogy a felhaszn´alot
1 2
gtk widget show ( button ) ; gtk widget show ( window ) ; ¨ A program v´eg´en a gtk_main() fuggv´ enyt meg kell h´ıvjuk, hogy v´arakozz´ek az X szervert˝ol e´ rkez˝o ¨ esem´enyekre, e´ s az esem´eny hat´as´ara a megfelel˝o szign´alt az adott feluletelem kibocs´ajtsa. ¨ a vez´erl´es, ha a gtk_quit() fuggv´ ¨ A programunkat return(0) utas´ıt´assal z´arjuk. Ide akkor kerul eny ¨ megh´ıv´asra kerul. ¨ Ha a programot futtatjuk e´ s a gombra klikkelunk, a gomb egy clicked szign´alt bocs´ajt ki. Ennek hat´as´ara ¨ a hello() fuggv´ ¨ el˝oszor eny fut le NULL argumentummal, majd a gtk_widget_destroy() mely megsemmisitesre a window elemet kapta. Ennek hat´as´ara a window fog kibocs´ajtani egy "destroy" szign´alt, amely ¨ ´ a destroy() fuggv´ enyt h´ıvja meg, ami kil´ep a GTK-bol. Egy m´asik lehet˝os´eg az ablak bez´ar´as´ara az ablakkezel˝o rendszer haszn´alata. Ez egy delete_event ¨ esem´enyt v´alt ki, ami – ha defini´altuk – az ezt figyel˝o fuggv´ enyt futtatja le. Ha a figyel˝o TRUE e´ rt´ekkel t´er ¨ enik semmi. Ha FALSE a visszaadott e´ rt´ek, a GTK egy destroy jelz´est ad ki, amelynek fivissza, nem tort´ ¨ ´ gyel˝o fuggv´ enye kil´ep a GTK-bol.
2.7.
A szign´alkezelo˝ fuggv´ ¨ enyekrol ˝ bovebben ˝
´ ¨ Erdemes megfigyelni, hogy a gulong g_signal_connect() fuggv´ enynek gulong a visszat´er´esi t´ıpusa. Ez ¨ azonos´ıtja a szign´alkezel˝o fuggv´ enyeket. Mikor l´etrehozod a szign´alkezel˝oket, azok a l´etrehoz´as sorrendj´eben ¨ ¨ egy list´aba kerulnek, e´ s ilyen sorrendben is futnak le. Ha egy szign´alkezel˝o fuggv´ enyt ki akarsz venni a ´ ´ıgy teheted meg: list´abol, 16
1 2
void g s i g n a l h a n d l e r d i s c o n n e c t ( g p o i n t e r o b j e c t , gulong id ) ; ¨ ´ ami a szign´alt kibocs´ajtja, a m´asodik a signal_connect() Az els˝o param´eter annak a feluletelemnek a mutatoja, ´ a´ ltal visszaadott gulong t´ıpusu´ azonos´ıto. ˝ od´ ¨ es´enek a´ tmeneti ki-be kapcsol´as´ara is, a g_signal_handler_block() Lehet˝os´eg van a szign´alfigyel˝ok muk ¨ e´ s g_signal_handler_unblock() fuggv´ enyekkel:
1
void g s i g n a l h a n d l e r b l o c k (
2
gpointer object , gulong id ) ;
3 4
void g s i g n a l h a n d l e r s b l o c k b y f u n c (
5 6
gpointer object , GCallback func , g p o i n t e r data ) ;
7 8
void g s i g n a l h a n d l e r u n b l o c k (
9
gpointer object , gulong id ) ;
10 11 12 13
void g s i g n a l h a n d l e r s u n b l o c k b y f u n c ( g p o i n t e r o b j e c t , GCallback func , g p o i n t e r data ) ;
3.
Felulet-elemek ¨ pozicion´al´asa, elrendez´ese e´ s csoportos´ıt´asa
3.1.
A dobozok muk ˝ od´ ¨ ese
´ felulet ¨ elemeinek elrendez´es´et a dobozokkal valos´ ´ ıthatjuk meg. A dobozok hasonloak ´ egy ures ¨ A felhaszn´aloi ¨ ¨ ¨ a f˝o rakod´asi teruleteket. ¨ konyvesszekr´ enyhez, mely ures ugyan, viszont a szekr´eny polcai kijelolik ¨ oleges fajt´aja l´etezik. Amikor a v´ızszintesbe pakolsz, az elemek sorban A dobozoknak v´ızszintes e´ s fugg˝ ´ jobbra (vagy jobbrol ´ balra, be´all´ıt´astol ´ fugg˝ ¨ oen). A fugg˝ ¨ oleges dobozba egym´as ut´an helyezkednek el balrol ´ epp fentr˝ol lefel´e vagy lentr˝ol felfel´e lehet elemeket pakolni. hasonlok´ ¨ ¨ A dobozokat tetsz˝olegesen egym´asba a´ gyazhatod, ´ıgy osszetett felulet-szerkezeteket alak´ıthatsz ki. ´ v´ızszintes dobozt a gtk_hbox_new() fuggv´ ¨ ¨ olegest a gtk_vbox_new() fuggv´ ¨ Uj ennyel, fugg˝ ennyel hoz¨ hatsz l´etre. A dobozba elemeket a gtk_box_pack_start() e´ s a gtk_box_pack_end() fuggv´ enyekkel he¨ ´ jobbra, fugg˝ ¨ oleges eset´eben fentr˝ol lefel´e helyezi lyezhetsz. A start fuggv´ eny v´ızszintes doboz eset´eben balrol el az elemeket, az end pedig pont ellenkez˝ok´epp.
3.2.
A kont´enerekrol ˝ r´eszletesebben
¨ ¨ bonyolultnak e´ s neh´ezkesnek tunhet. ˝ A tobbf´ ele lehet˝os´eg miatt a dobozok haszn´alata a GTK-ban el˝oszor Sokf´ele be´all´ıt´asi lehet˝os´eg van, e´ s nem mindig k´ezenfekv˝o hogy ezek egym´assal milyen kapcsolatban vannak, ¨ haszn´alni. hogy lehet o˝ ket egyutt ¨ fajta elhelyez´esi st´ılus van. A kovetkez˝ ¨ ¨ Alapvet˝oen ot o h´arom k´epeken olvassuk ossze a gombokon l´ev˝o ¨ be´all´ıt´asokat, hasonl´ıtsuk ossze a gombok helyzet´et egym´ashoz k´epest!
¨ gombok tal´alhatok. ´ Minden sor egy v´ızszintes dobozt (hbox) tartalmaz, azon belul 17
´ Fontos: homog´en - egys´eges. Az elemek elrendez´esekor ha a homog´en-t TRUE-nak a´ ll´ıtjuk, az elemek ugy ˝ lenn´enek - egyenletesen elosztva. lesznek pozicion´alva, mintha egyenl˝o m´eretuek ´ dobozt ´ıgy hozunk l´etre: Uj 1
void gtk hbox new (
2
gboolean gint
azonos meretuek homogenek , t er k o z −s p a c i n g );
¨ hogy a dobozba tett minden elem m´erete Az azonos_meretuek param´eterrel egy be´all´ıt´assal el´erhetjuk, egyenl˝o legyen - hboxn´al a sz´eless´eg, vbox-n´al a magass´ag. ¨ ¨ enik: Az elemek bepakol´asa a dobozba ezzel a fuggv´ ennyel tort´ 1
void g t k b o x p a c k s t a r t (
2 3 4 5 6
GtkBox GtkWidget gboolean gboolean guint );
∗box , ∗ child , expand , fill , padding
Az els˝o param´eter az a doboz, amibe pakolunk, a m´asodik a pakolt objektum - jelen esetben egy gomb. ´ ¨ es) param´eter a gtk_box_pack_start() e´ s a gtk_box_pack_end() -n´el is a Az expand (poz´ıcio-kit olt´ ¨ ´ ag) kitolt´ ¨ es´et szab´alyozza - ha TRUE, akkor a bedobozban l´ev˝o teruleten valo´ egyenletes elhelyez´es (elszorts´ ¨ ¨ rakott elem a rendelkez´esre a´ llo´ t´erben egyenletesen helyezkedik el, m´ıg FALSE eset´en az elemek kozvetlen ul egym´as ut´an helyezkednek el. ´ ¨ es be´all´ıt´asa FALSE, lehet˝os´eg ny´ılik a dobozban l´ev˝o elemek igaz´ıt´as´ara - hiszen ekkor Ha a poz´ıcio-kit olt´ ´ ınuleg ˝ ¨ ¨ ott, ¨ azok nem toltik ¨ valosz´ lesz valamennyi ures hely az elemek koz ki teljesen a rendelkez´esre a´ llo´ helyet. ¨ ¨ Fill param´eternek csak akkor van hat´asa, ha az expand e´ rt´eke TRUE (vagyis az elemeket nem kozvetlen ul ´ helyeztuk ¨ el). Ha a Fill is TRUE, a gombok egym´as mell´e, hanem valamilyen egyenletes t´avols´agra egym´astol ¨ m´erete egyenl˝o lesz - ha nem, a gombok m´eret´et a rajtuk l´ev˝o szoveg hat´arozza meg. ¨ otti ¨ kul ¨ onbs´ ¨ ¨ uli ¨ margot ´ szab´alyozza - ez eleA padding e´ s a spacing koz eg: a padding az adott elem kor ¨ ott ¨ legal´abb ennyi helyet menk´ent elt´er˝o lehet - a spacing pedig a doboz tulajdons´aga, e´ s minden elem koz hagy ki. ¨ ¨ meg hogy a param´eterek megv´altoztat´as´anak milyen hat´asa van: A kovetkez˝ o k´epen figyeljuk
1 2
# i n c l u d e < s t d i o . h> # i n c l u d e < s t d l i b . h> 18
3
# i n c l u d e ” g t k / g t k . h”
4 5 6 7 8 9 10 11
g i n t d e l e t e e v e n t ( GtkWidget ∗ widget , GdkEvent ∗ event , gpointer data ) { gtk main quit ( ) ; r e t u r n FALSE ; }
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
/∗ u j hbox k e s z i t e s e , gombokkal f e l t o l t v e , a k a p o t t ∗ paramterek s z e r i n t b e a l l i t v a . ∗ A dobozt nem t e s s z u k l a t h a t o v a , de a t a r t a l m a t igen . ∗/ GtkWidget ∗make box ( gboolean homogeneous , /∗ Elemek e l h e l y e z e s e : mintha mind egyforma nagy lenne ? ∗/ gint spacing , /∗ s p a c i n g : elemek k o z o t t i min . t a v o l s a g ∗/ gboolean expand , /∗ expand : hely−k i t o l t e s ? ∗/ gboolean f i l l , /∗ f i l l : gombmeret n o v e l e s e egyenmeretig ? ∗/ guint padding ) /∗ padding : egy elem k o r u l i margomeret ∗/ { GtkWidget ∗box ; GtkWidget ∗ button ; char p a d s t r [ 8 0 ] ;
27 28 29 30 31 32 33 34 35
/∗ Uj hbox k e s z i t e s e , a l t a l a n o s b e a l l i t a s o k k a l es h e l y k i t o l t e s s e l ∗ ha a homogeneous TRUE, akkor a dobozban l e v o elemek ( p l . gombok ) ∗ e l h e l y e z e s e olyan , mintha mind egyforma nagysagu lenne , pedig e s e t l e g ∗ a g y a k o r l a t b a n k i s e b b e k i s vannak − ∗ ez olyan , mintha a g t k b o x p a c k () − ban ∗ az expand mindig TRUE lenne ∗ ∗/ box = gtk hbox new ( homogeneous , s p a c i n g ) ;
36 37 38 39 40
/∗ Gombok b e s z u r a s a ugyanazon b e a l l i t a s o k k a l ∗/ button = g t k b u t t o n n e w w i t h l a b e l ( ” g t k b o x p a c k ” ) ; g t k b o x p a c k s t a r t (GTK BOX ( box ) , button , expand , f i l l , padding ) ; gtk widget show ( button ) ;
41 42 43 44
button = g t k b u t t o n n e w w i t h l a b e l ( ” ( box , ” ) ; g t k b o x p a c k s t a r t (GTK BOX ( box ) , button , expand , f i l l , padding ) ; gtk widget show ( button ) ;
45 46 47 48
button = g t k b u t t o n n e w w i t h l a b e l ( ” button , ” ) ; g t k b o x p a c k s t a r t (GTK BOX ( box ) , button , expand , f i l l , padding ) ; gtk widget show ( button ) ;
49 50 51 52 53 54 55
/∗ Expand ( p o z i c i o −k i t o l t e s ) e r t e k e n e k m e g f e l e l o e n ∗ s z u r j u k be a kovetkezo dobozt ∗/ i f ( expand == TRUE) button = g t k b u t t o n n e w w i t h l a b e l ( ”TRUE, ” ) ; else button = g t k b u t t o n n e w w i t h l a b e l ( ”FALSE , ” ) ;
56 57 58
g t k b o x p a c k s t a r t (GTK BOX ( box ) , button , expand , f i l l , padding ) ; gtk widget show ( button ) ;
59 60 61 62 63
/∗ L o g i k a i l a g a f e n t i v e l megegyezo kod , de tomorebb irasmoddal : ∗/ button = g t k b u t t o n n e w w i t h l a b e l ( f i l l ? ”TRUE, ” : ”FALSE , ” ) ; g t k b o x p a c k s t a r t (GTK BOX ( box ) , button , expand , f i l l , padding ) ; gtk widget show ( button ) ;
64
19
65
/∗ a padding e r t e k e t es egy formazo k a r a k t e r l a n c o t ∗ a padstr karakterlancba masolja ∗ ∗/ s p r i n t f ( padstr , ”%d ) ; ” , padding ) ;
66 67 68 69 70
/∗ u j gomb l e t r e h o z a s a , az e l o b b i s z o v e g g e l ∗/ button = g t k b u t t o n n e w w i t h l a b e l ( p a d s t r ) ; g t k b o x p a c k s t a r t (GTK BOX ( box ) , button , expand , f i l l , padding ) ; gtk widget show ( button ) ;
71 72 73 74 75
r e t u r n box ;
76 77
}
78 79 80 81 82 83 84 85 86 87 88 89 90
i n t main ( i n t argc , char ∗ argv [ ] ) { /∗ mutatok l e t r e h o z a s a , amit az objektumokhoz fogunk f e l h a s z n a l n i ∗/ GtkWidget ∗window ; GtkWidget ∗ button ; GtkWidget ∗ box1 ; GtkWidget ∗ box2 ; GtkWidget ∗ s e p a r a t o r ; GtkWidget ∗ l a b e l ; GtkWidget ∗ q u i t b o x ; i n t which ;
91 92 93
/∗ A k i h a g y h a t a t l a n i n i c i a l i z a l a s : ) ∗/ g t k i n i t (& argc , &argv ) ;
94 95 96 97 98 99
i f ( argc != 2) { f p r i n t f ( s t d e r r , ” igy hasznald : packbox szam , ahol a szam 1 , 2 , or 3 l e h e t . \ n” ) ; /∗ ha nem m e g f e l e l o szamu p a r a m e t e r r e l h i v t a k meg a programot , k i l e p e s ∗/ exit (1); }
100 101
which = a t o i ( argv [ 1 ] ) ;
102 103 104 105 106
/∗ Az alkalmazas ablakanak l e t r e h o z a s a , mutato e r t e k e t a b l a k memoria cimere a l l i t j u k ∗/ window = gtk window new (GTK WINDOW TOPLEVEL ) ; g t k w i n d o w s e t t i t l e (GTK WINDOW ( window ) , argv [ 1 ] ) ;
107 108 109 110 111 112 113
/∗ F i g y e l j oda , hogy a d e l e t e e v e n t s z i g n a l t mindig c s a t o l d a ∗ f o ablakhoz . Ez t e s z i l e h e t o v e a program b e f e j e z e s e t ha p l . a ∗ sarokban l e v o X−r e k l i k k e l s z − s z o v a l az a b l a k mukodesehez k e l l . ∗ ∗/ g s i g n a l c o n n e c t ( G OBJECT ( window ) , ” d e l e t e e v e n t ” , G CALLBACK ( d e l e t e e v e n t ) , NULL ) ;
114 115 116 117 118
/∗ ez a border egy b e l s o l a t h a t a t l a n margo inkabb − t a v o l s a g az ablakban l e v o elemek ∗ es az a b l a k k e r e t k o z o t t ∗/ g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( window ) , 1 0 ) ;
119 120 121 122 123 124 125 126
/∗ Most egy f u g g o l e g e s dobozt ( vbox ) c s i n a l u n k , ∗ amibe a v i z s z i n t e s dobozok kerulnek majd . ∗ ∗ Igy l e h e t o s e g van a gombokkal t e l i ∗ v i z s z i n t e s dobozokat egymas t e t e j e r e t e n n i . ∗/ box1 = gtk vbox new ( FALSE , 0 ) ; 20
127 128 129 130 131 132
/∗ v a l a s z t a s , melyik p e l d a t r a k j a k i a program . ∗/ s w i tc h ( which ) { case 1 : /∗ u j szoveges elem b e i l l e s z t e s e . ∗/ l a b e l = g t k l a b e l n e w ( ” gtk hbox new ( FALSE , 0 ) ; ” ) ;
133 134 135 136
/∗ A szoveges elemet b a l r a i g a z i t j u k . Ezt a fuggvenyt i s megnezzuk majd . ∗ az e le mt u la j do ns a go k − Widget A t t r i b u t e s −ek l e i r a s a b a n . ∗/ g t k m i s c s e t a l i g n m e n t ( GTK MISC ( l a b e l ) , 0 , 0 ) ;
137 138 139 140 141 142
/∗ a s z o v e g e t a box1 v e r t i k a l i s ( f u g g o l e g e s ) dobozba r a k j u k ∗ ha f u g g o l e g e s dobozba pakolunk , az elemek f e n t r o l l e f e l e sorrendben ∗ kerulnek b e i l l e s z t e s r e . ∗ ∗/ g t k b o x p a c k s t a r t (GTK BOX ( box1 ) , l a b e l , FALSE , FALSE , 0 ) ;
143 144 145
/∗ A s z o v e g e t l a t h a t o v a t e s s z u k gtk widget show ( l a b e l ) ;
∗/
146 147 148 149 150 151 152 153 154 155 156
/∗ A d o b o z k e s z i t o fuggveny h i v a s a . ∗ e l h e l y e z e s mintha azonos nagysaguak lennenek ∗ ( homogenek , a n g o l u l homogeneus ) = FALSE , ∗ sp a c i n g = 0 , ( dobozon b e l u l elemek minimum t a v o l s a g a ) ∗ expand = FALSE , ( egyenletes t e r b e l i elhelyezes ) ∗ f i l l = FALSE , ( dobozmeret egyenlo nagysagura n o v e l e s e ? ) ∗ padding = 0 ( a d o t t elem k o r u l i margo merete ) ∗/ box2 = make box ( FALSE , 0 , FALSE , FALSE , 0 ) ; g t k b o x p a c k s t a r t (GTK BOX ( box1 ) , box2 , FALSE , FALSE , 0 ) ; gtk widget show ( box2 ) ;
157 158 159 160 161 162
/∗ s z i n t e n dobozt c s i n a l u n k : homogeneous = FALSE , ∗ sp a c i n g = 0 , expand = TRUE, f i l l = FALSE , padding = 0 ∗/ box2 = make box ( FALSE , 0 , TRUE, FALSE , 0 ) ; g t k b o x p a c k s t a r t (GTK BOX ( box1 ) , box2 , FALSE , FALSE , 0 ) ; gtk widget show ( box2 ) ;
163 164 165 166 167
/∗ A parameterek j e l e n t e s e : homogeneous , spacing , expand , f i l l , padding ∗/ box2 = make box ( FALSE , 0 , TRUE, TRUE, 0 ) ; g t k b o x p a c k s t a r t (GTK BOX ( box1 ) , box2 , FALSE , FALSE , 0 ) ; gtk widget show ( box2 ) ;
168 169 170
/∗ E l v a l a s z t o e l e m e t k e s z i t u n k . v i z s z i n t e s vonal , t e r h a t a r o l o elem . ∗/ separator = gtk hseparator new ( ) ;
171 172 173 174 175 176 177
/∗ E l v a l a s z t o elemet rakunk a f u g g o l e g e s dobozba . ∗ Fontos , hogy a f u g g o l e g e s dobozba r a k o t t elemek ∗ a ber akas s o r r e n d j e b e n j e l e n n e k majd meg . ∗ ∗/ g t k b o x p a c k s t a r t (GTK BOX ( box1 ) , s e p a r a t o r , FALSE , TRUE, 5 ) ; gtk widget show ( s e p a r a t o r ) ;
178 179 180 181 182 183
/∗ Uj szovegelememet szurunk be es meg i s j e l e n i t j u k ∗/ l a b e l = g t k l a b e l n e w ( ” gtk hbox new (TRUE, 0 ) ; ” ) ; g t k m i s c s e t a l i g n m e n t ( GTK MISC ( l a b e l ) , 0 , 0 ) ; g t k b o x p a c k s t a r t (GTK BOX ( box1 ) , l a b e l , FALSE , FALSE , 0 ) ; gtk widget show ( l a b e l ) ;
184 185 186 187 188
/∗ parameterek : homogeneous , spacing , expand , f i l l , padding ∗/ box2 = make box (TRUE, 0 , TRUE, FALSE , 0 ) ; g t k b o x p a c k s t a r t (GTK BOX ( box1 ) , box2 , FALSE , FALSE , 0 ) ; gtk widget show ( box2 ) ; 21
189 190 191 192 193
/∗ parameterek : homogeneous , spacing , expand , f i l l , padding ∗/ box2 = make box (TRUE, 0 , TRUE, TRUE, 0 ) ; g t k b o x p a c k s t a r t (GTK BOX ( box1 ) , box2 , FALSE , FALSE , 0 ) ; gtk widget show ( box2 ) ;
194 195 196 197 198 199 200
/∗ Egy ujabb e l v a l a s z t o elem . ∗/ separator = gtk hseparator new ( ) ; /∗ A g t k b o x p a c k s t a r t u t o l s o harom parametere : ∗ expand , f i l l , padding . ∗/ g t k b o x p a c k s t a r t (GTK BOX ( box1 ) , s e p a r a t o r , FALSE , TRUE, 5 ) ; gtk widget show ( s e p a r a t o r ) ;
201 202
break ;
203 204
case 2 :
205 206 207 208 209 210 211 212
/∗ u j szoveg−elemet i l l e s z t u n k be − box1−e t a main ( ) kezdetekor mar ∗ l e t r e h o z t u k , ebbe fogunk p a k o l n i . ∗ ∗/ l a b e l = g t k l a b e l n e w ( ” gtk hbox new ( FALSE , 1 0 ) ; ” ) ; g t k m i s c s e t a l i g n m e n t ( GTK MISC ( l a b e l ) , 0 , 0 ) ; g t k b o x p a c k s t a r t (GTK BOX ( box1 ) , l a b e l , FALSE , FALSE , 0 ) ; gtk widget show ( l a b e l ) ;
213 214 215 216 217
/∗ parameterek : homogeneous , spacing , expand , f i l l , padding ∗/ box2 = make box ( FALSE , 1 0 , TRUE, FALSE , 0 ) ; g t k b o x p a c k s t a r t (GTK BOX ( box1 ) , box2 , FALSE , FALSE , 0 ) ; gtk widget show ( box2 ) ;
218 219 220 221 222
/∗ parameterek : homogeneous , spacing , expand , f i l l , padding ∗/ box2 = make box ( FALSE , 1 0 , TRUE, TRUE, 0 ) ; g t k b o x p a c k s t a r t (GTK BOX ( box1 ) , box2 , FALSE , FALSE , 0 ) ; gtk widget show ( box2 ) ;
223 224 225 226 227 228
separator = gtk hseparator new ( ) ; /∗ g t k b o x p a c k s t a r t u t o l s o harom parametere : ∗ expand , f i l l , padding . ∗/ g t k b o x p a c k s t a r t (GTK BOX ( box1 ) , s e p a r a t o r , FALSE , TRUE, 5 ) ; gtk widget show ( s e p a r a t o r ) ;
229 230 231 232 233
l a b e l = g t k l a b e l n e w ( ” gtk hbox new ( FALSE , 0 ) ; ” ) ; g t k m i s c s e t a l i g n m e n t ( GTK MISC ( l a b e l ) , 0 , 0 ) ; g t k b o x p a c k s t a r t (GTK BOX ( box1 ) , l a b e l , FALSE , FALSE , 0 ) ; gtk widget show ( l a b e l ) ;
234 235 236 237 238
/∗ parameterek : homogeneous , spacing , expand , f i l l , padding ∗/ box2 = make box ( FALSE , 0 , TRUE, FALSE , 1 0 ) ; g t k b o x p a c k s t a r t (GTK BOX ( box1 ) , box2 , FALSE , FALSE , 0 ) ; gtk widget show ( box2 ) ;
239 240 241 242 243
/∗ parameterek : homogeneous , spacing , expand , f i l l , padding ∗/ box2 = make box ( FALSE , 0 , TRUE, TRUE, 1 0 ) ; g t k b o x p a c k s t a r t (GTK BOX ( box1 ) , box2 , FALSE , FALSE , 0 ) ; gtk widget show ( box2 ) ;
244 245 246 247 248 249
separator = gtk hseparator new ( ) ; /∗ g t k b o x p a c k s t a r t u t o l s o harom parametere : expand , f i l l , padding . ∗/ g t k b o x p a c k s t a r t (GTK BOX ( box1 ) , s e p a r a t o r , FALSE , TRUE, 5 ) ; gtk widget show ( s e p a r a t o r ) ; break ;
250
22
251
case 3 :
252
/∗ Ez pedig a j o b b r a i g a z i t a s modjat f o g j a bemutatni , a ∗ g tk b ox p ac k e nd ( ) h a s z n a l a t a v a l . ∗ Mindenekelott u j dobozt hozunk l e t r e : ∗/ box2 = make box ( FALSE , 0 , FALSE , FALSE , 0 ) ;
253 254 255 256 257
/∗ Berakunk egy szovegelemet − a vegen fog megjelenni , v a g y i s j o b b r a i g a z i t v a . ∗/ l a b e l = g t k l a b e l n e w ( ”Vege” ) ; g tk b ox p ac k e nd (GTK BOX ( box2 ) , l a b e l , FALSE , FALSE , 0 ) ; /∗ A szovegelem m e g j e l e n i t e s e ∗/ gtk widget show ( l a b e l ) ;
258 259 260 261 262 263
/∗ az u j box2 dobozt b e l e r a k j u k box1−be : ) ∗/ g t k b o x p a c k s t a r t (GTK BOX ( box1 ) , box2 , FALSE , FALSE , 0 ) ; gtk widget show ( box2 ) ;
264 265 266 267
/∗ egy e l v a l a s z t o elem a l u l r a . ∗/ separator = gtk hseparator new ( ) ; /∗ A s z e p a r a t o r t pontosan 400 px s z e l e s s e g r e es 5px magassagra a l l i t j u k be ∗ Ebbol k i f o l y o l a g a v i z s z i n t e s doboz ( hbox ) s z i n t e n 400 p i x e l s z e l e s l e s z . ∗ es a Vege f e l i r a t e l k u l o n u l a hbox t o b b i e l e m e t o l . ∗ ha nem lenne a s z e p a r a t o r , a hbox−ba r a k o t t o s s z e s elem olyan k o z e l k e r u l n e ∗ egymashoz , amennyire csak l e h e t . ∗ Vagyis a 400px−es s z e p a r a t o r h a t a r o z z a meg az a b l a k s z e l e s s e g e t . ∗/ g t k w i d g e t s e t s i z e r e q u e s t ( separator , 400 , 5 ) ; /∗ a s z e p a r a t o r t a f u g g o l e g e s dobozba r a k j u k ∗/ g t k b o x p a c k s t a r t (GTK BOX ( box1 ) , s e p a r a t o r , FALSE , TRUE, 5 ) ; gtk widget show ( s e p a r a t o r ) ;
268 269 270 271 272 273 274 275 276 277 278 279 280 281
}
282 283 284
/∗ egy masik v i z s z i n t e s dobozt k e s z i t u n k ∗/ q u i t b o x = gtk hbox new ( FALSE , 0 ) ;
285 286 287
/∗ A k i l e p e s gomb ∗/ button = g t k b u t t o n n e w w i t h l a b e l ( ” K i l e p e s ” ) ;
288 289 290 291 292 293 294 295 296
/∗ A gomb lenyomasahoz r e n d e l j u k a program m e g s z a k i t a s a t ∗/ g s i g n a l c o n n e c t s w a p p e d ( G OBJECT ( button ) , ” c l i c k e d ” , G CALLBACK ( g t k m a i n q u i t ) , G OBJECT ( window ) ) ; /∗ a gombot a dobozba p a k o l j u k : ∗ g t k b o x p a c k s t a r t u t o l s o harom parametere : ∗ expand , f i l l , padding . ∗/ g t k b o x p a c k s t a r t (GTK BOX ( q u i t b o x ) , button , TRUE, FALSE , 0 ) ;
297 298 299
/∗ a k i l e p o gombot t a r t a l m a z o dobozt box1 f u g g o l e g e s dobozba r a k j u k ∗/ g t k b o x p a c k s t a r t (GTK BOX ( box1 ) , quitbox , FALSE , FALSE , 0 ) ;
300 301 302
/∗ A box1 f u g g o l e g e s dobozba mindent beleraktunk , e z e r t e z t a f o ablakba r a k j u k . ∗/ g t k c o n t a i n e r a d d (GTK CONTAINER ( window ) , box1 ) ;
303 304 305 306
/∗ es vegul mindent m e g j e l e n i t u n k ∗/ gtk widget show ( button ) ; gtk widget show ( q u i t b o x ) ;
307 308 309 310
gtk widget show ( box1 ) ; /∗ Mivel az a b l a k o t j e l e n i t j u k meg u t o l j a r a , minden elem e g y s z e r r e fog m e g j e l e n n i . ∗/ gtk widget show ( window ) ;
311 312
/∗ gtk main fuggvenye , v e g t e l e n c i k l u s , f e l h a s z n a l o i bemenetre var bekapcs . ∗/ 23
gtk main ( ) ;
313 314
/∗ a
315
g t k m a i n q u i t ( ) l e f u t a s a utan e z z e l a r e t u r n −e l kilepunk a programbol ∗/
316
return 0;
317 318
}
3.3.
T´abl´azatok haszn´alata
´ Az elemek elrendez´es´enek egy m´asik lehets´eges modja a t´abl´azat haszn´alata. A t´abl´azattal egy l´athatatlan r´acsszerkezetet hozhatunk l´etre - a cell´akba helyezett elemek az el˝ore meghat´arozott m´eretu˝ helyet foglalhatj´ak el. A t´abl´at ´ıgy hozunk l´etre: 1
GtkWidget ∗ g t k t a b l e n e w (
2 3
guint guint gboolean
rows , columns , homogeneous ) ;
Az els˝o param´eter a sorok, a m´asodik az oszlopok sz´am´at jelenti. A homog´en param´eter szab´alyozza a cell´ak ¨ m´eret´et. Ha TRUE, az osszes cella a legnagyobb beillesztett elem m´eret´ehez igazodik. FALSE eset´en egy cella magass´aga a sor´aban l´ev˝o legmagasabb elemhez, sz´eless´ege az oszlop´aban l´ev˝o legsz´elesebb elemhez igazodik. ¨ cell´at is a´ tfedhetnek. A GTK nem pontosan sorokban e´ s oszlopokban, hanem sorFontos: az elemek tobb e´ lben e´ s oszlop-´elben gondolkodik. L´assunk egy p´eld´at: 0 1 2 0+----------+----------+ | | | 1+----------+----------+ | | | 2+----------+----------+ ¨ cell´an a´ tnyul ´ o´ elem haszn´alat´ara: A t´abl´azat e´ lvonalai, e´ s p´elda tobb
Az e´ lszeru˝ gondolkod´ast az elemek behelyez´es´en´el haszn´alja, mert meghat´arozza hogy egy elem melyik e´ lt˝ol melyik e´ lig terjed. Az elemeket ´ıgy helyezheted a t´abl´azatba: 1 2 3 4 5 6 7 8 9 10
void g t k t a b l e a t t a c h ( GtkTable GtkWidget guint guint guint guint GtkAttachOptions GtkAttachOptions guint guint
∗ table , ∗ child , left attach , right attach , top attach , bottom attach , xoptions , yoptions , xpadding , ypadding ) ;
¨ A fuggv´ eny param´eterei: ´ amibe az elemet rakjuk • table: a t´abl´azat mutatoja, 24
´ • child: a t´abl´azatba helyezend˝o elem mutatoja • left attach: a beillesztend˝o elem melyik baloldali e´ ln´el kezd˝odik • right attach: a beillesztend˝o elem melyik jobboldali e´ ln´el v´egz˝odik • top attach: a beillesztend˝o elem melyik fels˝o e´ ln´el kezd˝odik • bottom attach: a beillesztend˝o elem melyik also´ e´ ln´el v´egz˝odik ¨ • xoptions: elem viselked´ese kornyezetv´ altoz´as eset´en ¨ • yoptions: elem viselked´ese kornyezetv´ altoz´as eset´en (pl. ablak´atm´eretez´es) ¨ uli ¨ v´ızszintes t´er pixelben • xpadding: elem kor ¨ uli ¨ fugg˝ ¨ oleges t´er pixelben • ypadding: elem kor Az xoptions
¨ on ¨ az X e´ s Y tengelyek ir´any´aba: yoptions e´ rt´ekekkel egyedi be´all´ıt´asokat lehet el´erni, kul
¨ a • GTK_FILL - ha a t´abla nagyobb a beillesztett elemn´el, e´ s a GTK_FILL-t be´all´ıtottad, az elem kitolti rendelkez´esre a´ llo´ helyet. ¨ ¨ egesn´el kevesebb • GTK_SHRINK - osszenyom´ as. Ha a felhaszn´alo´ p´eld´aul a´ tm´eretezi az ablakot, e´ s a szuks´ ˝ ¨ a t´abl´abol, ´ hanem belezsugorodik a rendelkez´esre hely a´ ll rendelkez´esre, az elem nem eltunik/kiker ul a´ llo´ helybe. ¨ • GTK_EXPAND - ha ezt be´all´ıtod, a t´abla fogja a rendelkez´es´ere a´ llo´ helyet kitolteni. ˝ ıtett h´ıv´asi form´aja is, amit Mivel a gtk_table_attach() -nak sok param´etere van, l´etezik egy egyszerus´ ¨ a p´eldaprogramban a gombok tobbs´ eg´en´el l´athatsz: 1 2 3 4 5 6
void g t k t a b l e a t t a c h d e f a u l t ( GtkTable GtkWidget guint guint guint guint
∗ table , ∗ child , left attach , right attach , top attach , bottom attach )
Az X, Y alap´ertelmezett e´ rt´eke GTK_FILL | GTK_EXPAND e´ s a padding e´ rt´eke mindk´et esetben 0. Az argumentumok jelent´ese ugyanaz, mint a b˝ovebb h´ıv´asi form´an´al. ¨ A p´eldaprogramban gomb2-n´el egyedi be´all´ıt´asokat haszn´altam, a tobbin´ el az alap´ertelmezettet.
25
1
# i n c l u d e
2 3 4 5 6 7 8
/∗ A standard kimenetre ez a fuggveny i r j a k i az a d a t o k a t . void k i i r ( GtkWidget ∗ widget , gpointer data ) { g p r i n t ( ” Szia , a k a p o t t adat : %s \n” , ( char ∗ ) data ) ; }
∗/
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
g i n t k i l e p e s a p r o g r a m b o l ( GtkWidget ∗ widget , GdkEvent ∗ event , gpointer data ) { gtk main quit ( ) ; r e t u r n FALSE ; } /∗∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗∗/ i n t main ( i n t argc , char ∗ argv [ ] ) { GtkWidget ∗window ; GtkWidget ∗ button ; GtkWidget ∗ t a b l e ;
25 26
g t k i n i t (& argc , &argv ) ;
27 28 29
/∗ Uj a b l a k l e t r e h o z a s a ∗/ window = gtk window new (GTK WINDOW TOPLEVEL ) ;
30 31 32
/∗ Ablak c i m f e l i r a t b e a l l i t a s a ∗/ g t k w i n d o w s e t t i t l e (GTK WINDOW ( window ) , ” Tabla t e s z t e l e s , bemutatas ” ) ;
33 34 35 36
/∗ d e l e t e e v e n t esemenyhez egy fuggveny b e a l l i t a s a ∗/ g s i g n a l c o n n e c t ( G OBJECT ( window ) , ” d e l e t e e v e n t ” , G CALLBACK ( k i l e p e s a p r o g r a m b o l ) , NULL ) ;
37 38 39
/∗ Ablak b e l s o margojanak b e a l l i t a s a ∗/ g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( window ) , 3 0 ) ;
40 41 42
/∗ Egy u j 5x4−es t a b l a ∗/ t a b l e = g t k t a b l e n e w ( 5 , 4 , TRUE ) ;
43 44 45
/∗ Tabla e l h e l y e z e s e a f o ablakban . ∗/ g t k c o n t a i n e r a d d (GTK CONTAINER ( window ) , t a b l e ) ;
46 47 48
/∗ E l s o gomb l e t r e h o z a s a ∗/ button = g t k b u t t o n n e w w i t h l a b e l ( ”gomb 1 ” ) ;
49 50 51 52 53
/∗ A gomb lenyomasakor a megadott fuggveny l e f u t a ∗ parameterkent a t a d o t t s z o v e g g e l . ∗/ g s i g n a l c o n n e c t ( G OBJECT ( button ) , ” c l i c k e d ” , G CALLBACK ( k i i r ) , ( g p o i n t e r ) ”gomb1 voltam ” ) ;
54 55 56 57 58
/∗ gomb1−e t a b a l f e l s o sarokba t e s s z u k ∗/ g t k t a b l e a t t a c h d e f a u l t s ( GTK TABLE ( t a b l e ) , button , 0 , 1 , 0 , 1 ) ; gtk widget show ( button ) ;
59 60 61
/∗ 2 . gomb ∗/ button = g t k b u t t o n n e w w i t h l a b e l ( ”gomb 2 ” ) ;
62
26
63 64 65
/∗ k l i k k e l e s r e a d o t t fuggveny a d o t t p a r a m e t e r r e l fog l e f u t n i . ∗/ g s i g n a l c o n n e c t ( G OBJECT ( button ) , ” c l i c k e d ” , G CALLBACK ( k i i r ) , ( g p o i n t e r ) ”Ez a masodik gomb v o l t ! ” ) ;
66 67 68 69 70 71 72 73 74 75 76 77 78
/∗ J o b b o l d a l t , de k i c s i t a masik a l a t t helyezzuk e l a gombot ∗/ g t k t a b l e a t t a c h ( GTK TABLE ( t a b l e ) , /∗ Ebbe a t a b l a b a t e s s z u k az elemet ∗/ button , /∗ mutato a behelyezendo objektumra ∗/ 2, /∗ l e f t attach ∗/ 4, /∗ r i g h t a t t a c h ∗/ 1, /∗ top attach ∗/ 2, /∗ bottom a t t a c h ∗/ GTK FILL | GTK EXPAND, /∗ x o p t i o n s : b i t s z i n t u , tobb l e h e t o s e g i s v 0, /∗ y o p t i o n s : b i t s z i n t u , tobb l e h e t o s e g i s van ! ∗/ 10 , /∗ xpadding ∗/ 30); /∗ ypadding ∗/ gtk widget show ( button ) ;
79 80 81 82 83 84 85
/∗ toltelekgombok e l h e l y e z e s e , hogy a t a b l a s z e r k e z e t l a t h a t o v a v a l j o n ∗/ /∗ 0 . oszlop e l −p o z i c i o sorrendek : l e f t , r i g h t , top , bottom ∗/ button = g t k b u t t o n n e w w i t h l a b e l ( ” ” ) ; g t k t a b l e a t t a c h d e f a u l t s ( GTK TABLE ( t a b l e ) , button , 0 , 1 , 1 , 2 ) ; gtk widget show ( button ) ;
86 87 88 89
button = g t k b u t t o n n e w w i t h l a b e l ( ” ” ) ; g t k t a b l e a t t a c h d e f a u l t s ( GTK TABLE ( t a b l e ) , button , 0 , 1 , 2 , 3 ) ; gtk widget show ( button ) ;
90 91 92 93
button = g t k b u t t o n n e w w i t h l a b e l ( ” ” ) ; g t k t a b l e a t t a c h d e f a u l t s ( GTK TABLE ( t a b l e ) , button , 0 , 1 , 3 , 4 ) ; gtk widget show ( button ) ;
94 95 96 97 98
button = g t k b u t t o n n e w w i t h l a b e l ( ” ” ) ; g t k t a b l e a t t a c h d e f a u l t s ( GTK TABLE ( t a b l e ) , button , 0 , 1 , 4 , 5 ) ; gtk widget show ( button ) ; /∗ vege a 0 . oszlop g o m b f e l t o l t e s e n e k ∗/
99 100 101 102 103 104
/∗ 1 . oszlop gombjai ∗/ button = g t k b u t t o n n e w w i t h l a b e l ( ” ” ) ; g t k t a b l e a t t a c h d e f a u l t s ( GTK TABLE ( t a b l e ) , button , 1 , 2 , 0 , 1 ) ; gtk widget show ( button ) ;
105 106 107 108
button = g t k b u t t o n n e w w i t h l a b e l ( ” ” ) ; g t k t a b l e a t t a c h d e f a u l t s ( GTK TABLE ( t a b l e ) , button , 1 , 2 , 2 , 3 ) ; gtk widget show ( button ) ;
109 110 111 112
button = g t k b u t t o n n e w w i t h l a b e l ( ” ” ) ; g t k t a b l e a t t a c h d e f a u l t s ( GTK TABLE ( t a b l e ) , button , 1 , 2 , 4 , 5 ) ; gtk widget show ( button ) ;
113 114 115 116 117 118
/∗ 2 . oszlop gombjai ∗/ button = g t k b u t t o n n e w w i t h l a b e l ( ” ” ) ; g t k t a b l e a t t a c h d e f a u l t s ( GTK TABLE ( t a b l e ) , button , 2 , 3 , 0 , 1 ) ; gtk widget show ( button ) ;
119 120 121 122
button = g t k b u t t o n n e w w i t h l a b e l ( ” ” ) ; g t k t a b l e a t t a c h d e f a u l t s ( GTK TABLE ( t a b l e ) , button , 2 , 3 , 2 , 3 ) ; gtk widget show ( button ) ;
123 124
button = g t k b u t t o n n e w w i t h l a b e l ( ” ” ) ; 27
g t k t a b l e a t t a c h d e f a u l t s ( GTK TABLE ( t a b l e ) , button , 2 , 3 , 4 , 5 ) ; gtk widget show ( button ) ;
125 126 127
/∗ 3 . oszlop gombjai ∗/ button = g t k b u t t o n n e w w i t h l a b e l ( ” ” ) ; g t k t a b l e a t t a c h d e f a u l t s ( GTK TABLE ( t a b l e ) , button , 3 , 4 , 0 , 1 ) ; gtk widget show ( button ) ;
128 129 130 131 132
button = g t k b u t t o n n e w w i t h l a b e l ( ” ” ) ; g t k t a b l e a t t a c h d e f a u l t s ( GTK TABLE ( t a b l e ) , button , 3 , 4 , 3 , 4 ) ; gtk widget show ( button ) ;
133 134 135 136 137
/∗ 4 . oszlop e l −p o z i c i o sorrendek : l e f t , r i g h t , top , bottom ∗/ button = g t k b u t t o n n e w w i t h l a b e l ( ” ” ) ; g t k t a b l e a t t a c h d e f a u l t s ( GTK TABLE ( t a b l e ) , button , 4 , 5 , 0 , 1 ) ; gtk widget show ( button ) ;
138 139 140 141 142
button = g t k b u t t o n n e w w i t h l a b e l ( ” ” ) ; g t k t a b l e a t t a c h d e f a u l t s ( GTK TABLE ( t a b l e ) , button , 4 , 5 , 1 , 2 ) ; gtk widget show ( button ) ;
143 144 145 146
button = g t k b u t t o n n e w w i t h l a b e l ( ” ” ) ; g t k t a b l e a t t a c h d e f a u l t s ( GTK TABLE ( t a b l e ) , button , 4 , 5 , 2 , 3 ) ; gtk widget show ( button ) ;
147 148 149 150
button = g t k b u t t o n n e w w i t h l a b e l ( ” ” ) ; g t k t a b l e a t t a c h d e f a u l t s ( GTK TABLE ( t a b l e ) , button , 4 , 5 , 3 , 4 ) ; gtk widget show ( button ) ;
151 152 153 154
button = g t k b u t t o n n e w w i t h l a b e l ( ” ” ) ; g t k t a b l e a t t a c h d e f a u l t s ( GTK TABLE ( t a b l e ) , button , 4 , 5 , 4 , 5 ) ; gtk widget show ( button ) ; /∗ vege a 0 . oszlop g o m b f e l t o l t e s e n e k ∗/
155 156 157 158 159
/∗∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗∗/ button = g t k b u t t o n n e w w i t h l a b e l ( ” 5x4−es t a b l a t deklaraltam , \ nes megis b e i l l e s z t i \n a plusz gombokat ! ” ) ; g t k t a b l e a t t a c h d e f a u l t s ( GTK TABLE ( t a b l e ) , button , 4 , 5 , 5 , 6 ) ; gtk widget show ( button ) ; /∗ vege a 0 . oszlop g o m b f e l t o l t e s e n e k ∗/ /∗∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗∗/
160 161 162 163 164 165 166 167
/∗ Kilepogomb l e t r e h o z a s a ∗/ button = g t k b u t t o n n e w w i t h l a b e l ( ” K i l e p e s ” ) ;
168 169 170
/∗ k l i k k e l e s r e a d o t t fuggveny a d o t t p a r a m e t e r r e l fog l e f u t n i . ∗/ g s i g n a l c o n n e c t ( G OBJECT ( button ) , ” c l i c k e d ” , G CALLBACK ( k i l e p e s a p r o g r a m b o l ) , NULL ) ;
171 172 173 174
/∗ Es vegul a Kilepo gomb e l h e l y e z e s e ∗/ g t k t a b l e a t t a c h d e f a u l t s ( GTK TABLE ( t a b l e ) , button , 1 , 3 , 3 , 4 ) ;
175 176 177
gtk widget show ( button ) ;
178 179
gtk widget show ( t a b l e ) ; gtk widget show ( window ) ;
180 181 182
gtk main ( ) ; return 0;
183 184 185
}
28
¨ ¨ otti ¨ t´avols´ag szab´alyozhato: ´ Van m´eg k´et fuggv´ eny, amellyel adott sorok e´ s oszlopok koz 1 2 3
1 2 3
void g t k t a b l e s e t r o w s p a c i n g ( GtkTable guint guint
∗ table , row , spacing )
void g t k t a b l e s e t c o l s p a c i n g ( GtkTable guint guint
∗ table , column , spacing )
¨ Oszlopok eset´eben a hely az oszlop jobb oldal´ara, sor eset´eben a sor al´a kerul. ¨ Lehets´eges az osszes oszlopra - sorra vonatkozo´ egys´eges be´all´ıt´as is: 1 2
1 2
void g t k t a b l e s e t r o w s p a c i n g s ( GtkTable guint
∗ table , spacing )
void g t k t a b l e s e t c o l s p a c i n g s ( GtkTable guint
∗ table , spacing )
´ odik ´ Ezek h´ıv´asakor az utolso´ sor ut´an, illetve az utolso´ oszlop ut´an m´ar nem szur be hely.
4.
A felhaszn´aloi ´ elemek a´ ttekint´ese
Az elemek l´etrehoz´as´anak a´ ltal´anos l´ep´esei: ¨ • gtk_*_new() alaku´ fuggv´ ennyel l´etrehozod az elemet. Az elemek r´eszletes ismertet´es´et az oktato´ h´atral´ev˝o r´esz´eben megtal´alod. • a k´ıv´ant szign´alokat e´ s esem´enyeket hozz´arendeled az elemhez. (pl. eg´ergomb-lenyom´as a gomb eset´eben) • be´all´ıtod az elem tulajdons´agait. ´ • elhelyezed az elemet egy t´aroloban, p´eld´aul t´abl´azatban vagy dobozban a gtk_container_add() ¨ vagy a gtk_box_pack_start() fuggv´ enyekkel. ´ a teszed az elemet a gtk_widget_show()-val. Az elemek l´athatos´ ´ aga ki-be kapcsolhato, ´ ´ıgy • l´athatov´ egy programban az e´ ppen l´athato´ elemeket a programfut´as folyamat´ahoz tudod igaz´ıtani. P´eld´aul ha a ¨ ¨ od ¨ a f´ajlt, program elej´en szoveges adatokat k´ersz be, mondjuk f´ajlnevet, e´ s egy email c´ımet ahova elkuld ¨ ¨ es a´ llapot´at majd a program a m´asodik l´ep´esben a m´ar felesleges szovegmez˝ oket kikapcsolja, e´ s a kuld´ ¨ jelz˝o progress-bar jelen´ıthet˝o meg helyette. A GTK-ban e´ rdemes tobbsz´ alu´ programot ´ırni, mert ´ıgy a ´ a felhaszn´aloi ´ feluletet ¨ ¨ sz´alakbol folyamatosan v´altoztathatjuk - ha egy programsz´alunk van, a felulet ¨ vissza a GTK-hoz. lemerevedhet ha a vez´erl´es nem kerul A gtk_widget_show() a GTK sz´am´ara azt jelenti, hogy az elem tulajdons´agait be´all´ıtottuk e´ s az k´esz a megjelen´ıt´esre. A m´ar megjelen´ıtett elemet a gtk_widget_hide() utas´ıt´assal rejtheted el. Az elemek megjelen´ıt´es´enek sorrendje nem l´enyeges, de javasolt a f˝o ablakot utolj´ara hagyni, mert ´ıgy a felhaszn´alo´ az ¨ eg´esz feluletet egyszerre l´atja meg - egy´ebk´ent pedig l´athato´ ahogy az egyes elemeket a program az ablakban ¨ oje l´athatov´ ´ a nem v´alik. Az ablak is szul˝ ¨ onek fel´ep´ıti. Egy gyermek-elem addig nem jelenik meg, am´ıg a szul˝ sz´am´ıt.
4.1.
T´ıpuskonverzio´
´ vizsg´alj´ak hogy lehets´eges-e az adott t´ıpuskonverzio, ´ A GTK rendszeresen haszn´alja a t´ıpusk´enyszer´ıt´est. Makrok ´ hajtj´ak azt v´egre. A leggyakoribbak: e´ s szint´en makrok G_OBJECT(object) GTK_WIDGET(widget) GTK_OBJECT(object) GTK_SIGNAL_FUNC(function) GTK_CONTAINER(container) GTK_WINDOW(window) GTK_BOX(box) ¨ ´ ara. Ezeket az eddigi p´eld´akban is haszn´altuk, rendszerint fuggv´ enyh´ıv´asok param´etereinek t´ıpuskonverzioj´ ´ hogy minden elem a GObject alaposzt´alybol ´ sz´armazik. Ez azt jelenti, A lentebbi oszt´aly-hierarchi´aban l´athato, ¨ hogy ahol egy fuggv´ eny objektumot k´er, ott b´armilyen elemet nyugodtan haszn´alhatsz, a G_OBJECT makro´ seg´ıts´eg´evel. P´eld´aul: 29
1 2
g s i g n a l c o n n e c t ( G OBJECT ( button ) , ” c l i c k e d ” , G CALLBACK( k l i k k e l e s r e l e f u t o f u g g v e n y ) , fuggvenynek adatok ) ; ´ a alak´ıtottuk, e´ s hozz´arendeltuk ¨ a ’klikkelesre lefuto fuggveny’ c´ım´et Most a gombot objektum t´ıpusuv´ ´ az objektumhoz. tartalmazo´ mutatot ¨ ´ - az oszt´alyhierarchi´aban l´athato, ´ hogy Vannak olyan felulet-elemek, melyek m´as elemek t´arol´as´ara valok ´ tobb ¨ elem is sz´armazik. Ezek b´armelyik´et haszn´alhatod a GTK_CONTAINER makroval, ´ a Container oszt´alybol ¨ ha egy olyan fuggv´ enyt akarsz megh´ıvni, amelyiknek t´arolo´ elemet kell a´ tadnod. ´ alapos ismertet´es´et ez az oktato´ nem tartalmazza - e´ rdemes megn´ezni a GTK fejl´ec a´ llom´anyokat, Ezen makrok ´ aban egyszeru˝ a felulet-elemek ¨ ˝ od´ ¨ es´enek meg´ert´ese, csak picit bele kell vagy a GTK API referenci´at. Valoj´ muk ¨ ´ n´ezni a fuggv´ enydefin´ıciokba.
4.2.
A felulet-elemek ¨ hierarchi´aja
´ A hierarchi´aban az elavult elemek e´ s a seg´ed-oszt´alyok nem l´athatok. GObject | GtkObject +GtkWidget | +GtkMisc | | +GtkLabel | | | ‘GtkAccelLabel | | +GtkArrow | | ‘GtkImage | +GtkContainer | | +GtkBin | | | +GtkAlignment | | | +GtkFrame | | | | ‘GtkAspectFrame | | | +GtkButton | | | | +GtkToggleButton | | | | | ‘GtkCheckButton | | | | | ‘GtkRadioButton | | | | ‘GtkOptionMenu | | | +GtkItem | | | | +GtkMenuItem | | | | +GtkCheckMenuItem | | | | | ‘GtkRadioMenuItem | | | | +GtkImageMenuItem | | | | +GtkSeparatorMenuItem | | | | ‘GtkTearoffMenuItem | | | +GtkWindow | | | | +GtkDialog | | | | | +GtkColorSelectionDialog | | | | | +GtkFileSelection | | | | | +GtkFontSelectionDialog | | | | | +GtkInputDialog | | | | | ‘GtkMessageDialog | | | | ‘GtkPlug | | | +GtkEventBox | | | +GtkHandleBox | | | +GtkScrolledWindow | | | ‘GtkViewport | | +GtkBox | | | +GtkButtonBox | | | | +GtkHButtonBox | | | | ‘GtkVButtonBox | | | +GtkVBox | | | | +GtkColorSelection | | | | +GtkFontSelection | | | | ‘GtkGammaCurve | | | ‘GtkHBox 30
| | | +GtkCombo | | | ‘GtkStatusbar | | +GtkFixed | | +GtkPaned | | | +GtkHPaned | | | ‘GtkVPaned | | +GtkLayout | | +GtkMenuShell | | | +GtkMenuBar | | | ‘GtkMenu | | +GtkNotebook | | +GtkSocket | | +GtkTable | | +GtkTextView | | +GtkToolbar | | ‘GtkTreeView | +GtkCalendar | +GtkDrawingArea | | ‘GtkCurve | +GtkEditable | | +GtkEntry | | ‘GtkSpinButton | +GtkRuler | | +GtkHRuler | | ‘GtkVRuler | +GtkRange | | +GtkScale | | | +GtkHScale | | | ‘GtkVScale | | ‘GtkScrollbar | | +GtkHScrollbar | | ‘GtkVScrollbar | +GtkSeparator | | +GtkHSeparator | | ‘GtkVSeparator | +GtkInvisible | +GtkPreview | ‘GtkProgressBar +GtkAdjustment +GtkCellRenderer | +GtkCellRendererPixbuf | +GtkCellRendererText | +GtkCellRendererToggle +GtkItemFactory +GtkTooltips ‘GtkTreeViewColumn
4.3.
Ablak n´elkuli ¨ felulet-elemek ¨
´ Ezeknek az elemeknek nem kell ablakhoz kapcsolodniuk. (p´eld´aul a Box-okat is lehet egym´asba a´ gyazni). Ha egy esem´enyt szeretn´el e´ szlelni, haszn´ald az EventBox-ot (van le´ır´asa :-) GtkAlignment GtkArrow GtkBin GtkBox GtkButton GtkCheckButton GtkFixed GtkImage GtkLabel GtkMenuItem
31
GtkNotebook GtkPaned GtkRadioButton GtkRange GtkScrolledWindow GtkSeparator GtkTable GtkToolbar GtkAspectFrame GtkFrame GtkVBox GtkHBox GtkVSeparator GtkHSeparator A GTK megismer´es´ehez e´ rdemes megn´ezni a GTK-val e´ rkez˝o tests/testgtk.c programot.
5.
A gomb elemek
5.1.
Az egyszeru˝ gomb
¨ helyen haszn´alt e´ s l´atott hagyom´anyos gombt´ıpus. Tobbf´ ¨ ´ A legtobb elek´eppen is l´etrehozhato: • gkt_button_new_with_label() - felirat • gkt_button_new_with_mnemonic() - ikon • gkt_button_new_from_stock() - ikon e´ s felirat ¨ • gkt_button_new() - ures gomb, amibe felirat vagy k´ep illeszthet˝o. ´ Az ablakot a sark´an´al fogva picit sz´ethuztam, egy´ebk´ent nagyon pici lett volna a k´ep:
1
# i n c l u d e
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
/∗ XPM adat , Open−F i l e ikon ∗/ s t a t i c c o n s t char ∗ xpm data [ ] = { ” 16 16 3 1 ” , ” c None” , ”. c #000000000000 ” , ”X c #FFFFFFFFFFFF” , ” ”, ” ...... ”, ” . XXX . X . ”, ” . XXX . XX . ”, ” . XXX . XXX . ”, ” . XXX . . . . . ”, ” . XXXXXXX . ”, ” . XXXXXXX . ”, ” . XXXXXXX . ”, ” . XXXXXXX . ”, ” . XXXXXXX . ”, ” . XXXXXXX . ”, ” . XXXXXXX . ”, ” ......... ”,
32
23 24
” ”
”, ” };
25 26 27 28 29 30 31 32 33 34
/∗ meghivasakor ( d e l e t e e v e n t s z i g n a l ) m e g s z a k i t j a a program f u t a s a t . ∗/ g i n t p r o g r a m b e f e j e z e s e ( GtkWidget ∗ widget , GdkEvent ∗ event , gpointer data ) { gtk main quit ( ) ; r e t u r n FALSE ; }
35 36 37 38 39 40 41 42
/∗ gomb lenyomasakor hivodik meg , s z o v e g e t i r k i a standard kimenetre . ∗/ void gomb lenyomas tortent ( GtkWidget ∗ widget , gpointer data ) { g p r i n t ( ”A gombot lenyomtad \n” ) ; }
43 44 45 46 47 48 49 50 51
i n t main ( i n t argc , char ∗ argv [ ] ) { /∗ GtkWidget t i p u s t hasznald a f e l u l e t −elemek t a r o l a s a r a ∗/ GtkWidget ∗window , ∗pixmapwid , ∗ button ; GdkPixmap ∗pixmap ; GdkBitmap ∗mask ; GtkStyle ∗ s t y l e ;
52 53 54 55 56 57 58 59 60
/∗ A f o a b l a k l e t r e h o z a s a , d e l e t e e v e n t s z i g n a l t fuggvenyhez r e n d e l j u k , ∗ hogy megszakitsa a program f u t a s a t ∗/ g t k i n i t (& argc , &argv ) ; window = gtk window new (GTK WINDOW TOPLEVEL ) ; g s i g n a l c o n n e c t ( G OBJECT ( window ) , ” d e l e t e e v e n t ” , G CALLBACK ( p r o g r a m b e f e j e z e s e ) , NULL ) ; g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( window ) , 1 0 ) ; gtk widget show ( window ) ;
61 62 63 64 65 66
/∗ a p i x e l e s kep l e t r e h o z a s a ∗/ s t y l e = g t k w i d g e t g e t s t y l e ( window ) ; pixmap = gdk pixmap create from xpm d ( window−>window , &mask , &s t y l e −>bg [GTK STATE NORMAL] , ( gchar ∗ ∗ ) xpm data ) ;
67 68 69 70
/∗ a p i x e l e s kepet t a r t a l m a z o elem l e t r e h o z a s a kep b e i l l e s z t e s e v e l ∗/ pixmapwid = gtk pixmap new ( pixmap , mask ) ; gtk widget show ( pixmapwid ) ;
71 72 73 74 75 76
/∗ az u j gomb l e t r e h o z a s a a kepet t a r t a l m a z o elemmel ∗/ button = gtk button new ( ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( button ) , pixmapwid ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( window ) , button ) ; gtk widget show ( button ) ;
77 78 79
g s i g n a l c o n n e c t ( G OBJECT ( button ) , ” c l i c k e d ” , G CALLBACK ( gomb lenyomas tortent ) , NULL ) ;
80 81 82
/∗ A f o a b l a k m e g j e l e n i t e s e ∗/ gtk main ( ) ;
83 84
return 0; 33
85
} ¨ ¨ meg, hogy a gomb milyen szign´alokkal figyeli Szoveget e´ s ikont is tartalmazo´ gomb - felt´etlen figyeljuk ¨ e kerul-e, ¨ ¨ et: hogy az eg´ermutato´ fol´ illetve elhagyja-e a terulet´
1 2 3
# i n c l u d e < s t d l i b . h> # i n c l u d e
4 5 6 7 8 9 10 11 12 13 14 15 16
/∗ main−n a l kezd az o l v a s a s t ! ∗ Ez a fuggveny egy dobozba pakol egy kepet es egy ∗ szoveget , a gombba pedig a dobozt r a k j u k majd b e l e . ∗ Vagyis ez egy r e s z f e l a d a t o t old meg , ha sok gombot ∗ h as z n al s z , c e l s z e r u valami hasonlo ikon−szoveg o s s z e r a k o ∗ fuggvenyt i r n i . ∗/ ∗ xpm filename , GtkWidget ∗ xpm label box ( gchar gchar ∗label text ) { GtkWidget ∗box ; GtkWidget ∗ l a b e l ; GtkWidget ∗image ;
17
/∗ Uj hbox k e s z i t e s e a kepnek es a szovegnek ∗/ box = gtk hbox new ( FALSE , 0 ) ; g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( box ) , 2 ) ;
18 19 20 21
/∗ mutato a kepre ∗/ image = g t k i m a g e n e w f r o m f i l e ( xpm filename ) ;
22 23 24
/∗ mutato a szovegre ∗/ label = gtk label new ( l a b e l t e x t ) ;
25 26 27
/∗ Kepet es s z o v e g e t a dobozba r a k j u k ∗/ g t k b o x p a c k s t a r t (GTK BOX ( box ) , image , FALSE , FALSE , 3 ) ; g t k b o x p a c k s t a r t (GTK BOX ( box ) , l a b e l , FALSE , FALSE , 3 ) ;
28 29 30 31
gtk widget show ( image ) ; gtk widget show ( l a b e l ) ;
32 33 34
r e t u r n box ;
35 36
}
37 38 39 40 41 42 43
/∗ k i i r , standard o u t p u t r a ∗/ void k i i r ( GtkWidget ∗ widget , gpointer data ) { g p r i n t ( ”%s \n” , ( char ∗ ) data ) ; }
44 45 46 47 48 49 50 51
i n t main ( i n t argc , char ∗ argv [ ] ) { /∗ GtkWidget mutatoban t a r o l h a t o d az elemek c i m e i t ∗/ GtkWidget ∗window ; GtkWidget ∗ button ; GtkWidget ∗box ;
52
34
g t k i n i t (& argc , &argv ) ;
53 54
/∗ Uj a b l a k l e t r e h o z a s a ∗/ window = gtk window new (GTK WINDOW TOPLEVEL ) ;
55 56 57
g t k w i n d o w s e t t i t l e (GTK WINDOW ( window ) , ”Gomb ikonnal , f e l i r a t t a l ! ” ) ;
58 59
/∗ Ezt c e l s z e r u minden a b l a k r a m e g c s i n a l n i ! ∗/ g s i g n a l c o n n e c t ( G OBJECT ( window ) , ” d e s t r o y ” , G CALLBACK ( g t k m a i n q u i t ) , NULL ) ;
60 61 62 63
g s i g n a l c o n n e c t ( G OBJECT ( window ) , ” d e l e t e e v e n t ” , G CALLBACK ( g t k m a i n q u i t ) , NULL ) ;
64 65 66
/∗ Az a b l a k b e l s o margojat b e a l l i t j a . ∗/ g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( window ) , 1 0 ) ;
67 68 69
/∗ Uj gomb l e t r e h o z a s a ∗/ button = gtk button new ( ) ;
70 71 72
/∗ ” c l i c k e d ” s z i g n a l h o z z a r e n d e l e s e k i i r fuggvenyhez ∗/ g s i g n a l c o n n e c t ( G OBJECT ( button ) , ” c l i c k e d ” , G CALLBACK ( k i i r ) , ( g p o i n t e r ) ” K i r a l y gomb ! ” ) ;
73 74 75 76 77 78
/∗ ” e n t e r ” s z i g n a l h o z z a r e n d e l e s e k i i r fuggvenyhez ∗/ g s i g n a l c o n n e c t ( G OBJECT ( button ) , ” e n t e r ” , G CALLBACK ( k i i r ) , ( g p o i n t e r ) ”Az egermutato a gomb f o l o t t van ! ” ) ;
79 80 81 82 83
/∗ ” l e a v e ” s z i g n a l h o z z a r e n d e l e s e k i i r fuggvenyhez ∗/ g s i g n a l c o n n e c t ( G OBJECT ( button ) , ” l e a v e ” , G CALLBACK ( k i i r ) , ( g p o i n t e r ) ”A mutato e l h a g y t a a gomb t e r u l e t e t ! ” )
84 85 86 87 88
/∗ I t t egy u j dobozt hozunk l e t r e , a program e l e j e n d e f i n i a l t fuggvennyel ∗/ box = xpm label box ( ” i n f o . xpm” , ”Erdemes C programozast t a n u l n i ! : −) ” ) ;
89 90 91
/∗ doboz l a t h a t o v a t e t e l e ∗/ gtk widget show ( box ) ;
92 93 94
/∗ dobozt b e l e p a k o l j u k a gombba ∗/ g t k c o n t a i n e r a d d (GTK CONTAINER ( button ) , box ) ;
95 96 97
/∗ gomb l a t h a t o v a t e t e l e ∗/ gtk widget show ( button ) ;
98 99 100
/∗ gombot f o a b l a k b a r a k j u k ∗/ g t k c o n t a i n e r a d d (GTK CONTAINER ( window ) , button ) ;
101 102 103
/∗ f o a b l a k o t m e g j e l e n i t j u k ∗/ gtk widget show ( window ) ;
104 105 106
/∗ Varakozas a f e l h a s z n a l o r a ∗/ gtk main ( ) ;
107 108 109
return 0;
110 111
} ¨ Az xpm_label_box() fuggv´ eny b´armilyen t´arolo´ (container) t´ıpusu´ elembe bele tud rakni egy k´epet e´ s ¨ egy szoveget.
35
A Button (gomb) elem szign´aljai: ´ a gomb fol ¨ ott ¨ lenyomj´ak. • pressed - lenyomva. Amikor az eg´ermutatot • released - elengedve. Az a pillanat, amikor a lenyomott eg´ergombot felengedik. • clicked - megnyomva. Amikor a gombon lenyomt´ak e´ s fel is engedt´ek az eg´ergombot. ¨ ¨ e kerul. ¨ • enter - bel´ep´es. Amikor az eg´ermutato´ a gomb terulete fol´ ¨ er˝ol elmegy. • leave - elhagy´as. Amikor az eg´ermutato´ a gomb terulet´
5.2.
A k´et´all´asu´ v´altogombok ´ (toggle buttons)
´ A v´altogombok a gombok k´et´allapotu´ v´altozatai: benyomva, felengedve. Mindig az egyik a´ llapotot veszik fel. ´ ´ ˝ od´ ¨ es´ere e´ pulnek ¨ A v´altogombok a pip´ak e´ s a r´adiogombok muk (check, radio buttons). A mnemonic v´altozat ´ ¨ karaktert felhaszn´alva a gombot ALT+karakter kombin´acioval ´ ´ a teszi. az alsovon´ assal jelolt is kapcsolhatov´
1 2 3
# i n c l u d e < s t d l i b . h> # i n c l u d e
4 5 6 7 8 9 10
/∗ k i i r , standard o u t p u t r a ∗/ void k i i r ( GtkWidget ∗ widget , gpointer data ) { g p r i n t ( ”%s \n” , ( char ∗ ) data ) ; }
11 12 13 14 15 16 17
i n t main ( i n t argc , char ∗ argv [ ] ) { /∗ GtkWidget mutatoban t a r o l h a t o d az elemek c i m e i t ∗/ GtkWidget ∗window ; GtkWidget ∗ button ;
18 19
g t k i n i t (& argc , &argv ) ;
20 21 22 23
/∗ Uj a b l a k l e t r e h o z a s a ∗/ window = gtk window new (GTK WINDOW TOPLEVEL ) ; g t k w i n d o w s e t t i t l e (GTK WINDOW ( window ) , ”Valtogomb pelda ” ) ;
24 25 26 27
/∗ Ezt c e l s z e r u minden a b l a k r a m e g c s i n a l n i ! ∗/ g s i g n a l c o n n e c t ( G OBJECT ( window ) , ” d e s t r o y ” , G CALLBACK ( g t k m a i n q u i t ) , NULL ) ;
28 29 30
g s i g n a l c o n n e c t ( G OBJECT ( window ) , ” d e l e t e e v e n t ” , G CALLBACK ( g t k m a i n q u i t ) , NULL ) ;
31 32 33
/∗ Az a b l a k b e l s o margojat b e a l l i t j a . ∗/ g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( window ) , 1 0 ) ;
34 35 36
/∗ Uj gomb l e t r e h o z a s a ∗/ button = gtk toggle button new with mnemonic ( ” G o m b f e l i r a t − f i g y e l d meg , hogy ALT+G−
37 38 39 40
/∗ ” c l i c k e d ” s z i g n a l h o z z a r e n d e l e s e k i i r fuggvenyhez ∗/ g s i g n a l c o n n e c t ( G OBJECT ( button ) , ” c l i c k e d ” , G CALLBACK ( k i i r ) , ( g p o i n t e r ) ”Gombra ranyomtak ! ” ) ;
41
36
/∗ gomb l a t h a t o v a t e t e l e ∗/ gtk widget show ( button ) ;
42 43 44
/∗ gombot f o a b l a k b a r a k j u k ∗/ g t k c o n t a i n e r a d d (GTK CONTAINER ( window ) , button ) ;
45 46 47
/∗ f o a b l a k o t m e g j e l e n i t j u k ∗/ gtk widget show ( window ) ;
48 49 50
/∗ Varakozas a f e l h a s z n a l o r a ∗/ gtk main ( ) ;
51 52 53
return 0;
54 55
} ´ v´altogomb ´ Uj l´etrehoz´asa:
1 2 3
GtkWidget ∗ g t k t o g g l e b u t t o n n e w ( void ) ; GtkWidget ∗ g t k t o g g l e b u t t o n n e w w i t h l a b e l ( c o n s t gchar ∗ l a b e l ) ; GtkWidget ∗ gtk toggle button new with mnemonic ( c o n s t gchar ∗ l a b e l ) ; ¨ ˝ od´ ¨ ese a hagyom´anyos gombk´esz´ıt˝o fuggv´ ¨ ´ Az els˝o egy Ezeknek a fuggv´ enyeknek a muk enyekhez hasonlo. ¨ ´ ures v´altogombot hoz l´etre, a m´asik kett˝o pedig feliratosat. ´ ´ ´ A v´altogombok a´ llapot´at a r´adiogombokhoz e´ s a pip´akhoz (checkbox) hasonloan az elem active tulaj´ is haszn´alni dons´ag´anak kiolvas´as´aval tudhatjuk meg. A lek´erdez´es sor´an a GTK_TOGGLE_BUTTON makrot ´ fogjuk, ami egy a´ ltal´anos elemre mutato´ pointer t´ıpus´at v´altogombra mutato´ pointer t´ıpusra alak´ıtja. ´ ´ A r´adiogomboknak, a pip´aknak e´ s a v´altogomboknak is van egy ’toggled’ (kb. kapcsolt, v´altott) szign´alja ¨ (jelz´ese). Ezeknek a gombt´ıpusoknak az a´ llapotlek´erdez´es´ehez a ’toggled’ szign´alhoz egy - arra reag´alo´ fuggv´ enyt kapcsolunk, ´ıgy:
1 2 3 4 5 6
void t o g g l e b u t t o n c a l l b a c k ( GtkWidget ∗ widget , g p o i n t e r data ) { i f ( g t k t o g g l e b u t t o n g e t a c t i v e (GTK TOGGLE BUTTON ( widget ) ) ) { /∗ ha a program f u t a s a i d e e r , a gombot lenyomtak ∗/ }
7
else {
8 9
/∗ ha ezen az agon f u t a program , a gombot nem nyomtak l e ∗/
10
}
11 12
} ´ pipa, v´alto) ´ a´ llapot´at programbol ´ is meghat´arozhatjuk: Mindh´arom gombt´ıpus (r´adio,
1 2
void g t k t o g g l e b u t t o n s e t a c t i v e ( GtkToggleButton ∗ t o g g l e b u t t o n , gboolean is active ); A fenti p´eld´aban az els˝o a´ tadott param´eter a be´all´ıtando´ gombra mutato´ pointer – e´ s egy TRUE vagy FALSE e´ rt´ek a m´asodik param´eter, amik a benyomva - nem benyomva a´ llapotokat jelentik. Az a´ llapot alap´ertelmez´esben FALSE, azaz nem benyomott. ¨ Fontos tudni, hogy a gtk_toggle_button_set_active() fuggv´ eny haszn´alata ’clicked’ e´ s ’toggled’ ´ o´ fuggv´ ¨ szign´alokat v´alt ki - vagyis a szign´alokhoz kapcsolod enyek is lefutnak! ´ A v´altogomb aktu´alis a´ llapot´at a
1
gboolean g t k t o g g l e b u t t o n g e t a c t i v e ( GtkToggleButton ∗ t o g g l e b u t t o n ) ; ¨ fuggv´ ennyel k´erdezheted le, ami egy boolean TRUE/FALSE e´ rt´ekkel t´er vissza.
5.3.
A kiv´alaszto´ pip´ak (check buttons)
¨ ´ ´ or ¨ oklik ¨ A pip´ak tulajdons´agaik e´ s fuggv´ enyeik egy r´esz´et az el˝obb ismertetett v´alasztogombokt ol - feladatuk ´ csak picit m´ask´epp n´eznek ki. Egy a´ llapot be vagy kikapcsolt volt´at a gombforma helyett ink´abb hasonlo, ¨ on´egyzettel e´ s felirattal jelzik - praktikusan kul ¨ onb ¨ oz˝ ¨ o opciok ´ a´ llapot´anak megjelen´ıt´es´ere haszn´alhatok. ´ jelol˝
37
´ L´etrehoz´asuk a gombokhoz hasonlo: 1 2 3
GtkWidget ∗ g t k c h e c k b u t t o n n e w ( void ) ; GtkWidget ∗ g t k c h e c k b u t t o n n e w w i t h l a b e l ( c o n s t gchar ∗ l a b e l ) ; GtkWidget ∗ gtk check button new with mnemonic ( c o n s t gchar ∗ l a b e l ) ; ¨ ¨ odobozt e´ s egy feliratot hoz l´etre. A A gtk_check_button_new_with_label() fuggv´ eny egy jelol˝ ¨ odoboz a´ llapot´at a v´altogombn´ ´ ´ jelol˝ al le´ırt modon tudhatod meg.
1 2
# i n c l u d e < s t d l i b . h> # i n c l u d e
3 4 5 6 7
/∗ k i i r , standard o u t p u t r a ∗/ void k i i r ( GtkWidget ∗ widget , gpointer data ) { g p r i n t ( ”%s \n” , ( char ∗ ) data ) ; }
8 9 10 11 12 13 14 15 16
i n t main ( i n t argc , char ∗ argv [ ] ) { /∗ GtkWidget mutatokban ∗/ GtkWidget ∗window ; /∗ elemek c i m e i t ∗/ GtkWidget ∗ button ; g t k i n i t (& argc , &argv ) ; /∗ Uj a b l a k l e t r e h o z a s a ∗/ window = gtk window new (GTK WINDOW TOPLEVEL ) ; g t k w i n d o w s e t t i t l e (GTK WINDOW ( window ) , ” Jelologomb pelda ” ) ;
17
/∗ Ezt c e l s z e r u minden a b l a k r a m e g c s i n a l n i ! ∗/ g s i g n a l c o n n e c t ( G OBJECT ( window ) , ” d e s t r o y ” , G CALLBACK ( g t k m a i n q u i t ) , NULL ) ;
18 19 20 21
g s i g n a l c o n n e c t ( G OBJECT ( window ) , ” d e l e t e e v e n t ” , G CALLBACK ( g t k m a i n q u i t ) , NULL ) ;
22 23 24
/∗ Az a b l a k b e l s o margoja ∗/ g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( window ) , 1 0 ) ;
25 26 27
button= /∗ Uj gomb k e s z i t e s ∗/ gtk check button new with mnemonic ( ” J e l o l o n e g y z e t , ALT+J−v e l i s b e a l l i t h a t o ! ” ) ;
28 29 30
/∗ ” c l i c k e d ” s z i g n a l h o z z a r e n d e l e s e k i i r fuggvenyhez ∗/ g s i g n a l c o n n e c t ( G OBJECT ( button ) , ” c l i c k e d ” , G CALLBACK ( k i i r ) , ( g p o i n t e r ) ”Gombra ranyomtak ! ” ) ;
31 32 33 34
/∗ gomb l a t h a t o v a t e t e l e ∗/ /∗ gombot f o a b l a k b a r a k j u k ∗/ /∗ f o a b l a k o t m e g j e l e n i t j u k ∗/ /∗ Varakozas a f e l h a s z n a l o r a ∗/ return 0;
35 36 37 38 39 40
gtk gtk gtk gtk
widget show ( button ) ; c o n t a i n e r a d d (GTK CONTAINER ( window ) , button ) ; widget show ( window ) ; main ( ) ;
}
5.4.
R´adiogombok ´
´ ´ a pip´akhoz, azzal az elt´er´essel hogy csoportokba szervez˝odnek e´ s egy csoportban A r´adiogombok hasonloak ´ haszn´alhatok ´ rovid ¨ ´ tort´ ¨ en˝o v´alaszt´asn´al. egyszerre csak egy gomb lehet kiv´alasztva. Jol list´akbol
38
¨ lehet˝os´eg is van: L´etrehoz´asukra tobb 1 2 3
GtkWidget ∗ g t k r a d i o b u t t o n n e w ( GSList ∗group ) ; GtkWidget ∗ g t k r a d i o b u t t o n n e w f r o m w i d g e t ( GtkRadioButton ∗group ) ; GtkWidget ∗ g t k r a d i o b u t t o n n e w w i t h l a b e l ( GSList ∗group , c o n s t gchar ∗ l a b e l ) ;
4 5
GtkWidget∗ g t k r a d i o b u t t o n n e w w i t h l a b e l f r o m w i d g e t (
6
GtkRadioButton ∗group , c o n s t gchar ∗ l a b e l
); 7 8 9 10
GtkWidget ∗ gtk radio button new with mnemonic ( GSList ∗group , c o n s t gchar ∗ l a b e l ) ; GtkWidget ∗ gtk radio button new with mnemonic from widget ( GtkRadioButton ∗group , c o n s t gchar ∗ l a b e l ); ´ ˝ od´ ¨ es´ehez csoportos´ıtani kell o˝ ket. A gtk_radio_button_new() vagy A r´adiogombok helyes muk ¨ gtk_radio_button_new_with_label() els˝o h´ıv´asakor a fuggv´ enynek a´ tadott *group param´eternek NULLnak kell lennie. Csoportot ´ıgy tudsz k´esz´ıteni:
1
GSList ∗ g t k r a d i o b u t t o n g e t g r o u p ( GtkRadioButton ∗ r a d i o b u t t o n ) ; ¨ ´ r´adiogomb ´ Fontos, hogy a gtk_radio_button_get_group() fuggv´ enyt minden uj hozz´aad´asa el˝ott ´ aval. A fuggv´ ¨ ´ r´adiogomb ´ meg kell h´ıvnod az utolj´ara l´etrehozott gomb mutatoj´ eny visszat´er´esi e´ rt´ek´et az uj ´ fuzhet˝ ˝ l´etrehoz´asakor kell az els˝o param´eterben felhaszn´alnod. Igy ok fel egy l´ancolatra a gombok. ¨ ´ır´asforma is a r´adiogomb ´ L´etezik egy rovidebb l´etrehoz´as´ara:
1 2 3
button2 = g t k r a d i o b u t t o n n e w w i t h l a b e l ( g t k r a d i o b u t t o n g e t g r o u p (GTK RADIO BUTTON ( button1 ) ) , ” button2 ” ) ; ´ ¨ ul ¨ a _from_widget() vari´aciok ´ ezt a rovid´ ¨ A r´adiogomb l´etrehoz´asi lehet˝os´egek koz ıt´est v´egzik el szeb´ ´ r´adiogomb-sz ´ ¨ ´ gombot, bels˝oleg megh´ıvva ben, mert az el˝oz˝o r´adiogomb e´ s az uj oveg a´ tad´as´aval elk´esz´ıti az uj ¨ a gtk_radio_button_get_group() fuggv´ enyt.
1 2 3
button2 = g t k r a d i o b u t t o n n e w w i t h l a b e l f r o m w i d g e t ( GTK RADIO BUTTON ( button1 ) , ” button2 ” ) ; ¨ A gombok l´etrehoz´asa ut´an c´elszeru˝ az alap´ertelmezetten kiv´alasztott gombot kijelolni:
1 2
void g t k t o g g l e b u t t o n s e t a c t i v e ( GtkToggleButton ∗ t o g g l e b u t t o n , gboolean state ) ; ¨ ´ Ezt a fuggv´ enyt m´ar megvizsg´altuk a v´altogombokn´ al, az ottani le´ır´assal megegyez˝oen kell itt is haszn´alni. ´ Ha a felhaszn´alo´ klikkel egy r´adiogombra, majd egy m´asodikra, akkor az els˝ore klikkel´eskor a gomb ’toggled’ jelz´est (szign´alt) ad ki, majd a m´asodik gombrra klikkel´eskor az els˝o gomb szint´en ’toggled’ jelz´est ad (v´alt´as: ´ kikapcsol´as), e´ s a m´asodik gomb is ’toggled’ jelz´est ad, a bekapcsol´asrol.
1 2
# i n c l u d e < g l i b . h> 39
3
# i n c l u d e
4 5 6 7 8 9 10 11
g i n t program bezarasa ( GtkWidget ∗ widget , GdkEvent ∗ event , gpointer data ) { gtk main quit ( ) ; r e t u r n FALSE ; }
12 13 14 15 16 17 18 19 20 21
i n t main ( i n t argc , char ∗ argv [ ] ) { GtkWidget ∗window = NULL; GtkWidget ∗ box1 ; GtkWidget ∗ box2 ; GtkWidget ∗ button ; GtkWidget ∗ s e p a r a t o r ; GSList ∗group ;
22 23
g t k i n i t (& argc , &argv ) ;
24 25
window = gtk window new (GTK WINDOW TOPLEVEL ) ;
26 27 28 29
g s i g n a l c o n n e c t ( G OBJECT ( window ) , ” d e l e t e e v e n t ” , G CALLBACK ( program bezarasa ) , NULL ) ;
30 31 32
g t k w i n d o w s e t t i t l e (GTK WINDOW ( window ) , ”Radiogombok” ) ; g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( window ) , 0 ) ;
33 34 35 36
box1 = gtk vbox new ( FALSE , 0 ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( window ) , box1 ) ; gtk widget show ( box1 ) ;
37 38 39 40 41
box2 = gtk vbox new ( FALSE , 1 0 ) ; g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( box2 ) , 1 0 ) ; g t k b o x p a c k s t a r t (GTK BOX ( box1 ) , box2 , TRUE, TRUE, 0 ) ; gtk widget show ( box2 ) ;
42 43 44 45
button = g t k r a d i o b u t t o n n e w w i t h l a b e l (NULL, ” button1 ” ) ; g t k b o x p a c k s t a r t (GTK BOX ( box2 ) , button , TRUE, TRUE, 0 ) ; gtk widget show ( button ) ;
46 47 48 49 50 51
group = g t k r a d i o b u t t o n g e t g r o u p (GTK RADIO BUTTON ( button ) ) ; button = g t k r a d i o b u t t o n n e w w i t h l a b e l ( group , ” button2 ” ) ; g t k t o g g l e b u t t o n s e t a c t i v e (GTK TOGGLE BUTTON ( button ) , TRUE ) ; g t k b o x p a c k s t a r t (GTK BOX ( box2 ) , button , TRUE, TRUE, 0 ) ; gtk widget show ( button ) ;
52 53 54 55 56
button = g t k r a d i o b u t t o n n e w w i t h l a b e l f r o m w i d g e t (GTK RADIO BUTTON ( button ) , ” button3 ” ) ; g t k b o x p a c k s t a r t (GTK BOX ( box2 ) , button , TRUE, TRUE, 0 ) ; gtk widget show ( button ) ;
57 58 59 60
separator = gtk hseparator new ( ) ; g t k b o x p a c k s t a r t (GTK BOX ( box1 ) , s e p a r a t o r , FALSE , TRUE, 0 ) ; gtk widget show ( s e p a r a t o r ) ;
61 62 63 64
box2 = gtk vbox new ( FALSE , 1 0 ) ; g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( box2 ) , 1 0 ) ; g t k b o x p a c k s t a r t (GTK BOX ( box1 ) , box2 , FALSE , TRUE, 0 ) ; 40
gtk widget show ( box2 ) ;
65 66
button = g t k b u t t o n n e w w i t h l a b e l ( ” c l o s e ” ) ; g s i g n a l c o n n e c t s w a p p e d ( G OBJECT ( button ) , ” c l i c k e d ” , G CALLBACK ( program bezarasa ) , G OBJECT ( window ) ) ; g t k b o x p a c k s t a r t (GTK BOX ( box2 ) , button , TRUE, TRUE, 0 ) ; GTK WIDGET SET FLAGS ( button , GTK CAN DEFAULT ) ; g t k w i d g e t g r a b d e f a u l t ( button ) ; gtk widget show ( button ) ; gtk widget show ( window ) ;
67 68 69 70 71 72 73 74 75 76
gtk main ( ) ;
77 78
return 0;
79 80
}
6.
Az Adjustment - Modos´ ´ ıto/be´ ´ all´ıto´ elem
˝ ´ A GTK elemek a´ llapot´anak egy r´esz´et a felhaszn´alo´ eg´errel vagy billentyuzettel modos´ ıthatja. Ilyen p´eld´aul a ´ ´ egy sz´amot v´alaszt ki a csuszk´ ´ csuszka, ahol egy e´ rt´ektartom´anybol at mozgatva. A viewport (r´esz-megjelen´ıt˝o) p´eld´aul egy nagyobb elem egy adott r´esz´et tudja megmutatni. ´ a felulet-elemeknek ¨ ´ modos´ ´ ´ Nyilv´anvaloan reag´alniuk kell a felhaszn´aloi ıt´asokra, ilyen p´eld´aul a csuszka ´ ıt´asi modja ´ ¨ az adott szign´alt kezel˝o fuggv´ ¨ mozgat´asa. Ennek egyik megvalos´ ha minden elemhez elk´esz´ıtjuk enyt. ¨ ¨ Gyakorlatilag minden adatbe´all´ıto´ e´ s adatkiolvaso´ fuggv´ enyt nekunk kellene meg´ırni. ´ ıt´asi mod ´ a GTK Adjustment (modos´ ´ ´ objektum´anak haszn´alata. Ez egy modszer, ´ A m´asik megvalos´ ıto) ´ ´ amellyel az elemek a modosul´ asi inform´aciokat t´arolni tudj´ak, vagy ak´ar tov´abb´ıtani is. Az Adjustment ´ ´ e´ rt´ekek t´arol´asa, e´ s tartom´any-elemek e´ rt´ekeinek nyilv´antart´asa legk´ezenfekv˝obb felhaszn´al´asi modja konfigur´acios ¨ ıt˝ocs´ık e´ s a scale control nagy´ıt´as-´all´ıto´ elem). (ilyen p´eld´aul a scroll-bar - gord´ ´ szign´al kibocs´ajt´as´ara k´epes, mely a programozo´ fuggv´ ¨ Az Adjustment objektum az elemekhez hasonloan enyeivel ¨ egyid˝oben m´as a´ ll´ıthato´ felulet-elemmel is kommunik´alhat. Ennek r´eszleteit a Progress bar, Viewports, Scrolled windows elemekn´el tal´alod meg.
6.1.
Adjustment elem l´etrehoz´asa
Az Adjustment-et haszn´alo´ elemek egy r´esze a l´etrehoz´ast automatikusan elv´egzi, de el˝ofordul olyan eset is ´ amikor a programozonak kell azt l´etrehoznia, ´ıgy: 1 2 3 4 5 6
GtkObject ∗ gtk adjustment new ( gdouble gdouble gdouble gdouble gdouble gdouble
value , lower , upper , step increment , page increment , page size ) ;
´ at. A A value egy kezdeti e´ rt´eket tartalmaz, rendszerint a be´all´ıto´ elem fels˝o vagy baloldali poz´ıcioj´ ¨ az az lower az a legalacsonyabb e´ rt´eket tartalmazza, amit az elem felvehet. A step_increment (l´ep´eskoz) e´ rt´ek amennyivel a felhaszn´alo´ l´eptetheti az elemben t´arolt e´ rt´eket. A page_increment pedig egy nagyobb ¨ A page_size e´ rt´ek valamilyen modon ´ ¨ l´ep´eskoz. az elemb˝ol l´athato´ terulethez, a befoglalo´ elem nagys´ag´ahoz ´ ´ e´ s csuszk´ ´ kapcsolodik (pl. amikor egy k´epb˝ol egy r´eszlet l´athato, akkal lehet tologatni). Az upper e´ rt´eket a be´agyazott elem legjobboldalibb vagy legalso´ sz´el´enek jelz´es´ere haszn´alj´ak (hogy az mekkora). A Value az upper-n´el nagyobb e´ rt´eket is felvehet, mert a page_size rendszerint null´an´al nagyobb.
6.2.
A modos´ ´ ıto´ elem egyszeru˝ haszn´alata
´ ¨ adott e´ rt´ek-egys´egekkel dolgozik. A modos´ ıthato´ elemek egy r´esze tetsz˝oleges e´ rt´eket felvehet, m´as r´eszuk Tetsz˝oleges e´ rt´eket vehetnek fel p´eld´aul a scrollbars, scales, progress-bar elemek, vagy p´eld´aul egy tekerhet˝o ¨ ¨ a´ ll´ıthatja. Ezek az elemek a lower e´ s az upper gomb. Jellemz˝oen ezek e´ rt´ek´et a felhaszn´alo´ kozvetlen ul ¨ a felhaszn´alo´ az e´ rt´eket - a e´ rt´ekeket az a´ br´azolhato´ tartom´any also´ e´ s fels˝o hat´arak´ent e´ rtelmezik, amin belul value e´ rt´ek´et - tetsz˝olegesen a´ ll´ıthatja. ¨ ´ ¨ A (kozvetetten modos´ ıtott) m´asik csoportba tartozo´ elemek a text (szoveg), a viewport (r´eszlet-megjelen´ıt˝o), ¨ ¨ a compound list (osszetett lista) e´ s a gorgethet˝ o ablakok. Ezen elemek tulajdons´agait pixelben hat´arozzuk meg. 41
¨ ıt˝os´avon keresztul, ¨ kozvetetten ¨ ´ A felhaszn´alo´ ezeket az elemeket a gord´ modos´ ıtja. Alapvet˝oen egy elem vagy ´ ¨ ´ l´etrehozza saj´at modos´ ıto´ elem´et, vagy a programozo´ hozza l´etre azt - a kozvetetten modos´ ıtott elemekn´el ´ rendszerint az a k´ıv´anatos, hogy az elem hozza l´etre a saj´at modos´ ıto´ elem´et. ´ ´ Az automatikus modos´ ıto-elem l´etrehoz´asakor a value e´ rt´ek kiv´etel´evel a tulajdons´agok az adott elemre ´ ol ´ jellemz˝o alap´ertelmezett e´ rt´ekeket veszik fel - ez egy´ebk´ent elemenk´ent v´altozo´ lehet, r´eszleteket a forr´askodb tudhatsz meg. ¨ a k´erd´es, vajon ha a szoveg ¨ Felmerul elem e´ s a r´eszlet-megjelen´ıt˝o (viewport) mindent be´all´ıt a value-n ¨ mialatt a gord´ ¨ ıt´av kiz´arolag ´ ¨ enik akkor, ha egy modos´ ´ k´ıvul, a value e´ rt´ek´et a´ ll´ıtja – mi tort´ ıthato´ objektumot ¨ ¨ ıt˝os´av koz ¨ ott? ¨ ¨ ıt˝os´av ekkor automatikusan modos´ ´ megosztasz a szoveges elem e´ s a gord´ Nos, a gord´ ıtani fogja a r´eszlet-megjelen´ıt˝o value e´ rt´ek´et! Valahogy ´ıgy: 1 2
/∗ u j r e s z l e t −m e g j e l e n i t o l e t r e h o z a s a ∗/ viewport = gtk viewport new (NULL, NULL ) ;
3 4 5
/∗ a g o r d i t o s a v es a r e s z e t −m e g j e l e n i t o o s s z e k a p c s o l a s a ∗/ v s c r o l l b a r = g t k v s c r o l l b a r n e w ( g t k v i e w p o r t g e t v a d j u s t m e n t ( viewport ) ) ;
6.3.
Belso˝ modos´ ´ ıtok ´
¨ enik akkor, ha a felhaszn´alo´ gord´ ¨ ıt˝os´av-tologat´as´ara a saj´at fuggv´ ¨ Ez id´aig rendben van, de mi tort´ enyedet fut´ hogyan kapod meg a gord´ ¨ ıt˝os´av eltol´as´anak m´ert´ek´et? A v´alasz a struct _GtkAdjustmenttatn´ad le? Es ´ ben tal´alhato: 1 2 3 4 5 6 7 8 9 10
s t r u c t GtkAdjustment { GtkObject p a r e n t i n s t a n c e ; gdouble lower ; gdouble upper ; gdouble value ; gdouble s t e p i n c r e m e n t ; gdouble page increment ; gdouble p a g e s i z e ; }; ´ at haszn´alni (pedig ez a javasolt ut ´ :-), van egy fuggv´ ¨ Ha nem akarod a fenti struktur´ eny is az adatok lek´erdez´es´ere:
1
gdouble g t k a d j u s t m e n t g e t v a l u e ( GtkAdjustment ∗ adjustment ) ; ´ ´ ınuleg ˝ ¨ az ig´eny hogy az e´ rt´ekv´altoz´as Ha egy modos´ ıto´ elem e´ rt´ek´et (value) be´all´ıtottad, valosz´ felmerul ¨ oz˝ ¨ odjon, ¨ l´athatov´ ´ a v´aljon a modos´ ´ ¨ tukr ıto´ elemet haszn´alo´ felulet elemen. Ez az az eset, amikor egy e´ rt´ekt˝ol ´ ´ ´ az e´ rt´ek. v´altozik egy csuszka helyzete, nem pedig a csuszk´ atol Ezt a hat´ast ´ıgy e´ rheted el:
1 2
void g t k a d j u s t m e n t s e t v a l u e ( GtkAdjustment ∗ adjustment , gdouble value ); ¨ hogy az Adjustment (modos´ ´ ´ ´ az Object-b˝ol sz´armazik, ak´arcsak a Kor´abban m´ar eml´ıtettuk, ıto/be´ all´ıto) ¨ ¨ ´ szign´alt tud kibocs´ajtani. Ez az oka az automatikus elem-be´all´ıt´as tobbi felulet-elem, ez´ert azokhoz hasonloan ¨ es´enek, amikor egy modos´ ´ ¨ ıt˝os´avhoz e´ s egy m´asik a´ ll´ıthato´ elemhez rendelsz. frissul´ ıto´ elemet p´eld´aul egy gord´ ´ Az a´ ll´ıthato´ elemek figyelik a hozz´ajuk tartozo´ modos´ ıto´ elem value_changed szign´alj´at. ´ A value_changed szign´al defin´ıcioja:
1
void ( ∗ value changed ) ( GtkAdjustment ∗ adjustment ) ; ´ ¨ elemek bocs´ajtj´ak ki, ha megv´altozik az e´ rt´ekuk ¨ - ak´ar a felEz a jelz´est a modos´ ıto´ elemet haszn´alo´ felulet ¨ haszn´alo´ v´altoztatta azt meg, ak´ar a programban szerepel egy gtk_adjustment_set_value() fuggv´ eny. ¨ ¨ ¨ Ha p´eld´aul van egy nagy´ıt´as feluletelemed, e´ s a k´ep a nagy´ıt´asa a nagy´ıt´as felulet elemt˝ol fuggetlen ok mi´ ol ´ fekv˝ore forgatsz egy k´epet, ami kitolti ¨ a monitort), a modos´ ´ att megv´altozna (p´eld´aul a´ llor ıto´ elemet ´ıgy haszn´alhatod:
1 2 3 4
void c b r o t a t e p i c t u r e ( GtkAdjustment ∗ adj , GtkWidget ∗ p i c t u r e ) { s e t p i c t u r e r o t a t i o n ( picture , gtk adjustment get value ( adj ) ) ; ... ´ ´ ahoz csatolhatod (value change szign´al!): e´ s ezt a nagy´ıt´as elem modos´ ıtoj´ 42
1 2
g s i g n a l c o n n e c t ( G OBJECT ( a d j ) , ” value changed ” , G CALLBACK ( c b r o t a t e p i c t u r e ) , ( g p o i n t e r ) p i c t u r e ) ; ¨ enik, ha egy elem upper, lower tulajdons´aga megv´altozik, p´eld´aul a felhaszn´alo´ beg´epel egy ujabb ´ Mi tort´ ˝ a szovegmez˝ ¨ betut obe? Ekkor egy changed (megv´altoztatva) jelz´est ad le az elem:
1
void ( ∗ changed ) ( GtkAdjustment ∗ adjustment ) ; ¨ Az intervallumokkal dolgozo´ elemek tipikusan figyelik ezt a jelz´est, e´ s a v´altoz´as a felulet-elem megje´ ´ megv´altoztatod, akkor a megv´altoztatva len´es´eben azonnal l´athato´ lesz. Ha egy modos´ ıto´ elem e´ rt´ek´et programbol jelz´est is neked kell kiadni:
1
g s i g n a l e m i t b y n a m e ( G OBJECT ( adjustment ) , ” changed ” ) ;
7.
Intervallum elemek
¨ ¨ ıt˝os´av (scrollbar), Az intervallum elemek sz´amtartom´anyokat jelk´epeznek. Ilyen felulet-elem p´eld´aul a gord´ ´ vagy a GIMP-es mint´an l´athato´ tologomb (scale widget). B´ar a k´et elemet m´as-m´as feladatra haszn´aljuk, meg´ ıt´asukban e´ s muk ˝ od´ ¨ esukben ¨ ´ ¨ os ¨ grafikus e´ p´ıt˝okock´akat valos´ nagyon hasonloak. Az intervallum elemek koz ¨ ´ ¨ ıt˝os´avon a gomb, haszn´alnak onmaguk megjelen´ıt´es´ere. Ilyen e´ p´ıt˝okocka p´eld´aul a tologomb gombfeje – a gord´ ´ e´ s jobbra-balra tologatjuk, egy szovegszerkeszt˝ ¨ ¨ amin ha lenyomjuk az eg´ermutatot oben tudjuk a szoveg k´ep´et ¨ os ¨ elem a gomb mog ¨ otti ¨ v´ajat, amibe illesztve a gomb csuszik. ´ mozgatni. A m´asik tipikus koz
´ ´ ´ Minden intervallum elem egy modos´ ıto´ elemhez kapcsolodik. Ha a felhaszn´alo´ a csuszka gombj´at moz´ gatja, a gomb a hozz´a tartozo´ modos´ ıto´ elem value e´ rt´ek´et friss´ıteni fogja.
7.1.
A gord´ ¨ ıtos´ ˝ av (scrollbar)
¨ ul ¨ az els˝o az oktatoban ´ ´ ¨ ¨ - a probl´ema az A k´et p´elda koz bemutatott csuszka hozz´aad´asa egy szovegmez˝ ohoz ´ kezeli. Viszont megfigyelhet˝o rajta, hogy egy elemhez hogy lehet vele, hogy unicode karaktereket nem jol ¨ ıt˝os´avot. A m´asodik p´elda m´as alapokra e´ pul, ¨ kezeli a unicode-ot is, e´ s egyszerubb, ˝ hozz´ailleszteni egy gord´ ´ be´ep´ıtett gord´ ¨ ıt˝os´avokat tartalmaz. viszont kap´asbol
43
¨ ıt˝os´avokat m´as elemek megjelen´ıt´ese kozben ¨ ¨ A gord´ haszn´aljuk, p´eld´aul list´ak, szovegdobozok, r´esz-megjelen´ıt˝ok. ¨ oleges gord´ ¨ ıt˝os´avokat ´ıgy hozhatsz l´etre: V´ızszintes e´ s fugg˝ 1 2
GtkWidget ∗ g t k h s c r o l l b a r n e w ( GtkAdjustment ∗ adjustment ) ; GtkWidget ∗ g t k v s c r o l l b a r n e w ( GtkAdjustment ∗ adjustment ) ; ´ Az adjustment param´eter vagy egy mutato´ egy modos´ ıto´ elemre, vagy NULL – amikor automatikusan ¨ egy uj ´ modos´ ´ l´etrejon ıto´ elem. ˝ eset, amikor van unicode szoveg, ¨ ¨ a gord´ ¨ ıt˝os´av: Az egyszerubb e´ s automat´an l´etrejon
1 2
/∗ o r i g i n a l Author : Andrew Kraus − Apress . com , GTK book ∗/ # i n c l u d e
3 4 5 6 7 8
i n t main ( i n t argc , char ∗ argv [ ] ) { GtkWidget ∗window , ∗ s c r o l l e d w i n , ∗ t e x t v i e w ; GtkTextBuffer ∗ buffer ;
9 10
g t k i n i t (& argc , &argv ) ;
11 12 13 14 15 16
/∗ a b l a k l e t r e h o z a s , f e j l e c b e a l l i t a s , m a r g o b e a l l i t a s , m e r e t b e a l l i t a s ∗/ window = gtk window new (GTK WINDOW TOPLEVEL ) ; g t k w i n d o w s e t t i t l e (GTK WINDOW ( window ) , ” G o r d i t h e t o szovegmezo” ) ; g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( window ) , 1 0 ) ; g t k w i d g e t s e t s i z e r e q u e s t ( window , 3 5 0 , 1 5 0 ) ;
17 18 19 20 21
/∗ d e s t r o y s i g n a l r a g t k m a i n q u i t fuggveny fusson l e − s a j a t fuggvenyt ∗ i s i r h a t s z a k i l e p e s h e z . ∗/ g s i g n a l c o n n e c t ( G OBJECT ( window ) , ” d e s t r o y ” , G CALLBACK ( g t k m a i n q u i t ) , NULL ) ;
22 23 24 25
textview = gtk text view new ( ) ; b u f f e r = g t k t e x t v i e w g e t b u f f e r ( GTK TEXT VIEW ( t e x t v i e w ) ) ;
26 27 28
/∗ programbol szoveg i r a s a f e l u l e t −elembe ∗/ g t k t e x t b u f f e r s e t t e x t ( b u f f e r , ” T e l e t e t t e m eme elemet ! : −) Unicode i s megy ! ” , −1);
29 30 31 32 33
s c r o l l e d w i n = gtk scrolled window new (NULL, NULL ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( s c r o l l e d w i n ) , t e x t v i e w ) ; g t k s c r o l l e d w i n d o w s e t p o l i c y (GTK SCROLLED WINDOW ( s c r o l l e d w i n ) , GTK POLICY AUTOMATIC, GTK POLICY ALWAYS ) ;
34
44
g t k c o n t a i n e r a d d (GTK CONTAINER ( window ) , s c r o l l e d w i n ) ; g t k w i d g e t s h o w a l l ( window ) ;
35 36 37
gtk main ( ) ; return 0;
38 39 40
} ¨ ıt˝os´avot kul ¨ on ¨ a szoveg ¨ Az az eset, amikor a gord´ mell´e rakjuk:
1 2 3
# d e f i n e GTK ENABLE BROKEN # i n c l u d e < s t d i o . h> # i n c l u d e
4 5 6 7 8 9
void k i l e p e s ( GtkWidget ∗ widget , gpointer data ) { gtk main quit ( ) ; }
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
i n t main ( i n t argc , char ∗ argv [ ] ) { GtkWidget ∗window ; GtkWidget ∗ box1 ; GtkWidget ∗ box2 ; GtkWidget ∗hbox ; GtkWidget ∗ button ; GtkWidget ∗ check ; GtkWidget ∗ s e p a r a t o r ; GtkWidget ∗ t a b l e ; GtkWidget ∗ v s c r o l l b a r ; GtkWidget ∗ t e x t ; GdkColormap ∗cmap ; GdkColor c o l o r ; GdkFont ∗ f i x e d f o n t ;
27 28
g t k i n i t (& argc , &argv ) ;
29 30 31 32
/∗ u j a b l a k l e t r e h o z a s a ∗/ /∗ ablakmeret b e a l l i t a s ∗/ /∗ k i l e p e s i l e h e t o s e g ∗/
33 34 35
/∗ a b l a k cim b e a l l i t a s
36
∗/
window = gtk window new (GTK WINDOW TOPLEVEL ) ; g t k w i d g e t s e t s i z e r e q u e s t ( window , 6 0 0 , 2 0 0 ) ; g signal connect ( G OBJECT ( window ) , ” d e s t r o y ” , G CALLBACK ( k i l e p e s ) , NULL ) ; g t k w i n d o w s e t t i t l e ( GTK WINDOW ( window ) , ” Gorditosav Text widget−e l ” ) ;
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
/∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗
a window ( a b l a k ) elem e g y s z e r r e csak egy elemet tud befogadni . e z e r t a program f e l h a s z n a l o i f e l u l e t e t ugy e p i t h e t j u k f e l , hogy elobb dobozt rakunk az ablakba , majd abba helyezzuk e l a t o v a b b i elemeket .
+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ | window | | +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ | | | box1 | | | | | | | | +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ | | | | | box2 | | | | | | #=====================================# | | | | | | # t a b l a −szovegmezo | g # | | | 45
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
∗ | | | # | o # | | | ∗ | | | # | r # | | | ∗ | | | # | d # | | | ∗ | | | # | i # | | | ∗ | | | # | t # | | | ∗ | | | # | o # | | | ∗ | | | #=====================================# | | | ∗ | | | | | | ∗ | | +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ | | ∗ | | | | ∗ | | ==================SEPARATOR===================== | | ∗ | | | | ∗ | | +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ | | ∗ | | | u j doboz , s z i n t e n box2−be t o l t v e a cime | | | ∗ | | | | | | ∗ | | | GOMB | | | ∗ | | | | | | ∗ | | +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ | | ∗ | | | | ∗ | +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ | ∗ +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ ∗ ∗/ box1 = gtk vbox new ( FALSE , 0 ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( window ) , box1 ) ; gtk widget show ( box1 ) ;
80 81 82 83 84
/∗ /∗ /∗ /∗
u j doboz ∗/ box2 = gtk vbox new ( FALSE , 1 0 ) ; margo b e a l l i t ∗/ g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( box2 ) , 1 0 ) ; bepakolas box1be ∗/ g t k b o x p a c k s t a r t (GTK BOX ( box1 ) , box2 , TRUE, TRUE, 0 ) ; m e g j e l e n i t e s ∗/ gtk widget show ( box2 ) ;
/∗ ∗ ∗ ∗ ∗
Fontos : a g o r d i t o s a v o s szovegmezo j e l e n p e l d a t o l e l t e r o e n i s l e t r e h o z h a t o , ugy hogy a g o r d i t o s a v mar a l a p b o l a szovegmezohoz t a r t o z i k . Mivel a pelda a g o r d i t o s a v mukodeset m u t a t j a be , i t t a z t az u t a t v a l a s z t o t t a m hogy kulon adom hozza a szovegmezohoz − v i s z o n t az elemek i g a z i t a s a h o z t a b l a z a t o t k e l l hasznalnom . ∗/
85 86 87 88 89 90 91 92 93 94 95 96
t a b l e = g t k t a b l e n e w ( 2 , 2 , FALSE ) ; g t k t a b l e s e t r o w s p a c i n g ( GTK TABLE ( t a b l e ) , 0 , 2 ) ; g t k t a b l e s e t c o l s p a c i n g ( GTK TABLE ( t a b l e ) , 0 , 2 ) ; g t k b o x p a c k s t a r t (GTK BOX ( box2 ) , t a b l e , TRUE, TRUE, 0 ) ; gtk widget show ( t a b l e ) ;
97 98 99 100 101 102 103
/∗ GtkText elem l e t r e h o z a s a ∗/ t e x t = g t k t e x t n e w (NULL, NULL ) ; /∗ s z e r k e s z t h e t o legyen ∗/ g t k t e x t s e t e d i t a b l e ( GTK TEXT ( t e x t ) , TRUE ) ; /∗ b e i l l e s z t e s t a b l a z a t b a ∗/ g t k t a b l e a t t a c h ( GTK TABLE ( t a b l e ) , t e x t , 0 , 1 , 0 , 1 , GTK EXPAND | GTK SHRINK | GTK FILL , GTK EXPAND | GTK SHRINK | GTK FILL , 0 , /∗ szovegmezo m e g j e l e n i t e s e ∗/ gtk widget show ( t e x t ) ;
104 105 106 107 108 109 110 111 112
/∗ A g o r d i t o s a v o t a t a b l a z a t t a r t j a a szovegmezo m e l l e t t . Az elem f u g g o l e g e s e n ∗ k i t o l t i a t a b l a z a t o t , ha nem igy lenne , a g o r d i t o s a v rovidebb lenne mint ∗ a szovegmezo . ∗/ v s c r o l l b a r = g t k v s c r o l l b a r n e w ( GTK TEXT ( t e x t )−>vadj ) ; g t k t a b l e a t t a c h ( GTK TABLE ( t a b l e ) , v s c r o l l b a r , 1 , 2 , 0 , 1 , GTK FILL , GTK EXPAND | GTK SHRINK | GTK FILL , 0 , 0 ) ; gtk widget show ( v s c r o l l b a r ) ;
113 114 115 116
/∗ A GTK f o r r a s k o d j a s z e r i n t ez egy r i t k a n h a s z n a l t fuggveny , ∗ GDK e r o f o r r a s o k a t r e n d e l az elemhez . 46
∗ Tapasztalatom s z e r i n t a szovegdobozba b e i r t szoveg vegere k e r u l a kurzor , ∗ ha a r e a l i z e () − t v e g r e h a j t j u k , egyebkent a szoveg e l e j e n marad . Mas h i a n y a t ∗ nem t a p a s z t a l t a m , a f o r r a s k o d sem i r t konkretumot . ∗ ∗/ gtk widget realize ( text ) ;
117 118 119 120 121 122 123
f i x e d f o n t = g d k f o n t l o a d ( ”−misc−f i x e d −medium−r −∗−∗−∗−140−∗−∗−∗−∗−∗−∗” ) ; g t k t e x t i n s e r t ( GTK TEXT ( t e x t ) , NULL, &t e x t −>s t y l e −>black , NULL, ” Ide l e h e t szo vegeket i r n i : ” , −1);
124 125 126 127 128 129
hbox = gtk hbutton box new ( ) ; g t k b o x p a c k s t a r t (GTK BOX ( box2 ) , hbox , FALSE , FALSE , 0 ) ; gtk widget show ( hbox ) ;
130 131 132 133
/∗ s z e p a r a t o r az az e l v a l a s z t o vonal ami a gomb es a szovegmezo k o z o t t van . ∗ l e t r e h o z z u k , berakjuk , m e g j e l e n i t j u k . ∗/ separator = gtk hseparator new ( ) ; g t k b o x p a c k s t a r t (GTK BOX ( box1 ) , s e p a r a t o r , FALSE , TRUE, 0 ) ; gtk widget show ( s e p a r a t o r ) ;
134 135 136 137 138 139
/∗ egy u j dobozt c s i n a l u n k a gombnak . Figyelem , ez nem ugyanaz a doboz , ∗ mint a f e n t e b b i box2 ! j o l megfigyelheto , hogy v a l o j a b a n box2−r e csak ∗ addig van szukseg , amig a dobozra h i v a t k o z n i akarunk . P e l d a u l igy ∗ gombsorozatokat i s l e t r e l e h e t hozni , hogy egy c i k l u s b a n egy v a l t o z o b a teszem ∗ az u j gombok m u t a t o j a t , mert ha b e a l i t o t t a m utana mar nem l e s z szuksegem ∗ a mutatora , az csak egy a t m e n e t i v a l t o z o . ∗ box2 i t t egy u j mutatot kap e r t e k u l , amit a gtk vbox new fuggveny ad v i s s z a . ∗ ∗/ box2 = gtk vbox new ( FALSE , 1 0 ) ; g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( box2 ) , 1 0 ) ; g t k b o x p a c k s t a r t (GTK BOX ( box1 ) , box2 , FALSE , TRUE, 0 ) ; gtk widget show ( box2 ) ;
140 141 142 143 144 145 146 147 148 149 150 151 152
button = g t k b u t t o n n e w w i t h l a b e l ( ” Bezaras ” ) ; g s i g n a l c o n n e c t ( G OBJECT ( button ) , ” c l i c k e d ” , G CALLBACK ( k i l e p e s ) , NULL ) ;
153 154 155 156 157
/∗ dobozt box2−be ∗/
g t k b o x p a c k s t a r t (GTK BOX ( box2 ) , button , TRUE, TRUE, 0 ) ; GTK WIDGET SET FLAGS ( button , GTK CAN DEFAULT ) ; g t k w i d g e t g r a b d e f a u l t ( button ) ; /∗ g o m b m e g j e l e n i t es ∗/ gtk widget show ( button ) ;
158 159 160 161 162
gtk widget show ( window ) ; gtk main ( ) ; return 0;
163 164 165 166
}
7.2.
Tologomb ´ (scale widget)
´ ¨ oleges verzioja ´ - muk ˝ od´ ¨ esuk ¨ megegyezik, ´ıgy hozhatod l´etre o˝ ket: A tologombnak is van v´ızszintes e´ s fugg˝ 1 2 3 4
GtkWidget ∗ g t k v s c a l e n e w ( GtkAdjustment ∗ adjustment ) ; GtkWidget ∗ g t k v s c a l e n e w w i t h r a n g e ( gdouble min , gdouble max , gdouble s t e p ) ;
5 6 7
GtkWidget ∗ g t k h s c a l e n e w ( GtkAdjustment ∗ adjustment ) ; GtkWidget ∗ g t k h s c a l e n e w w i t h r a n g e ( gdouble min , 47
gdouble max , gdouble s t e p ) ;
8 9
´ Az adjustment param´eter hely´ebe vagy NULL-t ´ırsz, vagy egy mutato = gtk_adjustment_new() modon ´ Ha a NULL-t v´alasztod, akkor is l´etrejon ¨ egy n´evtelen Adjustment (be´all´ıto) ´ objektum, e´ s l´etrehozott mutatot. minden e´ rt´eke 0.0-lesz.
7.3.
Fuggv´ ¨ enyek e´ s szign´alok
´ ´ egy e´ rt´eket reprezent´al. Alap´ertelmez´esk´ent ezt az e´ rt´eket sz´amszeruen ˝ A tologomb adott e´ rt´ektartom´anybol ´ ki is ´ırja, de ha akarod, a ki´ır´as kikapcsolhato: 1 2
void g t k s c a l e s e t d r a w v a l u e ( G t k S c a l e ∗ s c a l e , gboolean draw value ) ; Itt a draw_value e´ rt´eket a´ ll´ıthatod TRUE vagy FALSE-ra az e´ rt´ek kijelz´es´ehez. A kijelz´es alap´ertelmez´es ´ szerint egy tizedesjegy pontoss´agu´ (kerek´ıtett), e´ s ez is szab´alyozhato:
1 2
void g t k s c a l e s e t d i g i t s ( G t k S c a l e ∗ s c a l e , gint digits ) ; ´ Itt a digits e´ rt´ek´evel szab´alyozhatod a kijez´es pontoss´ag´at- a tologomb maximum 13 tizedesjegyet jelen´ıt meg. ¨ a kijelz´es poz´ıcioja ´ is a´ ll´ıthato: ´ V´egezetul
1 2
∗ scale , void g t k s c a l e s e t v a l u e p o s ( G t k S c a l e GtkPositionType pos ) ; A pos param´eter lehets´eges e´ rt´ekei: GTK_POS_LEFT GTK_POS_RIGHT GTK_POS_TOP GTK_POS_BOTTOM ¨ ¨ Az eddig ismertetett fuggv´ enyek le´ır´as´at a f´ajlban tal´alod. Minden GTK felulet-elem ´ header f´ajlja a include-ol´asakor automatikusan el´erhet˝ov´e v´alik (include-olodik). Ha valame¨ ˝ od´ ¨ ese m´elyebben e´ rdekel, n´ezd meg a forr´askodj´ ´ at! lyik fuggv´ eny muk
7.4.
´ Altal´ anos fuggv´ ¨ enyek intervallum elemekhez
¨ A a´ llom´anyban tal´alhato´ n´eh´any hasznos fuggv´ eny, mely minden intervallum elemmel ˝ odik. ¨ muk 7.4.1.
Friss´ıt´esi szab´alyok (update policy)
¨ A kovetkez˝ o be´all´ıt´asok a value e´ rt´ek megv´altoz´as´anak e´ s a value_changed szign´al kibocs´ajt´as´anak az id˝opontj´at befoly´asolj´ak: • GTK_UPDATE_CONTINUOUS - folyamatos friss´ıt´es. Ez az alap´ertelmezett be´all´ıt´as, ha a felhaszn´alo´ moz´ ¨ gatja a tologombot, a mozg´as kozben folyamatos a friss´ıt´es. ´ • GTK_UPDATE_DISCONTINUOUS - szakaszos friss´ıt´es. Amikor a felhaszn´alo´ a csuszka mozgat´as´at befe¨ az e´ rt´ek. jezte e´ s felengedte az eg´ergombot, akkor frissul ´ ¨ • GTK_UPDATE_DELAYED - k´esleltetett friss´ıt´es, ami a tologomb rovid ideju˝ meg´all´asakor, vagy az eg´ergomb ¨ enik. felenged´esekor tort´ 7.4.2.
Modos´ ´ ıto´ elemek el´er´ese, hozz´arendel´ese
´ Modos´ ıto´ elem el´er´ese e´ s be´all´ıt´asa: 1 2 3
GtkAdjustment ∗ g t k r a n g e g e t a d j u s t m e n t ( GtkRange ∗ range ) ; void g t k r a n g e s e t a d j u s t m e n t ( GtkRange ∗ range , GtkAdjustment ∗ adjustment ) ; ´ ´ aval t´er vissza. Ha az intervallum elemhez A gtk_renge_get_adjustment() a modos´ ıto´ elem mutatoj´ ´ modos´ ´ ¨ ´ uj ıto´ elemet rendelsz, lefut a gtk_range_adjustment_changed() fuggv´ eny, ami a csuszka m´eret´et ´ at ujrasz´ ´ ¨ eges ujrarajzolja. ´ e´ s poz´ıcioj´ amolja e´ s ha szuks´ ´ ¨ ¨ modos´ ´ Ha a csuszka e´ rt´ek´et kozvetlen ul ıtod, k´ezzel kell kiadnod a changed szign´alt: 48
1
g s i g n a l e m i t b y n a m e ( G OBJECT ( adjustment ) , ” changed ” ) ; 7.4.3.
Billentyuzet ˝ e´ s eg´er esem´enyek e´ szlel´ese
¨ e-kev´esb´e minden GTK elem hasonlo´ modon ´ ˝ Tobb´ reag´al az eg´er e´ s billentyuzet bemenetre. A bal eg´ergomb ´ ¨ ¨ lenyom´as´ara a modos´ ıto´ elem page_increment e´ rt´eke noveli vagy csokkenti a value e´ rt´ek´et (ha negat´ıv, ¨ ´ ´ akkor csokkenti) – majd a csuszka felveszi az e´ rt´eknek megfelel˝o poz´ıciot. ¨ eps˝o gombj´at nyomod le a csuszk´ ´ ´ ´ poz´ıciora ´ ugrik. Minden Ha az eg´er koz´ an, a tologomb azonnal az uj intervallum elemn´el haszn´alhato´ a page up, page down (nagy ugr´as el˝ore-h´atra page_increment e´ rt´ekkel), ˝ (kis ugr´asok el˝ore-h´atra, step_increment e´ rt´ekkel). a ny´ıl billentyuk ´ ´ Haszn´alhato´ m´eg a home e´ s az end billentyu˝ a tologomb also´ vagy fels˝o hat´ar´ahoz ugr´asra. (GIMP csuszk´ aj´an ¨ tesztelhet˝ok :-) az el˝obbi gombok remekul
7.5.
P´elda
¨ ´ ¨ ıt˝os´av egy e´ rt´ekkel dolgozik, b´armelyik modos´ ´ A kovetkez˝ o p´eld´aban a tologombok e´ s a gord´ ıt´asa azonnal ¨ ´ alni. l´atszik a tobbin. Az also´ be´all´ıt´asi lehet˝os´egeket e´ rdemes kiprob´
´ ol ´ l´atszik, hogy nem haszn´altuk a g_signal_connect() fuggv´ ¨ A programkodb enyt a delete_event ¨ esem´eny figyel´es´ere, csak a destroy esem´enyhez kapcsoltunk kezel˝o fuggv´ enyt. Ez a megold´as szint´en kiel´eg´ıt˝o, mert a lekezeletlen destroy esem´eny destroy esem´eny kiv´alt´as´ahoz vezet. 1 2
# i n c l u d e
3 4
GtkWidget ∗ h s c a l e , ∗ v s c a l e ;
5 6 7 8 9 10 11 12
void c b p o s m e n u s e l e c t ( GtkWidget ∗ item , GtkPositionType pos ) { /∗ A k e t tologomb e r t e k e t a l l i t j a be ∗/ g t k s c a l e s e t v a l u e p o s ( GTK SCALE ( h s c a l e ) , pos ) ; g t k s c a l e s e t v a l u e p o s ( GTK SCALE ( v s c a l e ) , pos ) ; }
13 14 15 16 17 18 19 20
void c b u p d a t e m e n u s e l e c t ( GtkWidget ∗ item , GtkUpdateType p o l i c y ) { /∗ A tologombok f r i s s i t e s i s z a b a l y a i n a k b e a l l i t a s a ∗/ g t k r a n g e s e t u p d a t e p o l i c y (GTK RANGE ( h s c a l e ) , p o l i c y ) ; g t k r a n g e s e t u p d a t e p o l i c y (GTK RANGE ( v s c a l e ) , p o l i c y ) ; }
21 22
void c b d i g i t s s c a l e ( GtkAdjustment ∗ a d j ) 49
23
{ /∗ T i z e d e s j e g y e k szamanak b e a l l i t a s a , adj−>value e r t e k e t ehhez k e r e k i t i GTK ∗/ g t k s c a l e s e t d i g i t s ( GTK SCALE ( h s c a l e ) , ( g i n t ) adj−>value ) ; g t k s c a l e s e t d i g i t s ( GTK SCALE ( v s c a l e ) , ( g i n t ) adj−>value ) ;
24 25 26 27
}
28 29 30 31 32 33 34
void c b p a g e s i z e ( GtkAdjustment ∗ get , GtkAdjustment ∗ s e t ) { /∗ page s i z e es page increment e r t e k e n e k b e a l l i t a s a ∗/ s e t −>p a g e s i z e = get−>value ; s e t −>page increment = get−>value ;
35
/∗ Modosito elem b e a l l i t a s a es ” changed ” s z i g n a l k i a d a s a ami u j r a k o n f i g u r a l j a a s z i g n a l t f i g y e l o f e l u l e t elemeket . ∗/ g t k a d j u s t m e n t s e t v a l u e ( s e t , CLAMP ( s e t −>value , s e t −>lower , ( s e t −>upper − s e t −>p a g e s i z e ) ) ) ;
36 37 38 39 40 41
}
42 43 44 45 46 47 48 49
void cb { /∗ ∗ gtk gtk }
draw value ( GtkToggleButton ∗ button ) E r t e k k i j e l z e s ki−be k a p c s o l a s a j e l o l o n e g y z e t ( pipa ) a l l a s a t o l fuggoen ∗/ s c a l e s e t d r a w v a l u e ( GTK SCALE ( h s c a l e ) , button−>a c t i v e ) ; s c a l e s e t d r a w v a l u e ( GTK SCALE ( v s c a l e ) , button−>a c t i v e ) ;
50 51 52 53 54 55 56
/∗ Menu e r t e k e k b e a l l i t a s a ∗/ GtkWidget ∗make menu item ( gchar ∗name , GCallback c a l l b a c k , gpointer data ) { GtkWidget ∗ item ;
57
item = g t k m e n u i t e m n e w w i t h l a b e l ( name ) ; g s i g n a l c o n n e c t ( G OBJECT ( item ) , ” a c t i v a t e ” , c a l l b a c k , ( g p o i n t e r ) data ) ; gtk widget show ( item ) ;
58 59 60 61 62
r e t u r n item ;
63 64
}
65 66 67 68 69 70 71 72 73
void s c a l e s e t d e f a u l t v a l u e s ( G t k S c a l e ∗ s c a l e ) { g t k r a n g e s e t u p d a t e p o l i c y (GTK RANGE ( s c a l e ) , GTK UPDATE CONTINUOUS ) ; g t k s c a l e s e t d i g i t s ( scale , 1 ) ; g t k s c a l e s e t v a l u e p o s ( s c a l e , GTK POS TOP ) ; g t k s c a l e s e t d r a w v a l u e ( s c a l e , TRUE ) ; }
74 75 76 77 78 79 80 81 82 83 84
/∗ minta a b l a k l e t r e h o z a s a ∗/ void c r e a t e r a n g e c o n t r o l s ( void ) { GtkWidget ∗window ; GtkWidget ∗box1 , ∗box2 , ∗ box3 ; GtkWidget ∗ button ; GtkWidget ∗ s c r o l l b a r ; GtkWidget ∗ s e p a r a t o r ; GtkWidget ∗ opt , ∗menu , ∗ item ; 50
85 86 87
GtkWidget ∗ l a b e l ; GtkWidget ∗ s c a l e ; GtkObject ∗ adj1 , ∗ a d j 2 ;
88 89 90 91 92 93 94
/∗ a b l a k d e f i n i a l a s a , k i l e p e s r e f e l k e s z i t e s ∗/ window = gtk window new (GTK WINDOW TOPLEVEL ) ; g s i g n a l c o n n e c t ( G OBJECT ( window ) , ” d e s t r o y ” , G CALLBACK ( g t k m a i n q u i t ) , NULL ) ; g t k w i n d o w s e t t i t l e (GTK WINDOW ( window ) , ” I n t e r v a l l u m elemek ” ) ;
95 96 97 98
box1 = gtk vbox new ( FALSE , 0 ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( window ) , box1 ) ; gtk widget show ( box1 ) ;
99 100 101 102 103
box2 = gtk hbox new ( FALSE , 1 0 ) ; g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( box2 ) , 1 0 ) ; g t k b o x p a c k s t a r t (GTK BOX ( box1 ) , box2 , TRUE, TRUE, 0 ) ; gtk widget show ( box2 ) ;
104 105 106 107
/∗ value , lower , upper , s t e p i n c r e m e n t , page increment , p a g e s i z e ∗/ /∗ a p a g e s i z e e r t e k n e k egyedul a tologomboknal van h a t a s a ∗/ a d j 1 = gtk adjustment new ( 0 . 0 , 0 . 0 , 1 0 1 . 0 , 0 . 1 , 1 . 0 , 1 . 0 ) ;
108 109 110 111 112 113 114
/∗ f u g g o l e g e s tologomb l e t r e h o z a s a , b e a l l i t a s a , ∗ bedobozolasa es m e g j e l e n i t e s e ∗/ v s c a l e = g t k v s c a l e n e w (GTK ADJUSTMENT ( a d j 1 ) ) ; s c a l e s e t d e f a u l t v a l u e s ( GTK SCALE ( v s c a l e ) ) ; g t k b o x p a c k s t a r t (GTK BOX ( box2 ) , v s c a l e , TRUE, TRUE, 0 ) ; gtk widget show ( v s c a l e ) ;
115 116 117 118
box3 = gtk vbox new ( FALSE , 1 0 ) ; g t k b o x p a c k s t a r t (GTK BOX ( box2 ) , box3 , TRUE, TRUE, 0 ) ; gtk widget show ( box3 ) ;
119 120 121 122 123 124 125 126
/∗ FONTOS : ugyanannak az Adjustment−nek ( modosito elemnek ) ∗ az u j b o l i f e l h a s z n a l a s a v i z s z i n t e s t o l o gombnal ∗/ h s c a l e = g t k h s c a l e n e w (GTK ADJUSTMENT ( a d j 1 ) ) ; g t k w i d g e t s e t s i z e r e q u e s t (GTK WIDGET ( h s c a l e ) , 2 0 0 , −1); s c a l e s e t d e f a u l t v a l u e s ( GTK SCALE ( h s c a l e ) ) ; g t k b o x p a c k s t a r t (GTK BOX ( box3 ) , h s c a l e , TRUE, TRUE, 0 ) ; gtk widget show ( h s c a l e ) ;
127 128 129 130 131 132 133 134 135
/∗ Ismet ugyanannak a modositonak a f e l h a s z n a l a s a ∗/ s c r o l l b a r = g t k h s c r o l l b a r n e w (GTK ADJUSTMENT ( a d j 1 ) ) ; /∗ Emiatt a t o l o gomb a s c r o l l b a r mozgatasakor folyamatosan ∗ f r i s s i t v e l e s z . ∗/ g t k r a n g e s e t u p d a t e p o l i c y (GTK RANGE ( s c r o l l b a r ) , GTK UPDATE CONTINUOUS ) ; g t k b o x p a c k s t a r t (GTK BOX ( box3 ) , s c r o l l b a r , TRUE, TRUE, 0 ) ; gtk widget show ( s c r o l l b a r ) ;
136 137 138 139 140 141 142 143 144
/∗ ujabb doboz , elemek t a g o l a s a h o z ∗/ box2 = gtk hbox new ( FALSE , 1 0 ) ; g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( box2 ) , 1 0 ) ; g t k b o x p a c k s t a r t (GTK BOX ( box1 ) , box2 , TRUE, TRUE, 0 ) ; gtk widget show ( box2 ) ;
145 146
/∗ J e l o l o doboz ( pipa ) : az a k t u a l i s e r t e k e k k i j e l z h e t o k ? ∗/ 51
147 148 149 150 151 152
button = g t k c h e c k b u t t o n n e w w i t h l a b e l ( ”Tologombok m e l l e t t e r t e k k i j e l z e s e ” ) ; g t k t o g g l e b u t t o n s e t a c t i v e (GTK TOGGLE BUTTON ( button ) , TRUE ) ; g s i g n a l c o n n e c t ( G OBJECT ( button ) , ” t o g g l e d ” , G CALLBACK ( cb draw value ) , NULL ) ; g t k b o x p a c k s t a r t (GTK BOX ( box2 ) , button , TRUE, TRUE, 0 ) ; gtk widget show ( button ) ;
153 154 155 156 157 158
/∗ ujabb doboz , elemek t a g o l a s a h o z ∗/ box2 = gtk hbox new ( FALSE , 1 0 ) ; g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( box2 ) , 1 0 ) ;
159 160 161 162 163
/∗ K i j e l z e t t t i z e d e s j e g y e k szamanak b e a l l i t a s a h o z egy csuszka ∗/ l a b e l = g t k l a b e l n e w ( ” T i z e d e s j e g y e k szama : ” ) ; g t k b o x p a c k s t a r t (GTK BOX ( box2 ) , l a b e l , FALSE , FALSE , 0 ) ; gtk widget show ( l a b e l ) ;
164 165 166 167 168 169 170 171
a d j 2 = gtk adjustment new ( 1 . 0 , 0 . 0 , 5 . 0 , 1 . 0 , 1 . 0 , 0 . 0 ) ; g s i g n a l c o n n e c t ( G OBJECT ( a d j 2 ) , ” value changed ” , G CALLBACK ( c b d i g i t s s c a l e ) , NULL ) ; s c a l e = g t k h s c a l e n e w (GTK ADJUSTMENT ( a d j 2 ) ) ; g t k s c a l e s e t d i g i t s ( GTK SCALE ( s c a l e ) , 0 ) ; g t k b o x p a c k s t a r t (GTK BOX ( box2 ) , s c a l e , TRUE, TRUE, 0 ) ; gtk widget show ( s c a l e ) ;
172 173 174
g t k b o x p a c k s t a r t (GTK BOX ( box1 ) , box2 , TRUE, TRUE, 0 ) ; gtk widget show ( box2 ) ;
175 176 177 178 179
/∗ ujabb doboz , elemek t a g o l a s a h o z ∗/ box2 = gtk hbox new ( FALSE , 1 0 ) ; g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( box2 ) , 1 0 ) ;
180 181 182 183 184
/∗ A g o r d i t o s a v gombjanak m e r e t b e a l l i t a s a h o z . ∗/ l a b e l = g t k l a b e l n e w ( ” Gorditosav gomb meret : ” ) ; g t k b o x p a c k s t a r t (GTK BOX ( box2 ) , l a b e l , FALSE , FALSE , 0 ) ; gtk widget show ( l a b e l ) ;
185 186 187 188 189 190 191 192
a d j 2 = gtk adjustment new ( 1 . 0 , 1 . 0 , 1 0 1 . 0 , 1 . 0 , 1 . 0 , 0 . 0 ) ; g s i g n a l c o n n e c t ( G OBJECT ( a d j 2 ) , ” value changed ” , G CALLBACK ( c b p a g e s i z e ) , ( g p o i n t e r ) a d j 1 ) ; s c a l e = g t k h s c a l e n e w (GTK ADJUSTMENT ( a d j 2 ) ) ; g t k s c a l e s e t d i g i t s ( GTK SCALE ( s c a l e ) , 0 ) ; g t k b o x p a c k s t a r t (GTK BOX ( box2 ) , s c a l e , TRUE, TRUE, 0 ) ; gtk widget show ( s c a l e ) ;
193 194 195
g t k b o x p a c k s t a r t (GTK BOX ( box1 ) , box2 , TRUE, TRUE, 0 ) ; gtk widget show ( box2 ) ;
196 197 198 199
separator = gtk hseparator new ( ) ; g t k b o x p a c k s t a r t (GTK BOX ( box1 ) , s e p a r a t o r , FALSE , TRUE, 0 ) ; gtk widget show ( s e p a r a t o r ) ;
200 201 202 203 204 205
/∗ ujabb doboz , elemek t a g o l a s a h o z ∗/ box2 = gtk vbox new ( FALSE , 1 0 ) ; g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( box2 ) , 1 0 ) ; g t k b o x p a c k s t a r t (GTK BOX ( box1 ) , box2 , FALSE , TRUE, 0 ) ; gtk widget show ( box2 ) ;
206 207 208
button = g t k b u t t o n n e w w i t h l a b e l ( ” K i l e p e s ” ) ; g s i g n a l c o n n e c t s w a p p e d ( G OBJECT ( button ) , ” c l i c k e d ” , 52
G CALLBACK ( g t k m a i n q u i t ) , NULL ) ; g t k b o x p a c k s t a r t (GTK BOX ( box2 ) , button , TRUE, TRUE, 0 ) ; GTK WIDGET SET FLAGS ( button , GTK CAN DEFAULT ) ; g t k w i d g e t g r a b d e f a u l t ( button ) ; gtk widget show ( button ) ;
209 210 211 212 213 214 215
gtk widget show ( window ) ;
216 217
}
218 219 220 221 222
i n t main ( i n t argc , char ∗ argv [ ] ) { g t k i n i t (& argc , &argv ) ;
223
create range controls ( ) ;
224 225
gtk main ( ) ;
226 227
return 0;
228 229
}
8.
Egy´eb felulet-elemek ¨
8.1.
Feliratok (Labels)
¨ eg, haszn´alatuk egyszeru. ˝ Jelz´est nem bocs´ajtanak ki magukbol. ´ Ha m´egis A c´ımk´ekre gyakran van szuks´ valamilyen jelz´est akarsz figyelni, a feliratot tedd egy EventBox elembe, vagy esetleg egy Button-ra, ahol a gomb lenyom´as´at e´ szlelni tudod. ´ c´ımk´et ´ıgy hozhatsz l´etre: Uj 1 2
GtkWidget ∗ g t k l a b e l n e w ( c o n s t char ∗ s t r ) ; GtkWidget ∗ gtk label new with mnemonic ( c o n s t char ∗ s t r ) ; ¨ param´eter a ki´ırando´ karakterl´anc. Egy m´ar l´etrehozott szoveget ¨ ´ıgy v´altoztathatsz meg: Az egyeduli
1 2
void g t k l a b e l s e t t e x t ( GtkLabel ∗ label , c o n s t char ∗ s t r ) ; ´ karakterl´anc. Ha az uj ´ szoveg ¨ Itt az els˝o param´eter egy m´ar l´etez˝o felirat elem, a m´asodik az uj hosszabb ¨ eges hely automatikusan l´etrejon. ¨ A szoveget ¨ ¨ ´ mint a r´egi, a kijelz´eshez szuks´ tobb sorba ujsor karakterekkel ¨ tordelheted. ¨ Egy felirat szoveg´ et ´ıgy olvashatod ki:
1
c o n s t gchar ∗ g t k l a b e l g e t t e x t ( GtkLabel ∗ l a b e l ) ; ¨ A szoveg igaz´ıt´asa jobbra, balra, sorkiz´artan:
1 2 3 4 5 6 7 8 9
∗ label , void g t k l a b e l s e t j u s t i f y ( GtkLabel GtkJustification jtype ) ; /∗ j t y p e l e h e t s e g e s e r t e k e i : −−−−−−−−−−−−−−−−−−−−−−−−− GTK JUSTIFY LEFT GTK JUSTIFY RIGHT GTK JUSTIFY CENTER ( t h e d e f a u l t ) GTK JUSTIFY FILL ∗/ ¨ es is be´all´ıthato, ´ a wrap TRUE vagy FALSE e´ rt´ekad´as´aval: A feliratokban automatikus sortor´
1 2
void g t k l a b e l s e t l i n e w r a p ( GtkLabel ∗ l a b e l , gboolean wrap ) ; ¨ ´ asmint´aval is d´ısz´ıtheted: A szoveget egy´eni al´ahuz´
1 2
void g t k l a b e l s e t p a t t e r n ( GtkLabel ∗ label , c o n s t gchar ∗ p a t t e r n ) ; 53
´ as kin´ezet´et. A minta csak alsovon´ ´ A minta (pattern) param´eterrel szab´alyozhatod az al´ahuz´ as ( ) vagy ´ oz ¨ karaktert tartalmazhat, ahol alsovon´ ´ ´ szok as van, az oda es˝o karaktert a GTK al´ahuzza. Minta lehet p´eld´aul a "__ __" karakterl´anc. ´ ¨ Ha egy egyszeru˝ al´ahuzott szoveget szeretn´el l´etrehozni, e´ rdemesebb a gtk_label_new_with_mnemonic() ¨ vagy a gtk_label_set_with_mnemonic() fuggv´ enyeket haszn´alni.
1 2
# i n c l u d e
3 4 5 6 7 8 9 10 11
i n t main ( i n t argc , char ∗ argv [ ] ) { s t a t i c GtkWidget ∗window = NULL; GtkWidget ∗hbox ; /∗ v i z s z i n t e s doboz GtkWidget ∗vbox ; /∗ f u g g o l e g e s doboz GtkWidget ∗ frame ; /∗ k e r e t GtkWidget ∗ l a b e l ; /∗ f e l i r a t
∗/ ∗/ ∗/ ∗/
12 13
g t k i n i t (& argc , &argv ) ;
14 15 16 17 18 19
/∗ u j a b l a k l e t r e h o z a s a ∗/ window = gtk window new (GTK WINDOW TOPLEVEL ) ; g s i g n a l c o n n e c t ( G OBJECT ( window ) , ” d e s t r o y ” , G CALLBACK ( g t k m a i n q u i t ) , NULL ) ;
20 21 22 23 24 25 26
/∗ /∗ /∗ /∗ /∗ /∗
cim b e a l l i t a s u j f u g g o l e g e s doboz u j v i z s z i n t e s doboz v i z s z i n t e s doboz be f u g g o l e g e s doboz be a b l a k b e l s o margo
∗/ ∗/ ∗/ ∗/ ∗/ ∗/
g t k w i n d o w s e t t i t l e (GTK WINDOW ( window ) , ” F e l i r a t o k ” ) ; vbox = gtk vbox new ( FALSE , 5 ) ; hbox = gtk hbox new ( FALSE , 5 ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( window ) , hbox ) ; g t k b o x p a c k s t a r t (GTK BOX ( hbox ) , vbox , FALSE , FALSE , 0 ) ; g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( window ) , 5 ) ;
27 28 29 30 31
frame = gtk frame new ( ” Szokasos f e l i r a t ” ) ; l a b e l = g t k l a b e l n e w ( ”Ez egy egyszeru szoveg , \ n a l a p b o l kozepre i g a z i t v a ” ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( frame ) , l a b e l ) ; g t k b o x p a c k s t a r t (GTK BOX ( vbox ) , frame , FALSE , FALSE , 0 ) ;
32 33
frame = gtk frame new ( ” Tobbsoros szoveg ” ) ; 54
34 35 36 37
l a b e l = g t k l a b e l n e w ( ” Ide t o b b e t i r o k . \ nFALSE , FALSE\n” \ ” harmadik s o r ” ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( frame ) , l a b e l ) ; g t k b o x p a c k s t a r t (GTK BOX ( vbox ) , frame , FALSE , FALSE , 0 ) ;
38 39 40 41 42 43 44
frame = gtk frame new ( ” B a l r a i g a z i t o t t f e l i r a t ” ) ; l a b e l = g t k l a b e l n e w ( ”Ez egy b a l r a i g a z i t o t t , \n” \ ” t o b b s o r o s szoveg \nnek a harmadik s o r a ” ) ; g t k l a b e l s e t j u s t i f y ( GTK LABEL ( l a b e l ) , GTK JUSTIFY LEFT ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( frame ) , l a b e l ) ; g t k b o x p a c k s t a r t (GTK BOX ( vbox ) , frame , FALSE , FALSE , 0 ) ;
45 46 47 48 49 50 51
frame = gtk frame new ( ” J o b b r a i g a z i t o t t szoveg ” ) ; l a b e l = g t k l a b e l n e w ( ”Ez egy j o b b r a i g a z i t o t t \ nszoveg , aminek a \n” \ ”Negyedik soraban j a r u n k most” ) ; g t k l a b e l s e t j u s t i f y ( GTK LABEL ( l a b e l ) , GTK JUSTIFY RIGHT ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( frame ) , l a b e l ) ; g t k b o x p a c k s t a r t (GTK BOX ( vbox ) , frame , FALSE , FALSE , 0 ) ;
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
vbox = gtk vbox new ( FALSE , 5 ) ; g t k b o x p a c k s t a r t (GTK BOX ( hbox ) , vbox , FALSE , FALSE , 0 ) ; frame = gtk frame new ( ” S o r t o r e s bemutatasa − EZ A SZOVEG KIJELOLHETO EGERREL, a t o b b i ne l a b e l = g t k l a b e l n e w ( ”Ez egy pelda a s o r t o r e s e s f e l i r a t r a . En ” \ ”vagyok a h i r e s e g y f e j u , ” /∗ nagy hely a ∗/\ /∗ t e r k o z t e s z t e l e s e r e ∗/\ ” a nevem i s ennyi , csak Susu − a s z o v e g e t ” \ ” automatikusan t o r d e l i a ” \ ”GTK. Harom gyuru ragyogjon a tunde k i r a l y o k kezen , ” \ ” K i l e n c e t halando ember u j j a n c s i l l a n t s o n a feny . ” \ ” Egyet hordjon a s o t e t ur , s z o l g a n y a j a t t e r e l o , ” \ ”Mordor e j f e k e t e f o l d j e n , \n” \ ” suru arnyak mezejen . \ n\n ” \ ” A GTK k o r r e k t u l t a m o g a t j a a tobb p a r a g r a f u s ” \ ” h a s z n a l a t a t , es az e x t r a ” \ ” szokozoket i s ” ) ; /∗ szoveg legyen k i v a l a s z t h a t o ! ∗/ g t k l a b e l s e t s e l e c t a b l e ( GTK LABEL ( l a b e l ) , TRUE ) ;
71 72 73 74
g t k l a b e l s e t l i n e w r a p ( GTK LABEL ( l a b e l ) , TRUE ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( frame ) , l a b e l ) ; g t k b o x p a c k s t a r t (GTK BOX ( vbox ) , frame , FALSE , FALSE , 0 ) ;
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
frame = gtk frame new ( ” K i t o l t e s es s o r t o r e s bemutatasa ” ) ; l a b e l = g t k l a b e l n e w ( ”Ez egy pelda a s o r t o r e s r e es a szoveg−k i t o l t e s r e ” \ ”Ennek e l k e l l f o g l a l n i a a t e l j e s ” \ ” hozzarendelt teruletet . ” \ ”Ez a mondat az en nezopontombol ” \ ” i g a z l e h e t . De egy masikbol t a l a n mas a h e l y z e t . ” \ ” T a l a l o s kerdes : ha van egy k e r t , a k e r t b e n egy almafa , ” \ ” es az almafan almak vannak , ” \ ” j o n egy s z e l v i h a r es megrazza a f a t , majd elmegy , ” \ ” es mar nincsenek almak a fan , de \n” \ ” nincsenek almak a foldon \n” \ ” sem , pontosan hany alma v o l t a fan ? ” \ ” Egesz szam a megoldas , trukk n i n c s ” \ ” benne . ” ) ; g t k l a b e l s e t j u s t i f y ( GTK LABEL ( l a b e l ) , GTK JUSTIFY FILL ) ; g t k l a b e l s e t l i n e w r a p ( GTK LABEL ( l a b e l ) , TRUE ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( frame ) , l a b e l ) ; g t k b o x p a c k s t a r t (GTK BOX ( vbox ) , frame , FALSE , FALSE , 0 ) ;
94 95
frame = gtk frame new ( ” Alahuzott szoveg ” ) ; 55
l a b e l = g t k l a b e l n e w ( ” Ezt a f e l i r a t o t alahuzzuk ! \ n” ” K i v a n c s i vagyok hanyan o l v a s s a k a GTK t u t o r i a l t ! ” ) ; g t k l a b e l s e t j u s t i f y ( GTK LABEL ( l a b e l ) , GTK JUSTIFY LEFT ) ; g t k l a b e l s e t p a t t e r n ( GTK LABEL ( l a b e l ) , ” g t k c o n t a i n e r a d d (GTK CONTAINER ( frame ) , l a b e l ) ; g t k b o x p a c k s t a r t (GTK BOX ( vbox ) , frame , FALSE , FALSE , 0 ) ;
96 97 98 99 100 101 102 103
g t k w i d g e t s h o w a l l ( window ) ;
104 105
gtk main ( ) ;
106 107
return 0;
108 109
}
8.2.
A ny´ıl (Arrows)
¨ elem egy ny´ılhegyet rajzol, adott ir´anyba, adott st´ılusban. Rendszerint gombra helyezve haszn´alj´ak A ny´ıl felulet ´ nem bocs´ajt ki szign´alt. – a felirathoz hasonloan ´ o´ fuggv´ ¨ A ny´ıl elemhez kapcsolod enyek: 1 2
GtkWidget ∗ gtk arrow new ( GtkArrowType GtkShadowType
arrow type , shadow type ) ;
3 4
void g t k a r r o w s e t (
5 6
GtkArrow ∗arrow , GtkArrowType arrow type , GtkShadowType shadow type ) ;
7 8 9 10 11 12
/∗ ArrowType l e h e t s e g e s e r t e k e i − e r r e mutat a n y i l : GTK ARROW UP GTK ARROW DOWN GTK ARROW LEFT GTK ARROW RIGHT
13 14 15 16 17 18 19
ShadowType l e h e t s e g e s e r t e k e i : GTK SHADOW IN GTK SHADOW OUT ( t h e d e f a u l t ) GTK SHADOW ETCHED IN GTK SHADOW ETCHED OUT ∗/ ¨ A ny´ıl l´etrehoz´as´ara a gkt_arrow_new() fuggv´ eny szolg´al, a m´asodik egy m´ar l´etez˝o ny´ıl tulajdons´agait v´altoztathatja meg.
1 2
# i n c l u d e
3 4 5 6 7 8 9
/∗ Nyil f e l u l e t elem l e t r e h o z a s a , es gombra h e l y e z e s e ∗/ GtkWidget ∗ c r e a t e a r r o w b u t t o n ( GtkArrowType arrow type , GtkShadowType shadow type ) { /∗ mutatok l e t r e h o z a s a ∗/ GtkWidget ∗ button ; GtkWidget ∗ arrow ;
10 11
/∗ u j gomb es n y i l mutatok u j objektumokra mutatnak ∗/
56
button = gtk button new ( ) ; arrow = gtk arrow new ( arrow type , shadow type ) ;
12 13 14
/∗ gombba b e l e r a k j u k a n y i l a t ∗/ g t k c o n t a i n e r a d d (GTK CONTAINER ( button ) , arrow ) ;
15 16 17
gtk widget show ( button ) ; /∗ gomb k i j e l z e s e ∗/ gtk widget show ( arrow ) ; /∗ n y i l k i j e l z e s e ∗/
18 19 20
r e t u r n button ;
21 22
}
23 24 25 26 27 28 29
i n t main ( i n t argc , char ∗ argv [ ] ) { GtkWidget ∗window ; /∗ GtkWidget t i p u s u mutatok l e t r e h o z a s a ∗/ GtkWidget ∗ button ; /∗ f e l u l e t elemek cimenek t a r o l a s a h o z ∗/ GtkWidget ∗box ;
30
/∗ GTK i n i c i a l i z a l a s ∗/ g t k i n i t (& argc , &argv ) ;
31 32 33
/∗ Uj a b l a k l e t r e h o z a s a ∗/ window = gtk window new (GTK WINDOW TOPLEVEL ) ;
34 35 36
g t k w i n d o w s e t t i t l e (GTK WINDOW ( window ) , ” Nyil gombok” ) ;
37 38
/∗ Ezt minden ablakhoz erdemes hozzarendelni , k e l l k i l e p e s h e z . ∗/ g s i g n a l c o n n e c t ( G OBJECT ( window ) , ” d e s t r o y ” , G CALLBACK ( g t k m a i n q u i t ) , NULL ) ;
39 40 41 42
/∗ margo b e a l l i t a s a ∗/ g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( window ) , 1 0 ) ;
43 44 45
/∗ gombokat , n y i l a k a t t a r t a l m a z o doboz d e f i n i a l a s a ∗/ box = gtk hbox new ( FALSE , 0 ) ; g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( box ) , 2 ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( window ) , box ) ;
46 47 48 49 50
/∗ doboz m e g j e l e n i t e s e k o v e t k e z i k ∗/ gtk widget show ( box ) ;
51 52 53
/∗ SAJAT FUGGVENNYEL gombok l e t r e h o z a s a , dobozba b e t e t e l e − 4x egymas utan ∗/ button = c r e a t e a r r o w b u t t o n (GTK ARROW UP, GTK SHADOW IN ) ; g t k b o x p a c k s t a r t (GTK BOX ( box ) , button , FALSE , FALSE , 3 ) ;
54 55 56 57
button = c r e a t e a r r o w b u t t o n (GTK ARROW DOWN, GTK SHADOW OUT ) ; g t k b o x p a c k s t a r t (GTK BOX ( box ) , button , FALSE , FALSE , 3 ) ;
58 59 60
button = c r e a t e a r r o w b u t t o n (GTK ARROW LEFT, GTK SHADOW ETCHED IN ) ; g t k b o x p a c k s t a r t (GTK BOX ( box ) , button , FALSE , FALSE , 3 ) ;
61 62 63
button = c r e a t e a r r o w b u t t o n (GTK ARROW RIGHT, GTK SHADOW ETCHED OUT ) ; g t k b o x p a c k s t a r t (GTK BOX ( box ) , button , FALSE , FALSE , 3 ) ;
64 65 66
gtk widget show ( window ) ;
67 68
/∗ GTK varakozas f e l h a s z n a l o i esemenyre . Kesz vagyunk : −) ∗/ gtk main ( ) ;
69 70 71
return 0;
72 73
} 57
8.3.
Tippek (tooltips)
¨ ¨ Tipp az a pici felbukkano´ szoveg-bubor´ ek, ami egy gomb vagy m´as felulet elem felett hagyott eg´ermutato´ ´ n´eh´any m´asodpercig nem mozgatjuk. Azok az elemek, melyek nem figyelnek mellett jelenik meg, ha a mutatot ´ esem´enyekre (nincs saj´at ablakuk) - nem tudnak tippet adni a felhaszn´alonak.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/∗∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗∗/ /∗ a program t e l j e s f o r r a s k o d j a ∗ r e s z l e t e s kommentekkel a t u t o r i a l / s r c / t o o l t i p s ∗ konyvtarban van . Mivel egy mar l e t e z o ∗ gomb bemutato programhoz i l l e s z t e t t e m hozza a ∗ t i p p e t , e z e r t csak a m o d o s i t a s t mutatjuk i t t be . ∗ ∗ Uj gomb l e t r e h o z a s a ∗/ button = gtk button new ( ) ; tooltip = gtk tooltips new ( ) ; gtk tooltips set tip ( tooltip , button , ” Tipp a gomb h a s z n a l a t a h o z ” , NULL ) ; /∗∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗∗/ ¨ is egy uj ´ GtkTooltips objektumot hozunk l´etre. Ezt rendszerint egyszer haszn´aljuk, A tippad´ashoz el˝oszor ´ egym´as ut´an tobb ¨ tipp l´etrehoz´as´ara is haszn´alhatjuk. mert a visszakapott mutatot
1
G t k T o o l t i p s ∗ g t k t o o l t i p s n e w ( void ) ; ¨ meg, hogy a fenti fuggv´ ¨ ´ ad vissza. Az oktatoban ´ Figyeljuk eny egy mutatot m´ar volt r´a p´elda, hogy ha ¨ gombot akarunk egym´as ut´an l´etrehozni, el´eg egy – a gomb c´ım´et t´arolo´ mutatot ´ haszn´alnunk, a p´eld´aul tobb ´ gombokat egym´as ut´an l´etrehozhatjuk. A tippek eset´eben ugyanez a helyzet. Erdemes azonban el˝ore gondol´ ¨ oz ¨ rendelt tippet a´ t kell ´ırni, p´eld´aul tobbnyelv ¨ kodni: ha adodhat olyan helyzet, hogy egy eszkozh u˝ program ¨ eset´eben, akkor lehet hogy e´ rdemes felulet-elemenk´ ent elt´arolni a tipp c´ım´et. ´ tippet ezzel a fuggv´ ¨ Az uj ennyel tudod haszn´alni:
1 2 3 4
void g t k t o o l t i p s s e t t i p ( G t k T o o l t i p s GtkWidget c o n s t gchar c o n s t gchar
∗ tooltips , ∗ widget , ∗ tip text , ∗ tip private ) ;
¨ Az els˝o argumentum az el˝obb l´etrehozott GtkTooltips objektum, a m´asodik a felulet-elem, ami felett a ¨ ´ ent haszn´alhato´ tipp majd megjelenik – a harmadik a felbukkano´ szoveg. A negyedik param´eter egy azonos´ıtok´ ¨ ¨ o sug ´ o´ megvalos´ ´ ıt´as´ara haszn´alhatsz. Jelen esetben karakterl´anc, amit a GtkTipsQuery-vel kornyezetf ugg˝ nem haszn´aljuk, ez´ert NULL e´ rt´eket adunk neki. ( b˝ovebben: http://developer.gimp.org/api/2.0/ gtk/GtkTooltips.html http://developer.gimp.org/api/2.0/gtk/GtkTipsQuery.html ) ¨ Rovid p´elda: 1 2 3 4 5 6 7 8 9 10 11
GtkTooltips ∗ t o o l t i p s ; GtkWidget ∗ button ; . . . tooltips = gtk tooltips new ( ) ; button = g t k b u t t o n n e w w i t h l a b e l ( ” E g e r e t vidd k e r l e k a gomb f o l e ” ) ; . . . g t k t o o l t i p s s e t t i p ( t o o l t i p s , button , ”Ez a s e g i t o szoveg a gomb m e l l e t t j e l e n i k meg . ” , N ¨ Van m´eg k´et fuggv´ eny amit e´ rdemes ismerni:
58
1 2
/∗ e s z k o z t a r k e s z l e t e n g e d e l y e z e s e ∗/ void g t k t o o l t i p s e n a b l e ( G t k T o o l t i p s ∗ t o o l t i p s ) ;
3 4 5
/∗ e n g e d e l y e z e t t e s z k o z t a r k e s z l e t k i k a p c s o l a s a ∗/ void g t k t o o l t i p s d i s a b l e ( G t k T o o l t i p s ∗ t o o l t i p s ) ;
8.4.
Folyamats´av (Progress bar)
˝ A folyamats´avot egy muvelet a´ llapot´anak jelz´es´ere haszn´aljuk. Haszn´alata az al´abbi p´eld´ak alapj´an egyszeru˝ lesz. ´ folyamats´av l´etrehoz´asa, be´all´ıt´asa: Uj 1
GtkWidget ∗ g t k p r o g r e s s b a r n e w ( void ) ;
2 3 4 5
/∗ A folyamatsav a l l a p o t a n a k b e a l l i t a s a : ∗/ void g t k p r o g r e s s b a r s e t f r a c t i o n ( GtkProgressBar ∗ pbar , gdouble fraction ) ; ¨ otts´ ¨ ege Az a´ llapot be´all´ıt´asn´al az els˝o param´eter egy mutato´ a folyamats´avra, a m´asodik a folyamats´av kitolt ¨ otts´ ¨ eget egy 0-1 koz ¨ otti ¨ sz´am form´aj´aban adjuk a´ t. A folyamats´av kitolt´ ¨ es´enek ir´any´at is – 0-100%). A kitolt be´all´ıthatjuk, ´ıgy:
1 2
void g t k p r o g r e s s b a r s e t o r i e n t a t i o n ( GtkProgressBar ∗ pbar , GtkProgressBarOrientation orientation ) ;
3 4 5 6 7 8 9
/∗ o r i e n t a t i o n ( i r a n y ) l e h e t s e g e s e r t e k e i : GTK PROGRESS LEFT TO RIGHT balrol jobbra GTK PROGRESS RIGHT TO LEFT jobbrol balra GTK PROGRESS BOTTOM TO TOP lentrol felfele GTK PROGRESS TOP TO BOTTOM fentrol lefele ∗/ El˝ofordulhat olyan eset is, hogy nem tudjuk az adott folyamat pontos a´ llapot´at meghat´arozni, p´eld´aul egy ¨ es eset´eben ahol nem ismert a f´ajlm´eret, de valamif´ele aktivit´ast e´ rdemes a felhaszn´alo´ fel´e mutatni, olyan letolt´ hogy tudja: a program dolgozik, nem a´ llt meg.
1 2
/∗ p u l z a l a s − a folyamat dolgozik , de nem tud pontos a l l a p o t o t j e l e z n i : ∗/ void g t k p r o g r e s s b a r p u l s e ( GtkProgressBar ∗ p r o g r e s s ) ;
3 4 5 6
/∗ a p u l z a l a s lepeskozenek b e a l l i t a s a : ∗/ void g t k p r o g r e s s b a r s e t p u l s e s t e p ( GtkProgressBar ∗ pbar , gdouble fraction ) ; ´ A folyamats´av egy felirattal t´aj´ekoztat´ast adhat a munkafolyamatrol:
1 2
void g t k p r o g r e s s b a r s e t t e x t ( GtkProgressBar ∗ progress , c o n s t gchar ∗ text ) ; ¨ ¨ ¨ esn´el az e´ ppen Ennek a szovegnek az a´ llapot´at program kozben is tudjuk v´altoztatni, p´eld´aul f´ajlletolt´ ¨ esi sebess´eg egy v´altozo´ e´ s aktualiz´alando´ adat. Ha a gtk_progess_bar_set_text() fuggv´ ¨ aktu´alis letolt´ enyt ¨ text="NULL" param´eterrel h´ıvod meg, kikapcsolod a szoveg kijelz´es´et. ¨ ´ van – a visszaadott karakterl´ancot k´erlek ne szabad´ıtsd A folyamats´avon l´ev˝o szoveg lek´erdez´es´ere is mod fel:
59
1
c o n s t gchar ∗ g t k p r o g r e s s b a r g e t t e x t ( GtkProgressBar ∗ pbar ) ;
1 2
# i n c l u d e
3 4 5 6 7 8 9
typedef s t r u c t ProgressData { GtkWidget ∗window ; GtkWidget ∗ pbar ; int timer ; gboolean a c t i v i t y m o d e ; } ProgressData ;
10 11 12 13 14 15
/∗ A folyamatsav e r t e k e t f r i s s i t i ∗/ s t a t i c gboolean p r o g r e s s t i m e o u t ( g p o i n t e r data ) { ProgressData ∗ pdata = ( ProgressData ∗ ) data ; gdouble new val ;
16
i f ( pdata−>a c t i v i t y m o d e ) g t k p r o g r e s s b a r p u l s e ( GTK PROGRESS BAR ( pdata−>pbar ) ) ; else { /∗ A folyamatsav e r t e k e t s z a m o l j a ki , ∗ az a k t u a l i s e r t e k h e z k e p e s t n o v e l j u k a k i t o l t o t t s e g e t ∗/ new val = g t k p r o g r e s s b a r g e t f r a c t i o n ( GTK PROGRESS BAR ( pdata−>pbar ) ) + 0 . 0 1 ;
17 18 19 20 21 22 23 24
i f ( new val > 1 . 0 ) new val = 0 . 0 ; /∗ u j r a k e z d e s , ha c s i k vegig e r t ∗/
25 26
/∗ Az u j e r t e k b e a l l i t a s a ∗/ g t k p r o g r e s s b a r s e t f r a c t i o n ( GTK PROGRESS BAR ( pdata−>pbar ) , new val ) ;
27 28
}
29 30
/∗ Timeout f u n c t i o n : olyan fuggveny ami bizonyos idokozonkent l e f u t , ∗ a folyamatsav e r t e k e n e k f r i s s i t e s e r e h a s z n a l j u k . ∗ v i s s z a t e r e s i e r t e k e TRUE, e z e r t u j b o l meghivhato . ∗/ r e t u r n TRUE ;
31 32 33 34 35 36
}
37 38 39 40 41 42
/∗ S z o v e g k i j e l z e s ki−b e k a p c s o l a s a ∗/ s t a t i c void t o g g l e s h o w t e x t ( GtkWidget ∗ widget , ProgressData ∗ pdata ) { c o n s t gchar ∗ t e x t ;
43
t e x t = g t k p r o g r e s s b a r g e t t e x t ( GTK PROGRESS BAR ( pdata−>pbar ) ) ; i f ( t e x t && ∗ t e x t ) g t k p r o g r e s s b a r s e t t e x t ( GTK PROGRESS BAR ( pdata−>pbar ) , ” ” ) ; else g t k p r o g r e s s b a r s e t t e x t ( GTK PROGRESS BAR ( pdata−>pbar ) , ” Folyamat a l l a p o t a ” ) ;
44 45 46 47 48 49
}
50 51 52 53 54 55 56 57 58 59 60
/∗ A k t i v i t a s i mod a t k a p c s o l a s a ∗/ s t a t i c void t o g g l e a c t i v i t y m o d e ( GtkWidget ∗ widget , ProgressData ∗ pdata ) { pdata−>a c t i v i t y m o d e = ! pdata−>a c t i v i t y m o d e ; i f ( pdata−>a c t i v i t y m o d e ) g t k p r o g r e s s b a r p u l s e ( GTK PROGRESS BAR ( pdata−>pbar ) ) ; else g t k p r o g r e s s b a r s e t f r a c t i o n ( GTK PROGRESS BAR ( pdata−>pbar ) , 0 . 0 ) ; } 60
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
/∗ a folyamatsav iranyanak b e a l l i t a s a ∗/ s t a t i c void t o g g l e o r i e n t a t i o n ( GtkWidget ∗ widget , ProgressData ∗ pdata ) { s w i tc h ( g t k p r o g r e s s b a r g e t o r i e n t a t i o n ( GTK PROGRESS BAR ( pdata−>pbar ) ) ) { c a s e GTK PROGRESS LEFT TO RIGHT : g t k p r o g r e s s b a r s e t o r i e n t a t i o n ( GTK PROGRESS BAR ( pdata−>pbar ) , GTK PROGRESS RIGHT TO LEFT ) ; break ; c a s e GTK PROGRESS RIGHT TO LEFT : g t k p r o g r e s s b a r s e t o r i e n t a t i o n ( GTK PROGRESS BAR ( pdata−>pbar ) , GTK PROGRESS LEFT TO RIGHT ) ; break ; default : ; /∗ nem c s i n a l semmit ∗/ } }
80 81 82 83 84 85 86 87 88 89 90 91
/∗ l e f o g l a l t memoria f e l s z a b a d i t a s a , i d o z i t o e l t a v o l i t a s a ∗/ ∗ widget , s t a t i c void d e s t r o y p r o g r e s s ( GtkWidget ProgressData ∗ pdata ) { g source remove ( pdata−>t i m e r ) ; pdata−>t i m e r = 0 ; pdata−>window = NULL; g f r e e ( pdata ) ; gtk main quit ( ) ; }
92 93 94 95 96 97 98 99 100 101 102
i n t main ( i n t argc , char ∗ argv [ ] ) { ProgressData ∗ pdata ; GtkWidget ∗ a l i g n ; GtkWidget ∗ s e p a r a t o r ; GtkWidget ∗ t a b l e ; GtkWidget ∗ button ; GtkWidget ∗ check ; GtkWidget ∗vbox ;
103 104
g t k i n i t (& argc , &argv ) ;
105 106 107
/∗ Memoriafoglalas a fuggvenyeknek atadando adatok szamara ∗/ pdata = g m a l l o c ( s i z e o f ( ProgressData ) ) ;
108 109 110
pdata−>window = gtk window new (GTK WINDOW TOPLEVEL ) ; g t k w i n d o w s e t r e s i z a b l e (GTK WINDOW ( pdata−>window ) , TRUE ) ;
111 112 113 114 115 116
g s i g n a l c o n n e c t ( G OBJECT ( pdata−>window ) , ” d e s t r o y ” , G CALLBACK ( d e s t r o y p r o g r e s s ) , ( g p o i n t e r ) pdata ) ; g t k w i n d o w s e t t i t l e (GTK WINDOW ( pdata−>window ) , ” GtkProgressBar − Folyamatsav ” ) ; g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( pdata−>window ) , 0 ) ;
117 118 119 120 121
vbox = gtk vbox new ( FALSE , 5 ) ; g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( vbox ) , 1 0 ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( pdata−>window ) , vbox ) ; gtk widget show ( vbox ) ;
122
61
123 124 125 126
/∗ I g a z i t a s f e l u l e t elemet keszitunk , ami mindig kozepen t a r t j a a c s i k o t ∗/ a l i g n = gtk alignment new ( 0 . 5 , 0 . 5 , 0 , 0 ) ; g t k b o x p a c k s t a r t (GTK BOX ( vbox ) , a l i g n , FALSE , FALSE , 5 ) ; gtk widget show ( a l i g n ) ;
127 128 129 130
/∗ GtkProgressBar ( folyamatsav ) l e t r e h o z a s a ∗/ pdata−>pbar = g t k p r o g r e s s b a r n e w ( ) ; pdata−>a c t i v i t y m o d e = FALSE ;
131 132 133
g t k c o n t a i n e r a d d (GTK CONTAINER ( a l i g n ) , pdata−>pbar ) ; gtk widget show ( pdata−>pbar ) ;
134 135 136 137
/∗ A folyamatsav e r t e k e n e k f r i s s i t e s e r e ∗ i d o z i t e t t fuggveny−f u t t a t a s t a l l i t u n k be : ∗/ pdata−>t i m e r = g timeout add ( 1 0 0 , p r o g r e s s t i m e o u t , pdata ) ;
138 139 140 141
separator = gtk hseparator new ( ) ; g t k b o x p a c k s t a r t (GTK BOX ( vbox ) , s e p a r a t o r , FALSE , FALSE , 0 ) ; gtk widget show ( s e p a r a t o r ) ;
142 143 144 145 146
/∗ sorok , oszlopok l e t r e h o z a s a egyseges b e a l l i t a s s a l ∗/ t a b l e = g t k t a b l e n e w ( 2 , 3 , FALSE ) ; g t k b o x p a c k s t a r t (GTK BOX ( vbox ) , t a b l e , FALSE , TRUE, 0 ) ; gtk widget show ( t a b l e ) ;
147 148 149 150 151 152 153 154 155 156
/∗ pipa a s z o v e g k i j e l z e s k i /be kapcsolasahoz ∗/ check = g t k c h e c k b u t t o n n e w w i t h l a b e l ( ” Szoveget mutasd” ) ; g t k t a b l e a t t a c h ( GTK TABLE ( t a b l e ) , check , 0 , 1 , 0 , 1 , GTK EXPAND | GTK FILL , GTK EXPAND | GTK FILL , 5, 5); g s i g n a l c o n n e c t ( G OBJECT ( check ) , ” c l i c k e d ” , G CALLBACK ( t o g g l e s h o w t e x t ) , ( g p o i n t e r ) pdata ) ; gtk widget show ( check ) ;
157 158 159 160 161 162 163 164 165 166
/∗ pipa a mukodesi mod kapcsolasahoz ∗/ check = g t k c h e c k b u t t o n n e w w i t h l a b e l ( ” A k t i v i t a s mod : k i t o l t e s n o v e l e s / p u l z a l a s ” ) g t k t a b l e a t t a c h ( GTK TABLE ( t a b l e ) , check , 0 , 1 , 1 , 2 , GTK EXPAND | GTK FILL , GTK EXPAND | GTK FILL , 5, 5); g s i g n a l c o n n e c t ( G OBJECT ( check ) , ” c l i c k e d ” , G CALLBACK ( t o g g l e a c t i v i t y m o d e ) , ( g p o i n t e r ) pdata ) ; gtk widget show ( check ) ;
167 168 169 170 171 172 173 174 175 176
/∗ pipa az i r a n y b e a l l i t a s a h o z ∗/ check = g t k c h e c k b u t t o n n e w w i t h l a b e l ( ” J o b b r o l b a l r a ” ) ; g t k t a b l e a t t a c h ( GTK TABLE ( t a b l e ) , check , 0 , 1 , 2 , 3 , GTK EXPAND | GTK FILL , GTK EXPAND | GTK FILL , 5, 5); g s i g n a l c o n n e c t ( G OBJECT ( check ) , ” c l i c k e d ” , G CALLBACK ( t o g g l e o r i e n t a t i o n ) , ( g p o i n t e r ) pdata ) ; gtk widget show ( check ) ;
177 178 179 180 181 182 183
/∗ K i l e p e s gomb l e t r e h o z a s a ∗/ button = g t k b u t t o n n e w w i t h l a b e l ( ” K i l e p e s ” ) ; g s i g n a l c o n n e c t s w a p p e d ( G OBJECT ( button ) , ” c l i c k e d ” , G CALLBACK ( g t k w i d g e t d e s t r o y ) , G OBJECT ( pdata−>window ) ) ; g t k b o x p a c k s t a r t (GTK BOX ( vbox ) , button , FALSE , FALSE , 0 ) ;
184
62
/∗ A gomb a l a p e r t e l m e z e t t l e h e t : ∗/ GTK WIDGET SET FLAGS ( button , GTK CAN DEFAULT ) ;
185 186 187
/∗ A l a p e r t e l m e z e t t legyen a gomb , ha a l e h e t o s e g e megvan r a : −) ∗/ g t k w i d g e t g r a b d e f a u l t ( button ) ;
188 189 190
/∗ Ha az Enter−t lenyomod , a z z a l az a l a p e r t e l m e z e t t gombot ∗ a k t i v a l o d ( mintha k l i k k e l t e l volna r a e g e r r e l ) ∗ ∗/ gtk widget show ( button ) ;
191 192 193 194 195
gtk widget show ( pdata−>window ) ;
196 197
gtk main ( ) ;
198 199
return 0;
200 201
}
8.5.
P´arbesz´ed ablakok (Dialogs)
´ A p´arbesz´ed ablakok a felhaszn´alo´ t´aj´ekoztat´as´ara e´ s inform´aciobevitelre szolg´alnak. Tipikus esete ha egy ´ e´ s felugrik egy kis ablak: a f´ajlt m´eg nem mentetted el f´ajlon dolgozunk, majd ki akarunk l´epni a programbol, - biztos hogy ki akarsz l´epni? ¨ ¨ A p´arbesz´ed ablak fels˝o r´esz´eben valamilyen t´aj´ekoztato´ szoveg, az also´ r´esz´eben egy szoveg beviteli mez˝o, ´ e´ s / vagy gombok tal´alhatok. ¨ ´ aja: A p´arbesz´ed felulet-elem struktur´ 1 2 3
s t r u c t GtkDialog { GtkWindow window ; GtkWidget ∗vbox ;
4 5
GtkWidget ∗ a c t i o n a r e a ;
6 7
/∗ /∗ ∗ ∗ /∗
l e t r e h o z u n k egy a b l a k o t ∗/ egy f u g g o l e g e s doboz ablakba ( dobozban e l v a l a s z t o elem ! ) vbox : v e r t i c a l box ∗/ muveleti reszben gombok , szovegmezok l e h e t n e k ∗/
}; ´ p´arbesz´ed ablakot k´et fuggv´ ¨ Uj ennyel hozhatsz l´etre:
1
GtkWidget ∗ g t k d i a l o g n e w ( void ) ;
2 3 4 5 6 7
∗title , GtkWidget ∗ g t k d i a l o g n e w w i t h b u t t o n s ( c o n s t gchar GtkWindow ∗ parent , GtkDialogFlags f l a g s , c o n s t gchar ∗ first button text , ... ); ¨ ¨ ˝ Az els˝o fuggv´ eny egy ures p´arbesz´ed ablakot hoz l´etre – ha akarod, a muveleti r´eszbe gombot is tehetsz:
1 2 3 4
gomb = . . . g t k b o x p a c k s t a r t (GTK BOX (GTK DIALOG ( window)−> a c t i o n a r e a ) , gomb , TRUE, TRUE, 0 ) ; gtk widget show ( gomb ) ; 63
¨ a vbox terulethez ¨ ¨ valahogy ´ıgy: V´egul hozz´a tudod adni egy c´ımk´evel egyutt, 1 2 3 4
f e l i r a t = g t k l a b e l n e w ( ” I t t egy parbeszed a b l a k ” ) ; g t k b o x p a c k s t a r t (GTK BOX (GTK DIALOG ( window)−>vbox ) , f e l i r a t , TRUE, TRUE, 0 ) ; gtk widget show ( f e l i r a t ) ; ´ a muveleti ˝ A p´eld´ahoz hasonloan r´eszbe (action area) elhelyezhetsz egy M´egse e´ s egy Ok gombot, e´ s egy – a ´ ´ o´ szoveget. ¨ ¨ on ¨ szign´alt illeszthetsz, e´ s azokhoz tetsz˝oleges fuggv´ ¨ felhaszn´alonak szol Minden gombhoz kul enyt kapcsolhatsz. ¨ oleges dobozok nyujtotta ´ ¨ Ha a v´ızszintes e´ s fugg˝ elrendez´esi lehet˝os´egekn´el tobbre v´agysz, doboz(ok)on ¨ nyugodtan haszn´alhatsz m´asfajta elrendez˝o elemet is, p´eld´aul t´abl´azatot. belul ¨ ¨ ¨ be´all´ıt´asi lehet˝os´eggel is b´ır: Az osszetettebb _new_with_buttons() fuggv´ eny tobb ´ ¨ otte ¨ l´ev˝o f˝oprogram • GTK_DIALOG_MODAL – a felbukkano´ ablakot a fokuszban tartja, a felhaszn´alo´ a mog ablak´ara nem tud klikkelni, nem tud kapcsolatba l´epni vele am´ıg a p´arbesz´ed ablakot be nem z´arja. ¨ szul˝ ¨ ovel • GTK_DIALOG_DESTROY_WITH_PARENT – biztos´ıtja, hogy a hogy a p´arbesz´edablak a kjelolt ¨ megsemmisul. ¨ egyut ¨ oleges doboz (vbox) e´ s a muveleti ˝ ¨ koz ¨ otti ¨ elv´alaszt´ast. • GTK_DIALOG_NO_SPEARATOR – mell˝ozi a fugg˝ terulet ´ A helloworld.c program p´arbesz´ed ablak bemutat´as´ara modos´ ıtott v´altozata:
1
# i n c l u d e
2 3 4 5 6 7
s t a t i c void p a r b e s z e d a b l a k ( GtkButton ∗gomb , GtkWindow ∗ a b l a k ) { GtkWidget ∗ p a r b e s z e d a b l a k ; /∗ mutato , u j objektumra ∗/ GtkWidget ∗ szoveg , ∗kep , ∗ v i z s z i n t e s d o b o z ;
8 9 10 11 12 13 14
parbeszed ablak= gtk dialog new with buttons (
/∗ i t t k a p j a meg az objektumot ∗/ ” D i a l o g u s a b l a k f e j l e c szoveg ! ” , ablak , GTK DIALOG MODAL, GTK STOCK OK , GTK RESPONSE OK , NULL ) ;
15 16 17 18 19 20 21 22 23 24 25 26 27 28
/∗∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗GtkImage : kep k i j e l z e s e r e s z o l g a l o f e l u l e t −elem . ∗ h t t p :// developer . gimp . org/a p i /2.0/ gtk/GtkImage . html ∗ ∗ gtk image new from stock : g y a r i GTK i k o n t rak k i . ∗ van YES , NO, OPEN, QUIT es sok mas gomb ∗ ∗ Gyari GTK ikonok l i s t a j a , es r e s z l e t e s l e i r a s a : ∗ h t t p :// developer . gimp . org/a p i /2.0/ gtk/gtk−Stock−Items . html ∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗∗/ kep = gtk image new from stock ( GTK STOCK DIALOG WARNING, GTK ICON SIZE DIALOG ) ;
29 30 31
szoveg = g t k l a b e l n e w ( ” Rajottem : t e n y l e g a g y a k o r l a t \ n t e s z i a m e s t e r t ! ” ) ;
32 33 34 35 36
v i z s z i n t e s d o b o z = gtk hbox new ( FALSE , 1 0 ) ; /∗ u j v i z s z i n t e s doboz∗/ g t k b o x p a c k s t a r t d e f a u l t s (GTK BOX ( v i z s z i n t e s d o b o z ) , kep ) ; g t k b o x p a c k s t a r t d e f a u l t s (GTK BOX ( v i z s z i n t e s d o b o z ) , szoveg ) ;
37 38 39 40
/∗ a parbeszed a b l a k f u g g o l e g e s dobozaba ( vbox ) b e r a k j u k a v i z s z i n t e s dobozt ∗/ gtk box pack start defaults ( GTK BOX (GTK DIALOG ( p a r b e s z e d a b l a k)−>vbox ) , vizszintes doboz ) ;
41
64
/∗ mindent ami a p a r b e s z e d a b l a k elemhez kapcsolodik , megmutat . ∗/ gtk widget show all ( parbeszed ablak ) ;
42 43 44
/∗∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗ FONTOS : i t t l a t s z o l a g megall a fuggveny ∗ f u t a s a . ha nem lenne a g t k d i a l o g r u n ( ) ∗ akkor a g t k w i d g e t d e s t r o y azonnal ∗ megsemmisitene a parbeszed ablakunkat . ∗ ∗ A fuggveny v e g t e l e n c i k l u s b a u g r ik . ∗ reszletes leiras : ∗ h t t p :// developer . gimp . org/a p i /2.0/ gtk/GtkDialog . html # gtk−d i a l o g −run ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗∗/ g t k d i a l o g r u n (GTK DIALOG ( p a r b e s z e d a b l a k ) ) ;
45 46 47 48 49 50 51 52 53 54 55 56
/∗ ez a s o r megsemmisiti a parbeszed a b l a k o t ∗/ gtk widget destroy ( parbeszed ablak ) ;
57 58 59
}
60 61 62 63 64 65 66 67 68 69 70 71 72
s t a t i c gboolean d e l e t e e v e n t ( GtkWidget ∗ widget , GdkEvent ∗ event , gpointer data ) { /∗ Ha FALSE e r t e k k e l t e r n e v i s s z a a ” d e l e t e e v e n t ” ( t o r l e s esemeny)− r e ∗ f i g y e l o fuggveny , a GTK ” d e s t r o y ” ( megsemmisites ) j e l z e s t adna k i . ∗ Mivel TRUE e r t e k k e l terunk v i s s z a , ez a z t j e l e n t i , hogy nem a k a r j u k ∗ hogy az a b l a k megsemmisuljon . ∗ ∗ Ennek t i p i k u s f e l h a s z n a l a s a a ’ B i z t o s hogy k i a k a r s z l e p n i a programbol ? ’ ∗ felugro ablak . ∗ ∗/
73
g p r i n t ( ” d e l e t e e v e n t − t o r l e s esemeny k o v e t k e z e t t be \n” ) ;
74 75
/∗ ha TRUE h e l y e t t FALSE e r t e k e t adsz v i s s z a a r e t u r n −a l , ∗ a f o a b l a k megsemmisul a ” d e l e t e e v e n t ”− e l . ∗ ∗/
76 77 78 79
r e t u r n FALSE ;
80 81
}
82 83 84 85 86 87 88
/∗ egy masik f i g y e l o fuggveny ∗/ s t a t i c void d e s t r o y ( GtkWidget ∗ widget , gpointer data ) { gtk main quit ( ) ; }
89 90 91 92 93 94 95
i n t main ( i n t argc , char ∗ argv [ ] ) { /∗ a GtkWidget a f e l u l e t e l e m e k t a r o l o t i p u s a ∗/ GtkWidget ∗window ; GtkWidget ∗ button ;
96 97 98 99 100
/∗ Ez minden GTK programban s z e r e p e l . A p a r a n c s s o r i ∗ p a r a m e t e r e k e t e r t e l m e z i , majd f o l y t a t o d i k a program f u t a s a . ∗ This i s c a l l e d i n a l l GTK a p p l i c a t i o n s . ∗/ g t k i n i t (& argc , &argv ) ;
101 102 103
/∗ u j a b l a k o t k e s z i t u n k ∗/ window = gtk window new (GTK WINDOW TOPLEVEL ) ; 65
104
/∗ Hozzarendelunk a t o r l e s esemenyhez ( d e l e t e e v e n t ) ∗ egy fuggvenyt : ha az a b l a k e z t k i b o c s a j t j a , ∗ akkor a fuggvenyben megadott u t a s i t a s o k fussanak l e . ∗ ∗ A fuggvenynek nem adunk a t egyeb p a r a m e t e r t (NULL) ∗ ∗/ g s i g n a l c o n n e c t ( G OBJECT ( window ) , ” d e l e t e e v e n t ” , G CALLBACK ( d e l e t e e v e n t ) , NULL ) ;
105 106 107 108 109 110 111 112 113
/∗ I t t a ” d e s t r o y ” ( megsemmisites ) esemeny f i g y e l e s e r e ∗ a l l i t u n k be egy fuggvenyt . ∗ Ez akkor f u t l e , ha v a l a h o l meghivjuk a ∗ g t k w i d g e t d e s t r o y ( ) fuggvenyt , vagy a ∗ ” d e l e t e e v e n t ”− e t f i g y e l o fuggveny FALSE e r t e k k e l t e r v i s s z a . ∗ ∗/ g s i g n a l c o n n e c t ( G OBJECT ( window ) , ” d e s t r o y ” , G CALLBACK ( d e s t r o y ) , NULL ) ;
114 115 116 117 118 119 120 121 122
/∗ B e a l l i t j u k az a b l a k b e l s o margojat . ∗/ g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( window ) , 1 0 ) ;
123 124 125
/∗ Uj gombot es f e l i r a t o t k e s z i t u n k ∗/ button = g t k b u t t o n n e w w i t h l a b e l ( ” K l i k k e l j ide , ha parbeszed a b l a k o t s z e r e t n e l l a t n i ! ” ) ;
126 127 128 129
/∗∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗ FIGYELJUK MEG, hogy a p a r b e s z e d k e s z i t o fuggveny ∗ parameterkent megkapja a f o a b l a k m u t a t o j a t ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗∗/ /∗ k l i k k e l e s r e a parbeszed a b l a k k e s z i t e s e kezdodjon e l ∗/ g s i g n a l c o n n e c t ( G OBJECT ( button ) , ” c l i c k e d ” , G CALLBACK ( p a r b e s z e d a b l a k ) , ( g p o i n t e r ) window ) ;
130 131 132 133 134 135 136 137 138
/∗ Az ablakba p a k o l j u k a gombot . ∗/ g t k c o n t a i n e r a d d (GTK CONTAINER ( window ) , button ) ;
139 140 141
/∗ A gomb m e g j e l e n i t e s e . ∗ Valojaban csak akkor v a l i k l a t h a t o v a , ha a s z u l o i s l a t h a t o . gtk widget show ( button ) ;
142 143 144
∗/
145
/∗ az a b l a k m e g j e l e n i t e s e . Ha sok gombot , f e l u l e t e l e m e t hasznalunk , es mindet ∗ valamilyen modon az ablakba rakjuk , e g y s z e r r e fognak m e g j e l e n n i . ∗ Azt i s l e h e t c s i n a l n i , hogy elobb az a b l a k o t j e l e n i t j u k meg , ∗ es utana a gombokat ahogy haladunk a programmal , de igy a f e l h a s z n a l o ∗ latni fogja a felulet felepuleset , valtozasat . ∗ ∗/ gtk widget show ( window ) ;
146 147 148 149 150 151 152 153
/∗ Minden GTK programnak t a r t a l m a z n i a k e l l a gtk main ( ) fuggvenyt . ∗ Ez v arakozik a f e l h a s z n a l o i bemenetre , p e l d a u l eger esemenyre , ∗ vagy b i l l e n t y u l e u t e s r e . ∗ ∗/ gtk main ( ) ;
154 155 156 157 158 159
return 0;
160 161
}
66
8.6.
´ Vonalzok VAR: ´ (Rulers)
8.7.
´ Allapotjelz ´ VAR: o˝ s´avok (Status bars)
8.8.
Szovegmez ¨ ok ˝ (Text entries)
¨ ¨ ¨ Az Entry (szovegmez˝ o / bejegyz´es) felulet elemmel egysoros szovegek bevitel´et e´ s megjelen´ıt´es´et oldhat¨ ¨ juk meg. A megjelen´ıtett szoveget fuggv´ enyh´ıv´asokkal is megv´altoztathatjuk. ´ szovegmez˝ ¨ Uj ot ´ıgy hozhatsz l´etre: 1
GtkWidget ∗ g t k e n t r y n e w ( void ) ; ¨ ¨ A benne l´ev˝o szoveget pedig fuggv´ enyh´ıv´assal ´ıgy v´altoztathatod meg:
1 2
void g t k e n t r y s e t t e x t ( GtkEntry ∗ mutato szovegmezore , c o n s t gchar ∗ m u t a t o u j s z o v e g r e ) ; Jo´ tudni, hogy az Entry oszt´aly az Editable interf´eszt alkalmazza (a gobjects t´amogatja a Java szeru˝ in¨ tartalom-manipul´alo´ fuggv´ ¨ terf´eszeket). Ez az interf´esz tobb enyt is el´erhet˝ov´e tesz. ¨ A szovegmez˝ o tartalm´at ´ıgy olvashatod ki:
1
c o n s t gchar ∗ g t k e n t r y g e t t e x t ( GtkEntry ∗ mutato szovegmezore ) ; ´ at ne szabad´ıtsd fel a free vagy a g_free fuggv´ ¨ A visszaadott v´altozo´ a´ ltal lefoglalt memori´ enyekkel, mert a GTK haszn´alja. ¨ A szovegmez˝ ok szerkeszthet˝o vagy z´arolt a´ llapot´at ´ıgy a´ ll´ıthatod be:
1 2 3
void g t k e d i t a b l e s e t e d i t a b l e ( G t k E d i t a b l e ∗ entry , gboolean editable ) ; /∗ e d i t a b l e : TRUE vagy FALSE l e h e t ∗/ ¨ ¨ ´ ag´at akarod kikapcsolni – mondjuk jelszo´ beg´epel´es´en´el, haszn´ald Ha a szovegmez˝ oben l´ev˝o szoveg l´athatos´ ezt:
1 2
void g t k e n t r y s e t v i s i b i l i t y ( GtkEntry ∗ entry , gboolean v i s i b l e ) ; ¨ ¨ ¨ ¨ A kovetkez˝ o fuggv´ ennyel a szovegmez˝ o tartalm´anak egy r´esz´et jelolheted ki, p´eld´aul egy alap´ertelmezett ¨ ¨ olhet: ¨ szoveg´ et, amelyet a felhaszn´alo´ egy gombnyom´assal kitor
1 2 3
void g t k e d i t a b l e s e l e c t r e g i o n ( G t k E d i t a b l e ∗ entry , gint start , gint end ) ; ¨ ´ır a mez˝obe, e´ rdemes figyelni az activate vagy a Ha e´ rz´ekelni szeretn´ed hogy a felhaszn´alo´ szoveget ¨ ¨ az changed jelz´est. Az activate jelz´est akkor adja ki a szovegmez˝ o, ha a felhaszn´alo´ a mez˝oben leuti ˝ A changed jelz´est akkor adja ki a szovegmez˝ ¨ ENTER billentyut. o, ha a tartalma megv´altozik, p´eld´aul minden ¨ olnek ¨ karaktert kitor bel˝ole.
1 2 3
# i n c l u d e < s t d i o . h> # i n c l u d e < s t d l i b . h> # i n c l u d e
4 5 6 7 8
/∗ ha ENTER−t ut a szovegmezoben a f e l h a s z n a l o , ∗ ez a fuggveny f u t l e : ∗/ s t a t i c void e n t e r c a l l b a c k ( GtkWidget ∗ widget , GtkWidget ∗ e n t r y ) 67
9
{ c o n s t gchar ∗ e n t r y t e x t ; e n t r y t e x t = g t k e n t r y g e t t e x t (GTK ENTRY ( e n t r y ) ) ; p r i n t f ( ” Entry c o n t e n t s : %s \n” , e n t r y t e x t ) ;
10 11 12 13
}
14 15 16 17 18 19 20 21 22 23 24
/∗ ha k l i k k e l a s z e r k e s z t h e t o j e l o l o n e g y z e t b e , akkor ez f u t l e ∗/ /∗∗ Erdekesseg : a e r t e k k e n t k o z v e t l e n u l a j e l o l o n e g y z e t a l l a p o t a t a d j a at , ∗∗ v a g y i s nem olvassuk k i hogy a p i p a t b e j e l o l t e k −e vagy sem es a z t i r j u k v i s s z a , ∗∗ hanem : a s z e r k e s z t h e t o s e g e r t e k e legyen a pipa b e k a p c s o l t s a g i a l l a p o t a ∗∗/ s t a t i c void e n t r y t o g g l e e d i t a b l e ( GtkWidget ∗ checkbutton , GtkWidget ∗ e n t r y ) { g t k e d i t a b l e s e t e d i t a b l e ( GTK EDITABLE ( e n t r y ) , GTK TOGGLE BUTTON ( checkbutton)−> a c t i v e ) ; }
25 26 27 28 29 30 31 32 33
/∗ a szoveg o l v a s h a t o s a g a t vagy j e l s z o s z e r u o l v a s h a t a t l a n ∗ m e g j e l e n i t e s e t a l l i t j a be ∗/ s t a t i c void e n t r y t o g g l e v i s i b i l i t y ( GtkWidget ∗ checkbutton , GtkWidget ∗ e n t r y ) { g t k e n t r y s e t v i s i b i l i t y (GTK ENTRY ( e n t r y ) , GTK TOGGLE BUTTON ( checkbutton)−> a c t i v e ) ; }
34 35 36 37 38 39 40 41 42 43 44
i n t main ( i n t argc , char ∗ argv [ ] ) { /∗mutatok l e t r e h o z a s a f e l u l e t elemek szamara ∗/ GtkWidget ∗window ; GtkWidget ∗vbox , ∗hbox ; GtkWidget ∗ e n t r y ; GtkWidget ∗ button ; GtkWidget ∗ check ; g i n t tmp pos ;
45 46 47 48
/∗ gtk a szamara e r t e l m e z h e t o p a r a m e t e r e k e t ∗ f e l d o l g o z z a es k i v e s z i a l i s t a b o l ∗/ g t k i n i t (& argc , &argv ) ;
49 50 51 52 53
/∗ u j a b l a k k e s z i t e s e ∗/ window = gtk window new (GTK WINDOW TOPLEVEL ) ; g t k w i d g e t s e t s i z e r e q u e s t (GTK WIDGET ( window ) , 2 0 0 , 1 0 0 ) ; g t k w i n d o w s e t t i t l e (GTK WINDOW ( window ) , ”GTK Entry ” ) ;
54 55 56 57 58 59 60 61
/∗ d e s t r o y es d e l e t e e v e n t j e l z e s e k f i g y e l e s e , fuggvenyek ∗ f u t t a t a s a ha a j e l z e s e k e t az a b l a k k i a d j a ∗/ g s i g n a l c o n n e c t ( G OBJECT ( window ) , ” d e s t r o y ” , G CALLBACK ( g t k m a i n q u i t ) , NULL ) ; g s i g n a l c o n n e c t s w a p p e d ( G OBJECT ( window ) , ” d e l e t e e v e n t ” , G CALLBACK ( g t k w i d g e t d e s t r o y ) , G OBJECT ( window ) ) ;
62 63 64 65
vbox = gtk vbox new ( FALSE , 0 ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( window ) , vbox ) ; gtk widget show ( vbox ) ;
66 67 68
/∗ u j szovegmezo l e t r e h o z a s a ∗/ entry = gtk entry new ( ) ;
69 70
/∗ t a r o l h a t o k a r a k t e r e k szamanak b e a l l i t a s a ∗/ 68
71
g t k e n t r y s e t m a x l e n g t h (GTK ENTRY ( e n t r y ) , 5 0 ) ;
72 73 74 75 76 77
/∗ ha a f e l h a s z n a l o e n t e r t ut a szovegmezon b e l u l , ∗ akkor a d j a k i a mezo az a c t i v a t e j e l z e s t ∗/ g s i g n a l c o n n e c t ( G OBJECT ( e n t r y ) , ” a c t i v a t e ” , G CALLBACK ( e n t e r c a l l b a c k ) , ( gpointer ) entry ) ;
78 79 80
/∗ s z o v e g e t teszunk b e l e ∗/ g t k e n t r y s e t t e x t (GTK ENTRY ( e n t r y ) , ” S z i a ” ) ;
81 82 83
/∗ az a k t u a l i s k u r z o r p o z i c i o t a szoveg vegere r a k j u k ∗/ tmp pos = GTK ENTRY ( e n t r y)−> t e x t l e n g t h ;
84 85 86
/∗ a k u r z o r p o z i c i o b a u j szoveg b e t o l d a s a ∗/ g t k e d i t a b l e i n s e r t t e x t ( GTK EDITABLE ( e n t r y ) , ” v i l a g ” , −1, &tmp pos ) ;
87 88 89 90 91 92
/∗ t e l j e s szoveg k i j e l o l e s e : e l e j e t o l a vegeig ∗/ g t k e d i t a b l e s e l e c t r e g i o n ( GTK EDITABLE ( e n t r y ) , 0 , GTK ENTRY ( e n t r y)−> t e x t l e n g t h ) ; g t k b o x p a c k s t a r t (GTK BOX ( vbox ) , entry , TRUE, TRUE, 0 ) ; gtk widget show ( e n t r y ) ;
93 94 95 96
hbox = gtk hbox new ( FALSE , 0 ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( vbox ) , hbox ) ; gtk widget show ( hbox ) ;
97 98 99 100
/∗ j e l o l o n e g y z e t hozzaadasa , f e l i r a t t a l ∗/ check = g t k c h e c k b u t t o n n e w w i t h l a b e l ( ” S z e r k e s z t h e t o ” ) ; g t k b o x p a c k s t a r t (GTK BOX ( hbox ) , check , TRUE, TRUE, 0 ) ;
101 102 103 104
/∗ f i g y e l j u k hogy a p i p a t ki−be k a p c s o l j a k a negyzetben ∗/ g s i g n a l c o n n e c t ( G OBJECT ( check ) , ” t o g g l e d ” , G CALLBACK ( e n t r y t o g g l e e d i t a b l e ) , ( g p o i n t e r ) e n t r y ) ;
105 106 107 108
/∗ a p i p a t a l a p a l l a p o t b a n k i j e l o l t t e t e s z i ∗/ g t k t o g g l e b u t t o n s e t a c t i v e (GTK TOGGLE BUTTON ( check ) , TRUE ) ; gtk widget show ( check ) ;
109 110 111 112 113 114 115
/∗ l a t h a t o s a g i pipa : ha nem l a t h a t o a k a k a r a k t e r e k , akkor amit begepelsz , ∗ annak a helyen korok j e l e n n e k meg , p l . j e l s z o b e k e r e s e k o r ∗/ check = g t k c h e c k b u t t o n n e w w i t h l a b e l ( ” L a t h a t o ” ) ; g t k b o x p a c k s t a r t (GTK BOX ( hbox ) , check , TRUE, TRUE, 0 ) ; g s i g n a l c o n n e c t ( G OBJECT ( check ) , ” t o g g l e d ” , G CALLBACK ( e n t r y t o g g l e v i s i b i l i t y ) , ( g p o i n t e r ) e n t r y ) ;
116 117 118 119
/∗ a p i p a t a l a p b o l k i p i p a l j u k ∗/ g t k t o g g l e b u t t o n s e t a c t i v e (GTK TOGGLE BUTTON ( check ) , TRUE ) ; gtk widget show ( check ) ;
120 121 122
/∗ u j gombot k e s z i t u n k g y a r i CLOSE gombot hasznalva . ∗/ button = g t k b u t t o n n e w f r o m s t o c k ( GTK STOCK CLOSE ) ;
123 124 125 126 127
/∗ gombnak megmondjuk hogy ha r a k l i k k e l n e k , mit tegyen ∗/ g s i g n a l c o n n e c t s w a p p e d ( G OBJECT ( button ) , ” c l i c k e d ” , G CALLBACK ( g t k w i d g e t d e s t r o y ) , G OBJECT ( window ) ) ;
128 129 130 131 132
g t k b o x p a c k s t a r t (GTK BOX ( vbox ) , button , TRUE, TRUE, 0 ) ; GTK WIDGET SET FLAGS ( button , GTK CAN DEFAULT ) ; g t k w i d g e t g r a b d e f a u l t ( button ) ; gtk widget show ( button ) ; 69
133
gtk widget show ( window ) ;
134 135
gtk main ( ) ; return 0;
136 137 138
}
8.9.
L´eptetomez ˝ o˝ (Spin buttons)
´ Egy szovegmez˝ ¨ A l´eptet˝omez˝o egy sz´am kiv´alaszt´as´aban seg´ıt adott e´ rt´ektartom´anybol. ob˝ol e´ s annak ´ a´ ll. A nyilak seg´ıts´eg´evel a szovegmez˝ ¨ ¨ ¨ sz´el´en felfel´e e´ s lefel´e mutato´ nyilakbol oben l´ev˝o e´ rt´eket novelhetj uk ¨ ¨ – illetve mod ´ van a szovegmez˝ ¨ ¨ vagy csokkenthetj uk o kozvetlen szerkeszt´es´ere is. ¨ ¨ enik – a nyilak hosszantarto´ lenyom´as´anak hat´asa A sz´am e´ rt´ek´enek v´altoztat´asa be´all´ıthato´ l´ep´eskozzel tort´ ¨ pedig a nyomvatart´as idej´et˝ol fugg. ´ A l´eptet˝omez˝o egy modos´ ıto´ elemet (Adjustment object) haszn´al a mez˝oben haszn´alhato´ sz´amtartom´any t´arol´as´ara, melyet ´ıgy hozhatsz l´etre: 1 2 3 4 5 6
GtkObject ∗ gtk adjustment new ( gdouble gdouble gdouble gdouble gdouble gdouble
ertek , also , felso , leptetes merteke , lapozas merteke , lap merete ) ;
A param´eterek jelent´ese: • ertek: a l´eptet˝omez˝o kezdeti e´ rt´eke • also: a haszn´alhato´ sz´amtartom´any also´ hat´ara • felso: a haszn´alhato´ sz´amtartom´any fels˝o hat´ara ´ • leptetes_merteke: BAL eg´ergombbal ha a nyilakra kattintunk, ennyivel modos´ ıtja a sz´am e´ rt´ek´et ´ • lapozas_merteke: JOBB eg´ergombbal ha a nyilakra kattintunk, ennyivel modos´ ıtja a sz´am e´ rt´ek´et – ¨ est gyorsabban v´egezhetjuk ¨ el rendszerint ez a sz´am nagyobb mint a l´eptet´es m´ert´eke, ´ıgy az e´ rt´eknovel´ • lap_merete: nem haszn´alt param´eter.
70
¨ ¨ a fels˝o vagy also´ hat´ar´et´ekhez lehet ugrani. GIMP-en v´egeztem egy A harmadik eg´ergombbal kozvetlen ul tesztet: a bal eg´ergombbal egyes´evel l´epeget, ahogy megszoktuk. JOBB eg´ergombnak, vagyis amikor nagyobb ¨ os egeremen NEM a jobb gomb sz´am´ıt, hanem a koz´ ¨ eps˝o gorg˝ ¨ ovel tort´ ¨ en˝o klikkel´es. egys´egekben ugrik, a gorg˝ ¨ Ha az egeremen l´ev˝o jobb gombbal nyomok a lefele ny´ılra, akkor az also´ hat´ar´ert´eket veszi fel a szovegmez˝ o, ha a felfele ny´ılra akkor a fels˝o hat´ar´ert´eket. Vagyis amit megszoktunk jobb eg´ergombk´ent, az a GTK szerint a harmadik gomb. L´eptet˝omez˝ot ´ıgy hozhatsz l´etre: 1 2 3 4
GtkWidget ∗ g t k s p i n b u t t o n n e w ( GtkAdjustment ∗ adjustment , /∗ modosito elem mutatoja ∗/ ∗/ gdouble c l i m b r a t e , /∗ l e p t e t e s merteke guint digits ) ; /∗ k i j e l z e t t t i z e d e s e k szama ∗/ ¨ otti ¨ e´ rt´ekeket vehet fel, e´ s l´eptet´es gyorsul´as´at szab´alyozza. A A climb_rate (l´eptet´es m´ert´eke) 0.0 e´ s 1.0 koz digits (sz´amjegyek) a kijelzett tizedesjegyek sz´am´at hat´arozza meg. ´ ´ A l´eptet˝ogomb ujrakonfigur´ alhato:
1 2 3 4 5 6
void g t k s p i n b u t t o n c o n f i g u r e ( GtkSpinButton ∗ s p i n b u t t o n , /∗ u j r a k o n f i g u r a l a n d o l e p t e t o mezo mutatoja GtkAdjustment ∗ adjustment , /∗ modosito elem mutatoja gdouble c l i m b r a t e , /∗ l e p t e t e s merteke guint digits ) ; /∗ k i j e l z e t t t i z e d e s e k szama
∗/ ∗/ ∗/ ∗/
´ ¨ ¨ A modos´ ıto´ elem – adjustment e´ rt´eke a kovetkez˝ o fuggv´ enyekkel be´all´ıthato´ e´ s lek´erdezhet˝o: 1 2 3
/∗ modosito elem b e a l l i t a s a leptetomezo es modosito elemek m u t a t o j a v a l ∗/ void g t k s p i n b u t t o n s e t a d j u s t m e n t ( GtkSpinButton ∗ s p i n b u t t o n , GtkAdjustment ∗ adjustment ) ;
4 5 6
/∗ a modosito elem l e k e r d e z e s e leptetomezo mutatojanak a t a d a s a v a l ∗/ GtkAdjustment ∗ g t k s p i n b u t t o n g e t a d j u s t m e n t ( GtkSpinButton ∗ s p i n b u t t o n ) ; 8.9.1.
A l´eptetomez ˝ o˝ e´ rt´ek´enek lek´erdez´ese, modos´ ´ ıt´asa
A kijelzett tizedesjegyek sz´am´anak be´all´ıt´asa: 1 2
void g t k s p i n b u t t o n s e t d i g i t s ( GtkSpinButton ∗ s p i n b u t t o n , guint digits ) ; A l´eptet˝omez˝oben l´ev˝o aktu´alis e´ rt´ek megv´altoztat´asa:
1 2
void g t k s p i n b u t t o n s e t v a l u e ( GtkSpinButton ∗ s p i n b u t t o n , /∗ l e p t e t o mutatoja ∗/ gdouble value ) ; /∗ u j e r t e k ∗/ A l´eptet˝omez˝o aktu´alis e´ rt´ek´enek lek´erdez´ese eg´esz vagy lebeg˝opontos sz´amk´ent:
1 2
gdouble g t k s p i n b u t t o n g e t v a l u e ( GtkSpinButton ∗ s p i n b u t t o n ) ; /∗ lebegopontos ∗/ g i n t g t k s p i n b u t t o n g e t v a l u e a s i n t ( GtkSpinButton ∗ s p i n b u t t o n ) ; /∗ egesz ∗/ ¨ ¨ ¨ Ha a mez˝o aktu´alis e´ rt´ek´et novelni vagy csokkenteni akarod, ezt a fuggv´ enyt haszn´ald:
1 2 3
void g t k s p i n b u t t o n s p i n ( GtkSpinButton ∗ l e p t e t o m e z o m u t a t o j a , GtkSpinType leptetes iranya , gdouble leptetes merteke ) ; ¨ ¨ tartozo´ modos´ ´ A fuggv´ eny a l´eptet˝omez˝ohoz ıto´ objektum e´ rt´ekeit haszn´alja. A leptetes_iranya lehets´eges e´ rt´ekei: • GTK_SPIN_STEP_FORWARD ¨ ¨ • GTK_SPIN_STEP_BACKWARD – leptetes_merteke-vel noveli vagy csokkenti az aktu´alis e´ rt´eket, kiv´eve ´ ha a leptetes_merteke null´aval egyenl˝o. Ebben az esetben az e´ rt´ek a modos´ ıto´ elem step_increment ¨ ese) e´ rt´eke miatt v´altozott meg. (l´eptet´es novel´ • ———————————– • GTK_SPIN_PAGE_FORWARD ˝ a leptetes_merteke-vel noveli ¨ ¨ • GTK_SPIN_PAGE_BACKWARD – ez a k´et ir´any egyszeruen vagy csokkenti az aktu´alis e´ rt´eket 71
• ——————————– • GTK_SPIN_HOME – a lehet˝o legkisebb e´ rt´eket veszi fel a mez˝o • GTK_SPIN_END – a lehet˝o legnagyobb e´ rt´eket veszi fel a mez˝o • GTK_SPIN_USER_DEFINED – adott e´ rt´ekkel v´altoztatja meg az aktu´alis e´ rt´eket. 8.9.2.
A l´eptetomez ˝ o˝ megjelen´es´enek e´ s viselked´es´enek szab´alyoz´asa
Lehet˝os´eg van a l´eptet˝omez˝obe ´ırhato´ karakterek korl´atoz´as´ara is – ha szeretn´ed hogy csak sz´amjegyeket tartalmazzon, ezt e´ rdemes haszn´alni: 1 2
void g t k s p i n b u t t o n s e t n u m e r i c ( GtkSpinButton ∗ s p i n b u t t o n , /∗ mutato l e p t e t o m e z o r e ∗/ gboolean c s a k s z a m j e g y e t ) ; /∗ TRUE, FALSE ∗/ Ha a l´eptet˝omez˝o e´ rt´eke el´erte az also´ vagy a fels˝o hat´ar´at, e´ s a felhaszn´alo´ tov´abb akarja l´eptetni a ´ lehet˝os´eg van legnagyobb e´ rt´ekr˝ol a legkisebbre gorgetni ¨ ´ e´ s ford´ıtva. Vagyis ha a sz´aml´atot, a sz´aml´alot, ´ felfel´e, a minimum e´ rt´eket veszi fel: maximum e´ rt´ekr˝ol m´eg egyet l´eptetik a sz´aml´alot
1 2
void g t k s p i n b u t t o n s e t w r a p ( GtkSpinButton ∗ s p i n b u t t o n , gboolean gorgetes ) ; ¨ otti ¨ sz´amok a´ br´azol´as´at enged´elyezed a l´eptet˝omez˝obe, e´ s a El˝ofordulhat olyan eset, hogy 0 e´ s 100 koz ´ 5-os´ ¨ evel l´epteted, ha a felhaszn´alo´ a felfel´e vagy lefel´e nyilakra kattint. De: a sz´amot a´ t´ırja mondjuk sz´aml´alot ´ hogy el˝oszor ¨ a 3-ra. Ebben az esetben a l´eptet´es hat´as´ara 8, 13 stb. lesz a l´eptet˝omez˝o tartalma. Be´all´ıthato, ¨ ¨ ¨ os´ ¨ ere ugorjon a mez˝o e´ rt´eke, majd ahhoz k´epest a rendes l´eptet´esi e´ rt´ekkel l´eptet´es mez˝o legkozelebbi tobbsz or ´ el˝oszor ¨ 5-re, majd onnan 10, 15... e´ rt´ekekre: - vagyis a 3-rol
1 2
void g t k s p i n b u t t o n s e t s n a p t o t i c k s ( GtkSpinButton ∗ s p i n b u t t o n , gboolean u g r a s l e g k o z e l e b b i l e p t e t e s t o b b s z o r o s r e ´ at ´ıgy szab´alyozhatod: A l´eptet˝omez˝o friss´ıt´es´enek modj´
1 2
void g t k s p i n b u t t o n s e t u p d a t e p o l i c y ( GtkSpinButton ∗ s p i n b u t t o n , GtkSpinButtonUpdatePolicy f r i s s i t e s i s z a b a l y ) ; A frissitesi_szabaly lehets´eges e´ rt´ekei: ¨ m´ast is tartalmaz, megprob´ ´ alja azt • GTK_UPDATE_ALWAYS – ha esetleg az e´ rt´ek sz´amjegyeken k´ıvul sz´amjegyekk´e alak´ıtani, majd friss´ıti a mez˝o e´ rt´ek´et. ¨ ha a l´eptet˝omez˝obe csak sz´amjegyeket tartal• GTK_UPDATE_IF_VALID – az e´ rt´ek csak akkor frissul, ´ a modos´ ´ ¨ sz´am kerul. ¨ M´as esetben az e´ rt´ek az mazo, ıto´ elemben meghat´arozott sz´amtartom´anyon beluli utolso´ e´ rv´enyes e´ rt´ekre a´ ll vissza. ´ is elind´ıthatod: A l´eptet˝omez˝o friss´ıt´es´et a programbol
1
1 2
void g t k s p i n b u t t o n u p d a t e ( GtkSpinButton ∗ s p i n b u t t o n ) ; # i n c l u d e < s t d i o . h> # i n c l u d e
3 4
s t a t i c GtkWidget ∗ l e p t e t o g o m b g l o b a l i s ; /∗ l e p t e t o 1 − g l o b a l i s v a l t o z o ∗/
5 6 7 8 9 10 11 12
∗ kapcsolo , s t a t i c void t o g g l e s n a p ( GtkWidget GtkSpinButton ∗ leptetogomb ) { /∗ ugras l e g k o z e l e b b i l e p e s k o z r e : a b e a l l i t a s ugyanaz legyen , ∗ mint az e l s o parameterben v a r t f e l u l e t −elem a k t i v vagy nem ∗ a k t i v a l l a p o t a . ∗/ g t k s p i n b u t t o n s e t s n a p t o t i c k s ( leptetogomb , GTK TOGGLE BUTTON ( kapcsolo)−> a c t i v e ) ; }
13 14 15 16 17 18
s t a t i c void t o g g l e n u m e r i c ( GtkWidget ∗ kapcsolo , GtkSpinButton ∗ leptetogomb ) { /∗ csak szamjegy v i h e t o be a szovegmezobe . A l l a p o t legyen ∗ ugyanaz , mint a k a p o t t kapcsolo a l l a p o t a ∗/ g t k s p i n b u t t o n s e t n u m e r i c ( leptetogomb , GTK TOGGLE BUTTON ( kapcsolo)−> a c t i v e ) ; 72
19
}
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
/∗∗ ∗ i t t ugyan nem h a s z n a l j u k a fuggvenyen b e l u l a ∗ kapcsolo−t , ∗ de a g s i g n a l c o n n e c t ( ) fuggveny l e i r a s a b a n e l o i r j a k hogy a s z i g n a l h o z ∗ kapcsolodo fuggvenynek milyen p a r a m e t e r e k e t k e l l fogadnia , ∗ es a k e t a d o t t t i p u s u parameter e l o i r a s . A s z i g n a l o k h o z i r t a m e r r o l ∗ par s o r t , erdemes e l o l v a s n i , 2.4 − es f e j e z e t . ∗ ∗∗/ s t a t i c void c h a n g e d i g i t s ( GtkWidget ∗ kapcsolo , GtkSpinButton ∗ leptetogomb ) { /∗ k i j e l z e t t t i z e d e s j e g y e k szamanak b e a l l i t a s a , GLOBALIS VALTOZO HASZNALATA! ∗/ g t k s p i n b u t t o n s e t d i g i t s ( GTK SPIN BUTTON ( l e p t e t o g o m b g l o b a l i s ) , g t k s p i n b u t t o n g e t v a l u e a s i n t ( leptetogomb ) ) ; }
35 36 37 38 39 40 41 42
/∗ e r t e k k i o l v a s a s a i n t vagy f l o a t t i p u s u k e n t . ∗/ s t a t i c void g e t v a l u e ( GtkWidget ∗ widget , g p o i n t e r data ) { gchar ∗ buf ; GtkLabel ∗ l a b e l ; GtkSpinButton ∗ s p i n ;
43
s p i n = GTK SPIN BUTTON ( l e p t e t o g o m b g l o b a l i s ) ; l a b e l = GTK LABEL ( g o b j e c t g e t d a t a ( G OBJECT ( widget ) , ” u s e r d a t a ” ) ) ; i f ( GPOINTER TO INT ( data ) == 1 ) buf = g s t r d u p p r i n t f ( ”%d” , g t k s p i n b u t t o n g e t v a l u e a s i n t ( s p i n ) ) ; else buf = g s t r d u p p r i n t f ( ” %0.∗ f ” , spin−>d i g i t s , g t k s p i n b u t t o n g e t v a l u e ( spin ) ) ; g t k l a b e l s e t t e x t ( l a b e l , buf ) ; g f r e e ( buf ) ;
44 45 46 47 48 49 50 51 52 53
}
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
i n t main ( i n t argc , char ∗ argv [ ] ) { GtkWidget ∗window ; GtkWidget ∗ frame ; GtkWidget ∗hbox ; GtkWidget ∗ main vbox ; GtkWidget ∗vbox ; GtkWidget ∗ vbox2 ; GtkWidget ∗ s p i n n e r 2 ; GtkWidget ∗ s p i n n e r ; GtkWidget ∗ button ; GtkWidget ∗ l a b e l ; GtkWidget ∗ v a l l a b e l ; GtkAdjustment ∗ a d j ;
71 72
g t k i n i t (& argc , &argv ) ;
73 74 75
/∗ mutato , u j a b l a k l e t r e h o z a s a ∗/ window = gtk window new (GTK WINDOW TOPLEVEL ) ;
76 77 78 79 80
/∗ a b l a k e t t o l k i k a p c s o l h a t o , d e s t r o y s z i g n a l f i g y e l e s e ∗/ g s i g n a l c o n n e c t ( G OBJECT ( window ) , ” d e s t r o y ” , G CALLBACK ( g t k m a i n q u i t ) , NULL ) ; 73
81 82 83
/∗ ablakcim b e a l l i t a s ∗/ g t k w i n d o w s e t t i t l e (GTK WINDOW ( window ) , ” Leptetomezo ” ) ;
84 85 86
/∗ u j f u g g o l e g e s dobozt k e s z i t u n k ∗/ main vbox = gtk vbox new ( FALSE , 5 ) ;
87 88 89
/∗ b e l s o margot 10px−r e a l l i t j u k ∗/ g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( main vbox ) , 1 0 ) ;
90 91 92
/∗ b e r a k j u k az ablakba a f u g g o l e g e s dobozt ∗/ g t k c o n t a i n e r a d d (GTK CONTAINER ( window ) , main vbox ) ;
93 94 95
/∗ u j k e r e t e z e t t t e r u l e t e t hozunk l e t r e ∗/ frame = gtk frame new ( ”Nem g y o r s i t o t t ” ) ;
96 97 98
/∗ a k e r e t e t b e l e r a k j u k a f u g g o l e g e s dobozba ∗/ g t k b o x p a c k s t a r t (GTK BOX ( main vbox ) , frame , TRUE, TRUE, 0 ) ;
99 100 101
/∗ megegy f u g g o l e g e s dobozt c s i n a l u n k ∗/ vbox = gtk vbox new ( FALSE , 0 ) ;
102 103 104
/∗ b e l s o margo 5px ∗/ g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( vbox ) , 5 ) ;
105 106 107
/∗ elobb l e t r e h o z o t t k e r e t e z e t t t e r u l e t b e b e l e r a k j u k a f u g g o l e g e s dobozt ∗/ g t k c o n t a i n e r a d d (GTK CONTAINER ( frame ) , vbox ) ;
108 109 110
/∗ Ev , honap , nap leptetomezok ∗/
111 112 113
/∗ u j v i z s z i n t e s dobozt k e s z i t u n k ∗/ hbox = gtk hbox new ( FALSE , 0 ) ;
114 115 116
/∗ v i z s z i n t e s dobozt f u g g o l e g e s b e r a k j u k ∗/ g t k b o x p a c k s t a r t (GTK BOX ( vbox ) , hbox , TRUE, TRUE, 5 ) ;
117 118 119
/∗ u j f u g g o l e g e s dobozt k e s z i t u n k ∗/ vbox2 = gtk vbox new ( FALSE , 0 ) ;
120 121 122
/∗ v i z s z i n t e s dobozba f u g g o l e g e s dobozt teszunk ∗/ g t k b o x p a c k s t a r t (GTK BOX ( hbox ) , vbox2 , TRUE, TRUE, 5 ) ;
123 124 125 126
l a b e l = g t k l a b e l n e w ( ”Nap : ” ) ; /∗ u j f e l i r a t o t k e s z i t u n k ∗/ g t k m i s c s e t a l i g n m e n t ( GTK MISC ( l a b e l ) , 0 , 0 . 5 ) ; /∗ i g a z i t a s ∗/
127 128 129
/∗ f e l i r a t o t b e r a k j u k f u g g o l e g e s dobozba g t k b o x p a c k s t a r t (GTK BOX ( vbox2 ) , l a b e l , FALSE , TRUE, 0 ) ;
∗/
130 131 132 133
/∗ u j modosito elem l e t r e h o z a s a ∗/ a d j = ( GtkAdjustment ∗ ) gtk adjustment new ( 1 . 0 , 1 . 0 , 3 1 . 0 , 1 . 0 , 5.0 , 0.0);
134 135 136
/∗ u j leptetomezo l e t r e h o z a s a ∗/ s p i n n e r = g t k s p i n b u t t o n n e w ( adj , 0 , 0 ) ;
137 138 139 140
/∗ a t g o r d u l e s e r t e k h a t a r o k o n . ha maximum f o l e akar l e p t e t n i ∗ a f e l h a s z n a l o , a minimura gorog a szamlalo − es f o r d i t v a ∗/ g t k s p i n b u t t o n s e t w r a p ( GTK SPIN BUTTON ( s p i n n e r ) , TRUE ) ;
141 142
/∗ l e p t e t o m e z o t f u g g o l e g e s dobozba t e s s z u k ∗/ 74
143
g t k b o x p a c k s t a r t (GTK BOX ( vbox2 ) , spinner , FALSE , TRUE, 0 ) ;
144 145 146 147 148 149 150 151 152 153
/∗ egy ujabb f u g g o l e g e s dobozt k e s z i t u n k . ∗/ /∗∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗ f i g y e l j u k meg , hogy az elobb i s l e t r e h o z t u n k ∗ egy u j objektumot amire vbox2 mutatott , ∗ de mivel a z t mar nem f o g j u k h a s z n a l n i , ∗ vbox2 mutathat egy ujabb objektumra ∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗∗/ vbox2 = gtk vbox new ( FALSE , 0 ) ; g t k b o x p a c k s t a r t (GTK BOX ( hbox ) , vbox2 , TRUE, TRUE, 5 ) ;
154 155 156 157
l a b e l = g t k l a b e l n e w ( ”Honap : ” ) ; /∗ u j f e l i r a t ∗/ g t k m i s c s e t a l i g n m e n t ( GTK MISC ( l a b e l ) , 0 , 0 . 5 ) ; /∗ i g a z i t a s ∗/ g t k b o x p a c k s t a r t (GTK BOX ( vbox2 ) , l a b e l , FALSE , TRUE, 0 ) ;
158 159 160 161
/∗ u j modosito elem ∗/ a d j = ( GtkAdjustment ∗ ) gtk adjustment new ( 1 . 0 , 1 . 0 , 1 2 . 0 , 1 . 0 , 5.0 , 0.0);
162 163 164 165
/∗ u j l e p t e t o m e z o t hozunk l e t r e , ∗ az e l o b b i modosito elemet h o z z a r e n d e l j u k ∗/ s p i n n e r = g t k s p i n b u t t o n n e w ( adj , 0 , 0 ) ;
166 167 168
/∗ ez i s a t g o r d u l h e t a h a t a r e r t e k e k e n ∗/ g t k s p i n b u t t o n s e t w r a p ( GTK SPIN BUTTON ( s p i n n e r ) , TRUE ) ;
169 170 171
/∗ bepakoljuk f u g g o l e g e s dobozba ∗/ g t k b o x p a c k s t a r t (GTK BOX ( vbox2 ) , spinner , FALSE , TRUE, 0 ) ;
172 173 174
/∗ megint k e s z i t u n k egy f u g g o l e g e s dobozt vbox2 = gtk vbox new ( FALSE , 0 ) ;
∗/
175 176 177 178
/∗ v i z s z i n t e s dobozba b e l e r a k j u k a most k e s z u l t ∗ f u g g o l e g e s dobozt ∗/ g t k b o x p a c k s t a r t (GTK BOX ( hbox ) , vbox2 , TRUE, TRUE, 5 ) ;
179 180 181 182
l a b e l = g t k l a b e l n e w ( ”Ev : ” ) ; /∗ ev f e l i r a t ∗/ g t k m i s c s e t a l i g n m e n t ( GTK MISC ( l a b e l ) , 0 , 0 . 5 ) ; /∗ i g a z i t ∗/ g t k b o x p a c k s t a r t (GTK BOX ( vbox2 ) , l a b e l , FALSE , TRUE, 0 ) ;
183 184 185 186
/∗ u j modosito elemet hozunk l e t r e ∗/ a d j = ( GtkAdjustment ∗ ) gtk adjustment new ( 1 9 9 8 . 0 , 0 . 0 , 2 1 0 0 . 0 , 1.0 , 100.0 , 0 . 0 ) ;
187 188 189 190
/∗ u j l e p t e t o m e z o t hozunk l e t r e , ∗ az e l o b b i modosito elemet h o z z a r e n d e l j u k ∗/ s p i n n e r = g t k s p i n b u t t o n n e w ( adj , 0 , 0 ) ;
191 192 193 194
/∗ ez i s a t g o r d u l h e t a h a t a r e r t e k e k e n ∗/ g t k s p i n b u t t o n s e t w r a p ( GTK SPIN BUTTON ( s p i n n e r ) , FALSE ) ;
195 196 197 198 199 200 201 202 203 204
/∗ ez a f e l u l e t elem minimum m e r e t e t a l l i t j a be . ∗ gtk widget set size request : ∗ k e n y s z e r i t j u k az elemet , hogy a normalis m e r e t e n e l ∗ nagyobb vagy k i s e b b legyen . ∗ ha nem hasznalod , e l o f o r d u l h a t ∗ hogy a f e l u l e t −elem h a s z n a l h a t a t l a n u l k i c s i . ∗ ∗/ g t k w i d g e t s e t s i z e r e q u e s t ( spinner , 5 5 , −1); g t k b o x p a c k s t a r t (GTK BOX ( vbox2 ) , spinner , FALSE , TRUE, 0 ) ; 75
205 206 207 208
/∗ u j k e r e t e t hozunk l e t r e ∗/ frame = gtk frame new ( ” G y o r s i t o t t ” ) ; g t k b o x p a c k s t a r t (GTK BOX ( main vbox ) , frame , TRUE, TRUE, 0 ) ;
209 210 211 212 213
/∗ u j f u g g o l e g e s doboz , m a r g o b e a l l i t a s , k e r e t b e b erakas ∗/ vbox = gtk vbox new ( FALSE , 0 ) ; g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( vbox ) , 5 ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( frame ) , vbox ) ;
214 215 216 217
/∗ u j v i z s z i n t e s doboz , es b erak asa f u g g o l e g e s b e ∗/ hbox = gtk hbox new ( FALSE , 0 ) ; g t k b o x p a c k s t a r t (GTK BOX ( vbox ) , hbox , FALSE , TRUE, 5 ) ;
218 219 220 221
/∗ u j f u g g o l e g e s doboz , b eraka sa elobb l e t r e h o z o t t v i z s z i n t e s b e ∗/ vbox2 = gtk vbox new ( FALSE , 0 ) ; g t k b o x p a c k s t a r t (GTK BOX ( hbox ) , vbox2 , TRUE, TRUE, 5 ) ;
222 223 224 225 226
/∗ f e l i r a t l e t r e h o z a s a , i g a z i t a s a , f u g g o l e g e s dobozba berak asa ∗/ l a b e l = gtk label new ( ” Ertek : ” ) ; g t k m i s c s e t a l i g n m e n t ( GTK MISC ( l a b e l ) , 0 , 0 . 5 ) ; g t k b o x p a c k s t a r t (GTK BOX ( vbox2 ) , l a b e l , FALSE , TRUE, 0 ) ;
227 228 229 230
/∗ u j modosito elem l e t r e h o z a s a ∗/ a d j = ( GtkAdjustment ∗ ) gtk adjustment new ( 0 . 0 , −10000.0 , 1 0 0 0 0 . 0 , 0.5 , 100.0 , 0 . 0 ) ;
231 232 233
/∗ u j l e p t e t o m e z o t hozunk l e t r e , az e l o b b i modosito elem f e l h a s z n a l a s a v a l ∗/ l e p t e t o g o m b g l o b a l i s = g t k s p i n b u t t o n n e w ( adj , 1 . 0 , 2 ) ;
234 235 236
/∗ leptetomezo e r t e k e hatarokon a t f o r d u l h a t ∗/ g t k s p i n b u t t o n s e t w r a p ( GTK SPIN BUTTON ( l e p t e t o g o m b g l o b a l i s ) , TRUE ) ;
237 238 239 240
/∗ meret b e a l l i t a s , f u g g o l e g e s dobozba b e h e l y e z e s ∗/ g t k w i d g e t s e t s i z e r e q u e s t ( l e p t e t o g o m b g l o b a l i s , 1 0 0 , −1); g t k b o x p a c k s t a r t (GTK BOX ( vbox2 ) , l e p t e t o g o m b g l o b a l i s , FALSE , TRUE, 0 ) ;
241 242 243 244
/∗ u j f u g g o l e g e s dobozt keszitunk , v i z s z i n t e s b e b e r a k j u k ∗/ vbox2 = gtk vbox new ( FALSE , 0 ) ; g t k b o x p a c k s t a r t (GTK BOX ( hbox ) , vbox2 , TRUE, TRUE, 5 ) ;
245 246 247 248 249
/∗ u j cimke l e t r e h o z a s a , i g a z i t a s a , bepakolasa ∗/ l a b e l = gtk label new ( ” Tizedesjegyek : ” ) ; g t k m i s c s e t a l i g n m e n t ( GTK MISC ( l a b e l ) , 0 , 0 . 5 ) ; g t k b o x p a c k s t a r t (GTK BOX ( vbox2 ) , l a b e l , FALSE , TRUE, 0 ) ;
250 251 252 253 254
/∗ u j modositoelem , u j leptetomezohoz . ez i s k o r b e f o r d u l h a t ∗/ a d j = ( GtkAdjustment ∗ ) gtk adjustment new ( 2 , 1 , 5 , 1 , 1 , 0 ) ; s p i n n e r 2 = g t k s p i n b u t t o n n e w ( adj , 0 . 0 , 0 ) ; g t k s p i n b u t t o n s e t w r a p ( GTK SPIN BUTTON ( s p i n n e r 2 ) , TRUE ) ;
255 256 257 258 259 260 261 262 263 264 265
/∗ parameterek magyarazata : ∗ − mutato objektumra , ∗ − f i g y e l t esemeny neve , i t t : value changed ∗ − esemeny b e k o v e t k e z t e k o r v e g r e h a j t a n d o fuggveny neve : c h a n g e d i g i t s ∗ − egy a t a d h a t o parameter fuggvenynek , i t t egy leptetomezo mutatoja ∗ ∗/ g s i g n a l c o n n e c t ( G OBJECT ( a d j ) , ” value changed ” , G CALLBACK ( c h a n g e d i g i t s ) , ( gpointer ) spinner2 ) ;
266
76
267 268
/∗ l e p t e t o m e z o t b e r a k j u k f u g g o l e g e s dobozba ∗/ g t k b o x p a c k s t a r t (GTK BOX ( vbox2 ) , spinner2 , FALSE , TRUE, 0 ) ;
269 270 271
/∗ u j v i z s z i n t e s dobozt hozunk l e t r e ∗/ hbox = gtk hbox new ( FALSE , 0 ) ;
272 273 274
/∗ bepakoljuk a v i z s z i n t e s dobozt a f u g g o l e g e s b e ∗/ g t k b o x p a c k s t a r t (GTK BOX ( vbox ) , hbox , FALSE , TRUE, 5 ) ;
275 276 277 278 279 280
/∗ u j j e l o l o n e g y z e t e t hozunk l e t r e f e l i r a t t a l ∗/ button = g t k c h e c k b u t t o n n e w w i t h l a b e l ( ” L e p t e t e s 0 . 5 t o b b s z o r o s e i n \n− ha p l . 1 0 . 3 van megadva , \ es ez n i n c s k i p i p a l v a , \ n10 .8 − r a u g r i k . \ Ha k i van p i p a l v a akkor 10.5 − re , majd 11− r e ” ) ;
281 282 283 284 285
/∗ k l i k k e l e s f i g y e l e s e ∗/ g s i g n a l c o n n e c t ( G OBJECT ( button ) , ” c l i c k e d ” , G CALLBACK ( t o g g l e s n a p ) , ( gpointer ) leptetogomb globalis ) ;
286 287
g t k b o x p a c k s t a r t (GTK BOX ( vbox ) , button , TRUE, TRUE, 0 ) ;
288 289 290
/∗ j e l o l o n e g y z e t i n d u l a s i h e l y z e t e n e k b e a l l i t a s a ∗/ g t k t o g g l e b u t t o n s e t a c t i v e (GTK TOGGLE BUTTON ( button ) , TRUE ) ;
291 292 293 294 295 296
/∗ u j j e l o l o n e g y z e t e t hozunk l e t r e f e l i r a t t a l ∗/ button = g t k c h e c k b u t t o n n e w w i t h l a b e l ( ”Csak szam i r h a t o be uzemmod” ) ; g s i g n a l c o n n e c t ( G OBJECT ( button ) , ” c l i c k e d ” , G CALLBACK ( t o g g l e n u m e r i c ) , ( gpointer ) leptetogomb globalis ) ;
297 298
g t k b o x p a c k s t a r t (GTK BOX ( vbox ) , button , TRUE, TRUE, 0 ) ;
299 300 301
/∗ j e l o l o n e g y z e t i n d u l a s i h e l y z e t e n e k b e a l l i t a s a ∗/ g t k t o g g l e b u t t o n s e t a c t i v e (GTK TOGGLE BUTTON ( button ) , TRUE ) ;
302 303 304
/∗ u j f e l i r a t o t keszitunk , e g y e n l o r e u r es s z o v e g g e l ∗/ v a l l a b e l = gtk label new ( ”” ) ;
305 306 307
/∗ u j v i z s z i n t e s dobozt k e s z i t u n k ∗/ hbox = gtk hbox new ( FALSE , 0 ) ;
308 309 310
/∗ v i z s z i n t e s dobozt b e r a k j u k f u g g o l e g e s b e ∗/ g t k b o x p a c k s t a r t (GTK BOX ( vbox ) , hbox , FALSE , TRUE, 5 ) ;
311 312 313
/∗ gombot hozunk l e t r e ∗/ button = g t k b u t t o n n e w w i t h l a b e l ( ” E r t e k egesz szamkent ” ) ;
314 315 316 317 318 319 320 321 322 323 324 325 326 327 328
/∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗
ez a fuggveny egy egyedi k a r a k t e r l a n c o t h a s z n a l hogy egy adat−r a mutasson . Minden GTK objektum ( GOBJECT)−nek van egy szoveg−k u l c s l i s t a j a amiben minden szo egy−egy mutatohoz t a r t o z i k . Igy UJ ADATMEZOT ADUNK A gomb OBJEKTUMHOZ parameterek s o r r e n d j e : objektum , e g y e d i k a r a k t e r l a n c , adat ha e l akarod e r n i az adatot , a g o b j e c t g e t d a t a ( ) fuggvenyt hivd meg , ami v i s s z a a d j a a k a r a k t e r l a n c h o z r e n d e l t mutatot . ∗/ 77
g o b j e c t s e t d a t a ( G OBJECT ( button ) , ” u s e r d a t a ” , v a l l a b e l ) ;
329 330
/∗ k l i k k e l e s h e z k a p c s o l j u k a g e t v a l u e fuggvenyt ∗/ g s i g n a l c o n n e c t ( G OBJECT ( button ) , ” c l i c k e d ” , G CALLBACK ( g e t v a l u e ) , GINT TO POINTER ( 1 ) ) ;
331 332 333 334 335
/∗ gombot v i z s z i n t e s dobozba r a k j u k ∗/ g t k b o x p a c k s t a r t (GTK BOX ( hbox ) , button , TRUE, TRUE, 5 ) ;
336 337 338
/∗ u j gombot k e s z i t u n k ∗/ button = g t k b u t t o n n e w w i t h l a b e l ( ” E r t e k l e b e g o p o n t o s k e n t ” ) ;
339 340 341
/∗ a v a d i u j gombhoz u j adatmezot adunk ∗/ g o b j e c t s e t d a t a ( G OBJECT ( button ) , ” u s e r d a t a ” , v a l l a b e l ) ; g s i g n a l c o n n e c t ( G OBJECT ( button ) , ” c l i c k e d ” , G CALLBACK ( g e t v a l u e ) , GINT TO POINTER ( 2 ) ) ; /∗ gombot v i z s z i n t e s dobozba r a k j u k ∗/ g t k b o x p a c k s t a r t (GTK BOX ( hbox ) , button , TRUE, TRUE, 5 ) ;
342 343 344 345 346 347 348 349
/∗ f u g g o l e g e s dobozba f e l i r a t o t e l h e l y e z z u k ∗/ g t k b o x p a c k s t a r t (GTK BOX ( vbox ) , v a l l a b e l , TRUE, TRUE, 0 ) ;
350 351 352
/∗ f e l i r a t s z o v e g e t m e g v a l t o z t a t j u k ∗/ g t k l a b e l s e t t e x t ( GTK LABEL ( v a l l a b e l ) , ” 0 ” ) ;
353 354 355
/∗ u j v i z s z i n t e s dobozt k e s z i t u n k ∗/ hbox = gtk hbox new ( FALSE , 0 ) ;
356 357 358
/∗ b e r a k j u k a gyoker−ablakba ∗/ g t k b o x p a c k s t a r t (GTK BOX ( main vbox ) , hbox , FALSE , TRUE, 0 ) ;
359 360 361
/∗ u j gomb , k l i k k e l e s e n e k f i g y e l e s e , a b l a k mint f e l u l e t −elem ∗ t o r l e s e ha k l i k k e l e s van . ∗/ button = g t k b u t t o n n e w w i t h l a b e l ( ” Bezaras ” ) ; g s i g n a l c o n n e c t s w a p p e d ( G OBJECT ( button ) , ” c l i c k e d ” , G CALLBACK ( g t k w i d g e t d e s t r o y ) , G OBJECT ( window ) ) ;
362 363 364 365 366 367 368
/∗ gombot v i z s z i n t e s dobozba r a k j u k ∗/ g t k b o x p a c k s t a r t (GTK BOX ( hbox ) , button , TRUE, TRUE, 5 ) ;
369 370 371
/∗ Az egesz a b l a k o t m e g j e l e n i t j u k ∗/ g t k w i d g e t s h o w a l l ( window ) ;
372 373 374
/∗ GTK varakozik a f e l h a s z n a l o i bemenetre , ∗ v e g t e l e n c i k l u s b a l e p e s ∗/ gtk main ( ) ;
375 376 377 378
return 0;
379 380
}
8.10.
Legord ¨ ul ¨ o˝ menu¨ (Combo box)
¨ ul˝ ¨ o menu¨ a felhaszn´alo´ szempontj´abol ´ egy szovegmez˝ ¨ ¨ ul˝ ¨ o list´abol ´ a´ ll, melyben el˝ore A legord ob˝ol e´ s egy legord ¨ ul ¨ egyet kiv´alaszthat. A kiv´alaszt´as egy m´asik modja ´ defini´alt e´ rt´ekek koz amikor a felhaszn´alo´ a v´alasztott ´ beg´epeli a szovegmez˝ ¨ opciot obe. ¨ ul˝ ¨ o menut ¨ ´ıgy hozhatsz l´etre: Legord 1
GtkWidget ∗ gtk combo new ( void ) ;
78
¨ ul˝ ¨ o menu¨ szovegmez˝ ¨ ¨ Ha a legord oj´enek (entry) tartalm´at be szerent´ed a´ ll´ıtani, az egyik lehet˝os´eg a szoveg¨ mez˝o kozvetlen haszn´alata: 1
g t k e n t r y s e t t e x t (GTK ENTRY (GTK COMBO ( combo)−>e n t r y ) , ”Szovegem” ) ; ´ a GList egy l´ancolt lista megvalos´ ´ ıt´as a GLib-ben, a GTK fuggv´ ¨ ¨ ´ list´at Tudnivalo: enykonyvt´ ar´aban. Ha uj ´ NULL-ra kell a´ ll´ıtanod. Amikor uj ´ e´ rt´ekeket veszel fel a list´aba, a akarsz k´esz´ıteni, a kezd˝o GList mutatot ´ mutatojak´ ´ ent, ahogy a kovetkez˝ ¨ g_list_append() a´ lltal visszaadott e´ rt´eket haszn´ald a GList uj o p´eld´aban l´atod:
1
GList ∗ g l i s t = NULL;
/∗ mutato e r t e k e kezdetben NULL
∗/
2 3 4 5 6
glist glist glist glist
= = = =
g g g g
list list list list
append append append append
( glist ( glist ( glist ( glist
, , , ,
” String ” String ” String ” String
1 ” ) ; /∗ u j e r t e k e t veszunk f e l , ∗/ 2 ” ) ; /∗ v i s s z a t e r e s i e r t e k l e s z ∗/ 3 ” ) ; /∗ g l i s t u j mutatoja ! ∗/ 4” ) ;
7 8 9
/∗ i t t a g l i s t −ben t a r o l t mutatot f e l h a s z n a l j u k a l i s t a e l k e s z i t e s e h e z ∗/ g t k c o m b o s e t p o p d o w n s t r i n g s (GTK COMBO ( combo ) , g l i s t ) ;
10 11 12
/∗ g l i s t −r o l m a s o l a t o t k e s z i k t az u t o l s o k e n t h i v o t t fuggveny , ∗ g l i s t szamara l e f o g l a l t memoriat c e l s z e r u f e l s z a b a d i t a n i
∗/
¨ ul˝ ¨ o menu¨ m´asolatot k´esz´ıt a glist struktur´ ´ aban a´ tadott karakterl´ancokrol, ´ ha szuks´ ¨ egesnek l´atod A legord ´ at. szabad´ıtsd fel a glist a´ ltal lefoglalt memori´ ˝ od˝ ¨ ok´epes legord ¨ ul˝ ¨ o list´ad. A lista viselked´es´et szab´alyozhatod a kovetkez˝ ¨ Ha id´aig eljutott´al, van egy muk o be´all´ıt´asokkal: 1 2
void g t k c o m b o s e t u s e a r r o w s (
GtkCombo ∗combo , gboolean v a l ) ;
3 4
void g t k c o m b o s e t u s e a r r o w s a l w a y s (
GtkCombo ∗combo , gboolean v a l ) ;
void g t k c o m b o s e t c a s e s e n s i t i v e (
GtkCombo ∗combo , gboolean v a l ) ;
5 6 7 8
´ ¨ • gtk_combo_set_use_arrows() – lehet˝ov´e teszi a felhaszn´alonak hogy a lista kovetkez˝ o / el˝oz˝o ¨ ˝ haszn´alat´aval. Ekkor a v´alaszthato´ lehet˝os´egeket tarelem´ere a´ ll´ıtsa a szovegmez˝ ot a fel/le billentyuk ¨ ¨ ¨ talmazo´ lista nem bukkan fel, de a szovegmez˝ o e´ rt´eke a kovetkez˝ o / el˝oz˝o elemre a´ ll. Ha a szovegmez˝ o ¨ ott, ¨ mert mondjuk a felhaszn´alo´ be´ırta, a aktu´alis tartalma nem szerepel az el˝ore megadott elemek koz fel / le nyilak haszn´alhatatlanok lesznek, hiszen nem meg´allap´ıthato´ hogy mely elemre kellene l´epni. ¨ ¨ a nyilak rendszerint a fokusz ´ Jo´ tudni, hogy szovegmez˝ on belul megv´altoztat´as´ara szolg´alnak, a TAB ˝ oz ¨ hasonloan. ´ billentyuh ¨ ¨ kikeresi az aktu´alis elemet a list´abol, ´ e´ s ahhoz Amikor egyik elemr˝ol a m´asikra l´epunk, a GTK el˝oszor ¨ k´epest hat´arozza meg hogy melyik elemre l´epunk. ¨ ott ¨ l´epkedhet, • gtk_combo_set_use_arrows_always() – a felhaszn´alo´ az el˝ore megadott e´ rt´ekek koz ´ teljesen mell˝ozi a fel / le nyilak fokuszmegv´ altoztato´ szerep´et. ˝ • gtk_combo_set_case_sensitive() – a kisbetu-nagybet u˝ e´ rz´ekenys´egnek az aktu´alis elem felhaszn´al´as´aval ¨ en˝o keres´esek´en´el van szerepe. tort´ ¨ ´ tort´ ¨ en˝o A szovegmez˝ o rendszerint az ALT-TAB billentyu˝ lenyom´as´ara k´epes a m´ar beg´epelt e´ rt´ek list´abol kieg´esz´ıt´es´ere. (Az ALT billentyu˝ helyett esetenk´ent m´as billentyu˝ is el˝ofordulhat, az xmodmap-al a MOD-1 ˝ ol fugg˝ ¨ oen). Ha az ablakkezel˝o ezt a billentyukombin´ ˝ ´ haszn´alja, akkor lehet hogy hez rendelt billentyut˝ aciot ez a funkcio´ nem el´erhet˝o. ¨ ul˝ ¨ o menu¨ szovegmez˝ ¨ A l´etrehozott legord oj´ere ´ıgy hivatkozhatsz: 1
GTK ENTRY (GTK COMBO ( combo)−>e n t r y ) Ezut´an e´ rdemes a menu¨ activate szign´alj´at figyelni, h´atha a felhaszn´alo´ lenyomja a Return vagy Enter ˝ e´ s kiolvasni az aktu´alis e´ rt´eket: billentyut,
1 2
g s i g n a l c o n n e c t ( G OBJECT (GTK COMBO ( combo)−>e n t r y ) , ” a c t i v a t e ” , G CALLBACK ( s z i g n a l r a l e f u t o f u g g v e n y ) , ( g p o i n t e r ) a t a d o t t a d a t o k ) ; 79
¨ A szovegmez˝ o tartalm´at pedig ´ıgy e´ rheted el: 1 2
gchar ∗ szoveg ; szoveg = g t k e n t r y g e t t e x t (GTK ENTRY (GTK COMBO ( combo)−>e n t r y ) ) ;
8.11.
Napt´ar (Calendar)
˝ haszn´alhato´ felulet-elem, ¨ ´ıgy hozhatod l´etre: A napt´ar egy nagyon egyszeruen 1
GtkWidget ∗ g t k c a l e n d a r n e w ( void ) ; ¨ helyen is modos´ ´ ´ El˝ofordulhat hogy a napt´ar tartalm´at tobb ıtani szeretn´ed, de a felhasz´alonak csak a v´egeredm´enyt ´ ¨ ¨ mutatn´ad meg, modos´ ıt´asok kozben a napt´ar v´altoz´asait elrejten´ed. Erre valo´ ez a fuggv´ eny, ami a napt´ar ¨ felulet-elem friss´ıt´es´et le´all´ıtja:
1 2
void g t k c a l e n d a r f r e e z e ( GtkCalendar ∗ na pt ar ) ; /∗ f r i s s i t e s s z u n e t e l t e t e s e ∗/ /∗ f r i s s i t e s e n g e d e l y e z e s e ∗/ void g t k c a l e n d a r t h a w ( GtkCalendar ∗ na pt ar ) ; ¨ ´ muk ˝ odik, ¨ ¨ Ez a k´et fuggv´ eny ugyanugy mint minden m´as felulet-elem friss´ıt´es´enek enged´elyez´ese / tilt´asa. ˝ od´ ¨ est szab´alyozo´ be´all´ıt´asi lehet˝os´ege: A napt´arnak van n´eh´any megjelen´est e´ s muk
1 2
void g t k c a l e n d a r d i s p l a y o p t i o n s ( GtkCalendar ∗ naptar , GtkCalendarDisplayOptions b e a l l i t a s o k ) ; ˝ ´ A beallitasok lehets´eges e´ rt´ekei – egym´assal a bitszintu˝ VAGY (—) muvelettel kombin´alhatok: ´ • GTK_CALENDAR_SHOW_HEADING – az opcio´ hat´as´ara az e´ v e´ s a honap fejl´eck´ent a napt´ar tetej´en megjele´ mert a napt´arat lehet a honapokon ´ ´ nik - ez az´ert jo, e´ s az e´ veken l´eptetni (ha a honapv´ alt´as enged´elyezett, ´ az). e´ s alapbol • GTK_CALENDAR_SHOW_DAY_NAMES – a h´et napjainap megjelen´es´et enged´elyezi a napt´ar fels˝o r´esz´en ´ ´ ´ • GTK_CALENDAR_NO_MONTH_CHANGE – honapv´ alt´as tilt´asa. Haszn´alatakor a felhaszn´alo´ a kijelzett honapr ol ´ nem tud m´asik honapra l´epni. • GTK_CALENDAR_SHOW_WEEK_NUMBERS – minden sor bal oldal´an megjelen´ıti hogy az e´ v h´anyadik het´eben j´arunk. • GTK_CALENDAR_WEEK_START_MONDAY – az alap´ertelmezett angolsz´asz vas´arnapi h´etkezd´es helyett ´ jobbra rendezettek. A funkciot ´ Ubuntun h´etf˝ovel kezdi a hetet. Csak akkor van hat´asa, ha a napok balrol ´ altam, a v´arost Budapestre a´ ll´ıtottam az install´al´askor, e´ s a fuggv´ ¨ ¨ is h´etf˝ovel kiprob´ eny haszn´alata n´elkul ¨ ´ a h´et kezdi a napt´ar a napok megjelen´ıt´es´et, e´ s a parancssorban a kovetkez˝ o figyelmeztet´es olvashato: ¨ ¨ els˝o napja a locale -ben van meghat´arozva, a fuggv´ eny nem uzemel. ¨ A megjelen´ıtett d´atumot a kovetkez˝ o utas´ıt´asokkal hat´arozhatod meg:
1 2 3 4 5
g i n t g t k c a l e n d a r s e l e c t m o n t h ( GtkCalendar ∗ naptar , guint honap , guint ev ) ; void g t k c a l e n d a r s e l e c t d a y ( GtkCalendar ∗ naptar , guint nap ) ; ´ fugg˝ ¨ oen hogy a kiv´alaszt´as A gtk_calendar_select_month() visszat´er´esi e´ rt´eke TRUE vagy FAlSE attol ¨ ´ ¨ v´alaszt ki egy adott napot ha lehets´eges. Ha sikerult-e. A gtk_calendar_select_day() a honapon belul ˝ a nap e´ rt´eke 0, akkor minden akt´ıv kiv´alaszt´as megszunik. ¨ esek mellett a napokat ki is emelhetjuk ¨ (megjelolhetj ¨ ¨ ´ a A napt´arban a kijelol´ uk), figyelemfelh´ıv´as c´elj´abol, ¨ ¨ kovetkez˝ o fuggv´ enyekkel:
1 2
( GtkCalendar guint
∗ naptar , nap ) ;
g i n t gtk calendar unmark day ( GtkCalendar guint
∗ naptar , nap
gint gtk calendar mark day
3 4 5 6 7
void g t k c a l e n d a r c l e a r m a r k s ( GtkCalendar ∗ na pt ar ) ; ¨ napok a GtkCalendar struktur´ ´ an belul ¨ t´arolodnak. ´ ¨ A megjelolt Ez a tomb 31 elemb˝ol a´ ll – ha szeretn´ed ¨ ¨ ¨ ¨ megn´ezheted. Figyelj oda, hogy a megtudni hogy egy nap megjelolt-e vagy sem, a tombb˝ ol kozvetlen ul ¨ ¨ sz´amoz´asa 0-t˝ol n-1 ig tart! tomb ok 80
1 2 3 4 5 6
GtkCalendar ∗ na pt ar ; na pt ar = g t k c a l e n d a r n e w ( ) ; ... /∗ a h e t e d i k napot vajon m e g j e l o l t u k ? ∗/ i f ( c a l e nd a r −>marked date [ 7 − 1 ] ) /∗ ha igen , a f e l t e t e l b e l s e j e l e f u t ∗/ ¨ esek az esetleges e´ v vagy honapv´ ´ ¨ A kijelol´ alt´asok kozben is megmaradnak. ´ ent bemutatott fuggv´ ¨ ´ ¨ le: Az utolsok´ ennyel a kiv´alasztott d´atumot, honapot vagy e´ vet k´erdezhetjuk
1 2 3 4
∗ naptar , ∗ev , ∗honap , ∗nap ) ;
void g t k c a l e n d a r g e t d a t e ( GtkCalendar guint guint guint
¨ ´ ´ A fuggv´ eny param´eterek´ent a´ t kell adni az eredm´enyt t´arolo´ e´ v, honap, nap mutatokat. Ha valamelyik ˝ NULL, akkor e´ rtelemszeruen azt az eredm´enyt nem kapjuk vissza. Pl. ha nem kell az e´ vet tudni, mutato´ helyett NULL-t adunk a´ t. ¨ esek e´ s v´altoz´asok jelz´es´ere tobbf´ ¨ A napt´ar a d´atumkijelol´ ele szign´al kiad´as´ara k´epes: ´ • month_changed – a honap megv´altozott • day_selected – egy napot kiv´alasztottak • day_selected_double_click – egy napot dupla klikkel´essel v´alasztottak ki ¨ ent el˝oz˝o honapra ´ • prev_month – ugr´as tort´ ¨ ent kovetkez˝ ¨ ´ • next_month – ugr´as tort´ o honapra ¨ ent el˝oz˝o e´ vre • prev_year – ugr´as tort´ ¨ ent kovetkez˝ ¨ • next_year – ugr´as tort´ o e´ vre ´ algat´asa kozben ¨ ¨ meg, hogy ha p´eld´aul egyik honapr ´ ´ a m´asikra ugrunk, A p´eldaprogram prob´ figyeljuk ol ¨ ¨ enik: a kovetkez˝ ¨ ´ ¨ ese, honapv´ ´ ´ honapban ´ akkor tobb jelz´es is tort´ o honap kijelol´ alt´asa majd az uj egy nap kivalasztasa.
81
1 2 3 4 5 6
/∗ ∗ ∗ ∗ ∗ ∗
Copyright (C) 1998 Cesar Miquel , Shawn T . Amundson , M a t t i a s Grunlund Copyright (C) 2000 Tony Gale This program i s f r e e s o f t w a r e ; you can r e d i s t r i b u t e i t and/or modify i t under t h e terms o f t h e GNU General P u b l i c L i c e n s e as published by t h e Free Software Foundation ; e i t h e r v e r s i o n 2 o f t h e License , or ( a t your o p t i o n ) any l a t e r v e r s i o n . ∗/
7 8 9 10
# i n c l u d e < s t d i o . h> # i n c l u d e < s t r i n g . h> # i n c l u d e
11 12 13
# d e f i n e DEF PAD 10 # d e f i n e DEF PAD SMALL 5
14 15
# d e f i n e TM YEAR BASE 1900
16 17 18 19 20 21 22 23 24 25 26
t y p e d e f s t r u c t CalendarData { GtkWidget ∗ f l a g c h e c k b o x e s [ 5 ] ; gboolean s e t t i n g s [ 5 ] ; GtkWidget ∗ f o n t d i a l o g ; GtkWidget ∗window ; GtkWidget ∗ p r e v 2 s i g ; GtkWidget ∗ p r e v s i g ; GtkWidget ∗ l a s t s i g ; GtkWidget ∗month ; } CalendarData ;
/∗ /∗ /∗ /∗ /∗ /∗ /∗ /∗
j e l o l o n e g y z e t e k e t t a r o l o tomb beallitasok allapotai a n ap ta r b e t u t i p u s a l l i t a s a h o z a fo ablak az e l o z o e l o t t i s z i g n a l az e l o z o s z i g n a l az u t o l s o s z i g n a l honap
∗/ ∗/ ∗/ ∗/ ∗/ ∗/ ∗/ ∗/
enum { calendar show header , calendar show days , calendar month change , calendar show week , calendar monday first };
/∗ /∗ /∗ /∗ /∗
f e j l e c megjelenitese nap nevek m e g j e l e n i t e s e honapok k o z o t t i l e p t e t e s hanyadik h e t az evben megjel . h e t f o v e l kezdunk
∗/ ∗/ ∗/ ∗/ ∗/
27 28 29 30 31 32 33 34 35 36 37 38
/∗ ∗ GtkCalendar ∗/
39 40 41 42 43 44 45 46 47
/∗ n a p t a r i datum k a r a k t e r l a n c c a a l a k i t a s a ∗/ s t a t i c void c a l e n d a r d a t e t o s t r i n g ( CalendarData ∗ data , char ∗ buffer , gint buff len ) { GDate date ; g u i n t year , month , day ;
48
g t k c a l e n d a r g e t d a t e (GTK CALENDAR ( data−>window ) , &year , &month , &day ) ; g d a t e s e t d m y (& date , day , month + 1 , year ) ; g d a t e s t r f t i m e ( b u f f e r , b u f f l e n − 1 , ”%x” , &date ) ;
49 50 51 52 53 54
}
55 56 57 58 59 60 61 62
/∗ a program k i j e l z i az u t o l s o harom s z i g n a l t . ∗ a k i j e l z e s s z o v e g e t i t t a l l i t j a be . ∗ ∗/ s t a t i c void c a l e n d a r s e t s i g n a l s t r i n g s ( char ∗ sig str , CalendarData ∗ data ) { c o n s t gchar ∗ p r e v s i g ; 82
63
p r e v s i g = g t k l a b e l g e t t e x t ( GTK LABEL ( data−>p r e v s i g ) ) ; g t k l a b e l s e t t e x t ( GTK LABEL ( data−>p r e v 2 s i g ) , p r e v s i g ) ;
64 65 66
p r e v s i g = g t k l a b e l g e t t e x t ( GTK LABEL ( data−>l a s t s i g ) ) ; g t k l a b e l s e t t e x t ( GTK LABEL ( data−>p r e v s i g ) , p r e v s i g ) ; g t k l a b e l s e t t e x t ( GTK LABEL ( data−>l a s t s i g ) , s i g s t r ) ;
67 68 69 70
}
71 72 73 74 75 76
∗ widget , s t a t i c void calendar month changed ( GtkWidget CalendarData ∗ data ) { char b u f f e r [ 2 5 6 ] = ” honapot v a l t o t t a l : ” ;
77
c a l e n d a r d a t e t o s t r i n g ( data , b u f f e r + 1 9 , 256 − 1 9 ) ; c a l e n d a r s e t s i g n a l s t r i n g s ( b u f f e r , data ) ;
78 79 80
}
81 82 83 84 85
∗ widget , s t a t i c void c a l e n d a r d a y s e l e c t e d ( GtkWidget CalendarData ∗ data ) { char b u f f e r [ 2 5 6 ] = ” k i v a l a s z t o t t a l egy napot : ” ;
86
c a l e n d a r d a t e t o s t r i n g ( data , b u f f e r + 2 6 , 256 − 2 6 ) ; c a l e n d a r s e t s i g n a l s t r i n g s ( b u f f e r , data ) ;
87 88 89
}
90 91 92 93 94 95
∗ widget , s t a t i c void c a l e n d a r d a y s e l e c t e d d o u b l e c l i c k ( GtkWidget CalendarData ∗ data ) { char b u f f e r [ 2 5 6 ] = ” n a p k i v a l a s z t a s k e t k l i k k e l e s s e l : ” ; g u i n t day ;
96
c a l e n d a r d a t e t o s t r i n g ( data , b u f f e r + 3 2 , 256 − 3 2 ) ; c a l e n d a r s e t s i g n a l s t r i n g s ( b u f f e r , data ) ;
97 98 99
g t k c a l e n d a r g e t d a t e (GTK CALENDAR ( data−>window ) , NULL, NULL, &day ) ;
100 101 102
i f (GTK CALENDAR ( data−>window)−>marked date [ day −1] == 0 ) { g t k c a l e n d a r m a r k d a y (GTK CALENDAR ( data−>window ) , day ) ; } else { gtk calendar unmark day (GTK CALENDAR ( data−>window ) , day ) ; }
103 104 105 106 107 108
}
109 110 111 112 113
s t a t i c void calendar prev month ( GtkWidget ∗ widget , CalendarData ∗ data ) { char b u f f e r [ 2 5 6 ] = ” e l o z o honap : ” ;
114
c a l e n d a r d a t e t o s t r i n g ( data , b u f f e r + 1 3 , 256 − 1 3 ) ; c a l e n d a r s e t s i g n a l s t r i n g s ( b u f f e r , data ) ;
115 116 117
}
118 119 120 121 122 123
s t a t i c void c a l e n d a r n e x t m o n t h ( GtkWidget ∗ widget , CalendarData ∗ data ) { char b u f f e r [ 2 5 6 ] = ” kovetkezo ho : ” ;
124
83
c a l e n d a r d a t e t o s t r i n g ( data , b u f f e r + 1 4 , 256 − 1 4 ) ; c a l e n d a r s e t s i g n a l s t r i n g s ( b u f f e r , data ) ;
125 126 127
}
128 129 130 131 132 133
s t a t i c void c a l e n d a r p r e v y e a r ( GtkWidget ∗ widget , CalendarData ∗ data ) { char b u f f e r [ 2 5 6 ] = ” e l o z o ev : ” ;
134
c a l e n d a r d a t e t o s t r i n g ( data , b u f f e r + 1 0 , 256 − 1 0 ) ; c a l e n d a r s e t s i g n a l s t r i n g s ( b u f f e r , data ) ;
135 136 137
}
138 139 140 141 142
s t a t i c void c a l e n d a r n e x t y e a r ( GtkWidget ∗ widget , CalendarData ∗ data ) { char b u f f e r [ 2 5 6 ] = ” kovetkezo ev : ” ;
143
c a l e n d a r d a t e t o s t r i n g ( data , b u f f e r + 1 4 , 256 − 1 4 ) ; c a l e n d a r s e t s i g n a l s t r i n g s ( b u f f e r , data ) ;
144 145 146
}
147 148 149 150 151 152 153 154 155 156 157 158 159 160
s t a t i c void c a l e n d a r s e t f l a g s ( CalendarData ∗ c a l e n d a r ) { gint i ; gint options = 0 ; f o r ( i = 0 ; i < 5 ; i ++) i f ( c a l e nd a r −>s e t t i n g s [ i ] ) { o p t i o n s = o p t i o n s + ( 1 << i ) ; } i f ( c a l e nda r −>window ) g t k c a l e n d a r d i s p l a y o p t i o n s (GTK CALENDAR ( c a le n d a r −>window ) , o p t i o n s ) ; }
161 162 163 164 165 166 167 168 169 170
s t a t i c void c a l e n d a r t o g g l e f l a g ( GtkWidget ∗ toggle , CalendarData ∗ c a l e n d a r ) { gint i ; gint j ; j = 0; f o r ( i = 0 ; i < 5 ; i ++) i f ( c a l e nd a r −>f l a g c h e c k b o x e s [ i ] == t o g g l e ) j = i;
171
c a le n d a r −>s e t t i n g s [ j ] = ! c a l en d a r −>s e t t i n g s [ j ] ; c a l e n d a r s e t f l a g s ( calendar ) ;
172 173 174 175
}
176 177 178 179 180 181
s t a t i c void c a l e n d a r f o n t s e l e c t i o n o k ( GtkWidget ∗ button , CalendarData ∗ c a l e n d a r ) { GtkRcStyle ∗ s t y l e ; char ∗ font name ;
182 183 184 185 186
i f ( c a l e nda r −>window ) { font name = g t k f o n t s e l e c t i o n d i a l o g g e t f o n t n a m e ( GTK FONT SELECTION DIALOG ( ca l e n i f ( font name ) 84
{
187
style = gtk rc style new ( ) ; p a n g o f o n t d e s c r i p t i o n f r e e ( s t y l e −>f o n t d e s c ) ; s t y l e −>f o n t d e s c = p a n g o f o n t d e s c r i p t i o n f r o m s t r i n g ( font name ) ; g t k w i d g e t m o d i f y s t y l e ( c al e n d ar −>window , s t y l e ) ; g f r e e ( font name ) ;
188 189 190 191 192
}
193
}
194 195
g t k w i d g e t d e s t r o y ( c a l e nd a r −>f o n t d i a l o g ) ;
196 197
}
198 199 200 201 202
∗ button , s t a t i c void c a l e n d a r s e l e c t f o n t ( GtkWidget CalendarData ∗ c a l e n d a r ) { GtkWidget ∗window ;
203
i f ( ! ca l e n da r −>f o n t d i a l o g ) { window = g t k f o n t s e l e c t i o n d i a l o g n e w ( ” B e t u t i p u s v a l a s z t a s ” ) ; g r e t u r n i f f a i l ( GTK IS FONT SELECTION DIALOG ( window ) ) ; c a le n d a r −>f o n t d i a l o g = window ;
204 205 206 207 208
g t k w i n d o w s e t p o s i t i o n (GTK WINDOW ( window ) , GTK WIN POS MOUSE ) ;
209 210
g s i g n a l c o n n e c t ( window , ” d e s t r o y ” , G CALLBACK ( g t k w i d g e t d e s t r o y e d ) , &c al e n d a r −>f o n t d i a l o g ) ;
211 212 213 214
g s i g n a l c o n n e c t ( GTK FONT SELECTION DIALOG ( window)−>ok button , ” c l i c k e d ” , G CALLBACK ( c a l e n d a r f o n t s e l e c t i o n o k ) , calendar ) ; g s i g n a l c o n n e c t s w a p p e d ( GTK FONT SELECTION DIALOG ( window)−> c a n c e l b u t t o n , ” c l i c k e d ” , G CALLBACK ( g t k w i d g e t d e s t r o y ) , c a le n d a r −>f o n t d i a l o g ) ;
215 216 217 218 219 220
} window = c al e n d a r −>f o n t d i a l o g ; i f ( ! GTK WIDGET VISIBLE ( window ) ) gtk widget show ( window ) ; else g t k w i d g e t d e s t r o y ( window ) ;
221 222 223 224 225 226 227 228
}
229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244
s t a t i c void c r e a t e c a l e n d a r ( void ) { GtkWidget ∗window ; GtkWidget ∗vbox , ∗vbox2 , ∗ vbox3 ; GtkWidget ∗hbox ; GtkWidget ∗hbbox ; GtkWidget ∗ c a l e n d a r ; GtkWidget ∗ t o g g l e ; GtkWidget ∗ button ; GtkWidget ∗ frame ; GtkWidget ∗ s e p a r a t o r ; GtkWidget ∗ l a b e l ; GtkWidget ∗bbox ; s t a t i c CalendarData c a l e n d a r d a t a ; gint i ;
245 246 247 248
struct { char ∗ l a b e l ; } flags [] = 85
249
{ { { { { {
250 251 252 253 254 255
” F e j l e c , a k t u a l i s honap , ev ” } , ”Napok neve ” } , ” Honapvaltas t i l t a s a ” } , ” Hetek szamozasa ” } , ” Hetkezdes h e t f o v e l ” }
};
256 257 258 259
c a l e n d a r d a t a . window = NULL; c a l e n d a r d a t a . f o n t d i a l o g = NULL;
260 261 262 263
f o r ( i = 0 ; i < 5 ; i ++) { calendar data . settings [ i ] = 0; }
264 265 266 267 268 269 270 271 272 273 274
window = gtk window new (GTK WINDOW TOPLEVEL ) ; g t k w i n d o w s e t t i t l e (GTK WINDOW ( window ) , ” GtkCalendar pelda ” ) ; g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( window ) , 5 ) ; g s i g n a l c o n n e c t ( window , ” d e s t r o y ” , G CALLBACK ( g t k m a i n q u i t ) , NULL ) ; g s i g n a l c o n n e c t ( window , ” d e l e t e −event ” , G CALLBACK ( g t k f a l s e ) , NULL ) ; g t k w i n d o w s e t r e s i z a b l e (GTK WINDOW ( window ) , FALSE ) ;
275 276 277
vbox = gtk vbox new ( FALSE , DEF PAD ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( window ) , vbox ) ;
278 279 280 281 282 283
/∗ ∗ az a b l a k f e l s o r e s z e , naptar , ∗ p i p a l o s b e a l l i t a s o k es b e t u t i p u s ∗ valasztas . ∗/
284 285 286 287 288 289 290
hbox = gtk hbox new ( FALSE , DEF PAD ) ; g t k b o x p a c k s t a r t (GTK BOX ( vbox ) , hbox , TRUE, TRUE, DEF PAD ) ; hbbox = gtk hbutton box new ( ) ; g t k b o x p a c k s t a r t (GTK BOX ( hbox ) , hbbox , FALSE , FALSE , DEF PAD ) ; g t k b u t t o n b o x s e t l a y o u t (GTK BUTTON BOX ( hbbox ) , GTK BUTTONBOX SPREAD ) ; g t k b o x s e t s p a c i n g (GTK BOX ( hbbox ) , 5 ) ;
291 292 293 294 295 296 297 298 299
/∗ Calendar f e l u l e t elem ∗/ frame = gtk frame new ( ” Calendar ” ) ; g t k b o x p a c k s t a r t (GTK BOX ( hbbox ) , frame , FALSE , TRUE, DEF PAD ) ; calendar=gtk calendar new ( ) ; c a l e n d a r d a t a . window = c a l e n d a r ; c a l e n d a r s e t f l a g s (& c a l e n d a r d a t a ) ; g t k c a l e n d a r m a r k d a y (GTK CALENDAR ( c a l e n d a r ) , 1 9 ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( frame ) , c a l e n d a r ) ;
300 301 302 303 304 305 306 307 308 309 310
/∗ fuggvenyek k a p c s o l a s a s z i g n a l o k h o z ∗/ g s i g n a l c o n n e c t ( c a l e nd a r , ” month changed ” , G CALLBACK ( calendar month changed ) , &c a l e n d a r d a t a ) ; g s i g n a l c o n n e c t ( c a l e nd a r , ” d a y s e l e c t e d ” , G CALLBACK ( c a l e n d a r d a y s e l e c t e d ) , &c a l e n d a r d a t a ) ; g s i g n a l c o n n e c t ( c a l e nd a r , ” d a y s e l e c t e d d o u b l e c l i c k ” , G CALLBACK ( c a l e n d a r d a y s e l e c t e d d o u b l e c l i c k ) , &c a l e n d a r d a t a ) ; 86
311 312 313 314 315 316 317 318 319 320 321 322
g s i g n a l c o n n e c t ( c a l e nd a r , ” prev month ” , G CALLBACK ( calendar prev month ) , &c a l e n d a r d a t a ) ; g s i g n a l c o n n e c t ( c a l e nd a r , ” next month ” , G CALLBACK ( c a l e n d a r n e x t m o n t h ) , &c a l e n d a r d a t a ) ; g s i g n a l c o n n e c t ( c a l e nd a r , ” p r e v y e a r ” , G CALLBACK ( c a l e n d a r p r e v y e a r ) , &c a l e n d a r d a t a ) ; g s i g n a l c o n n e c t ( c a l e nd a r , ” n e x t y e a r ” , G CALLBACK ( c a l e n d a r n e x t y e a r ) , &c a l e n d a r d a t a ) ;
323 324 325 326 327
/∗ f u g g o l e g e s e l v a l a s z t o nap ta r j o b b o l d a l a r a , j e l o l o n e g y z e t e k e l e ∗/ separator = gtk vseparator new ( ) ; g t k b o x p a c k s t a r t (GTK BOX ( hbox ) , s e p a r a t o r , FALSE , TRUE, 0 ) ;
328 329 330
vbox2 = gtk vbox new ( FALSE , DEF PAD ) ; g t k b o x p a c k s t a r t (GTK BOX ( hbox ) , vbox2 , FALSE , FALSE , DEF PAD ) ;
331 332
/∗ j o b b o l d a l f e l e p i t e s e : j e l o l o n e g y z e t e k ∗/
333 334 335 336 337
frame = gtk frame new ( ” F l a g s ” ) ; g t k b o x p a c k s t a r t (GTK BOX ( vbox2 ) , frame , TRUE, TRUE, DEF PAD ) ; vbox3 = gtk vbox new (TRUE, DEF PAD SMALL ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( frame ) , vbox3 ) ;
338 339 340 341 342 343 344 345 346 347 348
f o r ( i = 0 ; i < 5 ; i ++) { toggle = gtk check button new with label ( flags [ i ] . label ) ; g signal connect ( toggle , ” toggled ” , G CALLBACK ( c a l e n d a r t o g g l e f l a g ) , &c a l e n d a r d a t a ) ; g t k b o x p a c k s t a r t (GTK BOX ( vbox3 ) , t o g g l e , TRUE, TRUE, 0 ) ; calendar data . flag checkboxes [ i ] = toggle ; }
349 350 351 352 353 354 355 356
/∗ B e t u t i p u s v a l t o gomb l e t r e h o z a s a ∗/ button = g t k b u t t o n n e w w i t h l a b e l ( ” B e t u t i p u s b e a l l i t a s ” ) ; g s i g n a l c o n n e c t ( button , ” clicked ” , G CALLBACK ( c a l e n d a r s e l e c t f o n t ) , &c a l e n d a r d a t a ) ; g t k b o x p a c k s t a r t (GTK BOX ( vbox2 ) , button , FALSE , FALSE , 0 ) ;
357 358 359 360
/∗ ∗ A kiadott jelzesek figyelese , kijelzese : ∗/
361 362 363
frame = gtk frame new ( ” S z i g n a l o k k i j e l z e s e ” ) ; g t k b o x p a c k s t a r t (GTK BOX ( vbox ) , frame , TRUE, TRUE, DEF PAD ) ;
364 365 366
vbox2 = gtk vbox new (TRUE, DEF PAD SMALL ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( frame ) , vbox2 ) ;
367 368 369 370 371 372
hbox = gtk hbox new ( FALSE , 3 ) ; g t k b o x p a c k s t a r t (GTK BOX ( vbox2 ) , hbox , FALSE , TRUE, 0 ) ; label = gtk label new ( ” Szignal : ” ) ; g t k b o x p a c k s t a r t (GTK BOX ( hbox ) , l a b e l , FALSE , TRUE, 0 ) ; calendar data . l a s t s i g = gtk label new ( ”” ) ; 87
g t k b o x p a c k s t a r t (GTK BOX ( hbox ) , c a l e n d a r d a t a . l a s t s i g , FALSE , TRUE, 0 ) ;
373 374
hbox = gtk hbox new ( FALSE , 3 ) ; g t k b o x p a c k s t a r t (GTK BOX ( vbox2 ) , hbox , FALSE , TRUE, 0 ) ; l a b e l = g t k l a b e l n e w ( ” Elozo s z i g n a l : ” ) ; g t k b o x p a c k s t a r t (GTK BOX ( hbox ) , l a b e l , FALSE , TRUE, 0 ) ; calendar data . prev sig = gtk label new ( ”” ) ; g t k b o x p a c k s t a r t (GTK BOX ( hbox ) , c a l e n d a r d a t a . p r e v s i g , FALSE , TRUE, 0 ) ;
375 376 377 378 379 380 381
hbox = gtk hbox new ( FALSE , 3 ) ; g t k b o x p a c k s t a r t (GTK BOX ( vbox2 ) , hbox , FALSE , TRUE, 0 ) ; l a b e l = g t k l a b e l n e w ( ” Elozo e l o t t i s z i g n a l : ” ) ; g t k b o x p a c k s t a r t (GTK BOX ( hbox ) , l a b e l , FALSE , TRUE, 0 ) ; calendar data . prev2 sig = gtk label new ( ”” ) ; g t k b o x p a c k s t a r t (GTK BOX ( hbox ) , c a l e n d a r d a t a . p r e v 2 s i g , FALSE , TRUE, 0 ) ;
382 383 384 385 386 387 388
bbox = gtk hbutton box new ( ) ; g t k b o x p a c k s t a r t (GTK BOX ( vbox ) , bbox , FALSE , FALSE , 0 ) ; g t k b u t t o n b o x s e t l a y o u t (GTK BUTTON BOX ( bbox ) , GTK BUTTONBOX END ) ;
389 390 391 392
button = g t k b u t t o n n e w w i t h l a b e l ( ” K i l e p e s ” ) ; g s i g n a l c o n n e c t ( button , ” c l i c k e d ” , G CALLBACK ( g t k m a i n q u i t ) , NULL ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( bbox ) , button ) ; GTK WIDGET SET FLAGS ( button , GTK CAN DEFAULT ) ; g t k w i d g e t g r a b d e f a u l t ( button ) ;
393 394 395 396 397 398 399 400
g t k w i d g e t s h o w a l l ( window ) ;
401 402
}
403 404 405 406 407 408
i n t main ( i n t argc , char ∗ argv [ ] ) { g t k i n i t (& argc , &argv ) ;
409
create calendar ( ) ;
410 411
gtk main ( ) ;
412 413
return 0;
414 415
}
8.12.
Sz´ınkiv´alaszt´as (Color Selection)
¨ A sz´ınkiv´alaszt´as vagy RGB, vagy HSV sz´ınrendszer alapj´an lehets´eges. A sz´ınkiv´alaszt´ast vagy a sz´ınh´aromszogbe ¨ ¨ meg. Lehet˝os´eg van a sz´ın a´ ttettsz˝os´eg´enek kattintva, vagy az osszetev˝ ok sz´am szerinti be´all´ıt´as´aval tehetjuk az a´ ll´ıt´as´ara is. ¨ A sz´ınkiv´alaszto´ felulet-elem egyetlen szign´alt ad ki, a color_changed-et, ami vagy az aktu´alis sz´ın ¨ ´ megh´ıvjuk a gtk_color_selection_set_color() megv´altoz´asakor kovetkezik be, vagy ha programbol ¨ fuggv´ enyt. A sz´ınkiv´alaszt´asra k´et lehet˝os´eg is van: 1
GtkWidget ∗ g t k c o l o r s e l e c t i o n n e w ( void ) ; ´ ınuleg ˝ ¨ ¨ ezt a konstruktort haszn´alod majd. A fuggv´ ¨ Valosz´ nem kozvetlen ul eny l´etrehoz egy ColorSelection ¨ elemet, melyet neked kell egy szul˝ ¨ o elembe foglalni (keretbe, dobozba). A ColorSelection elem a VBox felulet elemb˝ol sz´armazik.
1
GtkWidget ∗ g t k c o l o r s e l e c t i o n d i a l o g n e w ( c o n s t gchar ∗ c i m f e l i r a t ) ; ¨ Ez a gyakrabban haszn´alt sz´ınkiv´alaszto´ fuggv´ eny. Egy ColorSelectionDialog-ot hoz l´etre, amely egy ke¨ elemet, egy v´ızszintes elv´alaszto´ elemet e´ s egy v´ızszintes dobozt egy retet e´ s abban egy ColorSelection felulet 88
¨ meg, hogy itt a ColorSelection elemet m´ar egy keretbe elOk, egy M´egse e´ s egy Seg´ıts´eg gombbal. Figyeljuk helyezve kapjuk. Ezeket a gombokat ok_button, cancel_button, help_button neveken e´ rheted el a Col´ an belul, ¨ p´eld´aul: GTK_COLOR_SELECTION_DIALOG (colorseldialog)->ok_button)). orSelectionDialog struktur´ ´ ag be´all´ıt´as´ara is mod ´ van. Ez a lehet˝os´eg alap´ertelmez´esben ki van A sz´ınek kiv´alaszt´asakor az a´ tl´atszos´ kapcsolva. 1 2
void g t k c o l o r s e l e c t i o n s e t h a s o p a c i t y c o n t r o l ( G t k C o l o r S e l e c t i o n ∗ s z i n k i v a l a s z t o p a n e l , gboolean atlatszosag TRUE vagy FALSE ) ; ¨ Adott sz´ınt nem csak a panelr˝ol, hanem fuggv´ enyh´ıv´assal is kiv´alaszthatsz:
1 2
void g t k c o l o r s e l e c t i o n s e t c u r r e n t c o l o r ( G t k C o l o r S e l e c t i o n ∗ s z i n k i v a l a s z t o p a n e l , GdkColor ∗ szin ) ;
3 4 5 6
/∗ az a t l a t s z o s a g b e a l l i t a s a fuggvenybol : ∗/ void g t k c o l o r s e l e c t i o n s e t c u r r e n t a l p h a ( G t k C o l o r S e l e c t i o n ∗ s z i n k i v a l a s z t o p a n e l , guint16 atlatszosag ) ; ´ ag e´ rt´eke 0-tol ´ (teljesen a´ tl´atszo) ´ 65536-ig (teljesen l´athato, ´ nem a´ tl´atszo) ´ terjedhet. Az a´ tl´atszos´ ´ agot ´ıgy k´erdezheted le – p´eld´aul ha a color_changed jelz´est e´ szreveszed: Az aktu´alis sz´ınt e´ s a´ tl´atszos´
1 2
void g t k c o l o r s e l e c t i o n g e t c u r r e n t c o l o r ( G t k C o l o r S e l e c t i o n ∗ s z i n k i v a l a s z t o p a n e l , GdkColor ∗ szin ) ;
3 4 5
void g t k c o l o r s e l e c t i o n g e t c u r r e n t a l p h a ( G t k C o l o r S e l e c t i o n ∗ s z i n k i v a l a s z t o p a n e l , guint16 atlatszosag ) ; A p´eldaprogram ford´ıt´as´ahoz a libgtk2.0-dev csomagot telep´ıtettem:
1 2 3 4
# i n c l u d e < g l i b . h> # i n c l u d e # i n c l u d e
5 6 7 8
GtkWidget ∗ c o l o r s e l d l g = NULL; GtkWidget ∗ drawingarea = NULL; GdkColor c o l o r ;
9 10 11 12 13 14
/∗ Color changed s z i g n a l k e z e l e s e ∗/ void c o l o r c h a n g e d c b ( GtkWidget ∗ feluletelem , GtkColorSelection ∗ szinkivalaszto ) { GdkColor n c o l o r ;
15 16 17
g t k c o l o r s e l e c t i o n g e t c u r r e n t c o l o r ( s z i n k i v a l a s z t o , &n c o l o r ) ; gtk widget modify bg ( drawingarea , GTK STATE NORMAL, &n c o l o r ) ; 89
18
}
19 20 21 22 23 24 25 26 27
/∗ Drawingarea ( r a j z o l o t e r u l e t ) esemenykezelo ∗/ g i n t a r e a e v e n t ( GtkWidget ∗ f e l u l e t e l e m , GdkEvent ∗esemeny , gpointer ugyfel adat ) { g i n t handled = FALSE ; g i n t response ; GtkColorSelection ∗ szinkivalaszto ;
28
/∗ gomblenyomas e s e t e n fusson l e ∗/ i f ( esemeny−>type == GDK BUTTON PRESS ) { handled = TRUE ;
29 30 31 32 33
/∗ s z i n k i v a l a s z t o parbeszedablak e l k e s z i t e s e ∗/ i f ( c o l o r s e l d l g == NULL) c o l o r s e l d l g = g t k c o l o r s e l e c t i o n d i a l o g n e w ( ” V a l a s s z a negyzetnek h a t t e r s z i n t : ”
34 35 36 37
/∗ C o l o r S e l e c t i o n f e l u l e t elem mutatojanak e l t a r o l a s a ∗/ s z i n k i v a l a s z t o = GTK COLOR SELECTION ( GTK COLOR SELECTION DIALOG ( c o l o r s e l d l g )−> c o l o
38 39 40
/∗ e l o z o es a k t u a l i s s z i n b e a l l i t a s a ∗/ g t k c o l o r s e l e c t i o n s e t p r e v i o u s c o l o r ( s z i n k i v a l a s z t o , &c o l o r ) ; g t k c o l o r s e l e c t i o n s e t c u r r e n t c o l o r ( s z i n k i v a l a s z t o , &c o l o r ) ;
41 42 43 44
/∗ legyen p a l e t t a ∗/ g t k c o l o r s e l e c t i o n s e t h a s p a l e t t e ( s z i n k i v a l a s z t o , TRUE ) ;
45 46 47
/∗ ” c o l o r c h a n g e d ” s z i g n a l h o z c s a t l a k o z a s , ∗ u g y f e l a d a t o t b e a l l i t j u k a s z i n k i v a l a s z t o elemre ∗/ g s i g n a l c o n n e c t ( G OBJECT ( s z i n k i v a l a s z t o ) , ” c o l o r c h a n g e d ” , G CALLBACK ( c o l o r c h a n g e d c b ) , ( g p o i n t e r ) s z i n k i v a l a s z t o ) ;
48 49 50 51 52
/∗ parbeszedablak m e g j e l e n i t e s e ∗/ response = g t k d i a l o g r u n (GTK DIALOG ( c o l o r s e l d l g ) ) ;
53 54 55
i f ( response == GTK RESPONSE OK ) g t k c o l o r s e l e c t i o n g e t c u r r e n t c o l o r ( s z i n k i v a l a s z t o , &c o l o r ) ; else gtk widget modify bg ( drawingarea , GTK STATE NORMAL, &c o l o r ) ;
56 57 58 59 60
gtk widget hide ( colorseldlg ) ;
61
}
62 63
r e t u r n handled ;
64 65
}
66 67 68 69 70 71 72 73 74
/∗ program b e z a r a s a ∗/ g i n t destroy window ( GtkWidget ∗ widget , GdkEvent ∗ event , gpointer client data ) { gtk main quit ( ) ; r e t u r n TRUE ; }
75 76 77 78 79
/∗ Foprogram ∗/ g i n t main ( g i n t argc , gchar ∗ argv [ ] ) { 90
GtkWidget ∗window ;
80 81
/∗ GTK i n i c i a l i z a l a s a , GTK−nak s z o l o kapcsolok k i e m e l e s e p a r a m e t e r l i s t a b o l ∗/ g t k i n i t (& argc , &argv ) ;
82 83 84
/∗ Fo a b l a k l e t r e h o z a s a , cimsor b e a l l i t a s a , ∗/ window = gtk window new (GTK WINDOW TOPLEVEL ) ; g t k w i n d o w s e t t i t l e (GTK WINDOW ( window ) , ” K l i k k e l j a s z i n e s n e g y z e t r e ! ” ) ; g t k w i n d o w s e t p o l i c y (GTK WINDOW ( window ) , TRUE, TRUE, TRUE ) ;
85 86 87 88 89
/∗ ” d e l e t e ” es ” d e s t r o y ” esemenyekre kilepunk ∗/ g s i g n a l c o n n e c t ( GTK OBJECT ( window ) , ” d e l e t e e v e n t ” , GTK SIGNAL FUNC ( destroy window ) , ( g p o i n t e r ) window ) ;
90 91 92 93
/∗ r a j z o l o t e r u l e t l e t r e h o z a s a , m e r e t b e a l l i t a s es gomb esemenyek f i g y e l e s e ∗/ drawingarea = gtk drawing area new ( ) ;
94 95 96
c o l o r . red = 0 ; /∗ h a t t e r s z i n b e a l l i t a s ∗/ c o l o r . blue = 6 5 5 3 5 ; c o l o r . green = 0 ; gtk widget modify bg ( drawingarea , GTK STATE NORMAL, &c o l o r ) ;
97 98 99 100 101
g t k w i d g e t s e t s i z e r e q u e s t (GTK WIDGET ( drawingarea ) , 5 0 0 , 2 0 0 ) ;
102 103
g t k w i d g e t s e t e v e n t s ( drawingarea , GDK BUTTON PRESS MASK ) ;
104 105
g s i g n a l c o n n e c t ( GTK OBJECT ( drawingarea ) , ” event ” , GTK SIGNAL FUNC ( a r e a e v e n t ) , ( g p o i n t e r ) drawingarea ) ;
106 107 108
/∗ R a j z o l o t e r u l e t e t az ablakhoz adjuk es mindkettot m e g j e l e n i t j u k ∗/ g t k c o n t a i n e r a d d (GTK CONTAINER ( window ) , drawingarea ) ;
109 110 111
gtk widget show ( drawingarea ) ; gtk widget show ( window ) ;
112 113 114
/∗ gtk main v e g t e l e n c i k l u s b a belepunk ∗/ gtk main ( ) ;
115 116 117
/∗ es s z a b a l y o s k i l e p e s a program vegere ∗/ return 0;
118 119 120
}
8.13.
F´ajl kiv´alaszt´as
´ ¨ elem elavult, a GtkFileChooser v´altja FONTOS: A GTK el˝oz˝o verzioiban l´ev˝o GtkFileSelection felulet fel. ¨ K´et felulet elemet haszn´alhatunk a f´ajlok kiv´alaszt´as´aval kapcsolatban: a GtkFileChooserButton ele¨ ¨ met e´ s a GtkFileChooser elemet. A kovetkez˝ o p´elda Andrew Krause GTK p´eldaprogramja alapj´an k´eszult. ¨ ¨ A f´ajlkiv´alaszto´ gombbal vagy egy l´etez˝o konyvt´ arat, vagy egy f´ajlt v´alaszthatsz ki. Hasznos fuggv´ eny a ¨ gtk_file_chooser_set_current_folder() ami az aktu´alis konyvt´ arat a´ ll´ıtja be, e´ s a g_get_home_dir() ¨ ´ ¨ ami a felhaszn´alo´ home konyvt´ ar´anak utvonal´ aval t´er vissza. A kiv´alasztott f´ajl vagy konyvt´ ar nev´et a gtk_file_chooser ¨ fuggv´ ennyel k´erdezheted le, ami NULL e´ rt´ekkel t´er vissza ha m´eg nem v´alasztottak ki semmit. ¨ tobb ¨ el´erhet˝o objektum is van: A f´ajliv´alaszto´ elemen belul dir_list file_list selection_entry selection_text main_vbox ok_button cancel_button help_button 91
/* Pelda egy belso objektum eleresere: * figyeljuk az ok_button -t, es fuggvenyt inditunk ha lenyomjak */ g_signal_connect (G_OBJECT (GTK_FILE_SELECTION (fajlkivalaszto_elem_mutatoja)->ok_button) "clicked", G_CALLBACK (ok_gombra_reagalo_fuggveny), (gpointer) fajlkivalaszt
1
# i n c l u d e
2 3 4
s t a t i c void d e s t r o y ( GtkWidget ∗window , g p o i n t e r data ) { gtk main quit ( ) ; }
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
/∗ ha a k o n y v t a r k i v a l a s z t a s t vegzo gombbal ∗ k i v a l a s z t u n k egy konyvtarat , ∗ a f a j l k i v a l a s z t o gomb az a d o t t ∗ konyvtaron b e l u l r o l v a l a s z t j a k i a f a j l t . ∗ gomb konyvtar : a k o n y v t a r k i v a l a s z t o gomb mutatoja ∗ gomb : f a j l k i v a l a s z t o gomb mutatoja ∗ ∗ ∗/ s t a t i c void k o n y v t a r v a l t a s ( GtkFileChooser ∗ gomb konyvtar , GtkFileChooser ∗gomb ) { gchar ∗ f o l d e r = g t k f i l e c h o o s e r g e t f i l e n a m e ( GTK FILE CHOOSER ( gomb konyvtar ) ) ; g t k f i l e c h o o s e r s e t c u r r e n t f o l d e r ( GTK FILE CHOOSER ( gomb ) , f o l d e r ) ; } 92
21 22 23 24 25 26
i n t main ( i n t argc , char ∗ argv [ ] ) { /∗ f e l u l e t elemeknek mutatok d e k l a r a l a s a ∗/ GtkWidget ∗window , ∗gomb , ∗ gomb konyvtar , ∗vbox ;
27 28 29 30
/∗ l e h e t s z u r n i a m e g j e l e n i t e t t f a j l o k a t , ∗ p l . csak fo rr as ko d , vagy minden f a j l ∗/ G t k F i l e F i l t e r ∗ szuro1 , ∗ szuro2 , ∗ szuro3 ;
31 32
g t k i n i t (& argc , &argv ) ;
33 34 35 36
/∗∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗∗/ window = gtk window new (GTK WINDOW TOPLEVEL ) ; g t k w i d g e t s e t s i z e r e q u e s t (GTK WIDGET ( window ) , 3 5 0 , 1 8 0 ) ;
37 38 39
g t k w i n d o w s e t t i t l e (GTK WINDOW ( window ) , ” F a j l k i v a l a s z t o gomb” ) ; g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( window ) , 2 0 ) ;
40 41 42 43
/∗ az a b l a k bezarasahoz k e l l ez a fuggveny ∗/ g s i g n a l c o n n e c t ( G OBJECT ( window ) , ” d e s t r o y ” , G CALLBACK ( d e s t r o y ) , NULL ) ;
44 45 46 47 48 49
/∗∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗∗/ gomb konyvtar = g t k f i l e c h o o s e r b u t t o n n e w ( ” V a l a s s z k o n y v t a r a t ” , GTK FILE CHOOSER ACTION SELECT FOLDER ) ; gomb = g t k f i l e c h o o s e r b u t t o n n e w ( ” V a l a s s z egy f a j l t ! ” , GTK FILE CHOOSER ACTION OPEN ) ;
50 51 52 53 54 55
/∗ a gomb a l a p e r t e l m e z e s b e n a home konyvtarra mutat ∗/ g t k f i l e c h o o s e r s e t c u r r e n t f o l d e r ( GTK FILE CHOOSER ( gomb konyvtar ) , g get home dir ( ) ) ; g t k f i l e c h o o s e r s e t c u r r e n t f o l d e r ( GTK FILE CHOOSER ( gomb ) , g get home dir ( ) ) ;
56 57 58 59 60
/∗ konyvtar k i v a l a s z t a s t f i g y e l j u k , f a j l k i v a l a s z t a s h o z ∗/ g s i g n a l c o n n e c t ( G OBJECT ( gomb konyvtar ) , ” s e l e c t i o n c h a n g e d ” , G CALLBACK ( k o n y v t a r v a l t a s ) , ( g p o i n t e r ) gomb ) ;
61 62 63 64 65 66 67 68 69
/∗ a m e g j e l e n i t e t t f a j l o k a t s z u r n i i s l e h e t , ∗ a pelda vagy minden f a j l , vagy a k e p f a j l o k , ∗ vagy a program for ra sko dok ∗ m e g j e l e n i t e s e t t e s z i l e h e t o v e ∗/ szuro1 = g t k f i l e f i l t e r n e w ( ) ; szuro2 = g t k f i l e f i l t e r n e w ( ) ; szuro3 = g t k f i l e f i l t e r n e w ( ) ;
70 71 72 73
g t k f i l e f i l t e r s e t n a m e ( szuro1 , ”Minden f a j l ” ) ; g t k f i l e f i l t e r s e t n a m e ( szuro2 , ”Kep f a j l o k ” ) ; g t k f i l e f i l t e r s e t n a m e ( szuro3 , ” fo rra sko dok ” ) ;
74 75 76 77 78 79 80
gtk gtk gtk gtk gtk gtk
file file file file file file
filter filter filter filter filter filter
add add add add add add
pattern pattern pattern pattern pattern pattern
( szuro1 ( szuro2 ( szuro2 ( szuro3 ( szuro3 ( szuro3
, , , , , ,
”∗ ” ) ; ” ∗ . png” ) ; ” ∗ . jpg ” ) ; ” ∗. c” ) ; ” ∗ . cpp” ) ; ” ∗ . py” ) ;
81 82
/∗ szurok h o z z a r e n d e l e s e f a j l k i v a l a s z t o gombhoz ∗/ 93
g t k f i l e c h o o s e r a d d f i l t e r ( GTK FILE CHOOSER ( gomb ) , szuro1 ) ; g t k f i l e c h o o s e r a d d f i l t e r ( GTK FILE CHOOSER ( gomb ) , szuro2 ) ; g t k f i l e c h o o s e r a d d f i l t e r ( GTK FILE CHOOSER ( gomb ) , szuro3 ) ;
83 84 85 86
/∗∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗∗/
87 88 89 90
vbox = gtk vbox new ( FALSE , 5 ) ; g t k b o x p a c k s t a r t d e f a u l t s (GTK BOX ( vbox ) , gomb konyvtar ) ; g t k b o x p a c k s t a r t d e f a u l t s (GTK BOX ( vbox ) , gomb ) ;
91 92 93 94
g t k c o n t a i n e r a d d (GTK CONTAINER ( window ) , vbox ) ; g t k w i d g e t s h o w a l l ( window ) ;
95 96 97
gtk main ( ) ; return 0;
98 99 100
}
9.
T´arolo´ elemek (Container widgets)
9.1.
Esem´enydoboz (EventBox)
´ az X ablakkezel˝o egy olyan szoftver, ami az ablakok elhelyez´es´et e´ s megjelen´ıt´es´et X window - a Wikip´edi´abol: ¨ vez´erli az X Window System alatt. Tobbnyire a Unix-szeru˝ rendszereken haszn´alj´ak. ¨ ¨ ¨ kapcsolatban az X window-al, a szul˝ ¨ o elemukre ¨ N´eh´any felulet elem nincs kozvetlen ul rajzolnak. Ez´ert ¨ elemei egym´ast nem tudnak esem´enyeket fogadni, e´ s helytelen m´eretbe´all´ıt´as eset´en a grafikus programfelulet a´ tlapolhatj´ak. Az Esem´enydoboz ezen a probl´em´an seg´ıt. ¨ Az esem´enydoboznak l´athato´ hat´asa nincs – viszont gyermek elemeinek X window-szeru˝ fuggv´ enyeket ¨ ¨ biztos´ıt. Azon felulet elemek sz´am´ara akik az X window-al nincsenek kozvetlen kapcsolatban, ez fontos. Ha ¨ elem nem tud esem´enyeket fogadni e´ s a benne l´ev˝o tartalombol ´ nem nincs kapcsolat az X-el, akkor egy felulet tud egy kiv´agott r´eszletet megjelen´ıteni. ´ EventBox elemet ´ıgy hozhatsz l´etre: Uj 1
GtkWidget ∗ gtk event box new ( void ) ; Gyermek elem EventBox-hoz ad´asa:
1
g t k c o n t a i n e r a d d (GTK CONTAINER ( eve nt bo x ) , c h i l d w i d g e t ) ; ¨ ¨ A kovetkez˝ o p´elda egy szoveges feliratot hoz l´etre egy kism´eretu˝ ablakba, e´ s egy klikkel´esre befejezi a fut´as´at.
1 2
# i n c l u d e < s t d l i b . h> # i n c l u d e
3 4 5 6 7 8 9
i n t main ( i n t argc , char ∗ argv [ ] ) { GtkWidget ∗window ; GtkWidget ∗ ev en t bo x ; GtkWidget ∗ l a b e l ;
/∗ mutatok a f e l u l e t elemek r e s z e r e ∗/
10 11
g t k i n i t (& argc , &argv ) ;
12 13
window = gtk window new (GTK WINDOW TOPLEVEL ) ; 94
g t k w i n d o w s e t t i t l e (GTK WINDOW ( window ) , ” Event Box” ) ;
14 15
g s i g n a l c o n n e c t ( G OBJECT ( window ) , ” d e s t r o y ” , G CALLBACK ( e x i t ) , NULL ) ;
16 17 18
/∗ b e l s o margo b e a l l i t a s a ∗/ g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( window ) , 1 0 ) ;
19 20 21
/∗ EventBox l e t r e h o z a s a es ablakba h e l y e z e s e , m e g j e l e n i t e s e ev en t box = gtk event box new ( ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( window ) , eve nt bo x ) ; gtk widget show ( e ven t bo x ) ;
22 23 24 25
∗/
26
/∗ Egy hosszu s z o v e g e t keszitunk , EventBox−ba berakjuk , m e g j e l e n i t j u k ∗/ l a b e l = g t k l a b e l n e w ( ”A k i l e p e s h e z k l i k k e l j i d e vagy i d e e s e t l e g i d e l e g v e g s o e s e t b e n g t k c o n t a i n e r a d d (GTK CONTAINER ( eve nt bo x ) , l a b e l ) ; gtk widget show ( l a b e l ) ;
27 28 29 30 31
/∗ A hosszu s z o v e g e t a d o t t mereture vagjuk ∗/ g t k w i d g e t s e t s i z e r e q u e s t ( label , 110 , 2 0 ) ;
32 33 34
/∗ ha gomb lenyomast e s z l e l EventBox , programbol l e p j e n k i ∗/ g t k w i d g e t s e t e v e n t s ( event box , GDK BUTTON PRESS MASK ) ; g s i g n a l c o n n e c t ( G OBJECT ( ev ent bo x ) , ” b u t t o n p r e s s e v e n t ” , G CALLBACK ( e x i t ) , NULL ) ;
35 36 37 38 39
/∗ Ez az egy meg k e l l az X window−nak ∗/ g t k w i d g e t r e a l i z e ( ev en t bo x ) ;
40 41 42
/∗ Kurzor b e a l l i t a s a az EventBox f o l o t t , ERDEKES ! ! ∗/ gdk window set cursor ( event box−>window , gdk cursor new (GDK HAND1 ) ) ;
43 44 45
gtk widget show ( window ) ; gtk main ( ) ; return 0;
46 47 48 49
}
9.2.
Az Igaz´ıt´as (Alignment) felulet ¨ elem
¨ ´ ´ e´ s m´erete az Igaz´ıt´as Az Igaz´ıt´as felulet elem belsej´ebe m´as elemeket helyezhetsz ugy, hogy annak poz´ıcioja ´ atol ´ e´ s m´eret´et˝ol fugg. ¨ ¨ elem poz´ıcioj´ P´eld´aul egy ablak kozep´ ere – ak´armekkora is az ablak – ´ıgy illeszthetsz be egy elemet. ¨ elemhez k´et fuggv´ ¨ Az Igaz´ıt´as felulet eny tartozik: 1 2 3 4
GtkWidget∗ gtk alignment new ( g f l o a t gfloat gfloat gfloat
xalign yalign xscale yscale
, , , );
5 6 7 8 9 10
void g t k a l i g n m e n t s e t ( GtkAlignment ∗ alignment , gfloat xalign , gfloat yalign , gfloat xscale , gfloat yscale ) ; ¨ ´ Igaz´ıt´as elemet hoz l´etre, a m´asodikkal egy m´ar l´etez˝o Igaz´ıt´as elem be´all´ıt´asait Az els˝o fuggv´ eny uj ¨ ¨ otti ¨ v´altoztathatod meg. A fuggv´ enyek mindegyik pozicion´alo´ param´etere lebeg˝opontos sz´am, 0.0 e´ s 1.0 koz ¨ elhelyezett elem poz´ıcioj´ ´ at hat´arozza meg. Az e´ rt´ektartom´annyal. Az xalign e´ s yalign az Igaz´ıt´ason belul ¨ uli ¨ helyre van hat´assal. xscale e´ s a yscale a beillesztett elem kor ¨ elemet: Az Igaz´ıt´as elembe ´ıgy helyezhetsz m´asik felulet
1
g t k c o n t a i n e r a d d (GTK CONTAINER ( alignment ) , c h i l d w i d g e t ) ;
95
Az elem haszn´alat´ara a progress bar (´allapotjelz˝o cs´ık) haszn´alat´an´al l´athatsz p´eld´at – /src/progressbar/´ progressbar.c Erdemes megfigyelni hogy ak´armilyen sz´elesre a´ ll´ıtom az ablakot, a folyamatjelz˝o cs´ık mindig ¨ epen l´athato, ´ az Igaz´ıt´as elem miatt: koz´
9.3.
Pozicion´alt t´arolo´ (Fixed container)
´ ´ helyezhetsz el m´as elemeket. A behelyezett elem poz´ıcioj´ ´ at a Ennek a t´arolonak az ablak´aba adott poz´ıcioba ¨ bal fels˝o sarokhoz k´epest adhatod meg – e´ s fut´as kozben ak´ar v´altoztathatod is. ´ o´ fuggv´ ¨ kapcsolod enyek: 1 2 3
/∗ u j t a r o l o l e t r e h o z a s a ∗/ GtkWidget∗ g t k f i x e d n e w ( void ) ;
4 5 6 7 8 9
/∗ elem t a r o l o b a h e l y e z e s e X , Y k o o r d i n a t a k r a ∗/ void g t k f i x e d p u t ( GtkFixed ∗ t a r o l o , GtkWidget ∗ b e h e l y e z e t t e l e m , gint x, gint y );
10 11 12 13 14 15
/∗ A mar b e h e l y e z e t t elem u j p o z i c i o b a mozgatasa ∗/ void g t k f i x e d m o v e ( GtkFixed ∗ t a r o l o , GtkWidget ∗ b e h e l y e z e t t e l e m , gint x, gint y );
16 17 18 19
void g t k f i x e d s e t h a s w i n d o w ( GtkFixed gboolean
∗ tarolo , ablakkal rendelkezik ) ;
20 21
gboolean g t k f i x e d g e t h a s w i n d o w ( GtkFixed ∗ t a r o l o ) ; ¨ ıtett helyzetu˝ felulet ¨ elemeknek nincs saj´at X ablakuk. Mivel ez v´altoz´as a kor´abbi GTK Rendszerint a rogz´ ´ ¨ ´ saj´at verziokhoz k´epest, a gtk_fixed_set_has_window() fuggv´ ennyel lehet˝os´eged van pozicion´alt t´arolot ablakkal l´etrehozni. ¨ ¨ meg A kovetkez˝ o p´elda bemutatja a pozicion´alt t´arolo´ haszn´alat´at. Klikkelj k´erlek a gombokra, e´ s figyeljuk ´ altoz´ast! a poz´ıciov´
1
96
2
# i n c l u d e
3 4 5 6 7 8
/∗ a p o z i c i o n a l t t a r o l o b a n l e v o elemek x , y k o o r d i n a t a i t ∗ ezekben a g l o b a l i s valtozokban mentjuk e l : ∗/ gint x = 20; gint y = 20;
9 10 11 12 13 14 15 16 17 18
/∗ Ez a fuggveny mozgatja a gombot az u j p o z i c i o j a b a ∗ ∗/ s t a t i c void move button ( GtkWidget ∗ widget , GtkWidget ∗ f i x e d ) { x = ( x + 40) % 300; y = ( y + 20) % 300; g t k f i x e d m o v e ( GTK FIXED ( f i x e d ) , widget , x , y ) ; }
19 20 21 22 23 24 25 26 27
i n t main ( i n t argc , char ∗ argv [ ] ) { /∗ GtkWidget az elemek alap−t i p u s a . ∗/ GtkWidget ∗window ; GtkWidget ∗ f i x e d ; GtkWidget ∗ button ; gint i ;
28 29 30
/∗ GTK i n i c i a l i z a l a s a ∗/ g t k i n i t (& argc , &argv ) ;
31 32 33 34
/∗ Uj a b l a k k e s z i t e s e ∗/ window = gtk window new (GTK WINDOW TOPLEVEL ) ; g t k w i n d o w s e t t i t l e (GTK WINDOW ( window ) , ” Fixed Container ” ) ;
35 36 37 38
/∗ kilepunk a ” d e s t r o y ” s z i g n a l r a ∗/ g s i g n a l c o n n e c t ( G OBJECT ( window ) , ” d e s t r o y ” , G CALLBACK ( g t k m a i n q u i t ) , NULL ) ;
39 40 41
/∗ az a b l a k b e l s o margoit b e a l l i t j u k ∗/ g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( window ) , 1 0 ) ;
42 43 44 45 46
/∗ Uj p o z i c i o n a l t t a r o l o t k e s z i t u n k ∗/ fixed = gtk fixed new ( ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( window ) , f i x e d ) ; gtk widget show ( f i x e d ) ;
47 48 49 50
f o r ( i = 1 ; i <= 3 ; i ++) { /∗ Gombot c s i n a l u n k , ” K l i k k e l j ram” f e l i r a t t a l ∗/ button = g t k b u t t o n n e w w i t h l a b e l ( ” K l i k k e l j ram” ) ;
51
/∗ Amikor a gomb a ” c l i c k e d ” s z i g n a l t f o g a d j a , meghivja a ∗ move button ( ) fuggvenyt , paramterekent atadva a Fixed Container−t . ∗/ g s i g n a l c o n n e c t ( G OBJECT ( button ) , ” c l i c k e d ” , G CALLBACK ( move button ) , ( g p o i n t e r ) f i x e d ) ;
52 53 54 55 56
/∗ A gombot a t a r o l o b a , a d o t t p o z i c i o b a helyezzuk . ∗/ g t k f i x e d p u t ( GTK FIXED ( f i x e d ) , button , i ∗ 5 0 , i ∗ 5 0 ) ;
57 58 59
/∗ Az epp most l e t r e h o z o t t elemet l a t h a t o v a t e s s z u k . ∗/ gtk widget show ( button ) ;
60 61 62
}
63
97
/∗ a program f o a b l a k a t l a t h a t o v a t e s s z u k ∗/ gtk widget show ( window ) ;
64 65 66
/∗ varakozas v e g t e l e n c i k l u s b a n a f e l h a s z n a l o i esemenyekre gtk main ( ) ;
67 68
∗/
69
return 0;
70 71
}
9.4.
Elrendez´es t´arolo´ (Layout Container)
´ – elt´er˝o abban, hogy v´egtelen nagys´agu´ (2 a 32-enn´el kiAz elrendez´es t´arolo´ hasonl´ıt a pozicion´alt t´arolora ¨ ıthet˝o teruletet ¨ sebb) gord´ defini´al. Az X ablakkezel˝o rendszernek van egy be´ep´ıtett korl´atoz´asa minden ablak ¨ onb ¨ oz˝ ¨ o legfeljebb 32767 pixel kiterjed´esu˝ (sz´eless´eg/magass´ag) lehet. Az elrendez´es t´arolo´ ezt a korl´atoz´ast kul ¨ okkel ¨ ¨ trukk megkeruli. 1 2
GtkWidget ∗ g t k l a y o u t n e w ( GtkAdjustment ∗ v i z s z i n t e s m o d o s i t o e l e m , GtkAdjustment ∗ f u g g o l e g e s m o d o s i t o e l e m ) ; ¨ ¨ ´ A fuggv´ enyben megadhato´ a gorget´ esre haszn´alt modos´ ıto´ objektum. ´ uj ´ elemet ´ıgy tehetsz: Az elrendez´es t´aroloba
1 2 3 4
void g t k l a y o u t p u t ( GtkLayout ∗ e l r e n d e z e s t a r o l o , GtkWidget ∗ f e l u l e t −elem , gint x, gint y );
5 6 7 8 9 10
/∗ b e h e l y e z e t t elem u j p o z i c i o b a mozgatasa ∗/ void gtk layout move ( GtkLayout ∗ e l r e n d e z e s t a r o l o , GtkWidget ∗ f e l u l e t −elem , gint x, gint y ); ´ Az elrendez´es t´arolo´ m´eret´et ´ıgy modos´ ıthatod:
1 2 3
void g t k l a y o u t s e t s i z e ( GtkLayout ∗ e l r e n d e z e s t a r o l o , guint szelesseg , guint magassag ) ; ¨ ¨ oleges modos´ ´ Az utolso´ n´egy fuggv´ eny az elrendez´es t´arolo´ e´ s a v´ızszintes / fugg˝ ıto´ elemek haszn´alat´ara ´ valo:
1
GtkAdjustment ∗ g t k l a y o u t g e t h a d j u s t m e n t ( GtkLayout ∗ e l r e n d e z e s t a r o l o ) ;
2 3
GtkAdjustment ∗ g t k l a y o u t g e t v a d j u s t m e n t ( GtkLayout ∗ e l r e n d e z e s t a r o l o ) ;
4 5 6
void g t k l a y o u t s e t h a d j u s t m e n t ( GtkLayout ∗ elrendezes tarolo , GtkAdjustment ∗ modosito elem ) ;
7 8 9
∗ elrendezes tarolo , void g t k l a y o u t s e t v a d j u s t m e n t ( GtkLayout GtkAdjustment ∗ modosito elem ) ;
9.5.
Keretek (Frames)
¨ ´ A keretekkel elemek egy csoportj´at feliratozhato´ dobozba foghatod ossze. A doboz st´ılusa, a felirat poz´ıcioja ´ szab´alyozhato. Keretet ´ıgy hozhatsz l´etre: 1
GtkWidget ∗ gtk frame new ( c o n s t gchar ∗ f e l i r a t
);
A felirat alap´ertelmezett helye a keret bal fels˝o sarka. Ha felirat param´eterk´ent NULL e´ rt´eket adunk, a ¨ ´ modos´ ´ kerethez nem jelenik meg felirat. A felirat szoveg´ et programbol ıthatod is, ´ıgy: 1 2
∗ keret , void g t k f r a m e s e t l a b e l ( GtkFrame c o n s t gchar ∗ f e l i r a t A felirat elhelyez´es´et pedig ´ıgy szab´alyozhatod: 98
);
1 2 3
void g t k f r a m e s e t l a b e l a l i g n ( GtkFrame ∗ k e r e t , gfloat xpozicio , gfloat ypozicio ) ; ¨ otti ¨ e´ rt´ekeket vehetnek fel. Az e´ rt´ek ar´anyt jelent: a 0 a bal sarkot, az 1 A k´et poz´ıcio´ e´ rt´ek 0.0 e´ s 1.0 koz ¨ en˝o igaz´ıt´ast. Az ypozicio tulajdonsagnak jelenleg nincs hat´asa, az xpozicio pedig a a jobb sarokhoz tort´ keret bal sz´el´ehez viszony´ıtott – ar´anyos – t´avols´agot hat´arozza meg. A keret megjelen´es´enek st´ılus´at ´ıgy szab´alyozhatod:
1 2
∗ keret , void g t k f r a m e s e t s h a d o w t y p e ( GtkFrame GtkShadowType m e g j e l e n e s s t i l u s a ) ;
3
9
/∗ s t i l u s l e h e t s e g e s e r t e k e i : GTK SHADOW NONE GTK SHADOW IN GTK SHADOW OUT GTK SHADOW ETCHED IN ( a l a p e r t e l m e z e t t ) GTK SHADOW ETCHED OUT ∗/
1
# i n c l u d e
4 5 6 7 8
2 3 4 5 6 7 8
i n t main ( i n t argc , char ∗ argv [ ] ) { /∗ GtkWidget a f e l u l e t elemek t a r o l o t i p u s a ∗/ GtkWidget ∗window ; GtkWidget ∗ frame ;
9 10 11
/∗ GTK i n i c i a l i z a l a s ∗/ g t k i n i t (& argc , &argv ) ;
12 13 14 15
/∗ Uj a b l a k l e t r e h o z a s a ∗/ window = gtk window new (GTK WINDOW TOPLEVEL ) ; g t k w i n d o w s e t t i t l e (GTK WINDOW ( window ) , ” Ke ret ( Frame ) pelda ” ) ;
16 17 18 19
/∗ a ” d e s t r o y ” esemenyhez k a p c s o l j u k a k i l e p e s t ∗/ g s i g n a l c o n n e c t ( G OBJECT ( window ) , ” d e s t r o y ” , G CALLBACK ( g t k m a i n q u i t ) , NULL ) ;
20 21 22 23
g t k w i d g e t s e t s i z e r e q u e s t ( window , 4 0 0 , 2 0 0 ) ; /∗ b e l s o margot b e a l l i t j u k : ∗/ g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( window ) , 1 0 ) ;
24 25 26 27
/∗ k e r e t l e t r e h o z a s a ∗/ frame = gtk frame new (NULL ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( window ) , frame ) ;
28 29 30
/∗ f e l i r a t b e a l l i t a s a k e r e t h e z ∗/ g t k f r a m e s e t l a b e l (GTK FRAME ( frame ) , ”GTK k e r e t f e l u l e t elem ” ) ;
31 32 33 34 35
/∗ a cimket a k e r e t j o b b o l d a l a h o z i g a z i t j u k , 1 . 0 c s i n a l j a e z t ∗ az i g a z i t a s aranyos . 0 . 0 a b a l o l d a l , 0 . 5 kozep , 1 . 0 a j o b b s z e l e . ∗ ∗/ g t k f r a m e s e t l a b e l a l i g n (GTK FRAME ( frame ) , 1 . 0 , 0 . 0 ) ; 99
36
/∗ k e r e t s t i l u s a n a k b e a l l i t a s a ∗/ g t k f r a m e s e t s h a d o w t y p e (GTK FRAME ( frame ) , GTK SHADOW ETCHED OUT ) ;
37 38 39
gtk widget show ( frame ) ;
40 41
/∗ Az a b l a k k i j e l z e s e ∗/ gtk widget show ( window ) ;
42 43 44
/∗ v e g t e l e n c i k l u s b a b e l e p e s ∗/ gtk main ( ) ;
45 46 47
return 0;
48 49
}
9.6.
Ar´anytarto´ keret (Aspect Frame)
¨ Az ar´anytarto´ keret az el˝obb n´ezett kerethez hasonlo´ elem – az el˝obbin´el annyival tobb, hogy kik´enyszer´ıti a gyermek-elemeinek egy adott sz´eless´eg-magass´ag ar´any´at, ak´ar plusz hely hozz´aad´as´aval is. Felhaszn´al´asi ¨ egy n´ez˝ok´ep m´eret´enek v´altoztat´asa, amikor fontos az oldalaj eset p´eld´aul egy k´ep megjelen´ıt´ese, azon belul ar´anya. Ebben a p´eldaesetben ha a felhaszn´alo´ a´ tm´eretezi az asztalt, a n´ez˝ok´ep m´erete v´altozni fog - de az oldalar´anyai nem. ´ ar´anytarto´ keretet ´ıgy hozhatsz l´etre: Uj 1 2
3 4 5
GtkWidget ∗ g t k a s p e c t f r a m e n e w ( c o n s t gchar ∗cimke , /∗ i g a z i t o elemkent gfloat x igazitas , ∗/ gfloat y igazitas , /∗ ( alignment ) mukodnek ∗/ gfloat oldalak aranya , gboolean gyermekekhez igazodik ) ; /∗ obey c h i l d ∗/ Ha az obey_child e´ rt´ek igaz, akkor a keret oldalar´anyai a gyermekelemek ig´enyeihez igazodnak, e´ s nem a m´ar megadott oldalar´anyhoz. Egy m´ar l´etez˝o ar´anytarto´ keret be´all´ıt´asainak megv´altoztat´asa:
1 2 3 4 5
void g t k a s p e c t f r a m e s e t ( GtkAspectFrame ∗ a r a n y t a r t o k e r e t , gfloat x igazitas , gfloat y igazitas , gfloat oldalak aranya , gboolean gyermekekhez igazodik ) ; ¨ ´ uletet ¨ A kovetkez˝ o p´elda egy 2:1 ar´anyu´ rajzoloter hoz l´etre, melynek oldalar´anyai az ablak a´ tm´eretez´es´et˝ol ¨ ¨ mindig ugyanakkor´ak: fuggetlen ul
1
# i n c l u d e
2 3
i n t main ( i n t argc , 100
char ∗ argv [ ] )
4 5
{ GtkWidget ∗window ; GtkWidget ∗ a s p e c t f r a m e ; GtkWidget ∗ drawing area ; g t k i n i t (& argc , &argv ) ;
6 7 8 9 10
window = gtk window new (GTK WINDOW TOPLEVEL ) ; g t k w i n d o w s e t t i t l e (GTK WINDOW ( window ) , ” Oldalarany−t a r t o k e r e t ” ) ; g s i g n a l c o n n e c t ( G OBJECT ( window ) , ” d e s t r o y ” , G CALLBACK ( g t k m a i n q u i t ) , NULL ) ; g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( window ) , 1 0 ) ;
11 12 13 14 15 16
/∗ az alkalmazasablakhoz hozzaadjuk az a r a n y t a r t o k e r e t e t ∗/
17 18
a s p e c t f r a m e = g t k a s p e c t f r a m e n e w ( ” 2 x1 ” , 0.5 , 0.5 , 2, FALSE
19 20 21 22 23
/∗ /∗ /∗ /∗ /∗
cimke ∗/ x kozeppont ∗/ y kozeppont ∗/ xhossz/yhossz = 2 ∗/ m e l l o z i a gyerekek o l d a l a r a n y a t ∗/ ) ;
24
g t k c o n t a i n e r a d d (GTK CONTAINER ( window ) , a s p e c t f r a m e ) ; gtk widget show ( a s p e c t f r a m e ) ;
25 26 27
/∗ Hozzaadjuk az a r a n y t a r t o k e r e t h e z a gyermek−elemet ∗/
28 29
drawing area = gtk drawing area new ( ) ;
30 31
/∗ Kerunk egy 200 x200 p i x e l e s ablakokt , de az A ra n yt a rt o Keret egy 200 x100 ∗ as a b l a k o t ad v i s s z a , mert k e n y s z e r i t e t t u k a 2 x1 es o l d a l a r a n y t ∗/ g t k w i d g e t s e t s i z e r e q u e s t ( drawing area , 2 0 0 , 2 0 0 ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( a s p e c t f r a m e ) , drawing area ) ; gtk widget show ( drawing area ) ;
32 33 34 35 36 37
gtk widget show ( window ) ; gtk main ( ) ; return 0;
38 39 40 41
}
9.7.
Osztott Ablak (Paned window)
¨ ´ Az osztott ablak elemmel egy teruletet k´et r´eszre oszthatsz ugy, hogy a feloszt´as ar´any´at a felhaszn´alo´ be´all´ıthatja ¨ e rajzolt elv´alasztoelem ´ ¨ oleges (VPaa r´eszek koz´ mozgat´as´aval. A feloszt´as lehet v´ızszintes (HPaned) e´ s fugg˝ ned) is. ´ osztott ablakot ezzekkel a fuggv´ ¨ Uj enyekkel k´esz´ıthetsz: 1 2
GtkWidget ∗ gtk hpaned new ( void ) ; /∗ u j o s z t o t t a b l a k k e s z i t e s e ∗/ GtkWidget ∗ gtk vpaned new ( void ) ;
3 4 5 6
/∗∗ az o s z t o t t a b l a k mindket r e s z e b e b e l e k e l l helyezzuk a gyermekelemeket ∗∗/ void gtk paned add1 ( GtkPaned ∗ o s z t o t t a b l a k , GtkWidget ∗ egyik gyermekelem ) ; void gtk paned add2 ( GtkPaned ∗ o s z t o t t a b l a k , GtkWidget ∗ masik gyermekelem ) ; A add1 a gyermek-elemet a fels˝o vagy a baloldali r´eszhez adja, a add2 pedig az also´ vagy a jobboldai r´eszhez. ¨ ¨ et k´esz´ıtjuk ¨ el. Az ablak fels˝o r´esz´eben A kovetkez˝ o p´eld´aban egy k´epzeletbeli e-mail kezel˝o program felulet´ ¨ ´ az also´ r´eszben a kiv´alasztott uzenet ¨ ¨ e-mail uzenetek list´aja l´athato, szovege. Jo´ tudni:
¨ ¨ • szoveget a Text felulet-elemhez csak annak l´etrehoz´asa ut´an adhatunk. Ez a l´etrehoz´as vagy a gtk_widget_realize ¨ enhet, vagy egy m´asik modon ´ megh´ıv´as´aval tort´ – amit a p´eld´aban is haszn´alunk. l´etrehozunk egy ¨ ¨ fuggv´ enyt, ami a realize szign´alt figyeli, e´ s a jelz´es elkap´asakor a szoveget az elemhez adjuk.
101
´ n´eh´any felulet ¨ elemhez hozz´a kell adjuk a t´abla n´eh´any elem´ehez, ami a szoveges ¨ • a GKT_SHRINK opciot ¨ ıt˝os´avokat tartalmazza. Emiatt amikor az also´ r´esz egy kicsit kisebb lesz, a lenti r´esz ablakot e´ s a gord´ ´ ¨ egy picit nyulni fog ahelyett, hogy az ablak alj´ara ulne.
1 2
# i n c l u d e < s t d i o . h> # i n c l u d e
3 4 5 6
/∗ l e t r e h o z z u k az ” uzenetek ” l i s t a j a t ∗/ s t a t i c GtkWidget ∗ c r e a t e l i s t ( void ) {
7 8 9 10 11 12 13
GtkWidget GtkWidget GtkListStore GtkTreeIter GtkCellRenderer GtkTreeViewColumn
∗ scrolled window ; ∗ tree view ; ∗model ; iter ; ∗cell ; ∗column ;
14 15
int i ;
16 17 18 19 20 21 22
/∗ Egy u j g o r d i t h e t o a b l a k o t keszitunk , ∗ a g o r d i t o s a v csak akkor j e l e n i k meg ha szukseg van r a ∗/ scrolled window = gtk scrolled window new (NULL, NULL ) ; g t k s c r o l l e d w i n d o w s e t p o l i c y (GTK SCROLLED WINDOW ( scrolled window ) , GTK POLICY AUTOMATIC, GTK POLICY AUTOMATIC ) ;
23 24 25 26 27 28 29
model = g t k l i s t s t o r e n e w ( 1 , G TYPE STRING ) ; tree view = gtk tree view new ( ) ; g t k s c r o l l e d w i n d o w a d d w i t h v i e w p o r t (GTK SCROLLED WINDOW ( scrolled window ) , tree view ) ; g t k t r e e v i e w s e t m o d e l ( GTK TREE VIEW ( t r e e v i e w ) , GTK TREE MODEL ( model ) ) ; gtk widget show ( t r e e v i e w ) ;
30 31 32 33 34 35 36 37 38 39 40
/∗ Az u z e n e t e k e t az ablakba helyezzuk ∗/ f o r ( i = 0 ; i < 1 0 ; i ++) { gchar ∗msg = g s t r d u p p r i n t f ( ” Uzenet #%d” , i ) ; g t k l i s t s t o r e a p p e n d ( GTK LIST STORE ( model ) , &i t e r ) ; g t k l i s t s t o r e s e t ( GTK LIST STORE ( model ) , &i t e r , 0 , msg , −1); g f r e e ( msg ) ; }
41 42
cell = gtk cell renderer text new ( ) ;
43 44 45
column = g t k t r e e v i e w c o l u m n n e w w i t h a t t r i b u t e s ( ” Uzenetek ” , /∗ f e j l e c ∗/ cell , 102
” text ” , 0 , NULL ) ; gtk tree view append column ( GTK TREE VIEW ( t r e e v i e w ) , GTK TREE VIEW COLUMN ( column ) ) ; r e t u r n scrolled window ;
46 47 48 49 50 51
}
52 53 54 55 56 57 58
/∗ ∗ ∗ ∗ ∗ ∗
Az uzenet szoveg m e g j e l e n i t o r e s z e b e irunk egy p e l d a s z o v e g e t . ez az a fuggveny , ami az ablakunk l e t r e j o t t e ( r e a l i z e d ) utan hivodik meg . Ezt az esemenyt k i i s l e h e t k e n y s z e r i t e n i a g t k w i d g e t r e a l i z e ( ) fuggvennyel , de e l o s z o r ennek az objektum h i e r a r c h i a b a k e l l i l l e s z k e d n i e . ∗/
59 60 61 62
s t a t i c void i n s e r t t e x t ( G t k T e x t B u f f e r ∗ b u f f e r ) { GtkTextIter i t e r ;
63
g t k t e x t b u f f e r g e t i t e r a t o f f s e t ( b u f f e r , &i t e r , 0 ) ;
64 65
g t k t e x t b u f f e r i n s e r t ( b u f f e r , &i t e r , ”From : pathfinder@nasa . gov\n” ”To : mom@nasa . gov\n” ” S u b j e c t : Csinald meg ! \ n” ”\n” ”Az i d o j a r a s nagyszeru − hideg van ugyan , de t i s z t a a l e g k o r . \ n” ”A t e s z t e k e t elvegezzuk − koszonjuk az a d a t o k a t . \ n” ” −Path \n” , −1);
66 67 68 69 70 71 72 73 74
}
75 76 77 78 79 80 81
/∗ Egy g o r d i t h e t o szovegmezot k e s z i t u n k az ” uzenet ” k i j e l z e s e r e s t a t i c GtkWidget ∗ c r e a t e t e x t ( void ) { GtkWidget ∗ scrolled window ; GtkWidget ∗view ; GtkTextBuffer ∗ buffer ;
∗/
82
view = g t k t e x t v i e w n e w ( ) ; b u f f e r = g t k t e x t v i e w g e t b u f f e r ( GTK TEXT VIEW ( view ) ) ;
83 84 85
scrolled window = gtk scrolled window new (NULL, NULL ) ; g t k s c r o l l e d w i n d o w s e t p o l i c y (GTK SCROLLED WINDOW ( scrolled window ) , GTK POLICY AUTOMATIC, GTK POLICY AUTOMATIC ) ;
86 87 88 89 90
g t k c o n t a i n e r a d d (GTK CONTAINER ( scrolled window ) , view ) ; i n s e r t t e x t ( buffer ) ;
91 92 93
g t k w i d g e t s h o w a l l ( scrolled window ) ;
94 95
r e t u r n scrolled window ;
96 97
}
98 99 100 101 102 103 104 105
i n t main ( i n t argc , char ∗ argv [ ] ) { GtkWidget ∗window ; GtkWidget ∗vpaned ; GtkWidget ∗ l i s t ; GtkWidget ∗ t e x t ;
106 107
g t k i n i t (& argc , &argv ) ; 103
108
window = gtk window new (GTK WINDOW TOPLEVEL ) ; g t k w i n d o w s e t t i t l e (GTK WINDOW ( window ) , ” O s z t o t t ablakok − Paned Windows” ) ; g s i g n a l c o n n e c t ( G OBJECT ( window ) , ” d e s t r o y ” , G CALLBACK ( g t k m a i n q u i t ) , NULL ) ; g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( window ) , 1 0 ) ; g t k w i d g e t s e t s i z e r e q u e s t (GTK WIDGET ( window ) , 5 5 0 , 4 0 0 ) ;
109 110 111 112 113 114 115
/∗ egy f u g g o l e g e s e n o s z t o elemet k e s z i t u n k es az alkalmazas s z u l o a b l a k a b a helyezzuk ∗/
116 117
vpaned = gtk vpaned new ( ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( window ) , vpaned ) ; gtk widget show ( vpaned ) ;
118 119 120 121
/∗ Az a b l a k mindket r e s z e b e e l h e l y e z z u k a t a r t a l m a k a t ∗/
122 123
list = create list (); gtk paned add1 (GTK PANED ( vpaned ) , l i s t ) ; gtk widget show ( l i s t ) ;
124 125 126 127
text = create text ( ) ; gtk paned add2 (GTK PANED ( vpaned ) , t e x t ) ; gtk widget show ( t e x t ) ; gtk widget show ( window ) ;
128 129 130 131 132
gtk main ( ) ;
133 134
return 0;
135 136
}
9.8.
V´ar: Viewports
9.9.
Gord´ ¨ ıtheto˝ ablakok (Scrolled Windows
¨ ıthet˝o ablakkal egy m´asik felulet ¨ elem r´eszlet´et jelen´ıthetjuk ¨ meg az elemn´el kisebb teruleten ¨ ¨ ıt˝os´avokkal Gord´ – a gord´ az eg´esz be´agyazott elemet meg lehet n´ezni. ´ gord´ ¨ ıthet˝o ablakot ´ıgy hozhatsz l´etre: Uj 1 2 3
/∗ a modosito parameterek e r t e k e r e n d s z e r i n t NULL ∗/ GtkWidget ∗ gtk scrolled window new ( GtkAdjustment ∗ v i z s z i n t e s m o d o s i t o , GtkAdjustment ∗ f u g g o l e g e s m o d o s i t o ) ;
4 5 6
7 8 9
/∗ a g o r d i t h e t o a b l a k v i s e l k e d e s e n e k b e a l l i t a s a : ∗/ void g t k s c r o l l e d w i n d o w s e t p o l i c y ( GtkScrolledWindow ∗ g o r d i t h e t o a b l a k , GtkPolicyType vizszintes viselkedesi mod , GtkPolicyType fuggoleges viselkedesi mod ) ; A viselked´esi szab´alyok GTK_POLICY_AUTOMATIC vagy GTK_POLICY_ALWAYS e´ rt´eket vehetnek fel. Az ¨ ıt˝os´av ha szuks´ ¨ eg van r´a, a m´asik esetben mindig. automatikus esetben csak akkor jelenik meg a gord´ ¨ ıthet˝o ablakba ´ıgy helyezheted el a be´agyazott elemet: A gord´
1 2
void g t k s c r o l l e d w i n d o w a d d w i t h v i e w p o r t ( GtkScrolledWindow ∗ g o r d i t h e t o a b l a k , GtkWidget ∗gyermekelem ) ; ¨ Egy be´agyazott szovegmez˝ os p´elda:
104
1 2
/∗ o r i g i n a l Author : Andrew Kraus − Apress . com , GTK book ∗/ # i n c l u d e
3 4 5 6 7 8
i n t main ( i n t argc , char ∗ argv [ ] ) { GtkWidget ∗window , ∗ s c r o l l e d w i n , ∗ t e x t v i e w ; GtkTextBuffer ∗ buffer ;
9
g t k i n i t (& argc , &argv ) ;
10 11
/∗ a b l a k l e t r e h o z a s , f e j l e c b e a l l i t a s , m a r g o b e a l l i t a s , m e r e t b e a l l i t a s ∗/ window = gtk window new (GTK WINDOW TOPLEVEL ) ; g t k w i n d o w s e t t i t l e (GTK WINDOW ( window ) , ” G o r d i t h e t o szovegmezo” ) ; g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( window ) , 1 0 ) ; g t k w i d g e t s e t s i z e r e q u e s t ( window , 3 5 0 , 1 5 0 ) ;
12 13 14 15 16 17
/∗ d e s t r o y s i g n a l r a g t k m a i n q u i t fuggveny fusson l e − s a j a t fuggvenyt ∗ i s i r h a t s z a k i l e p e s h e z . ∗/ g s i g n a l c o n n e c t ( G OBJECT ( window ) , ” d e s t r o y ” , G CALLBACK ( g t k m a i n q u i t ) , NULL ) ;
18 19 20 21 22 23
textview = gtk text view new ( ) ; b u f f e r = g t k t e x t v i e w g e t b u f f e r ( GTK TEXT VIEW ( t e x t v i e w ) ) ;
24 25 26
/∗ programbol szoveg i r a s a f e l u l e t −elembe ∗/ g t k t e x t b u f f e r s e t t e x t ( b u f f e r , ” T e l e t e t t e m eme elemet ! : −) Unicode i s megy ! ” , −1);
27 28 29
s c r o l l e d w i n = gtk scrolled window new (NULL, NULL ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( s c r o l l e d w i n ) , t e x t v i e w ) ; g t k s c r o l l e d w i n d o w s e t p o l i c y (GTK SCROLLED WINDOW ( s c r o l l e d w i n ) , GTK POLICY AUTOMATIC, GTK POLICY ALWAYS ) ;
30 31 32 33 34
g t k c o n t a i n e r a d d (GTK CONTAINER ( window ) , s c r o l l e d w i n ) ; g t k w i d g e t s h o w a l l ( window ) ;
35 36 37
gtk main ( ) ; return 0;
38 39 40
} ´ v´egul ¨ egy egyszeru˝ p´elda, be´agyazott e´ s gord´ ¨ ıtett gombokkal: Es
105
1 2 3
# i n c l u d e < s t d i o . h> # i n c l u d e
4 5 6 7 8 9 10
/∗ k i l e p e s k o r ez a fuggveny f u t l e ∗/ s t a t i c void d e s t r o y ( GtkWidget ∗ widget , gpointer data ) { gtk main quit ( ) ; }
11 12 13 14 15 16 17 18 19 20
i n t main ( i n t argc , char ∗ argv [ ] ) { s t a t i c GtkWidget ∗window ; GtkWidget ∗ scrolled window ; GtkWidget ∗ t a b l e ; GtkWidget ∗ button ; char b u f f e r [ 3 2 ] ; int i , j ;
21 22
g t k i n i t (& argc , &argv ) ;
23 24 25 26 27 28 29 30
/∗ program f o a b l a k o t l e t r e h o z z u k ∗/ window = g t k d i a l o g n e w ( ) ; g s i g n a l c o n n e c t ( G OBJECT ( window ) , ” d e s t r o y ” , G CALLBACK ( d e s t r o y ) , NULL ) ; g t k w i n d o w s e t t i t l e (GTK WINDOW ( window ) , ” GtkScrolledWindow pelda ” ) ; g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( window ) , 0 ) ; g t k w i d g e t s e t s i z e r e q u e s t ( window , 6 0 0 , 3 0 0 ) ;
31 32 33
/∗ u j g o r d i t h e t o a b l a k o t k e s z i t u n k . ∗/ scrolled window = gtk scrolled window new (NULL, NULL ) ;
34 35 36
/∗ margo b e a l l i t a s ∗/ g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( scrolled window ) , 1 0 ) ;
37 38 39 40 41 42 43 44
/∗ ∗ ∗ ∗ ∗ ∗ ∗
A szabalyok egyike a GTK POLICY AUTOMATIC, a masik f e l v e h e t o e r t e k a GTK POLICY ALWAYS . A GTK POLICY AUTOMATIC onmukodoen f e l i s m e r i ha g o r d i t o s a v r a van szukseg , a GTK POLICY ALWAYS mindig k i r a k j a a g o r d i t o s a v o k a t . A vizszintes gorditosavot automatikusan r a k j u k ki , a f u g g o l e g e s t mindig . ∗/ 106
g t k s c r o l l e d w i n d o w s e t p o l i c y (GTK SCROLLED WINDOW ( scrolled window ) , GTK POLICY AUTOMATIC, GTK POLICY ALWAYS ) ;
45 46 47
/∗ A parbeszed−a b l a k egy f u g g o l e g e s dobozzal j o n l e t r e . ∗/ g t k b o x p a c k s t a r t (GTK BOX (GTK DIALOG( window)−>vbox ) , scrolled window , TRUE, TRUE, 0 ) ; gtk widget show ( scrolled window ) ;
48 49 50 51 52
/∗ egy u j 10 x10−es t a b l a t k e s z i t u n k . ∗/ t a b l e = g t k t a b l e n e w ( 1 0 , 1 0 , FALSE ) ;
53 54 55
/∗ a v i z s z i n t e s es f u g g o l e g e s t e r k o z t i s 10−10 p i x e l r e a l l i t j u k ∗/ g t k t a b l e s e t r o w s p a c i n g s ( GTK TABLE ( t a b l e ) , 1 0 ) ; g t k t a b l e s e t c o l s p a c i n g s ( GTK TABLE ( t a b l e ) , 1 0 ) ;
56 57 58 59
/∗ t a b l a z a t o t a g o r d i t e t t ablakba helyezzuk ∗/ gtk scrolled window add with viewport ( GTK SCROLLED WINDOW ( scrolled window ) , t a b l e ) ; gtk widget show ( t a b l e ) ;
60 61 62 63 64
/∗ e l h e l y e z z u k a 10 x10−es gombsorozatot a t a b l a b a n . ∗/ f o r ( i = 0 ; i < 1 0 ; i ++) f o r ( j = 0 ; j < 1 0 ; j ++) { s p r i n t f ( b u f f e r , ”gomb : (%d,%d ) \ n” , i , j ) ; button = g t k t o g g l e b u t t o n n e w w i t h l a b e l ( b u f f e r ) ; g t k t a b l e a t t a c h d e f a u l t s ( GTK TABLE ( t a b l e ) , button , i , i +1 , j , j + 1 ) ; gtk widget show ( button ) ; }
65 66 67 68 69 70 71 72 73 74
/∗ A l u l r a egy k i l e p e s gombot teszunk , e z t most l e t r e h o z z u k ∗/ button = g t k b u t t o n n e w w i t h l a b e l ( ” K i l e p e s ” ) ; g s i g n a l c o n n e c t s w a p p e d ( G OBJECT ( button ) , ” c l i c k e d ” , G CALLBACK ( g t k w i d g e t d e s t r o y ) , G OBJECT ( window ) ) ;
75 76 77 78 79 80
/∗ a gombot a s z u l o elembe helyezzuk ∗/ g t k b o x p a c k s t a r t (GTK BOX (GTK DIALOG ( window)−> a c t i o n a r e a ) , button , TRUE, TRUE, 0 )
81 82 83
/∗ az e r e d e t i peldaban a K i l e p e s gombot a l a p e r t e l m e z e s b e n fokuszba h e l y e z i k − ∗ ez v a l a m i e r t a k e t t e s GTK−v a l nem mukodik , a r e g e b b i v e l igen . ∗/ gtk widget show ( button ) ; gtk widget show ( window ) ;
84 85 86 87 88
gtk main ( ) ; return 0;
89 90 91
} ¨ ıt˝os´avok viselked´es´et megfigyelni. Szuks´ ¨ eged A p´eld´aban e´ rdemes az ablakm´eretet v´altoztatni e´ s a gord´ ¨ ¨ lehet a gtk_widget_set_size_request() fuggv´ enyre, amely egy felulet elem alap´ertelmezett m´eret´et a´ ll´ıtja vissza (a program f˝oablak´ae´ t is!).
9.10.
Gombt´arolo´ dobozok (button boxes)
˝ csoportos´ıthatsz e´ s igaz´ıthatsz gombokat. Van v´ızszintes e´ s fugg˝ ¨ oleges verzioja ´ A gomb dobozokkal egyszeruen ´ gomb dobozt ´ıgy hozhatsz l´etre: is. Uj 1 2
GtkWidget ∗ gtk hbutton box new ( void ) ; GtkWidget ∗ gtk vbutton box new ( void ) ;
3 4 5
/∗ a gomb bepakolasa a mar l e t r e h o z o t t dobozba : ∗/ g t k c o n t a i n e r a d d (GTK CONTAINER ( gombtarolo doboz ) , c h i l d w i d g e t ) ;
107
¨ egy p´eldaprogram, ami bemutatja a be´all´ıt´asi lehet˝os´egeket: V´egul
1 2
# i n c l u d e
3 4 5 6 7 8 9 10 11 12 13 14
/∗ Uj gombtarolo dobozt hozunk l e t r e , a d o t t parameterekkel ∗/ s t a t i c GtkWidget ∗ c r e a t e b b o x ( g i n t h o r i z o n t a l , char ∗ t i t l e , g i n t spacing , g i n t child w , gint child h , gint layout ) { GtkWidget ∗ frame ; GtkWidget ∗bbox ; /∗ ez t a r o l j a a gombokat ∗/ GtkWidget ∗ button ; /∗ egy a d o t t gomb t a r o l o j a ∗/
15 16
/∗ a b l a k cime ∗/
frame = gtk frame new ( t i t l e ) ;
17 18 19 20 21
if ( horizontal ) bbox = gtk hbutton box new ( ) ; else bbox = gtk vbutton box new ( ) ;
22 23 24
g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( bbox ) , 5 ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( frame ) , bbox ) ;
25 26 27 28 29
/∗ A Button Box m e g j e l e n e s e t s z a b a l y o z z a ∗/ g t k b u t t o n b o x s e t l a y o u t (GTK BUTTON BOX ( bbox ) , l a y o u t ) ; g t k b o x s e t s p a c i n g (GTK BOX ( bbox ) , s p a c i n g ) ; /∗ g t k b u t t o n b o x s e t c h i l d s i z e (GTK BUTTON BOX ( bbox ) , child w , c h i l d h ) ; ∗/
30 31 32 33 34 35 36 37 38 39
/∗∗a f r o m s t o c k : e l o r e e l k e s z i t e t t gombok kozul v a l a s z t . ∗ erdemes e z t az o l d a l t alaposan megnezni , ha l e t e r e k s z ∗ a gombtipusokat keppel e g y u t t megtalalod : ∗ h t t p ://www. gtk . org/a p i /2.6/ gtk/gtk−Stock−Items . html ∗∗∗/ button = g t k b u t t o n n e w f r o m s t o c k (GTK STOCK OK ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( bbox ) , button ) ;
40 41 42
button = g t k b u t t o n n e w f r o m s t o c k (GTK STOCK CANCEL ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( bbox ) , button ) ;
43 44
button = g t k b u t t o n n e w f r o m s t o c k ( GTK STOCK HELP ) ; 108
g t k c o n t a i n e r a d d (GTK CONTAINER ( bbox ) , button ) ;
45 46
r e t u r n frame ;
47 48
}
49 50 51 52 53 54 55 56 57 58 59 60
i n t main ( i n t argc , char ∗ argv [ ] ) { s t a t i c GtkWidget∗ window = NULL; GtkWidget ∗ main vbox ; GtkWidget ∗vbox ; GtkWidget ∗hbox ; GtkWidget ∗ frame horz ; GtkWidget ∗ f r a m e v e r t ;
61 62 63
/∗ GTK i n i c i a l i z a l a s a ∗/ g t k i n i t (& argc , &argv ) ;
64 65 66
window = gtk window new (GTK WINDOW TOPLEVEL ) ; g t k w i n d o w s e t t i t l e (GTK WINDOW ( window ) , ”Gomb dobozok” ) ;
67 68 69 70
g s i g n a l c o n n e c t ( G OBJECT ( window ) , ” d e s t r o y ” , G CALLBACK ( g t k m a i n q u i t ) , NULL ) ;
71 72
g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( window ) , 1 0 ) ;
73 74 75
main vbox = gtk vbox new ( FALSE , 0 ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( window ) , main vbox ) ;
76 77 78
frame horz = gtk frame new ( ” V i z s z i n t e s gomb dobozok” ) ; g t k b o x p a c k s t a r t (GTK BOX ( main vbox ) , frame horz , TRUE, TRUE, 1 0 ) ;
79 80 81 82
vbox = gtk vbox new ( FALSE , 0 ) ; g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( vbox ) , 1 0 ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( frame horz ) , vbox ) ;
83 84 85 86 87 88
g t k b o x p a c k s t a r t (GTK BOX ( vbox ) , c r e a t e b b o x (TRUE, ” Spread − e g y e n l e t e s e n s z e t t e r i t e t t . Spacing : elem k o r u l i t e r 4 0 ) ” , 4 0 , 8 5 , 2 0 , GTK BUTTONBOX SPREAD ) , TRUE, TRUE, 0 ) ;
89 90 91 92 93 94
g t k b o x p a c k s t a r t (GTK BOX ( vbox ) , c r e a t e b b o x (TRUE, ”Edge − doboz e l e i g s z e t h u z o t t ( s p a c i n g 3 0 ) ” , 3 0 , 8 5 , 2 0 , GTK BUTTONBOX EDGE) , TRUE, TRUE, 5 ) ;
95 96 97 98 99
g t k b o x p a c k s t a r t (GTK BOX ( vbox ) , c r e a t e b b o x (TRUE, ” S t a r t − E l e j e ( s p a c i n g 2 0 ) ” , 2 0 , 8 5 , 2 0 , GTK BUTTONBOX START ) , TRUE, TRUE, 5 ) ;
100 101 102 103
g t k b o x p a c k s t a r t (GTK BOX ( vbox ) , c r e a t e b b o x (TRUE, ”End − vege ( t e r k o z 1 0 ) ” , 1 0 , 8 5 , 2 0 , GTK BUTTONBOX END) , TRUE, TRUE, 5 ) ;
104 105 106
f r a m e v e r t = gtk frame new ( ” Fuggoleges gomb dobozok” ) ; g t k b o x p a c k s t a r t (GTK BOX ( main vbox ) , f r a m e v e r t , TRUE, TRUE, 1 0 ) ; 109
107
hbox = gtk hbox new ( FALSE , 0 ) ; g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( hbox ) , 1 0 ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( f r a m e v e r t ) , hbox ) ;
108 109 110 111
g t k b o x p a c k s t a r t (GTK BOX ( hbox ) , c r e a t e b b o x ( FALSE , ” Spread − s z e t t e r i t e t t ( s p a c i n g 5 ) ” , 5 , 8 5 , 2 0 , GTK BUTTONBOX SPREAD ) , TRUE, TRUE, 0 ) ;
112 113 114 115 116
g t k b o x p a c k s t a r t (GTK BOX ( hbox ) , c r e a t e b b o x ( FALSE , ”Edge − e l i g ( s p a c i n g 3 0 ) ” , 3 0 , 8 5 , 2 0 , GTK BUTTONBOX EDGE) TRUE, TRUE, 5 ) ;
117 118 119 120
g t k b o x p a c k s t a r t (GTK BOX ( hbox ) , c r e a t e b b o x ( FALSE , ” S t a r t ( s p a c i n g 2 0 ) ” , 2 0 , 8 5 , 2 0 , GTK BUTTONBOX START ) , TRUE, TRUE, 5 ) ;
121 122 123 124
g t k b o x p a c k s t a r t (GTK BOX ( hbox ) , c r e a t e b b o x ( FALSE , ”End ( s p a c i n g 2 0 ) ” , 2 0 , 8 5 , 2 0 , GTK BUTTONBOX END) , TRUE, TRUE, 5 ) ;
125 126 127 128
g t k w i d g e t s h o w a l l ( window ) ;
129 130
/∗ b e l e p e s v e g t e l e n c i k l u s b a ∗/ gtk main ( ) ;
131 132 133
return 0;
134 135
}
9.11.
Eszkozt´ ¨ ar (Toolbar)
¨ arakat felulet-elemek ¨ ¨ e´ s kin´ezetuk ¨ szab´alyoz´as´ara haszn´alunk. Eszkozt´ rendezett csoportos´ıt´as´ara, elrendez´esuk ¨ ar ikonokat tartalmazo´ gombokat, szovegc´ ¨ ´ o´ elemeket tartalmaz, Egy tipikus eszkozt´ ımk´eket, felbukkano´ sug ¨ benne. Az elemek elrendez´ese lehet v´ızszintes vagy fugg˝ ¨ oleges. A gombok de m´as elemeket is elhelyezhetunk ¨ ¨ on-k ¨ ¨ on ¨ vagy ak´ar egyutt ¨ is. ikonk´epet e´ s szoveget is tartalmazhatnak, kul ul ´ eszkozt´ ¨ arat ´ıgy k´esz´ıthetsz: Uj 1
GtkWidget ∗ g t k t o o l b a r n e w ( void ) ; ¨ ar elej´ere vagy v´eg´ere uj ´ elemet vehetsz fel – szoveget ¨ ¨ A m´ar l´etez˝o eszkozt´ vagy m´as tetsz˝oleges felulet¨ eges a megjelen´ıtett szovegc´ ¨ ´ o´ elem, az egy´eni sug ´ o´ elem elemet. Egy elem meghat´aroz´as´ahoz szuks´ ımke, a sug ¨ (private tooltip), egy ikon a gombnak e´ s egy fuggv´ eny, ami a gomb lenyom´asakor lefut.
1 2 3 4 5 6 7 8
/∗ u j elem hozzaadasa e s z k o z t a r vegehez : ∗/ GtkWidget ∗ g t k t o o l b a r a p p e n d i t e m ( GtkToolbar c o n s t char c o n s t char c o n s t char GtkWidget GtkSignalFunc gpointer
∗ eszkoztar , ∗ megjelenitett szovegcimke , ∗ sugo szoveg , ∗ egyeni sugo szoveg , ∗ ikon , futtatando fuggveny , felhasznaloi adat ) ;
/∗ u j elem b e s z u r a s a e s z k o z t a r e l e j e r e : ∗/ GtkWidget ∗ g t k t o o l b a r p r e p e n d i t e m ( GtkToolbar c o n s t char c o n s t char c o n s t char GtkWidget GtkSignalFunc gpointer
∗ eszkoztar , ∗ megjelenitett szovegcimke , ∗ sugo szoveg , ∗ egyeni sugo szoveg , ∗ ikon , futtatando fuggveny , felhasznaloi adat ) ;
9 10 11 12 13 14 15 16 17 18 19
/∗ a d o t t p o z i c i o b a b e s z u r a s : ∗/ 110
20 21 22 23 24 25 26 27
GtkWidget ∗ g t k t o o l b a r i n s e r t i t e m ( GtkToolbar c o n s t char c o n s t char c o n s t char GtkWidget GtkSignalFunc gpointer gint
9.12.
∗ eszkoztar , ∗ megjelenitett szovegcimke , ∗ sugo szoveg , ∗ egyeni sugo szoveg , ∗ ikon , futtatando fuggveny , felhasznaloi adat , pozicio ) ;
Lapozo´ fulek ¨ (Notebooks)
¨ elem egym´ast a´ tfed˝o lapok csoportja, ahol mindig egy lap l´atszik – a lapokon egyedi tartalmat helyezA ful ´ blokkok rendezett megjelen´ıt´es´ere haszn´alhatod. hetsz el. Hasonlo´ inform´acios ´ notesz l´etrehoz´asa: Uj 1
GtkWidget ∗ gtk notebook new ( void ) ; ´ ul ¨ jellemz˝oit l´etrehoz´asa ut´an tobb ¨ fuggv´ ¨ A lapozof ennyel is meghat´arozhatod. Az adott lap sorsz´am´anak elhelyez´es´et fel, le, balra vagy jobbra ´ıgy a´ ll´ıthatod be:
1 2
∗ lapozoful , void g t k n o t e b o o k s e t t a b p o s ( GtkNotebook GtkPositionType e l h e l y e z e s ) ;
3 4 5 6 7 8 9
/∗ az e l h e l y e z e s l e h e t s e g e s e r t e k e i : GTK POS LEFT GTK POS RIGHT GTK POS TOP ( alapertelmezett ) GTK POS BOTTOM ∗/ ´ ulre ¨ ´ lapot h´aromf´elek´epp vehetsz fel. Az els˝o kett˝o: A lapozof uj
1 2 3
void gtk notebook append page ( GtkNotebook ∗ l a p o z o f u l , GtkWidget ∗gyermekelem , GtkWidget ∗ fulszoveg ) ;
4 5 6 7
void gtk notebook prepend page ( GtkNotebook ∗ l a p o z o f u l , GtkWidget ∗gyermekelem , GtkWidget ∗ fulszoveg ) ; ¨ ´ fuleket ¨ ´ ul ¨ v´eg´ere (append) vagy elej´ere (prepend). A gyermekelem Ezek a fuggv´ enyek uj adnak a lapozof ¨ ´ ul ¨ test´ere helyezt´el el – a fulszoveg pedig a lapozof ´ ul ¨ mindig kil´atszod ´ o´ az egy felulet-elem amit a lapozof ¨ ¨ on ¨ kell l´etrehozni - ez lehet egy t´abl´azat is, amin belul ¨ tov´abbi elemek szovege. A gyermekelem-et kul ´ tal´alhatok. ´ lap felv´etel´ere az adott poz´ıcioba ´ illeszt´es: A harmadik lehet˝os´eg uj
1 2 3 4
void gtk notebook prepend page ( GtkNotebook ∗ l a p o z o f u l , GtkWidget ∗gyermekelem , GtkWidget ∗ fulszoveg , gint pozicio ) ; ¨ a nulladik poz´ıcioban ´ ´ ¨ hova kerulj ¨ on. ¨ A kezd˝o ful van – ehhez k´epest adhatod meg, hogy a beszurand o´ ful ¨ elt´avol´ıt´as´ara ezt a fuggv´ ¨ L´etez˝o fulet enyt haszn´alhatod:
1 2
void gtk notebook remove page ( GtkNotebook ∗ l a p o z o f u l , gint lap szama ) ; ´ ul ¨ aktu´alis lapj´anak lek´erdez´ese: A lapozof
1
g i n t g t k n o t e b o o k g e t c u r r e n t p a g e ( GtkNotebook ∗ l a p o z o f u l ) ; ¨ ¨ A kovetkez˝ o k´et fuggv´ ennyel egy lappal el˝or´ebb vagy h´atr´ebb ugorhatsz.
1 2
void g t k n o t e b o o k n e x t p a g e ( GtkNoteBook ∗ l a p o z o f u l ) ; void g t k n o t e b o o k p r e v p a g e ( GtkNoteBook ∗ l a p o z o f u l ) ; ¨ programbol ´ is kijelolheted: ¨ Az e´ ppen akt´ıv fulet
1 2
void g t k n o t e b o o k s e t c u r r e n t p a g e ( GtkNotebook ∗ l a p o z o f u l , gint lap szama ) ; 111
¨ ¨ ¨ A kovetkez˝ o k´et fuggv´ ennyel az egyes lapok fuleinek e´ s keret´enek megjelen´ıt´es´et kapcsolhatod ki-be: 1 2
void g t k n o t e b o o k s e t s h o w t a b s ( GtkNotebook ∗ l a p o z o f u l , gboolean ful megjelenitheto ) ;
3 4 5
void g t k n o t e b o o k s e t s h o w b o r d e r ( GtkNotebook ∗ l a p o z o f u l , gboolean keret megjelenitheto ) ; ¨ eset´en a fuleket ¨ ´ıgy teheted gorgethet˝ ¨ Nagyon nagy sz´amu´ ful ov´e:
1 2
void g t k n o t e b o o k s e t s c r o l l a b l e ( GtkNotebook ∗ l a p o z o f u l , gboolean ful gorgetheto ) ; ¨ ´ TRUE vagy FALSE e´ rt´eket vehetnek fel. Az el˝obbi fuggv´ enyek gboolean v´altozoi ¨ Az eml´ıtett fuggv´ enyek bemutat´asa p´eldaprogramban:
1 2 3
# i n c l u d e < s t d i o . h> # i n c l u d e
4 5 6 7 8 9 10 11
/∗ f e l , j o b b r a , l e , es b a l r a mozgatja a k i i n d u l a s k e n t ∗ fent talalhato fuleket . ∗/ s t a t i c void r o t a t e b o o k ( GtkButton ∗ button , GtkNotebook ∗ notebook ) { g t k n o t e b o o k s e t t a b p o s ( notebook , ( notebook−>t a b p o s + 1 ) % 4 ) ; }
12 13 14 15 16 17 18 19 20 21 22
/∗ M e g j e l e n i t i / e l t a v o l i t j a a f u l e k e t es a k e r e t e k e t s t a t i c void t a b s b o r d e r b o o k ( GtkButton ∗ button , GtkNotebook ∗ notebook ) { g i n t t v a l = FALSE ; g i n t bval = FALSE ; i f ( notebook−>show tabs == 0 ) t v a l = TRUE ; i f ( notebook−>show border == 0 ) bval = TRUE ;
∗/
23
g t k n o t e b o o k s e t s h o w t a b s ( notebook , t v a l ) ; g t k n o t e b o o k s e t s h o w b o r d e r ( notebook , bval ) ;
24 25 26
}
27 28 29 30 31 32
/∗ egy l a p o z o f u l e l t a v o l i t a s a s t a t i c void remove book ( GtkButton ∗ button , GtkNotebook ∗ notebook ) { g i n t page ;
∗/
33
page = g t k n o t e b o o k g e t c u r r e n t p a g e ( notebook ) ; gtk notebook remove page ( notebook , page ) ; /∗ Az elem f r i s s i t e s e r e van szukseg −− e z z e l k i k e n y s z e r i t j u k az elem u j r a r a j z o l a s a t gtk widget queue draw (GTK WIDGET ( notebook ) ) ;
34 35 36 37 38 39
}
40 41 42
s t a t i c gboolean d e l e t e ( GtkWidget ∗ widget , GtkWidget ∗ event , 112
∗/
gpointer
43 44
gtk main quit ( ) ; r e t u r n FALSE ;
45 46 47
data )
{
}
48 49 50 51 52 53 54 55 56 57 58 59 60 61
i n t main ( i n t argc , char ∗ argv [ ] ) { GtkWidget ∗window ; GtkWidget ∗ button ; GtkWidget ∗ t a b l e ; GtkWidget ∗ notebook ; GtkWidget ∗ frame ; GtkWidget ∗ l a b e l ; GtkWidget ∗ checkbutton ; int i ; char b u f f e r f [ 3 2 ] ; char b u f f e r l [ 3 2 ] ;
62 63
g t k i n i t (& argc , &argv ) ;
64 65
window = gtk window new (GTK WINDOW TOPLEVEL ) ;
66 67 68
g s i g n a l c o n n e c t ( G OBJECT ( window ) , ” d e l e t e e v e n t ” , G CALLBACK ( d e l e t e ) , NULL ) ;
69 70
g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( window ) , 1 0 ) ;
71 72 73
t a b l e = g t k t a b l e n e w ( 3 , 6 , FALSE ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( window ) , t a b l e ) ;
74 75 76 77 78 79 80
/∗ Uj l a p o z o f u l e t keszitunk , a f u l e k e l h e l y e z e s e t b e a l l i t j u k ∗ ( f e l , l e , b a l r a −j o b b r a l e h e t ) ∗/ notebook = gtk notebook new ( ) ; g t k n o t e b o o k s e t t a b p o s (GTK NOTEBOOK ( notebook ) , GTK POS TOP ) ; g t k t a b l e a t t a c h d e f a u l t s ( GTK TABLE ( t a b l e ) , notebook , 0 , 6 , 0 , 1 ) ; gtk widget show ( notebook ) ;
81 82 83 84 85
/∗ most egy nagy adag l a p o t szurunk be a l a p o z o f u l b e : ∗/ f o r ( i = 0 ; i < 5 ; i ++) { s p r i n t f ( b u f f e r f , ” Uj k e r e t hozzafuzes : %d” , i + 1 ) ; s p r i n t f ( b u f f e r l , ” %d . l a p ” , i + 1 ) ;
86
frame = gtk frame new ( b u f f e r f ) ; g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( frame ) , 1 0 ) ; g t k w i d g e t s e t s i z e r e q u e s t ( frame , 1 0 0 , 7 5 ) ; gtk widget show ( frame ) ;
87 88 89 90 91
/∗ f e l i r a t b e h e l y e z e s e ∗/ label = gtk label new ( bufferf ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( frame ) , l a b e l ) ; gtk widget show ( l a b e l ) ;
92 93 94 95 96
label = gtk label new ( b u f f e r l ) ; gtk notebook append page (GTK NOTEBOOK ( notebook ) , frame , l a b e l ) ;
97 98 99
}
100 101 102 103 104
/∗ l a p b e i l l e s z t e s e a d o t t p o z i c i o b a ∗/ checkbutton = g t k c h e c k b u t t o n n e w w i t h l a b e l ( ” J e l o l j k i k e r l e k ! ” ) ; g t k w i d g e t s e t s i z e r e q u e s t ( checkbutton , 1 0 0 , 7 5 ) ; gtk widget show ( checkbutton ) ; 113
105 106 107
l a b e l = g t k l a b e l n e w ( ”Lap hozzaadasa ” ) ; g t k n o t e b o o k i n s e r t p a g e (GTK NOTEBOOK ( notebook ) , checkbutton , l a b e l , 2 ) ;
108 109 110 111 112
/∗ a lapok for ( i = 0; sprintf sprintf
e l e j e r e szurunk be ujabb l a p o k a t ( e l o r e i l l e s z t j u k be oket ) ∗/ i < 5 ; i ++) { ( b u f f e r f , ” E l o r e i l l e s z t e s − k e r e t : %d” , i + 1 ) ; ( b u f f e r l , ” E l o r e i l l e s z t e s − l a p : %d” , i + 1 ) ;
113
frame = gtk frame new ( b u f f e r f ) ; g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( frame ) , 1 0 ) ; g t k w i d g e t s e t s i z e r e q u e s t ( frame , 1 0 0 , 7 5 ) ; gtk widget show ( frame ) ;
114 115 116 117 118
label = gtk label new ( bufferf ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( frame ) , l a b e l ) ; gtk widget show ( l a b e l ) ;
119 120 121 122
label = gtk label new ( b u f f e r l ) ; gtk notebook prepend page (GTK NOTEBOOK ( notebook ) , frame , l a b e l ) ;
123 124 125
}
126 127 128
/∗ a 4−es f u l j e l e n j e n meg a l a p e r t e l m e z e s k e n t ∗/ g t k n o t e b o o k s e t c u r r e n t p a g e (GTK NOTEBOOK ( notebook ) , 3 ) ;
129 130 131 132 133 134 135
/∗ A gombok e l k e s z i t e s e : ∗/ button = g t k b u t t o n n e w w i t h l a b e l ( ” Bezaras ” ) ; g s i g n a l c o n n e c t s w a p p e d ( G OBJECT ( button ) , ” c l i c k e d ” , G CALLBACK ( d e l e t e ) , NULL ) ; g t k t a b l e a t t a c h d e f a u l t s ( GTK TABLE ( t a b l e ) , button , 0 , 1 , 1 , 2 ) ; gtk widget show ( button ) ;
136 137 138 139 140 141 142
button = g t k b u t t o n n e w w i t h l a b e l ( ” Kovetkezo f u l ” ) ; g s i g n a l c o n n e c t s w a p p e d ( G OBJECT ( button ) , ” c l i c k e d ” , G CALLBACK ( g t k n o t e b o o k n e x t p a g e ) , G OBJECT ( notebook ) ) ; g t k t a b l e a t t a c h d e f a u l t s ( GTK TABLE ( t a b l e ) , button , 1 , 2 , 1 , 2 ) ; gtk widget show ( button ) ;
143 144 145 146 147 148 149
button = g t k b u t t o n n e w w i t h l a b e l ( ” e l o z o f u l ” ) ; g s i g n a l c o n n e c t s w a p p e d ( G OBJECT ( button ) , ” c l i c k e d ” , G CALLBACK ( g t k n o t e b o o k p r e v p a g e ) , G OBJECT ( notebook ) ) ; g t k t a b l e a t t a c h d e f a u l t s ( GTK TABLE ( t a b l e ) , button , 2 , 3 , 1 , 2 ) ; gtk widget show ( button ) ;
150 151 152 153 154 155 156
button = g t k b u t t o n n e w w i t h l a b e l ( ” f u l e k e l h e l y e z e s e n e k modositasa ” ) ; g s i g n a l c o n n e c t ( G OBJECT ( button ) , ” c l i c k e d ” , G CALLBACK ( r o t a t e b o o k ) , ( g p o i n t e r ) notebook ) ; g t k t a b l e a t t a c h d e f a u l t s ( GTK TABLE ( t a b l e ) , button , 3 , 4 , 1 , 2 ) ; gtk widget show ( button ) ;
157 158 159 160 161 162 163
button = g t k b u t t o n n e w w i t h l a b e l ( ” f u l e k / k e r e t e k k i /be ” ) ; g s i g n a l c o n n e c t ( G OBJECT ( button ) , ” c l i c k e d ” , G CALLBACK ( t a b s b o r d e r b o o k ) , ( g p o i n t e r ) notebook ) ; g t k t a b l e a t t a c h d e f a u l t s ( GTK TABLE ( t a b l e ) , button , 4 , 5 , 1 , 2 ) ; gtk widget show ( button ) ;
164 165 166
button = g t k b u t t o n n e w w i t h l a b e l ( ” l a p t o r l e s e ” ) ; g s i g n a l c o n n e c t ( G OBJECT ( button ) , ” c l i c k e d ” , 114
G CALLBACK ( remove book ) , ( g p o i n t e r ) notebook ) ; g t k t a b l e a t t a c h d e f a u l t s ( GTK TABLE ( t a b l e ) , button , 5 , 6 , 1 , 2 ) ; gtk widget show ( button ) ;
167 168 169 170 171
gtk widget show ( t a b l e ) ; gtk widget show ( window ) ;
172 173 174
gtk main ( ) ;
175 176
return 0;
177 178
}
10.
Menu¨ elemek (Menu widgets)
¨ esz´ıt´esnek van egy konny ¨ ´ ¨ esetben az elemel˝oa´ ll´ıtot ´ haszn´alo´ konnyebb ¨ A menuk´ u˝ e´ s egy neh´ez utja. A legtobb ´ jol ´ haszn´alhato´ e´ s megfelel˝o. A nehezebb ut ´ a menu¨ el˝oa´ ll´ıt´asa kozvetlen ¨ ¨ ut fuggv´ enyh´ıv´asokkal. ¨ Az elemel˝oa´ ll´ıto´ gtk_item_factory fuggv´ eny egyszeru˝ – haszn´alat´anak egyar´ant vannak el˝onyei e´ s ¨ h´atr´anyai. A menu¨ fel´ep´ıt´ese sor´an nem lehet a menuben k´epet elhelyezni e´ s / karaktert haszn´alni.
10.1.
A menu¨ k´ezi fel´ep´ıt´ese (Manual menu creation)
´ ahoz huen ˝ kovetkezzen ¨ ¨ a nehezebb ut. ´ A tan´ıt´as o˝ si trad´ıcioj´ el˝oszor ¨ av e´ s almenuk ¨ k´esz´ıt´es´ehez h´arom elemet haszn´alunk: Menus´ • menu¨ elemet, amit a felhaszn´alo´ kiv´alaszt (pl. ment´es) ´ ami a kiv´alaszthato´ menuket ¨ • menu¨ t´arolot, tartalmazza ¨ avot, ami az egym´as melletti menuket ¨ • menus´ t´arolja. ´ menus´ ¨ avot ´ıgy k´esz´ıthetsz: Uj 1
GtkWidget ∗ gtk menu bar new ( void ) ; ¨ a gtk_container_add() fuggv´ ¨ Az elk´esz´ıtett menut ennyel helyezheted el egy ablakban, vagy a box_pack ¨ ´ fuggv´ enyekkel egy dobozba – egy gombhoz hasonloan. ¨ arolot ´ a GtkWidget *gtk_menu_new( void ) A menu¨ elemek sz´am´ara egy – egy´ebk´ent l´athatatlan – menu-t´ ´ h´ıv´as´aval k´esz´ıthetsz, a visszaadott e´ rt´ek egy mutato. ¨ ¨ ¨ (´es egyuttal ´ ¨ A kovetkez˝ o fuggv´ enyekkel menu¨ elemeket hozunk l´etre, melyeket egy menube egy menu´ is) helyezunk. ¨ t´aroloba
1 2 3
GtkWidget ∗ gtk menu item new ( void ) ; GtkWidget ∗ g t k m e n u i t e m n e w w i t h l a b e l ( c o n s t char ∗ f e l i r a t ) ; GtkWidget ∗ gtk menu item new with mnemnonic ( c o n s t char ∗ f e l i r a t
);
¨ ¨ ¨ arolo´ p´eld´aul a Firefoxban a Mindh´arom fuggv´ ennyel megjelen´ıtend˝o menu-elemet hozunk l´etre. Menu-t´ ¨ F´ajl, Szerkeszt´es, N´ezet... sor, az egyes menu-elemek pedig a F´ajl, vagy a Szerkeszt´es. ¨ A menu¨ elem az egy gomb, aminek lenyom´asakor egy hozz´arendelt fuggv´ eny fut le. ¨ A gtk_menu_item_new_with_label() egy feliratos menu-elemet hoz l´etre, a gtk_menu_item_new() ¨ ¨ ¨ aroloba, ´ pedig egy ures menu-elemet. A l´etrehoz´as ut´an az elemet m´eg el is kell helyezni egy menu-t´ a ¨ gtk_menu_shelll_append() fuggv´ ennyel. ¨ Egy elem kiv´alaszt´as´anak e´ szlel´es´ehez az elemek activated jelz´es´et kell figyelni, ahogy a kovetkez˝ o egyszeru˝ p´eld´aban l´athatjuk: 1
f i l e l e n y i l o m e n u = gtk menu new ( ) ;
/∗ a menut csak l e t r e h o z z u k , meg nem l a t h a t o ∗/
2 3 4 5 6
/∗ Uj elemeket k e s z i t u n k ∗/ open menupont = g t k m e n u i t e m n e w w i t h l a b e l ( ” Megnyitas ” ) ; save menupont = g t k m e n u i t e m n e w w i t h l a b e l ( ” Mentes ” ) ; quit menupont = g t k m e n u i t e m n e w w i t h l a b e l ( ” K i l e p e s ” ) ;
7 8 9 10
/∗ Az elemeket a menu−t a r o l o b a t e s s z u k ∗/ gtk menu shell append (GTK MENU SHELL ( f i l e l e n y i l o m e n u ) , open menupont ) ; gtk menu shell append (GTK MENU SHELL ( f i l e l e n y i l o m e n u ) , save menupont ) ; 115
11
gtk menu shell append (GTK MENU SHELL ( f i l e l e n y i l o m e n u ) , quit menupont ) ;
12 13 14 15 16 17 18 19
/∗ az a c t i v a t e j e l z e s h e z kapcsolunk egy fuggvenyt : ∗/ g s i g n a l c o n n e c t s w a p p e d ( G OBJECT ( open menupont ) , ” a c t i v a t e ” , G CALLBACK ( menuhoz tartozo fuggveny ) , ( g p o i n t e r ) ” f i l e . open” ) ; g s i g n a l c o n n e c t s w a p p e d ( G OBJECT ( save menupont ) , ” a c t i v a t e ” , G CALLBACK ( menuhoz tartozo fuggveny ) , ( g p o i n t e r ) ” f i l e . save ” ) ;
20 21 22 23 24
/∗ Keszitunk egy K i l e p menu elemet i s ∗/ g s i g n a l c o n n e c t s w a p p e d ( G OBJECT ( quit menupont ) , ” a c t i v a t e ” , G CALLBACK ( d e s t r o y ) , ( gpointer ) ” f i l e . quit ” ) ;
25 26 27 28 29
/∗ es vegul l a t h a t o v a t e s s z u k az elemeket ∗/ gtk widget show ( open menupont ) ; gtk widget show ( save menupont ) ; gtk widget show ( quit menupont ) ;
30 31 32 33 34 35
/∗∗ Eddig a menu e l k e s z i t e s e v e l f o g l a l k o z t u n k . Fontos megerteni , hogy amit hetkoznapi s z o h a s z n a l a t t a l menunek nevezunk , az programozoi szempontbol egy menu−sav , amiben egymas m e l l e t t i menu−elemek ( menuk ) vannak − v a g y i s i t t a F a j l l e s z az egyik menu a menusavban .
36 37 38
Most egy menusavot es a \ verb ! F a j l ! menupont szamara egy menu−elemet k e s z i t u n k : ∗∗/
39 40 41 42
menu sav = gtk menu bar new ( ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( window ) , menu sav ) ; gtk widget show ( menu sav ) ;
43 44 45
fajl menuelem cimkevel = gtk menu item new with label ( ” F a j l ” ) ; gtk widget show ( f a j l m e n u e l e m c i m k e v e l ) ;
46 47 48
/∗∗ Most a F a j l menu−elemet a menusavhoz r e n d e l j u k : ∗∗/ gtk menu item set submenu (GTK MENU ITEM ( f i l e m e n u e l e m c i m k e v e l ) , f a j l l e n y i l o m e n u )
49 50 51
/∗∗ Vegul a F a j l menu−elemet a menusavba helyezzuk ∗∗/ gtk menu bar append (GTK MENU BAR ( menu sav ) , f i l e m e n u e l e m c i m k e v e l ) ; ¨ Az el˝obbi p´elda utolso´ k´et fuggv´ enye, a v´art adatt´ıpusokkal:
1 2 3 4
void gtk menu item set submenu ( GtkMenuItem ∗menu , GtkWidget ∗almenu ) ; void gtk menu bar append ( GtkMenuBar ∗menu sav , GtkWidget ∗almenu ) ; ¨ av – e´ s benne menuk ¨ – l´etrehoz´as´anak l´ep´esei: Menus´ ´ menut ¨ k´esz´ıtesz a gtk_menu_new() fuggv´ ¨ • uj ennyel ¨ ¨ • a menu¨ minden elem´enek l´etrehoz´as´ahoz megh´ıvod a gtk_menu_item_new() fuggv´ enyt, e´ s a menube ¨ helyez´eshez a gtk_menu_shell_append() fuggv´ enyt. ¨ ¨ • elk´esz´ıted a menu¨ gyoker´ et, szint´en a gtk_menu_item_new() fuggv´ ennyel. Ez az elem l´atszik majd a ¨ avban. menus´ ¨ erhez csatolod a menut ¨ (a • a gtk_menu_item_set_submenu() haszn´alat´aval az el˝obb l´etrehozott gyok´ ¨ erb˝ol leny´ılo´ r´eszt). gyok´ ´ menus´ ¨ avot k´esz´ıtesz. Ha egy menus´ ¨ avba tobb ¨ ¨ szeretn´el elhe• a gtk_menu_bar_new()-al uj menut ¨ avot el´eg egyszer l´etrehozni. lyezni, a menus´ ¨ er elemet a menus´ ¨ avba illeszted. • a gtk_menu_bar_append() -el a gyok´ 116
¨ k´esz´ıt´ese hasonloan ´ tort´ ¨ enik, annyi elt´er´essel hogy a menu¨ megjelen´es´er˝ol a gtk_menu_popup() Az el˝obukkano´ menuk ¨ fuggv´ eny gondoskodik, p´eld´aul egy gomb lenyom´as´ara. A l´etrehoz´as l´ep´esei:
¨ • L´etrehozol egy esem´enykezel˝o fuggv´ enyt : static gboolean handler( GtkWidget *felulet-elem, GdkEv – ami az esem´enyt haszn´alja fel az el˝obukkano´ ablak hely´enek meghat´aroz´as´ara ¨ enik, akkor az el˝obbi kodban ´ • ha mouse button press esem´eny tort´ l´ev˝o esemeny eg´ergomb lenyom´as ´ ´ ad a´ t inform´acio´ a gtk_menu_popup() fuggv´ ¨ esem´enyk´ent fut le, e´ s a p´eldakodhoz hasonloan enynek. ¨ • Az esem´enykezel˝ot ´ıgy a´ ll´ıtsd be egy felulet-elemhez: g s i g n a l c o n n e c t s w a p p e d ( G OBJECT ( f e l u l e t −elem ) , ” event ” , G CALLBACK ( e s e m e n y h a t a s a r a l e f u t o f u g g v e n y n e v e ) , G OBJECT ( menu ) ) ;
1 2 3
´ egy gtk_menu_new()-al l´etrehozott objektumra mutat, ami a menu¨ Az el˝obbi p´elda menu v´altozoja ´ s´avban l´ev˝o menu¨ is lehet, amint a p´eldakodban az l´atszik.
10.2.
1 2
P´elda a menu¨ k´ezi elk´esz´ıt´es´ere (Manual menu example)
# i n c l u d e < s t d i o . h> # i n c l u d e
3 4 5
s t a t i c gboolean gomb lenyomas ( GtkWidget ∗ , GdkEvent ∗ ) ; s t a t i c void menuelem valasza ( gchar ∗ ) ;
6 7 8 9
i n t main ( i n t argc , char ∗ argv [ ] ) {
10 11 12 13 14 15 16 17 18 19
GtkWidget ∗window ; GtkWidget ∗menu ; GtkWidget ∗menu bar ; GtkWidget ∗ root menu ; GtkWidget ∗ menu items ; GtkWidget ∗vbox ; GtkWidget ∗ button ; char buf [ 1 2 8 ] ; int i ;
/∗ /∗ /∗ /∗ /∗
menu sav gyoker menu menu elemek f u g g o l e g e s doboz gomb
∗/ ∗/ ∗/ ∗/ ∗/
20 21
g t k i n i t (& argc , &argv ) ;
22 23 24 25 26 27 28
/∗ u j a b l a k o t k e s z i t u n k ∗/ window = gtk window new (GTK WINDOW TOPLEVEL ) ; g t k w i d g e t s e t s i z e r e q u e s t (GTK WIDGET ( window ) , 2 0 0 , 1 0 0 ) ; g t k w i n d o w s e t t i t l e (GTK WINDOW ( window ) , ”GTK Menu T e s z t ” ) ; g s i g n a l c o n n e c t ( G OBJECT ( window ) , ” d e l e t e e v e n t ” , G CALLBACK ( g t k m a i n q u i t ) , NULL ) ;
29 30 31 32 33
/∗ ∗ ∗ ∗
a menu elemet i n i c i a l i z a l j u k . FIGYELEM : a menu elemet SOHA nem j e l e n i t j u k meg a gtk show widget ( ) fuggvennyel ! Ez a menu a menu−elemeket t a r t a l m a z z a , ami a 117
34 35 36
∗ Gyoker menu−r e k l i k k e l e s k o r bukkan f e l . ∗ ∗/ menu = gtk menu new ( ) ;
37 38 39 40 41 42 43
/∗ Egy rovid c i k l u s kovetkezik , ami harom ∗ menupontot hoz l e t r e a t e s t −menu−ben , a gtk menu shell append ∗ h i v a s a v a l . i t t adjuk hozza a menu elemek l i s t a j a t a menuhoz . ∗ Normalis e s e t b e n i t t k e l l e n e a ” c l i c k e d ” j e l z e s t f i g y e l n i , ∗ de i t t e z t e l h a g y j u k − nem ez a peldaprogram c e l j a . ∗/
44 45 46 47 48
f o r ( i = 0 ; i < 3 ; i ++) { /∗ a neveket a buf−ba masoljuk . ∗/ s p r i n t f ( buf , ”almenu − %d” , i ) ;
49
/∗ Uj menu−elemet keszitunk , es elnevezzuk . . . ∗/ menu items = g t k m e n u i t e m n e w w i t h l a b e l ( buf ) ;
50 51 52
/∗ . . . es a menuhoz hozzaadjuk . ∗/ gtk menu shell append (GTK MENU SHELL ( menu ) , menu items ) ;
53 54 55
/∗ C s i n a l j u n k valami e r d e k e s e t , ha egy menupontot k i v a l a s z t a n a k ∗/ g s i g n a l c o n n e c t s w a p p e d ( G OBJECT ( menu items ) , ” a c t i v a t e ” , G CALLBACK ( menuelem valasza ) , ( g p o i n t e r ) g s t r d u p ( buf ) ) ;
56 57 58 59 60
/∗ a f e l u l e t −elem m e g j e l e n i t e s e ∗/ gtk widget show ( menu items ) ;
61 62 63
}
64 65 66 67 68
/∗ Ez a gyoker menu , es a c i m k e j e a menusavban j e l e n i k meg . ∗ Nem f i g y e l u n k kulon s z i g n a l t , ∗ a menu mukodni fog ha r a k l i k k e l n e k . ∗/ root menu = g t k m e n u i t e m n e w w i t h l a b e l ( ”Gyoker Menu” ) ;
69 70
gtk widget show ( root menu ) ;
71 72 73 74 75
/∗ Most meghatarozzuk , hogy az eppen l e t r e h o z o t t ”menu” ∗ legyen a ” r o o t menu ” . G y a k o r l a t i l a g a gyoker menu e l s o ∗ menupontjat hozzuk l e t r e . ∗/ gtk menu item set submenu (GTK MENU ITEM ( root menu ) , menu ) ;
76 77 78 79 80
/∗ Egy vbox−o t keszitunk , a menunek es a gombnak : ∗/ vbox = gtk vbox new ( FALSE , 0 ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( window ) , vbox ) ; gtk widget show ( vbox ) ;
81 82 83 84 85 86
/∗ Menusavot keszitunk , ami a menuket t a r t a l m a z z a , ∗ es e l h e l y e z z u k a f o ablakban ∗/ menu bar = gtk menu bar new ( ) ; g t k b o x p a c k s t a r t (GTK BOX ( vbox ) , menu bar , FALSE , FALSE , 2 ) ; gtk widget show ( menu bar ) ;
87 88 89 90 91 92 93 94
/∗ Gombot keszitunk , amire k l i k k e l v e felbukkan a menu ∗/ button = g t k b u t t o n n e w w i t h l a b e l ( ” k l i k k e l j a gombra ! ” ) ; g s i g n a l c o n n e c t s w a p p e d ( G OBJECT ( button ) , ” event ” , G CALLBACK ( gomb lenyomas ) , G OBJECT ( menu ) ) ; g tk b ox p ac k e nd (GTK BOX ( vbox ) , button , TRUE, TRUE, 2 ) ; gtk widget show ( button ) ;
95
118
/∗ Es v e g e z e t u l a menu elemet a menusavba i l l e s z t j u k . ∗ ez l e s z a ” r o o t ” menu elem . ( gyoker , k i i n d u l o menu elem ) ∗/ gtk menu shell append (GTK MENU SHELL ( menu bar ) , root menu ) ;
96 97 98 99
/∗ az a b l a k o t u t o l j a r a j e l e n i t j u k meg , igy minden f e l u l e t −elem e g y s z e r r e ∗ v a l i k l a t h a t o v a a f e l h a s z n a l o szamara . ∗/ gtk widget show ( window ) ;
100 101 102 103
gtk main ( ) ;
104 105
return 0;
106 107
}
108 109 110 111 112 113 114 115 116 117 118 119 120
/∗ Gomb lenyomasra l e f u t o fuggveny − parameterkent egy f e l u l e t −elemet kap , ∗ ami NEM a lenyomott gomb ! ∗/ s t a t i c gboolean gomb lenyomas ( GtkWidget ∗ widget , GdkEvent ∗ event ) { i f ( event−>type == GDK BUTTON PRESS ) { GdkEventButton ∗ bevent = ( GdkEventButton ∗ ) event ; gtk menu popup (GTK MENU ( widget ) , NULL, NULL, NULL, NULL, bevent−>button , bevent−>time ) ; /∗ A hivo kodnak j e l e z z u k , hogy a k a p o t t esemenyt l e k e z e l t u k . ∗/ r e t u r n TRUE ; }
121
/∗ A hivo kodnak j e l e z z u k , hogy a k a p o t t esemenyt nem k e z e l j u k . ∗/ r e t u r n FALSE ;
122 123 124
}
125 126 127 128 129 130
/∗ Kiirunk egy s z o v e g e t a menuelem k i v a l a s z t a s a k o r . ∗/ s t a t i c void menuelem valasza ( gchar ∗ s t r i n g ) { p r i n t f ( ”%s \n” , s t r i n g ) ; }
10.3.
Az ElemGy´ar haszn´alata (Using ItemFactory)
´ ˝ A nehezebb modszer ut´an bemutatjuk az egyszerubbet, a gtk_item_factory() haszn´alat´at Az ElemGy´ar ¨ k´esz´ıt adott elemek tombj´ ¨ ˝ a menuk ¨ l´etrehoz´asa. menut eb˝ol - ´ıgy egyszerubb 10.3.1.
A menu¨ elem (ItemFactory entries)
¨ ¨ alkotott tomb ¨ ¨ Egy menu¨ elem (ItemFactoryEntry) meghat´aroz egy menupontot, e´ s a bel˝oluk alkotja a menut. ´ ´ıgy n´ez ki: Egy bejegyz´es defin´ıcioja 1 2 3 4
s t r u c t GtkItemFactoryEntry { gchar ∗ path ; gchar ∗ a c c e l e r a t o r ;
5
GtkItemFactoryCallback c a l l b a c k ; guint callback action ; gchar ∗ item type ;
6 7 8 9
}; ´ A path egy karakterl´anc, ami a menu¨ elem nev´et e´ s utvonal´ at is meghat´arozza. P´eld´aul a /File/Open ´ ´ Jo´ tudni hogy a eset´eben ez lesz a menu¨ elem neve, ami a /File utvonal u´ ElemGy´ar bejegyz´es alatt tal´alhato. ¨ ´ /File/Open a File menuben Open-k´ent jelenik meg. Mivel a / karaktert utvonalmeghat´ aroz´asra haszn´aljuk, ¨ ¨ ˝ et alsovon´ ´ ¨ uk, ¨ az lesz a menupont ¨ nem szerepelhet menupont nev´eben. Ha a menupont egy betuj´ assal megjelolj ˝ gyorsbillentyuje.
119
11.
Scribble - p´elda egy egyszeru˝ rajzprogramra
¨ Egy egyszeru˝ - p´elda rajzprogramot fogunk most osszerakni. P´eld´at l´athatunk az eg´erkezel´esre, az ablakra ´ ara, e´ s egy fejlettebb rajzol´asi technik´ara (backing pixmap). A p´eldaprogramot k´es˝obb alkalmass´a rajzol´as modj´ ¨ kev´esb´e gyakori bemeneti forr´asok haszn´alat´ara is, ilyen p´eld´aul a rajzolot´ ´ abla. tesszuk ´ abl´ak nyom´as e´ s d˝ol´esszog ¨ tulajdons´agait is. A GTK t´amogatja a rajzolot´ ˝ ´ ¨ Az eddig ismertetett GTK szign´alok magas szintu˝ muveletekhez kapcsolodtak, ilyen p´eld´aul egy menupont ´ jon ¨ ha alacsonyabb szintu˝ esem´enyeket is meg tudunk figyelni, p´eld´aul az kiv´alaszt´asa. N´eha viszont jol eg´er mozdul´as´at vagy egy gomb lenyom´as´at. Erre a helyzetre l´eteznek alacsonyszintu˝ esem´enykezel˝ok – me¨ onleges ¨ ´ at tartalmazo´ struktur´ ´ ara. lyekhez egy kul param´eter tartozik, ami egy mutato´ az esem´eny inform´acioj´ ´ ara mutato´ pointert ad a´ t P´eld´aul az eg´ermutato´ mozg´as´at figyel˝o kezel˝ok egy - a GdkEventMotion struktur´ ¨ valahogy ´ıgy: param´eterul, 1 2
struct {
GdkEventMotion GdkEventType type ; GdkWindow ∗window ; g u i n t 3 2 time ; gdouble x ; gdouble y ; ... guint s t a t e ;
3 4 5 6 7 8 9 10
∗/ ∗/ ∗/ ∗/ ∗/
/∗ e s e t l e g e s modosito b i l l e n t y u k vagy egergombok
∗/
...
11 12
esemeny t i p u s a i t t k e l e t k e z e t t az esemeny keletkezes idopontja (?) az esemeny x k o o r d i n a t a j a az esemeny y k o o r d i n a t a j a
/∗ /∗ /∗ /∗ /∗
}; ´ A type attributumot az esem´eny t´ıpus´ahoz kell be´all´ıtani, ami ebben az esetben GDK_MOTION_NOTIFY. ´ A lehets´eges modos´ ıto´ billentyu˝ e´ s eg´ergomb lenyom´asok:
1 2 3 4 5 6 7 8 9 10 11 12 13
GDK SHIFT MASK GDK LOCK MASK GDK CONTROL MASK GDK MOD1 MASK GDK MOD2 MASK GDK MOD3 MASK GDK MOD4 MASK GDK MOD5 MASK GDK BUTTON1 MASK GDK BUTTON2 MASK GDK BUTTON3 MASK GDK BUTTON4 MASK GDK BUTTON5 MASK ´ ahhoz hogy meghat´arozzuk mi tort´ ¨ ent, a gtk_signal_connect() fuggv´ ¨ M´as szign´alokhoz hasonloan enyt e´ rdemes haszn´alni – e´ s a GTK-val tudatni kell, hogy mely esem´enyekre vagyunk k´ıv´ancsiak - valahogy ´ıgy:
1 2
void g t k w i d g e t s e t e v e n t s ( GtkWidget ∗ f e l u l e t −elem , gint esemenyek ) ; ¨ A fuggv´ eny m´asodik param´etere tartalmazza azon esem´enyeket, melyek e´ rdekelnek minket. A lehets´eges esem´enyek list´aja:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
GDK EXPOSURE MASK GDK POINTER MOTION MASK GDK POINTER MOTION HINT MASK GDK BUTTON MOTION MASK GDK BUTTON1 MOTION MASK GDK BUTTON2 MOTION MASK GDK BUTTON3 MOTION MASK GDK BUTTON PRESS MASK GDK BUTTON RELEASE MASK GDK KEY PRESS MASK GDK KEY RELEASE MASK GDK ENTER NOTIFY MASK GDK LEAVE NOTIFY MASK GDK FOCUS CHANGE MASK 120
15 16 17 18
GDK STRUCTURE MASK GDK PROPERTY CHANGE MASK GDK PROXIMITY IN MASK GDK PROXIMITY OUT MASK ¨ ¨ ¨ is a felulet¨ A gtk_widget_set_events() h´ıv´asakor tobb k´enyes dologra is figyelnunk kell. El˝oszor ¨ ¨ ¨ elemhez tartozo´ X ablak l´etrejotte el˝ott kell megh´ıvnunk. Gyakorlatilag azonnal a felulet-elem l´etrejotte ut´an ¨ ¨ e´ rdemes a h´ıv´ast megtenni. M´asodszor a felulet-elemhez egy X ablaknak kell tartoznia. Van n´eh´any felulet¨ on ¨ ablak – o˝ k a szul˝ ¨ o ablakban rajzolnak. Ezek az elemek: elem, amihez nem tartozik kul
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
GtkAlignment GtkArrow GtkBin GtkBox GtkImage GtkItem GtkLabel GtkPixmap GtkScrolledWindow GtkSep arator GtkTable GtkAspectFrame GtkFrame GtkVBox GtkHBox GtkVSeparator GtkHSeparator
12.
Otthoni prob´ ´ alkoz´asok, e´ rdekes k´ıs´erletek
12.1.
Kurucz Istv´an programjai
¨ Istv´an programjait a /src/--Kurucz-Istvan konyvt´ arban tal´alod. Email c´ıme: kurucz pont istvan kukac gmail pont com. 12.1.1.
Rajzol´as gombra - a gomb a´ tsz´ınez´ese
A gdk-drawing egy e´ rdekes p´elda a gombok kin´ezet´enek megv´altoztat´as´ara:
1 2 3 4
/∗ ∗ ∗ ∗
gdk−drawing . c −− 2 0 0 5 . 0 7 . 1 3 Egy ablakban k e t nyomogomb , az e g y i k r e k a t t i n t v a a masiknak megvaltozik a s z i n e ( h a t t e r es f e l i r a t s z i n ) , a szoveg b e t u t i p u s a es merete , tovabba athuzzuk k e t a t l o s v o n a l l a l ∗/
5 6
# i n c l u d e
7 8 9 10 11
/∗ az alkalmazas f o a b l a k a ∗/ GtkWidget ∗ MainWindow = NULL; GtkWidget ∗ F i r s t B u t t o n = NULL; GtkWidget ∗ Second Button = NULL; 121
12 13 14 15 16 17 18 19
/∗ az esemeny , amelyben a GDK s e g i t s e g e v e l meghuzzuk a v o n a l a t ∗/ gboolean F i r s t B u t t o n E x p o s e ( GtkWidget ∗ widget , GdkEventExpose ∗ event , g p o i n t e r u s e r d a t a ) { G t k A l l o c a t i o n GombAlloc ; GdkWindow ∗ window = NULL; GdkGC ∗ GombGrafika GC = NULL;
20
window = widget−>window ; GombAlloc = widget−>a l l o c a t i o n ; GombGrafika GC = gdk gc new ( window ) ; gdk draw line ( window , GombGrafika GC , GombAlloc . x , GombAlloc . y , GombAlloc . width + GombAlloc . x , GombAlloc . h e i g h t + GombAlloc . y ) ; gdk draw line ( window , GombGrafika GC , GombAlloc . width + GombAlloc . x , GombAlloc . y , GombAlloc . x , GombAlloc . h e i g h t + GombAlloc . y ) ; r e t u r n FALSE ;
21 22 23 24 25 26 27 28 29
}
30 31 32
void F i r s t B u t t o n C l i c k e d ( GtkWidget ∗ button , g p o i n t e r u s e r d a t a ) {
33
/∗ a masik nyomogomb cimkejenek a mutatoja ∗/ GtkWidget ∗ Child = NULL;
34 35 36
/∗ ezekben a valtozokban f o g j u k az e l k e s z i t e t t e l o t e r es h a t t e r s z i n t t a r o l n i ∗/ GdkColor SzovegSzin ; GdkColor H a t t e r S z i n ;
37 38 39 40
/∗ a nyomogomb f e l i r a t a n a k u j s t i l u s a t f o g j u k t a r o l n i benne ∗/ G t k S t y l e ∗ S t i l u s = NULL;
41 42 43
/∗ k i k e v e r j u k az u j e l o t e r es h a t t e r s z i n t az RGB alapkomponensekbol ∗/ g d k c o l o r p a r s e ( ” blue ” , &SzovegSzin ) ; H a t t e r S z i n . red = 6 5 5 3 5 ; H a t t e r S z i n . green = 0 ; H a t t e r S z i n . blue = 0 ;
44 45 46 47 48 49
/∗ megszerezzuk a masik nyomogomb cimkejenek a m u t a t o j a t ∗/ Child = g t k b i n g e t c h i l d ( GTK BIN ( Second Button ) ) ;
50 51 52
/∗ b e a l l i t j u k a masik nyomogomb u j h a t t e r s z i n e t , es a szoveg s z i n e t ∗/ gtk widget modify bg ( Second Button , GTK STATE NORMAL, &H a t t e r S z i n ) ; g t k w i d g e t m o d i f y f g ( Child , GTK STATE NORMAL, &SzovegSzin ) ;
53 54 55 56
/∗ lekerdezzuk a nyomogomb f e l i r a t a n a k a s t i l u s a t , ∗ majd a f e l i r a t s t i l u s a t f e l k o v e r r e es d o l t r e a l l i t j u k ∗/ S t i l u s = g t k w i d g e t g e t s t y l e ( Child ) ; p a n g o f o n t d e s c r i p t i o n s e t w e i g h t ( S t i l u s −>f o n t d e s c , PANGO WEIGHT HEAVY ) ; p a n g o f o n t d e s c r i p t i o n s e t s t y l e ( S t i l u s −>f o n t d e s c , PANGO STYLE ITALIC ) ; g t k w i d g e t m o d i f y f o n t ( Child , S t i l u s −>f o n t d e s c ) ; /∗ most k o v e t k e z i k a f e l a d a t masodik r e s z e , ∗ az a t l o s vonalak meghuzasa a GDK s e g i t s e g e v e l ∗/ g signal connect after ( G OBJECT ( F i r s t B u t t o n ) , ” expose−event ” , G CALLBACK ( F i r s t B u t t o n E x p o s e ) , NULL ) ;
57 58 59 60 61 62 63 64 65 66 67 68 69
}
70 71 72 73
i n t main ( i n t argc , char ∗ argv [ ] ) { GtkWidget ∗ HBox = NULL; 122
74
/∗ i n i c i a l i z a l j u k a GTK −t , e r r e mindig szukseg va ∗/ g t k i n i t (& argc , &argv ) ;
75 76 77
/∗ e l k e s z i t j u k az alkalmazas f o a b l a k a t , es a nyomogombokat , ∗ h o z z a r e n d e l j u k a s z i g n a l t ∗/ MainWindow = gtk window new (GTK WINDOW TOPLEVEL ) ; g signal connect swapped ( G OBJECT ( MainWindow ) , ” d e l e t e −event ” , G CALLBACK ( g t k m a i n q u i t ) , G OBJECT ( MainWindow ) ) ;
78 79 80 81 82 83 84 85
HBox = gtk hbutton box new ( ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( MainWindow ) , HBox ) ;
86 87 88
F i r s t B u t t o n = g t k b u t t o n n e w w i t h l a b e l ( ” F i r s t Button ” ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( HBox ) , F i r s t B u t t o n ) ; G OBJECT ( F i r s t B u t t o n ) , g signal connect ( ” c l i c k e d ” , G CALLBACK ( F i r s t B u t t o n C l i c k e d ) , NULL ) ;
89 90 91 92 93
Second Button = g t k b u t t o n n e w w i t h l a b e l ( ” Second Button ” ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( HBox ) , Second Button ) ;
94 95 96
g signal connect swapped (
97 98 99 100
G OBJECT ( Second Button ) , ” clicked ” , G CALLBACK ( g t k m a i n q u i t ) , G OBJECT ( MainWindow ) ) ;
101
/∗ elvegezzuk a widgetek b e a l l i t a s a i t ∗/ g t k w i n d o w s e t t i t l e (GTK WINDOW ( MainWindow ) , ”gdk−drawing . c ” ) ; g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( MainWindow ) , 2 0 ) ; g t k b o x s e t s p a c i n g (GTK BOX ( HBox ) , 1 0 ) ;
102 103 104 105 106
/∗ m e g j e l e n i t u n k minden w id g e t et ∗/ g t k w i d g e t s h o w a l l ( MainWindow ) ;
107 108 109
/∗ Indul az X esemenyvezerlese ∗/ gtk main ( ) ; return 0;
110 111 112 113
} 12.1.2.
Gombba a´ gyazott gomb - ilyet is lehet
A crazy-button gombba a´ gyazott gombokat mutat be:
1
/∗ crazy−button . c
−−
2005.07.14 123
2 3 4 5 6
∗ ∗ ∗ ∗ ∗
Egy ablak , benne egy u re s nyomogombbal . Kihasznalva , hogy a nyomogomb kontener−objektum , e l h e l y e z u n k benne egy t a b l a t , es annak minden mezojeben e l t a r o l u n k egy ujabb nyomogombot kozos esemenykezelovel ∗/
7 8 9 10
# i n c l u d e < g l i b . h> # i n c l u d e < g l i b / g p r i n t f . h> # i n c l u d e
11 12 13 14
/∗ a t a b l a z a t s o r es oszlopszama ∗/ #define X 5 #define Y 4
15 16 17
/∗ az alkalmazas f o a b l a k a ∗/ GtkWidget ∗ MainWindow = NULL;
18 19 20
/∗ a kulso nyomogomb ∗/ GtkWidget ∗ E x t e r n a l B u t t o n = NULL;
21 22 23
/∗ a t a b l a , amely a nyomogombon b e l u l l e s z ∗/ GtkWidget ∗ Table = NULL;
24 25 26
/∗ a b e l s o nyomogombok k e s z i t e n e s e l h a s z n a l t mutato ∗/ GtkWidget ∗ I n t e r n a l B u t t o n = NULL;
27 28 29 30 31 32 33 34 35 36 37
void B u t t o n C l i c k e d ( GtkWidget ∗ button , g p o i n t e r u s e r d a t a ) /∗ ha a kulso gombra k a t t i n t o t t a k ∗/ i f ( u s e r d a t a == NULL) { g p r i n t ( ” b i g button ! \ n” ) ; } else { g p r i n t ( ” s m a l l button : %d\n” , ( g i n t ) u s e r d a t a ) ; } }
{
38 39 40 41 42
i n t main ( i n t argc , char ∗ argv [ ] ) { gint x , y , i ; gchar I n t e r n a l B u t t o n L a b e l [ 4 ] ;
43 44 45
/∗ i n i c i a l i z a l j u k a GTK −t , e r r e mindig szukseg van ∗/ g t k i n i t (& argc , &argv ) ;
46 47 48 49 50 51
/∗ e l k e s z i t j u k az alkalmazas f o a b l a k a t , h o z z a r e n d e l j u k a s z i g n a l t , b e a l l i t j u k a t u l a j d o n s MainWindow = gtk window new (GTK WINDOW TOPLEVEL ) ; g s i g n a l c o n n e c t s w a p p e d ( G OBJECT ( MainWindow ) , ” d e l e t e −event ” , G CALLBACK ( g t k m a i n q u i g t k w i n d o w s e t t i t l e (GTK WINDOW ( MainWindow ) , ” crazy−button . c ” ) ; g t k c o n t a i n e r s e t b o r d e r w i d t h (GTK CONTAINER ( MainWindow ) , 2 0 ) ;
52 53 54 55
/∗ e l k e s z i t j u k a kulso nyomogombot , e l h e l y e z z u k az ablakban ∗/ E x t e r n a l B u t t o n = gtk button new ( ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( MainWindow ) , E x t e r n a l B u t t o n ) ;
56 57 58 59
/∗ e l k e s z i t j u k a t a b l a t , es e l h e l y e z z u k a nyomogomb b e l s e j e b e n ∗/ Table = g t k t a b l e n e w ( X , Y , TRUE ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( E x t e r n a l B u t t o n ) , Table ) ;
60 61 62
/∗ a kulso nyomogombhoz h o z z a r e n d e l j u k az esemenyt , p a r a m e t e r t nem adunk a t ∗/ g s i g n a l c o n n e c t ( E x t e r n a l B u t t o n , ” c l i c k e d ” , G CALLBACK ( B u t t o n C l i c k e d ) , NULL ) ;
63
124
/∗ most a b e l s o gombokat k e s z i t j u k e l , e l h e l y e z z u k a ta bl ab an , es h o z z a r e n d e l j u k az eseme i = 0; f o r ( y = 0 ; y < Y ; y++) f o r ( x = 0 ; x < X ; x ++) { g s p r i n t f ( I n t e r n a l B u t t o n L a b e l , ”%3d” , ++ i ) ; Internal Button = gtk button new with label ( Internal Button Label ) ; g t k t a b l e a t t a c h ( GTK TABLE ( Table ) , I n t e r n a l B u t t o n , x , x +1 , y , y +1 , ( GtkAttachOptions ) (GTK EXPAND | GTK SHRINK | GTK FILL ) , ( GtkAttachOp g s i g n a l c o n n e c t ( I n t e r n a l B u t t o n , ” c l i c k e d ” , G CALLBACK ( B u t t o n C l i c k e d ) , ( g i n t ∗ ) i ) ; }
64 65 66 67 68 69 70 71 72 73 74
/∗ m e g j e l e n i t u n k minden w id g e te t ∗/ g t k w i d g e t s h o w a l l ( MainWindow ) ;
75 76 77
/∗ Indul az X esemenyvezerlese ∗/ gtk main ( ) ; return 0;
78 79 80 81
} 12.1.3.
Memoriaj´ ´ at´ek SVG grafika felhaszn´al´as´aval
´ ¨ onlegess´ ¨ A never-tile egy memoriaj´ at´ek, kul ege hogy SVG grafika be´agyaz´as´ara is p´eld´at mutat. A prog´ asa miatt a´ t´ırtam benne a megjelen´ıthet˝o k´epek sz´am´at, valoj´ ´ aban egyid˝oben csak n´egy k´epet l´athatunk, ram fotoz´ de ´ıgy l´atv´anyosabb a foto´ :-) – rem´elem nem lesz gond bel˝ole.
1 2 3
/∗ k i s a l a p memoriajatek a GTK+ 2 alapu programozas g y a k o r l a s a r a ∗/ # d e f i n e GNU SOURCE # i n c l u d e ” never − t i l e . h”
4 5
#define
GNU SOURCE
6 7 8 9 10 11 12 13
/∗ az alkalmazas neve ∗/ # d e f i n e TITLE ” Never−T i l e ” /∗ konstansok a kockak a l l a p o t a n a k l e k e r d e z e s e h e z es b e a l l i t a s a h o z ∗/ # d e f i n e LATHATATLAN 0 # d e f i n e LATHATO 1 # d e f i n e BENYOMOTT 2 /∗ a t a b l a m e r e t e i ∗/ 125
14 15 16
17
#define X 8 #define Y 5 /∗ h a n y f e l e kep l e h e t s e g e s , es egy kepbol hany darab van ! ! ! ∗/ # d e f i n e KEP 10
f i g y e l e m : KEP ∗ DARAB == X ∗ Y
18 19 20 21 22 23 24
# d e f i n e DARAB 4 /∗ kockak i g e n y e l t l e g k i s e b b merete , g t k w i d g e t s i z e r e q u e s t ( ) −e l meghatarozva ∗/ /∗ igy amikor megjelennek a kepek , nem meretezodnek a t a kockak ∗/ # d e f i n e MERET 45 /∗ ha f e l f o r d u l t DARAB szamu kocka , ennyi masodpercig l a t h a t o a k ∗/ # d e f i n e MEDDIG 10
25 26 27
KockaTipus KockaTomb [ X ] [ Y ] ;
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
/∗ e r t e k e 1 , ha a nevjegy a b l a k l a t h a t o ∗/ i n t NevjegyLathato = 0 ; /∗ megmutatja , hogy eppen hany kocka van f e l f o r d i t v a ∗/ i n t KockaLathato = 0 ; /∗ megmutatja , hogy hany kocka van vegleg e l t u n t e t v e ∗/ i n t KockaLevett = 0 ; /∗ ha az e r t e k e 1 , akkor l e van t i l t v a a kockakra va lo k a t t i n t a s ∗/ int KockaTiltas = 0 ; /∗ egyedi a z o n o s i t o az i d o z i t o l e t r e h o z a s a h o z , kesobb e z z e l fogunk h i v a t k o z n i r a ∗/ gint IdozitoAzonosito = 0 ; /∗ i t t t a r o l j u k majd a program i n d u l a s a o t a e l t e l t masodperceket ∗/ gulong MasodpercSzamlalo = 0 ; /∗ i t t t a r o l j u k e l , hogy hanyadik masodpercben f o r d i t o t t u k f e l a DARAB szamu kockat ∗/ gulong M e g j e l e n i t e s i M a s o d p e r c = 0 ; /∗ a f o a b l a k r a mutato p o i n t e r ∗/ s t a t i c GtkWidget ∗ MainWindow = NULL; /∗ a nevjegy a b l a k r a mutato p o i n t e r ∗/ s t a t i c GtkWidget ∗ NevjegyAblak = NULL;
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
i n t main ( i n t argc , char ∗ argv [ ] ) { char ∗ lang = NULL; int x , y ; /∗ az a b l a k cimenek t a r o l a s a h o z ∗/ char ∗ WindowTitle = NULL; char ∗ Name = NULL; char ∗ Version = NULL; char ∗ ImagesPath = NULL; /∗ az alkalmazas ikonjanak , i l l e t v e a v i s s z a t e r e s i hibakod ∗/ GdkPixbuf ∗ MainWindow icon = NULL; GError ∗ Hiba = NULL; /∗ a widgetek mutatoi ∗/ GtkWidget ∗ Racs = NULL; GtkWidget ∗ FuggolegesOsztas = NULL; GtkWidget ∗ V i z s z i n t e s O s z t a s = NULL; GtkWidget ∗ NevjegyGomb = NULL; GtkWidget ∗ KilepesGomb = NULL; GtkWidget ∗ CimkeOsztas = NULL; GtkWidget ∗ E l t e l t I d o S z o v e g = NULL; GtkWidget ∗ E l t e l t I d o C i m k e = NULL; GtkWidget ∗ LevettKockaSzoveg = NULL; GtkWidget ∗ LevettKockaCimke = NULL;
71 72 73 74
AdatszerkezetekInit ( ) ; /∗ b e a l l i t j u k az a b l a k k e z d e t i cimet ∗/ WindowTitle = c a l l o c ( 1 0 0 , s i z e o f ( char ) ) ; 126
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
Name = c a l l o c ( 1 0 0 , s i z e o f ( char ) ) ; Version = c a l l o c ( 1 0 0 , s i z e o f ( char ) ) ; ImagesPath = c a l l o c ( 1 0 0 , s i z e o f ( char ) ) ; s t r c p y (Name, TITLE ) ; s t r c p y ( Version , VERSION ) ; WindowTitle = s t r c a t (Name, Version ) ; /∗ b e a l l i t u n k par d o l g o t a l o k a l i z a c i o v a l k a p c s o l a t b a n ∗/ a s p r i n t f (& lang , ”%s ” , getenv ( ”LANG” ) ) ; s e t l o c a l e ( LC ALL , lang ) ; bindtextdomain (GETTEXT PACKAGE, NEVER TILE LOCALEDIR ) ; b i n d t e x t d o m a i n c o d e s e t (GETTEXT PACKAGE, ”UTF−8” ) ; textdomain (GETTEXT PACKAGE ) ; f r e e ( lang ) ; /∗ I n i c i a l i z a l j u k az i 1 8 n nemzetkozi t a m o g a t a s t ∗/ gtk set locale ( ) ; /∗ I n i c i a l i z a l j u k a widget−k e s z l e t e t ∗/ g t k i n i t (& argc , &argv ) ; /∗ e l k e s z i t j u k az alkalmazas f o a b l a k a t ∗/ MainWindow = gtk window new (GTK WINDOW TOPLEVEL ) ; g t k w i n d o w s e t t i t l e (GTK WINDOW ( MainWindow ) , WindowTitle ) ; g t k w i n d o w s e t p o s i t i o n (GTK WINDOW ( MainWindow ) , GTK WIN POS CENTER ) ; /∗ b e a l l i t j u k az alkalmazas ablakanak i k o n j a t , az e l e r e s i ut a c o n f i g . h −b o l van ∗/ s t r c p y ( ImagesPath , NEVER TILE IMAGESDIR ) ; MainWindow icon = g d k p i x b u f n e w f r o m f i l e ( s t r c a t ( ImagesPath , ” icon mainwindow . svg ” ) , &H i f ( Hiba ) { g p r i n t ( ( ”Could not open a p p l i c a t i o n i c o n s . . . ! \ n” ) ) ; g e r r o r f r e e ( Hiba ) ; } g t k w i n d o w s e t i c o n (GTK WINDOW ( MainWindow ) , MainWindow icon ) ; /∗ ha b e z a r j a k az a b l a k o t , kilepunk az a l k a l m a z a s b o l ∗/ g s i g n a l c o n n e c t ( MainWindow , ” d e s t r o y ” , G CALLBACK ( K i l e p e s ) , NULL ) ; /∗ e l k e s z i t j u k a t a b l a t , amely t a r t a l m a z z a a gombokat ∗/ /∗ az a b l a k o t f u g g o l e g e s e n f e l o s z t j u k , de nem homogen modon ∗/ FuggolegesOsztas = gtk vbox new ( FALSE , 0 ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( MainWindow ) , FuggolegesOsztas ) ; /∗ e l k e s z i t j u k a r a c s o t , ami majd a gombokat t a r t a l m a z z a , homogen modon ∗/ Racs = g t k t a b l e n e w ( Y , X , TRUE ) ; /∗ a r a c s o t b e l e i l l e s z t j u k az a b l a k f e l s o r e s z e b e ∗/ g t k b o x p a c k s t a r t (GTK BOX ( FuggolegesOsztas ) , Racs , TRUE, TRUE, 0 ) ; /∗ az a b l a k a l s o r e s z e t f e l o s z t j u k v i z s z i n t e s e n harom r e s z r e , b e l e h e l y e z z u k a k e t gombot ∗ /∗ kozepso r e s z t f u g g o l e g e s e n 4 r e s z r e d a r a b o l j u k , es b e l e t e s s z u k az eredmenyjelzo cimkek /∗ e l o s z o r b a l o l d a l r a k i t e s s z u k a Nevjegy gombot ∗/ V i z s z i n t e s O s z t a s = gtk hbox new (TRUE, 0 ) ; g t k b o x p a c k s t a r t (GTK BOX ( FuggolegesOsztas ) , V i z s z i n t e s O s z t a s , TRUE, TRUE, 0 ) ; NevjegyGomb = gtk button new with mnemonic ( ( ”About” ) ) ; g t k b o x p a c k s t a r t (GTK BOX ( V i z s z i n t e s O s z t a s ) , NevjegyGomb , TRUE, TRUE, 0 ) ; /∗ most j o n az a l s o gombsor kozepe , benne a cimkekkel ∗/ CimkeOsztas = gtk vbox new (TRUE, 0 ) ; g t k b o x p a c k s t a r t (GTK BOX ( V i z s z i n t e s O s z t a s ) , CimkeOsztas , TRUE, TRUE, 0 ) ; E l t e l t I d o S z o v e g = g t k l a b e l n e w ( ( ”Used Time : ” ) ) ; g t k l a b e l s e t m a r k u p ( GTK LABEL ( E l t e l t I d o S z o v e g ) , ( ”Used Time:” ) ) ; g t k b o x p a c k s t a r t (GTK BOX ( CimkeOsztas ) , E l t e l t I d o S z o v e g , TRUE, TRUE, 0 ) ; ElteltIdoCimke = gtk label new ( ” 0 0 : 0 0 : 0 0 : 0 0 ” ) ; g t k b o x p a c k s t a r t (GTK BOX ( CimkeOsztas ) , E l t e l t I d o C i m k e , TRUE, TRUE, 0 ) ; /∗ ez a mutatot e l t a r o l j u k az ablakban , hogy kesobb nevvel hivatkozva ra , e l tudjuk e r n i g o b j e c t s e t d a t a ( G OBJECT ( MainWindow ) , ” E l t e l t I d o C i m k e ” , E l t e l t I d o C i m k e ) ; LevettKockaSzoveg = g t k l a b e l n e w ( ( ”Winned P i c t u r e s : ” ) ) ; g t k l a b e l s e t m a r k u p ( GTK LABEL ( LevettKockaSzoveg ) , ( ”Winned P i c t u r e s :” ) ) ; g t k b o x p a c k s t a r t (GTK BOX ( CimkeOsztas ) , LevettKockaSzoveg , TRUE, TRUE, 0 ) ; LevettKockaCimke = g t k l a b e l n e w ( ” 0 ” ) ; g t k b o x p a c k s t a r t (GTK BOX ( CimkeOsztas ) , LevettKockaCimke , TRUE, TRUE, 0 ) ; /∗ ez a mutatot i s e l t a r o l j u k az ablakban , hogy kesobb tudjuk a cimket v a l t o z t a t n i ∗/ 127
g o b j e c t s e t d a t a ( G OBJECT ( MainWindow ) , ” LevettKockaCimke ” , LevettKockaCimke ) ; /∗ es most a j o b b o l d a l i K i l e p e s gomb ∗/ KilepesGomb = g t k b u t t o n n e w f r o m s t o c k ( GTK STOCK QUIT ) ; g t k b o x p a c k s t a r t (GTK BOX ( V i z s z i n t e s O s z t a s ) , KilepesGomb , TRUE, TRUE, 0 ) ; /∗ ha a K i l e p e s gombra k a t t i n t a n a k , kilepunk az alkamazasbol ∗/ g s i g n a l c o n n e c t ( KilepesGomb , ” c l i c k e d ” , G CALLBACK ( K i l e p e s ) , NULL ) ; /∗ ha a Nevjegy gombra k a t t i n t a n a k , e l k e s z i t j u k a nevjegy−a b l a k o t ∗/ g s i g n a l c o n n e c t ( NevjegyGomb , ” c l i c k e d ” , G CALLBACK ( Nevjegy ) , NULL ) ; /∗ l e t r e h o z z u k a t a b l a n b e l u l a nyomogombokat , es b e a l l i t j u k a j e l l e m z o i k e t , hozzaadjuk a f o r ( x = 0 ; x < X ; x ++) f o r ( y = 0 ; y < Y ; y++) { KockaTomb [ x ] [ y ] . Kocka = g t k t o g g l e b u t t o n n e w ( ) ; /∗ b e a l l i t j u k a kockak l e g k i s e b b m e r e t e t MERET −r e ∗/ g t k w i d g e t s e t s i z e r e q u e s t ( KockaTomb [ x ] [ y ] . Kocka , MERET, MERET ) ; /∗ a kockakat b e l e h e l y e z z u k a t a b l a b a , es hozzadjuk a kozos esemeny−k e z e l o t ∗/ g t k t a b l e a t t a c h ( GTK TABLE ( Racs ) , KockaTomb [ x ] [ y ] . Kocka , x , x +1 , y , y +1 , ( GtkAttachOptions ) (GTK EXPAND | GTK SHRINK | GTK FILL ) , ( GtkAttachOpt g s i g n a l c o n n e c t ( KockaTomb [ x ] [ y ] . Kocka , ” t o g g l e d ” , G CALLBACK ( K o c k a K a t t i n t a s ) , &KockaT } /∗ m e g j e l e n i t j u k az o s s z e s widget −e t ∗/ g t k w i d g e t s h o w a l l ( MainWindow ) ; /∗ h o z z a r e n d e l j u k a kockakhoz a kepeket , de e g y e l o r e nem mutatjuk meg oket ∗/ KepInicializalas ( ) ; /∗ i n i c i a l i z a l j u k a s z a l k e z e l e s t es az i d o z i t o t , es rogton k e s z i t u n k i s egy i d o z i t o t ∗/ IdozitoInit ( ) ; /∗ belepunk egy u j s z a l b a , ami a m e g j e l e n i t e s t vegzi , majd utana e l i s hagyjuk a z t ∗/ gdk threads enter ( ) ; gtk main ( ) ; gdk threads leave ( ) ; /∗ minden megmaradt dinamikus a d a t t e r u l e t e t f e l s z a b a d i t u n k ∗/ f r e e ( WindowTitle ) ; f r e e (Name ) ; f r e e ( Version ) ; /∗ m e g s z i n t e t j u k az i d o z i t o t ∗/ gtk timeout remove ( I d o z i t o A z o n o s i t o ) ; return 0;
137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
}
174 175 176 177 178 179
/∗ k e z d o e r t e k e t adunk az a d a t s z e r k e z e t e k n e k ∗/ void A d a t s z e r k e z e t e k I n i t ( ) { int x , y , i , j ; GRand ∗ VeletlenSzam ;
180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198
f o r ( y = 0 ; y < Y ; y++) f o r ( x = 0 ; x < X ; x ++) { KockaTomb [ x ] [ y ] . XKord = x ; KockaTomb [ x ] [ y ] . YKord = y ; KockaTomb [ x ] [ y ] . L a t h a t o = LATHATO; KockaTomb [ x ] [ y ] . KepSzam = −1; KockaTomb [ x ] [ y ] . Kocka = NULL; KockaTomb [ x ] [ y ] . KockaKep = NULL; } /∗ f e l t o l t j u k a KepSzam e r t e k e t KEP f e l e veletlenszammal , mindegyik pontosan DARAB darab ∗ VeletlenSzam = g rand new ( ) ; x = y = i = j = 0; while ( i < KEP) { while ( j < DARAB) { x = g r a n d i n t r a n g e ( VeletlenSzam , 0 , X ) ; y = g r a n d i n t r a n g e ( VeletlenSzam , 0 , Y ) ; while ( KockaTomb [ x ] [ y ] . KepSzam ! = −1) { x = g r a n d i n t r a n g e ( VeletlenSzam , 0 , X ) ; 128
y = g r a n d i n t r a n g e ( VeletlenSzam , 0 , Y ) ; } KockaTomb [ x ] [ y ] . KepSzam = i ; j ++;
199 200 201 202
} j = 0; i ++;
203 204 205
}
206 207
}
208 209 210 211 212 213
/∗ kilepofuggveny az a l k a l m a z a s b o l ∗/ void K i l e p e s ( GtkObject ∗ o b j e c t , g p o i n t e r u s e r d a t a ) { gtk main quit ( ) ; }
214 215 216 217 218 219 220 221 222
/∗ a nevjegy−a b l a k e l k e s z i t e s e es h a s z n a l a t a ∗/ void Nevjegy ( ) { GtkWidget ∗ FuggolegesOsztas = NULL; GtkWidget ∗ BemutatkozoCimke = NULL; GtkWidget ∗ KeszitoneveCimke = NULL; GtkWidget ∗ KeszitoemailCimke = NULL; GtkWidget ∗ NevjegyBezaras = NULL;
223
/∗ ha mar van l a t h a t o nevjegy−ablak , nem k e s z i t u n k t o b b e t ∗/ i f ( NevjegyLathato ! = 1 ) { NevjegyLathato = 1 ; NevjegyAblak = gtk window new (GTK WINDOW TOPLEVEL ) ; /∗ b e a l l i t j u k a nevjegy a b l a k cimet , ne legyen a t m e r e t e z h e t o , de modalis legyen ∗/ g t k w i n d o w s e t t i t l e (GTK WINDOW ( NevjegyAblak ) , ( ”About” ) ) ; g t k w i n d o w s e t r e s i z a b l e (GTK WINDOW ( NevjegyAblak ) , FALSE ) ; gtk window set modal (GTK WINDOW ( NevjegyAblak ) , TRUE ) ; /∗ f e l o s z t j u k negy egyenlo r e s z r e , b e l e t e s z u n k harom cimket , es egy bezaro gombot ∗/ FuggolegesOsztas = gtk vbox new (TRUE, 0 ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( NevjegyAblak ) , FuggolegesOsztas ) ; BemutatkozoCimke = g t k l a b e l n e w ( ( ” L i t t l e memory−game from NeverGone” ) ) ; g t k b o x p a c k s t a r t (GTK BOX ( FuggolegesOsztas ) , BemutatkozoCimke , TRUE, TRUE, 0 ) ; KeszitoneveCimke = g t k l a b e l n e w ( ”The NeverGone” ) ; g t k l a b e l s e t m a r k u p ( GTK LABEL ( KeszitoneveCimke ) , ”The NeverGone” ) ; g t k b o x p a c k s t a r t (GTK BOX ( FuggolegesOsztas ) , KeszitoneveCimke , TRUE, TRUE, 0 ) ; KeszitoemailCimke = g t k l a b e l n e w ( ” n e v e r @ d e l f i n . unideb . hu” ) ; g t k l a b e l s e t m a r k u p ( GTK LABEL ( KeszitoemailCimke ) , ”n e v e r @ d e l f i n . unideb . hu” ) ; g t k b o x p a c k s t a r t (GTK BOX ( FuggolegesOsztas ) , KeszitoemailCimke , TRUE, TRUE, 0 ) ; NevjegyBezaras = g t k b u t t o n n e w f r o m s t o c k ( GTK STOCK CLOSE ) ; g t k b o x p a c k s t a r t (GTK BOX ( FuggolegesOsztas ) , NevjegyBezaras , TRUE, TRUE, 0 ) ; /∗ h o z z a r e n d e l j u k a gombra k a t t i n t a s h o z az a b l a k b e z a r a s a t ∗/ g s i g n a l c o n n e c t ( NevjegyBezaras , ” c l i c k e d ” , G CALLBACK ( N e v j e g y B e z a r a s K a t t i n t ) , NULL ) ; /∗ m e g j e l e n i t j u k a n e v j e g y a b l a k o t ∗/ g t k w i d g e t s h o w a l l ( NevjegyAblak ) ; }
224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250
}
251 252 253 254 255 256 257 258
/∗ ha a nevjegy−a b l a k b e z a r a s a r a k a t t i n t o t t a k , v e g r e h a j t o d i k ∗/ void N e v j e g y B e z a r a s K a t t i n t ( ) { /∗ f e l s z a b a d i t j u k a n e v j e g y a b l a k o t , es b e a l l i t j u k , hogy u j r a megnyithato legyen ∗/ g t k w i d g e t d e s t r o y ( NevjegyAblak ) ; NevjegyLathato = 0 ; }
259 260
129
261 262 263 264 265 266 267 268 269
/∗ a kockakhoz h o z z a r e n d e l i a m e g f e l e l o kepet , de e l r e j t i oket ∗/ void K e p I n i c i a l i z a l a s ( ) { char FileNev [ 2 5 6 ] ; char Konverzio [ 1 0 ] ; int x , y ; GdkPixbuf ∗ PixBuf = NULL; GtkWidget ∗ Kep = NULL; GtkWidget ∗ HibaDialog = NULL; GError ∗ Hiba = NULL;
270
f o r ( y = 0 ; y < Y ; y++) f o r ( x = 0 ; x < X ; x ++) { /∗ a KepSzambol osszehozzuk a f a j l n e v e t , p l : 0 −−> 0 . svg , az e l e r e s i u t a t a c o n f i g . h −b s t r c p y ( FileNev , NEVER TILE IMAGESDIR ) ; s p r i n t f ( Konverzio , ”%d” , KockaTomb [ x ] [ y ] . KepSzam ) ; s t r c a t ( Konverzio , ” . svg ” ) ; s t r c a t ( FileNev , Konverzio ) ; /∗ l e t r e h o z u n k egy P i x b u f −ot , b e l e t o l t j u k a kepet , es h o z z a r e n d e l j u k a kockahoz ∗/ PixBuf = g d k p i x b u f n e w f r o m f i l e ( FileNev , &Hiba ) ; i f ( Hiba ) { /∗ ha nem s i k e r u l t valamelyik kep b e t o l t e s e , feldobunk egy f i g y e l m e z t e t o d i a l o g u s a b l a k HibaDialog = gtk message dialog new (GTK WINDOW ( MainWindow ) , GTK DIALOG DESTROY WITH PARENT , GTK MESSAGE ERROR, GTK BUTTONS CLOSE , ( ”Could not open p i c t u r e s . . . ! ” ) , FileNev ) ; g e r r o r f r e e ( Hiba ) ; /∗ ha majd r a k a t t i n t a n a k a gombra , b e z a r j u k a d i a l o g u s a b l a k o t ∗/ g s i g n a l c o n n e c t ( HibaDialog , ” response ” , G CALLBACK ( g t k w i d g e t d e s t r o y ) , NULL ) ; gtk widget show ( HibaDialog ) ; /∗ v i s s z a t e r u n k a fuggvenybol , hogy ne problemazzon t o b b e t a r e n d s z e r ∗/ return ; } Kep = gtk image new from pixbuf ( PixBuf ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( KockaTomb [ x ] [ y ] . Kocka ) , Kep ) ; KockaTomb [ x ] [ y ] . KockaKep = Kep ; } /∗ ha a programot az −−enable−debug o p c i o v a l f o r d i t o t t a k , akkor k i i r u n k par hasznos a d a t o # i f d e f i n e d (DEBUG) f o r ( y = 0 ; y < Y ; y++) { f o r ( x = 0 ; x < X ; x ++) { g p r i n t ( ”%d ” , KockaTomb [ x ] [ y ] . KepSzam ) ; } g p r i n t ( ”\n” ) ; } g p r i n t ( ( ”\ n V i s i b l e p i c t u r e s : ” ) ) ; # endif
271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308
}
309 310 311 312 313
/∗ ha valamelyik kockara k a t t i n t o t t a k , v e g r e h a j t o d i k ∗/ void K o c k a K a t t i n t a s ( GtkWidget ∗ KockaGomb , g p o i n t e r KockaMutato ) { KockaTipus ∗ K i v a l a s z t o t t K o c k a ;
314 315 316 317 318 319 320 321 322
K i v a l a s z t o t t K o c k a = KockaMutato ; /∗ ha engedjuk a kockakra va lo k a t t i n t a s t ∗/ i f ( K o c k a T i l t a s == 0 ) { /∗ ha a kockat l e van nyomva , m e g j e l e n i t j u k a kepet , e l l e n k e z o e s e t b e n e l t u n t e t j u k ∗/ i f ( ( g t k t o g g l e b u t t o n g e t a c t i v e (GTK TOGGLE BUTTON ( K i v a l a s z t o t t K o c k a −>Kocka ) ) ) == TRUE /∗ DARAB kockanal t o b b e t nem j e l e n i t u n k meg ∗/ i f ( KockaLathato < DARAB) { gtk widget show ( K i v a l a s z t o t t K o c k a −>KockaKep ) ; 130
K i v a l a s z t o t t K o c k a −>L a t h a t o = BENYOMOTT; KockaLathato ++; E l l e n o r i z ( K i v a l a s z t o t t K o c k a −>KepSzam ) ;
323 324 325
} else /∗ ha f e l van f o r d i t v a DARAB szamu kocka , de nem l e v e h e t o e k , akkor a mar a nyomogomb s g t k t o g g l e b u t t o n s e t a c t i v e (GTK TOGGLE BUTTON ( K i v a l a s z t o t t K o c k a −>Kocka ) , FALSE ) ;
326 327 328 329
} else { i f ( KockaLathato ! = DARAB) { g t k w i d g e t h i d e ( K i v a l a s z t o t t K o c k a −>KockaKep ) ; K i v a l a s z t o t t K o c k a −>L a t h a t o = LATHATO; KockaLathato −−; } } # i f d e f i n e d ( DEBUG INFO ) g p r i n t ( ”%d ” , KockaLathato ) ; # endif
330 331 332 333 334 335 336 337 338 339 340
} /∗ ha l e van t i l t v a a kockakra va lo k a t t i n t a s , nem engedjuk , hogy a gomb a k t i v f l a g −e t k e l s e g t k t o g g l e b u t t o n s e t a c t i v e (GTK TOGGLE BUTTON ( K i v a l a s z t o t t K o c k a −>Kocka ) , FALSE ) ;
341 342 343 344
}
345 346 347 348 349 350 351 352 353 354 355 356 357
/∗ e l l e n o r i z z u k az a d a t s z e r k e z e t e t , hogy m e g t a l a l t a k −e az azonos mezoket ∗/ void E l l e n o r i z ( i n t MilyenSzamu ) { /∗ az azonos elemek X k o r d i n a t a j a t t a r o l j u k benne ∗/ i n t XX[DARAB ] ; /∗ az azonos elemek Y k o r d i n a t a j a t t a r o l j u k benne ∗/ i n t YY[DARAB ] ; i n t x , y , Index ; /∗ ez csak az s p r i n t f ( ) k o n v e r z i o j a m i a t t k e l l ∗/ char LevettKockaSzoveg [ X ] ; GtkWidget ∗ S i k e r e s D i a l o g = NULL; GtkWidget ∗ LevettKockaCimke = NULL; /∗ akkor igy ugyanazt a nevet k a p j a ∗/
358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384
f o r ( x = 0 ; x < DARAB; x ++) { XX[ x ] = −1; YY[ x ] = −1; } /∗ megkeressuk azokat a kockakat , melyek l e vannak nyomva , es azonos a r a j t u k l e v o kep a x = y = Index = 0 ; while ( ( y < Y ) && ( Index < DARAB) ) { while ( ( x < X ) && ( Index < DARAB) ) { i f ( ( KockaTomb [ x ] [ y ] . KepSzam == MilyenSzamu ) && ( KockaTomb [ x ] [ y ] . L a t h a t o == BENYOMOTT) ) XX[ Index ] = x ; YY[ Index ] = y ; Index ++; } x ++; } x = 0; y ++; } /∗ ha az o s s z e s olyan kocka l e van nyomva , amelynek azonos a kepe a mostanival , i n a k t i v a k i f ( Index == DARAB) { f o r ( x = 0 ; x < DARAB; x ++) { g t k w i d g e t s e t s e n s i t i v e ( KockaTomb [XX[ x ] ] [ YY[ x ] ] . Kocka , FALSE ) ; } KockaLevett += DARAB; KockaLathato −= DARAB; /∗ m e g v a l t o z t a t j u k a foablakban a cimke f e l i r a t a t a l e v e t t kockak szamara ∗/ 131
LevettKockaCimke = ( GtkWidget ∗ ) g o b j e c t g e t d a t a ( G OBJECT ( MainWindow ) , ” LevettKockaCim s p r i n t f ( LevettKockaSzoveg , ”%d” , KockaLevett ) ; g t k l a b e l s e t t e x t ( GTK LABEL ( LevettKockaCimke ) , LevettKockaSzoveg ) ;
385 386 387
} /∗ ha l a t h a t o DARAB szamu kocka , de nem azonos a kep r a j t u k , MEDDIG masodperc utan v i s s z a e l s e i f ( KockaLathato == DARAB) i f ( M e g j e l e n i t e s i M a s o d p e r c == 0 ) { M e g j e l e n i t e s i M a s o d p e r c = MasodpercSzamlalo ; /∗ l e t i l t j u k a kockakra v a lo k a t t i n t a s t ∗/ KockaTiltas = 1 ; } /∗ ha az o s s z e s kocka l e van veve , akkor nagyon szuper . . . feldobunk egy d i a l o g u s a b l a k o t . . i f ( ( KockaLathato == 0 ) && ( KockaLevett == KEP ∗ DARAB) ) { S i k e r e s D i a l o g = gtk message dialog new (GTK WINDOW ( MainWindow ) , GTK DIALOG DESTROY WITH PARENT , GTK MESSAGE INFO , GTK BUTTONS CLOSE , ( ” Victory , Congratulations . . . ! ” ) ) ; /∗ ha majd r a k a t t i n t a n a k a gombra , b e z a r j u k a d i a l o g u s a b l a k o t ∗/ g s i g n a l c o n n e c t ( S i k e r e s D i a l o g , ” response ” , G CALLBACK ( g t k w i d g e t d e s t r o y ) , NULL ) ; gtk widget show ( S i k e r e s D i a l o g ) ; }
388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406
}
407 408 409 410 411 412 413 414 415 416 417 418
/∗ i n i c i a l i z a l j u k a s z a l k e z e l e s t es az i d o z i t o t ∗/ void I d o z i t o I n i t ( ) { /∗ i n i c i a l i z a l j u k a GLib t i p u s a i t es k o r n y e z e t e t ∗/ g type init ( ) ; /∗ i n i c i a l i z a l j u k a GLib es a GDK s z a l k e z e l e s e t ∗/ g t h r e a d i n i t (NULL ) ; gdk threads init ( ) ; /∗ l e t r e h o z u n k egy i d o z i t e s t , ami masodpercenkent v e g r e h a j t egy a d o t t fuggvenyt ∗/ I d o z i t o A z o n o s i t o = g t k t i m e o u t a d d ( 1 0 0 0 , ( GtkFunction ) I d o z i t e t t F u g g v e n y , NULL ) ; }
419 420 421 422 423 424 425 426 427 428 429 430
/∗ ez a fuggveny masodpercenkent fog l e f u t n i , ahanyszor csak meghivja az i d o z i t o ∗/ e x t e r n g i n t I d o z i t e t t F u g g v e n y ( g p o i n t e r adatok ) { GtkWidget ∗ E l t e l t I d o C i m k e ; /∗ i t t f o g j u k majd az e l t e l t i d o t szovegesen o s s z e a l l i t a n i ∗/ char IdoSzoveg [ 2 0 ] ; /∗ v a l t o z o k a nap , ora , perc , masodperc szamszeru t a r o l a s a h o z ∗/ g i n t Nap , Ora , Perc , Masodperc ; gulong IdoMaradek ; /∗ v a l t o z o k a k o r d i n a t a k t a r o l a s a r a ∗/ int x , y ;
431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446
/∗ belepunk egy u j s z a l b a , hogy a cimken tudjuk v a l t o z t a t n i az e l t e l t ido merteket ∗/ gdk threads enter ( ) ; /∗ ha l e t e l t az idotartam , amig l a t n i engedjuk a nem azonos , de f e l f o r d i t o t t kockakat , a l a i f ( ( M e g j e l e n i t e s i M a s o d p e r c + MEDDIG == MasodpercSzamlalo ) && ( M e g j e l e n i t e s i M a s o d p e r c ! = f o r ( y = 0 ; y < Y ; y++) f o r ( x = 0 ; x < X ; x ++) { g t k w i d g e t h i d e ( KockaTomb [ x ] [ y ] . KockaKep ) ; g t k t o g g l e b u t t o n s e t a c t i v e (GTK TOGGLE BUTTON ( KockaTomb [ x ] [ y ] . Kocka ) , FALSE ) ; KockaTomb [ x ] [ x ] . L a t h a t o = LATHATO; } KockaLathato −= DARAB; MegjelenitesiMasodperc = 0 ; /∗ engedelyezzuk a kockakra v al o k a t t i n t a s t ∗/ KockaTiltas = 0 ; } 132
/∗ mivel a szamlalo 0− r o l indul , e z e r t rogton megnoveljuk a masodperc−szamlalo e r t e k e t ∗/ MasodpercSzamlalo ++; /∗ k i o l v a s s u k az e l t a r o l t cimke m u t a t o j a t , hogy tudjunk h i v a t k o z n i r a ∗/ E l t e l t I d o C i m k e = ( GtkWidget ∗ ) g o b j e c t g e t d a t a ( G OBJECT ( MainWindow ) , ” E l t e l t I d o C i m k e ” ) /∗ k i o l v a s s u k a program f u t a s a o t a e l t e l t i d o t , es e l t a r o l j u k a valtozokban ∗/ Nap = MasodpercSzamlalo / 8 6 4 0 0 ; IdoMaradek = MasodpercSzamlalo % 8 6 4 0 0 ; Ora = IdoMaradek / 3 6 0 0 ; IdoMaradek = IdoMaradek % 3 6 0 0 ; Perc = IdoMaradek / 6 0 ; Masodperc = IdoMaradek % 6 0 ; /∗ a s z t r i n g b e ” beleformazzuk ” az ido−e r t e k e k e t ∗/ s p r i n t f ( IdoSzoveg , ”%02d:%02d:%02d:%02d” , Nap , Ora , Perc , Masodperc ) ; /∗ a f o a b l a k cimkejen m e g j e l e n i t j u k a program i n d i t a s a o t a e l t e l t i d o t ∗/ g t k l a b e l s e t t e x t ( GTK LABEL ( E l t e l t I d o C i m k e ) , IdoSzoveg ) ; /∗ f r i s s i t i az X p u f f e r e t , azaz u j r a r a j z o l j a a kepet ∗/ gdk flush ( ) ; /∗ e l h a g y j u k az u j s z a l a t , amelybe beleptunk ∗/ gdk threads leave ( ) ; /∗ ha a v i s s z a t e r e s i e r t e k TRUE, akkor az i d o z i t o tovabbra i s meghivodik , e l l e n k e z o e s e t b e /∗ ha az o s s z e s kockat l e v e t t u k , az i d o z i t o t nem k e l l t o b b e t meghivni ∗/ i f ( ( KockaLathato == 0 ) && ( KockaLevett == KEP ∗ DARAB) ) r e t u r n FALSE ; e l s e r e t u r n TRUE ;
447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469
}
133
134
135
13.
Feluletelemek ¨ tulajdons´againak be´all´ıt´asa (angolban: 133. o)
14.
Jegyzetek
˝ od´ ¨ ese nem teljesen vil´agos, mi´ert jo´ a felcser´elt sorrend, mi´ert jobb A g_signal_connect_swapped() muk mint a g_signal_connect()??
15.
Tutorial Copyright and Permissions Notice
The GTK Tutorial is Copyright (C) 1997 Ian Main. Copyright (C) 1998-2002 Tony Gale. The GTK Tutorial Hungarian Translation is Copyright (C) 2007 Bal´azs Ny´ır˝o. ¨ o grafikus feluletet ¨ A GTK oktato´ magyar ford´ıt´as´anak c´elja a Linuxra k´eszul˝ haszn´alo´ programk´esz´ıt´es t´amogat´asa volt. Nyugodtan haszn´alj´ak el˝oad´asokon, gyakorlatokon, m´asolj´ak - e´ s e´ p´ıt˝o jelleggel seg´ıtsenek ¨ on ¨ om. ¨ a jav´ıt´as´an. Kosz Permission is granted to make and distribute verbatim copies of this manual pro- vided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this document under the conditions for verbatim copying, provided that this copyright notice is included exactly as in the original, and that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this document into another language, under the above conditions for modified versions. If you are intending to incorporate this document into a published work, please contact the maintainer, and we will make an effort to ensure that you have the most up to date information available. There is no guarantee that this document lives up to its intended purpose. This is simply provided as a free resource. As such, the authors and maintainers of the information provided within can not make any guarantee that the information is even accurate.
136