From 4bf3577fba1658e6da4d8d35f0d170e5595c6b21 Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Sat, 27 Sep 2008 18:01:31 +0000 Subject: [PATCH] (gtk) #1306: clicking in a blank area in a list clears the selection. --- gtk/details.c | 4 ++++ gtk/file-list.c | 3 +++ gtk/msgwin.c | 2 ++ gtk/tr-prefs.c | 2 ++ gtk/tr-window.c | 2 ++ gtk/tracker-list.c | 2 ++ gtk/util.c | 22 ++++++++++++++++++++++ gtk/util.h | 7 +++++++ 8 files changed, 44 insertions(+) diff --git a/gtk/details.c b/gtk/details.c index 83314903a..627a7a1e3 100644 --- a/gtk/details.c +++ b/gtk/details.c @@ -700,6 +700,8 @@ peer_page_new( TrTorrent * gtor ) m = webseed_model_new( tr_torrent_handle( gtor ) ); webtree = gtk_tree_view_new_with_model( m ); + g_signal_connect( webtree, "button-release-event", + G_CALLBACK( on_tree_view_button_released ), NULL ); gtk_tree_view_set_rules_hint( GTK_TREE_VIEW( webtree ), TRUE ); p->webseeds = GTK_LIST_STORE( m ); g_object_unref( G_OBJECT( m ) ); @@ -745,6 +747,8 @@ peer_page_new( TrTorrent * gtor ) #endif gtk_widget_set_size_request( v, 550, 0 ); g_object_unref ( G_OBJECT( m ) ); + g_signal_connect( v, "button-release-event", + G_CALLBACK( on_tree_view_button_released ), NULL ); for( i = 0; i < G_N_ELEMENTS( view_columns ); ++i ) { diff --git a/gtk/file-list.c b/gtk/file-list.c index 7874a7670..08cfe6865 100644 --- a/gtk/file-list.c +++ b/gtk/file-list.c @@ -754,6 +754,9 @@ file_list_new( TrTorrent * gtor ) gtk_container_set_border_width( GTK_CONTAINER( view ), GUI_PAD_BIG ); g_signal_connect( view, "button-press-event", G_CALLBACK( onViewButtonPressed ), data ); + g_signal_connect( view, "button-release-event", + G_CALLBACK( on_tree_view_button_released ), NULL ); + /* set up view */ sel = gtk_tree_view_get_selection( GTK_TREE_VIEW( view ) ); diff --git a/gtk/msgwin.c b/gtk/msgwin.c index 9a2fa18a5..7bdd06520 100644 --- a/gtk/msgwin.c +++ b/gtk/msgwin.c @@ -526,6 +526,8 @@ msgwin_new( TrCore * core ) view = gtk_tree_view_new_with_model( data->sort ); + g_signal_connect( view, "button-release-event", + G_CALLBACK( on_tree_view_button_released ), NULL ); data->view = GTK_TREE_VIEW( view ); gtk_tree_view_set_rules_hint( data->view, TRUE ); appendColumn( data->view, COL_SEQUENCE ); diff --git a/gtk/tr-prefs.c b/gtk/tr-prefs.c index 4ac618f8d..c1171f802 100644 --- a/gtk/tr-prefs.c +++ b/gtk/tr-prefs.c @@ -853,6 +853,8 @@ webPage( GObject * core ) s = _( "Access control list:" ); page->store = GTK_LIST_STORE( m ); w = gtk_tree_view_new_with_model( m ); + g_signal_connect( w, "button-release-event", + G_CALLBACK( on_tree_view_button_released ), NULL ); page->widgets = g_slist_append( page->widgets, w ); v = page->view = GTK_TREE_VIEW( w ); diff --git a/gtk/tr-window.c b/gtk/tr-window.c index 824cec9f9..dd03b539a 100644 --- a/gtk/tr-window.c +++ b/gtk/tr-window.c @@ -171,6 +171,8 @@ makeview( PrivateData * p, g_signal_connect( view, "button-press-event", G_CALLBACK( on_tree_view_button_pressed ), (void *) on_popup_menu ); + g_signal_connect( view, "button-release-event", + G_CALLBACK( on_tree_view_button_released ), NULL ); g_signal_connect( view, "row-activated", G_CALLBACK( view_row_activated ), NULL ); diff --git a/gtk/tracker-list.c b/gtk/tracker-list.c index 063af6618..8879ec8c7 100644 --- a/gtk/tracker-list.c +++ b/gtk/tracker-list.c @@ -301,6 +301,8 @@ tracker_list_new( TrTorrent * gtor ) m = tracker_model_new( tr_torrent_handle( gtor ) ); page->store = GTK_LIST_STORE( m ); w = gtk_tree_view_new_with_model( m ); + g_signal_connect( w, "button-release-event", + G_CALLBACK( on_tree_view_button_released ), NULL ); page->view = GTK_TREE_VIEW( w ); gtk_tree_view_set_enable_search( page->view, FALSE ); r = gtk_cell_renderer_text_new( ); diff --git a/gtk/util.c b/gtk/util.c index 6aa26baa1..eab3fd826 100644 --- a/gtk/util.c +++ b/gtk/util.c @@ -480,6 +480,28 @@ on_tree_view_button_pressed( GtkWidget * view, return FALSE; } +/* if the user clicked in an empty area of the list, + * clear all the selections. */ +gboolean +on_tree_view_button_released( GtkWidget * view, + GdkEventButton * event, + gpointer unused UNUSED ) +{ + GtkTreeView * tv = GTK_TREE_VIEW( view ); + + if( !gtk_tree_view_get_path_at_pos ( tv, + (gint) event->x, + (gint) event->y, + NULL, NULL, NULL, NULL ) ) + { + GtkTreeSelection * selection = gtk_tree_view_get_selection( tv ); + gtk_tree_selection_unselect_all ( selection ); + return TRUE; + } + + return FALSE; +} + gpointer tr_object_ref_sink( gpointer object ) { diff --git a/gtk/util.h b/gtk/util.h index 92274e828..719aaa7ac 100644 --- a/gtk/util.h +++ b/gtk/util.h @@ -119,6 +119,13 @@ gboolean on_tree_view_button_pressed( GtkWidget * view, GdkEventButton * event, gpointer unused ); +/* if the click didn't specify a row, clear the selection */ +gboolean on_tree_view_button_released( GtkWidget * view, + GdkEventButton * event, + gpointer unused ); + + + gpointer tr_object_ref_sink( gpointer object ); void tr_file_trash_or_unlink( const char * filename );