diff --git a/AUTHORS b/AUTHORS index 1a248b275..e9a0abae9 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,7 +1,7 @@ AUTHORS for Transmission ======================================================= -Transmission is written is maintained by: +Transmission is written and maintained by: Eric Petit + Back-end @@ -44,3 +44,6 @@ Martin Stadtmueller John Blitch + Contextual menu patch + +Mitchell Livingston + + OS X patches diff --git a/gtk/main.c b/gtk/main.c index db47f6de7..c6cfd1bfd 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -159,7 +159,7 @@ main(int argc, char **argv) { tr = tr_init(); - if(cf_init(tr_getPrefsDirectory(tr), &err)) { + if(cf_init(tr_getPrefsDirectory(), &err)) { if(cf_lock(&err)) { /* create main window now so any error dialogs can be it's children */ mainwind = gtk_window_new(GTK_WINDOW_TOPLEVEL); diff --git a/libtransmission/fastresume.h b/libtransmission/fastresume.h index b54e10331..838b7073f 100644 --- a/libtransmission/fastresume.h +++ b/libtransmission/fastresume.h @@ -40,11 +40,10 @@ static char * fastResumeFileName( tr_io_t * io ) { - tr_torrent_t * tor = io->tor; char * ret, * p; int i; - asprintf( &ret, "%s/resume.%40d", tor->prefsDirectory, 0 ); + asprintf( &ret, "%s/resume.%40d", tr_getPrefsDirectory(), 0 ); p = &ret[ strlen( ret ) - 2 * SHA_DIGEST_LENGTH ]; for( i = 0; i < SHA_DIGEST_LENGTH; i++ ) diff --git a/libtransmission/fdlimit.c b/libtransmission/fdlimit.c index 53e413721..377f2523b 100644 --- a/libtransmission/fdlimit.c +++ b/libtransmission/fdlimit.c @@ -104,7 +104,7 @@ FILE * tr_fdFileOpen( tr_fd_t * f, char * path ) int i, winner; uint64_t date; - tr_lockLock( f->lock ); + tr_lockLock( &f->lock ); /* Is it already open? */ for( i = 0; i < TR_MAX_OPEN_FILES; i++ ) @@ -115,9 +115,9 @@ FILE * tr_fdFileOpen( tr_fd_t * f, char * path ) if( f->open[i].status & STATUS_CLOSING ) { /* Wait until the file is closed */ - tr_lockUnlock( f->lock ); + tr_lockUnlock( &f->lock ); tr_wait( 10 ); - tr_lockLock( f->lock ); + tr_lockLock( &f->lock ); i = -1; continue; } @@ -162,16 +162,16 @@ FILE * tr_fdFileOpen( tr_fd_t * f, char * path ) and we don't want to block other threads */ tr_dbg( "Closing %s", f->open[winner].path ); f->open[winner].status = STATUS_CLOSING; - tr_lockUnlock( f->lock ); + tr_lockUnlock( &f->lock ); fclose( f->open[winner].file ); - tr_lockLock( f->lock ); + tr_lockLock( &f->lock ); goto open; } /* All used! Wait a bit and try again */ - tr_lockUnlock( f->lock ); + tr_lockUnlock( &f->lock ); tr_wait( 10 ); - tr_lockLock( f->lock ); + tr_lockLock( &f->lock ); } open: @@ -182,7 +182,7 @@ open: done: f->open[winner].status = STATUS_USED; f->open[winner].date = tr_date(); - tr_lockUnlock( f->lock ); + tr_lockUnlock( &f->lock ); return f->open[winner].file; } @@ -193,7 +193,7 @@ done: void tr_fdFileRelease( tr_fd_t * f, FILE * file ) { int i; - tr_lockLock( f->lock ); + tr_lockLock( &f->lock ); for( i = 0; i < TR_MAX_OPEN_FILES; i++ ) { @@ -204,7 +204,7 @@ void tr_fdFileRelease( tr_fd_t * f, FILE * file ) } } - tr_lockUnlock( f->lock ); + tr_lockUnlock( &f->lock ); } /*********************************************************************** @@ -214,7 +214,7 @@ void tr_fdFileClose( tr_fd_t * f, char * path ) { int i; - tr_lockLock( f->lock ); + tr_lockLock( &f->lock ); /* Is it already open? */ for( i = 0; i < TR_MAX_OPEN_FILES; i++ ) @@ -232,14 +232,14 @@ void tr_fdFileClose( tr_fd_t * f, char * path ) } } - tr_lockUnlock( f->lock ); + tr_lockUnlock( &f->lock ); } int tr_fdSocketWillCreate( tr_fd_t * f, int reserved ) { int ret; - tr_lockLock( f->lock ); + tr_lockLock( &f->lock ); if( reserved ) { @@ -266,14 +266,14 @@ int tr_fdSocketWillCreate( tr_fd_t * f, int reserved ) } } - tr_lockUnlock( f->lock ); + tr_lockUnlock( &f->lock ); return ret; } void tr_fdSocketClosed( tr_fd_t * f, int reserved ) { - tr_lockLock( f->lock ); + tr_lockLock( &f->lock ); if( reserved ) { @@ -284,12 +284,12 @@ void tr_fdSocketClosed( tr_fd_t * f, int reserved ) (f->normal)--; } - tr_lockUnlock( f->lock ); + tr_lockUnlock( &f->lock ); } void tr_fdClose( tr_fd_t * f ) { - tr_lockClose( f->lock ); + tr_lockClose( &f->lock ); free( f ); } diff --git a/libtransmission/inout.c b/libtransmission/inout.c index 875a896b8..ba98725a3 100644 --- a/libtransmission/inout.c +++ b/libtransmission/inout.c @@ -368,7 +368,7 @@ static int readOrWriteBytes( tr_io_t * io, uint64_t offset, int size, /* Release the torrent lock so the UI can still update itself if this blocks for a while */ - tr_lockUnlock( tor->lock ); + tr_lockUnlock( &tor->lock ); /* We don't ever read or write more than a piece at a time */ if( tr_pieceSize( piece ) < begin + size ) @@ -439,11 +439,11 @@ static int readOrWriteBytes( tr_io_t * io, uint64_t offset, int size, buf += cur; } - tr_lockLock( tor->lock ); + tr_lockLock( &tor->lock ); return 0; fail: - tr_lockLock( tor->lock ); + tr_lockLock( &tor->lock ); return 1; } diff --git a/libtransmission/internal.h b/libtransmission/internal.h index b03fbe9a9..1d372baaf 100644 --- a/libtransmission/internal.h +++ b/libtransmission/internal.h @@ -71,30 +71,6 @@ #define TR_NTOHL(p,a) (a) = ntohl(*((uint32_t*)(p))) #define TR_HTONL(a,p) *((uint32_t*)(p)) = htonl((a)) -/* Multithreading support: native threads on BeOS, pthreads elsewhere */ -#ifdef SYS_BEOS -# include -# define tr_thread_t thread_id -# define tr_threadCreate(pt,f,d) *(pt) = spawn_thread((void*)f,"",10,d); \ - resume_thread(*(pt)); -# define tr_threadJoin(t) { long e; wait_for_thread(t,&e); } -# define tr_lock_t sem_id -# define tr_lockInit(pl) *(pl) = create_sem(1,"") -# define tr_lockLock(l) acquire_sem(l) -# define tr_lockUnlock(l) release_sem(l) -# define tr_lockClose(l) delete_sem(l) -#else -# include -# define tr_thread_t pthread_t -# define tr_threadCreate(pt,f,d) pthread_create(pt,NULL,(void*)f,d) -# define tr_threadJoin(t) pthread_join(t,NULL) -# define tr_lock_t pthread_mutex_t -# define tr_lockInit(pl) pthread_mutex_init(pl,NULL) -# define tr_lockLock(l) pthread_mutex_lock(&l) -# define tr_lockUnlock(l) pthread_mutex_unlock(&l) -# define tr_lockClose(l) pthread_mutex_destroy(&l) -#endif - /* Sometimes the system defines MAX/MIN, sometimes not. In the latter case, define those here since we will use them */ #ifndef MAX @@ -109,6 +85,7 @@ typedef struct tr_torrent_s tr_torrent_t; typedef struct tr_completion_s tr_completion_t; +#include "platform.h" #include "bencode.h" #include "metainfo.h" #include "tracker.h" @@ -171,8 +148,6 @@ struct tr_torrent_s uint64_t dates[10]; uint64_t downloaded[10]; uint64_t uploaded[10]; - - char * prefsDirectory; }; #include "utils.h" @@ -190,7 +165,6 @@ struct tr_handle_s char id[21]; char key[21]; - char prefsDirectory[256]; }; #endif diff --git a/libtransmission/platform.c b/libtransmission/platform.c index 0b22e45b5..d3e8f03bf 100644 --- a/libtransmission/platform.c +++ b/libtransmission/platform.c @@ -20,40 +20,109 @@ * DEALINGS IN THE SOFTWARE. *****************************************************************************/ -#include "platform.h" +#ifdef SYS_BEOS + #include + #include +#endif +#ifdef SYS_DARWIN + #include + #include +#endif + +#include "transmission.h" + +char * tr_getPrefsDirectory() +{ + static char prefsDirectory[MAX_PATH_LENGTH]; + static int init = 0; + + if( init ) + { + return prefsDirectory; + } #ifdef SYS_BEOS -/*********************************************************************** - * tr_init_beos - *********************************************************************** - * Puts the prefsDirectory in the right place. - **********************************************************************/ -void tr_init_beos( tr_handle_t * h ) -{ - int32 length = 0; - char path[B_FILE_NAME_LENGTH]; - find_directory( B_USER_SETTINGS_DIRECTORY, dev_for_path("/boot"), - true, path, length ); - - snprintf( h->prefsDirectory, B_FILE_NAME_LENGTH, - "%s/Transmission", path ); - mkdir( h->prefsDirectory, 0755 ); -} + true, prefsDirectory, MAX_PATH_LENGTH ); + strcat( prefsDirectory, "/Transmission" ); +#elif defined( SYS_DARWIN ) + snprintf( prefsDirectory, MAX_PATH_LENGTH, + "%s/Library/Caches/Transmission", getenv( "HOME" ) ); +#else + snprintf( prefsDirectory, MAX_PATH_LENGTH, "%s/.transmission", + getenv( "HOME" ) ); #endif -/*********************************************************************** - * tr_init_platform - *********************************************************************** - * Setup the prefsDirectory for the current platform. - **********************************************************************/ -void tr_init_platform( tr_handle_t *h ) + mkdir( prefsDirectory, 0755 ); + init = 1; + +#ifdef SYS_DARWIN + DIR * dirh; + struct dirent * dirp; + char oldDirectory[MAX_PATH_LENGTH]; + char oldFile[MAX_PATH_LENGTH]; + char newFile[MAX_PATH_LENGTH]; + snprintf( oldDirectory, MAX_PATH_LENGTH, "%s/.transmission", + getenv( "HOME" ) ); + if( ( dirh = opendir( oldDirectory ) ) ) + { + while( ( dirp = readdir( dirh ) ) ) + { + if( !strcmp( ".", dirp->d_name ) || + !strcmp( "..", dirp->d_name ) ) + { + continue; + } + snprintf( oldFile, MAX_PATH_LENGTH, "%s/%s", + oldDirectory, dirp->d_name ); + snprintf( newFile, MAX_PATH_LENGTH, "%s/%s", + prefsDirectory, dirp->d_name ); + rename( oldFile, newFile ); + } + + closedir( dirh ); + rmdir( oldDirectory ); + } +#endif + + return prefsDirectory; +} + +void tr_threadCreate( tr_thread_t * t, void (*func)(void *), void * arg ) { #ifdef SYS_BEOS - tr_init_beos( h ); + *t = spawn_thread( (void *) func, "torrent-tx", arg ); + resume_thread( *t ); #else - snprintf( h->prefsDirectory, sizeof( h->prefsDirectory ), - "%s/.transmission", getenv( "HOME" ) ); - mkdir( h->prefsDirectory, 0755 ); + pthread_create( t, NULL, (void *) func, arg ); #endif } + +void tr_threadJoin( tr_thread_t * t ) +{ +#ifdef SYS_BEOS + long exit; + wait_for_thread( *t, &exit ); +#else + pthread_join( *t, NULL ); +#endif +} + +void tr_lockInit( tr_lock_t * l ) +{ +#ifdef SYS_BEOS + *l = create_sem( 1, "" ); +#else + pthread_mutex_init( l, NULL ); +#endif +} + +void tr_lockClose( tr_lock_t * l ) +{ +#ifdef SYS_BEOS + delete_sem( *l ); +#else + pthread_mutex_destroy( l ); +#endif +} + diff --git a/libtransmission/platform.h b/libtransmission/platform.h index 8ffee79f2..f41a8119c 100644 --- a/libtransmission/platform.h +++ b/libtransmission/platform.h @@ -1,5 +1,3 @@ -#ifndef TR_PLATFORM_H -#define TR_PLATFORM_H 1 /****************************************************************************** * Copyright (c) 2005 Eric Petit * @@ -21,22 +19,40 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ - -#include "transmission.h" - +#ifndef TR_PLATFORM_H +#define TR_PLATFORM_H 1 #ifdef SYS_BEOS - #include - #include + #include + typedef thread_id tr_thread_t; + typedef sem_id tr_lock_t; +#else + #include + typedef pthread_t tr_thread_t; + typedef pthread_mutex_t tr_lock_t; #endif -/*********************************************************************** - * tr_init_platform - *********************************************************************** - * Performs some platform specific initialization. - **********************************************************************/ -void tr_init_platform( tr_handle_t *h ); +void tr_threadCreate ( tr_thread_t *, void (*func)(void *), void * arg ); +void tr_threadJoin ( tr_thread_t * ); +void tr_lockInit ( tr_lock_t * ); +void tr_lockClose ( tr_lock_t * ); +static inline void tr_lockLock( tr_lock_t * l ) +{ +#ifdef SYS_BEOS + acquire_sem( *l ); +#else + pthread_mutex_lock( l ); +#endif +} +static inline void tr_lockUnlock( tr_lock_t * l ) +{ +#ifdef SYS_BEOS + release_sem( *l ); +#else + pthread_mutex_unlock( l ); +#endif +} -#endif \ No newline at end of file +#endif diff --git a/libtransmission/tracker.c b/libtransmission/tracker.c index e49591359..0c48b07bb 100644 --- a/libtransmission/tracker.c +++ b/libtransmission/tracker.c @@ -440,7 +440,7 @@ static void recvAnswer( tr_tracker_t * tc ) { tr_err( "Tracker: \"peers\" of size %d", bePeers->val.s.i ); - tr_lockUnlock( tor->lock ); + tr_lockUnlock( &tor->lock ); goto cleanup; } diff --git a/libtransmission/transmission.c b/libtransmission/transmission.c index ff5e16a4b..a393c0b53 100644 --- a/libtransmission/transmission.c +++ b/libtransmission/transmission.c @@ -22,12 +22,6 @@ #include "transmission.h" -#ifdef __cplusplus -extern "C" { -#endif - -#include "platform.h" - /*********************************************************************** * Local prototypes **********************************************************************/ @@ -73,21 +67,9 @@ tr_handle_t * tr_init() h->bindPort = TR_DEFAULT_PORT; - tr_init_platform( h ); - return h; } -/*********************************************************************** - * tr_getPrefsDirectory - *********************************************************************** - * - **********************************************************************/ -char * tr_getPrefsDirectory( tr_handle_t * h ) -{ - return (char *) h->prefsDirectory; -} - /*********************************************************************** * tr_setBindPort *********************************************************************** @@ -125,10 +107,10 @@ void tr_torrentRates( tr_handle_t * h, float * dl, float * ul ) for( i = 0; i < h->torrentCount; i++ ) { tor = h->torrents[i]; - tr_lockLock( tor->lock ); + tr_lockLock( &tor->lock ); *dl += rateDownload( tor ); *ul += rateUpload( tor ); - tr_lockUnlock( tor->lock ); + tr_lockUnlock( &tor->lock ); } } @@ -211,7 +193,6 @@ int tr_torrentInit( tr_handle_t * h, const char * path ) tor->upload = h->upload; tor->fdlimit = h->fdlimit; - tor->prefsDirectory = (char *) h->prefsDirectory; /* We have a new torrent */ h->torrents[h->torrentCount] = tor; @@ -277,11 +258,11 @@ void tr_torrentStop( tr_handle_t * h, int t ) { tr_torrent_t * tor = h->torrents[t]; - tr_lockLock( tor->lock ); + tr_lockLock( &tor->lock ); tr_trackerStopped( tor->tracker ); tor->status = TR_STATUS_STOPPING; tor->stopDate = tr_date(); - tr_lockUnlock( tor->lock ); + tr_lockUnlock( &tor->lock ); } /*********************************************************************** @@ -294,7 +275,7 @@ static void torrentReallyStop( tr_handle_t * h, int t ) tr_torrent_t * tor = h->torrents[t]; tor->die = 1; - tr_threadJoin( tor->thread ); + tr_threadJoin( &tor->thread ); tr_dbg( "Thread joined" ); tr_trackerClose( tor->tracker ); @@ -360,7 +341,7 @@ int tr_torrentStat( tr_handle_t * h, tr_stat_t ** stat ) tor->status = TR_STATUS_PAUSE; } - tr_lockLock( tor->lock ); + tr_lockLock( &tor->lock ); memcpy( &s[i].info, &tor->info, sizeof( tr_info_t ) ); s[i].status = tor->status; @@ -434,7 +415,7 @@ int tr_torrentStat( tr_handle_t * h, tr_stat_t ** stat ) s[i].folder = tor->destination; - tr_lockUnlock( tor->lock ); + tr_lockUnlock( &tor->lock ); } *stat = s; @@ -459,7 +440,7 @@ void tr_torrentClose( tr_handle_t * h, int t ) h->torrentCount--; - tr_lockClose( tor->lock ); + tr_lockClose( &tor->lock ); tr_cpClose( tor->completion ); if( tor->destination ) @@ -492,13 +473,12 @@ static void downloadLoop( void * _tor ) tr_dbg( "Thread started" ); #ifdef SYS_BEOS - rename_thread(tor->thread, "torrent-tx"); /* This is required because on BeOS, SIGINT is sent to each thread, which kills them not nicely */ signal( SIGINT, SIG_IGN ); #endif - tr_lockLock( tor->lock ); + tr_lockLock( &tor->lock ); tr_cpReset( tor->completion ); tor->io = tr_ioInit( tor ); @@ -534,13 +514,13 @@ static void downloadLoop( void * _tor ) date2 = tr_date(); if( date2 < date1 + 20 ) { - tr_lockUnlock( tor->lock ); + tr_lockUnlock( &tor->lock ); tr_wait( date1 + 20 - date2 ); - tr_lockLock( tor->lock ); + tr_lockLock( &tor->lock ); } } - tr_lockUnlock( tor->lock ); + tr_lockUnlock( &tor->lock ); tr_ioClose( tor->io ); @@ -580,7 +560,3 @@ static float rateUpload( tr_torrent_t * tor ) { return rateGeneric( tor->dates, tor->uploaded ); } - -#ifdef __cplusplus -} -#endif diff --git a/libtransmission/transmission.h b/libtransmission/transmission.h index 31f649a18..7e42ec097 100644 --- a/libtransmission/transmission.h +++ b/libtransmission/transmission.h @@ -30,7 +30,7 @@ extern "C" { #include #define SHA_DIGEST_LENGTH 20 -#ifdef SYS_BEOS +#ifdef __BEOS__ # include # define MAX_PATH_LENGTH B_FILE_NAME_LENGTH #else @@ -57,7 +57,7 @@ tr_handle_t * tr_init(); * store the resume files. The string belongs to libtransmission, do * not free it. **********************************************************************/ -char * tr_getPrefsDirectory( tr_handle_t * ); +char * tr_getPrefsDirectory(); /*********************************************************************** * tr_setBindPort @@ -230,8 +230,8 @@ struct tr_stat_s int peersUploading; int peersDownloading; char pieces[120]; - int seeders; - int leechers; + int seeders; + int leechers; uint64_t downloaded; uint64_t uploaded; diff --git a/libtransmission/upload.c b/libtransmission/upload.c index bca5005a5..cb3c8db6f 100644 --- a/libtransmission/upload.c +++ b/libtransmission/upload.c @@ -45,16 +45,16 @@ tr_upload_t * tr_uploadInit() void tr_uploadSetLimit( tr_upload_t * u, int limit ) { - tr_lockLock( u->lock ); + tr_lockLock( &u->lock ); u->limit = limit; - tr_lockUnlock( u->lock ); + tr_lockUnlock( &u->lock ); } int tr_uploadCanUnchoke( tr_upload_t * u ) { int ret; - tr_lockLock( u->lock ); + tr_lockLock( &u->lock ); if( u->limit < 0 ) { /* Infinite number of slots */ @@ -65,23 +65,23 @@ int tr_uploadCanUnchoke( tr_upload_t * u ) /* One slot per 2 KB/s */ ret = ( u->count < ( u->limit + 1 ) / 2 ); } - tr_lockUnlock( u->lock ); + tr_lockUnlock( &u->lock ); return ret; } void tr_uploadChoked( tr_upload_t * u ) { - tr_lockLock( u->lock ); + tr_lockLock( &u->lock ); (u->count)--; - tr_lockUnlock( u->lock ); + tr_lockUnlock( &u->lock ); } void tr_uploadUnchoked( tr_upload_t * u ) { - tr_lockLock( u->lock ); + tr_lockLock( &u->lock ); (u->count)++; - tr_lockUnlock( u->lock ); + tr_lockUnlock( &u->lock ); } int tr_uploadCanUpload( tr_upload_t * u ) @@ -89,7 +89,7 @@ int tr_uploadCanUpload( tr_upload_t * u ) int ret, i, size; uint64_t now; - tr_lockLock( u->lock ); + tr_lockLock( &u->lock ); if( u->limit < 0 ) { /* No limit */ @@ -114,23 +114,23 @@ int tr_uploadCanUpload( tr_upload_t * u ) } } } - tr_lockUnlock( u->lock ); + tr_lockUnlock( &u->lock ); return ret; } void tr_uploadUploaded( tr_upload_t * u, int size ) { - tr_lockLock( u->lock ); + tr_lockLock( &u->lock ); memmove( &u->dates[1], &u->dates[0], (FOO-1) * sizeof( uint64_t ) ); memmove( &u->sizes[1], &u->sizes[0], (FOO-1) * sizeof( int ) ); u->dates[0] = tr_date(); u->sizes[0] = size; - tr_lockUnlock( u->lock ); + tr_lockUnlock( &u->lock ); } void tr_uploadClose( tr_upload_t * u ) { - tr_lockClose( u->lock ); + tr_lockClose( &u->lock ); free( u ); } diff --git a/macosx/Controller.m b/macosx/Controller.m index 9426412bf..632fe7b0c 100644 --- a/macosx/Controller.m +++ b/macosx/Controller.m @@ -246,36 +246,21 @@ static void sleepCallBack( void * controller, io_service_t y, - (void) showPreferenceWindow: (id) sender { - NSRect mainFrame; - NSRect prefsFrame; - NSRect screenRect; - NSPoint point; - - /* Place the window */ - mainFrame = [fWindow frame]; - prefsFrame = [fPrefsWindow frame]; - screenRect = [[NSScreen mainScreen] visibleFrame]; - point.x = mainFrame.origin.x + mainFrame.size.width / 2 - - prefsFrame.size.width / 2; - point.y = mainFrame.origin.y + mainFrame.size.height - 30; - - /* Make sure it is in the screen */ - if( point.x < screenRect.origin.x ) + //place the window if not open + if (![fPrefsWindow isVisible]) { - point.x = screenRect.origin.x; - } - if( point.x + prefsFrame.size.width > - screenRect.origin.x + screenRect.size.width ) - { - point.x = screenRect.origin.x + - screenRect.size.width - prefsFrame.size.width; - } - if( point.y - prefsFrame.size.height < screenRect.origin.y ) - { - point.y = screenRect.origin.y + prefsFrame.size.height; - } + NSRect prefsFrame, screenRect; + NSPoint point; - [fPrefsWindow setFrameTopLeftPoint: point]; + prefsFrame = [fPrefsWindow frame]; + screenRect = [[NSScreen mainScreen] visibleFrame]; + point.x = (screenRect.size.width - prefsFrame.size.width) * 0.5; + point.y = screenRect.origin.y + screenRect.size.height * 0.67 + + prefsFrame.size.height * 0.33; + + [fPrefsWindow setFrameTopLeftPoint: point]; + } + [fPrefsWindow makeKeyAndOrderFront:NULL]; } @@ -309,37 +294,40 @@ static void sleepCallBack( void * controller, io_service_t y, if( tr_torrentInit( fHandle, [torrentPath UTF8String] ) ) continue; + /* Add it to the "File > Open Recent" menu */ + [[NSDocumentController sharedDocumentController] + noteNewRecentDocumentURL: [NSURL fileURLWithPath: torrentPath]]; + if( [downloadChoice isEqualToString: @"Constant"] ) { tr_torrentSetFolder( fHandle, tr_torrentCount( fHandle ) - 1, [downloadFolder UTF8String] ); tr_torrentStart( fHandle, tr_torrentCount( fHandle ) - 1 ); - continue; } - - if( [downloadChoice isEqualToString: @"Torrent"] ) + else if( [downloadChoice isEqualToString: @"Torrent"] ) { tr_torrentSetFolder( fHandle, tr_torrentCount( fHandle ) - 1, [[torrentPath stringByDeletingLastPathComponent] UTF8String] ); tr_torrentStart( fHandle, tr_torrentCount( fHandle ) - 1 ); - continue; } + else + { + NSOpenPanel * panel = [NSOpenPanel openPanel]; + + [panel setPrompt: @"Select Download Folder"]; + [panel setMessage: [NSString stringWithFormat: + @"Select the download folder for %@", + [torrentPath lastPathComponent]]]; + [panel setAllowsMultipleSelection: NO]; + [panel setCanChooseFiles: NO]; + [panel setCanChooseDirectories: YES]; - NSOpenPanel * panel = [NSOpenPanel openPanel]; - - [panel setPrompt: @"Select Download Folder"]; - [panel setMessage: [NSString stringWithFormat: - @"Select the download folder for %@", - [torrentPath lastPathComponent]]]; - [panel setAllowsMultipleSelection: NO]; - [panel setCanChooseFiles: NO]; - [panel setCanChooseDirectories: YES]; - - [panel beginSheetForDirectory: NULL file: NULL types: NULL - modalForWindow: fWindow modalDelegate: self didEndSelector: - @selector( folderChoiceClosed:returnCode:contextInfo: ) - contextInfo: NULL]; - [NSApp runModalForWindow: panel]; + [panel beginSheetForDirectory: NULL file: NULL types: NULL + modalForWindow: fWindow modalDelegate: self didEndSelector: + @selector( folderChoiceClosed:returnCode:contextInfo: ) + contextInfo: NULL]; + [NSApp runModalForWindow: panel]; + } } [self updateUI: NULL]; diff --git a/macosx/English.lproj/MainMenu.nib/classes.nib b/macosx/English.lproj/MainMenu.nib/classes.nib index 8f5d7bd5b..9ef087011 100644 --- a/macosx/English.lproj/MainMenu.nib/classes.nib +++ b/macosx/English.lproj/MainMenu.nib/classes.nib @@ -70,7 +70,6 @@ LANGUAGE = ObjC; OUTLETS = { fBlankView = NSView; - fFolderMatrix = NSMatrix; fFolderPopUp = NSPopUpButton; fGeneralView = NSView; fNetworkView = NSView; diff --git a/macosx/English.lproj/MainMenu.nib/info.nib b/macosx/English.lproj/MainMenu.nib/info.nib index b18e6c982..99a64eaa2 100644 --- a/macosx/English.lproj/MainMenu.nib/info.nib +++ b/macosx/English.lproj/MainMenu.nib/info.nib @@ -15,11 +15,11 @@ 589 54 521 112 118 0 0 1152 842 783 - 428 442 385 225 0 0 1280 832 + 409 477 420 155 0 0 1280 832 796 - 479 490 282 129 0 0 1280 832 + 409 490 420 129 0 0 1280 832 825 - 498 523 155 107 0 0 1152 842 + 542 501 155 107 0 0 1280 832 IBFramework Version 443.0 @@ -27,10 +27,12 @@ 3 IBOpenObjects - 29 + 781 783 - 796 21 + 796 + 825 + 29 IBSystem Version 8F46 diff --git a/macosx/English.lproj/MainMenu.nib/keyedobjects.nib b/macosx/English.lproj/MainMenu.nib/keyedobjects.nib index 17b5885e0..3f587f6dd 100644 Binary files a/macosx/English.lproj/MainMenu.nib/keyedobjects.nib and b/macosx/English.lproj/MainMenu.nib/keyedobjects.nib differ diff --git a/macosx/PrefsController.h b/macosx/PrefsController.h index 61870d406..f561d9a6f 100644 --- a/macosx/PrefsController.h +++ b/macosx/PrefsController.h @@ -34,7 +34,6 @@ IBOutlet NSView * fNetworkView; IBOutlet NSView * fBlankView; - IBOutlet NSMatrix * fFolderMatrix; IBOutlet NSPopUpButton * fFolderPopUp; IBOutlet NSTextField * fPortField; IBOutlet NSButton * fUploadCheck; diff --git a/macosx/PrefsController.m b/macosx/PrefsController.m index 24abe94dc..3df6f795b 100644 --- a/macosx/PrefsController.m +++ b/macosx/PrefsController.m @@ -27,8 +27,8 @@ #define MAX_PORT 65535 #define DOWNLOAD_FOLDER 0 -#define DOWNLOAD_TORRENT 1 -#define DOWNLOAD_ASK 2 +#define DOWNLOAD_TORRENT 2 +#define DOWNLOAD_ASK 3 #define TOOLBAR_GENERAL @"General" #define TOOLBAR_NETWORK @"Network" @@ -58,7 +58,7 @@ - Always download to Desktop - Port TR_DEFAULT_PORT - Upload limit DEFAULT_UPLOAD - - Do not limit upload + - Limit upload - Ask before quitting - Ask before removing */ desktop = [NSHomeDirectory() stringByAppendingString: @"/Desktop"]; @@ -105,18 +105,17 @@ if( [downloadChoice isEqualToString: @"Constant"] ) { - [fFolderMatrix selectCellAtRow: DOWNLOAD_FOLDER column: 0]; + [fFolderPopUp selectItemAtIndex: DOWNLOAD_FOLDER]; } else if( [downloadChoice isEqualToString: @"Torrent"] ) { - [fFolderMatrix selectCellAtRow: DOWNLOAD_TORRENT column: 0]; + [fFolderPopUp selectItemAtIndex: DOWNLOAD_TORRENT]; } else { - [fFolderMatrix selectCellAtRow: DOWNLOAD_ASK column: 0]; + [fFolderPopUp selectItemAtIndex: DOWNLOAD_ASK]; } [self updatePopUp]; - [fFolderPopUp setEnabled: [fFolderMatrix selectedRow] == 0]; //set bind port int bindPort = [fDefaults integerForKey: @"BindPort"]; @@ -269,7 +268,7 @@ - (void) setDownloadLocation: (id) sender { //Download folder - switch( [fFolderMatrix selectedRow] ) + switch( [fFolderPopUp indexOfSelectedItem] ) { case DOWNLOAD_FOLDER: [fDefaults setObject: @"Constant" forKey: @"DownloadChoice"]; @@ -281,7 +280,6 @@ [fDefaults setObject: @"Ask" forKey: @"DownloadChoice"]; break; } - [fFolderPopUp setEnabled: [fFolderMatrix selectedRow] == 0]; } - (void) folderSheetShow: (id) sender @@ -330,18 +328,35 @@ - (void) folderSheetClosed: (NSOpenPanel *) openPanel returnCode: (int) code contextInfo: (void *) info { - [fFolderPopUp selectItemAtIndex: 0]; + if (code == NSOKButton) + { + [fDownloadFolder release]; + fDownloadFolder = [[openPanel filenames] objectAtIndex: 0]; + [fDownloadFolder retain]; - if (code != NSOKButton) - return; + [fFolderPopUp selectItemAtIndex: DOWNLOAD_FOLDER]; + [fDefaults setObject: fDownloadFolder forKey: @"DownloadFolder"]; + [fDefaults setObject: @"Constant" forKey: @"DownloadChoice"]; - [fDownloadFolder release]; - fDownloadFolder = [[openPanel filenames] objectAtIndex: 0]; - [fDownloadFolder retain]; - - [fDefaults setObject: fDownloadFolder forKey: @"DownloadFolder"]; - - [self updatePopUp]; + [self updatePopUp]; + } + else + { + //reset if cancelled + NSString * downloadChoice = [fDefaults stringForKey: @"DownloadChoice"]; + if( [downloadChoice isEqualToString: @"Constant"] ) + { + [fFolderPopUp selectItemAtIndex: DOWNLOAD_FOLDER]; + } + else if( [downloadChoice isEqualToString: @"Torrent"] ) + { + [fFolderPopUp selectItemAtIndex: DOWNLOAD_TORRENT]; + } + else + { + [fFolderPopUp selectItemAtIndex: DOWNLOAD_ASK]; + } + } } - (void) updatePopUp