[epiphany] Replace smart bookmarks feature with search engine manager
- From: Michael Catanzaro <mcatanzaro src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [epiphany] Replace smart bookmarks feature with search engine manager
- Date: Fri, 24 Feb 2017 22:10:21 +0000 (UTC)
commit cdf7fc59720231e338b8eaa4fde09d3c4959f6cc
Author: cedlemo <cedlemo gmx com>
Date: Wed Feb 15 16:08:37 2017 +0100
Replace smart bookmarks feature with search engine manager
https://bugzilla.gnome.org/show_bug.cgi?id=776738
lib/ephy-profile-utils.h | 2 +-
lib/ephy-search-engine-manager.c | 28 ++++
src/Makefile.am | 2 -
src/bookmarks/ephy-bookmark.c | 35 -----
src/bookmarks/ephy-bookmark.h | 4 -
src/bookmarks/ephy-bookmarks-list-model.c | 193 ------------------------
src/bookmarks/ephy-bookmarks-list-model.h | 36 -----
src/bookmarks/ephy-bookmarks-manager.c | 97 ++++++++-----
src/bookmarks/ephy-bookmarks-manager.h | 1 -
src/bookmarks/ephy-bookmarks-popover.c | 42 +-----
src/ephy-completion-model.c | 5 +-
src/ephy-location-controller.c | 205 +++++++++++---------------
src/profile-migrator/ephy-profile-migrator.c | 58 +++++++
13 files changed, 238 insertions(+), 470 deletions(-)
---
diff --git a/lib/ephy-profile-utils.h b/lib/ephy-profile-utils.h
index 80a368a..dd8943d 100644
--- a/lib/ephy-profile-utils.h
+++ b/lib/ephy-profile-utils.h
@@ -24,7 +24,7 @@
G_BEGIN_DECLS
-#define EPHY_PROFILE_MIGRATION_VERSION 16
+#define EPHY_PROFILE_MIGRATION_VERSION 17
#define EPHY_INSECURE_PASSWORDS_MIGRATION_VERSION 11
#define EPHY_SETTINGS_MIGRATION_VERSION 16
diff --git a/lib/ephy-search-engine-manager.c b/lib/ephy-search-engine-manager.c
index d8c6b74..3357f83 100644
--- a/lib/ephy-search-engine-manager.c
+++ b/lib/ephy-search-engine-manager.c
@@ -27,6 +27,13 @@
#include "ephy-settings.h"
#include "ephy-prefs.h"
+enum {
+ SEARCH_ENGINES_CHANGED,
+ LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL];
+
struct _EphySearchEngineManager
{
GObject parent_instance;
@@ -61,6 +68,16 @@ ephy_search_engine_info_new (const char *address,
}
static void
+search_engines_changed_cb (GSettings *settings,
+ char *key,
+ gpointer user_data)
+{
+
+ g_signal_emit (EPHY_SEARCH_ENGINE_MANAGER (user_data),
+ signals[SEARCH_ENGINES_CHANGED], 0);
+}
+
+static void
ephy_search_engine_manager_init (EphySearchEngineManager *manager)
{
const char *address;
@@ -81,6 +98,10 @@ ephy_search_engine_manager_init (EphySearchEngineManager *manager)
ephy_search_engine_info_new (address,
bang));
}
+
+ g_signal_connect (EPHY_SETTINGS_MAIN,
+ "changed::search-engines",
+ G_CALLBACK (search_engines_changed_cb), manager);
}
static void
@@ -99,6 +120,13 @@ ephy_search_engine_manager_class_init (EphySearchEngineManagerClass *klass)
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->dispose = ephy_search_engine_manager_dispose;
+
+ signals[SEARCH_ENGINES_CHANGED] = g_signal_new ("changed",
+ EPHY_TYPE_SEARCH_ENGINE_MANAGER,
+ G_SIGNAL_RUN_LAST,
+ 0,
+ NULL, NULL, NULL,
+ G_TYPE_NONE, 0);
}
EphySearchEngineManager *
diff --git a/src/Makefile.am b/src/Makefile.am
index 9230a3f..b2dc1e6 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -34,8 +34,6 @@ libephymain_la_SOURCES = \
bookmarks/ephy-bookmarks-export.h \
bookmarks/ephy-bookmarks-import.c \
bookmarks/ephy-bookmarks-import.h \
- bookmarks/ephy-bookmarks-list-model.c \
- bookmarks/ephy-bookmarks-list-model.h \
bookmarks/ephy-bookmarks-manager.c \
bookmarks/ephy-bookmarks-manager.h \
bookmarks/ephy-bookmarks-popover.c \
diff --git a/src/bookmarks/ephy-bookmark.c b/src/bookmarks/ephy-bookmark.c
index 80431a8..509276c 100644
--- a/src/bookmarks/ephy-bookmark.c
+++ b/src/bookmarks/ephy-bookmark.c
@@ -615,38 +615,3 @@ out:
return bookmark;
}
#endif
-
-gboolean
-ephy_bookmark_is_smart (EphyBookmark *bookmark)
-{
- g_return_val_if_fail (EPHY_IS_BOOKMARK (bookmark), FALSE);
-
- return !!strstr (bookmark->url, "%s");
-}
-
-char *
-ephy_bookmark_resolve_smart_url (EphyBookmark *bookmark,
- const char *search_term)
-{
- GString *url;
- const char *original_url;
- char *result;
- gssize pos;
-
- g_return_val_if_fail (EPHY_IS_BOOKMARK (bookmark), FALSE);
- g_return_val_if_fail (ephy_bookmark_is_smart (bookmark), FALSE);
- g_return_val_if_fail (search_term != NULL, FALSE);
- g_return_val_if_fail (search_term[0] != '\0', FALSE);
-
- original_url = ephy_bookmark_get_url (bookmark);
- url = g_string_new (original_url);
- pos = (gssize)(strstr (original_url, "%s") - original_url);
- g_assert (pos > 0);
-
- g_string_erase (url, pos, 2);
- g_string_insert (url, pos, search_term);
-
- result = url->str;
- g_string_free (url, FALSE);
- return result;
-}
diff --git a/src/bookmarks/ephy-bookmark.h b/src/bookmarks/ephy-bookmark.h
index 7f159e3..8ce771e 100644
--- a/src/bookmarks/ephy-bookmark.h
+++ b/src/bookmarks/ephy-bookmark.h
@@ -75,8 +75,4 @@ char *ephy_bookmark_to_bso (EphyBookmark *self);
EphyBookmark *ephy_bookmark_from_bso (JsonObject *bso);
#endif
-gboolean ephy_bookmark_is_smart (EphyBookmark *self);
-char *ephy_bookmark_resolve_smart_url (EphyBookmark *self,
- const char *search_term);
-
G_END_DECLS
diff --git a/src/bookmarks/ephy-bookmarks-manager.c b/src/bookmarks/ephy-bookmarks-manager.c
index c10006b..a71e921 100644
--- a/src/bookmarks/ephy-bookmarks-manager.c
+++ b/src/bookmarks/ephy-bookmarks-manager.c
@@ -40,7 +40,10 @@ struct _EphyBookmarksManager {
gchar *gvdb_filename;
};
-G_DEFINE_TYPE (EphyBookmarksManager, ephy_bookmarks_manager, G_TYPE_OBJECT)
+static void list_model_iface_init (GListModelInterface *iface);
+
+G_DEFINE_TYPE_EXTENDED (EphyBookmarksManager, ephy_bookmarks_manager, G_TYPE_OBJECT, 0,
+ G_IMPLEMENT_INTERFACE (G_TYPE_LIST_MODEL, list_model_iface_init))
enum {
BOOKMARK_ADDED,
@@ -185,6 +188,40 @@ ephy_bookmarks_manager_init (EphyBookmarksManager *self)
ephy_bookmarks_manager_load_from_file (self);
}
+static GType
+ephy_bookmarks_manager_list_model_get_item_type (GListModel *model)
+{
+ return EPHY_TYPE_BOOKMARK;
+}
+
+static guint
+ephy_bookmarks_manager_list_model_get_n_items (GListModel *model)
+{
+ EphyBookmarksManager *self = EPHY_BOOKMARKS_MANAGER (model);
+
+ return g_sequence_get_length (self->bookmarks);
+}
+
+static gpointer
+ephy_bookmarks_manager_list_model_get_item (GListModel *model,
+ guint position)
+{
+ EphyBookmarksManager *self = EPHY_BOOKMARKS_MANAGER (model);
+ GSequenceIter *iter;
+
+ iter = g_sequence_get_iter_at_pos (self->bookmarks, position);
+
+ return g_object_ref (g_sequence_get (iter));
+}
+
+static void
+list_model_iface_init (GListModelInterface *iface)
+{
+ iface->get_item_type = ephy_bookmarks_manager_list_model_get_item_type;
+ iface->get_n_items = ephy_bookmarks_manager_list_model_get_n_items;
+ iface->get_item = ephy_bookmarks_manager_list_model_get_item;
+}
+
static void
bookmark_title_changed_cb (EphyBookmark *bookmark,
GParamSpec *pspec,
@@ -238,12 +275,23 @@ ephy_bookmarks_manager_watch_bookmark (EphyBookmarksManager *self,
G_CALLBACK (bookmark_tag_removed_cb), self, 0);
}
+static void
+ephy_bookmarks_manager_unwatch_bookmark (EphyBookmarksManager *self,
+ EphyBookmark *bookmark)
+{
+ g_signal_handlers_disconnect_by_func (bookmark, bookmark_title_changed_cb, self);
+ g_signal_handlers_disconnect_by_func (bookmark, bookmark_url_changed_cb, self);
+ g_signal_handlers_disconnect_by_func (bookmark, bookmark_tag_added_cb, self);
+ g_signal_handlers_disconnect_by_func (bookmark, bookmark_tag_removed_cb, self);
+}
+
void
ephy_bookmarks_manager_add_bookmark (EphyBookmarksManager *self,
EphyBookmark *bookmark)
{
GSequenceIter *iter;
GSequenceIter *prev_iter;
+ gint position;
g_return_if_fail (EPHY_IS_BOOKMARKS_MANAGER (self));
g_return_if_fail (EPHY_IS_BOOKMARK (bookmark));
@@ -257,6 +305,11 @@ ephy_bookmarks_manager_add_bookmark (EphyBookmarksManager *self,
if (g_sequence_iter_is_end (prev_iter)
|| ephy_bookmark_get_time_added (g_sequence_get (prev_iter)) != ephy_bookmark_get_time_added
(bookmark)) {
g_sequence_insert_before (iter, bookmark);
+
+ /* Update list */
+ position = g_sequence_iter_get_position (iter);
+ g_list_model_items_changed (G_LIST_MODEL (self), position - 1, 0, 1);
+
g_signal_emit (self, signals[BOOKMARK_ADDED], 0, bookmark);
ephy_bookmarks_manager_save_to_file_async (self, NULL,
@@ -304,6 +357,7 @@ ephy_bookmarks_manager_remove_bookmark (EphyBookmarksManager *self,
EphyBookmark *bookmark)
{
GSequenceIter *iter;
+ gint position;
g_return_if_fail (EPHY_IS_BOOKMARKS_MANAGER (self));
g_return_if_fail (EPHY_IS_BOOKMARK (bookmark));
@@ -315,13 +369,16 @@ ephy_bookmarks_manager_remove_bookmark (EphyBookmarksManager *self,
ephy_bookmark_get_url (bookmark)) == 0)
break;
}
+ g_assert (!g_sequence_iter_is_end (iter));
/* Ensure the bookmark is removed from our list before the signal is emitted,
* because this is the bookmark REMOVED signal after all, so callers expect
* it to be already gone.
*/
g_object_ref (bookmark);
+ position = g_sequence_iter_get_position (iter);
g_sequence_remove (iter);
+ g_list_model_items_changed (G_LIST_MODEL (self), position, 1, 0);
g_signal_emit (self, signals[BOOKMARK_REMOVED], 0, bookmark);
g_object_unref (bookmark);
@@ -329,10 +386,7 @@ ephy_bookmarks_manager_remove_bookmark (EphyBookmarksManager *self,
(GAsyncReadyCallback)ephy_bookmarks_manager_save_to_file_warn_on_error_cb,
NULL);
- g_signal_handlers_disconnect_by_func (bookmark, bookmark_title_changed_cb, self);
- g_signal_handlers_disconnect_by_func (bookmark, bookmark_url_changed_cb, self);
- g_signal_handlers_disconnect_by_func (bookmark, bookmark_tag_added_cb, self);
- g_signal_handlers_disconnect_by_func (bookmark, bookmark_tag_removed_cb, self);
+ ephy_bookmarks_manager_unwatch_bookmark (self, bookmark);
}
EphyBookmark *
@@ -492,39 +546,6 @@ ephy_bookmarks_manager_get_bookmarks_with_tag (EphyBookmarksManager *self,
return bookmarks;
}
-static int
-compare_smart_bookmarks (EphyBookmark *a,
- EphyBookmark *b)
-{
- return g_utf8_collate (ephy_bookmark_get_title (a), ephy_bookmark_get_title (b));
-}
-
-GSequence *
-ephy_bookmarks_manager_get_smart_bookmarks (EphyBookmarksManager *self)
-{
- GSequence *bookmarks;
- GSequenceIter *iter;
-
- g_return_val_if_fail (EPHY_IS_BOOKMARKS_MANAGER (self), NULL);
-
- bookmarks = g_sequence_new (g_object_unref);
-
- for (iter = g_sequence_get_begin_iter (self->bookmarks);
- !g_sequence_iter_is_end (iter);
- iter = g_sequence_iter_next (iter)) {
- EphyBookmark *bookmark = g_sequence_get (iter);
-
- if (ephy_bookmark_is_smart (bookmark)) {
- g_sequence_insert_sorted (bookmarks,
- g_object_ref (bookmark),
- (GCompareDataFunc)compare_smart_bookmarks,
- NULL);
- }
- }
-
- return bookmarks;
-}
-
GSequence *
ephy_bookmarks_manager_get_tags (EphyBookmarksManager *self)
{
diff --git a/src/bookmarks/ephy-bookmarks-manager.h b/src/bookmarks/ephy-bookmarks-manager.h
index 6d3b042..c35ed28 100644
--- a/src/bookmarks/ephy-bookmarks-manager.h
+++ b/src/bookmarks/ephy-bookmarks-manager.h
@@ -56,7 +56,6 @@ gboolean ephy_bookmarks_manager_tag_exists (EphyBookmarks
GSequence *ephy_bookmarks_manager_get_bookmarks (EphyBookmarksManager *self);
GSequence *ephy_bookmarks_manager_get_bookmarks_with_tag (EphyBookmarksManager *self,
const char *tag);
-GSequence *ephy_bookmarks_manager_get_smart_bookmarks (EphyBookmarksManager *self);
GSequence *ephy_bookmarks_manager_get_tags (EphyBookmarksManager *self);
void ephy_bookmarks_manager_save_to_file_async (EphyBookmarksManager *self,
diff --git a/src/bookmarks/ephy-bookmarks-popover.c b/src/bookmarks/ephy-bookmarks-popover.c
index f74a2a1..afb8fdf 100644
--- a/src/bookmarks/ephy-bookmarks-popover.c
+++ b/src/bookmarks/ephy-bookmarks-popover.c
@@ -24,7 +24,6 @@
#include "ephy-bookmark.h"
#include "ephy-bookmark-row.h"
-#include "ephy-bookmarks-list-model.h"
#include "ephy-bookmarks-manager.h"
#include "ephy-debug.h"
#include "ephy-shell.h"
@@ -42,9 +41,8 @@ struct _EphyBookmarksPopover {
GtkWidget *tag_detail_label;
char *tag_detail_tag;
- EphyBookmarksManager *manager;
- EphyBookmarksListModel *list_model;
- EphyWindow *window;
+ EphyBookmarksManager *manager;
+ EphyWindow *window;
};
G_DEFINE_TYPE (EphyBookmarksPopover, ephy_bookmarks_popover, GTK_TYPE_POPOVER)
@@ -71,9 +69,6 @@ ephy_bookmarks_popover_bookmark_tag_added_cb (EphyBookmarksPopover *self,
g_assert (EPHY_IS_BOOKMARK (bookmark));
g_assert (EPHY_IS_BOOKMARKS_POPOVER (self));
- if (ephy_bookmark_is_smart (bookmark))
- return;
-
/* If the bookmark no longer has 0 tags, we remove it from the tags list box */
if (g_sequence_get_length (ephy_bookmark_get_tags (bookmark)) == 1) {
GList *children;
@@ -116,9 +111,6 @@ ephy_bookmarks_popover_bookmark_tag_removed_cb (EphyBookmarksPopover *self,
g_assert (EPHY_IS_BOOKMARK (bookmark));
g_assert (EPHY_IS_BOOKMARKS_POPOVER (self));
- if (ephy_bookmark_is_smart (bookmark))
- return;
-
/* If the bookmark has 0 tags after removing one, we add it to the tags list
* box */
if (g_sequence_is_empty (ephy_bookmark_get_tags (bookmark))) {
@@ -173,8 +165,6 @@ create_bookmark_row (gpointer item,
EphyBookmark *bookmark = EPHY_BOOKMARK (item);
GtkWidget *row;
- g_assert (!ephy_bookmark_is_smart (bookmark));
-
row = ephy_bookmark_row_new (bookmark);
g_object_set_data_full (G_OBJECT (row), "type",
g_strdup (EPHY_LIST_BOX_ROW_TYPE_BOOKMARK),
@@ -237,9 +227,6 @@ ephy_bookmarks_popover_bookmark_added_cb (EphyBookmarksPopover *self,
g_assert (EPHY_IS_BOOKMARK (bookmark));
g_assert (EPHY_IS_BOOKMARKS_MANAGER (manager));
- if (ephy_bookmark_is_smart (bookmark))
- return;
-
if (g_sequence_is_empty (ephy_bookmark_get_tags (bookmark))) {
row = create_bookmark_row (bookmark, self);
gtk_container_add (GTK_CONTAINER (self->tags_list_box), row);
@@ -263,9 +250,6 @@ ephy_bookmarks_popover_bookmark_removed_cb (EphyBookmarksPopover *self,
g_assert (EPHY_IS_BOOKMARK (bookmark));
g_assert (EPHY_IS_BOOKMARKS_MANAGER (manager));
- if (ephy_bookmark_is_smart (bookmark))
- return;
-
children = gtk_container_get_children (GTK_CONTAINER (self->tags_list_box));
for (l = children; l != NULL; l = l->next) {
const char *type;
@@ -302,7 +286,7 @@ ephy_bookmarks_popover_bookmark_removed_cb (EphyBookmarksPopover *self,
if (found)
gtk_container_remove (GTK_CONTAINER (self->tag_detail_list_box), row);
- if (g_list_model_get_n_items (G_LIST_MODEL (self->list_model)) == 0) {
+ if (g_list_model_get_n_items (G_LIST_MODEL (self->manager)) == 0) {
gtk_stack_set_visible_child_name (GTK_STACK (self->toplevel_stack), "empty-state");
} else if (g_strcmp0 (gtk_stack_get_visible_child_name (GTK_STACK (self->toplevel_stack)), "tag_detail")
== 0 &&
g_sequence_is_empty (ephy_bookmarks_manager_get_bookmarks_with_tag (self->manager,
self->tag_detail_tag))) {
@@ -419,8 +403,6 @@ ephy_bookmarks_popover_show_tag_detail (EphyBookmarksPopover *self,
EphyBookmark *bookmark = g_sequence_get (iter);
GtkWidget *row;
- if (ephy_bookmark_is_smart (bookmark))
- continue;
row = create_bookmark_row (bookmark, self);
gtk_container_add (GTK_CONTAINER (self->tag_detail_list_box), row);
}
@@ -469,16 +451,6 @@ ephy_bookmarks_popover_list_box_row_activated_cb (EphyBookmarksPopover *self,
}
static void
-ephy_bookmarks_popover_dispose (GObject *object)
-{
- EphyBookmarksPopover *self = EPHY_BOOKMARKS_POPOVER (object);
-
- g_clear_object (&self->list_model);
-
- G_OBJECT_CLASS (ephy_bookmarks_popover_parent_class)->dispose (object);
-}
-
-static void
ephy_bookmarks_popover_finalize (GObject *object)
{
EphyBookmarksPopover *self = EPHY_BOOKMARKS_POPOVER (object);
@@ -511,7 +483,6 @@ ephy_bookmarks_popover_class_init (EphyBookmarksPopoverClass *klass)
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
- object_class->dispose = ephy_bookmarks_popover_dispose;
object_class->finalize = ephy_bookmarks_popover_finalize;
object_class->set_property = ephy_bookmarks_popover_set_property;
@@ -548,7 +519,6 @@ ephy_bookmarks_popover_init (EphyBookmarksPopover *self)
gtk_widget_init_template (GTK_WIDGET (self));
self->manager = ephy_shell_get_bookmarks_manager (ephy_shell_get_default ());
- self->list_model = ephy_bookmarks_list_model_new (self->manager);
group = g_simple_action_group_new ();
g_action_map_add_action_entries (G_ACTION_MAP (group), entries,
@@ -558,11 +528,11 @@ ephy_bookmarks_popover_init (EphyBookmarksPopover *self)
g_object_unref (group);
gtk_list_box_bind_model (GTK_LIST_BOX (self->bookmarks_list_box),
- G_LIST_MODEL (self->list_model),
+ G_LIST_MODEL (self->manager),
create_bookmark_row,
self, NULL);
- if (g_list_model_get_n_items (G_LIST_MODEL (self->list_model)) == 0)
+ if (g_list_model_get_n_items (G_LIST_MODEL (self->manager)) == 0)
gtk_stack_set_visible_child_name (GTK_STACK (self->toplevel_stack), "empty-state");
gtk_list_box_set_sort_func (GTK_LIST_BOX (self->tags_list_box),
@@ -590,8 +560,6 @@ ephy_bookmarks_popover_init (EphyBookmarksPopover *self)
EphyBookmark *bookmark = g_sequence_get (iter);
GtkWidget *bookmark_row;
- if (ephy_bookmark_is_smart (bookmark))
- continue;
bookmark_row = create_bookmark_row (bookmark, self);
gtk_widget_show_all (bookmark_row);
gtk_container_add (GTK_CONTAINER (self->tags_list_box), bookmark_row);
diff --git a/src/ephy-completion-model.c b/src/ephy-completion-model.c
index 8459ef0..f22a645 100644
--- a/src/ephy-completion-model.c
+++ b/src/ephy-completion-model.c
@@ -429,10 +429,9 @@ query_completed_cb (EphyHistoryService *service,
url = ephy_bookmark_get_url (bookmark);
title = ephy_bookmark_get_title (bookmark);
- if (!ephy_bookmark_is_smart (bookmark) &&
- should_add_bookmark_to_model (model, user_data->search_string, title, url)) {
+ if (should_add_bookmark_to_model (model, user_data->search_string,
+ title, url))
list = add_to_potential_rows (list, title, url, NULL, 0, TRUE, FALSE);
- }
}
/* History */
diff --git a/src/ephy-location-controller.c b/src/ephy-location-controller.c
index 49b603a..7dd274e 100644
--- a/src/ephy-location-controller.c
+++ b/src/ephy-location-controller.c
@@ -22,19 +22,16 @@
#include "config.h"
#include "ephy-location-controller.h"
-#include "ephy-bookmark.h"
-#include "ephy-bookmarks-list-model.h"
-#include "ephy-bookmarks-manager.h"
+#include "ephy-widgets-type-builtins.h"
#include "ephy-completion-model.h"
#include "ephy-debug.h"
-#include "ephy-dnd.h"
#include "ephy-embed-container.h"
#include "ephy-embed-utils.h"
#include "ephy-link.h"
#include "ephy-location-entry.h"
+#include "ephy-dnd.h"
#include "ephy-shell.h"
#include "ephy-title-widget.h"
-#include "ephy-widgets-type-builtins.h"
#include <gdk/gdkkeysyms.h>
#include <gtk/gtk.h>
@@ -52,12 +49,11 @@ struct _EphyLocationController {
EphyWindow *window;
EphyTitleWidget *title_widget;
- EphyBookmarksManager *bookmarks_manager;
- EphyBookmarksListModel *list_model;
- GSequence *smart_bookmarks;
char *address;
guint editable : 1;
gboolean sync_address_is_blocked;
+ EphySearchEngineManager *search_engine_manager;
+ guint num_search_engines_actions;
};
static void ephy_location_controller_finalize (GObject *object);
@@ -92,35 +88,6 @@ match_func (GtkEntryCompletion *completion,
}
static void
-action_activated_cb (GtkEntryCompletion *completion,
- int index,
- EphyLocationController *controller)
-{
- GtkWidget *entry;
- char *content;
- char *url;
- GSequenceIter *iter;
- EphyBookmark *bookmark;
-
- entry = gtk_entry_completion_get_entry (completion);
- content = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
-
- if (content == NULL)
- return;
-
- iter = g_sequence_get_iter_at_pos (controller->smart_bookmarks, index);
- g_assert (!g_sequence_iter_is_end (iter));
- bookmark = g_sequence_get (iter);
- url = ephy_bookmark_resolve_smart_url (bookmark, content);
-
- ephy_link_open (EPHY_LINK (controller), url, NULL,
- ephy_link_flags_from_current_event () | EPHY_LINK_TYPED);
-
- g_free (content);
- g_free (url);
-}
-
-static void
entry_drag_data_received_cb (GtkWidget *widget,
GdkDragContext *context,
gint x, gint y,
@@ -183,11 +150,9 @@ entry_activate_cb (GtkEntry *entry,
}
content = gtk_entry_get_text (entry);
- if (content == NULL || content[0] == '\0')
- return;
+ if (content == NULL || content[0] == '\0') return;
address = g_strdup (content);
-
effective_address = ephy_embed_utils_normalize_or_autosearch_address (g_strstrip (address));
g_free (address);
#if 0
@@ -279,75 +244,6 @@ get_title_cb (EphyLocationEntry *entry,
return g_strdup (ephy_embed_get_title (embed));
}
-static void
-remove_completion_actions (EphyLocationController *controller,
- EphyLocationEntry *lentry)
-{
- GtkEntryCompletion *completion;
- gint num_actions;
-
- completion = gtk_entry_get_completion (GTK_ENTRY (lentry));
- num_actions = g_sequence_get_length (controller->smart_bookmarks);
-
- for (int i = 0; i < num_actions; i++)
- gtk_entry_completion_delete_action (completion, 0);
-
- g_signal_handlers_disconnect_by_func (completion,
- G_CALLBACK (action_activated_cb),
- controller);
-}
-
-static void
-refresh_smart_bookmarks (EphyLocationController *controller)
-{
- if (controller->smart_bookmarks != NULL)
- g_sequence_free (controller->smart_bookmarks);
-
- controller->smart_bookmarks = ephy_bookmarks_manager_get_smart_bookmarks (controller->bookmarks_manager);
-}
-
-static void
-add_completion_actions (EphyLocationController *controller,
- EphyLocationEntry *lentry)
-{
- GtkEntryCompletion *completion = gtk_entry_get_completion (GTK_ENTRY (lentry));
- GSequenceIter *iter;
- int i = 0;
-
- for (iter = g_sequence_get_begin_iter (controller->smart_bookmarks);
- !g_sequence_iter_is_end (iter);
- iter = g_sequence_iter_next (iter), i++) {
- EphyBookmark *bookmark;
- const char *title;
-
- bookmark = g_sequence_get (iter);
- title = ephy_bookmark_get_title (bookmark);
- gtk_entry_completion_insert_action_text (completion, i, title);
- }
-
- g_signal_connect (completion, "action_activated",
- G_CALLBACK (action_activated_cb), controller);
-}
-
-static void
-update_actions_list (EphyLocationController *controller)
-{
- g_assert (EPHY_IS_LOCATION_ENTRY (controller->title_widget));
-
- remove_completion_actions (controller, EPHY_LOCATION_ENTRY (controller->title_widget));
- refresh_smart_bookmarks (controller);
- add_completion_actions (controller, EPHY_LOCATION_ENTRY (controller->title_widget));
-}
-
-static void
-bookmark_modified_cb (EphyBookmarksManager *manager,
- EphyBookmark *bookmark,
- EphyLocationController *controller)
-{
- if (ephy_bookmark_is_smart (bookmark))
- update_actions_list (controller);
-}
-
static gboolean
focus_in_event_cb (GtkWidget *entry,
GdkEventFocus *event,
@@ -392,6 +288,80 @@ switch_page_cb (GtkNotebook *notebook,
}
static void
+action_activated_cb (GtkEntryCompletion *completion,
+ int index,
+ EphyLocationController *controller)
+{
+ GtkWidget *entry;
+ char *content;
+ char *url;
+ char **engine_names;
+
+ entry = gtk_entry_completion_get_entry (completion);
+ content = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
+ if (content == NULL)
+ return;
+
+ engine_names = ephy_search_engine_manager_get_names (controller->search_engine_manager);
+ url = ephy_search_engine_manager_build_search_address (controller->search_engine_manager,
+ engine_names[index],
+ content);
+
+ g_strfreev (engine_names);
+
+ ephy_link_open (EPHY_LINK (controller), url, NULL,
+ ephy_link_flags_from_current_event ());
+ g_free (content);
+ g_free (url);
+}
+
+static void
+fill_entry_completion_with_actions (GtkEntryCompletion *completion,
+ EphyLocationController *controller)
+{
+ char **engine_names;
+
+ engine_names = ephy_search_engine_manager_get_names (controller->search_engine_manager);
+
+ controller->num_search_engines_actions = 0;
+
+ for (guint i = 0; engine_names[i] != NULL; i++) {
+ gtk_entry_completion_insert_action_text (completion, i, engine_names[i]);
+ controller->num_search_engines_actions++;
+ }
+
+ g_strfreev (engine_names);
+}
+
+static void
+add_completion_actions (EphyLocationController *controller,
+ EphyLocationEntry *lentry)
+{
+ GtkEntryCompletion *completion = gtk_entry_get_completion (GTK_ENTRY (lentry));
+
+ fill_entry_completion_with_actions (completion, controller);
+ g_signal_connect (completion, "action_activated",
+ G_CALLBACK (action_activated_cb), controller);
+}
+
+static void
+search_engines_changed_cb (EphySearchEngineManager *manager,
+ gpointer data)
+{
+ EphyLocationController *controller;
+ GtkEntryCompletion *completion;
+
+ controller = EPHY_LOCATION_CONTROLLER (data);
+ completion = gtk_entry_get_completion (GTK_ENTRY (controller->title_widget));
+
+ for (guint i = 0; i < controller->num_search_engines_actions; i++) {
+ gtk_entry_completion_delete_action (completion, 0);
+ }
+
+ fill_entry_completion_with_actions (completion, controller);
+}
+
+static void
ephy_location_controller_constructed (GObject *object)
{
EphyLocationController *controller = EPHY_LOCATION_CONTROLLER (object);
@@ -434,17 +404,10 @@ ephy_location_controller_constructed (GObject *object)
controller->title_widget,
NULL);
- refresh_smart_bookmarks (controller);
add_completion_actions (controller, EPHY_LOCATION_ENTRY (controller->title_widget));
- g_signal_connect_object (controller->bookmarks_manager, "bookmark-added",
- G_CALLBACK (bookmark_modified_cb), controller, 0);
- g_signal_connect_object (controller->bookmarks_manager, "bookmark-removed",
- G_CALLBACK (bookmark_modified_cb), controller, 0);
- g_signal_connect_object (controller->bookmarks_manager, "bookmark-title-changed",
- G_CALLBACK (bookmark_modified_cb), controller, 0);
- g_signal_connect_object (controller->bookmarks_manager, "bookmark-url-changed",
- G_CALLBACK (bookmark_modified_cb), controller, 0);
+ g_signal_connect (controller->search_engine_manager, "changed",
+ G_CALLBACK (search_engines_changed_cb), controller);
g_object_bind_property (controller, "editable",
controller->title_widget, "editable",
@@ -605,10 +568,13 @@ ephy_location_controller_class_init (EphyLocationControllerClass *class)
static void
ephy_location_controller_init (EphyLocationController *controller)
{
+ EphyEmbedShell *shell;
+
controller->address = g_strdup ("");
controller->editable = TRUE;
- controller->bookmarks_manager = ephy_shell_get_bookmarks_manager (ephy_shell_get_default ());
controller->sync_address_is_blocked = FALSE;
+ shell = ephy_embed_shell_get_default ();
+ controller->search_engine_manager = ephy_embed_shell_get_search_engine_manager (shell);
}
static void
@@ -616,7 +582,6 @@ ephy_location_controller_finalize (GObject *object)
{
EphyLocationController *controller = EPHY_LOCATION_CONTROLLER (object);
- g_sequence_free (controller->smart_bookmarks);
g_free (controller->address);
G_OBJECT_CLASS (ephy_location_controller_parent_class)->finalize (object);
diff --git a/src/profile-migrator/ephy-profile-migrator.c b/src/profile-migrator/ephy-profile-migrator.c
index cbf8e59..0dcf135 100644
--- a/src/profile-migrator/ephy-profile-migrator.c
+++ b/src/profile-migrator/ephy-profile-migrator.c
@@ -38,6 +38,7 @@
#include "ephy-history-service.h"
#include "ephy-prefs.h"
#include "ephy-profile-utils.h"
+#include "ephy-search-engine-manager.h"
#include "ephy-settings.h"
#include "ephy-sqlite-connection.h"
#include "ephy-uri-tester-shared.h"
@@ -912,6 +913,62 @@ migrate_settings (void)
}
static void
+migrate_search_engines (void)
+{
+ EphyBookmarksManager *bookmarks_manager;
+ EphySearchEngineManager *search_engine_manager;
+ GSequence *bookmarks;
+ GSequenceIter *iter;
+ GList *smart_bookmarks = NULL;
+ const char *address;
+ const char *title;
+ char *default_search_engine_address;
+ const char *default_search_engine_name = _("Search the Web");
+
+ bookmarks_manager = ephy_bookmarks_manager_new ();
+ search_engine_manager = ephy_search_engine_manager_new ();
+
+ default_search_engine_address = g_settings_get_string (EPHY_SETTINGS_MAIN,
+ EPHY_PREFS_KEYWORD_SEARCH_URL);
+ if (default_search_engine_address != NULL) {
+ ephy_search_engine_manager_add_engine (search_engine_manager,
+ default_search_engine_name,
+ default_search_engine_address,
+ "");
+ ephy_search_engine_manager_set_default_engine (search_engine_manager,
+ default_search_engine_name);
+ g_free (default_search_engine_address);
+ }
+
+ bookmarks = ephy_bookmarks_manager_get_bookmarks (bookmarks_manager);
+ for (iter = g_sequence_get_begin_iter (bookmarks);
+ !g_sequence_iter_is_end (iter);
+ iter = g_sequence_iter_next (iter)) {
+ EphyBookmark *bookmark;
+
+ bookmark = g_sequence_get (iter);
+ address = ephy_bookmark_get_url (bookmark);
+
+ if (strstr (address, "%s") != NULL) {
+ title = ephy_bookmark_get_title (bookmark);
+ ephy_search_engine_manager_add_engine (search_engine_manager,
+ title,
+ address,
+ "");
+ smart_bookmarks = g_list_append (smart_bookmarks, bookmark);
+ }
+ }
+
+ for (GList *l = smart_bookmarks; l != NULL; l = l->next)
+ ephy_bookmarks_manager_remove_bookmark (bookmarks_manager,
+ (EphyBookmark *)(l->data));
+
+ g_list_free (smart_bookmarks);
+ g_object_unref (bookmarks_manager);
+ g_object_unref (search_engine_manager);
+}
+
+static void
migrate_nothing (void)
{
/* Used to replace migrators that have been removed. Only remove migrators
@@ -941,6 +998,7 @@ const EphyProfileMigrator migrators[] = {
/* 14 */ migrate_initial_state,
/* 15 */ migrate_permissions,
/* 16 */ migrate_settings,
+ /* 17 */ migrate_search_engines,
};
static gboolean
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]