X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=st.c;h=af3ec6d14b1bc18c746f6cf225b4c4b5b943c37d;hb=bef87acd0d0e22ba4689be6f1c39ce2d90812317;hp=6dcded58996e7796bb0f6e8957c6980a9a88e313;hpb=7d88cf88d05c5f5fffbe096da9fac79d7d8957f9;p=st.git diff --git a/st.c b/st.c index 6dcded5..af3ec6d 100644 --- a/st.c +++ b/st.c @@ -22,7 +22,7 @@ #if defined(LINUX) #include -#elif defined(OPENBSD) +#elif defined(OPENBSD) || defined(NETBSD) #include #elif defined(FREEBSD) #include @@ -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 xcursor(void); +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(); @@ -1071,9 +1067,6 @@ xinit(void) { /* colors */ xloadcols(); - term.c.attr.fg = DefaultFG; - term.c.attr.bg = DefaultBG; - term.c.attr.mode = ATTR_NULL; /* windows */ xw.h = term.row * xw.ch + 2*BORDER; xw.w = term.col * xw.cw + 2*BORDER; @@ -1118,7 +1111,7 @@ xdraws(char *s, Glyph base, int x, int y, int len) { } void -xcursor(void) { +xdrawcursor(void) { static int oldx = 0; static int oldy = 0; Glyph g = {' ', ATTR_NULL, DefaultBG, DefaultCS, 0}; @@ -1163,7 +1156,7 @@ draw(int dummy) { if(term.line[y][x].state & GLYPH_SET) xdrawc(x, y, term.line[y][x]); - xcursor(); + xdrawcursor(); XCopyArea(xw.dis, xw.buf, xw.win, dc.gc, 0, 0, xw.bufw, xw.bufh, BORDER, BORDER); XFlush(xw.dis); } @@ -1199,7 +1192,7 @@ draw(int redraw_all) { if(i > 0) xdraws(buf, base, ox, y, i); } - xcursor(); + xdrawcursor(); XCopyArea(xw.dis, xw.buf, xw.win, dc.gc, 0, 0, xw.bufw, xw.bufh, BORDER, BORDER); XFlush(xw.dis); } @@ -1211,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; @@ -1285,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);