commit - b38cd1f7a4ac9db428ce0815266db7888466392d
commit + 9a28e7e5493907b0cca9976118628ff0202f3f28
blob - aa8b57e0025c845fab712c1be431747804a43af3
blob + d411d634d08b25e5ef43f02b9860ef4345f436d3
--- minibuffer.c
+++ minibuffer.c
}
void
-ir_select(void)
+ir_select_gemini(void)
{
char buf[1025] = {0};
struct phos_uri uri;
}
void
+ir_select_gopher(void)
+{
+ exit_minibuffer();
+ minibuffer_hist_save_entry();
+
+ gopher_send_search_req(current_tab, ministate.buf);
+}
+
+void
lu_select(void)
{
exit_minibuffer();
blob - e71a56a1987faeef145c59330bc2bd8c41113fb3
blob + 1e74dc746a66be52c92177e1a5426143d470e617
--- minibuffer.h
+++ minibuffer.h
void minibuffer_self_insert(void);
void sensible_self_insert(void);
void eecmd_select(void);
-void ir_select(void);
+void ir_select_gemini(void);
+void ir_select_gopher(void);
void lu_select(void);
void bp_select(void);
void ts_select(void);
blob - a8afb762eeea7a5f46a039c4a9c7daa6d5f19f6b
blob + 62c263462242828c1437440677fed6363c1e3684
--- telescope.c
+++ telescope.c
load_page_from_str(tab, err_pages[tab->code]);
} else if (tab->code < 20) { /* 1x */
load_page_from_str(tab, err_pages[tab->code]);
- ui_require_input(tab, tab->code == 11);
+ ui_require_input(tab, tab->code == 11, PROTO_GEMINI);
} else if (tab->code == 20) {
if (setup_parser_for(tab)) {
ui_send_net(IMSG_PROCEED, tab->id, NULL, 0);
} else if (has_prefix(path, "/0/")) {
parser_init(tab, textplain_initparser);
path += 2;
+ } else if (has_prefix(path, "/7/")) {
+ /* show input request if there is no query */
+ ui_require_input(tab, 0, PROTO_GOPHER);
+ return load_page_from_str(tab, err_pages[10]);
} else {
return 0;
}
+ strlcpy(req.req, path, sizeof(req.req));
+ if (*tab->uri.query != '\0') {
+ strlcat(req.req, "?", sizeof(req.req));
+ strlcat(req.req, tab->uri.query, sizeof(req.req));
+ }
+ strlcpy(req.req, "\r\n", sizeof(req.req));
+
return make_request(tab, &req, PROTO_GOPHER, path);
}
return 1;
}
+void
+gopher_send_search_req(struct tab *tab, const char *text)
+{
+ struct get_req req;
+
+ memset(&req, 0, sizeof(req));
+ strlcpy(req.host, tab->uri.host, sizeof(req.host));
+ strlcpy(req.port, tab->uri.port, sizeof(req.host));
+
+ /* +2 to skip /7 */
+ strlcpy(req.req, tab->uri.path+2, sizeof(req.req));
+ if (*tab->uri.query != '\0') {
+ strlcat(req.req, "?", sizeof(req.req));
+ strlcat(req.req, tab->uri.query, sizeof(req.req));
+ }
+
+ strlcat(req.req, "\t", sizeof(req.req));
+ strlcat(req.req, text, sizeof(req.req));
+ strlcat(req.req, "\r\n", sizeof(req.req));
+
+ erase_buffer(&tab->buffer);
+ parser_init(tab, gophermap_initparser);
+
+ make_request(tab, &req, PROTO_GOPHER, NULL);
+}
+
/*
* Effectively load the given url in the given tab. Return 1 when
* loading the page asynchronously, and thus when an erase_buffer can
blob - 07270a94d9d7afeab8970f624bc10963e85c41d3
blob + 3e1f9768b8d9f56c3488a6bfa2bda2789d0c6e19
--- telescope.h
+++ telescope.h
void sandbox_fs_process(void);
/* telescope.c */
+void gopher_send_search_req(struct tab *, const char *);
void load_url(struct tab *, const char *, const char *);
int load_previous_page(struct tab*);
int load_next_page(struct tab*);
blob - a6b061b65aad7ef49b3c9929c2885d7a5bb10716
blob + e0bd2158c686645f62e455d8456a9991120eae78
--- ui.c
+++ ui.c
}
void
-ui_require_input(struct tab *tab, int hide)
+ui_require_input(struct tab *tab, int hide, int proto)
{
+ void (*fn)(void);
+
+ if (proto == PROTO_GEMINI)
+ fn = ir_select_gemini;
+ else if (proto == PROTO_GOPHER)
+ fn = ir_select_gopher;
+ else
+ abort();
+
/* TODO: hard-switching to another tab is ugly */
switch_to_tab(tab);
- enter_minibuffer(sensible_self_insert, ir_select, exit_minibuffer,
+ enter_minibuffer(sensible_self_insert, fn, exit_minibuffer,
&ir_history, NULL, NULL);
strlcpy(ministate.prompt, "Input required: ",
sizeof(ministate.prompt));
blob - 7cd34f73c633cd97bf099d9d7e098a0aba749a82
blob + 02b2dd49988a6e2179550843d0adbc68170ccd23
--- ui.h
+++ ui.h
void ui_toggle_side_window(void);
void ui_schedule_redraw(void);
void ui_after_message_hook(void);
-void ui_require_input(struct tab *, int);
+void ui_require_input(struct tab *, int, int);
void ui_yornp(const char *, void (*)(int, struct tab *), struct tab *);
void ui_read(const char *, void (*)(const char *, struct tab *), struct tab *);
void ui_other_window(void);