X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=st.c;h=477a8f8beb4c73fd045be35a556df9b5388c7b42;hb=90e1427632d6c5852d10c8d2bafa787012903eb9;hp=dbbc1f69b66596683d4bf19d5f88e4c5d777b006;hpb=7474a2fc3785eb1aad00f8cf2b50711bbe1fff0b;p=st.git diff --git a/st.c b/st.c index dbbc1f6..477a8f8 100644 --- a/st.c +++ b/st.c @@ -59,13 +59,12 @@ #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 */ /* macros */ -#define CLEANMASK(mask) (mask & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask)) #define SERRNO strerror(errno) #define MIN(a, b) ((a) < (b) ? (a) : (b)) #define MAX(a, b) ((a) < (b) ? (b) : (a)) @@ -329,6 +328,7 @@ static void tsetmode(bool, bool, int *, int); static void tfulldirt(void); static void techo(char *, int); +static inline bool match(uint, uint); static void ttynew(void); static void ttyread(void); static void ttyresize(void); @@ -2100,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 @@ -2688,29 +2696,41 @@ focus(XEvent *ev) { } } +inline bool +match(uint mask, uint state) { + if(mask == XK_NO_MOD && state) + return false; + if(mask != XK_ANY_MOD && mask != XK_NO_MOD && !state) + return false; + if((state & mask) != state) + return false; + return true; +} + char* kmap(KeySym k, uint state) { uint mask; Key *kp; - state &= ~Mod2Mask; for(kp = key; kp < key + LEN(key); kp++) { mask = kp->mask; if(kp->k != k) continue; - if((state & mask) != mask && - (mask == XK_NO_MOD && state)) { + + if(!match(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; @@ -2718,6 +2738,7 @@ kmap(KeySym k, uint state) { return kp->s; } + return NULL; } @@ -2726,21 +2747,20 @@ kpress(XEvent *ev) { XKeyEvent *e = &ev->xkey; KeySym ksym; char xstr[31], buf[32], *customkey, *cp = buf; - int len, i; + int len; Status status; + Shortcut *bp; if (IS_SET(MODE_KBDLOCK)) return; len = XmbLookupString(xw.xic, e, xstr, sizeof(xstr), &ksym, &status); - + e->state &= ~Mod2Mask; /* 1. shortcuts */ - for(i = 0; i < LEN(shortcuts); i++) { - if((ksym == shortcuts[i].keysym) - && (CLEANMASK(shortcuts[i].mod) == \ - CLEANMASK(e->state)) - && shortcuts[i].func) { - shortcuts[i].func(&(shortcuts[i].arg)); + for(bp = shortcuts; bp < shortcuts + LEN(shortcuts); bp++) { + if(ksym == bp->keysym && match(bp->mod, e->state)) { + bp->func(&(bp->arg)); + return; } }