diff options
Diffstat (limited to 'src/ephy-notebook.c')
-rw-r--r-- | src/ephy-notebook.c | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/src/ephy-notebook.c b/src/ephy-notebook.c index 6ce34bb50..49b99f49e 100644 --- a/src/ephy-notebook.c +++ b/src/ephy-notebook.c @@ -21,10 +21,15 @@ #include "ephy-prefs.h" #include "ephy-marshal.h" #include "ephy-file-helpers.h" +#include "ephy-dnd.h" +#include "ephy-embed.h" +#include "ephy-window.h" +#include "ephy-shell.h" #include <gtk/gtk.h> #include <glib-object.h> #include <libgnome/gnome-i18n.h> +#include <libgnomevfs/gnome-vfs-uri.h> #define AFTER_ALL_TABS -1 #define NOT_IN_APP_WINDOWS -2 @@ -55,6 +60,12 @@ static void ephy_notebook_finalize (GObject *object); static GdkCursor *cursor = NULL; static GList *notebooks = NULL; +static GtkTargetEntry url_drag_types [] = +{ + { EPHY_DND_URI_LIST_TYPE, 0, 0 }, + { EPHY_DND_URL_TYPE, 0, 1 } +}; +static guint n_url_drag_types = G_N_ELEMENTS (url_drag_types); /* Local functions */ static void drag_start (EphyNotebook *notebook, @@ -585,6 +596,97 @@ ephy_notebook_switch_page_cb (GtkNotebook *notebook, nb->priv->opened_tabs = NULL; } +#define INSANE_NUMBER_OF_URLS 20 + +static void +notebook_drag_data_received_cb (GtkWidget* widget, GdkDragContext *context, + gint x, gint y, GtkSelectionData *selection_data, + guint info, guint time, GtkWidget *child) +{ + EphyEmbed *embed = NULL; + EphyWindow *window = NULL; + EphyTab *tab = NULL; + GtkWidget *toplevel; + GList *uris = NULL, *l; + GnomeVFSURI *uri; + gchar *url = NULL; + guint num = 0; + gchar **tmp; + + g_signal_stop_emission_by_name (widget, "drag_data_received"); + + if (selection_data->length <= 0 || selection_data->data == NULL) return; + + if (selection_data->target == gdk_atom_intern (EPHY_DND_URL_TYPE, FALSE)) + { + /* URL_TYPE has format: url \n title */ + tmp = g_strsplit (selection_data->data, "\n", 2); + if (tmp) + { + uri = gnome_vfs_uri_new (tmp[0]); + if (uri) uris = g_list_append (uris, uri); + g_strfreev (tmp); + } + } + else if (selection_data->target == gdk_atom_intern (EPHY_DND_URI_LIST_TYPE, FALSE)) + { + uris = gnome_vfs_uri_list_parse (selection_data->data); + } + else + { + g_assert_not_reached (); + } + + if (uris == NULL) return; + + toplevel = gtk_widget_get_toplevel (widget); + g_return_if_fail (IS_EPHY_WINDOW (toplevel)); + window = EPHY_WINDOW (toplevel); + + if (child) + { + embed = EPHY_EMBED (child); + tab = EPHY_TAB (g_object_get_data (G_OBJECT (embed), "EphyTab")); + } + + l = uris; + while (l != NULL && num < INSANE_NUMBER_OF_URLS) + { + uri = (GnomeVFSURI*) l->data; + url = gnome_vfs_uri_to_string (uri, GNOME_VFS_URI_HIDE_NONE); + + if (num == 0 && embed != NULL) + { + /** + * The first url is special: if the drag was to an + * existing tab, load it there + */ + ephy_embed_load_url (embed, url); + } + else + { + tab = ephy_shell_new_tab (ephy_shell, window, + tab, url, + EPHY_NEW_TAB_IN_EXISTING_WINDOW | + EPHY_NEW_TAB_APPEND_LAST | + EPHY_NEW_TAB_APPEND_AFTER | + EPHY_NEW_TAB_DONT_JUMP_TO); + } + + if (num == 0 && eel_gconf_get_boolean (CONF_TABS_TABBED_AUTOJUMP)) + { + ephy_window_jump_to_tab (window, tab); + } + + g_free (url); + url = NULL; + l = l->next; + ++num; + } + + gnome_vfs_uri_list_free (uris); +} + static void ephy_notebook_init (EphyNotebook *notebook) { @@ -610,6 +712,15 @@ ephy_notebook_init (EphyNotebook *notebook) g_signal_connect_after (G_OBJECT (notebook), "switch_page", G_CALLBACK (ephy_notebook_switch_page_cb), NULL); + + /* Set up drag-and-drop target */ + g_signal_connect (G_OBJECT(notebook), "drag_data_received", + G_CALLBACK(notebook_drag_data_received_cb), + NULL); + gtk_drag_dest_set (GTK_WIDGET(notebook), GTK_DEST_DEFAULT_MOTION | + GTK_DEST_DEFAULT_DROP, + url_drag_types,n_url_drag_types, + GDK_ACTION_MOVE | GDK_ACTION_COPY); } static void @@ -835,6 +946,13 @@ ephy_notebook_insert_page (EphyNotebook *nb, child, tab_hbox, position); + /* Set up drag-and-drop target */ + g_signal_connect (G_OBJECT(tab_hbox), "drag_data_received", + G_CALLBACK(notebook_drag_data_received_cb), child); + gtk_drag_dest_set (tab_hbox, GTK_DEST_DEFAULT_ALL, + url_drag_types,n_url_drag_types, + GDK_ACTION_MOVE | GDK_ACTION_COPY); + if (jump_to) { gtk_notebook_set_current_page (GTK_NOTEBOOK (nb), |