diff options
-rw-r--r-- | dwm.c | 64 |
1 files changed, 54 insertions, 10 deletions
diff --git a/dwm.c b/dwm.c index 14aa808..af13a58 100644 --- a/dwm.c +++ b/dwm.c @@ -40,6 +40,21 @@ #include <X11/Xlib.h> #include <X11/Xproto.h> #include <X11/Xutil.h> +/* + * TODO: Idea: + * I intend to not provide real Xinerama support, but instead having a Column + * tilecols[] array which is used by tile(), and a Column maxcols[] arrays which is used by + * maximise(). Those arrays should be initialized in config.h. For simplicity + * reasons mwfact should be replaced with a more advanced method which + * implements the same, but using the boundary between tilecols[0] and + * tilecols[1] instead. Besides this, get rid of BARPOS and use instead the + * following mechanism: + * + * #define BX 0 + * #define BY 0 + * #define BW sw + * bh is calculated automatically and should be used for the + */ #ifdef XINERAMA #include <X11/extensions/Xinerama.h> #endif @@ -78,6 +93,10 @@ struct Client { typedef struct { int x, y, w, h; +} Column; + +typedef struct { + int x, y, w, h; unsigned long norm[ColLast]; unsigned long sel[ColLast]; Drawable drawable; @@ -195,7 +214,7 @@ void selectview(const char *arg); /* variables */ char stext[256], buf[256]; double mwfact; -int screen, sx, sy, sw, sh, wax, way, waw, wah, xscreens; +int screen, sx, sy, sw, sh, wax, way, waw, wah, ncols; int (*xerrorxlib)(Display *, XErrorEvent *); unsigned int bh, bpos; unsigned int blw = 0; @@ -224,14 +243,12 @@ Bool *seltags; Client *clients = NULL; Client *sel = NULL; Client *stack = NULL; +Column *cols = NULL; Cursor cursor[CurLast]; Display *dpy; DC dc = {0}; Layout *lt; Window root, barwin; -#ifdef XINERAMA -XineramaScreenInfo *info = NULL; -#endif /* configuration, allows nested code to access above variables */ #include "config.h" @@ -393,10 +410,6 @@ cleanup(void) { XFreeCursor(dpy, cursor[CurResize]); XFreeCursor(dpy, cursor[CurMove]); XDestroyWindow(dpy, barwin); -#if XINERAMA - if(info) - XFree(info); -#endif XSync(dpy, False); XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime); } @@ -1458,8 +1471,12 @@ setmwfact(const char *arg) { void setup(void) { + int screens = 1; unsigned int i; XSetWindowAttributes wa; +#ifdef XINERAMA + XineramaScreenInfo *info; +#endif /* init screen */ screen = DefaultScreen(dpy); @@ -1482,11 +1499,38 @@ setup(void) { cursor[CurResize] = XCreateFontCursor(dpy, XC_sizing); cursor[CurMove] = XCreateFontCursor(dpy, XC_fleur); + ncols = 2; #ifdef XINERAMA - if(XineramaIsActive(dpy)) - info = XineramaQueryScreens(dpy, &xscreens); + if(XineramaIsActive(dpy)) { + if((info = XineramaQueryScreens(dpy, &screens))) { + if(screens == 1) { + sx = info[0].x_org; + sy = info[0].y_org; + sw = info[0].width; + sh = info[0].height; + } + else { + ncols = screens; + cols = emallocz(ncols * sizeof(Column)); + for(i = 0; i < ncols; i++) { + cols[i].x = info[i].x_org; + cols[i].y = info[i].y_org; + cols[i].w = info[i].width; + cols[i].h = info[i].height; + } + } + XFree(info); + } + } + else #endif + { + cols = emallocz(ncols * sizeof(Column)); + cols[0].x = sx; + cols[0].y = sy; + + } /* init appearance */ dc.norm[ColBorder] = getcolor(NORMBORDERCOLOR); dc.norm[ColBG] = getcolor(NORMBGCOLOR); |