diff options
-rw-r--r-- | ChangeLog | 24 | ||||
-rw-r--r-- | embed/mozilla/mozilla-notifiers.cpp | 18 | ||||
-rw-r--r-- | lib/widgets/ephy-search-entry.c | 201 | ||||
-rw-r--r-- | lib/widgets/ephy-search-entry.h | 59 | ||||
-rw-r--r-- | src/bookmarks/ephy-bookmarks-editor.c | 30 | ||||
-rw-r--r-- | src/ephy-history-window.c | 33 |
6 files changed, 296 insertions, 69 deletions
@@ -1,5 +1,29 @@ 2003-06-07 Marco Pesenti Gritti <marco@it.gnome.org> + * embed/mozilla/mozilla-notifiers.cpp: + + Remove some leftovers. + + * lib/widgets/Makefile.am: + * lib/widgets/ephy-search-entry.c: (ephy_search_entry_get_type), + (ephy_search_entry_class_init), (ephy_search_entry_timeout_cb), + (ephy_search_entry_changed_cb), + (ephy_search_entry_focus_out_event_cb), (ephy_search_entry_init), + (ephy_search_entry_finalize), (ephy_search_entry_new), + (ephy_search_entry_clear): + * lib/widgets/ephy-search-entry.h: + * src/bookmarks/ephy-bookmarks-editor.c: + (keyword_node_selected_cb), (search_entry_search_cb), + (build_search_box): + * src/ephy-history-window.c: (site_node_selected_cb), + (search_entry_search_cb), (build_search_box): + + Implement a search entry that delays searches a bit after + the user pressed key, to have autoapply but make it interactive + enough. (Based on rhythmbox one) + +2003-06-07 Marco Pesenti Gritti <marco@it.gnome.org> + * data/epiphany.schemas.in: * data/glade/prefs-dialog.glade: * embed/ephy-embed-prefs.h: diff --git a/embed/mozilla/mozilla-notifiers.cpp b/embed/mozilla/mozilla-notifiers.cpp index ce52e498e..58b306a13 100644 --- a/embed/mozilla/mozilla-notifiers.cpp +++ b/embed/mozilla/mozilla-notifiers.cpp @@ -107,12 +107,6 @@ mozilla_user_agent_notifier(GConfClient *client, GConfEntry *entry, EphyEmbedSingle *single); -static void -mozilla_socks_version_notifier (GConfClient *client, - guint cnxn_id, - GConfEntry *entry, - EphyEmbedSingle *single); - /* Keeps the list of the notifiers we installed for mozilla prefs */ /* to be able to remove them when exiting */ GList *mozilla_notifiers = NULL; @@ -710,15 +704,3 @@ mozilla_user_agent_notifier (GConfClient *client, break; } } - -static void -mozilla_socks_version_notifier (GConfClient *client, - guint cnxn_id, - GConfEntry *entry, - EphyEmbedSingle *single) -{ - int version; - version = gconf_value_get_int(entry->value) + 4; - mozilla_prefs_set_int ("network.proxy.socks_version", - version); -} diff --git a/lib/widgets/ephy-search-entry.c b/lib/widgets/ephy-search-entry.c new file mode 100644 index 000000000..9837da909 --- /dev/null +++ b/lib/widgets/ephy-search-entry.c @@ -0,0 +1,201 @@ +/* + * Copyright (C) 2002 Jorn Baayen <jorn@nl.linux.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * $Id$ + */ + +#include <gtk/gtklabel.h> +#include <config.h> +#include <libgnome/gnome-i18n.h> +#include <string.h> + +#include "ephy-search-entry.h" + +static void ephy_search_entry_class_init (EphySearchEntryClass *klass); +static void ephy_search_entry_init (EphySearchEntry *entry); +static void ephy_search_entry_finalize (GObject *object); + +struct EphySearchEntryPrivate +{ + gboolean clearing; + + guint timeout; +}; + +enum +{ + SEARCH, + LAST_SIGNAL +}; + +static GObjectClass *parent_class = NULL; + +static guint ephy_search_entry_signals[LAST_SIGNAL] = { 0 }; + +GType +ephy_search_entry_get_type (void) +{ + static GType ephy_search_entry_type = 0; + + if (ephy_search_entry_type == 0) + { + static const GTypeInfo our_info = + { + sizeof (EphySearchEntryClass), + NULL, + NULL, + (GClassInitFunc) ephy_search_entry_class_init, + NULL, + NULL, + sizeof (EphySearchEntry), + 0, + (GInstanceInitFunc) ephy_search_entry_init + }; + + ephy_search_entry_type = g_type_register_static (GTK_TYPE_ENTRY, + "EphySearchEntry", + &our_info, 0); + } + + return ephy_search_entry_type; +} + +static void +ephy_search_entry_class_init (EphySearchEntryClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_peek_parent (klass); + + object_class->finalize = ephy_search_entry_finalize; + + ephy_search_entry_signals[SEARCH] = + g_signal_new ("search", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (EphySearchEntryClass, search), + NULL, NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, + 1, + G_TYPE_STRING); +} + +static gboolean +ephy_search_entry_timeout_cb (EphySearchEntry *entry) +{ + gdk_threads_enter (); + + g_signal_emit (G_OBJECT (entry), ephy_search_entry_signals[SEARCH], 0, + gtk_entry_get_text (GTK_ENTRY (entry))); + entry->priv->timeout = 0; + + gdk_threads_leave (); + + return FALSE; +} + +static void +ephy_search_entry_changed_cb (GtkEditable *editable, + EphySearchEntry *entry) +{ + if (entry->priv->clearing == TRUE) + return; + + if (entry->priv->timeout != 0) + { + g_source_remove (entry->priv->timeout); + entry->priv->timeout = 0; + } + + entry->priv->timeout = g_timeout_add (300, (GSourceFunc) ephy_search_entry_timeout_cb, entry); +} + +static gboolean +ephy_search_entry_focus_out_event_cb (GtkWidget *widget, + GdkEventFocus *event, + EphySearchEntry *entry) +{ + if (entry->priv->timeout == 0) + return FALSE; + + g_source_remove (entry->priv->timeout); + entry->priv->timeout = 0; + + g_signal_emit (G_OBJECT (entry), ephy_search_entry_signals[SEARCH], 0, + gtk_entry_get_text (GTK_ENTRY (entry))); + + return FALSE; +} +static void +ephy_search_entry_init (EphySearchEntry *entry) +{ + entry->priv = g_new0 (EphySearchEntryPrivate, 1); + + g_signal_connect (G_OBJECT (entry), + "changed", + G_CALLBACK (ephy_search_entry_changed_cb), + entry); + g_signal_connect (G_OBJECT (entry), + "focus_out_event", + G_CALLBACK (ephy_search_entry_focus_out_event_cb), + entry); +} + +static void +ephy_search_entry_finalize (GObject *object) +{ + EphySearchEntry *entry; + + g_return_if_fail (object != NULL); + g_return_if_fail (EPHY_IS_SEARCH_ENTRY (object)); + + entry = EPHY_SEARCH_ENTRY (object); + + g_return_if_fail (entry->priv != NULL); + + g_free (entry->priv); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +GtkWidget * +ephy_search_entry_new (void) +{ + GtkWidget *entry; + + entry = GTK_WIDGET (g_object_new (EPHY_TYPE_SEARCH_ENTRY, + NULL)); + + return entry; +} + +void +ephy_search_entry_clear (EphySearchEntry *entry) +{ + if (entry->priv->timeout != 0) + { + g_source_remove (entry->priv->timeout); + entry->priv->timeout = 0; + } + + entry->priv->clearing = TRUE; + + gtk_entry_set_text (GTK_ENTRY (entry), ""); + + entry->priv->clearing = FALSE; +} diff --git a/lib/widgets/ephy-search-entry.h b/lib/widgets/ephy-search-entry.h new file mode 100644 index 000000000..95f8339ad --- /dev/null +++ b/lib/widgets/ephy-search-entry.h @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2002 Jorn Baayen <jorn@nl.linux.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * $Id$ + */ + +#ifndef EPHY_SEARCH_ENTRY_H +#define EPHY_SEARCH_ENTRY_H + +#include <gtk/gtkentry.h> + +G_BEGIN_DECLS + +#define EPHY_TYPE_SEARCH_ENTRY (ephy_search_entry_get_type ()) +#define EPHY_SEARCH_ENTRY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), EPHY_TYPE_SEARCH_ENTRY, EphySearchEntry)) +#define EPHY_SEARCH_ENTRY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), EPHY_TYPE_SEARCH_ENTRY, EphySearchEntryClass)) +#define EPHY_IS_SEARCH_ENTRY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), EPHY_TYPE_SEARCH_ENTRY)) +#define EPHY_IS_SEARCH_ENTRY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), EPHY_TYPE_SEARCH_ENTRY)) +#define EPHY_SEARCH_ENTRY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), EPHY_TYPE_SEARCH_ENTRY, EphySearchEntryClass)) + +typedef struct EphySearchEntryPrivate EphySearchEntryPrivate; + +typedef struct +{ + GtkEntry parent; + + EphySearchEntryPrivate *priv; +} EphySearchEntry; + +typedef struct +{ + GtkEntryClass parent; + + void (*search) (EphySearchEntry *view, const char *text); +} EphySearchEntryClass; + +GType ephy_search_entry_get_type (void); + +GtkWidget *ephy_search_entry_new (void); + +void ephy_search_entry_clear (EphySearchEntry *entry); + +G_END_DECLS + +#endif /* __EPHY_SEARCH_ENTRY_H */ diff --git a/src/bookmarks/ephy-bookmarks-editor.c b/src/bookmarks/ephy-bookmarks-editor.c index 81e6e1e4b..616fa10b9 100644 --- a/src/bookmarks/ephy-bookmarks-editor.c +++ b/src/bookmarks/ephy-bookmarks-editor.c @@ -53,6 +53,7 @@ #include "ephy-debug.h" #include "ephy-gui.h" #include "ephy-stock-icons.h" +#include "ephy-search-entry.h" static GtkTargetEntry topic_drag_dest_types [] = { @@ -90,8 +91,6 @@ static void ephy_bookmarks_editor_get_property (GObject *object, GParamSpec *pspec); static void ephy_bookmarks_editor_update_menu (EphyBookmarksEditor *editor); -static void search_entry_changed_cb (GtkWidget *entry, - EphyBookmarksEditor *editor); static void cmd_open_bookmarks_in_tabs (EggAction *action, EphyBookmarksEditor *editor); static void cmd_open_bookmarks_in_browser (EggAction *action, @@ -925,20 +924,6 @@ key_pressed_cb (EphyNodeView *view, } static void -reset_search_entry (EphyBookmarksEditor *editor) -{ - g_signal_handlers_block_by_func - (G_OBJECT (editor->priv->search_entry), - G_CALLBACK (search_entry_changed_cb), - editor); - gtk_entry_set_text (GTK_ENTRY (editor->priv->search_entry), ""); - g_signal_handlers_unblock_by_func - (G_OBJECT (editor->priv->search_entry), - G_CALLBACK (search_entry_changed_cb), - editor); -} - -static void keyword_node_selected_cb (EphyNodeView *view, EphyNode *node, EphyBookmarksEditor *editor) @@ -952,7 +937,7 @@ keyword_node_selected_cb (EphyNodeView *view, } else { - reset_search_entry (editor); + ephy_search_entry_clear (EPHY_SEARCH_ENTRY (editor->priv->search_entry)); bookmarks_filter (editor, node); } } @@ -969,10 +954,9 @@ keyword_node_show_popup_cb (GtkWidget *view, EphyBookmarksEditor *editor) } static void -search_entry_changed_cb (GtkWidget *entry, EphyBookmarksEditor *editor) +search_entry_search_cb (GtkWidget *entry, const char *search_text, EphyBookmarksEditor *editor) { EphyNode *all; - char *search_text; g_signal_handlers_block_by_func (G_OBJECT (editor->priv->key_view), @@ -1004,8 +988,6 @@ search_entry_changed_cb (GtkWidget *entry, EphyBookmarksEditor *editor) ephy_node_filter_done_changing (editor->priv->bookmarks_filter); GDK_THREADS_LEAVE (); - - g_free (search_text); } static GtkWidget * @@ -1020,11 +1002,11 @@ build_search_box (EphyBookmarksEditor *editor) gtk_container_set_border_width (GTK_CONTAINER (box), 6); gtk_widget_show (box); - entry = gtk_entry_new (); + entry = ephy_search_entry_new (); editor->priv->search_entry = entry; gtk_widget_show (entry); - g_signal_connect (G_OBJECT (entry), "changed", - G_CALLBACK (search_entry_changed_cb), + g_signal_connect (G_OBJECT (entry), "search", + G_CALLBACK (search_entry_search_cb), editor); add_entry_monitor (editor, entry); add_focus_monitor (editor, entry); diff --git a/src/ephy-history-window.c b/src/ephy-history-window.c index aaefb7b66..53433e6fc 100644 --- a/src/ephy-history-window.c +++ b/src/ephy-history-window.c @@ -37,7 +37,6 @@ #include "ephy-history-window.h" #include "ephy-shell.h" #include "ephy-dnd.h" -#include "ephy-prefs.h" #include "egg-action-group.h" #include "egg-toggle-action.h" #include "egg-menu-merge.h" @@ -50,6 +49,7 @@ #include "ephy-gui.h" #include "toolbar.h" #include "ephy-stock-icons.h" +#include "ephy-search-entry.h" static GtkTargetEntry page_drag_types [] = { @@ -73,8 +73,6 @@ static void ephy_history_window_get_property (GObject *object, GParamSpec *pspec); static void ephy_history_window_dispose (GObject *object); -static void search_entry_changed_cb (GtkWidget *entry, - EphyHistoryWindow *editor); static void cmd_open_bookmarks_in_tabs (EggAction *action, EphyHistoryWindow *editor); static void cmd_open_bookmarks_in_browser (EggAction *action, @@ -782,20 +780,6 @@ key_pressed_cb (EphyNodeView *view, } static void -reset_search_entry (EphyHistoryWindow *editor) -{ - g_signal_handlers_block_by_func - (G_OBJECT (editor->priv->search_entry), - G_CALLBACK (search_entry_changed_cb), - editor); - gtk_entry_set_text (GTK_ENTRY (editor->priv->search_entry), ""); - g_signal_handlers_unblock_by_func - (G_OBJECT (editor->priv->search_entry), - G_CALLBACK (search_entry_changed_cb), - editor); -} - -static void site_node_selected_cb (EphyNodeView *view, EphyNode *node, EphyHistoryWindow *editor) @@ -809,16 +793,15 @@ site_node_selected_cb (EphyNodeView *view, } else { - reset_search_entry (editor); + ephy_search_entry_clear (EPHY_SEARCH_ENTRY (editor->priv->search_entry)); pages_filter (editor, node); } } static void -search_entry_changed_cb (GtkWidget *entry, EphyHistoryWindow *editor) +search_entry_search_cb (GtkWidget *entry, char *search_text, EphyHistoryWindow *editor) { EphyNode *all; - char *search_text; g_signal_handlers_block_by_func (G_OBJECT (editor->priv->sites_view), @@ -832,8 +815,6 @@ search_entry_changed_cb (GtkWidget *entry, EphyHistoryWindow *editor) G_CALLBACK (site_node_selected_cb), editor); - search_text = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1); - GDK_THREADS_ENTER (); ephy_node_filter_empty (editor->priv->pages_filter); @@ -850,8 +831,6 @@ search_entry_changed_cb (GtkWidget *entry, EphyHistoryWindow *editor) ephy_node_filter_done_changing (editor->priv->pages_filter); GDK_THREADS_LEAVE (); - - g_free (search_text); } static GtkWidget * @@ -866,13 +845,13 @@ build_search_box (EphyHistoryWindow *editor) gtk_container_set_border_width (GTK_CONTAINER (box), 6); gtk_widget_show (box); - entry = gtk_entry_new (); + entry = ephy_search_entry_new (); add_focus_monitor (editor, entry); add_entry_monitor (editor, entry); editor->priv->search_entry = entry; gtk_widget_show (entry); - g_signal_connect (G_OBJECT (entry), "changed", - G_CALLBACK (search_entry_changed_cb), + g_signal_connect (G_OBJECT (entry), "search", + G_CALLBACK (search_entry_search_cb), editor); label = gtk_label_new (NULL); |