]> granicus.if.org Git - transmission/commitdiff
(trunk gtk) #3143 "remote RPC calls cause gtk+ API calls to be made from the wrong...
authorCharles Kerr <charles@transmissionbt.com>
Wed, 21 Apr 2010 04:38:54 +0000 (04:38 +0000)
committerCharles Kerr <charles@transmissionbt.com>
Wed, 21 Apr 2010 04:38:54 +0000 (04:38 +0000)
gtk/add-dialog.c
gtk/main.c
gtk/torrent-cell-renderer.c
gtk/tr-core.c
gtk/tr-core.h
gtk/tr-torrent.c
gtk/tr-torrent.h
gtk/util.c
gtk/util.h

index c11e1d13cbf969dd27ca58b94d51bb89f23e3e81..482ad32db91c0f14a5cc9ace44f29fd159eeab74 100644 (file)
@@ -133,8 +133,8 @@ addResponseCB( GtkDialog * dialog,
             tr_core_add_torrent( data->core, data->gtor, FALSE );
 
             if( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( data->trash_check ) ) )
+                gtr_file_trash_or_remove( data->filename );
 
-                tr_file_trash_or_remove( data->filename );
             save_recent_destination( data->core, data->downloadDir );
         }
     }
index 44dd4047cc819b3714853a25c929aad700c1adb9..94e66da85b9b94fbc48c4a3c04a47f14c32f70fe 100644 (file)
@@ -401,6 +401,21 @@ signal_handler( int sig )
     }
 }
 
+struct remove_torrent_idle_data
+{
+    TrCore * core;
+    int id;
+};
+
+static gboolean
+remove_torrent_idle( gpointer gdata )
+{
+    struct remove_torrent_idle_data * data = gdata;
+    tr_core_remove_torrent_from_id( data->core, data->id, FALSE );
+    g_free( data );
+    return FALSE; /* tell g_idle not to call this func twice */
+}
+
 static void
 setupsighandlers( void )
 {
@@ -414,6 +429,7 @@ onRPCChanged( tr_session            * session,
               struct tr_torrent     * tor,
               void                  * gdata )
 {
+    tr_rpc_callback_status status = TR_RPC_OK;
     struct cbdata * cbdata = gdata;
     gdk_threads_enter( );
 
@@ -423,9 +439,14 @@ onRPCChanged( tr_session            * session,
             tr_core_add_torrent( cbdata->core, tr_torrent_new_preexisting( tor ), TRUE );
             break;
 
-        case TR_RPC_TORRENT_REMOVING:
-            tr_core_torrent_destroyed( cbdata->core, tr_torrentId( tor ) );
+        case TR_RPC_TORRENT_REMOVING: {
+            struct remove_torrent_idle_data * data = g_new0( struct remove_torrent_idle_data, 1 );
+            data->id = tr_torrentId( tor );
+            data->core = cbdata->core;
+            gtr_idle_add( remove_torrent_idle, data );
+            status = TR_RPC_NOREMOVE;
             break;
+        }
 
         case TR_RPC_SESSION_CHANGED:
             tr_sessionGetSettings( session, pref_get_all( ) );
@@ -440,7 +461,7 @@ onRPCChanged( tr_session            * session,
     }
 
     gdk_threads_leave( );
-    return TR_RPC_OK;
+    return status;
 }
 
 static GSList *
@@ -1438,21 +1459,21 @@ msgwinclosed( void )
 }
 
 static void
-accumulateSelectedTorrents( GtkTreeModel *      model,
+accumulateSelectedTorrents( GtkTreeModel * model,
                             GtkTreePath  * path UNUSED,
-                            GtkTreeIter *       iter,
-                            gpointer            gdata )
+                            GtkTreeIter  * iter,
+                            gpointer       gdata )
 {
-    GSList **   data = ( GSList** ) gdata;
-    TrTorrent * tor = NULL;
+    GSList ** data = ( GSList** ) gdata;
+    TrTorrent * gtor = NULL;
 
-    gtk_tree_model_get( model, iter, MC_TORRENT, &tor, -1 );
-    *data = g_slist_prepend( *data, tor );
+    gtk_tree_model_get( model, iter, MC_TORRENT, &gtor, -1 );
+    *data = g_slist_prepend( *data, gtor );
+    g_object_unref( G_OBJECT( gtor ) );
 }
 
 static void
-removeSelected( struct cbdata * data,
-                gboolean        delete_files )
+removeSelected( struct cbdata * data, gboolean delete_files )
 {
     GSList *           l = NULL;
     GtkTreeSelection * s = tr_window_get_selection( data->wind );
index cf7958a145c5a076b0140ab88b862d825a178526..4a2a417d0101c74566b8efe0b24cee8842120ddc 100644 (file)
@@ -900,10 +900,10 @@ torrent_cell_renderer_init( GTypeInstance *  instance,
     p->progress_renderer = gtk_cell_renderer_progress_new(  );
     p->icon_renderer = gtk_cell_renderer_pixbuf_new(  );
     g_object_set( p->text_renderer_err, "foreground", "red", NULL );
-    tr_object_ref_sink( p->text_renderer );
-    tr_object_ref_sink( p->text_renderer_err );
-    tr_object_ref_sink( p->progress_renderer );
-    tr_object_ref_sink( p->icon_renderer );
+    gtr_object_ref_sink( p->text_renderer );
+    gtr_object_ref_sink( p->text_renderer_err );
+    gtr_object_ref_sink( p->progress_renderer );
+    gtr_object_ref_sink( p->icon_renderer );
 
     p->bar_height = DEFAULT_BAR_HEIGHT;
 }
index 7bbce1cc2df973387b6e1add511bff452c3666a4..b1571fa7804f76ba69cf4e1879b334ffa8d10fd0 100644 (file)
@@ -1181,48 +1181,40 @@ findTorrentInModel( TrCore *      core,
 }
 
 void
-tr_core_torrent_destroyed( TrCore * core,
-                           int      id )
+tr_core_remove_torrent( TrCore * core, TrTorrent * gtor, gboolean deleteFiles )
 {
-    GtkTreeIter iter;
+    const tr_torrent * tor = tr_torrent_handle( gtor );
 
-    if( findTorrentInModel( core, id, &iter ) )
-    {
-        TrTorrent * gtor;
-        GtkTreeModel * model = tr_core_model( core );
-        gtk_tree_model_get( model, &iter, MC_TORRENT, &gtor, -1 );
-        tr_torrent_clear( gtor );
-        gtk_list_store_remove( GTK_LIST_STORE( model ), &iter );
-        g_object_unref( G_OBJECT( gtor ) );
-    }
+    if( tor != NULL )
+        tr_core_remove_torrent_from_id( core, tr_torrentId( tor ), deleteFiles );
 }
 
 void
-tr_core_remove_torrent( TrCore *    core,
-                        TrTorrent * gtor,
-                        int         deleteFiles )
+tr_core_remove_torrent_from_id( TrCore * core, int id, gboolean deleteFiles )
 {
-    const tr_torrent * tor = tr_torrent_handle( gtor );
+    GtkTreeIter iter;
 
-    if( tor )
+    if( findTorrentInModel( core, id, &iter ) )
     {
-        int         id = tr_torrentId( tor );
-        GtkTreeIter iter;
-        if( findTorrentInModel( core, id, &iter ) )
-        {
-            GtkTreeModel * model = tr_core_model( core );
+        TrTorrent * gtor = NULL;
+        tr_torrent * tor = NULL;
+        GtkTreeModel * model = tr_core_model( core );
 
-            /* remove from the gui */
-            gtk_list_store_remove( GTK_LIST_STORE( model ), &iter );
+        gtk_tree_model_get( model, &iter, MC_TORRENT, &gtor,
+                                          MC_TORRENT_RAW, &tor,
+                                          -1 );
 
-            /* maybe delete the downloaded files */
-            if( deleteFiles )
-                tr_torrent_delete_files( gtor );
+        /* remove from the gui */
+        gtk_list_store_remove( GTK_LIST_STORE( model ), &iter );
 
-            /* remove the torrent */
-            tr_torrent_set_remove_flag( gtor, TRUE );
-            g_object_unref( G_OBJECT( gtor ) );
-        }
+        /* maybe delete the downloaded files */
+        if( deleteFiles )
+            tr_torrentDeleteLocalData( tor, gtr_file_trash_or_remove );
+
+        /* remove the torrent */
+        tr_torrent_set_remove_flag( gtor, TRUE );
+        g_warn_if_fail( G_OBJECT( gtor )->ref_count == 1 );
+        g_object_unref( G_OBJECT( gtor ) ); /* remove the last refcount */
     }
 }
 
index c3ebe53ae420b62310d25181b45eb6acfaa3f0e2..9e6a1974dcd5c9a6fb5e74e0efac894f3ffea44a 100644 (file)
@@ -159,12 +159,9 @@ void     tr_core_torrents_added( TrCore * self );
 *******
 ******/
 
-/* we've gotten notice from RPC that a torrent has been destroyed;
-   update our gui accordingly */
-void  tr_core_torrent_destroyed( TrCore * self, int torrentId );
-
 /* remove a torrent */
-void  tr_core_remove_torrent( TrCore * self, TrTorrent * gtor, int deleteFiles );
+void  tr_core_remove_torrent( TrCore * self, TrTorrent * gtor, gboolean deleteFiles );
+void  tr_core_remove_torrent_from_id( TrCore * self, int id, gboolean deleteFiles );
 
 /* update the model with current torrent status */
 void  tr_core_update( TrCore * self );
index 936aa9129a37378eb8356e8a0667c0f63d5e97e1..7a3b8e839121bc15090b4da59f4e7dd2111a67a2 100644 (file)
@@ -90,15 +90,6 @@ tr_torrent_dispose( GObject * o )
     parent->dispose( o );
 }
 
-void
-tr_torrent_clear( TrTorrent * tor )
-{
-    g_return_if_fail( tor );
-    g_return_if_fail( tor->priv );
-
-    tor->priv->handle = NULL;
-}
-
 static void
 tr_torrent_class_init( gpointer              g_class,
                        gpointer g_class_data UNUSED )
@@ -209,7 +200,7 @@ tr_torrent_new_ctor( tr_session   * session,
 
         /* #1294: don't delete the source .torrent file if it's our internal copy */
         if( !is_internal )
-            tr_file_trash_or_remove( source );
+            gtr_file_trash_or_remove( source );
     }
 
     return tor ? maketorrent( tor ) : NULL;
@@ -223,12 +214,6 @@ tr_torrent_set_remove_flag( TrTorrent * gtor,
         gtor->priv->do_remove = do_remove;
 }
 
-void
-tr_torrent_delete_files( TrTorrent * gtor )
-{
-    tr_torrentDeleteLocalData( tr_torrent_handle( gtor ), tr_file_trash_or_remove );
-}
-
 void
 tr_torrent_open_folder( TrTorrent * gtor )
 {
index e51586290d94fe8f2a51af43b582f30914ca7b31..f147a44c13af9ae9ae0ff62d8cd7102a6b10196a 100644 (file)
@@ -57,16 +57,12 @@ TrTorrentClass;
 
 GType          tr_torrent_get_type( void );
 
-void           tr_torrent_clear( TrTorrent * tor );
-
 tr_torrent *   tr_torrent_handle( TrTorrent *tor );
 
 const tr_stat *tr_torrent_stat( TrTorrent *tor );
 
 const tr_info *tr_torrent_info( TrTorrent *tor );
 
-void           tr_torrent_delete_files( TrTorrent * tor );
-
 void           tr_torrent_open_folder( TrTorrent * tor );
 
 TrTorrent *    tr_torrent_new_preexisting( tr_torrent * tor );
index f867405ba7344d7628d2ca89f44abf76226c1f66..497cad421c79afb5bf9d6b462f5a1ac3258fc207 100644 (file)
@@ -464,7 +464,7 @@ on_tree_view_button_released( GtkWidget *      view,
 }
 
 gpointer
-tr_object_ref_sink( gpointer object )
+gtr_object_ref_sink( gpointer object )
 {
 #if GLIB_CHECK_VERSION( 2, 10, 0 )
     g_object_ref_sink( object );
@@ -476,7 +476,7 @@ tr_object_ref_sink( gpointer object )
 }
 
 int
-tr_file_trash_or_remove( const char * filename )
+gtr_file_trash_or_remove( const char * filename )
 {
     if( filename && *filename )
     {
index ee2609d6666a33a55baee421b07334b5f736a846..7f686947fbaf44a6b17b07a846fe6bdc512645cb 100644 (file)
@@ -117,7 +117,7 @@ void gtr_toolbar_set_orientation( GtkToolbar * tb, GtkOrientation orientation );
 void gtr_widget_set_tooltip_text( GtkWidget * w, const char * tip );
 
 /* backwards-compatible wrapper around g_object_ref_sink() */
-gpointer tr_object_ref_sink( gpointer object );
+gpointer gtr_object_ref_sink( gpointer object );
 
 /***
 ****
@@ -162,6 +162,6 @@ gboolean on_tree_view_button_released( GtkWidget      * view,
 
 
 /* move a file to the trashcan if GIO is available; otherwise, delete it */
-int tr_file_trash_or_remove( const char * filename );
+int gtr_file_trash_or_remove( const char * filename );
 
 #endif /* GTR_UTIL_H */