├── Growl.framework ├── Versions │ ├── Current │ └── A │ │ ├── Growl │ │ ├── Headers │ │ ├── Growl.h │ │ ├── GrowlDefines.h │ │ └── GrowlApplicationBridge.h │ │ └── Resources │ │ └── Info.plist ├── Growl ├── Headers └── Resources ├── Sparkle.framework ├── Versions │ ├── Current │ └── A │ │ ├── Sparkle │ │ ├── Resources │ │ ├── relaunch │ │ ├── fr_CA.lproj │ │ ├── de.lproj │ │ │ ├── Sparkle.strings │ │ │ ├── SUUpdateAlert.nib │ │ │ │ ├── keyedobjects.nib │ │ │ │ ├── info.nib │ │ │ │ └── classes.nib │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ │ ├── keyedobjects.nib │ │ │ │ ├── info.nib │ │ │ │ └── classes.nib │ │ │ └── SUUpdatePermissionPrompt.nib │ │ │ │ ├── keyedobjects.nib │ │ │ │ ├── info.nib │ │ │ │ └── classes.nib │ │ ├── en.lproj │ │ │ ├── Sparkle.strings │ │ │ ├── SUUpdateAlert.nib │ │ │ │ ├── keyedobjects.nib │ │ │ │ ├── info.nib │ │ │ │ └── classes.nib │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ │ ├── keyedobjects.nib │ │ │ │ ├── info.nib │ │ │ │ └── classes.nib │ │ │ └── SUUpdatePermissionPrompt.nib │ │ │ │ ├── keyedobjects.nib │ │ │ │ ├── info.nib │ │ │ │ └── classes.nib │ │ ├── es.lproj │ │ │ ├── Sparkle.strings │ │ │ ├── SUUpdateAlert.nib │ │ │ │ ├── keyedobjects.nib │ │ │ │ ├── info.nib │ │ │ │ └── classes.nib │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ │ ├── keyedobjects.nib │ │ │ │ ├── info.nib │ │ │ │ └── classes.nib │ │ │ └── SUUpdatePermissionPrompt.nib │ │ │ │ ├── keyedobjects.nib │ │ │ │ ├── info.nib │ │ │ │ └── classes.nib │ │ ├── fr.lproj │ │ │ ├── Sparkle.strings │ │ │ ├── SUUpdateAlert.nib │ │ │ │ ├── keyedobjects.nib │ │ │ │ ├── info.nib │ │ │ │ └── classes.nib │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ │ ├── keyedobjects.nib │ │ │ │ ├── info.nib │ │ │ │ └── classes.nib │ │ │ └── SUUpdatePermissionPrompt.nib │ │ │ │ ├── keyedobjects.nib │ │ │ │ ├── info.nib │ │ │ │ └── classes.nib │ │ ├── it.lproj │ │ │ ├── Sparkle.strings │ │ │ ├── SUUpdateAlert.nib │ │ │ │ ├── keyedobjects.nib │ │ │ │ ├── info.nib │ │ │ │ └── classes.nib │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ │ ├── keyedobjects.nib │ │ │ │ ├── info.nib │ │ │ │ └── classes.nib │ │ │ └── SUUpdatePermissionPrompt.nib │ │ │ │ ├── keyedobjects.nib │ │ │ │ ├── info.nib │ │ │ │ └── classes.nib │ │ ├── nl.lproj │ │ │ ├── Sparkle.strings │ │ │ ├── SUUpdateAlert.nib │ │ │ │ ├── keyedobjects.nib │ │ │ │ ├── info.nib │ │ │ │ └── classes.nib │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ │ ├── keyedobjects.nib │ │ │ │ ├── info.nib │ │ │ │ └── classes.nib │ │ │ └── SUUpdatePermissionPrompt.nib │ │ │ │ ├── keyedobjects.nib │ │ │ │ ├── info.nib │ │ │ │ └── classes.nib │ │ ├── ru.lproj │ │ │ ├── Sparkle.strings │ │ │ ├── SUUpdateAlert.nib │ │ │ │ ├── keyedobjects.nib │ │ │ │ ├── info.nib │ │ │ │ └── classes.nib │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ │ ├── keyedobjects.nib │ │ │ │ ├── info.nib │ │ │ │ └── classes.nib │ │ │ └── SUUpdatePermissionPrompt.nib │ │ │ │ ├── keyedobjects.nib │ │ │ │ ├── info.nib │ │ │ │ └── classes.nib │ │ ├── sv.lproj │ │ │ ├── Sparkle.strings │ │ │ ├── SUUpdateAlert.nib │ │ │ │ ├── keyedobjects.nib │ │ │ │ ├── info.nib │ │ │ │ └── classes.nib │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ │ ├── keyedobjects.nib │ │ │ │ ├── info.nib │ │ │ │ └── classes.nib │ │ │ └── SUUpdatePermissionPrompt.nib │ │ │ │ ├── keyedobjects.nib │ │ │ │ ├── info.nib │ │ │ │ └── classes.nib │ │ ├── SUStatus.nib │ │ │ ├── keyedobjects.nib │ │ │ ├── info.nib │ │ │ └── classes.nib │ │ ├── Info.plist │ │ ├── License.txt │ │ └── SUModelTranslation.plist │ │ └── Headers │ │ ├── Sparkle.h │ │ ├── SUAppcast.h │ │ ├── SUVersionComparisonProtocol.h │ │ ├── SUAppcastItem.h │ │ └── SUUpdater.h ├── Headers ├── Resources └── Sparkle ├── Icon.icns ├── phone.png ├── English.lproj └── InfoPlist.strings ├── .gitignore ├── Gmail_Prefix.pch ├── GmailWindow.h ├── main.m ├── SafariBar.h ├── NullRequestHandler.h ├── Growler.h ├── GmailWindowController.h ├── GmailWindow.m ├── gmailssb.js ├── GmailAppDelegate.h ├── dsa_pub.pem ├── Gmail-Info.plist ├── Growler.m ├── Credits.rtf ├── NullRequestHandler.m ├── SafariBar.m ├── README.markdown ├── GmailAppDelegate.m ├── GmailWindowController.m ├── RegexKitLite.h └── Gmail.xcodeproj └── project.pbxproj /Growl.framework/Versions/Current: -------------------------------------------------------------------------------- 1 | A -------------------------------------------------------------------------------- /Sparkle.framework/Versions/Current: -------------------------------------------------------------------------------- 1 | A -------------------------------------------------------------------------------- /Growl.framework/Growl: -------------------------------------------------------------------------------- 1 | Versions/Current/Growl -------------------------------------------------------------------------------- /Growl.framework/Headers: -------------------------------------------------------------------------------- 1 | Versions/Current/Headers -------------------------------------------------------------------------------- /Growl.framework/Resources: -------------------------------------------------------------------------------- 1 | Versions/Current/Resources -------------------------------------------------------------------------------- /Sparkle.framework/Headers: -------------------------------------------------------------------------------- 1 | Versions/Current/Headers -------------------------------------------------------------------------------- /Sparkle.framework/Resources: -------------------------------------------------------------------------------- 1 | Versions/Current/Resources -------------------------------------------------------------------------------- /Sparkle.framework/Sparkle: -------------------------------------------------------------------------------- 1 | Versions/Current/Sparkle -------------------------------------------------------------------------------- /Icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tylerhall/Gmail-SSB/master/Icon.icns -------------------------------------------------------------------------------- /phone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tylerhall/Gmail-SSB/master/phone.png -------------------------------------------------------------------------------- /English.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /Growl.framework/Versions/A/Growl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tylerhall/Gmail-SSB/master/Growl.framework/Versions/A/Growl -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Sparkle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tylerhall/Gmail-SSB/master/Sparkle.framework/Versions/A/Sparkle -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/relaunch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tylerhall/Gmail-SSB/master/Sparkle.framework/Versions/A/Resources/relaunch -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/fr_CA.lproj: -------------------------------------------------------------------------------- 1 | /Users/andym/Development/Build Products/Release (GC dual-mode; 10.5-only)/Sparkle.framework/Resources/fr.lproj -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | *.swp 3 | *~.nib 4 | 5 | build 6 | 7 | *.pbxuser 8 | *.perspective 9 | *.perspectivev3 10 | 11 | *.mode1v3 12 | *.mode2v3 13 | 14 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/de.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tylerhall/Gmail-SSB/master/Sparkle.framework/Versions/A/Resources/de.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/en.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tylerhall/Gmail-SSB/master/Sparkle.framework/Versions/A/Resources/en.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/es.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tylerhall/Gmail-SSB/master/Sparkle.framework/Versions/A/Resources/es.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/fr.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tylerhall/Gmail-SSB/master/Sparkle.framework/Versions/A/Resources/fr.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/it.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tylerhall/Gmail-SSB/master/Sparkle.framework/Versions/A/Resources/it.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/nl.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tylerhall/Gmail-SSB/master/Sparkle.framework/Versions/A/Resources/nl.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/ru.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tylerhall/Gmail-SSB/master/Sparkle.framework/Versions/A/Resources/ru.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/sv.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tylerhall/Gmail-SSB/master/Sparkle.framework/Versions/A/Resources/sv.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Gmail_Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'Gmail' target in the 'Gmail' project 3 | // 4 | 5 | #ifdef __OBJC__ 6 | #import 7 | #endif 8 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/SUStatus.nib/keyedobjects.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tylerhall/Gmail-SSB/master/Sparkle.framework/Versions/A/Resources/SUStatus.nib/keyedobjects.nib -------------------------------------------------------------------------------- /Growl.framework/Versions/A/Headers/Growl.h: -------------------------------------------------------------------------------- 1 | #include "GrowlDefines.h" 2 | 3 | #ifdef __OBJC__ 4 | # include "GrowlApplicationBridge.h" 5 | #endif 6 | #include "GrowlApplicationBridge-Carbon.h" 7 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/keyedobjects.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tylerhall/Gmail-SSB/master/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/keyedobjects.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/keyedobjects.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tylerhall/Gmail-SSB/master/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/keyedobjects.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/keyedobjects.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tylerhall/Gmail-SSB/master/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/keyedobjects.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/keyedobjects.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tylerhall/Gmail-SSB/master/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/keyedobjects.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/keyedobjects.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tylerhall/Gmail-SSB/master/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/keyedobjects.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/keyedobjects.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tylerhall/Gmail-SSB/master/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/keyedobjects.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/keyedobjects.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tylerhall/Gmail-SSB/master/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/keyedobjects.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/keyedobjects.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tylerhall/Gmail-SSB/master/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/keyedobjects.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tylerhall/Gmail-SSB/master/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tylerhall/Gmail-SSB/master/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tylerhall/Gmail-SSB/master/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tylerhall/Gmail-SSB/master/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tylerhall/Gmail-SSB/master/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tylerhall/Gmail-SSB/master/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tylerhall/Gmail-SSB/master/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tylerhall/Gmail-SSB/master/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tylerhall/Gmail-SSB/master/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tylerhall/Gmail-SSB/master/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tylerhall/Gmail-SSB/master/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tylerhall/Gmail-SSB/master/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tylerhall/Gmail-SSB/master/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tylerhall/Gmail-SSB/master/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tylerhall/Gmail-SSB/master/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tylerhall/Gmail-SSB/master/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib -------------------------------------------------------------------------------- /GmailWindow.h: -------------------------------------------------------------------------------- 1 | // 2 | // GmailWindow.h 3 | // Gmail 4 | // 5 | // Created by Tyler Hall on 8/26/10. 6 | // Copyright 2010 Click On Tyler, LLC. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | 12 | @interface GmailWindow : NSWindow { 13 | 14 | } 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // Gmail 4 | // 5 | // Created by Tyler Hall on 8/26/10. 6 | // Copyright 2010 Click On Tyler, LLC. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | int main(int argc, char *argv[]) 12 | { 13 | return NSApplicationMain(argc, (const char **) argv); 14 | } 15 | -------------------------------------------------------------------------------- /SafariBar.h: -------------------------------------------------------------------------------- 1 | // 2 | // SafariBar.h 3 | // Gmail 4 | // 5 | // Created by Tyler Hall on 8/27/10. 6 | // Copyright 2010 Click On Tyler, LLC. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | 12 | @interface SafariBar : NSView { 13 | NSString *stringValue; 14 | } 15 | 16 | - (void)setStringValue:(NSString *)newStringValue; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /NullRequestHandler.h: -------------------------------------------------------------------------------- 1 | // 2 | // NullRequestHandler.h 3 | // Gmail 4 | // 5 | // Created by Tyler Hall on 8/26/10. 6 | // Copyright 2010 Click On Tyler, LLC. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface NullRequestHandler : NSObject { 13 | WebView *webView; 14 | } 15 | 16 | - (WebView *)webView; 17 | - (void)loadRequest:(NSURLRequest *)request; 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/info.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBFramework Version 6 | 629 7 | IBOldestOS 8 | 5 9 | IBOpenObjects 10 | 11 | IBSystem Version 12 | 9E17 13 | targetFramework 14 | IBCocoaFramework 15 | 16 | 17 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/info.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBFramework Version 6 | 629 7 | IBOldestOS 8 | 5 9 | IBOpenObjects 10 | 11 | IBSystem Version 12 | 9E17 13 | targetFramework 14 | IBCocoaFramework 15 | 16 | 17 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/info.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBFramework Version 6 | 629 7 | IBOldestOS 8 | 5 9 | IBOpenObjects 10 | 11 | IBSystem Version 12 | 9D34 13 | targetFramework 14 | IBCocoaFramework 15 | 16 | 17 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/info.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBFramework Version 6 | 629 7 | IBOldestOS 8 | 5 9 | IBOpenObjects 10 | 11 | IBSystem Version 12 | 9E17 13 | targetFramework 14 | IBCocoaFramework 15 | 16 | 17 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/info.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBFramework Version 6 | 629 7 | IBOldestOS 8 | 5 9 | IBOpenObjects 10 | 11 | IBSystem Version 12 | 9E17 13 | targetFramework 14 | IBCocoaFramework 15 | 16 | 17 | -------------------------------------------------------------------------------- /Growler.h: -------------------------------------------------------------------------------- 1 | // 2 | // Growler.h 3 | // Incoming PrefPane 4 | // 5 | // Created by Tyler Hall on 8/23/10. 6 | // Copyright 2010 Click On Tyler, LLC. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @class TwitterSearch; 13 | 14 | @interface Growler : NSObject { 15 | 16 | } 17 | 18 | + (Growler *)sharedGrowler; 19 | - (void)growlWithTitle:(NSString *)title description:(NSString *)description notificationName:(NSString *)notificationName iconData:(NSData *)iconData context:(id)context; 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/info.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBFramework Version 6 | 629 7 | IBOldestOS 8 | 5 9 | IBOpenObjects 10 | 11 | 6 12 | 13 | IBSystem Version 14 | 9D34 15 | targetFramework 16 | IBCocoaFramework 17 | 18 | 19 | -------------------------------------------------------------------------------- /GmailWindowController.h: -------------------------------------------------------------------------------- 1 | // 2 | // GmailWindowController.h 3 | // Gmail 4 | // 5 | // Created by Tyler Hall on 8/26/10. 6 | // Copyright 2010 Click On Tyler, LLC. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @class SafariBar; 13 | @class GmailWindow; 14 | 15 | @interface GmailWindowController : NSWindowController { 16 | IBOutlet WebView *webView; 17 | IBOutlet SafariBar *statusBar; 18 | WebView *replacementWebView; 19 | NSRect oldFrame; 20 | NSTimer *unreadTimer; 21 | } 22 | 23 | - (id)initWithWebView:(WebView *)newWebView; 24 | - (void)toggleFullscreen; 25 | 26 | @end 27 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Headers/Sparkle.h: -------------------------------------------------------------------------------- 1 | // 2 | // Sparkle.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 3/16/06. (Modified by CDHW on 23/12/07) 6 | // Copyright 2006 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #ifndef SPARKLE_H 10 | #define SPARKLE_H 11 | 12 | // This list should include the shared headers. It doesn't matter if some of them aren't shared (unless 13 | // there are name-space collisions) so we can list all of them to start with: 14 | 15 | #import 16 | 17 | #import 18 | #import 19 | #import 20 | 21 | #endif 22 | -------------------------------------------------------------------------------- /GmailWindow.m: -------------------------------------------------------------------------------- 1 | // 2 | // GmailWindow.m 3 | // Gmail 4 | // 5 | // Created by Tyler Hall on 8/26/10. 6 | // Copyright 2010 Click On Tyler, LLC. All rights reserved. 7 | // 8 | 9 | #import "GmailWindow.h" 10 | 11 | 12 | @implementation GmailWindow 13 | 14 | // This is so we can close the winodw and then re-open 15 | // without reloading the WebView. Primarily, this is awesome 16 | // for backgrounding Gmail with voice/video chats open. 17 | - (void)performClose:(id)sender 18 | { 19 | [self setIsVisible:NO]; 20 | } 21 | 22 | - (BOOL)canBecomeKeyWindow 23 | { 24 | return YES; 25 | } 26 | 27 | - (BOOL)canBecomeMainWindow 28 | { 29 | return YES; 30 | } 31 | 32 | @end 33 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/info.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBFramework Version 6 | 670 7 | IBLastKnownRelativeProjectPath 8 | ../Sparkle.xcodeproj 9 | IBOldestOS 10 | 5 11 | IBOpenObjects 12 | 13 | IBSystem Version 14 | 9E17 15 | targetFramework 16 | IBCocoaFramework 17 | 18 | 19 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/SUStatus.nib/info.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBFramework Version 6 | 670 7 | IBLastKnownRelativeProjectPath 8 | Sparkle.xcodeproj 9 | IBOldestOS 10 | 5 11 | IBOpenObjects 12 | 13 | 6 14 | 15 | IBSystem Version 16 | 10A96 17 | targetFramework 18 | IBCocoaFramework 19 | 20 | 21 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/info.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBFramework Version 6 | 667 7 | IBLastKnownRelativeProjectPath 8 | ../Sparkle.xcodeproj 9 | IBOldestOS 10 | 5 11 | IBOpenObjects 12 | 13 | 6 14 | 15 | IBSystem Version 16 | 9D34 17 | targetFramework 18 | IBCocoaFramework 19 | 20 | 21 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/info.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBFramework Version 6 | 667 7 | IBLastKnownRelativeProjectPath 8 | ../Sparkle.xcodeproj 9 | IBOldestOS 10 | 5 11 | IBOpenObjects 12 | 13 | 6 14 | 15 | IBSystem Version 16 | 9D34 17 | targetFramework 18 | IBCocoaFramework 19 | 20 | 21 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/info.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBFramework Version 6 | 667 7 | IBLastKnownRelativeProjectPath 8 | ../Sparkle.xcodeproj 9 | IBOldestOS 10 | 5 11 | IBOpenObjects 12 | 13 | 6 14 | 15 | IBSystem Version 16 | 9D34 17 | targetFramework 18 | IBCocoaFramework 19 | 20 | 21 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/info.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBFramework Version 6 | 670 7 | IBLastKnownRelativeProjectPath 8 | ../Sparkle.xcodeproj 9 | IBOldestOS 10 | 5 11 | IBOpenObjects 12 | 13 | 6 14 | 15 | IBSystem Version 16 | 9E17 17 | targetFramework 18 | IBCocoaFramework 19 | 20 | 21 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/info.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBDocumentLocation 6 | 69 14 356 240 0 0 1280 778 7 | IBFramework Version 8 | 489.0 9 | IBLastKnownRelativeProjectPath 10 | ../Sparkle.xcodeproj 11 | IBOldestOS 12 | 5 13 | IBSystem Version 14 | 9D34 15 | targetFramework 16 | IBCocoaFramework 17 | 18 | 19 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/info.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBFramework Version 6 | 670 7 | IBLastKnownRelativeProjectPath 8 | ../Sparkle.xcodeproj 9 | IBOldestOS 10 | 5 11 | IBOpenObjects 12 | 13 | 18 14 | 15 | IBSystem Version 16 | 10A96 17 | targetFramework 18 | IBCocoaFramework 19 | 20 | 21 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/info.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBFramework Version 6 | 667 7 | IBLastKnownRelativeProjectPath 8 | ../Sparkle.xcodeproj 9 | IBOldestOS 10 | 5 11 | IBOpenObjects 12 | 13 | 6 14 | 15 | IBSystem Version 16 | 9D34 17 | targetFramework 18 | IBCocoaFramework 19 | 20 | 21 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib/info.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBFramework Version 6 | 667 7 | IBLastKnownRelativeProjectPath 8 | ../Sparkle.xcodeproj 9 | IBOldestOS 10 | 5 11 | IBOpenObjects 12 | 13 | 6 14 | 15 | IBSystem Version 16 | 9D34 17 | targetFramework 18 | IBCocoaFramework 19 | 20 | 21 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/info.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBFramework Version 6 | 658 7 | IBLastKnownRelativeProjectPath 8 | ../Sparkle.xcodeproj 9 | IBOldestOS 10 | 5 11 | IBOpenObjects 12 | 13 | 6 14 | 15 | IBSystem Version 16 | 9C7010 17 | targetFramework 18 | IBCocoaFramework 19 | 20 | 21 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/info.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBFramework Version 6 | 667 7 | IBLastKnownRelativeProjectPath 8 | ../Sparkle.xcodeproj 9 | IBOldestOS 10 | 5 11 | IBOpenObjects 12 | 13 | 6 14 | 15 | IBSystem Version 16 | 9D34 17 | targetFramework 18 | IBCocoaFramework 19 | 20 | 21 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/info.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBFramework Version 6 | 667 7 | IBLastKnownRelativeProjectPath 8 | ../Sparkle.xcodeproj 9 | IBOldestOS 10 | 5 11 | IBOpenObjects 12 | 13 | 6 14 | 15 | IBSystem Version 16 | 9D34 17 | targetFramework 18 | IBCocoaFramework 19 | 20 | 21 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib/info.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBFramework Version 6 | 667 7 | IBLastKnownRelativeProjectPath 8 | ../Sparkle.xcodeproj 9 | IBOldestOS 10 | 5 11 | IBOpenObjects 12 | 13 | 5 14 | 15 | IBSystem Version 16 | 9D34 17 | targetFramework 18 | IBCocoaFramework 19 | 20 | 21 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/info.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBFramework Version 6 | 670 7 | IBLastKnownRelativeProjectPath 8 | ../Sparkle.xcodeproj 9 | IBOldestOS 10 | 5 11 | IBOpenObjects 12 | 13 | 6 14 | 15 | IBSystem Version 16 | 9E17 17 | targetFramework 18 | IBCocoaFramework 19 | 20 | 21 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/info.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBFramework Version 6 | 670 7 | IBLastKnownRelativeProjectPath 8 | ../Sparkle.xcodeproj 9 | IBOldestOS 10 | 5 11 | IBOpenObjects 12 | 13 | 6 14 | 15 | IBSystem Version 16 | 10A96 17 | targetFramework 18 | IBCocoaFramework 19 | 20 | 21 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib/info.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBFramework Version 6 | 667 7 | IBLastKnownRelativeProjectPath 8 | ../../Sparkle.xcodeproj 9 | IBOldestOS 10 | 5 11 | IBOpenObjects 12 | 13 | 6 14 | 15 | IBSystem Version 16 | 9D34 17 | targetFramework 18 | IBCocoaFramework 19 | 20 | 21 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/info.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBFramework Version 6 | 670 7 | IBLastKnownRelativeProjectPath 8 | ../Sparkle.xcodeproj 9 | IBOldestOS 10 | 5 11 | IBOpenObjects 12 | 13 | 6 14 | 15 | IBSystem Version 16 | 10A96 17 | targetFramework 18 | IBCocoaFramework 19 | 20 | 21 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib/info.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBFramework Version 6 | 670 7 | IBLastKnownRelativeProjectPath 8 | ../Sparkle.xcodeproj 9 | IBOldestOS 10 | 5 11 | IBOpenObjects 12 | 13 | 6 14 | 41 15 | 16 | IBSystem Version 17 | 10A96 18 | targetFramework 19 | IBCocoaFramework 20 | 21 | 22 | -------------------------------------------------------------------------------- /gmailssb.js: -------------------------------------------------------------------------------- 1 | gmailSSBUnreadCount = function() { 2 | var mainFrame = document.querySelector("iframe#canvas_frame").contentDocument; 3 | var elInbox = mainFrame.querySelector("a[href$='#inbox']"); 4 | var count = elInbox.innerHTML.match(/([0-9]+)/); 5 | return count[0]; 6 | }; 7 | 8 | // Code taken from the ever-awesome Mailplane.app (http://mailplaneapp.com/) 9 | doc=window.document.getElementById("canvas_frame").contentDocument; 10 | if(!doc.getElementById("rapportiveApplication")){ 11 | head=doc.getElementsByTagName("head")[0]; 12 | script=doc.createElement("script"); 13 | script.type="text/javascript"; 14 | script.src=window.location.protocol+"//rapportive.com/load/application?client=Gmail-SSB"; 15 | script.setAttribute("id","rapportiveApplication"); 16 | head.appendChild(script); 17 | } -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Headers/SUAppcast.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUAppcast.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 3/12/06. 6 | // Copyright 2006 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #ifndef SUAPPCAST_H 10 | #define SUAPPCAST_H 11 | 12 | @class SUAppcastItem; 13 | @interface SUAppcast : NSObject { 14 | NSArray *items; 15 | NSString *userAgentString; 16 | id delegate; 17 | NSMutableData *incrementalData; 18 | } 19 | 20 | - (void)fetchAppcastFromURL:(NSURL *)url; 21 | - (void)setDelegate:delegate; 22 | - (void)setUserAgentString:(NSString *)userAgentString; 23 | 24 | - (NSArray *)items; 25 | 26 | @end 27 | 28 | @interface NSObject (SUAppcastDelegate) 29 | - (void)appcastDidFinishLoading:(SUAppcast *)appcast; 30 | - (void)appcast:(SUAppcast *)appcast failedToLoadWithError:(NSError *)error; 31 | @end 32 | 33 | #endif 34 | -------------------------------------------------------------------------------- /GmailAppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // GmailAppDelegate.h 3 | // Gmail 4 | // 5 | // Created by Tyler Hall on 8/26/10. 6 | // Copyright 2010 Click On Tyler, LLC. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "Growler.h" 11 | 12 | @class GmailWindowController; 13 | 14 | @interface GmailAppDelegate : NSObject { 15 | GmailWindowController *mainWindowController; 16 | BOOL voiceBounce; 17 | BOOL videoBounce; 18 | BOOL chatBounce; 19 | } 20 | 21 | - (IBAction)showMainWindow:(id)sender; 22 | - (void)incomingVideo:(NSNotification *)notification; 23 | - (void)incomingCall:(NSNotification *)notification; 24 | - (void)incomingChat:(NSNotification *)notification; 25 | - (void)unreadCountChanged:(NSNotification *)notification; 26 | - (IBAction)toggleFullscreen:(id)sender; 27 | 28 | @end 29 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | Sparkle 9 | CFBundleIdentifier 10 | org.andymatuschak.Sparkle 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | Sparkle 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.5 Beta 6 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 313 23 | 24 | 25 | -------------------------------------------------------------------------------- /Growl.framework/Versions/A/Resources/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleExecutable 8 | Growl 9 | CFBundleIdentifier 10 | com.growl.growlframework 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundlePackageType 14 | FMWK 15 | CFBundleShortVersionString 16 | 1.2 17 | CFBundleSignature 18 | GRRR 19 | CFBundleVersion 20 | 1.2 21 | NSPrincipalClass 22 | GrowlApplicationBridge 23 | 24 | 25 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Headers/SUVersionComparisonProtocol.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUVersionComparisonProtocol.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 12/21/07. 6 | // Copyright 2007 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #ifndef SUVERSIONCOMPARISONPROTOCOL_H 10 | #define SUVERSIONCOMPARISONPROTOCOL_H 11 | 12 | /*! 13 | @protocol 14 | @abstract Implement this protocol to provide version comparison facilities for Sparkle. 15 | */ 16 | @protocol SUVersionComparison 17 | 18 | /*! 19 | @method 20 | @abstract An abstract method to compare two version strings. 21 | @discussion Should return NSOrderedAscending if b > a, NSOrderedDescending if b < a, and NSOrderedSame if they are equivalent. 22 | */ 23 | - (NSComparisonResult)compareVersion:(NSString *)versionA toVersion:(NSString *)versionB; 24 | 25 | @end 26 | 27 | #endif 28 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/License.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2006 Andy Matuschak 2 | 3 | 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: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | 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. -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/classes.nib: -------------------------------------------------------------------------------- 1 | { 2 | IBClasses = ( 3 | { 4 | CLASS = FirstResponder; 5 | LANGUAGE = ObjC; 6 | SUPERCLASS = NSObject; 7 | }, 8 | { 9 | CLASS = NSApplication; 10 | LANGUAGE = ObjC; 11 | SUPERCLASS = NSResponder; 12 | }, 13 | { 14 | CLASS = NSObject; 15 | LANGUAGE = ObjC; 16 | }, 17 | { 18 | ACTIONS = { 19 | installUpdate = id; 20 | remindMeLater = id; 21 | skipThisVersion = id; 22 | }; 23 | CLASS = SUUpdateAlert; 24 | LANGUAGE = ObjC; 25 | OUTLETS = { 26 | delegate = id; 27 | description = NSTextField; 28 | releaseNotesView = WebView; 29 | }; 30 | SUPERCLASS = SUWindowController; 31 | }, 32 | { 33 | CLASS = SUWindowController; 34 | LANGUAGE = ObjC; 35 | SUPERCLASS = NSWindowController; 36 | } 37 | ); 38 | IBVersion = 1; 39 | } -------------------------------------------------------------------------------- /dsa_pub.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN PUBLIC KEY----- 2 | MIIDOjCCAi0GByqGSM44BAEwggIgAoIBAQCMgMkVOyRtc0VdHc6f5txKITDa83UO 3 | ZNBRE5cuwPN8vJOnf9nAh8a42Dp9uoaPSytKOM4ZQYXdSd3Wq/jEqxNKNjFrC44Y 4 | SwMOef1B7dtVltTsmr5M6VzF3dziobKQeY1q2RML1wtwIone24Yt0KrPPZR4668P 5 | uHZt3gOpGqbXnsnBxl4WopNFtKfnw9ebiq/r2p9mH5OLuRChkP/1dT7x610+FviD 6 | 5Sv0h/oJ1C4cvXhKQtirDitP/PQtATU//AaB8Xgi4wSzNkJ4cuEoPpx4xS2BC42F 7 | a8cV/2RMwJKwoF36SEujYdUlC1kCwBJpYwK0WZ017XYr7p88ypeR1vxTAhUAskDA 8 | 8//pD7egggMn4lsjRHPZBnsCggEARaq+U9oWLlgMQcN2G0JvH37k22MWVse4pYg5 9 | Vxo83qO77jNs8mnX67bJp1aFT2MSL049DajUYOM3JKEtkuaT6FcD4dDlrwD1JIRI 10 | 50b/8hDIIgeiGNMHX7saABUzda+u25brfHNPnBNResSC6nux3GdImaxmYO3d0toC 11 | e0XHSZAslxhYi1SKgVBprcb3aPWfaunATjspSFoZmcqsGR94OPjkEye55SPU5vyN 12 | 0JVMhp97kmRuN3tqIShR51LqzOd2bqCqIYRJgAa4QnFphLsK3qSs42i8HHZbljyx 13 | s7+EytHWw1faTDjnznJPxrEXtsm3oyP4chghXVZiHqn2pczHDwOCAQUAAoIBAFPy 14 | gjvNM2mApuKL+g9SvqjgHLMZupphaXsvAl9Y7Ipp2ypnjyHS9dTPpE0uDRbL0HzS 15 | 8NufQNHyAiv/bDjCaLvVIMxhGT3LmCxKSJrbwmkvUa2/0W1YblFfruHSbnvPy3UI 16 | l77jZZnJnD3D6OGkn18CltxOMrzEKz6/KSVpT315u4Wzf2GJDQkteRVEXFICM3rx 17 | PgS0uiwjxEZAeet4auiwxYidC/tAjuSn+uixt+lShHyucSljwAItFxGs5YjPjXTl 18 | WppibFKLOQnk6SEoihxCpq5/U2Uh+Dpi3zGXRKAtGWavB/0C8uowKacrmRKLzUs6 19 | kEme86o47uXaU8uRbCk= 20 | -----END PUBLIC KEY----- 21 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Headers/SUAppcastItem.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUAppcastItem.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 3/12/06. 6 | // Copyright 2006 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #ifndef SUAPPCASTITEM_H 10 | #define SUAPPCASTITEM_H 11 | 12 | @interface SUAppcastItem : NSObject { 13 | NSString *title; 14 | NSDate *date; 15 | NSString *itemDescription; 16 | 17 | NSURL *releaseNotesURL; 18 | 19 | NSString *DSASignature; 20 | NSString *minimumSystemVersion; 21 | 22 | NSURL *fileURL; 23 | NSString *versionString; 24 | NSString *displayVersionString; 25 | 26 | NSDictionary *propertiesDictionary; 27 | } 28 | 29 | // Initializes with data from a dictionary provided by the RSS class. 30 | - initWithDictionary:(NSDictionary *)dict; 31 | 32 | - (NSString *)title; 33 | - (NSString *)versionString; 34 | - (NSString *)displayVersionString; 35 | - (NSDate *)date; 36 | - (NSString *)itemDescription; 37 | - (NSURL *)releaseNotesURL; 38 | - (NSURL *)fileURL; 39 | - (NSString *)DSASignature; 40 | - (NSString *)minimumSystemVersion; 41 | 42 | // Returns the dictionary provided in initWithDictionary; this might be useful later for extensions. 43 | - (NSDictionary *)propertiesDictionary; 44 | 45 | @end 46 | 47 | #endif 48 | -------------------------------------------------------------------------------- /Gmail-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIconFile 10 | Icon 11 | CFBundleIdentifier 12 | com.clickonideas.gmail-ssb 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 0.3 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 0.3 25 | LSMinimumSystemVersion 26 | ${MACOSX_DEPLOYMENT_TARGET} 27 | NSMainNibFile 28 | MainMenu 29 | NSPrincipalClass 30 | NSApplication 31 | SUEnableSystemProfiling 32 | 33 | SUFeedURL 34 | http://shine.clickontyler.com/appcast.php?id=7 35 | SUPublicDSAKeyFile 36 | dsa_pub.pem 37 | 38 | 39 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/classes.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBClasses 6 | 7 | 8 | CLASS 9 | SUWindowController 10 | LANGUAGE 11 | ObjC 12 | SUPERCLASS 13 | NSWindowController 14 | 15 | 16 | ACTIONS 17 | 18 | doNotInstall 19 | id 20 | installLater 21 | id 22 | installNow 23 | id 24 | 25 | CLASS 26 | SUAutomaticUpdateAlert 27 | LANGUAGE 28 | ObjC 29 | SUPERCLASS 30 | SUWindowController 31 | 32 | 33 | CLASS 34 | FirstResponder 35 | LANGUAGE 36 | ObjC 37 | SUPERCLASS 38 | NSObject 39 | 40 | 41 | CLASS 42 | NSObject 43 | LANGUAGE 44 | ObjC 45 | 46 | 47 | IBVersion 48 | 1 49 | 50 | 51 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/classes.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBClasses 6 | 7 | 8 | CLASS 9 | SUWindowController 10 | LANGUAGE 11 | ObjC 12 | SUPERCLASS 13 | NSWindowController 14 | 15 | 16 | ACTIONS 17 | 18 | doNotInstall 19 | id 20 | installLater 21 | id 22 | installNow 23 | id 24 | 25 | CLASS 26 | SUAutomaticUpdateAlert 27 | LANGUAGE 28 | ObjC 29 | SUPERCLASS 30 | SUWindowController 31 | 32 | 33 | CLASS 34 | FirstResponder 35 | LANGUAGE 36 | ObjC 37 | SUPERCLASS 38 | NSObject 39 | 40 | 41 | CLASS 42 | NSObject 43 | LANGUAGE 44 | ObjC 45 | 46 | 47 | IBVersion 48 | 1 49 | 50 | 51 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/classes.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBClasses 6 | 7 | 8 | CLASS 9 | SUWindowController 10 | LANGUAGE 11 | ObjC 12 | SUPERCLASS 13 | NSWindowController 14 | 15 | 16 | ACTIONS 17 | 18 | doNotInstall 19 | id 20 | installLater 21 | id 22 | installNow 23 | id 24 | 25 | CLASS 26 | SUAutomaticUpdateAlert 27 | LANGUAGE 28 | ObjC 29 | SUPERCLASS 30 | SUWindowController 31 | 32 | 33 | CLASS 34 | FirstResponder 35 | LANGUAGE 36 | ObjC 37 | SUPERCLASS 38 | NSObject 39 | 40 | 41 | CLASS 42 | NSObject 43 | LANGUAGE 44 | ObjC 45 | 46 | 47 | IBVersion 48 | 1 49 | 50 | 51 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/classes.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBClasses 6 | 7 | 8 | CLASS 9 | SUWindowController 10 | LANGUAGE 11 | ObjC 12 | SUPERCLASS 13 | NSWindowController 14 | 15 | 16 | ACTIONS 17 | 18 | doNotInstall 19 | id 20 | installLater 21 | id 22 | installNow 23 | id 24 | 25 | CLASS 26 | SUAutomaticUpdateAlert 27 | LANGUAGE 28 | ObjC 29 | SUPERCLASS 30 | SUWindowController 31 | 32 | 33 | CLASS 34 | FirstResponder 35 | LANGUAGE 36 | ObjC 37 | SUPERCLASS 38 | NSObject 39 | 40 | 41 | CLASS 42 | NSObject 43 | LANGUAGE 44 | ObjC 45 | 46 | 47 | IBVersion 48 | 1 49 | 50 | 51 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/classes.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBClasses 6 | 7 | 8 | CLASS 9 | SUWindowController 10 | LANGUAGE 11 | ObjC 12 | SUPERCLASS 13 | NSWindowController 14 | 15 | 16 | ACTIONS 17 | 18 | doNotInstall 19 | id 20 | installLater 21 | id 22 | installNow 23 | id 24 | 25 | CLASS 26 | SUAutomaticUpdateAlert 27 | LANGUAGE 28 | ObjC 29 | SUPERCLASS 30 | SUWindowController 31 | 32 | 33 | CLASS 34 | FirstResponder 35 | LANGUAGE 36 | ObjC 37 | SUPERCLASS 38 | NSObject 39 | 40 | 41 | CLASS 42 | NSObject 43 | LANGUAGE 44 | ObjC 45 | 46 | 47 | IBVersion 48 | 1 49 | 50 | 51 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/classes.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBClasses 6 | 7 | 8 | CLASS 9 | SUWindowController 10 | LANGUAGE 11 | ObjC 12 | SUPERCLASS 13 | NSWindowController 14 | 15 | 16 | ACTIONS 17 | 18 | doNotInstall 19 | id 20 | installLater 21 | id 22 | installNow 23 | id 24 | 25 | CLASS 26 | SUAutomaticUpdateAlert 27 | LANGUAGE 28 | ObjC 29 | SUPERCLASS 30 | SUWindowController 31 | 32 | 33 | CLASS 34 | FirstResponder 35 | LANGUAGE 36 | ObjC 37 | SUPERCLASS 38 | NSObject 39 | 40 | 41 | CLASS 42 | NSObject 43 | LANGUAGE 44 | ObjC 45 | 46 | 47 | IBVersion 48 | 1 49 | 50 | 51 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/classes.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBClasses 6 | 7 | 8 | CLASS 9 | SUWindowController 10 | LANGUAGE 11 | ObjC 12 | SUPERCLASS 13 | NSWindowController 14 | 15 | 16 | ACTIONS 17 | 18 | doNotInstall 19 | id 20 | installLater 21 | id 22 | installNow 23 | id 24 | 25 | CLASS 26 | SUAutomaticUpdateAlert 27 | LANGUAGE 28 | ObjC 29 | SUPERCLASS 30 | SUWindowController 31 | 32 | 33 | CLASS 34 | FirstResponder 35 | LANGUAGE 36 | ObjC 37 | SUPERCLASS 38 | NSObject 39 | 40 | 41 | CLASS 42 | NSObject 43 | LANGUAGE 44 | ObjC 45 | 46 | 47 | IBVersion 48 | 1 49 | 50 | 51 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/classes.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBClasses 6 | 7 | 8 | CLASS 9 | SUWindowController 10 | LANGUAGE 11 | ObjC 12 | SUPERCLASS 13 | NSWindowController 14 | 15 | 16 | ACTIONS 17 | 18 | doNotInstall 19 | id 20 | installLater 21 | id 22 | installNow 23 | id 24 | 25 | CLASS 26 | SUAutomaticUpdateAlert 27 | LANGUAGE 28 | ObjC 29 | SUPERCLASS 30 | SUWindowController 31 | 32 | 33 | CLASS 34 | FirstResponder 35 | LANGUAGE 36 | ObjC 37 | SUPERCLASS 38 | NSObject 39 | 40 | 41 | CLASS 42 | NSObject 43 | LANGUAGE 44 | ObjC 45 | 46 | 47 | IBVersion 48 | 1 49 | 50 | 51 | -------------------------------------------------------------------------------- /Growler.m: -------------------------------------------------------------------------------- 1 | // 2 | // Growler.m 3 | // Incoming PrefPane 4 | // 5 | // Created by Tyler Hall on 8/23/10. 6 | // Copyright 2010 Click On Tyler, LLC. All rights reserved. 7 | // 8 | 9 | #import "Growler.h" 10 | 11 | static Growler *sharedGrowler; 12 | 13 | @implementation Growler 14 | 15 | - (id)init 16 | { 17 | self = [super init]; 18 | [GrowlApplicationBridge setGrowlDelegate:self]; 19 | return self; 20 | } 21 | 22 | + (Growler *)sharedGrowler 23 | { 24 | if(sharedGrowler == nil) 25 | sharedGrowler = [[Growler alloc] init]; 26 | return sharedGrowler; 27 | } 28 | 29 | - (NSDictionary *)registrationDictionaryForGrowl 30 | { 31 | NSArray *notes = [NSArray arrayWithObjects:@"Incoming Voice Call", @"Incoming Video Call", @"New Chat Message", nil]; 32 | return [NSDictionary dictionaryWithObjectsAndKeys:notes, GROWL_NOTIFICATIONS_ALL, notes, GROWL_NOTIFICATIONS_DEFAULT, nil]; 33 | } 34 | 35 | - (void)growlWithTitle:(NSString *)title 36 | description:(NSString *)description 37 | notificationName:(NSString *)notificationName 38 | iconData:(NSData *)iconData 39 | context:(id)context 40 | { 41 | [GrowlApplicationBridge notifyWithTitle:title 42 | description:description 43 | notificationName:notificationName 44 | iconData:iconData 45 | priority:0 46 | isSticky:NO 47 | clickContext:context]; 48 | } 49 | 50 | - (void)growlNotificationWasClicked:(id)clickContext 51 | { 52 | [NSApp activateIgnoringOtherApps:YES]; 53 | } 54 | 55 | @end 56 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/SUStatus.nib/classes.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBClasses 6 | 7 | 8 | CLASS 9 | SUWindowController 10 | LANGUAGE 11 | ObjC 12 | SUPERCLASS 13 | NSWindowController 14 | 15 | 16 | CLASS 17 | NSApplication 18 | LANGUAGE 19 | ObjC 20 | SUPERCLASS 21 | NSResponder 22 | 23 | 24 | CLASS 25 | FirstResponder 26 | LANGUAGE 27 | ObjC 28 | SUPERCLASS 29 | NSObject 30 | 31 | 32 | CLASS 33 | NSObject 34 | LANGUAGE 35 | ObjC 36 | 37 | 38 | CLASS 39 | SUStatusController 40 | LANGUAGE 41 | ObjC 42 | OUTLETS 43 | 44 | actionButton 45 | NSButton 46 | progressBar 47 | NSProgressIndicator 48 | 49 | SUPERCLASS 50 | SUWindowController 51 | 52 | 53 | IBVersion 54 | 1 55 | 56 | 57 | -------------------------------------------------------------------------------- /Credits.rtf: -------------------------------------------------------------------------------- 1 | {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320 2 | {\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fnil\fcharset0 Monaco;} 3 | {\colortbl;\red255\green255\blue255;\red0\green0\blue0;} 4 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural 5 | {\field{\*\fldinst{HYPERLINK "http://github.com/tylerhall/Gmail-SSB"}}{\fldrslt 6 | \f0\fs24 \cf0 http://github.com/tylerhall/Gmail-SSB}} 7 | \f1\fs20 \cf2 \ 8 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural 9 | \cf2 \ 10 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural 11 | 12 | \f0\fs24 \cf0 Apologies to Google - I'll come up with a non-infringing name soon. 13 | \f1\fs20 \cf2 \ 14 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural 15 | \cf2 \ 16 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural 17 | 18 | \f0\b\fs24 \cf0 Open Source Software\ 19 | 20 | \b0 \ 21 | Gmail-SSB makes use of the following open source software projects and graciously thanks their authors for all the hard work.\ 22 | \ 23 | RegexKitLit\ 24 | {\field{\*\fldinst{HYPERLINK "http://regexkit.sourceforge.net/RegexKitLite/index.html"}}{\fldrslt http://regexkit.sourceforge.net/RegexKitLite/index.html}}\ 25 | \ 26 | Sparkle by Andy Matuschak\ 27 | {\field{\*\fldinst{HYPERLINK "http://sparkle.andymatuschak.org/"}}{\fldrslt http://sparkle.andymatuschak.org/}}\ 28 | \ 29 | Growl\ 30 | {\field{\*\fldinst{HYPERLINK "http://growl.info/"}}{\fldrslt http://growl.info/}}} -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib/classes.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBClasses 6 | 7 | 8 | CLASS 9 | SUWindowController 10 | LANGUAGE 11 | ObjC 12 | SUPERCLASS 13 | NSWindowController 14 | 15 | 16 | ACTIONS 17 | 18 | finishPrompt 19 | id 20 | toggleMoreInfo 21 | id 22 | 23 | CLASS 24 | SUUpdatePermissionPrompt 25 | LANGUAGE 26 | ObjC 27 | OUTLETS 28 | 29 | delegate 30 | id 31 | descriptionTextField 32 | NSTextField 33 | moreInfoButton 34 | NSButton 35 | moreInfoView 36 | NSView 37 | 38 | SUPERCLASS 39 | SUWindowController 40 | 41 | 42 | CLASS 43 | FirstResponder 44 | LANGUAGE 45 | ObjC 46 | SUPERCLASS 47 | NSObject 48 | 49 | 50 | CLASS 51 | NSObject 52 | LANGUAGE 53 | ObjC 54 | 55 | 56 | IBVersion 57 | 1 58 | 59 | 60 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib/classes.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBClasses 6 | 7 | 8 | CLASS 9 | SUWindowController 10 | LANGUAGE 11 | ObjC 12 | SUPERCLASS 13 | NSWindowController 14 | 15 | 16 | ACTIONS 17 | 18 | finishPrompt 19 | id 20 | toggleMoreInfo 21 | id 22 | 23 | CLASS 24 | SUUpdatePermissionPrompt 25 | LANGUAGE 26 | ObjC 27 | OUTLETS 28 | 29 | delegate 30 | id 31 | descriptionTextField 32 | NSTextField 33 | moreInfoButton 34 | NSButton 35 | moreInfoView 36 | NSView 37 | 38 | SUPERCLASS 39 | SUWindowController 40 | 41 | 42 | CLASS 43 | FirstResponder 44 | LANGUAGE 45 | ObjC 46 | SUPERCLASS 47 | NSObject 48 | 49 | 50 | CLASS 51 | NSObject 52 | LANGUAGE 53 | ObjC 54 | 55 | 56 | IBVersion 57 | 1 58 | 59 | 60 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib/classes.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBClasses 6 | 7 | 8 | CLASS 9 | SUWindowController 10 | LANGUAGE 11 | ObjC 12 | SUPERCLASS 13 | NSWindowController 14 | 15 | 16 | ACTIONS 17 | 18 | finishPrompt 19 | id 20 | toggleMoreInfo 21 | id 22 | 23 | CLASS 24 | SUUpdatePermissionPrompt 25 | LANGUAGE 26 | ObjC 27 | OUTLETS 28 | 29 | delegate 30 | id 31 | descriptionTextField 32 | NSTextField 33 | moreInfoButton 34 | NSButton 35 | moreInfoView 36 | NSView 37 | 38 | SUPERCLASS 39 | SUWindowController 40 | 41 | 42 | CLASS 43 | FirstResponder 44 | LANGUAGE 45 | ObjC 46 | SUPERCLASS 47 | NSObject 48 | 49 | 50 | CLASS 51 | NSObject 52 | LANGUAGE 53 | ObjC 54 | 55 | 56 | IBVersion 57 | 1 58 | 59 | 60 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/classes.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBClasses 6 | 7 | 8 | CLASS 9 | SUWindowController 10 | LANGUAGE 11 | ObjC 12 | SUPERCLASS 13 | NSWindowController 14 | 15 | 16 | ACTIONS 17 | 18 | finishPrompt 19 | id 20 | toggleMoreInfo 21 | id 22 | 23 | CLASS 24 | SUUpdatePermissionPrompt 25 | LANGUAGE 26 | ObjC 27 | OUTLETS 28 | 29 | delegate 30 | id 31 | descriptionTextField 32 | NSTextField 33 | moreInfoButton 34 | NSButton 35 | moreInfoView 36 | NSView 37 | 38 | SUPERCLASS 39 | SUWindowController 40 | 41 | 42 | CLASS 43 | FirstResponder 44 | LANGUAGE 45 | ObjC 46 | SUPERCLASS 47 | NSObject 48 | 49 | 50 | CLASS 51 | NSObject 52 | LANGUAGE 53 | ObjC 54 | 55 | 56 | IBVersion 57 | 1 58 | 59 | 60 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib/classes.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBClasses 6 | 7 | 8 | CLASS 9 | SUWindowController 10 | LANGUAGE 11 | ObjC 12 | SUPERCLASS 13 | NSWindowController 14 | 15 | 16 | ACTIONS 17 | 18 | finishPrompt 19 | id 20 | toggleMoreInfo 21 | id 22 | 23 | CLASS 24 | SUUpdatePermissionPrompt 25 | LANGUAGE 26 | ObjC 27 | OUTLETS 28 | 29 | delegate 30 | id 31 | descriptionTextField 32 | NSTextField 33 | moreInfoButton 34 | NSButton 35 | moreInfoView 36 | NSView 37 | 38 | SUPERCLASS 39 | SUWindowController 40 | 41 | 42 | CLASS 43 | FirstResponder 44 | LANGUAGE 45 | ObjC 46 | SUPERCLASS 47 | NSObject 48 | 49 | 50 | CLASS 51 | NSObject 52 | LANGUAGE 53 | ObjC 54 | 55 | 56 | IBVersion 57 | 1 58 | 59 | 60 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/classes.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBClasses 6 | 7 | 8 | CLASS 9 | SUWindowController 10 | LANGUAGE 11 | ObjC 12 | SUPERCLASS 13 | NSWindowController 14 | 15 | 16 | ACTIONS 17 | 18 | finishPrompt 19 | id 20 | toggleMoreInfo 21 | id 22 | 23 | CLASS 24 | SUUpdatePermissionPrompt 25 | LANGUAGE 26 | ObjC 27 | OUTLETS 28 | 29 | delegate 30 | id 31 | descriptionTextField 32 | NSTextField 33 | moreInfoButton 34 | NSButton 35 | moreInfoView 36 | NSView 37 | 38 | SUPERCLASS 39 | SUWindowController 40 | 41 | 42 | CLASS 43 | FirstResponder 44 | LANGUAGE 45 | ObjC 46 | SUPERCLASS 47 | NSObject 48 | 49 | 50 | CLASS 51 | NSObject 52 | LANGUAGE 53 | ObjC 54 | 55 | 56 | IBVersion 57 | 1 58 | 59 | 60 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/classes.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBClasses 6 | 7 | 8 | CLASS 9 | NSObject 10 | LANGUAGE 11 | ObjC 12 | 13 | 14 | CLASS 15 | SUWindowController 16 | LANGUAGE 17 | ObjC 18 | SUPERCLASS 19 | NSWindowController 20 | 21 | 22 | ACTIONS 23 | 24 | finishPrompt 25 | id 26 | toggleMoreInfo 27 | id 28 | 29 | CLASS 30 | SUUpdatePermissionPrompt 31 | LANGUAGE 32 | ObjC 33 | OUTLETS 34 | 35 | delegate 36 | id 37 | descriptionTextField 38 | NSTextField 39 | moreInfoButton 40 | NSButton 41 | moreInfoView 42 | NSView 43 | 44 | SUPERCLASS 45 | SUWindowController 46 | 47 | 48 | CLASS 49 | FirstResponder 50 | LANGUAGE 51 | ObjC 52 | SUPERCLASS 53 | NSObject 54 | 55 | 56 | IBVersion 57 | 1 58 | 59 | 60 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/classes.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBClasses 6 | 7 | 8 | CLASS 9 | SUWindowController 10 | LANGUAGE 11 | ObjC 12 | SUPERCLASS 13 | NSWindowController 14 | 15 | 16 | ACTIONS 17 | 18 | finishPrompt 19 | id 20 | toggleMoreInfo 21 | id 22 | 23 | CLASS 24 | SUUpdatePermissionPrompt 25 | LANGUAGE 26 | ObjC 27 | OUTLETS 28 | 29 | delegate 30 | id 31 | descriptionTextField 32 | NSTextField 33 | moreInfoButton 34 | NSButton 35 | moreInfoView 36 | NSView 37 | 38 | SUPERCLASS 39 | SUWindowController 40 | 41 | 42 | CLASS 43 | FirstResponder 44 | LANGUAGE 45 | ObjC 46 | SUPERCLASS 47 | NSObject 48 | 49 | 50 | CLASS 51 | NSObject 52 | LANGUAGE 53 | ObjC 54 | 55 | 56 | IBVersion 57 | 1 58 | 59 | 60 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/classes.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBClasses 6 | 7 | 8 | CLASS 9 | SUWindowController 10 | LANGUAGE 11 | ObjC 12 | SUPERCLASS 13 | NSWindowController 14 | 15 | 16 | CLASS 17 | NSApplication 18 | LANGUAGE 19 | ObjC 20 | SUPERCLASS 21 | NSResponder 22 | 23 | 24 | ACTIONS 25 | 26 | installUpdate 27 | id 28 | remindMeLater 29 | id 30 | skipThisVersion 31 | id 32 | 33 | CLASS 34 | SUUpdateAlert 35 | LANGUAGE 36 | ObjC 37 | OUTLETS 38 | 39 | delegate 40 | id 41 | description 42 | NSTextField 43 | releaseNotesView 44 | WebView 45 | 46 | SUPERCLASS 47 | SUWindowController 48 | 49 | 50 | CLASS 51 | FirstResponder 52 | LANGUAGE 53 | ObjC 54 | SUPERCLASS 55 | NSObject 56 | 57 | 58 | CLASS 59 | NSObject 60 | LANGUAGE 61 | ObjC 62 | 63 | 64 | IBVersion 65 | 1 66 | 67 | 68 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/classes.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBClasses 6 | 7 | 8 | CLASS 9 | SUWindowController 10 | LANGUAGE 11 | ObjC 12 | SUPERCLASS 13 | NSWindowController 14 | 15 | 16 | CLASS 17 | NSApplication 18 | LANGUAGE 19 | ObjC 20 | SUPERCLASS 21 | NSResponder 22 | 23 | 24 | ACTIONS 25 | 26 | installUpdate 27 | id 28 | remindMeLater 29 | id 30 | skipThisVersion 31 | id 32 | 33 | CLASS 34 | SUUpdateAlert 35 | LANGUAGE 36 | ObjC 37 | OUTLETS 38 | 39 | delegate 40 | id 41 | description 42 | NSTextField 43 | releaseNotesView 44 | WebView 45 | 46 | SUPERCLASS 47 | SUWindowController 48 | 49 | 50 | CLASS 51 | FirstResponder 52 | LANGUAGE 53 | ObjC 54 | SUPERCLASS 55 | NSObject 56 | 57 | 58 | CLASS 59 | NSObject 60 | LANGUAGE 61 | ObjC 62 | 63 | 64 | IBVersion 65 | 1 66 | 67 | 68 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/classes.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBClasses 6 | 7 | 8 | CLASS 9 | SUWindowController 10 | LANGUAGE 11 | ObjC 12 | SUPERCLASS 13 | NSWindowController 14 | 15 | 16 | CLASS 17 | NSApplication 18 | LANGUAGE 19 | ObjC 20 | SUPERCLASS 21 | NSResponder 22 | 23 | 24 | ACTIONS 25 | 26 | installUpdate 27 | id 28 | remindMeLater 29 | id 30 | skipThisVersion 31 | id 32 | 33 | CLASS 34 | SUUpdateAlert 35 | LANGUAGE 36 | ObjC 37 | OUTLETS 38 | 39 | delegate 40 | id 41 | description 42 | NSTextField 43 | releaseNotesView 44 | WebView 45 | 46 | SUPERCLASS 47 | SUWindowController 48 | 49 | 50 | CLASS 51 | FirstResponder 52 | LANGUAGE 53 | ObjC 54 | SUPERCLASS 55 | NSObject 56 | 57 | 58 | CLASS 59 | NSObject 60 | LANGUAGE 61 | ObjC 62 | 63 | 64 | IBVersion 65 | 1 66 | 67 | 68 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/classes.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBClasses 6 | 7 | 8 | CLASS 9 | SUWindowController 10 | LANGUAGE 11 | ObjC 12 | SUPERCLASS 13 | NSWindowController 14 | 15 | 16 | CLASS 17 | NSApplication 18 | LANGUAGE 19 | ObjC 20 | SUPERCLASS 21 | NSResponder 22 | 23 | 24 | ACTIONS 25 | 26 | installUpdate 27 | id 28 | remindMeLater 29 | id 30 | skipThisVersion 31 | id 32 | 33 | CLASS 34 | SUUpdateAlert 35 | LANGUAGE 36 | ObjC 37 | OUTLETS 38 | 39 | delegate 40 | id 41 | description 42 | NSTextField 43 | releaseNotesView 44 | WebView 45 | 46 | SUPERCLASS 47 | SUWindowController 48 | 49 | 50 | CLASS 51 | FirstResponder 52 | LANGUAGE 53 | ObjC 54 | SUPERCLASS 55 | NSObject 56 | 57 | 58 | CLASS 59 | NSObject 60 | LANGUAGE 61 | ObjC 62 | 63 | 64 | IBVersion 65 | 1 66 | 67 | 68 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/classes.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBClasses 6 | 7 | 8 | CLASS 9 | SUWindowController 10 | LANGUAGE 11 | ObjC 12 | SUPERCLASS 13 | NSWindowController 14 | 15 | 16 | CLASS 17 | NSApplication 18 | LANGUAGE 19 | ObjC 20 | SUPERCLASS 21 | NSResponder 22 | 23 | 24 | ACTIONS 25 | 26 | installUpdate 27 | id 28 | remindMeLater 29 | id 30 | skipThisVersion 31 | id 32 | 33 | CLASS 34 | SUUpdateAlert 35 | LANGUAGE 36 | ObjC 37 | OUTLETS 38 | 39 | delegate 40 | id 41 | description 42 | NSTextField 43 | releaseNotesView 44 | WebView 45 | 46 | SUPERCLASS 47 | SUWindowController 48 | 49 | 50 | CLASS 51 | FirstResponder 52 | LANGUAGE 53 | ObjC 54 | SUPERCLASS 55 | NSObject 56 | 57 | 58 | CLASS 59 | NSObject 60 | LANGUAGE 61 | ObjC 62 | 63 | 64 | IBVersion 65 | 1 66 | 67 | 68 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/classes.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBClasses 6 | 7 | 8 | CLASS 9 | SUWindowController 10 | LANGUAGE 11 | ObjC 12 | SUPERCLASS 13 | NSWindowController 14 | 15 | 16 | CLASS 17 | NSApplication 18 | LANGUAGE 19 | ObjC 20 | SUPERCLASS 21 | NSResponder 22 | 23 | 24 | ACTIONS 25 | 26 | installUpdate 27 | id 28 | remindMeLater 29 | id 30 | skipThisVersion 31 | id 32 | 33 | CLASS 34 | SUUpdateAlert 35 | LANGUAGE 36 | ObjC 37 | OUTLETS 38 | 39 | delegate 40 | id 41 | description 42 | NSTextField 43 | releaseNotesView 44 | WebView 45 | 46 | SUPERCLASS 47 | SUWindowController 48 | 49 | 50 | CLASS 51 | FirstResponder 52 | LANGUAGE 53 | ObjC 54 | SUPERCLASS 55 | NSObject 56 | 57 | 58 | CLASS 59 | NSObject 60 | LANGUAGE 61 | ObjC 62 | 63 | 64 | IBVersion 65 | 1 66 | 67 | 68 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/classes.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBClasses 6 | 7 | 8 | CLASS 9 | SUWindowController 10 | LANGUAGE 11 | ObjC 12 | SUPERCLASS 13 | NSWindowController 14 | 15 | 16 | CLASS 17 | NSApplication 18 | LANGUAGE 19 | ObjC 20 | SUPERCLASS 21 | NSResponder 22 | 23 | 24 | ACTIONS 25 | 26 | installUpdate 27 | id 28 | remindMeLater 29 | id 30 | skipThisVersion 31 | id 32 | 33 | CLASS 34 | SUUpdateAlert 35 | LANGUAGE 36 | ObjC 37 | OUTLETS 38 | 39 | delegate 40 | id 41 | description 42 | NSTextField 43 | releaseNotesView 44 | WebView 45 | 46 | SUPERCLASS 47 | SUWindowController 48 | 49 | 50 | CLASS 51 | FirstResponder 52 | LANGUAGE 53 | ObjC 54 | SUPERCLASS 55 | NSObject 56 | 57 | 58 | CLASS 59 | NSObject 60 | LANGUAGE 61 | ObjC 62 | 63 | 64 | IBVersion 65 | 1 66 | 67 | 68 | -------------------------------------------------------------------------------- /NullRequestHandler.m: -------------------------------------------------------------------------------- 1 | // 2 | // NullRequestHandler.m 3 | // Gmail 4 | // 5 | // Created by Tyler Hall on 8/26/10. 6 | // Copyright 2010 Click On Tyler, LLC. All rights reserved. 7 | // 8 | 9 | #import "NullRequestHandler.h" 10 | #import "GmailWindowController.h" 11 | 12 | @implementation NullRequestHandler 13 | 14 | - (id)init { 15 | self = [super init]; 16 | webView = [[WebView alloc] init]; 17 | [webView setGroupName:@"Gmail"]; 18 | [webView setDownloadDelegate:self]; 19 | [webView setFrameLoadDelegate:self]; 20 | [webView setPolicyDelegate:self]; 21 | [webView setResourceLoadDelegate:self]; 22 | [webView setUIDelegate:self]; 23 | [[webView preferences] setDefaultFontSize:16]; 24 | [[webView mainFrame] loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://mail.google.com"]]]; 25 | [webView setCustomUserAgent:@"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-us) AppleWebKit/533.17.8 (KHTML, like Gecko) Version/5.0.1 Safari/533.17.8"]; 26 | return self; 27 | } 28 | 29 | - (WebView *)webView { 30 | return webView; 31 | } 32 | 33 | - (void)loadRequest:(NSURLRequest *)request { 34 | [[webView mainFrame] loadRequest:request]; 35 | } 36 | 37 | - (void)webView:(WebView *)sender didStartProvisionalLoadForFrame:(WebFrame *)frame { 38 | if(frame == [sender mainFrame]) { 39 | NSString *url = [sender mainFrameURL]; 40 | if(url && [url length] > 0) { 41 | if(![url isEqualToString:@"https://mail.google.com/"]) { 42 | GmailWindowController *newWindowController = [[GmailWindowController alloc] initWithWebView:webView]; 43 | [newWindowController showWindow:self]; 44 | } 45 | } 46 | } 47 | } 48 | 49 | - (void)webView:(WebView *)sender decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id)listener { 50 | NSString *urlStr = [[request URL] absoluteString]; 51 | if(request) { 52 | NSRange range = [urlStr rangeOfString:@"google.com"]; 53 | if(range.location == NSNotFound) { 54 | [listener ignore]; 55 | [[NSWorkspace sharedWorkspace] openURL:[request URL]]; 56 | } 57 | } 58 | 59 | [listener use]; 60 | } 61 | 62 | @end 63 | -------------------------------------------------------------------------------- /SafariBar.m: -------------------------------------------------------------------------------- 1 | // 2 | // SafariBar.m 3 | // Gmail 4 | // 5 | // Created by Tyler Hall on 8/27/10. 6 | // Copyright 2010 Click On Tyler, LLC. All rights reserved. 7 | // 8 | 9 | #import "SafariBar.h" 10 | 11 | 12 | @implementation SafariBar 13 | 14 | - (void)drawRect:(NSRect )aRect { 15 | NSBezierPath *path; 16 | NSGradient *gradient; 17 | 18 | // Top Border 19 | path = [[NSBezierPath alloc] init]; 20 | [[NSColor colorWithDeviceWhite:0 alpha:1.0] set]; 21 | [path setLineWidth:1.0]; 22 | [path moveToPoint:NSMakePoint(aRect.origin.x, aRect.origin.y + aRect.size.height)]; 23 | [path lineToPoint:NSMakePoint(aRect.origin.x + aRect.size.width, aRect.origin.y + aRect.size.height)]; 24 | [path stroke]; 25 | 26 | // Top Border 2 27 | path = [[NSBezierPath alloc] init]; 28 | [[NSColor colorWithDeviceWhite:0.8156 alpha:1.0] set]; 29 | [path setLineWidth:1.0]; 30 | [path moveToPoint:NSMakePoint(aRect.origin.x, aRect.origin.y + aRect.size.height - 1)]; 31 | [path lineToPoint:NSMakePoint(aRect.origin.x + aRect.size.width, aRect.origin.y + aRect.size.height - 1)]; 32 | [path stroke]; 33 | 34 | // Middle gradient 35 | gradient = [[NSGradient alloc] initWithStartingColor:[NSColor colorWithDeviceRed:0.6901 green:0.6901 blue:0.6901 alpha:1.0] 36 | endingColor:[NSColor colorWithDeviceRed:0.6549 green:0.6549 blue:0.6549 alpha:1.0]]; 37 | NSRect topRect = aRect; 38 | topRect.origin.y += 1; 39 | topRect.size.height -= 3; 40 | [gradient drawInRect:topRect angle:90]; 41 | 42 | // Bottom Border 43 | path = [[NSBezierPath alloc] init]; 44 | [[NSColor colorWithDeviceWhite:0.4666 alpha:1.0] set]; 45 | [path setLineWidth:1.0]; 46 | [path moveToPoint:NSMakePoint(aRect.origin.x, aRect.origin.y)]; 47 | [path lineToPoint:NSMakePoint(aRect.origin.x + aRect.size.width, aRect.origin.y)]; 48 | [path stroke]; 49 | 50 | // Status Text 51 | if(stringValue && [stringValue length] > 0) { 52 | NSFont *font = [NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]; 53 | 54 | NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:font, NSFontAttributeName, 55 | [NSColor colorWithDeviceWhite:0 alpha:1.0], NSForegroundColorAttributeName, nil]; 56 | 57 | NSAttributedString *str = [[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"Go to %@", stringValue] attributes:dict]; 58 | [str drawInRect:NSMakeRect(12, -2, aRect.size.width, aRect.size.height)]; 59 | } 60 | } 61 | 62 | - (void)setStringValue:(NSString *)newStringValue { 63 | stringValue = [NSString stringWithString:newStringValue]; 64 | [self setNeedsDisplay:YES]; 65 | } 66 | 67 | @end 68 | -------------------------------------------------------------------------------- /README.markdown: -------------------------------------------------------------------------------- 1 | Gmail-SSB 2 | ========= 3 | 4 | Gmail-SSB is a [site-specific browser](http://en.wikipedia.org/wiki/Site-specific_browser) for Gmail that's optimized for Google's fancy-schmancy voice/video calls. There are better Gmail SSBs out there, such as [Mailplane](http://mailplaneapp.com/). Or you could roll your own using [Fluid.app](http://fluidapp.com/). Unfortunately, neither of those quite fit my needs: 5 | 6 | * Mailplane has a ton of features, but none of which I need. I'm already super-productive using Gmail's native shortcut keys. 7 | * Fluid is also great at what it does. Sadly, closing the Fluid window releases the WebView, which kills any voice/video conversations you have open. 8 | 9 | Gmail-SSB addresses these issues so I can work safely in Safari without fear of accidentally closing my Gmail tab during a call. 10 | 11 | FEATURES 12 | -------- 13 | 14 | * Dedicated app just for Gmail. Non-Gmail links automatically open in your real web browser. 15 | * Open/close/hide/minimize the app without disconnecting your voice/video calls. 16 | * Incoming calls will ring in the background even if the window is closed. 17 | * Growl notifications for incoming voice/video calls. (Also bounces the dock.) 18 | * Dock badge shows unread email count. 19 | * Sparkle updates 20 | 21 | DOWNLOAD 22 | -------- 23 | 24 | You can download the [latest version here](http://shine.clickontyler.com/download.php?id=7). 25 | 26 | UPDATES 27 | ------- 28 | 29 | Code is hosted at GitHub: [http://github.com/tylerhall/Gmail-SSB](http://github.com/tylerhall/Gmail-SB). Updates will be automatically pushed out in-app via Sparkle. Or you can always download the latest code and build it yourself. 30 | 31 | LICENSE 32 | ------- 33 | 34 | The MIT License 35 | 36 | Copyright (c) 2010 Tyler Hall 37 | 38 | Permission is hereby granted, free of charge, to any person obtaining a copy 39 | of this software and associated documentation files (the "Software"), to deal 40 | in the Software without restriction, including without limitation the rights 41 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 42 | copies of the Software, and to permit persons to whom the Software is 43 | furnished to do so, subject to the following conditions: 44 | 45 | The above copyright notice and this permission notice shall be included in 46 | all copies or substantial portions of the Software. 47 | 48 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 49 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 50 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 51 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 52 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 53 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 54 | THE SOFTWARE. 55 | -------------------------------------------------------------------------------- /GmailAppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // GmailAppDelegate.m 3 | // Gmail 4 | // 5 | // Created by Tyler Hall on 8/26/10. 6 | // Copyright 2010 Click On Tyler, LLC. All rights reserved. 7 | // 8 | 9 | #import "GmailAppDelegate.h" 10 | #import "GmailWindowController.h" 11 | 12 | @implementation GmailAppDelegate 13 | 14 | - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 15 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(incomingCall:) name:@"INCOMING_CALL" object:nil]; 16 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(incomingVideo:) name:@"INCOMING_VIDEO" object:nil]; 17 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(incomingChat:) name:@"INCOMING_CHAT" object:nil]; 18 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(unreadCountChanged:) name:@"UNREAD_COUNT_CHANGED" object:nil]; 19 | 20 | mainWindowController = [[GmailWindowController alloc] initWithWindowNibName:@"GmailWindow"]; 21 | [mainWindowController showWindow:self]; 22 | } 23 | 24 | - (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender { 25 | [self showMainWindow:self]; 26 | return NO; 27 | } 28 | 29 | - (IBAction)showMainWindow:(id)sender { 30 | [[mainWindowController window] setIsVisible:YES]; 31 | } 32 | 33 | - (IBAction)toggleFullscreen:(id)sender { 34 | [mainWindowController toggleFullscreen]; 35 | } 36 | 37 | - (void)incomingCall:(NSNotification *)notification { 38 | [NSApp requestUserAttention:NSCriticalRequest]; 39 | 40 | if(voiceBounce) { 41 | NSData *iconData = [[NSImage imageNamed:@"Icon"] TIFFRepresentation]; 42 | [[Growler sharedGrowler] growlWithTitle:@"Incoming Voice Call" 43 | description:@"You have an incoming Gmail voice call." 44 | notificationName:@"Incoming Voice Call" 45 | iconData:iconData 46 | context:@"call"]; 47 | voiceBounce = NO; 48 | } 49 | } 50 | 51 | - (void)incomingVideo:(NSNotification *)notification { 52 | [NSApp requestUserAttention:NSCriticalRequest]; 53 | 54 | if(videoBounce) { 55 | NSData *iconData = [[NSImage imageNamed:@"Icon"] TIFFRepresentation]; 56 | [[Growler sharedGrowler] growlWithTitle:@"Incoming Video Call" 57 | description:@"You have an incoming Gmail video call." 58 | notificationName:@"Incoming Video Call" 59 | iconData:iconData 60 | context:@"video"]; 61 | videoBounce = NO; 62 | } 63 | } 64 | 65 | - (void)incomingChat:(NSNotification *)notification { 66 | if(![NSApp isActive] && chatBounce) { 67 | [NSApp requestUserAttention:NSInformationalRequest]; 68 | NSData *iconData = [[NSImage imageNamed:@"Icon"] TIFFRepresentation]; 69 | [[Growler sharedGrowler] growlWithTitle:@"New Chat Message" 70 | description:@"You have a new Google Talk message." 71 | notificationName:@"New Chat Message" 72 | iconData:iconData 73 | context:@"chat"]; 74 | chatBounce = NO; 75 | } 76 | } 77 | 78 | - (void)unreadCountChanged:(NSNotification *)notification { 79 | if([notification userInfo] == nil) { 80 | [[NSApp dockTile] setBadgeLabel:@""]; 81 | } else { 82 | int count = [[[notification userInfo] valueForKey:@"count"] intValue]; 83 | if(count == 0) 84 | [[NSApp dockTile] setBadgeLabel:@""]; 85 | else 86 | [[NSApp dockTile] setBadgeLabel:[NSString stringWithFormat:@"%d", count]]; 87 | } 88 | 89 | } 90 | 91 | - (void)applicationDidBecomeActive:(NSNotification *)notification { 92 | [NSApp setApplicationIconImage:[NSImage imageNamed:@"Icon"]]; 93 | voiceBounce = YES; 94 | videoBounce = YES; 95 | chatBounce = YES; 96 | } 97 | 98 | @end 99 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Headers/SUUpdater.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUUpdater.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 1/4/06. 6 | // Copyright 2006 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #ifndef SUUPDATER_H 10 | #define SUUPDATER_H 11 | 12 | #import 13 | 14 | @class SUUpdateDriver, SUAppcastItem, SUHost, SUAppcast; 15 | @interface SUUpdater : NSObject { 16 | NSTimer *checkTimer; 17 | SUUpdateDriver *driver; 18 | 19 | SUHost *host; 20 | IBOutlet id delegate; 21 | } 22 | 23 | + (SUUpdater *)sharedUpdater; 24 | + (SUUpdater *)updaterForBundle:(NSBundle *)bundle; 25 | - (NSBundle *)hostBundle; 26 | 27 | - (void)setDelegate:(id)delegate; 28 | - delegate; 29 | 30 | - (void)setAutomaticallyChecksForUpdates:(BOOL)automaticallyChecks; 31 | - (BOOL)automaticallyChecksForUpdates; 32 | 33 | - (void)setUpdateCheckInterval:(NSTimeInterval)interval; 34 | - (NSTimeInterval)updateCheckInterval; 35 | 36 | - (void)setFeedURL:(NSURL *)feedURL; 37 | - (NSURL *)feedURL; 38 | 39 | - (void)setSendsSystemProfile:(BOOL)sendsSystemProfile; 40 | - (BOOL)sendsSystemProfile; 41 | 42 | - (void)setAutomaticallyDownloadsUpdates:(BOOL)automaticallyDownloadsUpdates; 43 | - (BOOL)automaticallyDownloadsUpdates; 44 | 45 | // This IBAction is meant for a main menu item. Hook up any menu item to this action, 46 | // and Sparkle will check for updates and report back its findings verbosely. 47 | - (IBAction)checkForUpdates:sender; 48 | 49 | // This kicks off an update meant to be programmatically initiated. That is, it will display no UI unless it actually finds an update, 50 | // in which case it proceeds as usual. If the fully automated updating is turned on, however, this will invoke that behavior, and if an 51 | // update is found, it will be downloaded and prepped for installation. 52 | - (void)checkForUpdatesInBackground; 53 | 54 | // Date of last update check. Returns null if no check has been performed. 55 | - (NSDate*)lastUpdateCheckDate; 56 | 57 | // This begins a "probing" check for updates which will not actually offer to update to that version. The delegate methods, though, 58 | // (up to updater:didFindValidUpdate: and updaterDidNotFindUpdate:), are called, so you can use that information in your UI. 59 | - (void)checkForUpdateInformation; 60 | 61 | // 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. 62 | - (void)resetUpdateCycle; 63 | 64 | - (BOOL)updateInProgress; 65 | @end 66 | 67 | @interface NSObject (SUUpdaterDelegateInformalProtocol) 68 | // 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. 69 | - (NSArray *)feedParametersForUpdater:(SUUpdater *)updater sendingSystemProfile:(BOOL)sendingProfile; 70 | 71 | // Use this to override the default behavior for Sparkle prompting the user about automatic update checks. 72 | - (BOOL)updaterShouldPromptForPermissionToCheckForUpdates:(SUUpdater *)bundle; 73 | 74 | // Implement this if you want to do some special handling with the appcast once it finishes loading. 75 | - (void)updater:(SUUpdater *)updater didFinishLoadingAppcast:(SUAppcast *)appcast; 76 | 77 | // If you're using special logic or extensions in your appcast, implement this to use your own logic for finding 78 | // a valid update, if any, in the given appcast. 79 | - (SUAppcastItem *)bestValidUpdateInAppcast:(SUAppcast *)appcast forUpdater:(SUUpdater *)bundle; 80 | 81 | // Sent when a valid update is found by the update driver. 82 | - (void)updater:(SUUpdater *)updater didFindValidUpdate:(SUAppcastItem *)update; 83 | 84 | // Sent when a valid update is not found. 85 | - (void)updaterDidNotFindUpdate:(SUUpdater *)update; 86 | 87 | // Sent immediately before installing the specified update. 88 | - (void)updater:(SUUpdater *)updater willInstallUpdate:(SUAppcastItem *)update; 89 | 90 | // Return YES to delay the relaunch until you do some processing; invoke the given NSInvocation to continue. 91 | - (BOOL)updater:(SUUpdater *)updater shouldPostponeRelaunchForUpdate:(SUAppcastItem *)update untilInvoking:(NSInvocation *)invocation; 92 | 93 | // Called immediately before relaunching. 94 | - (void)updaterWillRelaunchApplication:(SUUpdater *)updater; 95 | 96 | // This method allows you to provide a custom version comparator. 97 | // If you don't implement this method or return nil, the standard version comparator will be used. 98 | - (id )versionComparatorForUpdater:(SUUpdater *)updater; 99 | 100 | // Returns the path which is used to relaunch the client after the update is installed. By default, the path of the host bundle. 101 | - (NSString *)pathToRelaunchForUpdater:(SUUpdater *)updater; 102 | 103 | @end 104 | 105 | // Define some minimum intervals to avoid DOS-like checking attacks. These are in seconds. 106 | #ifdef DEBUG 107 | #define SU_MIN_CHECK_INTERVAL 60 108 | #else 109 | #define SU_MIN_CHECK_INTERVAL 60*60 110 | #endif 111 | 112 | #ifdef DEBUG 113 | #define SU_DEFAULT_CHECK_INTERVAL 60 114 | #else 115 | #define SU_DEFAULT_CHECK_INTERVAL 60*60*24 116 | #endif 117 | 118 | #endif 119 | -------------------------------------------------------------------------------- /GmailWindowController.m: -------------------------------------------------------------------------------- 1 | // 2 | // GmailWindowController.m 3 | // Gmail 4 | // 5 | // Created by Tyler Hall on 8/26/10. 6 | // Copyright 2010 Click On Tyler, LLC. All rights reserved. 7 | // 8 | 9 | #import "GmailWindowController.h" 10 | #import "NullRequestHandler.h" 11 | #import "SafariBar.h" 12 | #import "RegexKitLite.h" 13 | #import "GmailWindow.h" 14 | 15 | @implementation GmailWindowController 16 | 17 | - (id)initWithWindow:(NSWindow *)window andWebView:(WebView *)newWebView { 18 | self = [super initWithWindow:window]; 19 | replacementWebView = newWebView; 20 | return self; 21 | } 22 | 23 | - (id)initWithWebView:(WebView *)newWebView { 24 | // This loads in the WebView that we were surreptitiously 25 | // loading in the background via NullRequestHandler. 26 | self = [super initWithWindowNibName:@"GmailWindow"]; 27 | replacementWebView = newWebView; 28 | [[self window] setFrameAutosaveName:@""]; 29 | return self; 30 | } 31 | 32 | - (void)windowDidLoad { 33 | if(replacementWebView) { 34 | [webView removeFromSuperview]; 35 | webView = replacementWebView; 36 | NSRect frame = [[[self window] contentView] frame]; 37 | [webView setFrame:frame]; 38 | [webView setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; 39 | [[[self window] contentView] addSubview:webView]; 40 | } 41 | 42 | [webView setGroupName:@"Gmail"]; 43 | [webView setDownloadDelegate:self]; 44 | [webView setFrameLoadDelegate:self]; 45 | [webView setPolicyDelegate:self]; 46 | [webView setResourceLoadDelegate:self]; 47 | [webView setUIDelegate:self]; 48 | [[webView preferences] setDefaultFontSize:16]; 49 | [webView setContinuousSpellCheckingEnabled:YES]; 50 | [webView setShouldCloseWithWindow:NO]; 51 | [webView setCustomUserAgent:@"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-us) AppleWebKit/533.17.8 (KHTML, like Gecko) Version/5.0.1 Safari/533.17.8"]; 52 | 53 | if(![webView mainFrameURL]) { 54 | [[webView mainFrame] loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://mail.google.com"]]]; 55 | } 56 | 57 | [[self window] setMovableByWindowBackground:YES]; 58 | 59 | unreadTimer = [[NSTimer alloc] initWithFireDate:[NSDate date] interval:1 target:self selector:@selector(checkUnreadCount) userInfo:nil repeats:YES]; 60 | [[NSRunLoop mainRunLoop] addTimer:unreadTimer forMode:NSDefaultRunLoopMode]; 61 | } 62 | 63 | - (void)webView:(WebView *)sender didReceiveTitle:(NSString *)title forFrame:(WebFrame *)frame { 64 | [[self window] setTitle:title]; 65 | 66 | NSRange videoCall = [title rangeOfString:@"Incoming video"]; 67 | if(videoCall.location != NSNotFound) 68 | [[NSNotificationCenter defaultCenter] postNotificationName:@"INCOMING_VIDEO" object:nil userInfo:nil]; 69 | 70 | NSRange phoneCall = [title rangeOfString:@"Incoming voice"]; 71 | if(phoneCall.location != NSNotFound) 72 | [[NSNotificationCenter defaultCenter] postNotificationName:@"INCOMING_CALL" object:nil userInfo:nil]; 73 | 74 | NSRange newChat = [title rangeOfString:@"says…"]; 75 | if(newChat.location != NSNotFound) 76 | [[NSNotificationCenter defaultCenter] postNotificationName:@"INCOMING_CHAT" object:nil userInfo:nil]; 77 | } 78 | 79 | - (void)webView:(WebView *)sender mouseDidMoveOverElement:(NSDictionary *)elementInformation modifierFlags:(NSUInteger)modifierFlags { 80 | if(elementInformation != nil) { 81 | NSURL *href = [elementInformation valueForKey:@"WebElementLinkURL"]; 82 | if(href) { 83 | [statusBar setStringValue:[href absoluteString]]; 84 | } else { 85 | [statusBar setStringValue:@""]; 86 | } 87 | } 88 | else { 89 | [statusBar setStringValue:@""]; 90 | } 91 | } 92 | 93 | // This handles standard new window links 94 | - (void)webView:(WebView *)webView decidePolicyForNewWindowAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request newFrameName:(NSString *)frameName decisionListener:(id < WebPolicyDecisionListener >)listener { 95 | [listener ignore]; 96 | [[NSWorkspace sharedWorkspace] openURL:[request URL]]; 97 | } 98 | 99 | // This handles new windows created via JavaScript 100 | // Note: there's a longstanding WebKit bug that passes a null request 101 | // in many cases. That's why we work around it with the NullRequestHandler crap. 102 | - (WebView *)webView:(WebView *)sender createWebViewWithRequest:(NSURLRequest *)request { 103 | NullRequestHandler *nullHandler = [[NullRequestHandler alloc] init]; 104 | [nullHandler loadRequest:request]; 105 | return [nullHandler webView]; 106 | } 107 | 108 | -(void)webView:(WebView *)sender setFrame:(NSRect)frame { 109 | [[self window] setFrame:frame display:YES]; 110 | } 111 | 112 | // From: http://cocoawithlove.com/2009/08/animating-window-to-fullscreen-on-mac.html 113 | - (void)toggleFullscreen { 114 | if(oldFrame.size.width > 0) 115 | { 116 | [[self window] setFrame:oldFrame display:YES animate:YES]; 117 | oldFrame.size.width = 0; 118 | [[self window] setFrameAutosaveName:@"MainWindow"]; 119 | 120 | if([[[self window] screen] isEqual:[[NSScreen screens] objectAtIndex:0]]) 121 | { 122 | if([NSApp respondsToSelector:@selector(setPresentationOptions:)]) 123 | [NSApp setPresentationOptions:NSApplicationPresentationDefault]; 124 | else 125 | [NSMenu setMenuBarVisible:YES]; 126 | } 127 | } 128 | else 129 | { 130 | [[self window] deminiaturize:nil]; 131 | oldFrame = [[self window] frame]; 132 | 133 | if([[[self window] screen] isEqual:[[NSScreen screens] objectAtIndex:0]]) 134 | { 135 | if([NSApp respondsToSelector:@selector(setPresentationOptions:)]) 136 | [NSApp setPresentationOptions:NSApplicationPresentationAutoHideMenuBar | NSApplicationPresentationAutoHideDock]; 137 | else 138 | [NSMenu setMenuBarVisible:NO]; 139 | } 140 | 141 | [[self window] setFrameAutosaveName:@""]; 142 | [[self window] setFrame:[[self window] frameRectForContentRect:[[[self window] screen] frame]] display:YES animate:YES]; 143 | } 144 | } 145 | 146 | - (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame { 147 | if(frame == [sender mainFrame]) { 148 | WebScriptObject *ws = [webView windowScriptObject]; 149 | NSString *js = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"gmailssb" ofType:@"js"] encoding:NSUTF8StringEncoding error:nil]; 150 | [ws evaluateWebScript:js]; 151 | } 152 | } 153 | 154 | - (void)checkUnreadCount { 155 | WebScriptObject *ws = [webView windowScriptObject]; 156 | id count = [ws callWebScriptMethod:@"gmailSSBUnreadCount" withArguments:nil]; 157 | if(!count || (count == [WebUndefined undefined])) 158 | [[NSNotificationCenter defaultCenter] postNotificationName:@"UNREAD_COUNT_CHANGED" object:nil userInfo:nil]; 159 | else 160 | [[NSNotificationCenter defaultCenter] postNotificationName:@"UNREAD_COUNT_CHANGED" object:nil userInfo:[NSDictionary dictionaryWithObject:count forKey:@"count"]]; 161 | } 162 | 163 | @end 164 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/SUModelTranslation.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ADP2,1 6 | Developer Transition Kit 7 | MacBook1,1 8 | MacBook (Core Duo) 9 | MacBook2,1 10 | MacBook (Core 2 Duo) 11 | MacBook4,1 12 | MacBook (Core 2 Duo Feb 2008) 13 | MacBookAir1,1 14 | MacBook Air (January 2008) 15 | MacBookPro1,1 16 | MacBook Pro Core Duo (15-inch) 17 | MacBookPro1,2 18 | MacBook Pro Core Duo (17-inch) 19 | MacBookPro2,1 20 | MacBook Pro Core 2 Duo (17-inch) 21 | MacBookPro2,2 22 | MacBook Pro Core 2 Duo (15-inch) 23 | MacBookPro3,1 24 | MacBook Pro Core 2 Duo (15-inch LED, Core 2 Duo) 25 | MacBookPro3,2 26 | MacBook Pro Core 2 Duo (17-inch HD, Core 2 Duo) 27 | MacBookPro4,1 28 | MacBook Pro (Core 2 Duo Feb 2008) 29 | MacPro1,1 30 | Mac Pro (four-core) 31 | MacPro2,1 32 | Mac Pro (eight-core) 33 | MacPro3,1 34 | Mac Pro (January 2008 4- or 8- core "Harpertown") 35 | Macmini1,1 36 | Mac Mini (Core Solo/Duo) 37 | PowerBook1,1 38 | PowerBook G3 39 | PowerBook2,1 40 | iBook G3 41 | PowerBook2,2 42 | iBook G3 (FireWire) 43 | PowerBook2,3 44 | iBook G3 45 | PowerBook2,4 46 | iBook G3 47 | PowerBook3,1 48 | PowerBook G3 (FireWire) 49 | PowerBook3,2 50 | PowerBook G4 51 | PowerBook3,3 52 | PowerBook G4 (Gigabit Ethernet) 53 | PowerBook3,4 54 | PowerBook G4 (DVI) 55 | PowerBook3,5 56 | PowerBook G4 (1GHz / 867MHz) 57 | PowerBook4,1 58 | iBook G3 (Dual USB, Late 2001) 59 | PowerBook4,2 60 | iBook G3 (16MB VRAM) 61 | PowerBook4,3 62 | iBook G3 Opaque 16MB VRAM, 32MB VRAM, Early 2003) 63 | PowerBook5,1 64 | PowerBook G4 (17 inch) 65 | PowerBook5,2 66 | PowerBook G4 (15 inch FW 800) 67 | PowerBook5,3 68 | PowerBook G4 (17-inch 1.33GHz) 69 | PowerBook5,4 70 | PowerBook G4 (15 inch 1.5/1.33GHz) 71 | PowerBook5,5 72 | PowerBook G4 (17-inch 1.5GHz) 73 | PowerBook5,6 74 | PowerBook G4 (15 inch 1.67GHz/1.5GHz) 75 | PowerBook5,7 76 | PowerBook G4 (17-inch 1.67GHz) 77 | PowerBook5,8 78 | PowerBook G4 (Double layer SD, 15 inch) 79 | PowerBook5,9 80 | PowerBook G4 (Double layer SD, 17 inch) 81 | PowerBook6,1 82 | PowerBook G4 (12 inch) 83 | PowerBook6,2 84 | PowerBook G4 (12 inch, DVI) 85 | PowerBook6,3 86 | iBook G4 87 | PowerBook6,4 88 | PowerBook G4 (12 inch 1.33GHz) 89 | PowerBook6,5 90 | iBook G4 (Early-Late 2004) 91 | PowerBook6,7 92 | iBook G4 (Mid 2005) 93 | PowerBook6,8 94 | PowerBook G4 (12 inch 1.5GHz) 95 | PowerMac1,1 96 | Power Macintosh G3 (Blue & White) 97 | PowerMac1,2 98 | Power Macintosh G4 (PCI Graphics) 99 | PowerMac10,1 100 | Mac Mini G4 101 | PowerMac10,2 102 | Mac Mini (Late 2005) 103 | PowerMac11,2 104 | Power Macintosh G5 (Late 2005) 105 | PowerMac12,1 106 | iMac G5 (iSight) 107 | PowerMac2,1 108 | iMac G3 (Slot-loading CD-ROM) 109 | PowerMac2,2 110 | iMac G3 (Summer 2000) 111 | PowerMac3,1 112 | Power Macintosh G4 (AGP Graphics) 113 | PowerMac3,2 114 | Power Macintosh G4 (AGP Graphics) 115 | PowerMac3,3 116 | Power Macintosh G4 (Gigabit Ethernet) 117 | PowerMac3,4 118 | Power Macintosh G4 (Digital Audio) 119 | PowerMac3,5 120 | Power Macintosh G4 (Quick Silver) 121 | PowerMac3,6 122 | Power Macintosh G4 (Mirrored Drive Door) 123 | PowerMac4,1 124 | iMac G3 (Early/Summer 2001) 125 | PowerMac4,2 126 | iMac G4 (Flat Panel) 127 | PowerMac4,4 128 | eMac 129 | PowerMac4,5 130 | iMac G4 (17-inch Flat Panel) 131 | PowerMac5,1 132 | Power Macintosh G4 Cube 133 | PowerMac6,1 134 | iMac G4 (USB 2.0) 135 | PowerMac6,3 136 | iMac G4 (20-inch Flat Panel) 137 | PowerMac6,4 138 | eMac (USB 2.0, 2005) 139 | PowerMac7,2 140 | Power Macintosh G5 141 | PowerMac7,3 142 | Power Macintosh G5 143 | PowerMac8,1 144 | iMac G5 145 | PowerMac8,2 146 | iMac G5 (Ambient Light Sensor) 147 | PowerMac9,1 148 | Power Macintosh G5 (Late 2005) 149 | RackMac1,1 150 | Xserve G4 151 | RackMac1,2 152 | Xserve G4 (slot-loading, cluster node) 153 | RackMac3,1 154 | Xserve G5 155 | Xserve1,1 156 | Xserve (Intel Xeon) 157 | Xserve2,1 158 | Xserve (January 2008 quad-core) 159 | iMac1,1 160 | iMac G3 (Rev A-D) 161 | iMac4,1 162 | iMac (Core Duo) 163 | iMac4,2 164 | iMac for Education (17-inch, Core Duo) 165 | iMac5,1 166 | iMac (Core 2 Duo, 17 or 20 inch, SuperDrive) 167 | iMac5,2 168 | iMac (Core 2 Duo, 17 inch, Combo Drive) 169 | iMac6,1 170 | iMac (Core 2 Duo, 24 inch, SuperDrive) 171 | iMac8,1 172 | iMac (April 2008) 173 | 174 | 175 | -------------------------------------------------------------------------------- /Growl.framework/Versions/A/Headers/GrowlDefines.h: -------------------------------------------------------------------------------- 1 | // 2 | // GrowlDefines.h 3 | // 4 | 5 | #ifndef _GROWLDEFINES_H 6 | #define _GROWLDEFINES_H 7 | 8 | #ifdef __OBJC__ 9 | #define XSTR(x) (@x) 10 | #define STRING_TYPE NSString * 11 | #else 12 | #define XSTR CFSTR 13 | #define STRING_TYPE CFStringRef 14 | #endif 15 | 16 | /*! @header GrowlDefines.h 17 | * @abstract Defines all the notification keys. 18 | * @discussion Defines all the keys used for registration with Growl and for 19 | * Growl notifications. 20 | * 21 | * Most applications should use the functions or methods of Growl.framework 22 | * instead of posting notifications such as those described here. 23 | * @updated 2004-01-25 24 | */ 25 | 26 | // UserInfo Keys for Registration 27 | #pragma mark UserInfo Keys for Registration 28 | 29 | /*! @group Registration userInfo keys */ 30 | /* @abstract Keys for the userInfo dictionary of a GROWL_APP_REGISTRATION distributed notification. 31 | * @discussion The values of these keys describe the application and the 32 | * notifications it may post. 33 | * 34 | * Your application must register with Growl before it can post Growl 35 | * notifications (and have them not be ignored). However, as of Growl 0.6, 36 | * posting GROWL_APP_REGISTRATION notifications directly is no longer the 37 | * preferred way to register your application. Your application should instead 38 | * use Growl.framework's delegate system. 39 | * See +[GrowlApplicationBridge setGrowlDelegate:] or Growl_SetDelegate for 40 | * more information. 41 | */ 42 | 43 | /*! @defined GROWL_APP_NAME 44 | * @abstract The name of your application. 45 | * @discussion The name of your application. This should remain stable between 46 | * different versions and incarnations of your application. 47 | * For example, "SurfWriter" is a good app name, whereas "SurfWriter 2.0" and 48 | * "SurfWriter Lite" are not. 49 | */ 50 | #define GROWL_APP_NAME XSTR("ApplicationName") 51 | /*! @defined GROWL_APP_ID 52 | * @abstract The bundle identifier of your application. 53 | * @discussion The bundle identifier of your application. This key should 54 | * be unique for your application while there may be several applications 55 | * with the same GROWL_APP_NAME. 56 | * This key is optional. 57 | */ 58 | #define GROWL_APP_ID XSTR("ApplicationId") 59 | /*! @defined GROWL_APP_ICON 60 | * @abstract The image data for your application's icon. 61 | * @discussion Image data representing your application's icon. This may be 62 | * superimposed on a notification icon as a badge, used as the notification 63 | * icon when a notification-specific icon is not supplied, or ignored 64 | * altogether, depending on the display. Must be in a format supported by 65 | * NSImage, such as TIFF, PNG, GIF, JPEG, BMP, PICT, or PDF. 66 | * 67 | * Optional. Not supported by all display plugins. 68 | */ 69 | #define GROWL_APP_ICON XSTR("ApplicationIcon") 70 | /*! @defined GROWL_NOTIFICATIONS_DEFAULT 71 | * @abstract The array of notifications to turn on by default. 72 | * @discussion These are the names of the notifications that should be enabled 73 | * by default when your application registers for the first time. If your 74 | * application reregisters, Growl will look here for any new notification 75 | * names found in GROWL_NOTIFICATIONS_ALL, but ignore any others. 76 | */ 77 | #define GROWL_NOTIFICATIONS_DEFAULT XSTR("DefaultNotifications") 78 | /*! @defined GROWL_NOTIFICATIONS_ALL 79 | * @abstract The array of all notifications your application can send. 80 | * @discussion These are the names of all of the notifications that your 81 | * application may post. See GROWL_NOTIFICATION_NAME for a discussion of good 82 | * notification names. 83 | */ 84 | #define GROWL_NOTIFICATIONS_ALL XSTR("AllNotifications") 85 | /*! @defined GROWL_NOTIFICATIONS_HUMAN_READABLE_DESCRIPTIONS 86 | * @abstract A dictionary of human-readable names for your notifications. 87 | * @discussion By default, the Growl UI will display notifications by the names given in GROWL_NOTIFICATIONS_ALL 88 | * which correspond to the GROWL_NOTIFICATION_NAME. This dictionary specifies the human-readable name to display. 89 | * The keys of the dictionary are GROWL_NOTIFICATION_NAME strings; the objects are the human-readable versions. 90 | * For any GROWL_NOTIFICATION_NAME not specific in this dictionary, the GROWL_NOTIFICATION_NAME will be displayed. 91 | * 92 | * This key is optional. 93 | */ 94 | #define GROWL_NOTIFICATIONS_HUMAN_READABLE_NAMES XSTR("HumanReadableNames") 95 | /*! @defined GROWL_NOTIFICATIONS_DESCRIPTIONS 96 | * @abstract A dictionary of descriptions of _when_ each notification occurs 97 | * @discussion This is an NSDictionary whose keys are GROWL_NOTIFICATION_NAME strings and whose objects are 98 | * descriptions of _when_ each notification occurs, such as "You received a new mail message" or 99 | * "A file finished downloading". 100 | * 101 | * This key is optional. 102 | */ 103 | #define GROWL_NOTIFICATIONS_DESCRIPTIONS XSTR("NotificationDescriptions") 104 | 105 | /*! @defined GROWL_TICKET_VERSION 106 | * @abstract The version of your registration ticket. 107 | * @discussion Include this key in a ticket plist file that you put in your 108 | * application bundle for auto-discovery. The current ticket version is 1. 109 | */ 110 | #define GROWL_TICKET_VERSION XSTR("TicketVersion") 111 | // UserInfo Keys for Notifications 112 | #pragma mark UserInfo Keys for Notifications 113 | 114 | /*! @group Notification userInfo keys */ 115 | /* @abstract Keys for the userInfo dictionary of a GROWL_NOTIFICATION distributed notification. 116 | * @discussion The values of these keys describe the content of a Growl 117 | * notification. 118 | * 119 | * Not all of these keys are supported by all displays. Only the name, title, 120 | * and description of a notification are universal. Most of the built-in 121 | * displays do support all of these keys, and most other visual displays 122 | * probably will also. But, as of 0.6, the Log, MailMe, and Speech displays 123 | * support only textual data. 124 | */ 125 | 126 | /*! @defined GROWL_NOTIFICATION_NAME 127 | * @abstract The name of the notification. 128 | * @discussion The name of the notification. Note that if you do not define 129 | * GROWL_NOTIFICATIONS_HUMAN_READABLE_NAMES when registering your ticket originally this name 130 | * will the one displayed within the Growl preference pane and should be human-readable. 131 | */ 132 | #define GROWL_NOTIFICATION_NAME XSTR("NotificationName") 133 | /*! @defined GROWL_NOTIFICATION_TITLE 134 | * @abstract The title to display in the notification. 135 | * @discussion The title of the notification. Should be very brief. 136 | * The title usually says what happened, e.g. "Download complete". 137 | */ 138 | #define GROWL_NOTIFICATION_TITLE XSTR("NotificationTitle") 139 | /*! @defined GROWL_NOTIFICATION_DESCRIPTION 140 | * @abstract The description to display in the notification. 141 | * @discussion The description should be longer and more verbose than the title. 142 | * The description usually tells the subject of the action, 143 | * e.g. "Growl-0.6.dmg downloaded in 5.02 minutes". 144 | */ 145 | #define GROWL_NOTIFICATION_DESCRIPTION XSTR("NotificationDescription") 146 | /*! @defined GROWL_NOTIFICATION_ICON 147 | * @discussion Image data for the notification icon. Must be in a format 148 | * supported by NSImage, such as TIFF, PNG, GIF, JPEG, BMP, PICT, or PDF. 149 | * 150 | * Optional. Not supported by all display plugins. 151 | */ 152 | #define GROWL_NOTIFICATION_ICON XSTR("NotificationIcon") 153 | /*! @defined GROWL_NOTIFICATION_APP_ICON 154 | * @discussion Image data for the application icon, in case GROWL_APP_ICON does 155 | * not apply for some reason. Must be in a format supported by NSImage, such 156 | * as TIFF, PNG, GIF, JPEG, BMP, PICT, or PDF. 157 | * 158 | * Optional. Not supported by all display plugins. 159 | */ 160 | #define GROWL_NOTIFICATION_APP_ICON XSTR("NotificationAppIcon") 161 | /*! @defined GROWL_NOTIFICATION_PRIORITY 162 | * @discussion The priority of the notification as an integer number from 163 | * -2 to +2 (+2 being highest). 164 | * 165 | * Optional. Not supported by all display plugins. 166 | */ 167 | #define GROWL_NOTIFICATION_PRIORITY XSTR("NotificationPriority") 168 | /*! @defined GROWL_NOTIFICATION_STICKY 169 | * @discussion A Boolean number controlling whether the notification is sticky. 170 | * 171 | * Optional. Not supported by all display plugins. 172 | */ 173 | #define GROWL_NOTIFICATION_STICKY XSTR("NotificationSticky") 174 | /*! @defined GROWL_NOTIFICATION_CLICK_CONTEXT 175 | * @abstract Identifies which notification was clicked. 176 | * @discussion An identifier for the notification for clicking purposes. 177 | * 178 | * This will be passed back to the application when the notification is 179 | * clicked. It must be plist-encodable (a data, dictionary, array, number, or 180 | * string object), and it should be unique for each notification you post. 181 | * A good click context would be a UUID string returned by NSProcessInfo or 182 | * CFUUID. 183 | * 184 | * Optional. Not supported by all display plugins. 185 | */ 186 | #define GROWL_NOTIFICATION_CLICK_CONTEXT XSTR("NotificationClickContext") 187 | 188 | /*! @defined GROWL_DISPLAY_PLUGIN 189 | * @discussion The name of a display plugin which should be used for this notification. 190 | * Optional. If this key is not set or the specified display plugin does not 191 | * exist, the display plugin stored in the application ticket is used. This key 192 | * allows applications to use different default display plugins for their 193 | * notifications. The user can still override those settings in the preference 194 | * pane. 195 | */ 196 | #define GROWL_DISPLAY_PLUGIN XSTR("NotificationDisplayPlugin") 197 | 198 | /*! @defined GROWL_NOTIFICATION_IDENTIFIER 199 | * @abstract An identifier for the notification for coalescing purposes. 200 | * Notifications with the same identifier fall into the same class; only 201 | * the last notification of a class is displayed on the screen. If a 202 | * notification of the same class is currently being displayed, it is 203 | * replaced by this notification. 204 | * 205 | * Optional. Not supported by all display plugins. 206 | */ 207 | #define GROWL_NOTIFICATION_IDENTIFIER XSTR("GrowlNotificationIdentifier") 208 | 209 | /*! @defined GROWL_APP_PID 210 | * @abstract The process identifier of the process which sends this 211 | * notification. If this field is set, the application will only receive 212 | * clicked and timed out notifications which originate from this process. 213 | * 214 | * Optional. 215 | */ 216 | #define GROWL_APP_PID XSTR("ApplicationPID") 217 | 218 | /*! @defined GROWL_NOTIFICATION_PROGRESS 219 | * @abstract If this key is set, it should contain a double value wrapped 220 | * in a NSNumber which describes some sort of progress (from 0.0 to 100.0). 221 | * If this is key is not set, no progress bar is shown. 222 | * 223 | * Optional. Not supported by all display plugins. 224 | */ 225 | #define GROWL_NOTIFICATION_PROGRESS XSTR("NotificationProgress") 226 | 227 | // Notifications 228 | #pragma mark Notifications 229 | 230 | /*! @group Notification names */ 231 | /* @abstract Names of distributed notifications used by Growl. 232 | * @discussion These are notifications used by applications (directly or 233 | * indirectly) to interact with Growl, and by Growl for interaction between 234 | * its components. 235 | * 236 | * Most of these should no longer be used in Growl 0.6 and later, in favor of 237 | * Growl.framework's GrowlApplicationBridge APIs. 238 | */ 239 | 240 | /*! @defined GROWL_APP_REGISTRATION 241 | * @abstract The distributed notification for registering your application. 242 | * @discussion This is the name of the distributed notification that can be 243 | * used to register applications with Growl. 244 | * 245 | * The userInfo dictionary for this notification can contain these keys: 246 | *
    247 | *
  • GROWL_APP_NAME
  • 248 | *
  • GROWL_APP_ICON
  • 249 | *
  • GROWL_NOTIFICATIONS_ALL
  • 250 | *
  • GROWL_NOTIFICATIONS_DEFAULT
  • 251 | *
252 | * 253 | * No longer recommended as of Growl 0.6. An alternate method of registering 254 | * is to use Growl.framework's delegate system. 255 | * See +[GrowlApplicationBridge setGrowlDelegate:] or Growl_SetDelegate for 256 | * more information. 257 | */ 258 | #define GROWL_APP_REGISTRATION XSTR("GrowlApplicationRegistrationNotification") 259 | /*! @defined GROWL_APP_REGISTRATION_CONF 260 | * @abstract The distributed notification for confirming registration. 261 | * @discussion The name of the distributed notification sent to confirm the 262 | * registration. Used by the Growl preference pane. Your application probably 263 | * does not need to use this notification. 264 | */ 265 | #define GROWL_APP_REGISTRATION_CONF XSTR("GrowlApplicationRegistrationConfirmationNotification") 266 | /*! @defined GROWL_NOTIFICATION 267 | * @abstract The distributed notification for Growl notifications. 268 | * @discussion This is what it all comes down to. This is the name of the 269 | * distributed notification that your application posts to actually send a 270 | * Growl notification. 271 | * 272 | * The userInfo dictionary for this notification can contain these keys: 273 | *
    274 | *
  • GROWL_NOTIFICATION_NAME (required)
  • 275 | *
  • GROWL_NOTIFICATION_TITLE (required)
  • 276 | *
  • GROWL_NOTIFICATION_DESCRIPTION (required)
  • 277 | *
  • GROWL_NOTIFICATION_ICON
  • 278 | *
  • GROWL_NOTIFICATION_APP_ICON
  • 279 | *
  • GROWL_NOTIFICATION_PRIORITY
  • 280 | *
  • GROWL_NOTIFICATION_STICKY
  • 281 | *
  • GROWL_NOTIFICATION_CLICK_CONTEXT
  • 282 | *
  • GROWL_APP_NAME (required)
  • 283 | *
284 | * 285 | * No longer recommended as of Growl 0.6. Three alternate methods of posting 286 | * notifications are +[GrowlApplicationBridge notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:], 287 | * Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext, and 288 | * Growl_PostNotification. 289 | */ 290 | #define GROWL_NOTIFICATION XSTR("GrowlNotification") 291 | /*! @defined GROWL_SHUTDOWN 292 | * @abstract The distributed notification name that tells Growl to shutdown. 293 | * @discussion The Growl preference pane posts this notification when the 294 | * "Stop Growl" button is clicked. 295 | */ 296 | #define GROWL_SHUTDOWN XSTR("GrowlShutdown") 297 | /*! @defined GROWL_PING 298 | * @abstract A distributed notification to check whether Growl is running. 299 | * @discussion This is used by the Growl preference pane. If it receives a 300 | * GROWL_PONG, the preference pane takes this to mean that Growl is running. 301 | */ 302 | #define GROWL_PING XSTR("Honey, Mind Taking Out The Trash") 303 | /*! @defined GROWL_PONG 304 | * @abstract The distributed notification sent in reply to GROWL_PING. 305 | * @discussion GrowlHelperApp posts this in reply to GROWL_PING. 306 | */ 307 | #define GROWL_PONG XSTR("What Do You Want From Me, Woman") 308 | /*! @defined GROWL_IS_READY 309 | * @abstract The distributed notification sent when Growl starts up. 310 | * @discussion GrowlHelperApp posts this when it has begin listening on all of 311 | * its sources for new notifications. GrowlApplicationBridge (in 312 | * Growl.framework), upon receiving this notification, reregisters using the 313 | * registration dictionary supplied by its delegate. 314 | */ 315 | #define GROWL_IS_READY XSTR("Lend Me Some Sugar; I Am Your Neighbor!") 316 | /*! @defined GROWL_NOTIFICATION_CLICKED 317 | * @abstract The distributed notification sent when a supported notification is clicked. 318 | * @discussion When a Growl notification with a click context is clicked on by 319 | * the user, Growl posts this distributed notification. 320 | * The GrowlApplicationBridge responds to this notification by calling a 321 | * callback in its delegate. 322 | */ 323 | #define GROWL_NOTIFICATION_CLICKED XSTR("GrowlClicked!") 324 | #define GROWL_NOTIFICATION_TIMED_OUT XSTR("GrowlTimedOut!") 325 | 326 | /*! @group Other symbols */ 327 | /* Symbols which don't fit into any of the other categories. */ 328 | 329 | /*! @defined GROWL_KEY_CLICKED_CONTEXT 330 | * @abstract Used internally as the key for the clickedContext passed over DNC. 331 | * @discussion This key is used in GROWL_NOTIFICATION_CLICKED, and contains the 332 | * click context that was supplied in the original notification. 333 | */ 334 | #define GROWL_KEY_CLICKED_CONTEXT XSTR("ClickedContext") 335 | /*! @defined GROWL_REG_DICT_EXTENSION 336 | * @abstract The filename extension for registration dictionaries. 337 | * @discussion The GrowlApplicationBridge in Growl.framework registers with 338 | * Growl by creating a file with the extension of .(GROWL_REG_DICT_EXTENSION) 339 | * and opening it in the GrowlHelperApp. This happens whether or not Growl is 340 | * running; if it was stopped, it quits immediately without listening for 341 | * notifications. 342 | */ 343 | #define GROWL_REG_DICT_EXTENSION XSTR("growlRegDict") 344 | 345 | 346 | #define GROWL_POSITION_PREFERENCE_KEY @"GrowlSelectedPosition" 347 | 348 | #endif //ndef _GROWLDEFINES_H 349 | -------------------------------------------------------------------------------- /RegexKitLite.h: -------------------------------------------------------------------------------- 1 | // 2 | // RegexKitLite.h 3 | // http://regexkit.sourceforge.net/ 4 | // Licensed under the terms of the BSD License, as specified below. 5 | // 6 | 7 | /* 8 | Copyright (c) 2008-2010, John Engelhart 9 | 10 | All rights reserved. 11 | 12 | Redistribution and use in source and binary forms, with or without 13 | modification, are permitted provided that the following conditions are met: 14 | 15 | * Redistributions of source code must retain the above copyright 16 | notice, this list of conditions and the following disclaimer. 17 | 18 | * Redistributions in binary form must reproduce the above copyright 19 | notice, this list of conditions and the following disclaimer in the 20 | documentation and/or other materials provided with the distribution. 21 | 22 | * Neither the name of the Zang Industries nor the names of its 23 | contributors may be used to endorse or promote products derived from 24 | this software without specific prior written permission. 25 | 26 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 27 | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 28 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 29 | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 30 | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 31 | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 32 | TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 33 | PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 34 | LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 35 | NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 36 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 37 | */ 38 | 39 | #ifdef __OBJC__ 40 | #import 41 | #import 42 | #import 43 | #import 44 | #import 45 | #endif // __OBJC__ 46 | 47 | #include 48 | #include 49 | #include 50 | #include 51 | #include 52 | 53 | #ifdef __cplusplus 54 | extern "C" { 55 | #endif 56 | 57 | #ifndef REGEXKITLITE_VERSION_DEFINED 58 | #define REGEXKITLITE_VERSION_DEFINED 59 | 60 | #define _RKL__STRINGIFY(b) #b 61 | #define _RKL_STRINGIFY(a) _RKL__STRINGIFY(a) 62 | #define _RKL_JOIN_VERSION(a,b) _RKL_STRINGIFY(a##.##b) 63 | #define _RKL_VERSION_STRING(a,b) _RKL_JOIN_VERSION(a,b) 64 | 65 | #define REGEXKITLITE_VERSION_MAJOR 4 66 | #define REGEXKITLITE_VERSION_MINOR 0 67 | 68 | #define REGEXKITLITE_VERSION_CSTRING _RKL_VERSION_STRING(REGEXKITLITE_VERSION_MAJOR, REGEXKITLITE_VERSION_MINOR) 69 | #define REGEXKITLITE_VERSION_NSSTRING @REGEXKITLITE_VERSION_CSTRING 70 | 71 | #endif // REGEXKITLITE_VERSION_DEFINED 72 | 73 | #if !defined(RKL_BLOCKS) && defined(NS_BLOCKS_AVAILABLE) && (NS_BLOCKS_AVAILABLE == 1) 74 | #define RKL_BLOCKS 1 75 | #endif 76 | 77 | #if defined(RKL_BLOCKS) && (RKL_BLOCKS == 1) 78 | #define _RKL_BLOCKS_ENABLED 1 79 | #endif // defined(RKL_BLOCKS) && (RKL_BLOCKS == 1) 80 | 81 | #if defined(_RKL_BLOCKS_ENABLED) && !defined(__BLOCKS__) 82 | #warning RegexKitLite support for Blocks is enabled, but __BLOCKS__ is not defined. This compiler may not support Blocks, in which case the behavior is undefined. This will probably cause numerous compiler errors. 83 | #endif // defined(_RKL_BLOCKS_ENABLED) && !defined(__BLOCKS__) 84 | 85 | // For Mac OS X < 10.5. 86 | #ifndef NSINTEGER_DEFINED 87 | #define NSINTEGER_DEFINED 88 | #if defined(__LP64__) || defined(NS_BUILD_32_LIKE_64) 89 | typedef long NSInteger; 90 | typedef unsigned long NSUInteger; 91 | #define NSIntegerMin LONG_MIN 92 | #define NSIntegerMax LONG_MAX 93 | #define NSUIntegerMax ULONG_MAX 94 | #else // defined(__LP64__) || defined(NS_BUILD_32_LIKE_64) 95 | typedef int NSInteger; 96 | typedef unsigned int NSUInteger; 97 | #define NSIntegerMin INT_MIN 98 | #define NSIntegerMax INT_MAX 99 | #define NSUIntegerMax UINT_MAX 100 | #endif // defined(__LP64__) || defined(NS_BUILD_32_LIKE_64) 101 | #endif // NSINTEGER_DEFINED 102 | 103 | #ifndef RKLREGEXOPTIONS_DEFINED 104 | #define RKLREGEXOPTIONS_DEFINED 105 | 106 | // These must be identical to their ICU regex counterparts. See http://www.icu-project.org/userguide/regexp.html 107 | enum { 108 | RKLNoOptions = 0, 109 | RKLCaseless = 2, 110 | RKLComments = 4, 111 | RKLDotAll = 32, 112 | RKLMultiline = 8, 113 | RKLUnicodeWordBoundaries = 256 114 | }; 115 | typedef uint32_t RKLRegexOptions; // This must be identical to the ICU 'flags' argument type. 116 | 117 | #endif // RKLREGEXOPTIONS_DEFINED 118 | 119 | #ifndef RKLREGEXENUMERATIONOPTIONS_DEFINED 120 | #define RKLREGEXENUMERATIONOPTIONS_DEFINED 121 | 122 | enum { 123 | RKLRegexEnumerationNoOptions = 0UL, 124 | RKLRegexEnumerationCapturedStringsNotRequired = 1UL << 9, 125 | RKLRegexEnumerationReleaseStringReturnedByReplacementBlock = 1UL << 10, 126 | RKLRegexEnumerationFastCapturedStringsXXX = 1UL << 11, 127 | }; 128 | typedef NSUInteger RKLRegexEnumerationOptions; 129 | 130 | #endif // RKLREGEXENUMERATIONOPTIONS_DEFINED 131 | 132 | #ifndef _REGEXKITLITE_H_ 133 | #define _REGEXKITLITE_H_ 134 | 135 | #if defined(__GNUC__) && (__GNUC__ >= 4) && defined(__APPLE_CC__) && (__APPLE_CC__ >= 5465) 136 | #define RKL_DEPRECATED_ATTRIBUTE __attribute__((deprecated)) 137 | #else 138 | #define RKL_DEPRECATED_ATTRIBUTE 139 | #endif 140 | 141 | #if defined(NS_REQUIRES_NIL_TERMINATION) 142 | #define RKL_REQUIRES_NIL_TERMINATION NS_REQUIRES_NIL_TERMINATION 143 | #else // defined(NS_REQUIRES_NIL_TERMINATION) 144 | #define RKL_REQUIRES_NIL_TERMINATION 145 | #endif // defined(NS_REQUIRES_NIL_TERMINATION) 146 | 147 | // This requires a few levels of rewriting to get the desired results. 148 | #define _RKL_CONCAT_2(c,d) c ## d 149 | #define _RKL_CONCAT(a,b) _RKL_CONCAT_2(a,b) 150 | 151 | #ifdef RKL_PREPEND_TO_METHODS 152 | #define RKL_METHOD_PREPEND(x) _RKL_CONCAT(RKL_PREPEND_TO_METHODS, x) 153 | #else // RKL_PREPEND_TO_METHODS 154 | #define RKL_METHOD_PREPEND(x) x 155 | #endif // RKL_PREPEND_TO_METHODS 156 | 157 | // If it looks like low memory notifications might be available, add code to register and respond to them. 158 | // This is (should be) harmless if it turns out that this isn't the case, since the notification that we register for, 159 | // UIApplicationDidReceiveMemoryWarningNotification, is dynamically looked up via dlsym(). 160 | #if ((defined(TARGET_OS_EMBEDDED) && (TARGET_OS_EMBEDDED != 0)) || (defined(TARGET_OS_IPHONE) && (TARGET_OS_IPHONE != 0))) && (!defined(RKL_REGISTER_FOR_IPHONE_LOWMEM_NOTIFICATIONS) || (RKL_REGISTER_FOR_IPHONE_LOWMEM_NOTIFICATIONS != 0)) 161 | #define RKL_REGISTER_FOR_IPHONE_LOWMEM_NOTIFICATIONS 1 162 | #endif 163 | 164 | #ifdef __OBJC__ 165 | 166 | // NSException exception name. 167 | extern NSString * const RKLICURegexException; 168 | 169 | // NSError error domains and user info keys. 170 | extern NSString * const RKLICURegexErrorDomain; 171 | 172 | extern NSString * const RKLICURegexEnumerationOptionsErrorKey; 173 | extern NSString * const RKLICURegexErrorCodeErrorKey; 174 | extern NSString * const RKLICURegexErrorNameErrorKey; 175 | extern NSString * const RKLICURegexLineErrorKey; 176 | extern NSString * const RKLICURegexOffsetErrorKey; 177 | extern NSString * const RKLICURegexPreContextErrorKey; 178 | extern NSString * const RKLICURegexPostContextErrorKey; 179 | extern NSString * const RKLICURegexRegexErrorKey; 180 | extern NSString * const RKLICURegexRegexOptionsErrorKey; 181 | extern NSString * const RKLICURegexReplacedCountErrorKey; 182 | extern NSString * const RKLICURegexReplacedStringErrorKey; 183 | extern NSString * const RKLICURegexReplacementStringErrorKey; 184 | extern NSString * const RKLICURegexSubjectRangeErrorKey; 185 | extern NSString * const RKLICURegexSubjectStringErrorKey; 186 | 187 | @interface NSString (RegexKitLiteAdditions) 188 | 189 | + (void)RKL_METHOD_PREPEND(clearStringCache); 190 | 191 | // Although these are marked as deprecated, a bug in GCC prevents a warning from being issues for + class methods. Filed bug with Apple, #6736857. 192 | + (NSInteger)RKL_METHOD_PREPEND(captureCountForRegex):(NSString *)regex RKL_DEPRECATED_ATTRIBUTE; 193 | + (NSInteger)RKL_METHOD_PREPEND(captureCountForRegex):(NSString *)regex options:(RKLRegexOptions)options error:(NSError **)error RKL_DEPRECATED_ATTRIBUTE; 194 | 195 | - (NSArray *)RKL_METHOD_PREPEND(componentsSeparatedByRegex):(NSString *)regex; 196 | - (NSArray *)RKL_METHOD_PREPEND(componentsSeparatedByRegex):(NSString *)regex range:(NSRange)range; 197 | - (NSArray *)RKL_METHOD_PREPEND(componentsSeparatedByRegex):(NSString *)regex options:(RKLRegexOptions)options range:(NSRange)range error:(NSError **)error; 198 | 199 | - (BOOL)RKL_METHOD_PREPEND(isMatchedByRegex):(NSString *)regex; 200 | - (BOOL)RKL_METHOD_PREPEND(isMatchedByRegex):(NSString *)regex inRange:(NSRange)range; 201 | - (BOOL)RKL_METHOD_PREPEND(isMatchedByRegex):(NSString *)regex options:(RKLRegexOptions)options inRange:(NSRange)range error:(NSError **)error; 202 | 203 | - (NSRange)RKL_METHOD_PREPEND(rangeOfRegex):(NSString *)regex; 204 | - (NSRange)RKL_METHOD_PREPEND(rangeOfRegex):(NSString *)regex capture:(NSInteger)capture; 205 | - (NSRange)RKL_METHOD_PREPEND(rangeOfRegex):(NSString *)regex inRange:(NSRange)range; 206 | - (NSRange)RKL_METHOD_PREPEND(rangeOfRegex):(NSString *)regex options:(RKLRegexOptions)options inRange:(NSRange)range capture:(NSInteger)capture error:(NSError **)error; 207 | 208 | - (NSString *)RKL_METHOD_PREPEND(stringByMatching):(NSString *)regex; 209 | - (NSString *)RKL_METHOD_PREPEND(stringByMatching):(NSString *)regex capture:(NSInteger)capture; 210 | - (NSString *)RKL_METHOD_PREPEND(stringByMatching):(NSString *)regex inRange:(NSRange)range; 211 | - (NSString *)RKL_METHOD_PREPEND(stringByMatching):(NSString *)regex options:(RKLRegexOptions)options inRange:(NSRange)range capture:(NSInteger)capture error:(NSError **)error; 212 | 213 | - (NSString *)RKL_METHOD_PREPEND(stringByReplacingOccurrencesOfRegex):(NSString *)regex withString:(NSString *)replacement; 214 | - (NSString *)RKL_METHOD_PREPEND(stringByReplacingOccurrencesOfRegex):(NSString *)regex withString:(NSString *)replacement range:(NSRange)searchRange; 215 | - (NSString *)RKL_METHOD_PREPEND(stringByReplacingOccurrencesOfRegex):(NSString *)regex withString:(NSString *)replacement options:(RKLRegexOptions)options range:(NSRange)searchRange error:(NSError **)error; 216 | 217 | //// >= 3.0 218 | 219 | - (NSInteger)RKL_METHOD_PREPEND(captureCount); 220 | - (NSInteger)RKL_METHOD_PREPEND(captureCountWithOptions):(RKLRegexOptions)options error:(NSError **)error; 221 | 222 | - (BOOL)RKL_METHOD_PREPEND(isRegexValid); 223 | - (BOOL)RKL_METHOD_PREPEND(isRegexValidWithOptions):(RKLRegexOptions)options error:(NSError **)error; 224 | 225 | - (void)RKL_METHOD_PREPEND(flushCachedRegexData); 226 | 227 | - (NSArray *)RKL_METHOD_PREPEND(componentsMatchedByRegex):(NSString *)regex; 228 | - (NSArray *)RKL_METHOD_PREPEND(componentsMatchedByRegex):(NSString *)regex capture:(NSInteger)capture; 229 | - (NSArray *)RKL_METHOD_PREPEND(componentsMatchedByRegex):(NSString *)regex range:(NSRange)range; 230 | - (NSArray *)RKL_METHOD_PREPEND(componentsMatchedByRegex):(NSString *)regex options:(RKLRegexOptions)options range:(NSRange)range capture:(NSInteger)capture error:(NSError **)error; 231 | 232 | 233 | - (NSArray *)RKL_METHOD_PREPEND(captureComponentsMatchedByRegex):(NSString *)regex; 234 | - (NSArray *)RKL_METHOD_PREPEND(captureComponentsMatchedByRegex):(NSString *)regex range:(NSRange)range; 235 | - (NSArray *)RKL_METHOD_PREPEND(captureComponentsMatchedByRegex):(NSString *)regex options:(RKLRegexOptions)options range:(NSRange)range error:(NSError **)error; 236 | 237 | - (NSArray *)RKL_METHOD_PREPEND(arrayOfCaptureComponentsMatchedByRegex):(NSString *)regex; 238 | - (NSArray *)RKL_METHOD_PREPEND(arrayOfCaptureComponentsMatchedByRegex):(NSString *)regex range:(NSRange)range; 239 | - (NSArray *)RKL_METHOD_PREPEND(arrayOfCaptureComponentsMatchedByRegex):(NSString *)regex options:(RKLRegexOptions)options range:(NSRange)range error:(NSError **)error; 240 | 241 | //// >= 4.0 242 | 243 | - (NSArray *)RKL_METHOD_PREPEND(arrayOfDictionariesByMatchingRegex):(NSString *)regex withKeysAndCaptures:(id)firstKey, ... RKL_REQUIRES_NIL_TERMINATION; 244 | - (NSArray *)RKL_METHOD_PREPEND(arrayOfDictionariesByMatchingRegex):(NSString *)regex range:(NSRange)range withKeysAndCaptures:(id)firstKey, ... RKL_REQUIRES_NIL_TERMINATION; 245 | - (NSArray *)RKL_METHOD_PREPEND(arrayOfDictionariesByMatchingRegex):(NSString *)regex options:(RKLRegexOptions)options range:(NSRange)range error:(NSError **)error withKeysAndCaptures:(id)firstKey, ... RKL_REQUIRES_NIL_TERMINATION; 246 | - (NSArray *)RKL_METHOD_PREPEND(arrayOfDictionariesByMatchingRegex):(NSString *)regex options:(RKLRegexOptions)options range:(NSRange)range error:(NSError **)error withFirstKey:(id)firstKey arguments:(va_list)varArgsList; 247 | 248 | - (NSArray *)RKL_METHOD_PREPEND(arrayOfDictionariesByMatchingRegex):(NSString *)regex options:(RKLRegexOptions)options range:(NSRange)range error:(NSError **)error withKeys:(id *)keys forCaptures:(int *)captures count:(NSUInteger)count; 249 | 250 | - (NSDictionary *)RKL_METHOD_PREPEND(dictionaryByMatchingRegex):(NSString *)regex withKeysAndCaptures:(id)firstKey, ... RKL_REQUIRES_NIL_TERMINATION; 251 | - (NSDictionary *)RKL_METHOD_PREPEND(dictionaryByMatchingRegex):(NSString *)regex range:(NSRange)range withKeysAndCaptures:(id)firstKey, ... RKL_REQUIRES_NIL_TERMINATION; 252 | - (NSDictionary *)RKL_METHOD_PREPEND(dictionaryByMatchingRegex):(NSString *)regex options:(RKLRegexOptions)options range:(NSRange)range error:(NSError **)error withKeysAndCaptures:(id)firstKey, ... RKL_REQUIRES_NIL_TERMINATION; 253 | - (NSDictionary *)RKL_METHOD_PREPEND(dictionaryByMatchingRegex):(NSString *)regex options:(RKLRegexOptions)options range:(NSRange)range error:(NSError **)error withFirstKey:(id)firstKey arguments:(va_list)varArgsList; 254 | 255 | - (NSDictionary *)RKL_METHOD_PREPEND(dictionaryByMatchingRegex):(NSString *)regex options:(RKLRegexOptions)options range:(NSRange)range error:(NSError **)error withKeys:(id *)keys forCaptures:(int *)captures count:(NSUInteger)count; 256 | 257 | #ifdef _RKL_BLOCKS_ENABLED 258 | 259 | - (BOOL)RKL_METHOD_PREPEND(enumerateStringsMatchedByRegex):(NSString *)regex usingBlock:(void (^)(NSInteger captureCount, NSString * const capturedStrings[captureCount], const NSRange capturedRanges[captureCount], volatile BOOL * const stop))block; 260 | - (BOOL)RKL_METHOD_PREPEND(enumerateStringsMatchedByRegex):(NSString *)regex options:(RKLRegexOptions)options inRange:(NSRange)range error:(NSError **)error enumerationOptions:(RKLRegexEnumerationOptions)enumerationOptions usingBlock:(void (^)(NSInteger captureCount, NSString * const capturedStrings[captureCount], const NSRange capturedRanges[captureCount], volatile BOOL * const stop))block; 261 | 262 | - (BOOL)RKL_METHOD_PREPEND(enumerateStringsSeparatedByRegex):(NSString *)regex usingBlock:(void (^)(NSInteger captureCount, NSString * const capturedStrings[captureCount], const NSRange capturedRanges[captureCount], volatile BOOL * const stop))block; 263 | - (BOOL)RKL_METHOD_PREPEND(enumerateStringsSeparatedByRegex):(NSString *)regex options:(RKLRegexOptions)options inRange:(NSRange)range error:(NSError **)error enumerationOptions:(RKLRegexEnumerationOptions)enumerationOptions usingBlock:(void (^)(NSInteger captureCount, NSString * const capturedStrings[captureCount], const NSRange capturedRanges[captureCount], volatile BOOL * const stop))block; 264 | 265 | - (NSString *)RKL_METHOD_PREPEND(stringByReplacingOccurrencesOfRegex):(NSString *)regex usingBlock:(NSString *(^)(NSInteger captureCount, NSString * const capturedStrings[captureCount], const NSRange capturedRanges[captureCount], volatile BOOL * const stop))block; 266 | - (NSString *)RKL_METHOD_PREPEND(stringByReplacingOccurrencesOfRegex):(NSString *)regex options:(RKLRegexOptions)options inRange:(NSRange)range error:(NSError **)error enumerationOptions:(RKLRegexEnumerationOptions)enumerationOptions usingBlock:(NSString *(^)(NSInteger captureCount, NSString * const capturedStrings[captureCount], const NSRange capturedRanges[captureCount], volatile BOOL * const stop))block; 267 | 268 | #endif // _RKL_BLOCKS_ENABLED 269 | 270 | @end 271 | 272 | @interface NSMutableString (RegexKitLiteAdditions) 273 | 274 | - (NSInteger)RKL_METHOD_PREPEND(replaceOccurrencesOfRegex):(NSString *)regex withString:(NSString *)replacement; 275 | - (NSInteger)RKL_METHOD_PREPEND(replaceOccurrencesOfRegex):(NSString *)regex withString:(NSString *)replacement range:(NSRange)searchRange; 276 | - (NSInteger)RKL_METHOD_PREPEND(replaceOccurrencesOfRegex):(NSString *)regex withString:(NSString *)replacement options:(RKLRegexOptions)options range:(NSRange)searchRange error:(NSError **)error; 277 | 278 | //// >= 4.0 279 | 280 | #ifdef _RKL_BLOCKS_ENABLED 281 | 282 | - (NSInteger)RKL_METHOD_PREPEND(replaceOccurrencesOfRegex):(NSString *)regex usingBlock:(NSString *(^)(NSInteger captureCount, NSString * const capturedStrings[captureCount], const NSRange capturedRanges[captureCount], volatile BOOL * const stop))block; 283 | - (NSInteger)RKL_METHOD_PREPEND(replaceOccurrencesOfRegex):(NSString *)regex options:(RKLRegexOptions)options inRange:(NSRange)range error:(NSError **)error enumerationOptions:(RKLRegexEnumerationOptions)enumerationOptions usingBlock:(NSString *(^)(NSInteger captureCount, NSString * const capturedStrings[captureCount], const NSRange capturedRanges[captureCount], volatile BOOL * const stop))block; 284 | 285 | #endif // _RKL_BLOCKS_ENABLED 286 | 287 | @end 288 | 289 | #endif // __OBJC__ 290 | 291 | #endif // _REGEXKITLITE_H_ 292 | 293 | #ifdef __cplusplus 294 | } // extern "C" 295 | #endif 296 | -------------------------------------------------------------------------------- /Gmail.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 45; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1DDD58160DA1D0A300B32029 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1DDD58140DA1D0A300B32029 /* MainMenu.xib */; }; 11 | 256AC3DA0F4B6AC300CF3369 /* GmailAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 256AC3D90F4B6AC300CF3369 /* GmailAppDelegate.m */; }; 12 | 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; }; 13 | 8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; 14 | 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; 15 | C618BC7A122762970053EF89 /* GmailWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = C618BC79122762970053EF89 /* GmailWindow.xib */; }; 16 | C618BC7E122763070053EF89 /* GmailWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = C618BC7D122763070053EF89 /* GmailWindowController.m */; }; 17 | C618BCB4122764540053EF89 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C618BCB3122764540053EF89 /* WebKit.framework */; }; 18 | C618BCD1122766870053EF89 /* GmailWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = C618BCD0122766870053EF89 /* GmailWindow.m */; }; 19 | C618BCE71227678B0053EF89 /* Icon.icns in Resources */ = {isa = PBXBuildFile; fileRef = C618BCE61227678B0053EF89 /* Icon.icns */; }; 20 | C618BCFC122768FA0053EF89 /* NullRequestHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = C618BCFB122768FA0053EF89 /* NullRequestHandler.m */; }; 21 | C65AC8C6122781D400CEA888 /* phone.png in Resources */ = {isa = PBXBuildFile; fileRef = C65AC8C5122781D400CEA888 /* phone.png */; }; 22 | C65AC8FD1227840600CEA888 /* Quartz.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C65AC8FC1227840600CEA888 /* Quartz.framework */; }; 23 | C698F9681227ACC500AEC0D7 /* Growl.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C698F9671227ACC500AEC0D7 /* Growl.framework */; }; 24 | C698F96B1227ACCA00AEC0D7 /* Growl.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C698F9671227ACC500AEC0D7 /* Growl.framework */; }; 25 | C698F9751227ACD600AEC0D7 /* SafariBar.m in Sources */ = {isa = PBXBuildFile; fileRef = C698F9731227ACD600AEC0D7 /* SafariBar.m */; }; 26 | C698F9861227AD3A00AEC0D7 /* Growler.m in Sources */ = {isa = PBXBuildFile; fileRef = C698F9851227AD3A00AEC0D7 /* Growler.m */; }; 27 | C698F98B1227AD5600AEC0D7 /* RegexKitLite.m in Sources */ = {isa = PBXBuildFile; fileRef = C698F98A1227AD5600AEC0D7 /* RegexKitLite.m */; }; 28 | C698F9EE1227B37300AEC0D7 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = C698F9ED1227B37300AEC0D7 /* Credits.rtf */; }; 29 | C6AF962612277225003F9D8F /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C6AF962512277225003F9D8F /* Sparkle.framework */; }; 30 | C6AF962B12277249003F9D8F /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C6AF962512277225003F9D8F /* Sparkle.framework */; }; 31 | C6CD0E24122B9CD900CD30C7 /* dsa_pub.pem in Resources */ = {isa = PBXBuildFile; fileRef = C6CD0E23122B9CD900CD30C7 /* dsa_pub.pem */; }; 32 | C6DDB9AC122B84FA0027A0CC /* gmailssb.js in Sources */ = {isa = PBXBuildFile; fileRef = C6DDB9AB122B84FA0027A0CC /* gmailssb.js */; }; 33 | C6DDB9B9122B85850027A0CC /* gmailssb.js in Resources */ = {isa = PBXBuildFile; fileRef = C6DDB9AB122B84FA0027A0CC /* gmailssb.js */; }; 34 | /* End PBXBuildFile section */ 35 | 36 | /* Begin PBXCopyFilesBuildPhase section */ 37 | C6AF962E1227725B003F9D8F /* Frameworks */ = { 38 | isa = PBXCopyFilesBuildPhase; 39 | buildActionMask = 2147483647; 40 | dstPath = ""; 41 | dstSubfolderSpec = 10; 42 | files = ( 43 | C698F96B1227ACCA00AEC0D7 /* Growl.framework in Frameworks */, 44 | C6AF962B12277249003F9D8F /* Sparkle.framework in Frameworks */, 45 | ); 46 | name = Frameworks; 47 | runOnlyForDeploymentPostprocessing = 0; 48 | }; 49 | /* End PBXCopyFilesBuildPhase section */ 50 | 51 | /* Begin PBXFileReference section */ 52 | 089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; 53 | 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 54 | 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = ""; }; 55 | 1DDD58150DA1D0A300B32029 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/MainMenu.xib; sourceTree = ""; }; 56 | 256AC3D80F4B6AC300CF3369 /* GmailAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GmailAppDelegate.h; sourceTree = ""; }; 57 | 256AC3D90F4B6AC300CF3369 /* GmailAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GmailAppDelegate.m; sourceTree = ""; }; 58 | 256AC3F00F4B6AF500CF3369 /* Gmail_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Gmail_Prefix.pch; sourceTree = ""; }; 59 | 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 60 | 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 61 | 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; 62 | 8D1107310486CEB800E47090 /* Gmail-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Gmail-Info.plist"; sourceTree = ""; }; 63 | 8D1107320486CEB800E47090 /* Gmail.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Gmail.app; sourceTree = BUILT_PRODUCTS_DIR; }; 64 | C618BC79122762970053EF89 /* GmailWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = GmailWindow.xib; sourceTree = ""; }; 65 | C618BC7C122763070053EF89 /* GmailWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GmailWindowController.h; sourceTree = ""; }; 66 | C618BC7D122763070053EF89 /* GmailWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GmailWindowController.m; sourceTree = ""; }; 67 | C618BCB3122764540053EF89 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; 68 | C618BCCF122766870053EF89 /* GmailWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GmailWindow.h; sourceTree = ""; }; 69 | C618BCD0122766870053EF89 /* GmailWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GmailWindow.m; sourceTree = ""; }; 70 | C618BCE61227678B0053EF89 /* Icon.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = Icon.icns; sourceTree = ""; }; 71 | C618BCFA122768FA0053EF89 /* NullRequestHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NullRequestHandler.h; sourceTree = ""; }; 72 | C618BCFB122768FA0053EF89 /* NullRequestHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NullRequestHandler.m; sourceTree = ""; }; 73 | C65AC8C5122781D400CEA888 /* phone.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = phone.png; sourceTree = ""; }; 74 | C65AC8FC1227840600CEA888 /* Quartz.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quartz.framework; path = System/Library/Frameworks/Quartz.framework; sourceTree = SDKROOT; }; 75 | C698F9671227ACC500AEC0D7 /* Growl.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Growl.framework; sourceTree = ""; }; 76 | C698F9721227ACD600AEC0D7 /* SafariBar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SafariBar.h; sourceTree = ""; }; 77 | C698F9731227ACD600AEC0D7 /* SafariBar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SafariBar.m; sourceTree = ""; }; 78 | C698F9841227AD3A00AEC0D7 /* Growler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Growler.h; sourceTree = ""; }; 79 | C698F9851227AD3A00AEC0D7 /* Growler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Growler.m; sourceTree = ""; }; 80 | C698F9891227AD5600AEC0D7 /* RegexKitLite.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegexKitLite.h; sourceTree = ""; }; 81 | C698F98A1227AD5600AEC0D7 /* RegexKitLite.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RegexKitLite.m; sourceTree = ""; }; 82 | C698F9ED1227B37300AEC0D7 /* Credits.rtf */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; path = Credits.rtf; sourceTree = ""; }; 83 | C6AF962512277225003F9D8F /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Sparkle.framework; sourceTree = ""; }; 84 | C6CD0E23122B9CD900CD30C7 /* dsa_pub.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = dsa_pub.pem; sourceTree = ""; }; 85 | C6DDB9AB122B84FA0027A0CC /* gmailssb.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = gmailssb.js; sourceTree = ""; }; 86 | /* End PBXFileReference section */ 87 | 88 | /* Begin PBXFrameworksBuildPhase section */ 89 | 8D11072E0486CEB800E47090 /* Frameworks */ = { 90 | isa = PBXFrameworksBuildPhase; 91 | buildActionMask = 2147483647; 92 | files = ( 93 | 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, 94 | C618BCB4122764540053EF89 /* WebKit.framework in Frameworks */, 95 | C6AF962612277225003F9D8F /* Sparkle.framework in Frameworks */, 96 | C65AC8FD1227840600CEA888 /* Quartz.framework in Frameworks */, 97 | C698F9681227ACC500AEC0D7 /* Growl.framework in Frameworks */, 98 | ); 99 | runOnlyForDeploymentPostprocessing = 0; 100 | }; 101 | /* End PBXFrameworksBuildPhase section */ 102 | 103 | /* Begin PBXGroup section */ 104 | 080E96DDFE201D6D7F000001 /* Classes */ = { 105 | isa = PBXGroup; 106 | children = ( 107 | 256AC3D80F4B6AC300CF3369 /* GmailAppDelegate.h */, 108 | 256AC3D90F4B6AC300CF3369 /* GmailAppDelegate.m */, 109 | C618BC7C122763070053EF89 /* GmailWindowController.h */, 110 | C618BC7D122763070053EF89 /* GmailWindowController.m */, 111 | C618BCCF122766870053EF89 /* GmailWindow.h */, 112 | C618BCD0122766870053EF89 /* GmailWindow.m */, 113 | C618BCFA122768FA0053EF89 /* NullRequestHandler.h */, 114 | C618BCFB122768FA0053EF89 /* NullRequestHandler.m */, 115 | C698F9721227ACD600AEC0D7 /* SafariBar.h */, 116 | C698F9731227ACD600AEC0D7 /* SafariBar.m */, 117 | C698F9841227AD3A00AEC0D7 /* Growler.h */, 118 | C698F9851227AD3A00AEC0D7 /* Growler.m */, 119 | ); 120 | name = Classes; 121 | sourceTree = ""; 122 | }; 123 | 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { 124 | isa = PBXGroup; 125 | children = ( 126 | C698F9671227ACC500AEC0D7 /* Growl.framework */, 127 | C6AF962512277225003F9D8F /* Sparkle.framework */, 128 | 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, 129 | C618BCB3122764540053EF89 /* WebKit.framework */, 130 | C65AC8FC1227840600CEA888 /* Quartz.framework */, 131 | ); 132 | name = "Linked Frameworks"; 133 | sourceTree = ""; 134 | }; 135 | 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = { 136 | isa = PBXGroup; 137 | children = ( 138 | 29B97324FDCFA39411CA2CEA /* AppKit.framework */, 139 | 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */, 140 | 29B97325FDCFA39411CA2CEA /* Foundation.framework */, 141 | ); 142 | name = "Other Frameworks"; 143 | sourceTree = ""; 144 | }; 145 | 19C28FACFE9D520D11CA2CBB /* Products */ = { 146 | isa = PBXGroup; 147 | children = ( 148 | 8D1107320486CEB800E47090 /* Gmail.app */, 149 | ); 150 | name = Products; 151 | sourceTree = ""; 152 | }; 153 | 29B97314FDCFA39411CA2CEA /* Gmail */ = { 154 | isa = PBXGroup; 155 | children = ( 156 | 080E96DDFE201D6D7F000001 /* Classes */, 157 | 29B97315FDCFA39411CA2CEA /* Other Sources */, 158 | 29B97317FDCFA39411CA2CEA /* Resources */, 159 | 29B97323FDCFA39411CA2CEA /* Frameworks */, 160 | 19C28FACFE9D520D11CA2CBB /* Products */, 161 | ); 162 | name = Gmail; 163 | sourceTree = ""; 164 | }; 165 | 29B97315FDCFA39411CA2CEA /* Other Sources */ = { 166 | isa = PBXGroup; 167 | children = ( 168 | C698F9891227AD5600AEC0D7 /* RegexKitLite.h */, 169 | C698F98A1227AD5600AEC0D7 /* RegexKitLite.m */, 170 | 256AC3F00F4B6AF500CF3369 /* Gmail_Prefix.pch */, 171 | 29B97316FDCFA39411CA2CEA /* main.m */, 172 | ); 173 | name = "Other Sources"; 174 | sourceTree = ""; 175 | }; 176 | 29B97317FDCFA39411CA2CEA /* Resources */ = { 177 | isa = PBXGroup; 178 | children = ( 179 | C6CD0E23122B9CD900CD30C7 /* dsa_pub.pem */, 180 | C618BCE81227678E0053EF89 /* Images */, 181 | C6DDB9AB122B84FA0027A0CC /* gmailssb.js */, 182 | 8D1107310486CEB800E47090 /* Gmail-Info.plist */, 183 | C698F9ED1227B37300AEC0D7 /* Credits.rtf */, 184 | 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */, 185 | 1DDD58140DA1D0A300B32029 /* MainMenu.xib */, 186 | C618BC79122762970053EF89 /* GmailWindow.xib */, 187 | ); 188 | name = Resources; 189 | sourceTree = ""; 190 | }; 191 | 29B97323FDCFA39411CA2CEA /* Frameworks */ = { 192 | isa = PBXGroup; 193 | children = ( 194 | 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */, 195 | 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */, 196 | ); 197 | name = Frameworks; 198 | sourceTree = ""; 199 | }; 200 | C618BCE81227678E0053EF89 /* Images */ = { 201 | isa = PBXGroup; 202 | children = ( 203 | C65AC8C5122781D400CEA888 /* phone.png */, 204 | C618BCE61227678B0053EF89 /* Icon.icns */, 205 | ); 206 | name = Images; 207 | sourceTree = ""; 208 | }; 209 | /* End PBXGroup section */ 210 | 211 | /* Begin PBXNativeTarget section */ 212 | 8D1107260486CEB800E47090 /* Gmail-SSB */ = { 213 | isa = PBXNativeTarget; 214 | buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "Gmail-SSB" */; 215 | buildPhases = ( 216 | 8D1107290486CEB800E47090 /* Resources */, 217 | 8D11072C0486CEB800E47090 /* Sources */, 218 | 8D11072E0486CEB800E47090 /* Frameworks */, 219 | C6AF962E1227725B003F9D8F /* Frameworks */, 220 | ); 221 | buildRules = ( 222 | ); 223 | dependencies = ( 224 | ); 225 | name = "Gmail-SSB"; 226 | productInstallPath = "$(HOME)/Applications"; 227 | productName = Gmail; 228 | productReference = 8D1107320486CEB800E47090 /* Gmail.app */; 229 | productType = "com.apple.product-type.application"; 230 | }; 231 | /* End PBXNativeTarget section */ 232 | 233 | /* Begin PBXProject section */ 234 | 29B97313FDCFA39411CA2CEA /* Project object */ = { 235 | isa = PBXProject; 236 | buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Gmail" */; 237 | compatibilityVersion = "Xcode 3.1"; 238 | hasScannedForEncodings = 1; 239 | mainGroup = 29B97314FDCFA39411CA2CEA /* Gmail */; 240 | projectDirPath = ""; 241 | projectRoot = ""; 242 | targets = ( 243 | 8D1107260486CEB800E47090 /* Gmail-SSB */, 244 | ); 245 | }; 246 | /* End PBXProject section */ 247 | 248 | /* Begin PBXResourcesBuildPhase section */ 249 | 8D1107290486CEB800E47090 /* Resources */ = { 250 | isa = PBXResourcesBuildPhase; 251 | buildActionMask = 2147483647; 252 | files = ( 253 | 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */, 254 | 1DDD58160DA1D0A300B32029 /* MainMenu.xib in Resources */, 255 | C618BCE71227678B0053EF89 /* Icon.icns in Resources */, 256 | C65AC8C6122781D400CEA888 /* phone.png in Resources */, 257 | C698F9EE1227B37300AEC0D7 /* Credits.rtf in Resources */, 258 | C6DDB9B9122B85850027A0CC /* gmailssb.js in Resources */, 259 | C618BC7A122762970053EF89 /* GmailWindow.xib in Resources */, 260 | C6CD0E24122B9CD900CD30C7 /* dsa_pub.pem in Resources */, 261 | ); 262 | runOnlyForDeploymentPostprocessing = 0; 263 | }; 264 | /* End PBXResourcesBuildPhase section */ 265 | 266 | /* Begin PBXSourcesBuildPhase section */ 267 | 8D11072C0486CEB800E47090 /* Sources */ = { 268 | isa = PBXSourcesBuildPhase; 269 | buildActionMask = 2147483647; 270 | files = ( 271 | 8D11072D0486CEB800E47090 /* main.m in Sources */, 272 | 256AC3DA0F4B6AC300CF3369 /* GmailAppDelegate.m in Sources */, 273 | C618BC7E122763070053EF89 /* GmailWindowController.m in Sources */, 274 | C618BCD1122766870053EF89 /* GmailWindow.m in Sources */, 275 | C618BCFC122768FA0053EF89 /* NullRequestHandler.m in Sources */, 276 | C698F9751227ACD600AEC0D7 /* SafariBar.m in Sources */, 277 | C698F9861227AD3A00AEC0D7 /* Growler.m in Sources */, 278 | C698F98B1227AD5600AEC0D7 /* RegexKitLite.m in Sources */, 279 | C6DDB9AC122B84FA0027A0CC /* gmailssb.js in Sources */, 280 | ); 281 | runOnlyForDeploymentPostprocessing = 0; 282 | }; 283 | /* End PBXSourcesBuildPhase section */ 284 | 285 | /* Begin PBXVariantGroup section */ 286 | 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = { 287 | isa = PBXVariantGroup; 288 | children = ( 289 | 089C165DFE840E0CC02AAC07 /* English */, 290 | ); 291 | name = InfoPlist.strings; 292 | sourceTree = ""; 293 | }; 294 | 1DDD58140DA1D0A300B32029 /* MainMenu.xib */ = { 295 | isa = PBXVariantGroup; 296 | children = ( 297 | 1DDD58150DA1D0A300B32029 /* English */, 298 | ); 299 | name = MainMenu.xib; 300 | sourceTree = ""; 301 | }; 302 | /* End PBXVariantGroup section */ 303 | 304 | /* Begin XCBuildConfiguration section */ 305 | C01FCF4B08A954540054247B /* Debug */ = { 306 | isa = XCBuildConfiguration; 307 | buildSettings = { 308 | ALWAYS_SEARCH_USER_PATHS = NO; 309 | COPY_PHASE_STRIP = NO; 310 | FRAMEWORK_SEARCH_PATHS = ( 311 | "$(inherited)", 312 | "\"$(SRCROOT)\"", 313 | ); 314 | GCC_DYNAMIC_NO_PIC = NO; 315 | GCC_ENABLE_FIX_AND_CONTINUE = YES; 316 | GCC_MODEL_TUNING = G5; 317 | GCC_OPTIMIZATION_LEVEL = 0; 318 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 319 | GCC_PREFIX_HEADER = Gmail_Prefix.pch; 320 | INFOPLIST_FILE = "Gmail-Info.plist"; 321 | INSTALL_PATH = "$(HOME)/Applications"; 322 | OTHER_LDFLAGS = "-licucore"; 323 | PRODUCT_NAME = Gmail; 324 | }; 325 | name = Debug; 326 | }; 327 | C01FCF4C08A954540054247B /* Release */ = { 328 | isa = XCBuildConfiguration; 329 | buildSettings = { 330 | ALWAYS_SEARCH_USER_PATHS = NO; 331 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 332 | FRAMEWORK_SEARCH_PATHS = ( 333 | "$(inherited)", 334 | "\"$(SRCROOT)\"", 335 | ); 336 | GCC_MODEL_TUNING = G5; 337 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 338 | GCC_PREFIX_HEADER = Gmail_Prefix.pch; 339 | INFOPLIST_FILE = "Gmail-Info.plist"; 340 | INSTALL_PATH = "$(HOME)/Applications"; 341 | OTHER_LDFLAGS = "-licucore"; 342 | PRODUCT_NAME = Gmail; 343 | }; 344 | name = Release; 345 | }; 346 | C01FCF4F08A954540054247B /* Debug */ = { 347 | isa = XCBuildConfiguration; 348 | buildSettings = { 349 | ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; 350 | GCC_C_LANGUAGE_STANDARD = gnu99; 351 | GCC_ENABLE_OBJC_GC = required; 352 | GCC_OPTIMIZATION_LEVEL = 0; 353 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 354 | GCC_WARN_UNUSED_VARIABLE = YES; 355 | ONLY_ACTIVE_ARCH = YES; 356 | OTHER_LDFLAGS = "-licucore"; 357 | PREBINDING = NO; 358 | SDKROOT = macosx10.6; 359 | }; 360 | name = Debug; 361 | }; 362 | C01FCF5008A954540054247B /* Release */ = { 363 | isa = XCBuildConfiguration; 364 | buildSettings = { 365 | ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; 366 | GCC_C_LANGUAGE_STANDARD = gnu99; 367 | GCC_ENABLE_OBJC_GC = required; 368 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 369 | GCC_WARN_UNUSED_VARIABLE = YES; 370 | OTHER_LDFLAGS = "-licucore"; 371 | PREBINDING = NO; 372 | SDKROOT = macosx10.6; 373 | }; 374 | name = Release; 375 | }; 376 | /* End XCBuildConfiguration section */ 377 | 378 | /* Begin XCConfigurationList section */ 379 | C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "Gmail-SSB" */ = { 380 | isa = XCConfigurationList; 381 | buildConfigurations = ( 382 | C01FCF4B08A954540054247B /* Debug */, 383 | C01FCF4C08A954540054247B /* Release */, 384 | ); 385 | defaultConfigurationIsVisible = 0; 386 | defaultConfigurationName = Release; 387 | }; 388 | C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Gmail" */ = { 389 | isa = XCConfigurationList; 390 | buildConfigurations = ( 391 | C01FCF4F08A954540054247B /* Debug */, 392 | C01FCF5008A954540054247B /* Release */, 393 | ); 394 | defaultConfigurationIsVisible = 0; 395 | defaultConfigurationName = Release; 396 | }; 397 | /* End XCConfigurationList section */ 398 | }; 399 | rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; 400 | } 401 | -------------------------------------------------------------------------------- /Growl.framework/Versions/A/Headers/GrowlApplicationBridge.h: -------------------------------------------------------------------------------- 1 | // 2 | // GrowlApplicationBridge.h 3 | // Growl 4 | // 5 | // Created by Evan Schoenberg on Wed Jun 16 2004. 6 | // Copyright 2004-2006 The Growl Project. All rights reserved. 7 | // 8 | 9 | /*! 10 | * @header GrowlApplicationBridge.h 11 | * @abstract Defines the GrowlApplicationBridge class. 12 | * @discussion This header defines the GrowlApplicationBridge class as well as 13 | * the GROWL_PREFPANE_BUNDLE_IDENTIFIER constant. 14 | */ 15 | 16 | #ifndef __GrowlApplicationBridge_h__ 17 | #define __GrowlApplicationBridge_h__ 18 | 19 | #import 20 | #import 21 | #import "GrowlDefines.h" 22 | 23 | //Forward declarations 24 | @protocol GrowlApplicationBridgeDelegate; 25 | 26 | //Internal notification when the user chooses not to install (to avoid continuing to cache notifications awaiting installation) 27 | #define GROWL_USER_CHOSE_NOT_TO_INSTALL_NOTIFICATION @"User chose not to install" 28 | 29 | //------------------------------------------------------------------------------ 30 | #pragma mark - 31 | 32 | /*! 33 | * @class GrowlApplicationBridge 34 | * @abstract A class used to interface with Growl. 35 | * @discussion This class provides a means to interface with Growl. 36 | * 37 | * Currently it provides a way to detect if Growl is installed and launch the 38 | * GrowlHelperApp if it's not already running. 39 | */ 40 | @interface GrowlApplicationBridge : NSObject { 41 | 42 | } 43 | 44 | /*! 45 | * @method isGrowlInstalled 46 | * @abstract Detects whether Growl is installed. 47 | * @discussion Determines if the Growl prefpane and its helper app are installed. 48 | * @result Returns YES if Growl is installed, NO otherwise. 49 | */ 50 | + (BOOL) isGrowlInstalled; 51 | 52 | /*! 53 | * @method isGrowlRunning 54 | * @abstract Detects whether GrowlHelperApp is currently running. 55 | * @discussion Cycles through the process list to find whether GrowlHelperApp is running and returns its findings. 56 | * @result Returns YES if GrowlHelperApp is running, NO otherwise. 57 | */ 58 | + (BOOL) isGrowlRunning; 59 | 60 | #pragma mark - 61 | 62 | /*! 63 | * @method setGrowlDelegate: 64 | * @abstract Set the object which will be responsible for providing and receiving Growl information. 65 | * @discussion This must be called before using GrowlApplicationBridge. 66 | * 67 | * The methods in the GrowlApplicationBridgeDelegate protocol are required 68 | * and return the basic information needed to register with Growl. 69 | * 70 | * The methods in the GrowlApplicationBridgeDelegate_InformalProtocol 71 | * informal protocol are individually optional. They provide a greater 72 | * degree of interaction between the application and growl such as informing 73 | * the application when one of its Growl notifications is clicked by the user. 74 | * 75 | * The methods in the GrowlApplicationBridgeDelegate_Installation_InformalProtocol 76 | * informal protocol are individually optional and are only applicable when 77 | * using the Growl-WithInstaller.framework which allows for automated Growl 78 | * installation. 79 | * 80 | * When this method is called, data will be collected from inDelegate, Growl 81 | * will be launched if it is not already running, and the application will be 82 | * registered with Growl. 83 | * 84 | * If using the Growl-WithInstaller framework, if Growl is already installed 85 | * but this copy of the framework has an updated version of Growl, the user 86 | * will be prompted to update automatically. 87 | * 88 | * @param inDelegate The delegate for the GrowlApplicationBridge. It must conform to the GrowlApplicationBridgeDelegate protocol. 89 | */ 90 | + (void) setGrowlDelegate:(NSObject *)inDelegate; 91 | 92 | /*! 93 | * @method growlDelegate 94 | * @abstract Return the object responsible for providing and receiving Growl information. 95 | * @discussion See setGrowlDelegate: for details. 96 | * @result The Growl delegate. 97 | */ 98 | + (NSObject *) growlDelegate; 99 | 100 | #pragma mark - 101 | 102 | /*! 103 | * @method notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext: 104 | * @abstract Send a Growl notification. 105 | * @discussion This is the preferred means for sending a Growl notification. 106 | * The notification name and at least one of the title and description are 107 | * required (all three are preferred). All other parameters may be 108 | * nil (or 0 or NO as appropriate) to accept default values. 109 | * 110 | * If using the Growl-WithInstaller framework, if Growl is not installed the 111 | * user will be prompted to install Growl. If the user cancels, this method 112 | * will have no effect until the next application session, at which time when 113 | * it is called the user will be prompted again. The user is also given the 114 | * option to not be prompted again. If the user does choose to install Growl, 115 | * the requested notification will be displayed once Growl is installed and 116 | * running. 117 | * 118 | * @param title The title of the notification displayed to the user. 119 | * @param description The full description of the notification displayed to the user. 120 | * @param notifName The internal name of the notification. Should be human-readable, as it will be displayed in the Growl preference pane. 121 | * @param iconData NSData object to show with the notification as its icon. If nil, the application's icon will be used instead. 122 | * @param priority The priority of the notification. The default value is 0; positive values are higher priority and negative values are lower priority. Not all Growl displays support priority. 123 | * @param isSticky If YES, the notification will remain on screen until clicked. Not all Growl displays support sticky notifications. 124 | * @param clickContext A context passed back to the Growl delegate if it implements -(void)growlNotificationWasClicked: and the notification is clicked. Not all display plugins support clicking. The clickContext must be plist-encodable (completely of NSString, NSArray, NSNumber, NSDictionary, and NSData types). 125 | */ 126 | + (void) notifyWithTitle:(NSString *)title 127 | description:(NSString *)description 128 | notificationName:(NSString *)notifName 129 | iconData:(NSData *)iconData 130 | priority:(signed int)priority 131 | isSticky:(BOOL)isSticky 132 | clickContext:(id)clickContext; 133 | 134 | /*! 135 | * @method notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:identifier: 136 | * @abstract Send a Growl notification. 137 | * @discussion This is the preferred means for sending a Growl notification. 138 | * The notification name and at least one of the title and description are 139 | * required (all three are preferred). All other parameters may be 140 | * nil (or 0 or NO as appropriate) to accept default values. 141 | * 142 | * If using the Growl-WithInstaller framework, if Growl is not installed the 143 | * user will be prompted to install Growl. If the user cancels, this method 144 | * will have no effect until the next application session, at which time when 145 | * it is called the user will be prompted again. The user is also given the 146 | * option to not be prompted again. If the user does choose to install Growl, 147 | * the requested notification will be displayed once Growl is installed and 148 | * running. 149 | * 150 | * @param title The title of the notification displayed to the user. 151 | * @param description The full description of the notification displayed to the user. 152 | * @param notifName The internal name of the notification. Should be human-readable, as it will be displayed in the Growl preference pane. 153 | * @param iconData NSData object to show with the notification as its icon. If nil, the application's icon will be used instead. 154 | * @param priority The priority of the notification. The default value is 0; positive values are higher priority and negative values are lower priority. Not all Growl displays support priority. 155 | * @param isSticky If YES, the notification will remain on screen until clicked. Not all Growl displays support sticky notifications. 156 | * @param clickContext A context passed back to the Growl delegate if it implements -(void)growlNotificationWasClicked: and the notification is clicked. Not all display plugins support clicking. The clickContext must be plist-encodable (completely of NSString, NSArray, NSNumber, NSDictionary, and NSData types). 157 | * @param identifier An identifier for this notification. Notifications with equal identifiers are coalesced. 158 | */ 159 | + (void) notifyWithTitle:(NSString *)title 160 | description:(NSString *)description 161 | notificationName:(NSString *)notifName 162 | iconData:(NSData *)iconData 163 | priority:(signed int)priority 164 | isSticky:(BOOL)isSticky 165 | clickContext:(id)clickContext 166 | identifier:(NSString *)identifier; 167 | 168 | /*! @method notifyWithDictionary: 169 | * @abstract Notifies using a userInfo dictionary suitable for passing to 170 | * NSDistributedNotificationCenter. 171 | * @param userInfo The dictionary to notify with. 172 | * @discussion Before Growl 0.6, your application would have posted 173 | * notifications using NSDistributedNotificationCenter by 174 | * creating a userInfo dictionary with the notification data. This had the 175 | * advantage of allowing you to add other data to the dictionary for programs 176 | * besides Growl that might be listening. 177 | * 178 | * This method allows you to use such dictionaries without being restricted 179 | * to using NSDistributedNotificationCenter. The keys for this dictionary 180 | * can be found in GrowlDefines.h. 181 | */ 182 | + (void) notifyWithDictionary:(NSDictionary *)userInfo; 183 | 184 | #pragma mark - 185 | 186 | /*! @method registerWithDictionary: 187 | * @abstract Register your application with Growl without setting a delegate. 188 | * @discussion When you call this method with a dictionary, 189 | * GrowlApplicationBridge registers your application using that dictionary. 190 | * If you pass nil, GrowlApplicationBridge will ask the delegate 191 | * (if there is one) for a dictionary, and if that doesn't work, it will look 192 | * in your application's bundle for an auto-discoverable plist. 193 | * (XXX refer to more information on that) 194 | * 195 | * If you pass a dictionary to this method, it must include the 196 | * GROWL_APP_NAME key, unless a delegate is set. 197 | * 198 | * This method is mainly an alternative to the delegate system introduced 199 | * with Growl 0.6. Without a delegate, you cannot receive callbacks such as 200 | * -growlIsReady (since they are sent to the delegate). You can, 201 | * however, set a delegate after registering without one. 202 | * 203 | * This method was introduced in Growl.framework 0.7. 204 | */ 205 | + (BOOL) registerWithDictionary:(NSDictionary *)regDict; 206 | 207 | /*! @method reregisterGrowlNotifications 208 | * @abstract Reregister the notifications for this application. 209 | * @discussion This method does not normally need to be called. If your 210 | * application changes what notifications it is registering with Growl, call 211 | * this method to have the Growl delegate's 212 | * -registrationDictionaryForGrowl method called again and the 213 | * Growl registration information updated. 214 | * 215 | * This method is now implemented using -registerWithDictionary:. 216 | */ 217 | + (void) reregisterGrowlNotifications; 218 | 219 | #pragma mark - 220 | 221 | /*! @method setWillRegisterWhenGrowlIsReady: 222 | * @abstract Tells GrowlApplicationBridge to register with Growl when Growl 223 | * launches (or not). 224 | * @discussion When Growl has started listening for notifications, it posts a 225 | * GROWL_IS_READY notification on the Distributed Notification 226 | * Center. GrowlApplicationBridge listens for this notification, using it to 227 | * perform various tasks (such as calling your delegate's 228 | * -growlIsReady method, if it has one). If this method is 229 | * called with YES, one of those tasks will be to reregister 230 | * with Growl (in the manner of -reregisterGrowlNotifications). 231 | * 232 | * This attribute is automatically set back to NO (the default) 233 | * after every GROWL_IS_READY notification. 234 | * @param flag YES if you want GrowlApplicationBridge to register with 235 | * Growl when next it is ready; NO if not. 236 | */ 237 | + (void) setWillRegisterWhenGrowlIsReady:(BOOL)flag; 238 | /*! @method willRegisterWhenGrowlIsReady 239 | * @abstract Reports whether GrowlApplicationBridge will register with Growl 240 | * when Growl next launches. 241 | * @result YES if GrowlApplicationBridge will register with Growl 242 | * when next it posts GROWL_IS_READY; NO if not. 243 | */ 244 | + (BOOL) willRegisterWhenGrowlIsReady; 245 | 246 | #pragma mark - 247 | 248 | /*! @method registrationDictionaryFromDelegate 249 | * @abstract Asks the delegate for a registration dictionary. 250 | * @discussion If no delegate is set, or if the delegate's 251 | * -registrationDictionaryForGrowl method returns 252 | * nil, this method returns nil. 253 | * 254 | * This method does not attempt to clean up the dictionary in any way - for 255 | * example, if it is missing the GROWL_APP_NAME key, the result 256 | * will be missing it too. Use +[GrowlApplicationBridge 257 | * registrationDictionaryByFillingInDictionary:] or 258 | * +[GrowlApplicationBridge 259 | * registrationDictionaryByFillingInDictionary:restrictToKeys:] to try 260 | * to fill in missing keys. 261 | * 262 | * This method was introduced in Growl.framework 0.7. 263 | * @result A registration dictionary. 264 | */ 265 | + (NSDictionary *) registrationDictionaryFromDelegate; 266 | 267 | /*! @method registrationDictionaryFromBundle: 268 | * @abstract Looks in a bundle for a registration dictionary. 269 | * @discussion This method looks in a bundle for an auto-discoverable 270 | * registration dictionary file using -[NSBundle 271 | * pathForResource:ofType:]. If it finds one, it loads the file using 272 | * +[NSDictionary dictionaryWithContentsOfFile:] and returns the 273 | * result. 274 | * 275 | * If you pass nil as the bundle, the main bundle is examined. 276 | * 277 | * This method does not attempt to clean up the dictionary in any way - for 278 | * example, if it is missing the GROWL_APP_NAME key, the result 279 | * will be missing it too. Use +[GrowlApplicationBridge 280 | * registrationDictionaryByFillingInDictionary:] or 281 | * +[GrowlApplicationBridge 282 | * registrationDictionaryByFillingInDictionary:restrictToKeys:] to try 283 | * to fill in missing keys. 284 | * 285 | * This method was introduced in Growl.framework 0.7. 286 | * @result A registration dictionary. 287 | */ 288 | + (NSDictionary *) registrationDictionaryFromBundle:(NSBundle *)bundle; 289 | 290 | /*! @method bestRegistrationDictionary 291 | * @abstract Obtains a registration dictionary, filled out to the best of 292 | * GrowlApplicationBridge's knowledge. 293 | * @discussion This method creates a registration dictionary as best 294 | * GrowlApplicationBridge knows how. 295 | * 296 | * First, GrowlApplicationBridge contacts the Growl delegate (if there is 297 | * one) and gets the registration dictionary from that. If no such dictionary 298 | * was obtained, GrowlApplicationBridge looks in your application's main 299 | * bundle for an auto-discoverable registration dictionary file. If that 300 | * doesn't exist either, this method returns nil. 301 | * 302 | * Second, GrowlApplicationBridge calls 303 | * +registrationDictionaryByFillingInDictionary: with whatever 304 | * dictionary was obtained. The result of that method is the result of this 305 | * method. 306 | * 307 | * GrowlApplicationBridge uses this method when you call 308 | * +setGrowlDelegate:, or when you call 309 | * +registerWithDictionary: with nil. 310 | * 311 | * This method was introduced in Growl.framework 0.7. 312 | * @result A registration dictionary. 313 | */ 314 | + (NSDictionary *) bestRegistrationDictionary; 315 | 316 | #pragma mark - 317 | 318 | /*! @method registrationDictionaryByFillingInDictionary: 319 | * @abstract Tries to fill in missing keys in a registration dictionary. 320 | * @discussion This method examines the passed-in dictionary for missing keys, 321 | * and tries to work out correct values for them. As of 0.7, it uses: 322 | * 323 | * Key Value 324 | * --- ----- 325 | * GROWL_APP_NAME CFBundleExecutableName 326 | * GROWL_APP_ICON The icon of the application. 327 | * GROWL_APP_LOCATION The location of the application. 328 | * GROWL_NOTIFICATIONS_DEFAULT GROWL_NOTIFICATIONS_ALL 329 | * 330 | * Keys are only filled in if missing; if a key is present in the dictionary, 331 | * its value will not be changed. 332 | * 333 | * This method was introduced in Growl.framework 0.7. 334 | * @param regDict The dictionary to fill in. 335 | * @result The dictionary with the keys filled in. This is an autoreleased 336 | * copy of regDict. 337 | */ 338 | + (NSDictionary *) registrationDictionaryByFillingInDictionary:(NSDictionary *)regDict; 339 | /*! @method registrationDictionaryByFillingInDictionary:restrictToKeys: 340 | * @abstract Tries to fill in missing keys in a registration dictionary. 341 | * @discussion This method examines the passed-in dictionary for missing keys, 342 | * and tries to work out correct values for them. As of 0.7, it uses: 343 | * 344 | * Key Value 345 | * --- ----- 346 | * GROWL_APP_NAME CFBundleExecutableName 347 | * GROWL_APP_ICON The icon of the application. 348 | * GROWL_APP_LOCATION The location of the application. 349 | * GROWL_NOTIFICATIONS_DEFAULT GROWL_NOTIFICATIONS_ALL 350 | * 351 | * Only those keys that are listed in keys will be filled in. 352 | * Other missing keys are ignored. Also, keys are only filled in if missing; 353 | * if a key is present in the dictionary, its value will not be changed. 354 | * 355 | * This method was introduced in Growl.framework 0.7. 356 | * @param regDict The dictionary to fill in. 357 | * @param keys The keys to fill in. If nil, any missing keys are filled in. 358 | * @result The dictionary with the keys filled in. This is an autoreleased 359 | * copy of regDict. 360 | */ 361 | + (NSDictionary *) registrationDictionaryByFillingInDictionary:(NSDictionary *)regDict restrictToKeys:(NSSet *)keys; 362 | 363 | /*! @brief Tries to fill in missing keys in a notification dictionary. 364 | * @param notifDict The dictionary to fill in. 365 | * @return The dictionary with the keys filled in. This will be a separate instance from \a notifDict. 366 | * @discussion This function examines the \a notifDict for missing keys, and 367 | * tries to get them from the last known registration dictionary. As of 1.1, 368 | * the keys that it will look for are: 369 | * 370 | * \li GROWL_APP_NAME 371 | * \li GROWL_APP_ICON 372 | * 373 | * @since Growl.framework 1.1 374 | */ 375 | + (NSDictionary *) notificationDictionaryByFillingInDictionary:(NSDictionary *)regDict; 376 | 377 | + (NSDictionary *) frameworkInfoDictionary; 378 | @end 379 | 380 | //------------------------------------------------------------------------------ 381 | #pragma mark - 382 | 383 | /*! 384 | * @protocol GrowlApplicationBridgeDelegate 385 | * @abstract Required protocol for the Growl delegate. 386 | * @discussion The methods in this protocol are required and are called 387 | * automatically as needed by GrowlApplicationBridge. See 388 | * +[GrowlApplicationBridge setGrowlDelegate:]. 389 | * See also GrowlApplicationBridgeDelegate_InformalProtocol. 390 | */ 391 | 392 | @protocol GrowlApplicationBridgeDelegate 393 | 394 | // -registrationDictionaryForGrowl has moved to the informal protocol as of 0.7. 395 | 396 | @end 397 | 398 | //------------------------------------------------------------------------------ 399 | #pragma mark - 400 | 401 | /*! 402 | * @category NSObject(GrowlApplicationBridgeDelegate_InformalProtocol) 403 | * @abstract Methods which may be optionally implemented by the GrowlDelegate. 404 | * @discussion The methods in this informal protocol will only be called if implemented by the delegate. 405 | */ 406 | @interface NSObject (GrowlApplicationBridgeDelegate_InformalProtocol) 407 | 408 | /*! 409 | * @method registrationDictionaryForGrowl 410 | * @abstract Return the dictionary used to register this application with Growl. 411 | * @discussion The returned dictionary gives Growl the complete list of 412 | * notifications this application will ever send, and it also specifies which 413 | * notifications should be enabled by default. Each is specified by an array 414 | * of NSString objects. 415 | * 416 | * For most applications, these two arrays can be the same (if all sent 417 | * notifications should be displayed by default). 418 | * 419 | * The NSString objects of these arrays will correspond to the 420 | * notificationName: parameter passed in 421 | * +[GrowlApplicationBridge 422 | * notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:] calls. 423 | * 424 | * The dictionary should have the required key object pairs: 425 | * key: GROWL_NOTIFICATIONS_ALL object: NSArray of NSString objects 426 | * key: GROWL_NOTIFICATIONS_DEFAULT object: NSArray of NSString objects 427 | * 428 | * The dictionary may have the following key object pairs: 429 | * key: GROWL_NOTIFICATIONS_HUMAN_READABLE_NAMES object: NSDictionary of key: notification name object: human-readable notification name 430 | * 431 | * You do not need to implement this method if you have an auto-discoverable 432 | * plist file in your app bundle. (XXX refer to more information on that) 433 | * 434 | * @result The NSDictionary to use for registration. 435 | */ 436 | - (NSDictionary *) registrationDictionaryForGrowl; 437 | 438 | /*! 439 | * @method applicationNameForGrowl 440 | * @abstract Return the name of this application which will be used for Growl bookkeeping. 441 | * @discussion This name is used both internally and in the Growl preferences. 442 | * 443 | * This should remain stable between different versions and incarnations of 444 | * your application. 445 | * For example, "SurfWriter" is a good app name, whereas "SurfWriter 2.0" and 446 | * "SurfWriter Lite" are not. 447 | * 448 | * You do not need to implement this method if you are providing the 449 | * application name elsewhere, meaning in an auto-discoverable plist file in 450 | * your app bundle (XXX refer to more information on that) or in the result 451 | * of -registrationDictionaryForGrowl. 452 | * 453 | * @result The name of the application using Growl. 454 | */ 455 | - (NSString *) applicationNameForGrowl; 456 | 457 | /*! 458 | * @method applicationIconForGrowl 459 | * @abstract Return the NSImage to treat as the application icon. 460 | * @discussion The delegate may optionally return an NSImage 461 | * object to use as the application icon. If this method is not implemented, 462 | * {{{-applicationIconDataForGrowl}}} is tried. If that method is not 463 | * implemented, the application's own icon is used. Neither method is 464 | * generally needed. 465 | * @result The NSImage to treat as the application icon. 466 | */ 467 | - (NSImage *) applicationIconForGrowl; 468 | 469 | /*! 470 | * @method applicationIconDataForGrowl 471 | * @abstract Return the NSData to treat as the application icon. 472 | * @discussion The delegate may optionally return an NSData 473 | * object to use as the application icon; if this is not implemented, the 474 | * application's own icon is used. This is not generally needed. 475 | * @result The NSData to treat as the application icon. 476 | * @deprecated In version 1.1, in favor of {{{-applicationIconForGrowl}}}. 477 | */ 478 | - (NSData *) applicationIconDataForGrowl; 479 | 480 | /*! 481 | * @method growlIsReady 482 | * @abstract Informs the delegate that Growl has launched. 483 | * @discussion Informs the delegate that Growl (specifically, the 484 | * GrowlHelperApp) was launched successfully. The application can take actions 485 | * with the knowledge that Growl is installed and functional. 486 | */ 487 | - (void) growlIsReady; 488 | 489 | /*! 490 | * @method growlNotificationWasClicked: 491 | * @abstract Informs the delegate that a Growl notification was clicked. 492 | * @discussion Informs the delegate that a Growl notification was clicked. It 493 | * is only sent for notifications sent with a non-nil 494 | * clickContext, so if you want to receive a message when a notification is 495 | * clicked, clickContext must not be nil when calling 496 | * +[GrowlApplicationBridge notifyWithTitle: description:notificationName:iconData:priority:isSticky:clickContext:]. 497 | * @param clickContext The clickContext passed when displaying the notification originally via +[GrowlApplicationBridge notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:]. 498 | */ 499 | - (void) growlNotificationWasClicked:(id)clickContext; 500 | 501 | /*! 502 | * @method growlNotificationTimedOut: 503 | * @abstract Informs the delegate that a Growl notification timed out. 504 | * @discussion Informs the delegate that a Growl notification timed out. It 505 | * is only sent for notifications sent with a non-nil 506 | * clickContext, so if you want to receive a message when a notification is 507 | * clicked, clickContext must not be nil when calling 508 | * +[GrowlApplicationBridge notifyWithTitle: description:notificationName:iconData:priority:isSticky:clickContext:]. 509 | * @param clickContext The clickContext passed when displaying the notification originally via +[GrowlApplicationBridge notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:]. 510 | */ 511 | - (void) growlNotificationTimedOut:(id)clickContext; 512 | 513 | @end 514 | 515 | #pragma mark - 516 | /*! 517 | * @category NSObject(GrowlApplicationBridgeDelegate_Installation_InformalProtocol) 518 | * @abstract Methods which may be optionally implemented by the Growl delegate when used with Growl-WithInstaller.framework. 519 | * @discussion The methods in this informal protocol will only be called if 520 | * implemented by the delegate. They allow greater control of the information 521 | * presented to the user when installing or upgrading Growl from within your 522 | * application when using Growl-WithInstaller.framework. 523 | */ 524 | @interface NSObject (GrowlApplicationBridgeDelegate_Installation_InformalProtocol) 525 | 526 | /*! 527 | * @method growlInstallationWindowTitle 528 | * @abstract Return the title of the installation window. 529 | * @discussion If not implemented, Growl will use a default, localized title. 530 | * @result An NSString object to use as the title. 531 | */ 532 | - (NSString *)growlInstallationWindowTitle; 533 | 534 | /*! 535 | * @method growlUpdateWindowTitle 536 | * @abstract Return the title of the upgrade window. 537 | * @discussion If not implemented, Growl will use a default, localized title. 538 | * @result An NSString object to use as the title. 539 | */ 540 | - (NSString *)growlUpdateWindowTitle; 541 | 542 | /*! 543 | * @method growlInstallationInformation 544 | * @abstract Return the information to display when installing. 545 | * @discussion This information may be as long or short as desired (the window 546 | * will be sized to fit it). It will be displayed to the user as an 547 | * explanation of what Growl is and what it can do in your application. It 548 | * should probably note that no download is required to install. 549 | * 550 | * If this is not implemented, Growl will use a default, localized explanation. 551 | * @result An NSAttributedString object to display. 552 | */ 553 | - (NSAttributedString *)growlInstallationInformation; 554 | 555 | /*! 556 | * @method growlUpdateInformation 557 | * @abstract Return the information to display when upgrading. 558 | * @discussion This information may be as long or short as desired (the window 559 | * will be sized to fit it). It will be displayed to the user as an 560 | * explanation that an updated version of Growl is included in your 561 | * application and no download is required. 562 | * 563 | * If this is not implemented, Growl will use a default, localized explanation. 564 | * @result An NSAttributedString object to display. 565 | */ 566 | - (NSAttributedString *)growlUpdateInformation; 567 | 568 | @end 569 | 570 | //private 571 | @interface GrowlApplicationBridge (GrowlInstallationPrompt_private) 572 | + (void) _userChoseNotToInstallGrowl; 573 | @end 574 | 575 | #endif /* __GrowlApplicationBridge_h__ */ 576 | --------------------------------------------------------------------------------