Skip to content

Configuring stackline

Adam Wagner edited this page Oct 10, 2020 · 16 revisions

There are 3 configuration themes:

Appearance

Customize indicator sizing, coloring, positioning, roundness, animation durations, form factor, etc

Features

Enable/disable fuzzy frame detection, click-to-focus, or the hacky workaround for a troublesome Hammerspoon bug. The ability to enable/disable features will be especially useful for upcoming features such as displaying window titles during switching.

The main benefit is that you won't have to put up with bugs in a feature that you don't even use ;-)

Paths

An easier way to specify paths to binaries & scripts without mucking around in the Stackline source.


Initialize Stackline with custom config

Let's assume that you think the icon indicators use up too much valuable screen real estate. This is an easy issue to fix!

Create a local variable in your init.lua to hold your customizations. I'll call mine myStackline, but you may name yours whatever you wish.

stackline = require "stackline.stackline.stackline"

local myStackline = {
    appearance = { 
      showIcons = false, 
    },
    features = {
        clickToFocus = false,
        fzyFrameDetect = {
            enabled = true,
            fuzzFactor = 30
        },
    },
}

stackline:init(myStackline)

Values that you set in this table will override Stackline's default config. Note that this table must adhere to the config schema (which can be found in stackline/configmanager.lua). If invalid config options are passed, Stackline a macOS notification will let you know, and the details will be printed to the Hammerspoon console:

2020-10-10 12:19:14: 12:19:14 ERROR:sline.conf: Invalid stackline config:
 {
  appearance = {
    myCoolSetting = "is not allowed."
  }
}

Config validation & live-tweaking

All config values can be edited while stackline is running (this should seem familiar from yabai).

Values can be set using the hs cli tool:

hs -c "stackline.config:set('appearance.radius', 3)"

… or the ipc port:

echo ":appearance.radius:3` | hs -m stackline-config

All config fields support get(key), set(key, val), and getOrSet(key, [val]).

In addition, boolean fields support toggle()

# Toggle with the hs cli
hs -c "stackline.config:toggle('appearance.showIcons')"

# … or the ipc port
echo ":toggle_appearance.showIcons:3` | hs -m stackline-config
# Toggling via ipc port requires prepending the settings path with 'toggle_'
# … I realize this is a bit odd

You can get and set nested config fields via a dot-separated path, like this: features.fzyFrameDetection.enabled

Config fields are typed and validated on initialization and when live-set. stackline will notify you If you can't remember the exact path to a config variable:

image


The default config

c = {}
c.paths = {}
c.appearance = {}
c.features = {}
c.advanced = {}

-- Paths
c.paths.getStackIdxs                  = hs.configdir .. '/stackline/bin/yabai-get-stack-idx'
c.paths.jq                            = '/usr/local/bin/jq'
c.paths.yabai                         = '/usr/local/bin/yabai'

-- Appearance
c.appearance.color                    = { white = 0.90 }
c.appearance.alpha                    = 1
c.appearance.dimmer                   = 2.5                 -- larger numbers increase contrast b/n focused & unfocused state
c.appearance.iconDimmer               = 1.1                 -- Higher numbers dim inactive icons *less* than the non-icon indicators
c.appearance.showIcons                = true                -- Window indicator style ('lozenge'-shaped when false)
c.appearance.size                     = 32                  -- Size of window indicators (height when icons off)
c.appearance.radius                   = 3                   -- Indicator roundness. Higher numbers → *less* roundness… I'm sorry
c.appearance.iconPadding              = 4                   -- Space between icon & indicator edge. Higher numbers → smaller, more inset icons
c.appearance.pillThinness             = 6                   -- Aspect ratio of pill-style icons (width = size / pillThinness)

c.appearance.vertSpacing              = 1.2                 -- Amount of vertical space between indicators

c.appearance.offset                   = {}                  -- Offset controls position of stack indicators relative to the window
c.appearance.offset.y                 = 2                   -- Distance from top of the window to render indicators
c.appearance.offset.x                 = 4                   -- Distance away from the edge of the window to render indicators

c.appearance.shouldFade               = true                -- Enable/disable fade animations
c.appearance.fadeDuration             = 0.2                 -- Duration of fade animations (seconds) 

-- Features
c.features.clickToFocus               = true                -- Click indicator to focus window. Mouse clicks are tracked when enabled
c.features.hsBugWorkaround            = true                -- Workaround for https://github.com/Hammerspoon/hammerspoon/issues/2400

c.features.fzyFrameDetect             = {}                  -- Round window frame dimensions by fuzzFactor before identifying stacked windows
c.features.fzyFrameDetect.enabled     = true                -- Enable/disable fuzzy frame detection
c.features.fzyFrameDetect.fuzzFactor  = 30                  -- Window frame dimensions will be rounded to nearest fuzzFactor

c.features.winTitles                 = 'not_implemented'    -- Valid options: false, true, 'when_switching', 'not_implemented'
c.features.dynamicLuminosity         = 'not_implemented'    -- Valid options: false, true, 'not_implemented'

c.advanced.maxRefreshRate             = 0.3                 -- How aggressively to refresh Stackline. Higher = slower response time + less battery drain

return c

Next: Keybindings →

Clone this wiki locally