|
|
@ -108,6 +108,7 @@ typedef struct { |
|
|
|
int bufh; /* pixmap height */ |
|
|
|
int ch; /* char height */ |
|
|
|
int cw; /* char width */ |
|
|
|
int hasfocus; |
|
|
|
} XWindow; |
|
|
|
|
|
|
|
typedef struct { |
|
|
@ -161,23 +162,27 @@ static void ttyread(void); |
|
|
|
static void ttyresize(int, int); |
|
|
|
static void ttywrite(const char *, size_t); |
|
|
|
|
|
|
|
static void xbell(void); |
|
|
|
static void xdraws(char *, Glyph, int, int, int); |
|
|
|
static void xhints(void); |
|
|
|
static void xclear(int, int, int, int); |
|
|
|
static void xdrawcursor(void); |
|
|
|
static void xinit(void); |
|
|
|
static void xloadcols(void); |
|
|
|
static void xseturgency(int); |
|
|
|
|
|
|
|
static void expose(XEvent *); |
|
|
|
static char* kmap(KeySym); |
|
|
|
static void kpress(XEvent *); |
|
|
|
static void resize(XEvent *); |
|
|
|
static void focus(XEvent *); |
|
|
|
|
|
|
|
|
|
|
|
static void (*handler[LASTEvent])(XEvent *) = { |
|
|
|
[KeyPress] = kpress, |
|
|
|
[Expose] = expose, |
|
|
|
[ConfigureNotify] = resize |
|
|
|
[ConfigureNotify] = resize, |
|
|
|
[FocusIn] = focus, |
|
|
|
[FocusOut] = focus, |
|
|
|
}; |
|
|
|
|
|
|
|
/* Globals */ |
|
|
@ -187,7 +192,6 @@ static Term term; |
|
|
|
static CSIEscape escseq; |
|
|
|
static int cmdfd; |
|
|
|
static pid_t pid; |
|
|
|
static int running; |
|
|
|
|
|
|
|
#ifdef DEBUG |
|
|
|
void |
|
|
@ -227,15 +231,6 @@ execsh(void) { |
|
|
|
execvp(args[0], args); |
|
|
|
} |
|
|
|
|
|
|
|
void |
|
|
|
xbell(void) { |
|
|
|
XSetForeground(xw.dis, dc.gc, dc.col[BellCol]); |
|
|
|
XFillRectangle(xw.dis, xw.win, dc.gc, BORDER, BORDER, xw.bufw, xw.bufh); |
|
|
|
XFlush(xw.dis); |
|
|
|
usleep(BellTime); |
|
|
|
draw(SCREEN_REDRAW); |
|
|
|
} |
|
|
|
|
|
|
|
void |
|
|
|
sigchld(int a) { |
|
|
|
int stat = 0; |
|
|
@ -930,7 +925,8 @@ tputc(char c) { |
|
|
|
tnewline(); |
|
|
|
break; |
|
|
|
case '\a': |
|
|
|
xbell(); |
|
|
|
if(!xw.hasfocus) |
|
|
|
xseturgency(1); |
|
|
|
break; |
|
|
|
case '\033': |
|
|
|
csireset(); |
|
|
@ -1208,6 +1204,20 @@ expose(XEvent *ev) { |
|
|
|
draw(SCREEN_REDRAW); |
|
|
|
} |
|
|
|
|
|
|
|
void |
|
|
|
xseturgency(int add) { |
|
|
|
XWMHints *h = XGetWMHints(xw.dis, xw.win); |
|
|
|
h->flags = add ? (h->flags | XUrgencyHint) : (h->flags & ~XUrgencyHint); |
|
|
|
XSetWMHints(xw.dis, xw.win, h); |
|
|
|
XFree(h); |
|
|
|
} |
|
|
|
|
|
|
|
void |
|
|
|
focus(XEvent *ev) { |
|
|
|
if((xw.hasfocus = ev->type == FocusIn)) |
|
|
|
xseturgency(0); |
|
|
|
} |
|
|
|
|
|
|
|
char* |
|
|
|
kmap(KeySym k) { |
|
|
|
int i; |
|
|
@ -1282,12 +1292,12 @@ run(void) { |
|
|
|
XEvent ev; |
|
|
|
fd_set rfd; |
|
|
|
int xfd = XConnectionNumber(xw.dis); |
|
|
|
long mask = ExposureMask | KeyPressMask | StructureNotifyMask | FocusChangeMask; |
|
|
|
|
|
|
|
running = 1; |
|
|
|
XSelectInput(xw.dis, xw.win, ExposureMask | KeyPressMask | StructureNotifyMask); |
|
|
|
XSelectInput(xw.dis, xw.win, mask); |
|
|
|
XResizeWindow(xw.dis, xw.win, xw.w, xw.h); /* XXX: fix resize bug in wmii (?) */ |
|
|
|
|
|
|
|
while(running) { |
|
|
|
while(1) { |
|
|
|
FD_ZERO(&rfd); |
|
|
|
FD_SET(cmdfd, &rfd); |
|
|
|
FD_SET(xfd, &rfd); |
|
|
|