Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <X11/Xlib.h>
- #include <X11/Xutil.h>
- #include <stdlib.h>
- #include <string.h>
- #include <math.h>
- #define TRUE 1
- #define FALSE 0
- struct punkty{
- int stary_X;
- int stary_Y;
- int aktX;
- int aktY;
- int kolor;
- };
- int main(int argc, char *argv[])
- {
- int staryX;
- int staryY;
- int obiegiPetli=0;
- struct punkty tablica[10000];
- char icon_name[] = "Grafika";
- char title[] = "Grafika komputerowa";
- Display* display; //gdzie bedziemy wysylac dane (do jakiego X servera)
- Window window; //nasze okno, gdzie bedziemy dokonywac roznych operacji
- GC gc; //tu znajduja sie informacje o parametrach graficznych
- XEvent event; //gdzie bedziemy zapisywac pojawiajace sie zdarzenia
- KeySym key; //informacja o stanie klawiatury
- XSizeHints info; //informacje typu rozmiar i polozenie okna
- int screen_no;
- unsigned long foreground;
- unsigned long background;
- char buffer[8]; //gdzie bedziemy zapamietywac znaki z klawiatury
- int hm_keys; //licznik klawiszy
- int to_end;
- XPoint current_point;
- Colormap colormap;
- int red, green, blue, yellow;
- display = XOpenDisplay(""); //otworz polaczenie z X serverem pobierz dane od zmiennej srodowiskowej DISPLAY ("")
- screen_no = DefaultScreen(display); //pobierz domyslny ekran dla tego wyswietlacza (0)
- background = WhitePixel(display, screen_no); //niech tlo bedzie biale
- foreground = BlackPixel(display, screen_no); //niech ekran bedzie czarny
- colormap = DefaultColormap(display,screen_no);
- int AllocNamedColor(char *name) //funkcja przydzielania kolorow
- {
- XColor col;
- XParseColor(display,colormap,name,&col);
- XAllocColor(display,colormap,&col);
- return col.pixel;
- }
- red=AllocNamedColor("red");
- green=AllocNamedColor("green");
- blue=AllocNamedColor("blue");
- yellow=AllocNamedColor("yellow");
- //okresl rozmiar i polozenie okna
- info.x = 100;
- info.y = 150;
- info.width = 600;
- info.height = 300;
- info.flags = PPosition | PSize;
- //majac wyswietlacz, stworz okno - domyslny uchwyt okna
- window = XCreateSimpleWindow(display, DefaultRootWindow(display),
- info.x, info.y, info.width, info.height,
- 7/* grubosc ramki */, foreground, background);
- XSetStandardProperties(display, window, title, icon_name, None,
- argv, argc, &info);
- //utworz kontekst graficzny do zarzadzania parametrami graficznymi (0,0) domyslne wartosci
- gc = XCreateGC(display, window, 0, 0);
- XSetBackground(display, gc, background);
- XSetForeground(display, gc, foreground);
- /* okresl zdarzenia jakie nas interesuja tj. nacisniecie
- klawisza (aby wyjsc z programu, oraz zdarzenie
- odswiezania okna np. gdy jakies inne window, ktore
- przykrywalo nasze okno zostalo zamkniete lub przesuniete,
- nacisniecie klawisza, zwolnienie oraz ruch myszy*/
- XSelectInput(display, window, (KeyPressMask | ExposureMask | ButtonPressMask|
- ButtonReleaseMask | Button1MotionMask));
- XMapRaised(display, window); //wyswietl nasze okno na samym wierzchu wszystkich okien
- to_end = FALSE;
- /* petla najpierw sprawdza, czy warunek jest spelniony
- i jesli tak, to nastepuje przetwarzanie petli
- a jesli nie, to wyjscie z petli, bez jej przetwarzania */
- while (to_end == FALSE)
- {
- XNextEvent(display, &event); // czekaj na zdarzenia okreslone wczesniej przez funkcje XSelectInput
- switch(event.type)
- {
- case Expose:
- if (event.xexpose.count == 0)
- {
- XDrawArc(display, window, gc, 100, 100, 100, 100, 0, 360*64);
- int i;
- for (i = 0; i<obiegiPetli; i++)
- {
- if (tablica[i].kolor == red)
- XSetForeground(display, gc, red);
- else
- XSetForeground(display, gc, foreground);
- XDrawLine(display, window, gc, tablica[i].stary_X, tablica[i].stary_Y, tablica[i].aktX, tablica[i].aktY);
- }
- //tu powinna byc przerysowana zawartosc okna
- }
- break;
- XDrawLine(display, window, gc, staryX, staryY, current_point.x, current_point.y);
- case MappingNotify:
- XRefreshKeyboardMapping(&event.xmapping); // zmiana ukladu klawiatury - w celu zabezpieczenia sie przed taka zmiana trzeba to wykonac
- break;
- case ButtonPress:
- if (event.xbutton.button == Button1) // sprawdzenie czy wciscnieto lewy przycisk
- // prawy przycisk to Button3
- {
- //odczytanie polozenia kursora
- current_point.x = event.xbutton.x;
- current_point.y = event.xbutton.y;
- // wymuszenie odswiezenia okna
- event.type = Expose;
- event.xexpose.count = 0;
- XSendEvent(display, window, 0, ExposureMask, &event);
- }
- break;
- case KeyPress:
- hm_keys = XLookupString(&event.xkey, buffer, 8, &key, 0);
- if (hm_keys == 1)
- {
- if (buffer[0] == 'q') to_end = TRUE; // koniec programu
- }
- break;
- case MotionNotify:
- {
- staryX = current_point.x;
- staryY = current_point.y;
- //odczytanie polozenia kursora
- current_point.x = event.xbutton.x;
- current_point.y = event.xbutton.y;
- if (sqrt((current_point.x-150)*(current_point.x-150)+(current_point.y-150)*(current_point.y-150)) <=50)
- {
- XSetForeground(display, gc, red);
- tablica[obiegiPetli].kolor = red;
- }
- else
- {
- XSetForeground(display, gc, foreground);
- tablica[obiegiPetli].kolor = foreground;
- }
- XDrawLine(display, window, gc, staryX, staryY, current_point.x, current_point.y);
- tablica[obiegiPetli].stary_X = staryX;
- tablica[obiegiPetli].stary_Y = staryY;
- tablica[obiegiPetli].aktX = current_point.x;
- tablica[obiegiPetli].aktY = current_point.y;
- obiegiPetli++;
- }
- break;
- default:
- break;
- }
- }
- XFreeGC(display, gc);
- XDestroyWindow(display, window);
- XCloseDisplay(display);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement