From 4856431ff33e1a44fc056223a8b559fbebb8f118 Mon Sep 17 00:00:00 2001 From: nick black Date: Tue, 5 Oct 2021 05:53:08 -0400 Subject: [PATCH] [input] drop mouse events in right/bottom margins #2233 --- src/lib/direct.c | 2 +- src/lib/in.c | 23 +++++++++++++++++------ src/lib/in.h | 6 +++--- src/lib/notcurses.c | 1 + src/lib/termdesc.c | 7 ++++--- src/lib/termdesc.h | 2 +- 6 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/lib/direct.c b/src/lib/direct.c index f8eca0758..1e84120b9 100644 --- a/src/lib/direct.c +++ b/src/lib/direct.c @@ -906,7 +906,7 @@ ncdirect* ncdirect_core_init(const char* termtype, FILE* outfp, uint64_t flags){ int cursor_x = -1; if(interrogate_terminfo(&ret->tcache, termtype, ret->ttyfp, utf8, 1, flags & NCDIRECT_OPTION_INHIBIT_CBREAK, - 0, &cursor_y, &cursor_x, &ret->stats, 0, 0, + 0, &cursor_y, &cursor_x, &ret->stats, 0, 0, 0, 0, flags & NCDIRECT_OPTION_DRAIN_INPUT)){ goto err; } diff --git a/src/lib/in.c b/src/lib/in.c index cabec0e80..477407fa4 100644 --- a/src/lib/in.c +++ b/src/lib/in.c @@ -61,6 +61,7 @@ typedef struct inputctx { #endif int lmargin, tmargin; // margins in use at left and top + int rmargin, bmargin; // margins in use at right and bottom automaton amata; @@ -387,6 +388,14 @@ mouse_click(inputctx* ictx, unsigned release, char follow){ logwarn("dropping click in margins %ld/%ld\n", y, x); return; } + if(x >= ictx->ti->dimx - (ictx->rmargin + ictx->lmargin)){ + logwarn("dropping click in margins %ld/%ld\n", y, x); + return; + } + if(y >= ictx->ti->dimy - (ictx->bmargin + ictx->tmargin)){ + logwarn("dropping click in margins %ld/%ld\n", y, x); + return; + } pthread_mutex_lock(&ictx->ilock); if(ictx->ivalid == ictx->isize){ pthread_mutex_unlock(&ictx->ilock); @@ -942,8 +951,8 @@ getpipes(int pipes[static 2]){ } static inline inputctx* -create_inputctx(tinfo* ti, FILE* infp, int lmargin, int tmargin, - ncsharedstats* stats, unsigned drain, +create_inputctx(tinfo* ti, FILE* infp, int lmargin, int tmargin, int rmargin, + int bmargin, ncsharedstats* stats, unsigned drain, int linesigs_enabled){ inputctx* i = malloc(sizeof(*i)); if(i){ @@ -978,6 +987,8 @@ create_inputctx(tinfo* ti, FILE* infp, int lmargin, int tmargin, i->midescape = 0; i->lmargin = lmargin; i->tmargin = tmargin; + i->rmargin = rmargin; + i->bmargin = bmargin; i->drain = drain; logdebug("input descriptors: %d/%d\n", i->stdinfd, i->termfd); return i; @@ -1617,10 +1628,10 @@ input_thread(void* vmarshall){ } int init_inputlayer(tinfo* ti, FILE* infp, int lmargin, int tmargin, - ncsharedstats* stats, unsigned drain, - int linesigs_enabled){ - inputctx* ictx = create_inputctx(ti, infp, lmargin, tmargin, stats, drain, - linesigs_enabled); + int rmargin, int bmargin, ncsharedstats* stats, + unsigned drain, int linesigs_enabled){ + inputctx* ictx = create_inputctx(ti, infp, lmargin, tmargin, rmargin, + bmargin, stats, drain, linesigs_enabled); if(ictx == NULL){ return -1; } diff --git a/src/lib/in.h b/src/lib/in.h index c381898e0..15dcd3983 100644 --- a/src/lib/in.h +++ b/src/lib/in.h @@ -14,9 +14,9 @@ struct inputctx; struct ncsharedstats; int init_inputlayer(struct tinfo* ti, FILE* infp, int lmargin, int tmargin, - struct ncsharedstats* stats, unsigned drain, - int linesigs_enabled) - __attribute__ ((nonnull (1, 2, 5))); + int rmargin, int bmargin, struct ncsharedstats* stats, + unsigned drain, int linesigs_enabled) + __attribute__ ((nonnull (1, 2, 7))); int stop_inputlayer(struct tinfo* ti); diff --git a/src/lib/notcurses.c b/src/lib/notcurses.c index 6e247aa9e..175100e0b 100644 --- a/src/lib/notcurses.c +++ b/src/lib/notcurses.c @@ -1080,6 +1080,7 @@ notcurses* notcurses_core_init(const notcurses_options* opts, FILE* outfp){ opts->flags & NCOPTION_NO_FONT_CHANGES, cursory, cursorx, &ret->stats, ret->margin_l, ret->margin_t, + ret->margin_r, ret->margin_b, opts->flags & NCOPTION_DRAIN_INPUT)){ fbuf_free(&ret->rstate.f); pthread_mutex_destroy(&ret->pilelock); diff --git a/src/lib/termdesc.c b/src/lib/termdesc.c index 2c0f3d7b7..f9ec3e19b 100644 --- a/src/lib/termdesc.c +++ b/src/lib/termdesc.c @@ -713,7 +713,8 @@ macos_early_matches(void){ int interrogate_terminfo(tinfo* ti, const char* termtype, FILE* out, unsigned utf8, unsigned noaltscreen, unsigned nocbreak, unsigned nonewfonts, int* cursor_y, int* cursor_x, ncsharedstats* stats, - int lmargin, int tmargin, unsigned draininput){ + int lmargin, int tmargin, int rmargin, int bmargin, + unsigned draininput){ int foolcursor_x, foolcursor_y; if(!cursor_x){ cursor_x = &foolcursor_x; @@ -790,8 +791,8 @@ int interrogate_terminfo(tinfo* ti, const char* termtype, FILE* out, unsigned ut linesigs_enabled = 0; } } - if(init_inputlayer(ti, stdin, lmargin, tmargin, stats, draininput, - linesigs_enabled)){ + if(init_inputlayer(ti, stdin, lmargin, tmargin, rmargin, bmargin, + stats, draininput, linesigs_enabled)){ goto err; } ti->sprixel_scale_height = 1; diff --git a/src/lib/termdesc.h b/src/lib/termdesc.h index f5b47b658..ff5df0acf 100644 --- a/src/lib/termdesc.h +++ b/src/lib/termdesc.h @@ -222,7 +222,7 @@ int interrogate_terminfo(tinfo* ti, const char* termtype, FILE* out, unsigned utf8, unsigned noaltscreen, unsigned nocbreak, unsigned nonewfonts, int* cursor_y, int* cursor_x, struct ncsharedstats* stats, int lmargin, int tmargin, - unsigned draininput) + int rmargin, int bmargin, unsigned draininput) __attribute__ ((nonnull (1, 3, 10))); void free_terminfo_cache(tinfo* ti);