From 23d0a1adf190c1cc37af5861073096f64607227c Mon Sep 17 00:00:00 2001 From: Mitchell Livingston Date: Sun, 16 Sep 2007 01:03:50 +0000 Subject: [PATCH] hopefully really remove Growl 1.1 --- macosx/Growl.framework/Growl | 1 - macosx/Growl.framework/Headers | 1 - macosx/Growl.framework/Resources | 1 - macosx/Growl.framework/Versions/A/Growl | Bin 154384 -> 0 bytes .../Versions/A/Headers/Growl.h | 6 - .../A/Headers/GrowlApplicationBridge-Carbon.h | 780 ------------------ .../A/Headers/GrowlApplicationBridge.h | 609 -------------- .../Versions/A/Headers/GrowlDefines.h | 348 -------- .../Versions/A/Resources/Info.plist | 24 - macosx/Growl.framework/Versions/Current | 1 - 10 files changed, 1771 deletions(-) delete mode 120000 macosx/Growl.framework/Growl delete mode 120000 macosx/Growl.framework/Headers delete mode 120000 macosx/Growl.framework/Resources delete mode 100755 macosx/Growl.framework/Versions/A/Growl delete mode 100644 macosx/Growl.framework/Versions/A/Headers/Growl.h delete mode 100644 macosx/Growl.framework/Versions/A/Headers/GrowlApplicationBridge-Carbon.h delete mode 100644 macosx/Growl.framework/Versions/A/Headers/GrowlApplicationBridge.h delete mode 100644 macosx/Growl.framework/Versions/A/Headers/GrowlDefines.h delete mode 100644 macosx/Growl.framework/Versions/A/Resources/Info.plist delete mode 120000 macosx/Growl.framework/Versions/Current diff --git a/macosx/Growl.framework/Growl b/macosx/Growl.framework/Growl deleted file mode 120000 index 85956e2d2..000000000 --- a/macosx/Growl.framework/Growl +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Growl \ No newline at end of file diff --git a/macosx/Growl.framework/Headers b/macosx/Growl.framework/Headers deleted file mode 120000 index a177d2a6b..000000000 --- a/macosx/Growl.framework/Headers +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Headers \ No newline at end of file diff --git a/macosx/Growl.framework/Resources b/macosx/Growl.framework/Resources deleted file mode 120000 index 953ee36f3..000000000 --- a/macosx/Growl.framework/Resources +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Resources \ No newline at end of file diff --git a/macosx/Growl.framework/Versions/A/Growl b/macosx/Growl.framework/Versions/A/Growl deleted file mode 100755 index 6a6b5849fb5aa4bc0ab603d072a0318efbb40bd3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 154384 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 swN%Ery83F50zb$&a40#6tAtN;K2 diff --git a/macosx/Growl.framework/Versions/A/Headers/Growl.h b/macosx/Growl.framework/Versions/A/Headers/Growl.h deleted file mode 100644 index e2a44255d..000000000 --- a/macosx/Growl.framework/Versions/A/Headers/Growl.h +++ /dev/null @@ -1,6 +0,0 @@ -#include "GrowlDefines.h" - -#ifdef __OBJC__ -# include "GrowlApplicationBridge.h" -#endif -#include "GrowlApplicationBridge-Carbon.h" diff --git a/macosx/Growl.framework/Versions/A/Headers/GrowlApplicationBridge-Carbon.h b/macosx/Growl.framework/Versions/A/Headers/GrowlApplicationBridge-Carbon.h deleted file mode 100644 index e35663f63..000000000 --- a/macosx/Growl.framework/Versions/A/Headers/GrowlApplicationBridge-Carbon.h +++ /dev/null @@ -1,780 +0,0 @@ -// -// GrowlApplicationBridge-Carbon.h -// Growl -// -// Created by Mac-arena the Bored Zo on Wed Jun 18 2004. -// Based on GrowlApplicationBridge.h by Evan Schoenberg. -// This source code is in the public domain. You may freely link it into any -// program. -// - -#ifndef _GROWLAPPLICATIONBRIDGE_CARBON_H_ -#define _GROWLAPPLICATIONBRIDGE_CARBON_H_ - -#include -#include - -#ifndef GROWL_EXPORT -#define GROWL_EXPORT __attribute__((visibility("default"))) -#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/macosx/Growl.framework/Versions/A/Headers/GrowlApplicationBridge.h b/macosx/Growl.framework/Versions/A/Headers/GrowlApplicationBridge.h deleted file mode 100644 index 6c42b1406..000000000 --- a/macosx/Growl.framework/Versions/A/Headers/GrowlApplicationBridge.h +++ /dev/null @@ -1,609 +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 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 0.8, 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/macosx/Growl.framework/Versions/A/Headers/GrowlDefines.h b/macosx/Growl.framework/Versions/A/Headers/GrowlDefines.h deleted file mode 100644 index a332a6beb..000000000 --- a/macosx/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 NSString * -#else -#define XSTR CFSTR -#define STRING 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/macosx/Growl.framework/Versions/A/Resources/Info.plist b/macosx/Growl.framework/Versions/A/Resources/Info.plist deleted file mode 100644 index 36d284985..000000000 --- a/macosx/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.1 - CFBundleSignature - GRRR - CFBundleVersion - 1.1 - NSPrincipalClass - GrowlApplicationBridge - - diff --git a/macosx/Growl.framework/Versions/Current b/macosx/Growl.framework/Versions/Current deleted file mode 120000 index 8c7e5a667..000000000 --- a/macosx/Growl.framework/Versions/Current +++ /dev/null @@ -1 +0,0 @@ -A \ No newline at end of file