tremoved (visual) bell. '\a' sets the urgency flag if st is unfocused. - st - [… | |
git clone git://src.adamsgaard.dk/st | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit e851736e8bd6c04f1805659d4783de2314ecb263 | |
parent 188293c828033fd7ff74d753239b3a5052b372a2 | |
Author: Aurélien Aptel <[email protected]> | |
Date: Mon, 30 Aug 2010 03:05:05 +0200 | |
removed (visual) bell. '\a' sets the urgency flag if st is unfocused. | |
Diffstat: | |
M config.h | 2 -- | |
M st.c | 42 +++++++++++++++++++----------… | |
2 files changed, 26 insertions(+), 18 deletions(-) | |
--- | |
diff --git a/config.h b/config.h | |
t@@ -29,8 +29,6 @@ static const char *colorname[] = { | |
#define DefaultFG 7 | |
#define DefaultBG 0 | |
#define DefaultCS 1 | |
-#define BellCol DefaultFG | |
-#define BellTime 30000 /* microseconds */ | |
/* special keys */ | |
static Key key[] = { | |
diff --git a/st.c b/st.c | |
t@@ -108,6 +108,7 @@ typedef struct { | |
int bufh; /* pixmap height */ | |
int ch; /* char height */ | |
int cw; /* char width */ | |
+ int hasfocus; | |
} XWindow; | |
typedef struct { | |
t@@ -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 */ | |
t@@ -187,7 +192,6 @@ static Term term; | |
static CSIEscape escseq; | |
static int cmdfd; | |
static pid_t pid; | |
-static int running; | |
#ifdef DEBUG | |
void | |
t@@ -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; | |
t@@ -930,7 +925,8 @@ tputc(char c) { | |
tnewline(); | |
break; | |
case '\a': | |
- xbell(); | |
+ if(!xw.hasfocus) | |
+ xseturgency(1); | |
break; | |
case '\033': | |
csireset(); | |
t@@ -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; | |
t@@ -1282,12 +1292,12 @@ run(void) { | |
XEvent ev; | |
fd_set rfd; | |
int xfd = XConnectionNumber(xw.dis); | |
+ long mask = ExposureMask | KeyPressMask | StructureNotifyMask | FocusC… | |
- running = 1; | |
- XSelectInput(xw.dis, xw.win, ExposureMask | KeyPressMask | StructureNo… | |
+ XSelectInput(xw.dis, xw.win, mask); | |
XResizeWindow(xw.dis, xw.win, xw.w, xw.h); /* XXX: fix resize bug in w… | |
- while(running) { | |
+ while(1) { | |
FD_ZERO(&rfd); | |
FD_SET(cmdfd, &rfd); | |
FD_SET(xfd, &rfd); |