-
-
Notifications
You must be signed in to change notification settings - Fork 152
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Feature: Implement sticky floating windows #2
Comments
Is it possible to have sticky non-floating windows? SImilar to this request: koekeishiya/yabai#1843 I'd like to have a constant window on my screen as I flip through workspaces. |
"sticky sidebar" windows bring some challenges
But in general, I like the suggestion, I always wanted to have sticky non-floating windows in i3 |
Maybe we are better off with a feature like "virtual monitors". That way you could place two virtual monitors on your physical monitor. You could cycle workspaces only on one of those virtual monitors |
Is there any update on this? I have some widget windows; it would be great if we could keep them on all workspaces. |
That's indeed a great thing to have. For i3 I typically use xrandr to split up a 5120x? physical device into three virtual monitors, the latter of which can then be used for workspace assignments. But this does not necessarily solve the issue for floating (possibly workspace-independent) windows (assuming a certain preference for floating Zoom/Teams/etc. because it's easier to re-arrange during meetings). So I'd vote for both :) |
Has this ever been implemented? I'm looking for a way to keep FF PiP window in the same position when moving workspaces |
For now, I'm manually doing this when I switch workspaces:
I must say, it's a very weird and terrible experience, but at least the PIP window is "sticky"! 😐 |
Would be super neat to keep a Zoom floating window as sticky so I can see whats going on in a meeting while I cycle through workspaces. |
I'm definitely in need of this feature! Hope it comes soon! |
Can we extend the functionality of exec-on-workspace-change,force specific windows to move-node-to-{{currently focused workspace}}? |
I thought this would be possible to jury-rig for at least one window using exec-on-workspace-change = ['/bin/bash', '-c',
'WIN=$(aerospace list-windows --all | grep "<Window Title>" | cut -d" " -f1); [ -n "$WIN" ] && aerospace move-node-to-workspace --window-id="$WIN" "$AEROSPACE_FOCUSED_WORKSPACE"'
] |
@andsnpl: I think the issue with yours is the
However, it seemed to move the window to the focused workspace but it lost focus so it would be behind my other windows. I tried giving it focus as part of
|
Edit: my bad.
exec-on-workspace-change = ['/bin/bash', '-c',
# 'WIN=$(aerospace list-windows --all | grep "<Window Title>" | cut -d" " -f1); [ -n "$WIN" ] && aerospace move-node-to-workspace --window-id "$WIN" "$AEROSPACE_FOCUSED_WORKSPACE"'
'WIN=$(aerospace list-windows --all | grep "<Window Title>" | cut -d" " -f1); echo "$WIN -> $AEROSPACE_FOCUSED_WORKSPACE" > "$HOME/Desktop/floating_window.txt"'
]
As far as the focus/always-on-top shortcomings, I can see how that would need some built-in solution. In my case, the window I'm trying to move has that behavior anyway so it's not a problem for me. |
@andsnpl: |
@gservat ah, I think that's it. You seem to be on Apple silicon and I'm still on Intel, so homebrew has different install behavior. My If you're using the |
@andsnpl: ahhh yes, good find! I wonder if it's worth filing a PR to update the default exec env variables to add |
I have the following script (defined as #!/usr/bin/env sh
ws=${1:-$AEROSPACE_FOCUSED_WORKSPACE}
IFS=$'\n' all_wins=$(aerospace list-windows --all --format '%{window-id}|%{app-name}|%{window-title}|%{monitor-id}|%{workspace}')
IFS=$'\n' all_ws=$(aerospace list-workspaces --all --format '%{workspace}|%{monitor-id}')
chrome_pip=$(printf '%s\n' $all_wins | rg 'Picture in Picture')
target_mon=$(printf '%s\n' $all_ws | rg "$ws" | cut -d'|' -f2 | xargs)
move_win() {
local win="$1"
[[ -n $win ]] || return 0
local win_mon=$(printf $win | cut -d'|' -f4 | xargs)
local win_id=$(printf $win | cut -d'|' -f1 | xargs)
local win_app=$(printf $win | cut -d'|' -f2 | xargs)
local win_ws=$(printf $win | cut -d'|' -f5 | xargs)
[[ $target_mon != $win_mon ]] && return 0
[[ $ws == $win_ws ]] && return 0
aerospace move-node-to-workspace --window-id $win_id $ws
}
move_win "${chrome_pip}" And in my exec-on-workspace-change = ['<full-path-to>/on-ws-change.sh'] |
It looks like pip is a very common use case, safari pip seems to work out of box (perhaps it is due to the script I installed to fix zen browser pip?), would be nice if this is buildin instead |
# After that, you can edit ~/.aerospace.toml to your liking # You can use it to add commands that run after login to macOS user session. # 'start-at-login' needs to be 'true' for 'after-login-command' to work # Available commands: https://nikitabobko.github.io/AeroSpace/commands after-login-command = [] # You can use it to add commands that run after AeroSpace startup. # 'after-startup-command' is run after 'after-login-command' # Available commands : https://nikitabobko.github.io/AeroSpace/commands after-startup-command = [] # Start AeroSpace at login start-at-login = false # Normalizations. See: https://nikitabobko.github.io/AeroSpace/guide#normalization enable-normalization-flatten-containers = true enable-normalization-opposite-orientation-for-nested-containers = true # See: https://nikitabobko.github.io/AeroSpace/guide#layouts # The 'accordion-padding' specifies the size of accordion padding # You can set 0 to disable the padding feature accordion-padding = 30 # Possible values: tiles|accordion default-root-container-layout = 'tiles' # Possible values: horizontal|vertical|auto # 'auto' means: wide monitor (anything wider than high) gets horizontal orientation, # tall monitor (anything higher than wide) gets vertical orientation default-root-container-orientation = 'auto' # Mouse follows focus when focused monitor changes # Drop it from your config, if you don't like this behavior # See https://nikitabobko.github.io/AeroSpace/guide#on-focus-changed-callbacks # See https://nikitabobko.github.io/AeroSpace/commands#move-mouse # Fallback value (if you omit the key): on-focused-monitor-changed = [] on-focused-monitor-changed = ['move-mouse monitor-lazy-center'] # You can effectively turn off macOS "Hide application" (cmd-h) feature by toggling this flag # Useful if you don't use this macOS feature, but accidentally hit cmd-h or cmd-alt-h key # Also see: https://nikitabobko.github.io/AeroSpace/goodies#disable-hide-app automatically-unhide-macos-hidden-apps = false # Possible values: (qwerty|dvorak) # See https://nikitabobko.github.io/AeroSpace/guide#key-mapping [key-mapping] preset = 'qwerty' # Gaps between windows (inner-*) and between monitor edges (outer-*). # Possible values: # - Constant: gaps.outer.top = 8 # - Per monitor: gaps.outer.top = [{ monitor.main = 16 }, { monitor."some-pattern" = 32 }, 24] # In this example, 24 is a default value when there is no match. # Monitor pattern is the same as for 'workspace-to-monitor-force-assignment'. # See: https://nikitabobko.github.io/AeroSpace/guide#assign-workspaces-to-monitors [gaps] inner.horizontal = 0 inner.vertical = 0 outer.left = 0 outer.bottom = 0 outer.top = 0 outer.right = 0 # 'main' binding mode declaration # See: https://nikitabobko.github.io/AeroSpace/guide#binding-modes # 'main' binding mode must be always presented # Fallback value (if you omit the key): mode.main.binding = {} [mode.main.binding] # All possible keys: # - Letters. a, b, c, ..., z # - Numbers. 0, 1, 2, ..., 9 # - Keypad numbers. keypad0, keypad1, keypad2, ..., keypad9 # - F-keys. f1, f2, ..., f20 # - Special keys. minus, equal, period, comma, slash, backslash, quote, semicolon, backtick, # leftSquareBracket, rightSquareBracket, space, enter, esc, backspace, tab # - Keypad special. keypadClear, keypadDecimalMark, keypadDivide, keypadEnter, keypadEqual, # keypadMinus, keypadMultiply, keypadPlus # - Arrows. left, down, up, right # All possible modifiers: cmd, alt, ctrl, shift # All possible commands: https://nikitabobko.github.io/AeroSpace/commands # See: https://nikitabobko.github.io/AeroSpace/commands#exec-and-forget # You can uncomment the following lines to open up terminal with alt + enter shortcut (like in i3) # alt-enter = '''exec-and-forget osascript -e ' # tell application "Terminal" # do script # activate # end tell' # ''' # See: https://nikitabobko.github.io/AeroSpace/commands#layout alt-slash = 'layout tiles horizontal vertical' alt-comma = 'layout accordion horizontal vertical' # See: https://nikitabobko.github.io/AeroSpace/commands#focus alt-h = 'focus left' alt-j = 'focus down' alt-k = 'focus up' alt-l = 'focus right' # See: https://nikitabobko.github.io/AeroSpace/commands#move alt-shift-h = 'move left' alt-shift-j = 'move down' alt-shift-k = 'move up' alt-shift-l = 'move right' # See: https://nikitabobko.github.io/AeroSpace/commands#resize alt-shift-minus = 'resize smart -50' alt-shift-equal = 'resize smart +50' # See: https://nikitabobko.github.io/AeroSpace/commands#workspace alt-1 = 'workspace 1' alt-2 = 'workspace 2' alt-3 = 'workspace 3' alt-4 = 'workspace 4' alt-5 = 'workspace 5' alt-6 = 'workspace 6' alt-7 = 'workspace 7' alt-8 = 'workspace 8' alt-9 = 'workspace 9' alt-a = 'workspace A' # In your config, you can drop workspace bindings that you don't need alt-b = 'workspace B' alt-c = 'workspace C' alt-d = 'workspace D' alt-e = 'workspace E' alt-f = 'workspace F' alt-g = 'workspace G' alt-i = 'workspace I' alt-m = 'workspace M' alt-n = 'workspace N' alt-o = 'workspace O' alt-p = 'workspace P' alt-q = 'workspace Q' alt-r = 'workspace R' alt-s = 'workspace S' alt-t = 'workspace T' alt-u = 'workspace U' alt-v = 'workspace V' alt-w = 'workspace W' alt-x = 'workspace X' alt-y = 'workspace Y' alt-z = 'workspace Z' # See: https://nikitabobko.github.io/AeroSpace/commands#move-node-to-workspace alt-shift-1 = 'move-node-to-workspace 1' alt-shift-2 = 'move-node-to-workspace 2' alt-shift-3 = 'move-node-to-workspace 3' alt-shift-4 = 'move-node-to-workspace 4' alt-shift-5 = 'move-node-to-workspace 5' alt-shift-6 = 'move-node-to-workspace 6' alt-shift-7 = 'move-node-to-workspace 7' alt-shift-8 = 'move-node-to-workspace 8' alt-shift-9 = 'move-node-to-workspace 9' alt-shift-a = 'move-node-to-workspace A' alt-shift-b = 'move-node-to-workspace B' alt-shift-c = 'move-node-to-workspace C' alt-shift-d = 'move-node-to-workspace D' alt-shift-e = 'move-node-to-workspace E' alt-shift-f = 'move-node-to-workspace F' alt-shift-g = 'move-node-to-workspace G' alt-shift-i = 'move-node-to-workspace I' alt-shift-m = 'move-node-to-workspace M' alt-shift-n = 'move-node-to-workspace N' alt-shift-o = 'move-node-to-workspace O' alt-shift-p = 'move-node-to-workspace P' alt-shift-q = 'move-node-to-workspace Q' alt-shift-r = 'move-node-to-workspace R' alt-shift-s = 'move-node-to-workspace S' alt-shift-t = 'move-node-to-workspace T' alt-shift-u = 'move-node-to-workspace U' alt-shift-v = 'move-node-to-workspace V' alt-shift-w = 'move-node-to-workspace W' alt-shift-x = 'move-node-to-workspace X' alt-shift-y = 'move-node-to-workspace Y' alt-shift-z = 'move-node-to-workspace Z' # See: https://nikitabobko.github.io/AeroSpace/commands#workspace-back-and-forth alt-tab = 'workspace-back-and-forth' # See: https://nikitabobko.github.io/AeroSpace/commands#move-workspace-to-monitor alt-shift-tab = 'move-workspace-to-monitor --wrap-around next' # See: https://nikitabobko.github.io/AeroSpace/commands#mode alt-shift-semicolon = 'mode service' # 'service' binding mode declaration. # See: https://nikitabobko.github.io/AeroSpace/guide#binding-modes [mode.service.binding] esc = ['reload-config', 'mode main'] r = ['flatten-workspace-tree', 'mode main'] # reset layout f = ['layout floating tiling', 'mode main'] # Toggle between floating and tiling layout backspace = ['close-all-windows-but-current', 'mode main'] # sticky is not yet supported nikitabobko/AeroSpace#2 #s = ['layout sticky tiling', 'mode main'] alt-shift-h = ['join-with left', 'mode main'] alt-shift-j = ['join-with down', 'mode main'] alt-shift-k = ['join-with up', 'mode main'] alt-shift-l = ['join-with right', 'mode main'] down = 'volume down' up = 'volume up' shift-down = ['volume set 0', 'mode main']
@farzadmf Your code breaks when I have multiple monitors connected (1 or 2), and I'm trying to switch to workspace named 1 or 2. A quick fix would be to anchor the rg regex at the beginning of the string, when calculating the variable
Adding it here as reference in case there's anyone else trying to troubleshoot this. |
Oh cool, thanks for letting me know @thalesmello ; I didn't even think that someone would be using my code 😆 |
https://i3wm.org/docs/userguide.html#_sticky_floating_windows
flatten-workspace-tree
,close-all-windows-but-current
)Note to myself: review usages of
visualWorkspace
The text was updated successfully, but these errors were encountered: