#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))
};
enum cursor_movement {
- CURSOR_UP,
- CURSOR_DOWN,
- CURSOR_LEFT,
- CURSOR_RIGHT,
CURSOR_SAVE,
CURSOR_LOAD
};
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);
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)
+
+ 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
}
}
+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;
+ int i;
+
+ /* Check for mapped keys out of X11 function keys. */
+ for(i = 0; i < LEN(mappedkeys); i++) {
+ if(mappedkeys[i] == k)
+ break;
+ }
+ if(i == LEN(mappedkeys)) {
+ if((k & 0xFFFF) < 0xFF00)
+ return NULL;
+ }
- state &= ~Mod2Mask;
for(kp = key; kp < key + LEN(key); kp++) {
mask = kp->mask;
if(kp->k != k)
continue;
- if(mask == XK_NO_MOD && state)
- continue;
- if(mask != XK_ANY_MOD && mask != XK_NO_MOD && !state)
- continue;
- if((state & mask) != state)
+ if(!match(mask, state))
continue;
if((kp->appkey < 0 && IS_SET(MODE_APPKEYPAD)) ||
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;
}
}