/pidgin/main: b59120d66fdd: Refactor a painfully long Drag&Drop ...
Jorge Villase?or
salinasv at pidgin.im
Sat Jan 23 14:06:34 EST 2016
Changeset: b59120d66fddba0391de34d6ce6540f82252495f
Author: Jorge Villase?or <salinasv at pidgin.im>
Date: 2016-01-18 23:24 -0800
Branch: default
URL: https://hg.pidgin.im/pidgin/main/rev/b59120d66fdd
Description:
Refactor a painfully long Drag&Drop util function
This way it is easier to know what's going on, in preparation
of dropping our PurpleDesktopItem code.
diffstat:
pidgin/gtkutils.c | 223 ++++++++++++++++++++++++++++-------------------------
1 files changed, 117 insertions(+), 106 deletions(-)
diffs (254 lines):
diff --git a/pidgin/gtkutils.c b/pidgin/gtkutils.c
--- a/pidgin/gtkutils.c
+++ b/pidgin/gtkutils.c
@@ -1446,13 +1446,123 @@ static void dnd_set_icon_cancel_cb(_DndD
g_free(data);
}
+static void
+pidgin_dnd_file_send_image(PurpleAccount *account, const gchar *who,
+ const gchar *filename)
+{
+ PurpleConnection *gc = purple_account_get_connection(account);
+ PurpleProtocol *protocol = NULL;
+ _DndData *data = g_malloc(sizeof(_DndData));
+ gboolean ft = FALSE, im = FALSE;
+
+ data->who = g_strdup(who);
+ data->filename = g_strdup(filename);
+ data->account = account;
+
+ if (gc)
+ protocol = purple_connection_get_protocol(gc);
+
+ if (!(purple_connection_get_flags(gc) & PURPLE_CONNECTION_FLAG_NO_IMAGES))
+ im = TRUE;
+
+ if (protocol && PURPLE_PROTOCOL_IMPLEMENTS(protocol, XFER_IFACE, can_receive))
+ ft = purple_protocol_xfer_iface_can_receive(protocol, gc, who);
+ else if (protocol && PURPLE_PROTOCOL_IMPLEMENTS(protocol, XFER_IFACE, send))
+ ft = TRUE;
+
+ if (im && ft) {
+ purple_request_choice(NULL, NULL,
+ _("You have dragged an image"),
+ _("You can send this image as a file "
+ "transfer, embed it into this message, "
+ "or use it as the buddy icon for this user."),
+ (gpointer)DND_FILE_TRANSFER, _("OK"),
+ (GCallback)dnd_image_ok_callback, _("Cancel"),
+ (GCallback)dnd_image_cancel_callback,
+ purple_request_cpar_from_account(account), data,
+ _("Set as buddy icon"), DND_BUDDY_ICON,
+ _("Send image file"), DND_FILE_TRANSFER,
+ _("Insert in message"), DND_IM_IMAGE,
+ NULL);
+ } else if (!(im || ft)) {
+ purple_request_yes_no(NULL, NULL, _("You have dragged an image"),
+ _("Would you like to set it as the buddy icon for this user?"),
+ PURPLE_DEFAULT_ACTION_NONE,
+ purple_request_cpar_from_account(account),
+ data, (GCallback)dnd_set_icon_ok_cb, (GCallback)dnd_set_icon_cancel_cb);
+ } else {
+ purple_request_choice(NULL, NULL,
+ _("You have dragged an image"),
+ (ft ? _("You can send this image as a file transfer, or use it as the buddy icon for this user.") :
+ _("You can insert this image into this message, or use it as the buddy icon for this user")),
+ GINT_TO_POINTER(ft ? DND_FILE_TRANSFER : DND_IM_IMAGE),
+ _("OK"), (GCallback)dnd_image_ok_callback,
+ _("Cancel"), (GCallback)dnd_image_cancel_callback,
+ purple_request_cpar_from_account(account),
+ data,
+ _("Set as buddy icon"), DND_BUDDY_ICON,
+ (ft ? _("Send image file") : _("Insert in message")), (ft ? DND_FILE_TRANSFER : DND_IM_IMAGE),
+ NULL);
+ }
+
+}
+
+#ifndef _WIN32
+static void
+pidgin_dnd_file_send_desktop(PurpleAccount *account, const gchar *who,
+ PurpleDesktopItem *item)
+{
+ PurpleDesktopItemType dtype;
+ char key[64];
+ const char *itemname = NULL;
+
+ const char * const *langs;
+ langs = g_get_language_names();
+ if (langs[0]) {
+ g_snprintf(key, sizeof(key), "Name[%s]", langs[0]);
+ itemname = purple_desktop_item_get_string(item, key);
+ }
+
+ if (!itemname)
+ itemname = purple_desktop_item_get_string(item, "Name");
+
+ dtype = purple_desktop_item_get_entry_type(item);
+ switch (dtype) {
+ PurpleConversation *conv;
+ PidginConversation *gtkconv;
+
+ case PURPLE_DESKTOP_ITEM_TYPE_LINK:
+ conv = PURPLE_CONVERSATION(purple_im_conversation_new(account, who));
+ gtkconv = PIDGIN_CONVERSATION(conv);
+ pidgin_webview_insert_link(PIDGIN_WEBVIEW(gtkconv->entry),
+ purple_desktop_item_get_string(item, "URL"),
+ itemname);
+ break;
+ default:
+ /* I don't know if we really want to do anything here. Most of
+ * the desktop item types are crap like "MIME Type" (I have no
+ * clue how that would be a desktop item) and "Comment"...
+ * nothing we can really send. The only logical one is
+ * "Application," but do we really want to send a binary and
+ * nothing else? Probably not. I'll just give an error and
+ * return. */
+ /* The original patch sent the icon used by the launcher. That's probably wrong */
+ purple_notify_error(NULL, NULL, _("Cannot send launcher"),
+ _("You dragged a desktop launcher. Most "
+ "likely you wanted to send the target "
+ "of this launcher instead of this "
+ "launcher itself."), NULL);
+ break;
+ }
+}
+#endif /* _WIN32 */
+
void
pidgin_dnd_file_manage(GtkSelectionData *sd, PurpleAccount *account, const char *who)
{
GdkPixbuf *pb;
GList *files = purple_uri_list_extract_filenames((const gchar *) gtk_selection_data_get_data(sd));
PurpleConnection *gc = purple_account_get_connection(account);
- PurpleProtocol *protocol = NULL;
#ifndef _WIN32
PurpleDesktopItem *item;
#endif
@@ -1493,119 +1603,20 @@ pidgin_dnd_file_manage(GtkSelectionData
/* Are we dealing with an image? */
pb = pidgin_pixbuf_new_from_file(filename);
if (pb) {
- _DndData *data = g_malloc(sizeof(_DndData));
- gboolean ft = FALSE, im = FALSE;
-
- data->who = g_strdup(who);
- data->filename = g_strdup(filename);
- data->account = account;
-
- if (gc)
- protocol = purple_connection_get_protocol(gc);
-
- if (!(purple_connection_get_flags(gc) & PURPLE_CONNECTION_FLAG_NO_IMAGES))
- im = TRUE;
-
- if (protocol && PURPLE_PROTOCOL_IMPLEMENTS(protocol, XFER_IFACE, can_receive))
- ft = purple_protocol_xfer_iface_can_receive(protocol, gc, who);
- else if (protocol && PURPLE_PROTOCOL_IMPLEMENTS(protocol, XFER_IFACE, send))
- ft = TRUE;
-
- if (im && ft) {
- purple_request_choice(NULL, NULL,
- _("You have dragged an image"),
- _("You can send this image as a file "
- "transfer, embed it into this message, "
- "or use it as the buddy icon for this user."),
- (gpointer)DND_FILE_TRANSFER, _("OK"),
- (GCallback)dnd_image_ok_callback, _("Cancel"),
- (GCallback)dnd_image_cancel_callback,
- purple_request_cpar_from_account(account), data,
- _("Set as buddy icon"), DND_BUDDY_ICON,
- _("Send image file"), DND_FILE_TRANSFER,
- _("Insert in message"), DND_IM_IMAGE,
- NULL);
- } else if (!(im || ft))
- purple_request_yes_no(NULL, NULL, _("You have dragged an image"),
- _("Would you like to set it as the buddy icon for this user?"),
- PURPLE_DEFAULT_ACTION_NONE,
- purple_request_cpar_from_account(account),
- data, (GCallback)dnd_set_icon_ok_cb, (GCallback)dnd_set_icon_cancel_cb);
- else
- purple_request_choice(NULL, NULL,
- _("You have dragged an image"),
- (ft ? _("You can send this image as a file transfer, or use it as the buddy icon for this user.") :
- _("You can insert this image into this message, or use it as the buddy icon for this user")),
- GINT_TO_POINTER(ft ? DND_FILE_TRANSFER : DND_IM_IMAGE),
- _("OK"), (GCallback)dnd_image_ok_callback,
- _("Cancel"), (GCallback)dnd_image_cancel_callback,
- purple_request_cpar_from_account(account),
- data,
- _("Set as buddy icon"), DND_BUDDY_ICON,
- (ft ? _("Send image file") : _("Insert in message")), (ft ? DND_FILE_TRANSFER : DND_IM_IMAGE),
- NULL);
+ pidgin_dnd_file_send_image(account, who, filename);
+
g_object_unref(G_OBJECT(pb));
- g_free(basename);
- while (files) {
- g_free(files->data);
- files = g_list_delete_link(files, files);
- }
- return;
+ continue;
}
#ifndef _WIN32
/* Are we trying to send a .desktop file? */
else if (purple_str_has_suffix(basename, ".desktop") && (item = purple_desktop_item_new_from_file(filename))) {
- PurpleDesktopItemType dtype;
- char key[64];
- const char *itemname = NULL;
-
- const char * const *langs;
- langs = g_get_language_names();
- if (langs[0]) {
- g_snprintf(key, sizeof(key), "Name[%s]", langs[0]);
- itemname = purple_desktop_item_get_string(item, key);
- }
-
- if (!itemname)
- itemname = purple_desktop_item_get_string(item, "Name");
-
- dtype = purple_desktop_item_get_entry_type(item);
- switch (dtype) {
- PurpleConversation *conv;
- PidginConversation *gtkconv;
-
- case PURPLE_DESKTOP_ITEM_TYPE_LINK:
- conv = PURPLE_CONVERSATION(purple_im_conversation_new(account, who));
- gtkconv = PIDGIN_CONVERSATION(conv);
- pidgin_webview_insert_link(PIDGIN_WEBVIEW(gtkconv->entry),
- purple_desktop_item_get_string(item, "URL"),
- itemname);
- break;
- default:
- /* I don't know if we really want to do anything here. Most of
- * the desktop item types are crap like "MIME Type" (I have no
- * clue how that would be a desktop item) and "Comment"...
- * nothing we can really send. The only logical one is
- * "Application," but do we really want to send a binary and
- * nothing else? Probably not. I'll just give an error and
- * return. */
- /* The original patch sent the icon used by the launcher. That's probably wrong */
- purple_notify_error(NULL, NULL, _("Cannot send launcher"),
- _("You dragged a desktop launcher. Most "
- "likely you wanted to send the target "
- "of this launcher instead of this "
- "launcher itself."), NULL);
- break;
- }
+ pidgin_dnd_file_send_desktop(account, who, item);
purple_desktop_item_unref(item);
- g_free(basename);
- while (files) {
- g_free(files->data);
- files = g_list_delete_link(files, files);
- }
- return;
+
+ continue;
}
#endif /* _WIN32 */
More information about the Commits
mailing list