Rearrange some things.

This commit is contained in:
Kris Maglione 2010-06-14 10:30:23 -04:00
parent e5e4ff284d
commit 398533dfd1
80 changed files with 267 additions and 431 deletions

View File

@ -4,7 +4,8 @@ syntax: regexp
\.([oa]|out|o_pic|so|pyc|pyo|diff)$
\.(diff|orig|rej|bak)$
\.(aux|idx|ilg|ind|log|toc)$
^cmd/(stfo|osd|wiwarp|setfocus)(/|$)
^cmd/osd(/|$)
^cmd/x11/(stfo|wiclick)\.
^(pkg|src)/
^doxy
/bak/

View File

@ -2,7 +2,7 @@ ROOT=..
include $(ROOT)/mk/hdr.mk
include $(ROOT)/mk/wmii.mk
BIN = $(ETC)/wmii$(CONFVERSION)
BIN = $(GLOBALCONF)
DIRS = python \
plan9port \
ruby

View File

@ -5,5 +5,5 @@ include $(ROOT)/mk/wmii.mk
DOCS = README
EXECS = wmiirc
DIR = $(ETC)/wmii$(CONFVERSION)/plan9port
DIR = $(GLOBALCONF)/plan9port
DOCDIR = $(DOC)/alternative_wmiircs/plan9port

View File

@ -8,7 +8,7 @@ TEXT = wmiirc.py
DIRS = pygmi \
pyxp
DIR = $(ETC)/wmii$(CONFVERSION)/python
DIR = $(GLOBALCONF)/python
DOCDIR = $(DOC)/alternative_wmiircs/python
include $(ROOT)/mk/dir.mk

View File

@ -9,4 +9,4 @@ BINARY = __init__.py \
monitor.py \
util.py
DIR = $(ETC)/wmii$(CONFVERSION)/python/pygmi
DIR = $(GLOBALCONF)/python/pygmi

View File

@ -12,4 +12,4 @@ BINARY = __init__.py \
mux.py \
types.py
DIR = $(ETC)/wmii$(CONFVERSION)/python/pyxp
DIR = $(GLOBALCONF)/python/pyxp

View File

@ -9,5 +9,5 @@ EXECS = wmiirc
TEXT = config.rb \
config.yaml
DIR = $(ETC)/wmii$(CONFVERSION)/ruby
DIR = $(GLOBALCONF)/ruby
DOCDIR = $(DOC)/alternative_wmiircs/ruby

View File

@ -4,24 +4,18 @@ include $(ROOT)/mk/wmii.mk
wmiir.c: $(ROOT)/mk/wmii.mk
DIRS = wmii \
keyname \
menu \
DIRS = menu \
strut \
tray
tray \
wmii \
x11
TARG = wihack \
wmii.rc \
wmii.sh \
wmii9menu \
wmiir
LIBS += $(LIBS9) $(LIBIXP)
CFLAGS += $(INCX11)
include $(ROOT)/mk/many.mk
include $(ROOT)/mk/dir.mk
O9MENU=wmii9menu.o $(ROOT)/lib/libstuff.a $(LIBIXP)
wmii9menu.out: $(O9MENU)
$(LINK) $@ $(O9MENU) $$(pkg-config --libs $(X11PACKAGES)) -lXext

View File

@ -1,18 +0,0 @@
ROOT= ../..
include $(ROOT)/mk/hdr.mk
include $(ROOT)/mk/wmii.mk
main.c: $(ROOT)/mk/wmii.mk
TARG = click
HFILES= dat.h fns.h
PACKAGES += $(X11PACKAGES) xext xrandr xrender xinerama
LIB = $(LIBIXP) $(LIBS9)
LIBS += -lm -lXtst
CFLAGS += -DIXP_NEEDAPI=86
OBJ = main
include $(ROOT)/mk/one.mk

View File

@ -1,77 +0,0 @@
/* Copyright ©2008-2010 Kris Maglione <maglione.k at Gmail>
* See LICENSE file for license details.
*/
#include "dat.h"
#include <ctype.h>
#include <string.h>
#include "fns.h"
#define strbcmp(str, const) (strncmp((str), (const), sizeof(const)-1))
static int
getbase(const char **s, long *sign) {
const char *p;
int ret;
ret = 10;
*sign = 1;
if(**s == '-') {
*sign = -1;
*s += 1;
}else if(**s == '+')
*s += 1;
p = *s;
if(!strbcmp(p, "0x")) {
*s += 2;
ret = 16;
}
else if(isdigit(p[0])) {
if(p[1] == 'r') {
*s += 2;
ret = p[0] - '0';
}
else if(isdigit(p[1]) && p[2] == 'r') {
*s += 3;
ret = 10*(p[0]-'0') + (p[1]-'0');
}
}
else if(p[0] == '0') {
ret = 8;
}
if(ret != 10 && (**s == '-' || **s == '+'))
*sign = 0;
return ret;
}
bool
getlong(const char *s, long *ret) {
const char *end;
char *rend;
int base;
long sign;
end = s+strlen(s);
base = getbase(&s, &sign);
if(sign == 0)
return false;
*ret = sign * strtol(s, &rend, base);
return (end == rend);
}
bool
getulong(const char *s, ulong *ret) {
const char *end;
char *rend;
int base;
long sign;
end = s+strlen(s);
base = getbase(&s, &sign);
if(sign < 1)
return false;
*ret = strtoul(s, &rend, base);
return (end == rend);
}

View File

@ -1,17 +0,0 @@
#include <fmt.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stdlib.h>
#include <unistd.h>
#include <stuff/x.h>
#include <stuff/util.h>
#include <ixp.h>
#define BLOCK(x) do { x; }while(0)
#ifndef EXTERN
# define EXTERN extern
#endif
EXTERN Window win;

View File

@ -1 +0,0 @@

View File

@ -1,60 +0,0 @@
/* Copyright ©2006-2010 Kris Maglione <maglione.k at Gmail>
* See LICENSE file for license details.
*/
#define EXTERN
#include "dat.h"
#include <X11/Xproto.h>
#include <X11/extensions/XTest.h>
#include <locale.h>
#include <string.h>
#include "fns.h"
static const char version[] = "click-"VERSION", "COPYRIGHT"\n";
static void
usage(void) {
fatal("usage: %s [window]\n", argv0);
}
static void
click(Window *w, Point p) {
Rectangle r;
Point rp;
r = getwinrect(w);
rp = subpt(r.max, p);
XTestFakeMotionEvent(display, 0, rp.x, rp.y, 0);
XTestFakeButtonEvent(display, 1, true, 0);
XTestFakeButtonEvent(display, 1, false, 0);
XTestFakeMotionEvent(display, 0, r.max.x, r.max.y, 0);
}
int
main(int argc, char *argv[]) {
char *s;
ARGBEGIN{
default:
usage();
}ARGEND;
initdisplay();
s = ARGF();
if(s && !getulong(s, &win.xid))
usage();
if (!s)
win.xid = getfocus();
if(argc)
usage();
click(&win, Pt(1, 1));
XCloseDisplay(display);
return 0;
}

View File

@ -1,15 +0,0 @@
ROOT= ../..
include $(ROOT)/mk/hdr.mk
include $(ROOT)/mk/wmii.mk
main.c: $(ROOT)/mk/wmii.mk
TARG = wikeyname
PACKAGES += $(X11PACKAGES)
LIB = $(LIBS9)
OBJ = main
include $(ROOT)/mk/one.mk

View File

@ -8,7 +8,7 @@
static void
splice(Item *i) {
if(i->next != nil)
if(i->next != nil)
i->next->prev = i->prev;
if(i->prev != nil)
i->prev->next = i->next;

View File

@ -15,28 +15,6 @@ struct Key {
static Key* bindings;
static void
init_numlock(void) {
static int masks[] = {
ShiftMask, LockMask, ControlMask, Mod1Mask,
Mod2Mask, Mod3Mask, Mod4Mask, Mod5Mask
};
XModifierKeymap *modmap;
KeyCode kcode;
int i, max;
modmap = XGetModifierMapping(display);
kcode = keycode("Num_Lock");
if(kcode)
if(modmap && modmap->max_keypermod > 0) {
max = nelem(masks) * modmap->max_keypermod;
for(i = 0; i < max; i++)
if(modmap->modifiermap[i] == kcode)
numlock = masks[i / modmap->max_keypermod];
}
XFreeModifiermap(modmap);
}
/*
* To do: Find my red black tree implementation.
*/
@ -50,7 +28,7 @@ parse_keys(char *spec) {
int i, nlines, nwords;
if(!numlock)
init_numlock();
numlock = numlockmask();
nlines = tokenize(lines, nelem(lines), spec, '\n');
for(i=0; i < nlines; i++) {

View File

@ -10,8 +10,8 @@
# pragma varargck argpos event 1
# pragma varargck argpos warning 1
#
# pragma varargck type "a" Area*
# pragma varargck type "C" Client*
# pragma varargck type "a" Area*
# pragma varargck type "C" Client*
# pragma varargck type "r" void
#endif

View File

@ -6,30 +6,6 @@
#include <X11/keysym.h>
#include "fns.h"
void
init_lock_keys(void) {
static int masks[] = {
ShiftMask, LockMask, ControlMask, Mod1Mask, Mod2Mask,
Mod3Mask, Mod4Mask, Mod5Mask
};
XModifierKeymap *modmap;
KeyCode numlock;
int i, max;
numlock_mask = 0;
modmap = XGetModifierMapping(display);
numlock = keycode("Num_Lock");
if(numlock)
if(modmap && modmap->max_keypermod > 0) {
max = nelem(masks) * modmap->max_keypermod;
for(i = 0; i < max; i++)
if(modmap->modifiermap[i] == numlock)
numlock_mask = masks[i / modmap->max_keypermod];
}
XFreeModifiermap(modmap);
valid_mask = 255 & ~(numlock_mask | LockMask);
}
static void
freekey(Key *k) {
Key *n;
@ -43,7 +19,7 @@ freekey(Key *k) {
static void
_grab(XWindow w, int keycode, uint mod) {
XGrabKey(display, keycode, mod, w,
true, GrabModeAsync, GrabModeAsync);
true, GrabModeAsync, GrabModeAsync);
}
static void
@ -66,12 +42,12 @@ ungrabkey(Key *k) {
}
}
static Key *
static Key*
name2key(const char *name) {
Key *k;
for(k=key; k; k=k->lnext)
if(!strncmp(k->name, name, sizeof k->name))
if(!strcmp(k->name, name))
return k;
return nil;
}
@ -218,22 +194,21 @@ update_keys(void) {
Key *k;
char *l, *p;
init_lock_keys();
numlock_mask = numlockmask();
valid_mask = 0xff & ~(numlock_mask | LockMask);
while((k = key)) {
key = key->lnext;
ungrabkey(k);
freekey(k);
}
for(l = p = def.keys; p && *p;) {
for(l = p = def.keys; p && *p; p++) {
if(*p == '\n') {
*p = 0;
if((k = getkey(l)))
grabkey(k);
*p = '\n';
l = ++p;
l = p + 1;
}
else
p++;
}
if(l < p && strlen(l)) {
if((k = getkey(l)))

View File

@ -92,9 +92,9 @@ init_environment(void) {
setenv("WMII_ADDRESS", address, true);
else
address = smprint("unix!%s/wmii", ns_path);
setenv("WMII_CONFPATH", sxprint("%s/.wmii%s:%s/wmii%s",
getenv("HOME"), CONFVERSION,
CONFPREFIX, CONFVERSION), true);
setenv("WMII_CONFPATH",
sxprint("%s/.%s:%s", getenv("HOME"), CONFDIR, GLOBALCONF),
true);
}
static void
@ -398,7 +398,7 @@ main(int argc, char *argv[]) {
init_traps();
init_cursors();
init_lock_keys();
update_keys();
ewmh_init();
xext_init();

18
cmd/x11/Makefile Normal file
View File

@ -0,0 +1,18 @@
ROOT= ../..
include $(ROOT)/mk/hdr.mk
include $(ROOT)/mk/wmii.mk
TARG = wikeyname \
wmii9menu
PACKAGES += $(X11PACKAGES)
LIB = $(LIBS9) $(LIBIXP)
LIBS += $(LIB)
CFLAGS += $(INCX11)
wiclick.out: wiclick.o
$(LINK) $@ $< -lXtst
include $(ROOT)/mk/many.mk

27
cmd/x11/setfocus.c Normal file
View File

@ -0,0 +1,27 @@
/* Copyight 2008 Kris Maglione <maglione.k at Gmail>
* See LICENSE file for license details.
*/
#include <ctype.h>
#include <stdarg.h>
#include <stdbool.h>
#include <string.h>
#include <stuff/x.h>
#include <stuff/util.h>
#include <fmt.h>
int
main(int argc, char *argv[]) {
XWindow w;
ARGBEGIN{
}ARGEND;
initdisplay();
if(!getulong(EARGF(exit(1)), &w))
exit(1);
XSetInputFocus(display, w, RevertToParent, CurrentTime);
XCloseDisplay(display);
}

View File

@ -30,6 +30,7 @@ main(int argc, char *argv[]) {
if(argc)
usage();
fmtinstall('K', fmtkey);
initdisplay();
selectinput(&scr.root, KeyPressMask|KeyReleaseMask);
@ -46,25 +47,11 @@ main(int argc, char *argv[]) {
static bool
kdown_event(Window *w, void *aux, XKeyEvent *ev) {
Fmt f;
char buf[32];
char *key;
KeySym ksym;
int num;
USED(aux);
USED(w, aux);
nkeys++;
num = XLookupString(ev, buf, sizeof buf, &ksym, 0);
key = XKeysymToString(ksym);
fmtstrinit(&f);
unmask(&f, ev->state, modkey_names, '-');
if(f.nfmt)
fmtrune(&f, '-');
fmtstrcpy(&f, key);
free(keyname);
keyname = fmtstrflush(&f);
keyname = smprint("%K", ev);
return false;
}

34
cmd/x11/wiwarp.c Normal file
View File

@ -0,0 +1,34 @@
/* Copyight 2008 Kris Maglione <maglione.k at Gmail>
* See LICENSE file for license details.
*/
#include <ctype.h>
#include <stdarg.h>
#include <stdbool.h>
#include <string.h>
#include <stuff/x.h>
#include <stuff/util.h>
#include <fmt.h>
int
main(int argc, char *argv[]) {
Point pt;
ARGBEGIN{
}ARGEND;
initdisplay();
if(argc) {
if(!getint(EARGF(exit(1)), &pt.x))
exit(1);
if(!getint(EARGF(exit(1)), &pt.y))
exit(1);
}else {
pt = querypointer(&scr.root);
lprint(1, "%d %d\n", pt.x, pt.y);
}
warppointer(pt);
XCloseDisplay(display);
}

18
debian/copyright vendored
View File

@ -11,18 +11,18 @@ Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
Original debian packaging is (C) 2005-2007, Daniel Baumann <daniel@debian.org>

View File

@ -920,7 +920,7 @@ client. The files in these directories are:
\item[label] The client's window title. May be written to
change the client's title.
\index{filesystem!/client/*/@\clientlabel!label}
\item[tags]
\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
@ -1006,7 +1006,7 @@ client. The |sel| tag is treated similarly elsewhere. The files
in these directories are:
\begin{description}
\item[ctl]
\item[ctl]
The view's control file. The properties are:
\index{filesystem!/tag/*/@\taglabel!ctl|(}
\begin{description}

View File

@ -1,5 +1,5 @@
%!PS-Adobe-2.0 EPSF-1.2
%%BoundingBox: -1 0 51 27
%%BoundingBox: -1 0 51 27
%%Creator: MetaPost
%%CreationDate: 2007.02.27:1944
%%Pages: 1

View File

@ -18,6 +18,8 @@ extern void init_screens(void);
/* printevent.c */
int fmtevent(Fmt*);
int fmtkey(Fmt*);
/* xext.c */
void randr_event(XEvent*);
bool render_argb_p(Visual*);

View File

@ -201,7 +201,7 @@ struct Screen {
# pragma varargck type "A" Atom
# pragma varargck type "P" Point
# pragma varargck type "R" Rectangle
# pragma varargck type "W" Window*
# pragma varargck type "W" Window*
#endif
Display *display;
@ -236,10 +236,10 @@ void changeprop_string(Window*, const char*, const char*);
void changeprop_textlist(Window*, const char*, const char*, char*[]);
void changeprop_ulong(Window*, const char*, const char*, ulong[], int);
void changeproperty(Window*, const char*, const char*, int width, const uchar*, int);
void cleanupwindow(Window*);
void clientmessage(Window*, const char*, long, int, ClientMessageData);
void copyimage(Image*, Rectangle, Image*, Point);
Window* createwindow(Window*, Rectangle, int depth, uint class, WinAttr*, int valuemask);
void cleanupwindow(Window*);
Window* createwindow_visual(Window*, Rectangle, int depth, Visual*, uint class, WinAttr*, int);
void delproperty(Window*, const char*);
void destroywindow(Window*);
@ -272,6 +272,7 @@ Font* loadfont(const char*);
void lowerwin(Window*);
int mapwin(Window*);
void movewin(Window*, Point);
int numlockmask(void);
bool parsecolor(const char *name, Color*);
bool parsekey(char*, int*, char**);
ulong pixelvalue(Color);

View File

@ -14,7 +14,7 @@ bcat(Biobuf *b, char *name)
fprint(2, "writing during %s: %r\n", name);
}
if(n < 0)
fprint(2, "reading %s: %r\n", name);
fprint(2, "reading %s: %r\n", name);
}
int

View File

@ -100,7 +100,7 @@ Brdstr(Biobuf *bp, int delim, int nulldelim)
}
ip += j;
}
/*
* full buffer without finding; add to user string and continue
*/

View File

@ -1,7 +1,7 @@
#include "plan9.h"
#include <bio.h>
static int
static int
fmtBflush(Fmt *f)
{
Biobuf *bp;

View File

@ -35,22 +35,22 @@ enum
*/
static double pows10[] =
{
1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,
1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,
1e20, 1e21, 1e22, 1e23, 1e24, 1e25, 1e26, 1e27, 1e28, 1e29,
1e30, 1e31, 1e32, 1e33, 1e34, 1e35, 1e36, 1e37, 1e38, 1e39,
1e40, 1e41, 1e42, 1e43, 1e44, 1e45, 1e46, 1e47, 1e48, 1e49,
1e50, 1e51, 1e52, 1e53, 1e54, 1e55, 1e56, 1e57, 1e58, 1e59,
1e60, 1e61, 1e62, 1e63, 1e64, 1e65, 1e66, 1e67, 1e68, 1e69,
1e70, 1e71, 1e72, 1e73, 1e74, 1e75, 1e76, 1e77, 1e78, 1e79,
1e80, 1e81, 1e82, 1e83, 1e84, 1e85, 1e86, 1e87, 1e88, 1e89,
1e90, 1e91, 1e92, 1e93, 1e94, 1e95, 1e96, 1e97, 1e98, 1e99,
1e100, 1e101, 1e102, 1e103, 1e104, 1e105, 1e106, 1e107, 1e108, 1e109,
1e110, 1e111, 1e112, 1e113, 1e114, 1e115, 1e116, 1e117, 1e118, 1e119,
1e120, 1e121, 1e122, 1e123, 1e124, 1e125, 1e126, 1e127, 1e128, 1e129,
1e130, 1e131, 1e132, 1e133, 1e134, 1e135, 1e136, 1e137, 1e138, 1e139,
1e140, 1e141, 1e142, 1e143, 1e144, 1e145, 1e146, 1e147, 1e148, 1e149,
1e150, 1e151, 1e152, 1e153, 1e154, 1e155, 1e156, 1e157, 1e158, 1e159,
1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,
1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,
1e20, 1e21, 1e22, 1e23, 1e24, 1e25, 1e26, 1e27, 1e28, 1e29,
1e30, 1e31, 1e32, 1e33, 1e34, 1e35, 1e36, 1e37, 1e38, 1e39,
1e40, 1e41, 1e42, 1e43, 1e44, 1e45, 1e46, 1e47, 1e48, 1e49,
1e50, 1e51, 1e52, 1e53, 1e54, 1e55, 1e56, 1e57, 1e58, 1e59,
1e60, 1e61, 1e62, 1e63, 1e64, 1e65, 1e66, 1e67, 1e68, 1e69,
1e70, 1e71, 1e72, 1e73, 1e74, 1e75, 1e76, 1e77, 1e78, 1e79,
1e80, 1e81, 1e82, 1e83, 1e84, 1e85, 1e86, 1e87, 1e88, 1e89,
1e90, 1e91, 1e92, 1e93, 1e94, 1e95, 1e96, 1e97, 1e98, 1e99,
1e100, 1e101, 1e102, 1e103, 1e104, 1e105, 1e106, 1e107, 1e108, 1e109,
1e110, 1e111, 1e112, 1e113, 1e114, 1e115, 1e116, 1e117, 1e118, 1e119,
1e120, 1e121, 1e122, 1e123, 1e124, 1e125, 1e126, 1e127, 1e128, 1e129,
1e130, 1e131, 1e132, 1e133, 1e134, 1e135, 1e136, 1e137, 1e138, 1e139,
1e140, 1e141, 1e142, 1e143, 1e144, 1e145, 1e146, 1e147, 1e148, 1e149,
1e150, 1e151, 1e152, 1e153, 1e154, 1e155, 1e156, 1e157, 1e158, 1e159,
};
#define pow10(x) fmtpow10(x)

View File

@ -1,6 +1,6 @@
/*
* 64-bit IEEE not-a-number routines.
* This is big/little-endian portable assuming that
* This is big/little-endian portable assuming that
* the 64-bit doubles and 64-bit integers have the
* same byte ordering.
*/

View File

@ -12,9 +12,9 @@
* OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
*/
/*
* Plan 9 port version must include libc.h in order to
* Plan 9 port version must include libc.h in order to
* get Plan 9 debugging malloc, which sometimes returns
* different pointers than the standard malloc.
* different pointers than the standard malloc.
*/
#include <stdlib.h>
#include <string.h>

View File

@ -12,9 +12,9 @@
* OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
*/
/*
* Plan 9 port version must include libc.h in order to
* Plan 9 port version must include libc.h in order to
* get Plan 9 debugging malloc, which sometimes returns
* different pointers than the standard malloc.
* different pointers than the standard malloc.
*/
#include <stdlib.h>
#include <string.h>

View File

@ -110,7 +110,7 @@ regerr2(char *s, int c)
while(*s)
*cp++ = *s++;
*cp++ = c;
*cp = '\0';
*cp = '\0';
rcerror(buf);
}

View File

@ -46,7 +46,7 @@ regsub(char *sp, /* source string */
*dp++ = *sp;
break;
}
}else if(*sp == '&'){
}else if(*sp == '&'){
if(mp[0].s.sp != 0 && mp!=0 && ms>0)
if(mp[0].s.sp != 0)
for(ssp = mp[0].s.sp;

View File

@ -46,7 +46,7 @@ rregsub(Rune *sp, /* source string */
*dp++ = *sp;
break;
}
}else if(*sp == '&'){
}else if(*sp == '&'){
if(mp[0].s.rsp != 0 && mp!=0 && ms>0)
if(mp[0].s.rsp != 0)
for(ssp = mp[0].s.rsp;

View File

@ -7,6 +7,6 @@ void
event_clientmessage(XClientMessageEvent *ev) {
Window *w;
if((w = findwin(ev->window)))
if((w = findwin(ev->window)))
event_handle(w, message, ev);
}

View File

@ -7,6 +7,6 @@ void
event_destroynotify(XDestroyWindowEvent *ev) {
Window *w;
if((w = findwin(ev->window)))
if((w = findwin(ev->window)))
event_handle(w, destroy, ev);
}

View File

@ -12,6 +12,6 @@ event_enternotify(XCrossingEvent *ev) {
if(ev->mode != NotifyNormal)
return;
if((w = findwin(ev->window)))
if((w = findwin(ev->window)))
event_handle(w, enter, ev);
}

View File

@ -7,6 +7,6 @@ void
event_expose(XExposeEvent *ev) {
Window *w;
if(ev->count == 0 && (w = findwin(ev->window)))
if(ev->count == 0 && (w = findwin(ev->window)))
event_handle(w, expose, ev);
}

View File

@ -22,6 +22,6 @@ event_focusin(XFocusChangeEvent *ev) {
if((ev->mode == NotifyWhileGrabbed))
return;
if((w = findwin(ev->window)))
if((w = findwin(ev->window)))
event_handle(w, focusin, ev);
}

View File

@ -14,6 +14,6 @@ event_focusout(XFocusChangeEvent *ev) {
||(ev->detail == NotifyAncestor)))
return;
if((w = findwin(ev->window)))
if((w = findwin(ev->window)))
event_handle(w, focusout, ev);
}

View File

@ -9,6 +9,6 @@ event_leavenotify(XCrossingEvent *ev) {
if(!ev->send_event)
event_xtime = ev->time;
if((w = findwin(ev->window)))
if((w = findwin(ev->window)))
event_handle(w, leave, ev);
}

View File

@ -9,6 +9,6 @@ event_propertynotify(XPropertyEvent *ev) {
if(!ev->send_event)
event_xtime = ev->time;
if((w = findwin(ev->window)))
if((w = findwin(ev->window)))
event_handle(w, property, ev);
}

View File

@ -9,7 +9,7 @@ event_selection(XSelectionEvent *ev) {
if(!ev->send_event)
event_xtime = ev->time;
if((w = findwin(ev->requestor)))
if((w = findwin(ev->requestor)))
event_handle(w, selection, ev);
}

View File

@ -9,6 +9,6 @@ event_selectionclear(XSelectionClearEvent *ev) {
if(!ev->send_event)
event_xtime = ev->time;
if((w = findwin(ev->window)))
if((w = findwin(ev->window)))
event_handle(w, selectionclear, ev);
}

View File

@ -9,7 +9,7 @@ event_selectionrequest(XSelectionRequestEvent *ev) {
if(!ev->send_event)
event_xtime = ev->time;
if((w = findwin(ev->owner)))
if((w = findwin(ev->owner)))
event_handle(w, selectionrequest, ev);
}

View File

@ -1,21 +0,0 @@
#include "fmtdef.h"
void
vseprint(Fmt *f, char *buf, char *e) {
Fmt f;
if(e <= buf)
return nil;
f.runes = 0;
f.start = buf;
f.to = buf;
f.stop = e - 1;
f.flush = 0;
f.farg = nil;
f.nfmt = 0;
va_copy(f.args,args);
dofmt(&f, fmt);
va_end(f.args);
*(char*)f.to = '\0';
return (char*)f.to;
}

View File

@ -19,7 +19,7 @@ MapEnt *NM;
static ulong
hash(const char *str) {
ulong h;
h = 5381;
while (*str != '\0') {
h += h << 5; /* h *= 33 */
@ -31,7 +31,7 @@ hash(const char *str) {
static void
insert(Map *m, MapEnt **e, ulong val, const char *key) {
MapEnt *te;
m->nmemb++;
te = emallocz(sizeof *te);
te->hash = val;
@ -61,7 +61,7 @@ hash_getp(Map *map, const char *str, int create) {
MapEnt **e;
ulong h;
int cmp;
h = hash(str);
e = map_getp(map, h, create);
if(*e && (*e)->key == nil)
@ -81,7 +81,7 @@ hash_getp(Map *map, const char *str, int create) {
void**
map_get(Map *map, ulong val, bool create) {
MapEnt *e;
e = *map_getp(map, val, create);
return e ? &e->val : nil;
}
@ -89,7 +89,7 @@ map_get(Map *map, ulong val, bool create) {
void**
hash_get(Map *map, const char *str, bool create) {
MapEnt *e;
e = *hash_getp(map, str, create);
return e ? &e->val : nil;
}
@ -98,7 +98,7 @@ void*
map_rm(Map *map, ulong val) {
MapEnt **e, *te;
void *ret;
ret = nil;
e = map_getp(map, val, 0);
if(*e) {
@ -115,7 +115,7 @@ void*
hash_rm(Map *map, const char *str) {
MapEnt **e, *te;
void *ret;
ret = nil;
e = hash_getp(map, str, 0);
if(*e) {

View File

@ -10,11 +10,11 @@
* readable form, Part01/01 Message-ID: <1935@wyse.wyse.com> Date: 22 Dec 88
* 19:28:25 GMT Organization: Wyse Technology, San Jose Lines: 1093 Approved:
* mikew@wyse.com
*
*
* Submitted-by: richsun!darkstar!ken Posting-number: Volume 2, Issue 56
* Archive-name: showevent/part01
*
*
*
*
* There are times during debugging when it would be real useful to be able to
* print the fields of an event in a human readable form. Too many times I
* found myself scrounging around in section 8 of the Xlib manual looking for
@ -29,13 +29,13 @@
* functions are not complicated, in fact, they are mind-numbingly boring -
* but that's just the point nobody wants to spend the time writing functions
* like this, they just want to have them when they need them.
*
*
* A simple, sample program is included which does little else but to
* demonstrate the use of these two functions. These functions have saved me
* many an hour during debugging and I hope you find some benefit to these.
* If you have any comments, suggestions, improvements, or if you find any
* blithering errors you can get it touch with me at the following location:
*
*
* ken@richsun.UUCP
*/
@ -931,7 +931,7 @@ struct Handler {
int (*fn)(Fmt*, XEvent*);
};
int
int
fmtevent(Fmt *fmt) {
XEvent *e;
XAnyEvent *ev;

View File

@ -6,7 +6,7 @@
char*
estrndup(const char *str, uint len) {
char *ret;
len = min(len, strlen(str));
ret = emalloc(len + 1);
memcpy(ret, str, len);

View File

@ -5,7 +5,7 @@
#include <string.h>
#include <stuff/util.h>
#define strbcmp(str, const) (strncmp((str), (const), sizeof(const)-1))
#define strbcmp(str, const) (strncmp((str), (const), sizeof(const)-1))
int
getbase(const char **s, long *sign) {
const char *p;

View File

@ -22,4 +22,4 @@ strcasestr(const char *dst, const char *src) {
}
}
return nil;
}
}

View File

@ -5,7 +5,7 @@
int
utflcpy(char *to, const char *from, int l) {
char *p;
p = utfecpy(to, to+l, from);
return p-to;
}

View File

@ -7,7 +7,7 @@ XPoint*
convpts(Point *pt, int np) {
XPoint *rp;
int i;
rp = emalloc(np * sizeof *rp);
for(i = 0; i < np; i++) {
rp[i].x = pt[i].x;

View File

@ -6,7 +6,7 @@
void
drawpoly(Image *dst, Point *pt, int np, int cap, int w, Color col) {
XPoint *xp;
xp = convpts(pt, np);
XSetLineAttributes(display, dst->gc, w, LineSolid, cap, JoinMiter);
setgccol(dst, col);

View File

@ -32,11 +32,10 @@ errorhandler(Display *dpy, XErrorEvent *error) {
int
traperrors(bool enable) {
sync();
_trap_errors = enable;
if (enable)
nerrors = 0;
return nerrors;
}

View File

@ -55,16 +55,16 @@ initdisplay(void) {
scr.visual32 = DefaultVisual(display, scr.screen);
scr.gc = DefaultGC(display, scr.screen);
scr.depth = DefaultDepth(display, scr.screen);
scr.white = WhitePixel(display, scr.screen);
scr.black = BlackPixel(display, scr.screen);
scr.root.xid = RootWindow(display, scr.screen);
scr.root.r = Rect(0, 0,
DisplayWidth(display, scr.screen),
DisplayHeight(display, scr.screen));
scr.rect = scr.root.r;
scr.root.parent = &scr.root;
windowmap.bucket = wbucket;

View File

@ -3,8 +3,6 @@
*/
#include "../x11.h"
typedef struct KMask KMask;
char *modkey_names[] = {
"Shift",
"",
@ -41,3 +39,43 @@ parsekey(char *str, int *mask, char **key) {
else
return i == nkeys;
}
int
numlockmask(void) {
static int masks[] = {
ShiftMask, LockMask, ControlMask, Mod1Mask,
Mod2Mask, Mod3Mask, Mod4Mask, Mod5Mask
};
XModifierKeymap *modmap;
KeyCode kcode;
int i, max, numlock;
numlock = 0;
modmap = XGetModifierMapping(display);
kcode = keycode("Num_Lock");
if(kcode && modmap && modmap->max_keypermod > 0) {
max = nelem(masks) * modmap->max_keypermod;
for(i = 0; i < max && !numlock; i++)
if(modmap->modifiermap[i] == kcode)
numlock = masks[i / modmap->max_keypermod];
}
XFreeModifiermap(modmap);
return numlock;
}
int
fmtkey(Fmt *f) {
XKeyEvent *ev;
char *key;
int nfmt;
ev = va_arg(f->args, XKeyEvent*);
key = XKeysymToString(XKeycodeToKeysym(display, ev->keycode, 0));
nfmt = f->nfmt;
unmask(f, ev->state, modkey_names, '-');
if(f->nfmt > nfmt)
fmtrune(f, '-');
return fmtstrcpy(f, key);
}

View File

@ -6,7 +6,7 @@
int
grabpointer(Window *w, Window *confine, Cursor cur, int mask) {
XWindow cw;
cw = None;
if(confine)
cw = confine->xid;

View File

@ -9,7 +9,7 @@ pointerscreen(void) {
Point pt;
uint ui;
int i;
return XQueryPointer(display, scr.root.xid, &win, &win, &i, &i,
&pt.x, &pt.y, &ui);
}

View File

@ -9,7 +9,7 @@ querypointer(Window *w) {
Point pt;
uint ui;
int i;
XQueryPointer(display, w->xid, &win, &win, &i, &i, &pt.x, &pt.y, &ui);
return pt;
}

View File

@ -8,7 +8,7 @@ Window*
findwin(XWindow xw) {
Window *w;
void **e;
e = map_get(&windowmap, (ulong)xw, false);
if(e) {
w = *e;

View File

@ -6,7 +6,7 @@
Atom
xatom(const char *name) {
void **e, **f;
e = hash_get(&atommap, name, true);
if(*e == nil) {
*e = (void*)XInternAtom(display, name, false);

View File

@ -15,8 +15,8 @@
#include <plan9.h>
Rune*
runestrdup(const Rune *s)
{
runestrdup(const Rune *s)
{
Rune *ns;
ns = malloc(sizeof(Rune)*(runestrlen(s) + 1));

View File

@ -9,7 +9,7 @@ static Atom
xatom(Display *display, char *name) {
/* Blech. I don't trust Xlib's cacheing.
MapEnt *e;
e = hash_get(&amap, name, 1);
if(e->val == nil)
e->val = (void*)XInternAtom(display, name, False);

View File

@ -51,7 +51,6 @@ connections. The address takes the form
unix!/tmp/ns.\fB$USER\fR.\fB${DISPLAY\fR%.0\fB}\fR/wmii
.fi
which opens a unix socket per Plan 9 Port conventions. To
open a TCP socket, listening at port 4332 on the loopback
interface, use:
@ -60,7 +59,6 @@ interface, use:
tcp!localhost!4332
.fi
\fB$WMII_NAMESPACE\fR is automatically set to this value.
.TP
@ -265,14 +263,12 @@ Rules have the form:
/\fI<regex>\fR/ -> \fI<width>\fR\fI[+\fI<width>\fR]\fR*
.fi
Where,
.nf
\fI<width>\fR := \fI<percent of screen>\fR | \fI<pixels>\fRpx
.fi
When a new column, \fI<n>\fR, is created on a view whose name
matches \fI<regex>\fR, it is given the \fI<n>\fRth supplied \fI<width>\fR.
If there is no \fI<n>\fRth width, it is given 1/\fI<ncol>\fRth of the
@ -290,7 +286,6 @@ specified as:
/\fI<regex>\fR/ \fI<key>\fR=\fI<value>\fR ...
.fi
where each \fI<key>\fR represents a command in the clients \fIctl\fR
file, and each \fI<value>\fR represents the value to assign to it.
The rules are applied when the client is first started and
@ -405,7 +400,9 @@ attached to a new view. Ordinarilly, the value
changes automatically whenever the window is
moved between the floating and managed layers.
However, setting a value of \fIalways\fR or \fInever\fR
overrides this behavior.
overrides this behavior. Additionally, dialogs,
menus, docks, and splash screens will always
float unless this value is set to \fInever\fR.
.TP
fullscreen \fI<on | off | toggle>\fR
Sets the client's fullscreen state.
@ -519,7 +516,6 @@ Selects a column or the floating area.
area ::= \fI<area_spec>\fR | \fI<screen_spec>\fR:\fI<area_spec>\fR
.fi
When \fI<screen_spec>\fR is omitted and \fI<area_spec>\fR is not "sel",
0 is assumed. "sel" by itself represents the selected client no
matter which screen it is on.
@ -528,7 +524,6 @@ matter which screen it is on.
area_spec ::= "~" | \fI<number>\fR | "sel"
.fi
Where "~" represents the floating area and \fI<number>\fR represents a column
index, starting at one.
@ -536,7 +531,6 @@ index, starting at one.
screen_spec ::= \fI<number>\fR
.fi
Where \fI<number>\fR representes the 0\-based Xinerama screen number.
.TP
@ -547,7 +541,6 @@ Selects a client window.
frame ::= \fI<area>\fR \fI<index>\fR | \fI<area>\fR sel | client \fI<window-id>\fR
.fi
Where \fI<index>\fR represents the nth frame of \fI<area>\fR or \fI<window\-id>\fR is
the X11 window id of the given client.
@ -559,7 +552,6 @@ The amount to grow or nudge something.
amount ::= \fI<number>\fR | \fI<number>\fRpx
.fi
If "px" is given, \fI<number>\fR is interperated as an exact pixel count.
Otherwise, it's interperated as a "reasonable" amount, which is
usually either the height of a window's title bar, or its sizing
@ -624,6 +616,7 @@ The namespace directory to use if no address is provided.
wimenu(1), wmii9menu(1), witray(1), wmiir(1), wihack(1)
.P
@DOCDIR@/wmii.pdf
@DOCDIR@/FAQ
.P
\fI[1]\fR http://www.suckless.org/wiki/wmii/tips/9p_tips

View File

@ -50,13 +50,11 @@ of the core window manager.
`<protocol>!<address>`. The default is of the form:
``` unix!/tmp/ns.$USER.${DISPLAY%.0}/wmii
which opens a unix socket per Plan 9 Port conventions. To
open a TCP socket, listening at port 4332 on the loopback
interface, use:
``` tcp!localhost!4332
$WMII_NAMESPACE is automatically set to this value.
: -r <wmiirc>
@ -232,11 +230,9 @@ follows.
Rules have the form:
``` /<regex>/ -> <width>[+<width>]*
Where,
``` <width> := <percent of screen> | <pixels>px
When a new column, <n>, is created on a view whose name
matches <regex>, it is given the <n>th supplied <width>.
If there is no <n>th width, it is given 1/<ncol>th of the
@ -250,7 +246,6 @@ follows.
specified as:
``` /<regex>/ <key>=<value> ...
where each <key> represents a command in the clients _ctl_
file, and each <value> represents the value to assign to it.
The rules are applied when the client is first started and
@ -351,7 +346,9 @@ represents the currently selected client.
changes automatically whenever the window is
moved between the floating and managed layers.
However, setting a value of _always_ or _never_
overrides this behavior.
overrides this behavior. Additionally, dialogs,
menus, docks, and splash screens will always
float unless this value is set to _never_.
: fullscreen <on | off | toggle>
Sets the client's fullscreen state.
: group <group id>
@ -375,7 +372,7 @@ represents the currently selected client.
: urgent <on | off | toggle>
Set or unset the client's urgent hint.
<<
: label
Set or read a client's label (title).
: props
@ -435,25 +432,21 @@ all of the clients with the given tag applied. The special
Selects a column or the floating area.
``` area ::= <area_spec> | <screen_spec>:<area_spec>
When <screen_spec> is omitted and <area_spec> is not "sel",
0 is assumed. "sel" by itself represents the selected client no
matter which screen it is on.
``` area_spec ::= "~" | <number> | "sel"
Where "~" represents the floating area and <number> represents a column
index, starting at one.
``` screen_spec ::= <number>
Where <number> representes the 0-based Xinerama screen number.
: frame
Selects a client window.
``` frame ::= <area> <index> | <area> sel | client <window-id>
Where <index> represents the nth frame of <area> or <window-id> is
the X11 window id of the given client.
@ -461,7 +454,6 @@ all of the clients with the given tag applied. The special
The amount to grow or nudge something.
``` amount ::= <number> | <number>px
If "px" is given, <number> is interperated as an exact pixel count.
Otherwise, it's interperated as a "reasonable" amount, which is
usually either the height of a window's title bar, or its sizing
@ -517,6 +509,7 @@ thus can be used in actions:
= SEE ALSO =
wimenu(1), wmii9menu(1), witray(1), wmiir(1), wihack(1) +
@DOCDIR@/wmii.pdf
@DOCDIR@/FAQ
[1] http://www.suckless.org/wiki/wmii/tips/9p_tips +
[2] @DOCDIR@/wmii.pdf

View File

@ -2,7 +2,7 @@ PTARG = $(ROOT)/lib/$(TARG)
LIB = $(PTARG).a
OFILES = $(OBJ:=.o)
all: $(HFILES) $(LIB)
all: $(HFILES) $(LIB)
install: $(PTARG).install
uninstall: $(PTARG).uninstall

View File

@ -3,7 +3,7 @@ SO = $(SOPTARG).$(SOEXT)
SONAME = $(TARG).$(SOEXT)
OFILES_PIC = $(OBJ:=.o_pic)
all: $(HFILES) $(SO)
all: $(HFILES) $(SO)
install: $(SOPTARG).install
uninstall: $(SOPTARG).uninstall

View File

@ -1,26 +1,31 @@
VERS = hg$$(hg identify -n)
VERS = $$(test -n "$$WMII_HGVERSION" && echo $$WMII_HGVERSION || \
hg log -r $$(hg id 2>/dev/null | awk -F'[+ ]' '{print $$1}') --template 'hg{rev}' 2>/dev/null)
echo -n "hg$$(hg id -n 2>/dev/null)")
WMII_HGVERSION = $(VERS)
WMII_HGVERSION := $(shell echo $(VERS))
WMII_HGVERSION != echo $(VERS)
VERSION = $(WMII_HGVERSION)
CONFVERSION = -hg
COPYRIGHT = ©2010 Kris Maglione
CONFDIR = wmii-hg
LOCALCONF = ~/.$(CONFDIR)
GLOBALCONF = $(ETC)/$(CONFDIR)
.MAKE.EXPORTED += WMII_HGVERSION
SUBMAKE_EXPORT = WMII_HGVERSION=$(WMII_HGVERSION)
LIBS9 = $(ROOT)/lib/libstuff.a $(ROOT)/lib/libregexp9.a $(ROOT)/lib/libbio.a $(ROOT)/lib/libfmt.a $(ROOT)/lib/libutf.a
CFLAGS += '-DVERSION=\"$(VERSION)\"' '-DCOPYRIGHT=\"$(COPYRIGHT)\"' \
'-DCONFVERSION=\"$(CONFVERSION)\"' '-DCONFPREFIX=\"$(ETC)\"'
'-DCONFDIR=\"$(CONFDIR)\"' '-DCONFPREFIX=\"$(ETC)\"' \
'-DLOCALCONF=\"$(LOCALCONF)\"' '-DGLOBALCONF=\"$(GLOBALCONF)\"'
FILTER = sed "s|@CONFPREFIX@|$(ETC)|g; \
s|@GLOBALCONF@|$(ETC)/wmii$(CONFVERSION)|g; \
s|@LOCALCONF@|~/.wmii$(CONFVERSION)|g; \
s|@CONFVERSION@|$(CONFVERSION)|g; \
s|@GLOBALCONF@|$(GLOBALCONF)|g; \
s|@LOCALCONF@|$(LOCALCONF)|g; \
s|@CONFDIR@|$(CONFDIR)|g; \
s|@DOCDIR@|$(DOC)|g; \
s|@ALTDOC@|$(DOC)/alternative_wmiircs|g; \
s|@EXAMPLES@|$(DOC)/examples|g; \

View File

@ -2,7 +2,7 @@ ROOT=..
include $(ROOT)/mk/hdr.mk
include $(ROOT)/mk/wmii.mk
BIN = $(ETC)/wmii$(CONFVERSION)
BIN = $(GLOBALCONF)
TARG = wmiirc \
welcome

View File

@ -227,8 +227,8 @@ fn getfuns {
}
fn actionlist {
{ rescue '*' {} {
proglist ${hostenv WMII_CONFPATH}
{ rescue '*' {} {
proglist ${hostenv WMII_CONFPATH}
}
getfuns Action
} | sort | uniq

View File

@ -5,7 +5,7 @@ TARG = grav
OFILES = ../cmd/util.o \
../cmd/wmii/map.o \
../cmd/wmii/x11.o
../cmd/wmii/x11.o
LDFLAGS += $(OFILES) -lfmt -lutf -lbio $(LIBX11) -lXext
CFLAGS += $(INCX11)

View File

@ -66,7 +66,7 @@ readfile(file: string): (string, int)
fd := open(file, OREAD);
if(fd == nil)
return ("", 0);
ret := "";
buf := array[512] of byte;
while((n := read(fd, buf, len buf)) > 0)
@ -115,7 +115,7 @@ init(draw: ref Draw->Context, argv: list of string)
}
relist = reverse(relist);
line: for(;;) {
lin := <-line;
if(lin == nil)

View File

@ -96,7 +96,7 @@ prompt() {
unset val
if [ -z "$def" -o -n "$force" ]; then
echo "$@"
echo -n "$var[$def]$(equals) "
echo -n "$var[$def]$(equals) "
read val
echo
fi
@ -158,7 +158,7 @@ if $1 -v 2>&1 | grep 'gcc version' >/dev/null; then
echo
fi
prompt INCPATH Search path for include files
prompt INCPATH Search path for include files
prompt LIBS Libraries to be linked with every executable
prompt CFLAGS Flags for the C compiler

View File

@ -27,9 +27,9 @@ 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=$?
[ $? -eq 0 ] || $LD -o $outfile $ofiles $LDFLAGS $args >&2
[ $status -eq 0 ] || $LD -o $outfile $ofiles $LDFLAGS $args >&2
sed 's/.*: In function `[^:]*: *//' $xtmp | egrep . |
sed 's/.*: In function `[^:]*: *//' $xtmp | egrep . |
egrep -v 'is almost always misused|is dangerous, better use|in statically linked applications requires at runtime'
rm -f $xtmp