added an creatnotify event handler

master
Anselm R. Garbe 2007-06-04 11:50:48 +02:00
parent 5a1a2edf0e
commit 83aa110c6f
4 changed files with 56 additions and 40 deletions

View File

@ -96,6 +96,14 @@ attach(Client *c) {
clients = c;
}
void
ban(Client *c) {
if (c->isbanned)
return;
XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y);
c->isbanned = True;
}
void
configure(Client *c) {
XConfigureEvent ce;
@ -298,6 +306,37 @@ togglefloating(const char *arg) {
lt->arrange();
}
void
unban(Client *c) {
if (!c->isbanned)
return;
XMoveWindow(dpy, c->win, c->x, c->y);
c->isbanned = False;
}
void
unmanage(Client *c) {
XWindowChanges wc;
wc.border_width = c->oldborder;
/* The server grab construct avoids race conditions. */
XGrabServer(dpy);
XSetErrorHandler(xerrordummy);
XConfigureWindow(dpy, c->win, CWBorderWidth, &wc); /* restore border */
detach(c);
detachstack(c);
if(sel == c)
focus(NULL);
XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
setclientstate(c, WithdrawnState);
free(c->tags);
free(c);
XSync(dpy, False);
XSetErrorHandler(xerror);
XUngrabServer(dpy);
lt->arrange();
}
void
updatesizehints(Client *c) {
long msize;
@ -376,26 +415,3 @@ updatetitle(Client *c) {
c->name[sizeof c->name - 1] = '\0';
XFree(name.value);
}
void
unmanage(Client *c) {
XWindowChanges wc;
wc.border_width = c->oldborder;
/* The server grab construct avoids race conditions. */
XGrabServer(dpy);
XSetErrorHandler(xerrordummy);
XConfigureWindow(dpy, c->win, CWBorderWidth, &wc); /* restore border */
detach(c);
detachstack(c);
if(sel == c)
focus(NULL);
XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
setclientstate(c, WithdrawnState);
free(c->tags);
free(c);
XSync(dpy, False);
XSetErrorHandler(xerror);
XUngrabServer(dpy);
lt->arrange();
}

4
dwm.h
View File

@ -96,6 +96,7 @@ extern Window root, barwin;
/* client.c */
void attach(Client *c); /* attaches c to global client list */
void ban(Client *c); /* bans c */
void configure(Client *c); /* send synthetic configure event */
void detach(Client *c); /* detaches c from global client list */
void focus(Client *c); /* focus c if visible && !NULL, or focus top visible */
@ -104,9 +105,10 @@ void manage(Window w, XWindowAttributes *wa); /* manage new client */
void resize(Client *c, int x, int y,
int w, int h, Bool sizehints); /* resize with given coordinates c*/
void togglefloating(const char *arg); /* toggles sel between floating/tiled state */
void unban(Client *c); /* unbans c */
void unmanage(Client *c); /* destroy c */
void updatesizehints(Client *c); /* update the size hint variables of c */
void updatetitle(Client *c); /* update the name of c */
void unmanage(Client *c); /* destroy c */
/* draw.c */
void drawstatus(void); /* draw the bar */

14
event.c
View File

@ -224,6 +224,19 @@ configurenotify(XEvent *e) {
}
}
static void
createnotify(XEvent *e) {
static XWindowAttributes wa;
XCreateWindowEvent *ev = &e->xcreatewindow;
if(!XGetWindowAttributes(dpy, ev->window, &wa))
return;
if(wa.override_redirect)
return;
if(!getclient(ev->window) && (wa.map_state == IsViewable))
manage(ev->window, &wa);
}
static void
destroynotify(XEvent *e) {
Client *c;
@ -350,6 +363,7 @@ void (*handler[LASTEvent]) (XEvent *) = {
[ButtonPress] = buttonpress,
[ConfigureRequest] = configurerequest,
[ConfigureNotify] = configurenotify,
[CreateNotify] = createnotify,
[DestroyNotify] = destroynotify,
[EnterNotify] = enternotify,
[LeaveNotify] = leavenotify,

View File

@ -11,22 +11,6 @@ static unsigned int nlayouts = 0;
static unsigned int masterw = MASTERWIDTH;
static unsigned int nmaster = NMASTER;
static void
ban(Client *c) {
if (c->isbanned)
return;
XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y);
c->isbanned = True;
}
static void
unban(Client *c) {
if (!c->isbanned)
return;
XMoveWindow(dpy, c->win, c->x, c->y);
c->isbanned = False;
}
static void
tile(void) {
unsigned int i, n, nx, ny, nw, nh, mw, mh, tw, th;