diff --git a/gtk/chat.c b/gtk/chat.c index 3ec3d1896..94b7121b5 100644 --- a/gtk/chat.c +++ b/gtk/chat.c @@ -92,7 +92,6 @@ void linphone_gtk_quit_chatroom(LinphoneChatRoom *cr) { g_return_if_fail(w!=NULL); gtk_notebook_remove_page(GTK_NOTEBOOK(nb),gtk_notebook_page_num(GTK_NOTEBOOK(nb),w)); linphone_chat_room_mark_as_read(cr); - linphone_gtk_friend_list_update_chat_picture(); g_object_set_data(G_OBJECT(friendlist),"chatview",NULL); from=g_object_get_data(G_OBJECT(w),"from_message"); if (from){ @@ -291,7 +290,7 @@ void linphone_gtk_compose_text(void) { if (cr) { linphone_chat_room_compose(cr); linphone_chat_room_mark_as_read(cr); - linphone_gtk_friend_list_update_chat_picture(); + linphone_gtk_friend_list_update_button_display(GTK_TREE_VIEW(friendlist)); } } @@ -389,6 +388,8 @@ static gboolean link_event_handler(GtkTextTag *tag, GObject *text_view,GdkEvent GtkTextIter uri_end = *iter; gchar *uri = NULL; LinphoneChatRoom *chat_room = (LinphoneChatRoom *)g_object_get_data(G_OBJECT(chat_view), "cr"); + GtkWidget *main_window = linphone_gtk_get_main_window(); + GtkWidget *friendlist = linphone_gtk_get_widget(main_window, "contact_list"); gtk_text_iter_backward_to_tag_toggle(&uri_begin, tag); gtk_text_iter_forward_to_tag_toggle(&uri_end, tag); @@ -403,7 +404,7 @@ static gboolean link_event_handler(GtkTextTag *tag, GObject *text_view,GdkEvent g_free(uri); linphone_chat_room_mark_as_read(chat_room); - linphone_gtk_friend_list_update_chat_picture(); + linphone_gtk_friend_list_update_button_display(GTK_TREE_VIEW(friendlist)); return TRUE; } @@ -645,5 +646,7 @@ void linphone_gtk_text_received ( LinphoneCore *lc, LinphoneChatRoom *room, } void linphone_gtk_is_composing_received(LinphoneCore *lc, LinphoneChatRoom *room) { - linphone_gtk_friend_list_update_chat_picture(); + GtkWidget *main_window = linphone_gtk_get_main_window(); + GtkWidget *friendlist = linphone_gtk_get_widget(main_window, "contact_list"); + linphone_gtk_friend_list_update_button_display(GTK_TREE_VIEW(friendlist)); } diff --git a/gtk/friendlist.c b/gtk/friendlist.c index e7cbedf8b..e66da45cc 100644 --- a/gtk/friendlist.c +++ b/gtk/friendlist.c @@ -29,7 +29,7 @@ enum{ FRIEND_CHATROOM, FRIEND_SIP_ADDRESS, FRIEND_CHAT, - FRIEND_CALL_BUTTON, + FRIEND_CALL_BUTTON_VISIBLE, FRIEND_CHAT_BUTTON_VISIBLE, FRIEND_LIST_NCOL }; @@ -182,16 +182,15 @@ static void linphone_gtk_call_selected(GtkTreeView *treeview){ "start_call")); } -void linphone_gtk_friend_list_update_chat_picture(){ +void linphone_gtk_friend_list_update_button_display(GtkTreeView *friendlist){ GtkTreeIter iter, selected_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)); - GtkTreeSelection *select=gtk_tree_view_get_selection(GTK_TREE_VIEW(friendlist)); + GtkTreeModel *model=gtk_tree_view_get_model(friendlist); + GtkTreeSelection *select=gtk_tree_view_get_selection(friendlist); LinphoneChatRoom *cr=NULL; - bool_t is_composing; + gboolean is_composing; int nbmsg=0; GtkTreePath *selected_path = NULL; + GtkTreePath *hovered_row = (GtkTreePath *)g_object_get_data(G_OBJECT(friendlist), "hovered_row"); if (gtk_tree_selection_get_selected(select, &model, &selected_iter)){ selected_path = gtk_tree_model_get_path(model, &selected_iter); @@ -200,33 +199,35 @@ void linphone_gtk_friend_list_update_chat_picture(){ if (gtk_tree_model_get_iter_first(model,&iter)) { do{ const char *icon_name = NULL; - bool_t is_visible = FALSE; - gtk_tree_model_get (model, &iter,FRIEND_CHATROOM , &cr, -1); + gboolean show_chat_button = FALSE; + gboolean show_call_button = FALSE; + GtkTreePath *path = gtk_tree_model_get_path(model, &iter); + gtk_tree_model_get (model, &iter,FRIEND_CHATROOM , &cr, -1); nbmsg=linphone_chat_room_get_unread_messages_count(cr); is_composing=linphone_chat_room_is_remote_composing(cr); if(nbmsg != 0){ - if (is_composing == TRUE) icon_name = "linphone-chat-new-message-and-writing"; + if (is_composing) icon_name = "linphone-chat-new-message-and-writing"; else icon_name = "linphone-chat-new-message"; - is_visible = TRUE; + show_chat_button = TRUE; } else { - if (is_composing == TRUE) { + if (is_composing) { icon_name = "linphone-chat-writing"; - is_visible = TRUE; - } - else { + show_chat_button = TRUE; + } else { icon_name = "linphone-chat-nothing"; - if (selected_path){ - GtkTreePath *path = gtk_tree_model_get_path(model, &iter); - if (gtk_tree_path_compare(path, selected_path) == 0){ - is_visible = TRUE; - } - gtk_tree_path_free(path); - } } } + if ((selected_path && gtk_tree_path_compare(path, selected_path) == 0) + || (hovered_row && gtk_tree_path_compare(path, hovered_row) == 0)){ + show_chat_button = TRUE; + show_call_button = TRUE; + } gtk_list_store_set(GTK_LIST_STORE(model),&iter,FRIEND_CHAT,icon_name, - FRIEND_CHAT_BUTTON_VISIBLE, is_visible, -1); + FRIEND_CHAT_BUTTON_VISIBLE, show_chat_button, -1); + gtk_list_store_set(GTK_LIST_STORE(model), &iter, FRIEND_CALL_BUTTON_VISIBLE, show_call_button, -1); + + gtk_tree_path_free(path); }while(gtk_tree_model_iter_next(model,&iter)); } if (selected_path) gtk_tree_path_free(selected_path); @@ -271,7 +272,7 @@ void linphone_gtk_friend_list_set_chat_conversation(const LinphoneAddress *la){ linphone_gtk_load_chatroom(cr,la,chat_view); } gtk_notebook_set_current_page(notebook,gtk_notebook_page_num(notebook,chat_view)); - linphone_gtk_friend_list_update_chat_picture(); + linphone_gtk_friend_list_update_button_display(GTK_TREE_VIEW(chat_view)); g_idle_add((GSourceFunc)grab_focus,linphone_gtk_get_widget(chat_view,"text_entry")); } else { store=GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(friendlist))); @@ -294,7 +295,7 @@ void linphone_gtk_friend_list_set_chat_conversation(const LinphoneAddress *la){ linphone_gtk_load_chatroom(cr,uri,chat_view); } gtk_notebook_set_current_page(notebook,gtk_notebook_page_num(notebook,chat_view)); - linphone_gtk_friend_list_update_chat_picture(); + linphone_gtk_friend_list_update_button_display(GTK_TREE_VIEW(chat_view)); g_idle_add((GSourceFunc)grab_focus,linphone_gtk_get_widget(chat_view,"text_entry")); break; } @@ -344,7 +345,7 @@ void linphone_gtk_chat_selected(GtkWidget *item){ cr=linphone_gtk_create_chatroom(uri); gtk_list_store_set(store,&iter,FRIEND_CHATROOM,cr,-1); } - page=(GtkWidget*)g_object_get_data(G_OBJECT(friendlist),"chatview"); + page=GTK_WIDGET(g_object_get_data(G_OBJECT(friendlist),"chatview")); linphone_gtk_friend_list_set_active_address(uri); if(page==NULL){ page=linphone_gtk_init_chatroom(cr,uri); @@ -354,39 +355,13 @@ void linphone_gtk_chat_selected(GtkWidget *item){ } linphone_chat_room_mark_as_read(cr); gtk_notebook_set_current_page(notebook,gtk_notebook_page_num(notebook,page)); - linphone_gtk_friend_list_update_chat_picture(); g_idle_add((GSourceFunc)grab_focus,linphone_gtk_get_widget(page,"text_entry")); } } - -void linphone_gtk_contact_activated(GtkTreeView *friendlist, - GtkTreePath *path, - GtkTreeViewColumn *column, - gpointer user_data){ -} - -static void linphone_gtk_enable_buttons_for_selection(GtkTreeView *friendlist){ - GtkTreeSelection *select=gtk_tree_view_get_selection(GTK_TREE_VIEW(friendlist)); - GtkListStore * store=GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(friendlist))); - GtkTreeIter iter; - 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(store, &iter, FRIEND_CALL_BUTTON, FALSE, -1); - }while (gtk_tree_model_iter_next(model, &iter)); - } - - if (gtk_tree_selection_get_selected (select, &model, &iter)){ - gtk_list_store_set(store, &iter, FRIEND_CALL_BUTTON, TRUE, -1); - } - linphone_gtk_friend_list_update_chat_picture(); -} - void linphone_gtk_contact_clicked(GtkTreeView *treeview){ linphone_gtk_set_selection_to_uri_bar(treeview); - linphone_gtk_enable_buttons_for_selection(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 { @@ -1021,3 +996,29 @@ void linphone_gtk_buddy_info_updated(LinphoneCore *lc, LinphoneFriend *lf){ /*refresh the entire list*/ linphone_gtk_show_friends(); } + +static void update_hovered_row_path(GtkTreeView *friendlist, int x_window, int y_window) { + int x_bin, y_bin; + GtkTreePath *path; + gtk_tree_view_convert_widget_to_bin_window_coords(friendlist, x_window, y_window, &x_bin, &y_bin); + gtk_tree_view_get_path_at_pos(friendlist, x_bin, y_bin, &path, NULL, NULL, NULL); + g_object_set_data_full(G_OBJECT(friendlist), "hovered_row", path, (GDestroyNotify)gtk_tree_path_free); +} + +gboolean linphone_gtk_friend_list_enter_event_handler(GtkTreeView *friendlist, GdkEventCrossing *event) { + update_hovered_row_path(friendlist, event->x, event->y); + linphone_gtk_friend_list_update_button_display(friendlist); + return FALSE; +} + +gboolean linphone_gtk_friend_list_leave_event_handler(GtkTreeView *friendlist, GdkEventCrossing *event) { + g_object_set_data(G_OBJECT(friendlist), "hovered_row", NULL); + linphone_gtk_friend_list_update_button_display(friendlist); + return FALSE; +} + +gboolean linphone_gtk_friend_list_motion_event_handler(GtkTreeView *friendlist, GdkEventMotion *event) { + 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 8bcc16e7f..51c90bdaf 100644 --- a/gtk/linphone.h +++ b/gtk/linphone.h @@ -154,12 +154,14 @@ LINPHONE_PUBLIC LinphoneChatRoom * linphone_gtk_create_chatroom(const LinphoneAd LINPHONE_PUBLIC void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, LinphoneChatMessage *msg); LINPHONE_PUBLIC void linphone_gtk_is_composing_received(LinphoneCore *lc, LinphoneChatRoom *room); -LINPHONE_PUBLIC void linphone_gtk_friend_list_update_chat_picture(); +LINPHONE_PUBLIC void linphone_gtk_friend_list_update_button_display(GtkTreeView *friendlist); LINPHONE_PUBLIC void linphone_gtk_friend_list_set_chat_conversation(const LinphoneAddress *la); LINPHONE_PUBLIC gboolean linphone_gtk_friend_list_is_contact(const LinphoneAddress *addr); LINPHONE_PUBLIC void linphone_gtk_friend_list_set_active_address(const LinphoneAddress *addr); LINPHONE_PUBLIC const LinphoneAddress *linphone_gtk_friend_list_get_active_address(void); -// LINPHONE_PUBLIC void linphone_gtk_friend_list_on_presence_column_clicked(GtkTreeModel *model); +LINPHONE_PUBLIC gboolean linphone_gtk_friend_list_enter_event_handler(GtkTreeView *friendlist, GdkEventCrossing *event); +LINPHONE_PUBLIC gboolean linphone_gtk_friend_list_leave_event_handler(GtkTreeView *friendlist, GdkEventCrossing *event); +LINPHONE_PUBLIC gboolean linphone_gtk_friend_list_motion_event_handler(GtkTreeView *friendlist, GdkEventMotion *event); LINPHONE_PUBLIC void linphone_gtk_friend_list_on_name_column_clicked(GtkTreeModel *model); LINPHONE_PUBLIC void linphone_gtk_notebook_tab_select(GtkNotebook *notebook, GtkWidget *page, guint page_num, gpointer data); LINPHONE_PUBLIC void linphone_gtk_show_friends(void); @@ -224,7 +226,6 @@ 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_activated(GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data); LINPHONE_PUBLIC void linphone_gtk_contact_clicked(GtkTreeView *treeview); LINPHONE_PUBLIC void linphone_gtk_add_button_clicked(void); LINPHONE_PUBLIC void linphone_gtk_edit_button_clicked(GtkWidget *button); diff --git a/gtk/main.ui b/gtk/main.ui index 42b765549..96b4a20b4 100644 --- a/gtk/main.ui +++ b/gtk/main.ui @@ -492,7 +492,9 @@ 4 - + + +