removed c->f{x,y,w,h} and c->t{x,y,w,h} in favor for the new rule handling remembering two kinds of geometries is unnecessary, removed the randomized (x,y) setting on dofloat startup, was kind too random und unpredictable
This commit is contained in:
parent
bcaf6a7a0f
commit
11737233a7
4 changed files with 85 additions and 114 deletions
128
client.c
128
client.c
|
@ -16,19 +16,19 @@ resizetitle(Client *c)
|
|||
{
|
||||
int i;
|
||||
|
||||
c->bw = 0;
|
||||
c->tw = 0;
|
||||
for(i = 0; i < TLast; i++)
|
||||
if(c->tags[i])
|
||||
c->bw += textw(c->tags[i]);
|
||||
c->bw += textw(c->name);
|
||||
if(c->bw > *c->w)
|
||||
c->bw = *c->w + 2;
|
||||
c->bx = *c->x + *c->w - c->bw + 2;
|
||||
c->by = *c->y;
|
||||
c->tw += textw(c->tags[i]);
|
||||
c->tw += textw(c->name);
|
||||
if(c->tw > c->w)
|
||||
c->tw = c->w + 2;
|
||||
c->tx = c->x + c->w - c->tw + 2;
|
||||
c->ty = c->y;
|
||||
if(c->tags[tsel])
|
||||
XMoveResizeWindow(dpy, c->title, c->bx, c->by, c->bw, c->bh);
|
||||
XMoveResizeWindow(dpy, c->title, c->tx, c->ty, c->tw, c->th);
|
||||
else
|
||||
XMoveResizeWindow(dpy, c->title, c->bx + 2 * sw, c->by, c->bw, c->bh);
|
||||
XMoveResizeWindow(dpy, c->title, c->tx + 2 * sw, c->ty, c->tw, c->th);
|
||||
|
||||
}
|
||||
|
||||
|
@ -43,8 +43,8 @@ xerrordummy(Display *dsply, XErrorEvent *ee)
|
|||
void
|
||||
ban(Client *c)
|
||||
{
|
||||
XMoveWindow(dpy, c->win, *c->x + 2 * sw, *c->y);
|
||||
XMoveWindow(dpy, c->title, c->bx + 2 * sw, c->by);
|
||||
XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y);
|
||||
XMoveWindow(dpy, c->title, c->tx + 2 * sw, c->ty);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -128,12 +128,12 @@ gravitate(Client *c, Bool invert)
|
|||
case EastGravity:
|
||||
case CenterGravity:
|
||||
case WestGravity:
|
||||
dy = -(*c->h / 2) + c->border;
|
||||
dy = -(c->h / 2) + c->border;
|
||||
break;
|
||||
case SouthEastGravity:
|
||||
case SouthGravity:
|
||||
case SouthWestGravity:
|
||||
dy = -(*c->h);
|
||||
dy = -(c->h);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -149,12 +149,12 @@ gravitate(Client *c, Bool invert)
|
|||
case NorthGravity:
|
||||
case CenterGravity:
|
||||
case SouthGravity:
|
||||
dx = -(*c->w / 2) + c->border;
|
||||
dx = -(c->w / 2) + c->border;
|
||||
break;
|
||||
case NorthEastGravity:
|
||||
case EastGravity:
|
||||
case SouthEastGravity:
|
||||
dx = -(*c->w + c->border);
|
||||
dx = -(c->w + c->border);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -164,8 +164,8 @@ gravitate(Client *c, Bool invert)
|
|||
dx = -dx;
|
||||
dy = -dy;
|
||||
}
|
||||
*c->x += dx;
|
||||
*c->y += dy;
|
||||
c->x += dx;
|
||||
c->y += dy;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -203,19 +203,14 @@ manage(Window w, XWindowAttributes *wa)
|
|||
|
||||
c = emallocz(sizeof(Client));
|
||||
c->win = w;
|
||||
c->bx = c->fx = c->tx = wa->x;
|
||||
c->by = c->fy = c->ty = wa->y;
|
||||
c->bw = c->fw = c->tw = wa->width;
|
||||
c->fh = c->th = wa->height;
|
||||
c->bh = bh;
|
||||
c->x = c->tx = wa->x;
|
||||
c->y = c->ty = wa->y;
|
||||
c->w = c->tw = wa->width;
|
||||
c->h = wa->height;
|
||||
c->th = bh;
|
||||
|
||||
diff = sw - c->fw;
|
||||
c->fx = random() % (diff ? diff : 1);
|
||||
diff = sh - c->fh - bh;
|
||||
c->fy = random() % (diff ? diff : 1);
|
||||
|
||||
if(c->fy < bh)
|
||||
c->by = c->fy = c->ty = bh;
|
||||
if(c->y < bh)
|
||||
c->y = c->ty = bh;
|
||||
|
||||
c->border = 1;
|
||||
c->proto = getproto(c->win);
|
||||
|
@ -227,7 +222,7 @@ manage(Window w, XWindowAttributes *wa)
|
|||
twa.background_pixmap = ParentRelative;
|
||||
twa.event_mask = ExposureMask;
|
||||
|
||||
c->title = XCreateWindow(dpy, root, c->bx, c->by, c->bw, c->bh,
|
||||
c->title = XCreateWindow(dpy, root, c->tx, c->ty, c->tw, c->th,
|
||||
0, DefaultDepth(dpy, screen), CopyFromParent,
|
||||
DefaultVisual(dpy, screen),
|
||||
CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa);
|
||||
|
@ -251,9 +246,7 @@ manage(Window w, XWindowAttributes *wa)
|
|||
(c->maxw == c->minw) && (c->maxh == c->minh));
|
||||
|
||||
|
||||
setgeom(c);
|
||||
settitle(c);
|
||||
|
||||
arrange(NULL);
|
||||
|
||||
/* mapping the window now prevents flicker */
|
||||
|
@ -273,10 +266,10 @@ maximize(Arg *arg)
|
|||
{
|
||||
if(!sel)
|
||||
return;
|
||||
*sel->x = sx;
|
||||
*sel->y = sy + bh;
|
||||
*sel->w = sw - 2 * sel->border;
|
||||
*sel->h = sh - 2 * sel->border - bh;
|
||||
sel->x = sx;
|
||||
sel->y = sy + bh;
|
||||
sel->w = sw - 2 * sel->border;
|
||||
sel->h = sh - 2 * sel->border - bh;
|
||||
higher(sel);
|
||||
resize(sel, False, TopLeft);
|
||||
}
|
||||
|
@ -297,43 +290,43 @@ void
|
|||
resize(Client *c, Bool inc, Corner sticky)
|
||||
{
|
||||
XConfigureEvent e;
|
||||
int right = *c->x + *c->w;
|
||||
int bottom = *c->y + *c->h;
|
||||
int right = c->x + c->w;
|
||||
int bottom = c->y + c->h;
|
||||
|
||||
if(inc) {
|
||||
if(c->incw)
|
||||
*c->w -= (*c->w - c->basew) % c->incw;
|
||||
c->w -= (c->w - c->basew) % c->incw;
|
||||
if(c->inch)
|
||||
*c->h -= (*c->h - c->baseh) % c->inch;
|
||||
c->h -= (c->h - c->baseh) % c->inch;
|
||||
}
|
||||
if(*c->x > sw) /* might happen on restart */
|
||||
*c->x = sw - *c->w;
|
||||
if(*c->y > sh)
|
||||
*c->y = sh - *c->h;
|
||||
if(c->minw && *c->w < c->minw)
|
||||
*c->w = c->minw;
|
||||
if(c->minh && *c->h < c->minh)
|
||||
*c->h = c->minh;
|
||||
if(c->maxw && *c->w > c->maxw)
|
||||
*c->w = c->maxw;
|
||||
if(c->maxh && *c->h > c->maxh)
|
||||
*c->h = c->maxh;
|
||||
if(c->x > sw) /* might happen on restart */
|
||||
c->x = sw - c->w;
|
||||
if(c->y > sh)
|
||||
c->y = sh - c->h;
|
||||
if(c->minw && c->w < c->minw)
|
||||
c->w = c->minw;
|
||||
if(c->minh && c->h < c->minh)
|
||||
c->h = c->minh;
|
||||
if(c->maxw && c->w > c->maxw)
|
||||
c->w = c->maxw;
|
||||
if(c->maxh && c->h > c->maxh)
|
||||
c->h = c->maxh;
|
||||
if(sticky == TopRight || sticky == BotRight)
|
||||
*c->x = right - *c->w;
|
||||
c->x = right - c->w;
|
||||
if(sticky == BotLeft || sticky == BotRight)
|
||||
*c->y = bottom - *c->h;
|
||||
c->y = bottom - c->h;
|
||||
|
||||
resizetitle(c);
|
||||
XSetWindowBorderWidth(dpy, c->win, 1);
|
||||
XMoveResizeWindow(dpy, c->win, *c->x, *c->y, *c->w, *c->h);
|
||||
XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h);
|
||||
|
||||
e.type = ConfigureNotify;
|
||||
e.event = c->win;
|
||||
e.window = c->win;
|
||||
e.x = *c->x;
|
||||
e.y = *c->y;
|
||||
e.width = *c->w;
|
||||
e.height = *c->h;
|
||||
e.x = c->x;
|
||||
e.y = c->y;
|
||||
e.width = c->w;
|
||||
e.height = c->h;
|
||||
e.border_width = c->border;
|
||||
e.above = None;
|
||||
e.override_redirect = False;
|
||||
|
@ -341,23 +334,6 @@ resize(Client *c, Bool inc, Corner sticky)
|
|||
XSync(dpy, False);
|
||||
}
|
||||
|
||||
void
|
||||
setgeom(Client *c)
|
||||
{
|
||||
if((arrange == dotile) && !c->isfloat) {
|
||||
c->x = &c->tx;
|
||||
c->y = &c->ty;
|
||||
c->w = &c->tw;
|
||||
c->h = &c->th;
|
||||
}
|
||||
else {
|
||||
c->x = &c->fx;
|
||||
c->y = &c->fy;
|
||||
c->w = &c->fw;
|
||||
c->h = &c->fh;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
setsize(Client *c)
|
||||
{
|
||||
|
|
7
dwm.h
7
dwm.h
|
@ -67,10 +67,8 @@ struct Client {
|
|||
char name[256];
|
||||
char *tags[TLast];
|
||||
int proto;
|
||||
int *x, *y, *w, *h; /* current geom */
|
||||
int bx, by, bw, bh; /* title bar */
|
||||
int fx, fy, fw, fh; /* floating geom */
|
||||
int tx, ty, tw, th; /* tiled geom */
|
||||
int x, y, w, h;
|
||||
int tx, ty, tw, th; /* title */
|
||||
int basew, baseh, incw, inch, maxw, maxh, minw, minh;
|
||||
int grav;
|
||||
unsigned int border;
|
||||
|
@ -109,7 +107,6 @@ extern void manage(Window w, XWindowAttributes *wa);
|
|||
extern void maximize(Arg *arg);
|
||||
extern void pop(Client *c);
|
||||
extern void resize(Client *c, Bool inc, Corner sticky);
|
||||
extern void setgeom(Client *c);
|
||||
extern void setsize(Client *c);
|
||||
extern void settitle(Client *c);
|
||||
extern void unmanage(Client *c);
|
||||
|
|
30
event.c
30
event.c
|
@ -70,8 +70,8 @@ movemouse(Client *c)
|
|||
unsigned int dui;
|
||||
Window dummy;
|
||||
|
||||
ocx = *c->x;
|
||||
ocy = *c->y;
|
||||
ocx = c->x;
|
||||
ocy = c->y;
|
||||
if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAsync,
|
||||
None, cursor[CurMove], CurrentTime) != GrabSuccess)
|
||||
return;
|
||||
|
@ -85,8 +85,8 @@ movemouse(Client *c)
|
|||
break;
|
||||
case MotionNotify:
|
||||
XSync(dpy, False);
|
||||
*c->x = ocx + (ev.xmotion.x - x1);
|
||||
*c->y = ocy + (ev.xmotion.y - y1);
|
||||
c->x = ocx + (ev.xmotion.x - x1);
|
||||
c->y = ocy + (ev.xmotion.y - y1);
|
||||
resize(c, False, TopLeft);
|
||||
break;
|
||||
case ButtonRelease:
|
||||
|
@ -103,12 +103,12 @@ resizemouse(Client *c)
|
|||
int ocx, ocy;
|
||||
Corner sticky;
|
||||
|
||||
ocx = *c->x;
|
||||
ocy = *c->y;
|
||||
ocx = c->x;
|
||||
ocy = c->y;
|
||||
if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAsync,
|
||||
None, cursor[CurResize], CurrentTime) != GrabSuccess)
|
||||
return;
|
||||
XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, *c->w, *c->h);
|
||||
XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w, c->h);
|
||||
for(;;) {
|
||||
XMaskEvent(dpy, MouseMask | ExposureMask, &ev);
|
||||
switch(ev.type) {
|
||||
|
@ -118,10 +118,10 @@ resizemouse(Client *c)
|
|||
break;
|
||||
case MotionNotify:
|
||||
XSync(dpy, False);
|
||||
*c->w = abs(ocx - ev.xmotion.x);
|
||||
*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;
|
||||
c->w = abs(ocx - ev.xmotion.x);
|
||||
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;
|
||||
if(ocx <= ev.xmotion.x)
|
||||
sticky = (ocy <= ev.xmotion.y) ? TopLeft : BotLeft;
|
||||
else
|
||||
|
@ -203,13 +203,13 @@ configurerequest(XEvent *e)
|
|||
if((c = getclient(ev->window))) {
|
||||
gravitate(c, True);
|
||||
if(ev->value_mask & CWX)
|
||||
*c->x = ev->x;
|
||||
c->x = ev->x;
|
||||
if(ev->value_mask & CWY)
|
||||
*c->y = ev->y;
|
||||
c->y = ev->y;
|
||||
if(ev->value_mask & CWWidth)
|
||||
*c->w = ev->width;
|
||||
c->w = ev->width;
|
||||
if(ev->value_mask & CWHeight)
|
||||
*c->h = ev->height;
|
||||
c->h = ev->height;
|
||||
if(ev->value_mask & CWBorderWidth)
|
||||
c->border = 1;
|
||||
gravitate(c, False);
|
||||
|
|
34
tag.c
34
tag.c
|
@ -53,7 +53,6 @@ dofloat(Arg *arg)
|
|||
|
||||
arrange = dofloat;
|
||||
for(c = clients; c; c = c->next) {
|
||||
setgeom(c);
|
||||
if(c->tags[tsel]) {
|
||||
resize(c, True, TopLeft);
|
||||
}
|
||||
|
@ -87,7 +86,6 @@ dotile(Arg *arg)
|
|||
h = sh - bh;
|
||||
|
||||
for(i = 0, c = clients; c; c = c->next) {
|
||||
setgeom(c);
|
||||
if(c->tags[tsel]) {
|
||||
if(c->isfloat) {
|
||||
higher(c);
|
||||
|
@ -95,28 +93,28 @@ dotile(Arg *arg)
|
|||
continue;
|
||||
}
|
||||
if(n == 1) {
|
||||
*c->x = sx;
|
||||
*c->y = sy + bh;
|
||||
*c->w = sw - 2 * c->border;
|
||||
*c->h = sh - 2 * c->border - bh;
|
||||
c->x = sx;
|
||||
c->y = sy + bh;
|
||||
c->w = sw - 2 * c->border;
|
||||
c->h = sh - 2 * c->border - bh;
|
||||
}
|
||||
else if(i == 0) {
|
||||
*c->x = sx;
|
||||
*c->y = sy + bh;
|
||||
*c->w = mw - 2 * c->border;
|
||||
*c->h = sh - 2 * c->border - bh;
|
||||
c->x = sx;
|
||||
c->y = sy + bh;
|
||||
c->w = mw - 2 * c->border;
|
||||
c->h = sh - 2 * c->border - bh;
|
||||
}
|
||||
else if(h > bh) {
|
||||
*c->x = sx + mw;
|
||||
*c->y = sy + (i - 1) * h + bh;
|
||||
*c->w = w - 2 * c->border;
|
||||
*c->h = h - 2 * c->border;
|
||||
c->x = sx + mw;
|
||||
c->y = sy + (i - 1) * h + bh;
|
||||
c->w = w - 2 * c->border;
|
||||
c->h = h - 2 * c->border;
|
||||
}
|
||||
else { /* fallback if h < bh */
|
||||
*c->x = sx + mw;
|
||||
*c->y = sy + bh;
|
||||
*c->w = w - 2 * c->border;
|
||||
*c->h = sh - 2 * c->border - bh;
|
||||
c->x = sx + mw;
|
||||
c->y = sy + bh;
|
||||
c->w = w - 2 * c->border;
|
||||
c->h = sh - 2 * c->border - bh;
|
||||
}
|
||||
resize(c, False, TopLeft);
|
||||
i++;
|
||||
|
|
Loading…
Reference in a new issue