#include <X11/Xlib.h>
#include <X11/Xproto.h>
#include <X11/Xutil.h>
-#ifdef XINERAMA
+/*
+ * 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
+ * monocle(). 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
+//#endif
/* macros */
#define BUTTONMASK (ButtonPressMask|ButtonReleaseMask)
Window win;
};
+typedef struct {
+ int x, y, w, h;
+} Column;
+
typedef struct {
int x, y, w, h;
unsigned long norm[ColLast];
/* 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;
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"
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);
}
Client *c;
domwfact = dozoom = False;
- for(c = clients; c; c = c->next)
- if(isvisible(c))
- resize(c, wax, way, waw - 2 * c->border, wah - 2 * c->border, RESIZEHINTS);
+ for(c = nexttiled(clients); c; c = nexttiled(c->next))
+ resize(c, wax, way, waw - 2 * c->border, wah - 2 * c->border, RESIZEHINTS);
}
void
void
setup(void) {
+ int screens = 1;
unsigned int i;
XSetWindowAttributes wa;
+//#ifdef XINERAMA
+ XineramaScreenInfo *info;
+//#endif
/* init screen */
screen = DefaultScreen(dpy);
sy = 0;
sw = DisplayWidth(dpy, screen);
sh = DisplayHeight(dpy, screen);
+ if(XineramaIsActive(dpy)) {
+ if((info = XineramaQueryScreens(dpy, &screens))) {
+ sx = info[0].x_org;
+ sy = info[0].y_org;
+ sw = info[0].width;
+ sh = info[0].height;
+ }
+ }
/* init atoms */
wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False);
cursor[CurResize] = XCreateFontCursor(dpy, XC_sizing);
cursor[CurMove] = XCreateFontCursor(dpy, XC_fleur);
-#ifdef XINERAMA
- if(XineramaIsActive(dpy))
- info = XineramaQueryScreens(dpy, &xscreens);
+ ncols = 2;
+#if 0
+ 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
+ {
+ cols = emallocz(ncols * sizeof(Column));
+ cols[0].x = sx;
+ cols[0].y = sy;
+ }
#endif
-
/* init appearance */
dc.norm[ColBorder] = getcolor(NORMBORDERCOLOR);
dc.norm[ColBG] = getcolor(NORMBGCOLOR);
XWMHints *wmh;
if((wmh = XGetWMHints(dpy, c->win))) {
- c->isurgent = (wmh->flags & XUrgencyHint) ? True : False;
+ if(c == sel)
+ sel->isurgent = False;
+ else
+ c->isurgent = (wmh->flags & XUrgencyHint) ? True : False;
XFree(wmh);
}
}