JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
Merge remote-tracking branch 'origin/master'
authorRoberto E. Vargas Caballero <k0ga@shike2.com>
Thu, 19 Mar 2015 08:36:50 +0000 (08:36 +0000)
committerRoberto E. Vargas Caballero <k0ga@shike2.com>
Thu, 19 Mar 2015 08:36:50 +0000 (08:36 +0000)
1  2 
st.c

diff --combined st.c
--- 1/st.c
--- 2/st.c
+++ b/st.c
@@@ -197,14 -197,14 +197,14 @@@ typedef struct 
  } TCursor;
  
  /* CSI Escape sequence structs */
 -/* ESC '[' [[ [<priv>] <arg> [;]] <mode>] */
 +/* ESC '[' [[ [<priv>] <arg> [;]] <mode> [<mode>]] */
  typedef struct {
        char buf[ESC_BUF_SIZ]; /* raw string */
        int len;               /* raw string length */
        char priv;
        int arg[ESC_ARG_SIZ];
        int narg;              /* nb of args */
 -      char mode;
 +      char mode[2];
  } CSIEscape;
  
  /* STR Escape sequence structs */
@@@ -257,7 -257,6 +257,7 @@@ typedef struct 
        int ch; /* char height */
        int cw; /* char width  */
        char state; /* focus, redraw, visible */
 +      int cursor; /* cursor style */
  } XWindow;
  
  typedef struct {
@@@ -996,6 -995,8 +996,8 @@@ selnotify(XEvent *e) 
  
        ofs = 0;
        xsev = (XSelectionEvent *)e;
+       if (xsev->property == None)
+           return;
        do {
                if(XGetWindowProperty(xw.dpy, xw.win, xsev->property, ofs,
                                        BUFSIZ/4, False, AnyPropertyType,
@@@ -1546,8 -1547,7 +1548,8 @@@ csiparse(void) 
                        break;
                p++;
        }
 -      csiescseq.mode = *p;
 +      csiescseq.mode[0] = *p++;
 +      csiescseq.mode[1] = (p < csiescseq.buf+csiescseq.len) ? *p : '\0';
  }
  
  /* for absolute user moves, when decom is set */
@@@ -1985,7 -1985,7 +1987,7 @@@ csihandle(void) 
        char buf[40];
        int len;
  
 -      switch(csiescseq.mode) {
 +      switch(csiescseq.mode[0]) {
        default:
        unknown:
                fprintf(stderr, "erresc: unknown csi ");
        case 'u': /* DECRC -- Restore cursor position (ANSI.SYS) */
                tcursor(CURSOR_LOAD);
                break;
 +      case ' ':
 +              switch (csiescseq.mode[1]) {
 +                      case 'q': /* DECSCUSR -- Set Cursor Style */
 +                              DEFAULT(csiescseq.arg[0], 1);
 +                              if (!BETWEEN(csiescseq.arg[0], 0, 6)) {
 +                                      goto unknown;
 +                              }
 +                              xw.cursor = csiescseq.arg[0];
 +                              break;
 +                      default:
 +                              goto unknown;
 +              }
 +              break;
        }
  }
  
@@@ -3566,36 -3553,16 +3568,36 @@@ xdrawcursor(void) 
  
        /* draw the new one */
        if(xw.state & WIN_FOCUSED) {
 -              if(IS_SET(MODE_REVERSE)) {
 -                      g.mode |= ATTR_REVERSE;
 -                      g.fg = defaultcs;
 -                      g.bg = defaultfg;
 -              }
 +              switch (xw.cursor) {
 +                      case 0: /* Blinking Block */
 +                      case 1: /* Blinking Block (Default) */
 +                      case 2: /* Steady Block */
 +                              if(IS_SET(MODE_REVERSE)) {
 +                                              g.mode |= ATTR_REVERSE;
 +                                              g.fg = defaultcs;
 +                                              g.bg = defaultfg;
 +                                      }
  
 -              sl = utf8len(g.c);
 -              width = (term.line[term.c.y][curx].mode & ATTR_WIDE)\
 -                      ? 2 : 1;
 -              xdraws(g.c, g, term.c.x, term.c.y, width, sl);
 +                              sl = utf8len(g.c);
 +                              width = (term.line[term.c.y][curx].mode & ATTR_WIDE)\
 +                                      ? 2 : 1;
 +                              xdraws(g.c, g, term.c.x, term.c.y, width, sl);
 +                              break;
 +                      case 3: /* Blinking Underline */
 +                      case 4: /* Steady Underline */
 +                              XftDrawRect(xw.draw, &dc.col[defaultcs],
 +                                              borderpx + curx * xw.cw,
 +                                              borderpx + (term.c.y + 1) * xw.ch - 1,
 +                                              xw.cw, 1);
 +                              break;
 +                      case 5: /* Blinking bar */
 +                      case 6: /* Steady bar */
 +                              XftDrawRect(xw.draw, &dc.col[defaultcs],
 +                                                              borderpx + curx * xw.cw,
 +                                                              borderpx + term.c.y * xw.ch,
 +                                                              1, xw.ch);
 +                              break;
 +              }
        } else {
                XftDrawRect(xw.draw, &dc.col[defaultcs],
                                borderpx + curx * xw.cw,
@@@ -4020,7 -3987,6 +4022,7 @@@ main(int argc, char *argv[]) 
  
        xw.l = xw.t = 0;
        xw.isfixed = False;
 +      xw.cursor = 0;
  
        ARGBEGIN {
        case 'a':