Introduction
Introduction Statistics Contact Development Disclaimer Help
timplemened distinguishing float/managed geometries of clients (works quite wel…
git clone git://src.adamsgaard.dk/dwm
Log
Files
Refs
README
LICENSE
---
commit 58f2fe3f6af3d6f8c925125c721a2d1800d750dc
parent 0aaa9a21f334a5c75b7efce2712384f57bd370cd
Author: Anselm R. Garbe <[email protected]>
Date: Tue, 18 Jul 2006 12:36:57 +0200
implemened distinguishing float/managed geometries of clients (works quite well)
Diffstat:
M client.c | 116 ++++++++++++++++++-----------…
M dwm.h | 7 +++++--
M event.c | 30 +++++++++++++++---------------
M main.c | 1 +
M tag.c | 29 ++++++++++++++++-------------
5 files changed, 105 insertions(+), 78 deletions(-)
---
diff --git a/client.c b/client.c
t@@ -16,16 +16,16 @@ resizetitle(Client *c)
{
int i;
- c->tw = 0;
+ c->bw = 0;
for(i = 0; i < TLast; i++)
if(c->tags[i])
- 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;
- XMoveResizeWindow(dpy, c->title, c->tx, c->ty, c->tw, c->th);
+ 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;
+ XMoveResizeWindow(dpy, c->title, c->bx, c->by, c->bw, c->bh);
}
static int
t@@ -39,8 +39,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->tx + 2 * sw, c->ty);
+ XMoveWindow(dpy, c->win, *c->x + 2 * sw, *c->y);
+ XMoveWindow(dpy, c->title, c->bx + 2 * sw, c->by);
}
void
t@@ -124,12 +124,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;
t@@ -145,12 +145,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;
t@@ -160,8 +160,8 @@ gravitate(Client *c, Bool invert)
dx = -dx;
dy = -dy;
}
- c->x += dx;
- c->y += dy;
+ *c->x += dx;
+ *c->y += dy;
}
void
t@@ -198,13 +198,13 @@ manage(Window w, XWindowAttributes *wa)
c = emallocz(sizeof(Client));
c->win = w;
- c->tx = c->x = wa->x;
- c->ty = c->y = wa->y;
- if(c->y < bh)
- c->ty = c->y += bh;
- c->tw = c->w = wa->width;
- c->h = wa->height;
- c->th = bh;
+ c->bx = c->fx = c->tx = wa->x;
+ c->by = c->fy = c->ty = wa->y;
+ if(c->fy < bh)
+ c->by = c->fy = c->ty += bh;
+ c->bw = c->fw = c->tw = wa->width;
+ c->fh = c->th = wa->height;
+ c->bh = bh;
c->border = 1;
c->proto = getproto(c->win);
setsize(c);
t@@ -215,12 +215,11 @@ manage(Window w, XWindowAttributes *wa)
twa.background_pixmap = ParentRelative;
twa.event_mask = ExposureMask;
- c->title = XCreateWindow(dpy, root, c->tx, c->ty, c->tw, c->th,
+ c->title = XCreateWindow(dpy, root, c->bx, c->by, c->bw, c->bh,
0, DefaultDepth(dpy, screen), CopyFromParent,
DefaultVisual(dpy, screen),
CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa);
- settitle(c);
settags(c);
c->next = clients;
t@@ -239,7 +238,11 @@ manage(Window w, XWindowAttributes *wa)
c->isfloat = trans
|| ((c->maxw == c->minw) && (c->maxh == c->minh));
+ setgeom(c);
+ settitle(c);
+
arrange(NULL);
+
/* mapping the window now prevents flicker */
if(c->tags[tsel]) {
XMapRaised(dpy, c->win);
t@@ -259,10 +262,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);
}
t@@ -286,32 +289,32 @@ resize(Client *c, Bool inc)
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->ty = 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;
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;
t@@ -320,6 +323,23 @@ resize(Client *c, Bool inc)
}
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)
{
XSizeHints size;
diff --git a/dwm.h b/dwm.h
t@@ -65,8 +65,10 @@ struct Client {
char name[256];
char *tags[TLast];
int proto;
- int x, y, w, h;
- int tx, ty, tw, th;
+ 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 basew, baseh, incw, inch, maxw, maxh, minw, minh;
int grav;
unsigned int border;
t@@ -120,6 +122,7 @@ 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 setgeom(Client *c);
extern void setsize(Client *c);
extern void settitle(Client *c);
extern void unmanage(Client *c);
diff --git a/event.c b/event.c
t@@ -62,8 +62,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, GrabModeAs…
None, cursor[CurMove], CurrentTime) != GrabSuc…
return;
t@@ -77,8 +77,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);
break;
case ButtonRelease:
t@@ -94,12 +94,12 @@ resizemouse(Client *c)
XEvent ev;
int ocx, ocy;
- ocx = c->x;
- ocy = c->y;
+ ocx = *c->x;
+ ocy = *c->y;
if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAs…
None, cursor[CurResize], CurrentTime) != GrabS…
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) {
t@@ -109,10 +109,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;
resize(c, True);
break;
case ButtonRelease:
t@@ -187,13 +187,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);
diff --git a/main.c b/main.c
t@@ -261,6 +261,7 @@ main(int argc, char *argv[])
XChangeWindowAttributes(dpy, root, CWEventMask | CWCursor, &wa);
strcpy(stext, "dwm-"VERSION);
+
scan();
/* main event loop, reads status text from stdin as well */
diff --git a/tag.c b/tag.c
t@@ -43,8 +43,10 @@ dofloat(Arg *arg)
arrange = dofloat;
for(c = clients; c; c = c->next) {
- if(c->tags[tsel])
+ setgeom(c);
+ if(c->tags[tsel]) {
resize(c, True);
+ }
else
ban(c);
}
t@@ -75,6 +77,7 @@ 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);
t@@ -82,22 +85,22 @@ 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 {
- 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;
}
resize(c, False);
i++;
You are viewing proxied material from mx1.adamsgaard.dk. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.