aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShaun McCance <Shaun McCance>2009-09-15 10:15:06 +0800
committerShaun McCance <shaunm@gnome.org>2009-11-25 02:05:31 +0800
commit2e2fdd45ae2d7fac58c9cc40b48c84ffc6b3f48e (patch)
treeacd72f1059e152155f1ae3b30f8aa610c3233cfb
parent783fe36cb4d096a9ed17078e8ddc36b3542b638b (diff)
downloadgsoc2013-empathy-2e2fdd45ae2d7fac58c9cc40b48c84ffc6b3f48e.tar
gsoc2013-empathy-2e2fdd45ae2d7fac58c9cc40b48c84ffc6b3f48e.tar.gz
gsoc2013-empathy-2e2fdd45ae2d7fac58c9cc40b48c84ffc6b3f48e.tar.bz2
gsoc2013-empathy-2e2fdd45ae2d7fac58c9cc40b48c84ffc6b3f48e.tar.lz
gsoc2013-empathy-2e2fdd45ae2d7fac58c9cc40b48c84ffc6b3f48e.tar.xz
gsoc2013-empathy-2e2fdd45ae2d7fac58c9cc40b48c84ffc6b3f48e.tar.zst
gsoc2013-empathy-2e2fdd45ae2d7fac58c9cc40b48c84ffc6b3f48e.zip
Implementing drag and drop file sending on chat windows
-rw-r--r--libempathy-gtk/empathy-chat.c1
-rw-r--r--libempathy-gtk/empathy-ui-utils.c36
-rw-r--r--libempathy-gtk/empathy-ui-utils.h2
-rw-r--r--src/empathy-chat-window.c44
4 files changed, 70 insertions, 13 deletions
diff --git a/libempathy-gtk/empathy-chat.c b/libempathy-gtk/empathy-chat.c
index 372e90cf0..c83649a04 100644
--- a/libempathy-gtk/empathy-chat.c
+++ b/libempathy-gtk/empathy-chat.c
@@ -2007,6 +2007,7 @@ chat_create_ui (EmpathyChat *chat)
/* Add message view. */
chat->view = empathy_theme_manager_create_view (empathy_theme_manager_get ());
+ gtk_drag_dest_unset (GTK_WIDGET (chat->view));
g_signal_connect (chat->view, "focus_in_event",
G_CALLBACK (chat_text_view_focus_in_event_cb),
chat);
diff --git a/libempathy-gtk/empathy-ui-utils.c b/libempathy-gtk/empathy-ui-utils.c
index ce5ec419e..411a76640 100644
--- a/libempathy-gtk/empathy-ui-utils.c
+++ b/libempathy-gtk/empathy-ui-utils.c
@@ -1451,30 +1451,40 @@ empathy_toggle_button_set_state_quietly (GtkWidget *widget,
g_signal_handlers_unblock_by_func (widget, callback, user_data);
}
+void
+empathy_send_file (EmpathyContact *contact, GFile *file)
+{
+ EmpathyFTFactory *factory;
+ GtkRecentManager *manager;
+ gchar *uri;
+
+ g_return_if_fail (EMPATHY_IS_CONTACT (contact));
+ g_return_if_fail (G_IS_FILE (file));
+
+ factory = empathy_ft_factory_dup_singleton ();
+
+ empathy_ft_factory_new_transfer_outgoing (factory, contact, file);
+
+ uri = g_file_get_uri (file);
+ manager = gtk_recent_manager_get_default ();
+ gtk_recent_manager_add_item (manager, uri);
+ g_free (uri);
+
+ g_object_unref (factory);
+}
+
static void
file_manager_send_file_response_cb (GtkDialog *widget,
gint response_id,
EmpathyContact *contact)
{
- EmpathyFTFactory *factory;
GFile *file;
- gchar *uri;
- GtkRecentManager *manager;
if (response_id == GTK_RESPONSE_OK) {
file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (widget));
- uri = g_file_get_uri (file);
-
- factory = empathy_ft_factory_dup_singleton ();
- empathy_ft_factory_new_transfer_outgoing (factory, contact,
- file);
+ empathy_send_file (contact, file);
- manager = gtk_recent_manager_get_default ();
- gtk_recent_manager_add_item (manager, uri);
-
- g_free (uri);
- g_object_unref (factory);
g_object_unref (file);
}
diff --git a/libempathy-gtk/empathy-ui-utils.h b/libempathy-gtk/empathy-ui-utils.h
index 7bec0884e..0f453ddbc 100644
--- a/libempathy-gtk/empathy-ui-utils.h
+++ b/libempathy-gtk/empathy-ui-utils.h
@@ -110,6 +110,8 @@ void empathy_toggle_button_set_state_quietly (GtkWidget *widge
GtkWidget * empathy_link_button_new (const gchar *url,
const gchar *title);
+void empathy_send_file (EmpathyContact *contact,
+ GFile *file);
void empathy_send_file_with_file_chooser (EmpathyContact *contact);
void empathy_receive_file_with_file_chooser (EmpathyFTHandler *handler);
diff --git a/src/empathy-chat-window.c b/src/empathy-chat-window.c
index 278c8f044..15ab92ce6 100644
--- a/src/empathy-chat-window.c
+++ b/src/empathy-chat-window.c
@@ -106,6 +106,7 @@ static const guint tab_accel_keys[] = {
typedef enum {
DND_DRAG_TYPE_CONTACT_ID,
+ DND_DRAG_TYPE_URI_LIST,
DND_DRAG_TYPE_TAB
} DndDragType;
@@ -114,6 +115,10 @@ static const GtkTargetEntry drag_types_dest[] = {
{ "GTK_NOTEBOOK_TAB", GTK_TARGET_SAME_APP, DND_DRAG_TYPE_TAB },
};
+static const GtkTargetEntry drag_types_uri_dest[] = {
+ { "text/uri-list", 0, DND_DRAG_TYPE_URI_LIST },
+};
+
static void chat_window_update (EmpathyChatWindow *window);
G_DEFINE_TYPE (EmpathyChatWindow, empathy_chat_window, G_TYPE_OBJECT);
@@ -1403,6 +1408,40 @@ chat_window_drag_data_received (GtkWidget *widget,
*/
gtk_drag_finish (context, TRUE, FALSE, time_);
}
+ else if (info == DND_DRAG_TYPE_URI_LIST) {
+ EmpathyChatWindowPriv *priv;
+ EmpathyContact *contact;
+ const gchar *data;
+ GFile *file;
+ gchar *nl;
+ gchar *uri;
+
+ /* Only handle a single file for new. It would be wicked cool to be
+ able to do multiple files, offering to zip them or whatever like
+ nautilus-sendto does. Note that text/uri-list is defined to have
+ each line terminated by \r\n, but we can be tolerant of applications
+ that only use \n or don't terminate single-line entries.
+ */
+ data = (const gchar*) gtk_selection_data_get_data (selection);
+ nl = strstr (data, "\r\n");
+ if (!nl) {
+ nl = strchr (data, '\n');
+ }
+ if (nl) {
+ uri = g_strndup (data, nl - data);
+ file = g_file_new_for_uri (uri);
+ g_free (uri);
+ }
+ else {
+ file = g_file_new_for_uri (data);
+ }
+
+ priv = GET_PRIV (window);
+ contact = empathy_chat_get_remote_contact (priv->current_chat);
+ empathy_send_file (contact, file);
+
+ g_object_unref (file);
+ }
else if (info == DND_DRAG_TYPE_TAB) {
EmpathyChat **chat;
EmpathyChatWindow *old_window = NULL;
@@ -1617,6 +1656,11 @@ empathy_chat_window_init (EmpathyChatWindow *window)
drag_types_dest,
G_N_ELEMENTS (drag_types_dest),
GDK_ACTION_MOVE);
+ gtk_drag_dest_set (GTK_WIDGET (priv->notebook),
+ GTK_DEST_DEFAULT_ALL,
+ drag_types_uri_dest,
+ G_N_ELEMENTS (drag_types_uri_dest),
+ GDK_ACTION_COPY);
g_signal_connect (priv->notebook,
"drag-data-received",