diff options
| -rw-r--r-- | client.c | 10 | ||||
| -rw-r--r-- | dwm.h | 5 | ||||
| -rw-r--r-- | event.c | 39 | ||||
| -rw-r--r-- | main.c | 2 | ||||
| -rw-r--r-- | tag.c | 6 | 
5 files changed, 43 insertions, 19 deletions
| @@ -267,7 +267,7 @@ maximize(Arg *arg)  	*sel->w = sw - 2 * sel->border;  	*sel->h = sh - 2 * sel->border - bh;  	higher(sel); -	resize(sel, False); +	resize(sel, False, TopLeft);  }  void @@ -283,9 +283,11 @@ pop(Client *c)  }  void -resize(Client *c, Bool inc) +resize(Client *c, Bool inc, Corner sticky)  {  	XConfigureEvent e; +	int right = *c->x + *c->w; +	int bottom = *c->y + *c->h;  	if(inc) {  		if(c->incw) @@ -305,6 +307,10 @@ resize(Client *c, Bool inc)  		*c->w = c->maxw;  	if(c->maxh && *c->h > c->maxh)  		*c->h = c->maxh; +	if(sticky == TopRight || sticky == BottomRight) +		*c->x = right - *c->w; +	if(sticky == BottomLeft || sticky == BottomRight) +		*c->y = bottom - *c->h;  	resizetitle(c);  	XSetWindowBorderWidth(dpy, c->win, 1);  	XMoveResizeWindow(dpy, c->win, *c->x, *c->y, *c->w, *c->h); @@ -25,6 +25,7 @@ enum { Tscratch, Tdev, Twww, Twork, TLast };  /********** CUSTOMIZE **********/  typedef union Arg Arg; +typedef enum Corner Corner;  typedef struct DC DC;  typedef struct Client Client;  typedef struct Fnt Fnt; @@ -43,6 +44,8 @@ enum { WMProtocols, WMDelete, WMLast };  /* cursor */  enum { CurNormal, CurResize, CurMove, CurLast }; +enum Corner { TopLeft, TopRight, BottomLeft, BottomRight }; +  struct Fnt {  	int ascent;  	int descent; @@ -121,7 +124,7 @@ extern void lower(Client *c);  extern void manage(Window w, XWindowAttributes *wa);  extern void maximize(Arg *arg);  extern void pop(Client *c); -extern void resize(Client *c, Bool inc); +extern void resize(Client *c, Bool inc, Corner sticky);  extern void setgeom(Client *c);  extern void setsize(Client *c);  extern void settitle(Client *c); @@ -79,7 +79,7 @@ movemouse(Client *c)  			XSync(dpy, False);  			*c->x = ocx + (ev.xmotion.x - x1);  			*c->y = ocy + (ev.xmotion.y - y1); -			resize(c, False); +			resize(c, False, TopLeft);  			break;  		case ButtonRelease:  			XUngrabPointer(dpy, CurrentTime); @@ -93,6 +93,7 @@ resizemouse(Client *c)  {  	XEvent ev;  	int ocx, ocy; +	Corner sticky;  	ocx = *c->x;  	ocy = *c->y; @@ -113,7 +114,18 @@ resizemouse(Client *c)  			*c->h = abs(ocy - ev.xmotion.y);  			*c->x = (ocx <= ev.xmotion.x) ? ocx : ocx - *c->w;  			*c->y = (ocy <= ev.xmotion.y) ? ocy : ocy - *c->h; -			resize(c, True); +			if(ocx <= ev.xmotion.x) { +				if(ocy <= ev.xmotion.y) +					sticky = TopLeft; +				else +					sticky = BottomLeft; +			} else { +				if(ocy <= ev.xmotion.y) +					sticky = TopRight; +				else +					sticky = BottomRight; +			} +			resize(c, True, sticky);  			break;  		case ButtonRelease:  			XUngrabPointer(dpy, CurrentTime); @@ -153,24 +165,27 @@ buttonpress(XEvent *e)  		}  	}  	else if((c = getclient(ev->window))) { -		if(arrange == dotile && !c->isfloat) { -			if((ev->state & ControlMask) && (ev->button == Button1)) -				zoom(NULL); -			return; -		} -		/* floating windows */ -		higher(c);  		switch(ev->button) {  		default:  			break;  		case Button1: -			movemouse(c); +			if(arrange == dotile && !c->isfloat) { +				if((ev->state & ControlMask) && (ev->button == Button1)) +					zoom(NULL); +			} +			else { +				higher(c); +				movemouse(c); +			}  			break;  		case Button2:  			lower(c);  			break;  		case Button3: -			resizemouse(c); +			if(arrange == dofloat || c->isfloat) { +				higher(c); +				resizemouse(c); +			}  			break;  		}  	} @@ -197,7 +212,7 @@ configurerequest(XEvent *e)  		if(ev->value_mask & CWBorderWidth)  			c->border = 1;  		gravitate(c, False); -		resize(c, True); +		resize(c, True, TopLeft);  	}  	wc.x = ev->x; @@ -24,7 +24,7 @@ static void  cleanup()  {  	while(sel) { -		resize(sel, True); +		resize(sel, True, TopLeft);  		unmanage(sel);  	}  	XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime); @@ -45,7 +45,7 @@ dofloat(Arg *arg)  	for(c = clients; c; c = c->next) {  		setgeom(c);  		if(c->tags[tsel]) { -			resize(c, True); +			resize(c, True, TopLeft);  		}  		else  			ban(c); @@ -81,7 +81,7 @@ dotile(Arg *arg)  		if(c->tags[tsel]) {  			if(c->isfloat) {  				higher(c); -				resize(c, True); +				resize(c, True, TopLeft);  				continue;  			}  			if(n == 1) { @@ -102,7 +102,7 @@ dotile(Arg *arg)  				*c->w = w - 2 * c->border;  				*c->h = h - 2 * c->border;  			} -			resize(c, False); +			resize(c, False, TopLeft);  			i++;  		}  		else | 
