jcs
/detritus
/amendments
/15
browser: Make link printing something the protocol handler invokes
jcs made amendment 15 about 1 year ago
--- browser.c Sat Oct 26 14:59:58 2024
+++ browser.c Mon Oct 28 13:54:36 2024
@@ -57,6 +57,7 @@ void browser_atexit(struct focusable *focusable);
void browser_go(struct browser *browser);
bool browser_load_url(struct browser *browser, char *uristr);
void browser_draw_status(struct browser *browser);
+void browser_stop_request(struct browser *browser);
void browser_cleanup(struct browser *browser);
void
@@ -67,12 +68,9 @@ browser_idle(struct focusable *focusable, EventRecord
TEIdle(browser->uri_te);
if (browser->request &&
- !browser->handler->process_request(browser->request)) {
+ !browser->handler->process_request(browser->request))
/* processing failed/finished */
- browser->handler->free_request(browser->request);
- browser->handler = NULL;
- browser->request = NULL;
- }
+ browser_stop_request(browser);
}
struct browser *
@@ -148,9 +146,11 @@ browser_init(void)
TVUpdateScrollbar(browser->output_tv, browser->output_tv_scroller);
browser->status_rect.left = -1;
- browser->status_rect.bottom = height + 1;
- browser->status_rect.right = width - SCROLLBAR_WIDTH + 2;
- browser->status_rect.top = height - SCROLLBAR_WIDTH + 1;
+ browser->status_rect.bottom = browser->win->portRect.bottom + 1;
+ browser->status_rect.right = browser->win->portRect.right -
+ SCROLLBAR_WIDTH + 2;
+ browser->status_rect.top = browser->status_rect.bottom -
+ SCROLLBAR_WIDTH;
focusable = xmalloczero(sizeof(struct focusable));
if (focusable == NULL)
@@ -236,8 +236,8 @@ browser_reveal_shadow(struct browser *browser)
if (--browser->shadow_refcnt != 0)
return;
- /* TODO: fix controls not drawing on the canvas */
- return;
+/* TODO: fix controls not drawing on the canvas */
+return;
SetPort(browser->shadow_old_port);
@@ -253,6 +253,8 @@ browser_close(struct focusable *focusable)
{
struct browser *browser = (struct browser *)focusable->cookie;
+ browser_stop_request(browser);
+
TEDispose(browser->uri_te);
TVDispose(browser->output_tv);
DisposeWindow(browser->win);
@@ -267,25 +269,31 @@ browser_close(struct focusable *focusable)
}
void
+browser_stop_request(struct browser *browser)
+{
+ if (!browser->request)
+ return;
+
+ browser->handler->free_request(browser->request);
+ browser->handler = NULL;
+ browser->request = NULL;
+}
+
+void
browser_cleanup(struct browser *browser)
{
size_t n;
+ struct browser_link *link, *nlink;
- if (browser->request) {
- browser->handler->free_request(browser->request);
- browser->handler = NULL;
- browser->request = NULL;
- }
-
- if (browser->links) {
- for (n = 0; n < browser->links_count; n++) {
- if (browser->links[n].link)
- xfree(&browser->links[n].link);
- if (browser->links[n].title)
- xfree(&browser->links[n].title);
+ if (browser->first_link) {
+ link = browser->first_link;
+ while (link) {
+ nlink = link->next_link;
+ xfree(&link);
+ link = nlink;
}
-
- xfree(&browser->links);
+ browser->first_link = NULL;
+ browser->last_link = NULL;
}
}
@@ -294,9 +302,11 @@ browser_atexit(struct focusable *focusable)
{
struct browser *browser = (struct browser *)focusable->cookie;
- if (browser)
+ if (browser) {
+ browser_stop_request(browser);
browser_cleanup(browser);
-
+ }
+
scsi_cleanup();
}
@@ -381,7 +391,8 @@ browser_mouse_down(struct focusable *focusable, EventR
Point p;
ControlHandle control;
Rect r;
- short val, adj, page, len, part, off;
+ short val, adj, page, len, part;
+ long off;
size_t n;
p = event->where;
@@ -403,10 +414,10 @@ browser_mouse_down(struct focusable *focusable, EventR
TVClick(browser->output_tv, p,
((event->modifiers & shiftKey) != 0));
- if (browser->links) {
- off = TVGetOffset(browser->output_tv, p);
- for (n = 0; off != 0 && n < browser->links_count; n++) {
- link = &browser->links[n];
+ if (browser->first_link &&
+ (off = TVGetOffset(browser->output_tv, p)) >= 0) {
+ for (link = browser->first_link; link && link->next_link;
+ link = link->next_link) {
if ((link->pos <= off) && (off < link->pos + link->len)) {
#if 0
if (event->modifiers & cmdKey) {
@@ -414,7 +425,7 @@ browser_mouse_down(struct focusable *focusable, EventR
break;
}
#endif
- browser_load_url(browser, link->link);
+ browser_load_url(browser, link->uri);
break;
}
}
@@ -498,9 +509,6 @@ browser_go(struct browser *browser)
short len;
char *uristr;
- browser->handler = NULL;
- browser->request = NULL;
-
HLock(browser->uri_te);
te = *(browser->uri_te);
HLock(te->hText);
@@ -524,15 +532,11 @@ browser_load_url(struct browser *browser, char *uristr
{
struct request_handler *handler;
struct URI *uri;
- Rect r;
- TERec *te;
short n;
- browser->handler = NULL;
- browser->request = NULL;
+ browser_stop_request(browser);
- for (n = 0; n < sizeof(request_handlers) / sizeof(request_handlers[0]);
- n++) {
+ for (n = 0; n < nitems(request_handlers); n++) {
handler = request_handlers[n];
if ((uri = handler->parse_uri(uristr)) != NULL) {
@@ -546,15 +550,7 @@ browser_load_url(struct browser *browser, char *uristr
return false;
}
- HLock(browser->uri_te);
- r = (*(browser->uri_te))->viewRect;
- HUnlock(browser->uri_te);
- TESetText(uri->str, strlen(uri->str), browser->uri_te);
- TESetSelect(SHRT_MAX, SHRT_MAX, browser->uri_te);
- TEUpdate(&r, browser->uri_te);
-
- browser->request = browser->handler->init_request(browser, uri);
- if (browser->request)
+ if ((browser->request = browser->handler->init_request(browser, uri)))
return true;
return false;
@@ -635,76 +631,75 @@ browser_print(struct browser *browser, const char *str
} else
TVAppend(browser->output_tv, &style, (char *)str, len);
- TVUpdateScrollbar(browser->output_tv, browser->output_tv_scroller);
+ //TVUpdateScrollbar(browser->output_tv, browser->output_tv_scroller);
return len;
}
size_t
-browser_print_link(struct browser *browser, const char *url, size_t url_len,
+browser_print_link(struct browser *browser, const char *uri, size_t uri_len,
const char *title, size_t title_len)
{
struct TVStyle style;
struct browser_link *link;
- size_t n;
+ size_t n, len;
- if (browser->links_count == browser->links_size) {
- browser->links_size += BROWSER_LINKS_CHUNK_SIZE;
- browser->links = xreallocarray(browser->links,
- browser->links_size, sizeof(struct browser_link));
- if (browser->links == NULL) {
- warn("Out of memory allocating links");
- return 0;
- }
- memset(&browser->links[browser->links_count], 0,
- sizeof(struct browser_link) * BROWSER_LINKS_CHUNK_SIZE);
+ len = sizeof(struct browser_link) + uri_len + 1 + title_len + 1;
+ link = xmalloczero(len);
+ if (link == NULL) {
+ warn("Out of memory allocating link");
+ return 0;
}
- link = &browser->links[browser->links_count++];
-
HLock(browser->output_tv);
link->pos = (*(browser->output_tv))->text_length;
+ link->len = title_len ? title_len : uri_len;
HUnlock(browser->output_tv);
- link->link = xmalloc(url_len + 1);
- if (link->link == NULL) {
- warn("Out of memory allocating link");
- return 0;
- }
- memcpy(link->link, url, url_len);
- link->link[n] = '\0';
+ link->uri = (char *)link + sizeof(struct browser_link);
+ memcpy(link->uri, uri, uri_len);
+ link->uri[uri_len] = '\0';
- browser->style |= STYLE_LINK;
-
- /* optional title */
- if (title_len > 1) {
- link->title = xmalloc(title_len);
- if (link->title == NULL) {
- warn("Out of memory allocating link title");
- return 0;
- }
- memcpy(link->title, title, title_len + 1);
+ /* if no title, just point title at uri */
+ if (title_len) {
+ link->title = link->uri + uri_len + 1;
+ memcpy(link->title, title, title_len);
link->title[title_len] = '\0';
- link->len = title_len;
-
- browser_print(browser, link->title, title_len);
- } else {
- link->len = url_len;
- browser_print(browser, url, url_len);
+ } else
+ link->title = link->uri;
+
+ if (browser->last_link)
+ browser->last_link->next_link = link;
+ else {
+ browser->first_link = link;
+ browser->last_link = link;
}
+ browser->style |= STYLE_LINK;
+ browser_print(browser, link->title, link->len);
browser->style &= ~(STYLE_LINK);
+
return link->len;
}
void
-browser_clear(struct browser *browser)
+browser_commit_to_uri(struct browser *browser, struct URI *uri)
{
WindowPtr win;
+ Rect r;
GetPort(&win);
SetPort(browser->win);
+ browser_cleanup(browser);
+
+ HLock(browser->uri_te);
+ r = (*(browser->uri_te))->viewRect;
+ HUnlock(browser->uri_te);
+ TESetText(uri->str, strlen(uri->str), browser->uri_te);
+ TESetSelect(SHRT_MAX, SHRT_MAX, browser->uri_te);
+ TEUpdate(&r, browser->uri_te);
+
TVClear(browser->output_tv);
TVUpdateScrollbar(browser->output_tv, browser->output_tv_scroller);
--- browser.h Sat Oct 26 14:53:08 2024
+++ browser.h Mon Oct 28 13:45:20 2024
@@ -34,10 +34,11 @@
#define STYLE_QUOTE (1UL << 8)
struct browser_link {
- char *link;
+ char *uri;
char *title;
unsigned short pos;
unsigned short len;
+ struct browser_link *next_link;
};
struct browser {
@@ -57,10 +58,8 @@ struct browser {
void *request;
unsigned long style;
- size_t links_count;
- size_t links_size;
- struct browser_link *links;
-#define BROWSER_LINKS_CHUNK_SIZE 32
+ struct browser_link *first_link;
+ struct browser_link *last_link;
};
struct browser * browser_init(void);
@@ -70,6 +69,6 @@ size_t browser_print_link(struct browser *browser, con
size_t browser_print(struct browser *browser, const char *str, size_t len);
//#define BROWSER_DEBUGF(x) browser_statusf
#define BROWSER_DEBUGF(x)
-void browser_clear(struct browser *browser);
+void browser_commit_to_uri(struct browser *browser, struct URI *uri);
#endif
\ No newline at end of file