#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_stock(GTK_STOCK_ADD,GTK_ICON_SIZE_MENU),FALSE,FALSE,0);
linphone_gtk_init_audio_meter(sound_meter, (get_volume_t) linphone_core_get_conference_local_input_volume, linphone_gtk_get_core());
}
-static GtkWidget *get_conference_tab(GtkWidget *mw){
- GtkWidget *box=(GtkWidget*)g_object_get_data(G_OBJECT(mw),"conference_tab");
- GtkWidget *conf_frame=(GtkWidget*)g_object_get_data(G_OBJECT(mw),"conf_frame");
- if(conf_frame!=NULL){
- if (box==NULL){
- GtkWidget *conf_box=linphone_gtk_get_widget(conf_frame,"conf_box");
- box=gtk_vbox_new(FALSE,0);
- GtkWidget *participant=linphone_gtk_create_widget("main","callee_frame");
- 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),"conference_tab",box);
- gtk_box_pack_start(GTK_BOX(conf_box),box,FALSE,FALSE,PADDING_PIXELS);
- }
- }
+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();
- get_conference_tab(mw);
- GtkWidget *conf_frame=(GtkWidget *)g_object_get_data(G_OBJECT(mw),"conf_frame");
- GtkWidget *conf_box=linphone_gtk_get_widget(conf_frame,"conf_box");
+ 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(conf_box));
+ 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")){
return ret;
}
-void linphone_gtk_set_in_conference(LinphoneCall *call){
+static GtkWidget * create_conference_panel(void){
GtkWidget *mw=linphone_gtk_get_main_window();
+ GtkWidget *conf_frame=linphone_gtk_create_widget("main","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=create_pixmap("stopcall-small.png");
+ GtkWidget *box;
GtkWidget *viewswitch=linphone_gtk_get_widget(mw,"viewswitch");
+
+ 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);
+ GtkWidget *participant=linphone_gtk_create_widget("main","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");
- g_object_set_data(G_OBJECT(mw),"is_conf",GINT_TO_POINTER(TRUE));
+ GtkWidget *viewswitch=linphone_gtk_get_widget(mw,"viewswitch");
+
if(conf_frame==NULL){
- conf_frame=linphone_gtk_create_widget("main","conf_frame");
- GtkWidget *button_conf=linphone_gtk_get_widget(conf_frame,"terminate_conf");
- GtkWidget *image=create_pixmap("stopcall-small.png");
- 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);
- gtk_notebook_append_page(GTK_NOTEBOOK(viewswitch),conf_frame,
- create_conference_label());
+ conf_frame=create_conference_panel();
}
- GtkWidget *participant=find_conferencee_from_call(call);
- GtkWidget *conf_box=linphone_gtk_get_widget(conf_frame,"conf_box");
+ GtkWidget *participant=find_conferencee_from_call(call);
+
if (participant==NULL){
- const LinphoneAddress *addr=linphone_call_get_remote_address(call);
- participant=linphone_gtk_create_widget("main","callee_frame");
+ /*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("main","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{
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(conf_box),participant,FALSE,FALSE,PADDING_PIXELS);
+ 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));
+ gtk_notebook_page_num(GTK_NOTEBOOK(viewswitch),conf_frame));
}
}
}
void linphone_gtk_unset_from_conference(LinphoneCall *call){
- GtkWidget *mw=linphone_gtk_get_main_window();
- GtkWidget *conf_frame=(GtkWidget *)g_object_get_data(G_OBJECT(mw),"conf_frame");
- GtkWidget *conf_box=linphone_gtk_get_widget(conf_frame,"conf_box");
- GtkWidget *frame;
- if (conf_box==NULL) return; /*conference tab already destroyed*/
- frame=find_conferencee_from_call(call);
- GList *children;
+ 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);
}
- children=gtk_container_get_children(GTK_CONTAINER(conf_box));
- if (g_list_length(children)==2){
- /*the conference is terminated */
- gtk_widget_destroy(conf_box);
- g_object_set_data(G_OBJECT(mw),"conference_tab",NULL);
- }
- gtk_widget_destroy(conf_frame);
- g_list_free(children);
- g_object_set_data(G_OBJECT(mw),"is_conf",GINT_TO_POINTER(FALSE));
- g_object_set_data(G_OBJECT(mw),"conf_frame",NULL);
}
+
+