From 1463049d32bfa7c202fa6e064790282c5b5ffdd3 Mon Sep 17 00:00:00 2001 From: nick black Date: Wed, 1 Sep 2021 19:40:51 -0400 Subject: [PATCH] add ncinput_shovel for GPM #1405 --- src/lib/input.c | 24 ++++++++++++++++++++++++ src/lib/input.h | 2 ++ src/lib/render.c | 7 ++----- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/lib/input.c b/src/lib/input.c index e085805de..ef8bc3ffb 100644 --- a/src/lib/input.c +++ b/src/lib/input.c @@ -535,6 +535,29 @@ handle_queued_input(ncinputlayer* nc, ncinput* ni, return ret; } +int ncinput_shovel(ncinputlayer* ni, const unsigned char* buf, size_t len){ + int ret = -1; + pthread_mutex_lock(&ni->lock); + size_t space = input_queue_space(ni); + if(len < space){ + size_t spaceback = sizeof(ni->inputbuf) / sizeof(*ni->inputbuf) - ni->inputbuf_write_at; + memcpy(ni->inputbuf + ni->inputbuf_write_at, buf, spaceback); + len -= spaceback; + ni->inputbuf_write_at += spaceback; + if(len){ + memcpy(ni->inputbuf, buf + spaceback, len); + ni->inputbuf_write_at = len; + } + ni->inputbuf_occupied += len + spaceback; + ret = 0; + } + pthread_mutex_unlock(&ni->lock); + if(ret < 0){ + logwarn("dropped %lluB event\n", (long long unsigned)len); + } + return ret; +} + // this is the only function which actually reads, and it can be called from // either our context (looking for cursor reports) or the user's. all it does // is attempt to fill up the input ringbuffer, exiting either when that @@ -1788,6 +1811,7 @@ scan_for_clrs(ncinputlayer* ni){ void ncinput_extract_clrs(tinfo* ti){ ncinputlayer* ni = &ti->input; do{ + // FIXME doesn't this need locking? if(ni->inputbuf_occupied){ scan_for_clrs(ni); if(ni->creport_queue){ diff --git a/src/lib/input.h b/src/lib/input.h index d68dd8dfb..420d5517a 100644 --- a/src/lib/input.h +++ b/src/lib/input.h @@ -60,6 +60,8 @@ int cbreak_mode(struct tinfo* ti); // appropriate. we can be interrupted by a new user context. void ncinput_extract_clrs(struct tinfo* ti); +int ncinput_shovel(struct ncinputlayer* ni, const unsigned char* buf, size_t len); + #ifdef __cplusplus } #endif diff --git a/src/lib/render.c b/src/lib/render.c index a511b82ec..9c7a591c4 100644 --- a/src/lib/render.c +++ b/src/lib/render.c @@ -1164,11 +1164,8 @@ rasterize_core(notcurses* nc, const ncpile* p, fbuf* f, unsigned phase){ } rvec[damageidx].s.damaged = 0; rvec[damageidx].s.p_beats_sprixel = 0; - ++nc->rstate.x; - if(srccell->width >= 2){ - x += srccell->width - 1; - nc->rstate.x += srccell->width - 1; - } + nc->rstate.x += srccell->width; + x += srccell->width - 1; } //fprintf(stderr, "damageidx: %ld\n", damageidx); }