Release: dd.mm.yyyy
Release: 25.4.2016
- Phoenix now supports Spaces! These features are only supported on El Capitan (10.11) and upwards. A new global
Space-object has been created to control spaces, see the API (#60). - Preferences can now be set programmatically through the API (#67).
- Phoenix can be run completely in the background, this also removes the status bar menu, see the
daemon-preference in the API (#68). - You can now create timers to achieve delays and timed events. A new
TimerHandler-object has been created to control timers, see its API. See the functionsPhoenix.after(double interval, Function callback)andPhoenix.every(double interval, Function callback)in the API to create timers (#77).
- Upgrade Sparkle to 1.14.0. This also fixes the HTTP MITM-vulnerability discovered in Sparkle — though Phoenix was never vulnerable since we use HTTPS to secure updates.
- Adjust latency of context reloads on configuration file changes to limit race conditions (#83).
- Objects that implement
Iterablecan be traversed. Namely,ScreenandSpace. - All handlers now receive their handlers as the last argument for the callback function.
- Improvements to memory management and other small improvements.
- Improve error handling in preprocessing (#65).
- Fix an issue that prevented an exception raised in a handler callback to be caught and reported (#70).
- Fix an issue that prevented setting the frame for a window correctly while moving it to a smaller screen (#84).
- New: Event
spaceDidChangeis triggered when the active space has changed.
- New: Function
after(double interval, Function callback)creates a timer that fires the callback once after the given interval (in seconds) and returns the handler, you must keep a reference to the handler in order for your callback to get called, the callback function receives its handler as the only argument. - New: Function
every(double interval, Function callback)creates a timer that fires the callback repeatedly until stopped using the given interval (in seconds) and returns the handler, you must keep a reference to the handler in order for your callback to get called, the callback function receives its handler as the only argument. - New: Function
set(Map<String, AnyObject> preferences)sets the preferences from the given key–value map, any previously set preferences with the same key will be overridden. - Change: The callback for function
bind(String key, Array<String> modifiers, Function callback)now receives its handler as the only argument, previously the callback received no arguments. - Change: The callback for function
on(String event, Function callback)now receives its handler as the last argument.
- New: Function
identifier()returns the UUID for the screen (#79). - New: Function
spaces()returns all spaces for the screen (OS X 10.11+, returns an empty list otherwise).
- New: Function
isFullScreen()returnstrueif the window is a full screen window (#60, #80). - New: Function
spaces()returns the spaces where the window is currently present (OS X 10.11+, returns an empty list otherwise). - New: Function
setFullScreen(boolean value)sets whether the window is full screen (#60, #80).
Release: 12.12.2015
- Amend license regarding the Phoenix icon assets contributed by Jason Milkins for not being under the MIT License (#61).
- Fix issue where
Mouse.location()andMouse.moveTo(Point point)used different coordinate origins. Both now correctly use top-left as the origin (#58). - Support shells (e.g. Fish) that do not support
-cloption shorthand in preprocessing (#57).
Release: 28.11.2015
- Phoenix now supports events! See the API. To bind an event to a callback function, you call the
on-function for thePhoenix-object. - You may now use JavaScript preprocessing and languages such as CoffeeScript to write your Phoenix-configuration (#45). Thanks @shayne!
- Updates are now delivered and installed through Sparkle (#50).
- Phoenix now supports additional configuration locations. In addition to
~/.phoenix.js, you may also use~/Library/Application Support/Phoenix/phoenix.jsor~/.config/phoenix/phoenix.jsif you prefer to do so (#52).
- Phoenix has been rewritten and refactored from the ground up. This also means that Phoenix now requires OS X Yosemite (10.10) or higher. Xcode 7 is now required for building.
- Supports OS X El Capitan (10.11).
- Underscore.js is upgraded to 1.8.3 (from 1.5.2). This may change existing behaviour related to Underscore.
- Global
api-object is now calledPhoenix. - Global
MousePosition-object is now calledMouse. Hotkey-object is now calledKeyHandlerand its properties have changed. See the API.- The concept of
Alertshas been deprecated. A new globalModal-object has been created to display messages as modals. See the API. - A new
EventHandler-object has been created to handle events. See the API. - A new global
Command-object has been created to run UNIX-commands. See the API.
- A new subtler status item icon.
- Alerts are now delivered through Notification Center and logged to Console for easier debugging.
- Now reloading the context gives no alert unless an error is encountered.
- Objects that implement
Identifiablecan be identified and compared.
- Support non-unicode keyboards (#34).
- Support relative requires with symlinks in configuration (#42).
- New: Function
on(String event, Function callback)binds an event to a callback function. - New: Function
notify(String message)delivers a message to the Notification Center. - Change: Function
launch(String appName)has moved to the globalApp-object. - Change: Function
runCommand(String commandPath, Array arguments)has moved to a new globalCommand-object and is now calledrun(String path, Array arguments). - Deprecation: Function
alert(String message, double durationInSeconds)has been removed, useModalto display messages as modals. - Deprecation: Function
cancelAlerts()has been removed, you must keep references to modals yourself to close them. - Deprecation: Function
setTint(Array<double> red, Array<double> green, Array<double> blue)has been removed with no replacement.
- New: KeyHandler now implements
Identifiable. - Change: You must now keep a reference to the handler, otherwise your callback will not get called.
- Change: Special keys are now camelCased (case sensitive) instead of underscored. See changed keys.
- Change: Keys for keypad are now prefix with
keypadinstead ofpad.
- New: Screen now implements
Identifiable. - New: Function
mainScreen()returns the screen containing the window with the keyboard focus. - New: Function
screens()returns all screens. - New: Function
windows()returns all windows for the screen. - New: Function
visibleWindows()returns all visible windows for the screen. - Change: For clarity, functions
frameIncludingDockAndMenu()andframeWithoutDockOrMenu()are nowframeInRectangle()andvisibleFrameInRectangle(), respectively. - Change: Functions
nextScreen()andpreviousScreen()are now simplynext()andprevious().
- New: Function
moveTo(Point point)returns a boolean value for determining success. - Change: Functions
capture()andrestore(Point point)are now calledlocation()andmoveTo(Point point).
- New: App now implements
Identifiable. - New: All actions return a boolean value for determining success.
- New: Function
get(String appName)returns the running app with the given name. - New: Function
launch(String appName)now returns the launched app if successful. - New: Function
focusedApp()returns the focused app. - New: Function
isActive()returns whether the app is currently frontmost. - New: Function
isTerminated()returns whether the app has been terminated. - New: Function
mainWindow()returns the main window for the app. - New: A new function
focus()focuses the app and its windows. - Change: Property
pidis now a function calledprocessIdentifier(). - Change: Function
title()is now calledname(). - Change: Function
allWindows()is now simplywindows(). - Change: Functions
kill()andkill9()are nowterminate()andforceTerminate(), respectively.
- New: Window now implements
Identifiable. - New: All actions return a boolean value for determining success.
- New: Function
isMain()returns whether the window is the main window for its app. - New: Function
isVisible()returns whether the window is a normal and unminimised window that belongs to an unhidden app. - Change: Function
allWindows()is now simplywindows(). - Change: Function
visibleWindowsMostRecentFirst()is renamed tovisibleWindowsInOrder()for clarity. - Change: Function
isNormalWindow()is now simplyisNormal(). - Change: Function
isWindowMinimized()is now simplyisMinimized(). - Change: Function
unMinimize()is nowunminimize(). - Change: Function
focusWindow()is nowfocus(). - Change: Alignment functions
windowsToWest(), windowsToEast(), windowsToNorth(), windowsToSouth()now correctly return windows relative to the window and not relative to the focused window. To achieve the previous behaviour you need chain these with thefocusedWindow()-accessor. This also affectsfocusClosestWindowInWest(), focusClosestWindowInEast(), focusClosestWindowInNorth(), focusClosestWindowInSouth()-functions. - Change: Functions
focusWindowLeft(), focusWindowRight(), focusWindowUp(), focusWindowDown()are nowfocusClosestWindowInWest(), focusClosestWindowInEast(), focusClosestWindowInNorth(), focusClosestWindowInSouth(), respectively.