Compare commits
	
		
			13 Commits
		
	
	
		
			245738e087
			...
			aca41475bb
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| aca41475bb | |||
| 7446126690 | |||
| 2ee13d4d76 | |||
| caaf1ff8e1 | |||
| 93b85e3b71 | |||
| 6c9186edda | |||
| 30a2514789 | |||
| c5858fb340 | |||
| efb0765d16 | |||
| 19ab95da81 | |||
| e5bdde4c77 | |||
| 19c8ed5228 | |||
| 3db3255eaf | 
							
								
								
									
										18
									
								
								config.def.h
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								config.def.h
									
									
									
									
									
								
							| @ -2,6 +2,7 @@ | |||||||
| 
 | 
 | ||||||
| /* appearance */ | /* appearance */ | ||||||
| static const unsigned int borderpx  = 1;        /* border pixel of windows */ | static const unsigned int borderpx  = 1;        /* border pixel of windows */ | ||||||
|  | static const unsigned int gappx     = 6;        /* gaps between windows */ | ||||||
| static const unsigned int snap      = 32;       /* snap pixel */ | static const unsigned int snap      = 32;       /* snap pixel */ | ||||||
| static const int showbar            = 1;        /* 0 means no bar */ | static const int showbar            = 1;        /* 0 means no bar */ | ||||||
| static const int topbar             = 1;        /* 0 means bottom bar */ | static const int topbar             = 1;        /* 0 means bottom bar */ | ||||||
| @ -12,11 +13,18 @@ static const char col_gray2[]       = "#444444"; | |||||||
| static const char col_gray3[]       = "#bbbbbb"; | static const char col_gray3[]       = "#bbbbbb"; | ||||||
| static const char col_gray4[]       = "#eeeeee"; | static const char col_gray4[]       = "#eeeeee"; | ||||||
| static const char col_cyan[]        = "#005577"; | static const char col_cyan[]        = "#005577"; | ||||||
|  | static const unsigned int baralpha = 0xd0; | ||||||
|  | static const unsigned int borderalpha = OPAQUE; | ||||||
| static const char *colors[][3]      = { | static const char *colors[][3]      = { | ||||||
| 	/*               fg         bg         border   */ | 	/*               fg         bg         border   */ | ||||||
| 	[SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, | 	[SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, | ||||||
| 	[SchemeSel]  = { col_gray4, col_cyan,  col_cyan  }, | 	[SchemeSel]  = { col_gray4, col_cyan,  col_cyan  }, | ||||||
| }; | }; | ||||||
|  | static const unsigned int alphas[][3]      = { | ||||||
|  | 	/*               fg      bg        border     */ | ||||||
|  | 	[SchemeNorm] = { OPAQUE, baralpha, borderalpha }, | ||||||
|  | 	[SchemeSel]  = { OPAQUE, baralpha, borderalpha }, | ||||||
|  | }; | ||||||
| 
 | 
 | ||||||
| /* tagging */ | /* tagging */ | ||||||
| static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; | static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; | ||||||
| @ -28,13 +36,13 @@ static const Rule rules[] = { | |||||||
| 	 */ | 	 */ | ||||||
| 	/* class      instance    title       tags mask     isfloating   monitor */ | 	/* class      instance    title       tags mask     isfloating   monitor */ | ||||||
| 	{ "Gimp",     NULL,       NULL,       0,            1,           -1 }, | 	{ "Gimp",     NULL,       NULL,       0,            1,           -1 }, | ||||||
| 	{ "Firefox",  NULL,       NULL,       1 << 8,       0,           -1 }, |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /* layout(s) */ | /* layout(s) */ | ||||||
| static const float mfact     = 0.55; /* factor of master area size [0.05..0.95] */ | static const float mfact     = 0.55; /* factor of master area size [0.05..0.95] */ | ||||||
| static const int nmaster     = 1;    /* number of clients in master area */ | static const int nmaster     = 1;    /* number of clients in master area */ | ||||||
| static const int resizehints = 1;    /* 1 means respect size hints in tiled resizals */ | static const int resizehints = 1;    /* 1 means respect size hints in tiled resizals */ | ||||||
|  | static const int attachbelow = 1;    /* 1 means attach after the currently active window */ | ||||||
| 
 | 
 | ||||||
| #include "fibonacci.c" | #include "fibonacci.c" | ||||||
| static const Layout layouts[] = { | static const Layout layouts[] = { | ||||||
| @ -42,12 +50,13 @@ static const Layout layouts[] = { | |||||||
| 	{ "[]=",      tile },    /* first entry is default */ | 	{ "[]=",      tile },    /* first entry is default */ | ||||||
| 	{ "><>",      NULL },    /* no layout function means floating behavior */ | 	{ "><>",      NULL },    /* no layout function means floating behavior */ | ||||||
| 	{ "[M]",      monocle }, | 	{ "[M]",      monocle }, | ||||||
|  | 	{ "[D]",      deck }, | ||||||
|  	{ "[@]",      spiral }, |  	{ "[@]",      spiral }, | ||||||
|  	{ "[\\]",      dwindle }, |  	{ "[\\]",      dwindle }, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /* key definitions */ | /* key definitions */ | ||||||
| #define MODKEY Mod1Mask | #define MODKEY Mod4Mask | ||||||
| #define TAGKEYS(KEY,TAG) \ | #define TAGKEYS(KEY,TAG) \ | ||||||
| 	{ MODKEY,                       KEY,      view,           {.ui = 1 << TAG} }, \ | 	{ MODKEY,                       KEY,      view,           {.ui = 1 << TAG} }, \ | ||||||
| 	{ MODKEY|ControlMask,           KEY,      toggleview,     {.ui = 1 << TAG} }, \ | 	{ MODKEY|ControlMask,           KEY,      toggleview,     {.ui = 1 << TAG} }, \ | ||||||
| @ -79,8 +88,9 @@ static Key keys[] = { | |||||||
| 	{ MODKEY,                       XK_t,      setlayout,      {.v = &layouts[0]} }, | 	{ MODKEY,                       XK_t,      setlayout,      {.v = &layouts[0]} }, | ||||||
| 	{ MODKEY,                       XK_f,      setlayout,      {.v = &layouts[1]} }, | 	{ MODKEY,                       XK_f,      setlayout,      {.v = &layouts[1]} }, | ||||||
| 	{ MODKEY,                       XK_m,      setlayout,      {.v = &layouts[2]} }, | 	{ MODKEY,                       XK_m,      setlayout,      {.v = &layouts[2]} }, | ||||||
| 	{ MODKEY,                       XK_r,      setlayout,      {.v = &layouts[3]} }, | 	{ MODKEY,                       XK_c,      setlayout,      {.v = &layouts[3]} }, | ||||||
| 	{ MODKEY|ShiftMask,             XK_r,      setlayout,      {.v = &layouts[4]} }, | 	{ MODKEY,                       XK_r,      setlayout,      {.v = &layouts[4]} }, | ||||||
|  | 	{ MODKEY|ShiftMask,             XK_r,      setlayout,      {.v = &layouts[5]} }, | ||||||
| 	{ MODKEY,                       XK_space,  setlayout,      {0} }, | 	{ MODKEY,                       XK_space,  setlayout,      {0} }, | ||||||
| 	{ MODKEY|ShiftMask,             XK_space,  togglefloating, {0} }, | 	{ MODKEY|ShiftMask,             XK_space,  togglefloating, {0} }, | ||||||
| 	{ MODKEY,                       XK_0,      view,           {.ui = ~0 } }, | 	{ MODKEY,                       XK_0,      view,           {.ui = ~0 } }, | ||||||
|  | |||||||
| @ -22,7 +22,7 @@ FREETYPEINC = /usr/include/freetype2 | |||||||
| 
 | 
 | ||||||
| # includes and libs
 | # includes and libs
 | ||||||
| INCS = -I${X11INC} -I${FREETYPEINC} | INCS = -I${X11INC} -I${FREETYPEINC} | ||||||
| LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} | LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} -lXrender | ||||||
| 
 | 
 | ||||||
| # flags
 | # flags
 | ||||||
| CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=200809L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} | CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=200809L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} | ||||||
|  | |||||||
							
								
								
									
										26
									
								
								drw.c
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								drw.c
									
									
									
									
									
								
							| @ -61,7 +61,7 @@ utf8decode(const char *c, long *u, size_t clen) | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Drw * | Drw * | ||||||
| drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h) | drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h, Visual *visual, unsigned int depth, Colormap cmap) | ||||||
| { | { | ||||||
| 	Drw *drw = ecalloc(1, sizeof(Drw)); | 	Drw *drw = ecalloc(1, sizeof(Drw)); | ||||||
| 
 | 
 | ||||||
| @ -70,8 +70,11 @@ drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h | |||||||
| 	drw->root = root; | 	drw->root = root; | ||||||
| 	drw->w = w; | 	drw->w = w; | ||||||
| 	drw->h = h; | 	drw->h = h; | ||||||
| 	drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen)); | 	drw->visual = visual; | ||||||
| 	drw->gc = XCreateGC(dpy, root, 0, NULL); | 	drw->depth = depth; | ||||||
|  | 	drw->cmap = cmap; | ||||||
|  | 	drw->drawable = XCreatePixmap(dpy, root, w, h, depth); | ||||||
|  | 	drw->gc = XCreateGC(dpy, drw->drawable, 0, NULL); | ||||||
| 	XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter); | 	XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter); | ||||||
| 
 | 
 | ||||||
| 	return drw; | 	return drw; | ||||||
| @ -87,7 +90,7 @@ drw_resize(Drw *drw, unsigned int w, unsigned int h) | |||||||
| 	drw->h = h; | 	drw->h = h; | ||||||
| 	if (drw->drawable) | 	if (drw->drawable) | ||||||
| 		XFreePixmap(drw->dpy, drw->drawable); | 		XFreePixmap(drw->dpy, drw->drawable); | ||||||
| 	drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, DefaultDepth(drw->dpy, drw->screen)); | 	drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, drw->depth); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| @ -194,21 +197,22 @@ drw_fontset_free(Fnt *font) | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| drw_clr_create(Drw *drw, Clr *dest, const char *clrname) | drw_clr_create(Drw *drw, Clr *dest, const char *clrname, unsigned int alpha) | ||||||
| { | { | ||||||
| 	if (!drw || !dest || !clrname) | 	if (!drw || !dest || !clrname) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen), | 	if (!XftColorAllocName(drw->dpy, drw->visual, drw->cmap, | ||||||
| 	                       DefaultColormap(drw->dpy, drw->screen), |  | ||||||
| 	                       clrname, dest)) | 	                       clrname, dest)) | ||||||
| 		die("error, cannot allocate color '%s'", clrname); | 		die("error, cannot allocate color '%s'", clrname); | ||||||
|  | 
 | ||||||
|  | 	dest->pixel = (dest->pixel & 0x00ffffffU) | (alpha << 24); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Wrapper to create color schemes. The caller has to call free(3) on the
 | /* Wrapper to create color schemes. The caller has to call free(3) on the
 | ||||||
|  * returned color scheme when done using it. */ |  * returned color scheme when done using it. */ | ||||||
| Clr * | Clr * | ||||||
| drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount) | drw_scm_create(Drw *drw, const char *clrnames[], const unsigned int alphas[], size_t clrcount) | ||||||
| { | { | ||||||
| 	size_t i; | 	size_t i; | ||||||
| 	Clr *ret; | 	Clr *ret; | ||||||
| @ -218,7 +222,7 @@ drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount) | |||||||
| 		return NULL; | 		return NULL; | ||||||
| 
 | 
 | ||||||
| 	for (i = 0; i < clrcount; i++) | 	for (i = 0; i < clrcount; i++) | ||||||
| 		drw_clr_create(drw, &ret[i], clrnames[i]); | 		drw_clr_create(drw, &ret[i], clrnames[i], alphas[i]); | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -274,9 +278,7 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp | |||||||
| 	} else { | 	} else { | ||||||
| 		XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel); | 		XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel); | ||||||
| 		XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); | 		XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); | ||||||
| 		d = XftDrawCreate(drw->dpy, drw->drawable, | 		d = XftDrawCreate(drw->dpy, drw->drawable, drw->visual, drw->cmap); | ||||||
| 		                  DefaultVisual(drw->dpy, drw->screen), |  | ||||||
| 		                  DefaultColormap(drw->dpy, drw->screen)); |  | ||||||
| 		x += lpad; | 		x += lpad; | ||||||
| 		w -= lpad; | 		w -= lpad; | ||||||
| 	} | 	} | ||||||
|  | |||||||
							
								
								
									
										9
									
								
								drw.h
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								drw.h
									
									
									
									
									
								
							| @ -20,6 +20,9 @@ typedef struct { | |||||||
| 	Display *dpy; | 	Display *dpy; | ||||||
| 	int screen; | 	int screen; | ||||||
| 	Window root; | 	Window root; | ||||||
|  | 	Visual *visual; | ||||||
|  | 	unsigned int depth; | ||||||
|  | 	Colormap cmap; | ||||||
| 	Drawable drawable; | 	Drawable drawable; | ||||||
| 	GC gc; | 	GC gc; | ||||||
| 	Clr *scheme; | 	Clr *scheme; | ||||||
| @ -27,7 +30,7 @@ typedef struct { | |||||||
| } Drw; | } Drw; | ||||||
| 
 | 
 | ||||||
| /* Drawable abstraction */ | /* Drawable abstraction */ | ||||||
| Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h); | Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h, Visual *visual, unsigned int depth, Colormap cmap); | ||||||
| void drw_resize(Drw *drw, unsigned int w, unsigned int h); | void drw_resize(Drw *drw, unsigned int w, unsigned int h); | ||||||
| void drw_free(Drw *drw); | void drw_free(Drw *drw); | ||||||
| 
 | 
 | ||||||
| @ -38,8 +41,8 @@ unsigned int drw_fontset_getwidth(Drw *drw, const char *text); | |||||||
| void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h); | void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h); | ||||||
| 
 | 
 | ||||||
| /* Colorscheme abstraction */ | /* Colorscheme abstraction */ | ||||||
| void drw_clr_create(Drw *drw, Clr *dest, const char *clrname); | void drw_clr_create(Drw *drw, Clr *dest, const char *clrname, unsigned int alpha); | ||||||
| Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount); | Clr *drw_scm_create(Drw *drw, const char *clrnames[], const unsigned int alphas[], size_t clrcount); | ||||||
| 
 | 
 | ||||||
| /* Cursor abstraction */ | /* Cursor abstraction */ | ||||||
| Cur *drw_cur_create(Drw *drw, int shape); | Cur *drw_cur_create(Drw *drw, int shape); | ||||||
|  | |||||||
							
								
								
									
										3
									
								
								dwm.1
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								dwm.1
									
									
									
									
									
								
							| @ -29,6 +29,9 @@ color. The tags of the focused window are indicated with a filled square in the | |||||||
| top left corner.  The tags which are applied to one or more windows are | top left corner.  The tags which are applied to one or more windows are | ||||||
| indicated with an empty square in the top left corner. | indicated with an empty square in the top left corner. | ||||||
| .P | .P | ||||||
|  | The attach below patch makes newly spawned windows attach after the currently | ||||||
|  | selected window | ||||||
|  | .P | ||||||
| dwm draws a small border around windows to indicate the focus state. | dwm draws a small border around windows to indicate the focus state. | ||||||
| .SH OPTIONS | .SH OPTIONS | ||||||
| .TP | .TP | ||||||
|  | |||||||
							
								
								
									
										249
									
								
								dwm.c
									
									
									
									
									
								
							
							
						
						
									
										249
									
								
								dwm.c
									
									
									
									
									
								
							| @ -52,11 +52,13 @@ | |||||||
| #define ISVISIBLE(C)            ((C->tags & C->mon->tagset[C->mon->seltags])) | #define ISVISIBLE(C)            ((C->tags & C->mon->tagset[C->mon->seltags])) | ||||||
| #define LENGTH(X)               (sizeof X / sizeof X[0]) | #define LENGTH(X)               (sizeof X / sizeof X[0]) | ||||||
| #define MOUSEMASK               (BUTTONMASK|PointerMotionMask) | #define MOUSEMASK               (BUTTONMASK|PointerMotionMask) | ||||||
| #define WIDTH(X)                ((X)->w + 2 * (X)->bw) | #define WIDTH(X)                ((X)->w + 2 * (X)->bw + gappx) | ||||||
| #define HEIGHT(X)               ((X)->h + 2 * (X)->bw) | #define HEIGHT(X)               ((X)->h + 2 * (X)->bw + gappx) | ||||||
| #define TAGMASK                 ((1 << LENGTH(tags)) - 1) | #define TAGMASK                 ((1 << LENGTH(tags)) - 1) | ||||||
| #define TEXTW(X)                (drw_fontset_getwidth(drw, (X)) + lrpad) | #define TEXTW(X)                (drw_fontset_getwidth(drw, (X)) + lrpad) | ||||||
| 
 | 
 | ||||||
|  | #define OPAQUE                  0xffU | ||||||
|  | 
 | ||||||
| /* enums */ | /* enums */ | ||||||
| enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ | enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ | ||||||
| enum { SchemeNorm, SchemeSel }; /* color schemes */ | enum { SchemeNorm, SchemeSel }; /* color schemes */ | ||||||
| @ -111,6 +113,7 @@ typedef struct { | |||||||
| 	void (*arrange)(Monitor *); | 	void (*arrange)(Monitor *); | ||||||
| } Layout; | } Layout; | ||||||
| 
 | 
 | ||||||
|  | typedef struct Pertag Pertag; | ||||||
| struct Monitor { | struct Monitor { | ||||||
| 	char ltsymbol[16]; | 	char ltsymbol[16]; | ||||||
| 	float mfact; | 	float mfact; | ||||||
| @ -130,6 +133,7 @@ struct Monitor { | |||||||
| 	Monitor *next; | 	Monitor *next; | ||||||
| 	Window barwin; | 	Window barwin; | ||||||
| 	const Layout *lt[2]; | 	const Layout *lt[2]; | ||||||
|  | 	Pertag *pertag; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
| @ -147,6 +151,7 @@ static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interac | |||||||
| static void arrange(Monitor *m); | static void arrange(Monitor *m); | ||||||
| static void arrangemon(Monitor *m); | static void arrangemon(Monitor *m); | ||||||
| static void attach(Client *c); | static void attach(Client *c); | ||||||
|  | static void attachBelow(Client *c); | ||||||
| static void attachstack(Client *c); | static void attachstack(Client *c); | ||||||
| static void buttonpress(XEvent *e); | static void buttonpress(XEvent *e); | ||||||
| static void checkotherwm(void); | static void checkotherwm(void); | ||||||
| @ -157,6 +162,7 @@ static void configure(Client *c); | |||||||
| static void configurenotify(XEvent *e); | static void configurenotify(XEvent *e); | ||||||
| static void configurerequest(XEvent *e); | static void configurerequest(XEvent *e); | ||||||
| static Monitor *createmon(void); | static Monitor *createmon(void); | ||||||
|  | static void deck(Monitor *m); | ||||||
| static void destroynotify(XEvent *e); | static void destroynotify(XEvent *e); | ||||||
| static void detach(Client *c); | static void detach(Client *c); | ||||||
| static void detachstack(Client *c); | static void detachstack(Client *c); | ||||||
| @ -194,6 +200,7 @@ static void resizeclient(Client *c, int x, int y, int w, int h); | |||||||
| static void resizemouse(const Arg *arg); | static void resizemouse(const Arg *arg); | ||||||
| static void restack(Monitor *m); | static void restack(Monitor *m); | ||||||
| static void run(void); | static void run(void); | ||||||
|  | static void runAutostart(void); | ||||||
| static void scan(void); | static void scan(void); | ||||||
| static int sendevent(Client *c, Atom proto); | static int sendevent(Client *c, Atom proto); | ||||||
| static void sendmon(Client *c, Monitor *m); | static void sendmon(Client *c, Monitor *m); | ||||||
| @ -233,6 +240,7 @@ static Monitor *wintomon(Window w); | |||||||
| static int xerror(Display *dpy, XErrorEvent *ee); | static int xerror(Display *dpy, XErrorEvent *ee); | ||||||
| static int xerrordummy(Display *dpy, XErrorEvent *ee); | static int xerrordummy(Display *dpy, XErrorEvent *ee); | ||||||
| static int xerrorstart(Display *dpy, XErrorEvent *ee); | static int xerrorstart(Display *dpy, XErrorEvent *ee); | ||||||
|  | static void xinitvisual(); | ||||||
| static void zoom(const Arg *arg); | static void zoom(const Arg *arg); | ||||||
| 
 | 
 | ||||||
| /* variables */ | /* variables */ | ||||||
| @ -269,9 +277,23 @@ static Drw *drw; | |||||||
| static Monitor *mons, *selmon; | static Monitor *mons, *selmon; | ||||||
| static Window root, wmcheckwin; | static Window root, wmcheckwin; | ||||||
| 
 | 
 | ||||||
|  | static int useargb = 0; | ||||||
|  | static Visual *visual; | ||||||
|  | static int depth; | ||||||
|  | static Colormap cmap; | ||||||
|  | 
 | ||||||
| /* configuration, allows nested code to access above variables */ | /* configuration, allows nested code to access above variables */ | ||||||
| #include "config.h" | #include "config.h" | ||||||
| 
 | 
 | ||||||
|  | struct Pertag { | ||||||
|  | 	unsigned int curtag, prevtag; /* current and previous tag */ | ||||||
|  | 	int nmasters[LENGTH(tags) + 1]; /* number of windows in master area */ | ||||||
|  | 	float mfacts[LENGTH(tags) + 1]; /* mfacts per tag */ | ||||||
|  | 	unsigned int sellts[LENGTH(tags) + 1]; /* selected layouts */ | ||||||
|  | 	const Layout *ltidxs[LENGTH(tags) + 1][2]; /* matrix of tags and layouts indexes  */ | ||||||
|  | 	int showbars[LENGTH(tags) + 1]; /* display bar for the current tag */ | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| /* compile-time check if all tags fit into an unsigned int bit array. */ | /* compile-time check if all tags fit into an unsigned int bit array. */ | ||||||
| struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; | struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; | ||||||
| 
 | 
 | ||||||
| @ -406,6 +428,21 @@ attach(Client *c) | |||||||
| 	c->next = c->mon->clients; | 	c->next = c->mon->clients; | ||||||
| 	c->mon->clients = c; | 	c->mon->clients = c; | ||||||
| } | } | ||||||
|  | void | ||||||
|  | attachBelow(Client *c) | ||||||
|  | { | ||||||
|  | 	//If there is nothing on the monitor or the selected client is floating, attach as normal
 | ||||||
|  | 	if(c->mon->sel == NULL || c->mon->sel == c || c->mon->sel->isfloating) { | ||||||
|  | 		attach(c); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	//Set the new client's next property to the same as the currently selected clients next
 | ||||||
|  | 	c->next = c->mon->sel->next; | ||||||
|  | 	//Set the currently selected clients next property to the new client
 | ||||||
|  | 	c->mon->sel->next = c; | ||||||
|  | 
 | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| attachstack(Client *c) | attachstack(Client *c) | ||||||
| @ -632,6 +669,7 @@ Monitor * | |||||||
| createmon(void) | createmon(void) | ||||||
| { | { | ||||||
| 	Monitor *m; | 	Monitor *m; | ||||||
|  | 	unsigned int i; | ||||||
| 
 | 
 | ||||||
| 	m = ecalloc(1, sizeof(Monitor)); | 	m = ecalloc(1, sizeof(Monitor)); | ||||||
| 	m->tagset[0] = m->tagset[1] = 1; | 	m->tagset[0] = m->tagset[1] = 1; | ||||||
| @ -642,6 +680,20 @@ createmon(void) | |||||||
| 	m->lt[0] = &layouts[0]; | 	m->lt[0] = &layouts[0]; | ||||||
| 	m->lt[1] = &layouts[1 % LENGTH(layouts)]; | 	m->lt[1] = &layouts[1 % LENGTH(layouts)]; | ||||||
| 	strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); | 	strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); | ||||||
|  | 	m->pertag = ecalloc(1, sizeof(Pertag)); | ||||||
|  | 	m->pertag->curtag = m->pertag->prevtag = 1; | ||||||
|  | 
 | ||||||
|  | 	for (i = 0; i <= LENGTH(tags); i++) { | ||||||
|  | 		m->pertag->nmasters[i] = m->nmaster; | ||||||
|  | 		m->pertag->mfacts[i] = m->mfact; | ||||||
|  | 
 | ||||||
|  | 		m->pertag->ltidxs[i][0] = m->lt[0]; | ||||||
|  | 		m->pertag->ltidxs[i][1] = m->lt[1]; | ||||||
|  | 		m->pertag->sellts[i] = m->sellt; | ||||||
|  | 
 | ||||||
|  | 		m->pertag->showbars[i] = m->showbar; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	return m; | 	return m; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -655,6 +707,31 @@ destroynotify(XEvent *e) | |||||||
| 		unmanage(c, 1); | 		unmanage(c, 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void | ||||||
|  | deck(Monitor *m) { | ||||||
|  | 	unsigned int i, n, h, mw, my; | ||||||
|  | 	Client *c; | ||||||
|  | 
 | ||||||
|  | 	for(n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); | ||||||
|  | 	if(n == 0) | ||||||
|  | 		return; | ||||||
|  | 
 | ||||||
|  | 	if(n > m->nmaster) { | ||||||
|  | 		mw = m->nmaster ? m->ww * m->mfact : 0; | ||||||
|  | 		snprintf(m->ltsymbol, sizeof m->ltsymbol, "[%d]", n - m->nmaster); | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 		mw = m->ww; | ||||||
|  | 	for(i = my = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) | ||||||
|  | 		if(i < m->nmaster) { | ||||||
|  | 			h = (m->wh - my) / (MIN(n, m->nmaster) - i); | ||||||
|  | 			resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), False); | ||||||
|  | 			my += HEIGHT(c); | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 			resize(c, m->wx + mw, m->wy, m->ww - mw - (2*c->bw), m->wh - (2*c->bw), False); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void | void | ||||||
| detach(Client *c) | detach(Client *c) | ||||||
| { | { | ||||||
| @ -967,7 +1044,7 @@ grabkeys(void) | |||||||
| void | void | ||||||
| incnmaster(const Arg *arg) | incnmaster(const Arg *arg) | ||||||
| { | { | ||||||
| 	selmon->nmaster = MAX(selmon->nmaster + arg->i, 0); | 	selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag] = MAX(selmon->nmaster + arg->i, 0); | ||||||
| 	arrange(selmon); | 	arrange(selmon); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -1063,7 +1140,10 @@ manage(Window w, XWindowAttributes *wa) | |||||||
| 		c->isfloating = c->oldstate = trans != None || c->isfixed; | 		c->isfloating = c->oldstate = trans != None || c->isfixed; | ||||||
| 	if (c->isfloating) | 	if (c->isfloating) | ||||||
| 		XRaiseWindow(dpy, c->win); | 		XRaiseWindow(dpy, c->win); | ||||||
| 	attach(c); | 	if( attachbelow ) | ||||||
|  | 		attachBelow(c); | ||||||
|  | 	else | ||||||
|  | 		attach(c); | ||||||
| 	attachstack(c); | 	attachstack(c); | ||||||
| 	XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend, | 	XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend, | ||||||
| 		(unsigned char *) &(c->win), 1); | 		(unsigned char *) &(c->win), 1); | ||||||
| @ -1277,12 +1357,36 @@ void | |||||||
| resizeclient(Client *c, int x, int y, int w, int h) | resizeclient(Client *c, int x, int y, int w, int h) | ||||||
| { | { | ||||||
| 	XWindowChanges wc; | 	XWindowChanges wc; | ||||||
|  | 	unsigned int n; | ||||||
|  | 	unsigned int gapoffset; | ||||||
|  | 	unsigned int gapincr; | ||||||
|  | 	Client *nbc; | ||||||
| 
 | 
 | ||||||
| 	c->oldx = c->x; c->x = wc.x = x; |  | ||||||
| 	c->oldy = c->y; c->y = wc.y = y; |  | ||||||
| 	c->oldw = c->w; c->w = wc.width = w; |  | ||||||
| 	c->oldh = c->h; c->h = wc.height = h; |  | ||||||
| 	wc.border_width = c->bw; | 	wc.border_width = c->bw; | ||||||
|  | 
 | ||||||
|  | 	/* Get number of clients for the selected monitor */ | ||||||
|  | 	for (n = 0, nbc = nexttiled(selmon->clients); nbc; nbc = nexttiled(nbc->next), n++); | ||||||
|  | 
 | ||||||
|  | 	/* Do nothing if layout is floating */ | ||||||
|  | 	if (c->isfloating || selmon->lt[selmon->sellt]->arrange == NULL) { | ||||||
|  | 		gapincr = gapoffset = 0; | ||||||
|  | 	} else { | ||||||
|  | 		/* Remove border and gap if layout is monocle or only one client */ | ||||||
|  | 		if (selmon->lt[selmon->sellt]->arrange == monocle || n == 1) { | ||||||
|  | 			gapoffset = 0; | ||||||
|  | 			gapincr = -2 * borderpx; | ||||||
|  | 			wc.border_width = 0; | ||||||
|  | 		} else { | ||||||
|  | 			gapoffset = gappx; | ||||||
|  | 			gapincr = 2 * gappx; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	c->oldx = c->x; c->x = wc.x = x + gapoffset; | ||||||
|  | 	c->oldy = c->y; c->y = wc.y = y + gapoffset; | ||||||
|  | 	c->oldw = c->w; c->w = wc.width = w - gapincr; | ||||||
|  | 	c->oldh = c->h; c->h = wc.height = h - gapincr; | ||||||
|  | 
 | ||||||
| 	XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc); | 	XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc); | ||||||
| 	configure(c); | 	configure(c); | ||||||
| 	XSync(dpy, False); | 	XSync(dpy, False); | ||||||
| @ -1381,6 +1485,12 @@ run(void) | |||||||
| 			handler[ev.type](&ev); /* call handler */ | 			handler[ev.type](&ev); /* call handler */ | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void | ||||||
|  | runAutostart(void) { | ||||||
|  | 	system("cd ~/.dwm; ./autostart_blocking.sh"); | ||||||
|  | 	system("cd ~/.dwm; ./autostart.sh &"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void | void | ||||||
| scan(void) | scan(void) | ||||||
| { | { | ||||||
| @ -1418,7 +1528,10 @@ sendmon(Client *c, Monitor *m) | |||||||
| 	detachstack(c); | 	detachstack(c); | ||||||
| 	c->mon = m; | 	c->mon = m; | ||||||
| 	c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */ | 	c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */ | ||||||
| 	attach(c); | 	if( attachbelow ) | ||||||
|  | 		attachBelow(c); | ||||||
|  | 	else | ||||||
|  | 		attach(c); | ||||||
| 	attachstack(c); | 	attachstack(c); | ||||||
| 	focus(NULL); | 	focus(NULL); | ||||||
| 	arrange(NULL); | 	arrange(NULL); | ||||||
| @ -1502,9 +1615,9 @@ void | |||||||
| setlayout(const Arg *arg) | setlayout(const Arg *arg) | ||||||
| { | { | ||||||
| 	if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) | 	if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) | ||||||
| 		selmon->sellt ^= 1; | 		selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag] ^= 1; | ||||||
| 	if (arg && arg->v) | 	if (arg && arg->v) | ||||||
| 		selmon->lt[selmon->sellt] = (Layout *)arg->v; | 		selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt] = (Layout *)arg->v; | ||||||
| 	strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol); | 	strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol); | ||||||
| 	if (selmon->sel) | 	if (selmon->sel) | ||||||
| 		arrange(selmon); | 		arrange(selmon); | ||||||
| @ -1523,7 +1636,7 @@ setmfact(const Arg *arg) | |||||||
| 	f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0; | 	f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0; | ||||||
| 	if (f < 0.05 || f > 0.95) | 	if (f < 0.05 || f > 0.95) | ||||||
| 		return; | 		return; | ||||||
| 	selmon->mfact = f; | 	selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag] = f; | ||||||
| 	arrange(selmon); | 	arrange(selmon); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -1542,7 +1655,8 @@ setup(void) | |||||||
| 	sw = DisplayWidth(dpy, screen); | 	sw = DisplayWidth(dpy, screen); | ||||||
| 	sh = DisplayHeight(dpy, screen); | 	sh = DisplayHeight(dpy, screen); | ||||||
| 	root = RootWindow(dpy, screen); | 	root = RootWindow(dpy, screen); | ||||||
| 	drw = drw_create(dpy, screen, root, sw, sh); | 	xinitvisual(); | ||||||
|  | 	drw = drw_create(dpy, screen, root, sw, sh, visual, depth, cmap); | ||||||
| 	if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) | 	if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) | ||||||
| 		die("no fonts could be loaded."); | 		die("no fonts could be loaded."); | ||||||
| 	lrpad = drw->fonts->h; | 	lrpad = drw->fonts->h; | ||||||
| @ -1570,7 +1684,7 @@ setup(void) | |||||||
| 	/* init appearance */ | 	/* init appearance */ | ||||||
| 	scheme = ecalloc(LENGTH(colors), sizeof(Clr *)); | 	scheme = ecalloc(LENGTH(colors), sizeof(Clr *)); | ||||||
| 	for (i = 0; i < LENGTH(colors); i++) | 	for (i = 0; i < LENGTH(colors); i++) | ||||||
| 		scheme[i] = drw_scm_create(drw, colors[i], 3); | 		scheme[i] = drw_scm_create(drw, colors[i], alphas[i], 3); | ||||||
| 	/* init bars */ | 	/* init bars */ | ||||||
| 	updatebars(); | 	updatebars(); | ||||||
| 	updatestatus(); | 	updatestatus(); | ||||||
| @ -1702,7 +1816,7 @@ tile(Monitor *m) | |||||||
| void | void | ||||||
| togglebar(const Arg *arg) | togglebar(const Arg *arg) | ||||||
| { | { | ||||||
| 	selmon->showbar = !selmon->showbar; | 	selmon->showbar = selmon->pertag->showbars[selmon->pertag->curtag] = !selmon->showbar; | ||||||
| 	updatebarpos(selmon); | 	updatebarpos(selmon); | ||||||
| 	XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); | 	XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); | ||||||
| 	arrange(selmon); | 	arrange(selmon); | ||||||
| @ -1741,9 +1855,33 @@ void | |||||||
| toggleview(const Arg *arg) | toggleview(const Arg *arg) | ||||||
| { | { | ||||||
| 	unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK); | 	unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK); | ||||||
|  | 	int i; | ||||||
| 
 | 
 | ||||||
| 	if (newtagset) { | 	if (newtagset) { | ||||||
| 		selmon->tagset[selmon->seltags] = newtagset; | 		selmon->tagset[selmon->seltags] = newtagset; | ||||||
|  | 
 | ||||||
|  | 		if (newtagset == ~0) { | ||||||
|  | 			selmon->pertag->prevtag = selmon->pertag->curtag; | ||||||
|  | 			selmon->pertag->curtag = 0; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		/* test if the user did not select the same tag */ | ||||||
|  | 		if (!(newtagset & 1 << (selmon->pertag->curtag - 1))) { | ||||||
|  | 			selmon->pertag->prevtag = selmon->pertag->curtag; | ||||||
|  | 			for (i = 0; !(newtagset & 1 << i); i++) ; | ||||||
|  | 			selmon->pertag->curtag = i + 1; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		/* apply settings for this view */ | ||||||
|  | 		selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag]; | ||||||
|  | 		selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag]; | ||||||
|  | 		selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag]; | ||||||
|  | 		selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt]; | ||||||
|  | 		selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1]; | ||||||
|  | 
 | ||||||
|  | 		if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag]) | ||||||
|  | 			togglebar(NULL); | ||||||
|  | 
 | ||||||
| 		focus(NULL); | 		focus(NULL); | ||||||
| 		arrange(selmon); | 		arrange(selmon); | ||||||
| 	} | 	} | ||||||
| @ -1807,16 +1945,18 @@ updatebars(void) | |||||||
| 	Monitor *m; | 	Monitor *m; | ||||||
| 	XSetWindowAttributes wa = { | 	XSetWindowAttributes wa = { | ||||||
| 		.override_redirect = True, | 		.override_redirect = True, | ||||||
| 		.background_pixmap = ParentRelative, | 		.background_pixel = 0, | ||||||
|  | 		.border_pixel = 0, | ||||||
|  | 		.colormap = cmap, | ||||||
| 		.event_mask = ButtonPressMask|ExposureMask | 		.event_mask = ButtonPressMask|ExposureMask | ||||||
| 	}; | 	}; | ||||||
| 	XClassHint ch = {"dwm", "dwm"}; | 	XClassHint ch = {"dwm", "dwm"}; | ||||||
| 	for (m = mons; m; m = m->next) { | 	for (m = mons; m; m = m->next) { | ||||||
| 		if (m->barwin) | 		if (m->barwin) | ||||||
| 			continue; | 			continue; | ||||||
| 		m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen), | 		m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, depth, | ||||||
| 				CopyFromParent, DefaultVisual(dpy, screen), | 		                          InputOutput, visual, | ||||||
| 				CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); | 		                          CWOverrideRedirect|CWBackPixel|CWBorderPixel|CWColormap|CWEventMask, &wa); | ||||||
| 		XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); | 		XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); | ||||||
| 		XMapRaised(dpy, m->barwin); | 		XMapRaised(dpy, m->barwin); | ||||||
| 		XSetClassHint(dpy, m->barwin, &ch); | 		XSetClassHint(dpy, m->barwin, &ch); | ||||||
| @ -1900,7 +2040,10 @@ updategeom(void) | |||||||
| 					m->clients = c->next; | 					m->clients = c->next; | ||||||
| 					detachstack(c); | 					detachstack(c); | ||||||
| 					c->mon = mons; | 					c->mon = mons; | ||||||
| 					attach(c); | 					if( attachbelow ) | ||||||
|  | 						attachBelow(c); | ||||||
|  | 					else | ||||||
|  | 						attach(c); | ||||||
| 					attachstack(c); | 					attachstack(c); | ||||||
| 				} | 				} | ||||||
| 				if (m == selmon) | 				if (m == selmon) | ||||||
| @ -2038,11 +2181,37 @@ updatewmhints(Client *c) | |||||||
| void | void | ||||||
| view(const Arg *arg) | view(const Arg *arg) | ||||||
| { | { | ||||||
|  | 	int i; | ||||||
|  | 	unsigned int tmptag; | ||||||
|  | 
 | ||||||
| 	if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) | 	if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) | ||||||
| 		return; | 		return; | ||||||
| 	selmon->seltags ^= 1; /* toggle sel tagset */ | 	selmon->seltags ^= 1; /* toggle sel tagset */ | ||||||
| 	if (arg->ui & TAGMASK) | 	if (arg->ui & TAGMASK) { | ||||||
| 		selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; | 		selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; | ||||||
|  | 		selmon->pertag->prevtag = selmon->pertag->curtag; | ||||||
|  | 
 | ||||||
|  | 		if (arg->ui == ~0) | ||||||
|  | 			selmon->pertag->curtag = 0; | ||||||
|  | 		else { | ||||||
|  | 			for (i = 0; !(arg->ui & 1 << i); i++) ; | ||||||
|  | 			selmon->pertag->curtag = i + 1; | ||||||
|  | 		} | ||||||
|  | 	} else { | ||||||
|  | 		tmptag = selmon->pertag->prevtag; | ||||||
|  | 		selmon->pertag->prevtag = selmon->pertag->curtag; | ||||||
|  | 		selmon->pertag->curtag = tmptag; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag]; | ||||||
|  | 	selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag]; | ||||||
|  | 	selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag]; | ||||||
|  | 	selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt]; | ||||||
|  | 	selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1]; | ||||||
|  | 
 | ||||||
|  | 	if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag]) | ||||||
|  | 		togglebar(NULL); | ||||||
|  | 
 | ||||||
| 	focus(NULL); | 	focus(NULL); | ||||||
| 	arrange(selmon); | 	arrange(selmon); | ||||||
| } | } | ||||||
| @ -2113,6 +2282,43 @@ xerrorstart(Display *dpy, XErrorEvent *ee) | |||||||
| 	return -1; | 	return -1; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void | ||||||
|  | xinitvisual() | ||||||
|  | { | ||||||
|  | 	XVisualInfo *infos; | ||||||
|  | 	XRenderPictFormat *fmt; | ||||||
|  | 	int nitems; | ||||||
|  | 	int i; | ||||||
|  | 
 | ||||||
|  | 	XVisualInfo tpl = { | ||||||
|  | 		.screen = screen, | ||||||
|  | 		.depth = 32, | ||||||
|  | 		.class = TrueColor | ||||||
|  | 	}; | ||||||
|  | 	long masks = VisualScreenMask | VisualDepthMask | VisualClassMask; | ||||||
|  | 
 | ||||||
|  | 	infos = XGetVisualInfo(dpy, masks, &tpl, &nitems); | ||||||
|  | 	visual = NULL; | ||||||
|  | 	for(i = 0; i < nitems; i ++) { | ||||||
|  | 		fmt = XRenderFindVisualFormat(dpy, infos[i].visual); | ||||||
|  | 		if (fmt->type == PictTypeDirect && fmt->direct.alphaMask) { | ||||||
|  | 			visual = infos[i].visual; | ||||||
|  | 			depth = infos[i].depth; | ||||||
|  | 			cmap = XCreateColormap(dpy, root, visual, AllocNone); | ||||||
|  | 			useargb = 1; | ||||||
|  | 			break; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	XFree(infos); | ||||||
|  | 
 | ||||||
|  | 	if (! visual) { | ||||||
|  | 		visual = DefaultVisual(dpy, screen); | ||||||
|  | 		depth = DefaultDepth(dpy, screen); | ||||||
|  | 		cmap = DefaultColormap(dpy, screen); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void | void | ||||||
| zoom(const Arg *arg) | zoom(const Arg *arg) | ||||||
| { | { | ||||||
| @ -2145,6 +2351,7 @@ main(int argc, char *argv[]) | |||||||
| 		die("pledge"); | 		die("pledge"); | ||||||
| #endif /* __OpenBSD__ */ | #endif /* __OpenBSD__ */ | ||||||
| 	scan(); | 	scan(); | ||||||
|  | 	runAutostart(); | ||||||
| 	run(); | 	run(); | ||||||
| 	cleanup(); | 	cleanup(); | ||||||
| 	XCloseDisplay(dpy); | 	XCloseDisplay(dpy); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user