changed main event loop
This commit is contained in:
		
							
								
								
									
										1
									
								
								dwm.h
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								dwm.h
									
									
									
									
									
								
							@@ -108,6 +108,7 @@ extern unsigned int textw(const char *text);
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
/* event.c */
 | 
					/* event.c */
 | 
				
			||||||
extern void grabkeys();
 | 
					extern void grabkeys();
 | 
				
			||||||
 | 
					extern void procevent();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* main.c */
 | 
					/* main.c */
 | 
				
			||||||
extern int getproto(Window w);
 | 
					extern int getproto(Window w);
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										13
									
								
								event.c
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								event.c
									
									
									
									
									
								
							@@ -384,3 +384,16 @@ grabkeys()
 | 
				
			|||||||
				GrabModeAsync, GrabModeAsync);
 | 
									GrabModeAsync, GrabModeAsync);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					procevent()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						XEvent ev;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while(XPending(dpy)) {
 | 
				
			||||||
 | 
							XNextEvent(dpy, &ev);
 | 
				
			||||||
 | 
							if(handler[ev.type])
 | 
				
			||||||
 | 
								(handler[ev.type])(&ev); /* call handler */
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										17
									
								
								main.c
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								main.c
									
									
									
									
									
								
							@@ -27,7 +27,9 @@ cleanup()
 | 
				
			|||||||
		resize(sel, True, TopLeft);
 | 
							resize(sel, True, TopLeft);
 | 
				
			||||||
		unmanage(sel);
 | 
							unmanage(sel);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						XUngrabKey(dpy, AnyKey, AnyModifier, root);
 | 
				
			||||||
	XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
 | 
						XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
 | 
				
			||||||
 | 
						XSync(dpy, False);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
@@ -37,6 +39,7 @@ scan()
 | 
				
			|||||||
	Window *wins, d1, d2;
 | 
						Window *wins, d1, d2;
 | 
				
			||||||
	XWindowAttributes wa;
 | 
						XWindowAttributes wa;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						wins = NULL;
 | 
				
			||||||
	if(XQueryTree(dpy, root, &d1, &d2, &wins, &num)) {
 | 
						if(XQueryTree(dpy, root, &d1, &d2, &wins, &num)) {
 | 
				
			||||||
		for(i = 0; i < num; i++) {
 | 
							for(i = 0; i < num; i++) {
 | 
				
			||||||
			if(!XGetWindowAttributes(dpy, wins[i], &wa))
 | 
								if(!XGetWindowAttributes(dpy, wins[i], &wa))
 | 
				
			||||||
@@ -168,7 +171,6 @@ main(int argc, char *argv[])
 | 
				
			|||||||
	fd_set rd;
 | 
						fd_set rd;
 | 
				
			||||||
	Bool readin = True;
 | 
						Bool readin = True;
 | 
				
			||||||
	Window w;
 | 
						Window w;
 | 
				
			||||||
	XEvent ev;
 | 
					 | 
				
			||||||
	XModifierKeymap *modmap;
 | 
						XModifierKeymap *modmap;
 | 
				
			||||||
	XSetWindowAttributes wa;
 | 
						XSetWindowAttributes wa;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -196,6 +198,7 @@ main(int argc, char *argv[])
 | 
				
			|||||||
	if(otherwm)
 | 
						if(otherwm)
 | 
				
			||||||
		eprint("dwm: another window manager is already running\n");
 | 
							eprint("dwm: another window manager is already running\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						XSync(dpy, False);
 | 
				
			||||||
	XSetErrorHandler(NULL);
 | 
						XSetErrorHandler(NULL);
 | 
				
			||||||
	xerrorxlib = XSetErrorHandler(xerror);
 | 
						xerrorxlib = XSetErrorHandler(xerror);
 | 
				
			||||||
	XSync(dpy, False);
 | 
						XSync(dpy, False);
 | 
				
			||||||
@@ -268,7 +271,7 @@ main(int argc, char *argv[])
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	/* main event loop, also reads status text from stdin */
 | 
						/* main event loop, also reads status text from stdin */
 | 
				
			||||||
	XSync(dpy, False);
 | 
						XSync(dpy, False);
 | 
				
			||||||
	goto XLoop;
 | 
						procevent();
 | 
				
			||||||
	while(running) {
 | 
						while(running) {
 | 
				
			||||||
		FD_ZERO(&rd);
 | 
							FD_ZERO(&rd);
 | 
				
			||||||
		if(readin)
 | 
							if(readin)
 | 
				
			||||||
@@ -288,14 +291,8 @@ main(int argc, char *argv[])
 | 
				
			|||||||
					strcpy(stext, "broken pipe");
 | 
										strcpy(stext, "broken pipe");
 | 
				
			||||||
				drawstatus();
 | 
									drawstatus();
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			if(FD_ISSET(xfd, &rd)) {
 | 
								if(FD_ISSET(xfd, &rd))
 | 
				
			||||||
XLoop:
 | 
									procevent();
 | 
				
			||||||
				while(XPending(dpy)) {
 | 
					 | 
				
			||||||
					XNextEvent(dpy, &ev);
 | 
					 | 
				
			||||||
					if(handler[ev.type])
 | 
					 | 
				
			||||||
						(handler[ev.type])(&ev); /* call handler */
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	cleanup();
 | 
						cleanup();
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user