From 90f7099af99203d466abcb0c0832d868756612bd Mon Sep 17 00:00:00 2001 From: Matthias Neeracher Date: Thu, 26 Oct 2006 08:21:18 +0000 Subject: [PATCH] Handle lilypond path --- English.lproj/MainMenu.nib/classes.nib | 3 +- English.lproj/MainMenu.nib/info.nib | 2 +- English.lproj/MainMenu.nib/keyedobjects.nib | Bin 19076 -> 20957 bytes Resources/UserDefaults.plist | 2 + Sources/VLAppController.h | 10 +- Sources/VLAppController.mm | 120 ++++++++++++++++++++ 6 files changed, 134 insertions(+), 3 deletions(-) diff --git a/English.lproj/MainMenu.nib/classes.nib b/English.lproj/MainMenu.nib/classes.nib index a0b26a9..074fecf 100644 --- a/English.lproj/MainMenu.nib/classes.nib +++ b/English.lproj/MainMenu.nib/classes.nib @@ -2,9 +2,10 @@ IBClasses = ( {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, { - ACTIONS = {playNewPitch = id; }; + ACTIONS = {playNewPitch = id; selectLilypondPath = id; }; CLASS = VLAppController; LANGUAGE = ObjC; + OUTLETS = {lilypondPath = id; }; SUPERCLASS = NSObject; } ); diff --git a/English.lproj/MainMenu.nib/info.nib b/English.lproj/MainMenu.nib/info.nib index 52deefc..4d563ef 100644 --- a/English.lproj/MainMenu.nib/info.nib +++ b/English.lproj/MainMenu.nib/info.nib @@ -13,8 +13,8 @@ 452.0 IBOpenObjects - 217 29 + 217 IBSystem Version 9A283 diff --git a/English.lproj/MainMenu.nib/keyedobjects.nib b/English.lproj/MainMenu.nib/keyedobjects.nib index 58f9805fe4e4255bec53aa74823f76c12ae244f4..8a1fe5faa985b9a9f2b489e648c1a9f799ce7373 100644 GIT binary patch literal 20957 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%0DvAK)&c(U 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 RC&cqxsq_5y{w$dI{{ZCv?T7#X literal 19076 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 QMR|Yo)!yI!pU(OJ2bA-z{{R30 diff --git a/Resources/UserDefaults.plist b/Resources/UserDefaults.plist index 19a993a..e2d5525 100644 --- a/Resources/UserDefaults.plist +++ b/Resources/UserDefaults.plist @@ -4,6 +4,8 @@ VLHighPitch 75 + VLLilypondPath + /sw/bin/lilypond VLLowPitch 57 diff --git a/Sources/VLAppController.h b/Sources/VLAppController.h index 508d698..8af7a90 100644 --- a/Sources/VLAppController.h +++ b/Sources/VLAppController.h @@ -9,9 +9,17 @@ #import @interface VLAppController : NSObject { + IBOutlet id lilypondPath; + NSString * toolPath; + NSString * appPath; } - (IBAction) playNewPitch:(id)sender; - +- (IBAction) selectLilypondPath:(id)sender; + @end + +// Local Variables: +// mode:ObjC +// End: diff --git a/Sources/VLAppController.mm b/Sources/VLAppController.mm index 0b1f88c..238a44a 100644 --- a/Sources/VLAppController.mm +++ b/Sources/VLAppController.mm @@ -53,6 +53,110 @@ [self setupTransformers]; } +- (id)init +{ + if (self = [super init]) { + toolPath = nil; + appPath = nil; + } +} + +- (NSString*)getLineFromCommand:(NSString*)command +{ + char line[1000]; + FILE * output = popen([command UTF8String], "r"); + if (fgets(line, 1000, output)) { + fprintf(stderr, "Line %s", line); + size_t len = strlen(line); + if (len && line[len-1]=='\n') { + line[len-1] = 0; + return [NSString stringWithUTF8String:line]; + } + } else + NSLog(@"Failed command: %@ (%d)\n", command, errno); + pclose(output); + return nil; +} + +- (NSString *)lilypondVersion:(NSString *)path +{ + NSString * cmd = + [NSString stringWithFormat: + @"%@ --version | awk '{ print $3 }'", + path]; + return [self getLineFromCommand:cmd]; +} + +- (void)awakeFromNib +{ + [lilypondPath setAutoenablesItems:NO]; + + NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; + NSFileManager * fileManager = [NSFileManager defaultManager]; + NSString * lilyPath = [defaults stringForKey:@"VLLilypondPath"]; + NSRange app = [lilyPath rangeOfString:@".app"]; + bool wantTool = app.location == NSNotFound; + + if ([fileManager isExecutableFileAtPath:lilyPath]) { + // + // Path still valid, figure out what it is + // + if (wantTool) + toolPath = lilyPath; + else + appPath = lilyPath; + } + if (!appPath) + appPath = + [[[NSWorkspace sharedWorkspace] + absolutePathForAppBundleWithIdentifier:@"org.lilypond.lilypond"] + stringByAppendingPathComponent:@"Contents/Resources/bin/lilypond"]; + if (!toolPath) + toolPath = [self getLineFromCommand:@"bash -l which lilypond"]; + + NSString * appVersion = nil; + NSString * toolVersion = nil; + + if (appPath) { + appVersion = [self lilypondVersion:appPath]; + if (!appVersion) + appPath = nil; + } + if (toolPath) { + toolVersion = [self lilypondVersion:toolPath]; + if (!toolVersion) + toolPath = nil; + } + + NSMenuItem * toolItem = [lilypondPath itemAtIndex:0]; + NSMenuItem * appItem = [lilypondPath itemAtIndex:1]; + + if (toolPath) { + [toolItem setTitle: + [NSString stringWithFormat:@"%@ (%@)", toolPath, toolVersion]]; + } else { + [toolItem setTitle:@"lilypond tool not installed"]; + [toolItem setEnabled:NO]; + } + if (appPath) { + NSRange r = [appPath rangeOfString:@"/Contents/Resources"]; + [appItem setTitle: + [NSString stringWithFormat:@"%@ (%@)", + [appPath substringToIndex:r.location], appVersion]]; + } else { + [appItem setTitle:@"Lilypond.app not installed"]; + [appItem setEnabled:NO]; + } + if (!toolPath && appPath) { + wantTool = false; + [defaults setObject:appPath forKey:@"VLLilypondPath"]; + } else if (toolPath && !appPath) { + wantTool = true; + [defaults setObject:toolPath forKey:@"VLLilypondPath"]; + } + [lilypondPath selectItemWithTag:wantTool ? 0 : 1]; +} + - (IBAction) playNewPitch:(id)sender { VLNote note(VLFraction(1,4), [sender intValue]); @@ -60,4 +164,20 @@ VLSoundOut::Instance()->PlayNote(note); } +- (IBAction) selectLilypondPath:(id)sender +{ + NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; + + switch ([sender tag]) { + case 0: + [defaults setObject:toolPath forKey:@"VLLilypondPath"]; + break; + case 1: + [defaults setObject:toolPath forKey:@"VLLilypondPath"]; + break; + default: + break; + } +} + @end