Mercurial > pidgin
changeset 8091:56b74730715f
[gaim-migrate @ 8790]
A drag-and-drop URL patch. It seems to get the drop signal twice, but I'm
going to commit this now and fix it later so that Dan can claim the bounty
and hopefully have it accepted.
committer: Tailor Script <tailor@pidgin.im>
author | Sean Egan <seanegan@gmail.com> |
---|---|
date | Tue, 13 Jan 2004 03:02:59 +0000 |
parents | fb0eab758560 |
children | 697221d5d0ff |
files | COPYRIGHT src/gtkconv.c src/gtkimhtml.c |
diffstat | 3 files changed, 50 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/COPYRIGHT Tue Jan 13 02:15:46 2004 +0000 +++ b/COPYRIGHT Tue Jan 13 03:02:59 2004 +0000 @@ -107,6 +107,7 @@ Bjoern Voigt Nathan Walp Eric Warmenhoven +Dan Willemsen Jason Willis Matt Wilson Ximian
--- a/src/gtkconv.c Tue Jan 13 02:15:46 2004 +0000 +++ b/src/gtkconv.c Tue Jan 13 03:02:59 2004 +0000 @@ -4181,10 +4181,8 @@ G_CALLBACK(conv_dnd_recv), conv); g_signal_connect(G_OBJECT(gtkconv->imhtml), "drag_data_received", G_CALLBACK(conv_dnd_recv), conv); -#if 0 - g_signal_connect(G_OBJECT(gtkconv->entry), "drag_data_received", - G_CALLBACK(conv_dnd_recv), conv); -#endif +/* g_signal_connect(G_OBJECT(gtkconv->entry), "drag_data_received", + G_CALLBACK(conv_dnd_recv), conv);*/ /* Setup the container for the tab. */ gtkconv->tab_cont = tab_cont = gtk_vbox_new(FALSE, 5);
--- a/src/gtkimhtml.c Tue Jan 13 02:15:46 2004 +0000 +++ b/src/gtkimhtml.c Tue Jan 13 03:02:59 2004 +0000 @@ -24,6 +24,7 @@ #ifdef HAVE_CONFIG_H #include <config.h> #endif +#include "util.h" #include "gtkimhtml.h" #include "gtksourceiter.h" #include <gtk/gtk.h> @@ -63,6 +64,7 @@ static void insert_cb(GtkTextBuffer *buffer, GtkTextIter *iter, gchar *text, gint len, GtkIMHtml *imhtml); void gtk_imhtml_close_tags(GtkIMHtml *imhtml); +static void gtk_imhtml_link_drag_rcv_cb(GtkWidget *widget, GdkDragContext *dc, guint x, guint y, GtkSelectionData *sd, guint info, guint t, GtkIMHtml *imhtml); /* POINT_SIZE converts from AIM font sizes to point sizes. It probably should be redone in such a * way that it base the sizes off the default font size rather than using arbitrary font sizes. */ @@ -78,6 +80,10 @@ TARGET_TEXT }; +enum { + DRAG_URL +}; + GtkTargetEntry selection_targets[] = { { "text/html", 0, TARGET_HTML }, { "UTF8_STRING", 0, TARGET_UTF8_STRING }, @@ -85,6 +91,12 @@ { "STRING", 0, TARGET_STRING }, { "TEXT", 0, TARGET_TEXT}}; +GtkTargetEntry link_drag_drop_targets[] = { + {"x-url/ftp", 0, DRAG_URL}, + {"x-url/http", 0, DRAG_URL}, + {"text/uri-list", 0, DRAG_URL}, + {"_NETSCAPE_URL", 0, DRAG_URL}}; + static GtkSmileyTree* gtk_smiley_tree_new () { @@ -561,6 +573,12 @@ g_signal_connect(G_OBJECT(imhtml), "leave-notify-event", G_CALLBACK(gtk_leave_event_notify), NULL); g_signal_connect(G_OBJECT(imhtml), "key_press_event", G_CALLBACK(gtk_key_pressed_cb), NULL); g_signal_connect_after(G_OBJECT(imhtml->text_buffer), "insert-text", G_CALLBACK(insert_cb), imhtml); + + gtk_drag_dest_set(GTK_WIDGET(imhtml), 0, + link_drag_drop_targets, sizeof(link_drag_drop_targets) / sizeof(GtkTargetEntry), + GDK_ACTION_COPY); + g_signal_connect(G_OBJECT(imhtml), "drag_data_received", G_CALLBACK(gtk_imhtml_link_drag_rcv_cb), imhtml); + #if GTK_CHECK_VERSION(2,2,0) g_signal_connect(G_OBJECT(imhtml), "copy-clipboard", G_CALLBACK(copy_clipboard_cb), NULL); g_signal_connect(G_OBJECT(imhtml), "paste-clipboard", G_CALLBACK(paste_clipboard_cb), NULL); @@ -734,6 +752,35 @@ return FALSE; /* Let clicks go through if we didn't catch anything */ } +static void +gtk_imhtml_link_drag_rcv_cb(GtkWidget *widget, GdkDragContext *dc, guint x, guint y, + GtkSelectionData *sd, guint info, guint t, GtkIMHtml *imhtml) +{ + if(gtk_imhtml_get_editable(imhtml) && sd->data){ + gchar **links; + gchar *link; + + gaim_str_strip_cr(sd->data); + + links = g_strsplit(sd->data, "\n", 0); + while((link = *links++) != NULL){ + if(gaim_str_has_prefix(link, "http://") || + gaim_str_has_prefix(link, "https://") || + gaim_str_has_prefix(link, "ftp://")){ + gtk_imhtml_insert_link(imhtml, link, link); + } else if (link=='\0') { + //Ignore blank lines + } else { + //Special reasons, aka images being put in via other tag, etc. + } + } + + gtk_drag_finish(dc, TRUE, (dc->action == GDK_ACTION_MOVE), t); + } else { + gtk_drag_finish(dc, FALSE, FALSE, t); + } +} + /* this isn't used yet static void gtk_smiley_tree_remove (GtkSmileyTree *tree,