diff --git a/wmfs2/src/event.c b/wmfs2/src/event.c index f557c1f..aca6e2d 100755 --- a/wmfs2/src/event.c +++ b/wmfs2/src/event.c @@ -24,6 +24,25 @@ event_enternotify(XEvent *e) client_focus(c); } +static void +event_destroynotify(XEvent *e) +{ + XDestroyWindowEvent *ev = &e->xdestroywindow; + Client *c; + + if((c = client_gb_win(ev->window))) + client_unmanage(c); +} + +static void +event_focusin(XEvent *e) +{ + Client *c; + + if((c = W->screen->seltag->sel) && e->xfocus.window != c->win) + client_focus(c); +} + static void event_maprequest(XEvent *e) { @@ -39,7 +58,101 @@ event_maprequest(XEvent *e) (Client*)client_new(ev->window, at); } +static void +event_mappingnotify(XEvent *e) +{ + XMappingEvent *ev = &e->xmapping; + XRefreshKeyboardMapping(ev); + if(ev->request == MappingKeyboard) + wmfs_grab_keys(); +} + +static void +event_propertynotify(XEvent *e) +{ + XPropertyEvent *ev = &e->xproperty; + Client *c; + + if(ev->state == PropertyDelete) + return; + + if((c = client_gb_win(ev->window))) + { + switch(ev->atom) + { + case XA_WM_TRANSIENT_FOR: + break; + case XA_WM_NORMAL_HINTS: + /* client_get_size_hints(c); */ + break; + case XA_WM_HINTS: + /* + XWMHints *h; + + if((h = XGetWMHints(EVDPY, c->win)) && (h->flags & XUrgencyHint) && c != sel) + { + client_urgent(c, True); + XFree(h); + } + */ + break; + default: + if(ev->atom == XA_WM_NAME /* || ev->atom == _NET_WM_NAME */) + client_get_name(c); + break; + } + } +} + +static void +event_unmapnotify(XEvent *e) +{ + XUnmapEvent *ev = &e->xunmap; + Client *c; + + if((c = client_gb_win(ev->window)) && ev->send_event) + client_remove(c); +} + +static void +event_motionnotify(XEvent *e) +{ + /* + XMotionEvent *ev = &e->xmotion; + Client *c; + + + * Option follow mouvement + if((c = client_gb_win(ev->subwindow)) && c != c->tag->sel) + client_focus(c); + */ +} + +static void +event_keypress(XEvent *e) +{ + XKeyPressedEvent *ev = &e->xkey; + KeySym keysym; + Keybind *k; + Flags m = ~(W->numlockmask | LockMask); + + keysym = XKeycodeToKeysym(EVDPY, (KeyCode)ev->keycode, 0); + + SLIST_FOREACH(k, W->h.keybind, next) + if(k->keysym == keysym && (k->mod & m) == (ev->state & m)) + if(k->func) + k->func(k->cmd); +} + +static void +event_expose(XEvent *e) +{ + /* + * XExposeEvent *ev = &e->xexpose; + */ + +} static void event_dummy(XEvent *e) @@ -55,5 +168,21 @@ event_init(void) while(i--) event_handle[i] = event_dummy; + event_handle[ButtonPress] = event_buttonpress; + /*event_handle[ClientMessage] = event_clientmessageevent;*/ + /*event_handle[ConfigureRequest] = event_configureevent;*/ + event_handle[DestroyNotify] = event_destroynotify; + event_handle[EnterNotify] = event_enternotify; + event_handle[Expose] = event_expose; + event_handle[FocusIn] = event_focusin; + event_handle[KeyPress] = event_keypress; + /*event_handle[MapNotify] = event_mapnotify;*/ + event_handle[MapRequest] = event_maprequest; + event_handle[MappingNotify] = event_mappingnotify; + event_handle[MotionNotify] = event_motionnotify; + event_handle[PropertyNotify] = event_propertynotify; + /*event_handle[ReparentNotify] = event_reparentnotify;*/ + /*event_handle[SelectionClear] = event_selectionclearevent;*/ + event_handle[UnmapNotify] = event_unmapnotify; } diff --git a/wmfs2/src/wmfs.c b/wmfs2/src/wmfs.c index cc3ad2c..d2507e0 100755 --- a/wmfs2/src/wmfs.c +++ b/wmfs2/src/wmfs.c @@ -147,6 +147,9 @@ wmfs_init(void) /* X init */ wmfs_xinit(); + /* Event init */ + event_init(); + /* Screen init */ screen_init(); @@ -182,6 +185,7 @@ main(int argc, char **argv) /* Opt */ + /* Core */ wmfs_init(); wmfs_loop();