]> granicus.if.org Git - transmission/commitdiff
(trunk gtk) #3166 "Add Tracker Favicons to Tracker Tab in Properties Window." --...
authorCharles Kerr <charles@transmissionbt.com>
Fri, 23 Apr 2010 01:46:02 +0000 (01:46 +0000)
committerCharles Kerr <charles@transmissionbt.com>
Fri, 23 Apr 2010 01:46:02 +0000 (01:46 +0000)
gtk/details.c
gtk/favicon.c
gtk/favicon.h
gtk/filter.c
gtk/util.c
gtk/util.h

index 8e999bf487771458122e94c1027b175f059dbf64..6be75f563ecba78586e7e008fac75877bf69cebb 100644 (file)
@@ -23,6 +23,7 @@
 
 #include "actions.h"
 #include "details.h"
+#include "favicon.h" /* gtr_get_favicon() */
 #include "file-list.h"
 #include "hig.h"
 #include "tr-prefs.h"
@@ -1885,6 +1886,7 @@ enum
   TRACKER_COL_BACKUP,
   TRACKER_COL_TORRENT_NAME,
   TRACKER_COL_TRACKER_NAME,
+  TRACKER_COL_FAVICON,
   TRACKER_N_COLS
 };
 
@@ -1926,6 +1928,30 @@ populate_tracker_buffer( GtkTextBuffer * buffer, const tr_torrent * tor )
 
 #define TORRENT_PTR_KEY "torrent-pointer"
 
+static void
+favicon_ready_cb( gpointer pixbuf, gpointer vreference )
+{
+    GtkTreeIter iter;
+    GtkTreeRowReference * reference = vreference;
+
+    if( pixbuf != NULL )
+    {
+        GtkTreePath * path = gtk_tree_row_reference_get_path( reference );
+        GtkTreeModel * model = gtk_tree_row_reference_get_model( reference );
+
+        if( gtk_tree_model_get_iter( model, &iter, path ) )
+            gtk_list_store_set( GTK_LIST_STORE( model ), &iter,
+                                TRACKER_COL_FAVICON, pixbuf,
+                                -1 );
+
+        gtk_tree_path_free( path );
+
+        g_object_unref( pixbuf );
+    }
+
+    gtk_tree_row_reference_free( reference );
+}
+
 static void
 refreshTracker( struct DetailsImpl * di, tr_torrent ** torrents, int n )
 {
@@ -1957,7 +1983,8 @@ refreshTracker( struct DetailsImpl * di, tr_torrent ** torrents, int n )
                                                     G_TYPE_STRING,
                                                     G_TYPE_BOOLEAN,
                                                     G_TYPE_STRING,
-                                                    G_TYPE_STRING );
+                                                    G_TYPE_STRING,
+                                                    GDK_TYPE_PIXBUF );
 
         filter = gtk_tree_model_filter_new( GTK_TREE_MODEL( store ), NULL );
         gtk_tree_model_filter_set_visible_func( GTK_TREE_MODEL_FILTER( filter ),
@@ -1979,6 +2006,8 @@ refreshTracker( struct DetailsImpl * di, tr_torrent ** torrents, int n )
     model = GTK_TREE_MODEL( store );
     if( n && !gtk_tree_model_get_iter_first( model, &iter ) )
     {
+        tr_session * session = tr_core_session( di->core );
+
         for( i=0; i<n; ++i )
         {
             int j;
@@ -1987,12 +2016,23 @@ refreshTracker( struct DetailsImpl * di, tr_torrent ** torrents, int n )
             const tr_info * inf = tr_torrentInfo( tor );
 
             for( j=0; j<statCount[i]; ++j )
+            {
+                GtkTreePath * path;
+                GtkTreeRowReference * reference;
+                const tr_tracker_stat * st = &stats[i][j];
+
                 gtk_list_store_insert_with_values( store, &iter, -1,
                     TRACKER_COL_TORRENT_ID, torrentId,
                     TRACKER_COL_TRACKER_INDEX, j,
                     TRACKER_COL_TORRENT_NAME, inf->name,
-                    TRACKER_COL_TRACKER_NAME, stats[i][j].host,
+                    TRACKER_COL_TRACKER_NAME, st->host,
                     -1 );
+
+                path = gtk_tree_model_get_path( model, &iter );
+                reference = gtk_tree_row_reference_new( model, path );
+                gtr_get_favicon_from_url( session, st->announce, favicon_ready_cb, reference );
+                gtk_tree_path_free( path );
+            }
         }
     }
 
@@ -2170,9 +2210,10 @@ static GtkWidget*
 tracker_page_new( struct DetailsImpl * di )
 {
     gboolean b;
-    GtkWidget *vbox, *sw, *w, *v, *hbox;
     GtkCellRenderer *r;
     GtkTreeViewColumn *c;
+    GtkWidget *vbox, *sw, *w, *v, *hbox;
+    const int pad = ( GUI_PAD + GUI_PAD_BIG ) / 2;
 
     vbox = gtk_vbox_new( FALSE, GUI_PAD );
     gtk_container_set_border_width( GTK_CONTAINER( vbox ), GUI_PAD_BIG );
@@ -2183,13 +2224,20 @@ tracker_page_new( struct DetailsImpl * di )
     g_signal_connect( v, "button-release-event",
                       G_CALLBACK( on_tree_view_button_released ), NULL );
     gtk_tree_view_set_rules_hint( GTK_TREE_VIEW( v ), TRUE );
-    r = gtk_cell_renderer_text_new( );
-    g_object_set( r, "ellipsize", PANGO_ELLIPSIZE_END, NULL );
-    c = gtk_tree_view_column_new_with_attributes( _( "Trackers" ), r, "markup", TRACKER_COL_TEXT, NULL );
+
+    c = gtk_tree_view_column_new( );
+    gtk_tree_view_column_set_title( c, _( "Trackers" ) );
     gtk_tree_view_append_column( GTK_TREE_VIEW( v ), c );
-    g_object_set( G_OBJECT( r ), "ypad", (GUI_PAD+GUI_PAD_BIG)/2,
-                                 "xpad", (GUI_PAD+GUI_PAD_BIG)/2,
-                                 NULL );
+
+    r = gtk_cell_renderer_pixbuf_new( );
+    g_object_set( r, "width", 20 + (GUI_PAD_SMALL*2), "xpad", GUI_PAD_SMALL, "ypad", pad, "yalign", 0.0f, NULL );
+    gtk_tree_view_column_pack_start( c, r, FALSE );
+    gtk_tree_view_column_add_attribute( c, r, "pixbuf", TRACKER_COL_FAVICON );
+
+    r = gtk_cell_renderer_text_new( );
+    g_object_set( G_OBJECT( r ), "ellipsize", PANGO_ELLIPSIZE_END, "xpad", GUI_PAD_SMALL, "ypad", pad, NULL );
+    gtk_tree_view_column_pack_start( c, r, TRUE );
+    gtk_tree_view_column_add_attribute( c, r, "markup", TRACKER_COL_TEXT );
 
     sw = gtk_scrolled_window_new( NULL, NULL );
     gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( sw ),
index d776217537399e46b08dc7b12376e41a4964a9e1..4d5f2663b4077e5ab5b46b8e34dcfa18226dc5e7 100644 (file)
@@ -169,3 +169,14 @@ gtr_get_favicon( tr_session  * session,
         g_free( url );
     }
 }
+
+void
+gtr_get_favicon_from_url( tr_session  * session,
+                          const char  * url,
+                          GFunc         pixbuf_ready_func,
+                          gpointer      pixbuf_ready_func_data )
+{
+    char * host = gtr_get_host_from_url( url );
+    gtr_get_favicon( session, host, pixbuf_ready_func, pixbuf_ready_func_data );
+    g_free( host );
+}
index ef6d8f64afb51a248cf060e5ac6de9bdd228f598..2ccebdb0ed0180cb6c850a29475c01df5b520d64 100644 (file)
 #include <gtk/gtk.h>
 #include <libtransmission/transmission.h>
 
-void gtr_get_favicon( tr_session * session,
-                      const char * host,
-                      GFunc pixbuf_ready_func,
-                      gpointer pixbuf_ready_func_data );
+void gtr_get_favicon( tr_session  * session,
+                      const char  * host,
+                      GFunc         pixbuf_ready_func,
+                      gpointer      pixbuf_ready_func_data );
+
+void gtr_get_favicon_from_url( tr_session  * session,
+                               const char  * url,
+                               GFunc         pixbuf_ready_func,
+                               gpointer      pixbuf_ready_func_data );
+
 
 #endif
index 232fcbbf7087cd9058cb31a27b4ef59c8247052f..3bfbf3e7f06304921236fc74b25b2b6ba7f3f1bd 100644 (file)
@@ -71,28 +71,6 @@ pstrcmp( const void * a, const void * b )
     return strcmp( *(const char**)a, *(const char**)b );
 }
 
-/* pattern-matching text; ie, legaltorrents.com */
-static char*
-get_host_from_url( const char * url )
-{
-    char * h = NULL;
-    char * name;
-    const char * first_dot;
-    const char * last_dot;
-
-    tr_urlParse( url, -1, NULL, &h, NULL, NULL );
-    first_dot = strchr( h, '.' );
-    last_dot = strrchr( h, '.' );
-
-    if( ( first_dot ) && ( last_dot ) && ( first_dot != last_dot ) )
-        name = g_strdup( first_dot + 1 );
-    else
-        name = g_strdup( h );
-
-    tr_free( h );
-    return name;
-}
-
 /* human-readable name; ie, Legaltorrents */
 static char*
 get_name_from_host( const char * host )
@@ -185,7 +163,7 @@ category_filter_model_update( GtkTreeStore * store )
         for( i=0, n=inf->trackerCount; i<n; ++i )
         {
             int k;
-            char * key = get_host_from_url( inf->trackers[i].announce );
+            char * key = gtr_get_host_from_url( inf->trackers[i].announce );
             int * count = g_hash_table_lookup( hosts_hash, key );
             if( count == NULL )
             {
@@ -580,7 +558,7 @@ testCategory( GtkWidget * category_combo, tr_torrent * tor )
             char * host;
             gtk_tree_model_get( model, &iter, CAT_FILTER_COL_HOST, &host, -1 );
             for( i=0; i<inf->trackerCount; ++i ) {
-                char * tmp = get_host_from_url( inf->trackers[i].announce );
+                char * tmp = gtr_get_host_from_url( inf->trackers[i].announce );
                 const gboolean hit = !strcmp( tmp, host );
                 g_free( tmp );
                 if( hit )
index 497cad421c79afb5bf9d6b462f5a1ac3258fc207..932c3e9b891987150e6cc9b0febfae943bd49b96 100644 (file)
@@ -331,6 +331,27 @@ decode_uri( const char * uri )
     return ret;
 }
 
+/* pattern-matching text; ie, legaltorrents.com */
+char*
+gtr_get_host_from_url( const char * url )
+{
+    char * h = NULL;
+    char * name;
+    const char * first_dot;
+    const char * last_dot;
+
+    tr_urlParse( url, -1, NULL, &h, NULL, NULL );
+    first_dot = strchr( h, '.' );
+    last_dot = strrchr( h, '.' );
+
+    if( ( first_dot ) && ( last_dot ) && ( first_dot != last_dot ) )
+        name = g_strdup( first_dot + 1 );
+    else
+        name = g_strdup( h );
+
+    tr_free( h );
+    return name;
+}
 
 gboolean
 gtr_is_supported_url( const char * str )
index 0ee1517017fac3c354324ad5d1047e8888a2047c..bff94bd5f370395c63b07dd3d12ffd08c3bf4d0e 100644 (file)
@@ -62,6 +62,9 @@ char* gtr_localtime2( char * buf, time_t time, size_t buflen );
 ****
 ***/
 
+/* http://www.legaltorrents.com/some/announce/url --> legaltorrents.com */
+char* gtr_get_host_from_url( const char * url );
+
 gboolean gtr_is_supported_url( const char * str );
 
 gboolean gtr_is_magnet_link( const char * str );