Let curses do the dirty work for flash

Use the terminfo delay syntax ($<x>) in our flash capability to avoid
hardcoding a fixed delay in redraw() when called from tsetmode() with
DECSCNM.
We need to turn on the npc capability so that delays are made with
xon/xoff instead of padding characters.
This commit is contained in:
Ivan Delalande 2015-02-15 00:34:03 +01:00 committed by Roberto E. Vargas Caballero
parent 3604445ffc
commit 1b514048b2
2 changed files with 8 additions and 16 deletions

21
st.c
View File

@ -63,8 +63,6 @@ char *argv0;
#define XK_NO_MOD 0 #define XK_NO_MOD 0
#define XK_SWITCH_MOD (1<<13) #define XK_SWITCH_MOD (1<<13)
#define REDRAW_TIMEOUT (80*1000) /* 80 ms */
/* macros */ /* macros */
#define MIN(a, b) ((a) < (b) ? (a) : (b)) #define MIN(a, b) ((a) < (b) ? (a) : (b))
#define MAX(a, b) ((a) < (b) ? (b) : (a)) #define MAX(a, b) ((a) < (b) ? (b) : (a))
@ -349,7 +347,7 @@ typedef struct {
static void die(const char *, ...); static void die(const char *, ...);
static void draw(void); static void draw(void);
static void redraw(int); static void redraw(void);
static void drawregion(int, int, int, int); static void drawregion(int, int, int, int);
static void execsh(void); static void execsh(void);
static void sigchld(int); static void sigchld(int);
@ -1826,7 +1824,7 @@ tsetmode(bool priv, bool set, int *args, int narg) {
mode = term.mode; mode = term.mode;
MODBIT(term.mode, set, MODE_REVERSE); MODBIT(term.mode, set, MODE_REVERSE);
if(mode != term.mode) if(mode != term.mode)
redraw(REDRAW_TIMEOUT); redraw();
break; break;
case 6: /* DECOM -- Origin */ case 6: /* DECOM -- Origin */
MODBIT(term.c.state, set, CURSOR_ORIGIN); MODBIT(term.c.state, set, CURSOR_ORIGIN);
@ -2200,7 +2198,7 @@ strhandle(void) {
* TODO if defaultbg color is changed, borders * TODO if defaultbg color is changed, borders
* are dirty * are dirty
*/ */
redraw(0); redraw();
} }
return; return;
} }
@ -3093,7 +3091,7 @@ xzoomabs(const Arg *arg) {
xunloadfonts(); xunloadfonts();
xloadfonts(usedfont, arg->i); xloadfonts(usedfont, arg->i);
cresize(0, 0); cresize(0, 0);
redraw(0); redraw();
xhints(); xhints();
} }
@ -3558,16 +3556,9 @@ xresettitle(void) {
} }
void void
redraw(int timeout) { redraw(void) {
struct timespec tv = {0, timeout * 1000};
tfulldirt(); tfulldirt();
draw(); draw();
if(timeout > 0) {
nanosleep(&tv, NULL);
XSync(xw.dpy, False); /* necessary for a good tput flash */
}
} }
void void
@ -3634,7 +3625,7 @@ expose(XEvent *ev) {
if(!e->count) if(!e->count)
xw.state &= ~WIN_REDRAW; xw.state &= ~WIN_REDRAW;
} }
redraw(0); redraw();
} }
void void

View File

@ -32,7 +32,7 @@ st| simpleterm,
el=\E[K, el=\E[K,
el1=\E[1K, el1=\E[1K,
enacs=\E)0, enacs=\E)0,
flash=\E[?5h\E[?5l, flash=\E[?5h$<80/>\E[?5l,
fsl=^G, fsl=^G,
home=\E[H, home=\E[H,
hpa=\E[%i%p1%dG, hpa=\E[%i%p1%dG,
@ -150,6 +150,7 @@ st| simpleterm,
mir, mir,
msgr, msgr,
ncv#3, ncv#3,
npc,
op=\E[39;49m, op=\E[39;49m,
pairs#64, pairs#64,
mc0=\E[i, mc0=\E[i,