Merge branch 'master' of ssh://suckless.org/gitrepos/st
authorRoberto E. Vargas Caballero <k0ga@shike2.com>
Tue, 14 Apr 2015 07:47:19 +0000 (09:47 +0200)
committerRoberto E. Vargas Caballero <k0ga@shike2.com>
Tue, 14 Apr 2015 07:47:19 +0000 (09:47 +0200)
1  2 
st.c

diff --combined st.c
--- 1/st.c
--- 2/st.c
+++ b/st.c
@@@ -1,4 -1,4 +1,4 @@@
 -/* See LICENSE for licence details. */
 +/* See LICENSE for license details. */
  #include <ctype.h>
  #include <errno.h>
  #include <fcntl.h>
@@@ -423,7 -423,7 +423,7 @@@ static void xsettitle(char *)
  static void xresettitle(void);
  static void xsetpointermotion(int);
  static void xseturgency(int);
- static void xsetsel(char *);
+ static void xsetsel(char *, Time);
  static void xtermclear(int, int, int, int);
  static void xunloadfont(Font *);
  static void xunloadfonts(void);
@@@ -449,7 -449,7 +449,7 @@@ static void selinit(void)
  static void selnormalize(void);
  static inline bool selected(int, int);
  static char *getsel(void);
- static void selcopy(void);
+ static void selcopy(Time);
  static void selscroll(int, int);
  static void selsnap(int, int *, int *, int);
  static int x2col(int);
@@@ -944,7 -944,7 +944,7 @@@ getsel(void) 
        ptr = str = xmalloc(bufsize);
  
        /* append every set & selected glyph to the selection */
 -      for(y = sel.nb.y; y < sel.ne.y + 1; y++) {
 +      for(y = sel.nb.y; y <= sel.ne.y; y++) {
                linelen = tlinelen(y);
  
                if(sel.type == SEL_RECTANGULAR) {
  }
  
  void
- selcopy(void) {
-       xsetsel(getsel());
+ selcopy(Time t) {
+       xsetsel(getsel(), t);
  }
  
  void
@@@ -997,7 -997,7 +997,7 @@@ selnotify(XEvent *e) 
        XSelectionEvent *xsev;
  
        ofs = 0;
-       xsev = (XSelectionEvent *)e;
+       xsev = &e->xselection;
        if (xsev->property == None)
            return;
        do {
@@@ -1083,6 -1083,9 +1083,9 @@@ selrequest(XEvent *e) 
        xev.selection = xsre->selection;
        xev.target = xsre->target;
        xev.time = xsre->time;
+         if (xsre->property == None)
+             xsre->property = xsre->target;
        /* reject */
        xev.property = None;
  
  }
  
  void
- xsetsel(char *str) {
+ xsetsel(char *str, Time t) {
        free(sel.primary);
        sel.primary = str;
  
-       XSetSelectionOwner(xw.dpy, XA_PRIMARY, xw.win, CurrentTime);
+       XSetSelectionOwner(xw.dpy, XA_PRIMARY, xw.win, t);
+         if (XGetSelectionOwner(xw.dpy, XA_PRIMARY) != xw.win)
+             selclear(0);
  }
  
  void
@@@ -1146,7 -1151,7 +1151,7 @@@ brelease(XEvent *e) 
                        selclear(NULL);
                } else {
                        getbuttoninfo(e);
-                       selcopy();
+                       selcopy(e->xbutton.time);
                }
                sel.mode = 0;
                tsetdirt(sel.nb.y, sel.ne.y);
@@@ -1571,9 -1576,11 +1576,9 @@@ tmoveto(int x, int y) 
                miny = 0;
                maxy = term.row - 1;
        }
 -      LIMIT(x, 0, term.col-1);
 -      LIMIT(y, miny, maxy);
        term.c.state &= ~CURSOR_WRAPNEXT;
 -      term.c.x = x;
 -      term.c.y = y;
 +      term.c.x = LIMIT(x, 0, term.col-1);
 +      term.c.y = LIMIT(y, miny, maxy);
  }
  
  void
@@@ -2390,7 -2397,7 +2395,7 @@@ tputtab(int n) 
                        for(--x; x > 0 && !term.tabs[x]; --x)
                                /* nothing */ ;
        }
-       tmoveto(x, term.c.y);
+       term.c.x = LIMIT(x, 0, term.col-1);
  }
  
  void
@@@ -2444,19 -2451,21 +2449,19 @@@ tdectest(char c) 
  
  void
  tstrsequence(uchar c) {
 -      if (c & 0x80) {
 -              switch (c) {
 -              case 0x90:   /* DCS -- Device Control String */
 -                      c = 'P';
 -                      break;
 -              case 0x9f:   /* APC -- Application Program Command */
 -                      c = '_';
 -                      break;
 -              case 0x9e:   /* PM -- Privacy Message */
 -                      c = '^';
 -                      break;
 -              case 0x9d:   /* OSC -- Operating System Command */
 -                      c = ']';
 -                      break;
 -              }
 +      switch (c) {
 +      case 0x90:   /* DCS -- Device Control String */
 +              c = 'P';
 +              break;
 +      case 0x9f:   /* APC -- Application Program Command */
 +              c = '_';
 +              break;
 +      case 0x9e:   /* PM -- Privacy Message */
 +              c = '^';
 +              break;
 +      case 0x9d:   /* OSC -- Operating System Command */
 +              c = ']';
 +              break;
        }
        strreset();
        strescseq.type = c;
@@@ -2765,6 -2774,7 +2770,6 @@@ tresize(int col, int row) 
        int i;
        int minrow = MIN(row, term.row);
        int mincol = MIN(col, term.col);
 -      int slide = term.c.y - row + 1;
        bool *bp;
        TCursor c;
  
                return;
        }
  
 -      /* free unneeded rows */
 -      i = 0;
 -      if(slide > 0) {
 -              /*
 -               * slide screen to keep cursor where we expect it -
 -               * tscrollup would work here, but we can optimize to
 -               * memmove because we're freeing the earlier lines
 -               */
 -              for(/* i = 0 */; i < slide; i++) {
 -                      free(term.line[i]);
 -                      free(term.alt[i]);
 -              }
 -              memmove(term.line, term.line + slide, row * sizeof(Line));
 -              memmove(term.alt, term.alt + slide, row * sizeof(Line));
 +      /*
 +       * slide screen to keep cursor where we expect it -
 +       * tscrollup would work here, but we can optimize to
 +       * memmove because we're freeing the earlier lines
 +       */
 +      for(i = 0; i <= term.c.y - row; i++) {
 +              free(term.line[i]);
 +              free(term.alt[i]);
        }
 +      memmove(term.line, term.line + i, row * sizeof(Line));
 +      memmove(term.alt, term.alt + i, row * sizeof(Line));
        for(i += row; i < term.row; i++) {
                free(term.line[i]);
                free(term.alt[i]);
@@@ -3908,13 -3922,17 +3913,13 @@@ run(void) 
        long deltatime;
  
        /* Waiting for window mapping */
 -      while(1) {
 +      do {
                XNextEvent(xw.dpy, &ev);
 -              if(XFilterEvent(&ev, None))
 -                      continue;
                if(ev.type == ConfigureNotify) {
                        w = ev.xconfigure.width;
                        h = ev.xconfigure.height;
 -              } else if(ev.type == MapNotify) {
 -                      break;
                }
 -      }
 +      } while(ev.type != MapNotify);
  
        ttynew();
        cresize(w, h);
@@@ -4008,6 -4026,7 +4013,6 @@@ usage(void) 
  
  int
  main(int argc, char *argv[]) {
 -      char *titles;
        uint cols = 80, rows = 24;
  
        xw.l = xw.t = 0;
                /* eat all remaining arguments */
                if(argc > 1) {
                        opt_cmd = &argv[1];
 -                      if(argv[1] != NULL && opt_title == NULL) {
 -                              titles = xstrdup(argv[1]);
 -                              opt_title = basename(titles);
 -                      }
 +                      if(argv[1] != NULL && opt_title == NULL)
 +                              opt_title = basename(xstrdup(argv[1]));
                }
                goto run;
        case 'f':