2 linphone, gtk-glade interface.
3 Copyright (C) 2008 Simon MORLAT (simon.morlat@linphone.org)
5 This program is free software; you can redistribute it and/or
6 modify it under the terms of the GNU General Public License
7 as published by the Free Software Foundation; either version 2
8 of the License, or (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22 static void fill_renderers(GtkTreeView *v){
25 r=gtk_cell_renderer_pixbuf_new();
27 c=gtk_tree_view_column_new_with_attributes("icon",r,"pixbuf",0,NULL);
28 gtk_tree_view_append_column (v,c);
30 r=gtk_cell_renderer_text_new ();
31 c=gtk_tree_view_column_new_with_attributes("sipaddress",r,"markup",1,NULL);
32 gtk_tree_view_append_column (v,c);
35 void call_log_selection_changed(GtkTreeView *v){
36 GtkTreeSelection *select;
38 GtkTreeModel *model=NULL;
40 select = gtk_tree_view_get_selection(v);
42 if (gtk_tree_selection_get_selected (select, &model, &iter)){
43 GtkTreePath *path=gtk_tree_model_get_path(model,&iter);
44 gtk_tree_view_collapse_all(v);
45 gtk_tree_view_expand_row(v,path,TRUE);
46 gtk_tree_path_free(path);
51 void linphone_gtk_call_log_chat_selected(GtkWidget *w){
52 GtkTreeSelection *select;
55 select=gtk_tree_view_get_selection(GTK_TREE_VIEW(w));
57 GtkTreeModel *model=NULL;
58 if (gtk_tree_selection_get_selected (select,&model,&iter)){
61 gtk_tree_model_get(model,&iter,2,&pla,-1);
62 la=(LinphoneAddress*)pla;
64 linphone_gtk_tree_view_set_chat_conversation(la);
70 void linphone_gtk_call_log_add_contact(GtkWidget *w){
71 GtkTreeSelection *select;
74 select=gtk_tree_view_get_selection(GTK_TREE_VIEW(w));
76 GtkTreeModel *model=NULL;
77 if (gtk_tree_selection_get_selected (select,&model,&iter)){
81 gtk_tree_model_get(model,&iter,2,&pla,-1);
82 la=(LinphoneAddress*)pla;
84 char *uri=linphone_address_as_string(la);
85 lf=linphone_friend_new_with_addr(uri);
86 linphone_gtk_show_contact(lf);
93 static bool_t put_selection_to_uribar(GtkWidget *treeview){
94 GtkTreeSelection *sel;
96 sel=gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
98 GtkTreeModel *model=NULL;
100 if (gtk_tree_selection_get_selected (sel,&model,&iter)){
103 gtk_tree_model_get(model,&iter,2,&la,-1);
104 tmp=linphone_address_as_string(la);
106 gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(linphone_gtk_get_main_window(),"uribar")),tmp);
114 static void linphone_gtk_call_selected(GtkTreeView *treeview){
115 put_selection_to_uribar(GTK_WIDGET(treeview));
116 linphone_gtk_start_call(linphone_gtk_get_widget(gtk_widget_get_toplevel(GTK_WIDGET(treeview)),
120 static GtkWidget *linphone_gtk_create_call_log_menu(GtkWidget *call_log){
121 GtkWidget *menu=gtk_menu_new();
122 GtkWidget *menu_item;
123 gchar *call_label=NULL;
124 gchar *text_label=NULL;
127 GtkTreeSelection *select;
130 select=gtk_tree_view_get_selection(GTK_TREE_VIEW(call_log));
132 GtkTreeModel *model=NULL;
133 if (gtk_tree_selection_get_selected (select,&model,&iter)){
136 gtk_tree_model_get(model,&iter,2,&pla,-1);
137 la=(LinphoneAddress*)pla;
138 name=linphone_address_as_string(la);
139 call_label=g_strdup_printf(_("Call %s"),name);
140 text_label=g_strdup_printf(_("Send text to %s"),name);
145 menu_item=gtk_image_menu_item_new_with_label(call_label);
146 image=gtk_image_new_from_stock(GTK_STOCK_NETWORK,GTK_ICON_SIZE_MENU);
147 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),image);
148 gtk_widget_show(image);
149 gtk_widget_show(menu_item);
150 gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item);
151 g_signal_connect_swapped(G_OBJECT(menu_item),"activate",(GCallback)linphone_gtk_call_selected,call_log);
154 menu_item=gtk_image_menu_item_new_with_label(text_label);
155 image=gtk_image_new_from_stock(GTK_STOCK_NETWORK,GTK_ICON_SIZE_MENU);
156 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),image);
157 gtk_widget_show(image);
158 gtk_widget_show(menu_item);
159 gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item);
160 g_signal_connect_swapped(G_OBJECT(menu_item),"activate",(GCallback)linphone_gtk_call_log_chat_selected,call_log);
162 menu_item=gtk_image_menu_item_new_from_stock(GTK_STOCK_ADD,NULL);
163 gtk_widget_show(menu_item);
164 gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item);
165 g_signal_connect_swapped(G_OBJECT(menu_item),"activate",(GCallback)linphone_gtk_call_log_add_contact,call_log);
166 gtk_widget_show(menu);
167 gtk_menu_attach_to_widget(GTK_MENU(menu),call_log, NULL);
169 if (call_label) g_free(call_label);
170 if (text_label) g_free(text_label);
174 gboolean linphone_gtk_call_log_popup_contact(GtkWidget *list, GdkEventButton *event){
175 GtkWidget *m=linphone_gtk_create_call_log_menu(list);
176 gtk_menu_popup (GTK_MENU (m), NULL, NULL, NULL, NULL,
177 event ? event->button : 0, event ? event->time : gtk_get_current_event_time());
181 gboolean linphone_gtk_call_log_button_pressed(GtkWidget *widget, GdkEventButton *event){
182 if (event->button == 3 && event->type == GDK_BUTTON_PRESS){
183 return linphone_gtk_call_log_popup_contact(widget, event);
188 void linphone_gtk_call_log_clear_missed_call(){
189 GtkWidget *mw=linphone_gtk_get_main_window();
190 GtkNotebook *notebook=GTK_NOTEBOOK(linphone_gtk_get_widget(mw,"viewswitch"));
191 GtkWidget *page=gtk_notebook_get_nth_page(notebook,0);
192 GtkWidget *box=gtk_hbox_new(FALSE,0);
193 GtkWidget *image=gtk_image_new_from_stock(GTK_STOCK_REFRESH,GTK_ICON_SIZE_MENU);
196 l=gtk_label_new("Recent calls");
197 gtk_box_pack_start(GTK_BOX(box),image,FALSE,FALSE,0);
198 gtk_box_pack_start(GTK_BOX(box),l,FALSE,FALSE,0);
199 gtk_notebook_set_tab_label(notebook,page,box);
200 gtk_widget_show_all(box);
203 gboolean linphone_gtk_call_log_reset_missed_call(GtkWidget *w, GdkEvent *event,gpointer user_data){
204 GtkWidget *mw=linphone_gtk_get_main_window();
205 GtkNotebook *notebook=GTK_NOTEBOOK(linphone_gtk_get_widget(mw,"viewswitch"));
206 gtk_notebook_set_current_page(notebook,0);
207 linphone_core_reset_missed_calls_count(linphone_gtk_get_core());
208 linphone_gtk_call_log_clear_missed_call();
212 void linphone_gtk_call_log_display_missed_call(int nb){
213 GtkWidget *mw=linphone_gtk_get_main_window();
214 GtkNotebook *notebook=GTK_NOTEBOOK(linphone_gtk_get_widget(mw,"viewswitch"));
215 GtkWidget *page=gtk_notebook_get_nth_page(notebook,0);
216 GtkWidget *ebox=gtk_event_box_new();
217 GtkWidget *box=gtk_hbox_new(FALSE,0);
218 GtkWidget *image=gtk_image_new_from_stock(GTK_STOCK_REFRESH,GTK_ICON_SIZE_MENU);
222 buf=g_markup_printf_escaped(_("<b>Recent calls (%i)</b>"),nb);
223 l=gtk_label_new(NULL);
224 gtk_label_set_markup(GTK_LABEL(l),buf);
225 gtk_box_pack_start(GTK_BOX(box),image,FALSE,FALSE,0);
226 gtk_box_pack_start(GTK_BOX(box),l,FALSE,FALSE,0);
227 gtk_container_add(GTK_CONTAINER(ebox),box);
228 gtk_notebook_set_tab_label(notebook,page,ebox);
229 gtk_widget_add_events(ebox,GDK_BUTTON_PRESS_MASK);
230 g_signal_connect(G_OBJECT(ebox),"button_press_event",(GCallback)linphone_gtk_call_log_reset_missed_call,NULL);
231 gtk_widget_show_all(ebox);
234 void linphone_gtk_call_log_update(GtkWidget *w){
235 GtkTreeView *v=GTK_TREE_VIEW(linphone_gtk_get_widget(w,"logs_view"));
238 GtkTreeSelection *select;
239 GtkWidget *notebook=linphone_gtk_get_widget(w,"viewswitch");
242 store=(GtkTreeStore*)gtk_tree_view_get_model(v);
244 store=gtk_tree_store_new(3,GDK_TYPE_PIXBUF,G_TYPE_STRING,G_TYPE_POINTER,G_TYPE_STRING);
245 gtk_tree_view_set_model(v,GTK_TREE_MODEL(store));
246 g_object_unref(G_OBJECT(store));
247 fill_renderers(GTK_TREE_VIEW(linphone_gtk_get_widget(w,"logs_view")));
248 select=gtk_tree_view_get_selection(v);
249 gtk_tree_selection_set_mode(select, GTK_SELECTION_SINGLE);
250 g_signal_connect_swapped(G_OBJECT(select),"changed",(GCallback)call_log_selection_changed,v);
251 g_signal_connect(G_OBJECT(notebook),"focus-tab",(GCallback)linphone_gtk_call_log_reset_missed_call,NULL);
252 g_signal_connect(G_OBJECT(v),"button-press-event",(GCallback)linphone_gtk_call_log_button_pressed,NULL);
253 // gtk_button_set_image(GTK_BUTTON(linphone_gtk_get_widget(w,"call_back_button")),
254 // create_pixmap (linphone_gtk_get_ui_config("callback_button","status-green.png")));
256 nb=linphone_core_get_missed_calls_count(linphone_gtk_get_core());
258 linphone_gtk_call_log_display_missed_call(nb);
259 gtk_tree_store_clear (store);
261 for (logs=linphone_core_get_call_logs(linphone_gtk_get_core());logs!=NULL;logs=logs->next){
262 LinphoneCallLog *cl=(LinphoneCallLog*)logs->data;
263 GtkTreeIter iter, iter2;
264 const LinphoneAddress *la=linphone_call_log_get_dir(cl)==LinphoneCallIncoming ? linphone_call_log_get_from(cl) : linphone_call_log_get_to(cl);
265 char *addr= linphone_address_as_string(la);
267 gchar *logtxt, *headtxt, *minutes, *seconds;
269 const char *status=NULL;
270 gchar *start_date=NULL;
271 LinphoneFriend *lf=NULL;
272 int duration=linphone_call_log_get_duration(cl);
273 time_t start_date_time=linphone_call_log_get_start_date(cl);
275 #if GLIB_CHECK_VERSION(2,26,0)
276 if (start_date_time){
277 GDateTime *dt=g_date_time_new_from_unix_local(start_date_time);
278 start_date=g_date_time_format(dt,"%c");
279 g_date_time_unref(dt);
282 start_date=g_strdup(ctime(&start_date_time));
284 lf=linphone_core_get_friend_by_address(linphone_gtk_get_core(),addr);
286 la=linphone_friend_get_address(lf);
287 display=linphone_address_get_display_name(la);
289 display=linphone_address_get_display_name(la);
292 display=linphone_address_get_username (la);
294 display=linphone_address_get_domain (la);
297 if (linphone_call_log_get_quality(cl)!=-1){
298 snprintf(quality,sizeof(quality),"%.1f",linphone_call_log_get_quality(cl));
299 }else snprintf(quality,sizeof(quality)-1,"%s",_("n/a"));
300 switch(linphone_call_log_get_status(cl)){
301 case LinphoneCallAborted:
304 case LinphoneCallMissed:
307 case LinphoneCallDeclined:
308 status=_("Declined");
313 minutes=g_markup_printf_escaped(
314 ngettext("%i minute", "%i minutes", duration/60),
316 seconds=g_markup_printf_escaped(
317 ngettext("%i second", "%i seconds", duration%60),
320 headtxt=g_markup_printf_escaped(_("<big><b>%s</b></big>\t%s"),display,start_date ? start_date : "");
321 logtxt=g_markup_printf_escaped(
322 _("<small><i>%s</i>\t"
323 "<i>Quality: %s</i></small>\n%s\t%s\t"),
324 addr, quality, minutes, seconds);
326 headtxt=g_markup_printf_escaped(_("<big><b>%s</b></big>\t%s"),display,start_date ? start_date : "");
327 logtxt=g_markup_printf_escaped(
328 _("<small><i>%s</i></small>\t"
329 "\n%s"),addr, status);
333 if (start_date) g_free(start_date);
334 gtk_tree_store_append (store,&iter,NULL);
336 GdkPixbuf *incoming = create_pixbuf("call_status_incoming.png");
337 GdkPixbuf *outgoing = create_pixbuf("call_status_outgoing.png");
338 gtk_tree_store_set (store,&iter,
339 0, linphone_call_log_get_dir(cl)==LinphoneCallOutgoing ? outgoing : incoming,
341 gtk_tree_store_append (store,&iter2,&iter);
342 gtk_tree_store_set (store,&iter2,1,logtxt,2,la,-1);
349 void linphone_gtk_history_row_activated(GtkWidget *treeview){
350 if (put_selection_to_uribar(treeview)){
351 GtkWidget *mw=linphone_gtk_get_main_window();
352 linphone_gtk_start_call(linphone_gtk_get_widget(mw,"start_call"));
356 void linphone_gtk_history_row_selected(GtkWidget *treeview){
357 put_selection_to_uribar(treeview);
360 void linphone_gtk_clear_call_logs(GtkWidget *button){
361 linphone_core_clear_call_logs (linphone_gtk_get_core());
362 linphone_gtk_call_log_update(gtk_widget_get_toplevel(button));
365 void linphone_gtk_call_log_callback(GtkWidget *button){
366 GtkWidget *mw=linphone_gtk_get_main_window();
367 if (put_selection_to_uribar(linphone_gtk_get_widget(mw,"logs_view")))
368 linphone_gtk_start_call(linphone_gtk_get_widget(mw,"start_call"));
371 void linphone_gtk_call_log_response(GtkWidget *w, guint response_id){
372 GtkWidget *mw=linphone_gtk_get_main_window();
374 if (put_selection_to_uribar(linphone_gtk_get_widget(w,"logs_view")))
375 linphone_gtk_start_call(linphone_gtk_get_widget(mw,"start_call"));
376 }else if (response_id==2){
377 linphone_core_clear_call_logs (linphone_gtk_get_core());
378 linphone_gtk_call_log_update(w);
381 g_object_set_data(G_OBJECT(mw),"call_logs",NULL);
382 gtk_widget_destroy(w);
385 GtkWidget * linphone_gtk_show_call_logs(void){
386 GtkWidget *mw=linphone_gtk_get_main_window();
388 GtkWidget *w=(GtkWidget*)g_object_get_data(G_OBJECT(linphone_gtk_get_main_window()),"call_logs");
390 w=linphone_gtk_create_window("call_logs");
391 // gtk_button_set_image(GTK_BUTTON(linphone_gtk_get_widget(w,"call_back_button")),
392 // create_pixmap (linphone_gtk_get_ui_config("callback_button","status-green.png")));
393 g_object_set_data(G_OBJECT(mw),"call_logs",w);
394 g_signal_connect(G_OBJECT(w),"response",(GCallback)linphone_gtk_call_log_response,NULL);
396 linphone_gtk_call_log_update(w);
397 }else gtk_window_present(GTK_WINDOW(w));