From a27dcf703627f4961f61b3026a22cd551df4e8e3 Mon Sep 17 00:00:00 2001 From: Siim Raud Date: Sat, 3 Sep 2022 09:19:09 +0300 Subject: [PATCH] feat: removed Growl (#210) Co-authored-by: Siim Raud --- Frameworks/Growl.framework/Growl | 1 - Frameworks/Growl.framework/Headers | 1 - Frameworks/Growl.framework/Resources | 1 - Frameworks/Growl.framework/Versions/A/Growl | Bin 259256 -> 0 bytes .../Versions/A/Headers/Growl.h | 6 - .../A/Headers/GrowlApplicationBridge-Carbon.h | 780 ------------------ .../A/Headers/GrowlApplicationBridge.h | 575 ------------- .../Versions/A/Headers/GrowlDefines.h | 348 -------- .../Versions/A/Resources/Info.plist | 24 - Frameworks/Growl.framework/Versions/Current | 1 - Gas Mask.xcodeproj/project.pbxproj | 6 - Source/NotificationHelper.h | 4 +- Source/NotificationHelper.m | 34 - 13 files changed, 1 insertion(+), 1780 deletions(-) delete mode 120000 Frameworks/Growl.framework/Growl delete mode 120000 Frameworks/Growl.framework/Headers delete mode 120000 Frameworks/Growl.framework/Resources delete mode 100755 Frameworks/Growl.framework/Versions/A/Growl delete mode 100644 Frameworks/Growl.framework/Versions/A/Headers/Growl.h delete mode 100644 Frameworks/Growl.framework/Versions/A/Headers/GrowlApplicationBridge-Carbon.h delete mode 100644 Frameworks/Growl.framework/Versions/A/Headers/GrowlApplicationBridge.h delete mode 100644 Frameworks/Growl.framework/Versions/A/Headers/GrowlDefines.h delete mode 100644 Frameworks/Growl.framework/Versions/A/Resources/Info.plist delete mode 120000 Frameworks/Growl.framework/Versions/Current diff --git a/Frameworks/Growl.framework/Growl b/Frameworks/Growl.framework/Growl deleted file mode 120000 index 85956e2..0000000 --- a/Frameworks/Growl.framework/Growl +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Growl \ No newline at end of file diff --git a/Frameworks/Growl.framework/Headers b/Frameworks/Growl.framework/Headers deleted file mode 120000 index a177d2a..0000000 --- a/Frameworks/Growl.framework/Headers +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Headers \ No newline at end of file diff --git a/Frameworks/Growl.framework/Resources b/Frameworks/Growl.framework/Resources deleted file mode 120000 index 953ee36..0000000 --- a/Frameworks/Growl.framework/Resources +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Resources \ No newline at end of file diff --git a/Frameworks/Growl.framework/Versions/A/Growl b/Frameworks/Growl.framework/Versions/A/Growl deleted file mode 100755 index eb63866a27fd6444b30ce8fa22459aa9ed45d846..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 259256 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 -#include - -#ifndef GROWL_EXPORT -#define GROWL_EXPORT __attribute__((visibility("default"))) DEPRECATED_ATTRIBUTE -#endif - -/*! @header GrowlApplicationBridge-Carbon.h - * @abstract Declares an API that Carbon applications can use to interact with Growl. - * @discussion GrowlApplicationBridge uses a delegate to provide information //XXX - * to Growl (such as your application's name and what notifications it may - * post) and to provide information to your application (such as that Growl - * is listening for notifications or that a notification has been clicked). - * - * You can set the Growldelegate with Growl_SetDelegate and find out the - * current delegate with Growl_GetDelegate. See struct Growl_Delegate for more - * information about the delegate. - */ - -__BEGIN_DECLS - -/*! @struct Growl_Delegate - * @abstract Delegate to supply GrowlApplicationBridge with information and respond to events. - * @discussion The Growl delegate provides your interface to - * GrowlApplicationBridge. When GrowlApplicationBridge needs information about - * your application, it looks for it in the delegate; when Growl or the user - * does something that you might be interested in, GrowlApplicationBridge - * looks for a callback in the delegate and calls it if present - * (meaning, if it is not NULL). - * XXX on all of that - * @field size The size of the delegate structure. - * @field applicationName The name of your application. - * @field registrationDictionary A dictionary describing your application and the notifications it can send out. - * @field applicationIconData Your application's icon. - * @field growlInstallationWindowTitle The title of the installation window. - * @field growlInstallationInformation Text to display in the installation window. - * @field growlUpdateWindowTitle The title of the update window. - * @field growlUpdateInformation Text to display in the update window. - * @field referenceCount A count of owners of the delegate. - * @field retain Called when GrowlApplicationBridge receives this delegate. - * @field release Called when GrowlApplicationBridge no longer needs this delegate. - * @field growlIsReady Called when GrowlHelperApp is listening for notifications. - * @field growlNotificationWasClicked Called when a Growl notification is clicked. - * @field growlNotificationTimedOut Called when a Growl notification timed out. - */ -struct Growl_Delegate { - /* @discussion This should be sizeof(struct Growl_Delegate). - */ - size_t size; - - /*All of these attributes are optional. - *Optional attributes can be NULL; required attributes that - * are NULL cause setting the Growl delegate to fail. - *XXX - move optional/required status into the discussion for each field - */ - - /* This name is used both internally and in the Growl preferences. - * - * This should remain stable between different versions and incarnations of - * your application. - * For example, "SurfWriter" is a good app name, whereas "SurfWriter 2.0" and - * "SurfWriter Lite" are not. - * - * This can be NULL if it is provided elsewhere, namely in an - * auto-discoverable plist file in your app bundle - * (XXX refer to more information on that) or in registrationDictionary. - */ - CFStringRef applicationName; - - /* - * Must contain at least these keys: - * GROWL_NOTIFICATIONS_ALL (CFArray): - * Contains the names of all notifications your application may post. - * - * Can also contain these keys: - * GROWL_NOTIFICATIONS_DEFAULT (CFArray): - * Names of notifications that should be enabled by default. - * If omitted, GROWL_NOTIFICATIONS_ALL will be used. - * GROWL_APP_NAME (CFString): - * Same as the applicationName member of this structure. - * If both are present, the applicationName member shall prevail. - * If this key is present, you may omit applicationName (set it to NULL). - * GROWL_APP_ICON (CFData): - * Same as the iconData member of this structure. - * If both are present, the iconData member shall prevail. - * If this key is present, you may omit iconData (set it to NULL). - * - * If you change the contents of this dictionary after setting the delegate, - * be sure to call Growl_Reregister. - * - * This can be NULL if you have an auto-discoverable plist file in your app - * bundle. (XXX refer to more information on that) - */ - CFDictionaryRef registrationDictionary; - - /* The data can be in any format supported by NSImage. As of - * Mac OS X 10.3, this includes the .icns, TIFF, JPEG, GIF, PNG, PDF, and - * PICT formats. - * - * If this is not supplied, Growl will look up your application's icon by - * its application name. - */ - CFDataRef applicationIconData; - - /* Installer display attributes - * - * These four attributes are used by the Growl installer, if this framework - * supports it. - * For any of these being NULL, a localised default will be - * supplied. - */ - - /* If this is NULL, Growl will use a default, - * localized title. - * - * Only used if you're using Growl-WithInstaller.framework. Otherwise, - * this member is ignored. - */ - CFStringRef growlInstallationWindowTitle; - /* This information may be as long or short as desired (the - * window will be sized to fit it). If Growl is not installed, it will - * be displayed to the user as an explanation of what Growl is and what - * it can do in your application. - * It should probably note that no download is required to install. - * - * If this is NULL, Growl will use a default, localized - * explanation. - * - * Only used if you're using Growl-WithInstaller.framework. Otherwise, - * this member is ignored. - */ - CFStringRef growlInstallationInformation; - /* If this is NULL, Growl will use a default, - * localized title. - * - * Only used if you're using Growl-WithInstaller.framework. Otherwise, - * this member is ignored. - */ - CFStringRef growlUpdateWindowTitle; - /* This information may be as long or short as desired (the - * window will be sized to fit it). If an older version of Growl is - * installed, it will be displayed to the user as an explanation that an - * updated version of Growl is included in your application and - * no download is required. - * - * If this is NULL, Growl will use a default, localized - * explanation. - * - * Only used if you're using Growl-WithInstaller.framework. Otherwise, - * this member is ignored. - */ - CFStringRef growlUpdateInformation; - - /* This member is provided for use by your retain and release - * callbacks (see below). - * - * GrowlApplicationBridge never directly uses this member. Instead, it - * calls your retain callback (if non-NULL) and your release - * callback (if non-NULL). - */ - unsigned referenceCount; - - //Functions. Currently all of these are optional (any of them can be NULL). - - /* When you call Growl_SetDelegate(newDelegate), it will call - * oldDelegate->release(oldDelegate), and then it will call - * newDelegate->retain(newDelegate), and the return value from retain - * is what will be set as the delegate. - * (This means that this member works like CFRetain and -[NSObject retain].) - * This member is optional (it can be NULL). - * For a delegate allocated with malloc, this member would be - * NULL. - * @result A delegate to which GrowlApplicationBridge holds a reference. - */ - void *(*retain)(void *); - /* When you call Growl_SetDelegate(newDelegate), it will call - * oldDelegate->release(oldDelegate), and then it will call - * newDelegate->retain(newDelegate), and the return value from retain - * is what will be set as the delegate. - * (This means that this member works like CFRelease and - * -[NSObject release].) - * This member is optional (it can be NULL). - * For a delegate allocated with malloc, this member might be - * free(3). - */ - void (*release)(void *); - - /* Informs the delegate that Growl (specifically, the GrowlHelperApp) was - * launched successfully (or was already running). The application can - * take actions with the knowledge that Growl is installed and functional. - */ - void (*growlIsReady)(void); - - /* Informs the delegate that a Growl notification was clicked. It is only - * sent for notifications sent with a non-NULL clickContext, - * so if you want to receive a message when a notification is clicked, - * clickContext must not be NULL when calling - * Growl_PostNotification or - * Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext. - */ - void (*growlNotificationWasClicked)(CFPropertyListRef clickContext); - - /* Informs the delegate that a Growl notification timed out. It is only - * sent for notifications sent with a non-NULL clickContext, - * so if you want to receive a message when a notification is clicked, - * clickContext must not be NULL when calling - * Growl_PostNotification or - * Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext. - */ - void (*growlNotificationTimedOut)(CFPropertyListRef clickContext); -}; - -/*! @struct Growl_Notification - * @abstract Structure describing a Growl notification. - * @discussion XXX - * @field size The size of the notification structure. - * @field name Identifies the notification. - * @field title Short synopsis of the notification. - * @field description Additional text. - * @field iconData An icon for the notification. - * @field priority An indicator of the notification's importance. - * @field reserved Bits reserved for future usage. - * @field isSticky Requests that a notification stay on-screen until dismissed explicitly. - * @field clickContext An identifier to be passed to your click callback when a notification is clicked. - * @field clickCallback A callback to call when the notification is clicked. - */ -struct Growl_Notification { - /* This should be sizeof(struct Growl_Notification). - */ - size_t size; - - /* The notification name distinguishes one type of - * notification from another. The name should be human-readable, as it - * will be displayed in the Growl preference pane. - * - * The name is used in the GROWL_NOTIFICATIONS_ALL and - * GROWL_NOTIFICATIONS_DEFAULT arrays in the registration dictionary, and - * in this member of the Growl_Notification structure. - */ - CFStringRef name; - - /* A notification's title describes the notification briefly. - * It should be easy to read quickly by the user. - */ - CFStringRef title; - - /* The description supplements the title with more - * information. It is usually longer and sometimes involves a list of - * subjects. For example, for a 'Download complete' notification, the - * description might have one filename per line. GrowlMail in Growl 0.6 - * uses a description of '%d new mail(s)' (formatted with the number of - * messages). - */ - CFStringRef description; - - /* The notification icon usually indicates either what - * happened (it may have the same icon as e.g. a toolbar item that - * started the process that led to the notification), or what it happened - * to (e.g. a document icon). - * - * The icon data is optional, so it can be NULL. In that - * case, the application icon is used alone. Not all displays support - * icons. - * - * The data can be in any format supported by NSImage. As of Mac OS X - * 10.3, this includes the .icns, TIFF, JPEG, GIF, PNG, PDF, and PICT form - * ats. - */ - CFDataRef iconData; - - /* Priority is new in Growl 0.6, and is represented as a - * signed integer from -2 to +2. 0 is Normal priority, -2 is Very Low - * priority, and +2 is Very High priority. - * - * Not all displays support priority. If you do not wish to assign a - * priority to your notification, assign 0. - */ - signed int priority; - - /* These bits are not used in Growl 0.6. Set them to 0. - */ - unsigned reserved: 31; - - /* When the sticky bit is clear, in most displays, - * notifications disappear after a certain amount of time. Sticky - * notifications, however, remain on-screen until the user dismisses them - * explicitly, usually by clicking them. - * - * Sticky notifications were introduced in Growl 0.6. Most notifications - * should not be sticky. Not all displays support sticky notifications, - * and the user may choose in Growl's preference pane to force the - * notification to be sticky or non-sticky, in which case the sticky bit - * in the notification will be ignored. - */ - unsigned isSticky: 1; - - /* If this is not NULL, and your click callback - * is not NULL either, this will be passed to the callback - * when your notification is clicked by the user. - * - * Click feedback was introduced in Growl 0.6, and it is optional. Not - * all displays support click feedback. - */ - CFPropertyListRef clickContext; - - /* If this is not NULL, it will be called instead - * of the Growl delegate's click callback when clickContext is - * non-NULL and the notification is clicked on by the user. - * - * Click feedback was introduced in Growl 0.6, and it is optional. Not - * all displays support click feedback. - * - * The per-notification click callback is not yet supported as of Growl - * 0.7. - */ - void (*clickCallback)(CFPropertyListRef clickContext); - - CFStringRef identifier; -}; - -#pragma mark - -#pragma mark Easy initialisers - -/*! @defined InitGrowlDelegate - * @abstract Callable macro. Initializes a Growl delegate structure to defaults. - * @discussion Call with a pointer to a struct Growl_Delegate. All of the - * members of the structure will be set to 0 or NULL, except for - * size (which will be set to sizeof(struct Growl_Delegate)) and - * referenceCount (which will be set to 1). - */ -#define InitGrowlDelegate(delegate) \ - do { \ - if (delegate) { \ - (delegate)->size = sizeof(struct Growl_Delegate); \ - (delegate)->applicationName = NULL; \ - (delegate)->registrationDictionary = NULL; \ - (delegate)->applicationIconData = NULL; \ - (delegate)->growlInstallationWindowTitle = NULL; \ - (delegate)->growlInstallationInformation = NULL; \ - (delegate)->growlUpdateWindowTitle = NULL; \ - (delegate)->growlUpdateInformation = NULL; \ - (delegate)->referenceCount = 1U; \ - (delegate)->retain = NULL; \ - (delegate)->release = NULL; \ - (delegate)->growlIsReady = NULL; \ - (delegate)->growlNotificationWasClicked = NULL; \ - (delegate)->growlNotificationTimedOut = NULL; \ - } \ - } while(0) - -/*! @defined InitGrowlNotification - * @abstract Callable macro. Initializes a Growl notification structure to defaults. - * @discussion Call with a pointer to a struct Growl_Notification. All of - * the members of the structure will be set to 0 or NULL, except - * for size (which will be set to - * sizeof(struct Growl_Notification)). - */ -#define InitGrowlNotification(notification) \ - do { \ - if (notification) { \ - (notification)->size = sizeof(struct Growl_Notification); \ - (notification)->name = NULL; \ - (notification)->title = NULL; \ - (notification)->description = NULL; \ - (notification)->iconData = NULL; \ - (notification)->priority = 0; \ - (notification)->reserved = 0U; \ - (notification)->isSticky = false; \ - (notification)->clickContext = NULL; \ - (notification)->clickCallback = NULL; \ - (notification)->identifier = NULL; \ - } \ - } while(0) - -#pragma mark - -#pragma mark Public API - -// @functiongroup Managing the Growl delegate - -/*! @function Growl_SetDelegate - * @abstract Replaces the current Growl delegate with a new one, or removes - * the Growl delegate. - * @param newDelegate - * @result Returns false and does nothing else if a pointer that was passed in - * is unsatisfactory (because it is non-NULL, but at least one - * required member of it is NULL). Otherwise, sets or unsets the - * delegate and returns true. - * @discussion When newDelegate is non-NULL, sets - * the delegate to newDelegate. When it is NULL, - * the current delegate will be unset, and no delegate will be in place. - * - * It is legal for newDelegate to be the current delegate; - * nothing will happen, and Growl_SetDelegate will return true. It is also - * legal for it to be NULL, as described above; again, it will - * return true. - * - * If there was a delegate in place before the call, Growl_SetDelegate will - * call the old delegate's release member if it was non-NULL. If - * newDelegate is non-NULL, Growl_SetDelegate will - * call newDelegate->retain, and set the delegate to its return - * value. - * - * If you are using Growl-WithInstaller.framework, and an older version of - * Growl is installed on the user's system, the user will automatically be - * prompted to update. - * - * GrowlApplicationBridge currently does not copy this structure, nor does it - * retain any of the CF objects in the structure (it regards the structure as - * a container that retains the objects when they are added and releases them - * when they are removed or the structure is destroyed). Also, - * GrowlApplicationBridge currently does not modify any member of the - * structure, except possibly the referenceCount by calling the retain and - * release members. - */ -GROWL_EXPORT Boolean Growl_SetDelegate(struct Growl_Delegate *newDelegate); - -/*! @function Growl_GetDelegate - * @abstract Returns the current Growl delegate, if any. - * @result The current Growl delegate. - * @discussion Returns the last pointer passed into Growl_SetDelegate, or - * NULL if no such call has been made. - * - * This function follows standard Core Foundation reference-counting rules. - * Because it is a Get function, not a Copy function, it will not retain the - * delegate on your behalf. You are responsible for retaining and releasing - * the delegate as needed. - */ -GROWL_EXPORT struct Growl_Delegate *Growl_GetDelegate(void); - -#pragma mark - - -// @functiongroup Posting Growl notifications - -/*! @function Growl_PostNotification - * @abstract Posts a Growl notification. - * @param notification The notification to post. - * @discussion This is the preferred means for sending a Growl notification. - * The notification name and at least one of the title and description are - * required (all three are preferred). All other parameters may be - * NULL (or 0 or false as appropriate) to accept default values. - * - * If using the Growl-WithInstaller framework, if Growl is not installed the - * user will be prompted to install Growl. - * If the user cancels, this function will have no effect until the next - * application session, at which time when it is called the user will be - * prompted again. The user is also given the option to not be prompted again. - * If the user does choose to install Growl, the requested notification will - * be displayed once Growl is installed and running. - */ -GROWL_EXPORT void Growl_PostNotification(const struct Growl_Notification *notification); - -/*! @function Growl_PostNotificationWithDictionary -* @abstract Notifies using a userInfo dictionary suitable for passing to -* CFDistributedNotificationCenter. -* @param userInfo The dictionary to notify with. -* @discussion Before Growl 0.6, your application would have posted -* notifications using CFDistributedNotificationCenter by creating a userInfo -* dictionary with the notification data. This had the advantage of allowing -* you to add other data to the dictionary for programs besides Growl that -* might be listening. -* -* This function allows you to use such dictionaries without being restricted -* to using CFDistributedNotificationCenter. The keys for this dictionary - * can be found in GrowlDefines.h. -*/ -GROWL_EXPORT void Growl_PostNotificationWithDictionary(CFDictionaryRef userInfo); - -/*! @function Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext - * @abstract Posts a Growl notification using parameter values. - * @param title The title of the notification. - * @param description The description of the notification. - * @param notificationName The name of the notification as listed in the - * registration dictionary. - * @param iconData Data representing a notification icon. Can be NULL. - * @param priority The priority of the notification (-2 to +2, with -2 - * being Very Low and +2 being Very High). - * @param isSticky If true, requests that this notification wait for a - * response from the user. - * @param clickContext An object to pass to the clickCallback, if any. Can - * be NULL, in which case the clickCallback is not called. - * @discussion Creates a temporary Growl_Notification, fills it out with the - * supplied information, and calls Growl_PostNotification on it. - * See struct Growl_Notification and Growl_PostNotification for more - * information. - * - * The icon data can be in any format supported by NSImage. As of Mac OS X - * 10.3, this includes the .icns, TIFF, JPEG, GIF, PNG, PDF, and PICT formats. - */ -GROWL_EXPORT void Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext( - /*inhale*/ - CFStringRef title, - CFStringRef description, - CFStringRef notificationName, - CFDataRef iconData, - signed int priority, - Boolean isSticky, - CFPropertyListRef clickContext); - -#pragma mark - - -// @functiongroup Registering - -/*! @function Growl_RegisterWithDictionary - * @abstract Register your application with Growl without setting a delegate. - * @discussion When you call this function with a dictionary, - * GrowlApplicationBridge registers your application using that dictionary. - * If you pass NULL, GrowlApplicationBridge will ask the delegate - * (if there is one) for a dictionary, and if that doesn't work, it will look - * in your application's bundle for an auto-discoverable plist. - * (XXX refer to more information on that) - * - * If you pass a dictionary to this function, it must include the - * GROWL_APP_NAME key, unless a delegate is set. - * - * This function is mainly an alternative to the delegate system introduced - * with Growl 0.6. Without a delegate, you cannot receive callbacks such as - * growlIsReady (since they are sent to the delegate). You can, - * however, set a delegate after registering without one. - * - * This function was introduced in Growl.framework 0.7. - * @result false if registration failed (e.g. if Growl isn't installed). - */ -GROWL_EXPORT Boolean Growl_RegisterWithDictionary(CFDictionaryRef regDict); - -/*! @function Growl_Reregister - * @abstract Updates your registration with Growl. - * @discussion If your application changes the contents of the - * GROWL_NOTIFICATIONS_ALL key in the registrationDictionary member of the - * Growl delegate, or if it changes the value of that member, or if it - * changes the contents of its auto-discoverable plist, call this function - * to have Growl update its registration information for your application. - * - * Otherwise, this function does not normally need to be called. If you're - * using a delegate, your application will be registered when you set the - * delegate if both the delegate and its registrationDictionary member are - * non-NULL. - * - * This function is now implemented using - * Growl_RegisterWithDictionary. - */ -GROWL_EXPORT void Growl_Reregister(void); - -#pragma mark - - -/*! @function Growl_SetWillRegisterWhenGrowlIsReady - * @abstract Tells GrowlApplicationBridge to register with Growl when Growl - * launches (or not). - * @discussion When Growl has started listening for notifications, it posts a - * GROWL_IS_READY notification on the Distributed Notification - * Center. GrowlApplicationBridge listens for this notification, using it to - * perform various tasks (such as calling your delegate's - * growlIsReady callback, if it has one). If this function is - * called with true, one of those tasks will be to reregister - * with Growl (in the manner of Growl_Reregister). - * - * This attribute is automatically set back to false - * (the default) after every GROWL_IS_READY notification. - * @param flag true if you want GrowlApplicationBridge to register with - * Growl when next it is ready; false if not. - */ -GROWL_EXPORT void Growl_SetWillRegisterWhenGrowlIsReady(Boolean flag); -/*! @function Growl_WillRegisterWhenGrowlIsReady - * @abstract Reports whether GrowlApplicationBridge will register with Growl - * when Growl next launches. - * @result true if GrowlApplicationBridge will register with - * Growl when next it posts GROWL_IS_READY; false if not. - */ -GROWL_EXPORT Boolean Growl_WillRegisterWhenGrowlIsReady(void); - -#pragma mark - - -// @functiongroup Obtaining registration dictionaries - -/*! @function Growl_CopyRegistrationDictionaryFromDelegate - * @abstract Asks the delegate for a registration dictionary. - * @discussion If no delegate is set, or if the delegate's - * registrationDictionary member is NULL, this - * function returns NULL. - * - * This function does not attempt to clean up the dictionary in any way - for - * example, if it is missing the GROWL_APP_NAME key, the result - * will be missing it too. Use - * Growl_CreateRegistrationDictionaryByFillingInDictionary or - * Growl_CreateRegistrationDictionaryByFillingInDictionaryRestrictedToKeys - * to try to fill in missing keys. - * - * This function was introduced in Growl.framework 0.7. - * @result A registration dictionary. - */ -GROWL_EXPORT CFDictionaryRef Growl_CopyRegistrationDictionaryFromDelegate(void); - -/*! @function Growl_CopyRegistrationDictionaryFromBundle - * @abstract Looks in a bundle for a registration dictionary. - * @discussion This function looks in a bundle for an auto-discoverable - * registration dictionary file using CFBundleCopyResourceURL. - * If it finds one, it loads the file using CFPropertyList and - * returns the result. - * - * If you pass NULL as the bundle, the main bundle is examined. - * - * This function does not attempt to clean up the dictionary in any way - for - * example, if it is missing the GROWL_APP_NAME key, the result - * will be missing it too. Use - * Growl_CreateRegistrationDictionaryByFillingInDictionary: or - * Growl_CreateRegistrationDictionaryByFillingInDictionaryRestrictedToKeys - * to try to fill in missing keys. - * - * This function was introduced in Growl.framework 0.7. - * @result A registration dictionary. - */ -GROWL_EXPORT CFDictionaryRef Growl_CopyRegistrationDictionaryFromBundle(CFBundleRef bundle); - -/*! @function Growl_CreateBestRegistrationDictionary - * @abstract Obtains a registration dictionary, filled out to the best of - * GrowlApplicationBridge's knowledge. - * @discussion This function creates a registration dictionary as best - * GrowlApplicationBridge knows how. - * - * First, GrowlApplicationBridge examines the Growl delegate (if there is - * one) and gets the registration dictionary from that. If no such dictionary - * was obtained, GrowlApplicationBridge looks in your application's main - * bundle for an auto-discoverable registration dictionary file. If that - * doesn't exist either, this function returns NULL. - * - * Second, GrowlApplicationBridge calls - * Growl_CreateRegistrationDictionaryByFillingInDictionary with - * whatever dictionary was obtained. The result of that function is the - * result of this function. - * - * GrowlApplicationBridge uses this function when you call - * Growl_SetDelegate, or when you call - * Growl_RegisterWithDictionary with NULL. - * - * This function was introduced in Growl.framework 0.7. - * @result A registration dictionary. - */ -GROWL_EXPORT CFDictionaryRef Growl_CreateBestRegistrationDictionary(void); - -#pragma mark - - -// @functiongroup Filling in registration dictionaries - -/*! @function Growl_CreateRegistrationDictionaryByFillingInDictionary - * @abstract Tries to fill in missing keys in a registration dictionary. - * @param regDict The dictionary to fill in. - * @result The dictionary with the keys filled in. - * @discussion This function examines the passed-in dictionary for missing keys, - * and tries to work out correct values for them. As of 0.7, it uses: - * - * Key Value - * --- ----- - * GROWL_APP_NAME CFBundleExecutableName - * GROWL_APP_ICON The icon of the application. - * GROWL_APP_LOCATION The location of the application. - * GROWL_NOTIFICATIONS_DEFAULT GROWL_NOTIFICATIONS_ALL - * - * Keys are only filled in if missing; if a key is present in the dictionary, - * its value will not be changed. - * - * This function was introduced in Growl.framework 0.7. - */ -GROWL_EXPORT CFDictionaryRef Growl_CreateRegistrationDictionaryByFillingInDictionary(CFDictionaryRef regDict); -/*! @function Growl_CreateRegistrationDictionaryByFillingInDictionaryRestrictedToKeys - * @abstract Tries to fill in missing keys in a registration dictionary. - * @param regDict The dictionary to fill in. - * @param keys The keys to fill in. If NULL, any missing keys are filled in. - * @result The dictionary with the keys filled in. - * @discussion This function examines the passed-in dictionary for missing keys, - * and tries to work out correct values for them. As of 0.7, it uses: - * - * Key Value - * --- ----- - * GROWL_APP_NAME CFBundleExecutableName - * GROWL_APP_ICON The icon of the application. - * GROWL_APP_LOCATION The location of the application. - * GROWL_NOTIFICATIONS_DEFAULT GROWL_NOTIFICATIONS_ALL - * - * Only those keys that are listed in keys will be filled in. - * Other missing keys are ignored. Also, keys are only filled in if missing; - * if a key is present in the dictionary, its value will not be changed. - * - * This function was introduced in Growl.framework 0.7. - */ -GROWL_EXPORT CFDictionaryRef Growl_CreateRegistrationDictionaryByFillingInDictionaryRestrictedToKeys(CFDictionaryRef regDict, CFSetRef keys); - -/*! @brief Tries to fill in missing keys in a notification dictionary. - * @param notifDict The dictionary to fill in. - * @return The dictionary with the keys filled in. This will be a separate instance from \a notifDict. - * @discussion This function examines the \a notifDict for missing keys, and - * tries to get them from the last known registration dictionary. As of 1.1, - * the keys that it will look for are: - * - * \li GROWL_APP_NAME - * \li GROWL_APP_ICON - * - * @since Growl.framework 1.1 - */ -GROWL_EXPORT CFDictionaryRef Growl_CreateNotificationDictionaryByFillingInDictionary(CFDictionaryRef notifDict); - -#pragma mark - - -// @functiongroup Querying Growl's status - -/*! @function Growl_IsInstalled - * @abstract Determines whether the Growl prefpane and its helper app are - * installed. - * @result Returns true if Growl is installed, false otherwise. - */ -GROWL_EXPORT Boolean Growl_IsInstalled(void); - -/*! @function Growl_IsRunning - * @abstract Cycles through the process list to find whether GrowlHelperApp - * is running. - * @result Returns true if Growl is running, false otherwise. - */ -GROWL_EXPORT Boolean Growl_IsRunning(void); - -#pragma mark - - -// @functiongroup Launching Growl - -/*! @typedef GrowlLaunchCallback - * @abstract Callback to notify you that Growl is running. - * @param context The context pointer passed to Growl_LaunchIfInstalled. - * @discussion Growl_LaunchIfInstalled calls this callback function if Growl - * was already running or if it launched Growl successfully. - */ -typedef void (*GrowlLaunchCallback)(void *context); - -/*! @function Growl_LaunchIfInstalled - * @abstract Launches GrowlHelperApp if it is not already running. - * @param callback A callback function which will be called if Growl was successfully - * launched or was already running. Can be NULL. - * @param context The context pointer to pass to the callback. Can be NULL. - * @result Returns true if Growl was successfully launched or was already - * running; returns false and does not call the callback otherwise. - * @discussion Returns true and calls the callback (if the callback is not - * NULL) if the Growl helper app began launching or was already - * running. Returns false and performs no other action if Growl could not be - * launched (e.g. because the Growl preference pane is not properly installed). - * - * If Growl_CreateBestRegistrationDictionary returns - * non-NULL, this function will register with Growl atomically. - * - * The callback should take a single argument; this is to allow applications - * to have context-relevant information passed back. It is perfectly - * acceptable for context to be NULL. The callback itself can be - * NULL if you don't want one. - */ -GROWL_EXPORT Boolean Growl_LaunchIfInstalled(GrowlLaunchCallback callback, void *context); - -#pragma mark - -#pragma mark Constants - -/*! @defined GROWL_PREFPANE_BUNDLE_IDENTIFIER - * @abstract The CFBundleIdentifier of the Growl preference pane bundle. - * @discussion GrowlApplicationBridge uses this to determine whether Growl is - * currently installed, by searching for the Growl preference pane. Your - * application probably does not need to use this macro itself. - */ -#ifndef GROWL_PREFPANE_BUNDLE_IDENTIFIER -#define GROWL_PREFPANE_BUNDLE_IDENTIFIER CFSTR("com.growl.prefpanel") -#endif - -__END_DECLS - -#endif /* _GROWLAPPLICATIONBRIDGE_CARBON_H_ */ diff --git a/Frameworks/Growl.framework/Versions/A/Headers/GrowlApplicationBridge.h b/Frameworks/Growl.framework/Versions/A/Headers/GrowlApplicationBridge.h deleted file mode 100644 index 1e39f8d..0000000 --- a/Frameworks/Growl.framework/Versions/A/Headers/GrowlApplicationBridge.h +++ /dev/null @@ -1,575 +0,0 @@ -// -// GrowlApplicationBridge.h -// Growl -// -// Created by Evan Schoenberg on Wed Jun 16 2004. -// Copyright 2004-2006 The Growl Project. All rights reserved. -// - -/*! - * @header GrowlApplicationBridge.h - * @abstract Defines the GrowlApplicationBridge class. - * @discussion This header defines the GrowlApplicationBridge class as well as - * the GROWL_PREFPANE_BUNDLE_IDENTIFIER constant. - */ - -#ifndef __GrowlApplicationBridge_h__ -#define __GrowlApplicationBridge_h__ - -#import -#import -#import "GrowlDefines.h" - -//Forward declarations -@protocol GrowlApplicationBridgeDelegate; - -//Internal notification when the user chooses not to install (to avoid continuing to cache notifications awaiting installation) -#define GROWL_USER_CHOSE_NOT_TO_INSTALL_NOTIFICATION @"User chose not to install" - -//------------------------------------------------------------------------------ -#pragma mark - - -/*! - * @class GrowlApplicationBridge - * @abstract A class used to interface with Growl. - * @discussion This class provides a means to interface with Growl. - * - * Currently it provides a way to detect if Growl is installed and launch the - * GrowlHelperApp if it's not already running. - */ -@interface GrowlApplicationBridge : NSObject { - -} - -/*! - * @method isGrowlInstalled - * @abstract Detects whether Growl is installed. - * @discussion Determines if the Growl prefpane and its helper app are installed. - * @result Returns YES if Growl is installed, NO otherwise. - */ -+ (BOOL) isGrowlInstalled; - -/*! - * @method isGrowlRunning - * @abstract Detects whether GrowlHelperApp is currently running. - * @discussion Cycles through the process list to find whether GrowlHelperApp is running and returns its findings. - * @result Returns YES if GrowlHelperApp is running, NO otherwise. - */ -+ (BOOL) isGrowlRunning; - -#pragma mark - - -/*! - * @method setGrowlDelegate: - * @abstract Set the object which will be responsible for providing and receiving Growl information. - * @discussion This must be called before using GrowlApplicationBridge. - * - * The methods in the GrowlApplicationBridgeDelegate protocol are required - * and return the basic information needed to register with Growl. - * - * The methods in the GrowlApplicationBridgeDelegate_InformalProtocol - * informal protocol are individually optional. They provide a greater - * degree of interaction between the application and growl such as informing - * the application when one of its Growl notifications is clicked by the user. - * - * The methods in the GrowlApplicationBridgeDelegate_Installation_InformalProtocol - * informal protocol are individually optional and are only applicable when - * using the Growl-WithInstaller.framework which allows for automated Growl - * installation. - * - * When this method is called, data will be collected from inDelegate, Growl - * will be launched if it is not already running, and the application will be - * registered with Growl. - * - * If using the Growl-WithInstaller framework, if Growl is already installed - * but this copy of the framework has an updated version of Growl, the user - * will be prompted to update automatically. - * - * @param inDelegate The delegate for the GrowlApplicationBridge. It must conform to the GrowlApplicationBridgeDelegate protocol. - */ -+ (void) setGrowlDelegate:(NSObject *)inDelegate; - -/*! - * @method growlDelegate - * @abstract Return the object responsible for providing and receiving Growl information. - * @discussion See setGrowlDelegate: for details. - * @result The Growl delegate. - */ -+ (NSObject *) growlDelegate; - -#pragma mark - - -/*! - * @method notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext: - * @abstract Send a Growl notification. - * @discussion This is the preferred means for sending a Growl notification. - * The notification name and at least one of the title and description are - * required (all three are preferred). All other parameters may be - * nil (or 0 or NO as appropriate) to accept default values. - * - * If using the Growl-WithInstaller framework, if Growl is not installed the - * user will be prompted to install Growl. If the user cancels, this method - * will have no effect until the next application session, at which time when - * it is called the user will be prompted again. The user is also given the - * option to not be prompted again. If the user does choose to install Growl, - * the requested notification will be displayed once Growl is installed and - * running. - * - * @param title The title of the notification displayed to the user. - * @param description The full description of the notification displayed to the user. - * @param notifName The internal name of the notification. Should be human-readable, as it will be displayed in the Growl preference pane. - * @param iconData NSData object to show with the notification as its icon. If nil, the application's icon will be used instead. - * @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. - * @param isSticky If YES, the notification will remain on screen until clicked. Not all Growl displays support sticky notifications. - * @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). - */ -+ (void) notifyWithTitle:(NSString *)title - description:(NSString *)description - notificationName:(NSString *)notifName - iconData:(NSData *)iconData - priority:(signed int)priority - isSticky:(BOOL)isSticky - clickContext:(id)clickContext; - -/*! - * @method notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:identifier: - * @abstract Send a Growl notification. - * @discussion This is the preferred means for sending a Growl notification. - * The notification name and at least one of the title and description are - * required (all three are preferred). All other parameters may be - * nil (or 0 or NO as appropriate) to accept default values. - * - * If using the Growl-WithInstaller framework, if Growl is not installed the - * user will be prompted to install Growl. If the user cancels, this method - * will have no effect until the next application session, at which time when - * it is called the user will be prompted again. The user is also given the - * option to not be prompted again. If the user does choose to install Growl, - * the requested notification will be displayed once Growl is installed and - * running. - * - * @param title The title of the notification displayed to the user. - * @param description The full description of the notification displayed to the user. - * @param notifName The internal name of the notification. Should be human-readable, as it will be displayed in the Growl preference pane. - * @param iconData NSData object to show with the notification as its icon. If nil, the application's icon will be used instead. - * @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. - * @param isSticky If YES, the notification will remain on screen until clicked. Not all Growl displays support sticky notifications. - * @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). - * @param identifier An identifier for this notification. Notifications with equal identifiers are coalesced. - */ -+ (void) notifyWithTitle:(NSString *)title - description:(NSString *)description - notificationName:(NSString *)notifName - iconData:(NSData *)iconData - priority:(signed int)priority - isSticky:(BOOL)isSticky - clickContext:(id)clickContext - identifier:(NSString *)identifier; - -/*! @method notifyWithDictionary: - * @abstract Notifies using a userInfo dictionary suitable for passing to - * NSDistributedNotificationCenter. - * @param userInfo The dictionary to notify with. - * @discussion Before Growl 0.6, your application would have posted - * notifications using NSDistributedNotificationCenter by - * creating a userInfo dictionary with the notification data. This had the - * advantage of allowing you to add other data to the dictionary for programs - * besides Growl that might be listening. - * - * This method allows you to use such dictionaries without being restricted - * to using NSDistributedNotificationCenter. The keys for this dictionary - * can be found in GrowlDefines.h. - */ -+ (void) notifyWithDictionary:(NSDictionary *)userInfo; - -#pragma mark - - -/*! @method registerWithDictionary: - * @abstract Register your application with Growl without setting a delegate. - * @discussion When you call this method with a dictionary, - * GrowlApplicationBridge registers your application using that dictionary. - * If you pass nil, GrowlApplicationBridge will ask the delegate - * (if there is one) for a dictionary, and if that doesn't work, it will look - * in your application's bundle for an auto-discoverable plist. - * (XXX refer to more information on that) - * - * If you pass a dictionary to this method, it must include the - * GROWL_APP_NAME key, unless a delegate is set. - * - * This method is mainly an alternative to the delegate system introduced - * with Growl 0.6. Without a delegate, you cannot receive callbacks such as - * -growlIsReady (since they are sent to the delegate). You can, - * however, set a delegate after registering without one. - * - * This method was introduced in Growl.framework 0.7. - */ -+ (BOOL) registerWithDictionary:(NSDictionary *)regDict; - -/*! @method reregisterGrowlNotifications - * @abstract Reregister the notifications for this application. - * @discussion This method does not normally need to be called. If your - * application changes what notifications it is registering with Growl, call - * this method to have the Growl delegate's - * -registrationDictionaryForGrowl method called again and the - * Growl registration information updated. - * - * This method is now implemented using -registerWithDictionary:. - */ -+ (void) reregisterGrowlNotifications; - -#pragma mark - - -/*! @method setWillRegisterWhenGrowlIsReady: - * @abstract Tells GrowlApplicationBridge to register with Growl when Growl - * launches (or not). - * @discussion When Growl has started listening for notifications, it posts a - * GROWL_IS_READY notification on the Distributed Notification - * Center. GrowlApplicationBridge listens for this notification, using it to - * perform various tasks (such as calling your delegate's - * -growlIsReady method, if it has one). If this method is - * called with YES, one of those tasks will be to reregister - * with Growl (in the manner of -reregisterGrowlNotifications). - * - * This attribute is automatically set back to NO (the default) - * after every GROWL_IS_READY notification. - * @param flag YES if you want GrowlApplicationBridge to register with - * Growl when next it is ready; NO if not. - */ -+ (void) setWillRegisterWhenGrowlIsReady:(BOOL)flag; -/*! @method willRegisterWhenGrowlIsReady - * @abstract Reports whether GrowlApplicationBridge will register with Growl - * when Growl next launches. - * @result YES if GrowlApplicationBridge will register with Growl - * when next it posts GROWL_IS_READY; NO if not. - */ -+ (BOOL) willRegisterWhenGrowlIsReady; - -#pragma mark - - -/*! @method registrationDictionaryFromDelegate - * @abstract Asks the delegate for a registration dictionary. - * @discussion If no delegate is set, or if the delegate's - * -registrationDictionaryForGrowl method returns - * nil, this method returns nil. - * - * This method does not attempt to clean up the dictionary in any way - for - * example, if it is missing the GROWL_APP_NAME key, the result - * will be missing it too. Use +[GrowlApplicationBridge - * registrationDictionaryByFillingInDictionary:] or - * +[GrowlApplicationBridge - * registrationDictionaryByFillingInDictionary:restrictToKeys:] to try - * to fill in missing keys. - * - * This method was introduced in Growl.framework 0.7. - * @result A registration dictionary. - */ -+ (NSDictionary *) registrationDictionaryFromDelegate; - -/*! @method registrationDictionaryFromBundle: - * @abstract Looks in a bundle for a registration dictionary. - * @discussion This method looks in a bundle for an auto-discoverable - * registration dictionary file using -[NSBundle - * pathForResource:ofType:]. If it finds one, it loads the file using - * +[NSDictionary dictionaryWithContentsOfFile:] and returns the - * result. - * - * If you pass nil as the bundle, the main bundle is examined. - * - * This method does not attempt to clean up the dictionary in any way - for - * example, if it is missing the GROWL_APP_NAME key, the result - * will be missing it too. Use +[GrowlApplicationBridge - * registrationDictionaryByFillingInDictionary:] or - * +[GrowlApplicationBridge - * registrationDictionaryByFillingInDictionary:restrictToKeys:] to try - * to fill in missing keys. - * - * This method was introduced in Growl.framework 0.7. - * @result A registration dictionary. - */ -+ (NSDictionary *) registrationDictionaryFromBundle:(NSBundle *)bundle; - -/*! @method bestRegistrationDictionary - * @abstract Obtains a registration dictionary, filled out to the best of - * GrowlApplicationBridge's knowledge. - * @discussion This method creates a registration dictionary as best - * GrowlApplicationBridge knows how. - * - * First, GrowlApplicationBridge contacts the Growl delegate (if there is - * one) and gets the registration dictionary from that. If no such dictionary - * was obtained, GrowlApplicationBridge looks in your application's main - * bundle for an auto-discoverable registration dictionary file. If that - * doesn't exist either, this method returns nil. - * - * Second, GrowlApplicationBridge calls - * +registrationDictionaryByFillingInDictionary: with whatever - * dictionary was obtained. The result of that method is the result of this - * method. - * - * GrowlApplicationBridge uses this method when you call - * +setGrowlDelegate:, or when you call - * +registerWithDictionary: with nil. - * - * This method was introduced in Growl.framework 0.7. - * @result A registration dictionary. - */ -+ (NSDictionary *) bestRegistrationDictionary; - -#pragma mark - - -/*! @method registrationDictionaryByFillingInDictionary: - * @abstract Tries to fill in missing keys in a registration dictionary. - * @discussion This method examines the passed-in dictionary for missing keys, - * and tries to work out correct values for them. As of 0.7, it uses: - * - * Key Value - * --- ----- - * GROWL_APP_NAME CFBundleExecutableName - * GROWL_APP_ICON The icon of the application. - * GROWL_APP_LOCATION The location of the application. - * GROWL_NOTIFICATIONS_DEFAULT GROWL_NOTIFICATIONS_ALL - * - * Keys are only filled in if missing; if a key is present in the dictionary, - * its value will not be changed. - * - * This method was introduced in Growl.framework 0.7. - * @param regDict The dictionary to fill in. - * @result The dictionary with the keys filled in. This is an autoreleased - * copy of regDict. - */ -+ (NSDictionary *) registrationDictionaryByFillingInDictionary:(NSDictionary *)regDict; -/*! @method registrationDictionaryByFillingInDictionary:restrictToKeys: - * @abstract Tries to fill in missing keys in a registration dictionary. - * @discussion This method examines the passed-in dictionary for missing keys, - * and tries to work out correct values for them. As of 0.7, it uses: - * - * Key Value - * --- ----- - * GROWL_APP_NAME CFBundleExecutableName - * GROWL_APP_ICON The icon of the application. - * GROWL_APP_LOCATION The location of the application. - * GROWL_NOTIFICATIONS_DEFAULT GROWL_NOTIFICATIONS_ALL - * - * Only those keys that are listed in keys will be filled in. - * Other missing keys are ignored. Also, keys are only filled in if missing; - * if a key is present in the dictionary, its value will not be changed. - * - * This method was introduced in Growl.framework 0.7. - * @param regDict The dictionary to fill in. - * @param keys The keys to fill in. If nil, any missing keys are filled in. - * @result The dictionary with the keys filled in. This is an autoreleased - * copy of regDict. - */ -+ (NSDictionary *) registrationDictionaryByFillingInDictionary:(NSDictionary *)regDict restrictToKeys:(NSSet *)keys; - -/*! @brief Tries to fill in missing keys in a notification dictionary. - * @param notifDict The dictionary to fill in. - * @return The dictionary with the keys filled in. This will be a separate instance from \a notifDict. - * @discussion This function examines the \a notifDict for missing keys, and - * tries to get them from the last known registration dictionary. As of 1.1, - * the keys that it will look for are: - * - * \li GROWL_APP_NAME - * \li GROWL_APP_ICON - * - * @since Growl.framework 1.1 - */ -+ (NSDictionary *) notificationDictionaryByFillingInDictionary:(NSDictionary *)regDict; - -+ (NSDictionary *) frameworkInfoDictionary; -@end - -//------------------------------------------------------------------------------ -#pragma mark - - -/*! - * @protocol GrowlApplicationBridgeDelegate - * @abstract Required protocol for the Growl delegate. - * @discussion The methods in this protocol are required and are called - * automatically as needed by GrowlApplicationBridge. See - * +[GrowlApplicationBridge setGrowlDelegate:]. - * See also GrowlApplicationBridgeDelegate_InformalProtocol. - */ - -@protocol GrowlApplicationBridgeDelegate - -// -registrationDictionaryForGrowl has moved to the informal protocol as of 0.7. - -@end - -//------------------------------------------------------------------------------ -#pragma mark - - -/*! - * @category NSObject(GrowlApplicationBridgeDelegate_InformalProtocol) - * @abstract Methods which may be optionally implemented by the GrowlDelegate. - * @discussion The methods in this informal protocol will only be called if implemented by the delegate. - */ -@interface NSObject (GrowlApplicationBridgeDelegate_InformalProtocol) - -/*! - * @method registrationDictionaryForGrowl - * @abstract Return the dictionary used to register this application with Growl. - * @discussion The returned dictionary gives Growl the complete list of - * notifications this application will ever send, and it also specifies which - * notifications should be enabled by default. Each is specified by an array - * of NSString objects. - * - * For most applications, these two arrays can be the same (if all sent - * notifications should be displayed by default). - * - * The NSString objects of these arrays will correspond to the - * notificationName: parameter passed in - * +[GrowlApplicationBridge - * notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:] calls. - * - * The dictionary should have the required key object pairs: - * key: GROWL_NOTIFICATIONS_ALL object: NSArray of NSString objects - * key: GROWL_NOTIFICATIONS_DEFAULT object: NSArray of NSString objects - * - * The dictionary may have the following key object pairs: - * key: GROWL_NOTIFICATIONS_HUMAN_READABLE_NAMES object: NSDictionary of key: notification name object: human-readable notification name - * - * You do not need to implement this method if you have an auto-discoverable - * plist file in your app bundle. (XXX refer to more information on that) - * - * @result The NSDictionary to use for registration. - */ -- (NSDictionary *) registrationDictionaryForGrowl; - -/*! - * @method applicationNameForGrowl - * @abstract Return the name of this application which will be used for Growl bookkeeping. - * @discussion This name is used both internally and in the Growl preferences. - * - * This should remain stable between different versions and incarnations of - * your application. - * For example, "SurfWriter" is a good app name, whereas "SurfWriter 2.0" and - * "SurfWriter Lite" are not. - * - * You do not need to implement this method if you are providing the - * application name elsewhere, meaning in an auto-discoverable plist file in - * your app bundle (XXX refer to more information on that) or in the result - * of -registrationDictionaryForGrowl. - * - * @result The name of the application using Growl. - */ -- (NSString *) applicationNameForGrowl; - -/*! - * @method applicationIconForGrowl - * @abstract Return the NSImage to treat as the application icon. - * @discussion The delegate may optionally return an NSImage - * object to use as the application icon. If this method is not implemented, - * {{{-applicationIconDataForGrowl}}} is tried. If that method is not - * implemented, the application's own icon is used. Neither method is - * generally needed. - * @result The NSImage to treat as the application icon. - */ -- (NSImage *) applicationIconForGrowl; - -/*! - * @method applicationIconDataForGrowl - * @abstract Return the NSData to treat as the application icon. - * @discussion The delegate may optionally return an NSData - * object to use as the application icon; if this is not implemented, the - * application's own icon is used. This is not generally needed. - * @result The NSData to treat as the application icon. - * @deprecated In version 1.1, in favor of {{{-applicationIconForGrowl}}}. - */ -- (NSData *) applicationIconDataForGrowl; - -/*! - * @method growlIsReady - * @abstract Informs the delegate that Growl has launched. - * @discussion Informs the delegate that Growl (specifically, the - * GrowlHelperApp) was launched successfully. The application can take actions - * with the knowledge that Growl is installed and functional. - */ -- (void) growlIsReady; - -/*! - * @method growlNotificationWasClicked: - * @abstract Informs the delegate that a Growl notification was clicked. - * @discussion Informs the delegate that a Growl notification was clicked. It - * is only sent for notifications sent with a non-nil - * clickContext, so if you want to receive a message when a notification is - * clicked, clickContext must not be nil when calling - * +[GrowlApplicationBridge notifyWithTitle: description:notificationName:iconData:priority:isSticky:clickContext:]. - * @param clickContext The clickContext passed when displaying the notification originally via +[GrowlApplicationBridge notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:]. - */ -- (void) growlNotificationWasClicked:(id)clickContext; - -/*! - * @method growlNotificationTimedOut: - * @abstract Informs the delegate that a Growl notification timed out. - * @discussion Informs the delegate that a Growl notification timed out. It - * is only sent for notifications sent with a non-nil - * clickContext, so if you want to receive a message when a notification is - * clicked, clickContext must not be nil when calling - * +[GrowlApplicationBridge notifyWithTitle: description:notificationName:iconData:priority:isSticky:clickContext:]. - * @param clickContext The clickContext passed when displaying the notification originally via +[GrowlApplicationBridge notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:]. - */ -- (void) growlNotificationTimedOut:(id)clickContext; - -@end - -#pragma mark - -/*! - * @category NSObject(GrowlApplicationBridgeDelegate_Installation_InformalProtocol) - * @abstract Methods which may be optionally implemented by the Growl delegate when used with Growl-WithInstaller.framework. - * @discussion The methods in this informal protocol will only be called if - * implemented by the delegate. They allow greater control of the information - * presented to the user when installing or upgrading Growl from within your - * application when using Growl-WithInstaller.framework. - */ -@interface NSObject (GrowlApplicationBridgeDelegate_Installation_InformalProtocol) - -/*! - * @method growlInstallationWindowTitle - * @abstract Return the title of the installation window. - * @discussion If not implemented, Growl will use a default, localized title. - * @result An NSString object to use as the title. - */ -- (NSString *)growlInstallationWindowTitle; - -/*! - * @method growlUpdateWindowTitle - * @abstract Return the title of the upgrade window. - * @discussion If not implemented, Growl will use a default, localized title. - * @result An NSString object to use as the title. - */ -- (NSString *)growlUpdateWindowTitle; - -/*! - * @method growlInstallationInformation - * @abstract Return the information to display when installing. - * @discussion This information may be as long or short as desired (the window - * will be sized to fit it). It will be displayed to the user as an - * explanation of what Growl is and what it can do in your application. It - * should probably note that no download is required to install. - * - * If this is not implemented, Growl will use a default, localized explanation. - * @result An NSAttributedString object to display. - */ -- (NSAttributedString *)growlInstallationInformation; - -/*! - * @method growlUpdateInformation - * @abstract Return the information to display when upgrading. - * @discussion This information may be as long or short as desired (the window - * will be sized to fit it). It will be displayed to the user as an - * explanation that an updated version of Growl is included in your - * application and no download is required. - * - * If this is not implemented, Growl will use a default, localized explanation. - * @result An NSAttributedString object to display. - */ -- (NSAttributedString *)growlUpdateInformation; - -@end - -//private -@interface GrowlApplicationBridge (GrowlInstallationPrompt_private) -+ (void) _userChoseNotToInstallGrowl; -@end - -#endif /* __GrowlApplicationBridge_h__ */ diff --git a/Frameworks/Growl.framework/Versions/A/Headers/GrowlDefines.h b/Frameworks/Growl.framework/Versions/A/Headers/GrowlDefines.h deleted file mode 100644 index 2b971cf..0000000 --- a/Frameworks/Growl.framework/Versions/A/Headers/GrowlDefines.h +++ /dev/null @@ -1,348 +0,0 @@ -// -// GrowlDefines.h -// - -#ifndef _GROWLDEFINES_H -#define _GROWLDEFINES_H - -#ifdef __OBJC__ -#define XSTR(x) (@x) -#define STRING_TYPE NSString * -#else -#define XSTR CFSTR -#define STRING_TYPE CFStringRef -#endif - -/*! @header GrowlDefines.h - * @abstract Defines all the notification keys. - * @discussion Defines all the keys used for registration with Growl and for - * Growl notifications. - * - * Most applications should use the functions or methods of Growl.framework - * instead of posting notifications such as those described here. - * @updated 2004-01-25 - */ - -// UserInfo Keys for Registration -#pragma mark UserInfo Keys for Registration - -/*! @group Registration userInfo keys */ -/* @abstract Keys for the userInfo dictionary of a GROWL_APP_REGISTRATION distributed notification. - * @discussion The values of these keys describe the application and the - * notifications it may post. - * - * Your application must register with Growl before it can post Growl - * notifications (and have them not be ignored). However, as of Growl 0.6, - * posting GROWL_APP_REGISTRATION notifications directly is no longer the - * preferred way to register your application. Your application should instead - * use Growl.framework's delegate system. - * See +[GrowlApplicationBridge setGrowlDelegate:] or Growl_SetDelegate for - * more information. - */ - -/*! @defined GROWL_APP_NAME - * @abstract The name of your application. - * @discussion The name of your application. This should remain stable between - * different versions and incarnations of your application. - * For example, "SurfWriter" is a good app name, whereas "SurfWriter 2.0" and - * "SurfWriter Lite" are not. - */ -#define GROWL_APP_NAME XSTR("ApplicationName") -/*! @defined GROWL_APP_ID - * @abstract The bundle identifier of your application. - * @discussion The bundle identifier of your application. This key should - * be unique for your application while there may be several applications - * with the same GROWL_APP_NAME. - * This key is optional. - */ -#define GROWL_APP_ID XSTR("ApplicationId") -/*! @defined GROWL_APP_ICON - * @abstract The image data for your application's icon. - * @discussion Image data representing your application's icon. This may be - * superimposed on a notification icon as a badge, used as the notification - * icon when a notification-specific icon is not supplied, or ignored - * altogether, depending on the display. Must be in a format supported by - * NSImage, such as TIFF, PNG, GIF, JPEG, BMP, PICT, or PDF. - * - * Optional. Not supported by all display plugins. - */ -#define GROWL_APP_ICON XSTR("ApplicationIcon") -/*! @defined GROWL_NOTIFICATIONS_DEFAULT - * @abstract The array of notifications to turn on by default. - * @discussion These are the names of the notifications that should be enabled - * by default when your application registers for the first time. If your - * application reregisters, Growl will look here for any new notification - * names found in GROWL_NOTIFICATIONS_ALL, but ignore any others. - */ -#define GROWL_NOTIFICATIONS_DEFAULT XSTR("DefaultNotifications") -/*! @defined GROWL_NOTIFICATIONS_ALL - * @abstract The array of all notifications your application can send. - * @discussion These are the names of all of the notifications that your - * application may post. See GROWL_NOTIFICATION_NAME for a discussion of good - * notification names. - */ -#define GROWL_NOTIFICATIONS_ALL XSTR("AllNotifications") -/*! @defined GROWL_NOTIFICATIONS_HUMAN_READABLE_DESCRIPTIONS - * @abstract A dictionary of human-readable names for your notifications. - * @discussion By default, the Growl UI will display notifications by the names given in GROWL_NOTIFICATIONS_ALL - * which correspond to the GROWL_NOTIFICATION_NAME. This dictionary specifies the human-readable name to display. - * The keys of the dictionary are GROWL_NOTIFICATION_NAME strings; the objects are the human-readable versions. - * For any GROWL_NOTIFICATION_NAME not specific in this dictionary, the GROWL_NOTIFICATION_NAME will be displayed. - * - * This key is optional. - */ -#define GROWL_NOTIFICATIONS_HUMAN_READABLE_NAMES XSTR("HumanReadableNames") -/*! @defined GROWL_NOTIFICATIONS_DESCRIPTIONS -* @abstract A dictionary of descriptions of _when_ each notification occurs -* @discussion This is an NSDictionary whose keys are GROWL_NOTIFICATION_NAME strings and whose objects are -* descriptions of _when_ each notification occurs, such as "You received a new mail message" or -* "A file finished downloading". -* -* This key is optional. -*/ -#define GROWL_NOTIFICATIONS_DESCRIPTIONS XSTR("NotificationDescriptions") - -/*! @defined GROWL_TICKET_VERSION - * @abstract The version of your registration ticket. - * @discussion Include this key in a ticket plist file that you put in your - * application bundle for auto-discovery. The current ticket version is 1. - */ -#define GROWL_TICKET_VERSION XSTR("TicketVersion") -// UserInfo Keys for Notifications -#pragma mark UserInfo Keys for Notifications - -/*! @group Notification userInfo keys */ -/* @abstract Keys for the userInfo dictionary of a GROWL_NOTIFICATION distributed notification. - * @discussion The values of these keys describe the content of a Growl - * notification. - * - * Not all of these keys are supported by all displays. Only the name, title, - * and description of a notification are universal. Most of the built-in - * displays do support all of these keys, and most other visual displays - * probably will also. But, as of 0.6, the Log, MailMe, and Speech displays - * support only textual data. - */ - -/*! @defined GROWL_NOTIFICATION_NAME - * @abstract The name of the notification. - * @discussion The name of the notification. Note that if you do not define - * GROWL_NOTIFICATIONS_HUMAN_READABLE_NAMES when registering your ticket originally this name - * will the one displayed within the Growl preference pane and should be human-readable. - */ -#define GROWL_NOTIFICATION_NAME XSTR("NotificationName") -/*! @defined GROWL_NOTIFICATION_TITLE - * @abstract The title to display in the notification. - * @discussion The title of the notification. Should be very brief. - * The title usually says what happened, e.g. "Download complete". - */ -#define GROWL_NOTIFICATION_TITLE XSTR("NotificationTitle") -/*! @defined GROWL_NOTIFICATION_DESCRIPTION - * @abstract The description to display in the notification. - * @discussion The description should be longer and more verbose than the title. - * The description usually tells the subject of the action, - * e.g. "Growl-0.6.dmg downloaded in 5.02 minutes". - */ -#define GROWL_NOTIFICATION_DESCRIPTION XSTR("NotificationDescription") -/*! @defined GROWL_NOTIFICATION_ICON - * @discussion Image data for the notification icon. Must be in a format - * supported by NSImage, such as TIFF, PNG, GIF, JPEG, BMP, PICT, or PDF. - * - * Optional. Not supported by all display plugins. - */ -#define GROWL_NOTIFICATION_ICON XSTR("NotificationIcon") -/*! @defined GROWL_NOTIFICATION_APP_ICON - * @discussion Image data for the application icon, in case GROWL_APP_ICON does - * not apply for some reason. Must be in a format supported by NSImage, such - * as TIFF, PNG, GIF, JPEG, BMP, PICT, or PDF. - * - * Optional. Not supported by all display plugins. - */ -#define GROWL_NOTIFICATION_APP_ICON XSTR("NotificationAppIcon") -/*! @defined GROWL_NOTIFICATION_PRIORITY - * @discussion The priority of the notification as an integer number from - * -2 to +2 (+2 being highest). - * - * Optional. Not supported by all display plugins. - */ -#define GROWL_NOTIFICATION_PRIORITY XSTR("NotificationPriority") -/*! @defined GROWL_NOTIFICATION_STICKY - * @discussion A Boolean number controlling whether the notification is sticky. - * - * Optional. Not supported by all display plugins. - */ -#define GROWL_NOTIFICATION_STICKY XSTR("NotificationSticky") -/*! @defined GROWL_NOTIFICATION_CLICK_CONTEXT - * @abstract Identifies which notification was clicked. - * @discussion An identifier for the notification for clicking purposes. - * - * This will be passed back to the application when the notification is - * clicked. It must be plist-encodable (a data, dictionary, array, number, or - * string object), and it should be unique for each notification you post. - * A good click context would be a UUID string returned by NSProcessInfo or - * CFUUID. - * - * Optional. Not supported by all display plugins. - */ -#define GROWL_NOTIFICATION_CLICK_CONTEXT XSTR("NotificationClickContext") - -/*! @defined GROWL_DISPLAY_PLUGIN - * @discussion The name of a display plugin which should be used for this notification. - * Optional. If this key is not set or the specified display plugin does not - * exist, the display plugin stored in the application ticket is used. This key - * allows applications to use different default display plugins for their - * notifications. The user can still override those settings in the preference - * pane. - */ -#define GROWL_DISPLAY_PLUGIN XSTR("NotificationDisplayPlugin") - -/*! @defined GROWL_NOTIFICATION_IDENTIFIER - * @abstract An identifier for the notification for coalescing purposes. - * Notifications with the same identifier fall into the same class; only - * the last notification of a class is displayed on the screen. If a - * notification of the same class is currently being displayed, it is - * replaced by this notification. - * - * Optional. Not supported by all display plugins. - */ -#define GROWL_NOTIFICATION_IDENTIFIER XSTR("GrowlNotificationIdentifier") - -/*! @defined GROWL_APP_PID - * @abstract The process identifier of the process which sends this - * notification. If this field is set, the application will only receive - * clicked and timed out notifications which originate from this process. - * - * Optional. - */ -#define GROWL_APP_PID XSTR("ApplicationPID") - -/*! @defined GROWL_NOTIFICATION_PROGRESS -* @abstract If this key is set, it should contain a double value wrapped -* in a NSNumber which describes some sort of progress (from 0.0 to 100.0). -* If this is key is not set, no progress bar is shown. -* -* Optional. Not supported by all display plugins. -*/ -#define GROWL_NOTIFICATION_PROGRESS XSTR("NotificationProgress") - -// Notifications -#pragma mark Notifications - -/*! @group Notification names */ -/* @abstract Names of distributed notifications used by Growl. - * @discussion These are notifications used by applications (directly or - * indirectly) to interact with Growl, and by Growl for interaction between - * its components. - * - * Most of these should no longer be used in Growl 0.6 and later, in favor of - * Growl.framework's GrowlApplicationBridge APIs. - */ - -/*! @defined GROWL_APP_REGISTRATION - * @abstract The distributed notification for registering your application. - * @discussion This is the name of the distributed notification that can be - * used to register applications with Growl. - * - * The userInfo dictionary for this notification can contain these keys: - *
    - *
  • GROWL_APP_NAME
  • - *
  • GROWL_APP_ICON
  • - *
  • GROWL_NOTIFICATIONS_ALL
  • - *
  • GROWL_NOTIFICATIONS_DEFAULT
  • - *
- * - * No longer recommended as of Growl 0.6. An alternate method of registering - * is to use Growl.framework's delegate system. - * See +[GrowlApplicationBridge setGrowlDelegate:] or Growl_SetDelegate for - * more information. - */ -#define GROWL_APP_REGISTRATION XSTR("GrowlApplicationRegistrationNotification") -/*! @defined GROWL_APP_REGISTRATION_CONF - * @abstract The distributed notification for confirming registration. - * @discussion The name of the distributed notification sent to confirm the - * registration. Used by the Growl preference pane. Your application probably - * does not need to use this notification. - */ -#define GROWL_APP_REGISTRATION_CONF XSTR("GrowlApplicationRegistrationConfirmationNotification") -/*! @defined GROWL_NOTIFICATION - * @abstract The distributed notification for Growl notifications. - * @discussion This is what it all comes down to. This is the name of the - * distributed notification that your application posts to actually send a - * Growl notification. - * - * The userInfo dictionary for this notification can contain these keys: - *
    - *
  • GROWL_NOTIFICATION_NAME (required)
  • - *
  • GROWL_NOTIFICATION_TITLE (required)
  • - *
  • GROWL_NOTIFICATION_DESCRIPTION (required)
  • - *
  • GROWL_NOTIFICATION_ICON
  • - *
  • GROWL_NOTIFICATION_APP_ICON
  • - *
  • GROWL_NOTIFICATION_PRIORITY
  • - *
  • GROWL_NOTIFICATION_STICKY
  • - *
  • GROWL_NOTIFICATION_CLICK_CONTEXT
  • - *
  • GROWL_APP_NAME (required)
  • - *
- * - * No longer recommended as of Growl 0.6. Three alternate methods of posting - * notifications are +[GrowlApplicationBridge notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:], - * Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext, and - * Growl_PostNotification. - */ -#define GROWL_NOTIFICATION XSTR("GrowlNotification") -/*! @defined GROWL_SHUTDOWN -* @abstract The distributed notification name that tells Growl to shutdown. -* @discussion The Growl preference pane posts this notification when the -* "Stop Growl" button is clicked. -*/ -#define GROWL_SHUTDOWN XSTR("GrowlShutdown") -/*! @defined GROWL_PING - * @abstract A distributed notification to check whether Growl is running. - * @discussion This is used by the Growl preference pane. If it receives a - * GROWL_PONG, the preference pane takes this to mean that Growl is running. - */ -#define GROWL_PING XSTR("Honey, Mind Taking Out The Trash") -/*! @defined GROWL_PONG - * @abstract The distributed notification sent in reply to GROWL_PING. - * @discussion GrowlHelperApp posts this in reply to GROWL_PING. - */ -#define GROWL_PONG XSTR("What Do You Want From Me, Woman") -/*! @defined GROWL_IS_READY - * @abstract The distributed notification sent when Growl starts up. - * @discussion GrowlHelperApp posts this when it has begin listening on all of - * its sources for new notifications. GrowlApplicationBridge (in - * Growl.framework), upon receiving this notification, reregisters using the - * registration dictionary supplied by its delegate. - */ -#define GROWL_IS_READY XSTR("Lend Me Some Sugar; I Am Your Neighbor!") -/*! @defined GROWL_NOTIFICATION_CLICKED - * @abstract The distributed notification sent when a supported notification is clicked. - * @discussion When a Growl notification with a click context is clicked on by - * the user, Growl posts this distributed notification. - * The GrowlApplicationBridge responds to this notification by calling a - * callback in its delegate. - */ -#define GROWL_NOTIFICATION_CLICKED XSTR("GrowlClicked!") -#define GROWL_NOTIFICATION_TIMED_OUT XSTR("GrowlTimedOut!") - -/*! @group Other symbols */ -/* Symbols which don't fit into any of the other categories. */ - -/*! @defined GROWL_KEY_CLICKED_CONTEXT - * @abstract Used internally as the key for the clickedContext passed over DNC. - * @discussion This key is used in GROWL_NOTIFICATION_CLICKED, and contains the - * click context that was supplied in the original notification. - */ -#define GROWL_KEY_CLICKED_CONTEXT XSTR("ClickedContext") -/*! @defined GROWL_REG_DICT_EXTENSION - * @abstract The filename extension for registration dictionaries. - * @discussion The GrowlApplicationBridge in Growl.framework registers with - * Growl by creating a file with the extension of .(GROWL_REG_DICT_EXTENSION) - * and opening it in the GrowlHelperApp. This happens whether or not Growl is - * running; if it was stopped, it quits immediately without listening for - * notifications. - */ -#define GROWL_REG_DICT_EXTENSION XSTR("growlRegDict") - - -#define GROWL_POSITION_PREFERENCE_KEY @"GrowlSelectedPosition" - -#endif //ndef _GROWLDEFINES_H diff --git a/Frameworks/Growl.framework/Versions/A/Resources/Info.plist b/Frameworks/Growl.framework/Versions/A/Resources/Info.plist deleted file mode 100644 index 5a76a5f..0000000 --- a/Frameworks/Growl.framework/Versions/A/Resources/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - Growl - CFBundleIdentifier - com.growl.growlframework - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.2.1 - CFBundleSignature - GRRR - CFBundleVersion - 1.2.1 - NSPrincipalClass - GrowlApplicationBridge - - diff --git a/Frameworks/Growl.framework/Versions/Current b/Frameworks/Growl.framework/Versions/Current deleted file mode 120000 index 8c7e5a6..0000000 --- a/Frameworks/Growl.framework/Versions/Current +++ /dev/null @@ -1 +0,0 @@ -A \ No newline at end of file diff --git a/Gas Mask.xcodeproj/project.pbxproj b/Gas Mask.xcodeproj/project.pbxproj index f2de3e7..3bfd2d9 100644 --- a/Gas Mask.xcodeproj/project.pbxproj +++ b/Gas Mask.xcodeproj/project.pbxproj @@ -58,8 +58,6 @@ 353A80FC10B020B10005CAD1 /* UserDefaults.plist in Resources */ = {isa = PBXBuildFile; fileRef = 353A80FB10B020B10005CAD1 /* UserDefaults.plist */; }; 353D18BC1114C0C1005C4E54 /* applicationIcon.icns in Resources */ = {isa = PBXBuildFile; fileRef = 354E80A010AF33C100FC4757 /* applicationIcon.icns */; }; 3541CE0510E4AF9B00FA00CB /* SyncingArrowsBadge.m in Sources */ = {isa = PBXBuildFile; fileRef = 3541CE0410E4AF9B00FA00CB /* SyncingArrowsBadge.m */; }; - 3541CEA910E4B8F800FA00CB /* Growl.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3541CEA810E4B8F800FA00CB /* Growl.framework */; }; - 3541CEB110E4B90E00FA00CB /* Growl.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3541CEA810E4B8F800FA00CB /* Growl.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; 3544E2D310E4CCB1009AC525 /* Map.m in Sources */ = {isa = PBXBuildFile; fileRef = 3544E2D210E4CCB1009AC525 /* Map.m */; }; 3545DC7310E38DDE00EBA66D /* Offline.png in Resources */ = {isa = PBXBuildFile; fileRef = 3545DC7210E38DDE00EBA66D /* Offline.png */; }; 3545DCA910E396CF00EBA66D /* Network.m in Sources */ = {isa = PBXBuildFile; fileRef = 3545DCA810E396CF00EBA66D /* Network.m */; }; @@ -160,7 +158,6 @@ dstSubfolderSpec = 10; files = ( 354DDD0E114EBC9700DB76D7 /* CrashReportSender.framework in CopyFiles */, - 3541CEB110E4B90E00FA00CB /* Growl.framework in CopyFiles */, 3556CEA110D6B44A00C7301E /* ShortcutRecorder.framework in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; @@ -253,7 +250,6 @@ 353A80FB10B020B10005CAD1 /* UserDefaults.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = UserDefaults.plist; path = Resources/UserDefaults.plist; sourceTree = ""; }; 3541CE0310E4AF9B00FA00CB /* SyncingArrowsBadge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SyncingArrowsBadge.h; path = Source/SyncingArrowsBadge.h; sourceTree = ""; }; 3541CE0410E4AF9B00FA00CB /* SyncingArrowsBadge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SyncingArrowsBadge.m; path = Source/SyncingArrowsBadge.m; sourceTree = ""; }; - 3541CEA810E4B8F800FA00CB /* Growl.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Growl.framework; path = Frameworks/Growl.framework; sourceTree = ""; }; 3544E2D110E4CCB1009AC525 /* Map.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Map.h; path = Source/Map.h; sourceTree = ""; }; 3544E2D210E4CCB1009AC525 /* Map.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Map.m; path = Source/Map.m; sourceTree = ""; }; 3545DC7210E38DDE00EBA66D /* Offline.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Offline.png; path = Resources/Images/Offline.png; sourceTree = ""; }; @@ -392,7 +388,6 @@ 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, 354E7F8110AEFBC500FC4757 /* Security.framework in Frameworks */, 3545DCE410E3997200EBA66D /* SystemConfiguration.framework in Frameworks */, - 3541CEA910E4B8F800FA00CB /* Growl.framework in Frameworks */, 35C8D5A911144F7000B4242D /* Carbon.framework in Frameworks */, 35FBCA511223181000860FDA /* libicucore.dylib in Frameworks */, E99AD9A05BDE6D9CFA6F6C05 /* libPods-Gas Mask.a in Frameworks */, @@ -421,7 +416,6 @@ children = ( 354DDD08114EBC8000DB76D7 /* CrashReportSender.framework */, 35C8D5A811144F7000B4242D /* Carbon.framework */, - 3541CEA810E4B8F800FA00CB /* Growl.framework */, 3545DCE310E3997200EBA66D /* SystemConfiguration.framework */, 3556CEDF10D6B68C00C7301E /* Sparkle.framework */, 3556CE8310D6B3CF00C7301E /* ShortcutRecorder.framework */, diff --git a/Source/NotificationHelper.h b/Source/NotificationHelper.h index 1d9b9e7..de2714e 100644 --- a/Source/NotificationHelper.h +++ b/Source/NotificationHelper.h @@ -6,9 +6,7 @@ // Copyright (c) 2012 Clockwise. All rights reserved. // -#import - -@interface NotificationHelper : NSObject +@interface NotificationHelper : NSObject + (void)notify:(NSString*)title message:(NSString*)message; diff --git a/Source/NotificationHelper.m b/Source/NotificationHelper.m index 69869bc..0c55b79 100644 --- a/Source/NotificationHelper.m +++ b/Source/NotificationHelper.m @@ -8,43 +8,9 @@ #import "NotificationHelper.h" -@interface NotificationHelper(Private) -+ (void)notifyGrowl:(NSString*)title message:(NSString*)message; -+ (void)notifyNative:(NSString*)title message:(NSString*)message; -@end - @implementation NotificationHelper + (void)notify:(NSString*)title message:(NSString*)message -{ - if (floor(NSAppKitVersionNumber) < NSAppKitVersionNumber10_8) { - [NotificationHelper notifyGrowl:title message:message]; - } else { - [NotificationHelper notifyNative:title message:message]; - } -} - -@end - -@implementation NotificationHelper (Private) - -+ (void)notifyGrowl:(NSString*)title message:(NSString*)message -{ - if ([GrowlApplicationBridge growlDelegate] == nil) { - [GrowlApplicationBridge setGrowlDelegate:[NotificationHelper new]]; - } - - [GrowlApplicationBridge - notifyWithTitle:title - description:message - notificationName:title - iconData:nil - priority:0 - isSticky:NO - clickContext:nil]; -} - -+ (void)notifyNative:(NSString*)title message:(NSString*)message { NSUserNotification *notification = [[NSUserNotification alloc] init]; notification.title = title;