Guest User

Untitled

a guest
Jun 21st, 2018
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.93 KB | None | 0 0
  1. #include <X11/Xlib.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. Display *display;
  7. Window window;
  8. XEvent event;
  9. int screen;
  10.  
  11. Atom type;
  12. int format;
  13. unsigned char **clientlist, *titletext;
  14. unsigned long nitems, bytes;
  15. int clientcount, activewin;
  16.  
  17. void *getproperty (Window win, Atom at, Atom type, int *num_results) {
  18.  
  19. Atom type_ret;
  20. int format = 0;
  21. unsigned long items = 0;
  22. unsigned long bytes = 0;
  23. unsigned char **prop_value;
  24. int result;
  25.  
  26. result = XGetWindowProperty(display, win, at, 0, 0x7fffffff, False, type, &type_ret, &format, &nitems, &bytes, (unsigned char **)&prop_value);
  27.  
  28. if (result != 0) {
  29.  
  30. printf ("result from XGetWindowProperty not 0, %d instead!\n", result);
  31.  
  32. }
  33.  
  34. *num_results = nitems;
  35.  
  36. return prop_value;
  37.  
  38. }
  39.  
  40. char *getwindowname(Window window) {
  41.  
  42. char *windowname;
  43. int items;
  44.  
  45. windowname = getproperty(window, XInternAtom(display, "WM_ICON_NAME", True), AnyPropertyType, &items);
  46.  
  47. printf("getwindowname(): name for ID %u is ", window); if (windowname) { printf("\"%s\"", windowname); } else { printf("(null)"); } printf("\n");
  48.  
  49. return (char *)(windowname ? windowname : "Unnamed Window");
  50.  
  51. }
  52.  
  53. int find_active_window() {
  54.  
  55. int *activewin;
  56. int items;
  57.  
  58. activewin = getproperty(RootWindow(display, 0), XInternAtom(display, "_NET_ACTIVE_WINDOW", True), AnyPropertyType, &items);
  59.  
  60. printf("find_active_window(): active window ID is %d\n", activewin);
  61.  
  62. return *activewin;
  63.  
  64. }
  65.  
  66. unsigned char **getwindowlist(int *clientcount) {
  67.  
  68. int i;
  69.  
  70. clientlist = getproperty(RootWindow(display, 0), XInternAtom(display, "_NET_CLIENT_LIST", True), AnyPropertyType, clientcount);
  71.  
  72. for (i = 0; i < *clientcount; i++) { printf("getwindowlist(): window %d of %d has ID %d\n", i + 1, *clientcount, clientlist[i]); }
  73.  
  74. return clientlist;
  75.  
  76. }
  77.  
  78. redraw() {
  79.  
  80. int i;
  81.  
  82. printf("redraw window\n");
  83.  
  84. return;
  85.  
  86. for (i = 0; i < clientcount; i++) {
  87.  
  88. printf("%s\n", getwindowname((int)clientlist[i]));
  89.  
  90. }
  91.  
  92.  
  93.  
  94. }
  95.  
  96. /*
  97.  
  98. update on:
  99. - focus
  100. - map/unmap
  101. - title change
  102.  
  103. focus/map:
  104. - title known
  105.  
  106. unmap:
  107. - title unknown
  108.  
  109. */
  110.  
  111. int main(void) {
  112.  
  113. display = XOpenDisplay(NULL);
  114.  
  115. if (display == NULL) {
  116.  
  117. fprintf(stderr, "Cannot open display\n");
  118. exit(1);
  119.  
  120. }
  121.  
  122. int i, knownwin = 0;
  123.  
  124. activewin = find_active_window();
  125.  
  126. clientlist = getwindowlist((int *)&clientcount);
  127.  
  128. for (i = 0; i < clientcount; i++) {
  129.  
  130. XSelectInput (display, (int)clientlist[i], StructureNotifyMask | FocusChangeMask | VisibilityChangeMask);
  131.  
  132. printf("%s\n", getwindowname((int)clientlist[i]));
  133.  
  134. }
  135.  
  136. screen = DefaultScreen(display);
  137.  
  138. window = XCreateSimpleWindow(display, RootWindow(display, screen), 10, 10, 100, 100, 1, BlackPixel(display, screen), WhitePixel(display, screen));
  139.  
  140. XSelectInput(display, window, ExposureMask | KeyPressMask | ButtonPressMask | StructureNotifyMask);
  141.  
  142. Atom wmDeleteMessage = XInternAtom(display, "WM_DELETE_WINDOW", False);
  143. XSetWMProtocols(display, window, &wmDeleteMessage, 1);
  144.  
  145. XMapWindow(display, window);
  146.  
  147. redraw();
  148.  
  149. XSelectInput(display, RootWindow(display, screen), PropertyChangeMask | SubstructureNotifyMask);
  150.  
  151. while (1) {
  152.  
  153. XNextEvent(display, &event);
  154.  
  155. //printf("%d\n", event);
  156.  
  157. switch (event.type) {
  158.  
  159. case ClientMessage:
  160. if (event.xclient.data.l[0] == wmDeleteMessage) {
  161.  
  162. printf("close window\n");
  163.  
  164. XCloseDisplay(display);
  165.  
  166. exit(0);
  167.  
  168. }
  169. break;
  170.  
  171. case ButtonPress:
  172. printf("buttonpress\n");
  173. break;
  174.  
  175. //case DestroyNotify:
  176. //printf("destroynotify\n");
  177. //break;
  178.  
  179. //case Expose:
  180. //printf("expose\n");
  181. //break;
  182.  
  183. case PropertyNotify:
  184.  
  185. //printf("propertynotify\n");
  186.  
  187. //printf("%s\n", XGetAtomName(display, event.xproperty.atom));
  188.  
  189. if (event.xproperty.atom == XInternAtom (display, "_NET_CLIENT_LIST", False)) {
  190.  
  191. printf("window created or deleted\n");
  192.  
  193.  
  194.  
  195. } else if (event.xproperty.atom == XInternAtom (display, "_NET_ACTIVE_WINDOW", False)) {
  196.  
  197. printf("active window changed\n");
  198.  
  199.  
  200.  
  201. }
  202.  
  203.  
  204. break;
  205.  
  206. case CreateNotify:
  207.  
  208. printf("create window: %d\n", event.xcreatewindow.window);
  209.  
  210. break;
  211.  
  212. case FocusIn: //skip FocusOut since it'd only generate another event, and thinking about it, it's unneccessary here
  213. printf("focusin: window %u\n", event.xfocus.window);
  214. break;
  215.  
  216. default:
  217. break;
  218.  
  219. }
  220.  
  221. }
  222.  
  223.  
  224. }
  225.  
  226. /*
  227. typedef struct {
  228. long flags;
  229.  
  230. int x, y;
  231. int width, height;
  232. int min_width, min_height;
  233. int max_width, max_height;
  234. int width_inc, height_inc;
  235. struct {
  236. int x;
  237. int y;
  238. } min_aspect, max_aspect;
  239. int base_width, base_height;
  240.  
  241. int win_gravity;
  242. } XSizeHints;
  243. */
Add Comment
Please, Sign In to add comment