💾 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

View Raw

More Information

➡️ Next capture (2023-01-29)

-=-=-=-=-=-=-

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