mirror of
https://gitlab.linphone.org/BC/public/linphone-iphone.git
synced 2026-01-18 19:48:07 +00:00
183 lines
7 KiB
C
183 lines
7 KiB
C
/***************************************************************************
|
|
* gtk/conference.c
|
|
*
|
|
* Mon Sep 12, 2011
|
|
* Copyright 2011 Belledonne Communications
|
|
* Author: Simon Morlat
|
|
* Email simon dot morlat at linphone dot org
|
|
****************************************************************************/
|
|
|
|
/*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
*/
|
|
|
|
#include "linphone.h"
|
|
|
|
#define PADDING_PIXELS 4
|
|
|
|
/*
|
|
* conferencee_box = a vbox where participants are added or removed
|
|
* conf_frame = the conference tab
|
|
*/
|
|
|
|
static GtkWidget *create_conference_label(void){
|
|
GtkWidget *box=gtk_hbox_new(FALSE,0);
|
|
gtk_box_pack_start(GTK_BOX(box),gtk_image_new_from_icon_name("linphone-conference-start",GTK_ICON_SIZE_MENU),FALSE,FALSE,0);
|
|
gtk_box_pack_end(GTK_BOX(box),gtk_label_new(_("Conference")),TRUE,FALSE,0);
|
|
gtk_widget_show_all(box);
|
|
return box;
|
|
}
|
|
|
|
static void init_local_participant(GtkWidget *participant){
|
|
GtkWidget *sound_meter;
|
|
GtkWidget *button=linphone_gtk_get_widget(participant,"conference_control");
|
|
gtk_label_set_markup(GTK_LABEL(linphone_gtk_get_widget(participant,"callee_name_label")),_("Me"));
|
|
sound_meter=linphone_gtk_get_widget(participant,"sound_indicator");
|
|
linphone_gtk_enable_mute_button(GTK_BUTTON(button),TRUE);
|
|
g_signal_connect(G_OBJECT(button),"clicked",(GCallback)linphone_gtk_mute_clicked,NULL);
|
|
gtk_widget_show(button);
|
|
linphone_gtk_init_audio_meter(sound_meter, (get_volume_t) linphone_core_get_conference_local_input_volume, linphone_gtk_get_core());
|
|
}
|
|
|
|
static GtkWidget *get_conferencee_box(GtkWidget *mw){
|
|
GtkWidget *box=(GtkWidget*)g_object_get_data(G_OBJECT(mw),"conferencee_box");
|
|
return box;
|
|
}
|
|
|
|
static GtkWidget *find_conferencee_from_call(LinphoneCall *call){
|
|
GtkWidget *mw=linphone_gtk_get_main_window();
|
|
GtkWidget *conferencee_box=get_conferencee_box(mw);
|
|
GList *elem;
|
|
GtkWidget *ret=NULL;
|
|
|
|
if (conferencee_box==NULL) return NULL;
|
|
|
|
if (call!=NULL){
|
|
GList *l=gtk_container_get_children(GTK_CONTAINER(conferencee_box));
|
|
for(elem=l;elem!=NULL;elem=elem->next){
|
|
GtkWidget *frame=(GtkWidget*)elem->data;
|
|
if (call==g_object_get_data(G_OBJECT(frame),"call")){
|
|
ret=frame;
|
|
break;
|
|
}
|
|
}
|
|
g_list_free(l);
|
|
}
|
|
//g_message("find_conferencee_from_call(): found widget %p for call %p",ret,call);
|
|
return ret;
|
|
}
|
|
|
|
static GtkWidget * create_conference_panel(void){
|
|
GtkWidget *mw=linphone_gtk_get_main_window();
|
|
GtkWidget *conf_frame=linphone_gtk_create_widget("conf_frame");
|
|
GtkWidget *conf_box=linphone_gtk_get_widget(conf_frame,"conf_box");
|
|
GtkWidget *button_conf=linphone_gtk_get_widget(conf_frame,"terminate_conf");
|
|
GtkWidget *image=gtk_image_new_from_icon_name("linphone-stop-call", GTK_ICON_SIZE_BUTTON);
|
|
GtkWidget *box;
|
|
GtkWidget *viewswitch=linphone_gtk_get_widget(mw,"viewswitch");
|
|
GtkWidget *participant;
|
|
GtkWidget *record = linphone_gtk_get_widget(conf_frame, "conf_record_button");
|
|
|
|
gtk_button_set_image(GTK_BUTTON(record), gtk_image_new_from_icon_name("linphone-record", GTK_ICON_SIZE_BUTTON));
|
|
gtk_button_set_image(GTK_BUTTON(button_conf),image);
|
|
g_signal_connect_swapped(G_OBJECT(button_conf),"clicked",(GCallback)linphone_gtk_terminate_call,NULL);
|
|
g_object_set_data(G_OBJECT(mw),"conf_frame",(gpointer)conf_frame);
|
|
|
|
box=gtk_vbox_new(FALSE,0);
|
|
participant=linphone_gtk_create_widget("callee_frame");
|
|
gtk_widget_show(participant);
|
|
gtk_box_set_homogeneous(GTK_BOX(box),TRUE);
|
|
init_local_participant(participant);
|
|
gtk_box_pack_start(GTK_BOX(box),participant,FALSE,FALSE,PADDING_PIXELS);
|
|
gtk_widget_show(box);
|
|
g_object_set_data(G_OBJECT(mw),"conferencee_box",box);
|
|
gtk_box_pack_start(GTK_BOX(conf_box),box,FALSE,FALSE,PADDING_PIXELS);
|
|
|
|
gtk_notebook_append_page(GTK_NOTEBOOK(viewswitch),conf_frame,
|
|
create_conference_label());
|
|
return conf_frame;
|
|
}
|
|
|
|
void linphone_gtk_set_in_conference(LinphoneCall *call){
|
|
GtkWidget *mw=linphone_gtk_get_main_window();
|
|
GtkWidget *conf_frame=(GtkWidget *)g_object_get_data(G_OBJECT(mw),"conf_frame");
|
|
GtkWidget *viewswitch=linphone_gtk_get_widget(mw,"viewswitch");
|
|
GtkWidget *participant;
|
|
|
|
if(conf_frame==NULL){
|
|
conf_frame=create_conference_panel();
|
|
}
|
|
participant=find_conferencee_from_call(call);
|
|
|
|
if (participant==NULL){
|
|
/*create and add it */
|
|
GtkWidget *conferencee_box=get_conferencee_box(mw);
|
|
GtkWidget *sound_meter;
|
|
const LinphoneAddress *addr=linphone_call_get_remote_address(call);
|
|
gchar *markup;
|
|
|
|
participant=linphone_gtk_create_widget("callee_frame");
|
|
gtk_widget_show(participant);
|
|
if (linphone_address_get_display_name(addr)!=NULL){
|
|
markup=g_strdup_printf("<b>%s</b>",linphone_address_get_display_name(addr));
|
|
}else{
|
|
char *tmp=linphone_address_as_string_uri_only(addr);
|
|
markup=g_strdup_printf("%s",tmp);
|
|
ms_free(tmp);
|
|
}
|
|
gtk_label_set_markup(GTK_LABEL(linphone_gtk_get_widget(participant,"callee_name_label")),markup);
|
|
g_free(markup);
|
|
sound_meter=linphone_gtk_get_widget(participant,"sound_indicator");
|
|
linphone_gtk_init_audio_meter(sound_meter, (get_volume_t) linphone_call_get_play_volume, call);
|
|
gtk_box_pack_start(GTK_BOX(conferencee_box),participant,FALSE,FALSE,PADDING_PIXELS);
|
|
g_object_set_data_full(G_OBJECT(participant),"call",linphone_call_ref(call),(GDestroyNotify)linphone_call_unref);
|
|
gtk_notebook_set_current_page(GTK_NOTEBOOK(viewswitch),
|
|
gtk_notebook_page_num(GTK_NOTEBOOK(viewswitch),conf_frame));
|
|
}
|
|
}
|
|
|
|
void linphone_gtk_terminate_conference_participant(LinphoneCall *call){
|
|
GtkWidget *frame=find_conferencee_from_call(call);
|
|
if (frame){
|
|
gtk_widget_set_sensitive(frame,FALSE);
|
|
}
|
|
}
|
|
|
|
void linphone_gtk_unset_from_conference(LinphoneCall *call){
|
|
GtkWidget *frame=find_conferencee_from_call(call);
|
|
|
|
if (frame){
|
|
GtkWidget *mw=linphone_gtk_get_main_window();
|
|
GtkWidget *conf_frame=(GtkWidget *)g_object_get_data(G_OBJECT(mw),"conf_frame");
|
|
GtkWidget *conferencee_box=g_object_get_data(G_OBJECT(mw),"conferencee_box");
|
|
GList *children;
|
|
|
|
g_message("Removing a participant from conference");
|
|
gtk_widget_destroy(frame);
|
|
children=gtk_container_get_children(GTK_CONTAINER(conferencee_box));
|
|
if (g_list_length(children)==1){ /* only local participant */
|
|
/*the conference is terminated */
|
|
g_message("The conference is terminated");
|
|
g_object_set_data(G_OBJECT(mw),"conferencee_box",NULL);
|
|
gtk_widget_destroy(conf_frame);
|
|
g_object_set_data(G_OBJECT(mw),"conf_frame",NULL);
|
|
}
|
|
g_list_free(children);
|
|
}
|
|
}
|
|
|
|
bool_t linphone_gtk_call_is_in_conference_view(LinphoneCall *call) {
|
|
return (find_conferencee_from_call(call) != NULL);
|
|
}
|