diff --git a/client.c b/client.c index f840aa3..c23c8f5 100644 --- a/client.c +++ b/client.c @@ -129,22 +129,25 @@ void checksizehints(Client *c) { long supplied; - XGetWMNormalHints(dpy, c->window, &c->sizehints, &supplied); - if(!(c->sizehints.flags&PMinSize)) - c->sizehints.min_width=c->sizehints.min_height=0; - if(!(c->sizehints.flags&PMaxSize)) - c->sizehints.max_width=c->sizehints.max_height=1<<30; - if(!(c->sizehints.flags&PResizeInc)) - c->sizehints.width_inc=c->sizehints.height_inc=1; - if(c->sizehints.flags&PBaseSize) { - c->sizehints.min_width=c->sizehints.base_width; - c->sizehints.min_height=c->sizehints.base_height; + XGetWMNormalHints(dpy, c->window, c->sizehints, &supplied); + + + if(!(c->sizehints->flags&PMinSize)) + c->sizehints->min_width=c->sizehints->min_height=0; + if(!(c->sizehints->flags&PMaxSize)) { + c->sizehints->max_width=c->sizehints->max_height=1<<30; } - if(c->sizehints.min_width<1) c->sizehints.min_width=1; - if(c->sizehints.min_height<1) c->sizehints.min_height=1; - c->sizehints.base_width=c->sizehints.min_width; - c->sizehints.base_height=c->sizehints.min_height; - if(c->sizehints.flags&PWinGravity) c->gravity=c->sizehints.win_gravity; + if(!(c->sizehints->flags&PResizeInc)) + c->sizehints->width_inc=c->sizehints->height_inc=1; + if(c->sizehints->flags&PBaseSize) { + c->sizehints->min_width=c->sizehints->base_width; + c->sizehints->min_height=c->sizehints->base_height; + } + if(c->sizehints->min_width<1) c->sizehints->min_width=1; + if(c->sizehints->min_height<1) c->sizehints->min_height=1; + c->sizehints->base_width=c->sizehints->min_width; + c->sizehints->base_height=c->sizehints->min_height; + if(c->sizehints->flags&PWinGravity) c->gravity=c->sizehints->win_gravity; } void setclientstate(Client *c, int state) @@ -183,6 +186,7 @@ Client *createclient(Window w) XGetWindowAttributes(dpy, w, &attr); c = (Client *)calloc(1, sizeof(Client)); + c->sizehints = XAllocSizeHints(); c->scr = scr; c->window = w; c->parent = scr->root; @@ -215,37 +219,37 @@ Client *createclient(Window w) checksizehints(c); c->zoomx=0; c->zoomy=scr->bh; - if ((c->sizehints.width_inc && - c->sizehints.min_width+c->sizehints.width_inc<=c->sizehints.max_width)|| - (c->sizehints.height_inc && - c->sizehints.min_height+c->sizehints.height_inc<=c->sizehints.max_height)) + if ((c->sizehints->width_inc && + c->sizehints->min_width+c->sizehints->width_inc<=c->sizehints->max_width)|| + (c->sizehints->height_inc && + c->sizehints->min_height+c->sizehints->height_inc<=c->sizehints->max_height)) b = prefs.sizeborder; - if(c->sizehints.width_inc) { - c->zoomw=scr->width-c->sizehints.base_width; + if(c->sizehints->width_inc) { + c->zoomw=scr->width-c->sizehints->base_width; if (b & Psizeright) c->zoomw-=22; else c->zoomw-=8; - c->zoomw-=c->zoomw%c->sizehints.width_inc; - c->zoomw+=c->sizehints.base_width; - if(c->zoomw>c->sizehints.max_width) - c->zoomw=c->sizehints.max_width; - if(c->zoomwsizehints.min_width) - c->zoomw=c->sizehints.min_width; + c->zoomw-=c->zoomw%c->sizehints->width_inc; + c->zoomw+=c->sizehints->base_width; + if(c->zoomw>c->sizehints->max_width) + c->zoomw=c->sizehints->max_width; + if(c->zoomwsizehints->min_width) + c->zoomw=c->sizehints->min_width; } else c->zoomw=attr.width; - if(c->sizehints.height_inc) { - c->zoomh=scr->height-c->sizehints.base_height-scr->bh-c->zoomy; + if(c->sizehints->height_inc) { + c->zoomh=scr->height-c->sizehints->base_height-scr->bh-c->zoomy; if (b & Psizebottom) c->zoomh -= 10; else c->zoomh -= 2; - c->zoomh-=c->zoomh%c->sizehints.height_inc; - c->zoomh+=c->sizehints.base_height; - if(c->zoomh>c->sizehints.max_height) - c->zoomh=c->sizehints.max_height; - if(c->zoomhsizehints.min_height) - c->zoomh=c->sizehints.min_height; + c->zoomh-=c->zoomh%c->sizehints->height_inc; + c->zoomh+=c->sizehints->base_height; + if(c->zoomh>c->sizehints->max_height) + c->zoomh=c->sizehints->max_height; + if(c->zoomhsizehints->min_height) + c->zoomh=c->sizehints->min_height; } else c->zoomh=attr.height; XSaveContext(dpy, w, client_context, (XPointer)c); @@ -301,6 +305,8 @@ void rmclient(Client *c) rmicon(c->icon); if(c->window) XDeleteContext(dpy, c->window, client_context); + if (c->sizehints) + XFree(c->sizehints); free(c); } diff --git a/client.h b/client.h index 0754eec..2c9560b 100644 --- a/client.h +++ b/client.h @@ -25,7 +25,8 @@ typedef struct _Client { #else XTextProperty title; #endif - XSizeHints sizehints; + /* This needs to be a pointer! */ + XSizeHints *sizehints; struct _Style *style; } Client; diff --git a/frame.c b/frame.c index ddbdd4e..9b9c003 100644 --- a/frame.c +++ b/frame.c @@ -249,7 +249,7 @@ void reparent(Client *c) for(kg=keygrabs; kg; kg=kg->next) XGrabKey(dpy, kg->keycode, kg->modifiers, c->window, False, GrabModeAsync, GrabModeAsync); - cb=(resizable(&c->sizehints)? prefs.sizeborder:0); + cb=(resizable(c->sizehints)? prefs.sizeborder:0); c->close=creategadget(c, c->parent, 0, 0, 19, scr->bh); c->drag=creategadget(c, c->parent, 19, 0, 1, 1); if(c->wflags&WF_NOICONIFY) diff --git a/main.c b/main.c index c467527..dc84fc7 100644 --- a/main.c +++ b/main.c @@ -1003,9 +1003,12 @@ int main(int argc, char *argv[]) } break; case CreateNotify: + if(!XFindContext(dpy, event.xcreatewindow.window, client_context, - (XPointer *)&c)) + (XPointer *)&c)) { break; + } + if(!event.xcreatewindow.override_redirect) { if(!(scr=getscreenbyroot(event.xcreatewindow.parent))) scr=front; @@ -1429,26 +1432,26 @@ int main(int argc, char *argv[]) } else if(resizeclient) { int rw=rubberw, rh=rubberh; scr=resizeclient->scr; - if(resizeclient->sizehints.width_inc) { - rw=motionx-rubberx0-resizeclient->sizehints.base_width- + if(resizeclient->sizehints->width_inc) { + rw=motionx-rubberx0-resizeclient->sizehints->base_width- resizeclient->framewidth; - rw-=rw%resizeclient->sizehints.width_inc; - rw+=resizeclient->sizehints.base_width; - if(rw>resizeclient->sizehints.max_width) - rw=resizeclient->sizehints.max_width; - if(rwsizehints.min_width) - rw=resizeclient->sizehints.min_width; + rw-=rw%resizeclient->sizehints->width_inc; + rw+=resizeclient->sizehints->base_width; + if(rw>resizeclient->sizehints->max_width) + rw=resizeclient->sizehints->max_width; + if(rwsizehints->min_width) + rw=resizeclient->sizehints->min_width; rw+=resizeclient->framewidth; } - if(resizeclient->sizehints.height_inc) { - rh=motiony-rubbery0-resizeclient->sizehints.base_height- + if(resizeclient->sizehints->height_inc) { + rh=motiony-rubbery0-resizeclient->sizehints->base_height- resizeclient->frameheight; - rh-=rh%resizeclient->sizehints.height_inc; - rh+=resizeclient->sizehints.base_height; - if(rh>resizeclient->sizehints.max_height) - rh=resizeclient->sizehints.max_height; - if(rhsizehints.min_height) - rh=resizeclient->sizehints.min_height; + rh-=rh%resizeclient->sizehints->height_inc; + rh+=resizeclient->sizehints->base_height; + if(rh>resizeclient->sizehints->max_height) + rh=resizeclient->sizehints->max_height; + if(rhsizehints->min_height) + rh=resizeclient->sizehints->min_height; rh+=resizeclient->frameheight; } if(rw!=rubberw || rh!=rubberh) {