X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=event.c;h=61dcec59a8fdbc74940b80a363fa8126b256f45b;hb=59b4a5e4cac68dfe6d245b8b708c3cb805f49f6d;hp=909012d73a190aa2d4e11391320e07e7d4c2768b;hpb=16c67f32d62849792c8e6d4fdec22a1896f9c279;p=dwm.git diff --git a/event.c b/event.c index 909012d..61dcec5 100644 --- a/event.c +++ b/event.c @@ -4,13 +4,16 @@ */ #include +#include #include #include #include +#include -#include "wm.h" +#include "dwm.h" /* local functions */ +static void buttonpress(XEvent *e); static void configurerequest(XEvent *e); static void destroynotify(XEvent *e); static void enternotify(XEvent *e); @@ -22,6 +25,7 @@ static void propertynotify(XEvent *e); static void unmapnotify(XEvent *e); void (*handler[LASTEvent]) (XEvent *) = { + [ButtonPress] = buttonpress, [ConfigureRequest] = configurerequest, [DestroyNotify] = destroynotify, [EnterNotify] = enternotify, @@ -34,13 +38,30 @@ void (*handler[LASTEvent]) (XEvent *) = { [UnmapNotify] = unmapnotify }; -unsigned int -flush_masked_events(long even_mask) +static void +buttonpress(XEvent *e) { - XEvent ev; - unsigned int n = 0; - while(XCheckMaskEvent(dpy, even_mask, &ev)) n++; - return n; + XButtonPressedEvent *ev = &e->xbutton; + Client *c; + + if(barwin == ev->window) + barclick(ev); + else if((c = getclient(ev->window))) { + craise(c); + switch(ev->button) { + default: + break; + case Button1: + mmove(c); + break; + case Button2: + lower(c); + break; + case Button3: + mresize(c); + break; + } + } } static void @@ -50,26 +71,28 @@ configurerequest(XEvent *e) XWindowChanges wc; Client *c; - c = getclient(ev->window); ev->value_mask &= ~CWSibling; - if(c) { + if((c = getclient(ev->window))) { + gravitate(c, True); if(ev->value_mask & CWX) - c->r[RFloat].x = ev->x; + c->x = ev->x; if(ev->value_mask & CWY) - c->r[RFloat].y = ev->y; + c->y = ev->y; if(ev->value_mask & CWWidth) - c->r[RFloat].width = ev->width; + c->w = ev->width; if(ev->value_mask & CWHeight) - c->r[RFloat].height = ev->height; + c->h = ev->height; if(ev->value_mask & CWBorderWidth) - c->border = ev->border_width; + c->border = 1; + gravitate(c, False); + resize(c, True); } wc.x = ev->x; wc.y = ev->y; wc.width = ev->width; wc.height = ev->height; - wc.border_width = 0; + wc.border_width = 1; wc.sibling = None; wc.stack_mode = Above; ev->value_mask &= ~CWStackMode; @@ -81,37 +104,26 @@ configurerequest(XEvent *e) static void destroynotify(XEvent *e) { -#if 0 Client *c; XDestroyWindowEvent *ev = &e->xdestroywindow; - if((c = client_of_win(ev->window))) - destroy_client(c); -#endif + if((c = getclient(ev->window))) + unmanage(c); } static void enternotify(XEvent *e) { -#if 0 XCrossingEvent *ev = &e->xcrossing; Client *c; if(ev->mode != NotifyNormal || ev->detail == NotifyInferior) return; - if((c = client_of_win(ev->window))) { - Frame *f = c->sel; - Area *a = f->area; - if(a->mode == Colmax) - c = a->sel->client; - focus(c, False); - } - else if(ev->window == root) { - sel_screen = True; - draw_frames(); - } -#endif + if((c = getclient(ev->window))) + focus(c); + else if(ev->window == root) + issel = True; } static void @@ -119,29 +131,28 @@ leavenotify(XEvent *e) { XCrossingEvent *ev = &e->xcrossing; - if((ev->window == root) && !ev->same_screen) { - sel_screen = True; - /*draw_frames();*/ - } + if((ev->window == root) && !ev->same_screen) + issel = True; } static void expose(XEvent *e) { XExposeEvent *ev = &e->xexpose; + Client *c; if(ev->count == 0) { - if(ev->window == barwin) + if(barwin == ev->window) draw_bar(); + else if((c = gettitle(ev->window))) + draw_client(c); } } static void keymapnotify(XEvent *e) { -#if 0 update_keys(); -#endif } static void @@ -159,37 +170,49 @@ maprequest(XEvent *e) return; } - /*if(!client_of_win(ev->window))*/ - /*manage(create_client(ev->window, &wa));*/ - XMapRaised(dpy, ev->window); - XMoveResizeWindow(dpy, ev->window, rect.x, rect.y, rect.width, rect.height - barrect.height); - XSetInputFocus(dpy, ev->window, RevertToPointerRoot, CurrentTime); - XFlush(dpy); + if(!getclient(ev->window)) + manage(ev->window, &wa); } static void propertynotify(XEvent *e) { -#if 0 XPropertyEvent *ev = &e->xproperty; + Window trans; Client *c; if(ev->state == PropertyDelete) return; /* ignore */ - if((c = client_of_win(ev->window))) - prop_client(c, ev); -#endif + if((c = getclient(ev->window))) { + if(ev->atom == wm_atom[WMProtocols]) { + c->proto = win_proto(c->win); + return; + } + switch (ev->atom) { + default: break; + case XA_WM_TRANSIENT_FOR: + XGetTransientForHint(dpy, c->win, &trans); + if(!c->floating && (c->floating = (trans != 0))) + arrange(NULL); + break; + case XA_WM_NORMAL_HINTS: + update_size(c); + break; + } + if(ev->atom == XA_WM_NAME || ev->atom == net_atom[NetWMName]) { + update_name(c); + draw_client(c); + } + } } static void unmapnotify(XEvent *e) { -#if 0 Client *c; XUnmapEvent *ev = &e->xunmap; - if((c = client_of_win(ev->window))) - destroy_client(c); -#endif + if((c = getclient(ev->window))) + unmanage(c); }