AmendHub

Download:

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