Advertisement
Guest User

Untitled

a guest
Nov 21st, 2019
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.68 KB | None | 0 0
  1.  
  2. #include <X11/Xlib.h>
  3. #include <X11/Xutil.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <math.h>
  7.  
  8. #define TRUE 1
  9. #define FALSE 0
  10.  
  11. int red, green, blue, yellow;
  12. unsigned long foreground, background;
  13. struct figura
  14. {
  15.  int xNew;
  16.  int yNew;
  17.  int xOld;
  18.  int yOld;
  19. };
  20. struct figura prostokaty[20];
  21. int licznik =0;
  22. void rysuj(Display* display, Window window, GC gc, int licznik, struct figura prostokaty[20])
  23. {
  24.     int szer = prostokaty[licznik].xNew - prostokaty[licznik].xOld;
  25.     int wys = prostokaty[licznik].yNew - prostokaty[licznik].yOld;
  26.     if (prostokaty[licznik].xNew - prostokaty[licznik].xOld >= 0 && prostokaty[licznik].yNew - prostokaty[licznik].yOld >= 0)
  27.     {
  28.         XDrawRectangle(display, window, gc, prostokaty[licznik].xOld, prostokaty[licznik].yOld, szer, wys);
  29.         XSetForeground(display, gc, red);
  30.         XFillRectangle(display, window, gc, prostokaty[licznik].xOld+1, prostokaty[licznik].yOld+1, szer, wys);
  31.         XSetForeground(display, gc, 0);
  32.     }
  33.     if (prostokaty[licznik].xNew - prostokaty[licznik].xOld < 0 && prostokaty[licznik].yNew - prostokaty[licznik].yOld >= 0)
  34.     {
  35.         XDrawRectangle(display, window, gc, prostokaty[licznik].xNew, prostokaty[licznik].yOld, -szer, wys);
  36.         XSetForeground(display, gc, blue);
  37.         XFillRectangle(display, window, gc, prostokaty[licznik].xNew+1, prostokaty[licznik].yOld+1, -szer, wys);
  38.         XSetForeground(display, gc, 0);
  39.     }
  40.     if (prostokaty[licznik].xNew - prostokaty[licznik].xOld < 0 && prostokaty[licznik].yNew - prostokaty[licznik].yOld < 0)
  41.     {
  42.         XDrawRectangle(display, window, gc, prostokaty[licznik].xNew, prostokaty[licznik].yNew, -szer, -wys);
  43.         XSetForeground(display, gc, green);
  44.         XFillRectangle(display, window, gc, prostokaty[licznik].xNew+1, prostokaty[licznik].yNew+1, -szer, -wys);
  45.         XSetForeground(display, gc, 0);    
  46.     }
  47.     if (prostokaty[licznik].xNew - prostokaty[licznik].xOld >= 0 && prostokaty[licznik].yNew - prostokaty[licznik].yOld < 0)
  48.     {
  49.         XDrawRectangle(display, window, gc, prostokaty[licznik].xOld, prostokaty[licznik].yNew, szer, -wys);
  50.         XSetForeground(display, gc, yellow);
  51.         XFillRectangle(display, window, gc, prostokaty[licznik].xOld+1, prostokaty[licznik].yNew+1, szer-1, -wys);
  52.         XSetForeground(display, gc, 0);    
  53.     }
  54. };
  55.  
  56. //*************************************************************************************************************************
  57. //funkcja przydzielania kolorow
  58.  
  59. int AllocNamedColor(char *name, Display* display, Colormap colormap)
  60.   {
  61.     XColor col;
  62.     XParseColor(display, colormap, name, &col);
  63.     XAllocColor(display, colormap, &col);
  64.     return col.pixel;
  65.   }
  66.  
  67. //*************************************************************************************************************************
  68. // inicjalizacja zmiennych globalnych okreslajacych kolory
  69.  
  70. int init_colors(Display* display, int screen_no, Colormap colormap)
  71. {
  72.   background = WhitePixel(display, screen_no);  //niech tlo bedzie biale
  73.   foreground = BlackPixel(display, screen_no);  //niech ekran bedzie czarny
  74.   red=AllocNamedColor("red", display, colormap);
  75.   green=AllocNamedColor("green", display, colormap);
  76.   blue=AllocNamedColor("blue", display, colormap);
  77.   yellow=AllocNamedColor("yellow", display, colormap);
  78. }
  79.  
  80. //*************************************************************************************************************************
  81. // Glowna funkcja zawierajaca petle obslugujaca zdarzenia */
  82.  
  83. int main(int argc, char *argv[])
  84. {
  85.   char            icon_name[] = "Grafika";
  86.   char            title[]     = "Grafika komputerowa";
  87.   Display*        display;    //gdzie bedziemy wysylac dane (do jakiego X servera)
  88.   Window          window;     //nasze okno, gdzie bedziemy dokonywac roznych operacji
  89.   GC              gc;         //tu znajduja sie informacje o parametrach graficznych
  90.   XEvent          event;      //gdzie bedziemy zapisywac pojawiajace sie zdarzenia
  91.   KeySym          key;        //informacja o stanie klawiatury
  92.   Colormap        colormap;
  93.   int             screen_no;
  94.   XSizeHints      info;       //informacje typu rozmiar i polozenie ok
  95.  
  96.   char            buffer[8];  //gdzie bedziemy zapamietywac znaki z klawiatury
  97.   int             hm_keys;    //licznik klawiszy
  98.   int             to_end;
  99.  
  100.   display    = XOpenDisplay("");                //otworz polaczenie z X serverem pobierz dane od zmiennej srodowiskowej DISPLAY ("")
  101.   screen_no  = DefaultScreen(display);          //pobierz domyslny ekran dla tego wyswietlacza (0)
  102.   colormap = XDefaultColormap(display, screen_no);
  103.   init_colors(display, screen_no, colormap);
  104.  
  105.   //okresl rozmiar i polozenie okna
  106.   info.x = 100;
  107.   info.y = 150;
  108.   info.width = 500;
  109.   info.height = 300;
  110.   info.flags = PPosition | PSize;
  111.  
  112.   //majac wyswietlacz, stworz okno - domyslny uchwyt okna
  113.   window = XCreateSimpleWindow(display, DefaultRootWindow(display),info.x, info.y, info.width, info.height, 7/* grubosc ramki */, foreground, background);
  114.   XSetStandardProperties(display, window, title, icon_name, None, argv, argc, &info);
  115.   //utworz kontekst graficzny do zarzadzania parametrami graficznymi (0,0) domyslne wartosci
  116.   gc = XCreateGC(display, window, 0, 0);
  117.   XSetBackground(display, gc, background);
  118.   XSetForeground(display, gc, foreground);
  119.  
  120.   //okresl zdarzenia jakie nas interesuja, np. nacisniecie klawisza
  121.   XSelectInput(display, window, (KeyPressMask | ExposureMask | ButtonPressMask| ButtonReleaseMask | Button1MotionMask));
  122.   XMapRaised(display, window);  //wyswietl nasze okno na samym wierzchu wszystkich okien
  123.      
  124.   to_end = FALSE;
  125.  
  126.  /* petla najpierw sprawdza, czy warunek jest spelniony
  127.      i jesli tak, to nastepuje przetwarzanie petli
  128.      a jesli nie, to wyjscie z petli, bez jej przetwarzania */
  129.   while (to_end == FALSE)
  130.   {
  131.     XNextEvent(display, &event);  // czekaj na zdarzenia okreslone wczesniej przez funkcje XSelectInput
  132.  
  133.     switch(event.type)
  134.     {
  135.       case Expose:
  136.         if (event.xexpose.count == 0)
  137.         {
  138.          for (int i=0; i<=licznik; i++)
  139.         {
  140.             int szer = prostokaty[i].xNew - prostokaty[i].xOld;
  141.             int wys = prostokaty[i].yNew - prostokaty[i].yOld;
  142.             if (prostokaty[i].xNew - prostokaty[i].xOld >= 0 && prostokaty[i].yNew - prostokaty[i].yOld >= 0)
  143.             {
  144.                 XDrawRectangle(display, window, gc, prostokaty[i].xOld, prostokaty[i].yOld, szer, wys);
  145.                 XSetForeground(display, gc, red);
  146.                 XFillRectangle(display, window, gc, prostokaty[i].xOld+1, prostokaty[i].yOld+1, szer, wys);
  147.                 XSetForeground(display, gc, 0);
  148.             }
  149.             if (prostokaty[i].xNew - prostokaty[i].xOld < 0 && prostokaty[i].yNew - prostokaty[i].yOld >= 0)
  150.             {
  151.                 XDrawRectangle(display, window, gc, prostokaty[i].xNew, prostokaty[i].yOld, -szer, wys);
  152.                 XSetForeground(display, gc, blue);
  153.                 XFillRectangle(display, window, gc, prostokaty[i].xNew+1, prostokaty[i].yOld+1, -szer, wys);
  154.                 XSetForeground(display, gc, 0);
  155.             }
  156.             if (prostokaty[i].xNew - prostokaty[i].xOld < 0 && prostokaty[i].yNew - prostokaty[i].yOld < 0)
  157.             {
  158.                 XDrawRectangle(display, window, gc, prostokaty[i].xNew, prostokaty[i].yNew, -szer, -wys);
  159.                 XSetForeground(display, gc, green);
  160.                 XFillRectangle(display, window, gc, prostokaty[i].xNew+1, prostokaty[i].yNew+1, -szer, -wys);
  161.                 XSetForeground(display, gc, 0);    
  162.             }
  163.             if (prostokaty[i].xNew - prostokaty[i].xOld >= 0 && prostokaty[i].yNew - prostokaty[i].yOld < 0)
  164.             {
  165.                 XDrawRectangle(display, window, gc, prostokaty[i].xOld, prostokaty[i].yNew, szer, -wys);
  166.                 XSetForeground(display, gc, yellow);
  167.                 XFillRectangle(display, window, gc, prostokaty[i].xOld+1, prostokaty[i].yNew+1, szer-1, -wys);
  168.                 XSetForeground(display, gc, 0);    
  169.             }      
  170.         }      
  171.         }
  172.         break;
  173.  
  174.       case MappingNotify:
  175.         XRefreshKeyboardMapping(&event.xmapping); // zmiana ukladu klawiatury - w celu zabezpieczenia sie przed taka zmiana trzeba to wykonac
  176.         break;
  177.  
  178.       case ButtonPress:
  179.         if (event.xbutton.button == Button1)  // sprawdzenie czy wcisnieto lewy przycisk       
  180.         {
  181.         prostokaty[licznik].xOld = event.xbutton.x;
  182.         prostokaty[licznik].yOld = event.xbutton.y;
  183.         //licznik++;
  184.     //  XFillRectangle(display, window, gc, event.xbutton.x, event.xbutton.y, 100, 100);
  185.        
  186.         }
  187.         break;
  188.       case ButtonRelease:
  189.     if (event.xbutton.button == Button1)  // sprawdzenie czy wcisnieto lewy przycisk       
  190.         {
  191.         licznik++; 
  192.         }
  193.     break;
  194.  
  195.       case KeyPress:
  196.         hm_keys = XLookupString(&event.xkey, buffer, 8, &key, 0);
  197.         if (hm_keys == 1)
  198.         {
  199.           if (buffer[0] == 'q') to_end = TRUE;        // koniec programu
  200.          
  201.         }
  202.       case MotionNotify:
  203.     {  
  204.        
  205.         XClearWindow(display, window);
  206.         event.type = Expose;
  207.         event.xexpose.count =0;
  208.         XSendEvent(display, window, 0, ExposureMask, &event);
  209.  
  210.         prostokaty[licznik].xNew = event.xbutton.x;
  211.         prostokaty[licznik].yNew = event.xbutton.y;
  212.         int szer = prostokaty[licznik].xNew - prostokaty[licznik].xOld;
  213.         int wys = prostokaty[licznik].yNew - prostokaty[licznik].yOld;
  214.         if (prostokaty[licznik].xNew - prostokaty[licznik].xOld >= 0 && prostokaty[licznik].yNew - prostokaty[licznik].yOld >= 0)
  215.         {
  216.             XDrawRectangle(display, window, gc, prostokaty[licznik].xOld, prostokaty[licznik].yOld, szer, wys);
  217.             XSetForeground(display, gc, red);
  218.             XFillRectangle(display, window, gc, prostokaty[licznik].xOld+1, prostokaty[licznik].yOld+1, szer, wys);
  219.             XSetForeground(display, gc, 0);
  220.         }
  221.         if (prostokaty[licznik].xNew - prostokaty[licznik].xOld < 0 && prostokaty[licznik].yNew - prostokaty[licznik].yOld >= 0)
  222.         {
  223.             XDrawRectangle(display, window, gc, prostokaty[licznik].xNew, prostokaty[licznik].yOld, -szer, wys);
  224.             XSetForeground(display, gc, blue);
  225.             XFillRectangle(display, window, gc, prostokaty[licznik].xNew+1, prostokaty[licznik].yOld+1, -szer, wys);
  226.             XSetForeground(display, gc, 0);
  227.         }
  228.         if (prostokaty[licznik].xNew - prostokaty[licznik].xOld < 0 && prostokaty[licznik].yNew - prostokaty[licznik].yOld < 0)
  229.         {
  230.             XDrawRectangle(display, window, gc, prostokaty[licznik].xNew, prostokaty[licznik].yNew, -szer, -wys);
  231.             XSetForeground(display, gc, green);
  232.             XFillRectangle(display, window, gc, prostokaty[licznik].xNew+1, prostokaty[licznik].yNew+1, -szer, -wys);
  233.             XSetForeground(display, gc, 0);    
  234.         }
  235.         if (prostokaty[licznik].xNew - prostokaty[licznik].xOld >= 0 && prostokaty[licznik].yNew - prostokaty[licznik].yOld < 0)
  236.         {
  237.             XDrawRectangle(display, window, gc, prostokaty[licznik].xOld, prostokaty[licznik].yNew, szer, -wys);
  238.             XSetForeground(display, gc, yellow);
  239.             XFillRectangle(display, window, gc, prostokaty[licznik].xOld+1, prostokaty[licznik].yNew+1, szer-1, -wys);
  240.             XSetForeground(display, gc, 0);    
  241.         }      
  242.     }
  243.     break;
  244.       default:
  245.         break;
  246.     }
  247.   }
  248.  
  249.   XFreeGC(display, gc);
  250.   XDestroyWindow(display, window);
  251.   XCloseDisplay(display);
  252.  
  253.   return 0;
  254. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement