0.9.44 - 15 Jan 2016

Core

  • The bundled version of Lua is now 5.3.2
  • The Hammerspoon community Code of Conduct has been updated to Contributors Covenant 1.3.0
  • Added: hs.printf()

Extensions

  • Fixed: hs.menubar no longer causes WindowServer to log an error when menu items are removed
  • Fixed: hs.drawing should no longer crash on invalid UTF-8 inputs
  • Fixed: various minor issues in hs.grid
  • Fixed: hs.window.filter is now more reliable when “unusual” helper applications are running
  • Fixed: hs.host no longer crashes when iterating volumes while a volume is being removed from the system
  • Fixed: hs.urlevent now handles HTML files being opened by the system, and now works correctly if an http(s) URL, or HTML file, is opened while Hammerspoon is not running
  • Changed: hs.eventtap.event events are now more efficient and reliable
  • Changed: hs.webview now hands unknown URL schemes to the OS
  • Changed: hs.wifi can now perform background scans and return more information about WiFi adapters
  • Added: hs.redshift
  • Added: hs.speech and hs.speech.listener for Text-To-Speech and Speech Recognition, respectively
  • Added: hs.fs.volume
  • Added: hs.chooser
  • Added: hs.task now supports long-running tasks, with callbacks for capturing stdout/stderr
  • Added: hs.task now supports writing data to the stdin of tasks
  • Added: hs.task:workingDirectory(), hs.task:setCallback()
  • Added: hs.console for interacting with the Hammerspoon Console window
  • Added: hs.drawing.arc() for drawing partial circles
  • Added: hs.window.filter.windowAllowed, hs.window.filter.windowRejected, hs.window.filter.hasWindow and hs.window.filter.hasNoWindows events
  • Added: hs.timer.doAt(), hs.timer.delayed() and hs.timer.localTime()
  • Added: hs.setLogLevel()
  • Added: hs.logger now keeps a small history buffer
  • Added: .getVolume(), .setVolume(), .volumeUp(), .volumeDown(), .getPosition(), .setPosition(), .ff() and .rw() to hs.itunes and hs.spotify
  • Added: hs.caffeinate.watcher now supports events for screensaver activity and Fast User Switching activity
  • Removed: hs.crash.isMainThread() as we now perform this check automatically in almost all internal functions

0.9.43 - 17 Nov 2015

Core

  • Improved the icon for non-retina screens
  • LuaSkin API documentation is now published at http://www.hammerspoon.org/docs/LuaSkin/
  • Force OS X to not try and place Hammerspoon in AppNap
  • Updated Crashlytics.framework to 3.4.0

Extensions

  • Fixed: hs.expose is now correctly included in the application
  • Fixed: hs.screen.find() by screen ID now works correctly
  • Fixed: hs.drawing:setImageFromPath() and hs.drawing:setImageFromASCII() now work correctly
  • Changed: The desktop is now excluded from hs.window.allWindows()
  • Changed: The play() functions in hs.spotify and hs.itunes no longer toggle between play and pause
  • Changed: hs.layout now defaults to using the main screen if it encounters a problem finding a screen
  • Changed: hs.application.nameForBundleID() now returns the full application name, not the name of its executable
  • Added: hs.window.desktop()
  • Added: hs.audiodevice can now inspect device datasources and watch for configuration changes and device addition/removal
  • Added: hs.audiodevice.watcher for observing changes on specific audio devices (e.g. headphone insertion/removal)
  • Added: hs.audiodevice.findDeviceByName(), hs.audiodevice.findOutputDeviceByUID(), hs.audiodevice.findInputDeviceByUID(), hs.audiodevice:jackConnected()
  • Added: hs.spotify.playpause(), hs.spotify.getPlayerState(), hs.spotify.isRunning(), hs.spotify.isPlaying()
  • Added: hs.itunes.playpause(), hs.itunes.getPlayerState(), hs.itunes.isRunning(), hs.itunes.isPlaying()
  • Added: hs.application:isRunning()
  • Added: hs.screen:getBrightness(), hs.screen:setBrightness() (separate from hs.brightness because they are able to work on Apple external displays)
  • Added: hs.menubar:frame()
  • Added: hs.styledtext (highly configurable text styling for hs.drawing)
  • Added: hs.javascript (analogous to hs.applescript)
  • Added: hs.pasteboard.getImageContents(), hs.pasteboard.setImageContents()
  • Added: hs.task (asynchronous execution of external binaries)
  • Added: hs.host.volumeInformation()
  • Added: hs.keycodes.layouts(), hs.keycodes.currentLayout(), hs.keycodes.setLayout()
  • Added: hs.drawing:frame()