pidgin/gtkconv.c

changeset 33279
edb261e54265
parent 33274
551fe73e2026
child 33283
7b12c4d2c6d7
equal deleted inserted replaced
33278:137daf2c99b4 33279:edb261e54265
168 static const GtkTargetEntry dnd_targets[] = 168 static const GtkTargetEntry dnd_targets[] =
169 { 169 {
170 {"PURPLE_BLIST_NODE", GTK_TARGET_SAME_APP, PIDGIN_DRAG_BLIST_NODE}, 170 {"PURPLE_BLIST_NODE", GTK_TARGET_SAME_APP, PIDGIN_DRAG_BLIST_NODE},
171 {"application/x-im-contact", 0, PIDGIN_DRAG_IM_CONTACT} 171 {"application/x-im-contact", 0, PIDGIN_DRAG_IM_CONTACT}
172 }; 172 };
173
174 static GtkTargetList *webkit_dnd_targets = NULL;
173 175
174 typedef struct { 176 typedef struct {
175 GtkWidget *window; 177 GtkWidget *window;
176 178
177 GtkWidget *entry; 179 GtkWidget *entry;
5534 PidginWindow *win = gtkconv->win; 5536 PidginWindow *win = gtkconv->win;
5535 PurpleConversation *c; 5537 PurpleConversation *c;
5536 PurpleAccount *convaccount = purple_conversation_get_account(conv); 5538 PurpleAccount *convaccount = purple_conversation_get_account(conv);
5537 PurpleConnection *gc = purple_account_get_connection(convaccount); 5539 PurpleConnection *gc = purple_account_get_connection(convaccount);
5538 PurplePluginProtocolInfo *prpl_info = gc ? PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc)) : NULL; 5540 PurplePluginProtocolInfo *prpl_info = gc ? PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc)) : NULL;
5539 GdkAtom target = gtk_selection_data_get_target(sd);
5540 const guchar *data = gtk_selection_data_get_data(sd); 5541 const guchar *data = gtk_selection_data_get_data(sd);
5541 5542
5542 if (info == PIDGIN_DRAG_BLIST_NODE) 5543 if (info == PIDGIN_DRAG_BLIST_NODE)
5543 { 5544 {
5544 PurpleBlistNode *n = NULL; 5545 PurpleBlistNode *n = NULL;
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);

mercurial