From 6c0a54caa51a47e5cbec7886fa6048d8484dffa6 Mon Sep 17 00:00:00 2001 From: Eric Petit Date: Thu, 12 Jan 2006 18:58:57 +0000 Subject: [PATCH] Update 2005-12-25 --- AUTHORS | 5 +- gtk/main.c | 2 +- libtransmission/fastresume.h | 3 +- libtransmission/fdlimit.c | 34 ++--- libtransmission/inout.c | 6 +- libtransmission/internal.h | 28 +--- libtransmission/platform.c | 123 ++++++++++++++---- libtransmission/platform.h | 44 +++++-- libtransmission/tracker.c | 2 +- libtransmission/transmission.c | 48 ++----- libtransmission/transmission.h | 8 +- libtransmission/upload.c | 26 ++-- macosx/Controller.m | 82 +++++------- macosx/English.lproj/MainMenu.nib/classes.nib | 1 - macosx/English.lproj/MainMenu.nib/info.nib | 12 +- .../MainMenu.nib/keyedobjects.nib | Bin 36554 -> 35976 bytes macosx/PrefsController.h | 1 - macosx/PrefsController.m | 53 +++++--- 18 files changed, 259 insertions(+), 219 deletions(-) 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 17b5885e05f9d23b1cffd51ee8624c21c4f685a6..3f587f6dd087d2bc24098ad95ca9e1fe32173c4f 100644 GIT binary patch literal 35976 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 b!gNWxCf(TNf3I1y|I7A^{xARkrz8IZ=D>?X literal 36554 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 P{y%TJ