API Docs

An object representing a single display attached to the system.

Coordinate system

All geometry is returned in Hammerspoon screen coordinates: the origin (0, 0) is at the top-left of the primary display, and y increases downward. This matches Hammerspoon v1 and is the inverse of the raw macOS/CoreGraphics convention.

Examples

const s = hs.screen.main();
console.log(s.name);               // e.g. "Built-in Retina Display"
console.log(s.frame.w);            // usable width in points

console.log(s.mode.width, s.mode.scale); // e.g. 1440, 2

s.desktopImage = "/Users/me/wallpaper.jpg";

Properties

id

number
Unique display identifier (matches `CGDirectDisplayID`).

name

string
The manufacturer-assigned localized display name.

uuid

string
The display's UUID string.

frame

HSRect
The usable screen area in Hammerspoon coordinates, excluding the menu bar and Dock.

fullFrame

HSRect
The full screen area in Hammerspoon coordinates, including menu bar and Dock regions.

position

HSPoint
The screen's top-left corner in global Hammerspoon coordinates.

mode

NSDictionary
The currently active display mode. An object with keys: `width`, `height`, `scale`, `frequency`.

availableModes

NSDictionary[]
All display modes supported by this screen. Each element has keys: `width`, `height`, `scale`, `frequency`.

rotation

number
The current screen rotation in degrees (0, 90, 180, or 270). Assign one of `0`, `90`, `180`, or `270` to rotate the display.

desktopImage

string
The URL string of the current desktop background image for this screen, or `null`. Assign a new absolute file path or `file://` URL string to change the wallpaper.

Methods

setMode(width, height, scale, frequency) -> boolean

Switch to the given display mode. Pass `0` for `scale` or `frequency` to match any value.
setMode(width, height, scale, frequency) -> boolean
Name Type Description
width number Horizontal resolution in pixels.
height number Vertical resolution in pixels.
scale number Backing scale factor (e.g. `2` for HiDPI, `1` for non-HiDPI). Pass `0` to ignore.
frequency number Refresh rate in Hz. Pass `0` to ignore.
boolean
`true` on success.
const s = hs.screen.primary()
s.setMode(1920, 1080, 1, 60)

snapshot() -> Promise<HSImage>

Capture the current contents of this screen as an image. Requires **Screen Recording** permission.
snapshot() -> Promise<HSImage>
Promise<HSImage>
Resolves with the captured image, or rejects if the capture fails (e.g. permission denied).
hs.screen.main().snapshot().then(img => img.saveToFile("/tmp/screen.png"))

toEast() -> HSScreen

The nearest screen whose left edge is at or beyond this screen's right edge, or `null`.
toEast() -> HSScreen
HSScreen
An HSScreen object
const right = hs.screen.main().toEast()

toWest() -> HSScreen

The nearest screen whose right edge is at or before this screen's left edge, or `null`.
toWest() -> HSScreen
HSScreen
An HSScreen object
const left = hs.screen.main().toWest()

toNorth() -> HSScreen

The nearest screen that is physically above this screen, or `null`.
toNorth() -> HSScreen
HSScreen
An HSScreen object
const above = hs.screen.main().toNorth()

toSouth() -> HSScreen

The nearest screen that is physically below this screen, or `null`.
toSouth() -> HSScreen
HSScreen
An HSScreen object
const below = hs.screen.main().toSouth()

setOrigin(x, y) -> boolean

Move this screen so its top-left corner is at the given position in global Hammerspoon coordinates.
setOrigin(x, y) -> boolean
Name Type Description
x number The X coordinate to move to
y number The Y coordinate to move to
boolean
`true` on success.
const s = hs.screen.primary()
s.setOrigin(0, 0)

setPrimary() -> boolean

Designate this screen as the primary display (moves the menu bar here).
setPrimary() -> boolean
boolean
`true` on success.
hs.screen.all()[1].setPrimary()

mirrorOf(screen) -> boolean

Configure this screen to mirror another screen.
mirrorOf(screen) -> boolean
Name Type Description
screen HSScreen The screen to mirror.
boolean
`true` on success.
const all = hs.screen.all()
all[1].mirrorOf(all[0])

mirrorStop() -> boolean

Stop mirroring, restoring this screen to an independent display.
mirrorStop() -> boolean
boolean
`true` on success.
hs.screen.all()[1].mirrorStop()

absoluteToLocal(rect) -> HSRect

Convert a rect in global Hammerspoon coordinates to coordinates local to this screen. The result origin is relative to this screen's top-left corner.
absoluteToLocal(rect) -> HSRect
Name Type Description
rect JSValue An `HSRect` in global Hammerspoon coordinates.
HSRect
The rect offset to be relative to this screen's top-left, or `null` if the input is invalid.
const s = hs.screen.main()
const local = s.absoluteToLocal({x: 1000, y: 500, w: 200, h: 100})

localToAbsolute(rect) -> HSRect

Convert a rect in local screen coordinates to global Hammerspoon coordinates.
localToAbsolute(rect) -> HSRect
Name Type Description
rect JSValue An `HSRect` relative to this screen's top-left corner.
HSRect
The rect in global Hammerspoon coordinates, or `null` if the input is invalid.
const s = hs.screen.main()
const abs = s.localToAbsolute({x: 10, y: 10, w: 100, h: 100})