jcs
/detritus
/amendments
/60
browser: Reorganize go functions, use http:// fallback from URL bar
This is 2024, after all.
jcs made amendment 60 about 1 year ago
--- browser.c Thu Dec 12 21:34:18 2024
+++ browser.c Sat Dec 14 10:54:13 2024
@@ -56,8 +56,9 @@ bool browser_handle_menu(struct focusable *focusable,
short item);
void browser_atexit(struct focusable *focusable);
-void browser_go(struct browser *browser, short dir);
-page_handle browser_create_page(struct browser *browser, char *uristr);
+void browser_go_uri_field(struct browser *browser);
+void browser_go_dir(struct browser *browser, short dir);
+page_handle browser_create_page(struct browser *browser, struct URI *uri);
void browser_draw_status(struct browser *browser);
struct TVStyle * browser_build_tvstyle(struct browser *browser);
void browser_finished_loading(struct browser *browser);
@@ -388,9 +389,7 @@ browser_follow_redir(struct browser *browser)
redir->str);
browser_statusf(browser, "Following redirection to %s", redir->str);
- browser_go_uri(browser, redir->str);
-
- xfree(&redir);
+ browser_create_page(browser, redir);
}
void
@@ -555,7 +554,7 @@ browser_mouse_down(struct focusable *focusable, EventR
break;
}
#endif
- browser_create_page(browser, link->uri);
+ browser_go_uri_str(browser, link->uri);
break;
}
}
@@ -572,11 +571,11 @@ browser_mouse_down(struct focusable *focusable, EventR
browser_stop_loading_page(browser);
browser_statusf(browser, "Stopped");
} else
- browser_go(browser, 0);
+ browser_go_uri_field(browser);
} else if (TrackControl(control, p, 0L) && control == browser->back)
- browser_go(browser, -1);
+ browser_go_dir(browser, -1);
else if (TrackControl(control, p, 0L) && control == browser->fwd)
- browser_go(browser, 1);
+ browser_go_dir(browser, 1);
break;
case inUpButton:
case inDownButton:
@@ -652,7 +651,7 @@ browser_key_down(struct focusable *focusable, EventRec
k = (event->message & charCodeMask);
if (k == '\r') {
- browser_go(browser, 0);
+ browser_go_uri_field(browser);
return;
}
@@ -691,87 +690,106 @@ browser_handle_menu(struct focusable *focusable, short
}
void
-browser_go_uri(struct browser *browser, char *uristr)
+browser_go_uri_field(struct browser *browser)
{
- Rect r;
+ char *uristr;
+ struct URI *uri;
+ size_t len;
- TESetText(uristr, strlen(uristr), browser->uri_te);
- TESetSelect(SHRT_MAX, SHRT_MAX, browser->uri_te);
+ len = (*(browser->uri_te))->teLength;
+ uristr = xmalloc(7 + len + 1);
+ if (uristr == NULL) {
+ warn("Out of memory");
+ return;
+ }
+ HLock(browser->uri_te);
+ HLock((*(browser->uri_te))->hText);
+ memcpy(uristr, *((*(browser->uri_te))->hText), len);
+ HUnlock((*(browser->uri_te))->hText);
+ HUnlock(browser->uri_te);
+ uristr[len] = '\0';
+
+ uri = parse_uri(uristr);
+ if (uri == NULL) {
+ /* kids these days */
+ memmove(uristr + 7, uristr, len + 1);
+ memcpy(uristr, "http://", 7);
+ uri = parse_uri(uristr);
+ if (uri == NULL)
+ goto fail;
+ }
- r = (*(browser->uri_te))->viewRect;
- TEUpdate(&r, browser->uri_te);
+ xfree(&uristr);
- browser_go(browser, 0);
+ if (!browser_create_page(browser, uri))
+ xfree(&uri);
+
+ return;
+
+fail:
+ warn("Could not parse URI \"%s\"", uristr);
+ xfree(&uristr);
}
void
-browser_go(struct browser *browser, short dir)
+browser_go_uri_str(struct browser *browser, char *str)
{
- TERec *te;
+ struct URI *uri;
+
+ uri = parse_uri(str);
+ if (uri == NULL) {
+ warn("Failed to parse URI \"%s\"", str);
+ return;
+ }
+ if (!browser_create_page(browser, uri))
+ xfree(&uri);
+}
+
+void
+browser_go_dir(struct browser *browser, short dir)
+{
page_handle pageh, opage;
struct page *page;
- short len;
- char *uristr;
+ if (dir != -1 && dir != 1)
+ return;
+
browser_statusf(browser, "");
+ browser_stop_loading_page(browser);
- if (dir == 0) {
- len = (*(browser->uri_te))->teLength;
- uristr = xmalloc(len + 1);
- if (uristr == NULL) {
- warn("Out of memory");
- return;
- }
- HLock(browser->uri_te);
- HLock((*(browser->uri_te))->hText);
- memcpy(uristr, *((*(browser->uri_te))->hText), len);
- HUnlock((*(browser->uri_te))->hText);
- HUnlock(browser->uri_te);
- uristr[len] = '\0';
-
- browser_create_page(browser, uristr);
- xfree(&uristr);
- } else {
- browser_stop_loading_page(browser);
+ pageh = browser->current_page;
+ if (!pageh)
+ return;
+
+ opage = (dir == -1) ? (*pageh)->back_page : (*pageh)->fwd_page;
+ if (!opage)
+ return;
+
+ HLock(opage);
+ browser->loading_page = opage;
+ browser_update_buttons(browser);
+
+ if ((*opage)->handler->reset)
+ (*opage)->handler->reset(opage);
+ else
+ (*opage)->content_pos = 0;
- pageh = browser->current_page;
- if (!pageh)
- return;
-
- opage = (dir == -1) ? (*pageh)->back_page : (*pageh)->fwd_page;
- if (!opage)
- return;
-
- HLock(opage);
- browser->loading_page = opage;
- browser_update_buttons(browser);
-
- if ((*opage)->handler->reset)
- (*opage)->handler->reset(opage);
- else
- (*opage)->content_pos = 0;
-
- browser_commit_to_loading_page(browser);
-
- HUnlock(opage);
- }
+ browser_commit_to_loading_page(browser);
+
+ HUnlock(opage);
}
page_handle
-browser_create_page(struct browser *browser, char *uristr)
+browser_create_page(struct browser *browser, struct URI *uri)
{
page_handle pageh;
struct page *page;
struct page_handler *handler;
- struct URI *uri;
+ size_t len;
short n;
browser_stop_loading_page(browser);
- uri = parse_uri(uristr);
- if (uri == NULL)
- goto fail;
-
for (n = 0; n < nitems(page_handlers); n++) {
handler = page_handlers[n];
@@ -782,7 +800,7 @@ browser_create_page(struct browser *browser, char *uri
PAGE_CONTENT_CHUNK_SIZE);
if (pageh == NULL) {
warn("Out of memory for new page");
- return;
+ return NULL;
}
HLock(pageh);
page = *pageh;
@@ -808,10 +826,8 @@ browser_create_page(struct browser *browser, char *uri
return pageh;
}
-fail:
- if (uri)
- xfree(&uri);
- warn("Could not parse URI \"%s\"", uristr);
+fail:
+ warn("Could not find handler for URI");
return NULL;
}
@@ -1042,6 +1058,9 @@ browser_page_free(page_handle pageh)
if (page->handler->free)
page->handler->free(pageh);
+
+ if (page->redir_to)
+ xfree(&page->redir_to);
xfree(&page->uri);
DisposeHandle(pageh);
--- browser.h Thu Nov 21 16:23:28 2024
+++ browser.h Fri Dec 13 22:57:58 2024
@@ -79,6 +79,8 @@ struct page {
short download_frefnum;
size_t download_len;
+ struct TVStyle cur_style;
+
char content[];
};
@@ -148,7 +150,7 @@ size_t browser_print_bitmap(struct browser *browser, B
void browser_supress_updates(struct browser *browser, bool supress);
void browser_recalc_scrollbar(struct browser *browser);
struct page * browser_grow_page_content(struct page *page, size_t len);
-void browser_go_uri(struct browser *browser, char *uristr);
+void browser_go_uri_str(struct browser *browser, char *str);
void browser_commit_to_loading_page(struct browser *browser);
bool browser_start_download(struct browser *browser, char *filename,
char *dump_buf, size_t dump_len);