From 315edacf0853c5df573e87a3f805f74ff2e49fc6 Mon Sep 17 00:00:00 2001 From: nick black Date: Tue, 14 Sep 2021 08:33:18 -0400 Subject: [PATCH] [input] handle unicode-encoded mouse events --- src/lib/in.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/src/lib/in.c b/src/lib/in.c index 0924eb886..b18b0d954 100644 --- a/src/lib/in.c +++ b/src/lib/in.c @@ -84,6 +84,9 @@ typedef enum { STATE_CURSOR_COL, // reading numeric to 'R', 't', 'u', or ';' STATE_PIXELS_WIDTH, // reading text area width in pixels to ';' STATE_CELLS_WIDTH, // reading text area width in cells to ';' + STATE_MOUSE, // got '<', looking for mouse coordinates + STATE_MOUSE2, // got mouse click modifiers + STATE_MOUSE3, // got first mouse coordinate } initstates_e; // local state for the input thread. don't put this large struct on the stack. @@ -418,6 +421,41 @@ set_sda_version(inputctx* ictx){ return buf; } +// ictx->numeric, ictx->p3, and ictx->p2 have the two parameters +static void +mouse_click(inputctx* ictx){ + fprintf(stderr, "MOUSE MOUSE: %d %d %d\n", ictx->p2, ictx->p3, ictx->numeric); + pthread_mutex_lock(&ictx->ilock); + if(ictx->ivalid == ictx->isize){ + pthread_mutex_unlock(&ictx->ilock); + logerror("dropping mouse click 0x%02x %d %d\n", ictx->p2, ictx->p3, ictx->numeric); + return; + } + ncinput* ni = ictx->inputs + ictx->iwrite; + if(ictx->p2 >= 0 && ictx->p2 < 64){ + if(ictx->p2 % 4 == 3){ + ni->id = NCKEY_RELEASE; + }else{ + ni->id = NCKEY_BUTTON1 + (ictx->p2 % 4); + } + }else if(ictx->p2 >= 64 && ictx->p2 < 128){ + ni->id = NCKEY_BUTTON4 + (ictx->p2 % 4); + }else if(ictx->p2 >= 128 && ictx->p2 < 192){ + ni->id = NCKEY_BUTTON8 + (ictx->p2 % 4); + } + ni->ctrl = ictx->p2 & 0x10; + ni->alt = ictx->p2 & 0x08; + ni->shift = ictx->p2 & 0x04; + ni->x = ictx->p3; + ni->y = ictx->numeric; + if(++ictx->iwrite == ictx->isize){ + ictx->iwrite = 0; + } + ++ictx->ivalid; + pthread_mutex_unlock(&ictx->ilock); + pthread_cond_broadcast(&ictx->icond); +} + // ictx->numeric and ictx->p2 have the two parameters static void kitty_kbd(inputctx* ictx){ @@ -546,6 +584,8 @@ pump_control_read(inputctx* ictx, unsigned char c){ ictx->state = STATE_SDA; } } + }else if(c == '<'){ + ictx->state = STATE_MOUSE; }else if(isdigit(c)){ if(ruts_numeric(&ictx->numeric, c)){ return -1; @@ -558,6 +598,44 @@ pump_control_read(inputctx* ictx, unsigned char c){ ictx->state = STATE_NULL; } break; + case STATE_MOUSE: + if(isdigit(c)){ + if(ruts_numeric(&ictx->numeric, c)){ + return -1; + } + }else if(c == ';'){ + ictx->state = STATE_MOUSE2; + ictx->p2 = ictx->numeric; + ictx->numeric = 0; + }else{ + ictx->state = STATE_NULL; + } + break; + case STATE_MOUSE2: + if(isdigit(c)){ + if(ruts_numeric(&ictx->numeric, c)){ + return -1; + } + }else if(c == ';'){ + ictx->state = STATE_MOUSE3; + ictx->p3 = ictx->numeric; + ictx->numeric = 0; + }else{ + ictx->state = STATE_NULL; + } + break; + case STATE_MOUSE3: + if(isdigit(c)){ + if(ruts_numeric(&ictx->numeric, c)){ + return -1; + } + }else if(c == 'M'){ + mouse_click(ictx); + ictx->state = STATE_NULL; + }else{ + ictx->state = STATE_NULL; + } + break; case STATE_CURSOR_COL: if(isdigit(c)){ if(ruts_numeric(&ictx->numeric, c)){