]> sjero.net Git - linphone/blob - gtk/friendlist.c
Merge branch 'master' of git.linphone.org:linphone-private
[linphone] / gtk / friendlist.c
1 /*
2 linphone, gtk-glade interface.
3 Copyright (C) 2008  Simon MORLAT (simon.morlat@linphone.org)
4
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.
9
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.
14
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.
18 */
19
20 #include <gtk/gtk.h>
21 #include "linphone.h"
22
23 static GtkWidget *linphone_gtk_create_contact_menu(GtkWidget *contact_list);
24
25 enum{
26         FRIEND_PRESENCE_IMG,
27         FRIEND_NAME,
28         FRIEND_PRESENCE_STATUS,
29         FRIEND_ID,
30         FRIEND_SIP_ADDRESS,
31         FRIEND_ICON,
32         FRIEND_LIST_NCOL
33 };
34
35
36 typedef struct _status_picture_tab_t{
37         LinphoneOnlineStatus status;
38         const char *img;
39 } status_picture_tab_t;
40
41 status_picture_tab_t status_picture_tab[]={
42         {       LinphoneStatusOnline,           "status-green.png"      },
43         {       LinphoneStatusBusy,             "status-orange.png"             },
44         {       LinphoneStatusBeRightBack,      "status-orange.png"             },
45         {       LinphoneStatusAway,             "status-orange.png"             },
46         {       LinphoneStatusOnThePhone,       "status-orange.png"             },
47         {       LinphoneStatusOutToLunch,       "status-orange.png"             },
48         {       LinphoneStatusDoNotDisturb,     "status-red.png"        },
49         {       LinphoneStatusMoved,            "status-orange.png"     },
50         {       LinphoneStatusAltService,       "status-orange.png"     },
51         {       LinphoneStatusOffline,  "status-offline.png"            },
52         {       LinphoneStatusPending,  "status-offline.png"            },
53         {       LinphoneStatusEnd,              NULL                    },
54 };
55
56 static GdkPixbuf *create_status_picture(LinphoneOnlineStatus ss){
57         status_picture_tab_t *t=status_picture_tab;
58         while(t->img!=NULL){
59                 if (ss==t->status){
60                         GdkPixbuf *pixbuf;
61                         pixbuf = create_pixbuf(t->img);
62                         return pixbuf;
63                 }
64                 ++t;
65         }
66         g_error("No pixmap defined for status %i",ss);
67         return NULL;
68 }
69
70 void linphone_gtk_set_friend_status(GtkWidget *friendlist , LinphoneFriend * fid, const gchar *url, const gchar *status, const gchar *img){
71         GtkTreeIter iter;
72         LinphoneFriend *tmp=0;
73         gboolean found=FALSE;
74         GtkTreeModel *model=gtk_tree_view_get_model(GTK_TREE_VIEW(friendlist));
75         if (gtk_tree_model_get_iter_first(model,&iter)) {
76                 do{
77                         gtk_tree_model_get(model,&iter,FRIEND_ID,&tmp,-1);
78                         //printf("tmp=%i, fid=%i",tmp,fid);
79                         if (fid==tmp) {
80                                 GdkPixbuf *pixbuf;
81                                 gtk_list_store_set(GTK_LIST_STORE(model),&iter,FRIEND_PRESENCE_STATUS,status,-1);
82                                 pixbuf = create_pixbuf(img);
83                                 if (pixbuf)
84                                   {
85                                     gtk_list_store_set(GTK_LIST_STORE(model),&iter,FRIEND_PRESENCE_IMG, pixbuf,-1);
86                                   }
87                                   found=TRUE;
88                         }
89                 }while(gtk_tree_model_iter_next(model,&iter));
90         }
91         
92 }
93
94
95 static void linphone_gtk_set_selection_to_uri_bar(GtkTreeView *treeview){
96         GtkTreeSelection *select;
97         GtkTreeIter iter;
98         GtkTreeModel *model;
99         LinphoneFriend *lf=NULL;
100         gchar* friend;
101         select = gtk_tree_view_get_selection (treeview);
102         if (gtk_tree_selection_get_selected (select, &model, &iter))
103         {
104                 gtk_tree_model_get (model, &iter,FRIEND_ID , &lf, -1);
105                 friend=linphone_address_as_string(linphone_friend_get_address(lf));
106                 gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(linphone_gtk_get_main_window(),"uribar")),friend);
107                 ms_free(friend);
108         }
109 }
110
111 static void linphone_gtk_call_selected(GtkTreeView *treeview){
112         linphone_gtk_set_selection_to_uri_bar(treeview);
113         linphone_gtk_start_call(linphone_gtk_get_widget(gtk_widget_get_toplevel(GTK_WIDGET(treeview)),
114                                         "start_call"));
115 }
116
117 void linphone_gtk_contact_activated(GtkTreeView     *treeview,
118                                     GtkTreePath     *path,
119                                     GtkTreeViewColumn *column,
120                                         gpointer         user_data)
121 {
122         linphone_gtk_call_selected(treeview);
123 }
124
125 void linphone_gtk_contact_clicked(GtkTreeView     *treeview){
126         linphone_gtk_set_selection_to_uri_bar(treeview);
127 }
128
129 static GtkWidget * create_presence_menu(){
130         GtkWidget *menu=gtk_menu_new();
131         GtkWidget *menu_item;
132         GdkPixbuf *pbuf;
133         status_picture_tab_t *t;
134         for(t=status_picture_tab;t->img!=NULL;++t){
135                 if (t->status==LinphoneStatusPending){
136                         continue;
137                 }
138                 menu_item=gtk_image_menu_item_new_with_label(linphone_online_status_to_string(t->status));
139                 pbuf=create_status_picture(t->status);
140                 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),
141                                                 gtk_image_new_from_pixbuf(pbuf));
142                 g_object_unref(G_OBJECT(pbuf));
143                 gtk_widget_show(menu_item);
144                 gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item);
145                 g_signal_connect_swapped(G_OBJECT(menu_item),"activate",(GCallback)linphone_gtk_set_my_presence,GINT_TO_POINTER(t->status));
146         }
147         return menu;
148 }
149
150 void linphone_gtk_set_my_presence(LinphoneOnlineStatus ss){
151         GtkWidget *button=linphone_gtk_get_widget(linphone_gtk_get_main_window(),"presence_button");
152         GdkPixbuf *pbuf=create_status_picture(ss);
153         GtkWidget *image=gtk_image_new_from_pixbuf(pbuf);
154         GtkWidget *menu;
155         g_object_unref(G_OBJECT(pbuf));
156         gtk_widget_set_tooltip_text(button,linphone_online_status_to_string(ss));
157         gtk_button_set_image(GTK_BUTTON(button),image);
158         /*prepare menu*/
159         menu=(GtkWidget*)g_object_get_data(G_OBJECT(button),"presence_menu");
160         if (menu==NULL){
161                 menu=create_presence_menu();
162                 /*the menu is destroyed when the button is destroyed*/
163                 g_object_weak_ref(G_OBJECT(button),(GWeakNotify)gtk_widget_destroy,menu);
164                 g_object_set_data(G_OBJECT(button),"presence_menu",menu);
165         }
166         linphone_core_set_presence_info(linphone_gtk_get_core(),0,NULL,ss);
167 }
168
169 void linphone_gtk_my_presence_clicked(GtkWidget *button){
170         GtkWidget *menu=(GtkWidget*)g_object_get_data(G_OBJECT(button),"presence_menu");
171         gtk_menu_popup(GTK_MENU(menu),NULL,NULL,NULL,NULL,0,
172                         gtk_get_current_event_time());
173         gtk_widget_show(menu);
174 }
175
176
177 static void linphone_gtk_friend_list_init(GtkWidget *friendlist)
178 {
179         GtkListStore *store;
180         GtkCellRenderer *renderer;
181         GtkTreeViewColumn *column;
182         GtkTreeSelection *select;
183         
184         
185         store = gtk_list_store_new(FRIEND_LIST_NCOL, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING,  G_TYPE_POINTER,
186                                         G_TYPE_STRING, GDK_TYPE_PIXBUF);
187
188         gtk_tree_view_set_model(GTK_TREE_VIEW(friendlist),GTK_TREE_MODEL(store));
189         g_object_unref(G_OBJECT(store));
190
191         renderer = gtk_cell_renderer_pixbuf_new ();
192         column = gtk_tree_view_column_new_with_attributes (_("Name"),
193                                                    renderer,
194                                                    "pixbuf", FRIEND_ICON,
195                                                    NULL);
196         g_object_set (G_OBJECT(column), "resizable", TRUE, NULL);
197         renderer = gtk_cell_renderer_text_new ();
198         gtk_tree_view_column_pack_start(column,renderer,FALSE);
199         gtk_tree_view_column_add_attribute  (column,renderer,
200                                                          "text",
201                                                          FRIEND_NAME);
202         
203         gtk_tree_view_append_column (GTK_TREE_VIEW (friendlist), column);
204
205         column = gtk_tree_view_column_new_with_attributes (_("Presence status"),
206                                                    renderer,
207                                                    "text", FRIEND_PRESENCE_STATUS,
208                                                    NULL);
209         g_object_set (G_OBJECT(column), "resizable", TRUE, NULL);
210         gtk_tree_view_column_set_visible(column,linphone_gtk_get_ui_config_int("friendlist_status",1));
211         
212         renderer = gtk_cell_renderer_pixbuf_new();
213         gtk_tree_view_column_pack_start(column,renderer,FALSE);
214         gtk_tree_view_column_add_attribute  (column,renderer,
215                                                          "pixbuf",
216                                                          FRIEND_PRESENCE_IMG);
217         gtk_tree_view_append_column (GTK_TREE_VIEW (friendlist), column);
218
219         select = gtk_tree_view_get_selection (GTK_TREE_VIEW (friendlist));
220         gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE);
221 #if GTK_CHECK_VERSION(2,12,0)
222         gtk_tree_view_set_tooltip_column(GTK_TREE_VIEW(friendlist),FRIEND_SIP_ADDRESS);
223 #endif
224         gtk_combo_box_set_active(GTK_COMBO_BOX(linphone_gtk_get_widget(
225                                         gtk_widget_get_toplevel(friendlist),"show_category")),0);
226 }
227
228 void linphone_gtk_show_directory_search(void){
229         LinphoneProxyConfig *cfg=NULL;
230         SipSetupContext * ssc=NULL;
231         GtkWidget *mw=linphone_gtk_get_main_window();
232         GtkWidget *search_box=linphone_gtk_get_widget(mw,"directory_search_box");
233
234         linphone_core_get_default_proxy(linphone_gtk_get_core(),&cfg);
235         if (cfg){
236                 ssc=linphone_proxy_config_get_sip_setup_context(cfg);
237                 if (ssc!=NULL && sip_setup_context_get_capabilities(ssc) & SIP_SETUP_CAP_BUDDY_LOOKUP){
238                         GtkWidget *entry=linphone_gtk_get_widget(mw,"directory_search_entry");
239                         gchar  *tooltip;
240                         GdkColor grey={0,40000,40000,40000};
241                         gtk_widget_show(search_box);
242                         tooltip=g_strdup_printf(_("Search in %s directory"),linphone_proxy_config_get_domain(cfg));
243                         gtk_widget_modify_text(entry,GTK_STATE_NORMAL,&grey);
244                         gtk_entry_set_text(GTK_ENTRY(entry),tooltip);
245                         g_object_set_data(G_OBJECT(entry),"active",GINT_TO_POINTER(0));
246                         g_free(tooltip);
247                         return;
248                 }
249         }
250         gtk_widget_hide(search_box);
251 }
252
253 gboolean linphone_gtk_directory_search_focus_out(GtkWidget *entry){
254         if (gtk_entry_get_text_length(GTK_ENTRY(entry))==0)
255                 linphone_gtk_show_directory_search();
256         return FALSE;
257 }
258
259 gboolean linphone_gtk_directory_search_focus_in(GtkWidget *entry){
260         if (GPOINTER_TO_INT(g_object_get_data(G_OBJECT(entry),"active"))==0){
261                 gtk_entry_set_text(GTK_ENTRY(entry),"");
262                 gtk_widget_modify_text(entry,GTK_STATE_NORMAL,NULL);
263                 g_object_set_data(G_OBJECT(entry),"active",GINT_TO_POINTER(1));
264         }
265         return FALSE;
266 }
267
268 void linphone_gtk_directory_search_activate(GtkWidget *entry){
269         LinphoneProxyConfig *cfg;
270         linphone_core_get_default_proxy(linphone_gtk_get_core(),&cfg);
271         GtkWidget *w=linphone_gtk_show_buddy_lookup_window(linphone_proxy_config_get_sip_setup_context(cfg));
272         if (GPOINTER_TO_INT(g_object_get_data(G_OBJECT(entry),"active"))==1)
273                 linphone_gtk_buddy_lookup_set_keyword(w,gtk_entry_get_text(GTK_ENTRY(entry)));
274 }
275
276 void linphone_gtk_directory_search_button_clicked(GtkWidget *button){
277         linphone_gtk_directory_search_activate(
278                 linphone_gtk_get_widget(gtk_widget_get_toplevel(button),"directory_search_entry"));
279 }
280
281 void linphone_gtk_show_friends(void){
282         GtkWidget *mw=linphone_gtk_get_main_window();
283         GtkWidget *friendlist=linphone_gtk_get_widget(mw,"contact_list");
284         GtkListStore *store=NULL;
285         GtkTreeIter iter;
286         const MSList *itf;
287         GtkWidget *category=linphone_gtk_get_widget(mw,"show_category");
288         GtkWidget *filter=linphone_gtk_get_widget(mw,"search_bar");
289         LinphoneCore *core=linphone_gtk_get_core();
290         const gchar *search=NULL;
291         gboolean online_only=FALSE,lookup=FALSE;
292         
293         linphone_gtk_show_directory_search();
294
295         if (gtk_tree_view_get_model(GTK_TREE_VIEW(friendlist))==NULL){
296                 linphone_gtk_friend_list_init(friendlist);
297         }
298         store=GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(friendlist)));
299         gtk_list_store_clear(store);
300
301         online_only=(gtk_combo_box_get_active(GTK_COMBO_BOX(category))==1);
302         search=gtk_entry_get_text(GTK_ENTRY(filter));
303         if (search==NULL || search[0]=='\0')
304                 lookup=FALSE;
305         else lookup=TRUE;
306
307         for(itf=linphone_core_get_friend_list(core);itf!=NULL;itf=ms_list_next(itf)){
308                 LinphoneFriend *lf=(LinphoneFriend*)itf->data;
309                 const LinphoneAddress *f_uri=linphone_friend_get_address(lf);
310                 char *uri=linphone_address_as_string(f_uri);
311                 const char *name=linphone_address_get_display_name(f_uri);
312                 const char *display=name;
313                 char *escaped=NULL;
314                 if (lookup){
315                         if (strstr(uri,search)==NULL){
316                                 ms_free(uri);
317                                 continue;
318                         }
319                 }
320                 if (!online_only || (linphone_friend_get_status(lf)!=LinphoneStatusOffline)){
321                         BuddyInfo *bi;
322                         if (name==NULL || name[0]=='\0') display=uri;
323                         gtk_list_store_append(store,&iter);
324                         gtk_list_store_set(store,&iter,FRIEND_NAME, display,
325                                         FRIEND_PRESENCE_STATUS, linphone_online_status_to_string(linphone_friend_get_status(lf)),
326                                         FRIEND_ID,lf,-1);
327                         gtk_list_store_set(store,&iter,
328                                 FRIEND_PRESENCE_IMG, create_status_picture(linphone_friend_get_status(lf)),
329                                 -1);
330                         escaped=g_markup_escape_text(uri,-1);
331                         gtk_list_store_set(store,&iter,FRIEND_SIP_ADDRESS,escaped,-1);
332                         g_free(escaped);
333                         bi=linphone_friend_get_info(lf);
334                         if (bi!=NULL && bi->image_data!=NULL){
335                                 GdkPixbuf *pbuf=
336                                         _gdk_pixbuf_new_from_memory_at_scale(bi->image_data,bi->image_length,-1,40,TRUE);
337                                 if (pbuf) {
338                                         gtk_list_store_set(store,&iter,FRIEND_ICON,pbuf,-1);
339                                         g_object_unref(G_OBJECT(pbuf));
340                                 }
341                         }
342                 }
343                 ms_free(uri);
344         }
345 }
346
347 void linphone_gtk_add_contact(void){
348         GtkWidget *w=linphone_gtk_create_window("contact");
349         int presence_enabled=linphone_gtk_get_ui_config_int("use_subscribe_notify",1);
350         
351         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(w,"show_presence")),presence_enabled);
352         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(w,"allow_presence")),
353                                         presence_enabled);
354         gtk_widget_show(w);
355 }
356
357 void linphone_gtk_remove_contact(GtkWidget *button){
358         GtkWidget *w=gtk_widget_get_toplevel(button);
359         GtkTreeSelection *select;
360         GtkTreeIter iter;
361         GtkTreeModel *model;
362         LinphoneFriend *lf=NULL;
363         select = gtk_tree_view_get_selection(GTK_TREE_VIEW(linphone_gtk_get_widget(w,"contact_list")));
364         if (gtk_tree_selection_get_selected (select, &model, &iter))
365         {
366                 gtk_tree_model_get (model, &iter,FRIEND_ID , &lf, -1);
367                 linphone_core_remove_friend(linphone_gtk_get_core(),lf);
368                 linphone_gtk_show_friends();
369         }
370 }
371
372 void linphone_gtk_show_contact(LinphoneFriend *lf){
373         GtkWidget *w=linphone_gtk_create_window("contact");
374         char *uri;
375         const char *name;
376         const LinphoneAddress *f_uri=linphone_friend_get_address(lf);
377         uri=linphone_address_as_string_uri_only(f_uri);
378         name=linphone_address_get_display_name(f_uri);
379         if (uri) {
380                 gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(w,"sip_address")),uri);
381                 ms_free(uri);
382         }
383         if (name){
384                 gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(w,"name")),name);
385         }
386         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(w,"show_presence")),
387                                         linphone_friend_get_send_subscribe(lf));
388         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(w,"allow_presence")),
389                                         linphone_friend_get_inc_subscribe_policy(lf)==LinphoneSPAccept);
390         g_object_set_data(G_OBJECT(w),"friend_ref",(gpointer)lf);
391         gtk_widget_show(w);
392 }
393
394 void linphone_gtk_edit_contact(GtkWidget *button){
395         GtkWidget *w=gtk_widget_get_toplevel(button);
396         GtkTreeSelection *select;
397         GtkTreeIter iter;
398         GtkTreeModel *model;
399         LinphoneFriend *lf=NULL;
400         select = gtk_tree_view_get_selection(GTK_TREE_VIEW(linphone_gtk_get_widget(w,"contact_list")));
401         if (gtk_tree_selection_get_selected (select, &model, &iter))
402         {
403                 gtk_tree_model_get (model, &iter,FRIEND_ID , &lf, -1);
404                 linphone_gtk_show_contact(lf);
405         }
406 }
407
408 void linphone_gtk_chat_selected(GtkWidget *item){
409         GtkWidget *w=gtk_widget_get_toplevel(item);
410         GtkTreeSelection *select;
411         GtkTreeIter iter;
412         GtkTreeModel *model;
413         LinphoneFriend *lf=NULL;
414         select = gtk_tree_view_get_selection(GTK_TREE_VIEW(linphone_gtk_get_widget(w,"contact_list")));
415         if (gtk_tree_selection_get_selected (select, &model, &iter))
416         {
417                 char *uri;
418                 gtk_tree_model_get (model, &iter,FRIEND_ID , &lf, -1);
419                 uri=linphone_address_as_string(linphone_friend_get_address(lf));
420                 linphone_gtk_create_chatroom(uri);
421                 ms_free(uri);
422         }
423 }
424
425 void linphone_gtk_contact_cancel(GtkWidget *button){
426         gtk_widget_destroy(gtk_widget_get_toplevel(button));
427 }
428
429 void linphone_gtk_contact_ok(GtkWidget *button){
430         GtkWidget *w=gtk_widget_get_toplevel(button);
431         LinphoneFriend *lf=(LinphoneFriend*)g_object_get_data(G_OBJECT(w),"friend_ref");
432         char *fixed_uri=NULL;
433         gboolean show_presence=FALSE,allow_presence=FALSE;
434         const gchar *name,*uri;
435         if (lf==NULL){
436                 lf=linphone_friend_new();
437                 if (linphone_gtk_get_ui_config_int("use_subscribe_notify",1)==1){
438                         show_presence=FALSE;
439                         allow_presence=FALSE;
440                 }
441                 linphone_friend_set_inc_subscribe_policy(lf,allow_presence ? LinphoneSPAccept : LinphoneSPDeny);
442                 linphone_friend_send_subscribe(lf,show_presence);
443         }
444         name=gtk_entry_get_text(GTK_ENTRY(linphone_gtk_get_widget(w,"name")));
445         uri=gtk_entry_get_text(GTK_ENTRY(linphone_gtk_get_widget(w,"sip_address")));
446         show_presence=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(w,"show_presence")));
447         allow_presence=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(w,"allow_presence")));
448         linphone_core_interpret_friend_uri(linphone_gtk_get_core(),uri,&fixed_uri);
449         if (fixed_uri==NULL){
450                 linphone_gtk_display_something(GTK_MESSAGE_WARNING,_("Invalid sip contact !"));
451                 return ;
452         }
453         LinphoneAddress* friend_address = linphone_address_new(fixed_uri);
454         linphone_address_set_display_name(friend_address,name);
455         linphone_friend_set_addr(lf,friend_address);
456         ms_free(fixed_uri);
457         linphone_address_destroy(friend_address);
458
459         linphone_friend_send_subscribe(lf,show_presence);
460         linphone_friend_set_inc_subscribe_policy(lf,allow_presence==TRUE ? LinphoneSPAccept : LinphoneSPDeny);
461         if (linphone_friend_in_list(lf)) {
462                 linphone_friend_done(lf);
463         }else{
464                 linphone_core_add_friend(linphone_gtk_get_core(),lf);
465         }
466         linphone_gtk_show_friends();
467         gtk_widget_destroy(w);
468 }
469
470 static GtkWidget *linphone_gtk_create_contact_menu(GtkWidget *contact_list){
471         GtkWidget *menu=gtk_menu_new();
472         GtkWidget *menu_item;
473         gchar *call_label=NULL;
474         gchar *text_label=NULL;
475         gchar *edit_label=NULL;
476         gchar *delete_label=NULL;
477         gchar *name=NULL;
478         GtkTreeSelection *select;
479         GtkTreeIter iter;
480         GtkTreeModel *model;
481         GtkWidget *image;
482         LinphoneCore *lc=linphone_gtk_get_core();
483         LinphoneProxyConfig *cfg=NULL;
484         SipSetupContext * ssc=NULL;
485
486         linphone_core_get_default_proxy(lc,&cfg);
487         if (cfg){
488                 ssc=linphone_proxy_config_get_sip_setup_context(cfg);
489         }
490
491         g_signal_connect(G_OBJECT(menu), "selection-done", G_CALLBACK (gtk_widget_destroy), NULL);
492         select = gtk_tree_view_get_selection(GTK_TREE_VIEW(contact_list));
493         if (gtk_tree_selection_get_selected (select, &model, &iter)){
494                 gtk_tree_model_get(model, &iter,FRIEND_NAME , &name, -1);
495                 call_label=g_strdup_printf(_("Call %s"),name);
496                 text_label=g_strdup_printf(_("Send text to %s"),name);
497                 edit_label=g_strdup_printf(_("Edit contact '%s'"),name);
498                 delete_label=g_strdup_printf(_("Delete contact '%s'"),name);
499                 g_free(name);
500         }
501         if (call_label){
502                 menu_item=gtk_image_menu_item_new_with_label(call_label);
503                 image=gtk_image_new_from_stock(GTK_STOCK_NETWORK,GTK_ICON_SIZE_MENU);
504                 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),image);
505                 gtk_widget_show(image);
506                 gtk_widget_show(menu_item);
507                 gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item);
508                 g_signal_connect_swapped(G_OBJECT(menu_item),"activate",(GCallback)linphone_gtk_call_selected,contact_list);
509         }
510         if (text_label){
511                 menu_item=gtk_image_menu_item_new_with_label(text_label);
512                 image=gtk_image_new_from_stock(GTK_STOCK_NETWORK,GTK_ICON_SIZE_MENU);
513                 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),image);
514                 gtk_widget_show(image);
515                 gtk_widget_show(menu_item);
516                 gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item);
517                 g_signal_connect_swapped(G_OBJECT(menu_item),"activate",(GCallback)linphone_gtk_chat_selected,contact_list);
518         }
519         if (edit_label){
520                 menu_item=gtk_image_menu_item_new_with_label(edit_label);
521                 image=gtk_image_new_from_stock(GTK_STOCK_EDIT,GTK_ICON_SIZE_MENU);
522                 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),image);
523                 gtk_widget_show(image);
524                 gtk_widget_show(menu_item);
525                 gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item);
526                 g_signal_connect_swapped(G_OBJECT(menu_item),"activate",(GCallback)linphone_gtk_edit_contact,contact_list);
527         }
528         if (delete_label){
529                 menu_item=gtk_image_menu_item_new_with_label(delete_label);
530                 image=gtk_image_new_from_stock(GTK_STOCK_DELETE,GTK_ICON_SIZE_MENU);
531                 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),image);
532                 gtk_widget_show(image);
533                 gtk_widget_show(menu_item);
534                 gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item);
535                 g_signal_connect_swapped(G_OBJECT(menu_item),"activate",(GCallback)linphone_gtk_remove_contact,contact_list);
536         }
537         
538
539         if (ssc && (sip_setup_context_get_capabilities(ssc) & SIP_SETUP_CAP_BUDDY_LOOKUP)) {
540                 gchar *tmp=g_strdup_printf(_("Add new contact from %s directory"),linphone_proxy_config_get_domain(cfg));
541                 menu_item=gtk_image_menu_item_new_with_label(tmp);
542                 g_free(tmp);
543                 image=gtk_image_new_from_stock(GTK_STOCK_ADD,GTK_ICON_SIZE_MENU);
544                 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),image);
545                 gtk_widget_show(image);
546                 gtk_widget_show(menu_item);
547                 gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item);
548                 g_signal_connect_swapped(G_OBJECT(menu_item),"activate",(GCallback)linphone_gtk_show_buddy_lookup_window,ssc);
549                 gtk_widget_show(menu);
550         }
551         
552         menu_item=gtk_image_menu_item_new_from_stock(GTK_STOCK_ADD,NULL);
553         gtk_widget_show(menu_item);
554         gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item);
555         g_signal_connect_swapped(G_OBJECT(menu_item),"activate",(GCallback)linphone_gtk_add_contact,contact_list);
556         gtk_widget_show(menu);
557         gtk_menu_attach_to_widget (GTK_MENU (menu), contact_list, NULL);
558
559         if (call_label) g_free(call_label);
560         if (text_label) g_free(text_label);
561         if (edit_label) g_free(edit_label);
562         if (delete_label) g_free(delete_label);
563         return menu;
564 }
565
566
567 gboolean linphone_gtk_popup_contact_menu(GtkWidget *list, GdkEventButton *event){
568         GtkWidget *m=linphone_gtk_create_contact_menu(list);
569         gtk_menu_popup (GTK_MENU (m), NULL, NULL, NULL, NULL, 
570                   event ? event->button : 0, event ? event->time : gtk_get_current_event_time());
571         return TRUE;
572 }
573
574 gboolean linphone_gtk_contact_list_button_pressed(GtkWidget *widget, GdkEventButton *event){
575         /* Ignore double-clicks and triple-clicks */
576         if (event->button == 3 && event->type == GDK_BUTTON_PRESS)
577         {
578                 return linphone_gtk_popup_contact_menu(widget, event);
579         }
580         return FALSE;
581 }
582
583 void linphone_gtk_buddy_info_updated(LinphoneCore *lc, LinphoneFriend *lf){
584         /*refresh the entire list*/
585         linphone_gtk_show_friends();
586 }
587
588