X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=st.c;h=da6f17ef351cc87ae0f57c1cd2887301c42dd51e;hb=b93741e34df3ebe05f7ccc14f1fd4b0da01bf1fa;hp=d7ca87516155edc8977cf5fafadc2fc9ed3de13a;hpb=85849ce72aa4e9cee307a031b97777e9eba2d453;p=st.git diff --git a/st.c b/st.c index d7ca875..da6f17e 100644 --- a/st.c +++ b/st.c @@ -48,7 +48,7 @@ #define ESC_ARG_SIZ 16 #define STR_BUF_SIZ 256 #define STR_ARG_SIZ 16 -#define DRAW_BUF_SIZ 1024 +#define DRAW_BUF_SIZ 20*1024 #define UTF_SIZ 4 #define XK_NO_MOD UINT_MAX #define XK_ANY_MOD 0 @@ -288,7 +288,6 @@ static void ttywrite(const char *, size_t); static void xdraws(char *, Glyph, int, int, int, int); static void xhints(void); static void xclear(int, int, int, int); -static void xcopy(void); static void xdrawcursor(void); static void xinit(void); static void xloadcols(void); @@ -562,8 +561,11 @@ bpress(XEvent *e) { if(IS_SET(MODE_MOUSE)) mousereport(e); else if(e->xbutton.button == Button1) { - if(sel.bx != -1) + if(sel.bx != -1) { + sel.bx = -1; tsetdirt(sel.b.y, sel.e.y); + draw(); + } sel.mode = 1; sel.ex = sel.bx = X2COL(e->xbutton.x); sel.ey = sel.by = Y2ROW(e->xbutton.y); @@ -635,7 +637,6 @@ void selclear(XEvent *e) { return; sel.bx = -1; tsetdirt(sel.b.y, sel.e.y); - draw(); } void @@ -685,8 +686,6 @@ xsetsel(char *str) { clipboard = XInternAtom(xw.dpy, "CLIPBOARD", 0); XSetSelectionOwner(xw.dpy, clipboard, xw.win, CurrentTime); - - XFlush(xw.dpy); } void @@ -729,7 +728,6 @@ brelease(XEvent *e) { } memcpy(&sel.tclick2, &sel.tclick1, sizeof(struct timeval)); gettimeofday(&sel.tclick1, NULL); - draw(); } void @@ -746,7 +744,6 @@ bmotion(XEvent *e) { int starty = MIN(oldey, sel.ey); int endy = MAX(oldey, sel.ey); tsetdirt(starty, endy); - draw(); } } } @@ -2091,13 +2088,6 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) { XDrawLine(xw.dpy, xw.buf, dc.gc, winx, winy+1, winx+width-1, winy+1); } -/* copy buffer pixmap to screen pixmap */ -void -xcopy() { - XdbeSwapInfo swpinfo[1] = {{xw.win, XdbeCopied}}; - XdbeSwapBuffers(xw.dpy, swpinfo, 1); -} - void xdrawcursor(void) { static int oldx = 0; @@ -2118,8 +2108,6 @@ xdrawcursor(void) { } else xclear(oldx, oldy, oldx, oldy); - xcopy(); - /* draw the new one */ if(!(term.c.state & CURSOR_HIDE)) { if(!(xw.state & WIN_FOCUSED)) @@ -2132,8 +2120,6 @@ xdrawcursor(void) { xdraws(g.c, g, term.c.x, term.c.y, 1, sl); oldx = term.c.x, oldy = term.c.y; } - - xcopy(); } void @@ -2152,8 +2138,10 @@ redraw(void) { void draw() { + XdbeSwapInfo swpinfo[1] = {{xw.win, XdbeCopied}}; + drawregion(0, 0, term.col, term.row); - xcopy(); + XdbeSwapBuffers(xw.dpy, swpinfo, 1); } void @@ -2208,7 +2196,6 @@ expose(XEvent *ev) { if(!e->count) xw.state &= ~WIN_REDRAW; } - xcopy(); } void @@ -2241,7 +2228,6 @@ focus(XEvent *ev) { xseturgency(0); } else xw.state &= ~WIN_FOCUSED; - draw(); } char* @@ -2317,7 +2303,6 @@ cmessage(XEvent *e) { } else if(e->xclient.data.l[1] == XEMBED_FOCUS_OUT) { xw.state &= ~WIN_FOCUSED; } - draw(); } } @@ -2344,7 +2329,8 @@ void run(void) { XEvent ev; fd_set rfd; - int xfd = XConnectionNumber(xw.dpy); + int xfd = XConnectionNumber(xw.dpy), i; + struct timeval drawtimeout; for(;;) { FD_ZERO(&rfd); @@ -2355,10 +2341,28 @@ run(void) { continue; die("select failed: %s\n", SERRNO); } - if(FD_ISSET(cmdfd, &rfd)) + + /* + * Stop after a certain number of reads so the user does not + * feel like the system is stuttering. + */ + for(i = 0; i < 1000 && FD_ISSET(cmdfd, &rfd); i++) { ttyread(); - draw(); + FD_ZERO(&rfd); + FD_SET(cmdfd, &rfd); + /* + * Just wait a bit so it isn't disturbing the + * user and the system is able to write something. + */ + drawtimeout.tv_sec = 0; + drawtimeout.tv_usec = 5; + if(select(cmdfd+1, &rfd, NULL, NULL, &drawtimeout) < 0) { + if(errno == EINTR) + continue; + die("select failed: %s\n", SERRNO); + } + } while(XPending(xw.dpy)) { XNextEvent(xw.dpy, &ev); @@ -2367,6 +2371,9 @@ run(void) { if(handler[ev.type]) (handler[ev.type])(&ev); } + + draw(); + XFlush(xw.dpy); } }