💾 Archived View for gemini.rmf-dev.com › repo › Vaati › Vgmi › files › f19c9485ea958f8d4bd94edc4144f… captured on 2022-07-16 at 17:12:16. Gemini links have been rewritten to link to archived content
-=-=-=-=-=-=-
0 /* See LICENSE file for copyright and license details. */
1 #include <strings.h>
2 #include <termbox.h>
3 #include "gemini.h"
4 #include "display.h"
5
6 void tb_colorline(int x, int y, uintattr_t color) {
7 for (int i=x; i<tb_width(); i++)
8 tb_set_cell(i, y, ' ', color, color);
9 }
10
11 void hide_query(char* url, char* urlbuf) {
12 int hide = 0;
13 int posx = 0;
14 for (int i=0; url[i] && i < 1024; i++) {
15 if (hide && (url[i] == '/')) {
16 hide = 0;
17 }
18 if (!hide) {
19 urlbuf[posx] = url[i];
20 posx++;
21 }
22 if (!hide && url[i] == '?') {
23 hide = 1;
24 urlbuf[posx] = '<';
25 urlbuf[posx+1] = '*';
26 urlbuf[posx+2] = '>';
27 posx+=3;
28 }
29 }
30 urlbuf[posx] = '\0';
31
32 }
33
34 void display() {
35 int bg = client.c256?252:TB_WHITE;
36 struct gmi_tab* tab = &client.tabs[client.tab];
37 struct gmi_page* page = &tab->page;
38 if (tab->request.ask == 2) {
39 tab->request.ask = display_ask(tab->request.info, tab->request.action);
40 }
41 tb_clear();
42
43 if (client.input.mode) {
44 if (page->code == 11 || page->code == 10)
45 tb_set_cursor(client.input.cursor+strnlen(client.input.label,
46 sizeof(client.input.label))+2, tb_height()-1);
47 else
48 tb_set_cursor(client.input.cursor, tb_height()-1);
49 }
50
51 if (page->code == 20 || page->code == 10 || page->code == 11) {
52 tb_clear();
53 if (client.tabs_count > 1) tab->scroll--;
54 page->lines = gmi_render(tab);
55 if (client.tabs_count > 1) tab->scroll++;
56 } else if (tab->error[0] != '\0') {
57 tb_printf(2, 1+(client.tabs_count>1), TB_RED, TB_DEFAULT,
58 "# %!s(MISSING)", tab->error);
59 }
60
61 // current tab
62 if (client.tabs_count > 1) {
63 tb_colorline(0, 0, bg);
64 tb_printf(0, 0, TB_BLACK, bg,
65 "Tabs : %!d(MISSING)/%!d(MISSING)", client.tab+1, client.tabs_count);
66 }
67
68 // current url
69 tb_colorline(0, tb_height()-2, bg);
70 char urlbuf[MAX_URL];
71 hide_query(tab->url, urlbuf);
72 tb_printf(0, tb_height()-2, TB_BLACK, bg, "%!s(MISSING) (%!s(MISSING))", urlbuf, tab->page.meta);
73
74 // Show selected link url
75 if (tab->selected != 0) {
76 int llen = strnlen(tab->selected_url, sizeof(tab->selected_url));
77 tb_printf(tb_width()-llen-5, tb_height()-2, bg, TB_BLUE,
78 " => %!s(MISSING) ", tab->selected_url);
79 } else if (tab->request.state != STATE_DONE) {
80 hide_query(tab->request.url, urlbuf);
81 int llen = strnlen(tab->request.url, sizeof(tab->request.url));
82 tb_printf(tb_width()-llen-5, tb_height()-2, TB_BLACK, bg,
83 " [%!s(MISSING)] ", urlbuf);
84 }
85
86 int count = atoi(client.vim.counter);
87 if (count) {
88 tb_printf(tb_width() - 8, tb_height() - 1, TB_DEFAULT, TB_DEFAULT,
89 "%!d(MISSING)", count);
90 }
91
92 // input
93 if (tab->show_error) {
94 tb_hide_cursor();
95 tb_colorline(0, tb_height()-1, TB_RED);
96 tb_print(0, tb_height()-1, TB_WHITE, TB_RED, tab->error);
97 client.input.field[0] = '\0';
98 } else if (tab->show_info) {
99 tb_hide_cursor();
100 tb_colorline(0, tb_height()-1, TB_GREEN);
101 tb_print(0, tb_height()-1, TB_WHITE, TB_GREEN, tab->info);
102 client.input.field[0] = '\0';
103 tab->show_info = 0;
104 } else if (page->code == 10) {
105 tb_printf(0, tb_height()-1, TB_DEFAULT, TB_DEFAULT,
106 "%!s(MISSING): %!s(MISSING)", client.input.label, client.input.field);
107 } else if (page->code == 11) {
108 char input_buf[1024];
109 size_t i = 0;
110 for (; client.input.field[i] && i < sizeof(client.input.field); i++)
111 input_buf[i] = '*';
112 input_buf[i] = '\0';
113 tb_printf(0, tb_height()-1, TB_DEFAULT, TB_DEFAULT,
114 "%!s(MISSING): %!s(MISSING)", client.input.label, input_buf);
115 } else {
116 tb_printf(0, tb_height()-1, TB_DEFAULT, TB_DEFAULT, "%!s(MISSING)", client.input.field);
117 }
118
119 tb_present();
120 }
121
122 void display_history() {
123 char urlbuf[1024];
124 int ret = 0;
125 struct tb_event ev;
126 bzero(&ev, sizeof(ev));
127 do {
128 struct gmi_tab* tab = &client.tabs[client.tab];
129
130 tb_clear();
131 tb_print(2, 1, TB_RED, TB_DEFAULT, "# History");
132
133 if (!tab->history) {
134 tb_present();
135 continue;
136 }
137 int y = 3;
138 for (struct gmi_link* link = tab->history->next; link; link = link->next) {
139 hide_query(link->url, urlbuf);
140 tb_printf(4, y, TB_DEFAULT, TB_DEFAULT, "%!s(MISSING)", urlbuf);
141 y++;
142 }
143
144 hide_query(tab->history->url, urlbuf);
145 tb_printf(4, y, TB_DEFAULT, TB_BLUE, "-> %!s(MISSING)", urlbuf);
146 y++;
147
148 for (struct gmi_link* link = tab->history->prev; link; link = link->prev) {
149 hide_query(link->url, urlbuf);
150 tb_printf(4, y, TB_DEFAULT, TB_DEFAULT, "%!s(MISSING)", urlbuf);
151 y++;
152 }
153
154 tb_present();
155
156 } while(((ret = tb_poll_event(&ev)) == TB_OK && ev.type == TB_EVENT_RESIZE)
157 || ret == -14);
158 }
159
160 int display_ask(char* info, char* action) {
161 int ret = 0;
162 struct tb_event ev;
163 bzero(&ev, sizeof(ev));
164 do {
165
166 tb_clear();
167 tb_printf(2, 1, TB_RED, TB_DEFAULT, "%!s(MISSING)", info);
168 int w = tb_width();
169 int h = tb_height();
170 const char* line1 = "Press 'y' to %!s(MISSING)";
171 const char* line2 = "Press any other key to cancel";
172 int x1 = w/2-(strlen(line1)+strnlen(action, w/2))/2;
173 int x2 = w/2-strlen(line2)/2;
174 tb_printf(x1, h/2-1, TB_DEFAULT, TB_DEFAULT, line1, action);
175 tb_printf(x1+7, h/2-1, TB_GREEN, TB_DEFAULT, "y");
176 tb_printf(x2, h/2, TB_DEFAULT, TB_DEFAULT, line2);
177
178 tb_present();
179
180 } while(((ret = tb_poll_event(&ev)) == TB_OK && ev.type == TB_EVENT_RESIZE)
181 || ret == -14);
182 return ev.ch == 'y' || ev.ch == 'Y';
183 }
184