[empathy: 10/17] Utilitiy function to send files from a URI list, for dnd implementations



commit f167ec2d92a526d19f1faf8320d9ff975ae1e502
Author: Shaun McCance <Shaun McCance>
Date:   Mon Oct 5 14:22:32 2009 -0500

    Utilitiy function to send files from a URI list, for dnd implementations

 libempathy-gtk/empathy-chat.c              |    5 ++++
 libempathy-gtk/empathy-contact-list-view.c |   20 +----------------
 libempathy-gtk/empathy-ui-utils.c          |   30 ++++++++++++++++++++++++++++
 libempathy-gtk/empathy-ui-utils.h          |    2 +
 src/empathy-chat-window.c                  |   27 +-----------------------
 5 files changed, 41 insertions(+), 43 deletions(-)
---
diff --git a/libempathy-gtk/empathy-chat.c b/libempathy-gtk/empathy-chat.c
index c83649a..52806e0 100644
--- a/libempathy-gtk/empathy-chat.c
+++ b/libempathy-gtk/empathy-chat.c
@@ -2007,6 +2007,11 @@ chat_create_ui (EmpathyChat *chat)
 
 	/* Add message view. */
 	chat->view = empathy_theme_manager_create_view (empathy_theme_manager_get ());
+	/* If this is a GtkTextView, it's set as a drag destination for text/plain
+	   and other types, even though it's non-editable and doesn't accept any
+	   drags.  This steals drag motion for anything inside the scrollbars,
+	   making drag destinations on chat windows far less useful.
+	 */
 	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),
diff --git a/libempathy-gtk/empathy-contact-list-view.c b/libempathy-gtk/empathy-contact-list-view.c
index 24793b4..3e14646 100644
--- a/libempathy-gtk/empathy-contact-list-view.c
+++ b/libempathy-gtk/empathy-contact-list-view.c
@@ -332,9 +332,6 @@ contact_list_view_file_drag_received (GtkWidget         *view,
 {
 	GtkTreeIter     iter;
 	const gchar    *sel_data;
-	const gchar    *nl;
-	gchar          *uri;
-	GFile          *file;
 	EmpathyContact *contact;
 
 	sel_data = (const gchar *) gtk_selection_data_get_data (selection);
@@ -347,22 +344,9 @@ contact_list_view_file_drag_received (GtkWidget         *view,
 		return FALSE;
 	}
 
-	nl = strstr (sel_data, "\r\n");
-	if (!nl) {
-		nl = strchr (sel_data, '\n');
-	}
-	if (nl) {
-		uri = g_strndup (sel_data, nl - sel_data);
-		file = g_file_new_for_uri (uri);
-		g_free (uri);
-	}
-	else {
-		file = g_file_new_for_uri (sel_data);
-	}
-
-	empathy_send_file (contact, file);
+	empathy_send_file_from_uri_list (contact, sel_data);
 
-	g_object_unref (file);
+	g_object_unref (contact);
 
 	return TRUE;
 }
diff --git a/libempathy-gtk/empathy-ui-utils.c b/libempathy-gtk/empathy-ui-utils.c
index 411a766..9f4182c 100644
--- a/libempathy-gtk/empathy-ui-utils.c
+++ b/libempathy-gtk/empathy-ui-utils.c
@@ -1473,6 +1473,36 @@ empathy_send_file (EmpathyContact *contact, GFile *file)
 	g_object_unref (factory);
 }
 
+void
+empathy_send_file_from_uri_list (EmpathyContact *contact, const gchar *uri_list)
+{
+	const gchar *nl;
+	GFile *file;
+
+	/* Only handle a single file for now.  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.
+	*/
+	nl = strstr (uri_list, "\r\n");
+	if (!nl) {
+		nl = strchr (uri_list, '\n');
+	}
+	if (nl) {
+		gchar *uri = g_strndup (uri_list, nl - uri_list);
+		file = g_file_new_for_uri (uri);
+		g_free (uri);
+	}
+	else {
+		file = g_file_new_for_uri (uri_list);
+	}
+
+	empathy_send_file (contact, file);
+
+	g_object_unref (file);
+}
+
 static void
 file_manager_send_file_response_cb (GtkDialog      *widget,
 				    gint            response_id,
diff --git a/libempathy-gtk/empathy-ui-utils.h b/libempathy-gtk/empathy-ui-utils.h
index 0f453dd..e0c0904 100644
--- a/libempathy-gtk/empathy-ui-utils.h
+++ b/libempathy-gtk/empathy-ui-utils.h
@@ -112,6 +112,8 @@ GtkWidget * empathy_link_button_new                     (const gchar      *url,
 
 void        empathy_send_file                           (EmpathyContact   *contact,
 							 GFile            *file);
+void        empathy_send_file_from_uri_list             (EmpathyContact   *contact,
+							 const gchar      *uri_list);
 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 a58d4f6..2c6acf7 100644
--- a/src/empathy-chat-window.c
+++ b/src/empathy-chat-window.c
@@ -1438,9 +1438,6 @@ chat_window_drag_data_received (GtkWidget        *widget,
 		EmpathyChatWindowPriv *priv;
 		EmpathyContact *contact;
 		const gchar *data;
-		const gchar *nl;
-		gchar *uri;
-		GFile *file;
 
 		priv = GET_PRIV (window);
 		contact = empathy_chat_get_remote_contact (priv->current_chat);
@@ -1450,29 +1447,9 @@ chat_window_drag_data_received (GtkWidget        *widget,
 			return;
 		}
 
-		/* 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);
-		}
-
-		empathy_send_file (contact, file);
+		data = (const gchar *) gtk_selection_data_get_data (selection);
+		empathy_send_file_from_uri_list (contact, data);
 
-		g_object_unref (file);
 		gtk_drag_finish (context, TRUE, FALSE, time);
 	}
 	else if (info == DND_DRAG_TYPE_TAB) {



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]