dwm

my fork of dwm
Index Commits 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:
Mdwm.c | 64++++++++++++++++++++++++++++++++++++++++++++++++++++++----------
1 file changed, 54 insertions(+), 10 deletions(-)
diff --git 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);