2006.02_Diagram części Twojego komputera_[Programowanie].pdf

(576 KB) Pobierz
439112119 UNPDF
programowanie
Diagram części
Twojego komputera
Marek Sawerwain
się napisaniem programu,
który będzie wyświetlał
kilka podstawowych in-
formacji o komputerze, na którym został
uruchomiony (będą one dotyczyć typu pro-
cesora, karty graicznej oraz muzycznej).
Nie będziemy tych danych wyświetlać
w postaci tylko i wyłączenie tekstowej,
ale postaramy się o utworzenie nieskompli-
kowanego diagramu.
Program napiszemy dla środowiska
GNOME. „Wielka stopa” posiada w swym
arsenale jeden bardzo przydatny widget
– jest nim obiekt Canvas . Znakomicie
nadaje się on do tworzenia diagramów,
więc warto wykorzystać bogate możli-
wości tej kontrolki we własnym pro-
gramie.
Pętla GUI jest realizowana samo-
dzielnie przez GNOME, więc tuż po wy-
konaniu funkcji gtk_main() kontrolę nad
naszym programem przejmuje środo-
wisko graiczne. Nie musimy się trosz-
czyć np. o przewijanie zawartości okna
z diagramem bądź jego odświeżanie
– tym zajmuje się GNOME oraz biblio-
teka GTK+.
Utworzenie interfejsu
Interfejs programu, podobnie jak w po-
przednich aplikacjach, które opisywali-
śmy na łamach Linux+, tworzymy za
pomocą Glade i nie korzystamy z pliku
glade , ale z kodu wygenerowanego samo-
czynnie przez „budowniczego interfejsu”
po wybraniu przycisku Buduj (ang. Build ).
Tym razem jest to projekt GNOME, więc
nie ograniczamy się tylko i wyłącznie do
biblioteki GTK+. Z tego powodu inicjali-
zacja systemu GUI dokonywana w fun-
kcji main zaczyna się w następujący spo-
sób:
Budowa naszego programu
Na początku warto dokładnie prześle-
dzić, jakie czynności należy wykonać
w tworzonym programie. Pokazuje to
Rysunek 1. Tym razem nie musimy kon-
struować specjalnej pętli, aby śledzić zda-
rzenia pojawiające się w trakcie funk-
cjonowania programu, gdyż nasz pro-
gram tylko raz rysuje diagram. Z tego
powodu pierwsze czynności to inicjaliza-
cja biblioteki Kudzu oraz interfejsu użyt-
kownika. Najważniejsze zagadnienie to
odczyt informacji, które mają pojawić się
na tworzonym diagramie, oraz naryso-
wanie samego diagramu. W związku
z tym, z obiektu „rysowanie diagramu”
wychodzi pięć pozostałych obiektów, które
reprezentują funkcje odpowiedzialne za
zbieranie informacji o poszczególnych
komponentach.
S
argc, argv, GNOME_PARAM_
S
S
APP_DATADIR, NULL, NULL);
DVD
Po uruchomieniu Linux+ Live
DVD można przetestować
stworzoną aplikację oraz ją
samodzielnie przekompilować.
W ten sposób nasz program staje się peł-
noprawnym programem dla środowiska
GNOME. Po wywołaniu tej funkcji two-
rzymy okno główne naszej aplikacji:
Na płycie CD/DVD
Na płycie CD/DVD znajduje się
kod źródłowy programu.
MainWin = create_MainWin ();
Jest to, jak widać, identyczna czynność
jak przy programach korzystających tylko
38 luty 2006
W tym miesiącu zajmiemy
gnome_program_init
("harddraw", "1.0",
LIBGNOMEUI_MODULE,
439112119.053.png 439112119.064.png 439112119.075.png
 
439112119.001.png 439112119.006.png 439112119.007.png 439112119.008.png 439112119.009.png 439112119.010.png 439112119.011.png 439112119.012.png 439112119.013.png
 
C/C++/Canvas/Kudzu
programowanie
Kompilacja programu
Do kompilacji programu wszystkie po-
trzebne pakiety z pewnością znajdują się
w dystrybucji używanej przez Czytelni-
czkę/Czytelnika. GNOME to element stały
dla znakomitej większości dystrybucji, po-
dobnie jak biblioteka Kudzu. Jest ona sto-
sowana do wykrywania sprzętu i jego
koniguracji podczas inicjacji systemu.
Z tego powodu warto sprawdzić, czy w sys-
temie, w którym chcemy skompilować
opisywany w artykule program, znajdują
się pakiety dla developerów.
Najprostszy skrypt makeile , który
przeprowadzi kompilację, może przedsta-
wiać się następująco:
Podczas tworzenia interfejsu w Glade nie
zostały określone wymiary diagramu,
a dokładniej obszaru, na jakim będzie on
rysowany. Robimy to teraz w następują-
cy sposób:
Listing 1. Odczyt ilości dostępnej
pamięci RAM
void total_memory_get () {
int linelen ;
FILE * f = NULL ;
f = fopen ( "/proc/meminfo" , "r" );
if ( f != NULL ) {
getline (& tmp01 ,
gnome_canvas_set_scroll_region
S
(GNOME_CANVAS (CanvasArea),
-300, 0, 800, 400);
S
Kolejne czynności to uzyskiwanie infor-
macji oraz rysowanie samego diagramu
(funkcja canvas_setup() ). Po narysowaniu
diagramu podłączamy dodatkowe sygna-
ły. Jest to m.in. obsługa przycisku zamy-
kania okienka. Funkcją gtk_widget_show
(MainWin); wyświetlamy okno programu
na ekranie. Ostatnim krokiem jest urucho-
mienie głównej pętli GUI, jak zwykle funk-
cją gtk_main(); .
& linelen , f );
tmp01 [ strlen ( tmp01 )- 1 ]= 0 ;
strcpy (& totalmemory [ 0 ] ,
S
strstr ( tmp01 , ":" )+ 7 );
if ( tmp01 ) free ( tmp01 );
}
fclose ( f );
}
all:
gcc -c src/interface.c
S
-I./src `pkg-conig --clags
S
Następne wyrażenie, jak widzimy z Listin-
gu 1, wpisuje 0 na końcu zmiennej tmp01 ,
w której jest przechowywana informa-
cja o dostępnej pamięci – przedstawia
się ona w następujący sposób tekst :
liczba . Naszym zadaniem jest uzyska-
nie liczby, więc wystarczy odczytać tekst
leżący na prawo od dwukropka. W tym
celu znakomicie nadaje się funkcja strstr .
Ostatecznie, umieszczenie w zmiennej
totalmemory poprawnej wartości sprowa-
dza się do następującej linii kodu:
S
gtk+-2.0 libgnomeui-2.0`
Odczytanie informacji
o dostępnej pamięci RAM
i procesorze
Uzyskanie informacji o dostępnej pamię-
ci RAM oraz podstawowych informacji
o procesorze to zadania względnie łatwe,
pod warunkiem, że wiemy, gdzie szukać
tego typu informacji. Najlepszym źródłem
jest katalog /proc oraz dwa następują-
ce pliki: meminfo , w którym, zgodnie z naz-
wą, znajdują się informacje o pamięci,
oraz cpuinfo , gdzie zawarte są wszystkie
najważniejsze informacje na temat proce-
sora.
Listing 1 przedstawia kod krótkiej
funkcji, która odczytuje informacje o dos-
tępnej pamięci RAM. Plik /proc/meminfo
to plik tekstowy, a potrzebne nam infor-
macje znajdują się w pierwszej linii pli-
ku.
S
-I./src `pkg-conig --clags
S
S
gtk+-2.0 libgnomeui-2.0`
S
-I./src `pkg-conig --clags
S
S
gtk+-2.0 libgnomeui-2.0`
S
interface.o support.o -lkudzu
S
S
gthread-2.0 gtk+-2.0 libgnomeui-2.0`
S
strstr(tmp01,":")+7);
strcpy(&totalmemory[0],
-lpci `pkg-conig --libs
Dwie pierwsze linie kompilują kod wygene
rowany przez program Glade. Trzecia li-
nia reguły all jest odpowiedzialna za kom-
pilację kodu naszej aplikacji. Ostatnia
czwarta linia dokonuje konsolidacji osta-
tecznej postaci programu. Ponieważ używa-
my biblioteki Kudzu, musimy dołączyć dwie
istotne biblioteki: -lkudzu -lpci . Pierwsza
z nich jest bezpośrednio odpowiedzial-
na za bibliotekę, a druga dołącza funk-
cje do poprawnej obsługi szyny PCI, gdyż
większość urządzeń jest podłączona wła-
śnie za pomocą PCI (w pewnym sensie
nawet karta graiczna, choć podłączona
przez AGP, jest także widziana z poziomu
szyny PCI).
Warto jeszcze dopowiedzieć, w jakim
celu należy do wyniku strstr dodać war-
tość siedem – w ten sposób przesuwa-
my wskaźnik o siedem znaków, które są
w rzeczywistości spacjami.
Odczytanie informacji o procesorze
odbywa się w dość podobny sposób, co
potwierdza Listing 2. Tym razem musimy
odczytać więcej linii tekstu, ale potrzebne
będą nam tylko cztery.
Sposób postępowania w tym przy-
padku różni się tylko obecnością pętli
for , w której odczytujemy linię tekstu za
pomocą getline . Umieszczamy zero na
końcu tekstu, a następnie przydzielamy
pamięć odpowiedniemu elementowi w ta-
blicy info :
Każdy, kto po raz pierwszy zajrzy
do katalogu proc , zawsze się dziwi, iż
większość plików jest zerowej długo-
ści. Plik meminfo także posiada taki roz-
miar, ale zawiera cenne informacje. Ich
wydobycie zaczynamy od otworzenia
pliku, tak jak to czynimy z każdym in-
nym plikiem:
f=fopen("/proc/meminfo", "r");
i wyłączenie z GTK+. Następnym krokiem
jest uzyskanie referencji do widgetu:
Po sprawdzeniu, czy udało się ten plik
otworzyć, wystarczy odczytać jedną linię
tekstu za pomocą funkcji getline (jest to
funkcja standardowa, a jej prototyp znaj-
duje się w pliku stdio.h ):
info[i]=malloc(strlen(tmp01)-1);
S
(MainWin, "CanvasArea");
Pozostaje nam jeszcze tylko skopiować
fragment tekstu na prawo od dwukropka:
getline(&tmp01, &linelen, f);
strcpy(info[i], strstr(tmp01,":")+2);
www.lpmagazine.org
39
S
-I./include
gcc -c src/support.c
-I./include
gcc -c maincode.c
-I./include
gcc -o harddraw maincode.o
CanvasArea=lookup_widget
439112119.014.png 439112119.015.png 439112119.016.png 439112119.017.png 439112119.018.png 439112119.019.png 439112119.020.png 439112119.021.png 439112119.022.png
programowanie
Listing 2. Odczyt informacji o procesorze
z pliku /proc/cpuinfo
wszystkich urządzeń, gdyż skupimy się
na napędach optycznych, dyskach twar-
dych, kartach dźwiękowych oraz kartach
graicznych.
W programie funkcje zajmujące się
uzyskaniem tych informacji posiadają
następujące nazwy: cdrom_list() , hd_
list() , audio_list() oraz video_list() .
Wszystkie funkcje są zbudowane w dość
podobny sposób, jak zostało to pokazane
na Listingu 3. Dla przykładu opiszę, w jaki
sposób odczytujemy informacje o dostęp-
nych napędach optycznych.
W pierwszej kolejności należy odpo-
wiednio zadeklarować zmienną, w której
znajdzie się lista dostępnych urządzeń:
struct device **devlist; . Kolejnym
ważnym krokiem jest uzyskanie listy
urządzeń należących do potrzebnej klasy.
Ponieważ interesują nas napędy optyczne,
to ta klasa urządzeń jest reprezentowana
przez stałą CLASS_CDROM . Ostatecznie, aby
uzyskać listę urządzeń, wystarczy skorzy-
stać z funkcji probeDevices . Sprawdzi ona,
czy w systemie są dostępne urządzenia
określonego typu bez ich inicjalizacji oraz
koniguracji:
for (x = 0; devlist[x]; x++)
S
{// treść pętli }
void get_cpu_info () {
int i , linelen ;
FILE * f = NULL ;
f = fopen ( "/proc/cpuinfo" , "r" );
if ( f != NULL ) {
tmp01 = NULL ;
for ( i = 0 ; i < 18 ; i ++) {
getline (& tmp01 , & linelen , f );
tmp01 [ strlen ( tmp01 )- 1 ]= 0 ;
info [ i ]= malloc ( strlen
Funkcja probeDevices tak konstruuje listę,
iż po ostatnim wpisie zostaje umieszczona
wartość NULL. W pętli, jak widać, wyko-
rzystujemy ten fakt, aby opisać warunek
zakończenia pętli, podając tylko wyraże-
nie devlist[x] .
Treść pętli dla urządzeń typu CD-
ROM przedstawia się następująco:
S
sprintf(tmptxt, "device: /dev/
S
S
S
->desc); strcat(&cdromdesc[0],
S
strstr ( tmp01 , ":" )+ 2 );
}
if ( tmp01 ) free ( tmp01 );
}
fclose ( f );
}
->device, devlist[x]
S
&tmptxt[0]); cdrom_count++;
W pierwszej linii kodu instrukcją sprintf
tworzymy dwie linie tekstu, gdzie umie-
szczamy nazwę urządzenia, do którego
podłączony jest napęd CD-ROM. Od-
czytujemy także nazwę symboliczną, przy-
czym zazwyczaj będzie to nazwa pro-
ducenta, oznaczenie napędu itd. Uzyskane
dwie linie tekstu są umieszczane w zmien-
nej tmptxt , a jej zawartość jest dołącza-
na do zmiennej tekstowej cdromdesc .
Zwiększamy także licznik napędów CD-ROM
dostępnych w systemie – cdrom_count .
W ten sposób za pomocą Kudzu uzyska-
my informacje o tym, ile napędów jest
dostępnych w systemie, w którym został
uruchomiony program.
W podobny sposób uzyskujemy in-
formacje o pozostałych komponentach.
W ten sposób odczytamy wszystkie osiem-
naści linii z pliku.
Informacje
z systemu Kudzu
Pozostałe informacje o tym, co znajduje
się w komputerze, uzyskamy za pomocą
biblioteki Kudzu . W naszym programie,
aby zastosować pochodzące z niej funkcje,
należy dołączyć odpowiedni plik nagłów-
kowy:
S
( CLASS_CDROM, probeBus, PROBE_ALL);
Wszystkie dostępne urządzenia znajdą się
w tablicy devlist , którą możemy przeglą-
dać oraz odczytywać potrzebne informa-
cje. Najłatwiej tę czynność wykonać za
pomocą pętli for :
#include <kudzu/kudzu.h>
Zanim uzyskamy listę urządzeń znajdu-
jących się w komputerze, należy zaini-
cjalizować w odpowiedni sposób system
Kudzu:
initializeDeviceList();
initializeBusDeviceList(probeBus);
Warto zwrócić uwagę na to, w jaki sposób
została zadeklarowana zmienna probeBus :
S
BUS_UNSPEC & ~BUS_SERIAL;
Oznacza to, iż Kudzu będzie przeszuki-
wać urządzenia znajdujące się na dowol-
nej szynie, ale nie będzie to złącze sze-
regowe (tzw. porty COM, które ostat-
nio już wychodzą z użycia). Po inicjali-
zacji Kudzu jesteśmy gotowi do odczy-
tu urządzeń. Nie będziemy odczytywać
Rysunek 1. Najważniejsze zdarzenia w programie
40 luty 2006
%s\ndesc: %s\n", devlist[x]
( tmp01 )- 1 );
strcpy ( info [ i ] ,
devlist = probeDevices
enum deviceBus probeBus =
439112119.023.png 439112119.024.png 439112119.025.png
 
439112119.026.png 439112119.027.png 439112119.028.png 439112119.029.png 439112119.030.png 439112119.031.png 439112119.032.png 439112119.033.png 439112119.034.png 439112119.035.png 439112119.036.png 439112119.037.png 439112119.038.png 439112119.039.png 439112119.040.png 439112119.041.png 439112119.042.png 439112119.043.png 439112119.044.png 439112119.045.png 439112119.046.png 439112119.047.png 439112119.048.png 439112119.049.png 439112119.050.png 439112119.051.png 439112119.052.png 439112119.054.png 439112119.055.png 439112119.056.png 439112119.057.png 439112119.058.png 439112119.059.png 439112119.060.png 439112119.061.png 439112119.062.png 439112119.063.png 439112119.065.png 439112119.066.png 439112119.067.png 439112119.068.png 439112119.069.png 439112119.070.png 439112119.071.png 439112119.072.png 439112119.073.png 439112119.074.png 439112119.076.png 439112119.077.png 439112119.078.png 439112119.079.png
 
C/C++/Canvas/Kudzu
programowanie
Listing 3. Odczyt informacji o karcie graicznej z systemu Kudzu
Zanim przystąpimy do rysowania dia-
gramu, należy dysponować wskazaniem
na obiekt root widgetu AreaCanvas , w któ-
rym jest rysowany cały diagram. Uzys-
kanie obiektu root jest łatwe i przedstawia
się następująco:
void video_list () {
struct device ** devlist ;
int x ;
char tmptxt [ 512 ];
devlist = probeDevices ( CLASS_VIDEO , probeBus , PROBE_ALL );
if ( devlist ) {
for ( x = 0 ; devlist [ x ]; x ++) {
if ( strcmp ( devlist [ x ]-> driver , "unknown" )) {
sprintf ( tmptxt , "driver: %s \n desc: %s \n " ,
S
(GNOME_CANVAS (CanvasArea));
S
Później musimy wywołać funkcję video_
list . Jej zadaniem jest wykrycie typu
karty graicznej oraz utworzenie komu-
nikatu tekstowego, który znajduje się
w diagramie. Bezpośrednio po wywoła-
niu tej funkcji sprawdzamy, czy zmien-
na video_count jest większa od zera, co
oznacza, iż musimy wiedzieć, czy jakakol-
wiek karta graiczna została wykryta przez
Kudzu. Jeśli udało się poprawnie wykryć
kartę, to obliczamy przesunięcie wzglę-
dem osi Y. Jest to istotne, ponieważ wcze-
śniej wyświetlamy informacje o napędach
i dyskach. Ich ilość w systemie nie jest
naturalnie stała i można mieć np. jeden
napęd CDROM i dwa albo trzy dyski
twarde. Ponieważ wszystkie informacje
o napędach są wyrównane do prawej
strony, to zmienia się tylko ich pozycja
pionowa zapisywana w zmiennej last_y .
Odstęp pomiędzy poszczególnymi warto-
ściami wynosi dokładnie 10 punktów (nie
są to piksele, ale wewnętrzne jednostki
obiektu Canvas).
Narysowanie prostokąta jest równo-
ważne utworzeniu obiektu i w tym celu
devlist [ x ]-> driver , devlist [ x ]-> desc );
if ( strlen ( devlist [ x ]-> device ) > video_strlen )
S
video_strlen = strlen ( devlist [ x ]-> device );
if ( strlen ( devlist [ x ]-> desc ) > video_strlen )
S
video_strlen = strlen ( devlist [ x ]-> desc );
strcat (& videodesc [ 0 ] , & tmptxt [ 0 ]);
video_count ++;
}
}
}
freeDeviceList ();
}
Potwierdza to także Listing 3. Względem
przykładu, który omówiłem powyżej,
dodatkowo sprawdzamy długość ciągu
znaków opisujących urządzenie. Infor-
macja ta jest przydatna, aby na rysunku
utworzyć prostokąt odpowiedniej wiel-
kości, w którym zmieści się cały komu-
nikat.
wdę dwie czynności: odczytujemy infor-
macje o sprzęcie (w sposób opisany
w poprzednich akapitach) oraz doko-
nujemy wizualizacji tych informacji.
Jej fragmenty zostały przedstawione
na Listingu 4. Funkcja ta jest znacznie
dłuższa, ale technika rysowania poszcze-
gólnych fragmentów diagramy jest po-
dobna, więc przedstawię ją na przykła-
dzie karty graicznej.
Rysujemy diagram
Wiemy już, w jaki sposób odczytać po-
trzebne informacje – dzięki Kudzu może-
my uzyskać jeszcze więcej informacji
o sprzęcie, więc zachęcam do modyikacji
programu, np. dodając informację o karcie
sieciowej. Teraz należy zastanowić się,
w jaki sposób narysować diagram.
Jeden ze sposobów zdradza Rysunek 2.
Jak widać, w lewej dolnej części znajduje
się ikona komputera, z której za pomo-
cą strzałek wskazujemy na pozosta-
łe części diagramu. W odpowiednich
prostokątach prezentujemy informacje
o karcie graicznej i dźwiękowej, wyświe-
tlamy ilość dostępnej pamięci RAM
oraz kilka informacji o procesorze.
Dwa najwyżej umieszczone prostokąty
po prawej stronie odnoszą się do na-
pędów optycznych oraz twardych dys-
ków.
Funkcja, która zajmuje się rysowa-
niem diagramu, nosi nazwę canvas_
setup() . Wykonujemy w niej tak napra-
Rysunek 2. Przykładowy diagram sprzętowy wygenerowany przez program HardDraw
www.lpmagazine.org
41
root = gnome_canvas_root
439112119.080.png 439112119.081.png 439112119.082.png 439112119.083.png 439112119.084.png 439112119.085.png 439112119.086.png 439112119.087.png 439112119.088.png 439112119.089.png
programowanie
Listing 4. Najważniejsze fragmenty funkcji rysującej diagram
poprawne określenie szerokości prosto-
kąta. Warto w tym momencie raz jesz-
cze przeczytać Listing 3, aby zobaczyć,
w jaki sposób nadawana jest wartość tej
zmiennej.
Gdy prostokąt jest narysowany, to
drugie wywołanie konstruktora z funk-
cją gnome_canvas_text_get_type , która
odpowiada za obiekt reprezentujący
tekst, spowoduje, że w narysowanym
prostokącie zostanie umieszczony tekst
z krótkim opisem typu karty graicz-
nej. W przypadku obiektu canvas ważna
jest kolejność rysowania obiektów, gdyż
ten narysowany wcześniej może zostać
zakryty przez ten narysowany później.
W naszym przypadku celowo rysuje-
my w pierwszej kolejności prostokąt,
a dopiero później dodajemy komunikat
tekstowy.
void canvas_setup () {
char txt [ 512 ];
double last_x = 0 , last_y = 0 ;
root = gnome_canvas_root ( GNOME_CANVAS ( CanvasArea ));
/* usunięte fragmenty */
/* video list box */
video_list ();
video_strlen =( video_strlen + 4 )* 10 ;
if ( video_count > 0 ) {
videos_x = 210 ;
if ( last_y == 0 )
last_y = 30 ;
else
last_y += 10 ;
videos_y = last_y ;
last_y = videos_y +( audio_count )* 50 ;
videos_box = gnome_canvas_item_new ( root , gnome_canvas_
S
rect_get_type () , "x1" , videos_x , "y1" , videos_y ,
S
Strzałki
Ostatnie zadanie, które wykonujemy w funk-
cji canvas_setup , to narysowanie strzałek
pomiędzy ikoną komputera a poszcze-
gólnymi prostokątami. Jak widać na Ry-
sunku 2, w zależności od miejsca umiesz-
czenia prostokąta, strzałki są skierowa-
ne albo w ścianę dolną, albo w lewą.
Przykładowe wywołanie funkcji draw_
arrow jest następujące:
S
"outline_color" , "black" , "ill_color" , "white" ,
"width_pixels" , 2 , NULL );
gnome_canvas_item_new ( root , gnome_canvas_text_get_type () ,
S
S
"y" , videos_y +( video_count )* 30 ,
S
S
"justiication" , GTK_JUSTIFY_CENTER ,
"font" , "monospace bold 10" ,
S
S
"ill_color" , "irebrick" ,
NULL );
}
/* usunięte fragmenty */
/* arrow to boxes */
draw_arrow ( cpu_box , - 95 , 290 , 0 );
/* pozostałe strzałki */
}
draw_arrow(cpu_box, -95, 290,0);
Pierwszy argument to obiekt prostokąt, do
którego chcemy skierować strzałkę. Dwie
następne wielkości to współrzędne począt-
ku. W ostatnim argumencie umieszcza-
my numer ściany, do której ma być skiero-
wana strzałka. Zero oznacza ścianę dolną,
a jedynka ścianę lewą.
Technika rysowania strzałki jest dość
prosta i sprowadza się odczytania współ-
rzędnych x1 , y1 , x2 , y2 obiektu, do którego
chcemy skierować strzałkę:
wykorzystujemy uniwersalny konstruktor
o nazwie gnome_canvas_item_new :
prostokąt umieścić pod poprawnymi
współrzędnymi. Lewy górny róg to
parametry o nazwach x1 , y1 , natomiast
x2 , y2 to prawy dolny róg. Jak widać,
wykorzystujemy zmienną video_count ,
choć naturalnie w przypadku kart gra-
icznych zazwyczaj mamy do czynie-
nia tylko z jedną. Podobna zmienna
jest potrzebna w przypadku twardych
dysków oraz dla napędów optycznych.
Jej wartość decyduje o wysokości prosto-
kąta. W ten sposób opis urządzeń będzie
w całości mieścił się w rysowanym pro-
stokącie. Podobne znaczenie pełni
zmienna video_strlen . Ponieważ kartę
graiczną opisujemy dwiema liniami
tekstu, w zmiennej video_strlen jest
zawarta ilość znaków dłuższej z linii.
Znajomość tej wartości pozwala nam na
videos_box = gnome_canvas_item_new
S
S
S
"x1",videos_x,"y1", videos_y,
get_type (),
S
S
S
"y2", videos_y+(video_count)*50,
tx1 = GNOME_CANVAS_RECT
"x2", videos_x+video_strlen,
S
(dst_box)->re.x1;
ty1 = GNOME_CANVAS_RECT
S
S
S
"width_pixels", 2, NULL);
(dst_box)->re.y1;
tx2 = GNOME_CANVAS_RECT
S
"ill_color", "white",
(dst_box)->re.x2;
ty2 = GNOME_CANVAS_RECT
S
Pierwszy argument to obiekt root ,
a następnym jest typ zwracany przez
funkcję. W naszym przypadku funkcja
gnome_canvas_rect_get_type reprezen-
tuje prostokąt (ang. rectangle ). Później
następują parametry niezbędne, aby
(dst_box)->re.y2;
Drugi etap to wyznaczenie dwóch punk-
tów: początkowego i końcowego. GNOME
wykorzystuje typ GnomeCanvasPoints ,
aby przechowywać kolejne współrzę-
42 luty 2006
S
"x2" , videos_x + video_strlen , "y2" , videos_y +( video_count )* 50 ,
S
"x" , videos_x + video_strlen / 2 ,
"text" , & videodesc [ 0 ] ,
(root, gnome_canvas_rect_
"outline_color", "black",
439112119.090.png 439112119.091.png 439112119.092.png
 
439112119.093.png 439112119.002.png 439112119.003.png 439112119.004.png 439112119.005.png
 
Zgłoś jeśli naruszono regulamin