pidgin/gtkconv.c

branch
vv.ticket34
changeset 22648
e286d795c5f9
parent 22647
bcb89c3964e9
child 22682
8df904a56d77
equal deleted inserted replaced
22647:bcb89c3964e9 22648:e286d795c5f9
1170 1170
1171 gtk_widget_show_all(gtkwin->dialogs.search); 1171 gtk_widget_show_all(gtkwin->dialogs.search);
1172 gtk_widget_grab_focus(s->entry); 1172 gtk_widget_grab_focus(s->entry);
1173 } 1173 }
1174 1174
1175 #ifdef USE_FARSIGHT
1176 /* Forward declare this here, because I want to keep VV-related stuff together
1177 for now */
1178 static void
1179 menu_initiate_voice_call_cb(gpointer data, guint action, GtkWidget *widget);
1180
1181 #endif
1182
1175 static void 1183 static void
1176 menu_send_file_cb(gpointer data, guint action, GtkWidget *widget) 1184 menu_send_file_cb(gpointer data, guint action, GtkWidget *widget)
1177 { 1185 {
1178 PidginWindow *win = data; 1186 PidginWindow *win = data;
1179 PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win); 1187 PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win);
2945 "<StockItem>", GTK_STOCK_SAVE_AS }, 2953 "<StockItem>", GTK_STOCK_SAVE_AS },
2946 { N_("/Conversation/Clea_r Scrollback"), "<CTL>L", menu_clear_cb, 0, "<StockItem>", GTK_STOCK_CLEAR }, 2954 { N_("/Conversation/Clea_r Scrollback"), "<CTL>L", menu_clear_cb, 0, "<StockItem>", GTK_STOCK_CLEAR },
2947 2955
2948 { "/Conversation/sep1", NULL, NULL, 0, "<Separator>", NULL }, 2956 { "/Conversation/sep1", NULL, NULL, 0, "<Separator>", NULL },
2949 2957
2958 #ifdef USE_FARSIGHT
2959 { N_("/Conversation/_Voice Call..."), NULL, menu_initiate_voice_call_cb, 0,
2960 "<StockItem>", PIDGIN_STOCK_TOOLBAR_CALL},
2961 #endif
2962
2950 { N_("/Conversation/Se_nd File..."), NULL, menu_send_file_cb, 0, "<StockItem>", PIDGIN_STOCK_TOOLBAR_SEND_FILE }, 2963 { N_("/Conversation/Se_nd File..."), NULL, menu_send_file_cb, 0, "<StockItem>", PIDGIN_STOCK_TOOLBAR_SEND_FILE },
2951 { N_("/Conversation/Add Buddy _Pounce..."), NULL, menu_add_pounce_cb, 2964 { N_("/Conversation/Add Buddy _Pounce..."), NULL, menu_add_pounce_cb,
2952 0, "<Item>", NULL }, 2965 0, "<Item>", NULL },
2953 { N_("/Conversation/_Get Info"), "<CTL>O", menu_get_info_cb, 0, 2966 { N_("/Conversation/_Get Info"), "<CTL>O", menu_get_info_cb, 0,
2954 "<StockItem>", PIDGIN_STOCK_TOOLBAR_USER_INFO }, 2967 "<StockItem>", PIDGIN_STOCK_TOOLBAR_USER_INFO },
3246 3259
3247 win->menu.view_log = 3260 win->menu.view_log =
3248 gtk_item_factory_get_widget(win->menu.item_factory, 3261 gtk_item_factory_get_widget(win->menu.item_factory,
3249 N_("/Conversation/View Log")); 3262 N_("/Conversation/View Log"));
3250 3263
3264 #ifdef USE_FARSIGHT
3265 win->menu.call =
3266 gtk_item_factory_get_widget(win->menu.item_factory,
3267 N_("/Conversation/Voice Call..."));
3268 #endif
3269
3251 /* --- */ 3270 /* --- */
3252 3271
3253 win->menu.send_file = 3272 win->menu.send_file =
3254 gtk_item_factory_get_widget(win->menu.item_factory, 3273 gtk_item_factory_get_widget(win->menu.item_factory,
3255 N_("/Conversation/Send File...")); 3274 N_("/Conversation/Send File..."));
6317 conv->features |= PURPLE_CONNECTION_NO_IMAGES; 6336 conv->features |= PURPLE_CONNECTION_NO_IMAGES;
6318 6337
6319 if(conv->features & PURPLE_CONNECTION_NO_IMAGES) 6338 if(conv->features & PURPLE_CONNECTION_NO_IMAGES)
6320 buttons &= ~GTK_IMHTML_IMAGE; 6339 buttons &= ~GTK_IMHTML_IMAGE;
6321 6340
6341 #ifdef USE_FARSIGHT
6342 /* check if account support voice calls, and if the current buddy
6343 supports it */
6344 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) {
6345 if (serv_can_do_media(gc, purple_conversation_get_name(conv),
6346 PURPLE_MEDIA_RECV_AUDIO & PURPLE_MEDIA_SEND_AUDIO)) {
6347 buttons |= GTK_IMHTML_CALL;
6348 gtk_widget_set_sensitive(win->menu.call, TRUE);
6349 } else {
6350 buttons &= ~GTK_IMHTML_CALL;
6351 gtk_widget_set_sensitive(win->menu.call, FALSE);
6352 }
6353 } else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) {
6354 /* for now, don't care about chats... */
6355 buttons &= ~GTK_IMHTML_CALL;
6356 gtk_widget_set_sensitive(win->menu.call, FALSE);
6357 } else {
6358 buttons &= ~GTK_IMHTML_CALL;
6359 gtk_widget_set_sensitive(win->menu.call, FALSE);
6360 }
6361 #endif
6362
6322 gtk_imhtml_set_format_functions(GTK_IMHTML(gtkconv->entry), buttons); 6363 gtk_imhtml_set_format_functions(GTK_IMHTML(gtkconv->entry), buttons);
6323 if (account != NULL) 6364 if (account != NULL)
6324 gtk_imhtmltoolbar_associate_smileys(GTK_IMHTMLTOOLBAR(gtkconv->toolbar), purple_account_get_protocol_id(account)); 6365 gtk_imhtmltoolbar_associate_smileys(GTK_IMHTMLTOOLBAR(gtkconv->toolbar), purple_account_get_protocol_id(account));
6325 6366
6326 /* Deal with menu items */ 6367 /* Deal with menu items */
6840 gtk_container_add(GTK_CONTAINER(gtkconv->u.im->icon_container), event); 6881 gtk_container_add(GTK_CONTAINER(gtkconv->u.im->icon_container), event);
6841 #if GTK_CHECK_VERSION(2,4,0) 6882 #if GTK_CHECK_VERSION(2,4,0)
6842 gtk_event_box_set_visible_window(GTK_EVENT_BOX(event), FALSE); 6883 gtk_event_box_set_visible_window(GTK_EVENT_BOX(event), FALSE);
6843 #endif 6884 #endif
6844 gtk_widget_add_events(event, 6885 gtk_widget_add_events(event,
6845 GDK_POINTER_MOTION_MASK | GDK_LEAVE_NOTIFY_MASK); 6886 GDK_POINTER_MOTION_MASK | GDK_LEAVE_NOTIFY_MASK);
6846 g_signal_connect(G_OBJECT(event), "button-press-event", 6887 g_signal_connect(G_OBJECT(event), "button-press-event",
6847 G_CALLBACK(icon_menu), gtkconv); 6888 G_CALLBACK(icon_menu), gtkconv);
6848 6889
6849 pidgin_tooltip_setup_for_widget(event, gtkconv, pidgin_conv_create_tooltip, NULL); 6890 pidgin_tooltip_setup_for_widget(event, gtkconv, pidgin_conv_create_tooltip, NULL);
6850 gtk_widget_show(event); 6891 gtk_widget_show(event);
7573 } 7614 }
7574 7615
7575 return TRUE; 7616 return TRUE;
7576 } 7617 }
7577 7618
7619
7620 #ifdef USE_FARSIGHT
7621
7578 static void 7622 static void
7579 pidgin_gtkmedia_message_cb(PidginMedia *media, const char *msg, PurpleConversation *conv) 7623 pidgin_gtkmedia_message_cb(PidginMedia *media, const char *msg, PurpleConversation *conv)
7580 { 7624 {
7581 purple_conv_im_write(PURPLE_CONV_IM(conv), NULL, msg, PURPLE_MESSAGE_SYSTEM, time(NULL)); 7625 purple_conv_im_write(PURPLE_CONV_IM(conv), NULL, msg, PURPLE_MESSAGE_SYSTEM, time(NULL));
7582 } 7626 }
7583 7627
7584 static void 7628 static void
7585 pidgin_conv_new_media_cb(PurpleMediaManager *manager, PurpleMedia *media, gpointer nul) 7629 menu_initiate_voice_call_cb(gpointer data, guint action, GtkWidget *widget)
7586 { 7630 {
7631 PidginWindow *win = (PidginWindow *)data;
7632 GtkWidget *gtkmedia = NULL;
7633 PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win);
7634 PidginConversation *gtkconv = PIDGIN_CONVERSATION(conv);
7635
7636 PurpleConnection *gc = purple_conversation_get_gc(conv);
7637 PurplePluginProtocolInfo *prpl = gc->prpl;
7638 PurpleMediaManager *manager = purple_media_manager_get();
7639
7640 PurpleMedia *media =
7641 serv_initiate_media(gc,
7642 purple_conversation_get_name(conv),
7643 PURPLE_MEDIA_RECV_AUDIO & PURPLE_MEDIA_SEND_AUDIO);
7587 GstElement *sendbin, *src, *sendlevel; 7644 GstElement *sendbin, *src, *sendlevel;
7588 GstElement *recvbin, *sink, *recvlevel; 7645 GstElement *recvbin, *sink, *recvlevel;
7589 GstPad *pad, *ghost; 7646 GstPad *pad, *ghost;
7590 7647
7648 purple_media_audio_init_src(&sendbin, &sendlevel);
7649 purple_media_audio_init_recv(&recvbin, &recvlevel);
7650
7651 purple_media_set_audio_src(media, sendbin);
7652 purple_media_set_audio_sink(media, recvbin);
7653
7654 gtkmedia = pidgin_media_new(media, PIDGIN_MEDIA_WAITING, sendlevel, recvlevel);
7655
7656 gtk_box_pack_start(GTK_BOX(gtkconv->topvbox), gtkmedia, FALSE, FALSE, 0);
7657 gtk_widget_show(gtkmedia);
7658 g_signal_connect(G_OBJECT(gtkmedia), "message",
7659 G_CALLBACK(pidgin_gtkmedia_message_cb), conv);
7660 /* need to setup handler for accept, reject and if we hangup here... */
7661 }
7662
7663 static void
7664 pidgin_conv_new_media_cb(PurpleMediaManager *manager, PurpleMedia *media, gpointer nul)
7665 {
7666 GstElement *sendbin, *src, *sendlevel;
7667 GstElement *recvbin, *sink, *recvlevel;
7668 GstPad *pad, *ghost;
7669
7591 GtkWidget *gtkmedia; 7670 GtkWidget *gtkmedia;
7592 PurpleConversation *conv; 7671 PurpleConversation *conv;
7593 PidginConversation *gtkconv; 7672 PidginConversation *gtkconv;
7594 7673
7595 sendbin = gst_bin_new("sendbin"); 7674 purple_media_audio_init_src(&sendbin, &sendlevel);
7596 src = gst_element_factory_make("alsasrc", "asrc"); 7675 purple_media_audio_init_recv(&recvbin, &recvlevel);
7597 sendlevel = gst_element_factory_make("level", "sendlevel");
7598 gst_bin_add_many(GST_BIN(sendbin), src, sendlevel, NULL);
7599 gst_element_link(src, sendlevel); //, gst_caps_new_simple("audio/x-raw-int", "rate", G_TYPE_INT, 8000, NULL));
7600 pad = gst_element_get_pad(sendlevel, "src");
7601 ghost = gst_ghost_pad_new("ghostsrc", pad);
7602 gst_element_add_pad(sendbin, ghost);
7603 g_object_set(G_OBJECT(sendlevel), "message", TRUE, NULL);
7604
7605 recvbin = gst_bin_new("pidginrecvbin");
7606 sink = gst_element_factory_make("alsasink", "asink");
7607 g_object_set(G_OBJECT(sink), "sync", FALSE, NULL);
7608 recvlevel = gst_element_factory_make("level", "recvlevel");
7609 gst_bin_add_many(GST_BIN(recvbin), sink, recvlevel, NULL);
7610 gst_element_link(recvlevel, sink);
7611 pad = gst_element_get_pad(recvlevel, "sink");
7612 ghost = gst_ghost_pad_new("ghostsink", pad);
7613 gst_element_add_pad(recvbin, ghost);
7614 g_object_set(G_OBJECT(recvlevel), "message", TRUE, NULL);
7615 7676
7616 purple_media_set_audio_src(media, sendbin); 7677 purple_media_set_audio_src(media, sendbin);
7617 purple_media_set_audio_sink(media, recvbin); 7678 purple_media_set_audio_sink(media, recvbin);
7618 7679
7619 gtkmedia = pidgin_media_new(media, sendlevel, recvlevel); 7680 gtkmedia = pidgin_media_new(media, PIDGIN_MEDIA_REQUESTED, sendlevel, recvlevel);
7620 conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, 7681 conv = purple_conversation_new(PURPLE_CONV_TYPE_IM,
7621 purple_connection_get_account(purple_media_get_connection(media)), 7682 purple_connection_get_account(purple_media_get_connection(media)),
7622 purple_media_get_screenname(media)); 7683 purple_media_get_screenname(media));
7623 gtkconv = PIDGIN_CONVERSATION(conv); 7684 gtkconv = PIDGIN_CONVERSATION(conv);
7624 gtk_box_pack_start(GTK_BOX(gtkconv->topvbox), gtkmedia, FALSE, FALSE, 0); 7685 gtk_box_pack_start(GTK_BOX(gtkconv->topvbox), gtkmedia, FALSE, FALSE, 0);
7625 gtk_widget_show(gtkmedia); 7686 gtk_widget_show(gtkmedia);
7626 g_signal_connect_swapped(G_OBJECT(media), "got-hangup", G_CALLBACK(gtk_widget_destroy), gtkmedia);
7627 g_signal_connect(G_OBJECT(gtkmedia), "message", G_CALLBACK(pidgin_gtkmedia_message_cb), conv); 7687 g_signal_connect(G_OBJECT(gtkmedia), "message", G_CALLBACK(pidgin_gtkmedia_message_cb), conv);
7628 } 7688 }
7689
7690 #endif
7629 7691
7630 void * 7692 void *
7631 pidgin_conversations_get_handle(void) 7693 pidgin_conversations_get_handle(void)
7632 { 7694 {
7633 static int handle; 7695 static int handle;

mercurial