aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--driver-ti.c22
-rw-r--r--termkey-internal.h1
-rw-r--r--termkey.c16
3 files changed, 29 insertions, 10 deletions
diff --git a/driver-ti.c b/driver-ti.c
index 3d37e1a..ee9a454 100644
--- a/driver-ti.c
+++ b/driver-ti.c
@@ -311,16 +311,18 @@ static TermKeyResult peekkey(TermKey *tk, void *info, TermKeyKey *key, int force
return TERMKEY_RES_KEY;
}
else if(p->type == TYPE_MOUSE) {
- if(tk->buffcount - pos < 3)
- return TERMKEY_RES_AGAIN;
-
- key->type = TERMKEY_TYPE_MOUSE;
- key->code.mouse.buttons = CHARAT(pos+0) - 0x20;
- key->code.mouse.col = CHARAT(pos+1) - 0x20;
- key->code.mouse.line = CHARAT(pos+2) - 0x20;
- key->modifiers = 0;
- *nbytep = pos+3;
- return TERMKEY_RES_KEY;
+ tk->buffstart += pos;
+ tk->buffcount -= pos;
+
+ TermKeyResult mouse_result = (*tk->method.peekkey_mouse)(tk, key, nbytep);
+
+ tk->buffstart -= pos;
+ tk->buffcount += pos;
+
+ if(mouse_result == TERMKEY_RES_KEY)
+ *nbytep += pos;
+
+ return mouse_result;
}
}
diff --git a/termkey-internal.h b/termkey-internal.h
index 8286c36..608457b 100644
--- a/termkey-internal.h
+++ b/termkey-internal.h
@@ -58,6 +58,7 @@ struct _TermKey {
struct {
void (*emit_codepoint)(TermKey *tk, long codepoint, TermKeyKey *key);
TermKeyResult (*peekkey_simple)(TermKey *tk, TermKeyKey *key, int force, size_t *nbytes);
+ TermKeyResult (*peekkey_mouse)(TermKey *tk, TermKeyKey *key, size_t *nbytes);
} method;
};
diff --git a/termkey.c b/termkey.c
index b0a908a..529bbf9 100644
--- a/termkey.c
+++ b/termkey.c
@@ -35,6 +35,7 @@ static struct TermKeyDriver *drivers[] = {
// static void eat_bytes(TermKey *tk, size_t count);
static void emit_codepoint(TermKey *tk, long codepoint, TermKeyKey *key);
static TermKeyResult peekkey_simple(TermKey *tk, TermKeyKey *key, int force, size_t *nbytes);
+static TermKeyResult peekkey_mouse(TermKey *tk, TermKeyKey *key, size_t *nbytes);
static TermKeySym register_c0(TermKey *tk, TermKeySym sym, unsigned char ctrl, const char *name);
static TermKeySym register_c0_full(TermKey *tk, TermKeySym sym, int modifier_set, int modifier_mask, unsigned char ctrl, const char *name);
@@ -165,6 +166,7 @@ static TermKey *termkey_new_full(int fd, int flags, size_t buffsize, int waittim
tk->method.emit_codepoint = &emit_codepoint;
tk->method.peekkey_simple = &peekkey_simple;
+ tk->method.peekkey_mouse = &peekkey_mouse;
for(i = 0; keynames[i].name; i++)
termkey_register_keyname(tk, keynames[i].sym, keynames[i].name);
@@ -631,6 +633,20 @@ static TermKeyResult peekkey_simple(TermKey *tk, TermKeyKey *key, int force, siz
}
}
+static TermKeyResult peekkey_mouse(TermKey *tk, TermKeyKey *key, size_t *nbytep)
+{
+ if(tk->buffcount < 3)
+ return TERMKEY_RES_AGAIN;
+
+ key->type = TERMKEY_TYPE_MOUSE;
+ key->code.mouse.buttons = CHARAT(0) - 0x20;
+ key->code.mouse.col = CHARAT(1) - 0x20;
+ key->code.mouse.line = CHARAT(2) - 0x20;
+ key->modifiers = 0;
+ *nbytep = 3;
+ return TERMKEY_RES_KEY;
+}
+
#ifdef DEBUG
static void print_buffer(TermKey *tk)
{