]> sjero.net Git - linphone/blobdiff - gtk/conference.c
Aac-eld add missing header according to RFC3640 3.3.6
[linphone] / gtk / conference.c
index 546b3e1c2856a75dafd1a1b5e13442897ae60030..08262c771db9e1b7fa98c31062e1090225880bb6 100644 (file)
 
 #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);
@@ -46,34 +51,21 @@ static void init_local_participant(GtkWidget *participant){
        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")){
@@ -87,28 +79,53 @@ static GtkWidget *find_conferencee_from_call(LinphoneCall *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-red.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{
@@ -119,11 +136,11 @@ void linphone_gtk_set_in_conference(LinphoneCall *call){
                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));
        }
 }
 
@@ -135,24 +152,26 @@ void linphone_gtk_terminate_conference_participant(LinphoneCall *call){
 }
 
 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);
 }
+
+