From edb50cbbcd1d6bad93f2287df3fc2b77fb1f7a84 Mon Sep 17 00:00:00 2001 From: Mitchell Livingston Date: Sun, 19 Jul 2009 15:22:56 +0000 Subject: [PATCH] add experimental Growl snapshot --- macosx/Growl.framework/Growl | 1 + macosx/Growl.framework/Headers | 1 + macosx/Growl.framework/Resources | 1 + macosx/Growl.framework/Versions/A/Growl | Bin 0 -> 242540 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 insertions(+) create mode 120000 macosx/Growl.framework/Growl create mode 120000 macosx/Growl.framework/Headers create mode 120000 macosx/Growl.framework/Resources create mode 100755 macosx/Growl.framework/Versions/A/Growl create mode 100644 macosx/Growl.framework/Versions/A/Headers/Growl.h create mode 100644 macosx/Growl.framework/Versions/A/Headers/GrowlApplicationBridge-Carbon.h create mode 100644 macosx/Growl.framework/Versions/A/Headers/GrowlApplicationBridge.h create mode 100644 macosx/Growl.framework/Versions/A/Headers/GrowlDefines.h create mode 100644 macosx/Growl.framework/Versions/A/Resources/Info.plist create mode 120000 macosx/Growl.framework/Versions/Current diff --git a/macosx/Growl.framework/Growl b/macosx/Growl.framework/Growl new file mode 120000 index 000000000..85956e2d2 --- /dev/null +++ b/macosx/Growl.framework/Growl @@ -0,0 +1 @@ +Versions/Current/Growl \ No newline at end of file diff --git a/macosx/Growl.framework/Headers b/macosx/Growl.framework/Headers new file mode 120000 index 000000000..a177d2a6b --- /dev/null +++ b/macosx/Growl.framework/Headers @@ -0,0 +1 @@ +Versions/Current/Headers \ No newline at end of file diff --git a/macosx/Growl.framework/Resources b/macosx/Growl.framework/Resources new file mode 120000 index 000000000..953ee36f3 --- /dev/null +++ b/macosx/Growl.framework/Resources @@ -0,0 +1 @@ +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 new file mode 100755 index 0000000000000000000000000000000000000000..006e53b7faf95d79788edf0aa650dbf3125d7bed GIT binary patch literal 242540 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�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 NxbW1lUU=8${{bBwi9`SZ literal 0 HcmV?d00001 diff --git a/macosx/Growl.framework/Versions/A/Headers/Growl.h b/macosx/Growl.framework/Versions/A/Headers/Growl.h new file mode 100644 index 000000000..e2a44255d --- /dev/null +++ b/macosx/Growl.framework/Versions/A/Headers/Growl.h @@ -0,0 +1,6 @@ +#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 new file mode 100644 index 000000000..e35663f63 --- /dev/null +++ b/macosx/Growl.framework/Versions/A/Headers/GrowlApplicationBridge-Carbon.h @@ -0,0 +1,780 @@ +// +// 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 new file mode 100644 index 000000000..4341f3fbd --- /dev/null +++ b/macosx/Growl.framework/Versions/A/Headers/GrowlApplicationBridge.h @@ -0,0 +1,609 @@ +// +// 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 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/macosx/Growl.framework/Versions/A/Headers/GrowlDefines.h b/macosx/Growl.framework/Versions/A/Headers/GrowlDefines.h new file mode 100644 index 000000000..2b971cfe5 --- /dev/null +++ b/macosx/Growl.framework/Versions/A/Headers/GrowlDefines.h @@ -0,0 +1,348 @@ +// +// 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/macosx/Growl.framework/Versions/A/Resources/Info.plist b/macosx/Growl.framework/Versions/A/Resources/Info.plist new file mode 100644 index 000000000..eeaf93b72 --- /dev/null +++ b/macosx/Growl.framework/Versions/A/Resources/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + Growl + CFBundleIdentifier + com.growl.growlframework + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.1.6b3 + CFBundleSignature + GRRR + CFBundleVersion + 1.1.6b3 + NSPrincipalClass + GrowlApplicationBridge + + diff --git a/macosx/Growl.framework/Versions/Current b/macosx/Growl.framework/Versions/Current new file mode 120000 index 000000000..8c7e5a667 --- /dev/null +++ b/macosx/Growl.framework/Versions/Current @@ -0,0 +1 @@ +A \ No newline at end of file