| Add home, end, page up, page down scrolling - sacc - sacc(omys), simple console gopher client |
| Date: Fri, 7 Jul 2017 20:53:56 +0200
Add home, end, page up, page down scrolling
Thanks to Hiltjo for the suggestion and work on the patch!
Diffstat:
M ui_ti.c | 69 ++++++++++++++++++++++++++++++
M ui_txt.c | 18 +++++++++++++++---
2 files changed, 84 insertions(+), 3 deletions(-)
--- |
| @@ -10,6 +10,10 @@ static struct termios tsave;
/* navigation keys */
#define _key_lndown 'j' /* move one line down */
#define _key_lnup 'k' /* move one line up */
+#define _key_pgdown ' ' /* move one screen down */
+#define _key_pgup 'b' /* move one screen down */
+#define _key_home 'g' /* move to the top of page */
+#define _key_end 'G' /* move to the bottom of page */
#define _key_pgnext 'l' /* view highlighted item */
#define _key_pgprev 'h' /* view previous item */
#define _key_fetch 'L' /* refetch current item */
@@ -165,10 +169,44 @@ movecurline(Item *item, int l)
fflush(stdout);
}
+static void
+jumptoline(Item *entry, ssize_t offset)
+{
+ size_t nitems;
+ int plines = lines-2;
+
+ if (!entry->dir)
+ return;
+
+ nitems = entry->dir->nitems;
+
+ if (offset <= 0) {
+ if (!entry->curline)
+ return;
+ entry->printoff = 0;
+ entry->curline = 0;
+ } else if (offset + plines > nitems) {
+ if (entry->curline == nitems-1)
+ return;
+ if (nitems > plines)
+ entry->printoff = nitems-1 - plines;
+ else
+ entry->printoff = 0;
+ entry->curline = nitems-1;
+ } else {
+ entry->printoff = offset;
+ entry->curline = entry->printoff;
+ }
+
+ display(entry);
+ return;
+}
+
Item *
selectitem(Item *entry)
{
Dir *dir = entry->dir;
+ int plines = lines-2;
for (;;) {
switch (getchar()) {
@@ -182,6 +220,18 @@ selectitem(Item *entry)
continue;
}
switch (getchar()) {
+ case '4':
+ if (getchar() != '~')
+ continue;
+ goto end;
+ case '5':
+ if (getchar() != '~')
+ continue;
+ goto pgup;
+ case '6':
+ if (getchar() != '~')
+ continue;
+ goto pgdown;
case 'A':
goto lnup;
case 'B':
@@ -190,6 +240,8 @@ selectitem(Item *entry)
goto pgnext;
case 'D':
goto pgprev;
+ case 'H':
+ goto home;
case 0x1b:
goto quit;
}
@@ -207,14 +259,31 @@ selectitem(Item *entry)
lndown:
movecurline(entry, 1);
continue;
+ case _key_pgdown:
+ pgdown:
+ jumptoline(entry, entry->printoff + plines);
+ continue;
+ case _key_end:
+ end:
+ jumptoline(entry, entry->dir->nitems);
+ continue;
case _key_lnup:
lnup:
movecurline(entry, -1);
continue;
+ case _key_pgup:
+ pgup:
+ jumptoline(entry, entry->printoff - plines);
+ continue;
+ case _key_home:
+ home:
+ jumptoline(entry, 0);
+ continue;
case _key_quit:
quit:
return NULL;
case _key_fetch:
+ fetch:
if (entry->raw)
continue;
return entry; |
| @@ -40,6 +40,8 @@ help(void)
"0: browse previous item.\n"
"n: show next page.\n"
"p: show previous page.\n"
+ "t: go to the top of the page\n"
+ "b: go to the bottom of the page\n"
"!: refetch failed item.\n"
"^D, q: quit.\n"
"h: this help.");
@@ -98,6 +100,7 @@ selectitem(Item *entry)
nitems = entry->dir ? entry->dir->nitems : 0;
do {
+ item = -1;
printstatus(entry);
fflush(stdout);
@@ -123,14 +126,23 @@ selectitem(Item *entry)
entry->printoff = 0;
return entry;
}
-
+ if (!strcmp(buf, "b\n")) {
+ lines = termlines();
+ if (nitems > lines)
+ entry->printoff = nitems - lines;
+ else
+ entry->printoff = 0;
+ return entry;
+ }
+ if (!strcmp(buf, "t\n")) {
+ entry->printoff = 0;
+ return entry;
+ }
if (!strcmp(buf, "!\n")) {
if (entry->raw)
continue;
return entry;
}
-
- item = -1;
if (!strcmp(buf, "h\n")) {
help();
continue; |