summaryrefslogtreecommitdiff
path: root/gtk
diff options
context:
space:
mode:
authorRob Kendrick <rjek@netsurf-browser.org>2006-07-25 20:55:10 +0000
committerRob Kendrick <rjek@netsurf-browser.org>2006-07-25 20:55:10 +0000
commit546efe6d6c2e9a8481c545988389962ac3e14459 (patch)
treeaa3143220324efa08d7ad973632d1d32af8762fa /gtk
parent000f7502ba5ff036883c6484ca36594fc9ffb469 (diff)
downloadnetsurf-546efe6d6c2e9a8481c545988389962ac3e14459.tar.gz
netsurf-546efe6d6c2e9a8481c545988389962ac3e14459.tar.bz2
Initial work on URL completion in nsgtk. Some problems still exist.
1. It works without the code that should be required to make it do so. Boggle. 2. It appears to include the URLs to images and other resources as well as pages 3. Although you can highlight a completion with the cursor keys, pressing enter on one doesn't work - you need to click on it with the mouse. svn path=/trunk/netsurf/; revision=2795
Diffstat (limited to 'gtk')
-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
4 files changed, 117 insertions, 2 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)