fixed XSync handling and finished man page
							parent
							
								
									f60c597d65
								
							
						
					
					
						commit
						e6cbe9c11e
					
				
							
								
								
									
										7
									
								
								client.c
								
								
								
								
							
							
						
						
									
										7
									
								
								client.c
								
								
								
								
							| 
						 | 
					@ -49,13 +49,12 @@ focus(Client *c)
 | 
				
			||||||
	Client *old = sel;
 | 
						Client *old = sel;
 | 
				
			||||||
	XEvent ev;
 | 
						XEvent ev;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	XFlush(dpy);
 | 
					 | 
				
			||||||
	sel = c;
 | 
						sel = c;
 | 
				
			||||||
	if(old && old != c)
 | 
						if(old && old != c)
 | 
				
			||||||
		drawtitle(old);
 | 
							drawtitle(old);
 | 
				
			||||||
	drawtitle(c);
 | 
						drawtitle(c);
 | 
				
			||||||
	XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
 | 
						XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
 | 
				
			||||||
	XFlush(dpy);
 | 
						XSync(dpy, False);
 | 
				
			||||||
	while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
 | 
						while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -303,7 +302,7 @@ resize(Client *c, Bool inc)
 | 
				
			||||||
	e.above = None;
 | 
						e.above = None;
 | 
				
			||||||
	e.override_redirect = False;
 | 
						e.override_redirect = False;
 | 
				
			||||||
	XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&e);
 | 
						XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&e);
 | 
				
			||||||
	XFlush(dpy);
 | 
						XSync(dpy, False);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
| 
						 | 
					@ -393,7 +392,7 @@ unmanage(Client *c)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	free(c);
 | 
						free(c);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	XFlush(dpy);
 | 
						XSync(dpy, False);
 | 
				
			||||||
	XSetErrorHandler(xerror);
 | 
						XSetErrorHandler(xerror);
 | 
				
			||||||
	XUngrabServer(dpy);
 | 
						XUngrabServer(dpy);
 | 
				
			||||||
	arrange(NULL);
 | 
						arrange(NULL);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										7
									
								
								draw.c
								
								
								
								
							
							
						
						
									
										7
									
								
								draw.c
								
								
								
								
							| 
						 | 
					@ -131,7 +131,7 @@ drawstatus()
 | 
				
			||||||
	drawtext(stext, !istile, False);
 | 
						drawtext(stext, !istile, False);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, bw, bh, 0, 0);
 | 
						XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, bw, bh, 0, 0);
 | 
				
			||||||
	XFlush(dpy);
 | 
						XSync(dpy, False);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
| 
						 | 
					@ -163,9 +163,8 @@ drawtitle(Client *c)
 | 
				
			||||||
	dc.x += dc.w;
 | 
						dc.x += dc.w;
 | 
				
			||||||
	dc.w = textw(c->name);
 | 
						dc.w = textw(c->name);
 | 
				
			||||||
	drawtext(c->name, !istile, True);
 | 
						drawtext(c->name, !istile, True);
 | 
				
			||||||
	XCopyArea(dpy, dc.drawable, c->title, dc.gc,
 | 
						XCopyArea(dpy, dc.drawable, c->title, dc.gc, 0, 0, c->tw, c->th, 0, 0);
 | 
				
			||||||
			0, 0, c->tw, c->th, 0, 0);
 | 
						XSync(dpy, False);
 | 
				
			||||||
	XFlush(dpy);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
unsigned long
 | 
					unsigned long
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										58
									
								
								dwm.1
								
								
								
								
							
							
						
						
									
										58
									
								
								dwm.1
								
								
								
								
							| 
						 | 
					@ -7,14 +7,60 @@ dwm \- dynamic window manager
 | 
				
			||||||
.SH DESCRIPTION
 | 
					.SH DESCRIPTION
 | 
				
			||||||
.SS Overview
 | 
					.SS Overview
 | 
				
			||||||
.B dwm
 | 
					.B dwm
 | 
				
			||||||
is a dynamic window manager for X11.
 | 
					is a dynamic window manager for X11. It consists of a small status bar at the
 | 
				
			||||||
 | 
					top of the screen and arranges windows in either a tiled or floating mode.
 | 
				
			||||||
 | 
					.P
 | 
				
			||||||
 | 
					If 
 | 
				
			||||||
 | 
					.B dwm
 | 
				
			||||||
 | 
					is in tiled mode, it consists of two columns. The left master column
 | 
				
			||||||
 | 
					contains only one window per time, the right column contains all other windows 
 | 
				
			||||||
 | 
					in a stack. In tiled mode
 | 
				
			||||||
 | 
					.B dwm
 | 
				
			||||||
 | 
					.B don't
 | 
				
			||||||
 | 
					handles incremental resizals, some terminal programs like
 | 
				
			||||||
 | 
					.B xterm
 | 
				
			||||||
 | 
					may not work correctly with this in tiled mode.
 | 
				
			||||||
 | 
					.P
 | 
				
			||||||
 | 
					If
 | 
				
			||||||
 | 
					.B dwm
 | 
				
			||||||
 | 
					is in floating mode, it arranges all windows with the reqyested geometry and
 | 
				
			||||||
 | 
					allows the user to move or resize them. Some windows, like
 | 
				
			||||||
 | 
					dialog windows, are treated floating even if
 | 
				
			||||||
 | 
					.B dwm
 | 
				
			||||||
 | 
					is in tiled mode. In floating mode
 | 
				
			||||||
 | 
					.B dwm
 | 
				
			||||||
 | 
					handles incremental resizals.
 | 
				
			||||||
 | 
					.P
 | 
				
			||||||
 | 
					Windows are grouped by tags. You can view all windows with a specific tag per
 | 
				
			||||||
 | 
					time.  However, each window is allowed to contain more than one tag, which
 | 
				
			||||||
 | 
					allows to make windows visible in all views.
 | 
				
			||||||
 | 
					.P
 | 
				
			||||||
 | 
					.B dwm
 | 
				
			||||||
 | 
					reads from
 | 
				
			||||||
 | 
					.I stdin
 | 
				
			||||||
 | 
					to display status text, if written.
 | 
				
			||||||
 | 
					.P
 | 
				
			||||||
 | 
					.B dwm
 | 
				
			||||||
 | 
					draws 1-pixel borders around windows to indicate the focus state and save as
 | 
				
			||||||
 | 
					much screen real estate as possible. Unfocused windows contain a small bar
 | 
				
			||||||
 | 
					in front of the window indicating the tags and the window title.
 | 
				
			||||||
.SS Options
 | 
					.SS Options
 | 
				
			||||||
.TP
 | 
					.TP
 | 
				
			||||||
.B \-v
 | 
					.B \-v
 | 
				
			||||||
prints version information to stdout, then exits.
 | 
					prints version information to
 | 
				
			||||||
.SS Status text
 | 
					.I stdout
 | 
				
			||||||
 | 
					, then exits.
 | 
				
			||||||
 | 
					.SS Customization
 | 
				
			||||||
.B dwm
 | 
					.B dwm
 | 
				
			||||||
reads from stdin to display status text if provided.
 | 
					is customized through editing its source code. It is assumed that
 | 
				
			||||||
 | 
					dwm users are high experienced users who know how a window manager works
 | 
				
			||||||
 | 
					and who are able to patch
 | 
				
			||||||
 | 
					.B dwm
 | 
				
			||||||
 | 
					for their needs. This keeps
 | 
				
			||||||
 | 
					.B dwm
 | 
				
			||||||
 | 
					fast, secure and simple, because it does not process any input data, except
 | 
				
			||||||
 | 
					window properties and the status text read from
 | 
				
			||||||
 | 
					.I stdin .
 | 
				
			||||||
.SS Default Key Bindings
 | 
					.SS Default Key Bindings
 | 
				
			||||||
.TP 16
 | 
					.TP 16
 | 
				
			||||||
.I Key	
 | 
					.I Key	
 | 
				
			||||||
| 
						 | 
					@ -96,3 +142,7 @@ Lowers current
 | 
				
			||||||
Resizes current
 | 
					Resizes current
 | 
				
			||||||
.B window
 | 
					.B window
 | 
				
			||||||
while dragging
 | 
					while dragging
 | 
				
			||||||
 | 
					.SH BUGS
 | 
				
			||||||
 | 
					Some terminal programs do not behave correctly in tiled mode, because
 | 
				
			||||||
 | 
					incremental resizals are ignored to use maximum screen real estate. You can
 | 
				
			||||||
 | 
					patch the code to fix this.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										6
									
								
								event.c
								
								
								
								
							
							
						
						
									
										6
									
								
								event.c
								
								
								
								
							| 
						 | 
					@ -73,7 +73,7 @@ movemouse(Client *c)
 | 
				
			||||||
			handler[Expose](&ev);
 | 
								handler[Expose](&ev);
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		case MotionNotify:
 | 
							case MotionNotify:
 | 
				
			||||||
			XFlush(dpy);
 | 
								XSync(dpy, False);
 | 
				
			||||||
			c->x = ocx + (ev.xmotion.x - x1);
 | 
								c->x = ocx + (ev.xmotion.x - x1);
 | 
				
			||||||
			c->y = ocy + (ev.xmotion.y - y1);
 | 
								c->y = ocy + (ev.xmotion.y - y1);
 | 
				
			||||||
			resize(c, False);
 | 
								resize(c, False);
 | 
				
			||||||
| 
						 | 
					@ -105,7 +105,7 @@ resizemouse(Client *c)
 | 
				
			||||||
			handler[Expose](&ev);
 | 
								handler[Expose](&ev);
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		case MotionNotify:
 | 
							case MotionNotify:
 | 
				
			||||||
			XFlush(dpy);
 | 
								XSync(dpy, False);
 | 
				
			||||||
			c->w = abs(ocx - ev.xmotion.x);
 | 
								c->w = abs(ocx - ev.xmotion.x);
 | 
				
			||||||
			c->h = abs(ocy - ev.xmotion.y);
 | 
								c->h = abs(ocy - ev.xmotion.y);
 | 
				
			||||||
			c->x = (ocx <= ev.xmotion.x) ? ocx : ocx - c->w;
 | 
								c->x = (ocx <= ev.xmotion.x) ? ocx : ocx - c->w;
 | 
				
			||||||
| 
						 | 
					@ -191,7 +191,7 @@ configurerequest(XEvent *e)
 | 
				
			||||||
	ev->value_mask &= ~CWStackMode;
 | 
						ev->value_mask &= ~CWStackMode;
 | 
				
			||||||
	ev->value_mask |= CWBorderWidth;
 | 
						ev->value_mask |= CWBorderWidth;
 | 
				
			||||||
	XConfigureWindow(dpy, ev->window, ev->value_mask, &wc);
 | 
						XConfigureWindow(dpy, ev->window, ev->value_mask, &wc);
 | 
				
			||||||
	XFlush(dpy);
 | 
						XSync(dpy, False);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								main.c
								
								
								
								
							
							
						
						
									
										2
									
								
								main.c
								
								
								
								
							| 
						 | 
					@ -131,7 +131,7 @@ sendevent(Window w, Atom a, long value)
 | 
				
			||||||
	e.xclient.data.l[0] = value;
 | 
						e.xclient.data.l[0] = value;
 | 
				
			||||||
	e.xclient.data.l[1] = CurrentTime;
 | 
						e.xclient.data.l[1] = CurrentTime;
 | 
				
			||||||
	XSendEvent(dpy, w, False, NoEventMask, &e);
 | 
						XSendEvent(dpy, w, False, NoEventMask, &e);
 | 
				
			||||||
	XFlush(dpy);
 | 
						XSync(dpy, False);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue