X-Git-Url: https://git.xinqibao.xyz/st.git/blobdiff_plain/ee858b4805aec3e12bff48cf27433ebcd3f6ac34..5ce6c5c0324ef3b7d0f5b9e6e2ba4d87ae0d3bb1:/st.c?ds=inline diff --git a/st.c b/st.c index 4a89876..65829a8 100644 --- a/st.c +++ b/st.c @@ -125,11 +125,12 @@ typedef struct { GC gc; } DC; +/* TODO: use better name for vars... */ typedef struct { int mode; int bx, by; int ex, ey; - int b[2], e[2]; + struct {int x, y;} b, e; char *clip; } Selection; @@ -185,9 +186,9 @@ static char* kmap(KeySym); static void kpress(XEvent *); static void resize(XEvent *); static void focus(XEvent *); -static void brelease(XEvent *e); -static void bpress(XEvent *e); -static void bmotion(XEvent *e); +static void brelease(XEvent *); +static void bpress(XEvent *); +static void bmotion(XEvent *); static void (*handler[LASTEvent])(XEvent *) = { @@ -210,16 +211,21 @@ static int cmdfd; static pid_t pid; static Selection sel; -/* TODO: use X11 clipboard */ +void +selinit(void) { + sel.mode = 0; + sel.bx = -1; + sel.clip = NULL; +} static inline int selected(int x, int y) { - if ((sel.ey==y && sel.by==y)) { + if(sel.ey == y && sel.by == y) { int bx = MIN(sel.bx, sel.ex); int ex = MAX(sel.bx, sel.ex); - return (x>=bx && x<=ex); + return BETWEEN(x, bx, ex); } - return (((y>sel.b[1] && y=sel.b[0] && (x<=sel.e[0] || sel.b[1]!=sel.e[1]))); + return ((sel.b.y < y&&y < sel.e.y) || (y==sel.e.y && x<=sel.e.x)) + || (y==sel.b.y && x>=sel.b.x && (x<=sel.e.x || sel.b.y!=sel.e.y)); } static void getbuttoninfo(XEvent *e, int *b, int *x, int *y) { @@ -227,10 +233,10 @@ static void getbuttoninfo(XEvent *e, int *b, int *x, int *y) { *b=*b==4096?5:*b==2048?4:*b==1024?3:*b==512?2:*b==256?1:-1; *x = e->xbutton.x/xw.cw; *y = e->xbutton.y/xw.ch; - sel.b[0] = sel.by= term.top+n; i--) { temp = term.line[i]; @@ -485,8 +482,7 @@ tscrollup (int n) { Line temp; LIMIT(n, 0, term.bot-term.top+1); - for(i = 0; i < n; i++) - memset(term.line[term.top+i], 0, term.col*sizeof(Glyph)); + tclearregion(0, term.top, term.col-1, term.top+n-1); for(i = term.top; i <= term.bot-n; i++) { temp = term.line[i]; @@ -595,21 +591,16 @@ tinsertblankline(int n) { Line blank; int bot = term.bot; - if(term.c.y > term.bot) - bot = term.row - 1; - else if(term.c.y < term.top) - bot = term.top - 1; - if(term.c.y + n >= bot) { - tclearregion(0, term.c.y, term.col-1, bot); + if(term.c.y < term.top || term.c.y > term.bot) return; - } + + LIMIT(n, 0, bot-term.c.y+1); + tclearregion(0, bot-n+1, term.col-1, bot); for(i = bot; i >= term.c.y+n; i--) { /* swap deleted line <-> blanked line */ blank = term.line[i]; term.line[i] = term.line[i-n]; term.line[i-n] = blank; - /* blank it */ - memset(blank, 0, term.col * sizeof(Glyph)); } } @@ -619,21 +610,16 @@ tdeleteline(int n) { Line blank; int bot = term.bot; - if(term.c.y > term.bot) - bot = term.row - 1; - else if(term.c.y < term.top) - bot = term.top - 1; - if(term.c.y + n >= bot) { - tclearregion(0, term.c.y, term.col-1, bot); + if(term.c.y < term.top || term.c.y > term.bot) return; - } + + LIMIT(n, 0, bot-term.c.y+1); + tclearregion(0, term.c.y, term.col-1, term.c.y+n-1); for(i = term.c.y; i <= bot-n; i++) { /* swap deleted line <-> blanked line */ blank = term.line[i]; term.line[i] = term.line[i+n]; term.line[i+n] = blank; - /* blank it */ - memset(blank, 0, term.col * sizeof(Glyph)); } } @@ -961,7 +947,8 @@ tputc(char c) { term.esc = 0; csiparse(), csihandle(); } - } else if(term.esc & ESC_OSC) { + /* TODO: handle other OSC */ + } else if(term.esc & ESC_OSC) { if(c == ';') { term.titlelen = 0; term.esc = ESC_START | ESC_TITLE; @@ -1205,18 +1192,23 @@ xinit(void) { xloadcols(); /* windows */ - xw.h = term.row * xw.ch + 2*BORDER; - xw.w = term.col * xw.cw + 2*BORDER; + xw.bufh = term.row * xw.ch; + xw.bufw = term.col * xw.cw; + xw.h = xw.bufh + 2*BORDER; + xw.w = xw.bufw + 2*BORDER; xw.win = XCreateSimpleWindow(xw.dis, XRootWindow(xw.dis, xw.scr), 0, 0, xw.w, xw.h, 0, dc.col[DefaultBG], dc.col[DefaultBG]); - xw.bufw = xw.w - 2*BORDER; - xw.bufh = xw.h - 2*BORDER; xw.buf = XCreatePixmap(xw.dis, xw.win, xw.bufw, xw.bufh, XDefaultDepth(xw.dis, xw.scr)); - xw.hasfocus = 1; /* gc */ dc.gc = XCreateGC(xw.dis, xw.win, 0, NULL); + + /* event mask */ + XSelectInput(xw.dis, xw.win, ExposureMask | KeyPressMask + | StructureNotifyMask | FocusChangeMask | PointerMotionMask + | ButtonPressMask | ButtonReleaseMask); + XMapWindow(xw.dis, xw.win); xhints(); XStoreName(xw.dis, xw.win, "st"); @@ -1400,7 +1392,7 @@ kpress(XEvent *ev) { break; case XK_Insert: if(shift) - draw(1), puts("draw!")/* XXX: paste X clipboard */; + selpaste(), draw(1); break; default: fprintf(stderr, "errkey: %d\n", (int)ksym); @@ -1435,12 +1427,6 @@ run(void) { XEvent ev; fd_set rfd; int xfd = XConnectionNumber(xw.dis); - long mask = ExposureMask | KeyPressMask | StructureNotifyMask - | FocusChangeMask | PointerMotionMask | ButtonPressMask - | ButtonReleaseMask; - - XSelectInput(xw.dis, xw.win, mask); - XResizeWindow(xw.dis, xw.win, xw.w, xw.h); /* XXX: fix resize bug in wmii (?) */ for(;;) { FD_ZERO(&rfd); @@ -1473,6 +1459,7 @@ main(int argc, char *argv[]) { tnew(80, 24); ttynew(); xinit(); + selinit(); run(); return 0; }