saving an i3 workspace layout
In my office I have a small portrait display off to the side that I like to keep a few of our security cameras up on during the day. Two are exterior cameras watching the front door and the driveway, the other is my son’s nursery camera so I know how quiet or loud I can be since my office is right next to his nursery.
The really old Intel NUC that drives the display runs NixOS and boots into i3 window manager. For a while I was manually launching the cameras but I wanted something that would boot straight to the camera configuration that I like.
First, manually arrange the windows in a way that makes sense for you.
Switch to another Workspace and then launch a terminal:
$ i3-save-tree --workspace 1 > ~/.config/i3/workspace-1.json
Then we need to edit the workspace-1.json
file to actually work, because the i3-save-tree
command comments out the blocks that are important. Below is what mine looks like. Take notice in how I had to add additional braces and square brackets to make the json
legit.
workspace-1.json
// vim:ts=4:sw=4:et
{ "nodes": [
{
"border": "none",
"current_border_width": 0,
"floating": "auto_off",
"geometry": {
"height": 1080,
"width": 1920,
"x": 4294966720,
"y": 143
},
"marks": [],
"name": "Media Presentation - mpv",
"percent": 0.333333333333333,
"swallows": [
{
"class": "^mpv$",
"instance": "^gl$",
"title": "^Media\\ Presentation\\ \\-\\ mpv$"
}
],
"type": "con"
},
{
"border": "none",
"current_border_width": 0,
"floating": "auto_off",
"geometry": {
"height": 1080,
"width": 1920,
"x": 4294966720,
"y": 143
},
"marks": [],
"name": "Media Presentation - mpv",
"percent": 0.333333333333333,
"swallows": [
{
"class": "^mpv$",
"instance": "^gl$",
"title": "^Media\\ Presentation\\ \\-\\ mpv$"
}
],
"type": "con"
},
{
"border": "none",
"current_border_width": 0,
"floating": "auto_off",
"geometry": {
"height": 1080,
"width": 1920,
"x": 4294966720,
"y": 143
},
"marks": [],
"name": "H.264 Video,leco stream - mpv",
"percent": 0.333333333333333,
"swallows": [
{
"class": "^mpv$",
"instance": "^gl$",
"title": "^H\\.264\\ Video\\,leco\\ stream\\ \\-\\ mpv$"
}
],
"type": "con"
}
]
}
You’ll notice that the first two windows have a different title than the third. That’s because the third stream is from a different brand of camera and carries different metadata.
Then, we need to modify our i3 config to auto-launch this config before it launches the three windows for the cameras. Add the below line before the exec
commands for the applications you want to launch.
~/.config/i3/config
exec --no-startup-id "i3-msg 'workspace 1; append_layout /home/username/.config/i3/workspace-1.json'"
Now I just need to work out auto-login, then I can strip all interactive capabilities away from the machine and it’ll be all set.