diff --git a/gtk/friendlist.c b/gtk/friendlist.c
index 616685e27..3e65cf6b8 100644
--- a/gtk/friendlist.c
+++ b/gtk/friendlist.c
@@ -359,17 +359,10 @@ void linphone_gtk_chat_selected(GtkWidget *item){
}
}
-void linphone_gtk_contact_clicked(GtkTreeView *treeview){
- linphone_gtk_set_selection_to_uri_bar(treeview);
- linphone_gtk_friend_list_update_button_display(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));
+void linphone_gtk_contact_clicked(GtkTreeSelection *selection){
+ GtkTreeView *friendlist = gtk_tree_selection_get_tree_view(selection);
+ linphone_gtk_set_selection_to_uri_bar(friendlist);
+ linphone_gtk_friend_list_update_button_display(friendlist);
}
@@ -616,6 +609,7 @@ static void linphone_gtk_friend_list_init(GtkWidget *friendlist){
gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(friendlist),friend_search_func,NULL,NULL);
gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store),FRIEND_NAME,friend_sort,NULL,NULL);
gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE);
+ g_signal_connect(G_OBJECT(select), "changed", G_CALLBACK(linphone_gtk_contact_clicked), NULL);
g_object_set_data(G_OBJECT(friendlist), "friendlist_initialized", (gpointer)TRUE);
}
@@ -930,58 +924,45 @@ gboolean linphone_gtk_popup_contact_menu(GtkWidget *list, GdkEventButton *event)
return TRUE;
}
-gint get_col_number_from_tree_view_column (GtkTreeViewColumn *col){
- GList *cols;
- gint num;
- g_return_val_if_fail ( col != NULL, -1 );
- g_return_val_if_fail ( col->tree_view != NULL, -1 );
- cols = gtk_tree_view_get_columns(GTK_TREE_VIEW(col->tree_view));
- num = g_list_index(cols, (gpointer) col);
- g_list_free(cols);
-
- return num;
+static int get_column_index(GtkTreeView *friendlist, const GtkTreeViewColumn *column) {
+ GList *columns = gtk_tree_view_get_columns(friendlist);
+ int i = g_list_index(columns, column);
+ g_list_free(columns);
+ return i;
}
-static gint tree_view_get_cell_from_pos(GtkTreeView *view, guint x, guint y){
- GtkTreeViewColumn *col = NULL;
- GList *node, *columns;
- gint colx = 0;
- GtkTreePath *path;
- GtkTreeViewDropPosition pos;
-
- g_return_val_if_fail ( view != NULL, 0 );
- columns = gtk_tree_view_get_columns(view);
-
- gtk_tree_view_get_dest_row_at_pos(view,x,y,&path,&pos);
- if(path != NULL){
- for (node = columns; node != NULL && col == NULL; node = node->next){
- GtkTreeViewColumn *checkcol = (GtkTreeViewColumn*) node->data;
- if (x >= colx && x < (colx + checkcol->width)){
- col = checkcol;
- return get_col_number_from_tree_view_column(col);
- } else {
- colx += checkcol->width;
- }
- }
- }
- g_list_free(columns);
- return 0;
+static void select_row(GtkTreeView *treeview, GtkTreePath *path) {
+ GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview);
+ gtk_tree_selection_select_path(selection, path);
}
gboolean linphone_gtk_contact_list_button_pressed(GtkWidget *widget, GdkEventButton *event){
/* Ignore double-clicks and triple-clicks */
- if (event->button == 3 && event->type == GDK_BUTTON_PRESS)
- {
+ GtkTreeView *friendlist = GTK_TREE_VIEW(widget);
+ gboolean ret = FALSE;
+ if (event->button == 3 && event->type == GDK_BUTTON_PRESS) {
return linphone_gtk_popup_contact_menu(widget, event);
} 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){
- g_object_set_data(G_OBJECT(widget),"numcol",GINT_TO_POINTER(1));
- } else if(numcol==3){
- g_object_set_data(G_OBJECT(widget),"numcol",GINT_TO_POINTER(2));
+ int x_bin, y_bin;
+ GtkTreePath *path;
+ GtkTreeViewColumn *column;
+ gtk_tree_view_convert_widget_to_bin_window_coords(friendlist, event->x, event->y, &x_bin, &y_bin);
+ gtk_tree_view_get_path_at_pos(friendlist, x_bin, y_bin, &path, &column, NULL, NULL);
+ if(path && column) {
+ int numcol = get_column_index(friendlist, column);
+ if(numcol == 2) {
+ select_row(friendlist, path);
+ linphone_gtk_call_selected(GTK_TREE_VIEW(widget));
+ ret = TRUE;
+ } else if(numcol == 3) {
+ select_row(friendlist, path);
+ linphone_gtk_chat_selected(widget);
+ ret = TRUE;
+ }
}
+ if(path) gtk_tree_path_free(path);
}
- return FALSE;
+ return ret;
}
void linphone_gtk_buddy_info_updated(LinphoneCore *lc, LinphoneFriend *lf){
@@ -1013,4 +994,5 @@ gboolean linphone_gtk_friend_list_motion_event_handler(GtkTreeView *friendlist,
update_hovered_row_path(friendlist, event->x, event->y);
linphone_gtk_friend_list_update_button_display(friendlist);
return FALSE;
-}
\ No newline at end of file
+}
+
diff --git a/gtk/linphone.h b/gtk/linphone.h
index 51c90bdaf..fee20db32 100644
--- a/gtk/linphone.h
+++ b/gtk/linphone.h
@@ -226,14 +226,14 @@ LINPHONE_PUBLIC void linphone_gtk_history_row_activated(GtkWidget *treeview);
LINPHONE_PUBLIC void linphone_gtk_history_row_selected(GtkWidget *treeview);
LINPHONE_PUBLIC void linphone_gtk_clear_call_logs(GtkWidget *button);
LINPHONE_PUBLIC void linphone_gtk_add_contact(void);
-LINPHONE_PUBLIC void linphone_gtk_contact_clicked(GtkTreeView *treeview);
+LINPHONE_PUBLIC void linphone_gtk_contact_clicked(GtkTreeSelection *selection);
LINPHONE_PUBLIC void linphone_gtk_add_button_clicked(void);
LINPHONE_PUBLIC void linphone_gtk_edit_button_clicked(GtkWidget *button);
LINPHONE_PUBLIC void linphone_gtk_remove_button_clicked(GtkWidget *button);
LINPHONE_PUBLIC void linphone_gtk_my_presence_clicked(GtkWidget *button);
LINPHONE_PUBLIC void linphone_gtk_directory_search_button_clicked(GtkWidget *button);
LINPHONE_PUBLIC gboolean linphone_gtk_popup_contact_menu(GtkWidget *list, GdkEventButton *event);
-LINPHONE_PUBLIC gboolean linphone_gtk_contact_list_button_pressed(GtkWidget *widget, GdkEventButton *event);
+gboolean linphone_gtk_contact_list_button_pressed(GtkWidget* firendlist, GdkEventButton* event);
LINPHONE_PUBLIC void linphone_gtk_auth_token_verified_clicked(GtkButton *button);
LINPHONE_PUBLIC void linphone_gtk_hold_clicked(GtkButton *button);
LINPHONE_PUBLIC void linphone_gtk_record_call_toggled(GtkWidget *button);
diff --git a/gtk/main.ui b/gtk/main.ui
index 1710809ab..0f55ca070 100644
--- a/gtk/main.ui
+++ b/gtk/main.ui
@@ -475,7 +475,6 @@
1
4
-