[guide] Some updates to wmii.pdf to track the man pages.

This commit is contained in:
Kris Maglione 2010-06-16 18:32:09 -04:00
parent c3b818e241
commit d9486fa419
12 changed files with 151 additions and 105 deletions

View File

@ -16,7 +16,6 @@ PACKAGES += $(X11PACKAGES)
LIB = $(LIBS9) $(LIBIXP)
LIBS += -lm
CFLAGS += -DIXP_NEEDAPI=86
OBJ = main \
caret \
history \

View File

@ -11,7 +11,6 @@ PACKAGES += $(X11PACKAGES)
LIB = $(LIBS9)
LIBS += -lm
CFLAGS += -DIXP_NEEDAPI=86
OBJ = main \
ewmh \
win

View File

@ -13,7 +13,6 @@ PACKAGES += $(X11PACKAGES) xext xrandr xrender xinerama
LIB = $(LIBIXP) $(LIBS9)
LIBS += -lm
CFLAGS += $(INCICONV) -DIXP_NEEDAPI=97
OBJ = area \
bar \
backtrace \

View File

@ -3,7 +3,6 @@
*/
#define _XOPEN_SOURCE 600
#define IXP_P9_STRUCTS
#define IXP_NO_P9_
#include <assert.h>
#include <regexp9.h>

View File

@ -184,7 +184,7 @@ void fs_attach(Ixp9Req*);
void fs_clunk(Ixp9Req*);
void fs_create(Ixp9Req*);
void fs_flush(Ixp9Req*);
void fs_freefid(Fid*);
void fs_freefid(IxpFid*);
void fs_open(Ixp9Req*);
void fs_read(Ixp9Req*);
void fs_remove(Ixp9Req*);

View File

@ -195,7 +195,7 @@ dwrite(int flag, void *buf, int n, bool always) {
static uint fs_size(IxpFileId*);
static void
dostat(Stat *s, IxpFileId *f) {
dostat(IxpStat *s, IxpFileId *f) {
s->type = 0;
s->dev = 0;
s->qid.path = QID(f->tab.type, f->id);
@ -363,7 +363,7 @@ fs_attach(Ixp9Req *r) {
r->fid->qid.type = f->tab.qtype;
r->fid->qid.path = QID(f->tab.type, 0);
r->ofcall.rattach.qid = r->fid->qid;
respond(r, nil);
ixp_respond(r, nil);
}
void
@ -394,7 +394,7 @@ fs_size(IxpFileId *f) {
void
fs_stat(Ixp9Req *r) {
IxpMsg m;
Stat s;
IxpStat s;
int size;
char *buf;
IxpFileId *f;
@ -402,7 +402,7 @@ fs_stat(Ixp9Req *r) {
f = r->fid->aux;
if(!ixp_srv_verifyfile(f, lookup_file)) {
respond(r, Enofile);
ixp_respond(r, Enofile);
return;
}
@ -415,7 +415,7 @@ fs_stat(Ixp9Req *r) {
ixp_pstat(&m, &s);
r->ofcall.rstat.stat = (uchar*)m.data;
respond(r, nil);
ixp_respond(r, nil);
}
void
@ -427,7 +427,7 @@ fs_read(Ixp9Req *r) {
f = r->fid->aux;
if(!ixp_srv_verifyfile(f, lookup_file)) {
respond(r, Enofile);
ixp_respond(r, Enofile);
return;
}
@ -443,49 +443,49 @@ fs_read(Ixp9Req *r) {
switch(f->tab.type) {
case FsFprops:
ixp_srv_readbuf(r, f->p.client->props, strlen(f->p.client->props));
respond(r, nil);
ixp_respond(r, nil);
return;
case FsFColRules:
case FsFRules:
ixp_srv_readbuf(r, f->p.rule->string, f->p.rule->size);
respond(r, nil);
ixp_respond(r, nil);
return;
case FsFKeys:
ixp_srv_readbuf(r, def.keys, def.keyssz);
respond(r, nil);
ixp_respond(r, nil);
return;
case FsFCtags:
ixp_srv_readbuf(r, f->p.client->tags, strlen(f->p.client->tags));
respond(r, nil);
ixp_respond(r, nil);
return;
case FsFClabel:
ixp_srv_readbuf(r, f->p.client->name, strlen(f->p.client->name));
respond(r, nil);
ixp_respond(r, nil);
return;
case FsFBar:
ixp_srv_readbuf(r, f->p.bar->buf, strlen(f->p.bar->buf));
respond(r, nil);
ixp_respond(r, nil);
return;
case FsFRctl:
buf = readctl_root();
ixp_srv_readbuf(r, buf, strlen(buf));
respond(r, nil);
ixp_respond(r, nil);
return;
case FsFCctl:
buf = readctl_client(f->p.client);
ixp_srv_readbuf(r, buf, strlen(buf));
respond(r, nil);
ixp_respond(r, nil);
return;
case FsFTindex:
buf = view_index(f->p.view);
ixp_srv_readbuf(r, buf, strlen(buf));
respond(r, nil);
ixp_respond(r, nil);
return;
case FsFTctl:
buf = readctl_view(f->p.view);
n = strlen(buf);
ixp_srv_readbuf(r, buf, n);
respond(r, nil);
ixp_respond(r, nil);
return;
}
}
@ -502,18 +502,18 @@ fs_write(Ixp9Req *r) {
uint i;
if(r->ifcall.io.count == 0) {
respond(r, nil);
ixp_respond(r, nil);
return;
}
f = r->fid->aux;
if(!ixp_srv_verifyfile(f, lookup_file)) {
respond(r, Enofile);
ixp_respond(r, Enofile);
return;
}
if(waserror()) {
respond(r, ixp_errbuf());
ixp_respond(r, ixp_errbuf());
return;
}
@ -521,11 +521,11 @@ fs_write(Ixp9Req *r) {
case FsFColRules:
case FsFRules:
ixp_srv_writebuf(r, &f->p.rule->string, &f->p.rule->size, 0);
respond(r, nil);
ixp_respond(r, nil);
break;
case FsFKeys:
ixp_srv_writebuf(r, &def.keys, &def.keyssz, 0);
respond(r, nil);
ixp_respond(r, nil);
break;
case FsFClabel:
ixp_srv_data2cstring(r);
@ -535,13 +535,13 @@ fs_write(Ixp9Req *r) {
frame_draw(f->p.client->sel);
update_class(f->p.client);
r->ofcall.io.count = r->ifcall.io.count;
respond(r, nil);
ixp_respond(r, nil);
break;
case FsFCtags:
ixp_srv_data2cstring(r);
client_applytags(f->p.client, r->ifcall.io.data);
r->ofcall.io.count = r->ifcall.io.count;
respond(r, nil);
ixp_respond(r, nil);
break;
case FsFBar:
i = strlen(f->p.bar->buf);
@ -549,7 +549,7 @@ fs_write(Ixp9Req *r) {
ixp_srv_writebuf(r, &p, &i, 279);
bar_load(f->p.bar);
r->ofcall.io.count = i - r->ifcall.io.offset;
respond(r, nil);
ixp_respond(r, nil);
break;
case FsFCctl:
mf = (MsgFunc)message_client;
@ -563,7 +563,7 @@ fs_write(Ixp9Req *r) {
msg:
errstr = ixp_srv_writectl(r, mf);
r->ofcall.io.count = r->ifcall.io.count;
respond(r, errstr);
ixp_respond(r, errstr);
break;
case FsFEvent:
if(r->ifcall.io.data[r->ifcall.io.count-1] == '\n')
@ -571,7 +571,7 @@ fs_write(Ixp9Req *r) {
else
event("%.*s\n", (int)r->ifcall.io.count, r->ifcall.io.data);
r->ofcall.io.count = r->ifcall.io.count;
respond(r, nil);
ixp_respond(r, nil);
break;
default:
/* This should not be called if the file is not open for writing. */
@ -588,7 +588,7 @@ fs_open(Ixp9Req *r) {
f = r->fid->aux;
if(!ixp_srv_verifyfile(f, lookup_file)) {
respond(r, Enofile);
ixp_respond(r, Enofile);
return;
}
@ -606,9 +606,9 @@ fs_open(Ixp9Req *r) {
|| (r->ifcall.topen.mode&3) != OREAD && !(f->tab.perm & 0200)
|| (r->ifcall.topen.mode&3) != OWRITE && !(f->tab.perm & 0400)
|| (r->ifcall.topen.mode & ~(3|OAPPEND|OTRUNC)))
respond(r, Enoperm);
ixp_respond(r, Enoperm);
else
respond(r, nil);
ixp_respond(r, nil);
}
void
@ -619,24 +619,24 @@ fs_create(Ixp9Req *r) {
switch(f->tab.type) {
default:
respond(r, Enoperm);
ixp_respond(r, Enoperm);
return;
case FsDBars:
if(!strlen(r->ifcall.tcreate.name)) {
respond(r, Ebadvalue);
ixp_respond(r, Ebadvalue);
return;
}
bar_create(f->p.bar_p, r->ifcall.tcreate.name);
f = lookup_file(f, r->ifcall.tcreate.name);
if(!f) {
respond(r, Enofile);
ixp_respond(r, Enofile);
return;
}
r->ofcall.ropen.qid.type = f->tab.qtype;
r->ofcall.ropen.qid.path = QID(f->tab.type, f->id);
f->next = r->fid->aux;
r->fid->aux = f;
respond(r, nil);
ixp_respond(r, nil);
break;
}
}
@ -648,20 +648,20 @@ fs_remove(Ixp9Req *r) {
f = r->fid->aux;
if(!ixp_srv_verifyfile(f, lookup_file)) {
respond(r, Enofile);
ixp_respond(r, Enofile);
return;
}
switch(f->tab.type) {
default:
respond(r, Enoperm);
ixp_respond(r, Enoperm);
return;
case FsFBar:
s = f->p.bar->screen;
bar_destroy(f->next->p.bar_p, f->p.bar);
bar_draw(s);
respond(r, nil);
ixp_respond(r, nil);
break;
}
}
@ -672,7 +672,7 @@ fs_clunk(Ixp9Req *r) {
f = r->fid->aux;
if(!ixp_srv_verifyfile(f, lookup_file)) {
respond(r, nil);
ixp_respond(r, nil);
return;
}
@ -694,7 +694,7 @@ fs_clunk(Ixp9Req *r) {
update_keys();
break;
}
respond(r, nil);
ixp_respond(r, nil);
}
void
@ -707,12 +707,12 @@ fs_flush(Ixp9Req *r) {
if(f->pending)
ixp_pending_flush(r);
/* else die() ? */
respond(r->oldreq, Einterrupted);
respond(r, nil);
ixp_respond(r->oldreq, Einterrupted);
ixp_respond(r, nil);
}
void
fs_freefid(Fid *f) {
fs_freefid(IxpFid *f) {
IxpFileId *id, *tid;
tid = f->aux;

View File

@ -405,7 +405,7 @@ main(int argc, char *argv[]) {
event_debug = debug_event;
srv.preselect = event_preselect;
ixp_listen(&srv, sock, &p9srv, serve_9pcon, nil);
ixp_listen(&srv, sock, &p9srv, ixp_serve9conn, nil);
ixp_listen(&srv, ConnectionNumber(display), nil, event_fdready, closedisplay);
def.border = 1;

View File

@ -34,15 +34,15 @@ static char* fcnames[] = {
};
static int
qid(Fmt *f, Qid *q) {
qid(Fmt *f, IxpQid *q) {
return fmtprint(f, "(%uhd,%uld,%ullx)", q->type, q->version, q->path);
}
int
Ffmt(Fmt *f) {
Fcall *fcall;
IxpFcall *fcall;
fcall = va_arg(f->args, Fcall*);
fcall = va_arg(f->args, IxpFcall*);
fmtprint(f, "% 2d %s\t", fcall->hdr.tag, fcnames[fcall->hdr.type - TVersion]);
switch(fcall->hdr.type) {
case TVersion:

6
debian/changelog vendored
View File

@ -1,5 +1,5 @@
wmii-hg (hg2608) unstable; urgency=low
wmii-hg (hg2728) unstable; urgency=low
* Closes issue #175.
* Remove long deprecated special treatment of the '!' tag.
-- Kris Maglione <jg@suckless.org> Mon, 17 May 2010 12:35:12 -0400
-- Kris Maglione <kris@suckless.org> Tue, 15 Jun 2010 15:13:12 -0400

View File

@ -236,19 +236,24 @@ the state they describe. For instance,
client. If a client is fullscreen, it contains the line:
\begin{code}
Fullscreen on
fullscreen on
\end{code}
\noindent To change this, you'd update the file with the line
% XXX: Broken /ctl cmd.
|Fullscreen off| or even |Fullscreen| |toggle| to toggle
% XXX: Line broken at /ctl cmd.
|fullscreen off| or even |fullscreen| |toggle| to toggle
the client's fullscreen state.
The concept of controlling a program via a filesystem derives
from Plan 9, where such interfaces are extensive and well
proven. The metaphor has shown itself to be quite intuitive to
Unix users, once the shock of a “virtual” filesystem wears off.
The flexibility of being able to control \wmii\ from myriad
proven\footnote{The concept has also taken hold on most Unixes
in the form of \texttt{/proc} and \texttt{/sys} virtual
filesystems, but tends to be very kernel-centric. On Plan 9,
where the model is more pervasive, there are more virtual
filesystems for user-level applications than for the kernel.}.
The metaphor has shown itself to be quite intuitive to Unix
users, once the shock of a “virtual” filesystem wears off. The
flexibility of being able to control \wmii\ from myriad
programming languages, including the standard Unix shell and
even from the command line, is well worth the shock.
@ -780,8 +785,9 @@ scope of this document.
Key names can be detected by running |xev| from a
terminal, pressing the desired key, and looking at the output
(it's in the parentheses, after the keysym). A \wmii-specific
utility is forthcoming.
(it's in the parentheses, after the keysym). Or, more simply,
you can run the \man 1 {wikeyname} utility bundled with \wmii\
and press the key you wish to bind.
Examples of key bindings:
@ -874,19 +880,19 @@ writing new values to the control file. For instance, if a
client is fullscreen, its control file will contain the line:
\begin{code}
Fullscreen on
fullscreen on
\end{code}
\noindent To restore the client from fullscreen, either of the
following lines may be written to its control file:
\begin{code}
Fullscreen off
Fullscreen toggle
fullscreen off
fullscreen toggle
\end{code}
When next read, the |Fullscreen on| line will have been replaced
with |Fullscreen off|. No care need be taken to preserve the
When next read, the |fullscreen on| line will have been replaced
with |fullscreen off|. No care need be taken to preserve the
other contents of the file. They're generated anew each time
it's read.
@ -903,15 +909,39 @@ client. The files in these directories are:
\item[ctl] The control file. The properties are:
\index{filesystem!/client/*/@\clientlabel!ctl}
\begin{description}
\item[Fullscreen] The client's fullscreen state. When
\item[allow] The set of unusual actions the client is
allowed to perform, in the same format as the tag set.
\begin{description}
\item[activate] The client is allowed to activate
itself—that is, focus its window and, as the case may
require, uncollapse it and select a tag it resides on.
This flag must be set on a client if you wish it able to
activate itself from the system tray.
\end{description}
\item[floating] Defines whether this client is likely to
float when attached to a new view. May be |on|, |off|,
|always|, or |never|. Ordinarilly, the value changes
automatically whenever the window is moved between the
floating and managed layers. However, setting a value of
|always| or |never| overrides this behavior.
\item[fullscreen] The client's fullscreen state. When
|on|, the client is displayed fullscreen on all of its
views. Possible values are |on|, |off|, and |toggle|.
\item[Urgent] The client's urgency state. When |on|, the
client's layout box will be highlighted. Possible values
are |on|, |off|, and |toggle|.
\item[group] The client's group ID, or 0 if not part of a
group. Clients tend to open with the same tags and in
the same columns as the last active member of their
group. Setting this property is only useful when done
via the rules file.
\item[kill] When written, the window is closed politely,
if possible.
\item[pid] Read-only value of the PID of the program that
owns the window, if the value is available and the
process is on the same machine as wmii.
\item[slay] When written, the client is killed peremptorily.
\item[tags] The client's tags. The same as the tags file.
\item[urgent] The client's urgency state. When |on|, the
client's layout box will be highlighted. Possible values
are |on|, |off|, and |toggle|.
\end{description}
\item[props] The client's window class (the X11 |WM_CLASS|
property) and title string, separated by colons. This file
@ -922,14 +952,20 @@ client. The files in these directories are:
\index{filesystem!/client/*/@\clientlabel!label}
\item[tags]
\index{filesystem!/client/*/@\clientlabel!tags}
The client's tags. Tag names are separated by |+|
signs. Tags beginning and ending with |/| are treated as
regular expressions. If the written value begins with a |+|
or a |-|, the tags are updated rather than overwritten. Tag
names which directly follow a |-| sign are removed rather
than added. Regular expression tags which directly follow a
minus sign are treated as exclusion expressions. For
example, the tag string |+/foo/-/food/| will match the tag
The client's tags. Tag names are separated by |+|, |-|, or
|^| signs. Tags beginning and ending with |/| are treated as
regular expressions, which place the client on any extant
matching tag\footnote{While a client with a regex tag will
always appear in all matching views, it will not keep those
views in existence. When the last client explicitly tagged
with a view is removed, the view is deleted as soon as it
becomes inactive.}. If the written value begins with a |+|,
|-|, or |^|, the tags are updated rather than overwritten.
Tag names which directly follow a |-| sign are removed
rather than added, while those following a |^| are toggled.
Regular expression tags which directly follow a minus sign
are treated as exclusion expressions. For example, the tag
string |+/foo/-/food/| will match the tag
|foobar|, but not the tag |foodstand|.
\end{description}
@ -967,9 +1003,9 @@ And to manage their tags, we'll need:
«Client Menu Events» ::=
ClientMouseDown) # ClientMouseDown Client ID Button
[ $2 = 3 ] && clickmenu \
“Delete:xwrite /client/$1/ctl kill” \
“Kill:xwrite /client/$1/ctl slay” \
“Fullscreen:/client/$1/ctl Fullscreen on”
“Delete:wmiir xwrite /client/$1/ctl kill” \
“Kill: wmiirxwrite /client/$1/ctl slay” \
“Fullscreen:wmiir xwrite /client/$1/ctl fullscreen on”
\end{code}
\subsection{Unresponsive Clients}
@ -1128,8 +1164,8 @@ IDs to prevent untoward effects when this script dies.
«Command Execution Initialization» ::=
terminal() { wmiir setsid xterm “$@” }
proglist() {
IFS=: set -- $1
find -L $@ -maxdepth 1 -perm /111 | sed 1d; s,.*/,, | sort | uniq
IFS=:
wmiir proglist $1 | sort | uniq
unset IFS
}
\end{code}
@ -1232,22 +1268,35 @@ The root filesystem contains the following:
If there is no nth width, it is given
$1/\mbox{ncolth}$ of the screen.
\item[tagrules]
\index{filesystem!/!tagrules}
The |/tagrules| file contains a list of
rules similar to the colrules. These rules specify
the tags a client is to be given when it is created.
Rules are specified:
\item[rules]
\index{filesystem!/!rules}
The |/rules| file contains a list of
rules similar to the colrules. These rules set
properties for a client when it is created.
Rules are specified:
\begin{quote}\texttt{
/regex/ -> tag{\color{gray}[}+tag{\color{gray}]*}}
\end{quote}
\begin{quote}\texttt{
/regex/ -> key{\color{gray}=}value {\color{gray}\ldots}}
\end{quote}
When a client's name:class:title matches
regex, the matching rules are applied. For each
key=value pair, the |ctl| file property matching
key is set to value. Additionally, the following
keys are accepted and have special meaning:
\begin{description}
\item[continue]
Normally, when a matching rule is encountered,
rule matching stops. When the continue key is
provided (with any value), matching continues at
the next rule.
\item[force-tags]
Like tags, but overrides any settings obtained
obtained from the client's group or from the
|_WMII_TAGS| window property.
\end{description}
When a client's name:class:title matches
regex, it is given the tagstring tag. There are
two special tags. |!|, which is deprecated, and identical
to |sel|, represents the current tag. |~|
represents the floating layer.
\end{description}
\index{!filesystem!/|)}
@ -1312,8 +1361,8 @@ For clarity, here is the end result:
# «Command Execution Initialization»
terminal() { wmiir setsid xterm “$@” }
proglist() {
IFS=: set -- $1
find -L $@ -maxdepth 1 -perm /111 | sed 1d; s,.*/,, | sort | uniq
IFS=:
wmiir proglist $1 | sort | uniq
unset IFS
}
@ -1448,7 +1497,7 @@ For clarity, here is the end result:
# «Client Command Keys»
Mod4-Shift-c) wmiir xwrite /client/sel/ctl kill;;
Mod4-f) wmiir xwrite /client/sel/ctl Fullscreen toggle;;
Mod4-f) wmiir xwrite /client/sel/ctl fullscreen toggle;;
# «Command Execution Keys»
Mod4-Return) terminal & ;;
@ -1484,9 +1533,9 @@ For clarity, here is the end result:
# «Client Menu Events»
ClientMouseDown) # ClientMouseDown Client ID Button
[ $2 = 3 ] && clickmenu \
“Delete:xwrite /client/$1/ctl kill” \
“Kill:xwrite /client/$1/ctl slay” \
“Fullscreen:/client/$1/ctl Fullscreen on”
“Delete:wmiir xwrite /client/$1/ctl kill” \
“Kill:wmiir xwrite /client/$1/ctl slay” \
“Fullscreen:wmiir xwrite /client/$1/ctl fullscreen on”
# «Tag Menu Events»
LeftBarMouseDown) # LeftBarMouseDown Button Bar Name

View File

@ -20,7 +20,8 @@ LIBS9 = $(ROOT)/lib/libstuff.a $(ROOT)/lib/libregexp9.a $(ROOT)/lib/libbio.a $(R
CFLAGS += '-DVERSION=\"$(VERSION)\"' '-DCOPYRIGHT=\"$(COPYRIGHT)\"' \
'-DCONFDIR=\"$(CONFDIR)\"' '-DCONFPREFIX=\"$(ETC)\"' \
'-DLOCALCONF=\"$(LOCALCONF)\"' '-DGLOBALCONF=\"$(GLOBALCONF)\"'
'-DLOCALCONF=\"$(LOCALCONF)\"' '-DGLOBALCONF=\"$(GLOBALCONF)\"' \
-DIXP_NEEDAPI=127
FILTER = sed "s|@CONFPREFIX@|$(ETC)|g; \
s|@GLOBALCONF@|$(GLOBALCONF)|g; \

View File

@ -27,7 +27,7 @@ echo LD "$($bin/cleanname ${BASE}$outfile)"
[ -n "$noisycc" ] && echo $LD -o $outfile $ofiles $LDFLAGS $args
$LD -o $outfile $ofiles $LDFLAGS $args >$xtmp 2>&1
status=$?
[ $status -eq 0 ] || $LD -o $outfile $ofiles $LDFLAGS $args >&2
[ $status -eq 0 ] || echo $LD -o $outfile $ofiles $LDFLAGS $args >&2
sed 's/.*: In function `[^:]*: *//' $xtmp | egrep . |
egrep -v 'is almost always misused|is dangerous, better use|in statically linked applications requires at runtime'