GtkWidget* gtr_torrent_open_from_file_dialog_new( GtkWindow * parent, TrCore * core ) { GtkWidget * w; GtkWidget * c; const char * folder; w = gtk_file_chooser_dialog_new( _( "Open a Torrent" ), parent, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL ); gtk_dialog_set_alternative_button_order( GTK_DIALOG( w ), GTK_RESPONSE_ACCEPT, GTK_RESPONSE_CANCEL, -1 ); gtk_file_chooser_set_select_multiple( GTK_FILE_CHOOSER( w ), TRUE ); addTorrentFilters( GTK_FILE_CHOOSER( w ) ); g_signal_connect( w, "response", G_CALLBACK( onOpenDialogResponse ), core ); if( ( folder = gtr_pref_string_get( PREF_KEY_OPEN_DIALOG_FOLDER ) ) ) gtk_file_chooser_set_current_folder( GTK_FILE_CHOOSER( w ), folder ); c = gtk_check_button_new_with_mnemonic( _( "Show _options dialog" ) ); gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( c ), gtr_pref_flag_get( PREF_KEY_OPTIONS_PROMPT ) ); gtk_file_chooser_set_extra_widget( GTK_FILE_CHOOSER( w ), c ); gtk_widget_show( c ); return w; }
static void onOpenDialogResponse( GtkDialog * dialog, int response, gpointer core ) { char * folder; /* remember this folder the next time we use this dialog */ folder = gtk_file_chooser_get_current_folder( GTK_FILE_CHOOSER( dialog ) ); gtr_pref_string_set( PREF_KEY_OPEN_DIALOG_FOLDER, folder ); g_free( folder ); if( response == GTK_RESPONSE_ACCEPT ) { GtkFileChooser * chooser = GTK_FILE_CHOOSER( dialog ); GtkWidget * w = gtk_file_chooser_get_extra_widget( chooser ); GtkToggleButton * tb = GTK_TOGGLE_BUTTON( w ); const gboolean do_start = gtr_pref_flag_get( TR_PREFS_KEY_START ); const gboolean do_prompt = gtk_toggle_button_get_active( tb ); const gboolean do_notify = FALSE; GSList * files = gtk_file_chooser_get_files( chooser ); gtr_core_add_files( core, files, do_start, do_prompt, do_notify ); g_slist_foreach( files, (GFunc)g_object_unref, NULL ); g_slist_free( files ); } gtk_widget_destroy( GTK_WIDGET( dialog ) ); }
int gtr_file_trash_or_remove (const char * filename) { GFile * file; gboolean trashed = FALSE; g_return_val_if_fail (filename && *filename, 0); file = g_file_new_for_path (filename); if (gtr_pref_flag_get (TR_KEY_trash_can_enabled)) { GError * err = NULL; trashed = g_file_trash (file, NULL, &err); if (err) { g_message ("Unable to trash file \"%s\": %s", filename, err->message); g_clear_error (&err); } } if (!trashed) { GError * err = NULL; g_file_delete (file, NULL, &err); if (err) { g_message ("Unable to delete file \"%s\": %s", filename, err->message); g_clear_error (&err); } } g_object_unref (G_OBJECT (file)); return 0; }
int gtr_file_trash_or_remove( const char * filename ) { gboolean trashed = FALSE; GFile * file = g_file_new_for_path( filename ); if( gtr_pref_flag_get( PREF_KEY_TRASH_CAN_ENABLED ) ) { GError * err = NULL; trashed = g_file_trash( file, NULL, &err ); if( err ) { g_message( "Unable to trash file \"%s\": %s", filename, err->message ); g_clear_error( &err ); } } if( !trashed ) { GError * err = NULL; g_file_delete( file, NULL, &err ); if( err ) { g_message( "Unable to delete file \"%s\": %s", filename, err->message ); g_clear_error( &err ); } } g_object_unref( G_OBJECT( file ) ); return 0; }
static gboolean core_watchdir_idle (gpointer gcore) { GSList * l; GSList * changing = NULL; GSList * unchanging = NULL; TrCore * core = TR_CORE (gcore); const time_t now = tr_time (); struct TrCorePrivate * p = core->priv; /* separate the files into two lists: changing and unchanging */ for (l=p->monitor_files; l!=NULL; l=l->next) { GFile * file = l->data; const time_t mtime = get_file_mtime (file); if (mtime + 2 >= now) changing = g_slist_prepend (changing, file); else unchanging = g_slist_prepend (unchanging, file); } /* add the files that have stopped changing */ if (unchanging != NULL) { const gboolean do_start = gtr_pref_flag_get (TR_KEY_start_added_torrents); const gboolean do_prompt = gtr_pref_flag_get (TR_KEY_show_options_window); core->priv->adding_from_watch_dir = TRUE; gtr_core_add_files (core, unchanging, do_start, do_prompt, TRUE); g_slist_foreach (unchanging, (GFunc)rename_torrent_and_unref_file, NULL); g_slist_free (unchanging); core->priv->adding_from_watch_dir = FALSE; } /* keep monitoring the ones that are still changing */ g_slist_free (p->monitor_files); p->monitor_files = changing; /* if monitor_files is nonempty, keep checking every second */ if (core->priv->monitor_files) return G_SOURCE_CONTINUE; core->priv->monitor_idle_tag = 0; return G_SOURCE_REMOVE; }
static void tr_core_apply_defaults( tr_ctor * ctor ) { if( tr_ctorGetPaused( ctor, TR_FORCE, NULL ) ) tr_ctorSetPaused( ctor, TR_FORCE, !gtr_pref_flag_get( TR_PREFS_KEY_START ) ); if( tr_ctorGetDeleteSource( ctor, NULL ) ) tr_ctorSetDeleteSource( ctor, gtr_pref_flag_get( TR_PREFS_KEY_TRASH_ORIGINAL ) ); if( tr_ctorGetPeerLimit( ctor, TR_FORCE, NULL ) ) tr_ctorSetPeerLimit( ctor, TR_FORCE, gtr_pref_int_get( TR_PREFS_KEY_PEER_LIMIT_TORRENT ) ); if( tr_ctorGetDownloadDir( ctor, TR_FORCE, NULL ) ) { const char * path = gtr_pref_string_get( TR_PREFS_KEY_DOWNLOAD_DIR ); tr_ctorSetDownloadDir( ctor, TR_FORCE, path ); } }
static GtkWidget* new_check_button (const char * mnemonic, const tr_quark key, gpointer core) { GtkWidget * w = gtk_check_button_new_with_mnemonic (mnemonic); g_object_set_data (G_OBJECT(w), PREF_KEY, GINT_TO_POINTER(key)); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), gtr_pref_flag_get (key)); g_signal_connect (w, "toggled", G_CALLBACK (toggled_cb), core); return w; }