|
|
@ -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 |
|
|
@ -76,6 +91,10 @@ struct Client { |
|
|
|
Window win; |
|
|
|
}; |
|
|
|
|
|
|
|
typedef struct { |
|
|
|
int x, y, w, h; |
|
|
|
} Column; |
|
|
|
|
|
|
|
typedef struct { |
|
|
|
int x, y, w, h; |
|
|
|
unsigned long norm[ColLast]; |
|
|
@ -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); |
|
|
|