Now I only OpenComponent and CloseComponent once, making me much faster!
[MenuTunes.git] / MenuTunes.m
index 0227042..81055ed 100755 (executable)
@@ -13,8 +13,9 @@ Things to do:
     - hot keys can't be set when NSBGOnly is on. The window is not key,
       so the KeyBroadcaster does not pick up key combos
     - going to need a different way of defining key combos
-¥ Optimize, this thing is big and slow :(
+¥ Optimize
 ¥ Apple Events! Apple Events! Apple Events!
+¥ Upcoming songs menu items are disabled after launching iTunes and playing
 */
 
 #import "MenuTunes.h"
@@ -27,6 +28,7 @@ Things to do:
 
 - (void)applicationDidFinishLaunching:(NSNotification *)note
 {
+    asComponent = OpenDefaultComponent(kOSAComponentType, kAppleScriptSubtype);
     if (![[NSUserDefaults standardUserDefaults] objectForKey:@"menu"])
     {
         [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"Play/Pause", @"Next Track", @"Previous Track", @"Fast Forward", @"Rewind", @"<separator>", @"Upcoming Songs", @"Playlists", @"<separator>", @"PreferencesÉ", @"Quit", @"<separator>", @"Current Track Info", nil] forKey:@"menu"];
@@ -72,6 +74,7 @@ target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES];
     {
         [refreshTimer invalidate];
     }
+    CloseComponent(asComponent);
     [statusItem release];
     [menu release];
     [view release];
@@ -155,6 +158,7 @@ target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES];
             [menu addItem:[NSMenuItem separatorItem]];
         }
     }
+    
     curTrackIndex = -1; //Force update of everything
     [self timerUpdate]; //Updates dynamic info in the menu
     
@@ -260,7 +264,6 @@ target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES];
                 NSMenuItem *songItem;
                 songItem = [[NSMenuItem alloc] initWithTitle:curSong action:@selector(playTrack:) keyEquivalent:@""];
                 [songItem setTarget:self];
-                [songItem setEnabled:YES];
                 [songItem setRepresentedObject:[NSNumber numberWithInt:i]];
                 [upcomingSongsMenu addItem:songItem];
                 [songItem release];
@@ -394,12 +397,14 @@ target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES];
     AECreateDesc(typeChar, [script cString], [script cStringLength], 
 &scriptDesc);
     
-    OSADoScript(OpenDefaultComponent(kOSAComponentType, kAppleScriptSubtype), &scriptDesc, kOSANullScript, typeChar, kOSAModeCanInteract, &resultDesc);
+    OSADoScript(asComponent, &scriptDesc, kOSANullScript, typeChar, kOSAModeCanInteract, &resultDesc);
     
     length = AEGetDescDataSize(&resultDesc);
     buffer = malloc(length);
     
     AEGetDescData(&resultDesc, buffer, length);
+    AEDisposeDesc(&scriptDesc);
+    AEDisposeDesc(&resultDesc);
     result = [NSString stringWithCString:buffer length:length];
     if (![result isEqualToString:@""] &&
         ([result characterAtIndex:0] == '\"') &&
@@ -416,15 +421,17 @@ target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES];
 - (void)timerUpdate
 {
     int pid;
+    
     if (GetProcessPID(&iTunesPSN, &pid) == noErr)
     {
         int trackPlayingIndex = [[self runScriptAndReturnResult:@"return index of current track"] intValue];
+        
         if (trackPlayingIndex != curTrackIndex)
         {
             [self updateMenu];
             curTrackIndex = trackPlayingIndex;
         }
-        
+               
         //Update Play/Pause menu item
         if (playPauseMenuItem)
         {