summaryrefslogtreecommitdiff
path: root/gtk
diff options
context:
space:
mode:
authorVincent Sanders <vince@kyllikki.org>2014-05-25 00:57:48 +0100
committerVincent Sanders <vince@kyllikki.org>2014-05-25 01:01:59 +0100
commita6d3ceae0ee7cee85020a70b716586425a042900 (patch)
tree1177195f3f3ab1b38d7beb2ec5e412bc2170e4c2 /gtk
parentfb5af8a1b612e210384a1a6a4f8d5ee5fafef054 (diff)
downloadnetsurf-a6d3ceae0ee7cee85020a70b716586425a042900.tar.gz
netsurf-a6d3ceae0ee7cee85020a70b716586425a042900.tar.bz2
Completely re-write web search provider handling
Diffstat (limited to 'gtk')
-rw-r--r--gtk/dialogs/preferences.c26
-rw-r--r--gtk/gui.c18
-rw-r--r--gtk/scaffolding.c119
-rw-r--r--gtk/scaffolding.h6
-rw-r--r--gtk/search.c30
-rw-r--r--gtk/toolbar.c3
6 files changed, 99 insertions, 103 deletions
diff --git a/gtk/dialogs/preferences.c b/gtk/dialogs/preferences.c
index d36d0c68b..f5d92e361 100644
--- a/gtk/dialogs/preferences.c
+++ b/gtk/dialogs/preferences.c
@@ -18,6 +18,7 @@
#include <stdint.h>
#include <math.h>
+#include <string.h>
#include "utils/utils.h"
#include "utils/messages.h"
@@ -923,8 +924,6 @@ TOGGLEBUTTON_SIGNALS(checkUrlSearch, search_url_bar)
G_MODULE_EXPORT void
nsgtk_preferences_comboSearch_changed(GtkComboBox *widget, struct ppref *priv)
{
- nsgtk_scaffolding *current = scaf_list;
- char *name;
int provider;
provider = gtk_combo_box_get_active(widget);
@@ -932,27 +931,8 @@ nsgtk_preferences_comboSearch_changed(GtkComboBox *widget, struct ppref *priv)
/* set the option */
nsoption_set_int(search_provider, provider);
- /* refresh web search prefs from file */
- search_web_provider_details(provider);
-
- /* retrieve ico */
- search_web_retrieve_ico(false);
-
- /* callback may handle changing gui */
- gui_set_search_ico(search_web_ico());
-
- /* set entry */
- name = search_web_provider_name();
- if (name != NULL) {
- char content[strlen(name) + SLEN("Search ") + 1];
-
- sprintf(content, "Search %s", name);
- free(name);
- while (current) {
- nsgtk_scaffolding_set_websearch(current, content);
- current = nsgtk_scaffolding_iterate(current);
- }
- }
+ /* set search provider */
+ search_web_select_provider(provider);
}
G_MODULE_EXPORT void
diff --git a/gtk/gui.c b/gtk/gui.c
index b14b4fbe2..3f0d6119f 100644
--- a/gtk/gui.c
+++ b/gtk/gui.c
@@ -364,12 +364,12 @@ static void gui_init(int argc, char** argv, char **respath)
}
/* Search engine sources */
- search_engines_file_location = filepath_find(respath, "SearchEngines");
- LOG(("Using '%s' as Search Engines file", search_engines_file_location));
-
- /* Default Icon */
- search_default_ico_location = filepath_find(respath, "default.ico");
- LOG(("Using '%s' as default search ico", search_default_ico_location));
+ resource_filename = filepath_find(respath, "SearchEngines");
+ search_web_init(resource_filename);
+ if (resource_filename != NULL) {
+ LOG(("Using '%s' as Search Engines file", resource_filename));
+ free(resource_filename);
+ }
/* Default favicon */
resource_filename = filepath_find(respath, "favicon.png");
@@ -562,8 +562,6 @@ static void gui_quit(void)
nsgtk_history_destroy();
nsgtk_hotlist_destroy();
- free(search_engines_file_location);
- free(search_default_ico_location);
free(toolbar_indices_file_location);
free(nsgtk_config_home);
@@ -1250,7 +1248,6 @@ static struct gui_browser_table nsgtk_browser_table = {
.schedule = nsgtk_schedule,
.quit = gui_quit,
- .set_search_ico = gui_set_search_ico,
.launch_url = gui_launch_url,
.create_form_select_menu = gui_create_form_select_menu,
.cert_verify = gui_cert_verify,
@@ -1271,8 +1268,9 @@ int main(int argc, char** argv)
.clipboard = nsgtk_clipboard_table,
.download = nsgtk_download_table,
.fetch = nsgtk_fetch_table,
- .search = nsgtk_search_table,
.llcache = filesystem_llcache_table,
+ .search = nsgtk_search_table,
+ .search_web = nsgtk_search_web_table,
};
ret = netsurf_register(&nsgtk_table);
diff --git a/gtk/scaffolding.c b/gtk/scaffolding.c
index 7ae61dac0..7d4c49c92 100644
--- a/gtk/scaffolding.c
+++ b/gtk/scaffolding.c
@@ -417,29 +417,20 @@ static gboolean nsgtk_window_popup_menu_hidden(GtkWidget *widget,
gboolean nsgtk_window_url_activate_event(GtkWidget *widget, gpointer data)
{
struct gtk_scaffolding *g = data;
- struct browser_window *bw = nsgtk_get_browser_window(g->top_level);
- char *urltxt;
+ nserror ret;
nsurl *url;
- nserror error;
- if (search_is_url(gtk_entry_get_text(GTK_ENTRY(g->url_bar))) == false) {
- urltxt = search_web_from_term(gtk_entry_get_text(GTK_ENTRY(
- g->url_bar)));
- } else {
- urltxt = strdup(gtk_entry_get_text(GTK_ENTRY(g->url_bar)));
+ ret = search_web_omni(gtk_entry_get_text(GTK_ENTRY(g->url_bar)),
+ SEARCH_WEB_OMNI_NONE,
+ &url);
+ if (ret == NSERROR_OK) {
+ ret = browser_window_navigate(nsgtk_get_browser_window(g->top_level),
+ url, NULL, BW_NAVIGATE_HISTORY,
+ NULL, NULL, NULL);
+ nsurl_unref(url);
}
-
- if (urltxt != NULL) {
- error = nsurl_create(urltxt, &url);
- if (error != NSERROR_OK) {
- warn_user(messages_get_errorcode(error), 0);
- } else {
- browser_window_navigate(bw, url, NULL,
- BW_NAVIGATE_HISTORY, NULL,
- NULL, NULL);
- nsurl_unref(url);
- }
- free(urltxt);
+ if (ret != NSERROR_OK) {
+ warn_user(messages_get_errorcode(ret), 0);
}
return TRUE;
@@ -1814,7 +1805,6 @@ static bool nsgtk_new_scaffolding_popup(struct gtk_scaffolding *g, GtkAccelGroup
nsgtk_scaffolding *nsgtk_new_scaffolding(struct gui_window *toplevel)
{
struct gtk_scaffolding *g;
- char *searchname;
int i;
GtkAccelGroup *group;
GError* error = NULL;
@@ -2078,30 +2068,10 @@ nsgtk_scaffolding *nsgtk_new_scaffolding(struct gui_window *toplevel)
nsgtk_toolbar_connect_all(g);
nsgtk_attach_menu_handlers(g);
- /* prepare to set the web search ico */
-
- /* init web search prefs from file */
- search_web_provider_details(nsoption_int(search_provider));
-
- /* potentially retrieve ico */
- if (search_web_ico() == NULL) {
- search_web_retrieve_ico(false);
- }
-
- /* set entry */
- searchname = search_web_provider_name();
- if (searchname != NULL) {
- char searchcontent[strlen(searchname) + SLEN("Search ") + 1];
- sprintf(searchcontent, "Search %s", searchname);
- nsgtk_scaffolding_set_websearch(g, searchcontent);
- free(searchname);
- }
-
nsgtk_scaffolding_initial_sensitivity(g);
g->fullscreen = false;
-
/* attach to the list */
if (scaf_list)
scaf_list->prev = g;
@@ -2113,8 +2083,8 @@ nsgtk_scaffolding *nsgtk_new_scaffolding(struct gui_window *toplevel)
nsgtk_theme_init();
nsgtk_theme_implement(g);
- /* set web search ico */
- gui_set_search_ico(search_web_ico());
+ /* set web search provider */
+ search_web_select_provider(nsoption_int(search_provider));
/* finally, show the window. */
gtk_widget_show(GTK_WIDGET(g->window));
@@ -2227,38 +2197,65 @@ nsgtk_scaffolding_set_icon(struct gui_window *gw)
gtk_widget_show_all(GTK_WIDGET(sc->buttons[URL_BAR_ITEM]->button));
}
-void gui_set_search_ico(hlcache_handle *ico)
+/**
+ * Gui callback when search provider details are updated.
+ *
+ * \param provider_name The providers name.
+ * \param ico_bitmap The icon bitmap representing the provider.
+ * \return NSERROR_OK on success else error code.
+ */
+static nserror
+gui_search_web_provider_update(const char *provider_name,
+ struct bitmap *provider_bitmap)
{
- struct bitmap *srch_bitmap;
nsgtk_scaffolding *current;
- GdkPixbuf *srch_pixbuf;
+ GdkPixbuf *srch_pixbuf = NULL;
+ char *searchcontent;
- if ((ico == NULL) &&
- (ico = search_web_ico()) == NULL) {
- return;
- }
+ if (provider_bitmap != NULL) {
+ srch_pixbuf = nsgdk_pixbuf_get_from_surface(provider_bitmap->surface, 16, 16);
- srch_bitmap = content_get_bitmap(ico);
- if (srch_bitmap == NULL) {
- return;
+ if (srch_pixbuf == NULL) {
+ return NSERROR_NOMEM;
+ }
}
- srch_pixbuf = nsgdk_pixbuf_get_from_surface(srch_bitmap->surface, 16, 16);
-
- if (srch_pixbuf == NULL) {
- return;
+ /* setup the search content name */
+ searchcontent = malloc(strlen(provider_name) + SLEN("Search ") + 1);
+ if (searchcontent != NULL) {
+ sprintf(searchcontent, "Search %s", provider_name);
}
- /* add ico to each window's toolbar */
+ /* set the search provider parameters up in each scaffold */
for (current = scaf_list; current != NULL; current = current->next) {
- nsgtk_entry_set_icon_from_pixbuf(current->webSearchEntry,
- GTK_ENTRY_ICON_PRIMARY,
- srch_pixbuf);
+ /* add ico to each window's toolbar */
+ if (srch_pixbuf != NULL) {
+ nsgtk_entry_set_icon_from_pixbuf(current->webSearchEntry,
+ GTK_ENTRY_ICON_PRIMARY,
+ srch_pixbuf);
+ }
+
+ /* set search entry text */
+ if (searchcontent != NULL) {
+ nsgtk_scaffolding_set_websearch(current, searchcontent);
+ } else {
+ nsgtk_scaffolding_set_websearch(current, provider_name);
+ }
}
+ free(searchcontent);
+
g_object_unref(srch_pixbuf);
+
+ return NSERROR_OK;
}
+static struct gui_search_web_table search_web_table = {
+ .provider_update = gui_search_web_provider_update,
+};
+
+struct gui_search_web_table *nsgtk_search_web_table = &search_web_table;
+
bool nsgtk_scaffolding_is_busy(nsgtk_scaffolding *g)
{
/* We are considered "busy" if the stop button is sensitive */
diff --git a/gtk/scaffolding.h b/gtk/scaffolding.h
index 285f9bb53..f03a3402a 100644
--- a/gtk/scaffolding.h
+++ b/gtk/scaffolding.h
@@ -22,10 +22,14 @@
#include <stdbool.h>
#include "utils/errors.h"
+struct bitmap;
struct hlcache_handle;
struct gui_window;
+struct gui_search_web_table;
typedef struct gtk_scaffolding nsgtk_scaffolding;
+extern struct gui_search_web_table *nsgtk_search_web_table;
+
typedef enum {
BACK_BUTTON = 0,
HISTORY_BUTTON,
@@ -178,6 +182,6 @@ void gui_window_set_title(struct gui_window *g, const char *title);
void gui_window_set_url(struct gui_window *g, const char *url);
void gui_window_start_throbber(struct gui_window *g);
void gui_window_stop_throbber(struct gui_window *g);
-void gui_set_search_ico(struct hlcache_handle *ico);
+
#endif /* NETSURF_GTK_SCAFFOLDING_H */
diff --git a/gtk/search.c b/gtk/search.c
index 44f9ddeb6..2bb8a85bd 100644
--- a/gtk/search.c
+++ b/gtk/search.c
@@ -192,13 +192,29 @@ gboolean nsgtk_search_entry_key(GtkWidget *widget, GdkEventKey *event,
gboolean nsgtk_websearch_activate(GtkWidget *widget, gpointer data)
{
- struct gtk_scaffolding *g = (struct gtk_scaffolding *)data;
- temp_open_background = 0;
- search_web_new_window(nsgtk_get_browser_window(
- nsgtk_scaffolding_top_level(g)),
- (char *)gtk_entry_get_text(GTK_ENTRY(
- nsgtk_scaffolding_websearch(g))));
- temp_open_background = -1;
+ struct gtk_scaffolding *g = data;
+ nserror ret;
+ nsurl *url;
+
+ ret = search_web_omni(
+ gtk_entry_get_text(GTK_ENTRY(nsgtk_scaffolding_websearch(g))),
+ SEARCH_WEB_OMNI_SEARCHONLY,
+ &url);
+ if (ret == NSERROR_OK) {
+ temp_open_background = 0;
+ ret = browser_window_create(
+ BW_CREATE_HISTORY | BW_CREATE_TAB,
+ url,
+ NULL,
+ nsgtk_get_browser_window(nsgtk_scaffolding_top_level(g)),
+ NULL);
+ temp_open_background = -1;
+ nsurl_unref(url);
+ }
+ if (ret != NSERROR_OK) {
+ warn_user(messages_get_errorcode(ret), 0);
+ }
+
return TRUE;
}
diff --git a/gtk/toolbar.c b/gtk/toolbar.c
index d4a197bd4..c60bab6f1 100644
--- a/gtk/toolbar.c
+++ b/gtk/toolbar.c
@@ -16,6 +16,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <string.h>
#include <gtk/gtk.h>
#include "desktop/browser.h"
@@ -438,7 +439,7 @@ void nsgtk_toolbar_close(nsgtk_scaffolding *g)
/* update favicon etc */
nsgtk_scaffolding_set_top_level(nsgtk_scaffolding_top_level(g));
- gui_set_search_ico(search_web_ico());
+ search_web_select_provider(-1);
}
/**