tDisplay text item via default PAGER - sacc - sacc (saccomys): simple gopher cl… | |
Log | |
Files | |
Refs | |
LICENSE | |
--- | |
commit 081653074e69ae028be354aee7eca0c178a34d96 | |
parent b5c402515b3273d7889236698fea95dd57190326 | |
Author: Quentin Rameau <[email protected]> | |
Date: Sun, 2 Jul 2017 18:55:57 +0200 | |
Display text item via default PAGER | |
Diffstat: | |
sacc.c | 42 +++++++++++++++++++++++++++---- | |
ui_ti.c | 46 +++++++++++++------------------ | |
ui_txt.c | 37 +++++++++++++------------------ | |
3 files changed, 71 insertions(+), 54 deletions(-) | |
--- | |
diff --git a/sacc.c b/sacc.c | |
t@@ -9,6 +9,7 @@ | |
#include <unistd.h> | |
#include <sys/socket.h> | |
#include <sys/types.h> | |
+#include <sys/wait.h> | |
#include "common.h" | |
t@@ -116,6 +117,28 @@ typedisplay(char t) | |
} | |
} | |
+static void | |
+displaytextitem(Item *item) | |
+{ | |
+ FILE *pagerin; | |
+ int pid, wpid; | |
+ | |
+ uicleanup(); | |
+ switch (pid = fork()) { | |
+ case -1: | |
+ fprintf(stderr, "Couldn't fork.\n"); | |
+ return; | |
+ case 0: | |
+ pagerin = popen("$PAGER", "we"); | |
+ fputs(item->raw, pagerin); | |
+ exit(pclose(pagerin)); | |
+ default: | |
+ while ((wpid = wait(NULL)) >= 0 && wpid != pid) | |
+ ; | |
+ } | |
+ uisetup(); | |
+} | |
+ | |
static char * | |
pickfield(char **raw, char sep) | |
{ | |
t@@ -303,7 +326,7 @@ dig(Item *entry, Item *item) | |
int sock; | |
if (item->raw) /* already in cache */ | |
- return 1; | |
+ return item->type; | |
if (!item->entry) | |
item->entry = entry; | |
t@@ -331,7 +354,7 @@ dig(Item *entry, Item *item) | |
return 0; | |
} | |
} | |
- return 1; | |
+ return item->type; | |
} | |
static void | |
t@@ -340,12 +363,21 @@ delve(Item *hole) | |
Item *entry = hole; | |
while (hole) { | |
- if (dig(entry, hole)) { | |
- display(hole); | |
- } else { | |
+ switch (dig(entry, hole)) { | |
+ case '0': | |
+ displaytextitem(hole); | |
+ hole = entry; | |
+ break; | |
+ case '1': | |
+ break; | |
+ default: | |
fprintf(stderr, "Couldn't get %s:%s/%c%s\n", hole->hos… | |
hole->port, hole->type, hole->selector… | |
+ hole = entry; | |
+ break; | |
} | |
+ | |
+ display(hole); | |
entry = hole; | |
hole = selectitem(hole); | |
} | |
diff --git a/ui_ti.c b/ui_ti.c | |
t@@ -48,38 +48,31 @@ display(Item *item) | |
Item **items; | |
size_t i, curln, lastln, nitems, printoff; | |
- if (item->type > '1') | |
+ if (item->type != '1') | |
return; | |
putp(tparm(clear_screen)); | |
putp(tparm(save_cursor)); | |
- switch (item->type) { | |
- case '0': | |
- puts(item->raw); | |
- break; | |
- case '1': | |
- items = item->dir->items; | |
- nitems = item->dir->nitems; | |
- printoff = item->printoff; | |
- curln = item->curline; | |
- lastln = printoff + lines; | |
- | |
- for (i = printoff; i < nitems && i < lastln; ++i) { | |
- if (item = items[i]) { | |
- if (i != printoff) | |
- putp(tparm(cursor_down)); | |
- if (i == curln) { | |
- putp(tparm(save_cursor)); | |
- putp(tparm(enter_standout_mode)); | |
- } | |
- printitem(item); | |
- putp(tparm(column_address, 0)); | |
- if (i == curln) | |
- putp(tparm(exit_standout_mode)); | |
+ items = item->dir->items; | |
+ nitems = item->dir->nitems; | |
+ printoff = item->printoff; | |
+ curln = item->curline; | |
+ lastln = printoff + lines; | |
+ | |
+ for (i = printoff; i < nitems && i < lastln; ++i) { | |
+ if (item = items[i]) { | |
+ if (i != printoff) | |
+ putp(tparm(cursor_down)); | |
+ if (i == curln) { | |
+ putp(tparm(save_cursor)); | |
+ putp(tparm(enter_standout_mode)); | |
} | |
+ printitem(item); | |
+ putp(tparm(column_address, 0)); | |
+ if (i == curln) | |
+ putp(tparm(exit_standout_mode)); | |
} | |
- break; | |
} | |
putp(tparm(restore_cursor)); | |
t@@ -171,4 +164,4 @@ selectitem(Item *entry) | |
} | |
} | |
-} | |
-\ No newline at end of file | |
+} | |
diff --git a/ui_txt.c b/ui_txt.c | |
t@@ -45,31 +45,24 @@ display(Item *item) | |
size_t i, lines, nitems; | |
int ndigits; | |
- if (item->type > '1') | |
+ if (item->type != '1') | |
return; | |
- switch (item->type) { | |
- case '0': | |
- puts(item->raw); | |
- break; | |
- case '1': | |
- items = item->dir->items; | |
- nitems = item->dir->nitems; | |
- lines = item->printoff + termlines(); | |
- ndigits = (nitems < 10) ? 1 : (nitems < 100) ? 2 : 3; | |
- | |
- for (i = item->printoff; i < nitems && i < lines; ++i) { | |
- if (item = items[i]) { | |
- printf("%*d %-4s%c %s\n", ndigits, i+1, | |
- item->type != 'i' ? | |
- typedisplay(item->type) : "", | |
- item->type > '1' ? '|' : '+', | |
- items[i]->username); | |
- } else { | |
- printf("%*d !! |\n", ndigits, i+1); | |
- } | |
+ items = item->dir->items; | |
+ nitems = item->dir->nitems; | |
+ lines = item->printoff + termlines(); | |
+ ndigits = (nitems < 10) ? 1 : (nitems < 100) ? 2 : 3; | |
+ | |
+ for (i = item->printoff; i < nitems && i < lines; ++i) { | |
+ if (item = items[i]) { | |
+ printf("%*d %-4s%c %s\n", ndigits, i+1, | |
+ item->type != 'i' ? | |
+ typedisplay(item->type) : "", | |
+ item->type > '1' ? '|' : '+', | |
+ items[i]->username); | |
+ } else { | |
+ printf("%*d !! |\n", ndigits, i+1); | |
} | |
- break; | |
} | |
} | |