X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=dwm.c;h=9bad83c0d67f6cf8f2526a0b4528c46bfc7ad87a;hb=2e38296edd5fbafbb93a42333af22ba9edd667bf;hp=14aa808a93159d4de57c1692694bafec7a01ac1e;hpb=295ad21092ce26062c79463b7f2ba5849d2fb823;p=dwm.git diff --git a/dwm.c b/dwm.c index 14aa808..9bad83c 100644 --- a/dwm.c +++ b/dwm.c @@ -40,9 +40,24 @@ #include #include #include -#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 -#endif +//#endif /* macros */ #define BUTTONMASK (ButtonPressMask|ButtonReleaseMask) @@ -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; @@ -153,7 +172,7 @@ void killclient(const char *arg); void manage(Window w, XWindowAttributes *wa); void mappingnotify(XEvent *e); void maprequest(XEvent *e); -void maximise(void); +void monocle(void); void movemouse(Client *c); Client *nexttiled(Client *c); void propertynotify(XEvent *e); @@ -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); } @@ -1073,7 +1086,7 @@ maprequest(XEvent *e) { } void -maximise(void) { +monocle(void) { Client *c; domwfact = dozoom = False; @@ -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); @@ -1468,6 +1485,14 @@ setup(void) { 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); @@ -1482,11 +1507,36 @@ setup(void) { 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); @@ -1820,6 +1870,8 @@ void updatewmhints(Client *c) { XWMHints *wmh; + if(c == sel) + return; if((wmh = XGetWMHints(dpy, c->win))) { c->isurgent = (wmh->flags & XUrgencyHint) ? True : False; XFree(wmh);