Xinqi Bao's Git
projects
/
st.git
/ diff
summary
|
log
|
commit
|
diff
|
tree
raw
|
patch
|
inline
| side by side (parent:
188293c
)
removed (visual) bell. '\a' sets the urgency flag if st is unfocused.
author
Aurélien Aptel <
[email protected]
>
Mon, 30 Aug 2010 01:05:05 +0000
(
03:05
+0200)
committer
Aurélien Aptel <
[email protected]
>
Mon, 30 Aug 2010 01:05:05 +0000
(
03:05
+0200)
config.h
diff
|
blob
|
history
st.c
diff
|
blob
|
history
diff --git
a/config.h
b/config.h
index
53795c6
..
5494b3b
100644
(file)
--- a/
config.h
+++ b/
config.h
@@
-29,8
+29,6
@@
static const char *colorname[] = {
#define DefaultFG 7
#define DefaultBG 0
#define DefaultCS 1
#define DefaultFG 7
#define DefaultBG 0
#define DefaultCS 1
-#define BellCol DefaultFG
-#define BellTime 30000 /* microseconds */
/* special keys */
static Key key[] = {
/* special keys */
static Key key[] = {
diff --git
a/st.c
b/st.c
index
36ff43c
..
436533c
100644
(file)
--- a/
st.c
+++ b/
st.c
@@
-108,6
+108,7
@@
typedef struct {
int bufh; /* pixmap height */
int ch; /* char height */
int cw; /* char width */
int bufh; /* pixmap height */
int ch; /* char height */
int cw; /* char width */
+ int hasfocus;
} XWindow;
typedef struct {
} 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 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 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 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,
static void (*handler[LASTEvent])(XEvent *) = {
[KeyPress] = kpress,
[Expose] = expose,
- [ConfigureNotify] = resize
+ [ConfigureNotify] = resize,
+ [FocusIn] = focus,
+ [FocusOut] = focus,
};
/* Globals */
};
/* Globals */
@@
-187,7
+192,6
@@
static Term term;
static CSIEscape escseq;
static int cmdfd;
static pid_t pid;
static CSIEscape escseq;
static int cmdfd;
static pid_t pid;
-static int running;
#ifdef DEBUG
void
#ifdef DEBUG
void
@@
-227,15
+231,6
@@
execsh(void) {
execvp(args[0], args);
}
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;
void
sigchld(int a) {
int stat = 0;
@@
-930,7
+925,8
@@
tputc(char c) {
tnewline();
break;
case '\a':
tnewline();
break;
case '\a':
- xbell();
+ if(!xw.hasfocus)
+ xseturgency(1);
break;
case '\033':
csireset();
break;
case '\033':
csireset();
@@
-1208,6
+1204,20
@@
expose(XEvent *ev) {
draw(SCREEN_REDRAW);
}
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;
char*
kmap(KeySym k) {
int i;
@@
-1282,12
+1292,12
@@
run(void) {
XEvent ev;
fd_set rfd;
int xfd = XConnectionNumber(xw.dis);
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 (?) */
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);
FD_ZERO(&rfd);
FD_SET(cmdfd, &rfd);
FD_SET(xfd, &rfd);