/X11/ex5/example5.c

https://github.com/nonstop/sandbox · C · 165 lines · 120 code · 22 blank · 23 comment · 8 complexity · b14a1fde599895cac34925d1b4dfe4cf MD5 · raw file

  1. #include <X11/Xlib.h>
  2. #include <X11/Xutil.h>
  3. #include <X11/Xos.h>
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include "stdlib.h"
  7. #define X 0
  8. #define Y 0
  9. #define WIDTH 300
  10. #define HEIGHT 300
  11. #define WIDTH_MIN 100
  12. #define HEIGHT_MIN 100
  13. #define BORDER_WIDTH 5
  14. #define TITLE "Draw line!"
  15. #define ICON_TITLE "Draw line!"
  16. #define PRG_CLASS "Draw line!"
  17. /*
  18. * SetWindowManagerHints - ÐÒÏÃÅÄÕÒÁ ÐÅÒÅÄÁÅÔ ÉÎÆÏÒÍÁÃÉÀ Ï
  19. * Ó×ÏÊÓÔ×ÁÈ ÐÒÏÇÒÁÍÍÙ ÍÅÎÅÄÖÅÒÕ ÏËÏÎ.
  20. */
  21. static void SetWindowManagerHints (
  22. Display * display, /*õËÁÚÁÔÅÌØ ÎÁ ÓÔÒÕËÔÕÒÕ Display */
  23. char * PClass, /*ëÌÁÓÓ ÐÒÏÇÒÁÍÍÙ */
  24. char * argv[], /*áÒÇÕÍÅÎÔÙ ÐÒÏÇÒÁÍÍÙ */
  25. int argc, /*þÉÓÌÏ ÁÒÇÕÍÅÎÔÏ× */
  26. Window window, /*éÄÅÎÔÉÆÉËÁÔÏÒ ÏËÎÁ */
  27. int x, /*ëÏÏÒÄÉÎÁÔÙ ÌÅ×ÏÇÏ ×ÅÒÈÎÅÇÏ */
  28. int y, /*ÕÇÌÁ ÏËÎÁ */
  29. int win_wdt,
  30. int win_hgt, /*ûÉÒÉÎÁ É ×ÙÓÏÔÁ ÏËÎÁ */
  31. int win_wdt_min,
  32. int win_hgt_min, /*íÉÎÉÍÁÌØÎÙÅ ÛÉÒÉÎÁ É ×ÙÓÏÔÁ ÏËÎÁ */
  33. char * ptrTitle, /*úÁÇÏÌÏ×ÏË ÏËÎÁ */
  34. char * ptrITitle,/*úÁÇÏÌÏ×ÏË ÐÉËÔÏÇÒÁÍÍÙ ÏËÎÁ */
  35. Pixmap pixmap /*òÉÓÕÎÏË ÐÉËÔÏÇÒÁÍÍÙ */
  36. )
  37. {
  38. XSizeHints size_hints; /*òÅËÏÍÅÎÄÁÃÉÉ Ï ÒÁÚÍÅÒÁÈ ÏËÎÁ*/
  39. XWMHints wm_hints;
  40. XClassHint class_hint;
  41. XTextProperty windowname, iconname;
  42. if ( !XStringListToTextProperty (&ptrTitle, 1, &windowname ) ||
  43. !XStringListToTextProperty (&ptrITitle, 1, &iconname ) ) {
  44. puts ( "No memory!\n");
  45. exit ( 1 );
  46. }
  47. size_hints.flags = PPosition | PSize | PMinSize;
  48. size_hints.min_width = win_wdt_min;
  49. size_hints.min_height = win_hgt_min;
  50. wm_hints.flags = StateHint | IconPixmapHint |
  51. InputHint;
  52. wm_hints.initial_state = NormalState;
  53. wm_hints.input = True;
  54. wm_hints.icon_pixmap= pixmap;
  55. class_hint.res_name = argv[0];
  56. class_hint.res_class = PClass;
  57. XSetWMProperties ( display, window, &windowname,
  58. &iconname, argv, argc, &size_hints, &wm_hints,
  59. &class_hint );
  60. }
  61. /*
  62. *main - ÏÓÎÏ×ÎÁÑ ÐÒÏÃÅÄÕÒÁ ÐÒÏÇÒÁÍÍÙ
  63. */
  64. int main(int argc, char *argv[])
  65. {
  66. Display *display; /* õËÁÚÁÔÅÌØ ÎÁ ÓÔÒÕËÔÕÒÕ Display */
  67. int screen_number; /* îÏÍÅÒ ÜËÒÁÎÁ */
  68. GC gc;
  69. XEvent report;
  70. Window window;
  71. int new_x, new_y,
  72. x = 0,
  73. y = 0;
  74. int button;
  75. /* õÓÔÁÎÁ×ÌÉ×ÁÅÍ Ó×ÑÚØ Ó ÓÅÒ×ÅÒÏÍ */
  76. if ( ( display = XOpenDisplay ( NULL ) ) == NULL ) {
  77. puts ("Can not connect to the X server!\n");
  78. exit ( 1 );
  79. }
  80. /* ðÏÌÕÞÁÅÍ ÎÏÍÅÒ ÏÓÎÏ×ÎÏÇÏ ÜËÒÁÎÁ */
  81. screen_number = DefaultScreen ( display );
  82. /* óÏÚÄÁÅÍ ÏËÎÏ */
  83. window = XCreateSimpleWindow ( display,
  84. RootWindow ( display, screen_number ),
  85. X, Y, WIDTH, HEIGHT, BORDER_WIDTH,
  86. BlackPixel ( display, screen_number ),
  87. WhitePixel ( display, screen_number ) );
  88. /* úÁÄÁÅÍ ÒÅËÏÍÅÎÄÁÃÉÉ ÄÌÑ ÍÅÎÅÄÖÅÒÁ ÏËÏÎ */
  89. SetWindowManagerHints ( display, PRG_CLASS, argv, argc,
  90. window, X, Y, WIDTH, HEIGHT, WIDTH_MIN,
  91. HEIGHT_MIN, TITLE, ICON_TITLE, 0 );
  92. /* ÷ÙÂÉÒÁÅÍ ÓÏÂÙÔÉÑ, ÏÂÒÁÂÁÔÙ×ÁÅÍÙÅ ÐÒÏÇÒÁÍÍÏÊ */
  93. XSelectInput ( display, window, ExposureMask | KeyPressMask | ButtonPressMask |
  94. ButtonReleaseMask | PointerMotionMask | Button1MotionMask | Button2MotionMask );
  95. /* ðÏËÁÚÙ×ÁÅÍ ÏËÎÏ */
  96. XMapWindow ( display, window );
  97. /* ãÉËÌ ÐÏÌÕÞÅÎÉÑ É ÏÂÒÁÂÏÔËÉ ÏÛÉÂÏË */
  98. while ( 1 ) {
  99. XNextEvent ( display, &report );
  100. gc = XCreateGC ( display, window, 0 , NULL );
  101. switch ( report.type ) {
  102. case Expose :
  103. /* úÁÐÒÏÓ ÎÁ ÐÅÒÅÒÉÓÏ×ËÕ */
  104. if ( report.xexpose.count != 0 )
  105. break;
  106. XDrawString( display, window, gc, 50, 50, "Push button to draw", strlen("Push button to draw") );
  107. break;
  108. case ButtonPress:
  109. /* ÓÏÈÒÁÎÑÅÍ ËÏÏÒÄÉÎÁÔÙ ËÎÏÐËÉ ÍÙÛÉ × ÃÅÌÙÈ ÐÅÒÅÍÅÎÎÙÈ */
  110. /* ÔÁËÖÅ ÓÏÈÒÁÎÑÅÍ ÉÄÅÎÔÉÆÉËÁÔÏÒ ÏËÎÁ, × ËÏÔÏÒÏÍ ÂÙÌÁ */
  111. /* ÎÁÖÁÔÁ ËÎÏÐËÁ ÍÙÛÉ */
  112. x = new_x;
  113. y = new_y;
  114. new_x = report.xbutton.x;
  115. new_y = report.xbutton.y;
  116. window = report.xbutton.window;
  117. /* ÐÒÏ×ÅÒÑÅÍ, ËÁËÁÑ ÉÚ ËÎÏÐÏË ÂÙÌÁ ÎÁÖÁÔÁ, */
  118. switch( report.xbutton.button) {
  119. case Button1:
  120. /* ÒÉÓÕÅÍ ÎÏ×ÕÀ ÌÉÎÉÀ Ë ÐÏÚÉÃÉÉ ÍÙÛÉ */
  121. XDrawLine( display, window, gc, x, y, new_x, new_y );
  122. break;
  123. case Button3:
  124. /* ÏÞÉÝÁÅÍ ÜËÒÁÎ */
  125. XClearWindow( display, window );
  126. XDrawString( display, window, gc, 50, 50, "Push button to draw or any key to exit",
  127. strlen("Push button to draw or any key to exit") );
  128. break;
  129. default:
  130. break;
  131. }
  132. /*îÅ ÚÁÂÙ×ÁÊÔÅ ÐÒÏ ÏÔÐÕÓËÁÎÉÅ ËÎÏÐËÉ*/
  133. case ButtonRelease:
  134. break;
  135. /*÷ÙÈÏÄ ÐÒÉ ÎÁÖÁÔÉÉ ÌÀÂÏÊ ËÌÁ×ÉÛÉ*/
  136. case KeyPress :
  137. XCloseDisplay ( display );
  138. exit ( 0 );
  139. }
  140. XFreeGC ( display, gc );
  141. }
  142. return 0;
  143. }