summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk/gtk_completion.c59
-rw-r--r--gtk/gtk_completion.h21
-rw-r--r--gtk/gtk_gui.c3
-rw-r--r--gtk/gtk_window.c36
-rw-r--r--makefile5
5 files changed, 120 insertions, 4 deletions
diff --git a/gtk/gtk_completion.c b/gtk/gtk_completion.c
new file mode 100644
index 000000000..d173dde27
--- /dev/null
+++ b/gtk/gtk_completion.c
@@ -0,0 +1,59 @@
+/*
+ * This file is part of NetSurf, http://netsurf.sourceforge.net/
+ * Licensed under the GNU General Public License,
+ * http://www.opensource.org/licenses/gpl-license
+ * Copyright 2006 Rob Kendrick <rjek@rjek.com>
+ */
+
+#include <gtk/gtk.h>
+#include "netsurf/gtk/gtk_completion.h"
+#include "netsurf/content/urldb.h"
+#include "netsurf/utils/log.h"
+
+GtkListStore *nsgtk_completion_list;
+
+static void nsgtk_completion_empty(void);
+static bool nsgtk_completion_udb_callback(const char *url,
+ const struct url_data *data);
+
+void nsgtk_completion_init(void)
+{
+ nsgtk_completion_list = gtk_list_store_new(1, G_TYPE_STRING);
+
+}
+
+gboolean nsgtk_completion_match(GtkEntryCompletion *completion,
+ const gchar *key,
+ GtkTreeIter *iter,
+ gpointer user_data)
+{
+ char *b[4096]; /* no way of finding out its length :( */
+ gtk_tree_model_get(GTK_TREE_MODEL(nsgtk_completion_list), iter,
+ 0, b, -1);
+
+ /* TODO: work out why this works, when there's no code to implement
+ * it. I boggle. */
+
+ return TRUE;
+
+}
+
+void nsgtk_completion_empty(void)
+{
+ gtk_list_store_clear(nsgtk_completion_list);
+}
+
+bool nsgtk_completion_udb_callback(const char *url, const struct url_data *data)
+{
+ GtkTreeIter iter;
+ gtk_list_store_append(nsgtk_completion_list, &iter);
+ gtk_list_store_set(nsgtk_completion_list, &iter, 0, url, -1);
+ return true;
+}
+
+void nsgtk_completion_update(const char *prefix)
+{
+ nsgtk_completion_empty();
+ urldb_iterate_partial(prefix, nsgtk_completion_udb_callback);
+}
+
diff --git a/gtk/gtk_completion.h b/gtk/gtk_completion.h
new file mode 100644
index 000000000..73cda1eae
--- /dev/null
+++ b/gtk/gtk_completion.h
@@ -0,0 +1,21 @@
+/*
+ * This file is part of NetSurf, http://netsurf.sourceforge.net/
+ * Licensed under the GNU General Public License,
+ * http://www.opensource.org/licenses/gpl-license
+ * Copyright 2006 Rob Kendrick <rjek@rjek.com>
+ */
+
+#ifndef _NETSURF_GTK_COMPLETION_H_
+#define _NETSURF_GTK_COMPLETION_H_
+
+#include <gtk/gtk.h>
+
+extern GtkListStore *nsgtk_completion_list;
+
+void nsgtk_completion_init(void);
+void nsgtk_completion_update(const char *prefix);
+gboolean nsgtk_completion_match(GtkEntryCompletion *completion,
+ const gchar *key,
+ GtkTreeIter *iter,
+ gpointer user_data);
+#endif
diff --git a/gtk/gtk_gui.c b/gtk/gtk_gui.c
index 164e83dc5..925cd1789 100644
--- a/gtk/gtk_gui.c
+++ b/gtk/gtk_gui.c
@@ -28,6 +28,7 @@
#include "netsurf/desktop/options.h"
#include "netsurf/gtk/gtk_gui.h"
#include "netsurf/gtk/gtk_options.h"
+#include "netsurf/gtk/gtk_completion.h"
#include "netsurf/render/box.h"
#include "netsurf/render/form.h"
#include "netsurf/render/html.h"
@@ -111,6 +112,8 @@ void gui_init(int argc, char** argv)
glade_xml_signal_autoconnect(gladeWindows);
+ nsgtk_completion_init();
+
find_resource(buf, "Choices", "Choices");
LOG(("Using '%s' as Choices file", buf));
options_file_location = strdup(buf);
diff --git a/gtk/gtk_window.c b/gtk/gtk_window.c
index 0a263f949..9e2deb81a 100644
--- a/gtk/gtk_window.c
+++ b/gtk/gtk_window.c
@@ -24,6 +24,7 @@
#include "netsurf/gtk/gtk_plotters.h"
#include "netsurf/gtk/gtk_window.h"
#include "netsurf/gtk/gtk_options.h"
+#include "netsurf/gtk/gtk_completion.h"
#include "netsurf/render/box.h"
#include "netsurf/render/font.h"
#include "netsurf/render/form.h"
@@ -94,6 +95,8 @@ gboolean nsgtk_window_expose_event(GtkWidget *widget,
GdkEventExpose *event, gpointer data);
gboolean nsgtk_window_url_keypress_event(GtkWidget *widget,
GdkEventKey *event, gpointer data);
+gboolean nsgtk_window_url_changed(GtkWidget *widget, GdkEventKey *event,
+ gpointer data);
gboolean nsgtk_window_configure_event(GtkWidget *widget,
GdkEventConfigure *event, gpointer data);
gboolean nsgtk_window_motion_notify_event(GtkWidget *widget,
@@ -134,6 +137,7 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
GtkWidget *scrolled, *history_scrolled;
GtkWidget *drawing_area, *history_area;
GtkWidget *status_box;
+ GtkEntryCompletion *url_bar_completion;
g = malloc(sizeof *g);
if (!g) {
@@ -289,9 +293,9 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
gtk_widget_set_size_request(g->progress_bar, 64, 0);
gtk_box_pack_end(GTK_BOX(status_box), g->progress_bar, FALSE, FALSE, 0);
+ g->window = window;
gtk_widget_show(window);
- g->window = window;
g->url_bar = url_bar;
g->drawing_area = drawing_area;
g->bw = bw;
@@ -302,11 +306,30 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
else
g->scale = 1.0;
+ /* set up URL bar completion */
+
+ url_bar_completion = gtk_entry_completion_new();
+ gtk_entry_set_completion(GTK_ENTRY(url_bar), url_bar_completion);
+ gtk_entry_completion_set_match_func(url_bar_completion,
+ nsgtk_completion_match, NULL, NULL);
+ gtk_entry_completion_set_model(url_bar_completion,
+ GTK_TREE_MODEL(nsgtk_completion_list));
+ gtk_entry_completion_set_text_column(url_bar_completion, 0);
+ gtk_entry_completion_set_minimum_key_length(url_bar_completion, 1);
+ gtk_entry_completion_set_popup_completion(url_bar_completion, TRUE);
+ gtk_entry_completion_set_popup_set_width(url_bar_completion, TRUE);
+ gtk_entry_completion_set_popup_single_match(url_bar_completion, TRUE);
+
+
#define NS_SIGNAL_CONNECT(obj, sig, callback, ptr) \
g_signal_connect(G_OBJECT(obj), (sig), G_CALLBACK(callback), (ptr))
NS_SIGNAL_CONNECT(window, "destroy", nsgtk_window_destroy_event, g);
-
+
+ g_signal_connect(G_OBJECT(url_bar), "changed",
+ G_CALLBACK(nsgtk_window_url_changed), g);
+// g_signal_connect(G_OBJECT(url_bar_completion), "match-selected",
+// G_CALLBACK(nsgtk_window_completion_selected), g);
g_signal_connect(G_OBJECT(drawing_area), "expose_event",
G_CALLBACK(nsgtk_window_expose_event), g);
g_signal_connect(G_OBJECT(drawing_area), "configure_event",
@@ -576,6 +599,15 @@ gboolean nsgtk_window_url_keypress_event(GtkWidget *widget,
return TRUE;
}
+gboolean nsgtk_window_url_changed(GtkWidget *widget, GdkEventKey *event,
+ gpointer data)
+{
+ struct gui_window *g = data;
+ const char *prefix;
+ prefix = gtk_entry_get_text(GTK_ENTRY(widget));
+ nsgtk_completion_update(prefix);
+}
+
gboolean nsgtk_window_keypress_event(GtkWidget *widget,
GdkEventKey *event,
gpointer data)
diff --git a/makefile b/makefile
index f70040c09..4e7203e9f 100644
--- a/makefile
+++ b/makefile
@@ -68,7 +68,8 @@ OBJECTS_GTK += browser.o history_core.o netsurf.o selection.o textinput.o \
version.o gesture_core.o # desktop/
OBJECTS_GTK += font_pango.o gtk_bitmap.o gtk_gui.o \
gtk_schedule.o gtk_thumbnail.o gtk_options.o \
- gtk_plotters.o gtk_treeview.o gtk_window.o # gtk/
+ gtk_plotters.o gtk_treeview.o gtk_window.o \
+ gtk_completion.o # gtk/
OBJDIR_RISCOS = arm-riscos-aof
@@ -121,7 +122,7 @@ CFLAGS_NCOS = $(CFLAGS_RISCOS) -Dncos
CFLAGS_DEBUG = -std=c9x -D_BSD_SOURCE -DDEBUG_BUILD $(WARNFLAGS) -I.. \
$(PLATFORM_CFLAGS_DEBUG) -g
CFLAGS_GTK = -Dnsgtk -std=c9x -D_BSD_SOURCE -D_POSIX_C_SOURCE -Dgtk \
- $(WARNFLAGS) -I.. -g -O0 -Wformat=2 \
+ $(WARNFLAGS) -I.. -g -O2 -Wformat=2 \
`pkg-config --cflags libglade-2.0 gtk+-2.0` `xml2-config --cflags`
# Stop GCC under Cygwin throwing a fit