V prvem delu smo se razjasnili glede izrisa gradnikov in poiskali kodo, ki sproži izris glavnega okna. Sedaj pa bomo pogledali dejansko kodo, ki izriše okno.

Ko program želi prikazati okno, ga ne mora direktno izrisati na zaslon, ampak kliče posebno funkcijo za X strežnik, ta pa ustvari novo “površino” in jo prikaže. Upravitelj oken pa poskrbi za okvir in naslovnico okoli okna. Tukaj Gtk+ nima vpliva razen tega, da je sprožil to dogajanje. Torej X strežnik oz. odjemalska knjižnica Xlib poskrbi da ima gtk+ neko površino, na katero ima dovoljenje za risanje. Tukaj se pa nato sproži “expose” signal okna, ki nato izriše njegovo ozadje. Nato se sproži rekurzivna funkcija, ki še hierarhično izrisuje vse otroke (gradnike znotraj okna) in sprožuje njihov “expose” signal.

Ker pa ne želimo stikati po gtk+ izvorni kodi, si raje izberemo pogon, ki ga bomo spremenili. Pa vzemimo pogon Murrine. Ta pogon vse izrise opravlja preko cairo vektorske knjižnice in trenutno velja za najbolj prilagosdljiv pogon.

V pogonu sedaj iščemo funkcijo , ki pripada klicu draw_flat_box(). V izvorni kodi jo najdemo v datoteki murrine_style.c pod imenom murrine_style_draw_flat_box(). Nekje v vrstici 1551 v isti datoteki pa tudi vidimo, kako pogon prevzame klice na funkcijo draw_flat_box() z:

style_class->draw_flat_box = murrine_style_draw_flat_box;

Torej omenjeno funkcijo bodo klicali vsi gradniki, ki bodo potrebovali nek pobarvan okvir. Mi pa želimo gladke robove omejiti samo na okna, zato moramo preverjati, da bo izris robov samo pri gradnikih vrste GtkWindow. Pogon murrine ima že spisano funkcijo, ki z cairo funkcijami ustvari pravokotnik z glajenimi robovi. Zato to tudi uporabimo. Pred koncem funkcije vstavimo naslednjo kodo:


if (GTK_IS_WINDOW(widget)) {
cairo_t *cr = murrine_begin_paint (window, area);
int x, y, w, h, d;

cairo_set_source_rgb(cr, 0.5, 0.5, 0.5);
gdk_window_get_geometry(window, &x, &y, &w, &h, &d);
clearlooks_rounded_rectangle (cr, 0, 0, w, h, 20.0, MRN_CORNER_TOPLEFT | MRN_CORNER_TOPRIGHT | MRN_CORNER_BOTTOMRIGHT | MRN_CORNER_BOTTOMLEFT);

cairo_fill(cr);
cairo_destroy (cr);
}

Tukaj smo najprej preverili, če je funkcijo murrine_style_draw_flat_box() klicalo glavno okno. Nato iz okna pridobimo cairo podlago za risanje. Nastavimo barvo na sivo in narišemo pravokotnik. Spremenjen pogon prevedemo in namestimo (make && sudo make install). In kar takoj, ko temo uveljavimo, vidimo spremembe:
Shrani.si

Se pravi da smo na pravi poti. Gladki robovi se res izrišejo. Sedaj pa je potrebno tisti preostanek pri robovih odstraniti, da bo skozi vidno ozadje.

Nadaljevanje v tretjem delu.

Post a Comment

*
*