mirror of
https://github.com/transmission/transmission
synced 2025-03-12 07:03:44 +00:00
(trunk gtk) #3143 "remote RPC calls cause gtk+ API calls to be made from the wrong thread" -- fixed in trunk for 2.00
This commit is contained in:
parent
a0bc78a6dd
commit
ceba9e6722
9 changed files with 70 additions and 79 deletions
|
@ -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 );
|
||||
}
|
||||
}
|
||||
|
|
45
gtk/main.c
45
gtk/main.c
|
@ -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, >or, -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 );
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 )
|
||||
{
|
||||
const tr_torrent * tor = tr_torrent_handle( gtor );
|
||||
|
||||
if( tor != NULL )
|
||||
tr_core_remove_torrent_from_id( core, tr_torrentId( tor ), deleteFiles );
|
||||
}
|
||||
|
||||
void
|
||||
tr_core_remove_torrent_from_id( TrCore * core, int id, gboolean deleteFiles )
|
||||
{
|
||||
GtkTreeIter iter;
|
||||
|
||||
if( findTorrentInModel( core, id, &iter ) )
|
||||
{
|
||||
TrTorrent * gtor;
|
||||
TrTorrent * gtor = NULL;
|
||||
tr_torrent * tor = NULL;
|
||||
GtkTreeModel * model = tr_core_model( core );
|
||||
gtk_tree_model_get( model, &iter, MC_TORRENT, >or, -1 );
|
||||
tr_torrent_clear( gtor );
|
||||
|
||||
gtk_tree_model_get( model, &iter, MC_TORRENT, >or,
|
||||
MC_TORRENT_RAW, &tor,
|
||||
-1 );
|
||||
|
||||
/* remove from the gui */
|
||||
gtk_list_store_remove( GTK_LIST_STORE( model ), &iter );
|
||||
g_object_unref( G_OBJECT( gtor ) );
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
tr_core_remove_torrent( TrCore * core,
|
||||
TrTorrent * gtor,
|
||||
int deleteFiles )
|
||||
{
|
||||
const tr_torrent * tor = tr_torrent_handle( gtor );
|
||||
/* maybe delete the downloaded files */
|
||||
if( deleteFiles )
|
||||
tr_torrentDeleteLocalData( tor, gtr_file_trash_or_remove );
|
||||
|
||||
if( tor )
|
||||
{
|
||||
int id = tr_torrentId( tor );
|
||||
GtkTreeIter iter;
|
||||
if( findTorrentInModel( core, id, &iter ) )
|
||||
{
|
||||
GtkTreeModel * model = tr_core_model( core );
|
||||
|
||||
/* remove from the gui */
|
||||
gtk_list_store_remove( GTK_LIST_STORE( model ), &iter );
|
||||
|
||||
/* maybe delete the downloaded files */
|
||||
if( deleteFiles )
|
||||
tr_torrent_delete_files( gtor );
|
||||
|
||||
/* remove the torrent */
|
||||
tr_torrent_set_remove_flag( gtor, TRUE );
|
||||
g_object_unref( G_OBJECT( gtor ) );
|
||||
}
|
||||
/* 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 */
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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 )
|
||||
{
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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 )
|
||||
{
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Add table
Reference in a new issue