JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
Adding a more efficient drawing code.
[st.git] / st.c
diff --git a/st.c b/st.c
index fa4136a..f4b419e 100644 (file)
--- a/st.c
+++ b/st.c
@@ -807,7 +807,6 @@ void selclear(XEvent *e) {
 
 void
 selrequest(XEvent *e) {
-       fprintf(stderr, "selrequest\n");
        XSelectionRequestEvent *xsre;
        XSelectionEvent xev;
        Atom xa_targets, string;
@@ -843,7 +842,6 @@ selrequest(XEvent *e) {
 
 void
 xsetsel(char *str) {
-       fprintf(stderr, "xsetsel: %s\n", str);
        /* register the selection for both the clipboard and the primary */
        Atom clipboard;
 
@@ -1559,9 +1557,11 @@ tsetmode(bool priv, bool set, int *args, int narg) {
                                break;
                        case 1000: /* 1000,1002: enable xterm mouse report */
                                MODBIT(term.mode, set, MODE_MOUSEBTN);
+                               MODBIT(term.mode, 0, MODE_MOUSEMOTION);
                                break;
                        case 1002:
                                MODBIT(term.mode, set, MODE_MOUSEMOTION);
+                               MODBIT(term.mode, 0, MODE_MOUSEBTN);
                                break;
                        case 1006:
                                MODBIT(term.mode, set, MODE_MOUSESGR);
@@ -1745,8 +1745,8 @@ csihandle(void) {
                break;
        case 'X': /* ECH -- Erase <n> char */
                DEFAULT(csiescseq.arg[0], 1);
-               tclearregion(term.c.x, term.c.y, term.c.x + csiescseq.arg[0],
-                               term.c.y, 1);
+               tclearregion(term.c.x, term.c.y,
+                               term.c.x + csiescseq.arg[0] - 1, term.c.y, 1);
                break;
        case 'P': /* DCH -- Delete <n> char */
                DEFAULT(csiescseq.arg[0], 1);
@@ -2277,7 +2277,7 @@ xresize(int col, int row) {
                XFreePixmap(xw.dpy, xw.buf);
                xw.buf = XCreatePixmap(xw.dpy, xw.win, xw.w, xw.h,
                                DefaultDepth(xw.dpy, xw.scr));
-               XSetForeground(xw.dpy, dc.gc, 0);
+               XSetForeground(xw.dpy, dc.gc, dc.col[IS_SET(MODE_REVERSE) ? defaultfg : defaultbg].pixel);
                XFillRectangle(xw.dpy, xw.buf, dc.gc, 0, 0, xw.w, xw.h);
        }
 
@@ -2442,7 +2442,9 @@ xloadfonts(char *fontstr, int fontsize) {
        xw.cw = dc.font.width;
        xw.ch = dc.font.height;
 
+       FcPatternDel(pattern, FC_SLANT);
        FcPatternDel(pattern, FC_WEIGHT);
+       FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ROMAN);
        FcPatternAddInteger(pattern, FC_WEIGHT, FC_WEIGHT_BOLD);
        if(xloadfont(&dc.bfont, pattern))
                die("st: can't open font %s\n", fontstr);
@@ -2453,6 +2455,7 @@ xloadfonts(char *fontstr, int fontsize) {
                die("st: can't open font %s\n", fontstr);
 
        FcPatternDel(pattern, FC_WEIGHT);
+       FcPatternAddInteger(pattern, FC_WEIGHT, FC_WEIGHT_MEDIUM);
        if(xloadfont(&dc.ifont, pattern))
                die("st: can't open font %s\n", fontstr);
 
@@ -2572,7 +2575,7 @@ xinit(void) {
                                &gcvalues);
                xw.buf = XCreatePixmap(xw.dpy, xw.win, xw.w, xw.h,
                                DefaultDepth(xw.dpy, xw.scr));
-               XSetForeground(xw.dpy, dc.gc, 0);
+               XSetForeground(xw.dpy, dc.gc, dc.col[defaultbg].pixel);
                XFillRectangle(xw.dpy, xw.buf, dc.gc, 0, 0, xw.w, xw.h);
                //xw.buf = xw.win;
        /*
@@ -2896,7 +2899,7 @@ draw(void) {
        } else {
                XCopyArea(xw.dpy, xw.buf, xw.win, dc.gc, 0, 0, xw.w,
                                xw.h, 0, 0);
-               XSetForeground(xw.dpy, dc.gc, 0);
+               XSetForeground(xw.dpy, dc.gc, dc.col[IS_SET(MODE_REVERSE) ? defaultfg : defaultbg].pixel);
        }
 }
 
@@ -2988,6 +2991,11 @@ xseturgency(int add) {
 
 void
 focus(XEvent *ev) {
+       XFocusChangeEvent *e = &ev->xfocus;
+
+       if(e->mode == NotifyGrab)
+               return;
+
        if(ev->type == FocusIn) {
                XSetICFocus(xw.xic);
                xw.state |= WIN_FOCUSED;
@@ -3158,10 +3166,12 @@ void
 run(void) {
        XEvent ev;
        fd_set rfd;
-       int xfd = XConnectionNumber(xw.dpy), i;
-       struct timeval drawtimeout, *tv = NULL;
+       int xfd = XConnectionNumber(xw.dpy);
+       struct timeval drawtimeout, *tv = NULL, now, last;
+
+       gettimeofday(&last, NULL);
 
-       for(i = 0;; i++) {
+       for(;;) {
                FD_ZERO(&rfd);
                FD_SET(cmdfd, &rfd);
                FD_SET(xfd, &rfd);
@@ -3171,35 +3181,44 @@ run(void) {
                        die("select failed: %s\n", SERRNO);
                }
 
-               /*
-                * Stop after a certain number of reads so the user does not
-                * feel like the system is stuttering.
-                */
-               if(i < 1000 && FD_ISSET(cmdfd, &rfd)) {
-                       ttyread();
+               gettimeofday(&now, NULL);
+               /* usecs until (next) frame */
+               drawtimeout.tv_sec = 0;
+               drawtimeout.tv_usec = \
+                       ((1000/framespersecond) - TIMEDIFF(now, last)) * 1000;
 
-                       /*
-                        * 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;
-                       tv = &drawtimeout;
-                       continue;
+               /* Let us draw a frame. */
+               if(drawtimeout.tv_usec <= 0) {
+                       draw();
+                       XFlush(xw.dpy);
+
+                       last = now;
+                       tv = NULL;
                }
-               i = 0;
-               tv = NULL;
 
-               while(XPending(xw.dpy)) {
-                       XNextEvent(xw.dpy, &ev);
-                       if(XFilterEvent(&ev, None))
-                               continue;
-                       if(handler[ev.type])
-                               (handler[ev.type])(&ev);
+               if(FD_ISSET(cmdfd, &rfd))
+                       ttyread();
+
+               if(FD_ISSET(xfd, &rfd)) {
+                       while(XPending(xw.dpy)) {
+                               XNextEvent(xw.dpy, &ev);
+                               if(XFilterEvent(&ev, None))
+                                       continue;
+                               if(handler[ev.type])
+                                       (handler[ev.type])(&ev);
+                       }
+
+                       if(drawtimeout.tv_usec <= 0) {
+                               draw();
+                               XFlush(xw.dpy);
+                       }
                }
 
-               draw();
-               XFlush(xw.dpy);
+               /* There is still some time to wait until next frame. */
+               if(drawtimeout.tv_usec > 0) {
+                       tv = &drawtimeout;
+                       continue;
+               }
        }
 }