From: Margaux Clerc Date: Mon, 29 Oct 2012 10:46:49 +0000 (+0100) Subject: new ui improvements more contact oriented : X-Git-Url: http://sjero.net/git/?p=linphone;a=commitdiff_plain;h=e9d61a3e4d37870c96aae277ea93e33844362994 new ui improvements more contact oriented : -integration of the chat window in the main window -change of the contact tab -change of the appearance of the window call and conference -chat messages saved during the time of the execution of the software --- diff --git a/gtk/buddylookup.ui b/gtk/buddylookup.ui index 34b45edf..c32727b0 100644 --- a/gtk/buddylookup.ui +++ b/gtk/buddylookup.ui @@ -6,7 +6,6 @@ 5 Search contacts in directory center-on-parent - linphone2.png dialog False diff --git a/gtk/chat.c b/gtk/chat.c index c434e4a6..4841afba 100644 --- a/gtk/chat.c +++ b/gtk/chat.c @@ -19,178 +19,237 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "linphone.h" - #ifdef HAVE_GTK_OSX #include #endif void linphone_gtk_quit_chatroom(LinphoneChatRoom *cr) { GtkWidget *main_window=linphone_gtk_get_main_window (); - GtkWidget *w=linphone_gtk_get_widget(main_window,"chatroom_frame"); GtkWidget *nb=linphone_gtk_get_widget(main_window,"viewswitch"); - int idx; + GtkWidget *friendlist=linphone_gtk_get_widget(main_window,"contact_list"); + GtkWidget *w=g_object_get_data(G_OBJECT(friendlist),"chatview"); + int idx = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w),"idx")); g_return_if_fail(w!=NULL); - idx=gtk_notebook_page_num(GTK_NOTEBOOK(nb),w); gtk_notebook_remove_page (GTK_NOTEBOOK(nb),idx); - linphone_chat_room_set_user_data(cr,NULL); + linphone_gtk_update_chat_picture(); + g_object_set_data(G_OBJECT(friendlist),"chatview",NULL); gtk_widget_destroy(w); } -GtkWidget *create_tab_chat_header(LinphoneChatRoom *cr){ +GtkWidget *create_tab_chat_header(LinphoneChatRoom *cr,const LinphoneAddress *uri){ GtkWidget *w=gtk_hbox_new (FALSE,0); GtkWidget *i=create_pixmap ("chat.png"); GtkWidget *l; GtkWidget *b=gtk_button_new_with_label("x"); + gtk_widget_set_size_request(b,20,20); g_signal_connect_swapped(G_OBJECT(b),"clicked",G_CALLBACK(linphone_gtk_quit_chatroom),cr); - gchar *text=g_strdup_printf("Chat "); l=gtk_label_new (text); gtk_box_pack_start (GTK_BOX(w),i,FALSE,FALSE,0); gtk_box_pack_start (GTK_BOX(w),l,FALSE,FALSE,0); gtk_box_pack_end(GTK_BOX(w),b,TRUE,TRUE,0); gtk_widget_show_all(w); - return w; } -void linphone_gtk_push_text(GtkTextView *v, const char *from, const char *message, gboolean me){ - GtkTextBuffer *b=gtk_text_view_get_buffer(v); - GtkTextIter iter,begin; +void linphone_gtk_push_text(GtkWidget *w, const LinphoneAddress *from, const char *message, gboolean me,LinphoneChatRoom *cr){ + GtkTextView *text=GTK_TEXT_VIEW(linphone_gtk_get_widget(w,"textview")); + GtkTextBuffer *buffer=gtk_text_view_get_buffer(text); + GtkTextIter iter,begin; + GList *l = g_object_get_data(G_OBJECT(w),"list"); + gtk_text_buffer_get_start_iter(buffer,&begin); int off; - gtk_text_buffer_get_end_iter(b,&iter); + gtk_text_buffer_get_end_iter(buffer,&iter); off=gtk_text_iter_get_offset(&iter); - gtk_text_buffer_insert(b,&iter,from,-1); - gtk_text_buffer_get_end_iter(b,&iter); - gtk_text_buffer_insert(b,&iter,":\t",-1); - gtk_text_buffer_get_end_iter(b,&iter); - gtk_text_buffer_get_iter_at_offset(b,&begin,off); - //gtk_text_buffer_apply_tag_by_name(b,me ? "green" : "blue" ,&begin,&iter); - gtk_text_buffer_insert(b,&iter,message,-1); - gtk_text_buffer_get_end_iter(b,&iter); - gtk_text_buffer_insert(b,&iter,"\n",-1); - gtk_text_buffer_get_end_iter(b,&iter); - - GtkTextMark *mark=gtk_text_buffer_create_mark(b,NULL,&iter,FALSE); - gtk_text_view_scroll_mark_onscreen(v,mark); - //gtk_text_buffer_get_end_iter(b,&iter); - //gtk_text_iter_forward_to_line_end(&iter); - //gtk_text_view_scroll_to_iter(v,&iter,0,TRUE,1.0,1.0); -} -/*void linphone_gtk_push_text_start(GtkTextView *v, const char *from, const char *message){ - GtkTextBuffer *b=gtk_text_view_get_buffer(v); - GtkTextIter iter,begin; - int off; - gtk_text_buffer_get_end_iter(b,&iter); - off=gtk_text_iter_get_offset(&iter); - gtk_text_buffer_insert(b,&iter,from,-1); - gtk_text_buffer_get_end_iter(b,&iter); - gtk_text_buffer_insert(b,&iter,":\t",-1); - gtk_text_buffer_get_end_iter(b,&iter); - gtk_text_buffer_get_iter_at_offset(b,&begin,off); + if(g_strcmp0((char *)g_object_get_data(G_OBJECT(w),"from_message"),linphone_address_as_string(from))!=0){ + gtk_text_buffer_get_iter_at_offset(buffer,&iter,off); + const char *display=linphone_address_get_display_name(from); + if (display==NULL || display[0]=='\0') { + display=linphone_address_get_username(from); + } + gtk_text_buffer_insert(buffer,&iter,display,-1); + //gtk_text_buffer_apply_tag_by_name(b,"bold",&begin,&iter); + gtk_text_buffer_get_end_iter(buffer,&iter); + gtk_text_buffer_insert(buffer,&iter,":",-1); + gtk_text_buffer_get_end_iter(buffer,&iter); + gtk_text_buffer_insert(buffer,&iter,"\n",-1); + g_object_set_data(G_OBJECT(w),"from_message",linphone_address_as_string(from)); + } + //gtk_text_buffer_apply_tag_by_name(b,me ? "green" : "blue" ,&begin,&iter); - gtk_text_buffer_insert(b,&iter,message,-1); - gtk_text_buffer_get_end_iter(b,&iter); - gtk_text_buffer_insert(b,&iter,"\n",-1); - gtk_text_buffer_get_end_iter(b,&iter); - - //GtkTextMark *mark=gtk_text_buffer_create_mark(b,NULL,&iter,FALSE); - //gtk_text_view_scroll_mark_onscreen(v,mark); + gtk_text_buffer_get_end_iter(buffer,&iter); + gtk_text_buffer_get_iter_at_offset(buffer,&begin,off); + if(me){ + l=g_list_append(l,GINT_TO_POINTER(gtk_text_iter_get_offset(&iter))); + g_object_set_data(G_OBJECT(w),"list",l); + } + gtk_text_buffer_insert(buffer,&iter,"\t",-1); + gtk_text_buffer_insert(buffer,&iter,message,-1); + gtk_text_buffer_get_end_iter(buffer,&iter); + gtk_text_buffer_insert(buffer,&iter,"\n",-1); + + GtkTextMark *mark=gtk_text_buffer_create_mark(buffer,NULL,&iter,FALSE); + gtk_text_view_scroll_mark_onscreen(text,mark); //gtk_text_buffer_get_end_iter(b,&iter); //gtk_text_iter_forward_to_line_end(&iter); //gtk_text_view_scroll_to_iter(v,&iter,0,TRUE,1.0,1.0); -}*/ + gtk_text_buffer_get_bounds (buffer, &begin, &iter); + + GHashTable *hash=(GHashTable *)g_object_get_data(G_OBJECT(linphone_gtk_get_main_window()),"history"); + if(me){ + g_hash_table_insert(hash,linphone_address_as_string_uri_only(linphone_chat_room_get_peer_address(cr)), + (gpointer)gtk_text_buffer_get_text(buffer,&begin,&iter,FALSE)); + } else { -const char* linphone_gtk_get_used_identity(){ + g_hash_table_insert(hash,linphone_address_as_string_uri_only(from), + (gpointer)gtk_text_buffer_get_text(buffer,&begin,&iter,FALSE)); + } + g_object_set_data(G_OBJECT(linphone_gtk_get_main_window()),"history",hash); +} + +const LinphoneAddress* linphone_gtk_get_used_identity(){ LinphoneCore *lc=linphone_gtk_get_core(); LinphoneProxyConfig *cfg; linphone_core_get_default_proxy(lc,&cfg); - const char* display; - const LinphoneAddress* u; - if (cfg) { - u = linphone_address_new(linphone_proxy_config_get_identity(cfg)); - } else { - u = linphone_core_get_primary_contact_parsed(lc); - } - display=linphone_address_get_display_name(u); - if (display==NULL || display[0]=='\0') { - display=linphone_address_as_string(u); + if (cfg) return linphone_address_new(linphone_proxy_config_get_identity(cfg)); + else return linphone_core_get_primary_contact_parsed(lc); +} + + +/* function in dev for displaying ack*/ +void update_chat_state_message(LinphoneChatMessageState state){ + /*GdkPixbuf *pixbuf; + + switch (state) { + case LinphoneChatMessageStateInProgress: + pixbuf=create_pixbuf("chat_message_in_progress.png"); + break; + case LinphoneChatMessageStateDelivered: + pixbuf=create_pixbuf("chat_message_delivered.png"); + break; + case LinphoneChatMessageStateNotDelivered: + pixbuf=create_pixbuf("chat_message_not_delivered.png"); + break; + default : pixbuf=NULL; } - return display; + + GtkWidget *main_window=linphone_gtk_get_main_window(); + GtkWidget *friendlist=linphone_gtk_get_widget(main_window,"contact_list"); + GtkWidget *page=(GtkWidget*)g_object_get_data(G_OBJECT(friendlist),"chatview"); + if(page!=NULL){ + GtkTextView *text=GTK_TEXT_VIEW(linphone_gtk_get_widget(page,"textview")); + GtkTextBuffer *b=gtk_text_view_get_buffer(text); + GtkTextIter iter; + GList *l = g_object_get_data(G_OBJECT(page),"list"); + gtk_text_buffer_get_end_iter(b,&iter); + gtk_text_buffer_get_iter_at_offset(b,&iter,GPOINTER_TO_INT(g_list_nth_data(l,0))); + fprintf(stdout,"offset check %i \n",GPOINTER_TO_INT(g_list_nth_data(l,0))); + l=g_list_remove(l,g_list_nth_data(l,0)); + gtk_text_buffer_insert_pixbuf(b,&iter,pixbuf); + + //gtk_text_buffer_get_end_iter(b,&iter); + //gtk_text_buffer_insert_pixbuf(b,&iter,pixbuf); + //gtk_text_buffer_get_end_iter(b,&iter); + //gtk_text_buffer_insert(b,&iter,"\n",-1); + g_object_set_data(G_OBJECT(page),"list",l); + } else { + fprintf(stdout,"NULLLL\n"); + }*/ } static void on_chat_state_changed(LinphoneChatMessage *msg, LinphoneChatMessageState state, void *user_pointer){ g_message("chat message state is %s",linphone_chat_message_state_to_string(state)); + update_chat_state_message(state); } void linphone_gtk_send_text(LinphoneChatRoom *cr){ - GtkWidget *chat_view=(GtkWidget*)linphone_chat_room_get_user_data(cr); - GtkWidget *entry= linphone_gtk_get_widget(chat_view,"text_entry"); + GtkWidget *main_window=linphone_gtk_get_main_window(); + GtkWidget *friendlist=linphone_gtk_get_widget(main_window,"contact_list"); + GtkWidget *w=(GtkWidget*)g_object_get_data(G_OBJECT(friendlist),"chatview"); + GtkWidget *entry=linphone_gtk_get_widget(w,"text_entry"); const gchar *entered; - entered=gtk_entry_get_text(GTK_ENTRY(entry)); + entered=gtk_entry_get_text(GTK_ENTRY(entry)); if (strlen(entered)>0) { LinphoneChatMessage *msg; - linphone_gtk_push_text(GTK_TEXT_VIEW(linphone_gtk_get_widget(chat_view,"textview")), + linphone_gtk_push_text(w, linphone_gtk_get_used_identity(), - entered,TRUE); - msg=linphone_chat_room_create_message(cr,entered); + entered,TRUE,g_object_get_data(G_OBJECT(w),"cr")); + msg=linphone_chat_room_create_message(cr,entered); linphone_chat_room_send_message2(cr,msg,on_chat_state_changed,NULL); gtk_entry_set_text(GTK_ENTRY(entry),""); + } } - -void linphone_gtk_init_chatroom(LinphoneChatRoom *cr, const char *with){ +GtkWidget* linphone_gtk_init_chatroom(LinphoneChatRoom *cr, const LinphoneAddress *with){ GtkWidget *chat_view=linphone_gtk_create_widget("main","chatroom_frame"); GtkWidget *main_window=linphone_gtk_get_main_window (); GtkNotebook *notebook=(GtkNotebook *)linphone_gtk_get_widget(main_window,"viewswitch"); - GtkTextBuffer *b; + GtkWidget *text=linphone_gtk_get_widget(chat_view,"textview"); int idx; - b=gtk_text_view_get_buffer(GTK_TEXT_VIEW(linphone_gtk_get_widget(chat_view,"textview"))); - gtk_text_buffer_create_tag(b,"blue","foreground","blue",NULL); - gtk_text_buffer_create_tag(b,"green","foreground","green",NULL); - gtk_notebook_append_page (notebook,chat_view,create_tab_chat_header(cr)); + gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW(text),GTK_WRAP_WORD); + gtk_text_view_set_editable (GTK_TEXT_VIEW(text),FALSE); + gtk_notebook_append_page (notebook,chat_view,create_tab_chat_header(cr,with)); idx = gtk_notebook_page_num(notebook, chat_view); gtk_notebook_set_current_page(notebook, idx); gtk_widget_show(chat_view); + + GList *l = NULL; g_object_set_data(G_OBJECT(chat_view),"cr",cr); - linphone_chat_room_set_user_data(cr,chat_view); - - //linphone_gtk_get_used_identity() - - GtkWidget *text=linphone_gtk_get_widget(chat_view,"textview"); - gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW(text),GTK_WRAP_WORD); - //linphone_gtk_push_text(GTK_TEXT_VIEW(linphone_gtk_get_widget(chat_view,"textview")),NULL, - // "Conversation avec moi",FALSE); - - //linphone_gtk_push_text(GTK_TEXT_VIEW(linphone_gtk_get_widget(chat_view,"textview")),with, - // "Conversation avec ",FALSE); - - //Initialisation des signaux + g_object_set_data(G_OBJECT(chat_view),"idx",GINT_TO_POINTER(idx)); + g_object_set_data(G_OBJECT(chat_view),"from_message",NULL); + g_object_set_data(G_OBJECT(chat_view),"from_chatroom",linphone_address_as_string_uri_only(with)); + g_object_set_data(G_OBJECT(chat_view),"list",l); + GtkWidget *button = linphone_gtk_get_widget(chat_view,"send"); g_signal_connect_swapped(G_OBJECT(button),"clicked",(GCallback)linphone_gtk_send_text,cr); - + GtkWidget *entry = linphone_gtk_get_widget(chat_view,"text_entry"); g_signal_connect_swapped(G_OBJECT(entry),"activate",(GCallback)linphone_gtk_send_text,cr); -} + return chat_view; +} -LinphoneChatRoom * linphone_gtk_create_chatroom(const char *with){ - LinphoneChatRoom *cr=linphone_core_create_chat_room(linphone_gtk_get_core(),with); +LinphoneChatRoom * linphone_gtk_create_chatroom(const LinphoneAddress *with){ + LinphoneChatRoom *cr=linphone_core_create_chat_room(linphone_gtk_get_core(),linphone_address_as_string(with)); if (!cr) return NULL; - linphone_gtk_init_chatroom(cr,with); return cr; } -void linphone_gtk_load_chatroom(LinphoneChatRoom *cr,const char* uri){ - GtkWidget *w=(GtkWidget*)linphone_chat_room_get_user_data(cr); - if(w==NULL){ - linphone_gtk_init_chatroom(cr, uri); - } else { - //TODO +void linphone_gtk_load_chatroom(LinphoneChatRoom *cr,const LinphoneAddress *uri,GtkWidget *chat_view){ + GtkWidget *main_window=linphone_gtk_get_main_window (); + GHashTable *hash=g_object_get_data(G_OBJECT(main_window),"history"); + if(g_strcmp0((char *)g_object_get_data(G_OBJECT(chat_view),"from_chatroom"), + linphone_address_as_string_uri_only(uri))!=0) + { + GtkTextView *text_view=GTK_TEXT_VIEW(linphone_gtk_get_widget(chat_view,"textview")); + GtkTextIter start; + GtkTextIter end; + gchar *buf=g_hash_table_lookup(hash,linphone_address_as_string_uri_only(uri)); + GtkTextBuffer *text_buffer; + text_view=GTK_TEXT_VIEW(linphone_gtk_get_widget(chat_view,"textview")); + text_buffer=gtk_text_view_get_buffer (text_view); + gtk_text_buffer_get_bounds (text_buffer, &start, &end); + g_object_set_data(G_OBJECT(chat_view),"cr",cr); + gtk_text_buffer_delete (text_buffer, &start, &end); + if(buf!=NULL){ + gtk_text_buffer_insert(text_buffer,&start,buf,-1); + printf("buf non nul\n"); + } else { + g_object_set_data(G_OBJECT(chat_view),"from_message",NULL); + GtkWidget *entry = linphone_gtk_get_widget(chat_view,"text_entry"); + g_signal_connect_swapped(G_OBJECT(entry),"activate",(GCallback)linphone_gtk_send_text,cr); + + GtkWidget *button = linphone_gtk_get_widget(chat_view,"send"); + g_signal_connect_swapped(G_OBJECT(button),"clicked",(GCallback)linphone_gtk_send_text,cr); + } + + g_object_set_data(G_OBJECT(chat_view),"from_chatroom",linphone_address_as_string_uri_only(uri)); + ms_free(buf); } } @@ -206,32 +265,33 @@ void linphone_gtk_chat_close(GtkWidget *button){ void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, const LinphoneAddress *from, const char *message){ - GtkWidget *w=(GtkWidget*)linphone_chat_room_get_user_data(room); - if (w==NULL){ - linphone_gtk_init_chatroom(room,linphone_address_as_string_uri_only(from)); - w=(GtkWidget*)linphone_chat_room_get_user_data(room); - } + GtkWidget *main_window=linphone_gtk_get_main_window(); + GtkWidget *friendlist=linphone_gtk_get_widget(main_window,"contact_list"); + GtkWidget *w; + + w=(GtkWidget*)g_object_get_data(G_OBJECT(friendlist),"chatview"); + if(w!=NULL){ + linphone_gtk_load_chatroom(room,from,w); + } else { + w=linphone_gtk_init_chatroom(room,from); + g_object_set_data(G_OBJECT(friendlist),"chatview",(gpointer)w); + } #ifdef HAVE_GTK_OSX /* Notified when a new message is sent */ linphone_gtk_status_icon_set_blinking(TRUE); - #else - if(!GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w),"is_notified"))){ - linphone_gtk_notify(NULL,message); - g_object_set_data(G_OBJECT(w),"is_notified",GINT_TO_POINTER(TRUE)); - } else { - g_object_set_data(G_OBJECT(w),"is_notified",GINT_TO_POINTER(FALSE)); + #else + if(!gtk_window_is_active(GTK_WINDOW(main_window))){ + if(!GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w),"is_notified"))){ + linphone_gtk_notify(NULL,message); + g_object_set_data(G_OBJECT(w),"is_notified",GINT_TO_POINTER(TRUE)); + } else { + g_object_set_data(G_OBJECT(w),"is_notified",GINT_TO_POINTER(FALSE)); + } } #endif - - - const char* display = linphone_address_get_display_name(from); - if(display==NULL){ - display = linphone_address_as_string(from); - } - linphone_gtk_push_text(GTK_TEXT_VIEW(linphone_gtk_get_widget(w,"textview")), - display, - message,FALSE); + + linphone_gtk_push_text(w,from,message,FALSE,room); //gtk_window_present(GTK_WINDOW(w)); /*gtk_window_set_urgency_hint(GTK_WINDOW(w),TRUE);*/ } diff --git a/gtk/conference.c b/gtk/conference.c index 0feed47a..546b3e1c 100644 --- a/gtk/conference.c +++ b/gtk/conference.c @@ -22,7 +22,7 @@ * 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 @@ -48,27 +48,32 @@ static void init_local_participant(GtkWidget *participant){ static GtkWidget *get_conference_tab(GtkWidget *mw){ GtkWidget *box=(GtkWidget*)g_object_get_data(G_OBJECT(mw),"conference_tab"); - if (box==NULL){ - 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_notebook_append_page(GTK_NOTEBOOK(linphone_gtk_get_widget(mw,"viewswitch")),box, - create_conference_label()); + 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); + } } return box; } static GtkWidget *find_conferencee_from_call(LinphoneCall *call){ GtkWidget *mw=linphone_gtk_get_main_window(); - GtkWidget *tab=get_conference_tab(mw); + 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"); GList *elem; GtkWidget *ret=NULL; if (call!=NULL){ - GList *l=gtk_container_get_children(GTK_CONTAINER(tab)); + GList *l=gtk_container_get_children(GTK_CONTAINER(conf_box)); for(elem=l;elem!=NULL;elem=elem->next){ GtkWidget *frame=(GtkWidget*)elem->data; if (call==g_object_get_data(G_OBJECT(frame),"call")){ @@ -84,14 +89,25 @@ static GtkWidget *find_conferencee_from_call(LinphoneCall *call){ void linphone_gtk_set_in_conference(LinphoneCall *call){ GtkWidget *mw=linphone_gtk_get_main_window(); - GtkWidget *participant=find_conferencee_from_call(call); - + GtkWidget *viewswitch=linphone_gtk_get_widget(mw,"viewswitch"); + 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)); + 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()); + } + GtkWidget *participant=find_conferencee_from_call(call); + GtkWidget *conf_box=linphone_gtk_get_widget(conf_frame,"conf_box"); if (participant==NULL){ - GtkWidget *tab=get_conference_tab(mw); const LinphoneAddress *addr=linphone_call_get_remote_address(call); participant=linphone_gtk_create_widget("main","callee_frame"); GtkWidget *sound_meter; - GtkWidget *viewswitch=linphone_gtk_get_widget(mw,"viewswitch"); gchar *markup; if (linphone_address_get_display_name(addr)!=NULL){ markup=g_strdup_printf("%s",linphone_address_get_display_name(addr)); @@ -103,17 +119,14 @@ 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(tab),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(conf_box),participant,FALSE,FALSE,PADDING_PIXELS); g_object_set_data_full(G_OBJECT(participant),"call",linphone_call_ref(call),(GDestroyNotify)linphone_call_unref); - gtk_widget_show(participant); gtk_notebook_set_current_page(GTK_NOTEBOOK(viewswitch), - gtk_notebook_page_num(GTK_NOTEBOOK(viewswitch),tab)); + 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){ @@ -123,20 +136,23 @@ void linphone_gtk_terminate_conference_participant(LinphoneCall *call){ void linphone_gtk_unset_from_conference(LinphoneCall *call){ GtkWidget *mw=linphone_gtk_get_main_window(); - 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"); + GtkWidget *conf_box=linphone_gtk_get_widget(conf_frame,"conf_box"); GtkWidget *frame; - if (box==NULL) return; /*conference tab already destroyed*/ + if (conf_box==NULL) return; /*conference tab already destroyed*/ frame=find_conferencee_from_call(call); GList *children; if (frame){ gtk_widget_destroy(frame); } - children=gtk_container_get_children(GTK_CONTAINER(box)); + children=gtk_container_get_children(GTK_CONTAINER(conf_box)); if (g_list_length(children)==2){ /*the conference is terminated */ - gtk_widget_destroy(box); - g_object_set_data(G_OBJECT(mw),"conference_tab",NULL); + 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); } - diff --git a/gtk/contact.ui b/gtk/contact.ui index 25ec2bee..db22d931 100644 --- a/gtk/contact.ui +++ b/gtk/contact.ui @@ -7,7 +7,6 @@ GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 center-on-parent - linphone2.png dialog diff --git a/gtk/friendlist.c b/gtk/friendlist.c index 114e931e..eddd6157 100644 --- a/gtk/friendlist.c +++ b/gtk/friendlist.c @@ -32,10 +32,10 @@ enum{ FRIEND_ICON, FRIEND_CALL, FRIEND_CHAT, + FRIEND_CHAT_CONVERSATION, FRIEND_LIST_NCOL }; - typedef struct _status_picture_tab_t{ LinphoneOnlineStatus status; const char *img; @@ -82,6 +82,12 @@ static GdkPixbuf *create_chat_picture(){ return pixbuf; } +static GdkPixbuf *create_active_chat_picture(){ + GdkPixbuf *pixbuf; + pixbuf = create_pixbuf("active_chat.png"); + return pixbuf; +} +/* void linphone_gtk_set_friend_status(GtkWidget *friendlist , LinphoneFriend * fid, const gchar *url, const gchar *status, const gchar *img){ GtkTreeIter iter; LinphoneFriend *tmp=0; @@ -101,9 +107,9 @@ void linphone_gtk_set_friend_status(GtkWidget *friendlist , LinphoneFriend * fid } } }while(gtk_tree_model_iter_next(model,&iter)); - } + } } - +*/ static void linphone_gtk_set_selection_to_uri_bar(GtkTreeView *treeview){ GtkTreeSelection *select; GtkTreeIter iter; @@ -123,7 +129,7 @@ static void linphone_gtk_set_selection_to_uri_bar(GtkTreeView *treeview){ void linphone_gtk_add_contact(){ GtkWidget *w=linphone_gtk_create_window("contact"); int presence_enabled=linphone_gtk_get_ui_config_int("use_subscribe_notify",1); - + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(w,"show_presence")),presence_enabled); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(w,"allow_presence")), presence_enabled); @@ -144,7 +150,6 @@ void linphone_gtk_edit_contact(GtkWidget *button){ } } - void linphone_gtk_remove_contact(GtkWidget *button){ GtkWidget *w=gtk_widget_get_toplevel(button); GtkTreeSelection *select; @@ -166,6 +171,56 @@ static void linphone_gtk_call_selected(GtkTreeView *treeview){ "start_call")); } +void linphone_gtk_update_chat_picture(){ + GtkTreeIter iter; + GtkWidget *w = linphone_gtk_get_main_window(); + GtkWidget *friendlist=linphone_gtk_get_widget(w,"contact_list"); + + GtkTreeModel *model=gtk_tree_view_get_model(GTK_TREE_VIEW(friendlist)); + if (gtk_tree_model_get_iter_first(model,&iter)) { + do{ + gtk_list_store_set(GTK_LIST_STORE(model),&iter,FRIEND_CHAT,create_chat_picture(),-1); + }while(gtk_tree_model_iter_next(model,&iter)); + } +} + +void linphone_gtk_chat_selected(GtkWidget *item){ + GtkWidget *w=gtk_widget_get_toplevel(item); + GtkTreeSelection *select; + GtkListStore *store=NULL; + GtkTreeIter iter; + GtkTreeModel *model; + LinphoneFriend *lf=NULL; + LinphoneChatRoom *cr=NULL; + GtkWidget *friendlist=linphone_gtk_get_widget(w,"contact_list"); + GtkWidget *page; + + select=gtk_tree_view_get_selection(GTK_TREE_VIEW(friendlist)); + store=GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(item))); + if (gtk_tree_selection_get_selected (select, &model, &iter)){ + GtkNotebook *notebook=(GtkNotebook *)linphone_gtk_get_widget(w,"viewswitch"); + gtk_tree_model_get(model,&iter,FRIEND_CHATROOM,&cr,-1); + const LinphoneAddress *uri; + gtk_tree_model_get (model, &iter,FRIEND_ID , &lf, -1); + uri=linphone_friend_get_address(lf); + if(cr == NULL){ + cr=linphone_gtk_create_chatroom(uri); + gtk_list_store_set(store,&iter, FRIEND_CHATROOM,cr,-1); + gtk_list_store_set(store,&iter, FRIEND_CHAT_CONVERSATION,NULL,-1); + } + page=(GtkWidget*)g_object_get_data(G_OBJECT(friendlist),"chatview"); + if(page==NULL){ + page=linphone_gtk_init_chatroom(cr,uri); + g_object_set_data(G_OBJECT(friendlist),"chatview",(gpointer)page); + } else { + linphone_gtk_load_chatroom(cr,uri,page); + } + gtk_notebook_set_current_page(notebook,gtk_notebook_page_num(notebook,page)); + linphone_gtk_update_chat_picture(linphone_gtk_get_widget(w,"contact_list")); + gtk_list_store_set(store,&iter,FRIEND_CHAT,create_active_chat_picture(),-1); + } +} + void linphone_gtk_contact_activated(GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *column, @@ -176,7 +231,14 @@ void linphone_gtk_contact_activated(GtkTreeView *treeview, void linphone_gtk_contact_clicked(GtkTreeView *treeview){ linphone_gtk_set_selection_to_uri_bar(treeview); - + if(GPOINTER_TO_INT(g_object_get_data(G_OBJECT(treeview),"numcol"))==1){ + linphone_gtk_call_selected(treeview); + } else { + if(GPOINTER_TO_INT(g_object_get_data(G_OBJECT(treeview),"numcol"))==2){ + linphone_gtk_chat_selected(GTK_WIDGET(treeview)); + } + } + g_object_set_data(G_OBJECT(treeview),"numcol",GINT_TO_POINTER(0)); } @@ -342,7 +404,7 @@ static gint friend_sort(GtkTreeModel *model, GtkTreeIter *a,GtkTreeIter *b,gpoin static void on_name_column_clicked(GtkTreeModel *model){ GtkSortType st; gint column; - + gtk_tree_sortable_get_sort_column_id(GTK_TREE_SORTABLE(model),&column,&st); if (column==FRIEND_NAME){ if (st==GTK_SORT_ASCENDING) st=GTK_SORT_DESCENDING; @@ -351,7 +413,6 @@ static void on_name_column_clicked(GtkTreeModel *model){ gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(model),FRIEND_NAME,st); } - static int get_friend_weight(const LinphoneFriend *lf){ int w=0; switch(linphone_friend_get_status(lf)){ @@ -387,14 +448,6 @@ static int friend_compare_func(const LinphoneFriend *lf1, const LinphoneFriend * return w2-w1; } -/*static gint friend_sort_with_presence(GtkTreeModel *model, GtkTreeIter *a,GtkTreeIter *b,gpointer user_data){ - LinphoneFriend *lf1=NULL,*lf2=NULL; - gtk_tree_model_get(model,a,FRIEND_ID,&lf1,-1); - gtk_tree_model_get(model,b,FRIEND_ID,&lf2,-1); - return friend_compare_func(lf1,lf2); -}*/ - - static MSList *sort_friend_list(const MSList *friends){ MSList *ret=NULL; const MSList *elem; @@ -410,7 +463,7 @@ static MSList *sort_friend_list(const MSList *friends){ static void on_presence_column_clicked(GtkTreeModel *model){ GtkSortType st; gint column; - + gtk_tree_sortable_get_sort_column_id(GTK_TREE_SORTABLE(model),&column,&st); if (column==FRIEND_ID){ if (st==GTK_SORT_ASCENDING) st=GTK_SORT_DESCENDING; @@ -423,12 +476,11 @@ void create_button(){ GtkWidget *main_window = linphone_gtk_get_main_window (); GtkWidget *button_add = linphone_gtk_get_widget(main_window,"add_button"); GtkWidget *image; - + image=gtk_image_new_from_stock(GTK_STOCK_ADD,GTK_ICON_SIZE_MENU); - gtk_container_add (GTK_CONTAINER (button_add), image); + gtk_container_add (GTK_CONTAINER (button_add), image); } -/* Creation of contact list*/ static void linphone_gtk_friend_list_init(GtkWidget *friendlist){ GtkListStore *store; GtkCellRenderer *renderer; @@ -437,43 +489,29 @@ static void linphone_gtk_friend_list_init(GtkWidget *friendlist){ linphone_gtk_init_bookmark_icon(); - - store = gtk_list_store_new(FRIEND_LIST_NCOL,GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER, - G_TYPE_POINTER, G_TYPE_STRING, GDK_TYPE_PIXBUF, GDK_TYPE_PIXBUF, GDK_TYPE_PIXBUF); + store = gtk_list_store_new(FRIEND_LIST_NCOL,GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER, + G_TYPE_POINTER, G_TYPE_STRING, GDK_TYPE_PIXBUF, GDK_TYPE_PIXBUF, GDK_TYPE_PIXBUF, G_TYPE_STRING); gtk_tree_view_set_model(GTK_TREE_VIEW(friendlist),GTK_TREE_MODEL(store)); g_object_unref(G_OBJECT(store)); - + /* Tree specification*/ - gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(friendlist),FALSE); + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(friendlist),FALSE); gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(friendlist),friend_search_func,NULL,NULL); gtk_tree_view_set_search_column(GTK_TREE_VIEW(friendlist),FRIEND_NAME); gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store),FRIEND_NAME,friend_sort,NULL,NULL); - - + /*Name and presence column*/ - renderer = gtk_cell_renderer_text_new (); - column = gtk_tree_view_column_new_with_attributes (_("Name"), - renderer, - "text", FRIEND_NAME,NULL); - g_object_set (G_OBJECT(column), "resizable", TRUE, NULL); - g_signal_connect_swapped(G_OBJECT(column),"clicked",(GCallback)on_name_column_clicked,GTK_TREE_MODEL(store)); - gtk_tree_view_column_set_clickable(column,TRUE); - gtk_tree_view_column_set_expand(column,TRUE); - gtk_tree_view_column_set_max_width(column,60); - gtk_tree_view_append_column (GTK_TREE_VIEW (friendlist), column); - - column = gtk_tree_view_column_new_with_attributes (_("Presence status"), renderer, "text", FRIEND_PRESENCE_STATUS, NULL); g_object_set (G_OBJECT(column), "resizable", TRUE, NULL); g_signal_connect_swapped(G_OBJECT(column),"clicked",(GCallback)on_presence_column_clicked,GTK_TREE_MODEL(store)); - gtk_tree_view_column_set_clickable(column,TRUE); + gtk_tree_view_column_set_clickable(column,TRUE); gtk_tree_view_column_set_visible(column,linphone_gtk_get_ui_config_int("friendlist_status",1)); - + renderer = gtk_cell_renderer_pixbuf_new(); gtk_tree_view_column_pack_start(column,renderer,TRUE); gtk_tree_view_column_add_attribute (column,renderer, @@ -481,25 +519,35 @@ static void linphone_gtk_friend_list_init(GtkWidget *friendlist){ FRIEND_PRESENCE_IMG); gtk_tree_view_append_column (GTK_TREE_VIEW (friendlist), column); + renderer = gtk_cell_renderer_text_new (); + column = gtk_tree_view_column_new_with_attributes (_("Name"), + renderer, + "text", FRIEND_NAME,NULL); + g_object_set (G_OBJECT(column), "resizable", TRUE, NULL); + g_signal_connect_swapped(G_OBJECT(column),"clicked",(GCallback)on_name_column_clicked,GTK_TREE_MODEL(store)); + gtk_tree_view_column_set_clickable(column,TRUE); + gtk_tree_view_column_set_expand(column,TRUE); + gtk_tree_view_column_set_max_width(column,60); + gtk_tree_view_append_column (GTK_TREE_VIEW (friendlist), column); /* Call column*/ renderer = gtk_cell_renderer_pixbuf_new(); column = gtk_tree_view_column_new_with_attributes (_("Call"),renderer,"pixbuf",FRIEND_CALL,NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (friendlist), column); - + /* chat column*/ renderer = gtk_cell_renderer_pixbuf_new(); column = gtk_tree_view_column_new_with_attributes (_("Chat"),renderer,"pixbuf",FRIEND_CHAT,NULL); - gtk_tree_view_append_column (GTK_TREE_VIEW (friendlist), column); + gtk_tree_view_append_column (GTK_TREE_VIEW (friendlist), column); select = gtk_tree_view_get_selection (GTK_TREE_VIEW (friendlist)); gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE); - + gtk_tree_view_set_grid_lines(GTK_TREE_VIEW(friendlist),GTK_TREE_VIEW_GRID_LINES_NONE); #if GTK_CHECK_VERSION(2,12,0) gtk_tree_view_set_tooltip_column(GTK_TREE_VIEW(friendlist),FRIEND_SIP_ADDRESS); #endif - + gtk_widget_set_size_request(friendlist,200,100); /*gtk_combo_box_set_active(GTK_COMBO_BOX(linphone_gtk_get_widget( gtk_widget_get_toplevel(friendlist),"show_category")),0);*/ @@ -569,7 +617,7 @@ void linphone_gtk_show_friends(void){ const gchar *search=NULL; gboolean lookup=FALSE; MSList *sorted; - + linphone_gtk_show_directory_search(); if (gtk_tree_view_get_model(GTK_TREE_VIEW(friendlist))==NULL){ @@ -601,7 +649,7 @@ void linphone_gtk_show_friends(void){ //BuddyInfo *bi; gboolean send_subscribe=linphone_friend_get_send_subscribe(lf); if (name==NULL || name[0]=='\0') { - display=uri; + display=linphone_address_get_username(f_uri); } gtk_list_store_append(store,&iter); gtk_list_store_set(store,&iter,FRIEND_NAME, display,FRIEND_ID,lf, @@ -609,8 +657,8 @@ void linphone_gtk_show_friends(void){ -1); gtk_list_store_set(store,&iter,FRIEND_CALL,create_call_picture(),-1); - gtk_list_store_set(store,&iter,FRIEND_CHAT,create_chat_picture(),-1); - + gtk_list_store_set(store,&iter,FRIEND_CHAT,create_chat_picture(),-1); + escaped=g_markup_escape_text(uri,-1); gtk_list_store_set(store,&iter,FRIEND_SIP_ADDRESS,escaped,-1); g_free(escaped); @@ -650,48 +698,6 @@ void linphone_gtk_show_contact(LinphoneFriend *lf){ gtk_widget_show(w); } -void linphone_gtk_init_chat(GtkWidget *w){ - //LinphoneCore *lc=linphone_gtk_get_core(); - - //GtkWidget *mw=gtk_widget_get_toplevel(w); - //GtkWidget *uri_bar=linphone_gtk_get_widget(mw,"uribar"); - - //g_timeout_add(100,(GSourceFunc)linphone_gtk_start_call_do,uri_bar); -} - - -void linphone_gtk_chat_selected(GtkWidget *item){ - linphone_gtk_init_chat(item); - - GtkWidget *w=gtk_widget_get_toplevel(item); - GtkTreeSelection *select; - GtkListStore *store=NULL; - GtkTreeIter iter; - GtkTreeModel *model; - LinphoneFriend *lf=NULL; - - select = gtk_tree_view_get_selection(GTK_TREE_VIEW(linphone_gtk_get_widget(w,"contact_list"))); - store=GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(item))); - LinphoneChatRoom *cr=NULL; - - if (gtk_tree_selection_get_selected (select, &model, &iter)) - { - gtk_tree_model_get(model,&iter,FRIEND_CHATROOM,&cr,-1); - char *uri; - gtk_tree_model_get (model, &iter,FRIEND_ID , &lf, -1); - uri=linphone_address_as_string(linphone_friend_get_address(lf)); - fprintf(stdout,"uri %s\n",uri); - if(cr == NULL){ - - LinphoneChatRoom *cr=linphone_gtk_create_chatroom(uri); - gtk_list_store_set(store,&iter,FRIEND_CHATROOM,cr,-1); - linphone_gtk_load_chatroom(cr,uri); - } - - ms_free(uri); - } -} - void linphone_gtk_contact_cancel(GtkWidget *button){ gtk_widget_destroy(gtk_widget_get_toplevel(button)); } @@ -752,7 +758,7 @@ static GtkWidget *linphone_gtk_create_contact_menu(GtkWidget *contact_list){ LinphoneCore *lc=linphone_gtk_get_core(); LinphoneProxyConfig *cfg=NULL; SipSetupContext * ssc=NULL; - + linphone_core_get_default_proxy(lc,&cfg); if (cfg){ ssc=linphone_proxy_config_get_sip_setup_context(cfg); @@ -804,7 +810,7 @@ static GtkWidget *linphone_gtk_create_contact_menu(GtkWidget *contact_list){ gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item); g_signal_connect_swapped(G_OBJECT(menu_item),"activate",(GCallback)linphone_gtk_remove_contact,contact_list); } - + if (ssc && (sip_setup_context_get_capabilities(ssc) & SIP_SETUP_CAP_BUDDY_LOOKUP)) { gchar *tmp=g_strdup_printf(_("Add new contact from %s directory"),linphone_proxy_config_get_domain(cfg)); @@ -818,7 +824,7 @@ static GtkWidget *linphone_gtk_create_contact_menu(GtkWidget *contact_list){ g_signal_connect_swapped(G_OBJECT(menu_item),"activate",(GCallback)linphone_gtk_show_buddy_lookup_window,ssc); gtk_widget_show(menu); } - + menu_item=gtk_image_menu_item_new_from_stock(GTK_STOCK_ADD,NULL); gtk_widget_show(menu_item); gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item); @@ -833,15 +839,13 @@ static GtkWidget *linphone_gtk_create_contact_menu(GtkWidget *contact_list){ return menu; } - gboolean linphone_gtk_popup_contact_menu(GtkWidget *list, GdkEventButton *event){ GtkWidget *m=linphone_gtk_create_contact_menu(list); - gtk_menu_popup (GTK_MENU (m), NULL, NULL, NULL, NULL, + gtk_menu_popup (GTK_MENU (m), NULL, NULL, NULL, NULL, event ? event->button : 0, event ? event->time : gtk_get_current_event_time()); return TRUE; } - gint get_col_number_from_tree_view_column (GtkTreeViewColumn *col){ GList *cols; gint num; @@ -854,7 +858,6 @@ gint get_col_number_from_tree_view_column (GtkTreeViewColumn *col){ return num; } - static gboolean tree_view_get_cell_from_pos(GtkTreeView *view, guint x, guint y){ GtkTreeViewColumn *col = NULL; GList *node, *columns; @@ -863,18 +866,17 @@ static gboolean tree_view_get_cell_from_pos(GtkTreeView *view, guint x, guint y) g_return_val_if_fail ( view != NULL, FALSE ); columns = gtk_tree_view_get_columns(view); - for (node = columns; node != NULL && col == NULL; node = node->next) - { - GtkTreeViewColumn *checkcol = (GtkTreeViewColumn*) node->data; - if (x >= colx && x < (colx + checkcol->width)){ - col = checkcol; - gint num = get_col_number_from_tree_view_column(col); - return num; - } - else - colx += checkcol->width; - } - g_list_free(columns); + for (node = columns; node != NULL && col == NULL; node = node->next){ + GtkTreeViewColumn *checkcol = (GtkTreeViewColumn*) node->data; + if (x >= colx && x < (colx + checkcol->width)){ + col = checkcol; + gint num = get_col_number_from_tree_view_column(col); + return num; + } + else + colx += checkcol->width; + } + g_list_free(columns); return 0; } @@ -886,9 +888,9 @@ gboolean linphone_gtk_contact_list_button_pressed(GtkWidget *widget, GdkEventBut } else if(event->button == 1 && event->type == GDK_BUTTON_PRESS){ gint numcol = tree_view_get_cell_from_pos(GTK_TREE_VIEW(widget),event->x,event->y); if(numcol==2){ - linphone_gtk_call_selected(GTK_TREE_VIEW(widget)); + g_object_set_data(G_OBJECT(widget),"numcol",GINT_TO_POINTER(1)); } else if(numcol==3){ - linphone_gtk_chat_selected(widget); + g_object_set_data(G_OBJECT(widget),"numcol",GINT_TO_POINTER(2)); } } return FALSE; diff --git a/gtk/incall_view.c b/gtk/incall_view.c index 346e8af6..6230df1a 100644 --- a/gtk/incall_view.c +++ b/gtk/incall_view.c @@ -19,7 +19,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. /* * C Implementation: incall_frame * -* Description: +* Description: * * * Author: Simon Morlat , (C) 2009 @@ -50,7 +50,7 @@ LinphoneCall *linphone_gtk_get_currently_displayed_call(gboolean *is_conf){ if (page!=NULL){ LinphoneCall *call=(LinphoneCall*)g_object_get_data(G_OBJECT(page),"call"); if (call==NULL){ - if (page==g_object_get_data(G_OBJECT(main_window),"conference_tab")){ + if (GPOINTER_TO_INT(g_object_get_data(G_OBJECT(main_window),"is_conf"))){ if (is_conf) *is_conf=TRUE; return NULL; @@ -74,12 +74,34 @@ static GtkWidget *make_tab_header(int number){ return w; } +void update_tab_header(LinphoneCall *call,gboolean pause){ + GtkWidget *w=(GtkWidget*)linphone_call_get_user_pointer(call); + GtkWidget *main_window=linphone_gtk_get_main_window(); + GtkNotebook *notebook=GTK_NOTEBOOK(linphone_gtk_get_widget(main_window,"viewswitch")); + gint call_index=GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w),"call_index")); + GtkWidget *new_label=gtk_hbox_new (FALSE,0); + GtkWidget *i=NULL; + if(pause){ +i=gtk_image_new_from_stock(GTK_STOCK_MEDIA_PAUSE,GTK_ICON_SIZE_SMALL_TOOLBAR); + } else { + i=create_pixmap ("status-green.png"); + } + GtkWidget *l; + gchar *text=g_strdup_printf(_("Call #%i"),call_index); + l=gtk_label_new (text); + gtk_box_pack_start (GTK_BOX(new_label),i,FALSE,FALSE,0); + gtk_box_pack_end(GTK_BOX(new_label),l,TRUE,TRUE,0); + + gtk_notebook_set_tab_label(notebook,w,new_label); + gtk_widget_show_all(new_label); +} + static void linphone_gtk_in_call_set_animation_image(GtkWidget *callview, const char *image_name, gboolean is_stock){ GtkWidget *container=linphone_gtk_get_widget(callview,"in_call_animation"); GList *elem=gtk_container_get_children(GTK_CONTAINER(container)); GtkWidget *image; - - if (!is_stock){ + + if (!is_stock){ if (image_name==NULL){ gtk_widget_hide(container); } @@ -112,13 +134,13 @@ static void linphone_gtk_transfer_call(LinphoneCall *dest_call){ if (call) linphone_core_transfer_call_to_another(linphone_gtk_get_core(),call,dest_call); } -static void transfer_button_clicked(GtkWidget *button, gpointer call_ref){ +void transfer_button_clicked(GtkWidget *button, gpointer call_ref){ GtkWidget *menu_item; GtkWidget *menu=gtk_menu_new(); LinphoneCall *call=(LinphoneCall*)call_ref; LinphoneCore *lc=linphone_gtk_get_core(); const MSList *elem=linphone_core_get_calls(lc); - + for(;elem!=NULL;elem=elem->next){ LinphoneCall *other_call=(LinphoneCall*)elem->data; GtkWidget *call_view=(GtkWidget*)linphone_call_get_user_pointer(other_call); @@ -136,7 +158,7 @@ static void transfer_button_clicked(GtkWidget *button, gpointer call_ref){ } } gtk_menu_popup(GTK_MENU(menu),NULL,NULL,NULL,NULL,0, - gtk_get_current_event_time()); + gtk_get_current_event_time()); gtk_widget_show(menu); } @@ -145,27 +167,19 @@ void linphone_gtk_enable_transfer_button(LinphoneCore *lc, gboolean value){ for(;elem!=NULL;elem=elem->next){ LinphoneCall *call=(LinphoneCall*)elem->data; GtkWidget *call_view=(GtkWidget*)linphone_call_get_user_pointer(call); - GtkWidget *box=linphone_gtk_get_widget (call_view,"mute_pause_buttons"); - GtkWidget *button=(GtkWidget*)g_object_get_data(G_OBJECT(box),"transfer"); - if (button && value==FALSE){ - gtk_widget_destroy(button); - button=NULL; - }else if (!button && value==TRUE){ - button=gtk_button_new_with_label (_("Transfer")); - //gtk_button_set_image_position(GTK_BUTTON(button),GTK_POS_BOTTOM); - gtk_button_set_image(GTK_BUTTON(button),gtk_image_new_from_stock (GTK_STOCK_GO_FORWARD,GTK_ICON_SIZE_BUTTON)); - g_signal_connect(G_OBJECT(button),"clicked",(GCallback)transfer_button_clicked,call); - gtk_widget_show_all(button); - gtk_container_add(GTK_CONTAINER(box),button); + GtkWidget *button=linphone_gtk_get_widget (call_view,"transfer_button"); + if(button != NULL){ + gtk_widget_set_sensitive(button,value); } - g_object_set_data(G_OBJECT(box),"transfer",button); } } static void conference_button_clicked(GtkWidget *button, gpointer call_ref){ + gtk_widget_set_sensitive(button,FALSE); + g_object_set_data(G_OBJECT(linphone_gtk_get_main_window()),"conf_frame",NULL); linphone_core_add_all_to_conference(linphone_gtk_get_core()); //linphone_core_add_to_conference(linphone_gtk_get_core(),(LinphoneCall*)call_ref); - gtk_widget_set_sensitive(button,FALSE); + } void linphone_gtk_enable_conference_button(LinphoneCore *lc, gboolean value){ @@ -173,20 +187,10 @@ void linphone_gtk_enable_conference_button(LinphoneCore *lc, gboolean value){ for(;elem!=NULL;elem=elem->next){ LinphoneCall *call=(LinphoneCall*)elem->data; GtkWidget *call_view=(GtkWidget*)linphone_call_get_user_pointer(call); - GtkWidget *box=linphone_gtk_get_widget (call_view,"mute_pause_buttons"); - GtkWidget *button=(GtkWidget*)g_object_get_data(G_OBJECT(box),"conference"); - if (button && value==FALSE){ - gtk_widget_destroy(button); - button=NULL; - }else if (!button && value==TRUE){ - button=gtk_button_new_with_label (_("Conference")); - //gtk_button_set_image_position(GTK_BUTTON(button),GTK_POS_BOTTOM); - gtk_button_set_image(GTK_BUTTON(button),gtk_image_new_from_stock (GTK_STOCK_ADD,GTK_ICON_SIZE_BUTTON)); - g_signal_connect(G_OBJECT(button),"clicked",(GCallback)conference_button_clicked,call); - gtk_widget_show_all(button); - gtk_container_add(GTK_CONTAINER(box),button); + GtkWidget *button=linphone_gtk_get_widget (call_view,"conference_button"); + if (button != NULL){ + gtk_widget_set_sensitive(button,value); } - g_object_set_data(G_OBJECT(box),"conference",button); } } @@ -198,7 +202,7 @@ static void show_used_codecs(GtkWidget *callstats, LinphoneCall *call){ GtkWidget *acodec_ui=linphone_gtk_get_widget(callstats,"audio_codec"); GtkWidget *vcodec_ui=linphone_gtk_get_widget(callstats,"video_codec"); if (acodec){ - + char tmp[64]={0}; snprintf(tmp,sizeof(tmp)-1,"%s/%i/%i",acodec->mime_type,acodec->clock_rate,acodec->channels); gtk_label_set_label(GTK_LABEL(acodec_ui),tmp); @@ -283,7 +287,16 @@ static void linphone_gtk_show_call_stats(LinphoneCall *call){ refresh_call_stats(call_stats); gtk_widget_show(call_stats); } - + +} + +void linphone_gtk_enable_video_button(LinphoneCall *call, gboolean sensitive, gboolean holdon){ + GtkWidget *callview=(GtkWidget*)linphone_call_get_user_pointer (call); + GtkWidget *button; + g_return_if_fail(callview!=NULL); + button=linphone_gtk_get_widget(callview,"video_button"); + gtk_widget_set_sensitive(GTK_WIDGET(button),sensitive); + gtk_widget_set_visible(GTK_WIDGET(button),sensitive); } void linphone_gtk_create_in_call_view(LinphoneCall *call){ @@ -308,16 +321,27 @@ void linphone_gtk_create_in_call_view(LinphoneCall *call){ gtk_notebook_set_current_page(notebook, idx); call_index++; linphone_gtk_enable_hold_button (call,FALSE,TRUE); + linphone_gtk_enable_video_button (call,FALSE,TRUE); linphone_gtk_enable_mute_button( GTK_BUTTON(linphone_gtk_get_widget(call_view,"incall_mute")),FALSE); - + + GtkWidget *transfer = linphone_gtk_get_widget(call_view,"transfer_button"); + gtk_button_set_image(GTK_BUTTON(transfer),gtk_image_new_from_stock + (GTK_STOCK_GO_FORWARD,GTK_ICON_SIZE_BUTTON)); + g_signal_connect(G_OBJECT(transfer),"clicked",(GCallback)transfer_button_clicked,call); + gtk_widget_hide(transfer); + + GtkWidget *conf = linphone_gtk_get_widget(call_view,"conference_button"); + gtk_button_set_image(GTK_BUTTON(conf),gtk_image_new_from_stock (GTK_STOCK_ADD,GTK_ICON_SIZE_BUTTON)); + g_signal_connect(G_OBJECT(conf),"clicked",(GCallback)conference_button_clicked,call); + gtk_widget_hide(conf); + GtkWidget *button=linphone_gtk_get_widget(call_view,"terminate_call"); GtkWidget *image=create_pixmap("stopcall-red.png"); - gtk_button_set_label(GTK_BUTTON(button),_("Stop")); + gtk_button_set_label(GTK_BUTTON(button),_("Hang up")); gtk_button_set_image(GTK_BUTTON(button),image); gtk_widget_show(image); g_signal_connect_swapped(G_OBJECT(linphone_gtk_get_widget(call_view,"quality_indicator")),"button-press-event",(GCallback)linphone_gtk_show_call_stats,call); - } static void video_button_clicked(GtkWidget *button, LinphoneCall *call){ @@ -372,7 +396,7 @@ void linphone_gtk_remove_in_call_view(LinphoneCall *call){ if (linphone_core_is_in_conference(linphone_gtk_get_core())){ /*show the conference*/ gtk_notebook_set_current_page(GTK_NOTEBOOK(nb),gtk_notebook_page_num(GTK_NOTEBOOK(nb), - g_object_get_data(G_OBJECT(main_window),"conference_tab"))); + g_object_get_data(G_OBJECT(main_window),"conf_frame"))); }else gtk_notebook_set_current_page(GTK_NOTEBOOK(nb), 0); }else{ /*show the active call*/ @@ -387,9 +411,9 @@ static void display_peer_name_in_label(GtkWidget *label, const LinphoneAddress * char *uri_label; displayname=linphone_address_get_display_name(from); id=linphone_address_as_string_uri_only(from); - + if (displayname!=NULL){ - uri_label=g_markup_printf_escaped("%s\n%s", + uri_label=g_markup_printf_escaped("%s\n%s", displayname,id); }else uri_label=g_markup_printf_escaped("%s\n",id); @@ -402,10 +426,10 @@ void linphone_gtk_in_call_view_set_calling(LinphoneCall *call){ GtkWidget *status=linphone_gtk_get_widget(callview,"in_call_status"); GtkWidget *callee=linphone_gtk_get_widget(callview,"in_call_uri"); GtkWidget *duration=linphone_gtk_get_widget(callview,"in_call_duration"); - + gtk_label_set_markup(GTK_LABEL(status),_("Calling...")); display_peer_name_in_label(callee,linphone_call_get_remote_address (call)); - + gtk_label_set_text(GTK_LABEL(duration),_("00::00::00")); linphone_gtk_in_call_set_animation_spinner(callview); } @@ -419,7 +443,7 @@ void linphone_gtk_in_call_view_set_incoming(LinphoneCall *call){ gtk_label_set_markup(GTK_LABEL(status),_("Incoming call")); gtk_widget_show_all(linphone_gtk_get_widget(callview,"answer_decline_panel")); - gtk_widget_hide(linphone_gtk_get_widget(callview,"mute_pause_buttons")); + gtk_widget_hide(linphone_gtk_get_widget(callview,"buttons_panel")); display_peer_name_in_label(callee,linphone_call_get_remote_address (call)); answer_button=linphone_gtk_get_widget(callview,"accept_call"); @@ -427,11 +451,11 @@ void linphone_gtk_in_call_view_set_incoming(LinphoneCall *call){ gtk_button_set_label(GTK_BUTTON(answer_button),_("Answer")); gtk_button_set_image(GTK_BUTTON(answer_button),image); gtk_widget_show(image); - + image=create_pixmap (linphone_gtk_get_ui_config("stop_call_icon","stopcall-red.png")); gtk_button_set_image(GTK_BUTTON(linphone_gtk_get_widget(callview,"decline_call")),image); gtk_widget_show(image); - + linphone_gtk_in_call_set_animation_image(callview,GTK_STOCK_DIALOG_INFO,TRUE); } @@ -486,8 +510,6 @@ static gboolean linphone_gtk_in_call_view_refresh(LinphoneCall *call){ return TRUE; } - - typedef struct _volume_ctx{ GtkWidget *widget; get_volume_t get_volume; @@ -541,13 +563,14 @@ void linphone_gtk_uninit_audio_meter(GtkWidget *w){ void linphone_gtk_in_call_view_enable_audio_view(LinphoneCall *call, gboolean val){ GtkWidget *callview=(GtkWidget*)linphone_call_get_user_pointer(call); GtkWidget *audio_view=linphone_gtk_get_widget(callview,"incall_audioview"); - //GtkWidget *mic=linphone_gtk_get_widget(callview,"incall_mic_icon"); + GtkWidget *mic=linphone_gtk_get_widget(callview,"incall_mic_icon"); GtkWidget *spk=linphone_gtk_get_widget(callview,"incall_spk_icon"); GtkWidget *mic_level=linphone_gtk_get_widget(callview,"mic_audiolevel"); GtkWidget *spk_level=linphone_gtk_get_widget(callview,"spk_audiolevel"); GdkPixbuf *pbuf; - //gtk_image_set_from_pixbuf(GTK_IMAGE(mic),(pbuf=create_pixbuf("mic_active.png"))); - //g_object_unref(pbuf); + + gtk_image_set_from_pixbuf(GTK_IMAGE(mic),(pbuf=create_pixbuf("mic_active.png"))); + g_object_unref(pbuf); if (val){ gtk_image_set_from_pixbuf(GTK_IMAGE(spk),(pbuf=create_pixbuf("speaker.png"))); g_object_unref(pbuf); @@ -593,7 +616,7 @@ void linphone_gtk_in_call_view_show_encryption(LinphoneCall *call){ gtk_button_set_label(GTK_BUTTON(verify_button), verified ? _("Set unverified") : _("Set verified")); gtk_widget_show_all(encryption_box); - } + } break; default: gtk_widget_hide_all(encryption_box); @@ -608,24 +631,34 @@ void linphone_gtk_in_call_view_set_in_call(LinphoneCall *call){ guint taskid=GPOINTER_TO_INT(g_object_get_data(G_OBJECT(callview),"taskid")); gboolean in_conf=linphone_call_params_local_conference_mode(linphone_call_get_current_params(call)); GtkWidget *call_stats=(GtkWidget*)g_object_get_data(G_OBJECT(callview),"call_stats"); - + display_peer_name_in_label(callee,linphone_call_get_remote_address (call)); - gtk_widget_set_visible(linphone_gtk_get_widget(callview,"mute_pause_buttons"),!in_conf); + gtk_widget_set_visible(linphone_gtk_get_widget(callview,"buttons_panel"),!in_conf); + + gtk_widget_hide(linphone_gtk_get_widget(callview,"answer_decline_panel")); gtk_label_set_markup(GTK_LABEL(status),in_conf ? _("In conference") : _("In call")); + gtk_widget_set_sensitive(linphone_gtk_get_widget(callview,"conference_button"),!in_conf); + gtk_widget_set_sensitive(linphone_gtk_get_widget(callview,"transfer_button"),!in_conf); + gtk_label_set_text(GTK_LABEL(duration),_("00::00::00")); linphone_gtk_in_call_set_animation_image(callview,GTK_STOCK_MEDIA_PLAY,TRUE); + update_tab_header(call,FALSE); linphone_gtk_enable_mute_button( - GTK_BUTTON(linphone_gtk_get_widget(callview,"incall_mute")),!in_conf); + GTK_BUTTON(linphone_gtk_get_widget(callview,"incall_mute")),TRUE); + gtk_widget_show_all(linphone_gtk_get_widget(callview,"buttons_panel")); if (taskid==0){ taskid=g_timeout_add(250,(GSourceFunc)linphone_gtk_in_call_view_refresh,call); g_object_set_data(G_OBJECT(callview),"taskid",GINT_TO_POINTER(taskid)); } linphone_gtk_in_call_view_enable_audio_view(call, !in_conf); linphone_gtk_in_call_view_show_encryption(call); - if (in_conf) linphone_gtk_set_in_conference(call); + if (in_conf){ + linphone_gtk_set_in_conference(call); + gtk_widget_set_sensitive(linphone_gtk_get_widget(callview,"incall_mute"),FALSE); + } if (call_stats) show_used_codecs(call_stats,call); } @@ -634,6 +667,7 @@ void linphone_gtk_in_call_view_set_paused(LinphoneCall *call){ GtkWidget *status=linphone_gtk_get_widget(callview,"in_call_status"); gtk_widget_hide(linphone_gtk_get_widget(callview,"answer_decline_panel")); gtk_label_set_markup(GTK_LABEL(status),_("Paused call")); + linphone_gtk_in_call_set_animation_image(callview,GTK_STOCK_MEDIA_PAUSE,TRUE); } @@ -658,7 +692,7 @@ void linphone_gtk_in_call_view_terminate(LinphoneCall *call, const char *error_m GtkWidget *callview=(GtkWidget*)linphone_call_get_user_pointer(call); GtkWidget *status=linphone_gtk_get_widget(callview,"in_call_status"); guint taskid=GPOINTER_TO_INT(g_object_get_data(G_OBJECT(callview),"taskid")); - gboolean in_conf=linphone_call_params_local_conference_mode(linphone_call_get_current_params(call)); + gboolean in_conf=linphone_call_params_local_conference_mode(linphone_call_get_current_params(call)); if ((callview==NULL) || (status==NULL)) return; if (error_msg==NULL) @@ -670,15 +704,17 @@ void linphone_gtk_in_call_view_terminate(LinphoneCall *call, const char *error_m } linphone_gtk_in_call_set_animation_image(callview, linphone_gtk_get_ui_config("stop_call_icon","stopcall-red.png"),FALSE); - + gtk_widget_hide(linphone_gtk_get_widget(callview,"answer_decline_panel")); gtk_widget_hide(linphone_gtk_get_widget(callview,"incall_audioview")); gtk_widget_hide(linphone_gtk_get_widget(callview,"terminate_call")); gtk_widget_hide(linphone_gtk_get_widget(callview,"video_button")); + gtk_widget_hide(linphone_gtk_get_widget(callview,"transfer_button")); + gtk_widget_hide(linphone_gtk_get_widget(callview,"conference_button")); linphone_gtk_enable_mute_button( GTK_BUTTON(linphone_gtk_get_widget(callview,"incall_mute")),FALSE); linphone_gtk_enable_hold_button(call,FALSE,TRUE); - + if (taskid!=0) g_source_remove(taskid); g_timeout_add_seconds(2,(GSourceFunc)in_call_view_terminated,call); if (in_conf) @@ -732,8 +768,7 @@ void linphone_gtk_mute_clicked(GtkButton *button){ linphone_gtk_draw_mute_button(button,!active); } -void linphone_gtk_enable_mute_button(GtkButton *button, gboolean sensitive) -{ +void linphone_gtk_enable_mute_button(GtkButton *button, gboolean sensitive){ /*gtk_widget_set_sensitive(GTK_WIDGET(button),sensitive);*/ gtk_widget_set_visible(GTK_WIDGET(button),sensitive); linphone_gtk_draw_mute_button(button,FALSE); @@ -761,6 +796,7 @@ void linphone_gtk_draw_hold_button(GtkButton *button, gboolean active){ void linphone_gtk_hold_clicked(GtkButton *button){ int active=GPOINTER_TO_INT(g_object_get_data(G_OBJECT(button),"active")); LinphoneCall *call=linphone_gtk_get_currently_displayed_call(NULL); + update_tab_header(call,active); if (!call) return; if(!active) { @@ -776,6 +812,7 @@ void linphone_gtk_enable_hold_button(LinphoneCall *call, gboolean sensitive, gbo GtkWidget *callview=(GtkWidget*)linphone_call_get_user_pointer (call); GtkWidget *button; g_return_if_fail(callview!=NULL); + update_tab_header(call,!holdon); button=linphone_gtk_get_widget(callview,"hold_call"); gtk_widget_set_sensitive(GTK_WIDGET(button),sensitive); gtk_widget_set_visible(GTK_WIDGET(button),sensitive); diff --git a/gtk/linphone.h b/gtk/linphone.h index 5c2df5ea..65224ffe 100644 --- a/gtk/linphone.h +++ b/gtk/linphone.h @@ -70,7 +70,7 @@ void linphone_gtk_show_parameters(void); void linphone_gtk_fill_soundcards(GtkWidget *pb); void linphone_gtk_fill_webcams(GtkWidget *pb); void linphone_gtk_load_identities(void); -LinphoneChatRoom * linphone_gtk_create_chatroom(const char *with); +LinphoneChatRoom * linphone_gtk_create_chatroom(const LinphoneAddress *with); void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, const LinphoneAddress *from, const char *message); void linphone_gtk_call_log_update(GtkWidget *w); void linphone_gtk_create_log_window(void); @@ -96,14 +96,19 @@ void linphone_gtk_buddy_lookup_set_keyword(GtkWidget *w, const char *kw); void * linphone_gtk_wait(LinphoneCore *lc, void *ctx, LinphoneWaitingState ws, const char *purpose, float progress); void linphone_gtk_terminate_call(GtkWidget *button); +void update_tab_header(LinphoneCall *call,gboolean pause); void linphone_gtk_show_directory_search(void); void linphone_gtk_status_icon_set_blinking(gboolean val); void linphone_gtk_notify(LinphoneCall *call, const char *msg); LinphoneChatRoom *linphone_gtk_start_chat(GtkTreeView* t); -void linphone_gtk_load_chatroom(LinphoneChatRoom *cr,const char* uri); +void linphone_gtk_load_chatroom(LinphoneChatRoom *cr,const LinphoneAddress *uri,GtkWidget *chat_view); void linphone_gtk_send_text(LinphoneChatRoom *cr); +GtkWidget * linphone_gtk_init_chatroom(LinphoneChatRoom *cr, const LinphoneAddress *with); +void linphone_gtk_update_chat_picture(); +void linphone_gtk_chat_set_conversation(const LinphoneAddress *uri,gchar *conversation); +gchar * linphone_gtk_chat_get_conversation(const LinphoneAddress *uri); /*functions controlling the different views*/ gboolean linphone_gtk_use_in_call_view(); @@ -117,6 +122,7 @@ void linphone_gtk_in_call_view_set_incoming(LinphoneCall *call); void linphone_gtk_in_call_view_set_paused(LinphoneCall *call); void linphone_gtk_in_call_view_set_transfer_status(LinphoneCall *call,LinphoneCallState cstate); void linphone_gtk_mute_clicked(GtkButton *button); +void transfer_button_clicked(GtkWidget *button, gpointer call_ref); void linphone_gtk_enable_mute_button(GtkButton *button, gboolean sensitive); void linphone_gtk_enable_hold_button(LinphoneCall *call, gboolean sensitive, gboolean holdon); void linphone_gtk_enable_transfer_button(LinphoneCore *lc, gboolean value); diff --git a/gtk/main.c b/gtk/main.c index 8ec303e2..1216b610 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -134,7 +134,7 @@ static GOptionEntry linphone_options[]={ }; #define INSTALLED_XML_DIR PACKAGE_DATA_DIR "/linphone" -#define RELATIVE_XML_DIR +#define RELATIVE_XML_DIR #define BUILD_TREE_XML_DIR "gtk" #ifndef WIN32 @@ -145,7 +145,6 @@ static GOptionEntry linphone_options[]={ #define SECRETS_FILE "linphone-zidcache" #endif - char *linphone_gtk_get_config_file(const char *filename){ const int path_max=1024; char *config_file=g_malloc0(path_max); @@ -179,7 +178,7 @@ static const char *linphone_gtk_get_factory_config_file(){ "%s",FACTORY_CONFIG_FILE); } else { char *progdir; - + if (progpath != NULL) { char *basename; progdir = strdup(progpath); @@ -250,8 +249,6 @@ static void linphone_gtk_init_liblinphone(const char *config_file, } } - - LinphoneCore *linphone_gtk_get_core(void){ return the_core; } @@ -305,7 +302,7 @@ GtkWidget *linphone_gtk_create_window(const char *window_name){ GtkWidget *w; if (get_ui_file(window_name,path,sizeof(path))==-1) return NULL; - + if (!gtk_builder_add_from_file (builder, path, &error)){ g_error("Couldn't load builder file: %s", error->message); g_error_free (error); @@ -330,7 +327,7 @@ GtkWidget *linphone_gtk_create_widget(const char *filename, const char *widget_n gchar *object_ids[2]; object_ids[0]=g_strdup(widget_name); object_ids[1]=NULL; - + if (get_ui_file(filename,path,sizeof(path))==-1) return NULL; if (!gtk_builder_add_objects_from_file(builder,path,object_ids,&error)){ g_error("Couldn't load %s from builder file %s: %s", widget_name,path,error->message); @@ -384,7 +381,7 @@ GtkWidget *linphone_gtk_get_widget(GtkWidget *window, const char *name){ void linphone_gtk_display_something(GtkMessageType type,const gchar *message){ GtkWidget *dialog; GtkWidget *main_window=linphone_gtk_get_main_window(); - + gtk_widget_show(main_window); if (type==GTK_MESSAGE_QUESTION) { @@ -440,7 +437,7 @@ void linphone_gtk_show_about(){ GdkPixbuf *logo=create_pixbuf( linphone_gtk_get_ui_config("logo","linphone-banner.png")); static const char *defcfg="defcfg"; - + about=linphone_gtk_create_window("about"); gtk_about_dialog_set_url_hook(about_url_clicked,NULL,NULL); memset(&filestat,0,sizeof(filestat)); @@ -482,7 +479,7 @@ static void set_video_window_decorations(GdkWindow *w){ const char *icon_path=linphone_gtk_get_ui_config("icon",LINPHONE_ICON); char video_title[256]; GdkPixbuf *pbuf=create_pixbuf(icon_path); - + if (!linphone_core_in_call(linphone_gtk_get_core())){ snprintf(video_title,sizeof(video_title),"%s video",title); /* When not in call, treat the video as a normal window */ @@ -650,8 +647,8 @@ static void save_uri_history(){ static void completion_add_text(GtkEntry *entry, const char *text){ GtkTreeIter iter; GtkTreeModel *model=gtk_entry_completion_get_model(gtk_entry_get_completion(entry)); - - if (gtk_tree_model_get_iter_first(model,&iter)){ + + if (gtk_tree_model_get_iter_first(model,&iter)){ do { gchar *uri=NULL; gtk_tree_model_get(model,&iter,0,&uri,-1); @@ -672,7 +669,6 @@ static void completion_add_text(GtkEntry *entry, const char *text){ save_uri_history(); } - bool_t linphone_gtk_video_enabled(void){ const LinphoneVideoPolicy *vpol=linphone_core_get_video_policy(linphone_gtk_get_core()); return vpol->automatically_accept && vpol->automatically_initiate; @@ -706,19 +702,19 @@ static void linphone_gtk_update_call_buttons(LinphoneCall *call){ //bool_t stop_active=FALSE; bool_t add_call=FALSE; int call_list_size=ms_list_size(calls); - + if (calls==NULL){ start_active=TRUE; //stop_active=FALSE; }else{ - //stop_active=TRUE; + //stop_active=TRUE; start_active=TRUE; add_call=TRUE; } button=linphone_gtk_get_widget(mw,"start_call"); gtk_widget_set_sensitive(button,start_active); gtk_widget_set_visible(button,!add_call); - + button=linphone_gtk_get_widget(mw,"add_call"); if (linphone_core_sound_resources_locked(lc) || (call && linphone_call_get_state(call)==LinphoneCallIncomingReceived)) { gtk_widget_set_sensitive(button,FALSE); @@ -726,7 +722,7 @@ static void linphone_gtk_update_call_buttons(LinphoneCall *call){ gtk_widget_set_sensitive(button,start_active); } gtk_widget_set_visible(button,add_call); - + //gtk_widget_set_sensitive(linphone_gtk_get_widget(mw,"terminate_call"),stop_active); linphone_gtk_enable_transfer_button(lc,call_list_size>1); @@ -753,7 +749,6 @@ static gboolean linphone_gtk_auto_answer(LinphoneCall *call){ return FALSE; } - void linphone_gtk_start_call(GtkWidget *w){ LinphoneCore *lc=linphone_gtk_get_core(); LinphoneCall *call; @@ -770,14 +765,13 @@ void linphone_gtk_start_call(GtkWidget *w){ gtk_widget_set_sensitive(linphone_gtk_get_widget(mw,"start_call"),FALSE); g_timeout_add(100,(GSourceFunc)linphone_gtk_start_call_do,uri_bar); } - + } void linphone_gtk_uri_bar_activate(GtkWidget *w){ linphone_gtk_start_call(w); } - void linphone_gtk_terminate_call(GtkWidget *button){ gboolean is_conf; LinphoneCall *call=linphone_gtk_get_currently_displayed_call(&is_conf); @@ -807,7 +801,7 @@ void _linphone_gtk_enable_video(gboolean val){ policy.automatically_initiate=policy.automatically_accept=val; linphone_core_enable_video(linphone_gtk_get_core(),TRUE,TRUE); linphone_core_set_video_policy(linphone_gtk_get_core(),&policy); - + if (val){ linphone_core_enable_video_preview(linphone_gtk_get_core(), linphone_gtk_get_ui_config_int("videoselfview",VIDEOSELFVIEW_DEFAULT)); @@ -840,7 +834,6 @@ void linphone_gtk_used_identity_changed(GtkWidget *w){ if (sel) g_free(sel); } - void on_proxy_refresh_button_clicked(GtkWidget *w){ LinphoneCore *lc=linphone_gtk_get_core(); MSList const *item=linphone_core_get_proxy_config_list(lc); @@ -894,7 +887,6 @@ typedef struct _AuthTimeout{ GtkWidget *w; } AuthTimeout; - static void auth_timeout_clean(AuthTimeout *tout){ tout->w=NULL; } @@ -946,7 +938,7 @@ static void linphone_gtk_auth_info_requested(LinphoneCore *lc, const char *realm LinphoneAuthInfo *info; gchar *msg; GtkWidget *mw=linphone_gtk_get_main_window(); - + if (mw && GTK_WIDGET_VISIBLE(linphone_gtk_get_widget(mw,"login_frame"))){ /*don't prompt for authentication when login frame is visible*/ linphone_core_abort_authentication(lc,NULL); @@ -968,7 +960,7 @@ static void linphone_gtk_auth_info_requested(LinphoneCore *lc, const char *realm static void linphone_gtk_display_status(LinphoneCore *lc, const char *status){ GtkWidget *w=linphone_gtk_get_main_window(); GtkWidget *status_bar=linphone_gtk_get_widget(w,"status_bar"); - + gtk_statusbar_push(GTK_STATUSBAR(status_bar), gtk_statusbar_get_context_id(GTK_STATUSBAR(status_bar),""), status); @@ -1037,14 +1029,14 @@ void linphone_gtk_notify(LinphoneCall *call, const char *msg){ if (!notify_init ("Linphone")) ms_error("Libnotify failed to init."); #endif if (!call) { - + #ifdef HAVE_NOTIFY if (!notify_notification_show(notify_notification_new("Linphone",msg,NULL #ifdef HAVE_NOTIFY1 ,NULL #endif ),NULL)) - + ms_error("Failed to send notification."); #else linphone_gtk_show_main_window(); @@ -1157,7 +1149,7 @@ static void linphone_gtk_call_state_changed(LinphoneCore *lc, LinphoneCall *call if (auto_answer) { linphone_call_ref(call); g_timeout_add(2000,(GSourceFunc)linphone_gtk_auto_answer ,call); - } + } break; case LinphoneCallResuming: linphone_gtk_enable_hold_button(call,TRUE,TRUE); @@ -1165,8 +1157,10 @@ static void linphone_gtk_call_state_changed(LinphoneCore *lc, LinphoneCall *call break; case LinphoneCallPausing: linphone_gtk_enable_hold_button(call,TRUE,FALSE); + update_tab_header(call,FALSE); case LinphoneCallPausedByRemote: linphone_gtk_in_call_view_set_paused(call); + update_tab_header(call,TRUE); break; case LinphoneCallConnected: linphone_gtk_enable_hold_button (call,TRUE,TRUE); @@ -1193,7 +1187,7 @@ static void update_registration_status(LinphoneProxyConfig *cfg, LinphoneRegistr GtkTreeIter iter; gboolean found=FALSE; const char *stock_id=NULL; - + if (gtk_tree_model_get_iter_first(model,&iter)){ gpointer p; do{ @@ -1227,7 +1221,7 @@ static void update_registration_status(LinphoneProxyConfig *cfg, LinphoneRegistr gtk_list_store_set(GTK_LIST_STORE(model),&iter,1,stock_id,-1); } -static void linphone_gtk_registration_state_changed(LinphoneCore *lc, LinphoneProxyConfig *cfg, +static void linphone_gtk_registration_state_changed(LinphoneCore *lc, LinphoneProxyConfig *cfg, LinphoneRegistrationState rs, const char *msg){ switch (rs){ case LinphoneRegistrationOk: @@ -1279,13 +1273,13 @@ static GtkWidget *create_icon_menu(){ GtkWidget *image; gchar *tmp; const gchar *homesite; - + homesite=linphone_gtk_get_ui_config("home","http://www.linphone.org"); menu_item=gtk_image_menu_item_new_with_label(_("Website link")); tmp=g_strdup(homesite); g_object_set_data(G_OBJECT(menu_item),"home",tmp); g_object_weak_ref(G_OBJECT(menu_item),(GWeakNotify)g_free,tmp); - + image=gtk_image_new_from_stock(GTK_STOCK_HELP,GTK_ICON_SIZE_MENU); gtk_widget_show(image); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),image); @@ -1293,7 +1287,7 @@ static GtkWidget *create_icon_menu(){ gtk_widget_show(menu_item); gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item); g_signal_connect(G_OBJECT(menu_item),"activate",(GCallback)linphone_gtk_link_to_website,NULL); - + menu_item=gtk_image_menu_item_new_from_stock(GTK_STOCK_ABOUT,NULL); gtk_widget_show(menu_item); gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item); @@ -1447,6 +1441,7 @@ static void linphone_gtk_dtmf_released(GtkButton *button){ linphone_core_stop_dtmf (linphone_gtk_get_core()); } + static void linphone_gtk_connect_digits(void){ GtkContainer *cont=GTK_CONTAINER(linphone_gtk_get_widget(linphone_gtk_get_main_window(),"dtmf_table")); GList *children=gtk_container_get_children(cont); @@ -1492,16 +1487,11 @@ static void linphone_gtk_configure_main_window(){ static gboolean buttons_have_borders; static gboolean show_abcd; GtkWidget *w=linphone_gtk_get_main_window(); - - //Change the color - GdkColor color; - //RGB(246^2,249^2,252^2) - color.pixel = 0; - color.red=65025; - color.green=46656; - color.blue=50625; - gtk_widget_modify_bg(GTK_WIDGET(w), GTK_STATE_NORMAL, &color); - + GHashTable *contacts_history; + + contacts_history=g_hash_table_new_full(g_str_hash, g_str_equal,g_free, NULL); + g_object_set_data(G_OBJECT(w),"history",(gpointer)contacts_history); + if (!config_loaded){ title=linphone_gtk_get_ui_config("title","Linphone"); home=linphone_gtk_get_ui_config("home","http://www.linphone.org"); @@ -1636,6 +1626,7 @@ static void linphone_gtk_init_main_window(){ linphone_gtk_call_log_update(main_window); linphone_gtk_update_call_buttons (NULL); + g_object_set_data(G_OBJECT(main_window),"is_conf",GINT_TO_POINTER(FALSE)); /*prevent the main window from being destroyed by a user click on WM controls, instead we hide it*/ g_signal_connect (G_OBJECT (main_window), "delete-event", G_CALLBACK (linphone_gtk_close), main_window); @@ -1768,11 +1759,11 @@ int main(int argc, char *argv[]){ g_thread_init(NULL); #endif gdk_threads_init(); - + progpath = strdup(argv[0]); - + config_file=linphone_gtk_get_config_file(NULL); - + #ifdef WIN32 /*workaround for windows: sometimes LANG is defined to an integer value, not understood by gtk */ @@ -1813,13 +1804,13 @@ int main(int argc, char *argv[]){ gtk_rc_add_default_file("./gtkrc"); #endif gdk_threads_enter(); - + if (!gtk_init_with_args(&argc,&argv,_("A free SIP video-phone"), linphone_options,NULL,NULL)){ gdk_threads_leave(); return -1; } - + settings=gtk_settings_get_default(); g_type_class_unref (g_type_class_ref (GTK_TYPE_IMAGE_MENU_ITEM)); g_type_class_unref (g_type_class_ref (GTK_TYPE_BUTTON)); @@ -1854,18 +1845,20 @@ int main(int argc, char *argv[]){ /*never block termination:*/ g_signal_connect(G_OBJECT(theMacApp),"NSApplicationBlockTermination",(GCallback)on_block_termination,NULL); #endif - + the_ui=linphone_gtk_create_window("main"); - + + g_object_set_data(G_OBJECT(the_ui),"is_created",GINT_TO_POINTER(FALSE)); + linphone_gtk_create_log_window(); linphone_core_enable_logs_with_cb(linphone_gtk_log_handler); linphone_gtk_init_liblinphone(config_file, factory_config_file); - + g_set_application_name(app_name); pbuf=create_pixbuf(linphone_gtk_get_ui_config("icon",LINPHONE_ICON)); if (pbuf!=NULL) gtk_window_set_default_icon(pbuf); - + /* do not lower timeouts under 30 ms because it exhibits a bug on gtk+/win32, with cpu running 20% all the time...*/ gtk_timeout_add(30,(GtkFunction)linphone_gtk_iterate,(gpointer)linphone_gtk_get_core()); gtk_timeout_add(30,(GtkFunction)linphone_gtk_check_logs,(gpointer)NULL); diff --git a/gtk/main.ui b/gtk/main.ui index 8731a495..8edcd86d 100644 --- a/gtk/main.ui +++ b/gtk/main.ui @@ -7,6 +7,91 @@ False gtk-add + + False + + + True + False + 0 + none + + + True + False + 12 + + + True + False + 12 + + + True + False + + + True + False + + + True + True + False + + + False + False + 0 + + + + + False + True + 0 + + + + + True + False + <b>Callee name</b> + True + right + end + + + True + True + 1 + + + + + 90 + 10 + True + False + + + False + False + 2 + + + + + + + + + + + + + + False @@ -120,80 +205,47 @@ False - + True False 0 none - + True False - 12 - + + + + True False - - True - False - - - True - False - <b>Callee name</b> - True - right - end - - - True - True - end - 0 - - - - - True - True - False - - - False - False - 1 - - - - - True - True - 0 - - - - - 170 - 30 + + End conference True - False + True + True + False False False end - 1 + 0 + + True + True + end + 1 + - - - @@ -309,12 +361,11 @@ False True - - True - True - False - half - + + True + False + gtk-missing-image + 1 False @@ -411,11 +462,21 @@ - + True False + 2 + 3 True - spread + + + Video + True + True + True + False + + Pause @@ -425,39 +486,67 @@ - False - False - 0 + 1 + 2 + + + + + Mute + True + True + True + False + half + + + + 2 + 3 + + + + + Transfer + True + True + True + False + + + 1 + 2 - Stop + Hang up True True True False - - False - False - 1 + 1 + 2 + 1 + 2 - - Video + + Conference True True True False - False - False - 2 + 2 + 3 + 1 + 2 @@ -909,6 +998,7 @@ True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True + False 0 @@ -1307,10 +1397,6 @@ False True True - - - - True @@ -1501,7 +1587,7 @@ never - 266 + 350 True True False diff --git a/gtk/parameters.ui b/gtk/parameters.ui index 7e76c385..61d357da 100644 --- a/gtk/parameters.ui +++ b/gtk/parameters.ui @@ -166,7 +166,6 @@ False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Settings - linphone2.png @@ -1511,50 +1510,6 @@ 3 - - - True - True - False - - - - True - False - - - True - False - gtk-network - - - True - True - 0 - - - - - True - False - Register to FONICS -virtual network ! - - - True - True - 1 - - - - - - - False - False - 4 - - False diff --git a/gtk/password.ui b/gtk/password.ui index 2d9f5324..a355c184 100644 --- a/gtk/password.ui +++ b/gtk/password.ui @@ -8,7 +8,6 @@ Linphone - Authentication required True center-on-parent - linphone2.png dialog False diff --git a/gtk/sip_account.ui b/gtk/sip_account.ui index 3a1dac37..60b751cf 100644 --- a/gtk/sip_account.ui +++ b/gtk/sip_account.ui @@ -13,7 +13,6 @@ 5 Linphone - Configure a SIP account center-on-parent - linphone2.png dialog diff --git a/gtk/tunnel_config.ui b/gtk/tunnel_config.ui index a940a5f7..e0baf91f 100644 --- a/gtk/tunnel_config.ui +++ b/gtk/tunnel_config.ui @@ -22,7 +22,6 @@ 5 Configure VoIP tunnel center-on-parent - linphone2.png dialog diff --git a/gtk/waiting.ui b/gtk/waiting.ui index 4413dfab..d2ca9ad8 100644 --- a/gtk/waiting.ui +++ b/gtk/waiting.ui @@ -6,7 +6,6 @@ False True GTK_WIN_POS_CENTER_ON_PARENT - linphone2.png False diff --git a/pixmaps/Makefile.am b/pixmaps/Makefile.am index 706a81cc..a7ee4ecb 100644 --- a/pixmaps/Makefile.am +++ b/pixmaps/Makefile.am @@ -5,7 +5,6 @@ pixmapdir=$(datadir)/pixmaps/linphone pixmap_DATA= \ hold_on.png hold_off.png \ mic_muted.png mic_active.png \ -linphone-3-250x130.png linphone-3.png linphone2-57x57.png \ linphone.png linphone-banner.png \ status-green.png \ status-orange.png \ @@ -13,6 +12,7 @@ status-red.png \ status-offline.png \ call.png \ chat.png \ +chat_message_inprogress.png chat_message_delivered.png chat_message_not_delivered.png\ contact-orange.png dialer-orange.png history-orange.png\ startcall-green.png stopcall-red.png addcall-green.png linphone.icns \ contact_starred.png contact_unstarred.png \ diff --git a/pixmaps/active_chat.png b/pixmaps/active_chat.png new file mode 100644 index 00000000..e428845d Binary files /dev/null and b/pixmaps/active_chat.png differ diff --git a/pixmaps/addcall-green.png b/pixmaps/addcall-green.png index fe9b13ef..9de8463c 100644 Binary files a/pixmaps/addcall-green.png and b/pixmaps/addcall-green.png differ diff --git a/pixmaps/call.png b/pixmaps/call.png index 0ae53360..7edf5355 100644 Binary files a/pixmaps/call.png and b/pixmaps/call.png differ diff --git a/pixmaps/chat.png b/pixmaps/chat.png index 98f6fafc..50a23af5 100644 Binary files a/pixmaps/chat.png and b/pixmaps/chat.png differ diff --git a/pixmaps/chat_message_delivered.png b/pixmaps/chat_message_delivered.png new file mode 100644 index 00000000..5cb74655 Binary files /dev/null and b/pixmaps/chat_message_delivered.png differ diff --git a/pixmaps/chat_message_inprogress.png b/pixmaps/chat_message_inprogress.png new file mode 100644 index 00000000..2ffcbca3 Binary files /dev/null and b/pixmaps/chat_message_inprogress.png differ diff --git a/pixmaps/chat_message_not_delivered.png b/pixmaps/chat_message_not_delivered.png new file mode 100644 index 00000000..cf9c610c Binary files /dev/null and b/pixmaps/chat_message_not_delivered.png differ diff --git a/pixmaps/green.png b/pixmaps/green.png deleted file mode 100644 index 0005537c..00000000 Binary files a/pixmaps/green.png and /dev/null differ diff --git a/pixmaps/linphone-3-250x130.png b/pixmaps/linphone-3-250x130.png deleted file mode 100644 index 020e943b..00000000 Binary files a/pixmaps/linphone-3-250x130.png and /dev/null differ diff --git a/pixmaps/linphone-3.png b/pixmaps/linphone-3.png deleted file mode 100644 index 92faf793..00000000 Binary files a/pixmaps/linphone-3.png and /dev/null differ diff --git a/pixmaps/linphone2-57x57.png b/pixmaps/linphone2-57x57.png deleted file mode 100644 index a0f53163..00000000 Binary files a/pixmaps/linphone2-57x57.png and /dev/null differ diff --git a/pixmaps/linphone2.png b/pixmaps/linphone2.png deleted file mode 100644 index d1bf1ab6..00000000 Binary files a/pixmaps/linphone2.png and /dev/null differ diff --git a/pixmaps/linphone2.xpm b/pixmaps/linphone2.xpm deleted file mode 100644 index 717f8c42..00000000 --- a/pixmaps/linphone2.xpm +++ /dev/null @@ -1,883 +0,0 @@ -/* XPM */ -static char * linphone2_xpm[] = { -"50 45 835 2", -" c None", -". c #211F1D", -"+ c #53514E", -"@ c #5F5D59", -"# c #7D7C78", -"$ c #605F5C", -"% c #94928C", -"& c #95938D", -"* c #7B7A77", -"= c #605E5C", -"- c #353432", -"; c #585754", -"> c #84827D", -", c #B9B6B0", -"' c #D9D5CE", -") c #DFDBD3", -"! c #EAE6DE", -"~ c #EFEBE2", -"{ c #EEEAE1", -"] c #EFEBE3", -"^ c #EEEAE2", -"/ c #75726D", -"( c #5E5C58", -"_ c #7D7B77", -": c #BAB6AF", -"< c #E5E1D8", -"[ c #DAD7CF", -"} c #C8C4BD", -"| c #898782", -"1 c #949089", -"2 c #938F88", -"3 c #5B5854", -"4 c #45433F", -"5 c #4D4943", -"6 c #5F5C56", -"7 c #A5A199", -"8 c #DCD5C5", -"9 c #6F6B63", -"0 c #42413F", -"a c #A19E97", -"b c #DAD6CE", -"c c #EDE9E1", -"d c #D4D0C9", -"e c #96928C", -"f c #63605B", -"g c #827C73", -"h c #6F6961", -"i c #90877A", -"j c #8E8578", -"k c #B4A999", -"l c #B9AD9D", -"m c #C0B5A3", -"n c #BCB1A0", -"o c #858075", -"p c #C3BCAE", -"q c #EAE5DB", -"r c #E0D9C9", -"s c #C5BDAE", -"t c #20201E", -"u c #8D8B86", -"v c #CAC7C1", -"w c #D2CEC6", -"x c #918F89", -"y c #5D5A56", -"z c #A0998F", -"A c #827B6F", -"B c #C0B4A2", -"C c #C2B7A5", -"D c #C1B6A4", -"E c #8A8174", -"F c #94918B", -"G c #C7C3BB", -"H c #AFAAA1", -"I c #938B7E", -"J c #646058", -"K c #D8D1C3", -"L c #ECE7DE", -"M c #EBE7DD", -"N c #E4DED0", -"O c #DED6C5", -"P c #57544D", -"Q c #202020", -"R c #7E7C77", -"S c #DFDCD4", -"T c #F0ECE4", -"U c #EDE9E0", -"V c #ECE8E1", -"W c #B6B2AB", -"X c #77736E", -"Y c #767067", -"Z c #A3998B", -"` c #BCB09F", -" . c #C3B7A6", -".. c #BFB3A1", -"+. c #C3B8A7", -"@. c #BFB4A2", -"#. c #BDB2A1", -"$. c #3E3B35", -"%. c #BBB4A6", -"&. c #A7A39C", -"*. c #ECE9E1", -"=. c #77736A", -"-. c #E7E1D5", -";. c #E3DDCE", -">. c #8F897F", -",. c #22201E", -"'. c #91908C", -"). c #EFECE3", -"!. c #EBE7DE", -"~. c #878581", -"{. c #5B574F", -"]. c #7F786C", -"^. c #8D867A", -"/. c #9C9994", -"(. c #98958F", -"_. c #837B6E", -":. c #C4B9A7", -"<. c #958B7E", -"[. c #736D62", -"}. c #4E4942", -"|. c #4C4842", -"1. c #383632", -"2. c #99968F", -"3. c #ECE8DE", -"4. c #7C7972", -"5. c #CCC6BB", -"6. c #E9E4D9", -"7. c #EDE8DF", -"8. c #E1D9C9", -"9. c #BFB8A9", -"0. c #1A1A1A", -"a. c #C3BFB8", -"b. c #CFCCC4", -"c. c #85827C", -"d. c #56514A", -"e. c #A69C8D", -"f. c #BFB3A2", -"g. c #C2B7A6", -"h. c #B4AA9A", -"i. c #757168", -"j. c #706D68", -"k. c #918E88", -"l. c #464441", -"m. c #97948E", -"n. c #C9C6BF", -"o. c #8C8A85", -"p. c #8E897F", -"q. c #999488", -"r. c #817E77", -"s. c #C1BEB7", -"t. c #807D75", -"u. c #8A8377", -"v. c #6E6A63", -"w. c #A8A49C", -"x. c #EAE4D9", -"y. c #E4DDCF", -"z. c #D8D0C0", -"A. c #AFA99C", -"B. c #848076", -"C. c #BFBBB4", -"D. c #B1AEA8", -"E. c #47443F", -"F. c #5C5851", -"G. c #686259", -"H. c #B0A595", -"I. c #B7AC9B", -"J. c #817A6F", -"K. c #7E7A70", -"L. c #AEA99D", -"M. c #9A9791", -"N. c #EEE9E1", -"O. c #E6E2DA", -"P. c #CCC8BF", -"Q. c #E3DCCE", -"R. c #86827A", -"S. c #C6C3BC", -"T. c #7C7974", -"U. c #4A4642", -"V. c #6E685F", -"W. c #89837A", -"X. c #7B7873", -"Y. c #9A9892", -"Z. c #827D73", -"`. c #56534C", -" + c #6A675E", -".+ c #E2DBCC", -"++ c #EDE9DF", -"@+ c #DED8CC", -"#+ c #DDD5C4", -"$+ c #C4BDAE", -"%+ c #6F6B62", -"&+ c #312F2B", -"*+ c #6D6960", -"=+ c #A19B8F", -"-+ c #E5E1DA", -";+ c #7F7D79", -">+ c #CFCBC3", -",+ c #ACA9A2", -"'+ c #B6B1A8", -")+ c #B4B0AA", -"!+ c #827F7A", -"~+ c #444340", -"{+ c #262524", -"]+ c #C1BEB8", -"^+ c #9A968D", -"/+ c #242322", -"(+ c #CEC7B7", -"_+ c #DFD8C7", -":+ c #E6E0D3", -"<+ c #747067", -"[+ c #D3CCBC", -"}+ c #857F74", -"|+ c #595856", -"1+ c #CCC8C2", -"2+ c #D4D1C9", -"3+ c #ECE8DF", -"4+ c #CFCBC4", -"5+ c #93918C", -"6+ c #2F2E2C", -"7+ c #312F2C", -"8+ c #969185", -"9+ c #BAB3A5", -"0+ c #B1AB9D", -"a+ c #363532", -"b+ c #E2DED5", -"c+ c #676360", -"d+ c #4C4B4A", -"e+ c #767471", -"f+ c #75736D", -"g+ c #5B5956", -"h+ c #928D81", -"i+ c #E5DFD2", -"j+ c #EEE9E0", -"k+ c #EBE6DB", -"l+ c #C0B9AB", -"m+ c #A7A195", -"n+ c #8D887E", -"o+ c #C4BCAD", -"p+ c #BCB8B1", -"q+ c #D5D1C9", -"r+ c #7A746D", -"s+ c #AEABA4", -"t+ c #B2AFA8", -"u+ c #98948D", -"v+ c #7D7A76", -"w+ c #69655D", -"x+ c #9B9589", -"y+ c #A9A396", -"z+ c #A7A49F", -"A+ c #D8D2C9", -"B+ c #948F83", -"C+ c #454340", -"D+ c #D7D3CC", -"E+ c #63615E", -"F+ c #141414", -"G+ c #000000", -"H+ c #53504A", -"I+ c #EBE7DC", -"J+ c #E4DDD0", -"K+ c #898479", -"L+ c #ADA79A", -"M+ c #CBC3B4", -"N+ c #89847A", -"O+ c #CDC6B6", -"P+ c #AAA59C", -"Q+ c #9F9D98", -"R+ c #E6E2D9", -"S+ c #AFACA7", -"T+ c #615F5C", -"U+ c #201F1D", -"V+ c #66625B", -"W+ c #AEA89A", -"X+ c #AEA89B", -"Y+ c #B7B0A2", -"Z+ c #070707", -"`+ c #E0DED9", -" @ c #CFC7B8", -".@ c #6B6863", -"+@ c #63625E", -"@@ c #DBD3C3", -"#@ c #534D46", -"$@ c #807E7B", -"%@ c #DDD9D1", -"&@ c #36322E", -"*@ c #4B4A49", -"=@ c #6E6C67", -"-@ c #E5DED1", -";@ c #E9E4D8", -">@ c #EFEAE2", -",@ c #E2DCD0", -"'@ c #8F8A7F", -")@ c #999387", -"!@ c #4E4B45", -"~@ c #6B665E", -"{@ c #47433D", -"]@ c #D4CDC0", -"^@ c #E8E3DA", -"/@ c #1F1E1E", -"(@ c #65615A", -"_@ c #ADA699", -":@ c #949494", -"<@ c #BEBEBC", -"[@ c #DAD2C2", -"}@ c #7F7B74", -"|@ c #4D4D4D", -"1@ c #959084", -"2@ c #DAD5C9", -"3@ c #B9B1A2", -"4@ c #3C3934", -"5@ c #989693", -"6@ c #B1ADA5", -"7@ c #76746F", -"8@ c #4C4A44", -"9@ c #DCD4C3", -"0@ c #E9E3D8", -"a@ c #DCD8CE", -"b@ c #A6A49E", -"c@ c #9C9890", -"d@ c #7B776D", -"e@ c #55534E", -"f@ c #B5B3AD", -"g@ c #474440", -"h@ c #D0C9B9", -"i@ c #E7E2D7", -"j@ c #65635D", -"k@ c #4F4E4C", -"l@ c #B7B1A3", -"m@ c #B7B3A9", -"n@ c #96948E", -"o@ c #BCBBBB", -"p@ c #BCB6A9", -"q@ c #ABA6A1", -"r@ c #8E8C87", -"s@ c #161514", -"t@ c #545350", -"u@ c #B9B1A1", -"v@ c #958F84", -"w@ c #8C867B", -"x@ c #81796E", -"y@ c #BFB4A3", -"z@ c #C6BBAA", -"A@ c #5E5B53", -"B@ c #96938D", -"C@ c #696762", -"D@ c #DFD7C7", -"E@ c #C6C2B9", -"F@ c #817C72", -"G@ c #B3AC9F", -"H@ c #B5AFA4", -"I@ c #6C6964", -"J@ c #DFD8C9", -"K@ c #9C9C9B", -"L@ c #716E6A", -"M@ c #B8B1A3", -"N@ c #2A2926", -"O@ c #625F58", -"P@ c #E0D8C9", -"Q@ c #C1BAAB", -"R@ c #252321", -"S@ c #E1DDD5", -"T@ c #7B7977", -"U@ c #625E57", -"V@ c #322F2A", -"W@ c #C4B9A8", -"X@ c #D1C7B6", -"Y@ c #C1B5A4", -"Z@ c #C8BEAC", -"`@ c #9A9387", -" # c #2D2C28", -".# c #595752", -"+# c #A29D94", -"@# c #D5CEBD", -"## c #CBC4B4", -"$# c #DBD3C2", -"%# c #A09C94", -"&# c #C1C1C1", -"*# c #95938E", -"=# c #7F7A70", -"-# c #8B867C", -";# c #D6D0C4", -"># c #C9C2B3", -",# c #7C7B78", -"'# c #BEBBB5", -")# c #D1CABA", -"!# c #44423F", -"~# c #D6D2CA", -"{# c #3A3835", -"]# c #262421", -"^# c #33302C", -"/# c #69645B", -"(# c #8B8478", -"_# c #5F5951", -":# c #605C53", -"<# c #67635B", -"[# c #BFB8AA", -"}# c #928D82", -"|# c #B8B2A4", -"1# c #938F85", -"2# c #989287", -"3# c #89857C", -"4# c #706E6A", -"5# c #DED7C6", -"6# c #928F88", -"7# c #979797", -"8# c #B4AEA2", -"9# c #918C81", -"0# c #68645C", -"a# c #979286", -"b# c #4A4741", -"c# c #5E5D5A", -"d# c #B2AFAA", -"e# c #47453F", -"f# c #C2BBAC", -"g# c #B5AEA0", -"h# c #D4CDBC", -"i# c #CAC7C0", -"j# c #B5AEA1", -"k# c #CCC4B5", -"l# c #ACABA7", -"m# c #797979", -"n# c #757169", -"o# c #BDB6A7", -"p# c #68655D", -"q# c #A09B92", -"r# c #D1CABB", -"s# c #8D887D", -"t# c #80807F", -"u# c #C5BEAF", -"v# c #1E1D1B", -"w# c #A3A099", -"x# c #888681", -"y# c #6A6864", -"z# c #B3AEA3", -"A# c #4D4A44", -"B# c #D6CFBE", -"C# c #A29E95", -"D# c #C1BAAC", -"E# c #918C82", -"F# c #6D6961", -"G# c #B9B3A5", -"H# c #979084", -"I# c #3A3836", -"J# c #BDBBB7", -"K# c #C7C0B1", -"L# c #6C6860", -"M# c #D2CBBB", -"N# c #393836", -"O# c #66635D", -"P# c #A19D94", -"Q# c #656461", -"R# c #32302C", -"S# c #CCC5B5", -"T# c #DEDAD1", -"U# c #B1ACA3", -"V# c #7C7C7C", -"W# c #B5B4B1", -"X# c #5A5853", -"Y# c #4F4C46", -"Z# c #A09A8E", -"`# c #76726A", -" $ c #88857F", -".$ c #4B4843", -"+$ c #DAD2C1", -"@$ c #B4ADA0", -"#$ c #B7B4AF", -"$$ c #CCC9C2", -"%$ c #282623", -"&$ c #888378", -"*$ c #262522", -"=$ c #A8A194", -"-$ c #9A9388", -";$ c #BEB7A8", -">$ c #E3DCCD", -",$ c #D1CEC6", -"'$ c #ACA699", -")$ c #AFA99B", -"!$ c #B2ADA2", -"~$ c #A09D97", -"{$ c #C0BCB5", -"]$ c #B0A99C", -"^$ c #7A776F", -"/$ c #99958E", -"($ c #8A8681", -"_$ c #777068", -":$ c #B3AB9D", -"<$ c #131211", -"[$ c #5D5A53", -"}$ c #090908", -"|$ c #8C877C", -"1$ c #C7C1B4", -"2$ c #D3CEC5", -"3$ c #EAE5DA", -"4$ c #83817D", -"5$ c #C7C0B0", -"6$ c #484743", -"7$ c #C3BFB7", -"8$ c #C7C1B3", -"9$ c #9E998F", -"0$ c #CCC9C1", -"a$ c #C3C0B8", -"b$ c #817E78", -"c$ c #7F786E", -"d$ c #AFA494", -"e$ c #ABA396", -"f$ c #474645", -"g$ c #BCB9B3", -"h$ c #9B9893", -"i$ c #2B2926", -"j$ c #070706", -"k$ c #74716D", -"l$ c #B7B4AD", -"m$ c #484641", -"n$ c #504D47", -"o$ c #DBD6CC", -"p$ c #65615B", -"q$ c #DCD5C6", -"r$ c #B3ADA1", -"s$ c #A8A296", -"t$ c #949086", -"u$ c #999690", -"v$ c #AAA6A0", -"w$ c #6D675F", -"x$ c #A09789", -"y$ c #C2B6A5", -"z$ c #6C6259", -"A$ c #66645F", -"B$ c #2D2D2D", -"C$ c #64615B", -"D$ c #2F2D2A", -"E$ c #8B8781", -"F$ c #64625D", -"G$ c #0A0908", -"H$ c #393733", -"I$ c #C2BAAB", -"J$ c #D9D5CD", -"K$ c #9C978C", -"L$ c #CFC8B8", -"M$ c #9C968A", -"N$ c #928D83", -"O$ c #98958E", -"P$ c #CBC8C0", -"Q$ c #B1ADA7", -"R$ c #8D8A84", -"S$ c #878177", -"T$ c #B4AA9B", -"U$ c #B3A898", -"V$ c #7A7368", -"W$ c #706E6B", -"X$ c #292826", -"Y$ c #A9A499", -"Z$ c #3F3E3C", -"`$ c #1B1A18", -" % c #9F9C96", -".% c #2D2A27", -"+% c #C8C1B1", -"@% c #E6DFD2", -"#% c #C0BDB7", -"$% c #8C8982", -"%% c #C7C3BC", -"&% c #8E8B84", -"*% c #958E86", -"=% c #837B6F", -"-% c #AFA595", -";% c #80796E", -">% c #31302D", -",% c #8F8C87", -"'% c #74726E", -")% c #5E5C57", -"!% c #393430", -"~% c #413F3B", -"{% c #413C37", -"]% c #605E5A", -"^% c #22201D", -"/% c #0C0B0A", -"(% c #E9E4DA", -"_% c #D6CFC2", -":% c #7E766A", -"<% c #C0B4A3", -"[% c #C1B6A5", -"}% c #605B52", -"|% c #97938B", -"1% c #181817", -"2% c #0A0A0A", -"3% c #8D8981", -"4% c #787369", -"5% c #D4CFC6", -"6% c #DCD6C9", -"7% c #CAC6BC", -"8% c #A5A096", -"9% c #78756E", -"0% c #726E65", -"a% c #4A4742", -"b% c #605E59", -"c% c #363433", -"d% c #0B0A0A", -"e% c #BFB5A5", -"f% c #C3B8A6", -"g% c #6C6359", -"h% c #7C786E", -"i% c #46433D", -"j% c #55534F", -"k% c #BAB5AB", -"l% c #E1DACA", -"m% c #B1AA9C", -"n% c #928B80", -"o% c #ACA598", -"p% c #CCC5B8", -"q% c #E1DACB", -"r% c #CFC9BE", -"s% c #44413C", -"t% c #23221F", -"u% c #AFA89B", -"v% c #D5CCBB", -"w% c #BEB2A1", -"x% c #A59A8B", -"y% c #5C564D", -"z% c #0F0F0E", -"A% c #65625C", -"B% c #B8B4AE", -"C% c #AAA498", -"D% c #55514B", -"E% c #332F2A", -"F% c #47443E", -"G% c #252320", -"H% c #3A3833", -"I% c #6B665C", -"J% c #857D71", -"K% c #90887B", -"L% c #CBC1B0", -"M% c #CBC1AF", -"N% c #DED7CA", -"O% c #9B968A", -"P% c #59554E", -"Q% c #B5AB9C", -"R% c #7B7469", -"S% c #57524A", -"T% c #040303", -"U% c #2F2D29", -"V% c #BEBBB4", -"W% c #D2CEC3", -"X% c #1D1C1A", -"Y% c #292827", -"Z% c #1C1A18", -"`% c #090807", -" & c #181613", -".& c #807A6E", -"+& c #DCD5C7", -"@& c #B8B2A5", -"#& c #191815", -"$& c #B8B0A2", -"%& c #C9C1B2", -"&& c #6A6259", -"*& c #AEA393", -"=& c #625D54", -"-& c #010100", -";& c #353431", -">& c #76736C", -",& c #C8C5BD", -"'& c #979287", -")& c #3A3733", -"!& c #413E39", -"~& c #8A8680", -"{& c #BFB8AB", -"]& c #3A3631", -"^& c #494440", -"/& c #3C3731", -"(& c #28231F", -"_& c #181715", -":& c #040404", -"<& c #3D3933", -"[& c #B9B1A3", -"}& c #85827B", -"|& c #080807", -"1& c #645F57", -"2& c #8F897E", -"3& c #71675D", -"4& c #B5AB9A", -"5& c #766E63", -"6& c #38342F", -"7& c #0D0C0B", -"8& c #0D0B0A", -"9& c #33312D", -"0& c #D5CFC4", -"a& c #DBD4C5", -"b& c #534E48", -"c& c #030303", -"d& c #5E5D5E", -"e& c #535153", -"f& c #666460", -"g& c #3D3B39", -"h& c #79756B", -"i& c #43413B", -"j& c #B9B4A9", -"k& c #D5D0C6", -"l& c #CEC8BC", -"m& c #BDB6A9", -"n& c #97948F", -"o& c #D5CEC0", -"p& c #B2AC9E", -"q& c #ADA293", -"r& c #797166", -"s& c #151412", -"t& c #76736D", -"u& c #DBD4C8", -"v& c #D9D2C1", -"w& c #2E2B28", -"x& c #171615", -"y& c #454243", -"z& c #2C2B2A", -"A& c #68655E", -"B& c #807C75", -"C& c #BAB5AA", -"D& c #D0CABD", -"E& c #D9D1C0", -"F& c #E1DACD", -"G& c #DCD3C3", -"H& c #D0C7B7", -"I& c #D6CEBE", -"J& c #A8A299", -"K& c #54524D", -"L& c #0B0A09", -"M& c #5E5A53", -"N& c #9C9486", -"O& c #948C7E", -"P& c #544F47", -"Q& c #0D0C0A", -"R& c #DDD7CC", -"S& c #E4DFD3", -"T& c #AFAA9F", -"U& c #847F76", -"V& c #BFB7AB", -"W& c #E5DFD1", -"X& c #E8E3D7", -"Y& c #C6BBA9", -"Z& c #C8BDAC", -"`& c #B8AE9F", -" * c #756F65", -".* c #46413B", -"+* c #6A665D", -"@* c #B0AA9C", -"#* c #D7CFBF", -"$* c #E0D8C8", -"%* c #B8B2A7", -"&* c #5B5851", -"** c #272623", -"=* c #191513", -"-* c #413F3A", -";* c #4B4842", -">* c #87837B", -",* c #B7B2A9", -"'* c #A6A199", -")* c #E7E1D4", -"!* c #D7CEBD", -"~* c #D9D1C2", -"{* c #CDC4B3", -"]* c #B1A89A", -"^* c #837D73", -"/* c #534F48", -"(* c #373531", -"_* c #22211F", -":* c #C7BFB0", -"<* c #3F3D38", -"[* c #A8A295", -"}* c #BAB5A9", -"|* c #3B3935", -"1* c #706C63", -"2* c #91887C", -"3* c #C1B7A7", -"4* c #B7AD9D", -"5* c #69645C", -"6* c #74716B", -"7* c #A19D95", -"8* c #918B82", -"9* c #484640", -"0* c #636058", -"a* c #68635B", -"b* c #38332F", -"c* c #0E0C0B", -"d* c #837E73", -"e* c #34322E", -"f* c #050505", -"g* c #060606", -"h* c #060505", -"i* c #12100E", -"j* c #78746C", -"k* c #C5C0B5", -"l* c #AFABA1", -"m* c #44433F", -"n* c #100E0C", -"o* c #21201D", -"p* c #6C6963", -"q* c #D0CBBF", -"r* c #53504B", -"s* c #4E4B44", -"t* c #CCC5B6", -"u* c #72716C", -"v* c #6E6C66", -"w* c #43403B", -"x* c #B0AA9F", -"y* c #85817A", -"z* c #D5CFC3", -"A* c #8C887E", -"B* c #2D2C2A", -"C* c #2A2723", -"D* c #65635E", -"E* c #BCB7AC", -"F* c #66625A", -"G* c #7F796F", -"H* c #96928A", -"I* c #CCC7BE", -"J* c #B5B1A9", -"K* c #938F86", -"L* c #CCC8BE", -"M* c #1E1C1A", -"N* c #817D73", -"O* c #191715", -"P* c #726D64", -"Q* c #747069", -"R* c #E8E2D6", -"S* c #99958B", -"T* c #E5E0D3", -"U* c #7F7C73", -"V* c #666159", -"W* c #1A1917", -"X* c #131110", -"Y* c #726E66", -"Z* c #45433E", -"`* c #D9D1C1", -" = c #1E1B19", -".= c #CDC5B5", -"+= c #A7A194", -"@= c #242220", -"#= c #42403B", -"$= c #060605", -"%= c #484540", -" ", -" . + @ # $ % & % * = ", -" - ; > , ' ) ! ~ { ] { ] { ~ ^ / ", -" ( _ : < ~ ^ ~ ^ [ } | 1 2 3 4 5 6 7 8 9 ", -" 0 a b ^ ^ ~ c d e f g h i j k l m n o p q r s ", -" t u v { ] { w x y z A B C m D E F G H I J K L M N O P ", -" Q R S T U V W X Y Z ` ...+.@.C #.$.%.&.*.=.O -.{ ;.O O >. ", -" ,.'.^ { ).!.~.{.].#.^./.(._.:.<.[.}.|.1.O 2.3.4.5.6.] 7.-.8.9. ", -" 0.a.{ ^ b.c.d.e.f.g.h.i.j.c k.l.m.n.o.p.q.O r.s.t.u.v.w.x.y.O z. ", -" A.B.C.D.9 E.F.G.H.I.J.K.L.] M.).N.] { O.P.Q.R.S.T.U.V.W.X.Y.R.Z.`. ", -" +O .+++@+O O #+$+%+&+*+=+p.-+;+{ ] ^ ~ ^ ^ ^ U >+,+'+)+!+~+{+]+^+ ", -" /+(+_+U N.:+O O O O <+[+O }+|+1+^ ~ [ 2+^ ^ 3+4+5+@ 6+7+8+9+0+a+b+c+ ", -" d+e+f+g+h+i+j+k+j+:+O O l+m+n+O o+p+q+M.r+s+t+u+v+y w+x+y+8+z+A+O O B+C+D+E+ ", -" d+u F+G+H+#+;.I+^ ] J+O K+L+M+N+O O+P+Q+R+S+T+U+V+W+X+Y+Z+`+ @.@+@O O @@#@$@%@&@ ", -" *@=@G+ B+-@;@] >@{ ,@'@)@O M+!@~@{@]@^@/@(@_@O y.:@<@[@}@|@[@Y+1@2@O O 3@4@5@6@ ", -" 7@ 8@9@0@a@b@c@d@O O O e@f@g@h@O i@j@O O O h@_ k@l@O m@n@Q.H o@p@O O O &+q@r@ ", -" s@t@ G+u@v@w@x@y@z@O O A@B@C@(+O O D@E@F@O O O G@H@I@r J@K@L@M@N@O@P@O O Q@R@S@T@ ", -" U@<+ V@W@X@Y@Z@:.`@ #.#+#@#O O O O Q.1 ##O O $#%#&#*#$+=#-#;#>#,#'#)#O O K+!#~#{# ", -" w+i.]# ^#/#(#_#:#<#[#}#|#O O O O O O q 1#O O O $#2#3#4#5#6#7#8#9#0#a#O O O b#c#d# ", -" e#f# e#>#g#h#O O O O O O O O O O y.i#j#O O O k#l#m#n#o#p#q#r#s#t#5.O O u#v#w#x# ", -" y#z# A#B#O O O O O O O O O O O O O y.C#O+O O O D#E#F#G#H#I#J#K#T+L#M#O O Y+N#4+O# ", -" P#Q# R#S#O O O O O O O O O O O O O T#/ #+O O O U#V#W#9+X#Y#Z#`# $.$+$#+@$.@#$$$ ", -" %$&$ *$=$O O -$8+;$O O O O O O O >$,$'$O O O O 8@i.)$!$~${$L i+]$^$/$: ($_$:$G+", -" <$[$U@ }$|$1$s+2$=.O O O O O O O O 3$4$Q@O O O 5$6$7${ 3$8$9$u+0$a$b$c$d$@.e$G+", -" f$g$h$i$ j$k$l$m$n$9#O O O O O O O O 5#o$p$)#O O O q$r$s$t$u$b+v$w$x$n Y@Y@y$z$A$", -" B$C$D$ E$F$G$H$I$9#O O O O O O O O O N J$K$L$M$N$O$P$Q$R$S$T$U$m D Y@D D Y@V$W$", -" X$Y$Z$ `$ % .%+%w+O O O O O O O O O O @%#%$%%%0$&%*%=%-%D Y@D Y@D Y@D D Y@;%4#", -" >%,%'%)% !%~%{% R@]% ^%/%S$[@O O O O O O O O D@(%_%&$:%d$Y@D D m y$<%C m D Y@Y@[%}%F$", -" |%1% 2%`$3%4%5%;@N 6%7%8%9%0%a%b%c%d%H+K#O O O O O O O O e% .f. .<%y$D m C @.f%@.C m D D U$g% ", -" [$h%i%j%k%l%O m%k#n%o%p%-@++q%0@:+r%h%s%t%u%O O O O O O O v%..:.f.g.m D y$B f%w%+.@.C x%y%z% ", -" A%B%C%l%$+D%E%F%G%H%H%I%J%K%L%M%N%;.y.O%<$P%5$O O O O +$Q%+.w%f%B y$D m g.f.:...R%S%T%G+ ", -" U%V%W%z.s#X%Y%Z%G+G+G+G+G+G+j$`% &.&+&3$N @&#&v#$&O O O %&&&@.f%@.C m D y$<%*&=&}$-& ", -" ;&>&,&'&)&!&Q ~&{&]&G+ ^&/&(&_&:&<&[&:+D@}&G+|&1&z.O 2&3&C <%y$m D 4&5&6&7&8& ", -" 9&0&a&b&c&d&e&f&g&h&Z%i&a+j&k&l&>+m&n&>%P%L%O o&G+ G+^#p&h%{.Y@D q&r&6&s&G+ ", -" t&u&v&w&x&y&z&A&B&C&D&E&8 F&G&H&I&y.-.3$J&b#O K&G+ L&M&N&O&P&Q&G+ ", -"n$R&S&T&U&u#V&]@W&X&;.+$Y&Z&`& *.*+*@*#*$*%*&*=#**G+ =*G+G+ ", -"-*;*>*,*'*)*!*-@~*{*]*^*/*(*_*H%M$:*<*U@[*#+}***G+ ", -" |*1*=$2*3*4*5*.$G+6*7*8*8&v#9*0*a*H+b*c*M@+$d*e* ", -" f*g*h*i* U+-#E#N j*G+G+ k*l*m*n* ", -" o*u%p*q*r*G+ s*t*u*v*G+ ", -" w*x*y*z*A*B*C* D*E*[*}$G+ ", -" L#F*G*H*I*J*p@K*L*M#M*N*O* ", -" b#P*(+Q*R*S*T*U*l+1.V*W* ", -" X*Y*Z*`* =.=X%+=@=G+ ", -" #=$=%=G+ "}; diff --git a/pixmaps/oldlogo.png b/pixmaps/oldlogo.png deleted file mode 100644 index 06cf1831..00000000 Binary files a/pixmaps/oldlogo.png and /dev/null differ diff --git a/pixmaps/red.png b/pixmaps/red.png deleted file mode 100644 index e6136b3f..00000000 Binary files a/pixmaps/red.png and /dev/null differ diff --git a/pixmaps/sip-away.png b/pixmaps/sip-away.png deleted file mode 100644 index ba7580fa..00000000 Binary files a/pixmaps/sip-away.png and /dev/null differ diff --git a/pixmaps/sip-bifm.png b/pixmaps/sip-bifm.png deleted file mode 100644 index 898a18a7..00000000 Binary files a/pixmaps/sip-bifm.png and /dev/null differ diff --git a/pixmaps/sip-busy.png b/pixmaps/sip-busy.png deleted file mode 100644 index 550e10a1..00000000 Binary files a/pixmaps/sip-busy.png and /dev/null differ diff --git a/pixmaps/sip-closed.png b/pixmaps/sip-closed.png deleted file mode 100644 index 6bbe0835..00000000 Binary files a/pixmaps/sip-closed.png and /dev/null differ diff --git a/pixmaps/sip-online.png b/pixmaps/sip-online.png deleted file mode 100644 index a6656ec5..00000000 Binary files a/pixmaps/sip-online.png and /dev/null differ diff --git a/pixmaps/sip-otl.png b/pixmaps/sip-otl.png deleted file mode 100644 index cc9023b8..00000000 Binary files a/pixmaps/sip-otl.png and /dev/null differ diff --git a/pixmaps/sip-otp.png b/pixmaps/sip-otp.png deleted file mode 100644 index 0df6f91a..00000000 Binary files a/pixmaps/sip-otp.png and /dev/null differ diff --git a/pixmaps/sip-wfa.png b/pixmaps/sip-wfa.png deleted file mode 100644 index d6fe73b4..00000000 Binary files a/pixmaps/sip-wfa.png and /dev/null differ