diff --git a/src/client.c b/src/client.c index b031167..7dca3e9 100644 --- a/src/client.c +++ b/src/client.c @@ -296,19 +296,36 @@ void uicb_client_kill(uicb_t cmd) { XEvent ev; + Atom *atom = NULL; + int proto; + Bool canbedel = 0; CHECK(sel); - ev.type = ClientMessage; - ev.xclient.window = sel->win; - ev.xclient.message_type = wm_atom[WMProtocols]; - ev.xclient.format = 32; - ev.xclient.data.l[0] = wm_atom[WMDelete]; - ev.xclient.data.l[1] = CurrentTime; - - XSendEvent(dpy, sel->win, False, NoEventMask, &ev); - client_unmanage(sel); - XSetErrorHandler(errorhandler); + if(XGetWMProtocols(dpy, sel->win, &atom, &proto) && atom) + { + while(proto--) + if(atom[proto] == wm_atom[WMDelete]) + ++canbedel; + XFree(atom); + if(canbedel) + { + ev.type = ClientMessage; + ev.xclient.window = sel->win; + ev.xclient.message_type = wm_atom[WMProtocols]; + ev.xclient.format = 32; + ev.xclient.data.l[0] = wm_atom[WMDelete]; + ev.xclient.data.l[1] = CurrentTime; + ev.xclient.data.l[2] = 0; + ev.xclient.data.l[3] = 0; + ev.xclient.data.l[4] = 0; + XSendEvent(dpy, sel->win, False, NoEventMask, &ev); + } + else + XDestroyWindow(dpy, sel->win); + } + else + XDestroyWindow(dpy, sel->win); return; } @@ -342,6 +359,8 @@ client_manage(Window w, XWindowAttributes *wa) Client *c, *t = NULL; Window trans; Status rettrans; + XSetWindowAttributes at; + c = emalloc(1, sizeof(Client)); c->win = w; @@ -350,10 +369,11 @@ client_manage(Window w, XWindowAttributes *wa) c->geo.width = wa->width; c->geo.height = wa->height; c->tag = seltag; + at.event_mask = PropertyChangeMask; frame_create(c); client_size_hints(c); - XSelectInput(dpy, c->win, PropertyChangeMask | StructureNotifyMask); + XChangeWindowAttributes(dpy, c->win, CWEventMask, &at); mouse_grabbuttons(c, False); if((rettrans = XGetTransientForHint(dpy, w, &trans) == Success)) for(t = clients; t && t->win != trans; t = t->next); diff --git a/src/event.c b/src/event.c index 5f98579..9dac66e 100644 --- a/src/event.c +++ b/src/event.c @@ -137,6 +137,7 @@ configurerequest(XConfigureRequestEvent *ev) } else client_configure(c); + } else { @@ -147,7 +148,6 @@ configurerequest(XConfigureRequestEvent *ev) wc.border_width = ev->border_width; wc.sibling = ev->above; wc.stack_mode = ev->detail; - XConfigureWindow(dpy, ev->window, ev->value_mask, &wc); } XSync(dpy, False); @@ -227,7 +227,7 @@ void focusin(XFocusChangeEvent *ev) { if(sel && ev->window != sel->win) - XSetInputFocus(dpy, sel->win, RevertToPointerRoot, CurrentTime); + client_focus(sel); return; } @@ -282,7 +282,7 @@ keypress(XKeyPressedEvent *ev) * \param ev XMappingEvent pointer */ void -mapnotify(XMappingEvent *ev) +mappingnotify(XMappingEvent *ev) { if(ev->request == MappingKeyboard) grabkeys(); @@ -303,6 +303,7 @@ maprequest(XMapRequestEvent *ev) if(!client_gb_win(ev->window)) client_manage(ev->window, &at); + return; } @@ -339,28 +340,6 @@ propertynotify(XPropertyEvent *ev) return; } -/** UnmapNotify handle event - * \param ev XUnmapEvent pointer - */ -void -unmapnotify(XUnmapEvent *ev) -{ - Client *c; - - if((c = client_gb_win(ev->window)) - && ev->event == root - && ev->send_event - && getwinstate(c->win) == NormalState - && !c->hide) - { - XReparentWindow(dpy, c->win, root, 0, 0); - client_unmanage(c); - XSetErrorHandler(errorhandler); - } - - return; -} - /** Event handle function: execute every function * handle by event * \param ev Event @@ -368,6 +347,8 @@ unmapnotify(XUnmapEvent *ev) void getevent(XEvent ev) { + + switch (ev.type) { case ButtonPress: buttonpress(&ev.xbutton); break; @@ -378,10 +359,10 @@ getevent(XEvent ev) case FocusIn: focusin(&ev.xfocus); break; case KeyPress: keypress(&ev.xkey); break; case MapRequest: maprequest(&ev.xmaprequest); break; - case MappingNotify: mapnotify(&ev.xmapping); break; + case MappingNotify: mappingnotify(&ev.xmapping); break; case PropertyNotify: propertynotify(&ev.xproperty); break; - case UnmapNotify: unmapnotify(&ev.xunmap); break; } + return; } diff --git a/src/frame.c b/src/frame.c index dac1cda..261c5cb 100644 --- a/src/frame.c +++ b/src/frame.c @@ -41,9 +41,10 @@ frame_create(Client *c) { XSetWindowAttributes at; - at.background_pixel = conf.client.bordernormal; + at.background_pixel = conf.client.bordernormal; at.background_pixmap = ParentRelative; at.override_redirect = True; + at.bit_gravity = StaticGravity; at.event_mask = SubstructureRedirectMask|SubstructureNotifyMask |ExposureMask|VisibilityChangeMask |EnterWindowMask|LeaveWindowMask|FocusChangeMask diff --git a/src/wmfs.c b/src/wmfs.c index ff25492..00579c9 100644 --- a/src/wmfs.c +++ b/src/wmfs.c @@ -45,6 +45,10 @@ errorhandler(Display *d, XErrorEvent *event) exit(EXIT_FAILURE); } + /* Ignore focus change error */ + if(event->request_code == 42) + return 0; + XGetErrorText(d, event->error_code, mess, 128); fprintf(stderr, "WMFS error: %s(%d) opcodes %d/%d\n resource #%lx\n", mess, event->error_code, diff --git a/src/wmfs.h b/src/wmfs.h index 559ccfc..9bcd32e 100644 --- a/src/wmfs.h +++ b/src/wmfs.h @@ -151,10 +151,9 @@ void expose(XExposeEvent *ev); void focusin(XFocusChangeEvent *ev); void grabkeys(void); void keypress(XKeyPressedEvent *ev); -void mapnotify(XMappingEvent *ev); +void mappingnotify(XMappingEvent *ev); void maprequest(XMapRequestEvent *ev); void propertynotify(XPropertyEvent *ev); -void unmapnotify(XUnmapEvent *ev); void getevent(XEvent ev); /* mouse.c */