make toolbar url entry display url

This commit is contained in:
Vincent Sanders 2019-08-20 23:33:38 +01:00 committed by Daniel Silverstone
parent 02c75d0790
commit dd767acfee
5 changed files with 179 additions and 32 deletions

View File

@ -2074,29 +2074,6 @@ void nsgtk_window_set_title(struct gui_window *gw, const char *title)
} }
nserror gui_window_set_url(struct gui_window *gw, nsurl *url)
{
struct nsgtk_scaffolding *g;
size_t idn_url_l;
char *idn_url_s = NULL;
g = nsgtk_get_scaffold(gw);
if (g->top_level == gw) {
if (nsoption_bool(display_decoded_idn) == true) {
if (nsurl_get_utf8(url, &idn_url_s, &idn_url_l) != NSERROR_OK)
idn_url_s = NULL;
}
#if 0
gtk_entry_set_text(GTK_ENTRY(g->url_bar), idn_url_s ? idn_url_s : nsurl_access(url));
#endif
if(idn_url_s)
free(idn_url_s);
//gtk_editable_set_position(GTK_EDITABLE(g->url_bar), -1);
}
return NSERROR_OK;
}
#if 0 #if 0

View File

@ -170,8 +170,6 @@ nserror nsgtk_scaffolding_new_tab(struct gui_window *gw);
*/ */
void nsgtk_window_set_title(struct gui_window *gw, const char *title); void nsgtk_window_set_title(struct gui_window *gw, const char *title);
nserror gui_window_set_url(struct gui_window *g, struct nsurl *url);
/** /**
* toolbar style changed * toolbar style changed
*/ */

View File

@ -32,6 +32,7 @@
#include "utils/messages.h" #include "utils/messages.h"
#include "utils/nsoption.h" #include "utils/nsoption.h"
#include "utils/file.h" #include "utils/file.h"
#include "utils/nsurl.h"
#include "gtk/gui.h" #include "gtk/gui.h"
#include "gtk/warn.h" #include "gtk/warn.h"
@ -372,7 +373,7 @@ void nsgtk_theme_implement(struct nsgtk_scaffolding *g)
GTK_WIDGET(button->main), GTK_WIDGET(button->main),
GTK_WIDGET(theme[IMAGE_SET_MAIN_MENU]->image[i])); GTK_WIDGET(theme[IMAGE_SET_MAIN_MENU]->image[i]));
gtk_widget_show_all(GTK_WIDGET(button->main)); gtk_widget_show_all(GTK_WIDGET(button->main));
} }
if ((button->rclick != NULL) && if ((button->rclick != NULL) &&
(theme[IMAGE_SET_RCLICK_MENU] != NULL)) { (theme[IMAGE_SET_RCLICK_MENU] != NULL)) {
nsgtk_image_menu_item_set_image(GTK_WIDGET(button->rclick), nsgtk_image_menu_item_set_image(GTK_WIDGET(button->rclick),
@ -548,7 +549,7 @@ make_toolbar_item(nsgtk_toolbar_button i, struct nsgtk_theme *theme)
w = GTK_WIDGET(gtk_tool_button_new(GTK_WIDGET( \ w = GTK_WIDGET(gtk_tool_button_new(GTK_WIDGET( \
theme->image[p##_BUTTON]), q)); \ theme->image[p##_BUTTON]), q)); \
} \ } \
break; \ break; \
} }
MAKE_STOCKBUTTON(HOME, NSGTK_STOCK_HOME) MAKE_STOCKBUTTON(HOME, NSGTK_STOCK_HOME)
@ -1557,8 +1558,9 @@ add_item_to_toolbar(struct nsgtk_toolbar *tb,
tb->buttons[bidx]->button = GTK_TOOL_ITEM( tb->buttons[bidx]->button = GTK_TOOL_ITEM(
make_toolbar_item(bidx, theme)); make_toolbar_item(bidx, theme));
/* set widgets initial sensitivity */
gtk_widget_set_sensitive(tb->buttons[bidx]->button, gtk_widget_set_sensitive(tb->buttons[bidx]->button,
tb->buttons[bidx]->sensitivity); tb->buttons[bidx]->sensitivity);
gtk_toolbar_insert(tb->widget, gtk_toolbar_insert(tb->widget,
tb->buttons[bidx]->button, tb->buttons[bidx]->button,
@ -1664,7 +1666,7 @@ set_item_sensitivity(struct nsgtk_toolbar_item *item, bool sensitivity)
} }
return NSERROR_OK; return NSERROR_OK;
} }
/** /**
@ -1729,6 +1731,121 @@ static void next_throbber_frame(void *p)
} }
/**
* find the toolbar item with a given location.
*
* \param tb the toolbar instance
* \param locaction the location to search for
* \return the item id for a location
*/
static nsgtk_toolbar_button
itemid_from_location(struct nsgtk_toolbar *tb, int location)
{
int iidx;
for (iidx = BACK_BUTTON; iidx < PLACEHOLDER_BUTTON; iidx++) {
if (tb->buttons[iidx]->location == location) {
break;
}
}
return iidx;
}
/**
* find the toolbar item with a given gtk widget.
*
* \param tb the toolbar instance
* \param widget the widget to search for
* \return the item id matching the widget
*/
static nsgtk_toolbar_button
itemid_from_gtkwidget(struct nsgtk_toolbar *tb, GtkWidget *widget)
{
int iidx;
for (iidx = BACK_BUTTON; iidx < PLACEHOLDER_BUTTON; iidx++) {
if ((tb->buttons[iidx]->location != INACTIVE_LOCATION) &&
(tb->buttons[iidx]->button == widget)) {
break;
}
}
return iidx;
}
/**
* callback for toolbar widgets size allocation
*/
static void
toolbar_size_allocate_cb(GtkWidget *widget, GtkAllocation *alloc, gpointer data)
{
struct nsgtk_toolbar *tb = (struct nsgtk_toolbar *)data;
nsgtk_toolbar_button itemid;
itemid = itemid_from_gtkwidget(tb, widget);
if ((tb->toolbarmem == alloc->x) ||
(tb->buttons[itemid]->location < tb->buttons[HISTORY_BUTTON]->location)) {
/*
* no reallocation after first adjustment,
* no reallocation for buttons left of history button
*/
return;
}
if (itemid == HISTORY_BUTTON) {
if (alloc->width == 20) {
return;
}
tb->toolbarbase = alloc->y + alloc->height;
tb->historybase = alloc->x + 20;
if (tb->offset == 0) {
tb->offset = alloc->width - 20;
}
alloc->width = 20;
} else if (tb->buttons[itemid]->location <= tb->buttons[URL_BAR_ITEM]->location) {
alloc->x -= tb->offset;
if (itemid == URL_BAR_ITEM) {
alloc->width += tb->offset;
}
}
tb->toolbarmem = alloc->x;
gtk_widget_size_allocate(widget, alloc);
}
static nserror
toolbar_connect_signal(struct nsgtk_toolbar *tb, nsgtk_toolbar_button itemid)
{
if (tb->buttons[itemid]->button != NULL) {
g_signal_connect(tb->buttons[itemid]->button,
"size-allocate",
G_CALLBACK(toolbar_size_allocate_cb),
tb);
}
}
/**
* connect all signals to widgets in a toolbar
*/
nserror toolbar_connect_signals(struct nsgtk_toolbar *tb)
{
int location; /* location index */
nsgtk_toolbar_button itemid; /* item id */
for (location = BACK_BUTTON; location < PLACEHOLDER_BUTTON; location++) {
itemid = itemid_from_location(tb, location);
if (itemid == PLACEHOLDER_BUTTON) {
/* no more filled locations */
break;
}
toolbar_connect_signal(tb, itemid);
}
return NSERROR_OK;
}
/* exported interface documented in toolbar.h */ /* exported interface documented in toolbar.h */
nserror nsgtk_toolbar_create(GtkBuilder *builder, struct nsgtk_toolbar **tb_out) nserror nsgtk_toolbar_create(GtkBuilder *builder, struct nsgtk_toolbar **tb_out)
{ {
@ -1782,13 +1899,19 @@ nserror nsgtk_toolbar_create(GtkBuilder *builder, struct nsgtk_toolbar **tb_out)
tb->buttons[HISTORY_BUTTON]->button), 20, -1); tb->buttons[HISTORY_BUTTON]->button), 20, -1);
} }
/* set up the throbber. */ /* set the throbber start frame. */
tb->throb_frame = 0; tb->throb_frame = 0;
/* set up URL bar completion */ /* set up URL bar completion */
/** \todo sort out completion */ /** \todo sort out completion */
//tb->url_bar_completion = nsgtk_url_entry_completion_new(gs); //tb->url_bar_completion = nsgtk_url_entry_completion_new(gs);
res = toolbar_connect_signals(tb);
if (res != NSERROR_OK) {
free(tb);
return res;
}
*tb_out = tb; *tb_out = tb;
return NSERROR_OK; return NSERROR_OK;
} }
@ -1856,7 +1979,7 @@ nserror nsgtk_toolbar_throbber(struct nsgtk_toolbar *tb, bool active)
return NSERROR_OK; return NSERROR_OK;
} }
/* stopping the throbber */ /* stopping the throbber */
nsgtk_schedule(-1, next_throbber_frame, tb); nsgtk_schedule(-1, next_throbber_frame, tb);
tb->throb_frame = 0; tb->throb_frame = 0;
@ -1870,3 +1993,37 @@ nserror nsgtk_toolbar_throbber(struct nsgtk_toolbar *tb, bool active)
return res; return res;
} }
/* exported interface documented in toolbar.h */
nserror nsgtk_toolbar_set_url(struct nsgtk_toolbar *tb, nsurl *url)
{
size_t idn_url_l;
char *idn_url_s = NULL;
const char *url_text = NULL;
GtkEntry *url_entry;
if (tb->buttons[URL_BAR_ITEM]->button == NULL) {
/* no toolbar item */
return NSERROR_INVALID;
}
url_entry = GTK_ENTRY(gtk_bin_get_child(GTK_BIN(tb->buttons[URL_BAR_ITEM]->button)));
if (nsoption_bool(display_decoded_idn) == true) {
if (nsurl_get_utf8(url, &idn_url_s, &idn_url_l) != NSERROR_OK) {
idn_url_s = NULL;
}
url_text = idn_url_s;
}
if (url_text == NULL) {
url_text = nsurl_access(url);
}
gtk_entry_set_text(url_entry, url_text);
//gtk_editable_set_position(GTK_EDITABLE(url_entry), -1);
if (idn_url_s != NULL) {
free(idn_url_s);
}
return NSERROR_OK;
}

View File

@ -56,11 +56,20 @@ nserror nsgtk_toolbar_update(struct nsgtk_toolbar *tb);
* Start or stop a throbber in a toolbar * Start or stop a throbber in a toolbar
* *
* \param toolbar A toolbar returned from a creation * \param toolbar A toolbar returned from a creation
* \param active Trie if the throbber animation should play. * \param active True if the throbber animation should play.
* \return NSERROR_OK on success * \return NSERROR_OK on success
*/ */
nserror nsgtk_toolbar_throbber(struct nsgtk_toolbar *tb, bool active); nserror nsgtk_toolbar_throbber(struct nsgtk_toolbar *tb, bool active);
/**
* Update the toolbar url entry
*
* \param toolbar A toolbar returned from a creation
* \param url The URL to set
* \return NSERROR_OK on success
*/
nserror nsgtk_toolbar_set_url(struct nsgtk_toolbar *tb, nsurl *url);
/** /**
* sets up the images for scaffolding. * sets up the images for scaffolding.
*/ */

View File

@ -45,6 +45,7 @@
#include "netsurf/keypress.h" #include "netsurf/keypress.h"
#include "desktop/searchweb.h" #include "desktop/searchweb.h"
#include "desktop/textinput.h" #include "desktop/textinput.h"
#include "utils/nsurl.h"
#include "gtk/window.h" #include "gtk/window.h"
#include "gtk/selection.h" #include "gtk/selection.h"
@ -1360,6 +1361,11 @@ gui_window_event(struct gui_window *gw, enum gui_window_event event)
return NSERROR_OK; return NSERROR_OK;
} }
static nserror gui_window_set_url(struct gui_window *gw, nsurl *url)
{
return nsgtk_toolbar_set_url(gw->toolbar, url);
}
static struct gui_window_table window_table = { static struct gui_window_table window_table = {
.create = gui_window_create, .create = gui_window_create,
.destroy = gui_window_destroy, .destroy = gui_window_destroy,