From b2304232670b3a4e0c37fc57b9566541c9e231ab Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Mon, 30 Mar 2009 15:46:26 +0000 Subject: Change URL bar contents when switching tabs in GTK frontend. Remove fixed-size buffer from core URL string handling. Credit: Mark Benjamin. svn path=/trunk/netsurf/; revision=6998 --- desktop/browser.c | 54 +++++++++++++++++++++++++++++++++------------------ desktop/browser.h | 3 +++ gtk/gtk_scaffolding.c | 5 +++++ 3 files changed, 43 insertions(+), 19 deletions(-) diff --git a/desktop/browser.c b/desktop/browser.c index e433a927a..d66df18e0 100644 --- a/desktop/browser.c +++ b/desktop/browser.c @@ -284,7 +284,6 @@ void browser_window_go_post(struct browser_window *bw, const char *url, char *url2; char *fragment; url_func_result res; - char url_buf[256]; int depth = 0; struct browser_window *cur; int width, height; @@ -351,10 +350,11 @@ void browser_window_go_post(struct browser_window *bw, const char *url, history_add(bw->history, bw->current_content, bw->frag_id); browser_window_update(bw); - snprintf(url_buf, sizeof url_buf, "%s#%s", - bw->current_content->url, bw->frag_id); - url_buf[sizeof url_buf - 1] = 0; - gui_window_set_url(bw->window, url_buf); + if (bw->current_content) { + browser_window_refresh_url_bar(bw, + bw->current_content->url, + bw->frag_id); + } return; } } @@ -401,7 +401,6 @@ void browser_window_callback(content_msg msg, struct content *c, intptr_t p1, intptr_t p2, union content_msg_data data) { struct browser_window *bw = (struct browser_window *) p1; - char url[256]; switch (msg) { case CONTENT_MSG_LOADING: @@ -419,13 +418,8 @@ void browser_window_callback(content_msg msg, struct content *c, } #endif else { - if (bw->frag_id) - snprintf(url, sizeof url, "%s#%s", - c->url, bw->frag_id); - else - snprintf(url, sizeof url, "%s", c->url); - url[sizeof url - 1] = 0; - gui_window_set_url(bw->window, url); + browser_window_refresh_url_bar(bw, c->url, bw->frag_id); + bw->refresh_interval = -1; browser_window_set_status(bw, c->status_message); } @@ -449,12 +443,11 @@ void browser_window_callback(content_msg msg, struct content *c, browser_window_remove_caret(bw); bw->scrolling_box = NULL; gui_window_new_content(bw->window); - if (bw->frag_id) - snprintf(url, sizeof url, "%s#%s", c->url, bw->frag_id); - else - snprintf(url, sizeof url, "%s", c->url); - url[sizeof url - 1] = 0; - gui_window_set_url(bw->window, url); + if (bw->current_content) { + browser_window_refresh_url_bar(bw, + bw->current_content->url, + bw->frag_id); + } browser_window_update(bw); content_open(c, bw, 0, 0, 0, 0); browser_window_set_status(bw, c->status_message); @@ -1092,6 +1085,29 @@ void browser_window_set_scale_internal(struct browser_window *bw, float scale) browser_window_set_scale_internal(&bw->iframes[i], scale); } +void browser_window_refresh_url_bar(struct browser_window *bw, const char *url, + const char *frag) +{ + char *url_buf; + int len = strlen(url); + + len += ((frag) ? strlen(frag) : 0); + + url_buf = malloc(len + 2 /* '#' + '\0' */); + if (url_buf) { + if (frag) { + snprintf(url_buf, len + 1, "%s#%s", url, frag); + *(url_buf + len + 1) = '\0'; + } else { + snprintf(url_buf, len, "%s", url); + *(url_buf + len) = '\0'; + } + gui_window_set_url(bw->window, url_buf); + free(url_buf); + } else { + warn_user("NoMemory", 0); + } +} /** * Locate a browser window in the specified stack according. diff --git a/desktop/browser.h b/desktop/browser.h index 062c0dec4..54e4c69cc 100644 --- a/desktop/browser.h +++ b/desktop/browser.h @@ -231,6 +231,9 @@ struct browser_window * browser_window_owner(struct browser_window *bw); void browser_window_reformat(struct browser_window *bw, int width, int height); void browser_window_set_scale(struct browser_window *bw, float scale, bool all); +void browser_window_refresh_url_bar(struct browser_window *bw, const char *url, + const char *frag); + void browser_window_mouse_click(struct browser_window *bw, browser_mouse_state mouse, int x, int y); void browser_window_mouse_track(struct browser_window *bw, diff --git a/gtk/gtk_scaffolding.c b/gtk/gtk_scaffolding.c index a2c46ef17..9d2b69111 100644 --- a/gtk/gtk_scaffolding.c +++ b/gtk/gtk_scaffolding.c @@ -344,6 +344,11 @@ void nsgtk_window_update_back_forward(struct gtk_scaffolding *g) gtk_widget_set_sensitive(GTK_WIDGET(glade_xml_get_widget(g->popup_xml, "popupForward")), history_forward_available(bw->history)); + /* update the url bar, particularly necessary when tabbing */ + if ((bw->current_content) && bw->current_content->url) + browser_window_refresh_url_bar(bw, bw->current_content->url, + bw->frag_id); + /* update the local history window, as well as queuing a redraw * for it. */ -- cgit v1.2.3