Advertisement
Guest User

Untitled

a guest
Nov 28th, 2014
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.09 KB | None | 0 0
  1. #include <X11/Xlib.h>
  2. #include <X11/Xutil.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. #define TRUE 1
  7. #define FALSE 0
  8. XPoint tablica[1000][100000];
  9. int figury = 0;
  10. int lpf[1000];
  11. char zf[1000];
  12. int main(int argc, char *argv[])
  13. {
  14. char icon_name[] = "Grafika";
  15. char title[] = "Grafika komputerowa";
  16. Display* display; //gdzie bedziemy wysylac dane (do jakiego X servera)
  17. Window window; //nasze okno, gdzie bedziemy dokonywac roznych operacji
  18. GC gc; //tu znajduja sie informacje o parametrach graficznych
  19. XEvent event; //gdzie bedziemy zapisywac pojawiajace sie zdarzenia
  20. KeySym key; //informacja o stanie klawiatury
  21. XSizeHints info; //informacje typu rozmiar i polozenie okna
  22. int screen_no;
  23. unsigned long foreground;
  24. unsigned long background;
  25. char buffer[8]; //gdzie bedziemy zapamietywac znaki z klawiatury
  26. int hm_keys; //licznik klawiszy
  27.  
  28. int to_end;
  29. XPoint current_point;
  30.  
  31. Colormap colormap;
  32. int red, green, blue, yellow;
  33.  
  34. display = XOpenDisplay(""); //otworz polaczenie z X serverem pobierz dane od zmiennej srodowiskowej DISPLAY ("")
  35. screen_no = DefaultScreen(display); //pobierz domyslny ekran dla tego wyswietlacza (0)
  36. background = WhitePixel(display, screen_no); //niech tlo bedzie biale
  37. foreground = BlackPixel(display, screen_no); //niech ekran bedzie czarny
  38.  
  39. colormap = DefaultColormap(display,screen_no);
  40.  
  41. int AllocNamedColor(char *name) //funkcja przydzielania kolorow
  42. {
  43. XColor col;
  44. XParseColor(display,colormap,name,&col);
  45. XAllocColor(display,colormap,&col);
  46. return col.pixel;
  47. }
  48.  
  49. red=AllocNamedColor("red");
  50. green=AllocNamedColor("green");
  51. blue=AllocNamedColor("blue");
  52. yellow=AllocNamedColor("yellow");
  53.  
  54. //okresl rozmiar i polozenie okna
  55. info.x = 100;
  56. info.y = 150;
  57. info.width = 300;
  58. info.height = 150;
  59. info.flags = PPosition | PSize;
  60.  
  61. //majac wyswietlacz, stworz okno - domyslny uchwyt okna
  62. window = XCreateSimpleWindow(display, DefaultRootWindow(display),
  63. info.x, info.y, info.width, info.height,
  64. 7/* grubosc ramki */, foreground, background);
  65. XSetStandardProperties(display, window, title, icon_name, None,
  66. argv, argc, &info);
  67. //utworz kontekst graficzny do zarzadzania parametrami graficznymi (0,0) domyslne wartosci
  68. gc = XCreateGC(display, window, 0, 0);
  69.  
  70. XSetBackground(display, gc, background);
  71. XSetForeground(display, gc, foreground);
  72.  
  73. /* okresl zdarzenia jakie nas interesuja tj. nacisniecie
  74. klawisza (aby wyjsc z programu, oraz zdarzenie
  75. odswiezania okna np. gdy jakies inne window, ktore
  76. przykrywalo nasze okno zostalo zamkniete lub przesuniete,
  77. nacisniecie klawisza, zwolnienie oraz ruch myszy*/
  78. XSelectInput(display, window, (KeyPressMask | ExposureMask | ButtonPressMask|
  79. ButtonReleaseMask | ButtonMotionMask));
  80. XMapRaised(display, window); //wyswietl nasze okno na samym wierzchu wszystkich okien
  81.  
  82. to_end = FALSE;
  83.  
  84.  
  85. /* petla najpierw sprawdza, czy warunek jest spelniony
  86. i jesli tak, to nastepuje przetwarzanie petli
  87. a jesli nie, to wyjscie z petli, bez jej przetwarzania */
  88. while (to_end == FALSE)
  89. {
  90. XNextEvent(display, &event); // czekaj na zdarzenia okreslone wczesniej przez funkcje XSelectInput
  91. int ktory = 0;
  92. XPoint poprzedni;
  93. switch(event.type)
  94. {
  95. case Expose:
  96. if (event.xexpose.count == 0)
  97. {
  98.  
  99. //tu powinna byc przerysowana zawartosc okna
  100. int i,j;
  101. for(j = 0; j<figury;j++){
  102. for(i = 1; i<lpf[j];i++){
  103. if(zf[j]=='r'){
  104. XSetForeground(display, gc, blue);
  105. XDrawLine(display,window,gc,tablica[j][i].x,tablica[j][i].y,tablica[j][i-1].x,tablica[j][i-1].y);
  106.  
  107. }
  108. else{
  109. XSetForeground(display, gc, foreground);
  110. XDrawLine(display,window,gc,tablica[j][i].x,tablica[j][i].y,tablica[j][i-1].x,tablica[j][i-1].y);
  111. }
  112. }
  113. }
  114. }
  115. break;
  116.  
  117. case MappingNotify:
  118. XRefreshKeyboardMapping(&event.xmapping); // zmiana ukladu klawiatury - w celu zabezpieczenia sie przed taka zmiana trzeba to wykonac
  119. break;
  120.  
  121. case ButtonPress:
  122. if (event.xbutton.button == Button1) // sprawdzenie czy wciscnieto lewy przycisk
  123. // prawy przycisk to Button3
  124. {
  125. //odczytanie polozenia kursora
  126. ktory = 1;
  127. lpf[figury] = 0;
  128. zf[figury]='l';
  129. tablica[figury][lpf[figury]].x=event.xbutton.x;
  130. tablica[figury++][lpf[figury]++].y=event.xbutton.y;
  131. // wymuszenie odswiezenia okna
  132. event.type = Expose;
  133. event.xexpose.count = 0;
  134. XSendEvent(display, window, 0, ExposureMask, &event);
  135. }
  136. if(event.xbutton.button == Button3){
  137. lpf[figury] = 0;
  138. zf[figury]='r';
  139. tablica[figury][lpf[figury]].x=event.xbutton.x;
  140. tablica[figury++][lpf[figury]++].y=event.xbutton.y;
  141. // wymuszenie odswiezenia okna
  142. event.type = Expose;
  143. event.xexpose.count = 0;
  144. XSendEvent(display, window, 0, ExposureMask, &event);
  145.  
  146. }
  147. break;
  148. case MotionNotify:
  149. //if(ktory == 1){
  150. tablica[figury-1][lpf[figury-1]].x = event.xbutton.x;
  151. tablica[figury-1][lpf[figury-1]++].y = event.xbutton.y;
  152. event.type = Expose;
  153. event.xexpose.count = 0;
  154. XSendEvent(display, window, 0, ExposureMask, &event);
  155. //}
  156.  
  157. break;
  158. case ButtonRelease:
  159. //ktory = 0;
  160. break;
  161. case KeyPress:
  162. hm_keys = XLookupString(&event.xkey, buffer, 8, &key, 0);
  163. if (hm_keys == 1)
  164. {
  165. if (buffer[0] == 'q') to_end = TRUE; // koniec programu
  166.  
  167. }
  168.  
  169. default:
  170. break;
  171. }
  172. }
  173.  
  174. XFreeGC(display, gc);
  175. XDestroyWindow(display, window);
  176. XCloseDisplay(display);
  177.  
  178. return 0;
  179. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement