URI: 
       some minor fixes regarding the new xinerama support - dwm - dynamic window manager
  HTML git clone https://git.parazyd.org/dwm
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 6644a6aa2e4267fa67c811f60e6f9f99a0b1e067
   DIR parent 3da24539976b4474862415606f641d0f69336729
  HTML Author: Anselm R Garbe <anselm@garbe.us>
       Date:   Sat, 20 Jun 2009 16:18:02 +0100
       
       some minor fixes regarding the new xinerama support
       Diffstat:
         M dwm.c                               |      78 +++++++++++++++++++------------
       
       1 file changed, 48 insertions(+), 30 deletions(-)
       ---
   DIR diff --git a/dwm.c b/dwm.c
       @@ -116,6 +116,7 @@ typedef struct {
        
        typedef struct {
                char symbol[4];
       +        float mfact;
                int by, btx;          /* bar geometry */
                int wx, wy, ww, wh;   /* window area  */
                unsigned int seltags;
       @@ -251,7 +252,7 @@ static Display *dpy;
        static DC dc;
        static Layout *lt[] = { NULL, NULL };
        static Monitor *mon = NULL, *selmon = NULL;
       -static unsigned int nmons;
       +static unsigned int nmons = 0;
        static Window root;
        /* configuration, allows nested code to access above variables */
        #include "config.h"
       @@ -1322,10 +1323,10 @@ setmfact(const Arg *arg) {
        
                if(!arg || !lt[selmon->sellt]->arrange)
                        return;
       -        f = arg->f < 1.0 ? arg->f + mfact : arg->f - 1.0;
       +        f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0;
                if(f < 0.1 || f > 0.9)
                        return;
       -        mfact = f;
       +        selmon->mfact = f;
                arrange();
        }
        
       @@ -1483,7 +1484,7 @@ tile(Monitor *m) {
        
                /* master */
                c = nexttiled(m, clients);
       -        mw = mfact * m->ww;
       +        mw = m->mfact * m->ww;
                resize(c, m->wx, m->wy, (n == 1 ? m->ww : mw) - 2 * c->bw, m->wh - 2 * c->bw);
        
                if(--n == 0)
       @@ -1581,30 +1582,31 @@ unmapnotify(XEvent *e) {
        void
        updategeom(void) {
        #ifdef XINERAMA
       -        int di, x, y, n;
       -        unsigned int dui, i = 0;
       -        Bool pquery;
       +        int n;
       +        unsigned int i = 0;
                Client *c;
       -        Window dummy;
                XineramaScreenInfo *info = NULL;
        
                /* window area geometry */
                if(XineramaIsActive(dpy) && (info = XineramaQueryScreens(dpy, &n))) {
       -                nmons = (unsigned int)n;
       -                for(c = clients; c; c = c->next)
       -                        if(c->mon >= nmons)
       -                                c->mon = nmons - 1;
       -                if(!(mon = (Monitor *)realloc(mon, sizeof(Monitor) * nmons)))
       -                        die("fatal: could not realloc() %u bytes\n", sizeof(Monitor) * nmons);
       -                pquery = XQueryPointer(dpy, root, &dummy, &dummy, &x, &y, &di, &di, &dui);
       -                for(i = 0; i < nmons; i++) {
       +                if(n != nmons) {
       +                        for(c = clients; c; c = c->next)
       +                                if(c->mon >= n)
       +                                        c->mon = n - 1;
       +                        if(!(mon = (Monitor *)realloc(mon, sizeof(Monitor) * n)))
       +                                die("fatal: could not realloc() %u bytes\n", sizeof(Monitor) * nmons);
       +                }
       +                for(i = 0; i < n ; i++) {
                                /* TODO: consider re-using XineramaScreenInfo */
                                mon[i].symbol[0] = '[';
                                mon[i].symbol[1] = '0' + info[i].screen_number;
                                mon[i].symbol[2] = ']';
                                mon[i].symbol[3] = 0;
       -                        mon[i].showbar = showbar;
       -                        mon[i].topbar = topbar;
       +                        if(!selmon) { /* not initialised yet */
       +                                mon[i].mfact = mfact;
       +                                mon[i].showbar = showbar;
       +                                mon[i].topbar = topbar;
       +                        }
                                mon[i].wx = info[i].x_org;
                                mon[i].wy = mon[i].showbar && mon[i].topbar ? info[i].y_org + bh : info[i].y_org;
                                mon[i].ww = info[i].width;
       @@ -1615,24 +1617,39 @@ updategeom(void) {
                                        mon[i].by = mon[i].topbar ? info[i].y_org : mon[i].wy + mon[i].wh;
                                else
                                        mon[i].by = -bh;
       -                        if(pquery && INRECT(x, y, info[i].x_org, info[i].y_org, info[i].width, info[i].height))
       -                                selmon = &mon[i];
       +                }
       +                nmons = (unsigned int)n;
       +                if(!selmon) {
       +                        selmon = &mon[0];
       +                        int di, x, y;
       +                        unsigned int dui;
       +                        Window dummy;
       +                        if(XQueryPointer(dpy, root, &dummy, &dummy, &x, &y, &di, &di, &dui)) 
       +                                for(i = 0; i < nmons; i++)
       +                                        if(INRECT(x, y, info[i].x_org, info[i].y_org, info[i].width, info[i].height)) {
       +                                                selmon = &mon[i];
       +                                                break;
       +                                        }
                        }
                        XFree(info);
                }
                else
        #endif /* XINERAMA */
                {
       -                nmons = 1;
       -                if(!(mon = (Monitor *)realloc(mon, sizeof(Monitor))))
       -                        die("fatal: could not realloc() %u bytes\n", sizeof(Monitor));
       -                selmon = &mon[0];
       -                mon[0].symbol[0] = '[';
       -                mon[0].symbol[1] = '0';
       -                mon[0].symbol[2] = ']';
       -                mon[0].symbol[3] = 0;
       -                mon[0].showbar = showbar;
       -                mon[0].topbar = topbar;
       +                if(!mon) {
       +                        nmons = 1;
       +                        if(!(mon = (Monitor *)malloc(sizeof(Monitor))))
       +                                die("fatal: could not malloc() %u bytes\n", sizeof(Monitor));
       +                }
       +                if(!selmon) {
       +                        mon[0].symbol[0] = '[';
       +                        mon[0].symbol[1] = '0';
       +                        mon[0].symbol[2] = ']';
       +                        mon[0].symbol[3] = 0;
       +                        mon[0].mfact = mfact;
       +                        mon[0].showbar = showbar;
       +                        mon[0].topbar = topbar;
       +                }
                        mon[0].wx = sx;
                        mon[0].wy = mon[0].showbar && mon[0].topbar ? sy + bh : sy;
                        mon[0].ww = sw;
       @@ -1643,6 +1660,7 @@ updategeom(void) {
                                mon[0].by = mon[0].topbar ? sy : mon[0].wy + mon[0].wh;
                        else
                                mon[0].by = -bh;
       +                selmon = &mon[0];
                }
        }