aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog50
-rwxr-xr-xlib/egg/egg-toolbars-model.h3
-rw-r--r--lib/ephy-marshal.list4
-rw-r--r--src/Makefile.am120
-rw-r--r--src/bookmarks/ephy-bookmark-action.c89
-rw-r--r--src/bookmarks/ephy-bookmark-action.h40
-rw-r--r--src/bookmarks/ephy-bookmarks-menu.c59
-rw-r--r--src/bookmarks/ephy-bookmarks-menu.h8
-rw-r--r--src/bookmarks/ephy-bookmarksbar.c67
-rw-r--r--src/bookmarks/ephy-favorites-menu.c26
-rw-r--r--src/bookmarks/ephy-favorites-menu.h6
-rw-r--r--src/bookmarks/ephy-topic-action.c98
-rw-r--r--src/bookmarks/ephy-topic-action.h25
-rw-r--r--src/ephy-home-action.c78
-rw-r--r--src/ephy-home-action.h52
-rw-r--r--src/ephy-link-action.c61
-rw-r--r--src/ephy-link-action.h52
-rw-r--r--src/ephy-link.c119
-rw-r--r--src/ephy-link.h71
-rw-r--r--src/ephy-location-action.c38
-rw-r--r--src/ephy-location-action.h12
-rw-r--r--src/ephy-navigation-action.c22
-rw-r--r--src/ephy-navigation-action.h17
-rw-r--r--src/ephy-shell.c3
-rw-r--r--src/ephy-window.c97
-rwxr-xr-xsrc/toolbar.c77
-rw-r--r--src/window-commands.c20
-rw-r--r--src/window-commands.h3
28 files changed, 849 insertions, 468 deletions
diff --git a/ChangeLog b/ChangeLog
index 2bdfa446f..8b8f6e4d5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,55 @@
2004-12-24 Christian Persch <chpe@cvs.gnome.org>
+ * lib/ephy-marshal.list:
+ * src/Makefile.am:
+ * src/bookmarks/ephy-bookmark-action.c:
+ (ephy_bookmark_action_get_type), (create_tool_item),
+ (open_in_tab_activate_cb), (open_in_window_activate_cb),
+ (activate_cb), (connect_proxy), (ephy_bookmark_action_class_init):
+ * src/bookmarks/ephy-bookmark-action.h:
+ * src/bookmarks/ephy-bookmarks-menu.c:
+ (ephy_bookmarks_menu_get_type), (add_action_for_bookmark),
+ (ephy_bookmarks_menu_class_init):
+ * src/bookmarks/ephy-bookmarks-menu.h:
+ * src/bookmarks/ephy-bookmarksbar.c: (ephy_bookmarksbar_get_type),
+ (ephy_bookmarksbar_action_request):
+ * src/bookmarks/ephy-favorites-menu.c:
+ (ephy_favorites_menu_get_type), (ephy_favorites_menu_rebuild):
+ * src/bookmarks/ephy-favorites-menu.h:
+ * src/bookmarks/ephy-topic-action.c: (ephy_topic_action_get_type),
+ (menu_activate_cb), (open_in_tabs_activate_cb),
+ (ephy_topic_action_class_init):
+ * src/bookmarks/ephy-topic-action.h:
+ A src/ephy-home-action.c: (ephy_home_action_activate),
+ (ephy_home_action_class_init), (ephy_home_action_get_type):
+ A src/ephy-home-action.h:
+ A src/ephy-link-action.c: (ephy_link_action_get_type):
+ A src/ephy-link-action.h:
+ A src/ephy-link.c: (ephy_link_flags_get_type),
+ (ephy_link_base_init), (ephy_link_get_type), (ephy_link_open):
+ A src/ephy-link.h:
+ * src/ephy-location-action.c: (ephy_location_action_get_type),
+ (action_activated_cb), (location_url_activate_cb), (connect_proxy),
+ (disconnect_proxy), (ephy_location_action_class_init):
+ * src/ephy-location-action.h:
+ * src/ephy-navigation-action.c: (ephy_navigation_action_get_type),
+ (activate_back_or_forward_menu_item_cb),
+ (activate_up_menu_item_cb), (build_back_or_forward_menu),
+ (build_up_menu):
+ * src/ephy-navigation-action.h:
+ * src/ephy-shell.c: (ephy_shell_new_tab):
+ * src/ephy-window.c: (setup_ui_manager), (open_link_cb),
+ (ephy_window_init):
+ * src/toolbar.c: (toolbar_get_type), (toolbar_setup_actions):
+ * src/window-commands.c:
+ * src/window-commands.h:
+
+ Consolidate link opening in one place by introducing an EphyLink interface
+ which bookmarks, topics, navigation, location, home, toolbars, bookmarks menu
+ and favourites menu implement, forwarding the link opening to the window.
+
+2004-12-24 Christian Persch <chpe@cvs.gnome.org>
+
* embed/ephy-embed.c: (ephy_embed_base_init):
* lib/ephy-marshal.list:
diff --git a/lib/egg/egg-toolbars-model.h b/lib/egg/egg-toolbars-model.h
index 11d9bbe8b..0ea3c55d4 100755
--- a/lib/egg/egg-toolbars-model.h
+++ b/lib/egg/egg-toolbars-model.h
@@ -14,6 +14,8 @@
* 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 EGG_TOOLBARS_MODEL_H
@@ -25,7 +27,6 @@
G_BEGIN_DECLS
-
#define EGG_TYPE_TOOLBARS_MODEL (egg_toolbars_model_get_type ())
#define EGG_TOOLBARS_MODEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EGG_TYPE_TOOLBARS_MODEL, EggToolbarsModel))
#define EGG_TOOLBARS_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EGG_TYPE_TOOLBARS_MODEL, EggToolbarsModelClass))
diff --git a/lib/ephy-marshal.list b/lib/ephy-marshal.list
index 57d064177..07456188c 100644
--- a/lib/ephy-marshal.list
+++ b/lib/ephy-marshal.list
@@ -1,8 +1,8 @@
-INT:STRING
BOOLEAN:OBJECT
-BOOLEAN:STRING, STRING
+BOOLEAN:STRING,STRING
BOOLEAN:VOID
OBJECT:FLAGS
+OBJECT:OBJECT,STRING,FLAGS
VOID:ENUM
VOID:ENUM,INT,BOOLEAN
VOID:INT,INT
diff --git a/src/Makefile.am b/src/Makefile.am
index a35aacfed..526075ba6 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -23,64 +23,70 @@ $(CORBA_SOURCE): $(idls) $(ORBIT_IDL)
headerdir = $(prefix)/include/epiphany-@EPIPHANY_MAJOR@/epiphany
header_DATA = $(INST_H_FILES)
-NOINST_H_FILES = \
- ephy-automation.h \
- ephy-encoding-dialog.h \
- ephy-encoding-menu.h \
- ephy-favicon-action.h \
- ephy-go-action.h \
- ephy-history-window.h \
- ephy-location-action.h \
- ephy-navigation-action.h \
- ephy-tabs-menu.h \
- ephy-toolbars-model.h \
- pdm-dialog.h \
- popup-commands.h \
- prefs-dialog.h \
- ppview-toolbar.h \
- toolbar.h \
+NOINST_H_FILES = \
+ ephy-automation.h \
+ ephy-encoding-dialog.h \
+ ephy-encoding-menu.h \
+ ephy-favicon-action.h \
+ ephy-go-action.h \
+ ephy-history-window.h \
+ ephy-home-action.h \
+ ephy-link.h \
+ ephy-link-action.h \
+ ephy-location-action.h \
+ ephy-navigation-action.h \
+ ephy-tabs-menu.h \
+ ephy-toolbars-model.h \
+ pdm-dialog.h \
+ popup-commands.h \
+ prefs-dialog.h \
+ ppview-toolbar.h \
+ toolbar.h \
window-commands.h
-INST_H_FILES = \
- ephy-extension.h \
- ephy-extensions-manager.h \
- ephy-notebook.h \
- ephy-session.h \
- ephy-shell.h \
- ephy-statusbar.h \
- ephy-tab.h \
+INST_H_FILES = \
+ ephy-extension.h \
+ ephy-extensions-manager.h \
+ ephy-notebook.h \
+ ephy-session.h \
+ ephy-shell.h \
+ ephy-statusbar.h \
+ ephy-tab.h \
ephy-window.h
-libephymain_la_SOURCES = \
- $(CORBA_SOURCE) \
- ephy-automation.c \
- ephy-completion-model.c \
- ephy-completion-model.h \
- ephy-encoding-dialog.c \
- ephy-encoding-menu.c \
- ephy-extension.c \
- ephy-extensions-manager.c \
- ephy-favicon-action.c \
- ephy-go-action.c \
- ephy-history-window.c \
- ephy-location-action.c \
- ephy-navigation-action.c \
- ephy-notebook.c \
- ephy-session.c \
- ephy-shell.c \
- ephy-statusbar.c \
- ephy-tab.c \
- ephy-tab.h \
- ephy-tabs-menu.c \
- ephy-toolbars-model.c \
- ephy-window.c \
- pdm-dialog.c \
- popup-commands.c \
- prefs-dialog.c \
- ppview-toolbar.c \
- toolbar.c \
- window-commands.c \
- $(INST_H_FILES) \
+libephymain_la_SOURCES = \
+ $(CORBA_SOURCE) \
+ ephy-automation.c \
+ ephy-completion-model.c \
+ ephy-completion-model.h \
+ ephy-encoding-dialog.c \
+ ephy-encoding-menu.c \
+ ephy-extension.c \
+ ephy-extensions-manager.c \
+ ephy-favicon-action.c \
+ ephy-go-action.c \
+ ephy-home-action.c \
+ ephy-history-window.c \
+ ephy-link.c \
+ ephy-link-action.c \
+ ephy-location-action.c \
+ ephy-navigation-action.c \
+ ephy-notebook.c \
+ ephy-session.c \
+ ephy-shell.c \
+ ephy-statusbar.c \
+ ephy-tab.c \
+ ephy-tab.h \
+ ephy-tabs-menu.c \
+ ephy-toolbars-model.c \
+ ephy-window.c \
+ pdm-dialog.c \
+ popup-commands.c \
+ prefs-dialog.c \
+ ppview-toolbar.c \
+ toolbar.c \
+ window-commands.c \
+ $(INST_H_FILES) \
$(NOINST_H_FILES)
libephymain_la_CPPFLAGS = \
@@ -136,7 +142,5 @@ epiphany_LDADD = \
BUILT_SOURCES = $(CORBA_SOURCE)
-CLEANFILES = $(CORBA_SOURCE)
-
-dist-hook:
- cd $(distdir); rm -f $(BUILT_SOURCES)
+CLEANFILES = $(BUILT_SOURCES)
+DISTCLEANFILES = $(BUILT_SOURCES)
diff --git a/src/bookmarks/ephy-bookmark-action.c b/src/bookmarks/ephy-bookmark-action.c
index 05975cc2c..90883cf36 100644
--- a/src/bookmarks/ephy-bookmark-action.c
+++ b/src/bookmarks/ephy-bookmark-action.c
@@ -21,19 +21,34 @@
#include "config.h"
-#include <glib/gi18n.h>
-#include <libgnomevfs/gnome-vfs-uri.h>
-#include <gtk/gtktoolitem.h>
-
#include "ephy-bookmark-action.h"
-#include "ephy-marshal.h"
-#include "ephy-dnd.h"
+#include "ephy-bookmarksbar-model.h"
#include "ephy-bookmarksbar.h"
#include "ephy-bookmarks.h"
+#include "ephy-link.h"
+#include "ephy-dnd.h"
#include "ephy-favicon-cache.h"
#include "ephy-shell.h"
-#include "ephy-debug.h"
#include "ephy-gui.h"
+#include "ephy-debug.h"
+
+#include <glib/gi18n.h>
+#include <gtk/gtkwidget.h>
+#include <gtk/gtkhbox.h>
+#include <gtk/gtklabel.h>
+#include <gtk/gtkbutton.h>
+#include <gtk/gtkentry.h>
+#include <gtk/gtkstock.h>
+#include <gtk/gtkimage.h>
+#include <gtk/gtkmenuitem.h>
+#include <gtk/gtkimagemenuitem.h>
+#include <gtk/gtkseparatormenuitem.h>
+#include <gtk/gtkmenushell.h>
+#include <gtk/gtkmenu.h>
+#include <gtk/gtktoolitem.h>
+#include <gtk/gtktoolbar.h>
+#include <gtk/gtkmain.h>
+#include <libgnomevfs/gnome-vfs-uri.h>
#include <string.h>
@@ -52,7 +67,7 @@ static GtkTargetEntry drag_targets[] =
};
static int n_drag_targets = G_N_ELEMENTS (drag_targets);
-struct EphyBookmarkActionPrivate
+struct _EphyBookmarkActionPrivate
{
EphyNode *node;
gboolean smart_url;
@@ -72,17 +87,8 @@ enum
PROP_ICON
};
-enum
-{
- OPEN,
- OPEN_IN_TAB,
- LAST_SIGNAL
-};
-
static GObjectClass *parent_class = NULL;
-static guint signals[LAST_SIGNAL] = { 0 };
-
GType
ephy_bookmark_action_get_type (void)
{
@@ -103,10 +109,11 @@ ephy_bookmark_action_get_type (void)
(GInstanceInitFunc) ephy_bookmark_action_init,
};
- type = g_type_register_static (GTK_TYPE_ACTION,
+ type = g_type_register_static (EPHY_TYPE_LINK_ACTION,
"EphyBookmarkAction",
&type_info, 0);
}
+
return type;
}
@@ -117,7 +124,7 @@ create_tool_item (GtkAction *action)
LOG ("Creating tool item for action %p", action)
- item = (* GTK_ACTION_CLASS (parent_class)->create_tool_item) (action);
+ item = GTK_ACTION_CLASS (parent_class)->create_tool_item (action);
hbox = gtk_hbox_new (FALSE, 0);
gtk_widget_show (hbox);
@@ -298,7 +305,8 @@ ephy_bookmark_action_sync_label (GtkAction *gaction,
}
static void
-open_in_tab_activate_cb (GtkWidget *widget, EphyBookmarkAction *action)
+open_in_tab_activate_cb (GtkWidget *widget,
+ EphyBookmarkAction *action)
{
const char *url;
@@ -306,7 +314,8 @@ open_in_tab_activate_cb (GtkWidget *widget, EphyBookmarkAction *action)
url = ephy_node_get_property_string (action->priv->node,
EPHY_NODE_BMK_PROP_LOCATION);
- g_signal_emit (action, signals[OPEN_IN_TAB], 0, url, FALSE);
+ ephy_link_open (EPHY_LINK (action), url, NULL,
+ EPHY_LINK_NEW_TAB | EPHY_LINK_JUMP_TO);
}
static void
@@ -318,7 +327,8 @@ open_in_window_activate_cb (GtkWidget *widget, EphyBookmarkAction *action)
url = ephy_node_get_property_string (action->priv->node,
EPHY_NODE_BMK_PROP_LOCATION);
- g_signal_emit (action, signals[OPEN_IN_TAB], 0, url, TRUE);
+
+ ephy_link_open (EPHY_LINK (action), url, NULL, EPHY_LINK_NEW_WINDOW);
}
static void
@@ -369,14 +379,8 @@ activate_cb (GtkWidget *widget,
}
}
- if (ephy_gui_is_middle_click ())
- {
- g_signal_emit (action, signals[OPEN_IN_TAB], 0, location, FALSE);
- }
- else
- {
- g_signal_emit (action, signals[OPEN], 0, location);
- }
+ ephy_link_open (EPHY_LINK (action), location, NULL,
+ ephy_gui_is_middle_click () ? EPHY_LINK_NEW_TAB : 0);
g_free (location);
g_free (text);
@@ -665,7 +669,7 @@ connect_proxy (GtkAction *action, GtkWidget *proxy)
LOG ("Connecting action %p to proxy %p", action, proxy)
- (* GTK_ACTION_CLASS (parent_class)->connect_proxy) (action, proxy);
+ GTK_ACTION_CLASS (parent_class)->connect_proxy (action, proxy);
ephy_bookmark_action_sync_icon (action, NULL, proxy);
g_signal_connect_object (action, "notify::icon",
@@ -843,29 +847,6 @@ ephy_bookmark_action_class_init (EphyBookmarkActionClass *class)
object_class->set_property = ephy_bookmark_action_set_property;
object_class->get_property = ephy_bookmark_action_get_property;
- signals[OPEN] =
- g_signal_new ("open",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (EphyBookmarkActionClass, open),
- NULL, NULL,
- g_cclosure_marshal_VOID__STRING,
- G_TYPE_NONE,
- 1,
- G_TYPE_STRING);
-
- signals[OPEN_IN_TAB] =
- g_signal_new ("open_in_tab",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (EphyBookmarkActionClass, open_in_tab),
- NULL, NULL,
- ephy_marshal_VOID__STRING_BOOLEAN,
- G_TYPE_NONE,
- 2,
- G_TYPE_STRING,
- G_TYPE_BOOLEAN);
-
g_object_class_install_property (object_class,
PROP_BOOKMARK,
g_param_spec_pointer ("bookmark",
diff --git a/src/bookmarks/ephy-bookmark-action.h b/src/bookmarks/ephy-bookmark-action.h
index 0866e1889..01d2c65d3 100644
--- a/src/bookmarks/ephy-bookmark-action.h
+++ b/src/bookmarks/ephy-bookmark-action.h
@@ -1,5 +1,6 @@
/*
- * Copyright (C) 2003 Marco Pesenti Gritti
+ * Copyright (C) 2003, 2004 Marco Pesenti Gritti
+ * Copyright (C) 2003, 2004 Christian Persch
*
* 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
@@ -21,24 +22,25 @@
#ifndef EPHY_BOOKMARK_ACTION_H
#define EPHY_BOOKMARK_ACTION_H
-#include <gtk/gtk.h>
-#include <gtk/gtkaction.h>
+#include "ephy-link-action.h"
#include "ephy-node.h"
-#define EPHY_TYPE_BOOKMARK_ACTION (ephy_bookmark_action_get_type ())
-#define EPHY_BOOKMARK_ACTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EPHY_TYPE_BOOKMARK_ACTION, EphyBookmarkAction))
-#define EPHY_BOOKMARK_ACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EPHY_TYPE_BOOKMARK_ACTION, EphyBookmarkActionClass))
-#define EPHY_IS_BOOKMARK_ACTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EPHY_TYPE_BOOKMARK_ACTION))
-#define EPHY_IS_BOOKMARK_ACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), EPHY_TYPE_BOOKMARK_ACTION))
-#define EPHY_BOOKMARK_ACTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), EPHY_TYPE_BOOKMARK_ACTION, EphyBookmarkActionClass))
+G_BEGIN_DECLS
-typedef struct _EphyBookmarkAction EphyBookmarkAction;
-typedef struct _EphyBookmarkActionClass EphyBookmarkActionClass;
-typedef struct EphyBookmarkActionPrivate EphyBookmarkActionPrivate;
+#define EPHY_TYPE_BOOKMARK_ACTION (ephy_bookmark_action_get_type ())
+#define EPHY_BOOKMARK_ACTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EPHY_TYPE_BOOKMARK_ACTION, EphyBookmarkAction))
+#define EPHY_BOOKMARK_ACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EPHY_TYPE_BOOKMARK_ACTION, EphyBookmarkActionClass))
+#define EPHY_IS_BOOKMARK_ACTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EPHY_TYPE_BOOKMARK_ACTION))
+#define EPHY_IS_BOOKMARK_ACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), EPHY_TYPE_BOOKMARK_ACTION))
+#define EPHY_BOOKMARK_ACTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), EPHY_TYPE_BOOKMARK_ACTION, EphyBookmarkActionClass))
+
+typedef struct _EphyBookmarkAction EphyBookmarkAction;
+typedef struct _EphyBookmarkActionPrivate EphyBookmarkActionPrivate;
+typedef struct _EphyBookmarkActionClass EphyBookmarkActionClass;
struct _EphyBookmarkAction
{
- GtkAction parent;
+ EphyLinkAction parent_instance;
/*< private >*/
EphyBookmarkActionPrivate *priv;
@@ -46,13 +48,7 @@ struct _EphyBookmarkAction
struct _EphyBookmarkActionClass
{
- GtkActionClass parent_class;
-
- void (*open) (EphyBookmarkAction *action,
- char *address);
- void (*open_in_tab) (EphyBookmarkAction *action,
- char *address,
- gboolean new_window);
+ EphyLinkActionClass parent_class;
};
GType ephy_bookmark_action_get_type (void);
@@ -60,4 +56,6 @@ GType ephy_bookmark_action_get_type (void);
GtkAction *ephy_bookmark_action_new (const char *name,
EphyNode *node);
-#endif
+G_END_DECLS
+
+#endif /* EPHY_BOOKMARK_ACTION_H */
diff --git a/src/bookmarks/ephy-bookmarks-menu.c b/src/bookmarks/ephy-bookmarks-menu.c
index dcb5a7eb5..48bf8b8bf 100644
--- a/src/bookmarks/ephy-bookmarks-menu.c
+++ b/src/bookmarks/ephy-bookmarks-menu.c
@@ -23,9 +23,9 @@
#include "ephy-bookmarks-menu.h"
#include "ephy-bookmark-action.h"
+#include "ephy-link.h"
#include "ephy-shell.h"
#include "ephy-node-common.h"
-#include "ephy-marshal.h"
#include "ephy-gui.h"
#include "ephy-debug.h"
@@ -68,6 +68,8 @@ struct _EphyBookmarksMenuPrivate
#define FOLDER_VERB_FORMAT "Fld%x%x"
#define FOLDER_VERB_FORMAT_LENGTH strlen (FOLDER_VERB_FORMAT) + 2 * MAXLEN + 1
+#define BMK_ACCEL_PATH_PREFIX "<Actions>/BmkActions/"
+
#define GAZILLION 200
#define UPDATE_DELAY 5000 /* ms */
#define LABEL_WIDTH_CHARS 32
@@ -79,14 +81,6 @@ enum
PROP_UI_MANAGER
};
-enum
-{
- OPEN,
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
static void ephy_bookmarks_menu_class_init (EphyBookmarksMenuClass *klass);
static void ephy_bookmarks_menu_init (EphyBookmarksMenu *menu);
@@ -111,10 +105,19 @@ ephy_bookmarks_menu_get_type (void)
0, /* n_preallocs */
(GInstanceInitFunc) ephy_bookmarks_menu_init
};
+ static const GInterfaceInfo link_info =
+ {
+ NULL,
+ NULL,
+ NULL
+ };
type = g_type_register_static (G_TYPE_OBJECT,
"EphyBookmarksMenu",
&our_info, 0);
+ g_type_add_interface_static (type,
+ EPHY_TYPE_LINK,
+ &link_info);
}
return type;
@@ -184,26 +187,6 @@ ephy_bookmarks_menu_clean (EphyBookmarksMenu *menu)
}
static void
-open_bookmark_cb (GtkAction *action,
- const char *location,
- EphyBookmarksMenu *menu)
-{
- g_signal_emit (menu, signals[OPEN], 0, location,
- ephy_gui_is_middle_click ());
-}
-
-static void
-open_bookmark_in_tab_cb (GtkAction *action,
- const char *location,
- gboolean dummy,
- EphyBookmarksMenu *menu)
-{
- g_signal_emit (menu, signals[OPEN], 0, location, TRUE);
-}
-
-#define BMK_ACCEL_PATH_PREFIX "<Actions>/BmkActions/"
-
-static void
add_action_for_bookmark (EphyBookmarksMenu *menu,
EphyNode *bmk)
{
@@ -223,10 +206,8 @@ add_action_for_bookmark (EphyBookmarksMenu *menu,
gtk_action_set_accel_path (action, apath);
- g_signal_connect (action, "open",
- G_CALLBACK (open_bookmark_cb), menu);
- g_signal_connect (action, "open_in_tab",
- G_CALLBACK (open_bookmark_in_tab_cb), menu);
+ g_signal_connect_swapped (action, "open-link",
+ G_CALLBACK (ephy_link_open), menu);
gtk_action_group_add_action (menu->priv->bmk_actions, action);
g_object_unref (action);
@@ -798,18 +779,6 @@ ephy_bookmarks_menu_class_init (EphyBookmarksMenuClass *klass)
object_class->set_property = ephy_bookmarks_menu_set_property;
object_class->get_property = ephy_bookmarks_menu_get_property;
- signals[OPEN] =
- g_signal_new ("open",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (EphyBookmarksMenuClass, open),
- NULL, NULL,
- ephy_marshal_VOID__STRING_BOOLEAN,
- G_TYPE_NONE,
- 2,
- G_TYPE_STRING,
- G_TYPE_BOOLEAN);
-
g_object_class_install_property (object_class,
PROP_PATH,
g_param_spec_string ("path",
diff --git a/src/bookmarks/ephy-bookmarks-menu.h b/src/bookmarks/ephy-bookmarks-menu.h
index b22e55a7f..82a828b50 100644
--- a/src/bookmarks/ephy-bookmarks-menu.h
+++ b/src/bookmarks/ephy-bookmarks-menu.h
@@ -1,5 +1,7 @@
/*
* Copyright (C) 2002 Ricardo Fernández Pascual
+ * Copyright (C) 2003, 2004 Marco Pesenti Gritti
+ * Copyright (C) 2003, 2004 Christian Persch
*
* 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
@@ -34,16 +36,12 @@ G_BEGIN_DECLS
#define EPHY_BOOKMARKS_MENU_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), EPHY_TYPE_BOOKMARKS_MENU, EphyBookmarksMenuClass))
typedef struct _EphyBookmarksMenu EphyBookmarksMenu;
-typedef struct _EphyBookmarksMenuClass EphyBookmarksMenuClass;
typedef struct _EphyBookmarksMenuPrivate EphyBookmarksMenuPrivate;
+typedef struct _EphyBookmarksMenuClass EphyBookmarksMenuClass;
struct _EphyBookmarksMenuClass
{
GObjectClass parent_class;
-
- void (*open) (EphyBookmarksMenu *menu,
- const char *address,
- gboolean open_in_new);
};
struct _EphyBookmarksMenu
diff --git a/src/bookmarks/ephy-bookmarksbar.c b/src/bookmarks/ephy-bookmarksbar.c
index dce1a15be..e9af82f12 100644
--- a/src/bookmarks/ephy-bookmarksbar.c
+++ b/src/bookmarks/ephy-bookmarksbar.c
@@ -27,6 +27,7 @@
#include "ephy-bookmarks.h"
#include "ephy-shell.h"
#include "ephy-topic-action.h"
+#include "ephy-link.h"
#include "ephy-bookmark-action.h"
#include "ephy-new-bookmark.h"
#include "ephy-stock-icons.h"
@@ -87,61 +88,24 @@ ephy_bookmarksbar_get_type (void)
(GInstanceInitFunc) ephy_bookmarksbar_init
};
+ static const GInterfaceInfo link_info =
+ {
+ NULL,
+ NULL,
+ NULL
+ };
+
type = g_type_register_static (EGG_TYPE_EDITABLE_TOOLBAR,
"EphyBookmarksBar",
&our_info, 0);
+ g_type_add_interface_static (type,
+ EPHY_TYPE_LINK,
+ &link_info);
}
return type;
}
-static void
-open_in_tabs_cb (GtkAction *action, GList *uri_list, EphyBookmarksBar *toolbar)
-{
- EphyTab *tab;
- EphyWindow *window;
- GList *l = uri_list;
-
- g_return_if_fail (l != NULL);
-
- tab = ephy_shell_new_tab (ephy_shell, NULL, NULL, l->data,
- EPHY_NEW_TAB_OPEN_PAGE);
- g_return_if_fail (tab != NULL);
-
- window = EPHY_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (tab)));
- g_return_if_fail (window != NULL);
-
- for (l = l->next; l != NULL; l = l->next)
- {
- ephy_shell_new_tab (ephy_shell, window, NULL, l->data,
- EPHY_NEW_TAB_IN_EXISTING_WINDOW |
- EPHY_NEW_TAB_OPEN_PAGE |
- EPHY_NEW_TAB_APPEND_LAST);
- }
-}
-
-static void
-bookmark_open_in_tab_cb (GtkAction *action, char *location,
- gboolean new_window, EphyBookmarksBar *toolbar)
-{
- EphyNewTabFlags flags = EPHY_NEW_TAB_OPEN_PAGE |
- EPHY_NEW_TAB_JUMP;
-
- if (!new_window)
- {
- flags |= EPHY_NEW_TAB_IN_EXISTING_WINDOW;
- }
-
- ephy_shell_new_tab (ephy_shell, toolbar->priv->window, NULL,
- location, flags);
-}
-
-static void
-bookmark_open_cb (GtkAction *action, char *location, EphyBookmarksBar *toolbar)
-{
- ephy_window_load_url (toolbar->priv->window, location);
-}
-
static gboolean
remove_action_from_model (EggToolbarsModel *model, const char *name)
{
@@ -231,9 +195,6 @@ ephy_bookmarksbar_action_request (EggEditableToolbar *eggtoolbar,
if (ephy_node_has_child (topics, node))
{
action = ephy_topic_action_new (name, node);
-
- g_signal_connect (action, "open_in_tabs",
- G_CALLBACK (open_in_tabs_cb), toolbar);
}
else if (ephy_node_has_child (bmks, node))
{
@@ -242,10 +203,8 @@ ephy_bookmarksbar_action_request (EggEditableToolbar *eggtoolbar,
g_return_if_fail (action != NULL);
- g_signal_connect (action, "open",
- G_CALLBACK (bookmark_open_cb), toolbar);
- g_signal_connect (action, "open_in_tab",
- G_CALLBACK (bookmark_open_in_tab_cb), toolbar);
+ g_signal_connect_swapped (action, "open-link",
+ G_CALLBACK (ephy_link_open), toolbar);
gtk_action_group_add_action (toolbar->priv->action_group, action);
g_object_unref (action);
diff --git a/src/bookmarks/ephy-favorites-menu.c b/src/bookmarks/ephy-favorites-menu.c
index b0dc3c631..8b1988633 100644
--- a/src/bookmarks/ephy-favorites-menu.c
+++ b/src/bookmarks/ephy-favorites-menu.c
@@ -1,6 +1,7 @@
/*
* Copyright (C) 2002 Ricardo Fernández Pascual
- * Copyright (C) 2003 Marco Pesenti Gritti
+ * Copyright (C) 2003, 2004 Marco Pesenti Gritti
+ * Copyright (C) 2003, 2004 Christian Persch
*
* 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
@@ -23,9 +24,12 @@
#include "ephy-favorites-menu.h"
#include "ephy-bookmark-action.h"
+#include "ephy-link.h"
#include "ephy-shell.h"
#include "ephy-debug.h"
+#include <gtk/gtkmenuitem.h>
+#include <gtk/gtklabel.h>
#include <gtk/gtkuimanager.h>
#include <glib/gprintf.h>
@@ -73,11 +77,21 @@ ephy_favorites_menu_get_type (void)
0, /* n_preallocs */
(GInstanceInitFunc) ephy_favorites_menu_init
};
+ static const GInterfaceInfo link_info =
+ {
+ NULL,
+ NULL,
+ NULL
+ };
type = g_type_register_static (G_TYPE_OBJECT,
"EphyFavoritesMenu",
&our_info, 0);
+ g_type_add_interface_static (type,
+ EPHY_TYPE_LINK,
+ &link_info);
}
+
return type;
}
@@ -102,12 +116,6 @@ ephy_favorites_menu_clean (EphyFavoritesMenu *menu)
}
static void
-open_bookmark_cb (GtkAction *action, char *location, EphyWindow *window)
-{
- ephy_window_load_url (window, location);
-}
-
-static void
connect_proxy_cb (GtkActionGroup *action_group,
GtkAction *action,
GtkWidget *proxy)
@@ -166,8 +174,8 @@ ephy_favorites_menu_rebuild (EphyFavoritesMenu *menu)
gtk_action_set_accel_path (action, accel_path);
gtk_action_group_add_action (p->action_group, action);
g_object_unref (action);
- g_signal_connect (action, "open",
- G_CALLBACK (open_bookmark_cb), p->window);
+ g_signal_connect_swapped (action, "open-link",
+ G_CALLBACK (ephy_link_open), menu);
gtk_ui_manager_add_ui (merge, p->ui_id,
"/menubar/GoMenu",
diff --git a/src/bookmarks/ephy-favorites-menu.h b/src/bookmarks/ephy-favorites-menu.h
index 48c6fbd27..c399218b9 100644
--- a/src/bookmarks/ephy-favorites-menu.h
+++ b/src/bookmarks/ephy-favorites-menu.h
@@ -33,9 +33,9 @@ G_BEGIN_DECLS
#define EPHY_IS_FAVORITES_MENU_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), EPHY_TYPE_FAVORITES_MENU))
#define EPHY_FAVORITES_MENU_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), EPHY_TYPE_FAVORITES_MENU, EphyFavoritesMenuClass))
-typedef struct _EphyFavoritesMenu EphyFavoritesMenu;
-typedef struct _EphyFavoritesMenuClass EphyFavoritesMenuClass;
-typedef struct _EphyFavoritesMenuPrivate EphyFavoritesMenuPrivate;
+typedef struct _EphyFavoritesMenu EphyFavoritesMenu;
+typedef struct _EphyFavoritesMenuClass EphyFavoritesMenuClass;
+typedef struct _EphyFavoritesMenuPrivate EphyFavoritesMenuPrivate;
struct _EphyFavoritesMenuClass
{
diff --git a/src/bookmarks/ephy-topic-action.c b/src/bookmarks/ephy-topic-action.c
index eb57b48a6..1acdf797c 100644
--- a/src/bookmarks/ephy-topic-action.c
+++ b/src/bookmarks/ephy-topic-action.c
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2003, 2004 Marco Pesenti Gritti
+ * Copyright (C) 2003, 2004 Christian Persch
*
* 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
@@ -20,24 +21,32 @@
#include "config.h"
-#include <gtk/gtktoolitem.h>
-#include <glib/gi18n.h>
-#include <libgnomevfs/gnome-vfs-uri.h>
-#include <string.h>
-
#include "ephy-topic-action.h"
#include "ephy-node-common.h"
#include "ephy-bookmarks.h"
#include "ephy-bookmarksbar.h"
+#include "ephy-link.h"
#include "ephy-favicon-cache.h"
#include "ephy-shell.h"
-#include "ephy-debug.h"
#include "ephy-dnd.h"
#include "ephy-gui.h"
-#include "ephy-marshal.h"
+#include "ephy-debug.h"
-static void ephy_topic_action_init (EphyTopicAction *action);
-static void ephy_topic_action_class_init (EphyTopicActionClass *class);
+#include <glib/gi18n.h>
+#include <gtk/gtkwidget.h>
+#include <gtk/gtkarrow.h>
+#include <gtk/gtkhbox.h>
+#include <gtk/gtklabel.h>
+#include <gtk/gtkbutton.h>
+#include <gtk/gtktogglebutton.h>
+#include <gtk/gtkstock.h>
+#include <gtk/gtkimage.h>
+#include <gtk/gtkmenuitem.h>
+#include <gtk/gtkimagemenuitem.h>
+#include <gtk/gtkseparatormenuitem.h>
+#include <gtk/gtkmain.h>
+#include <libgnomevfs/gnome-vfs-uri.h>
+#include <string.h>
#define TOOLITEM_WIDTH_CHARS 24
#define MENUITEM_WIDTH_CHARS 32
@@ -66,18 +75,11 @@ enum
PROP_TOPIC
};
-enum
-{
- OPEN,
- OPEN_IN_TAB,
- OPEN_IN_TABS,
- LAST_SIGNAL
-};
+static void ephy_topic_action_class_init (EphyTopicActionClass *class);
+static void ephy_topic_action_init (EphyTopicAction *action);
static GObjectClass *parent_class = NULL;
-static guint ephy_topic_action_signals[LAST_SIGNAL] = { 0 };
-
GType
ephy_topic_action_get_type (void)
{
@@ -98,10 +100,11 @@ ephy_topic_action_get_type (void)
(GInstanceInitFunc) ephy_topic_action_init,
};
- type = g_type_register_static (GTK_TYPE_ACTION,
+ type = g_type_register_static (EPHY_TYPE_LINK_ACTION,
"EphyTopicAction",
&type_info, 0);
}
+
return type;
}
@@ -163,16 +166,8 @@ menu_activate_cb (GtkWidget *item, GtkAction *action)
location = ephy_node_get_property_string
(node, EPHY_NODE_BMK_PROP_LOCATION);
- if (ephy_gui_is_middle_click ())
- {
- g_signal_emit (action, ephy_topic_action_signals[OPEN_IN_TAB],
- 0, location, FALSE);
- }
- else
- {
- g_signal_emit (action, ephy_topic_action_signals[OPEN],
- 0, location);
- }
+ ephy_link_open (EPHY_LINK (action), location, NULL,
+ ephy_gui_is_middle_click () ? EPHY_LINK_NEW_TAB : 0);
}
static void
@@ -337,8 +332,8 @@ static void
open_in_tabs_activate_cb (GtkWidget *item, EphyTopicAction *action)
{
EphyNode *node;
- GList *uri_list = NULL;
GPtrArray *children;
+ EphyTab *tab = NULL;
int i;
node = g_object_get_data (G_OBJECT (item), TOPIC_NODE_DATA_KEY);
@@ -353,13 +348,10 @@ open_in_tabs_activate_cb (GtkWidget *item, EphyTopicAction *action)
child = g_ptr_array_index (children, i);
address = ephy_node_get_property_string
(child, EPHY_NODE_BMK_PROP_LOCATION);
- uri_list = g_list_append (uri_list, g_strdup (address));
- }
- g_signal_emit (action, ephy_topic_action_signals[OPEN_IN_TABS],
- 0, uri_list);
- g_list_foreach (uri_list, (GFunc)g_free, NULL);
- g_list_free (uri_list);
+ tab = ephy_link_open (EPHY_LINK (action), address, tab,
+ tab ? EPHY_LINK_NEW_TAB : EPHY_LINK_NEW_WINDOW);
+ }
}
static int
@@ -989,40 +981,6 @@ ephy_topic_action_class_init (EphyTopicActionClass *class)
object_class->set_property = ephy_topic_action_set_property;
object_class->get_property = ephy_topic_action_get_property;
- ephy_topic_action_signals[OPEN] =
- g_signal_new ("open",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (EphyTopicActionClass, open),
- NULL, NULL,
- g_cclosure_marshal_VOID__STRING,
- G_TYPE_NONE,
- 1,
- G_TYPE_STRING);
-
- ephy_topic_action_signals[OPEN_IN_TAB] =
- g_signal_new ("open_in_tab",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (EphyTopicActionClass, open_in_tab),
- NULL, NULL,
- ephy_marshal_VOID__STRING_BOOLEAN,
- G_TYPE_NONE,
- 2,
- G_TYPE_STRING,
- G_TYPE_BOOLEAN);
-
- ephy_topic_action_signals[OPEN_IN_TABS] =
- g_signal_new ("open_in_tabs",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (EphyTopicActionClass, open_in_tabs),
- NULL, NULL,
- g_cclosure_marshal_VOID__POINTER,
- G_TYPE_NONE,
- 1,
- G_TYPE_POINTER);
-
g_object_class_install_property
(object_class,
PROP_TOPIC,
diff --git a/src/bookmarks/ephy-topic-action.h b/src/bookmarks/ephy-topic-action.h
index 7735fb31c..7c39e2e19 100644
--- a/src/bookmarks/ephy-topic-action.h
+++ b/src/bookmarks/ephy-topic-action.h
@@ -1,5 +1,6 @@
/*
- * Copyright (C) 2003 Marco Pesenti Gritti
+ * Copyright (C) 2003, 2004 Marco Pesenti Gritti
+ * Copyright (C) 2003, 2004 Christian Persch
*
* 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
@@ -21,11 +22,11 @@
#ifndef EPHY_TOPIC_ACTION_H
#define EPHY_TOPIC_ACTION_H
-#include <gtk/gtk.h>
-#include <gtk/gtkaction.h>
-
+#include "ephy-link-action.h"
#include "ephy-node.h"
+G_BEGIN_DECLS
+
#define EPHY_TYPE_TOPIC_ACTION (ephy_topic_action_get_type ())
#define EPHY_TOPIC_ACTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EPHY_TYPE_TOPIC_ACTION, EphyTopicAction))
#define EPHY_TOPIC_ACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EPHY_TYPE_TOPIC_ACTION, EphyTopicActionClass))
@@ -34,12 +35,12 @@
#define EPHY_TOPIC_ACTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), EPHY_TYPE_TOPIC_ACTION, EphyTopicActionClass))
typedef struct _EphyTopicAction EphyTopicAction;
-typedef struct _EphyTopicActionClass EphyTopicActionClass;
typedef struct _EphyTopicActionPrivate EphyTopicActionPrivate;
+typedef struct _EphyTopicActionClass EphyTopicActionClass;
struct _EphyTopicAction
{
- GtkAction parent;
+ EphyLinkAction parent_instance;
/*< private >*/
EphyTopicActionPrivate *priv;
@@ -47,15 +48,7 @@ struct _EphyTopicAction
struct _EphyTopicActionClass
{
- GtkActionClass parent_class;
-
- void (*open) (EphyTopicAction *action,
- char *address);
- void (*open_in_tab) (EphyTopicAction *action,
- char *address,
- gboolean new_window);
- void (*open_in_tabs) (EphyTopicAction *action,
- GList *uri_list);
+ EphyLinkActionClass parent_class;
};
GType ephy_topic_action_get_type (void);
@@ -63,4 +56,6 @@ GType ephy_topic_action_get_type (void);
GtkAction *ephy_topic_action_new (const char *name,
EphyNode *node);
+G_END_DECLS
+
#endif
diff --git a/src/ephy-home-action.c b/src/ephy-home-action.c
new file mode 100644
index 000000000..52e86ef83
--- /dev/null
+++ b/src/ephy-home-action.c
@@ -0,0 +1,78 @@
+/*
+* Copyright (C) 2004 Christian Persch
+*
+* 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, 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 "config.h"
+
+#include "ephy-home-action.h"
+#include "ephy-link.h"
+#include "ephy-prefs.h"
+#include "ephy-gui.h"
+#include "eel-gconf-extensions.h"
+
+static void
+ephy_home_action_activate (GtkAction *action)
+{
+ char *address;
+
+ address = eel_gconf_get_string (CONF_GENERAL_HOMEPAGE);
+
+ ephy_link_open (EPHY_LINK (action),
+ address != NULL && address[0] != '\0' ? address : "about:blank",
+ NULL,
+ ephy_gui_is_middle_click () ? EPHY_LINK_NEW_TAB : 0);
+
+ g_free (address);
+}
+
+static void
+ephy_home_action_class_init (EphyHomeActionClass *class)
+{
+ GtkActionClass *action_class = GTK_ACTION_CLASS (class);
+
+ action_class->activate = ephy_home_action_activate;
+}
+
+GType
+ephy_home_action_get_type (void)
+{
+ static GType type = 0;
+
+ if (G_UNLIKELY (type == 0))
+ {
+ static const GTypeInfo type_info =
+ {
+ sizeof (EphyHomeActionClass),
+ (GBaseInitFunc) NULL,
+ (GBaseFinalizeFunc) NULL,
+ (GClassInitFunc) ephy_home_action_class_init,
+ (GClassFinalizeFunc) NULL,
+ NULL,
+ sizeof (EphyHomeAction),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc) NULL,
+ };
+
+ type = g_type_register_static (EPHY_TYPE_LINK_ACTION,
+ "EphyHomeAction",
+ &type_info, 0);
+ }
+
+ return type;
+}
diff --git a/src/ephy-home-action.h b/src/ephy-home-action.h
new file mode 100644
index 000000000..4e53d95c0
--- /dev/null
+++ b/src/ephy-home-action.h
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2004 Christian Persch
+ *
+ * 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, 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_HOME_ACTION_H
+#define EPHY_HOME_ACTION_H
+
+#include "ephy-link-action.h"
+
+G_BEGIN_DECLS
+
+#define EPHY_TYPE_HOME_ACTION (ephy_home_action_get_type ())
+#define EPHY_HOME_ACTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EPHY_TYPE_HOME_ACTION, EphyHomeAction))
+#define EPHY_HOME_ACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EPHY_TYPE_HOME_ACTION, EphyHomeActionClass))
+#define EPHY_IS_HOME_ACTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EPHY_TYPE_HOME_ACTION))
+#define EPHY_IS_HOME_ACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), EPHY_TYPE_HOME_ACTION))
+#define EPHY_HOME_ACTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), EPHY_TYPE_HOME_ACTION, EphyHomeActionClass))
+
+typedef struct _EphyHomeAction EphyHomeAction;
+typedef struct _EphyHomeActionClass EphyHomeActionClass;
+
+struct _EphyHomeAction
+{
+ EphyLinkAction parent_instance;
+};
+
+struct _EphyHomeActionClass
+{
+ EphyLinkActionClass parent_class;
+};
+
+GType ephy_home_action_get_type (void);
+
+G_END_DECLS
+
+#endif /* EPHY_HOME_ACTION_H */
diff --git a/src/ephy-link-action.c b/src/ephy-link-action.c
new file mode 100644
index 000000000..18af84759
--- /dev/null
+++ b/src/ephy-link-action.c
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2004 Christian Persch
+ *
+ * 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, 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 "config.h"
+
+#include "ephy-link-action.h"
+#include "ephy-link.h"
+
+GType
+ephy_link_action_get_type (void)
+{
+ static GType type = 0;
+
+ if (G_UNLIKELY (type == 0))
+ {
+ static const GTypeInfo our_info =
+ {
+ sizeof (EphyLinkActionClass),
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ NULL, /* class_init */
+ NULL,
+ NULL, /* class_data */
+ sizeof (EphyLinkAction),
+ 0, /* n_preallocs */
+ NULL /* instance_init */
+ };
+ static const GInterfaceInfo link_info =
+ {
+ NULL,
+ NULL,
+ NULL
+ };
+
+ type = g_type_register_static (GTK_TYPE_ACTION,
+ "EphyLinkAction",
+ &our_info, G_TYPE_FLAG_ABSTRACT);
+ g_type_add_interface_static (type,
+ EPHY_TYPE_LINK,
+ &link_info);
+ }
+
+ return type;
+}
diff --git a/src/ephy-link-action.h b/src/ephy-link-action.h
new file mode 100644
index 000000000..046fed715
--- /dev/null
+++ b/src/ephy-link-action.h
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2004 Christian Persch
+ *
+ * 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, 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_LINK_ACTION_H
+#define EPHY_LINK_ACTION_H
+
+#include <gtk/gtkaction.h>
+
+G_BEGIN_DECLS
+
+#define EPHY_TYPE_LINK_ACTION (ephy_link_action_get_type ())
+#define EPHY_LINK_ACTION(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), EPHY_TYPE_LINK_ACTION, EphyLinkAction))
+#define EPHY_LINK_ACTION_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), EPHY_TYPE_LINK_ACTION, EphyLinkActionClass))
+#define EPHY_IS_LINK_ACTION(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), EPHY_TYPE_LINK_ACTION))
+#define EPHY_IS_LINK_ACTION_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), EPHY_TYPE_LINK_ACTION))
+#define EPHY_LINK_ACTION_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), EPHY_TYPE_LINK_ACTION, EphyLinkActionClass))
+
+typedef struct _EphyLinkAction EphyLinkAction;
+typedef struct _EphyLinkActionClass EphyLinkActionClass;
+
+struct _EphyLinkAction
+{
+ GtkAction parent_instance;
+};
+
+struct _EphyLinkActionClass
+{
+ GtkActionClass parent_class;
+};
+
+GType ephy_link_action_get_type (void);
+
+G_END_DECLS
+
+#endif
diff --git a/src/ephy-link.c b/src/ephy-link.c
new file mode 100644
index 000000000..05e8afdb7
--- /dev/null
+++ b/src/ephy-link.c
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2004 Christian Persch
+ *
+ * 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, 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 "config.h"
+
+#include "ephy-link.h"
+
+#include "ephy-marshal.h"
+#include "ephy-signal-accumulator.h"
+#include "ephy-debug.h"
+
+GType
+ephy_link_flags_get_type (void)
+{
+ static GType type = 0;
+
+ if (G_UNLIKELY (type == 0))
+ {
+ static const GFlagsValue values[] =
+ {
+ { EPHY_LINK_NEW_WINDOW, "EPHY_LINK_NEW_WINDOW", "new-window" },
+ { EPHY_LINK_NEW_TAB, "EPHY_LINK_NEW_TAB", "new-tab" },
+ { EPHY_LINK_JUMP_TO, "EPHY_LINK_JUMP_TO", "jump-to" },
+ { 0, NULL, NULL }
+ };
+
+ type = g_flags_register_static ("EphyLinkFlags", values);
+ }
+
+ return type;
+}
+
+enum
+{
+ OPEN_LINK,
+ LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL] = { 0 };
+
+static void
+ephy_link_base_init (gpointer g_class)
+{
+ static gboolean initialised = FALSE;
+
+ if (!initialised)
+ {
+ signals[OPEN_LINK] = g_signal_new
+ ("open-link",
+ EPHY_TYPE_LINK,
+ G_SIGNAL_RUN_FIRST | G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (EphyLinkIface, open_link),
+ ephy_signal_accumulator_object, ephy_tab_get_type,
+ ephy_marshal_OBJECT__OBJECT_STRING_FLAGS,
+ EPHY_TYPE_TAB,
+ 3,
+ G_TYPE_STRING,
+ EPHY_TYPE_TAB,
+ EPHY_TYPE_LINK_FLAGS);
+
+ initialised = TRUE;
+ }
+}
+
+GType
+ephy_link_get_type (void)
+{
+ static GType type = 0;
+
+ if (G_UNLIKELY (type == 0))
+ {
+ static const GTypeInfo our_info =
+ {
+ sizeof (EphyLinkIface),
+ ephy_link_base_init,
+ NULL,
+ };
+
+ type = g_type_register_static (G_TYPE_INTERFACE,
+ "EphyLink",
+ &our_info, (GTypeFlags)0);
+ }
+
+ return type;
+}
+
+EphyTab *
+ephy_link_open (EphyLink *link,
+ const char *address,
+ EphyTab *tab,
+ EphyLinkFlags flags)
+{
+ EphyTab *new_tab = NULL;
+
+ LOG ("ephy_link_open address \"%s\" parent-tab %p flags %u", address, tab, flags)
+
+ g_signal_emit (link, signals[OPEN_LINK], 0,
+ address, tab, flags,
+ &new_tab);
+
+ return new_tab;
+}
diff --git a/src/ephy-link.h b/src/ephy-link.h
new file mode 100644
index 000000000..12fad7d6c
--- /dev/null
+++ b/src/ephy-link.h
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2004 Christian Persch
+ *
+ * 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, 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_LINK_H
+#define EPHY_LINK_H
+
+#include <glib-object.h>
+#include "ephy-tab.h"
+#include "ephy-window.h"
+
+G_BEGIN_DECLS
+
+#define EPHY_TYPE_LINK (ephy_link_get_type ())
+#define EPHY_LINK(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), EPHY_TYPE_LINK, EphyLink))
+#define EPHY_LINK_IFACE(k) (G_TYPE_CHECK_CLASS_CAST((k), EPHY_TYPE_LINK, EphyLinkIface))
+#define EPHY_IS_LINK(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), EPHY_TYPE_LINK))
+#define EPHY_IS_LINK_IFACE(k) (G_TYPE_CHECK_CLASS_TYPE ((k), EPHY_TYPE_LINK))
+#define EPHY_LINK_GET_IFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), EPHY_TYPE_LINK, EphyLinkIface))
+
+#define EPHY_TYPE_LINK_FLAGS (ephy_link_flags_get_type ())
+
+typedef struct _EphyLink EphyLink;
+typedef struct _EphyLinkIface EphyLinkIface;
+
+typedef enum
+{
+ EPHY_LINK_NEW_WINDOW = 1 << 0,
+ EPHY_LINK_NEW_TAB = 1 << 1,
+ EPHY_LINK_JUMP_TO = 1 << 2
+} EphyLinkFlags;
+
+struct _EphyLinkIface
+{
+ GTypeInterface base_iface;
+
+ /* Signals */
+ EphyTab * (* open_link) (EphyLink *link,
+ const char *address,
+ EphyTab *tab,
+ EphyLinkFlags flags);
+};
+
+GType ephy_link_flags_get_type (void);
+
+GType ephy_link_get_type (void);
+
+EphyTab *ephy_link_open (EphyLink *link,
+ const char *address,
+ EphyTab *tab,
+ EphyLinkFlags flags);
+
+G_END_DECLS
+
+#endif /* EPHY_LINK_H */
diff --git a/src/ephy-location-action.c b/src/ephy-location-action.c
index b34ac0de7..4194b48f8 100644
--- a/src/ephy-location-action.c
+++ b/src/ephy-location-action.c
@@ -1,6 +1,6 @@
/*
- * Copyright (C) 2003 Marco Pesenti Gritti
- * Copyright (C) 2003 Christian Persch
+ * Copyright (C) 2003, 2004 Marco Pesenti Gritti
+ * Copyright (C) 2003, 2004 Christian Persch
*
* 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
@@ -25,6 +25,7 @@
#include "ephy-location-entry.h"
#include "ephy-shell.h"
#include "ephy-completion-model.h"
+#include "ephy-link.h"
#include "ephy-debug.h"
#include <gtk/gtkentry.h>
@@ -57,16 +58,8 @@ enum
PROP_EDITABLE
};
-enum
-{
- GO_LOCATION,
- LAST_SIGNAL
-};
-
static GObjectClass *parent_class = NULL;
-static guint signals[LAST_SIGNAL] = { 0 };
-
GType
ephy_location_action_get_type (void)
{
@@ -87,7 +80,7 @@ ephy_location_action_get_type (void)
(GInstanceInitFunc) ephy_location_action_init,
};
- type = g_type_register_static (GTK_TYPE_ACTION,
+ type = g_type_register_static (EPHY_TYPE_LINK_ACTION,
"EphyLocationAction",
&type_info, 0);
}
@@ -120,8 +113,8 @@ action_activated_cb (GtkEntryCompletion *completion,
(action->priv->bookmarks, smart_url, content);
g_return_if_fail (url != NULL);
- g_signal_emit (action, signals[GO_LOCATION], 0, url);
-
+ ephy_link_open (EPHY_LINK (action), url, NULL, 0);
+
g_free (url);
g_free (content);
}
@@ -134,9 +127,9 @@ location_url_activate_cb (GtkEntry *entry,
const char *content;
content = gtk_entry_get_text (entry);
- if (content)
+ if (content != NULL)
{
- g_signal_emit (action, signals[GO_LOCATION], 0, content);
+ ephy_link_open (EPHY_LINK (action), content, NULL, 0);
}
}
@@ -260,7 +253,7 @@ connect_proxy (GtkAction *action, GtkWidget *proxy)
G_CALLBACK (user_changed_cb), action, 0);
}
- (* GTK_ACTION_CLASS (parent_class)->connect_proxy) (action, proxy);
+ GTK_ACTION_CLASS (parent_class)->connect_proxy (action, proxy);
}
static void
@@ -284,7 +277,7 @@ disconnect_proxy (GtkAction *action, GtkWidget *proxy)
(proxy, G_CALLBACK (user_changed_cb), action);
}
- (* GTK_ACTION_CLASS (parent_class)->disconnect_proxy) (action, proxy);
+ GTK_ACTION_CLASS (parent_class)->disconnect_proxy (action, proxy);
}
static void
@@ -341,17 +334,6 @@ ephy_location_action_class_init (EphyLocationActionClass *class)
action_class->connect_proxy = connect_proxy;
action_class->disconnect_proxy = disconnect_proxy;
- signals[GO_LOCATION] =
- g_signal_new ("go_location",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (EphyLocationActionClass, go_location),
- NULL, NULL,
- g_cclosure_marshal_VOID__STRING,
- G_TYPE_NONE,
- 1,
- G_TYPE_STRING);
-
g_object_class_install_property (object_class,
PROP_ADDRESS,
g_param_spec_string ("address",
diff --git a/src/ephy-location-action.h b/src/ephy-location-action.h
index 987e9c75b..78053b27c 100644
--- a/src/ephy-location-action.h
+++ b/src/ephy-location-action.h
@@ -21,7 +21,7 @@
#ifndef EPHY_LOCATION_ACTION_H
#define EPHY_LOCATION_ACTION_H
-#include <gtk/gtkaction.h>
+#include "ephy-link-action.h"
G_BEGIN_DECLS
@@ -33,12 +33,12 @@ G_BEGIN_DECLS
#define EPHY_LOCATION_ACTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), EPHY_TYPE_LOCATION_ACTION, EphyLocationActionClass))
typedef struct _EphyLocationAction EphyLocationAction;
-typedef struct _EphyLocationActionClass EphyLocationActionClass;
typedef struct _EphyLocationActionPrivate EphyLocationActionPrivate;
-
+typedef struct _EphyLocationActionClass EphyLocationActionClass;
+
struct _EphyLocationAction
{
- GtkAction parent;
+ EphyLinkAction parent;
/*< private >*/
EphyLocationActionPrivate *priv;
@@ -46,9 +46,7 @@ struct _EphyLocationAction
struct _EphyLocationActionClass
{
- GtkActionClass parent_class;
-
- void (*go_location) (EphyLocationAction *action, char *location);
+ EphyLinkActionClass parent_class;
};
GType ephy_location_action_get_type (void);
diff --git a/src/ephy-navigation-action.c b/src/ephy-navigation-action.c
index 0e166f506..61300aa93 100644
--- a/src/ephy-navigation-action.c
+++ b/src/ephy-navigation-action.c
@@ -1,5 +1,6 @@
/*
- * Copyright (C) 2003 Marco Pesenti Gritti
+ * Copyright (C) 2003, 2004 Marco Pesenti Gritti
+ * Copyright (C) 2003, 2004 Christian Persch
*
* 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
@@ -25,6 +26,8 @@
#include "ephy-favicon-cache.h"
#include "ephy-history.h"
#include "ephy-embed-shell.h"
+#include "ephy-link.h"
+#include "ephy-gui.h"
#include "ephy-debug.h"
#include <gtk/gtklabel.h>
@@ -81,7 +84,7 @@ ephy_navigation_action_get_type (void)
(GInstanceInitFunc) ephy_navigation_action_init,
};
- type = g_type_register_static (GTK_TYPE_ACTION,
+ type = g_type_register_static (EPHY_TYPE_LINK_ACTION,
"EphyNavigationAction",
&type_info, 0);
}
@@ -133,12 +136,12 @@ new_history_menu_item (const char *origtext,
static void
activate_back_or_forward_menu_item_cb (GtkWidget *menuitem,
- EphyWindow *window)
+ EphyNavigationAction *action)
{
EphyEmbed *embed;
int go_nth;
- embed = ephy_window_get_active_embed (window);
+ embed = ephy_window_get_active_embed (action->priv->window);
g_return_if_fail (embed != NULL);
go_nth = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (menuitem), NTH_DATA_KEY));
@@ -148,18 +151,19 @@ activate_back_or_forward_menu_item_cb (GtkWidget *menuitem,
static void
activate_up_menu_item_cb (GtkWidget *menuitem,
- EphyWindow *window)
+ EphyNavigationAction *action)
{
EphyEmbed *embed;
char *url;
- embed = ephy_window_get_active_embed (window);
+ embed = ephy_window_get_active_embed (action->priv->window);
g_return_if_fail (embed != NULL);
url = g_object_get_data (G_OBJECT (menuitem), URL_DATA_KEY);
g_return_if_fail (url != NULL);
- ephy_window_load_url (window, url);
+ ephy_link_open (EPHY_LINK (action), url, NULL,
+ ephy_gui_is_middle_click () ? EPHY_LINK_NEW_TAB : 0);
}
static GtkWidget *
@@ -207,7 +211,7 @@ build_back_or_forward_menu (EphyNavigationAction *action)
GINT_TO_POINTER (start));
g_signal_connect (item, "activate",
G_CALLBACK (activate_back_or_forward_menu_item_cb),
- window);
+ action);
gtk_menu_shell_append (menu, item);
gtk_widget_show_all (item);
@@ -256,7 +260,7 @@ build_up_menu (EphyNavigationAction *action)
g_object_set_data_full (G_OBJECT (item), URL_DATA_KEY, url,
(GDestroyNotify) g_free);
g_signal_connect (item, "activate",
- G_CALLBACK (activate_up_menu_item_cb), window);
+ G_CALLBACK (activate_up_menu_item_cb), action);
gtk_menu_shell_append (menu, item);
gtk_widget_show (item);
diff --git a/src/ephy-navigation-action.h b/src/ephy-navigation-action.h
index d007c986d..fe440d303 100644
--- a/src/ephy-navigation-action.h
+++ b/src/ephy-navigation-action.h
@@ -1,5 +1,6 @@
/*
- * Copyright (C) 2003 Marco Pesenti Gritti
+ * Copyright (C) 2003, 2004 Marco Pesenti Gritti
+ * Copyright (C) 2003, 2004 Christian Persch
*
* 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
@@ -21,7 +22,9 @@
#ifndef EPHY_NAVIGATION_ACTION_H
#define EPHY_NAVIGATION_ACTION_H
-#include <gtk/gtkaction.h>
+#include "ephy-link-action.h"
+
+G_BEGIN_DECLS
#define EPHY_TYPE_NAVIGATION_ACTION (ephy_navigation_action_get_type ())
#define EPHY_NAVIGATION_ACTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EPHY_TYPE_NAVIGATION_ACTION, EphyNavigationAction))
@@ -31,8 +34,8 @@
#define EPHY_NAVIGATION_ACTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), EPHY_TYPE_NAVIGATION_ACTION, EphyNavigationActionClass))
typedef struct _EphyNavigationAction EphyNavigationAction;
-typedef struct _EphyNavigationActionClass EphyNavigationActionClass;
typedef struct _EphyNavigationActionPrivate EphyNavigationActionPrivate;
+typedef struct _EphyNavigationActionClass EphyNavigationActionClass;
typedef enum
{
@@ -43,7 +46,7 @@ typedef enum
struct _EphyNavigationAction
{
- GtkAction parent;
+ EphyLinkAction parent;
/*< private >*/
EphyNavigationActionPrivate *priv;
@@ -51,9 +54,11 @@ struct _EphyNavigationAction
struct _EphyNavigationActionClass
{
- GtkActionClass parent_class;
+ EphyLinkActionClass parent_class;
};
-GType ephy_navigation_action_get_type (void);
+GType ephy_navigation_action_get_type (void);
+
+G_END_DECLS
#endif
diff --git a/src/ephy-shell.c b/src/ephy-shell.c
index 46a56b2b6..4dfb77783 100644
--- a/src/ephy-shell.c
+++ b/src/ephy-shell.c
@@ -539,6 +539,9 @@ ephy_shell_new_tab (EphyShell *shell,
jump_to = (flags & EPHY_NEW_TAB_JUMP) != 0;
+ LOG ("Opening new tab parent-window %p parent-tab %p in-new-window:%s jump-to:%s",
+ parent_window, previous_tab, in_new_window ? "t" : "f", jump_to ? "t" : "f")
+
if (!in_new_window && parent_window != NULL)
{
window = parent_window;
diff --git a/src/ephy-window.c b/src/ephy-window.c
index 238bf10d7..6d624ab54 100644
--- a/src/ephy-window.c
+++ b/src/ephy-window.c
@@ -50,6 +50,7 @@
#include "ephy-stock-icons.h"
#include "ephy-extension.h"
#include "ephy-favicon-cache.h"
+#include "ephy-link.h"
#include "ephy-gui.h"
#include <string.h>
@@ -216,9 +217,6 @@ static GtkActionEntry ephy_menu_entries [] = {
{ "GoUp", GTK_STOCK_GO_UP, N_("_Up"), "<alt>Up",
N_("Go up one level"),
G_CALLBACK (window_cmd_go_up) },
- { "GoHome", GTK_STOCK_HOME, N_("_Home"), "<alt>Home",
- N_("Go to the home page"),
- G_CALLBACK (window_cmd_go_home) },
{ "GoLocation", NULL, N_("_Location..."), "<control>L",
N_("Go to a specified location"),
G_CALLBACK (window_cmd_go_location) },
@@ -1131,7 +1129,6 @@ setup_ui_manager (EphyWindow *window)
GtkActionGroup *action_group;
GtkAction *action;
GtkUIManager *manager;
- GError *err = NULL;
window->priv->main_vbox = gtk_vbox_new (FALSE, 0);
gtk_widget_show (window->priv->main_vbox);
@@ -1176,8 +1173,6 @@ setup_ui_manager (EphyWindow *window)
action = gtk_action_group_get_action (action_group, "EditFind");
g_object_set (action, "is_important", TRUE, NULL);
- action = gtk_action_group_get_action (action_group, "GoHome");
- g_object_set (action, "is_important", TRUE, NULL);
action = gtk_action_group_get_action (action_group, "GoBookmarks");
g_object_set (action, "is_important", TRUE, NULL);
@@ -1195,14 +1190,6 @@ setup_ui_manager (EphyWindow *window)
g_signal_connect (manager, "add_widget", G_CALLBACK (add_widget), window);
gtk_window_add_accel_group (GTK_WINDOW (window),
gtk_ui_manager_get_accel_group (manager));
-
- gtk_ui_manager_add_ui_from_file
- (manager, ephy_file ("epiphany-ui.xml"), &err);
- if (err != NULL)
- {
- g_warning ("Could not merge epiphany-ui.xml: %s", err->message);
- g_clear_error (&err);
- }
}
static void
@@ -2420,13 +2407,48 @@ action_request_forward_cb (GObject *toolbar,
g_signal_emit_by_name (bookmarksbar, "action_request", name);
}
-static void
-open_bookmark_cb (EphyBookmarksMenu *menu,
- const char *location,
- gboolean open_in_new,
- EphyWindow *window)
+static EphyTab *
+open_link_cb (EphyLink *link,
+ const char *address,
+ EphyTab *tab,
+ EphyLinkFlags flags,
+ EphyWindow *window)
{
- ephy_window_load_url (window, location);
+ EphyTab *new_tab;
+
+ g_return_val_if_fail (address != NULL, NULL);
+
+ if (flags != 0)
+ {
+ EphyNewTabFlags ntflags = EPHY_NEW_TAB_OPEN_PAGE;
+
+ if (flags & EPHY_LINK_JUMP_TO)
+ {
+ ntflags |= EPHY_NEW_TAB_JUMP;
+ }
+ if (flags & EPHY_LINK_NEW_WINDOW)
+ {
+ ntflags |= EPHY_NEW_TAB_IN_NEW_WINDOW;
+ }
+ else
+ {
+ ntflags |= EPHY_NEW_TAB_IN_EXISTING_WINDOW;
+ }
+
+ new_tab = ephy_shell_new_tab
+ (ephy_shell,
+ tab ? EPHY_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (tab)))
+ : window,
+ tab ? tab : ephy_window_get_active_tab (window),
+ address, ntflags);
+ }
+ else
+ {
+ ephy_window_load_url (window, address);
+ new_tab = ephy_window_get_active_tab (window);
+ }
+
+ return new_tab;
}
static void
@@ -2435,6 +2457,7 @@ ephy_window_init (EphyWindow *window)
EphyExtension *manager;
EphyEmbedSingle *single;
EggToolbarsModel *model;
+ GError *error = NULL;
LOG ("EphyWindow initialising %p", window)
@@ -2464,16 +2487,6 @@ ephy_window_init (EphyWindow *window)
window->priv->help_message_cid = gtk_statusbar_get_context_id
(GTK_STATUSBAR (window->priv->statusbar), "help_message");
- /* Initialize the menus */
- window->priv->tabs_menu = ephy_tabs_menu_new (window);
- window->priv->fav_menu = ephy_favorites_menu_new (window);
- window->priv->enc_menu = ephy_encoding_menu_new (window);
-
- window->priv->bmk_menu = ephy_bookmarks_menu_new (window->priv->manager,
- BOOKMARKS_MENU_PATH);
- g_signal_connect (window->priv->bmk_menu, "open",
- G_CALLBACK (open_bookmark_cb), window);
-
/* get the toolbars model *before* getting the bookmarksbar model
* (via ephy_bookmarsbar_new()), so that the toolbars model is
* instantiated *before* the bookmarksbarmodel, to make forwarding
@@ -2483,11 +2496,35 @@ ephy_window_init (EphyWindow *window)
/* create the toolbars */
window->priv->toolbar = toolbar_new (window);
+ g_signal_connect (window->priv->toolbar, "open-link",
+ G_CALLBACK (open_link_cb), window);
window->priv->bookmarksbar = ephy_bookmarksbar_new (window);
+ g_signal_connect (window->priv->bookmarksbar, "open-link",
+ G_CALLBACK (open_link_cb), window);
g_signal_connect_swapped (window->priv->toolbar, "activation-finished",
G_CALLBACK (sync_chromes_visibility), window);
+ /* now load the UI definition */
+ gtk_ui_manager_add_ui_from_file
+ (window->priv->manager, ephy_file ("epiphany-ui.xml"), &error);
+ if (error != NULL)
+ {
+ g_warning ("Could not merge epiphany-ui.xml: %s", error->message);
+ g_error_free (error);
+ }
+
+ /* Initialize the menus */
+ window->priv->tabs_menu = ephy_tabs_menu_new (window);
+ window->priv->enc_menu = ephy_encoding_menu_new (window);
+ window->priv->fav_menu = ephy_favorites_menu_new (window);
+ g_signal_connect (window->priv->fav_menu, "open-link",
+ G_CALLBACK (open_link_cb), window);
+ window->priv->bmk_menu = ephy_bookmarks_menu_new (window->priv->manager,
+ BOOKMARKS_MENU_PATH);
+ g_signal_connect (window->priv->bmk_menu, "open-link",
+ G_CALLBACK (open_link_cb), window);
+
/* forward the toolbar's action_request signal to the bookmarks toolbar,
* so the user can also have bookmarks on the normal toolbar
*/
diff --git a/src/toolbar.c b/src/toolbar.c
index 2e2424a12..ed24eb858 100755
--- a/src/toolbar.c
+++ b/src/toolbar.c
@@ -24,7 +24,9 @@
#include "toolbar.h"
#include "ephy-favicon-action.h"
+#include "ephy-link.h"
#include "ephy-go-action.h"
+#include "ephy-home-action.h"
#include "ephy-location-entry.h"
#include "ephy-location-action.h"
#include "ephy-navigation-action.h"
@@ -38,9 +40,10 @@
#include "eel-gconf-extensions.h"
#include "ephy-debug.h"
-#include <string.h>
#include <glib/gi18n.h>
+#include <gtk/gtkstock.h>
#include <gtk/gtkuimanager.h>
+#include <string.h>
static void toolbar_class_init (ToolbarClass *klass);
static void toolbar_init (Toolbar *t);
@@ -88,29 +91,39 @@ struct ToolbarPrivate
GType
toolbar_get_type (void)
{
- static GType type = 0;
+ static GType type = 0;
- if (G_UNLIKELY (type == 0))
- {
- static const GTypeInfo our_info =
- {
- sizeof (ToolbarClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) toolbar_class_init,
- NULL,
- NULL, /* class_data */
- sizeof (Toolbar),
- 0, /* n_preallocs */
- (GInstanceInitFunc) toolbar_init
- };
-
- type = g_type_register_static (EGG_TYPE_EDITABLE_TOOLBAR,
+ if (G_UNLIKELY (type == 0))
+ {
+ static const GTypeInfo our_info =
+ {
+ sizeof (ToolbarClass),
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ (GClassInitFunc) toolbar_class_init,
+ NULL,
+ NULL, /* class_data */
+ sizeof (Toolbar),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc) toolbar_init
+ };
+
+ static const GInterfaceInfo link_info =
+ {
+ NULL,
+ NULL,
+ NULL
+ };
+
+ type = g_type_register_static (EGG_TYPE_EDITABLE_TOOLBAR,
"Toolbar",
&our_info, 0);
- }
+ g_type_add_interface_static (type,
+ EPHY_TYPE_LINK,
+ &link_info);
+ }
- return type;
+ return type;
}
static void
@@ -152,12 +165,6 @@ arbitrary_url_notifier (GConfClient *client,
}
static void
-go_location_cb (GtkAction *action, char *location, EphyWindow *window)
-{
- ephy_window_load_url (window, location);
-}
-
-static void
zoom_to_level_cb (GtkAction *action, float zoom, EphyWindow *window)
{
ephy_window_set_zoom (window, zoom);
@@ -355,6 +362,8 @@ toolbar_setup_actions (Toolbar *t)
NULL);
g_signal_connect (action, "activate",
G_CALLBACK (window_cmd_go_up), t->priv->window);
+ g_signal_connect_swapped (action, "open-link",
+ G_CALLBACK (ephy_link_open), t);
gtk_action_group_add_action (t->priv->action_group, action);
g_object_unref (action);
@@ -368,8 +377,8 @@ toolbar_setup_actions (Toolbar *t)
"tooltip", _("Enter a web address to open, or a phrase to search for on the web"),
"visible-overflown", FALSE,
NULL);
- g_signal_connect (action, "go_location",
- G_CALLBACK (go_location_cb), t->priv->window);
+ g_signal_connect_swapped (action, "open-link",
+ G_CALLBACK (ephy_link_open), t);
g_signal_connect (action, "notify::address",
G_CALLBACK (sync_user_input_cb), t);
gtk_action_group_add_action (t->priv->action_group, action);
@@ -408,6 +417,18 @@ toolbar_setup_actions (Toolbar *t)
G_CALLBACK (window_cmd_load_location), t->priv->window);
gtk_action_group_add_action (t->priv->action_group, action);
g_object_unref (action);
+
+ action = g_object_new (EPHY_TYPE_HOME_ACTION,
+ "name", "GoHome",
+ "label", _("_Home"),
+ "stock_id", GTK_STOCK_HOME,
+ "tooltip", _("Go to the home page"),
+ "is_important", TRUE,
+ NULL);
+ g_signal_connect_swapped (action, "open-link",
+ G_CALLBACK (ephy_link_open), t);
+ gtk_action_group_add_action_with_accel (t->priv->action_group, action, "<alt>Home");
+ g_object_unref (action);
}
static void
diff --git a/src/window-commands.c b/src/window-commands.c
index 83665c9ec..09b31e661 100644
--- a/src/window-commands.c
+++ b/src/window-commands.c
@@ -196,26 +196,6 @@ window_cmd_go_forward (GtkAction *action,
}
void
-window_cmd_go_home (GtkAction *action,
- EphyWindow *window)
-{
- char *location;
-
- location = eel_gconf_get_string (CONF_GENERAL_HOMEPAGE);
-
- if (location == NULL || location[0] == '\0')
- {
- g_free (location);
-
- location = g_strdup ("about:blank");
- }
-
- ephy_window_load_url (window, location);
-
- g_free (location);
-}
-
-void
window_cmd_go_location (GtkAction *action,
EphyWindow *window)
{
diff --git a/src/window-commands.h b/src/window-commands.h
index 6284108c8..39ff5707d 100644
--- a/src/window-commands.h
+++ b/src/window-commands.h
@@ -40,9 +40,6 @@ void window_cmd_go_location (GtkAction *action,
void window_cmd_go_up (GtkAction *action,
EphyWindow *window);
-void window_cmd_go_home (GtkAction *action,
- EphyWindow *window);
-
void window_cmd_go_myportal (GtkAction *action,
EphyWindow *window);