X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=dwm.c;h=68a9d1d8d4f0413e62f08b5ae68b47397c2027a0;hb=59aa02a0750ebc82dbcb30897bbf427391edffa0;hp=897eeb4b86c6c5e60cf3a5ac1838f66263e719ff;hpb=a82cba275981ecd85e68cc68b169c89f79fa60db;p=dwm.git diff --git a/dwm.c b/dwm.c index 897eeb4..68a9d1d 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 + * 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 -#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,6 +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 movemouse(Client *c); Client *nexttiled(Client *c); void propertynotify(XEvent *e); @@ -194,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; @@ -223,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" @@ -392,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); } @@ -1072,6 +1086,15 @@ maprequest(XEvent *e) { } void +maximise(void) { + Client *c; + + domwfact = dozoom = False; + for(c = nexttiled(clients); c; c = nexttiled(c->next)) + resize(c, wax, way, waw - 2 * c->border, wah - 2 * c->border, RESIZEHINTS); +} + +void movemouse(Client *c) { int x1, y1, ocx, ocy, di, nx, ny; unsigned int dui; @@ -1412,7 +1435,7 @@ setlayout(const char *arg) { } else { for(i = 0; i < LENGTH(layouts); i++) - if(arg == layouts[i].symbol) + if(!strcmp(arg, layouts[i].symbol)) break; if(i == LENGTH(layouts)) return; @@ -1448,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); @@ -1458,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); @@ -1472,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); @@ -1810,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);