| 5637 g_free(protocol); |
5638 g_free(protocol); |
| 5638 |
5639 |
| 5639 gtk_drag_finish(dc, TRUE, |
5640 gtk_drag_finish(dc, TRUE, |
| 5640 gdk_drag_context_get_actions(dc) == GDK_ACTION_MOVE, t); |
5641 gdk_drag_context_get_actions(dc) == GDK_ACTION_MOVE, t); |
| 5641 } |
5642 } |
| 5642 else if (target == gdk_atom_intern("text/uri-list", FALSE)) { |
5643 else if (info == WEBKIT_WEB_VIEW_TARGET_INFO_URI_LIST) { |
| 5643 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) |
5644 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) |
| 5644 pidgin_dnd_file_manage(sd, convaccount, purple_conversation_get_name(conv)); |
5645 pidgin_dnd_file_manage(sd, convaccount, purple_conversation_get_name(conv)); |
| 5645 gtk_drag_finish(dc, TRUE, |
5646 gtk_drag_finish(dc, TRUE, |
| 5646 gdk_drag_context_get_actions(dc) == GDK_ACTION_MOVE, t); |
5647 gdk_drag_context_get_actions(dc) == GDK_ACTION_MOVE, t); |
| 5647 } |
5648 } |
| 5648 else |
5649 else |
| 5649 gtk_drag_finish(dc, FALSE, FALSE, t); |
5650 gtk_drag_finish(dc, FALSE, FALSE, t); |
| 5650 } |
5651 } |
| 5651 |
5652 |
| 5652 |
|
| 5653 static const GtkTargetEntry te[] = |
|
| 5654 { |
|
| 5655 {"PURPLE_BLIST_NODE", GTK_TARGET_SAME_APP, PIDGIN_DRAG_BLIST_NODE}, |
|
| 5656 {"application/x-im-contact", 0, PIDGIN_DRAG_IM_CONTACT} |
|
| 5657 }; |
|
| 5658 |
5653 |
| 5659 static PidginConversation * |
5654 static PidginConversation * |
| 5660 pidgin_conv_find_gtkconv(PurpleConversation * conv) |
5655 pidgin_conv_find_gtkconv(PurpleConversation * conv) |
| 5661 { |
5656 { |
| 5662 PurpleBuddy *bud = purple_find_buddy(purple_conversation_get_account(conv), purple_conversation_get_name(conv)); |
5657 PurpleBuddy *bud = purple_find_buddy(purple_conversation_get_account(conv), purple_conversation_get_name(conv)); |
| 5763 PurpleTheme *theme = NULL; |
5758 PurpleTheme *theme = NULL; |
| 5764 PurpleConversationType conv_type = purple_conversation_get_type(conv); |
5759 PurpleConversationType conv_type = purple_conversation_get_type(conv); |
| 5765 GtkWidget *pane = NULL; |
5760 GtkWidget *pane = NULL; |
| 5766 GtkWidget *tab_cont; |
5761 GtkWidget *tab_cont; |
| 5767 PurpleBlistNode *convnode; |
5762 PurpleBlistNode *convnode; |
| |
5763 GtkTargetList *targets; |
| 5768 |
5764 |
| 5769 if (conv_type == PURPLE_CONV_TYPE_IM && (gtkconv = pidgin_conv_find_gtkconv(conv))) { |
5765 if (conv_type == PURPLE_CONV_TYPE_IM && (gtkconv = pidgin_conv_find_gtkconv(conv))) { |
| 5770 purple_conversation_set_ui_data(conv, gtkconv); |
5766 purple_conversation_set_ui_data(conv, gtkconv); |
| 5771 if (!g_list_find(gtkconv->convs, conv)) |
5767 if (!g_list_find(gtkconv->convs, conv)) |
| 5772 gtkconv->convs = g_list_prepend(gtkconv->convs, conv); |
5768 gtkconv->convs = g_list_prepend(gtkconv->convs, conv); |
| 5811 purple_conversation_set_ui_data(conv, NULL); |
5807 purple_conversation_set_ui_data(conv, NULL); |
| 5812 return; |
5808 return; |
| 5813 } |
5809 } |
| 5814 |
5810 |
| 5815 /* Setup drag-and-drop */ |
5811 /* Setup drag-and-drop */ |
| 5816 gtk_drag_dest_set(pane, |
5812 gtk_drag_dest_set(pane, GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_DROP, |
| 5817 GTK_DEST_DEFAULT_MOTION | |
5813 NULL, 0, GDK_ACTION_COPY); |
| 5818 GTK_DEST_DEFAULT_DROP, |
5814 targets = gtk_target_list_new(dnd_targets, G_N_ELEMENTS(dnd_targets)); |
| 5819 te, sizeof(te) / sizeof(GtkTargetEntry), |
5815 gtk_target_list_add(targets, gdk_atom_intern("text/uri-list", FALSE), 0, |
| 5820 GDK_ACTION_COPY); |
5816 WEBKIT_WEB_VIEW_TARGET_INFO_URI_LIST); |
| 5821 gtk_drag_dest_set(pane, |
5817 gtk_drag_dest_set_target_list(pane, targets); |
| 5822 GTK_DEST_DEFAULT_MOTION | |
5818 |
| 5823 GTK_DEST_DEFAULT_DROP, |
5819 if (webkit_dnd_targets) { |
| 5824 te, sizeof(te) / sizeof(GtkTargetEntry), |
5820 targets = webkit_dnd_targets; |
| 5825 GDK_ACTION_COPY); |
5821 } else { |
| 5826 gtk_drag_dest_set(gtkconv->webview, 0, |
5822 GtkTargetEntry *entries; |
| 5827 te, sizeof(te) / sizeof(GtkTargetEntry), |
5823 gint count; |
| 5828 GDK_ACTION_COPY); |
5824 |
| 5829 |
5825 targets = webkit_web_view_get_paste_target_list(WEBKIT_WEB_VIEW(gtkconv->webview)); |
| 5830 gtk_drag_dest_set(gtkconv->entry, 0, |
5826 entries = gtk_target_table_new_from_list(targets, &count); |
| 5831 te, sizeof(te) / sizeof(GtkTargetEntry), |
5827 targets = gtk_target_list_new(entries, count); |
| 5832 GDK_ACTION_COPY); |
5828 gtk_target_table_free(entries, count); |
| |
5829 |
| |
5830 gtk_target_list_add_table(targets, dnd_targets, G_N_ELEMENTS(dnd_targets)); |
| |
5831 webkit_dnd_targets = targets; |
| |
5832 } |
| |
5833 |
| |
5834 gtk_drag_dest_set(gtkconv->webview, 0, NULL, 0, GDK_ACTION_COPY); |
| |
5835 gtk_drag_dest_set_target_list(gtkconv->webview, targets); |
| |
5836 |
| |
5837 gtk_drag_dest_set(gtkconv->entry, 0, NULL, 0, GDK_ACTION_COPY); |
| |
5838 gtk_drag_dest_set_target_list(gtkconv->entry, targets); |
| 5833 |
5839 |
| 5834 g_signal_connect(G_OBJECT(pane), "button_press_event", |
5840 g_signal_connect(G_OBJECT(pane), "button_press_event", |
| 5835 G_CALLBACK(ignore_middle_click), NULL); |
5841 G_CALLBACK(ignore_middle_click), NULL); |
| 5836 // TODO: this crashes with webkit, fix it |
5842 g_signal_connect(G_OBJECT(pane), "drag-data-received", |
| 5837 // g_signal_connect(G_OBJECT(pane), "drag_data_received", |
5843 G_CALLBACK(conv_dnd_recv), gtkconv); |
| 5838 // G_CALLBACK(conv_dnd_recv), gtkconv); |
5844 #if 0 |
| 5839 // g_signal_connect(G_OBJECT(gtkconv->webview), "drag_data_received", |
5845 /* FIXME: WebKit confuses the dnd source when this is enabled */ |
| 5840 // G_CALLBACK(conv_dnd_recv), gtkconv); |
5846 g_signal_connect(G_OBJECT(gtkconv->webview), "drag-data-received", |
| 5841 // g_signal_connect(G_OBJECT(gtkconv->entry), "drag_data_received", |
5847 G_CALLBACK(conv_dnd_recv), gtkconv); |
| 5842 // G_CALLBACK(conv_dnd_recv), gtkconv); |
5848 g_signal_connect(G_OBJECT(gtkconv->entry), "drag-data-received", |
| |
5849 G_CALLBACK(conv_dnd_recv), gtkconv); |
| |
5850 #endif |
| 5843 |
5851 |
| 5844 g_signal_connect(gtkconv->webview, "style-set", G_CALLBACK(set_typing_font), gtkconv); |
5852 g_signal_connect(gtkconv->webview, "style-set", G_CALLBACK(set_typing_font), gtkconv); |
| 5845 |
5853 |
| 5846 /* Setup the container for the tab. */ |
5854 /* Setup the container for the tab. */ |
| 5847 gtkconv->tab_cont = tab_cont = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); |
5855 gtkconv->tab_cont = tab_cont = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); |