From: Roberto E. Vargas Caballero Date: Tue, 14 Apr 2015 07:47:19 +0000 (+0200) Subject: Merge branch 'master' of ssh://suckless.org/gitrepos/st X-Git-Url: https://git.danieliu.xyz/?a=commitdiff_plain;h=83e73c6242fc309a3859c12b996ab88d36c7e838;hp=-c;p=st.git Merge branch 'master' of ssh://suckless.org/gitrepos/st --- 83e73c6242fc309a3859c12b996ab88d36c7e838 diff --combined st.c index 2a565b6,6bfa834..40840ce --- a/st.c +++ b/st.c @@@ -1,4 -1,4 +1,4 @@@ -/* See LICENSE for licence details. */ +/* See LICENSE for license details. */ #include #include #include @@@ -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) { @@@ -984,8 -984,8 +984,8 @@@ } 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; @@@ -1125,11 -1128,13 +1128,13 @@@ } 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; @@@ -2774,17 -2784,21 +2779,17 @@@ 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; @@@ -4025,8 -4044,10 +4030,8 @@@ /* 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':