X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=dwm.c;h=61ac193dc6a6bdc6a4beddf2589faeffb21b0f81;hb=25c1eb28f955adf241226596335f5d73b28620a0;hp=c47887b1036022e9afc25a5dc0a75854f9180efc;hpb=25947bcfdbef9e9bd937be0e07437c67c037516c;p=dwm.git diff --git a/dwm.c b/dwm.c index c47887b..61ac193 100644 --- a/dwm.c +++ b/dwm.c @@ -124,7 +124,7 @@ struct Monitor { int screen_number; float mfact; int by, btx; /* bar geometry */ - int mx, my, mw, mh; /* screen size */ + int mx, my, mw, mh; /* screen size */ int wx, wy, ww, wh; /* window area */ unsigned int seltags; unsigned int sellt; @@ -179,7 +179,6 @@ static long getstate(Window w); static Bool gettextprop(Window w, Atom atom, char *text, unsigned int size); static void grabbuttons(Client *c, Bool focused); static void grabkeys(void); -static Monitor *idxtomon(unsigned int n); static void initfont(const char *fontstr); static Bool isprotodel(Client *c); static void keypress(XEvent *e); @@ -233,13 +232,14 @@ static int xerrorstart(Display *dpy, XErrorEvent *ee); static void zoom(const Arg *arg); #ifdef XINERAMA static void focusmon(const Arg *arg); +static Monitor *idxtomon(unsigned int n); static void tagmon(const Arg *arg); #endif /* XINERAMA */ /* variables */ static char stext[256]; static int screen; -static int sx, sy, sw, sh; /* X display screen geometry x, y, width, height */ +static int sw, sh; /* X display screen geometry x, y, width, height */ static int bh, blw = 0; /* bar geometry */ static int (*xerrorxlib)(Display *, XErrorEvent *); static unsigned int numlockmask = 0; @@ -302,19 +302,20 @@ applyrules(Client *c) { Bool applysizehints(Client *c, int *x, int *y, int *w, int *h) { Bool baseismin; + Monitor *m = c->mon; /* set minimum possible */ *w = MAX(1, *w); *h = MAX(1, *h); - if(*x > sx + sw) - *x = sw - WIDTH(c); - if(*y > sy + sh) - *y = sh - HEIGHT(c); - if(*x + *w + 2 * c->bw < sx) - *x = sx; - if(*y + *h + 2 * c->bw < sy) - *y = sy; + if(*x > m->mx + m->mw) + *x = m->mw - WIDTH(c); + if(*y > m->my + m->mh) + *y = m->mh - HEIGHT(c); + if(*x + *w + 2 * c->bw < m->mx) + *x = m->mx; + if(*y + *h + 2 * c->bw < m->my) + *y = m->my; if(*h < bh) *h = bh; if(*w < bh) @@ -636,7 +637,7 @@ drawbar(Monitor *m) { dc.x = 0; #ifdef XINERAMA - { + if(mons->next) { /* more than a single monitor */ char buf[2]; buf[0] = m->screen_number + '0'; buf[1] = '\0'; @@ -942,6 +943,7 @@ grabkeys(void) { } } +#ifdef XINERAMA Monitor * idxtomon(unsigned int n) { unsigned int i; @@ -950,6 +952,7 @@ idxtomon(unsigned int n) { for(m = mons, i = 0; m && i != n; m = m->next, i++); return m; } +#endif /* XINERAMA */ void initfont(const char *fontstr) { @@ -1046,28 +1049,38 @@ manage(Window w, XWindowAttributes *wa) { die("fatal: could not malloc() %u bytes\n", sizeof(Client)); *c = cz; c->win = w; - c->mon = selmon; + + if(XGetTransientForHint(dpy, w, &trans)) + t = wintoclient(trans); + if(t) { + c->mon = t->mon; + c->tags = t->tags; + } + else { + c->mon = selmon; + applyrules(c); + } /* geometry */ - c->x = wa->x + selmon->wx; - c->y = wa->y + selmon->wy; + c->x = wa->x + c->mon->wx; + c->y = wa->y + c->mon->wy; c->w = wa->width; c->h = wa->height; c->oldbw = wa->border_width; - if(c->w == selmon->mw && c->h == selmon->mh) { - c->x = selmon->mx; - c->y = selmon->my; + if(c->w == c->mon->mw && c->h == c->mon->mh) { + c->x = c->mon->mx; + c->y = c->mon->my; c->bw = 0; } else { - if(c->x + WIDTH(c) > selmon->mx + selmon->mw) - c->x = selmon->mx + selmon->mw - WIDTH(c); - if(c->y + HEIGHT(c) > selmon->my + selmon->mh) - c->y = selmon->my + selmon->mh - HEIGHT(c); - c->x = MAX(c->x, selmon->mx); + if(c->x + WIDTH(c) > c->mon->mx + c->mon->mw) + c->x = c->mon->mx + c->mon->mw - WIDTH(c); + if(c->y + HEIGHT(c) > c->mon->my + c->mon->mh) + c->y = c->mon->my + c->mon->mh - HEIGHT(c); + c->x = MAX(c->x, c->mon->mx); /* only fix client y-offset, if the client center might cover the bar */ c->y = MAX(c->y, ((c->mon->by == 0) && (c->x + (c->w / 2) >= c->mon->wx) - && (c->x + (c->w / 2) < c->mon->wx + c->mon->ww)) ? bh : selmon->my); + && (c->x + (c->w / 2) < c->mon->wx + c->mon->ww)) ? bh : c->mon->my); c->bw = borderpx; } @@ -1079,12 +1092,6 @@ manage(Window w, XWindowAttributes *wa) { XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask); grabbuttons(c, False); updatetitle(c); - if(XGetTransientForHint(dpy, w, &trans)) - t = wintoclient(trans); - if(t) - c->tags = t->tags; - else - applyrules(c); if(!c->isfloating) c->isfloating = trans != None || c->isfixed; if(c->isfloating) @@ -1425,8 +1432,6 @@ setup(void) { screen = DefaultScreen(dpy); root = RootWindow(dpy, screen); initfont(font); - sx = 0; - sy = 0; sw = DisplayWidth(dpy, screen); sh = DisplayHeight(dpy, screen); bh = dc.h = dc.font.height + 2; @@ -1731,8 +1736,8 @@ updategeom(void) { /* default monitor setup */ { m->screen_number = 0; - m->wx = sx; - m->my = m->wy = sy; + m->wx = 0; + m->my = m->wy = 0; m->ww = sw; m->mh = m->wh = sh; }