User-contributed article: Move a given workspace to active output
Introduction
Assume you have multiple monitors, and various workspaces on each of them.
You have some workspace 1 active on monitor A, and you want to jump to
workspace 2. The default behavior, using the built-in command workspace 2
is to display the workspace 2 on the screen it belongs to.
Another legitimate use-case would be to display the workspace 2 on the currently active screen.
Unfortunately, there is no built-in command in i3 to achieve that, yet. However, thanks to the IPC interface, it is possible to write an external script achieving that.
Installation
First, we need to create an executable script doing the job thanks to the IPC interface.
In this article, we will assume the script is stored in ~/.config/i3/switch-workspace.py
Here is a possible implementation of the script:
#!/usr/bin/env python from json import loads from os import popen from sys import argv def ipc_query(req="command", msg=""): ans = popen("i3-msg -t " + req + " " + msg).readlines()[0] return loads(ans) if __name__ == "__main__": # Usage & checking args if len(argv) != 2: print "Usage: switch-workspace.py name-of-workspace" exit(-1) newworkspace = argv[1] # Retrieving active display active_display = None for w in ipc_query(req="get_workspaces"): if w['focused']: active_display = w['output'] # Moving workspace to active display print ipc_query(msg="'workspace " + newworkspace + "; move workspace to output " + active_display + "; workspace " + newworkspace + "'")
This script uses i3-msg directly, but if you have several IPC scripts, or more complex ones, or if you use quotes in your workspaces' names you may want to use the python i3-ipc bindings as done in this article (however, in this case, you might have to add some bindings to the library to implement chained command since sequentiality is critical in this script).
Do not forget to make the script executable, usually, the following command, assuming you adopted the naming of our article, should work:
chmod u+x ~/.config/i3/switch-workspace.py
Configuration
Once the script is created and made executable, the last step is to add the corresponding bindings in your i3 conf file.
Basically, one way to do that is to replace the workspace X
bindings with
exec --no-startup-id ~/.config/i3/switch-workspace.py X
.
For a standard fr bépo keyboard layout, this will result in:
# switch to workspace bindsym $mod+quotedbl exec --no-startup-id ~/.config/i3/switch-workspace.py 1 bindsym $mod+guillemotleft exec --no-startup-id ~/.config/i3/switch-workspace.py 2 bindsym $mod+guillemotright exec --no-startup-id ~/.config/i3/switch-workspace.py 3 bindsym $mod+parenleft exec --no-startup-id ~/.config/i3/switch-workspace.py 4 bindsym $mod+parenright exec --no-startup-id ~/.config/i3/switch-workspace.py 5 bindsym $mod+at exec --no-startup-id ~/.config/i3/switch-workspace.py 6 bindsym $mod+plus exec --no-startup-id ~/.config/i3/switch-workspace.py 7 bindsym $mod+minus exec --no-startup-id ~/.config/i3/switch-workspace.py 8 bindsym $mod+slash exec --no-startup-id ~/.config/i3/switch-workspace.py 9 bindsym $mod+asterisk exec --no-startup-id ~/.config/i3/switch-workspace.py 10
But of course, you will have to adapt this to your own keyboard layout.
References
- Python i3-ipc bindings
- Swapping workspaces
- IPC interface
- A bug repport explaining how to make the focus follow the moved workspace
Author: captnfab, 2014-08-02