Version: 1.09
InputManagersManager tries to simplify creation of application plugins for developers.
In the simplest case, all InputManagersManager requires is a simple bundle with no special configuration. Such a bundle can be installed by dropping it onto the InputManagersManager dock icon while keeping the Alt and Cmd keys pressed. The classes contained in the InputManager can initialize themselves using the +load method.
Optionally you can set the principal class within the plist. If that class responds to the +install method, InputManagersManager's bundle loader will call that method.
The user experience can be enhanced by a very simple measure: Change the extension of your bundle from .bundle to .IMMbundle. This allows for installation of the bundle by simply double-clicking it.
To change the bundle extension, in Xcode right-click the bundle within the Targets smart group and select Get Info. In the build tab find the Wrapper Extension property, and change it's value from bundle to IMMbundle.
It is easy to configure your IMMbundle to only be loaded in selected applications, or to exclude it from selected applications. To do so edit the bundle's Info.plist file and add an IMMInfo dictionary containing these keys and values:
Example: The IMMInfo example below is for a bundle that is designed to only work in Safari:
<dict>
<key>apps</key>
<array>
<dict>
<key>Name</key>
<string>Safari</string>
</dict>
</array>
<key>disableForApps</key>
<false/>
<key>appsEditable</key>
<false/>
</dict>
Some InputManagers require some configuration before they are first used. InputManagersManager supports that by looking for a bundle named Configure.bundle within your InputManagers Resources. If found, InputManagersManager will load that bundle during installation or upgrade, look for the principal class, and (if present) call a method inside that bundle with the signature +(BOOL)configure:sender. sender is unused at current. The method must return a bool value. If the returned value is NO, InputManagersManager will not install the bundle. The configure: method could for example run a modal panel, allowing the user to configure certain settings.
This works similarly to the Configure bundle, see there for more information. The bundle name is expected to be Delete.bundle, and the called method is +(BOOL)delete:sender. If this method returns NO, InputManagersManager assumes that deletion failed and will warn the user.