Skip to content

Feature Request: Option to move displays when focusing a space / static ordering #549

@jneen

Description

@jneen

Hi all,

Thank you so much for yabai, it's the only reason I'm able to use a Mac at all given my RSI.

I have one more other issue I deal with, which is short term memory loss. I had worked around this in my Linux days by using XMonad, where there are only 9 spaces and you can put them on whatever space you like without having to "move" them - the displays sort of exist in a static order and telling a display to show a particular space doesn't change their order. For example, if I have 3 displays, and * marks my focus:

[ 1 ] [ 4* ] [ 7 ]
- alt-8 // switch to space 8
[ 1 ] [ 8* ] [ 7 ]
- alt-r // switch to right monitor
[ 1 ] [ 8 ] [ 7* ]
- alt-4 // switch to space 4: automatically moves it to right display
[ 1 ] [ 8 ] [ 4* ]
- alt-8 // switch to space 8: swaps with middle display
[ 1 ] [ 4 ] [ 8* ]

This way, all I need to remember is where I am and where I want to go.

I know Mission Control doesn't... work this way, and when I use multiple monitors I tend to just completely lose track of all my spaces very quickly, since showing them on different displays shuffles around the Mission Control index. I have used the labels @1 through @9 to keep a static order, which works nicely for preventing re-shuffling, but I have run into a few issues with the switching behaviour, namely:

  • Spaces get randomly destroyed when you unplug a monitor (Keep windows attached to spaces as displays are disconnected and reconnected? #238)
  • Swapping two spaces between the displays (the desired behaviour if the target space is visible on another display) seems literally impossible if both spaces are the last on their display
  • Even if I were to create a temporary space, that's a) slow, and b) there seems to be no way to get the ID or mission-control index of the newly-created space, even from within C code
  • Inserting a scripting layer to move the newly focused space to the current display works, but is agonizingly slow (requires too much yabai -m query and JSON parsing - half a second to a second of lag every time I switch spaces even if the spaces don't have to be moved to another display, or if there is only one display)
  • I've attempted to modify the C source to add an option for space-switching without display-switching, but it seems to get caught in a loop somewhere, flicking between two displays and ultimately crashing the scripting addition >_>. And even theoretically the approach still breaks down in the "swap" case when both spaces are the last on their respective displays.

I'm happy to hack on this more, but I wanted to see if anyone else was thinking along these lines, and/or had any ideas before I get too into the weeds.

Thank you <3
jneen

Metadata

Metadata

Assignees

No one assigned

    Labels

    suggestionRequest for new feature or some form of enhancement

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions