implement SGR mouse-encoding and improve mouse encoding in general - sfeed_curs… | |
git clone git://git.codemadness.org/sfeed_curses | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit d59a1ec6aa2733c24906e37a0cf18170ceb14f5f | |
parent abb3c25a40a627f2d337de1303ef9ab0a119f1d3 | |
Author: Hiltjo Posthuma <[email protected]> | |
Date: Fri, 19 Mar 2021 12:28:41 +0100 | |
implement SGR mouse-encoding and improve mouse encoding in general | |
- Fix: Correctly encoding buttons 6 and 7. | |
- Fix: a typo (substract -> subtract). | |
- Feature: when the terminal emulator supports SGR mouse-encoding then it can | |
encode x, y values beyond 224 columns and rows. This is useful for big screen… | |
- Feature: map the side-buttons (back, forward) to switch panes. Useful in the … | |
- Feature: implement key masks (shift, meta, ctrl), unused though. | |
Diffstat: | |
M sfeed_curses.1 | 6 +++++- | |
M sfeed_curses.c | 84 ++++++++++++++++++++++++-----… | |
2 files changed, 71 insertions(+), 19 deletions(-) | |
--- | |
diff --git a/sfeed_curses.1 b/sfeed_curses.1 | |
@@ -1,4 +1,4 @@ | |
-.Dd March 16, 2021 | |
+.Dd March 19, 2021 | |
.Dt SFEED_CURSES 1 | |
.Os | |
.Sh NAME | |
@@ -164,6 +164,10 @@ Items pane: pipe the item. | |
Scroll one page up. | |
.It SCROLL DOWN | |
Scroll one page down. | |
+.It FORWARD | |
+Switch to the items pane. | |
+.It BACKWARD | |
+Switch to the feeds pane. | |
.El | |
.Sh SIGNALS | |
.Bl -tag -width Ds | |
diff --git a/sfeed_curses.c b/sfeed_curses.c | |
@@ -514,6 +514,7 @@ void | |
mousemode(int on) | |
{ | |
ttywrite(on ? "\x1b[?1000h" : "\x1b[?1000l"); /* xterm mouse mode */ | |
+ ttywrite(on ? "\x1b[?1006h" : "\x1b[?1006l"); /* SGR mouse mode (if su… | |
} | |
void | |
@@ -1656,7 +1657,7 @@ draw(void) | |
} | |
void | |
-mousereport(int button, int release, int x, int y) | |
+mousereport(int button, int release, int mask, int x, int y) | |
{ | |
struct pane *p; | |
struct feed *f; | |
@@ -1728,6 +1729,20 @@ mousereport(int button, int release, int x, int y) | |
case 4: /* scroll down */ | |
pane_scrollpage(p, button == 3 ? -1 : +1); | |
break; | |
+ case 7: /* side-button: backward */ | |
+ if (selpane == PaneFeeds) | |
+ break; | |
+ selpane = PaneFeeds; | |
+ if (layout == LayoutMonocle) | |
+ updategeom(); | |
+ break; | |
+ case 8: /* side-button: forward */ | |
+ if (selpane == PaneItems) | |
+ break; | |
+ selpane = PaneItems; | |
+ if (layout == LayoutMonocle) | |
+ updategeom(); | |
+ break; | |
} | |
return; /* do not bubble events */ | |
} | |
@@ -1975,7 +1990,7 @@ main(int argc, char *argv[]) | |
size_t i; | |
char *name, *tmp; | |
char *search = NULL; /* search text */ | |
- int ch, button, fd, x, y, release; | |
+ int button, ch, fd, mask, release, x, y; | |
off_t off; | |
#ifdef __OpenBSD__ | |
@@ -2066,31 +2081,64 @@ main(int argc, char *argv[]) | |
if ((ch = readch()) < 0) | |
goto event; | |
switch (ch) { | |
- case 'M': /* reported mouse event */ | |
+ case 'M': /* mouse: X10 encoding */ | |
+ if ((ch = readch()) < 0) | |
+ goto event; | |
+ button = ch - 32; | |
+ if ((ch = readch()) < 0) | |
+ goto event; | |
+ x = ch - 32; | |
if ((ch = readch()) < 0) | |
goto event; | |
+ y = ch - 32; | |
+ | |
+ mask = button & (4 | 8 | 16); /* shift, meta, … | |
+ button &= ~mask; /* unset key mask */ | |
+ | |
/* button numbers (0 - 2) encoded in lowest 2 … | |
release does not indicate which button (so … | |
Handle extended buttons like scrollwheels | |
- and side-buttons by substracting 64 in each… | |
- for (i = 0, ch -= 32; ch >= 64; i += 3) | |
- ch -= 64; | |
- | |
+ and side-buttons by subtracting 64 in each … | |
release = 0; | |
- button = (ch & 3) + i; | |
- if (!i && button == 3) { | |
- release = 1; | |
+ if (button == 3) { | |
button = -1; | |
+ release = 1; | |
+ } else if (button >= 128) { | |
+ button -= 121; | |
+ } else if (button >= 64) { | |
+ button -= 61; | |
+ } | |
+ mousereport(button, release, mask, x - 1, y - … | |
+ break; | |
+ case '<': /* mouse: SGR encoding */ | |
+ for (button = 0; ; button *= 10, button += ch … | |
+ if ((ch = readch()) < 0) | |
+ goto event; | |
+ else if (ch == ';') | |
+ break; | |
} | |
+ for (x = 0; ; x *= 10, x += ch - '0') { | |
+ if ((ch = readch()) < 0) | |
+ goto event; | |
+ else if (ch == ';') | |
+ break; | |
+ } | |
+ for (y = 0; ; y *= 10, y += ch - '0') { | |
+ if ((ch = readch()) < 0) | |
+ goto event; | |
+ else if (ch == 'm' || ch == 'M') | |
+ break; /* release or press */ | |
+ } | |
+ release = ch == 'm'; | |
+ mask = button & (4 | 8 | 16); /* shift, meta, … | |
+ button &= ~mask; /* unset key mask */ | |
- /* X10 mouse-encoding */ | |
- if ((ch = readch()) < 0) | |
- goto event; | |
- x = ch; | |
- if ((ch = readch()) < 0) | |
- goto event; | |
- y = ch; | |
- mousereport(button, release, x - 33, y - 33); | |
+ if (button >= 128) | |
+ button -= 121; | |
+ else if (button >= 64) | |
+ button -= 61; | |
+ | |
+ mousereport(button, release, mask, x - 1, y - … | |
break; | |
case 'A': goto keyup; /* arrow up */ | |
case 'B': goto keydown; /* arrow down */ |