X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=st.c;h=ba93f2fec177d087138111acbaeed8ef20ec5840;hb=d5640c772998de7bccd76c3f8e934fa685cb2bb4;hp=683a0e9b19fb751fd70c72bdc73846674e0c0e89;hpb=69ee3ba3a771ca60bc8738174c79fc851818a36b;p=st.git diff --git a/st.c b/st.c index 683a0e9..ba93f2f 100644 --- a/st.c +++ b/st.c @@ -59,8 +59,8 @@ #define STR_ARG_SIZ 16 #define DRAW_BUF_SIZ 20*1024 #define UTF_SIZ 4 -#define XK_NO_MOD UINT_MAX -#define XK_ANY_MOD 0 +#define XK_ANY_MOD UINT_MAX +#define XK_NO_MOD 0 #define REDRAW_TIMEOUT (80*1000) /* 80 ms */ @@ -228,6 +228,10 @@ typedef struct { KeySym k; uint mask; char s[ESC_BUF_SIZ]; + /* three valued logic variables: 0 indifferent, 1 on, -1 off */ + signed char appkey; /* application keypad */ + signed char appcursor; /* application cursor */ + signed char crlf; /* crlf mode */ } Key; /* TODO: use better name for vars... */ @@ -261,6 +265,7 @@ typedef struct { /* function definitions used in config.h */ static void xzoom(const Arg *); +static void selpaste(const Arg *); /* Config.h for applying patches and the configuration. */ #include "config.h" @@ -360,7 +365,6 @@ static void selrequest(XEvent *); static void selinit(void); static inline bool selected(int, int); static void selcopy(void); -static void selpaste(void); static void selscroll(int, int); static int utf8decode(char *, long *); @@ -750,7 +754,7 @@ selnotify(XEvent *e) { } void -selpaste(void) { +selpaste(const Arg *dummy) { XConvertSelection(xw.dpy, XA_PRIMARY, sel.xtarget, XA_PRIMARY, xw.win, CurrentTime); } @@ -821,7 +825,7 @@ brelease(XEvent *e) { } if(e->xbutton.button == Button2) { - selpaste(); + selpaste(NULL); } else if(e->xbutton.button == Button1) { sel.mode = 0; getbuttoninfo(e, NULL, &sel.ex, &sel.ey); @@ -2096,11 +2100,19 @@ tputc(char *c, int len) { sel.bx = -1; if(IS_SET(MODE_WRAP) && term.c.state & CURSOR_WRAPNEXT) tnewline(1); /* always go to first col */ + + if(IS_SET(MODE_INSERT) && term.c.x+1 < term.col) { + memmove(&term.line[term.c.y][term.c.x+1], + &term.line[term.c.y][term.c.x], + (term.col - term.c.x - 1) * sizeof(Glyph)); + } + tsetchar(c, &term.c.attr, term.c.x, term.c.y); - if(term.c.x+1 < term.col) + if(term.c.x+1 < term.col) { tmoveto(term.c.x+1, term.c.y); - else + } else { term.c.state |= CURSOR_WRAPNEXT; + } } int @@ -2686,18 +2698,41 @@ focus(XEvent *ev) { char* kmap(KeySym k, uint state) { - int i; uint mask; + Key *kp; state &= ~Mod2Mask; - for(i = 0; i < LEN(key); i++) { - mask = key[i].mask; + for(kp = key; kp < key + LEN(key); kp++) { + mask = kp->mask; + + if(kp->k != k) + continue; - if(key[i].k == k && ((state & mask) == mask - || (mask == XK_NO_MOD && !state))) { - return (char*)key[i].s; + if(mask == XK_NO_MOD && state) + continue; + if(mask != XK_ANY_MOD && mask != XK_NO_MOD && !state) + continue; + if((state & mask) != state) + continue; + + if((kp->appkey < 0 && IS_SET(MODE_APPKEYPAD)) || + (kp->appkey > 0 && !IS_SET(MODE_APPKEYPAD))) { + continue; } + + if((kp->appcursor < 0 && IS_SET(MODE_APPCURSOR)) || + (kp->appcursor > 0 && !IS_SET(MODE_APPCURSOR))) { + continue; + } + + if((kp->crlf < 0 && IS_SET(MODE_CRLF)) || + (kp->crlf > 0 && !IS_SET(MODE_CRLF))) { + continue; + } + + return kp->s; } + return NULL; } @@ -2706,14 +2741,12 @@ kpress(XEvent *ev) { XKeyEvent *e = &ev->xkey; KeySym ksym; char xstr[31], buf[32], *customkey, *cp = buf; - int len, meta, shift, i; + int len, i; Status status; if (IS_SET(MODE_KBDLOCK)) return; - meta = e->state & Mod1Mask; - shift = e->state & ShiftMask; len = XmbLookupString(xw.xic, e, xstr, sizeof(xstr), &ksym, &status); /* 1. shortcuts */ @@ -2732,47 +2765,16 @@ kpress(XEvent *ev) { memcpy(buf, customkey, len); /* 2. hardcoded (overrides X lookup) */ } else { - switch(ksym) { - case XK_Up: - case XK_Down: - case XK_Left: - case XK_Right: - /* XXX: shift up/down doesn't work */ - sprintf(buf, "\033%c%c", - IS_SET(MODE_APPKEYPAD) ? 'O' : '[', - (shift ? "dacb":"DACB")[ksym - XK_Left]); - len = 3; - break; - case XK_Insert: - if(shift) { - selpaste(); - return; - } - memcpy(buf, xstr, len); - break; - case XK_Return: - len = 0; - if(meta) - *cp++ = '\033', len++; - - *cp++ = '\r', len++; - - if(IS_SET(MODE_CRLF)) - *cp = '\n', len++; - break; - /* 3. X lookup */ - default: - if(len == 0) - return; + if(len == 0) + return; - if (len == 1 && meta) - *cp++ = '\033'; + if (len == 1 && e->state & Mod1Mask) + *cp++ = '\033'; - memcpy(cp, xstr, len); - len = cp - buf + len; - break; - } + memcpy(cp, xstr, len); + len = cp - buf + len; } + ttywrite(buf, len); if(IS_SET(MODE_ECHO)) techo(buf, len); @@ -2887,7 +2889,7 @@ main(int argc, char *argv[]) { opt_class = argv[i]; break; case 'e': - /* eat every remaining arguments */ + /* eat all remaining arguments */ if(++i < argc) opt_cmd = &argv[i]; goto run; @@ -2942,6 +2944,7 @@ run: ttynew(); selinit(); run(); + return 0; }