diff -r 7c5d5b1e49c9 dwm.h --- a/dwm.h Thu Feb 08 14:09:52 2007 +0100 +++ b/dwm.h Fri Feb 09 22:56:57 2007 +0100 @@ -36,6 +36,13 @@ /* mask shorthands, used in event.c and client.c */ #define BUTTONMASK (ButtonPressMask | ButtonReleaseMask) + +#define MOVEX 1<<30 +#define MOVEY 1<<29 +#define RESIZEX 1<<28 +#define RESIZEY 1<<27 +#define ABSOLUTE 1<<26 +#define NEGATIVE 1<<25 enum { NetSupported, NetWMName, NetLast }; /* EWMH atoms */ enum { WMProtocols, WMDelete, WMState, WMLast }; /* default atoms */ @@ -153,3 +160,4 @@ extern void toggleview(Arg *arg); /* to extern void toggleview(Arg *arg); /* toggles the tag with arg's index (in)visible */ extern void view(Arg *arg); /* views the tag with arg's index */ extern void zoom(Arg *arg); /* zooms the focused client to master area, arg is ignored */ +extern void moveresize(Arg *arg); /* resizes or moves selected window */ diff -r 7c5d5b1e49c9 view.c --- a/view.c Thu Feb 08 14:09:52 2007 +0100 +++ b/view.c Fri Feb 09 23:03:45 2007 +0100 @@ -269,3 +269,65 @@ zoom(Arg *arg) { focus(c); arrange(); } + +/* + * arg i = int + * 2^30 = x + * 2^29 = y + * 2^28 = w + * 2^27 = h + * 2^26 = absolute value + * 2^25 = negative value + * 2^0-2^24 = values + */ +void +moveresize(Arg *arg) { + int value = arg->i & (((1<<25) - 1) | 1<<31); + value = arg->i & NEGATIVE ? 0-value : value; + int i = 32; + if (!sel || !sel->isfloat) { return; } + + if (arg->i & MOVEX) + { + if (arg->i & ABSOLUTE) + { + if ((sel->w + value) > sw) + value = sw - sel->w; + sel->x = value; + } else + { + sel->x += value; + } + } else if (arg->i & MOVEY) + { + if (arg->i & ABSOLUTE) + { + if ((sel->h + value) > sh) + value = sh - sel->h; + sel->y = value; + } else + { + sel->y += value; + } + } else if (arg->i & RESIZEX) + { + if (arg->i & ABSOLUTE) + { + sel->w = value; + } else + { + sel->w += value; + } + } else if (arg->i & RESIZEY) + { + if (arg->i & ABSOLUTE) + { + sel->h = value; + } else + { + sel->h += value; + } + } + + resize(sel, False); +}