diff options
-rw-r--r-- | gtk/gtk_completion.c | 59 | ||||
-rw-r--r-- | gtk/gtk_completion.h | 21 | ||||
-rw-r--r-- | gtk/gtk_gui.c | 3 | ||||
-rw-r--r-- | gtk/gtk_window.c | 36 | ||||
-rw-r--r-- | makefile | 5 |
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) @@ -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 |