separated setup stuff into main.c:setup() - this makes main() more readable
This commit is contained in:
		
							
								
								
									
										20
									
								
								dwm.h
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								dwm.h
									
									
									
									
									
								
							| @@ -11,15 +11,10 @@ | ||||
| #define MOUSEMASK		(BUTTONMASK | PointerMotionMask) | ||||
| #define PROTODELWIN		1 | ||||
|  | ||||
| typedef union Arg Arg; | ||||
| typedef struct Client Client; | ||||
| typedef struct DC DC; | ||||
| typedef struct Fnt Fnt; | ||||
|  | ||||
| union Arg { | ||||
| typedef union { | ||||
| 	const char *cmd; | ||||
| 	int i; | ||||
| }; | ||||
| } Arg; | ||||
|  | ||||
| /* atoms */ | ||||
| enum { NetSupported, NetWMName, NetLast }; | ||||
| @@ -28,18 +23,18 @@ enum { WMProtocols, WMDelete, WMLast }; | ||||
| /* cursor */ | ||||
| enum { CurNormal, CurResize, CurMove, CurLast }; | ||||
|  | ||||
| /* windowcorners */ | ||||
| /* window corners */ | ||||
| typedef enum { TopLeft, TopRight, BotLeft, BotRight } Corner; | ||||
|  | ||||
| struct Fnt { | ||||
| typedef struct { | ||||
| 	int ascent; | ||||
| 	int descent; | ||||
| 	int height; | ||||
| 	XFontSet set; | ||||
| 	XFontStruct *xfont; | ||||
| }; | ||||
| } Fnt; | ||||
|  | ||||
| struct DC { /* draw context */ | ||||
| typedef struct { /* draw context */ | ||||
| 	int x, y, w, h; | ||||
| 	unsigned long bg; | ||||
| 	unsigned long fg; | ||||
| @@ -47,8 +42,9 @@ struct DC { /* draw context */ | ||||
| 	Drawable drawable; | ||||
| 	Fnt font; | ||||
| 	GC gc; | ||||
| }; | ||||
| } DC; | ||||
|  | ||||
| typedef struct Client Client; | ||||
| struct Client { | ||||
| 	char name[256]; | ||||
| 	int proto; | ||||
|   | ||||
							
								
								
									
										181
									
								
								main.c
									
									
									
									
									
								
							
							
						
						
									
										181
									
								
								main.c
									
									
									
									
									
								
							| @@ -15,6 +15,22 @@ | ||||
| #include <X11/Xatom.h> | ||||
| #include <X11/Xproto.h> | ||||
|  | ||||
| /* extern */ | ||||
|  | ||||
| char stext[1024]; | ||||
| Bool *seltag; | ||||
| int screen, sx, sy, sw, sh, bx, by, bw, bh, mw; | ||||
| unsigned int ntags, numlockmask; | ||||
| Atom wmatom[WMLast], netatom[NetLast]; | ||||
| Bool running = True; | ||||
| Bool issel = True; | ||||
| Client *clients = NULL; | ||||
| Client *sel = NULL; | ||||
| Cursor cursor[CurLast]; | ||||
| Display *dpy; | ||||
| DC dc = {0}; | ||||
| Window root, barwin; | ||||
|  | ||||
| /* static */ | ||||
|  | ||||
| static int (*xerrorxlib)(Display *, XErrorEvent *); | ||||
| @@ -62,6 +78,79 @@ scan() | ||||
| 		XFree(wins); | ||||
| } | ||||
|  | ||||
| static void | ||||
| setup() | ||||
| { | ||||
| 	int i, j; | ||||
| 	unsigned int mask; | ||||
| 	Window w; | ||||
| 	XModifierKeymap *modmap; | ||||
| 	XSetWindowAttributes wa; | ||||
|  | ||||
| 	/* init atoms */ | ||||
| 	wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False); | ||||
| 	wmatom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False); | ||||
| 	netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); | ||||
| 	netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); | ||||
| 	XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32, | ||||
| 			PropModeReplace, (unsigned char *) netatom, NetLast); | ||||
|  | ||||
| 	/* init cursors */ | ||||
| 	cursor[CurNormal] = XCreateFontCursor(dpy, XC_left_ptr); | ||||
| 	cursor[CurResize] = XCreateFontCursor(dpy, XC_sizing); | ||||
| 	cursor[CurMove] = XCreateFontCursor(dpy, XC_fleur); | ||||
|  | ||||
| 	modmap = XGetModifierMapping(dpy); | ||||
| 	for (i = 0; i < 8; i++) { | ||||
| 		for (j = 0; j < modmap->max_keypermod; j++) { | ||||
| 			if(modmap->modifiermap[i * modmap->max_keypermod + j] == XKeysymToKeycode(dpy, XK_Num_Lock)) | ||||
| 				numlockmask = (1 << i); | ||||
| 		} | ||||
| 	} | ||||
| 	XFree(modmap); | ||||
|  | ||||
| 	wa.event_mask = SubstructureRedirectMask | SubstructureNotifyMask | EnterWindowMask | LeaveWindowMask; | ||||
| 	wa.cursor = cursor[CurNormal]; | ||||
| 	XChangeWindowAttributes(dpy, root, CWEventMask | CWCursor, &wa); | ||||
|  | ||||
| 	grabkeys(); | ||||
| 	initrregs(); | ||||
|  | ||||
| 	for(ntags = 0; tags[ntags]; ntags++); | ||||
| 	seltag = emallocz(sizeof(Bool) * ntags); | ||||
| 	seltag[0] = True; | ||||
|  | ||||
| 	/* style */ | ||||
| 	dc.bg = getcolor(BGCOLOR); | ||||
| 	dc.fg = getcolor(FGCOLOR); | ||||
| 	dc.border = getcolor(BORDERCOLOR); | ||||
| 	setfont(FONT); | ||||
|  | ||||
| 	sx = sy = 0; | ||||
| 	sw = DisplayWidth(dpy, screen); | ||||
| 	sh = DisplayHeight(dpy, screen); | ||||
| 	mw = (sw * MASTERW) / 100; | ||||
|  | ||||
| 	bx = by = 0; | ||||
| 	bw = sw; | ||||
| 	dc.h = bh = dc.font.height + 4; | ||||
| 	wa.override_redirect = 1; | ||||
| 	wa.background_pixmap = ParentRelative; | ||||
| 	wa.event_mask = ButtonPressMask | ExposureMask; | ||||
| 	barwin = XCreateWindow(dpy, root, bx, by, bw, bh, 0, DefaultDepth(dpy, screen), | ||||
| 			CopyFromParent, DefaultVisual(dpy, screen), | ||||
| 			CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa); | ||||
| 	XDefineCursor(dpy, barwin, cursor[CurNormal]); | ||||
| 	XMapRaised(dpy, barwin); | ||||
|  | ||||
| 	dc.drawable = XCreatePixmap(dpy, root, sw, bh, DefaultDepth(dpy, screen)); | ||||
| 	dc.gc = XCreateGC(dpy, root, 0, 0); | ||||
|  | ||||
| 	issel = XQueryPointer(dpy, root, &w, &w, &i, &i, &i, &i, &mask); | ||||
|  | ||||
| 	strcpy(stext, "dwm-"VERSION); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * Startup Error handler to check if another window manager | ||||
|  * is already running. | ||||
| @@ -75,20 +164,6 @@ xerrorstart(Display *dsply, XErrorEvent *ee) | ||||
|  | ||||
| /* extern */ | ||||
|  | ||||
| char stext[1024]; | ||||
| Bool *seltag; | ||||
| int screen, sx, sy, sw, sh, bx, by, bw, bh, mw; | ||||
| unsigned int ntags, numlockmask; | ||||
| Atom wmatom[WMLast], netatom[NetLast]; | ||||
| Bool running = True; | ||||
| Bool issel = True; | ||||
| Client *clients = NULL; | ||||
| Client *sel = NULL; | ||||
| Cursor cursor[CurLast]; | ||||
| Display *dpy; | ||||
| DC dc = {0}; | ||||
| Window root, barwin; | ||||
|  | ||||
| int | ||||
| getproto(Window w) | ||||
| { | ||||
| @@ -153,12 +228,8 @@ xerror(Display *dpy, XErrorEvent *ee) | ||||
| int | ||||
| main(int argc, char *argv[]) | ||||
| { | ||||
| 	int i, j, xfd; | ||||
| 	unsigned int mask; | ||||
| 	int r, xfd; | ||||
| 	fd_set rd; | ||||
| 	Window w; | ||||
| 	XModifierKeymap *modmap; | ||||
| 	XSetWindowAttributes wa; | ||||
|  | ||||
| 	if(argc == 2 && !strncmp("-v", argv[1], 3)) { | ||||
| 		fputs("dwm-"VERSION", (C)opyright MMVI Anselm R. Garbe\n", stdout); | ||||
| @@ -189,70 +260,8 @@ main(int argc, char *argv[]) | ||||
| 	xerrorxlib = XSetErrorHandler(xerror); | ||||
| 	XSync(dpy, False); | ||||
|  | ||||
| 	/* init atoms */ | ||||
| 	wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False); | ||||
| 	wmatom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False); | ||||
| 	netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); | ||||
| 	netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); | ||||
| 	XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32, | ||||
| 			PropModeReplace, (unsigned char *) netatom, NetLast); | ||||
|  | ||||
| 	/* init cursors */ | ||||
| 	cursor[CurNormal] = XCreateFontCursor(dpy, XC_left_ptr); | ||||
| 	cursor[CurResize] = XCreateFontCursor(dpy, XC_sizing); | ||||
| 	cursor[CurMove] = XCreateFontCursor(dpy, XC_fleur); | ||||
|  | ||||
| 	modmap = XGetModifierMapping(dpy); | ||||
| 	for (i = 0; i < 8; i++) { | ||||
| 		for (j = 0; j < modmap->max_keypermod; j++) { | ||||
| 			if(modmap->modifiermap[i * modmap->max_keypermod + j] == XKeysymToKeycode(dpy, XK_Num_Lock)) | ||||
| 				numlockmask = (1 << i); | ||||
| 		} | ||||
| 	} | ||||
| 	XFree(modmap); | ||||
|  | ||||
| 	wa.event_mask = SubstructureRedirectMask | SubstructureNotifyMask | EnterWindowMask | LeaveWindowMask; | ||||
| 	wa.cursor = cursor[CurNormal]; | ||||
| 	XChangeWindowAttributes(dpy, root, CWEventMask | CWCursor, &wa); | ||||
|  | ||||
| 	grabkeys(); | ||||
| 	initrregs(); | ||||
|  | ||||
| 	for(ntags = 0; tags[ntags]; ntags++); | ||||
| 	seltag = emallocz(sizeof(Bool) * ntags); | ||||
| 	seltag[0] = True; | ||||
|  | ||||
| 	/* style */ | ||||
| 	dc.bg = getcolor(BGCOLOR); | ||||
| 	dc.fg = getcolor(FGCOLOR); | ||||
| 	dc.border = getcolor(BORDERCOLOR); | ||||
| 	setfont(FONT); | ||||
|  | ||||
| 	sx = sy = 0; | ||||
| 	sw = DisplayWidth(dpy, screen); | ||||
| 	sh = DisplayHeight(dpy, screen); | ||||
| 	mw = (sw * MASTERW) / 100; | ||||
|  | ||||
| 	bx = by = 0; | ||||
| 	bw = sw; | ||||
| 	dc.h = bh = dc.font.height + 4; | ||||
| 	wa.override_redirect = 1; | ||||
| 	wa.background_pixmap = ParentRelative; | ||||
| 	wa.event_mask = ButtonPressMask | ExposureMask; | ||||
| 	barwin = XCreateWindow(dpy, root, bx, by, bw, bh, 0, DefaultDepth(dpy, screen), | ||||
| 			CopyFromParent, DefaultVisual(dpy, screen), | ||||
| 			CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa); | ||||
| 	XDefineCursor(dpy, barwin, cursor[CurNormal]); | ||||
| 	XMapRaised(dpy, barwin); | ||||
|  | ||||
| 	dc.drawable = XCreatePixmap(dpy, root, sw, bh, DefaultDepth(dpy, screen)); | ||||
| 	dc.gc = XCreateGC(dpy, root, 0, 0); | ||||
|  | ||||
| 	strcpy(stext, "dwm-"VERSION); | ||||
| 	setup(); | ||||
| 	drawstatus(); | ||||
|  | ||||
| 	issel = XQueryPointer(dpy, root, &w, &w, &i, &i, &i, &i, &mask); | ||||
|  | ||||
| 	scan(); | ||||
|  | ||||
| 	/* main event loop, also reads status text from stdin */ | ||||
| @@ -264,10 +273,10 @@ main(int argc, char *argv[]) | ||||
| 		if(readin) | ||||
| 			FD_SET(STDIN_FILENO, &rd); | ||||
| 		FD_SET(xfd, &rd); | ||||
| 		i = select(xfd + 1, &rd, NULL, NULL, NULL); | ||||
| 		if((i == -1) && (errno == EINTR)) | ||||
| 		r = select(xfd + 1, &rd, NULL, NULL, NULL); | ||||
| 		if((r == -1) && (errno == EINTR)) | ||||
| 			continue; | ||||
| 		if(i > 0) { | ||||
| 		if(r > 0) { | ||||
| 			if(readin && FD_ISSET(STDIN_FILENO, &rd)) { | ||||
| 				readin = NULL != fgets(stext, sizeof(stext), stdin); | ||||
| 				if(readin) | ||||
| @@ -277,7 +286,7 @@ main(int argc, char *argv[]) | ||||
| 				drawstatus(); | ||||
| 			} | ||||
| 		} | ||||
| 		else if(i < 0) | ||||
| 		else if(r < 0) | ||||
| 			eprint("select failed\n"); | ||||
| 		procevent(); | ||||
| 	} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user