summaryrefslogtreecommitdiff
path: root/frontends
diff options
context:
space:
mode:
authorVincent Sanders <vince@kyllikki.org>2019-08-20 23:33:38 +0100
committerDaniel Silverstone <dsilvers@digital-scurf.org>2019-09-21 10:53:41 +0100
commitdd767acfee416a65e67193a9740d2b636b868e11 (patch)
treeddbd349ccfc3f8ae31117b915b7dab1fab89824d /frontends
parent02c75d07900d4566a8b2f835fb07a4eff1ab8235 (diff)
downloadnetsurf-dd767acfee416a65e67193a9740d2b636b868e11.tar.gz
netsurf-dd767acfee416a65e67193a9740d2b636b868e11.tar.bz2
make toolbar url entry display url
Diffstat (limited to 'frontends')
-rw-r--r--frontends/gtk/scaffolding.c23
-rw-r--r--frontends/gtk/scaffolding.h2
-rw-r--r--frontends/gtk/toolbar.c169
-rw-r--r--frontends/gtk/toolbar.h11
-rw-r--r--frontends/gtk/window.c6
5 files changed, 179 insertions, 32 deletions
diff --git a/frontends/gtk/scaffolding.c b/frontends/gtk/scaffolding.c
index 6ff62a103..15a36a44f 100644
--- a/frontends/gtk/scaffolding.c
+++ b/frontends/gtk/scaffolding.c
@@ -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
diff --git a/frontends/gtk/scaffolding.h b/frontends/gtk/scaffolding.h
index c5f8a4721..19f8681a0 100644
--- a/frontends/gtk/scaffolding.h
+++ b/frontends/gtk/scaffolding.h
@@ -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);
-nserror gui_window_set_url(struct gui_window *g, struct nsurl *url);
-
/**
* toolbar style changed
*/
diff --git a/frontends/gtk/toolbar.c b/frontends/gtk/toolbar.c
index 3ef753cde..db43aab73 100644
--- a/frontends/gtk/toolbar.c
+++ b/frontends/gtk/toolbar.c
@@ -32,6 +32,7 @@
#include "utils/messages.h"
#include "utils/nsoption.h"
#include "utils/file.h"
+#include "utils/nsurl.h"
#include "gtk/gui.h"
#include "gtk/warn.h"
@@ -372,7 +373,7 @@ void nsgtk_theme_implement(struct nsgtk_scaffolding *g)
GTK_WIDGET(button->main),
GTK_WIDGET(theme[IMAGE_SET_MAIN_MENU]->image[i]));
gtk_widget_show_all(GTK_WIDGET(button->main));
- }
+ }
if ((button->rclick != NULL) &&
(theme[IMAGE_SET_RCLICK_MENU] != NULL)) {
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( \
theme->image[p##_BUTTON]), q)); \
} \
- break; \
+ break; \
}
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(
make_toolbar_item(bidx, theme));
+ /* set widgets initial sensitivity */
gtk_widget_set_sensitive(tb->buttons[bidx]->button,
- tb->buttons[bidx]->sensitivity);
+ tb->buttons[bidx]->sensitivity);
gtk_toolbar_insert(tb->widget,
tb->buttons[bidx]->button,
@@ -1664,7 +1666,7 @@ set_item_sensitivity(struct nsgtk_toolbar_item *item, bool sensitivity)
}
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 */
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);
}
- /* set up the throbber. */
+ /* set the throbber start frame. */
tb->throb_frame = 0;
/* set up URL bar completion */
/** \todo sort out completion */
//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;
return NSERROR_OK;
}
@@ -1856,7 +1979,7 @@ nserror nsgtk_toolbar_throbber(struct nsgtk_toolbar *tb, bool active)
return NSERROR_OK;
}
-
+
/* stopping the throbber */
nsgtk_schedule(-1, next_throbber_frame, tb);
tb->throb_frame = 0;
@@ -1870,3 +1993,37 @@ nserror nsgtk_toolbar_throbber(struct nsgtk_toolbar *tb, bool active)
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;
+}
diff --git a/frontends/gtk/toolbar.h b/frontends/gtk/toolbar.h
index 2744d1f66..57320d362 100644
--- a/frontends/gtk/toolbar.h
+++ b/frontends/gtk/toolbar.h
@@ -56,12 +56,21 @@ nserror nsgtk_toolbar_update(struct nsgtk_toolbar *tb);
* Start or stop a throbber in a toolbar
*
* \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
*/
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.
*/
void nsgtk_theme_implement(struct nsgtk_scaffolding *g);
diff --git a/frontends/gtk/window.c b/frontends/gtk/window.c
index 4f8be47bd..2ba4b89a9 100644
--- a/frontends/gtk/window.c
+++ b/frontends/gtk/window.c
@@ -45,6 +45,7 @@
#include "netsurf/keypress.h"
#include "desktop/searchweb.h"
#include "desktop/textinput.h"
+#include "utils/nsurl.h"
#include "gtk/window.h"
#include "gtk/selection.h"
@@ -1360,6 +1361,11 @@ gui_window_event(struct gui_window *gw, enum gui_window_event event)
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 = {
.create = gui_window_create,
.destroy = gui_window_destroy,