diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..733edcc --- /dev/null +++ b/.gitignore @@ -0,0 +1,126 @@ +######################### +# .gitignore file for Xcode4 / OS X Source projects +# +# NB: if you are storing "built" products, this WILL NOT WORK, +# and you should use a different .gitignore (or none at all) +# This file is for SOURCE projects, where there are many extra +# files that we want to exclude +# +# For updates, see: http://stackoverflow.com/questions/49478/git-ignore-file-for-xcode-projects +######################### + +##### +# OS X temporary files that should never be committed + +.DS_Store +*.swp +*.lock +profile + + +#### +# Xcode temporary files that should never be committed +# +# NB: NIB/XIB files still exist even on Storyboard projects, so we want this... + +*~.nib + + +#### +# Xcode build files - +# +# NB: slash on the end, so we only remove the FOLDER, not any files that were badly named "DerivedData" + +DerivedData/ + +# NB: slash on the end, so we only remove the FOLDER, not any files that were badly named "build" + +build/ + + +##### +# Xcode private settings (window sizes, bookmarks, breakpoints, custom executables, smart groups) +# +# This is complicated: +# +# SOMETIMES you need to put this file in version control. +# Apple designed it poorly - if you use "custom executables", they are +# saved in this file. +# 99% of projects do NOT use those, so they do NOT want to version control this file. +# ..but if you're in the 1%, comment out the line "*.pbxuser" + +*.pbxuser +*.mode1v3 +*.mode2v3 +*.perspectivev3 +# NB: also, whitelist the default ones, some projects need to use these +!default.pbxuser +!default.mode1v3 +!default.mode2v3 +!default.perspectivev3 + + +#### +# Xcode 4 - semi-personal settings, often included in workspaces +# +# You can safely ignore the xcuserdata files - but do NOT ignore the files next to them +# + +xcuserdata + + +#### +# XCode 4 workspaces - more detailed +# +# Workspaces are important! They are a core feature of Xcode - don't exclude them :) +# +# Workspace layout is quite spammy. For reference: +# +# (root)/ +# (project-name).xcodeproj/ +# project.pbxproj +# project.xcworkspace/ +# contents.xcworkspacedata +# xcuserdata/ +# (your name)/xcuserdatad/ +# xcuserdata/ +# (your name)/xcuserdatad/ +# +# +# +# Xcode 4 workspaces - SHARED +# +# This is UNDOCUMENTED (google: "developer.apple.com xcshareddata" - 0 results +# But if you're going to kill personal workspaces, at least keep the shared ones... +# +# +!xcshareddata + + +#### +# Xcode 4 - Deprecated classes +# +# Allegedly, if you manually "deprecate" your classes, they get moved here. +# +# We're using source-control, so this is a "feature" that we do not want! + +*.moved-aside + + +#### +# UNKNOWN: recommended by others, but I can't discover what these files are +# +# ...none. Everything is now explained. +node_modules +dist/TwentyTwo.app +dist/template.dmg +dist/wc.dmg + +#### +# Xcode 5 - Source Control files +# +# Xcode 5 introduced a new file type .xccheckout. This files contains VCS metadata +# and should therefore not be checked into the VCS. + +*.xccheckout +.codesign diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..980feba --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,42 @@ +## 0.12 (November 8, 2013) +- Automatic updates yay! + +## 0.11 (October 10, 2013) +- fixed closing window stops music in certain cases +- notifications support + +## 0.10 (September 13, 2013) +- added reload menu item and Cmd+R shortcut +- added main window menu item and Cmd+1 shortcut + +## 0.9.1 (August 1, 2013) +- distributed as .dmg package instead of Mac Installer +- compatible with OSX 10.7 Lion + +## 0.9 (July 5, 2013) + +- fixed ▶ media key +- support the new upload ui + +## 0.8 (June 26, 2013) + +- enabled Flash plugin which is required for playing certain sounds + +## 0.7 (June 13, 2013) + +- swipe for back/forward navigation +- fixed notifications and unread messages reappearing on every launch +- pause/start on spacebar even when the main window is not visible +- fixed restoring position and size on launch + +## 0.6 (April 17, 2013) + +- brought back the Edit menu, fixed lost copy&paste functionality +- one more shot on supporting pre Mt. Lion (should be confirmed) + +## 0.5 (april 10, 2013) + +- added basic full screen support +- close button hides main window without stopping play +- simplified menu bar +- introduced CHANGELOG :) diff --git a/DHSwipeWebView/DHSwipeClipView.h b/DHSwipeWebView/DHSwipeClipView.h new file mode 100644 index 0000000..c36d0e9 --- /dev/null +++ b/DHSwipeWebView/DHSwipeClipView.h @@ -0,0 +1,24 @@ +#import +#import "DHSwipeWebView.h" + +@interface DHSwipeClipView : NSClipView { + CGFloat currentSum; + NSTimer *drawTimer; + BOOL canGoLeft; + BOOL canGoRight; + DHSwipeWebView *webView; + BOOL isHandlingEvent; + BOOL _haveAdditionalClip; + NSRect _additionalClip; + CGFloat scrollDeltaX; + CGFloat scrollDeltaY; +} + +@property (retain) NSTimer *drawTimer; +@property (assign) CGFloat currentSum; +@property (retain) DHSwipeWebView *webView; +@property (assign) BOOL isHandlingEvent; + +- (id)initWithFrame:(NSRect)frame webView:(DHSwipeWebView *)aWebView; + +@end diff --git a/DHSwipeWebView/DHSwipeClipView.m b/DHSwipeWebView/DHSwipeClipView.m new file mode 100644 index 0000000..66f743e --- /dev/null +++ b/DHSwipeWebView/DHSwipeClipView.m @@ -0,0 +1,186 @@ +#import "DHSwipeClipView.h" + +// Some code taken from https://github.com/kgn/LinenClipView +@implementation DHSwipeClipView + +@synthesize drawTimer; +@synthesize currentSum; +@synthesize webView; +@synthesize isHandlingEvent; + +- (id)initWithFrame:(NSRect)frame webView:(DHSwipeWebView *)aWebView +{ + if(!(self = [super initWithFrame:frame])) + { + return nil; + } + self.webView = aWebView; + + // In WebHTMLView, we set a clip. This is not typical to do in an + // NSView, and while correct for any one invocation of drawRect:, + // it causes some bad problems if that clip is cached between calls. + // The cached graphics state, which clip views keep around, does + // cache the clip in this undesirable way. Consequently, we want to + // release the GState for all clip views for all views contained in + // a WebHTMLView. Here we do it for subframes, which use WebClipView. + // See these bugs for more information: + // : REGRESSSION (7B58-7B60)?: Safari draws blank frames on macosx.apple.com perf page + [self releaseGState]; + + return self; +} + +- (void)resetAdditionalClip +{ + _haveAdditionalClip = NO; +} + +- (void)setAdditionalClip:(NSRect)additionalClip +{ + _haveAdditionalClip = YES; + _additionalClip = additionalClip; +} + +- (BOOL)hasAdditionalClip +{ + return _haveAdditionalClip; +} + +- (NSRect)additionalClip +{ + return _additionalClip; +} + +// From https://gist.github.com/b6bcb09a9fc0e9557c27 +- (NSView *)hitTest:(NSPoint)aPoint +{ + NSEvent *currentEvent = [NSApp currentEvent]; + NSScrollView *scrollView = [self enclosingScrollView]; + if([currentEvent type] == NSLeftMouseDown) + { + // if we have a vertical scroller and it accepts the current hit + if([scrollView hasVerticalScroller] && [[scrollView verticalScroller] hitTest:aPoint] != nil) + { + [[scrollView verticalScroller] mouseDown:currentEvent]; + } + // if we have a horizontal scroller and it accepts the current hit + if([scrollView hasVerticalScroller] && [[scrollView horizontalScroller] hitTest:aPoint] != nil) + { + [[scrollView horizontalScroller] mouseDown:currentEvent]; + } + } + return [super hitTest:aPoint]; +} + +- (void)scrollWheel:(NSEvent *)event +{ + if(![NSEvent isSwipeTrackingFromScrollEventsEnabled]) + { + [super scrollWheel:event]; + return; + } + if([event phase] == NSEventPhaseBegan) + { + currentSum = 0; + NSScrollView *scrollView = [[[[webView mainFrame] frameView] documentView] enclosingScrollView]; + NSRect bounds = [[scrollView contentView] bounds]; + canGoLeft = canGoRight = NO; + if(bounds.origin.x <= 0) + { + canGoLeft = YES; // && [webView canGoBack] + } + if(bounds.origin.x + bounds.size.width >= [[scrollView documentView] bounds].size.width) + { + canGoRight = YES; // && [webView canGoForward] + } + scrollDeltaX = 0; + scrollDeltaY = 0; + isHandlingEvent = canGoLeft || canGoRight; + } + else if([event phase] == NSEventPhaseChanged) + { + if(!isHandlingEvent) + { + if(currentSum != 0) + { + currentSum = 0; + [self launchDrawTimer]; + } + } + else + { + scrollDeltaX += [event scrollingDeltaX]; + scrollDeltaY += [event scrollingDeltaY]; + + float absoluteSumX = fabsf(scrollDeltaX); + float absoluteSumY = fabsf(scrollDeltaY); + if((absoluteSumX < absoluteSumY && currentSum == 0)) + { + isHandlingEvent = NO; + if(currentSum != 0) + { + currentSum = 0; + [self launchDrawTimer]; + } + } + else + { + CGFloat flippedDeltaX = scrollDeltaX * -1; + if(flippedDeltaX == 0 || (flippedDeltaX < 0 && !canGoLeft) || (flippedDeltaX > 0 && !canGoRight)) + { + if(currentSum != 0) + { + currentSum = 0; + [self launchDrawTimer]; + } + } + else + { + // Draw the back/forward indicators + currentSum = flippedDeltaX/1000; + [self launchDrawTimer]; + return; + } + } + } + } + else if([event phase] == NSEventPhaseEnded) + { + if(currentSum < -0.3 && canGoLeft && [self.webView canGoBack]) + { + [self.webView goBack]; + } + else if(currentSum >= 0.3 && canGoRight && [self.webView canGoForward]) + { + [self.webView goForward]; + } + isHandlingEvent = NO; + if(currentSum != 0) + { + currentSum = 0; + [self launchDrawTimer]; + } + } + else if([event phase] == NSEventPhaseCancelled) + { + isHandlingEvent = NO; + if(currentSum != 0) + { + currentSum = 0; + [self launchDrawTimer]; + } + } + [super scrollWheel:event]; +} + +- (void)launchDrawTimer +{ + // a timer is needed because events are queued and processing and drawing + // takes longer than they are delivered, so the queue fills up + if(!drawTimer || ![drawTimer isValid]) + { + self.drawTimer = [NSTimer scheduledTimerWithTimeInterval:1.0f/25 target:webView.swipeIndicator selector:@selector(display) userInfo:nil repeats:NO]; + } +} + +@end diff --git a/DHSwipeWebView/DHSwipeIndicator.h b/DHSwipeWebView/DHSwipeIndicator.h new file mode 100644 index 0000000..10b69c7 --- /dev/null +++ b/DHSwipeWebView/DHSwipeIndicator.h @@ -0,0 +1,15 @@ +#import +#import "DHSwipeWebView.h" +#import "DHSwipeClipView.h" + +@interface DHSwipeIndicator : NSView { + DHSwipeWebView *webView; + DHSwipeClipView *clipView; +} + +@property (retain) DHSwipeWebView *webView; +@property (retain) DHSwipeClipView *clipView; + +- (id)initWithWebView:(DHSwipeWebView *)aWebView; + +@end diff --git a/DHSwipeWebView/DHSwipeIndicator.m b/DHSwipeWebView/DHSwipeIndicator.m new file mode 100644 index 0000000..379cab6 --- /dev/null +++ b/DHSwipeWebView/DHSwipeIndicator.m @@ -0,0 +1,123 @@ +#import "DHSwipeIndicator.h" + +@implementation DHSwipeIndicator + +@synthesize webView; +@synthesize clipView; + +#define kSwipeMinimumLength 0.3 + +- (id)initWithWebView:(DHSwipeWebView *)aWebView +{ + self = [self initWithFrame:NSMakeRect(0, 0, aWebView.frame.size.width, aWebView.frame.size.height)]; + if(self) + { + self.webView = aWebView; + [self setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; + [self setWantsLayer:YES]; + [aWebView addSubview:self]; + id docView = [[[webView mainFrame] frameView] documentView]; + NSScrollView *scrollView = [docView enclosingScrollView]; + self.clipView = [[DHSwipeClipView alloc] initWithFrame:[[scrollView contentView] frame] webView:webView]; + [scrollView setContentView:clipView]; + [scrollView setDocumentView:docView]; + } + return self; +} + +- (void)drawRect:(NSRect)dirtyRect +{ + if(clipView.currentSum != 0 && clipView.isHandlingEvent) + { + CGFloat sum = clipView.currentSum; + NSRect drawRect = NSZeroRect; + CGFloat absoluteSum = fabsf(sum); + CGFloat percent = (absoluteSum) / kSwipeMinimumLength; + percent = (percent > 1.0) ? 1.0 : percent; + + CGFloat alphaPercent = (percent == 1.0) ? 1.0 : (percent <= 0.7) ? percent : 0.7f; + if(sum < 0) + { + drawRect = NSMakeRect(0-(49-49*percent), self.frame.size.height/2, 49*percent, 100); + NSRect frame = NSIntegralRect(drawRect); + //// Semicircle Drawing + NSBezierPath* semicirclePath = [NSBezierPath bezierPath]; + [semicirclePath moveToPoint: NSMakePoint(NSMinX(frame) + 34.65, NSMaxY(frame) - 14.64)]; + [semicirclePath curveToPoint: NSMakePoint(NSMinX(frame) + 34.65, NSMaxY(frame) - 85.36) controlPoint1: NSMakePoint(NSMinX(frame) + 53.78, NSMaxY(frame) - 34.17) controlPoint2: NSMakePoint(NSMinX(frame) + 53.78, NSMaxY(frame) - 65.83)]; + [semicirclePath curveToPoint: NSMakePoint(NSMinX(frame), NSMaxY(frame) - 100) controlPoint1: NSMakePoint(NSMinX(frame) + 25.08, NSMaxY(frame) - 95.12) controlPoint2: NSMakePoint(NSMinX(frame) + 12.54, NSMaxY(frame) - 100)]; + [semicirclePath lineToPoint: NSMakePoint(NSMinX(frame), NSMaxY(frame))]; + [semicirclePath curveToPoint: NSMakePoint(NSMinX(frame) + 34.65, NSMaxY(frame) - 14.64) controlPoint1: NSMakePoint(NSMinX(frame) + 12.54, NSMaxY(frame)) controlPoint2: NSMakePoint(NSMinX(frame) + 25.08, NSMaxY(frame) - 4.88)]; + [semicirclePath closePath]; + [[NSColor colorWithCalibratedRed:0.0f green:0.0f blue:0.0f alpha:alphaPercent] setFill]; + [semicirclePath fill]; + + //// Arrow Drawing + NSBezierPath* arrowPath = [NSBezierPath bezierPath]; + [arrowPath moveToPoint: NSMakePoint(NSMinX(frame) + 24.07, NSMaxY(frame) - 37.93)]; + [arrowPath curveToPoint: NSMakePoint(NSMinX(frame) + 24.07, NSMaxY(frame) - 42.17) controlPoint1: NSMakePoint(NSMinX(frame) + 25.24, NSMaxY(frame) - 39.1) controlPoint2: NSMakePoint(NSMinX(frame) + 25.24, NSMaxY(frame) - 41)]; + [arrowPath lineToPoint: NSMakePoint(NSMinX(frame) + 19.24, NSMaxY(frame) - 47)]; + [arrowPath lineToPoint: NSMakePoint(NSMinX(frame) + 37, NSMaxY(frame) - 47)]; + [arrowPath curveToPoint: NSMakePoint(NSMinX(frame) + 40, NSMaxY(frame) - 50) controlPoint1: NSMakePoint(NSMinX(frame) + 38.66, NSMaxY(frame) - 47) controlPoint2: NSMakePoint(NSMinX(frame) + 40, NSMaxY(frame) - 48.34)]; + [arrowPath curveToPoint: NSMakePoint(NSMinX(frame) + 37, NSMaxY(frame) - 53) controlPoint1: NSMakePoint(NSMinX(frame) + 40, NSMaxY(frame) - 51.66) controlPoint2: NSMakePoint(NSMinX(frame) + 38.66, NSMaxY(frame) - 53)]; + [arrowPath lineToPoint: NSMakePoint(NSMinX(frame) + 19.24, NSMaxY(frame) - 53)]; + [arrowPath lineToPoint: NSMakePoint(NSMinX(frame) + 24.07, NSMaxY(frame) - 57.83)]; + [arrowPath curveToPoint: NSMakePoint(NSMinX(frame) + 24.07, NSMaxY(frame) - 62.07) controlPoint1: NSMakePoint(NSMinX(frame) + 25.24, NSMaxY(frame) - 59) controlPoint2: NSMakePoint(NSMinX(frame) + 25.24, NSMaxY(frame) - 60.9)]; + [arrowPath curveToPoint: NSMakePoint(NSMinX(frame) + 19.83, NSMaxY(frame) - 62.07) controlPoint1: NSMakePoint(NSMinX(frame) + 22.9, NSMaxY(frame) - 63.24) controlPoint2: NSMakePoint(NSMinX(frame) + 21, NSMaxY(frame) - 63.24)]; + [arrowPath lineToPoint: NSMakePoint(NSMinX(frame) + 9.93, NSMaxY(frame) - 52.17)]; + [arrowPath curveToPoint: NSMakePoint(NSMinX(frame) + 9, NSMaxY(frame) - 50) controlPoint1: NSMakePoint(NSMinX(frame) + 9.35, NSMaxY(frame) - 51.6) controlPoint2: NSMakePoint(NSMinX(frame) + 9, NSMaxY(frame) - 50.84)]; + [arrowPath curveToPoint: NSMakePoint(NSMinX(frame) + 9.9, NSMaxY(frame) - 47.85) controlPoint1: NSMakePoint(NSMinX(frame) + 9, NSMaxY(frame) - 49.16) controlPoint2: NSMakePoint(NSMinX(frame) + 9.35, NSMaxY(frame) - 48.4)]; + [arrowPath lineToPoint: NSMakePoint(NSMinX(frame) + 19.83, NSMaxY(frame) - 37.93)]; + [arrowPath curveToPoint: NSMakePoint(NSMinX(frame) + 24.07, NSMaxY(frame) - 37.93) controlPoint1: NSMakePoint(NSMinX(frame) + 21, NSMaxY(frame) - 36.76) controlPoint2: NSMakePoint(NSMinX(frame) + 22.9, NSMaxY(frame) - 36.76)]; + [arrowPath closePath]; + [[NSColor whiteColor] setFill]; + [arrowPath fill]; } + else + { + drawRect = NSMakeRect(self.frame.size.width-(49*percent), self.frame.size.height/2, 49*percent, 100); + NSRect frame = drawRect; + //// Semicircle Drawing + NSBezierPath* semicirclePath = [NSBezierPath bezierPath]; + [semicirclePath moveToPoint: NSMakePoint(NSMinX(frame) + 14.35, NSMaxY(frame) - 14.64)]; + [semicirclePath curveToPoint: NSMakePoint(NSMinX(frame) + 14.35, NSMaxY(frame) - 85.36) controlPoint1: NSMakePoint(NSMinX(frame) - 4.78, NSMaxY(frame) - 34.17) controlPoint2: NSMakePoint(NSMinX(frame) - 4.78, NSMaxY(frame) - 65.83)]; + [semicirclePath curveToPoint: NSMakePoint(NSMinX(frame) + 49, NSMaxY(frame) - 100) controlPoint1: NSMakePoint(NSMinX(frame) + 23.92, NSMaxY(frame) - 95.12) controlPoint2: NSMakePoint(NSMinX(frame) + 36.46, NSMaxY(frame) - 100)]; + [semicirclePath lineToPoint: NSMakePoint(NSMinX(frame) + 49, NSMaxY(frame))]; + [semicirclePath curveToPoint: NSMakePoint(NSMinX(frame) + 14.35, NSMaxY(frame) - 14.64) controlPoint1: NSMakePoint(NSMinX(frame) + 36.46, NSMaxY(frame)) controlPoint2: NSMakePoint(NSMinX(frame) + 23.92, NSMaxY(frame) - 4.88)]; + [semicirclePath closePath]; + [[NSColor colorWithCalibratedRed:0.0f green:0.0f blue:0.0f alpha:alphaPercent] setFill]; + [semicirclePath fill]; + + + //// Arrow Drawing + NSBezierPath* arrowPath = [NSBezierPath bezierPath]; + [arrowPath moveToPoint: NSMakePoint(NSMinX(frame) + 24.93, NSMaxY(frame) - 37.93)]; + [arrowPath curveToPoint: NSMakePoint(NSMinX(frame) + 24.93, NSMaxY(frame) - 42.17) controlPoint1: NSMakePoint(NSMinX(frame) + 23.76, NSMaxY(frame) - 39.1) controlPoint2: NSMakePoint(NSMinX(frame) + 23.76, NSMaxY(frame) - 41)]; + [arrowPath lineToPoint: NSMakePoint(NSMinX(frame) + 29.76, NSMaxY(frame) - 47)]; + [arrowPath lineToPoint: NSMakePoint(NSMinX(frame) + 12, NSMaxY(frame) - 47)]; + [arrowPath curveToPoint: NSMakePoint(NSMinX(frame) + 9, NSMaxY(frame) - 50) controlPoint1: NSMakePoint(NSMinX(frame) + 10.34, NSMaxY(frame) - 47) controlPoint2: NSMakePoint(NSMinX(frame) + 9, NSMaxY(frame) - 48.34)]; + [arrowPath curveToPoint: NSMakePoint(NSMinX(frame) + 12, NSMaxY(frame) - 53) controlPoint1: NSMakePoint(NSMinX(frame) + 9, NSMaxY(frame) - 51.66) controlPoint2: NSMakePoint(NSMinX(frame) + 10.34, NSMaxY(frame) - 53)]; + [arrowPath lineToPoint: NSMakePoint(NSMinX(frame) + 29.76, NSMaxY(frame) - 53)]; + [arrowPath lineToPoint: NSMakePoint(NSMinX(frame) + 24.93, NSMaxY(frame) - 57.83)]; + [arrowPath curveToPoint: NSMakePoint(NSMinX(frame) + 24.93, NSMaxY(frame) - 62.07) controlPoint1: NSMakePoint(NSMinX(frame) + 23.76, NSMaxY(frame) - 59) controlPoint2: NSMakePoint(NSMinX(frame) + 23.76, NSMaxY(frame) - 60.9)]; + [arrowPath curveToPoint: NSMakePoint(NSMinX(frame) + 29.17, NSMaxY(frame) - 62.07) controlPoint1: NSMakePoint(NSMinX(frame) + 26.1, NSMaxY(frame) - 63.24) controlPoint2: NSMakePoint(NSMinX(frame) + 28, NSMaxY(frame) - 63.24)]; + [arrowPath lineToPoint: NSMakePoint(NSMinX(frame) + 39.07, NSMaxY(frame) - 52.17)]; + [arrowPath curveToPoint: NSMakePoint(NSMinX(frame) + 40, NSMaxY(frame) - 50) controlPoint1: NSMakePoint(NSMinX(frame) + 39.65, NSMaxY(frame) - 51.6) controlPoint2: NSMakePoint(NSMinX(frame) + 40, NSMaxY(frame) - 50.84)]; + [arrowPath curveToPoint: NSMakePoint(NSMinX(frame) + 39.1, NSMaxY(frame) - 47.85) controlPoint1: NSMakePoint(NSMinX(frame) + 40, NSMaxY(frame) - 49.16) controlPoint2: NSMakePoint(NSMinX(frame) + 39.65, NSMaxY(frame) - 48.4)]; + [arrowPath lineToPoint: NSMakePoint(NSMinX(frame) + 29.17, NSMaxY(frame) - 37.93)]; + [arrowPath curveToPoint: NSMakePoint(NSMinX(frame) + 24.93, NSMaxY(frame) - 37.93) controlPoint1: NSMakePoint(NSMinX(frame) + 28, NSMaxY(frame) - 36.76) controlPoint2: NSMakePoint(NSMinX(frame) + 26.1, NSMaxY(frame) - 36.76)]; + [arrowPath closePath]; + [[NSColor whiteColor] setFill]; + [arrowPath fill]; + } + } + else + { + [[[webView mainFrame] frameView] setAllowsScrolling:YES]; + } +} + +- (NSView *)hitTest:(NSPoint)aPoint +{ + return nil; +} + +@end diff --git a/DHSwipeWebView/DHSwipeWebView.h b/DHSwipeWebView/DHSwipeWebView.h new file mode 100644 index 0000000..c9f4fa9 --- /dev/null +++ b/DHSwipeWebView/DHSwipeWebView.h @@ -0,0 +1,11 @@ +#import + +@class DHSwipeIndicator; + +@interface DHSwipeWebView : WebView { + DHSwipeIndicator *swipeIndicator; +} + +@property (retain) DHSwipeIndicator *swipeIndicator; + +@end diff --git a/DHSwipeWebView/DHSwipeWebView.m b/DHSwipeWebView/DHSwipeWebView.m new file mode 100644 index 0000000..260e476 --- /dev/null +++ b/DHSwipeWebView/DHSwipeWebView.m @@ -0,0 +1,17 @@ +#import "DHSwipeWebView.h" +#import "DHSwipeIndicator.h" + +@implementation DHSwipeWebView + +@synthesize swipeIndicator; + +- (void)awakeFromNib +{ + [super awakeFromNib]; + if(NSClassFromString(@"NSPopover")) // this is my dumb way of checking if 10.7+ + { + self.swipeIndicator = [[DHSwipeIndicator alloc] initWithWebView:self]; + } +} + +@end diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8f3562d --- /dev/null +++ b/LICENSE @@ -0,0 +1,19 @@ +Copyright (C) 2013 Márton Salomváry + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..86a42f3 --- /dev/null +++ b/Makefile @@ -0,0 +1,24 @@ +APP = dist/TwentyTwo.app +DMG = dist/TwentyTwo.dmg + +build: $(APP) + +dist: $(DMG) + +$(DMG): build + cd dist && make + +$(APP): + . .codesign + xcodebuild -project TwentyTwo.xcodeproj -target TwentyTwo -configuration Release CODE_SIGN_IDENTITY="$(CODE_SIGN_IDENTITY)" CONFIGURATION_BUILD_DIR=dist DWARF_DSYM_FOLDER_PATH=build/Release + +run: build + open $(APP) + +.PHONY: clean +clean: dist-clean + -rm -rf $(APP) + +.PHONY: dist-clean +dist-clean: + cd dist && make clean diff --git a/README.markdown b/README.markdown new file mode 100644 index 0000000..2150635 --- /dev/null +++ b/README.markdown @@ -0,0 +1,16 @@ +## What's TwentyTwo? + +TwentyTwo is a Mac OS X application which brings +[22tracks](http://22tracks.com) to the +desktop without using a browser. + +Why is that good? + +- No more 'trying to find in which tab is 22tracks running'.. +- Media keys support! (Yeah, those with ▶ ❚❚ on them.) +- Stops on suspend. + +## Credits + +Derived from the work of Márton Salomváry on the +[SoundCleod](https://github.com/salomvary/soundcleod) project. diff --git a/SPMediaKeyTap/SPInvocationGrabbing/NSObject+SPInvocationGrabbing.h b/SPMediaKeyTap/SPInvocationGrabbing/NSObject+SPInvocationGrabbing.h new file mode 100644 index 0000000..d30233d --- /dev/null +++ b/SPMediaKeyTap/SPInvocationGrabbing/NSObject+SPInvocationGrabbing.h @@ -0,0 +1,30 @@ +#import + +@interface SPInvocationGrabber : NSObject { + id _object; + NSInvocation *_invocation; + int frameCount; + char **frameStrings; + BOOL backgroundAfterForward; + BOOL onMainAfterForward; + BOOL waitUntilDone; +} +-(id)initWithObject:(id)obj; +-(id)initWithObject:(id)obj stacktraceSaving:(BOOL)saveStack; +@property (readonly, retain, nonatomic) id object; +@property (readonly, retain, nonatomic) NSInvocation *invocation; +@property BOOL backgroundAfterForward; +@property BOOL onMainAfterForward; +@property BOOL waitUntilDone; +-(void)invoke; // will release object and invocation +-(void)printBacktrace; +-(void)saveBacktrace; +@end + +@interface NSObject (SPInvocationGrabbing) +-(id)grab; +-(id)invokeAfter:(NSTimeInterval)delta; +-(id)nextRunloop; +-(id)inBackground; +-(id)onMainAsync:(BOOL)async; +@end diff --git a/SPMediaKeyTap/SPInvocationGrabbing/NSObject+SPInvocationGrabbing.m b/SPMediaKeyTap/SPInvocationGrabbing/NSObject+SPInvocationGrabbing.m new file mode 100755 index 0000000..7e76b8f --- /dev/null +++ b/SPMediaKeyTap/SPInvocationGrabbing/NSObject+SPInvocationGrabbing.m @@ -0,0 +1,124 @@ +#import "NSObject+SPInvocationGrabbing.h" +#import + +#pragma mark Invocation grabbing +@interface SPInvocationGrabber () +@property (readwrite, retain, nonatomic) id object; +@property (readwrite, retain, nonatomic) NSInvocation *invocation; + +@end + +@implementation SPInvocationGrabber +- (id)initWithObject:(id)obj; +{ + return [self initWithObject:obj stacktraceSaving:YES]; +} + +-(id)initWithObject:(id)obj stacktraceSaving:(BOOL)saveStack; +{ + self.object = obj; + + if(saveStack) + [self saveBacktrace]; + + return self; +} +-(void)dealloc; +{ + free(frameStrings); + self.object = nil; + self.invocation = nil; +} +@synthesize invocation = _invocation, object = _object; + +@synthesize backgroundAfterForward, onMainAfterForward, waitUntilDone; +- (void)runInBackground; +{ + @try { + [self invoke]; + } + @finally { + } +} + + +- (void)forwardInvocation:(NSInvocation *)anInvocation { + [anInvocation retainArguments]; + anInvocation.target = _object; + self.invocation = anInvocation; + + if(backgroundAfterForward) + [NSThread detachNewThreadSelector:@selector(runInBackground) toTarget:self withObject:nil]; + else if(onMainAfterForward) + [self performSelectorOnMainThread:@selector(invoke) withObject:nil waitUntilDone:waitUntilDone]; +} +- (NSMethodSignature *)methodSignatureForSelector:(SEL)inSelector { + NSMethodSignature *signature = [super methodSignatureForSelector:inSelector]; + if (signature == NULL) + signature = [_object methodSignatureForSelector:inSelector]; + + return signature; +} + +- (void)invoke; +{ + + @try { + [_invocation invoke]; + } + @catch (NSException * e) { + NSLog(@"SPInvocationGrabber's target raised %@:\n\t%@\nInvocation was originally scheduled at:", e.name, e); + [self printBacktrace]; + printf("\n"); + [e raise]; + } + + self.invocation = nil; + self.object = nil; +} + +-(void)saveBacktrace; +{ + void *backtraceFrames[128]; + frameCount = backtrace(&backtraceFrames[0], 128); + frameStrings = backtrace_symbols(&backtraceFrames[0], frameCount); +} +-(void)printBacktrace; +{ + for(int x = 3; x < frameCount; x++) { + if(frameStrings[x] == NULL) { break; } + printf("%s\n", frameStrings[x]); + } +} +@end + +@implementation NSObject (SPInvocationGrabbing) +-(id)grab; +{ + return [[SPInvocationGrabber alloc] initWithObject:self]; +} +-(id)invokeAfter:(NSTimeInterval)delta; +{ + id grabber = [self grab]; + [NSTimer scheduledTimerWithTimeInterval:delta target:grabber selector:@selector(invoke) userInfo:nil repeats:NO]; + return grabber; +} +- (id)nextRunloop; +{ + return [self invokeAfter:0]; +} +-(id)inBackground; +{ + SPInvocationGrabber *grabber = [self grab]; + grabber.backgroundAfterForward = YES; + return grabber; +} +-(id)onMainAsync:(BOOL)async; +{ + SPInvocationGrabber *grabber = [self grab]; + grabber.onMainAfterForward = YES; + grabber.waitUntilDone = !async; + return grabber; +} + +@end diff --git a/SPMediaKeyTap/SPMediaKeyTap.h b/SPMediaKeyTap/SPMediaKeyTap.h new file mode 100644 index 0000000..aa974d2 --- /dev/null +++ b/SPMediaKeyTap/SPMediaKeyTap.h @@ -0,0 +1,43 @@ +#include +#import +#import + +// http://overooped.com/post/2593597587/mediakeys + +#define SPSystemDefinedEventMediaKeys 8 + +@interface SPMediaKeyTap : NSObject { + EventHandlerRef _app_switching_ref; + EventHandlerRef _app_terminating_ref; + CFMachPortRef _eventPort; + CFRunLoopSourceRef _eventPortSource; + CFRunLoopRef _tapThreadRL; + BOOL _shouldInterceptMediaKeyEvents; + id _delegate; + // The app that is frontmost in this list owns media keys + NSMutableArray *_mediaKeyAppList; +} ++ (NSArray*)defaultMediaKeyUserBundleIdentifiers; + +-(id)initWithDelegate:(id)delegate; + ++(BOOL)usesGlobalMediaKeyTap; +-(void)startWatchingMediaKeys; +-(void)stopWatchingMediaKeys; +-(void)handleAndReleaseMediaKeyEvent:(NSEvent *)event; +@end + +@interface NSObject (SPMediaKeyTapDelegate) +-(void)mediaKeyTap:(SPMediaKeyTap*)keyTap receivedMediaKeyEvent:(NSEvent*)event; +@end + +#ifdef __cplusplus +extern "C" { +#endif + +extern NSString *kMediaKeyUsingBundleIdentifiersDefaultsKey; +extern NSString *kIgnoreMediaKeysDefaultsKey; + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/SPMediaKeyTap/SPMediaKeyTap.m b/SPMediaKeyTap/SPMediaKeyTap.m new file mode 100755 index 0000000..3c73b9b --- /dev/null +++ b/SPMediaKeyTap/SPMediaKeyTap.m @@ -0,0 +1,328 @@ +// Copyright (c) 2010 Spotify AB +#import "SPMediaKeyTap.h" +#import "SPInvocationGrabbing/NSObject+SPInvocationGrabbing.h" // https://gist.github.com/511181, in submodule + +@interface SPMediaKeyTap () +-(BOOL)shouldInterceptMediaKeyEvents; +-(void)setShouldInterceptMediaKeyEvents:(BOOL)newSetting; +-(void)startWatchingAppSwitching; +-(void)stopWatchingAppSwitching; +-(void)eventTapThread; +@end +static SPMediaKeyTap *singleton = nil; + +static pascal OSStatus appSwitched (EventHandlerCallRef nextHandler, EventRef evt, void* userData); +static pascal OSStatus appTerminated (EventHandlerCallRef nextHandler, EventRef evt, void* userData); +static CGEventRef tapEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon); + + +// Inspired by http://gist.github.com/546311 + +@implementation SPMediaKeyTap + +#pragma mark - +#pragma mark Setup and teardown +-(id)initWithDelegate:(id)delegate; +{ + _delegate = delegate; + [self startWatchingAppSwitching]; + singleton = self; + _mediaKeyAppList = [NSMutableArray new]; + _tapThreadRL=nil; + _eventPort=nil; + _eventPortSource=nil; + return self; +} +-(void)dealloc; +{ + [self stopWatchingMediaKeys]; + [self stopWatchingAppSwitching]; +} + +-(void)startWatchingAppSwitching; +{ + // Listen to "app switched" event, so that we don't intercept media keys if we + // weren't the last "media key listening" app to be active + EventTypeSpec eventType = { kEventClassApplication, kEventAppFrontSwitched }; + OSStatus err = InstallApplicationEventHandler(NewEventHandlerUPP(appSwitched), 1, &eventType, (__bridge void*)self, &_app_switching_ref); + assert(err == noErr); + + eventType.eventKind = kEventAppTerminated; + err = InstallApplicationEventHandler(NewEventHandlerUPP(appTerminated), 1, &eventType, (__bridge void*)self, &_app_terminating_ref); + assert(err == noErr); +} +-(void)stopWatchingAppSwitching; +{ + if(!_app_switching_ref) return; + RemoveEventHandler(_app_switching_ref); + _app_switching_ref = NULL; +} + +-(void)startWatchingMediaKeys;{ + // Prevent having multiple mediaKeys threads + [self stopWatchingMediaKeys]; + + [self setShouldInterceptMediaKeyEvents:YES]; + + // Add an event tap to intercept the system defined media key events + _eventPort = CGEventTapCreate(kCGSessionEventTap, + kCGHeadInsertEventTap, + kCGEventTapOptionDefault, + CGEventMaskBit(NX_SYSDEFINED), + tapEventCallback, + (__bridge void*)self); + assert(_eventPort != NULL); + + _eventPortSource = CFMachPortCreateRunLoopSource(kCFAllocatorSystemDefault, _eventPort, 0); + assert(_eventPortSource != NULL); + + // Let's do this in a separate thread so that a slow app doesn't lag the event tap + [NSThread detachNewThreadSelector:@selector(eventTapThread) toTarget:self withObject:nil]; +} +-(void)stopWatchingMediaKeys; +{ + // TODO: Shut down thread, remove event tap port and source + + if(_tapThreadRL){ + CFRunLoopStop(_tapThreadRL); + _tapThreadRL=nil; + } + + if(_eventPort){ + CFMachPortInvalidate(_eventPort); + CFRelease(_eventPort); + _eventPort=nil; + } + + if(_eventPortSource){ + CFRelease(_eventPortSource); + _eventPortSource=nil; + } +} + +#pragma mark - +#pragma mark Accessors + ++(BOOL)usesGlobalMediaKeyTap +{ +#ifdef _DEBUG + // breaking in gdb with a key tap inserted sometimes locks up all mouse and keyboard input forever, forcing reboot + return NO; +#else + // XXX(nevyn): MediaKey event tap doesn't work on 10.4, feel free to figure out why if you have the energy. + return + ![[NSUserDefaults standardUserDefaults] boolForKey:kIgnoreMediaKeysDefaultsKey] + && floor(NSAppKitVersionNumber) >= 949/*NSAppKitVersionNumber10_5*/; +#endif +} + ++ (NSArray*)defaultMediaKeyUserBundleIdentifiers; +{ + return [NSArray arrayWithObjects: + [[NSBundle mainBundle] bundleIdentifier], // your app + @"com.spotify.client", + @"com.apple.iTunes", + @"com.apple.QuickTimePlayerX", + @"com.apple.quicktimeplayer", + @"com.apple.iWork.Keynote", + @"com.apple.iPhoto", + @"org.videolan.vlc", + @"com.apple.Aperture", + @"com.plexsquared.Plex", + @"com.soundcloud.desktop", + @"org.niltsh.MPlayerX", + @"com.ilabs.PandorasHelper", + @"com.mahasoftware.pandabar", + @"com.bitcartel.pandorajam", + @"org.clementine-player.clementine", + @"fm.last.Last.fm", + @"com.beatport.BeatportPro", + @"com.Timenut.SongKey", + @"com.macromedia.fireworks", // the tap messes up their mouse input + @"com.radev.Spacebeat", + nil + ]; +} + + +-(BOOL)shouldInterceptMediaKeyEvents; +{ + BOOL shouldIntercept = NO; + @synchronized(self) { + shouldIntercept = _shouldInterceptMediaKeyEvents; + } + return shouldIntercept; +} + +-(void)pauseTapOnTapThread:(BOOL)yeahno; +{ + CGEventTapEnable(self->_eventPort, yeahno); +} +-(void)setShouldInterceptMediaKeyEvents:(BOOL)newSetting; +{ + BOOL oldSetting; + @synchronized(self) { + oldSetting = _shouldInterceptMediaKeyEvents; + _shouldInterceptMediaKeyEvents = newSetting; + } + if(_tapThreadRL && oldSetting != newSetting) { + id grab = [self grab]; + [grab pauseTapOnTapThread:newSetting]; + NSTimer *timer = [NSTimer timerWithTimeInterval:0 invocation:[grab invocation] repeats:NO]; + CFRunLoopAddTimer(_tapThreadRL, (__bridge CFRunLoopTimerRef)timer, kCFRunLoopCommonModes); + } +} + +#pragma mark +#pragma mark - +#pragma mark Event tap callbacks + +// Note: method called on background thread + +static CGEventRef tapEventCallback2(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) +{ + SPMediaKeyTap *self = (__bridge id)refcon; + + if(type == kCGEventTapDisabledByTimeout) { + NSLog(@"Media key event tap was disabled by timeout"); + CGEventTapEnable(self->_eventPort, TRUE); + return event; + } else if(type == kCGEventTapDisabledByUserInput) { + // Was disabled manually by -[pauseTapOnTapThread] + return event; + } + NSEvent *nsEvent = nil; + @try { + nsEvent = [NSEvent eventWithCGEvent:event]; + } + @catch (NSException * e) { + NSLog(@"Strange CGEventType: %d: %@", type, e); + assert(0); + return event; + } + + if (type != NX_SYSDEFINED || [nsEvent subtype] != SPSystemDefinedEventMediaKeys) + return event; + + int keyCode = (([nsEvent data1] & 0xFFFF0000) >> 16); + if (keyCode != NX_KEYTYPE_PLAY && keyCode != NX_KEYTYPE_FAST && keyCode != NX_KEYTYPE_REWIND && keyCode != NX_KEYTYPE_PREVIOUS && keyCode != NX_KEYTYPE_NEXT) + return event; + + if (![self shouldInterceptMediaKeyEvents]) + return event; + + [self performSelectorOnMainThread:@selector(handleAndReleaseMediaKeyEvent:) withObject:nsEvent waitUntilDone:NO]; + + return NULL; +} + +static CGEventRef tapEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) +{ + CGEventRef ret = tapEventCallback2(proxy, type, event, refcon); + return ret; +} + + +// event will have been retained in the other thread +-(void)handleAndReleaseMediaKeyEvent:(NSEvent *)event { + [_delegate mediaKeyTap:self receivedMediaKeyEvent:event]; +} + + +-(void)eventTapThread; +{ + _tapThreadRL = CFRunLoopGetCurrent(); + CFRunLoopAddSource(_tapThreadRL, _eventPortSource, kCFRunLoopCommonModes); + CFRunLoopRun(); +} + +#pragma mark Task switching callbacks + +NSString *kMediaKeyUsingBundleIdentifiersDefaultsKey = @"SPApplicationsNeedingMediaKeys"; +NSString *kIgnoreMediaKeysDefaultsKey = @"SPIgnoreMediaKeys"; + + + +-(void)mediaKeyAppListChanged; +{ + if([_mediaKeyAppList count] == 0) return; + + /*NSLog(@"--"); + int i = 0; + for (NSValue *psnv in _mediaKeyAppList) { + ProcessSerialNumber psn; [psnv getValue:&psn]; + NSDictionary *processInfo = [(id)ProcessInformationCopyDictionary( + &psn, + kProcessDictionaryIncludeAllInformationMask + ) autorelease]; + NSString *bundleIdentifier = [processInfo objectForKey:(id)kCFBundleIdentifierKey]; + NSLog(@"%d: %@", i++, bundleIdentifier); + }*/ + + ProcessSerialNumber mySerial, topSerial; + GetCurrentProcess(&mySerial); + [[_mediaKeyAppList objectAtIndex:0] getValue:&topSerial]; + + Boolean same; + OSErr err = SameProcess(&mySerial, &topSerial, &same); + [self setShouldInterceptMediaKeyEvents:(err == noErr && same)]; + +} +-(void)appIsNowFrontmost:(ProcessSerialNumber)psn; +{ + NSValue *psnv = [NSValue valueWithBytes:&psn objCType:@encode(ProcessSerialNumber)]; + + NSDictionary *processInfo = (__bridge id)ProcessInformationCopyDictionary( + &psn, + kProcessDictionaryIncludeAllInformationMask + ); + NSString *bundleIdentifier = [processInfo objectForKey:(id)kCFBundleIdentifierKey]; + + NSArray *whitelistIdentifiers = [[NSUserDefaults standardUserDefaults] arrayForKey:kMediaKeyUsingBundleIdentifiersDefaultsKey]; + if(![whitelistIdentifiers containsObject:bundleIdentifier]) return; + + [_mediaKeyAppList removeObject:psnv]; + [_mediaKeyAppList insertObject:psnv atIndex:0]; + [self mediaKeyAppListChanged]; +} +-(void)appTerminated:(ProcessSerialNumber)psn; +{ + NSValue *psnv = [NSValue valueWithBytes:&psn objCType:@encode(ProcessSerialNumber)]; + [_mediaKeyAppList removeObject:psnv]; + [self mediaKeyAppListChanged]; +} + +static pascal OSStatus appSwitched (EventHandlerCallRef nextHandler, EventRef evt, void* userData) +{ + SPMediaKeyTap *self = (__bridge id)userData; + + ProcessSerialNumber newSerial; + GetFrontProcess(&newSerial); + + [self appIsNowFrontmost:newSerial]; + + return CallNextEventHandler(nextHandler, evt); +} + +static pascal OSStatus appTerminated (EventHandlerCallRef nextHandler, EventRef evt, void* userData) +{ + SPMediaKeyTap *self = (__bridge id)userData; + + ProcessSerialNumber deadPSN; + + GetEventParameter( + evt, + kEventParamProcessID, + typeProcessSerialNumber, + NULL, + sizeof(deadPSN), + NULL, + &deadPSN + ); + + + [self appTerminated:deadPSN]; + return CallNextEventHandler(nextHandler, evt); +} + +@end diff --git a/Sparkle.framework/Headers b/Sparkle.framework/Headers new file mode 120000 index 0000000..a177d2a --- /dev/null +++ b/Sparkle.framework/Headers @@ -0,0 +1 @@ +Versions/Current/Headers \ No newline at end of file diff --git a/Sparkle.framework/Resources b/Sparkle.framework/Resources new file mode 120000 index 0000000..953ee36 --- /dev/null +++ b/Sparkle.framework/Resources @@ -0,0 +1 @@ +Versions/Current/Resources \ No newline at end of file diff --git a/Sparkle.framework/Sparkle b/Sparkle.framework/Sparkle new file mode 120000 index 0000000..b2c5273 --- /dev/null +++ b/Sparkle.framework/Sparkle @@ -0,0 +1 @@ +Versions/Current/Sparkle \ No newline at end of file diff --git a/Sparkle.framework/Versions/A/Headers/SUAppcast.h b/Sparkle.framework/Versions/A/Headers/SUAppcast.h new file mode 100644 index 0000000..171148a --- /dev/null +++ b/Sparkle.framework/Versions/A/Headers/SUAppcast.h @@ -0,0 +1,33 @@ +// +// SUAppcast.h +// Sparkle +// +// Created by Andy Matuschak on 3/12/06. +// Copyright 2006 Andy Matuschak. All rights reserved. +// + +#ifndef SUAPPCAST_H +#define SUAPPCAST_H + +@class SUAppcastItem; +@interface SUAppcast : NSObject { + NSArray *items; + NSString *userAgentString; + id delegate; + NSMutableData *incrementalData; +} + +- (void)fetchAppcastFromURL:(NSURL *)url; +- (void)setDelegate:delegate; +- (void)setUserAgentString:(NSString *)userAgentString; + +- (NSArray *)items; + +@end + +@interface NSObject (SUAppcastDelegate) +- (void)appcastDidFinishLoading:(SUAppcast *)appcast; +- (void)appcast:(SUAppcast *)appcast failedToLoadWithError:(NSError *)error; +@end + +#endif diff --git a/Sparkle.framework/Versions/A/Headers/SUAppcastItem.h b/Sparkle.framework/Versions/A/Headers/SUAppcastItem.h new file mode 100644 index 0000000..7f1ca65 --- /dev/null +++ b/Sparkle.framework/Versions/A/Headers/SUAppcastItem.h @@ -0,0 +1,47 @@ +// +// SUAppcastItem.h +// Sparkle +// +// Created by Andy Matuschak on 3/12/06. +// Copyright 2006 Andy Matuschak. All rights reserved. +// + +#ifndef SUAPPCASTITEM_H +#define SUAPPCASTITEM_H + +@interface SUAppcastItem : NSObject { + NSString *title; + NSDate *date; + NSString *itemDescription; + + NSURL *releaseNotesURL; + + NSString *DSASignature; + NSString *minimumSystemVersion; + + NSURL *fileURL; + NSString *versionString; + NSString *displayVersionString; + + NSDictionary *propertiesDictionary; +} + +// Initializes with data from a dictionary provided by the RSS class. +- initWithDictionary:(NSDictionary *)dict; + +- (NSString *)title; +- (NSString *)versionString; +- (NSString *)displayVersionString; +- (NSDate *)date; +- (NSString *)itemDescription; +- (NSURL *)releaseNotesURL; +- (NSURL *)fileURL; +- (NSString *)DSASignature; +- (NSString *)minimumSystemVersion; + +// Returns the dictionary provided in initWithDictionary; this might be useful later for extensions. +- (NSDictionary *)propertiesDictionary; + +@end + +#endif diff --git a/Sparkle.framework/Versions/A/Headers/SUUpdater.h b/Sparkle.framework/Versions/A/Headers/SUUpdater.h new file mode 100644 index 0000000..e78c4d3 --- /dev/null +++ b/Sparkle.framework/Versions/A/Headers/SUUpdater.h @@ -0,0 +1,118 @@ +// +// SUUpdater.h +// Sparkle +// +// Created by Andy Matuschak on 1/4/06. +// Copyright 2006 Andy Matuschak. All rights reserved. +// + +#ifndef SUUPDATER_H +#define SUUPDATER_H + +#import + +@class SUUpdateDriver, SUAppcastItem, SUHost, SUAppcast; +@interface SUUpdater : NSObject { + NSTimer *checkTimer; + SUUpdateDriver *driver; + + SUHost *host; + IBOutlet id delegate; +} + ++ (SUUpdater *)sharedUpdater; ++ (SUUpdater *)updaterForBundle:(NSBundle *)bundle; +- (NSBundle *)hostBundle; + +- (void)setDelegate:(id)delegate; +- delegate; + +- (void)setAutomaticallyChecksForUpdates:(BOOL)automaticallyChecks; +- (BOOL)automaticallyChecksForUpdates; + +- (void)setUpdateCheckInterval:(NSTimeInterval)interval; +- (NSTimeInterval)updateCheckInterval; + +- (void)setFeedURL:(NSURL *)feedURL; +- (NSURL *)feedURL; + +- (void)setSendsSystemProfile:(BOOL)sendsSystemProfile; +- (BOOL)sendsSystemProfile; + +- (void)setAutomaticallyDownloadsUpdates:(BOOL)automaticallyDownloadsUpdates; +- (BOOL)automaticallyDownloadsUpdates; + +// This IBAction is meant for a main menu item. Hook up any menu item to this action, +// and Sparkle will check for updates and report back its findings verbosely. +- (IBAction)checkForUpdates:sender; + +// This kicks off an update meant to be programmatically initiated. That is, it will display no UI unless it actually finds an update, +// in which case it proceeds as usual. If the fully automated updating is turned on, however, this will invoke that behavior, and if an +// update is found, it will be downloaded and prepped for installation. +- (void)checkForUpdatesInBackground; + +// Date of last update check. Returns null if no check has been performed. +- (NSDate*)lastUpdateCheckDate; + +// This begins a "probing" check for updates which will not actually offer to update to that version. The delegate methods, though, +// (up to updater:didFindValidUpdate: and updaterDidNotFindUpdate:), are called, so you can use that information in your UI. +- (void)checkForUpdateInformation; + +// Call this to appropriately schedule or cancel the update checking timer according to the preferences for time interval and automatic checks. This call does not change the date of the next check, but only the internal NSTimer. +- (void)resetUpdateCycle; + +- (BOOL)updateInProgress; +@end + +@interface NSObject (SUUpdaterDelegateInformalProtocol) +// This method allows you to add extra parameters to the appcast URL, potentially based on whether or not Sparkle will also be sending along the system profile. This method should return an array of dictionaries with keys: "key", "value", "displayKey", "displayValue", the latter two being specifically for display to the user. +- (NSArray *)feedParametersForUpdater:(SUUpdater *)updater sendingSystemProfile:(BOOL)sendingProfile; + +// Use this to override the default behavior for Sparkle prompting the user about automatic update checks. +- (BOOL)updaterShouldPromptForPermissionToCheckForUpdates:(SUUpdater *)bundle; + +// Implement this if you want to do some special handling with the appcast once it finishes loading. +- (void)updater:(SUUpdater *)updater didFinishLoadingAppcast:(SUAppcast *)appcast; + +// If you're using special logic or extensions in your appcast, implement this to use your own logic for finding +// a valid update, if any, in the given appcast. +- (SUAppcastItem *)bestValidUpdateInAppcast:(SUAppcast *)appcast forUpdater:(SUUpdater *)bundle; + +// Sent when a valid update is found by the update driver. +- (void)updater:(SUUpdater *)updater didFindValidUpdate:(SUAppcastItem *)update; + +// Sent when a valid update is not found. +- (void)updaterDidNotFindUpdate:(SUUpdater *)update; + +// Sent immediately before installing the specified update. +- (void)updater:(SUUpdater *)updater willInstallUpdate:(SUAppcastItem *)update; + +// Return YES to delay the relaunch until you do some processing; invoke the given NSInvocation to continue. +- (BOOL)updater:(SUUpdater *)updater shouldPostponeRelaunchForUpdate:(SUAppcastItem *)update untilInvoking:(NSInvocation *)invocation; + +// Called immediately before relaunching. +- (void)updaterWillRelaunchApplication:(SUUpdater *)updater; + +// This method allows you to provide a custom version comparator. +// If you don't implement this method or return nil, the standard version comparator will be used. +- (id )versionComparatorForUpdater:(SUUpdater *)updater; + +// Returns the path which is used to relaunch the client after the update is installed. By default, the path of the host bundle. +- (NSString *)pathToRelaunchForUpdater:(SUUpdater *)updater; + +@end + +// Define some minimum intervals to avoid DOS-like checking attacks. These are in seconds. +#ifdef DEBUG +#define SU_MIN_CHECK_INTERVAL 60 +#else +#define SU_MIN_CHECK_INTERVAL 60*60 +#endif + +#ifdef DEBUG +#define SU_DEFAULT_CHECK_INTERVAL 60 +#else +#define SU_DEFAULT_CHECK_INTERVAL 60*60*24 +#endif + +#endif diff --git a/Sparkle.framework/Versions/A/Headers/SUVersionComparisonProtocol.h b/Sparkle.framework/Versions/A/Headers/SUVersionComparisonProtocol.h new file mode 100644 index 0000000..3d11ae8 --- /dev/null +++ b/Sparkle.framework/Versions/A/Headers/SUVersionComparisonProtocol.h @@ -0,0 +1,27 @@ +// +// SUVersionComparisonProtocol.h +// Sparkle +// +// Created by Andy Matuschak on 12/21/07. +// Copyright 2007 Andy Matuschak. All rights reserved. +// + +#ifndef SUVERSIONCOMPARISONPROTOCOL_H +#define SUVERSIONCOMPARISONPROTOCOL_H + +/*! + @protocol + @abstract Implement this protocol to provide version comparison facilities for Sparkle. +*/ +@protocol SUVersionComparison + +/*! + @method + @abstract An abstract method to compare two version strings. + @discussion Should return NSOrderedAscending if b > a, NSOrderedDescending if b < a, and NSOrderedSame if they are equivalent. +*/ +- (NSComparisonResult)compareVersion:(NSString *)versionA toVersion:(NSString *)versionB; + +@end + +#endif diff --git a/Sparkle.framework/Versions/A/Headers/Sparkle.h b/Sparkle.framework/Versions/A/Headers/Sparkle.h new file mode 100644 index 0000000..08dd577 --- /dev/null +++ b/Sparkle.framework/Versions/A/Headers/Sparkle.h @@ -0,0 +1,21 @@ +// +// Sparkle.h +// Sparkle +// +// Created by Andy Matuschak on 3/16/06. (Modified by CDHW on 23/12/07) +// Copyright 2006 Andy Matuschak. All rights reserved. +// + +#ifndef SPARKLE_H +#define SPARKLE_H + +// This list should include the shared headers. It doesn't matter if some of them aren't shared (unless +// there are name-space collisions) so we can list all of them to start with: + +#import + +#import +#import +#import + +#endif diff --git a/Sparkle.framework/Versions/A/Resources/Info.plist b/Sparkle.framework/Versions/A/Resources/Info.plist new file mode 100644 index 0000000..c7f277d --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + Sparkle + CFBundleIdentifier + org.andymatuschak.Sparkle + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + Sparkle + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.5 Beta 6 + CFBundleSignature + ???? + CFBundleVersion + 313 + + diff --git a/Sparkle.framework/Versions/A/Resources/License.txt b/Sparkle.framework/Versions/A/Resources/License.txt new file mode 100644 index 0000000..20466c4 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/License.txt @@ -0,0 +1,7 @@ +Copyright (c) 2006 Andy Matuschak + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/Sparkle.framework/Versions/A/Resources/SUModelTranslation.plist b/Sparkle.framework/Versions/A/Resources/SUModelTranslation.plist new file mode 100644 index 0000000..92ef947 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/SUModelTranslation.plist @@ -0,0 +1,174 @@ + + + + + ADP2,1 + Developer Transition Kit + MacBook1,1 + MacBook (Core Duo) + MacBook2,1 + MacBook (Core 2 Duo) + MacBook4,1 + MacBook (Core 2 Duo Feb 2008) + MacBookAir1,1 + MacBook Air (January 2008) + MacBookPro1,1 + MacBook Pro Core Duo (15-inch) + MacBookPro1,2 + MacBook Pro Core Duo (17-inch) + MacBookPro2,1 + MacBook Pro Core 2 Duo (17-inch) + MacBookPro2,2 + MacBook Pro Core 2 Duo (15-inch) + MacBookPro3,1 + MacBook Pro Core 2 Duo (15-inch LED, Core 2 Duo) + MacBookPro3,2 + MacBook Pro Core 2 Duo (17-inch HD, Core 2 Duo) + MacBookPro4,1 + MacBook Pro (Core 2 Duo Feb 2008) + MacPro1,1 + Mac Pro (four-core) + MacPro2,1 + Mac Pro (eight-core) + MacPro3,1 + Mac Pro (January 2008 4- or 8- core "Harpertown") + Macmini1,1 + Mac Mini (Core Solo/Duo) + PowerBook1,1 + PowerBook G3 + PowerBook2,1 + iBook G3 + PowerBook2,2 + iBook G3 (FireWire) + PowerBook2,3 + iBook G3 + PowerBook2,4 + iBook G3 + PowerBook3,1 + PowerBook G3 (FireWire) + PowerBook3,2 + PowerBook G4 + PowerBook3,3 + PowerBook G4 (Gigabit Ethernet) + PowerBook3,4 + PowerBook G4 (DVI) + PowerBook3,5 + PowerBook G4 (1GHz / 867MHz) + PowerBook4,1 + iBook G3 (Dual USB, Late 2001) + PowerBook4,2 + iBook G3 (16MB VRAM) + PowerBook4,3 + iBook G3 Opaque 16MB VRAM, 32MB VRAM, Early 2003) + PowerBook5,1 + PowerBook G4 (17 inch) + PowerBook5,2 + PowerBook G4 (15 inch FW 800) + PowerBook5,3 + PowerBook G4 (17-inch 1.33GHz) + PowerBook5,4 + PowerBook G4 (15 inch 1.5/1.33GHz) + PowerBook5,5 + PowerBook G4 (17-inch 1.5GHz) + PowerBook5,6 + PowerBook G4 (15 inch 1.67GHz/1.5GHz) + PowerBook5,7 + PowerBook G4 (17-inch 1.67GHz) + PowerBook5,8 + PowerBook G4 (Double layer SD, 15 inch) + PowerBook5,9 + PowerBook G4 (Double layer SD, 17 inch) + PowerBook6,1 + PowerBook G4 (12 inch) + PowerBook6,2 + PowerBook G4 (12 inch, DVI) + PowerBook6,3 + iBook G4 + PowerBook6,4 + PowerBook G4 (12 inch 1.33GHz) + PowerBook6,5 + iBook G4 (Early-Late 2004) + PowerBook6,7 + iBook G4 (Mid 2005) + PowerBook6,8 + PowerBook G4 (12 inch 1.5GHz) + PowerMac1,1 + Power Macintosh G3 (Blue & White) + PowerMac1,2 + Power Macintosh G4 (PCI Graphics) + PowerMac10,1 + Mac Mini G4 + PowerMac10,2 + Mac Mini (Late 2005) + PowerMac11,2 + Power Macintosh G5 (Late 2005) + PowerMac12,1 + iMac G5 (iSight) + PowerMac2,1 + iMac G3 (Slot-loading CD-ROM) + PowerMac2,2 + iMac G3 (Summer 2000) + PowerMac3,1 + Power Macintosh G4 (AGP Graphics) + PowerMac3,2 + Power Macintosh G4 (AGP Graphics) + PowerMac3,3 + Power Macintosh G4 (Gigabit Ethernet) + PowerMac3,4 + Power Macintosh G4 (Digital Audio) + PowerMac3,5 + Power Macintosh G4 (Quick Silver) + PowerMac3,6 + Power Macintosh G4 (Mirrored Drive Door) + PowerMac4,1 + iMac G3 (Early/Summer 2001) + PowerMac4,2 + iMac G4 (Flat Panel) + PowerMac4,4 + eMac + PowerMac4,5 + iMac G4 (17-inch Flat Panel) + PowerMac5,1 + Power Macintosh G4 Cube + PowerMac6,1 + iMac G4 (USB 2.0) + PowerMac6,3 + iMac G4 (20-inch Flat Panel) + PowerMac6,4 + eMac (USB 2.0, 2005) + PowerMac7,2 + Power Macintosh G5 + PowerMac7,3 + Power Macintosh G5 + PowerMac8,1 + iMac G5 + PowerMac8,2 + iMac G5 (Ambient Light Sensor) + PowerMac9,1 + Power Macintosh G5 (Late 2005) + RackMac1,1 + Xserve G4 + RackMac1,2 + Xserve G4 (slot-loading, cluster node) + RackMac3,1 + Xserve G5 + Xserve1,1 + Xserve (Intel Xeon) + Xserve2,1 + Xserve (January 2008 quad-core) + iMac1,1 + iMac G3 (Rev A-D) + iMac4,1 + iMac (Core Duo) + iMac4,2 + iMac for Education (17-inch, Core Duo) + iMac5,1 + iMac (Core 2 Duo, 17 or 20 inch, SuperDrive) + iMac5,2 + iMac (Core 2 Duo, 17 inch, Combo Drive) + iMac6,1 + iMac (Core 2 Duo, 24 inch, SuperDrive) + iMac8,1 + iMac (April 2008) + + diff --git a/Sparkle.framework/Versions/A/Resources/SUStatus.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/SUStatus.nib/classes.nib new file mode 100644 index 0000000..22f13f8 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/SUStatus.nib/classes.nib @@ -0,0 +1,56 @@ + + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + CLASS + NSApplication + LANGUAGE + ObjC + SUPERCLASS + NSResponder + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + CLASS + SUStatusController + LANGUAGE + ObjC + OUTLETS + + actionButton + NSButton + progressBar + NSProgressIndicator + + SUPERCLASS + SUWindowController + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/SUStatus.nib/info.nib b/Sparkle.framework/Versions/A/Resources/SUStatus.nib/info.nib new file mode 100644 index 0000000..a9ac867 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/SUStatus.nib/info.nib @@ -0,0 +1,20 @@ + + + + + IBFramework Version + 670 + IBLastKnownRelativeProjectPath + Sparkle.xcodeproj + IBOldestOS + 5 + IBOpenObjects + + 6 + + IBSystem Version + 10A96 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/SUStatus.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/SUStatus.nib/keyedobjects.nib new file mode 100644 index 0000000..4f1d598 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/SUStatus.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/classes.nib new file mode 100644 index 0000000..4b1ab30 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/classes.nib @@ -0,0 +1,50 @@ + + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + ACTIONS + + doNotInstall + id + installLater + id + installNow + id + + CLASS + SUAutomaticUpdateAlert + LANGUAGE + ObjC + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/info.nib b/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/info.nib new file mode 100644 index 0000000..2e04cfa --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/info.nib @@ -0,0 +1,20 @@ + + + + + IBFramework Version + 667 + IBLastKnownRelativeProjectPath + ../Sparkle.xcodeproj + IBOldestOS + 5 + IBOpenObjects + + 6 + + IBSystem Version + 9D34 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib new file mode 100644 index 0000000..6b92630 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/classes.nib new file mode 100644 index 0000000..994d4c3 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/classes.nib @@ -0,0 +1,67 @@ + + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + CLASS + NSApplication + LANGUAGE + ObjC + SUPERCLASS + NSResponder + + + ACTIONS + + installUpdate + id + remindMeLater + id + skipThisVersion + id + + CLASS + SUUpdateAlert + LANGUAGE + ObjC + OUTLETS + + delegate + id + description + NSTextField + releaseNotesView + WebView + + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/info.nib b/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/info.nib new file mode 100644 index 0000000..2e04cfa --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/info.nib @@ -0,0 +1,20 @@ + + + + + IBFramework Version + 667 + IBLastKnownRelativeProjectPath + ../Sparkle.xcodeproj + IBOldestOS + 5 + IBOpenObjects + + 6 + + IBSystem Version + 9D34 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/keyedobjects.nib new file mode 100644 index 0000000..b4353d2 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib/classes.nib new file mode 100644 index 0000000..5220a22 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib/classes.nib @@ -0,0 +1,59 @@ + + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + ACTIONS + + finishPrompt + id + toggleMoreInfo + id + + CLASS + SUUpdatePermissionPrompt + LANGUAGE + ObjC + OUTLETS + + delegate + id + descriptionTextField + NSTextField + moreInfoButton + NSButton + moreInfoView + NSView + + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib/info.nib b/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib/info.nib new file mode 100644 index 0000000..2e04cfa --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib/info.nib @@ -0,0 +1,20 @@ + + + + + IBFramework Version + 667 + IBLastKnownRelativeProjectPath + ../Sparkle.xcodeproj + IBOldestOS + 5 + IBOpenObjects + + 6 + + IBSystem Version + 9D34 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib new file mode 100644 index 0000000..b403a3e Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/de.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/de.lproj/Sparkle.strings new file mode 100644 index 0000000..b31f928 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/de.lproj/Sparkle.strings differ diff --git a/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/classes.nib new file mode 100644 index 0000000..4b1ab30 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/classes.nib @@ -0,0 +1,50 @@ + + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + ACTIONS + + doNotInstall + id + installLater + id + installNow + id + + CLASS + SUAutomaticUpdateAlert + LANGUAGE + ObjC + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/info.nib b/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/info.nib new file mode 100644 index 0000000..ab36d31 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/info.nib @@ -0,0 +1,20 @@ + + + + + IBFramework Version + 658 + IBLastKnownRelativeProjectPath + ../Sparkle.xcodeproj + IBOldestOS + 5 + IBOpenObjects + + 6 + + IBSystem Version + 9C7010 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib new file mode 100644 index 0000000..7630390 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/classes.nib new file mode 100644 index 0000000..994d4c3 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/classes.nib @@ -0,0 +1,67 @@ + + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + CLASS + NSApplication + LANGUAGE + ObjC + SUPERCLASS + NSResponder + + + ACTIONS + + installUpdate + id + remindMeLater + id + skipThisVersion + id + + CLASS + SUUpdateAlert + LANGUAGE + ObjC + OUTLETS + + delegate + id + description + NSTextField + releaseNotesView + WebView + + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/info.nib b/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/info.nib new file mode 100644 index 0000000..2fb8a83 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/info.nib @@ -0,0 +1,20 @@ + + + + + IBFramework Version + 670 + IBLastKnownRelativeProjectPath + ../Sparkle.xcodeproj + IBOldestOS + 5 + IBOpenObjects + + 18 + + IBSystem Version + 10A96 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/keyedobjects.nib new file mode 100644 index 0000000..e7e7497 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib/classes.nib new file mode 100644 index 0000000..5220a22 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib/classes.nib @@ -0,0 +1,59 @@ + + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + ACTIONS + + finishPrompt + id + toggleMoreInfo + id + + CLASS + SUUpdatePermissionPrompt + LANGUAGE + ObjC + OUTLETS + + delegate + id + descriptionTextField + NSTextField + moreInfoButton + NSButton + moreInfoView + NSView + + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib/info.nib b/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib/info.nib new file mode 100644 index 0000000..b1cd28e --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib/info.nib @@ -0,0 +1,21 @@ + + + + + IBFramework Version + 670 + IBLastKnownRelativeProjectPath + ../Sparkle.xcodeproj + IBOldestOS + 5 + IBOpenObjects + + 6 + 41 + + IBSystem Version + 10A96 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib new file mode 100644 index 0000000..e8dc5b8 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/en.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/en.lproj/Sparkle.strings new file mode 100644 index 0000000..16e0787 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/en.lproj/Sparkle.strings differ diff --git a/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/classes.nib new file mode 100644 index 0000000..4b1ab30 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/classes.nib @@ -0,0 +1,50 @@ + + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + ACTIONS + + doNotInstall + id + installLater + id + installNow + id + + CLASS + SUAutomaticUpdateAlert + LANGUAGE + ObjC + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/info.nib b/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/info.nib new file mode 100644 index 0000000..2e04cfa --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/info.nib @@ -0,0 +1,20 @@ + + + + + IBFramework Version + 667 + IBLastKnownRelativeProjectPath + ../Sparkle.xcodeproj + IBOldestOS + 5 + IBOpenObjects + + 6 + + IBSystem Version + 9D34 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib new file mode 100644 index 0000000..6b2f938 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/classes.nib new file mode 100644 index 0000000..994d4c3 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/classes.nib @@ -0,0 +1,67 @@ + + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + CLASS + NSApplication + LANGUAGE + ObjC + SUPERCLASS + NSResponder + + + ACTIONS + + installUpdate + id + remindMeLater + id + skipThisVersion + id + + CLASS + SUUpdateAlert + LANGUAGE + ObjC + OUTLETS + + delegate + id + description + NSTextField + releaseNotesView + WebView + + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/info.nib b/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/info.nib new file mode 100644 index 0000000..2e04cfa --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/info.nib @@ -0,0 +1,20 @@ + + + + + IBFramework Version + 667 + IBLastKnownRelativeProjectPath + ../Sparkle.xcodeproj + IBOldestOS + 5 + IBOpenObjects + + 6 + + IBSystem Version + 9D34 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/keyedobjects.nib new file mode 100644 index 0000000..c9b1e7d Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib/classes.nib new file mode 100644 index 0000000..5220a22 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib/classes.nib @@ -0,0 +1,59 @@ + + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + ACTIONS + + finishPrompt + id + toggleMoreInfo + id + + CLASS + SUUpdatePermissionPrompt + LANGUAGE + ObjC + OUTLETS + + delegate + id + descriptionTextField + NSTextField + moreInfoButton + NSButton + moreInfoView + NSView + + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib/info.nib b/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib/info.nib new file mode 100644 index 0000000..3eb7f81 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib/info.nib @@ -0,0 +1,20 @@ + + + + + IBFramework Version + 667 + IBLastKnownRelativeProjectPath + ../../Sparkle.xcodeproj + IBOldestOS + 5 + IBOpenObjects + + 6 + + IBSystem Version + 9D34 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib new file mode 100644 index 0000000..8c54c21 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/es.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/es.lproj/Sparkle.strings new file mode 100644 index 0000000..f83ea23 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/es.lproj/Sparkle.strings differ diff --git a/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/classes.nib new file mode 100644 index 0000000..4b1ab30 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/classes.nib @@ -0,0 +1,50 @@ + + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + ACTIONS + + doNotInstall + id + installLater + id + installNow + id + + CLASS + SUAutomaticUpdateAlert + LANGUAGE + ObjC + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/info.nib b/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/info.nib new file mode 100644 index 0000000..33a6020 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/info.nib @@ -0,0 +1,16 @@ + + + + + IBFramework Version + 629 + IBOldestOS + 5 + IBOpenObjects + + IBSystem Version + 9D34 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib new file mode 100644 index 0000000..4cd529a Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/classes.nib new file mode 100644 index 0000000..994d4c3 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/classes.nib @@ -0,0 +1,67 @@ + + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + CLASS + NSApplication + LANGUAGE + ObjC + SUPERCLASS + NSResponder + + + ACTIONS + + installUpdate + id + remindMeLater + id + skipThisVersion + id + + CLASS + SUUpdateAlert + LANGUAGE + ObjC + OUTLETS + + delegate + id + description + NSTextField + releaseNotesView + WebView + + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/info.nib b/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/info.nib new file mode 100644 index 0000000..d2586ea --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/info.nib @@ -0,0 +1,16 @@ + + + + + IBFramework Version + 629 + IBOldestOS + 5 + IBOpenObjects + + IBSystem Version + 9E17 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/keyedobjects.nib new file mode 100644 index 0000000..65dfc95 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/classes.nib new file mode 100644 index 0000000..5220a22 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/classes.nib @@ -0,0 +1,59 @@ + + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + ACTIONS + + finishPrompt + id + toggleMoreInfo + id + + CLASS + SUUpdatePermissionPrompt + LANGUAGE + ObjC + OUTLETS + + delegate + id + descriptionTextField + NSTextField + moreInfoButton + NSButton + moreInfoView + NSView + + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/info.nib b/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/info.nib new file mode 100644 index 0000000..d2586ea --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/info.nib @@ -0,0 +1,16 @@ + + + + + IBFramework Version + 629 + IBOldestOS + 5 + IBOpenObjects + + IBSystem Version + 9E17 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib new file mode 100644 index 0000000..4b7cc90 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/fr.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/fr.lproj/Sparkle.strings new file mode 100644 index 0000000..ea175ae Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/fr.lproj/Sparkle.strings differ diff --git a/Sparkle.framework/Versions/A/Resources/fr_CA.lproj b/Sparkle.framework/Versions/A/Resources/fr_CA.lproj new file mode 120000 index 0000000..61a7d4e --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/fr_CA.lproj @@ -0,0 +1 @@ +/Users/andym/Development/Build Products/Release (GC dual-mode; 10.5-only)/Sparkle.framework/Resources/fr.lproj \ No newline at end of file diff --git a/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/classes.nib new file mode 100644 index 0000000..4b1ab30 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/classes.nib @@ -0,0 +1,50 @@ + + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + ACTIONS + + doNotInstall + id + installLater + id + installNow + id + + CLASS + SUAutomaticUpdateAlert + LANGUAGE + ObjC + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/info.nib b/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/info.nib new file mode 100644 index 0000000..2e04cfa --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/info.nib @@ -0,0 +1,20 @@ + + + + + IBFramework Version + 667 + IBLastKnownRelativeProjectPath + ../Sparkle.xcodeproj + IBOldestOS + 5 + IBOpenObjects + + 6 + + IBSystem Version + 9D34 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib new file mode 100644 index 0000000..15ba8f4 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/classes.nib new file mode 100644 index 0000000..994d4c3 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/classes.nib @@ -0,0 +1,67 @@ + + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + CLASS + NSApplication + LANGUAGE + ObjC + SUPERCLASS + NSResponder + + + ACTIONS + + installUpdate + id + remindMeLater + id + skipThisVersion + id + + CLASS + SUUpdateAlert + LANGUAGE + ObjC + OUTLETS + + delegate + id + description + NSTextField + releaseNotesView + WebView + + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/info.nib b/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/info.nib new file mode 100644 index 0000000..2e04cfa --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/info.nib @@ -0,0 +1,20 @@ + + + + + IBFramework Version + 667 + IBLastKnownRelativeProjectPath + ../Sparkle.xcodeproj + IBOldestOS + 5 + IBOpenObjects + + 6 + + IBSystem Version + 9D34 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/keyedobjects.nib new file mode 100644 index 0000000..2984064 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib/classes.nib new file mode 100644 index 0000000..5220a22 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib/classes.nib @@ -0,0 +1,59 @@ + + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + ACTIONS + + finishPrompt + id + toggleMoreInfo + id + + CLASS + SUUpdatePermissionPrompt + LANGUAGE + ObjC + OUTLETS + + delegate + id + descriptionTextField + NSTextField + moreInfoButton + NSButton + moreInfoView + NSView + + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib/info.nib b/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib/info.nib new file mode 100644 index 0000000..c493485 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib/info.nib @@ -0,0 +1,20 @@ + + + + + IBFramework Version + 667 + IBLastKnownRelativeProjectPath + ../Sparkle.xcodeproj + IBOldestOS + 5 + IBOpenObjects + + 5 + + IBSystem Version + 9D34 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib new file mode 100644 index 0000000..55cc2c2 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/it.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/it.lproj/Sparkle.strings new file mode 100644 index 0000000..5c410d0 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/it.lproj/Sparkle.strings differ diff --git a/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/classes.nib new file mode 100644 index 0000000..4b1ab30 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/classes.nib @@ -0,0 +1,50 @@ + + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + ACTIONS + + doNotInstall + id + installLater + id + installNow + id + + CLASS + SUAutomaticUpdateAlert + LANGUAGE + ObjC + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/info.nib b/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/info.nib new file mode 100644 index 0000000..3f09790 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/info.nib @@ -0,0 +1,18 @@ + + + + + IBFramework Version + 629 + IBOldestOS + 5 + IBOpenObjects + + 6 + + IBSystem Version + 9D34 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib new file mode 100644 index 0000000..aa38f86 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/classes.nib new file mode 100644 index 0000000..994d4c3 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/classes.nib @@ -0,0 +1,67 @@ + + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + CLASS + NSApplication + LANGUAGE + ObjC + SUPERCLASS + NSResponder + + + ACTIONS + + installUpdate + id + remindMeLater + id + skipThisVersion + id + + CLASS + SUUpdateAlert + LANGUAGE + ObjC + OUTLETS + + delegate + id + description + NSTextField + releaseNotesView + WebView + + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/info.nib b/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/info.nib new file mode 100644 index 0000000..d2586ea --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/info.nib @@ -0,0 +1,16 @@ + + + + + IBFramework Version + 629 + IBOldestOS + 5 + IBOpenObjects + + IBSystem Version + 9E17 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/keyedobjects.nib new file mode 100644 index 0000000..c82d358 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/classes.nib new file mode 100644 index 0000000..5220a22 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/classes.nib @@ -0,0 +1,59 @@ + + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + ACTIONS + + finishPrompt + id + toggleMoreInfo + id + + CLASS + SUUpdatePermissionPrompt + LANGUAGE + ObjC + OUTLETS + + delegate + id + descriptionTextField + NSTextField + moreInfoButton + NSButton + moreInfoView + NSView + + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/info.nib b/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/info.nib new file mode 100644 index 0000000..d2586ea --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/info.nib @@ -0,0 +1,16 @@ + + + + + IBFramework Version + 629 + IBOldestOS + 5 + IBOpenObjects + + IBSystem Version + 9E17 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib new file mode 100644 index 0000000..ac298ce Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/nl.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/nl.lproj/Sparkle.strings new file mode 100644 index 0000000..67cf535 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/nl.lproj/Sparkle.strings differ diff --git a/Sparkle.framework/Versions/A/Resources/relaunch b/Sparkle.framework/Versions/A/Resources/relaunch new file mode 100755 index 0000000..e7b96d6 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/relaunch differ diff --git a/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/classes.nib new file mode 100644 index 0000000..4b1ab30 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/classes.nib @@ -0,0 +1,50 @@ + + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + ACTIONS + + doNotInstall + id + installLater + id + installNow + id + + CLASS + SUAutomaticUpdateAlert + LANGUAGE + ObjC + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/info.nib b/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/info.nib new file mode 100644 index 0000000..2b3d425 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/info.nib @@ -0,0 +1,20 @@ + + + + + IBFramework Version + 670 + IBLastKnownRelativeProjectPath + ../Sparkle.xcodeproj + IBOldestOS + 5 + IBOpenObjects + + 6 + + IBSystem Version + 9E17 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib new file mode 100644 index 0000000..1d4655c Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/classes.nib new file mode 100644 index 0000000..994d4c3 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/classes.nib @@ -0,0 +1,67 @@ + + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + CLASS + NSApplication + LANGUAGE + ObjC + SUPERCLASS + NSResponder + + + ACTIONS + + installUpdate + id + remindMeLater + id + skipThisVersion + id + + CLASS + SUUpdateAlert + LANGUAGE + ObjC + OUTLETS + + delegate + id + description + NSTextField + releaseNotesView + WebView + + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/info.nib b/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/info.nib new file mode 100644 index 0000000..2b3d425 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/info.nib @@ -0,0 +1,20 @@ + + + + + IBFramework Version + 670 + IBLastKnownRelativeProjectPath + ../Sparkle.xcodeproj + IBOldestOS + 5 + IBOpenObjects + + 6 + + IBSystem Version + 9E17 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/keyedobjects.nib new file mode 100644 index 0000000..103b1cf Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/classes.nib new file mode 100644 index 0000000..0f776c8 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/classes.nib @@ -0,0 +1,59 @@ + + + + + IBClasses + + + CLASS + NSObject + LANGUAGE + ObjC + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + ACTIONS + + finishPrompt + id + toggleMoreInfo + id + + CLASS + SUUpdatePermissionPrompt + LANGUAGE + ObjC + OUTLETS + + delegate + id + descriptionTextField + NSTextField + moreInfoButton + NSButton + moreInfoView + NSView + + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/info.nib b/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/info.nib new file mode 100644 index 0000000..5132e29 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/info.nib @@ -0,0 +1,18 @@ + + + + + IBFramework Version + 670 + IBLastKnownRelativeProjectPath + ../Sparkle.xcodeproj + IBOldestOS + 5 + IBOpenObjects + + IBSystem Version + 9E17 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib new file mode 100644 index 0000000..c09d9e7 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/ru.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/ru.lproj/Sparkle.strings new file mode 100644 index 0000000..f3ff9d8 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/ru.lproj/Sparkle.strings differ diff --git a/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/classes.nib new file mode 100644 index 0000000..4b1ab30 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/classes.nib @@ -0,0 +1,50 @@ + + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + ACTIONS + + doNotInstall + id + installLater + id + installNow + id + + CLASS + SUAutomaticUpdateAlert + LANGUAGE + ObjC + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/info.nib b/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/info.nib new file mode 100644 index 0000000..c5a067e --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/info.nib @@ -0,0 +1,20 @@ + + + + + IBFramework Version + 670 + IBLastKnownRelativeProjectPath + ../Sparkle.xcodeproj + IBOldestOS + 5 + IBOpenObjects + + 6 + + IBSystem Version + 10A96 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib new file mode 100644 index 0000000..53cb91a Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/classes.nib new file mode 100644 index 0000000..018710a --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/classes.nib @@ -0,0 +1,39 @@ +{ + IBClasses = ( + { + CLASS = FirstResponder; + LANGUAGE = ObjC; + SUPERCLASS = NSObject; + }, + { + CLASS = NSApplication; + LANGUAGE = ObjC; + SUPERCLASS = NSResponder; + }, + { + CLASS = NSObject; + LANGUAGE = ObjC; + }, + { + ACTIONS = { + installUpdate = id; + remindMeLater = id; + skipThisVersion = id; + }; + CLASS = SUUpdateAlert; + LANGUAGE = ObjC; + OUTLETS = { + delegate = id; + description = NSTextField; + releaseNotesView = WebView; + }; + SUPERCLASS = SUWindowController; + }, + { + CLASS = SUWindowController; + LANGUAGE = ObjC; + SUPERCLASS = NSWindowController; + } + ); + IBVersion = 1; +} \ No newline at end of file diff --git a/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/info.nib b/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/info.nib new file mode 100644 index 0000000..6b787d4 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/info.nib @@ -0,0 +1,18 @@ + + + + + IBDocumentLocation + 69 14 356 240 0 0 1280 778 + IBFramework Version + 489.0 + IBLastKnownRelativeProjectPath + ../Sparkle.xcodeproj + IBOldestOS + 5 + IBSystem Version + 9D34 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/keyedobjects.nib new file mode 100644 index 0000000..7e6d490 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/classes.nib new file mode 100644 index 0000000..5220a22 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/classes.nib @@ -0,0 +1,59 @@ + + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + ACTIONS + + finishPrompt + id + toggleMoreInfo + id + + CLASS + SUUpdatePermissionPrompt + LANGUAGE + ObjC + OUTLETS + + delegate + id + descriptionTextField + NSTextField + moreInfoButton + NSButton + moreInfoView + NSView + + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/info.nib b/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/info.nib new file mode 100644 index 0000000..c5a067e --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/info.nib @@ -0,0 +1,20 @@ + + + + + IBFramework Version + 670 + IBLastKnownRelativeProjectPath + ../Sparkle.xcodeproj + IBOldestOS + 5 + IBOpenObjects + + 6 + + IBSystem Version + 10A96 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib new file mode 100644 index 0000000..64babac Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/sv.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/sv.lproj/Sparkle.strings new file mode 100644 index 0000000..b676a4f Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/sv.lproj/Sparkle.strings differ diff --git a/Sparkle.framework/Versions/A/Sparkle b/Sparkle.framework/Versions/A/Sparkle new file mode 100755 index 0000000..2d9bb2a Binary files /dev/null and b/Sparkle.framework/Versions/A/Sparkle differ diff --git a/Sparkle.framework/Versions/Current b/Sparkle.framework/Versions/Current new file mode 120000 index 0000000..8c7e5a6 --- /dev/null +++ b/Sparkle.framework/Versions/Current @@ -0,0 +1 @@ +A \ No newline at end of file diff --git a/TwentyTwo.xcodeproj/project.pbxproj b/TwentyTwo.xcodeproj/project.pbxproj new file mode 100644 index 0000000..edc47ec --- /dev/null +++ b/TwentyTwo.xcodeproj/project.pbxproj @@ -0,0 +1,433 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 26115150168B3A0E00F1566F /* LoginWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2611514F168B3A0E00F1566F /* LoginWindow.xib */; }; + 2618AE0116803F1900EC2E15 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2618AE0016803F1900EC2E15 /* Carbon.framework */; }; + 2618AE0816806FC500EC2E15 /* twentytwo.iconset in Resources */ = {isa = PBXBuildFile; fileRef = 2618AE0716806FC500EC2E15 /* twentytwo.iconset */; }; + 2624EBA416A81FA100490144 /* UrlPromptController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2624EBA316A81FA100490144 /* UrlPromptController.m */; }; + 2624EBA716A821B100490144 /* UrlPrompt.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2624EBA616A821B100490144 /* UrlPrompt.xib */; }; + 2624EBAC16A82EF100490144 /* AppConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 2624EBAB16A82EF100490144 /* AppConstants.m */; }; + 263C2BA11677152500EF4792 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 263C2BA01677152500EF4792 /* Cocoa.framework */; }; + 2666D13717E3104A0071A8BA /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2666D13617E3104A0071A8BA /* Sparkle.framework */; }; + 2666D13917E310A20071A8BA /* Sparkle.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 2666D13617E3104A0071A8BA /* Sparkle.framework */; }; + 26A0087116771DA5006FD03A /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 26A0087016771DA5006FD03A /* WebKit.framework */; }; + 26B5794C167A58CD0034D295 /* NSObject+SPInvocationGrabbing.m in Sources */ = {isa = PBXBuildFile; fileRef = 26B5793A167A58CD0034D295 /* NSObject+SPInvocationGrabbing.m */; }; + 26B5794D167A58CD0034D295 /* SPMediaKeyTap.m in Sources */ = {isa = PBXBuildFile; fileRef = 26B5793C167A58CD0034D295 /* SPMediaKeyTap.m */; }; + 26FF310C1680734B0091448C /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 26FF31001680734B0091448C /* AppDelegate.m */; }; + 26FF310D1680734B0091448C /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 26FF31011680734B0091448C /* Credits.rtf */; }; + 26FF310E1680734B0091448C /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 26FF31031680734B0091448C /* InfoPlist.strings */; }; + 26FF310F1680734B0091448C /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 26FF31051680734B0091448C /* MainMenu.xib */; }; + 26FF31101680734B0091448C /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 26FF31071680734B0091448C /* main.m */; }; + 26FF31111680734B0091448C /* PopupController.m in Sources */ = {isa = PBXBuildFile; fileRef = 26FF31091680734B0091448C /* PopupController.m */; }; + 3A295065175FDF560038B28C /* TTApplication.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A295064175FDF560038B28C /* TTApplication.m */; }; + 3A6AE3A317613C9900D67ADC /* DHSwipeClipView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A6AE39E17613C9900D67ADC /* DHSwipeClipView.m */; }; + 3A6AE3A417613C9900D67ADC /* DHSwipeIndicator.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A6AE3A017613C9900D67ADC /* DHSwipeIndicator.m */; }; + 3A6AE3A517613C9900D67ADC /* DHSwipeWebView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A6AE3A217613C9900D67ADC /* DHSwipeWebView.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 2666D13817E3107A0071A8BA /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 2666D13917E310A20071A8BA /* Sparkle.framework in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 2611514F168B3A0E00F1566F /* LoginWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = LoginWindow.xib; sourceTree = ""; }; + 2618AE0016803F1900EC2E15 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; + 2618AE0716806FC500EC2E15 /* twentytwo.iconset */ = {isa = PBXFileReference; lastKnownFileType = folder.iconset; path = twentytwo.iconset; sourceTree = ""; }; + 2624EBA216A81FA100490144 /* UrlPromptController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UrlPromptController.h; sourceTree = ""; }; + 2624EBA316A81FA100490144 /* UrlPromptController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UrlPromptController.m; sourceTree = ""; }; + 2624EBA616A821B100490144 /* UrlPrompt.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = UrlPrompt.xib; sourceTree = ""; }; + 2624EBA816A82B2400490144 /* AppConstants.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppConstants.h; sourceTree = ""; }; + 2624EBAB16A82EF100490144 /* AppConstants.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppConstants.m; sourceTree = ""; }; + 263C2B9C1677152500EF4792 /* TwentyTwo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TwentyTwo.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 263C2BA01677152500EF4792 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; + 263C2BA31677152500EF4792 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; + 263C2BA41677152500EF4792 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; + 263C2BA51677152500EF4792 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 2666D13617E3104A0071A8BA /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Sparkle.framework; sourceTree = ""; }; + 26A0087016771DA5006FD03A /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; + 26B57939167A58CD0034D295 /* NSObject+SPInvocationGrabbing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+SPInvocationGrabbing.h"; sourceTree = ""; }; + 26B5793A167A58CD0034D295 /* NSObject+SPInvocationGrabbing.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+SPInvocationGrabbing.m"; sourceTree = ""; }; + 26B5793B167A58CD0034D295 /* SPMediaKeyTap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPMediaKeyTap.h; sourceTree = ""; }; + 26B5793C167A58CD0034D295 /* SPMediaKeyTap.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPMediaKeyTap.m; sourceTree = ""; }; + 26FF30FF1680734B0091448C /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 26FF31001680734B0091448C /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 26FF31021680734B0091448C /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = ""; }; + 26FF31041680734B0091448C /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 26FF31061680734B0091448C /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = ""; }; + 26FF31071680734B0091448C /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 26FF31081680734B0091448C /* PopupController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PopupController.h; sourceTree = ""; }; + 26FF31091680734B0091448C /* PopupController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PopupController.m; sourceTree = ""; }; + 26FF310A1680734B0091448C /* TwentyTwo-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "TwentyTwo-Info.plist"; sourceTree = ""; }; + 26FF310B1680734B0091448C /* TwentyTwo-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "TwentyTwo-Prefix.pch"; sourceTree = ""; }; + 3A295063175FDF560038B28C /* TTApplication.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TTApplication.h; sourceTree = ""; }; + 3A295064175FDF560038B28C /* TTApplication.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TTApplication.m; sourceTree = ""; }; + 3A6AE39D17613C9900D67ADC /* DHSwipeClipView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHSwipeClipView.h; sourceTree = ""; }; + 3A6AE39E17613C9900D67ADC /* DHSwipeClipView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHSwipeClipView.m; sourceTree = ""; }; + 3A6AE39F17613C9900D67ADC /* DHSwipeIndicator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHSwipeIndicator.h; sourceTree = ""; }; + 3A6AE3A017613C9900D67ADC /* DHSwipeIndicator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHSwipeIndicator.m; sourceTree = ""; }; + 3A6AE3A117613C9900D67ADC /* DHSwipeWebView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHSwipeWebView.h; sourceTree = ""; }; + 3A6AE3A217613C9900D67ADC /* DHSwipeWebView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHSwipeWebView.m; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 263C2B991677152500EF4792 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 2618AE0116803F1900EC2E15 /* Carbon.framework in Frameworks */, + 26A0087116771DA5006FD03A /* WebKit.framework in Frameworks */, + 263C2BA11677152500EF4792 /* Cocoa.framework in Frameworks */, + 2666D13717E3104A0071A8BA /* Sparkle.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 263C2B911677152500EF4792 = { + isa = PBXGroup; + children = ( + 26FF30FE1680734B0091448C /* TwentyTwo */, + 2618AE0716806FC500EC2E15 /* twentytwo.iconset */, + 3A6AE39C17613C9900D67ADC /* DHSwipeWebView */, + 26B57925167A58CD0034D295 /* SPMediaKeyTap */, + 263C2B9F1677152500EF4792 /* Frameworks */, + 263C2B9D1677152500EF4792 /* Products */, + ); + sourceTree = ""; + }; + 263C2B9D1677152500EF4792 /* Products */ = { + isa = PBXGroup; + children = ( + 263C2B9C1677152500EF4792 /* TwentyTwo.app */, + ); + name = Products; + sourceTree = ""; + }; + 263C2B9F1677152500EF4792 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 2666D13617E3104A0071A8BA /* Sparkle.framework */, + 2618AE0016803F1900EC2E15 /* Carbon.framework */, + 263C2BA01677152500EF4792 /* Cocoa.framework */, + 263C2BA21677152500EF4792 /* Other Frameworks */, + 26A0087016771DA5006FD03A /* WebKit.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 263C2BA21677152500EF4792 /* Other Frameworks */ = { + isa = PBXGroup; + children = ( + 263C2BA31677152500EF4792 /* AppKit.framework */, + 263C2BA41677152500EF4792 /* CoreData.framework */, + 263C2BA51677152500EF4792 /* Foundation.framework */, + ); + name = "Other Frameworks"; + sourceTree = ""; + }; + 26B57925167A58CD0034D295 /* SPMediaKeyTap */ = { + isa = PBXGroup; + children = ( + 26B57935167A58CD0034D295 /* SPInvocationGrabbing */, + 26B5793B167A58CD0034D295 /* SPMediaKeyTap.h */, + 26B5793C167A58CD0034D295 /* SPMediaKeyTap.m */, + ); + path = SPMediaKeyTap; + sourceTree = ""; + }; + 26B57935167A58CD0034D295 /* SPInvocationGrabbing */ = { + isa = PBXGroup; + children = ( + 26B57939167A58CD0034D295 /* NSObject+SPInvocationGrabbing.h */, + 26B5793A167A58CD0034D295 /* NSObject+SPInvocationGrabbing.m */, + ); + path = SPInvocationGrabbing; + sourceTree = ""; + }; + 26FF30FE1680734B0091448C /* TwentyTwo */ = { + isa = PBXGroup; + children = ( + 2624EBA816A82B2400490144 /* AppConstants.h */, + 2624EBAB16A82EF100490144 /* AppConstants.m */, + 26FF30FF1680734B0091448C /* AppDelegate.h */, + 26FF31001680734B0091448C /* AppDelegate.m */, + 26FF31071680734B0091448C /* main.m */, + 26FF31081680734B0091448C /* PopupController.h */, + 26FF31091680734B0091448C /* PopupController.m */, + 26FF311C168075A50091448C /* Resources */, + 3A295063175FDF560038B28C /* TTApplication.h */, + 3A295064175FDF560038B28C /* TTApplication.m */, + 26FF310B1680734B0091448C /* TwentyTwo-Prefix.pch */, + 2624EBA216A81FA100490144 /* UrlPromptController.h */, + 2624EBA316A81FA100490144 /* UrlPromptController.m */, + ); + path = TwentyTwo; + sourceTree = ""; + }; + 26FF311C168075A50091448C /* Resources */ = { + isa = PBXGroup; + children = ( + 26FF31011680734B0091448C /* Credits.rtf */, + 26FF31031680734B0091448C /* InfoPlist.strings */, + 26FF31051680734B0091448C /* MainMenu.xib */, + 26FF310A1680734B0091448C /* TwentyTwo-Info.plist */, + 2611514F168B3A0E00F1566F /* LoginWindow.xib */, + 2624EBA616A821B100490144 /* UrlPrompt.xib */, + ); + name = Resources; + sourceTree = ""; + }; + 3A6AE39C17613C9900D67ADC /* DHSwipeWebView */ = { + isa = PBXGroup; + children = ( + 3A6AE39D17613C9900D67ADC /* DHSwipeClipView.h */, + 3A6AE39E17613C9900D67ADC /* DHSwipeClipView.m */, + 3A6AE39F17613C9900D67ADC /* DHSwipeIndicator.h */, + 3A6AE3A017613C9900D67ADC /* DHSwipeIndicator.m */, + 3A6AE3A117613C9900D67ADC /* DHSwipeWebView.h */, + 3A6AE3A217613C9900D67ADC /* DHSwipeWebView.m */, + ); + path = DHSwipeWebView; + sourceTree = SOURCE_ROOT; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 263C2B9B1677152500EF4792 /* TwentyTwo */ = { + isa = PBXNativeTarget; + buildConfigurationList = 263C2BBA1677152500EF4792 /* Build configuration list for PBXNativeTarget "TwentyTwo" */; + buildPhases = ( + 263C2B981677152500EF4792 /* Sources */, + 263C2B991677152500EF4792 /* Frameworks */, + 263C2B9A1677152500EF4792 /* Resources */, + 2666D13817E3107A0071A8BA /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = TwentyTwo; + productName = TwentyTwo; + productReference = 263C2B9C1677152500EF4792 /* TwentyTwo.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 263C2B931677152500EF4792 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0500; + ORGANIZATIONNAME = "Marc Weistroff"; + }; + buildConfigurationList = 263C2B961677152500EF4792 /* Build configuration list for PBXProject "TwentyTwo" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + English, + ); + mainGroup = 263C2B911677152500EF4792; + productRefGroup = 263C2B9D1677152500EF4792 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 263C2B9B1677152500EF4792 /* TwentyTwo */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 263C2B9A1677152500EF4792 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2618AE0816806FC500EC2E15 /* twentytwo.iconset in Resources */, + 26FF310D1680734B0091448C /* Credits.rtf in Resources */, + 26FF310E1680734B0091448C /* InfoPlist.strings in Resources */, + 26FF310F1680734B0091448C /* MainMenu.xib in Resources */, + 26115150168B3A0E00F1566F /* LoginWindow.xib in Resources */, + 2624EBA716A821B100490144 /* UrlPrompt.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 263C2B981677152500EF4792 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 26B5794C167A58CD0034D295 /* NSObject+SPInvocationGrabbing.m in Sources */, + 26B5794D167A58CD0034D295 /* SPMediaKeyTap.m in Sources */, + 26FF310C1680734B0091448C /* AppDelegate.m in Sources */, + 26FF31101680734B0091448C /* main.m in Sources */, + 26FF31111680734B0091448C /* PopupController.m in Sources */, + 2624EBA416A81FA100490144 /* UrlPromptController.m in Sources */, + 2624EBAC16A82EF100490144 /* AppConstants.m in Sources */, + 3A295065175FDF560038B28C /* TTApplication.m in Sources */, + 3A6AE3A317613C9900D67ADC /* DHSwipeClipView.m in Sources */, + 3A6AE3A417613C9900D67ADC /* DHSwipeIndicator.m in Sources */, + 3A6AE3A517613C9900D67ADC /* DHSwipeWebView.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 26FF31011680734B0091448C /* Credits.rtf */ = { + isa = PBXVariantGroup; + children = ( + 26FF31021680734B0091448C /* en */, + ); + name = Credits.rtf; + sourceTree = ""; + }; + 26FF31031680734B0091448C /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 26FF31041680734B0091448C /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 26FF31051680734B0091448C /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 26FF31061680734B0091448C /* en */, + ); + name = MainMenu.xib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 263C2BB81677152500EF4792 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.7; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + 263C2BB91677152500EF4792 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.7; + SDKROOT = macosx; + }; + name = Release; + }; + 263C2BBB1677152500EF4792 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)\"", + ); + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "TwentyTwo/TwentyTwo-Prefix.pch"; + INFOPLIST_FILE = "TwentyTwo/TwentyTwo-Info.plist"; + MACOSX_DEPLOYMENT_TARGET = 10.7; + PRODUCT_NAME = TwentyTwo; + SDKROOT = macosx; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + 263C2BBC1677152500EF4792 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)\"", + ); + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "TwentyTwo/TwentyTwo-Prefix.pch"; + INFOPLIST_FILE = "TwentyTwo/TwentyTwo-Info.plist"; + MACOSX_DEPLOYMENT_TARGET = 10.7; + PRODUCT_NAME = TwentyTwo; + SDKROOT = macosx; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 263C2B961677152500EF4792 /* Build configuration list for PBXProject "TwentyTwo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 263C2BB81677152500EF4792 /* Debug */, + 263C2BB91677152500EF4792 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 263C2BBA1677152500EF4792 /* Build configuration list for PBXNativeTarget "TwentyTwo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 263C2BBB1677152500EF4792 /* Debug */, + 263C2BBC1677152500EF4792 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 263C2B931677152500EF4792 /* Project object */; +} diff --git a/TwentyTwo.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/TwentyTwo.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..93de072 --- /dev/null +++ b/TwentyTwo.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/TwentyTwo/AppConstants.c b/TwentyTwo/AppConstants.c new file mode 100644 index 0000000..3db03fb --- /dev/null +++ b/TwentyTwo/AppConstants.c @@ -0,0 +1,10 @@ +// +// AppConstants.c +// TwentyTwo +// +// Created by Márton Salomváry on 2013/01/17. +// Copyright (c) 2013 Márton Salomváry. All rights reserved. +// Copyright (c) 2013 Marc Weistroff. All rights reserved. +// + +NSString *const TTHost = @"22tracks.com"; diff --git a/TwentyTwo/AppConstants.h b/TwentyTwo/AppConstants.h new file mode 100644 index 0000000..921fe97 --- /dev/null +++ b/TwentyTwo/AppConstants.h @@ -0,0 +1,13 @@ +// +// AppConstants.h +// TwentyTwo +// +// Created by Márton Salomváry on 2013/01/17. +// Copyright (c) 2013 Márton Salomváry. All rights reserved. +// Copyright (c) 2013 Marc Weistroff. All rights reserved. +// + +#import + +extern NSString *const TTHost; +extern NSString *const TTApplicationDidPressSpaceBarKey; \ No newline at end of file diff --git a/TwentyTwo/AppConstants.m b/TwentyTwo/AppConstants.m new file mode 100644 index 0000000..c35728b --- /dev/null +++ b/TwentyTwo/AppConstants.m @@ -0,0 +1,13 @@ +// +// AppConstants.m +// TwentyTwo +// +// Created by Márton Salomváry on 2013/01/17. +// Copyright (c) 2013 Márton Salomváry. All rights reserved. +// Copyright (c) 2013 Marc Weistroff. All rights reserved. +// + +#import "AppConstants.h" + +NSString *const TTHost = @"22tracks.com"; +NSString *const TTApplicationDidPressSpaceBarKey = @"TTApplicationDidPressSpaceBarKey"; \ No newline at end of file diff --git a/TwentyTwo/AppDelegate.h b/TwentyTwo/AppDelegate.h new file mode 100644 index 0000000..45484ff --- /dev/null +++ b/TwentyTwo/AppDelegate.h @@ -0,0 +1,45 @@ +// +// AppDelegate.h +// TwentyTwo +// +// Created by Márton Salomváry on 2012/12/11. +// Copyright (c) 2012 Márton Salomváry. All rights reserved. +// Copyright (c) 2013 Marc Weistroff. All rights reserved. +// + +#import +#import +#import "PopupController.h" +#import "UrlPromptController.h" +#import "../SPMediaKeyTap/SPMediaKeyTap.h" +#import "../DHSwipeWebView/DHSwipeWebView.h" +#import "AppDelegate.h" + +extern NSURL *baseUrl; + +@interface AppDelegate : NSObject { + SPMediaKeyTap *keyTap; +} + +@property (assign) IBOutlet NSWindow *window; +@property (weak) IBOutlet DHSwipeWebView *webView; +@property (weak) IBOutlet PopupController *popupController; +@property (weak) IBOutlet UrlPromptController *urlPromptController; + +- (WebView *)webView:(WebView *)sender createWebViewWithRequest:(NSURLRequest *)request; +- (void)webView:(WebView *)sender decidePolicyForNavigationAction:(NSDictionary *)actionInformation + request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id)listener; +- (void)webView:(WebView *)webView decidePolicyForNewWindowAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request newFrameName:(NSString *)frameName decisionListener:(id < WebPolicyDecisionListener >)listener; + +- (void)receiveSleepNotification:(NSNotification*)note; + +- (void)next; +- (void)prev; +- (void)playPause; +- (BOOL)isPlaying; + +- (void)navigate:(NSString*)permalink; +- (IBAction)showHelp:(id)sender; ++ (BOOL)isTTURL:(NSURL *)url; + +@end diff --git a/TwentyTwo/AppDelegate.m b/TwentyTwo/AppDelegate.m new file mode 100644 index 0000000..c19f399 --- /dev/null +++ b/TwentyTwo/AppDelegate.m @@ -0,0 +1,333 @@ +// +// AppDelegate.m +// TwentyTwo +// +// Created by Márton Salomváry on 2012/12/11. +// Copyright (c) 2012 Márton Salomváry. All rights reserved. +// Copyright (c) 2013 Marc Weistroff. All rights reserved. +// + +#import "AppConstants.h" +#import "AppDelegate.h" + +NSString *const TTNavigate = @"documentation.location = '%@'"; +NSString *const TTPlayFirst = @"document.location = $('tbody.track-nav tr:first-child td.artist a').attr('href')"; +NSString *const TTPlayPause = @"$('.playpause').click()"; +NSString *const TTNext = @"$('.next').click()"; +NSString *const TTPrev = @"$('.prev').click()"; +NSString *const TTIsPlaying = @"$('.playpause.play')"; + +NSURL *baseUrl = nil; + + +@interface WebPreferences (WebPreferencesPrivate) +- (void)_setLocalStorageDatabasePath:(NSString *)path; +- (void) setLocalStorageEnabled: (BOOL) localStorageEnabled; +@end + +@implementation AppDelegate + +@synthesize webView; +@synthesize popupController; +@synthesize window; +@synthesize urlPromptController; + +id contentView; +id tmpHostWindow; + ++ (void)initialize; +{ + if([self class] != [AppDelegate class]) return; + + // Register defaults for the whitelist of apps that want to use media keys + [[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary dictionaryWithObjectsAndKeys: + [SPMediaKeyTap defaultMediaKeyUserBundleIdentifiers], kMediaKeyUsingBundleIdentifiersDefaultsKey, + nil]]; +} + +- (void)applicationDidFinishLaunching:(NSNotification *)aNotification +{ + [window setFrameAutosaveName:@"TwentyTwo"]; + + keyTap = [[SPMediaKeyTap alloc] initWithDelegate:self]; + if([SPMediaKeyTap usesGlobalMediaKeyTap]) + [keyTap startWatchingMediaKeys]; + else + NSLog(@"Media key monitoring disabled"); + + baseUrl = [NSURL URLWithString:[[NSUserDefaults standardUserDefaults] stringForKey:@"BaseUrl"]]; + if (baseUrl == nil) { + baseUrl = [NSURL URLWithString: [@"http://" stringByAppendingString:TTHost]]; + } + + [[webView mainFrame] loadRequest: [NSURLRequest requestWithURL:baseUrl]]; + + WebPreferences* prefs = [WebPreferences standardPreferences]; + + [prefs setCacheModel:WebCacheModelPrimaryWebBrowser]; + [prefs setPlugInsEnabled:TRUE]; // Flash is required for playing sounds in certain cases + + [prefs _setLocalStorageDatabasePath:@"~/Library/Application Support/TwentyTwo"]; + [prefs setLocalStorageEnabled:YES]; + + [webView setPreferences:prefs]; + + [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver: self + selector: @selector(receiveSleepNotification:) + name: NSWorkspaceWillSleepNotification object: NULL]; + + [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver: self + selector: @selector(didPressSpaceBarKey:) + name: TTApplicationDidPressSpaceBarKey object: NULL]; + + [window setCollectionBehavior:NSWindowCollectionBehaviorFullScreenPrimary]; + [webView stringByEvaluatingJavaScriptFromString:TTPlayFirst]; +} + + +- (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication hasVisibleWindows:(BOOL)flag +{ + if (flag == NO) + { + [window makeKeyAndOrderFront:self]; + } + + return YES; +} + + +- (void)awakeFromNib +{ + [window setDelegate:self]; + [webView setUIDelegate:self]; + [webView setFrameLoadDelegate:self]; + [webView setPolicyDelegate:self]; + + [urlPromptController setNavigateDelegate:self]; + + // stored for adding back later, see windowWillClose + contentView = [window contentView]; +} + +- (void)windowDidBecomeKey:(NSNotification *)notification +{ + // restore "hidden" webview, see windowShouldClose + // (would be better to do it in applicationShouldHandleReopen + // but that seems to be too early (has no effect) + if ([window contentView] != contentView) { + [window setContentView:contentView]; + [webView setHostWindow:nil]; + tmpHostWindow = nil; + } +} + +- (BOOL)windowShouldClose:(NSNotification *)notification +{ + // set temporary hostWindow on WebView and remove it from + // the closed window to prevent stopping flash plugin + // (windowWillClose would be better but that doesn't always work) + // http://stackoverflow.com/questions/5307423/plugin-objects-in-webview-getting-destroyed + // https://developer.apple.com/library/mac/documentation/Cocoa/Reference/WebKit/Classes/WebView_Class/Reference/Reference.html#//apple_ref/occ/instm/WebView/setHostWindow%3a + tmpHostWindow = [[NSWindow alloc] init]; + [webView setHostWindow:tmpHostWindow]; + [window setContentView:nil]; + [contentView removeFromSuperview]; + + return TRUE; +} + +- (WebView *)webView:(WebView *)sender createWebViewWithRequest:(NSURLRequest *)request +{ + // request will always be null (probably a bug) + return [popupController show]; +} + +- (void)webView:(WebView *)sender didReceiveTitle:(NSString *)title forFrame:(WebFrame *)frame +{ + if (frame == [webView mainFrame]) { + [window setTitle:title]; + if ([self isPlaying]) { + title = [title stringByReplacingOccurrencesOfString:@"▶ " withString:@""]; + NSArray *info = [title componentsSeparatedByString:@" by "]; + if (info.count == 1) { + // current track is part of a set + info = [title componentsSeparatedByString:@" in "]; + } + NSUserNotification *notification = [[NSUserNotification alloc] init]; + notification.title = info[0]; // track + notification.informativeText = info[1]; // artist + [[NSUserNotificationCenter defaultUserNotificationCenter] deliverNotification:notification]; + } + } +} + +- (void)webView:(WebView *)sender decidePolicyForNavigationAction:(NSDictionary *)actionInformation + request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id)listener +{ + // normal in-frame navigation + if(frame != [webView mainFrame] || [AppDelegate isTTURL:[request URL]]) { + // allow loading urls in sub-frames OR when they are sc urls + [listener use]; + } else { + [listener ignore]; + // open external links in external browser + [[NSWorkspace sharedWorkspace] openURL:[actionInformation objectForKey:WebActionOriginalURLKey]]; + } +} + +- (void)webView:(WebView *)sender decidePolicyForNewWindowAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request newFrameName:(NSString *)frameName decisionListener:(id < WebPolicyDecisionListener >)listener +{ + // target=_blank or anything scenario + [listener ignore]; + if([AppDelegate isTTURL:[request URL]]) { + // open local links in the main frame + // TODO: maybe maintain a frame stack instead? + [[webView mainFrame] loadRequest: [NSURLRequest requestWithURL: + [actionInformation objectForKey:WebActionOriginalURLKey]]]; + } else { + // open external links in external browser + [[NSWorkspace sharedWorkspace] openURL:[actionInformation objectForKey:WebActionOriginalURLKey]]; + } + +} + +// based on http://stackoverflow.com/questions/5177640 +- (void)webView:(WebView *)sender runOpenPanelForFileButtonWithResultListener:(id < WebOpenPanelResultListener >)resultListener allowMultipleFiles:(BOOL)allowMultipleFiles +{ + // Create the File Open Dialog class. + NSOpenPanel* openDlg = [NSOpenPanel openPanel]; + + // Enable the selection of files in the dialog. + [openDlg setCanChooseFiles:YES]; + + // Enable the selection of directories in the dialog. + [openDlg setCanChooseDirectories:NO]; + + // Allow multiple files + [openDlg setAllowsMultipleSelection:allowMultipleFiles]; + + // Display the dialog. If the OK button was pressed, + // process the files. + if ( [openDlg runModal] == NSOKButton ) + { + NSArray *urls = [openDlg URLs]; + NSArray *filenames = [urls valueForKey:@"path"]; + // Do something with the filenames. + [resultListener chooseFilenames:filenames]; + } +} + +// stolen from MacGap +- (BOOL)webView:(WebView *)sender runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame +{ + NSAlert *alert = [[NSAlert alloc] init]; + [alert addButtonWithTitle:@"Yes"]; + [alert addButtonWithTitle:@"No"]; + [alert setMessageText:message]; + [alert setAlertStyle:NSWarningAlertStyle]; + + if ([alert runModal] == NSAlertFirstButtonReturn) + return YES; + else + return NO; +} + +- (void)receiveSleepNotification:(NSNotification*)note +{ + if([self isPlaying]) { + [self playPause]; + } +} + +- (void)mediaKeyTap:(SPMediaKeyTap*)keyTap receivedMediaKeyEvent:(NSEvent*)event; +{ + NSAssert([event type] == NSSystemDefined && [event subtype] == SPSystemDefinedEventMediaKeys, @"Unexpected NSEvent in mediaKeyTap:receivedMediaKeyEvent:"); + // here be dragons... + int keyCode = (([event data1] & 0xFFFF0000) >> 16); + int keyFlags = ([event data1] & 0x0000FFFF); + BOOL keyIsPressed = (((keyFlags & 0xFF00) >> 8)) == 0xA; + //int keyRepeat = (keyFlags & 0x1); + + if (keyIsPressed) { + switch (keyCode) { + case NX_KEYTYPE_PLAY: + [self playPause]; + break; + + case NX_KEYTYPE_FAST: + [self next]; + break; + + case NX_KEYTYPE_REWIND: + [self prev]; + break; + default: + NSLog(@"Key %d pressed", keyCode); + break; + } + } +} + + +- (IBAction)showHelp:(id)sender +{ +} + +- (IBAction)restoreWindow:(id)sender +{ + [window makeKeyAndOrderFront:self]; +} + +- (IBAction)reload:(id)sender +{ + [webView reload:self]; +} + +- (void)next +{ + [webView stringByEvaluatingJavaScriptFromString:TTNext]; +} + +- (void)prev +{ + [webView stringByEvaluatingJavaScriptFromString:TTPrev]; +} + +- (void)playPause +{ + [webView stringByEvaluatingJavaScriptFromString:TTPlayPause]; +} + +- (BOOL)isPlaying +{ + return [[webView stringByEvaluatingJavaScriptFromString:TTIsPlaying] isEqual: @""]; +} + +- (void)navigate:(NSString*)permalink +{ + NSString *js = [NSString stringWithFormat:TTNavigate, permalink]; + [webView stringByEvaluatingJavaScriptFromString:js]; +} + ++ (BOOL)isTTURL:(NSURL *)url +{ + if(url != nil) { + if([url host] != nil) { + if([[url host] isEqualToString:TTHost] || [[url host] isEqualToString:[baseUrl host]]) { + return TRUE; + } + } + } + return FALSE; +} + + +#pragma mark - Notifications +- (void)didPressSpaceBarKey:(NSNotification *)notification +{ + NSEvent *event = (NSEvent *)notification.object; + [self.window sendEvent:event]; +} + + +@end diff --git a/TwentyTwo/LoginWindow.xib b/TwentyTwo/LoginWindow.xib new file mode 100644 index 0000000..ba0fea3 --- /dev/null +++ b/TwentyTwo/LoginWindow.xib @@ -0,0 +1,319 @@ + + + + 1080 + 12C60 + 2844 + 1187.34 + 625.00 + + 2844 + 1810 + + + IBNSLayoutConstraint + NSCustomObject + NSView + NSWindowTemplate + WebView + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.WebKitIBPlugin + + + PluginDependencyRecalculationVersion + + + + + PopupController + + + FirstResponder + + + NSApplication + + + 95 + 2 + {{196, 132}, {276, 378}} + -461896704 + Login - TwentyTwo + NSPanel + + + + + 256 + + + + 256 + + Apple HTML pasteboard type + Apple PDF pasteboard type + Apple PICT pasteboard type + Apple URL pasteboard type + Apple Web Archive pasteboard type + NSColor pasteboard type + NSFilenamesPboardType + NSStringPboardType + NeXT RTFD pasteboard type + NeXT Rich Text Format v1.0 pasteboard type + NeXT TIFF v4.0 pasteboard type + WebURLsWithTitlesPboardType + public.png + public.url + public.url-name + + {276, 378} + + + + _NS:9 + + + + + + + + + + + YES + YES + + + {276, 378} + + + + _NS:21 + + {{0, 0}, {1280, 778}} + {10000000000000, 10000000000000} + YES + + + + + + + window + + + + 13 + + + + webView + + + + 14 + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 1 + + + + + + + + 2 + + + + + 5 + 0 + + 5 + 1 + + 0.0 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 3 + 1 + + 0.0 + + 1000 + + 8 + 29 + 3 + + + + 4 + 0 + + 4 + 1 + + 0.0 + + 1000 + + 8 + 29 + 3 + + + + 6 + 0 + + 6 + 1 + + 0.0 + + 1000 + + 8 + 29 + 3 + + + + + + + 3 + + + + + 4 + + + + + 5 + + + + + 6 + + + + + 7 + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.WebKitIBPlugin + + + + + + 14 + + + + + NSLayoutConstraint + NSObject + + IBProjectSource + ./Classes/NSLayoutConstraint.h + + + + PopupController + NSObject + + WebView + NSPanel + + + + webView + WebView + + + window + NSPanel + + + + IBProjectSource + ./Classes/PopupController.h + + + + + 0 + IBCocoaFramework + YES + 3 + YES + + diff --git a/TwentyTwo/PopupController.h b/TwentyTwo/PopupController.h new file mode 100644 index 0000000..d09d810 --- /dev/null +++ b/TwentyTwo/PopupController.h @@ -0,0 +1,26 @@ +// +// PopupController.h +// TwentyTwo +// +// Created by Márton Salomváry on 2012/12/11. +// Copyright (c) 2012 Márton Salomváry. All rights reserved. +// + +#import +#import + +@interface PopupController : NSObject + +@property (assign) IBOutlet NSPanel *window; +@property (weak) IBOutlet WebView *webView; +@property BOOL isFirstLoad; + + +- (void)awakeFromNib; +- (WebView *)show; +- (void)webViewClose:(WebView *)sender; +- (void)webView:(WebView *)sender decidePolicyForNavigationAction:(NSDictionary *)actionInformation + request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id)listener; ++ (BOOL)isLoginURL:(NSURL *)url; + +@end diff --git a/TwentyTwo/PopupController.m b/TwentyTwo/PopupController.m new file mode 100644 index 0000000..423a698 --- /dev/null +++ b/TwentyTwo/PopupController.m @@ -0,0 +1,66 @@ +// +// PopupController.m +// TwentyTwo +// +// Created by Márton Salomváry on 2012/12/11. +// Copyright (c) 2012 Márton Salomváry. All rights reserved. +// Copyright (c) 2013 Marc Weistroff. All rights reserved. +// + +#import "AppConstants.h" +#import "PopupController.h" + +@implementation PopupController + +@synthesize webView; +@synthesize window; +@synthesize isFirstLoad; + +- (void)awakeFromNib +{ + [webView setUIDelegate:self]; + [webView setPolicyDelegate:self]; +} + +- (WebView *)show +{ + if(webView == nil) { + [NSBundle loadNibNamed:@"LoginWindow" owner:self]; + } + [self setIsFirstLoad:TRUE]; + return [self webView]; +} + +- (void)webViewClose:(WebView *)sender +{ + [window setIsVisible:FALSE]; + [webView close]; + [webView removeFromSuperview]; + [self setWebView:nil]; +} + +- (void)webView:(WebView *)sender decidePolicyForNavigationAction:(NSDictionary *)actionInformation + request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id)listener +{ + // window.open navigation + if(![self isFirstLoad] || [PopupController isLoginURL:[request URL]]) { + // new popup can only opened with login url, from there navigation + // anywhere is allowed + [listener use]; + [self setIsFirstLoad:FALSE]; + [window setIsVisible:TRUE]; + } else { + [listener ignore]; + // open external links in external browser + [[NSWorkspace sharedWorkspace] openURL:[actionInformation objectForKey:WebActionOriginalURLKey]]; + } +} + ++ (BOOL)isLoginURL:(NSURL *)url +{ + return [[url host] isEqualToString: TTHost] + // for some strange reason, objectAtIndex:0 is "/" + && [[[url pathComponents] objectAtIndex:1] isEqualToString: @"connect"]; +} + +@end diff --git a/TwentyTwo/TTApplication.h b/TwentyTwo/TTApplication.h new file mode 100644 index 0000000..a96a877 --- /dev/null +++ b/TwentyTwo/TTApplication.h @@ -0,0 +1,17 @@ +// +// TTApplication.h +// TwentyTwo +// +// Created by Rafif Yalda on 2013/06/05. +// Copyright (c) 2013 Rafif Yalda. All rights reserved. +// Copyright (c) 2013 Marc Weistroff. All rights reserved. +// + + +#import + + +@interface TTApplication : NSApplication + + +@end diff --git a/TwentyTwo/TTApplication.m b/TwentyTwo/TTApplication.m new file mode 100644 index 0000000..047b2df --- /dev/null +++ b/TwentyTwo/TTApplication.m @@ -0,0 +1,32 @@ +// +// TTApplication.m +// TwentyTwo +// +// Created by Rafif Yalda on 2013/06/05. +// Copyright (c) 2013 Rafif Yalda. All rights reserved. +// Copyright (c) 2013 Rafif Yalda. All rights reserved. +// + + +#import "AppConstants.h" +#import "TTApplication.h" + + +@implementation TTApplication + + +- (void)sendEvent:(NSEvent *)theEvent +{ + if (theEvent.type == NSKeyDown && + theEvent.keyCode == 49) + { + // Handle the space-bar, even if the window is closed + [[[NSWorkspace sharedWorkspace] notificationCenter] postNotificationName:TTApplicationDidPressSpaceBarKey object:theEvent]; + return; + } + + [super sendEvent:theEvent]; +} + + +@end diff --git a/TwentyTwo/TwentyTwo-Info.plist b/TwentyTwo/TwentyTwo-Info.plist new file mode 100644 index 0000000..0bece9b --- /dev/null +++ b/TwentyTwo/TwentyTwo-Info.plist @@ -0,0 +1,38 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + twentytwo + CFBundleIdentifier + net.weistroff.marc.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 0.1.0 + CFBundleSignature + ???? + CFBundleVersion + 0.1.0 + LSMinimumSystemVersion + ${MACOSX_DEPLOYMENT_TARGET} + NSHumanReadableCopyright + Copyright © 2013 Marc Weistroff. All rights reserved. + NSMainNibFile + MainMenu + NSPrincipalClass + TTApplication + SUFeedURL + https://raw.github.com/marcw/soundcleod/master/appcast.xml + SUPublicDSAKeyFile + dsa_pub.pem + + diff --git a/TwentyTwo/TwentyTwo-Prefix.pch b/TwentyTwo/TwentyTwo-Prefix.pch new file mode 100644 index 0000000..301ee58 --- /dev/null +++ b/TwentyTwo/TwentyTwo-Prefix.pch @@ -0,0 +1,7 @@ +// +// Prefix header for all source files of the 'TwentyTwo' target in the 'TwentyTwo' project +// + +#ifdef __OBJC__ + #import +#endif diff --git a/TwentyTwo/UrlPrompt.xib b/TwentyTwo/UrlPrompt.xib new file mode 100644 index 0000000..b1a7d46 --- /dev/null +++ b/TwentyTwo/UrlPrompt.xib @@ -0,0 +1,698 @@ + + + + 1070 + 12F45 + 4514 + 1187.40 + 626.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 4514 + + + IBNSLayoutConstraint + NSButton + NSButtonCell + NSCustomObject + NSTextField + NSTextFieldCell + NSUserDefaultsController + NSView + NSWindowTemplate + + + com.apple.InterfaceBuilder.CocoaPlugin + + + PluginDependencyRecalculationVersion + + + + + UrlPromptController + + + FirstResponder + + + NSApplication + + + 15 + 2 + {{109, 132}, {604, 114}} + 611845120 + Window + NSWindow + + + + + 256 + + + + 268 + {{508, 13}, {82, 32}} + + + + _NS:9 + 1 + YES + + 67108864 + 134217728 + Open + + LucidaGrande + 13 + 1044 + + _NS:9 + + -2038284288 + 129 + + + 200 + 25 + + NO + + + + 268 + {{418, 13}, {82, 32}} + + + + _NS:9 + YES + + 67108864 + 134217728 + Cancel + + _NS:9 + + -2038284288 + 129 + + Gw + 200 + 25 + + NO + + + + -2147483380 + {{17, 23}, {6, 17}} + + + + _NS:1535 + YES + + 68157504 + 272630784 + + + _NS:1535 + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + controlTextColor + + 3 + MAA + + + + NO + + + + 268 + {{20, 63}, {564, 22}} + + + + _NS:9 + 1 + YES + + -1804599231 + 268436480 + + + Enter any 22tracks link + _NS:9 + + 1 + YES + + 6 + System + textBackgroundColor + + 3 + MQA + + + + 6 + System + textColor + + + + NO + + + {604, 114} + + + + _NS:20 + + {{0, 0}, {1440, 878}} + {10000000000000, 10000000000000} + YES + + + YES + + + + + + + urlError + + + + 29 + + + + urlPrompt + + + + 33 + + + + closeUrlPrompt: + + + + 34 + + + + closeUrlPrompt: + + + + 35 + + + + urlInput + + + + 50 + + + + closeUrlPrompt: + + + + 52 + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 1 + + + + + + + + 2 + + + + + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 0 + 29 + 3 + NO + + + + 4 + 0 + + 4 + 1 + + 20 + + 1000 + + 0 + 29 + 3 + NO + + + + 4 + 0 + + 4 + 1 + + 20 + + 1000 + + 0 + 29 + 3 + NO + + + + 6 + 0 + + 6 + 1 + + 110 + + 1000 + + 3 + 9 + 3 + NO + + + + 11 + 0 + + 11 + 1 + + 0.0 + + 1000 + + 9 + 40 + 2 + NO + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 0 + 29 + 3 + NO + + + + 3 + 0 + + 3 + 1 + + 29 + + 1000 + + 3 + 9 + 3 + NO + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 0 + 29 + 3 + NO + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 0 + 29 + 3 + NO + + + + + + + 3 + + + + + + + + 5 + + + + + + + + 6 + + + + + 7 + 0 + + 0 + 1 + + 70 + + 1000 + + 3 + 9 + 1 + NO + + + + + + + 10 + + + + + 11 + + + + + 12 + + + + + 13 + + + + + 14 + + + + + 15 + + + + + 16 + + + + + 17 + + + + + 18 + + + + + 20 + + + + + 22 + + + + + 43 + + + + + + + + 44 + + + + + 46 + + + + + 48 + + + + + 49 + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + 52 + + + + + NSLayoutConstraint + NSObject + + IBProjectSource + ./Classes/NSLayoutConstraint.h + + + + UrlPromptController + NSObject + + id + id + + + + closeUrlPrompt: + id + + + promptForUrl: + id + + + + NSWindow + NSTextField + NSTextField + NSWindow + + + + mainWindow + NSWindow + + + urlError + NSTextField + + + urlInput + NSTextField + + + urlPrompt + NSWindow + + + + IBProjectSource + ./Classes/UrlPromptController.h + + + + + 0 + IBCocoaFramework + YES + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 + + + YES + 3 + YES + + diff --git a/TwentyTwo/UrlPromptController.h b/TwentyTwo/UrlPromptController.h new file mode 100644 index 0000000..86588e1 --- /dev/null +++ b/TwentyTwo/UrlPromptController.h @@ -0,0 +1,29 @@ +// +// UrlPromptController.h +// TwentyTwo +// +// Created by Márton Salomváry on 2013/01/17. +// Copyright (c) 2013 Márton Salomváry. All rights reserved. +// + +#import + +@protocol NavigateDelegate +@required +- (void) navigate: (NSString*) url; +@end + +@interface UrlPromptController : NSObject +{ + id navigateDelegate; +} + +@property (assign) IBOutlet NSWindow *mainWindow; +@property (unsafe_unretained) IBOutlet NSWindow *urlPrompt; +@property (weak) IBOutlet NSTextField *urlInput; +@property (weak) IBOutlet NSTextField *urlError; +@property (retain) id navigateDelegate; + +- (IBAction)promptForUrl:(id)sender; +- (IBAction)closeUrlPrompt:(id)sender; +@end diff --git a/TwentyTwo/UrlPromptController.m b/TwentyTwo/UrlPromptController.m new file mode 100644 index 0000000..ace3316 --- /dev/null +++ b/TwentyTwo/UrlPromptController.m @@ -0,0 +1,84 @@ +// +// UrlPromptController.m +// TwentyTwo +// +// Created by Márton Salomváry on 2013/01/17. +// Copyright (c) 2013 Márton Salomváry. All rights reserved. +// Copyright (c) 2013 Marc Weistroff. All rights reserved. +// + +#import "AppConstants.h" +#import "UrlPromptController.h" +#import "AppDelegate.h" + +@implementation UrlPromptController + +@synthesize mainWindow; +@synthesize urlPrompt; +@synthesize urlInput; +@synthesize urlError; +@synthesize navigateDelegate; + +- (IBAction)promptForUrl:(id)sender +{ + if(urlPrompt == nil) { + [NSBundle loadNibNamed:@"UrlPrompt" owner:self]; + } + [NSApp beginSheet: [self urlPrompt] + modalForWindow: [self mainWindow] + modalDelegate: self + didEndSelector: @selector(urlPromptDidEnd:returnCode:contextInfo:) + contextInfo: nil]; + [urlInput becomeFirstResponder]; +} + +- (IBAction)closeUrlPrompt:(id)sender +{ + NSString *value = [[urlInput stringValue] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; + NSString *permalink = nil; + NSString *error = nil; + [urlError setHidden:TRUE]; + + if([sender tag] == 1) { + if(value.length > 0) { + NSURL *url = [NSURL URLWithString:value]; + if(url != nil) { + if([url host] != nil) { + if([AppDelegate isTTURL:url]) { + permalink = [url path]; + } else { + error = @"This is not a 22tracks link"; + } + } else { + permalink = [url path]; + } + } else { + permalink = value; + } + } + if(permalink != nil) { + if([permalink characterAtIndex:0] != '/') { + permalink = [@"/" stringByAppendingString: permalink]; + } + [[self navigateDelegate] navigate:permalink]; + [urlInput setStringValue:@""]; + [urlPrompt orderOut:self]; + [NSApp endSheet:urlPrompt returnCode:NSOKButton]; + } else if(error != nil) { + [urlError setStringValue:error]; + [urlError setHidden:FALSE]; + } + } else { + [urlInput setStringValue:@""]; + [urlPrompt orderOut:self]; + [NSApp endSheet:urlPrompt returnCode:NSCancelButton]; + } + +} + +- (void)urlPromptDidEnd:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo +{ + if (returnCode == NSCancelButton) return; +} + +@end diff --git a/TwentyTwo/dsa_pub.pem b/TwentyTwo/dsa_pub.pem new file mode 100644 index 0000000..a6d1cca --- /dev/null +++ b/TwentyTwo/dsa_pub.pem @@ -0,0 +1,12 @@ +-----BEGIN PUBLIC KEY----- +MIIBtzCCASwGByqGSM44BAEwggEfAoGBAKmObDv8ZvNd2ts6Mh22Z0+nz8Hv0R7w +JhRIHQcAW3LScURP47DAdGGUfJwy+NgPRC8qDPX9S3wrhR224aMPJmxuvp7A6A5j +rzuZZ6JnvGQ8B+IiPFlSaK8/vk/aImPiatk6ATXJGzAL8rWhX9ThBtHN6eqJd7P0 +pKdE3d4vxtF9AhUAhM0yk2HGnZ9KZRBi+2dNiPEvHssCgYEAikDdq/P+0namDff4 +i9iqHE14Pk/RbTKWyqVpSBJdd9wp6Cw6km5mauU1oJpiKPinJrxuB9iTLyrBC8XA +Tc+6b4ua3pbhbDfHc1qGmOytcEy9wcopMDjBVnVBzbPUZRGYBhZzI0G0SS5pGrS2 +grPW10DN8e4i9yz6ReeuvM/hpyADgYQAAoGAHGZBIPByL4WBKuqZ3lNMTRmGezHc +xCgiE5uH2NK7CTNZEFgYOuaV7eh9mmrbzFoMaz93/CH3RUU4PKBz3ynVvHlEMzX2 +uVUuWsL08o3AXjv3I2EDNJg39gwCeA+p6pIWtMCz/DC5UI6/hhOcrIvt7KuUHBoa +DKamAZWGUKuKNpQ= +-----END PUBLIC KEY----- diff --git a/TwentyTwo/en.lproj/Credits.rtf b/TwentyTwo/en.lproj/Credits.rtf new file mode 100644 index 0000000..dd9e62e --- /dev/null +++ b/TwentyTwo/en.lproj/Credits.rtf @@ -0,0 +1,50 @@ +{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\paperw11900\paperh16840\vieww9600\viewh8400\viewkind0 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720 + +\f0\b\fs24 \cf0 UNOFFICIAL 22Tracks for Mac +\b0 \ +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720 +{\field{\*\fldinst{HYPERLINK "http://salomvary.github.com/soundcleod/"}}{\fldrslt \cf0 http://salomvary.github.com/soundcleod/}}\ +\ +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720 + +\b \cf0 Created by:\ +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\b0 \cf0 Marc Weistroff\ +marc@weistroff.net\ +https://twitter.com/futurecat\ +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720 +\cf0 \ + +\b Based on the original work "SoundCleod" by:\ + +\b0 M\'e1rton Salomv\'e1ry\ +salomvary@gmail.com\ +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720 +{\field{\*\fldinst{HYPERLINK "https://twitter.com/salomvary"}}{\fldrslt \cf0 https://twitter.com/salomvary}}\ +\ +and {\field{\*\fldinst{HYPERLINK "https://github.com/salomvary/soundcleod/graphs/contributors"}}{\fldrslt SoundCleod contributors}}\ +\ +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720 + +\b \cf0 License\ +\ +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\b0 \cf0 Copyright (C) 2013 M\'e1rton Salomv\'e1ry\ +Copyright (C) 2013 Marc Weistroff\ +\ +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qj +\cf0 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\ +\ +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\ +\ +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\ +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\b \cf0 \ +} \ No newline at end of file diff --git a/TwentyTwo/en.lproj/InfoPlist.strings b/TwentyTwo/en.lproj/InfoPlist.strings new file mode 100644 index 0000000..477b28f --- /dev/null +++ b/TwentyTwo/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/TwentyTwo/en.lproj/MainMenu.xib b/TwentyTwo/en.lproj/MainMenu.xib new file mode 100644 index 0000000..9928634 --- /dev/null +++ b/TwentyTwo/en.lproj/MainMenu.xib @@ -0,0 +1,2331 @@ + + + + 1070 + 12F45 + 4514 + 1187.40 + 626.00 + + 4514 + 3338 + + + IBNSLayoutConstraint + NSCustomObject + NSMenu + NSMenuItem + NSView + NSWindowTemplate + WebView + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.WebKitIBPlugin + + + PluginDependencyRecalculationVersion + + + + + NSApplication + + + FirstResponder + + + NSApplication + + + AMainMenu + + + + TwentyTwo + + 1048576 + 2147483647 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + submenuAction: + + TwentyTwo + + + + About TwentyTwo + + 2147483647 + + + + + + Check for Updates... + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Preferences… + , + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Services + + 1048576 + 2147483647 + + + submenuAction: + + Services + + _NSServicesMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Hide TwentyTwo + h + 1048576 + 2147483647 + + + + + + Hide Others + h + 1572864 + 2147483647 + + + + + + Show All + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Quit TwentyTwo + q + 1048576 + 2147483647 + + + + + _NSAppleMenu + + + + + File + + 1048576 + 2147483647 + + + submenuAction: + + File + + + + Open Location... + l + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Close + w + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Page Setup... + P + 1179648 + 2147483647 + + + + + + + Print… + p + 1048576 + 2147483647 + + + + + + + + + Edit + + 1048576 + 2147483647 + + + submenuAction: + + Edit + + + + Undo + z + 1048576 + 2147483647 + + + + + + Redo + Z + 1179648 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Cut + x + 1048576 + 2147483647 + + + + + + Copy + c + 1048576 + 2147483647 + + + + + + Paste + v + 1048576 + 2147483647 + + + + + + Paste and Match Style + V + 1572864 + 2147483647 + + + + + + Delete + + 1048576 + 2147483647 + + + + + + Select All + a + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + YES + Find + + 1048576 + 2147483647 + + + submenuAction: + + Find + + + + Find… + f + 1048576 + 2147483647 + + + 1 + + + + Find and Replace… + f + 1572864 + 2147483647 + + + 12 + + + + Find Next + g + 1048576 + 2147483647 + + + 2 + + + + Find Previous + G + 1179648 + 2147483647 + + + 3 + + + + Use Selection for Find + e + 1048576 + 2147483647 + + + 7 + + + + Jump to Selection + j + 1048576 + 2147483647 + + + + + + + + + Spelling and Grammar + + 1048576 + 2147483647 + + + submenuAction: + + Spelling and Grammar + + + + Show Spelling and Grammar + : + 1048576 + 2147483647 + + + + + + Check Document Now + ; + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Check Spelling While Typing + + 1048576 + 2147483647 + + + + + + Check Grammar With Spelling + + 1048576 + 2147483647 + + + + + + Correct Spelling Automatically + + 2147483647 + + + + + + + + + Substitutions + + 1048576 + 2147483647 + + + submenuAction: + + Substitutions + + + + Show Substitutions + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Smart Copy/Paste + f + 1048576 + 2147483647 + + + 1 + + + + Smart Quotes + g + 1048576 + 2147483647 + + + 2 + + + + Smart Dashes + + 2147483647 + + + + + + Smart Links + G + 1179648 + 2147483647 + + + 3 + + + + Text Replacement + + 2147483647 + + + + + + + + + Transformations + + 2147483647 + + + submenuAction: + + Transformations + + + + Make Upper Case + + 2147483647 + + + + + + Make Lower Case + + 2147483647 + + + + + + Capitalize + + 2147483647 + + + + + + + + + Speech + + 1048576 + 2147483647 + + + submenuAction: + + Speech + + + + Start Speaking + + 1048576 + 2147483647 + + + + + + Stop Speaking + + 1048576 + 2147483647 + + + + + + + + + + + + View + + 1048576 + 2147483647 + + + submenuAction: + + View + + + + Enter Full Screen + f + 1310720 + 2147483647 + + + + + + Reload + r + 1048576 + 2147483647 + + + + + + + + + Window + + 1048576 + 2147483647 + + + submenuAction: + + Window + + + + Minimize + m + 1048576 + 2147483647 + + + + + + Zoom + + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Main Window + 1 + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Bring All to Front + + 1048576 + 2147483647 + + + + + _NSWindowsMenu + + + + + Help + + 2147483647 + + + submenuAction: + + Help + + + + TwentyTwo Help + ? + 1048576 + 2147483647 + + + + + _NSHelpMenu + + + + _NSMainMenu + + + 15 + 2 + {{137, 10}, {1050, 650}} + 1954021376 + TwentyTwo + NSWindow + + + {320, 320} + + + 256 + + + + 256 + + Apple HTML pasteboard type + Apple PDF pasteboard type + Apple PICT pasteboard type + Apple URL pasteboard type + Apple Web Archive pasteboard type + NSColor pasteboard type + NSFilenamesPboardType + NSStringPboardType + NeXT RTFD pasteboard type + NeXT Rich Text Format v1.0 pasteboard type + NeXT TIFF v4.0 pasteboard type + WebURLsWithTitlesPboardType + public.png + public.url + public.url-name + + {1050, 650} + + + _NS:9 + + + + + + + + + + + YES + YES + + + {1050, 650} + + + {{0, 0}, {1440, 878}} + {320, 342} + {10000000000000, 10000000000000} + YES + + + AppDelegate + + + NSFontManager + + + PopupController + + + UrlPromptController + + + SUUpdater + + + + + + + terminate: + + + + 449 + + + + orderFrontStandardAboutPanel: + + + + 142 + + + + delegate + + + + 495 + + + + performMiniaturize: + + + + 37 + + + + arrangeInFront: + + + + 39 + + + + print: + + + + 86 + + + + runPageLayout: + + + + 87 + + + + performClose: + + + + 193 + + + + toggleContinuousSpellChecking: + + + + 222 + + + + undo: + + + + 223 + + + + copy: + + + + 224 + + + + checkSpelling: + + + + 225 + + + + stopSpeaking: + + + + 227 + + + + cut: + + + + 228 + + + + showGuessPanel: + + + + 230 + + + + redo: + + + + 231 + + + + selectAll: + + + + 232 + + + + startSpeaking: + + + + 233 + + + + delete: + + + + 235 + + + + performZoom: + + + + 240 + + + + performFindPanelAction: + + + + 241 + + + + centerSelectionInVisibleArea: + + + + 245 + + + + toggleGrammarChecking: + + + + 347 + + + + toggleSmartInsertDelete: + + + + 355 + + + + toggleAutomaticQuoteSubstitution: + + + + 356 + + + + toggleAutomaticLinkDetection: + + + + 357 + + + + hide: + + + + 367 + + + + hideOtherApplications: + + + + 368 + + + + unhideAllApplications: + + + + 370 + + + + toggleAutomaticSpellingCorrection: + + + + 456 + + + + orderFrontSubstitutionsPanel: + + + + 458 + + + + toggleAutomaticDashSubstitution: + + + + 461 + + + + toggleAutomaticTextReplacement: + + + + 463 + + + + uppercaseWord: + + + + 464 + + + + capitalizeWord: + + + + 467 + + + + lowercaseWord: + + + + 468 + + + + pasteAsPlainText: + + + + 486 + + + + performFindPanelAction: + + + + 487 + + + + performFindPanelAction: + + + + 488 + + + + performFindPanelAction: + + + + 489 + + + + performFindPanelAction: + + + + 535 + + + + paste: + + + + 662 + + + + toggleFullScreen: + + + + 661 + + + + window + + + + 532 + + + + webView + + + + 550 + + + + popupController + + + + 597 + + + + showHelp: + + + + 600 + + + + urlPromptController + + + + 649 + + + + restoreWindow: + + + + 666 + + + + reload: + + + + 668 + + + + mainWindow + + + + 650 + + + + promptForUrl: + + + + 651 + + + + checkForUpdates: + + + + 671 + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 29 + + + + + + + + + + + + + 19 + + + + + + + + 56 + + + + + + + + 217 + + + + + + + + 83 + + + + + + + + 81 + + + + + + + + + + + + + 78 + + + + + 77 + + + + + 73 + + + + + 79 + + + + + 74 + + + + + 205 + + + + + + + + + + + + + + + + + + + + + + 202 + + + + + 198 + + + + + 207 + + + + + 214 + + + + + 199 + + + + + 203 + + + + + 197 + + + + + 206 + + + + + 215 + + + + + 218 + + + + + + + + 216 + + + + + + + + 200 + + + + + + + + + + + + + 219 + + + + + 201 + + + + + 204 + + + + + 220 + + + + + + + + + + + + + 213 + + + + + 210 + + + + + 221 + + + + + 208 + + + + + 209 + + + + + 57 + + + + + + + + + + + + + + + + + + + 58 + + + + + 134 + + + + + 150 + + + + + 136 + + + + + 144 + + + + + 129 + + + + + 143 + + + + + 236 + + + + + 131 + + + + + + + + 149 + + + + + 145 + + + + + 130 + + + + + 24 + + + + + + + + + + + + + 92 + + + + + 5 + + + + + 239 + + + + + 23 + + + + + 211 + + + + + + + + 212 + + + + + + + + + 195 + + + + + 196 + + + + + 346 + + + + + 348 + + + + + + + + 349 + + + + + + + + + + + + + + 350 + + + + + 351 + + + + + 354 + + + + + 371 + + + + + + + + 372 + + + + + 6 + 0 + + 6 + 1 + + 0.0 + + 1000 + + 0 + 29 + 3 + NO + + + + 4 + 0 + + 4 + 1 + + 0.0 + + 1000 + + 0 + 29 + 3 + NO + + + + 3 + 0 + + 3 + 1 + + 0.0 + + 1000 + + 9 + 40 + 3 + NO + + + + 5 + 0 + + 5 + 1 + + 0.0 + + 1000 + + 0 + 29 + 3 + NO + + + + + + + 420 + + + + + 450 + + + + + + + + 451 + + + + + + + + + + 452 + + + + + 453 + + + + + 454 + + + + + 457 + + + + + 459 + + + + + 460 + + + + + 462 + + + + + 465 + + + + + 466 + + + + + 485 + + + + + 490 + + + + + + + + 491 + + + + + + + + 492 + + + + + 494 + + + + + 534 + + + + + 536 + + + + + + 557 + + + + + 563 + + + + + 569 + + + + + 596 + + + + + 604 + + + + + 648 + + + + + 653 + + + + + 654 + + + + + + + + 655 + + + + + + + + + 656 + + + + + 663 + + + + + 664 + + + + + 667 + + + + + 669 + + + + + 670 + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + {{380, 496}, {480, 360}} + + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + DHSwipeWebView + + com.apple.WebKitIBPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + 671 + + + + + AppDelegate + NSObject + + showHelp: + id + + + showHelp: + + showHelp: + id + + + + PopupController + UrlPromptController + DHSwipeWebView + NSWindow + + + + popupController + PopupController + + + urlPromptController + UrlPromptController + + + webView + DHSwipeWebView + + + window + NSWindow + + + + IBProjectSource + ./Classes/AppDelegate.h + + + + DHSwipeWebView + WebView + + IBProjectSource + ./Classes/DHSwipeWebView.h + + + + NSTextView + + id + id + + + + orderFrontSharingServicePicker: + id + + + toggleQuickLookPreviewPanel: + id + + + + IBProjectSource + ./Classes/NSTextView.h + + + + PopupController + NSObject + + WebView + NSPanel + + + + webView + WebView + + + window + NSPanel + + + + IBProjectSource + ./Classes/PopupController.h + + + + SUUpdater + NSObject + + checkForUpdates: + id + + + checkForUpdates: + + checkForUpdates: + id + + + + delegate + id + + + delegate + + delegate + id + + + + IBProjectSource + ./Classes/SUUpdater.h + + + + UrlPromptController + NSObject + + id + id + + + + closeUrlPrompt: + id + + + promptForUrl: + id + + + + NSWindow + NSTextField + NSTextField + NSWindow + + + + mainWindow + NSWindow + + + urlError + NSTextField + + + urlInput + NSTextField + + + urlPrompt + NSWindow + + + + IBProjectSource + ./Classes/UrlPromptController.h + + + + + 0 + IBCocoaFramework + YES + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 + + + YES + 3 + + {11, 11} + {10, 3} + + YES + + diff --git a/TwentyTwo/main.m b/TwentyTwo/main.m new file mode 100644 index 0000000..99d45bc --- /dev/null +++ b/TwentyTwo/main.m @@ -0,0 +1,14 @@ +// +// main.m +// TwentyTwo +// +// Created by Márton Salomváry on 2012/12/11. +// Copyright (c) 2012 Márton Salomváry. All rights reserved. +// + +#import + +int main(int argc, char *argv[]) +{ + return NSApplicationMain(argc, (const char **)argv); +} diff --git a/background.png b/background.png new file mode 100644 index 0000000..3141f0d Binary files /dev/null and b/background.png differ diff --git a/background.svg b/background.svg new file mode 100644 index 0000000..928c22d --- /dev/null +++ b/background.svg @@ -0,0 +1,17 @@ + + + + + + + + +   + +   SoundCleod + + + + + diff --git a/dist/Makefile b/dist/Makefile new file mode 100644 index 0000000..e800f12 --- /dev/null +++ b/dist/Makefile @@ -0,0 +1,75 @@ +# +# Build file for creating DMG files. +# +# The DMG packager looks for a template.dmg.bz2 for using as its +# DMG template. If it doesn't find one, it generates a clean one. +# +# If you create a DMG template, you should make one containing all +# the files listed in $(SOURCE_FILES) below, and arrange everything to suit +# your style. The contents of the files themselves does not matter, so +# they can be empty (they will be overwritten later). +# +# Remko Tronçon +# http://el-tramo.be/about +# Licensed under the MIT License. See COPYING for details. + + +################################################################################ +# Customizable variables +################################################################################ + +NAME ?= TwentyTwo + +SOURCE_DIR ?= . +SOURCE_FILES ?= TwentyTwo.app + +TEMPLATE_DMG ?= template.dmg + + +################################################################################ +# DMG building. No editing should be needed beyond this point. +################################################################################ + +MASTER_DMG=$(NAME).dmg +WC_DMG=wc.dmg +WC_DIR=wc + +.PHONY: all +all: $(MASTER_DMG) + +$(TEMPLATE_DMG): $(TEMPLATE_DMG).bz2 + bunzip2 -k $< + +$(TEMPLATE_DMG).bz2: + @echo + @echo --------------------- Generating empty template -------------------- + mkdir template + hdiutil create -fs HFSX -layout SPUD -size 40m "$(TEMPLATE_DMG)" -srcfolder template -format UDRW -volname "$(NAME)" -quiet + rmdir template + bzip2 "$(TEMPLATE_DMG)" + @echo + +$(WC_DMG): $(TEMPLATE_DMG) + cp $< $@ + +$(MASTER_DMG): $(WC_DMG) $(addprefix $(SOURCE_DIR)/,$(SOURCE_FILES)) + @echo + @echo --------------------- Creating Disk Image -------------------- + mkdir -p $(WC_DIR) + hdiutil attach "$(WC_DMG)" -noautoopen -quiet -mountpoint "$(WC_DIR)" + for i in $(SOURCE_FILES); do \ + rm -rf "$(WC_DIR)/$$i"; \ + ditto -rsrc "$(SOURCE_DIR)/$$i" "$(WC_DIR)/$$i"; \ + done + #rm -f "$@" + #hdiutil create -srcfolder "$(WC_DIR)" -format UDZO -imagekey zlib-level=9 "$@" -volname "$(NAME) $(VERSION)" -scrub -quiet + WC_DEV=`hdiutil info | grep "$(WC_DIR)" | grep "Apple_HFS" | awk '{print $$1}'` && \ + hdiutil detach $$WC_DEV -quiet -force + rm -f "$(MASTER_DMG)" + hdiutil convert "$(WC_DMG)" -quiet -format UDZO -imagekey zlib-level=9 -o "$@" + rm -rf $(WC_DIR) + @echo + +.PHONY: clean +clean: + -rm -rf $(TEMPLATE_DMG) $(MASTER_DMG) $(WC_DMG) diff --git a/dist/SoundCleod.dmg b/dist/SoundCleod.dmg new file mode 100644 index 0000000..8e56959 Binary files /dev/null and b/dist/SoundCleod.dmg differ diff --git a/dist/template.dmg.bz2 b/dist/template.dmg.bz2 new file mode 100644 index 0000000..4e9eee5 Binary files /dev/null and b/dist/template.dmg.bz2 differ diff --git a/generate-images.js b/generate-images.js new file mode 100644 index 0000000..12cf6e1 --- /dev/null +++ b/generate-images.js @@ -0,0 +1,14 @@ +var svg2png = require('svg2png'); + +svg2png('twentytwo.svg', 'twentytwo.iconset/icon_16x16.png', 1/16, function(e) {}); +svg2png('twentytwo.svg', 'twentytwo.iconset/icon_16x16@2x.png', 1/8, function(e) {}); +svg2png('twentytwo.svg', 'twentytwo.iconset/icon_32x32.png', 1/8, function(e) {}); +svg2png('twentytwo.svg', 'twentytwo.iconset/icon_32x32@2x.png', 1/4, function(e) {}); +svg2png('twentytwo.svg', 'twentytwo.iconset/icon_128x128.png', 1/2, function(e) {}); +svg2png('twentytwo.svg', 'twentytwo.iconset/icon_128x128@2x.png', 1, function(e) {}); +svg2png('twentytwo.svg', 'twentytwo.iconset/icon_256x256.png', 1, function(e) {}); +svg2png('twentytwo.svg', 'twentytwo.iconset/icon_256x256@2x.png', 2, function(e) {}); +svg2png('twentytwo.svg', 'twentytwo.iconset/icon_512x512.png', 2, function(e) {}); +svg2png('twentytwo.svg', 'twentytwo.iconset/icon_512x512@2x.png', 4, function(e) {}); + +svg2png('background.svg', 'background.png', 1, function(e) {}); diff --git a/twentytwo.iconset/icon_128x128.png b/twentytwo.iconset/icon_128x128.png new file mode 100644 index 0000000..b4575e0 Binary files /dev/null and b/twentytwo.iconset/icon_128x128.png differ diff --git a/twentytwo.iconset/icon_128x128@2x.png b/twentytwo.iconset/icon_128x128@2x.png new file mode 100644 index 0000000..fd95649 Binary files /dev/null and b/twentytwo.iconset/icon_128x128@2x.png differ diff --git a/twentytwo.iconset/icon_16x16.png b/twentytwo.iconset/icon_16x16.png new file mode 100644 index 0000000..94f6ae9 Binary files /dev/null and b/twentytwo.iconset/icon_16x16.png differ diff --git a/twentytwo.iconset/icon_16x16@2x.png b/twentytwo.iconset/icon_16x16@2x.png new file mode 100644 index 0000000..2cc0f0c Binary files /dev/null and b/twentytwo.iconset/icon_16x16@2x.png differ diff --git a/twentytwo.iconset/icon_256x256.png b/twentytwo.iconset/icon_256x256.png new file mode 100644 index 0000000..fd95649 Binary files /dev/null and b/twentytwo.iconset/icon_256x256.png differ diff --git a/twentytwo.iconset/icon_256x256@2x.png b/twentytwo.iconset/icon_256x256@2x.png new file mode 100644 index 0000000..c993e34 Binary files /dev/null and b/twentytwo.iconset/icon_256x256@2x.png differ diff --git a/twentytwo.iconset/icon_32x32.png b/twentytwo.iconset/icon_32x32.png new file mode 100644 index 0000000..2cc0f0c Binary files /dev/null and b/twentytwo.iconset/icon_32x32.png differ diff --git a/twentytwo.iconset/icon_32x32@2x.png b/twentytwo.iconset/icon_32x32@2x.png new file mode 100644 index 0000000..aee1e91 Binary files /dev/null and b/twentytwo.iconset/icon_32x32@2x.png differ diff --git a/twentytwo.iconset/icon_512x512.png b/twentytwo.iconset/icon_512x512.png new file mode 100644 index 0000000..c993e34 Binary files /dev/null and b/twentytwo.iconset/icon_512x512.png differ diff --git a/twentytwo.iconset/icon_512x512@2x.png b/twentytwo.iconset/icon_512x512@2x.png new file mode 100644 index 0000000..8c3ba4b Binary files /dev/null and b/twentytwo.iconset/icon_512x512@2x.png differ diff --git a/twentytwo.svg b/twentytwo.svg new file mode 100644 index 0000000..27f748c --- /dev/null +++ b/twentytwo.svg @@ -0,0 +1,8 @@ + + + + Layer 1 + + 22 + +