mirror of
https://git.suckless.org/dwm
synced 2024-12-27 03:16:32 +00:00
fixed XSync handling and finished man page
This commit is contained in:
parent
f60c597d65
commit
e6cbe9c11e
5 changed files with 64 additions and 16 deletions
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 a new issue