tnext on TODO - dwm - [fork] customized build of dwm, the dynamic window manager | |
git clone git://src.adamsgaard.dk/dwm | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit e3c2d327f6f2874a165357d1ea2a50b2baf3a6f4 | |
parent 295ad21092ce26062c79463b7f2ba5849d2fb823 | |
Author: anselm@anselm1 <unknown> | |
Date: Wed, 5 Mar 2008 00:11:44 +0000 | |
next on TODO | |
Diffstat: | |
M dwm.c | 64 ++++++++++++++++++++++++++---… | |
1 file changed, 54 insertions(+), 10 deletions(-) | |
--- | |
diff --git a/dwm.c b/dwm.c | |
t@@ -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 whi… | |
+ * 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 | |
t@@ -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; | |
t@@ -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; | |
t@@ -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" | |
t@@ -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); | |
} | |
t@@ -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); | |
t@@ -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); |