event.c 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. /*
  2. * wmfs2 by Martin Duquesnoy <xorg62@gmail.com> { for(i = 2011; i < 2111; ++i) ©(i); }
  3. * For license, see COPYING.
  4. */
  5. #include "event.h"
  6. #include "ewmh.h"
  7. #include "util.h"
  8. #include "wmfs.h"
  9. #include "client.h"
  10. #include "barwin.h"
  11. #include "screen.h"
  12. #define EVDPY(e) (e)->xany.display
  13. static void
  14. event_buttonpress(XEvent *e)
  15. {
  16. XButtonEvent *ev = &e->xbutton;
  17. struct mousebind *m;
  18. struct barwin *b;
  19. screen_update_sel();
  20. SLIST_FOREACH(b, &W->h.barwin, next)
  21. if(b->win == ev->window)
  22. {
  23. SLIST_FOREACH(m, &b->mousebinds, next)
  24. if(m->button == ev->button)
  25. if(!m->use_area || (m->use_area && INAREA(ev->x, ev->y, m->area)))
  26. if(m->func)
  27. m->func(m->cmd);
  28. break;
  29. }
  30. }
  31. static void
  32. event_enternotify(XEvent *e)
  33. {
  34. XCrossingEvent *ev = &e->xcrossing;
  35. struct client *c;
  36. if((ev->mode != NotifyNormal
  37. || ev->detail == NotifyInferior
  38. || ev->detail == NotifyAncestor)
  39. && ev->window != W->root)
  40. return;
  41. if((c = client_gb_win(ev->window)))
  42. client_focus(c);
  43. }
  44. static void
  45. event_clientmessageevent(XEvent *e)
  46. {
  47. (void)e;
  48. /* XClientMessageEvent *ev = &e->xclient;
  49. client *c;*/
  50. }
  51. static void
  52. event_configureevent(XEvent *e)
  53. {
  54. XConfigureRequestEvent *ev = &e->xconfigurerequest;
  55. XWindowChanges wc;
  56. struct client *c;
  57. if((c = client_gb_win(ev->window)))
  58. {
  59. if(ev->value_mask & CWX)
  60. c->geo.x = ev->x;
  61. if(ev->value_mask & CWY)
  62. c->geo.y = ev->y;
  63. if(ev->value_mask & CWWidth)
  64. c->geo.w = ev->width;
  65. if(ev->value_mask & CWHeight)
  66. c->geo.h = ev->height;
  67. client_configure(c);
  68. XMoveResizeWindow(EVDPY(e), c->win, c->geo.x, c->geo.y, c->geo.w, c->geo.h);
  69. }
  70. else
  71. {
  72. wc.x = ev->x;
  73. wc.y = ev->y;
  74. wc.width = ev->width;
  75. wc.height = ev->height;
  76. wc.border_width = ev->border_width;
  77. wc.sibling = ev->above;
  78. wc.stack_mode = ev->detail;
  79. XConfigureWindow(EVDPY(e), ev->window, ev->value_mask, &wc);
  80. }
  81. }
  82. static void
  83. event_destroynotify(XEvent *e)
  84. {
  85. XDestroyWindowEvent *ev = &e->xdestroywindow;
  86. struct client *c;
  87. if((c = client_gb_win(ev->window)))
  88. client_remove(c);
  89. }
  90. static void
  91. event_focusin(XEvent *e)
  92. {
  93. if(W->client && e->xfocus.window != W->client->win)
  94. client_focus(W->client);
  95. }
  96. static void
  97. event_maprequest(XEvent *e)
  98. {
  99. XMapRequestEvent *ev = &e->xmaprequest;
  100. XWindowAttributes at;
  101. /* Which windows to manage */
  102. if(!XGetWindowAttributes(EVDPY(e), ev->window, &at)
  103. || at.override_redirect)
  104. return;
  105. if(!client_gb_win(ev->window))
  106. client_new(ev->window, &at);
  107. }
  108. static void
  109. event_mappingnotify(XEvent *e)
  110. {
  111. XMappingEvent *ev = &e->xmapping;
  112. XRefreshKeyboardMapping(ev);
  113. if(ev->request == MappingKeyboard)
  114. wmfs_grab_keys();
  115. }
  116. static void
  117. event_propertynotify(XEvent *e)
  118. {
  119. XPropertyEvent *ev = &e->xproperty;
  120. struct client *c;
  121. if(ev->state == PropertyDelete)
  122. return;
  123. if((c = client_gb_win(ev->window)))
  124. {
  125. switch(ev->atom)
  126. {
  127. case XA_WM_TRANSIENT_FOR:
  128. break;
  129. case XA_WM_NORMAL_HINTS:
  130. /* client_get_size_hints(c); */
  131. break;
  132. case XA_WM_HINTS:
  133. /*
  134. XWMHints *h;
  135. if((h = XGetWMHints(EVDPY, c->win)) && (h->flags & XUrgencyHint) && c != sel)
  136. {
  137. client_urgent(c, True);
  138. XFree(h);
  139. }
  140. */
  141. break;
  142. default:
  143. if(ev->atom == XA_WM_NAME || ev->atom == W->net_atom[net_wm_name])
  144. client_get_name(c);
  145. break;
  146. }
  147. }
  148. }
  149. static void
  150. event_unmapnotify(XEvent *e)
  151. {
  152. XUnmapEvent *ev = &e->xunmap;
  153. struct client *c;
  154. if((c = client_gb_win(ev->window)) && ev->send_event)
  155. client_remove(c);
  156. }
  157. /*
  158. static void
  159. event_motionnotify(XEvent *e)
  160. {
  161. XMotionEvent *ev = &e->xmotion;
  162. struct client *c;
  163. if((c = client_gb_win(ev->subwindow)) && c != c->tag->sel)
  164. client_focus(c);
  165. }
  166. */
  167. static void
  168. event_keypress(XEvent *e)
  169. {
  170. XKeyPressedEvent *ev = &e->xkey;
  171. KeySym keysym = XKeycodeToKeysym(EVDPY(e), (KeyCode)ev->keycode, 0);
  172. struct keybind *k;
  173. screen_update_sel();
  174. SLIST_FOREACH(k, &W->h.keybind, next)
  175. if(k->keysym == keysym && KEYPRESS_MASK(k->mod) == KEYPRESS_MASK(ev->state))
  176. if(k->func)
  177. k->func(k->cmd);
  178. }
  179. static void
  180. event_expose(XEvent *e)
  181. {
  182. XExposeEvent *ev = &e->xexpose;
  183. struct barwin *b;
  184. SLIST_FOREACH(b, &W->h.barwin, next)
  185. if(b->win == ev->window)
  186. {
  187. barwin_refresh(b);
  188. return;
  189. }
  190. }
  191. static void
  192. event_dummy(XEvent *e)
  193. {
  194. /* printf("%d\n", e->type);*/
  195. (void)e;
  196. }
  197. void
  198. event_init(void)
  199. {
  200. int i = MAX_EV;
  201. while(i--)
  202. event_handle[i] = event_dummy;
  203. event_handle[ButtonPress] = event_buttonpress;
  204. event_handle[ClientMessage] = event_clientmessageevent;
  205. event_handle[ConfigureRequest] = event_configureevent;
  206. event_handle[DestroyNotify] = event_destroynotify;
  207. event_handle[EnterNotify] = event_enternotify;
  208. event_handle[Expose] = event_expose;
  209. event_handle[FocusIn] = event_focusin;
  210. event_handle[KeyPress] = event_keypress;
  211. /*event_handle[MapNotify] = event_mapnotify;*/
  212. event_handle[MapRequest] = event_maprequest;
  213. event_handle[MappingNotify] = event_mappingnotify;
  214. /*event_handle[MotionNotify] = event_motionnotify;*/
  215. event_handle[PropertyNotify] = event_propertynotify;
  216. /*event_handle[ReparentNotify] = event_reparentnotify;*/
  217. /*event_handle[SelectionClear] = event_selectionclearevent;*/
  218. event_handle[UnmapNotify] = event_unmapnotify;
  219. }