Thicket data repository for the EEG
1{
2 "id": "https://ryan.freumh.org/sway.html",
3 "title": "Sway",
4 "link": "https://ryan.freumh.org/sway.html",
5 "updated": "2025-02-07T00:00:00",
6 "published": "2025-02-07T00:00:00",
7 "summary": "<div>\n \n <span>Published 7 Feb 2025.</span>\n \n \n </div>\n \n <div> Tags: <a href=\"/technology.html\" title=\"All pages tagged 'technology'.\">technology</a>. </div>\n \n \n\n <p><span>I use the <a href=\"https://github.com/swaywm/sway\">sway</a> Wayland compositor, which\nis a clone of the X11 <a href=\"https://i3wm.org/\">i3</a> window manager\nfor <a href=\"https://wayland.freedesktop.org/\">Wayland</a>. Wayland is a\ncommunications protocol for next-generation display servers used in\nUnix-like systems which has been adopted as the default display server\nby Linux distributions including Fedora with KDE, and Ubuntu and Debian\nwith GNOME. I use the sway Wayland compositor. It aims to replace the\nvenerable X display server with a modern alternative. X leaves logic\nsuch as window management to application software, which has allowed the\nproliferation of different approaches. Wayland, however, centralises\nthis logic in the ‘compositor’, which assumes both display server and\nwindow manager roles.</span></p>\n<h2>Status</h2>\n<p><span>In lieu of a status bar I invoke a little <a href=\"https://github.com/RyanGibb/nixos/tree/master/home/status/bin/st\">script</a>\nwith <code>Super+Esc</code> which shows various system\ninformation in a notification with the <a href=\"https://github.com/dunst-project/dunst\">dunst</a> notification\ndaemon,</span></p>\n<div><pre><code><span><a href=\"#cb1-1\"></a><span>#!/usr/bin/env bash</span></span>\n<span><a href=\"#cb1-2\"></a></span>\n<span><a href=\"#cb1-3\"></a><span>INFOS</span><span>=</span><span>()</span></span>\n<span><a href=\"#cb1-4\"></a></span>\n<span><a href=\"#cb1-5\"></a><span>DATE</span><span>=</span><span>`</span><span>date</span> <span>"+%a %Y-%m-%d %I:%M:%S%p"</span><span>`</span></span>\n<span><a href=\"#cb1-6\"></a></span>\n<span><a href=\"#cb1-7\"></a><span>add_info()</span> <span>{</span></span>\n<span><a href=\"#cb1-8\"></a> <span>local</span> <span>SCRIPT_NAME</span><span>=</span><span>$1</span></span>\n<span><a href=\"#cb1-9\"></a> <span>local</span> <span>INFO</span><span>=</span><span>"</span><span>`</span><span>$(</span><span>dirname</span> <span>"</span><span>$0</span><span>"</span><span>)</span><span>/../lib/</span><span>${SCRIPT_NAME}</span><span>.sh</span><span>`</span><span>"</span></span>\n<span><a href=\"#cb1-10\"></a> <span>if</span> <span>[</span> <span>"</span><span>$INFO</span><span>"</span> <span>!=</span> <span>""</span> <span>]</span><span>;</span> <span>then</span></span>\n<span><a href=\"#cb1-11\"></a> <span>INFOS</span><span>+=</span><span>(</span><span>"</span><span>$INFO</span><span>"</span><span>)</span></span>\n<span><a href=\"#cb1-12\"></a> <span>fi</span></span>\n<span><a href=\"#cb1-13\"></a><span>}</span></span>\n<span><a href=\"#cb1-14\"></a></span>\n<span><a href=\"#cb1-15\"></a><span>TIMEOUT</span><span>=</span>10000</span>\n<span><a href=\"#cb1-16\"></a></span>\n<span><a href=\"#cb1-17\"></a><span>if</span> <span>[</span> <span>"</span><span>$#</span><span>"</span> <span>-eq</span> 0 <span>]</span> <span>||</span> <span>(</span><span>[</span> <span>"</span><span>$#</span><span>"</span> <span>-eq</span> 2 <span>]</span> <span>&&</span> <span>([[</span> <span>"</span><span>$1</span><span>"</span> <span>=</span> <span>"-t"</span> <span>]]</span> <span>||</span> <span>[[</span> <span>"</span><span>$1</span><span>"</span> <span>=</span> <span>"--timeout"</span> <span>]]))</span> <span>;</span> <span>then</span></span>\n<span><a href=\"#cb1-18\"></a> <span>INFOS</span><span>+=</span><span>(</span><span>"</span><span>$DATE</span><span>"</span><span>)</span></span>\n<span><a href=\"#cb1-19\"></a> <span>add_info</span> <span>"workspace"</span></span>\n<span><a href=\"#cb1-20\"></a> <span>add_info</span> <span>"mail"</span></span>\n<span><a href=\"#cb1-21\"></a> <span>add_info</span> <span>"idle"</span></span>\n<span><a href=\"#cb1-22\"></a> <span>add_info</span> <span>"disk"</span></span>\n<span><a href=\"#cb1-23\"></a> <span>add_info</span> <span>"cpu"</span></span>\n<span><a href=\"#cb1-24\"></a> <span>add_info</span> <span>"temperature"</span></span>\n<span><a href=\"#cb1-25\"></a> <span>add_info</span> <span>"load_average"</span></span>\n<span><a href=\"#cb1-26\"></a> <span>add_info</span> <span>"memory"</span></span>\n<span><a href=\"#cb1-27\"></a> <span>add_info</span> <span>"network"</span></span>\n<span><a href=\"#cb1-28\"></a> <span>add_info</span> <span>"backlight"</span></span>\n<span><a href=\"#cb1-29\"></a> <span>add_info</span> <span>"pulse"</span></span>\n<span><a href=\"#cb1-30\"></a> <span>add_info</span> <span>"player"</span></span>\n<span><a href=\"#cb1-31\"></a> <span>add_info</span> <span>"battery"</span></span>\n<span><a href=\"#cb1-32\"></a><span>else</span></span>\n<span><a href=\"#cb1-33\"></a> <span>while</span> <span>((</span> <span>"</span><span>$#</span><span>"</span> <span>));</span> <span>do</span></span>\n<span><a href=\"#cb1-34\"></a> <span>case</span> <span>"</span><span>$1</span><span>"</span> <span>in</span></span>\n<span><a href=\"#cb1-35\"></a> <span>-t</span><span>|</span><span>--timeout</span><span>)</span></span>\n<span><a href=\"#cb1-36\"></a> <span>TIMEOUT</span><span>=</span><span>$2</span></span>\n<span><a href=\"#cb1-37\"></a> <span>shift</span> 2</span>\n<span><a href=\"#cb1-38\"></a> <span>;;</span></span>\n<span><a href=\"#cb1-39\"></a> <span>*</span><span>)</span></span>\n<span><a href=\"#cb1-40\"></a> <span>case</span> <span>"</span><span>$1</span><span>"</span> <span>in</span></span>\n<span><a href=\"#cb1-41\"></a> <span>date</span><span>)</span> <span>INFOS</span><span>+=</span><span>(</span><span>"</span><span>$DATE</span><span>"</span><span>)</span> <span>;;</span></span>\n<span><a href=\"#cb1-42\"></a> <span>workspace</span><span>)</span> <span>add_info</span> <span>"workspace"</span> <span>;;</span></span>\n<span><a href=\"#cb1-43\"></a> <span>mail</span><span>)</span> <span>add_info</span> <span>"mail"</span> <span>;;</span></span>\n<span><a href=\"#cb1-44\"></a> <span>idle</span><span>)</span> <span>add_info</span> <span>"idle"</span> <span>;;</span></span>\n<span><a href=\"#cb1-45\"></a> <span>disk</span><span>)</span> <span>add_info</span> <span>"disk"</span> <span>;;</span></span>\n<span><a href=\"#cb1-46\"></a> <span>cpu</span><span>)</span> <span>add_info</span> <span>"cpu"</span> <span>;;</span></span>\n<span><a href=\"#cb1-47\"></a> <span>temperature</span><span>)</span> <span>add_info</span> <span>"temperature"</span> <span>;;</span></span>\n<span><a href=\"#cb1-48\"></a> <span>load_average</span><span>)</span> <span>add_info</span> <span>"load_average"</span> <span>;;</span></span>\n<span><a href=\"#cb1-49\"></a> <span>memory</span><span>)</span> <span>add_info</span> <span>"memory"</span> <span>;;</span></span>\n<span><a href=\"#cb1-50\"></a> <span>network</span><span>)</span> <span>add_info</span> <span>"network"</span> <span>;;</span></span>\n<span><a href=\"#cb1-51\"></a> <span>backlight</span><span>)</span> <span>add_info</span> <span>"backlight"</span> <span>;;</span></span>\n<span><a href=\"#cb1-52\"></a> <span>pulse</span><span>)</span> <span>add_info</span> <span>"pulse"</span> <span>;;</span></span>\n<span><a href=\"#cb1-53\"></a> <span>player</span><span>)</span> <span>add_info</span> <span>"player"</span> <span>;;</span></span>\n<span><a href=\"#cb1-54\"></a> <span>battery</span><span>)</span> <span>add_info</span> <span>"battery"</span> <span>;;</span></span>\n<span><a href=\"#cb1-55\"></a> <span>*</span><span>)</span> <span>echo</span> <span>"Warning: Unknown argument '</span><span>$1</span><span>'"</span><span>;;</span></span>\n<span><a href=\"#cb1-56\"></a> <span>esac</span></span>\n<span><a href=\"#cb1-57\"></a> <span>shift</span></span>\n<span><a href=\"#cb1-58\"></a> <span>;;</span></span>\n<span><a href=\"#cb1-59\"></a> <span>esac</span></span>\n<span><a href=\"#cb1-60\"></a> <span>done</span></span>\n<span><a href=\"#cb1-61\"></a><span>fi</span></span>\n<span><a href=\"#cb1-62\"></a></span>\n<span><a href=\"#cb1-63\"></a><span>IFS</span><span>=</span><span>$'</span><span>\\n</span><span>'</span><span>;</span> <span>echo</span> <span>"</span><span>${INFOS</span><span>[*]</span><span>}</span><span>"</span></span>\n<span><a href=\"#cb1-64\"></a></span>\n<span><a href=\"#cb1-65\"></a><span>ID_FILE</span><span>=</span><span>"</span><span>${XDG_CACHE_DIR</span><span>:-</span><span>"</span><span>$HOME</span><span>/.cache"</span><span>}</span><span>/st_id"</span></span>\n<span><a href=\"#cb1-66\"></a><span>ID</span><span>=</span><span>"</span><span>$(</span><span>cat</span> <span>$ID_FILE)</span><span>"</span></span>\n<span><a href=\"#cb1-67\"></a><span>REPLACE_ARG</span><span>=</span><span>""</span></span>\n<span><a href=\"#cb1-68\"></a><span>if</span> <span>[</span> <span>!</span> <span>-z</span> <span>$ID</span> <span>]</span><span>;</span> <span>then</span></span>\n<span><a href=\"#cb1-69\"></a> <span>REPLACE</span><span>=</span><span>"-r"</span></span>\n<span><a href=\"#cb1-70\"></a><span>fi</span></span>\n<span><a href=\"#cb1-71\"></a></span>\n<span><a href=\"#cb1-72\"></a><span>dunstify</span> <span>-t</span> <span>$TIMEOUT</span> <span>-u</span> low <span>"Status"</span> <span>-p</span> <span>$REPLACE</span> <span>$ID</span> <span>"</span><span>`</span><span>IFS</span><span>=</span><span>$'</span><span>\\n</span><span>'</span><span>;</span> <span>echo</span> <span>"</span><span>${INFOS</span><span>[*]</span><span>}</span><span>"</span><span>`</span><span>"</span> <span>></span> <span>$ID_FILE</span></span></code></pre></div>\n<p><span>For example, here is a script which shows\nthe pulse audio status,</span></p>\n<div><pre><code><span><a href=\"#cb2-1\"></a><span>#!/usr/bin/env bash</span></span>\n<span><a href=\"#cb2-2\"></a></span>\n<span><a href=\"#cb2-3\"></a><span>sink_ids</span><span>=</span><span>($(</span><span>pactl</span> list short sinks <span>|</span> <span>cut</span> <span>-f</span> 1<span>))</span></span>\n<span><a href=\"#cb2-4\"></a><span>sinks</span><span>=</span><span>($(</span><span>pactl</span> list short sinks <span>|</span> <span>cut</span> <span>-f</span> 2<span>))</span></span>\n<span><a href=\"#cb2-5\"></a></span>\n<span><a href=\"#cb2-6\"></a><span>default_sink</span><span>=</span><span>$(</span><span>pactl</span> info <span>|</span> <span>sed</span> <span>-En</span> <span>'s/Default Sink: (.*)/\\1/p'</span><span>)</span></span>\n<span><a href=\"#cb2-7\"></a><span>default_source</span><span>=</span><span>$(</span><span>pactl</span> info <span>|</span> <span>sed</span> <span>-En</span> <span>'s/Default Source: (.*)/\\1/p'</span><span>)</span></span>\n<span><a href=\"#cb2-8\"></a></span>\n<span><a href=\"#cb2-9\"></a><span>for</span> i <span>in</span> <span>"</span><span>${</span><span>!</span><span>sinks</span><span>[@]</span><span>}</span><span>"</span><span>;</span> <span>do</span></span>\n<span><a href=\"#cb2-10\"></a> <span>if</span> <span>[[</span> <span>"</span><span>${sinks</span><span>[</span><span>$i</span><span>]</span><span>}</span><span>"</span> <span>=</span> <span>"</span><span>${default_sink}</span><span>"</span> <span>]];</span> <span>then</span></span>\n<span><a href=\"#cb2-11\"></a> <span>break</span></span>\n<span><a href=\"#cb2-12\"></a> <span>fi</span></span>\n<span><a href=\"#cb2-13\"></a><span>done</span></span>\n<span><a href=\"#cb2-14\"></a></span>\n<span><a href=\"#cb2-15\"></a><span>deets</span><span>=</span><span>"</span><span>$(</span><span>pactl</span> list sinks <span>|</span> <span>grep</span> <span>-A14</span> <span>"#</span><span>${sink_ids</span><span>[</span><span>$i</span><span>]</span><span>}</span><span>"</span><span>)</span><span>"</span></span>\n<span><a href=\"#cb2-16\"></a><span>vol</span><span>=</span><span>"</span><span>$(</span><span>echo</span> <span>"</span><span>$deets</span><span>"</span> <span>|</span> <span>grep</span> <span>"Volume"</span> <span>|</span> <span>head</span> <span>-1</span> <span>|</span> <span>awk</span> <span>'{print $5}'</span><span>)</span><span>"</span></span>\n<span><a href=\"#cb2-17\"></a><span>mute</span><span>=</span><span>"</span><span>$(</span><span>echo</span> <span>"</span><span>$deets</span><span>"</span> <span>|</span> <span>grep</span> <span>"Mute: yes"</span><span>)</span><span>"</span></span>\n<span><a href=\"#cb2-18\"></a></span>\n<span><a href=\"#cb2-19\"></a><span>if</span> <span>[</span> <span>!</span> <span>-z</span> <span>"</span><span>$mute</span><span>"</span> <span>]</span><span>;</span> <span>then</span></span>\n<span><a href=\"#cb2-20\"></a> <span>label</span><span>=</span><span>""</span></span>\n<span><a href=\"#cb2-21\"></a><span>else</span></span>\n<span><a href=\"#cb2-22\"></a> <span>label</span><span>=</span><span>""</span></span>\n<span><a href=\"#cb2-23\"></a><span>fi</span></span>\n<span><a href=\"#cb2-24\"></a></span>\n<span><a href=\"#cb2-25\"></a><span>mic_mute</span><span>=</span><span>"</span><span>$(</span><span>pactl</span> list sources <span>|</span> <span>grep</span> <span>-A14</span> <span>"</span><span>$default_source</span><span>"</span> <span>|</span> <span>grep</span> <span>"Mute: no"</span><span>)</span><span>"</span></span>\n<span><a href=\"#cb2-26\"></a><span>if</span> <span>[</span> <span>-z</span> <span>"</span><span>$mic_mute</span><span>"</span> <span>]</span><span>;</span> <span>then</span></span>\n<span><a href=\"#cb2-27\"></a> <span>mic</span><span>=</span><span>""</span></span>\n<span><a href=\"#cb2-28\"></a><span>else</span></span>\n<span><a href=\"#cb2-29\"></a> <span>mic</span><span>=</span><span>""</span></span>\n<span><a href=\"#cb2-30\"></a><span>fi</span></span>\n<span><a href=\"#cb2-31\"></a></span>\n<span><a href=\"#cb2-32\"></a><span>echo</span> <span>"</span><span>$label</span><span> </span><span>$vol</span><span> [</span><span>${sink_ids</span><span>[</span><span>$i</span><span>]</span><span>}</span><span>] </span><span>$mic</span><span>"</span></span></code></pre></div>\n<h2>Workspace history</h2>\n<p><span>I’ve got a few bindings and\nscripts to manage workspaces, for example <code>Super-<number></code> will go to that number\nworkspace, <code>Super-m</code> will take me to the\nnext free workspace, <code>Super-t</code> will rename a\nworkspace, <code>Super+\\</code> will search workspaces\nnames, etc.</span></p>\n<p><span>I often use <code>Super+`</code> to switch <code>back_and_forth</code> between workspaces, but sometimes\nI’m working between 3 or more workspaces and I get a bit\nlost.</span></p>\n<p><span>I’m used to <a href=\"vim.html\">vim</a>’s jumplist behaviour so I wrote <a href=\"https://github.com/RyanGibb/i3-workspace-history/\">i3-workspace-history</a>\nto replicate this behaviour in sway/i3. It uses a daemon to listen for\nworkspace changes through sway/i3’s Inter-Process Communication (IPC)\ninterface and keeps track of workspace history, and a client which can\ntravel back and forth through this history.</span></p>\n<p><span>Using it is as simple\nas,</span></p>\n<pre><code>exec i3-workspace-history -sway\n\nbindsym $mod+i exec i3_workspace_history -mode=forward -sway; exec st workspace -t 500\nbindsym $mod+o exec i3_workspace_history -mode=back -sway; exec st workspace -t 500\n</code></pre>\n<h2>Conclusion</h2>\n<p><span>There’s a hundred other tips and tricks\nin my configuration which you can find <a href=\"https://github.com/RyanGibb/nixos/tree/master/home/gui/wm\">here</a>.</span></p>",
8 "content": "<div>\n \n <span>Published 7 Feb 2025.</span>\n \n \n </div>\n \n <div> Tags: <a href=\"/technology.html\" title=\"All pages tagged 'technology'.\">technology</a>. </div>\n \n \n\n <p><span>I use the <a href=\"https://github.com/swaywm/sway\">sway</a> Wayland compositor, which\nis a clone of the X11 <a href=\"https://i3wm.org/\">i3</a> window manager\nfor <a href=\"https://wayland.freedesktop.org/\">Wayland</a>. Wayland is a\ncommunications protocol for next-generation display servers used in\nUnix-like systems which has been adopted as the default display server\nby Linux distributions including Fedora with KDE, and Ubuntu and Debian\nwith GNOME. I use the sway Wayland compositor. It aims to replace the\nvenerable X display server with a modern alternative. X leaves logic\nsuch as window management to application software, which has allowed the\nproliferation of different approaches. Wayland, however, centralises\nthis logic in the ‘compositor’, which assumes both display server and\nwindow manager roles.</span></p>\n<h2>Status</h2>\n<p><span>In lieu of a status bar I invoke a little <a href=\"https://github.com/RyanGibb/nixos/tree/master/home/status/bin/st\">script</a>\nwith <code>Super+Esc</code> which shows various system\ninformation in a notification with the <a href=\"https://github.com/dunst-project/dunst\">dunst</a> notification\ndaemon,</span></p>\n<div><pre><code><span><a href=\"#cb1-1\"></a><span>#!/usr/bin/env bash</span></span>\n<span><a href=\"#cb1-2\"></a></span>\n<span><a href=\"#cb1-3\"></a><span>INFOS</span><span>=</span><span>()</span></span>\n<span><a href=\"#cb1-4\"></a></span>\n<span><a href=\"#cb1-5\"></a><span>DATE</span><span>=</span><span>`</span><span>date</span> <span>"+%a %Y-%m-%d %I:%M:%S%p"</span><span>`</span></span>\n<span><a href=\"#cb1-6\"></a></span>\n<span><a href=\"#cb1-7\"></a><span>add_info()</span> <span>{</span></span>\n<span><a href=\"#cb1-8\"></a> <span>local</span> <span>SCRIPT_NAME</span><span>=</span><span>$1</span></span>\n<span><a href=\"#cb1-9\"></a> <span>local</span> <span>INFO</span><span>=</span><span>"</span><span>`</span><span>$(</span><span>dirname</span> <span>"</span><span>$0</span><span>"</span><span>)</span><span>/../lib/</span><span>${SCRIPT_NAME}</span><span>.sh</span><span>`</span><span>"</span></span>\n<span><a href=\"#cb1-10\"></a> <span>if</span> <span>[</span> <span>"</span><span>$INFO</span><span>"</span> <span>!=</span> <span>""</span> <span>]</span><span>;</span> <span>then</span></span>\n<span><a href=\"#cb1-11\"></a> <span>INFOS</span><span>+=</span><span>(</span><span>"</span><span>$INFO</span><span>"</span><span>)</span></span>\n<span><a href=\"#cb1-12\"></a> <span>fi</span></span>\n<span><a href=\"#cb1-13\"></a><span>}</span></span>\n<span><a href=\"#cb1-14\"></a></span>\n<span><a href=\"#cb1-15\"></a><span>TIMEOUT</span><span>=</span>10000</span>\n<span><a href=\"#cb1-16\"></a></span>\n<span><a href=\"#cb1-17\"></a><span>if</span> <span>[</span> <span>"</span><span>$#</span><span>"</span> <span>-eq</span> 0 <span>]</span> <span>||</span> <span>(</span><span>[</span> <span>"</span><span>$#</span><span>"</span> <span>-eq</span> 2 <span>]</span> <span>&&</span> <span>([[</span> <span>"</span><span>$1</span><span>"</span> <span>=</span> <span>"-t"</span> <span>]]</span> <span>||</span> <span>[[</span> <span>"</span><span>$1</span><span>"</span> <span>=</span> <span>"--timeout"</span> <span>]]))</span> <span>;</span> <span>then</span></span>\n<span><a href=\"#cb1-18\"></a> <span>INFOS</span><span>+=</span><span>(</span><span>"</span><span>$DATE</span><span>"</span><span>)</span></span>\n<span><a href=\"#cb1-19\"></a> <span>add_info</span> <span>"workspace"</span></span>\n<span><a href=\"#cb1-20\"></a> <span>add_info</span> <span>"mail"</span></span>\n<span><a href=\"#cb1-21\"></a> <span>add_info</span> <span>"idle"</span></span>\n<span><a href=\"#cb1-22\"></a> <span>add_info</span> <span>"disk"</span></span>\n<span><a href=\"#cb1-23\"></a> <span>add_info</span> <span>"cpu"</span></span>\n<span><a href=\"#cb1-24\"></a> <span>add_info</span> <span>"temperature"</span></span>\n<span><a href=\"#cb1-25\"></a> <span>add_info</span> <span>"load_average"</span></span>\n<span><a href=\"#cb1-26\"></a> <span>add_info</span> <span>"memory"</span></span>\n<span><a href=\"#cb1-27\"></a> <span>add_info</span> <span>"network"</span></span>\n<span><a href=\"#cb1-28\"></a> <span>add_info</span> <span>"backlight"</span></span>\n<span><a href=\"#cb1-29\"></a> <span>add_info</span> <span>"pulse"</span></span>\n<span><a href=\"#cb1-30\"></a> <span>add_info</span> <span>"player"</span></span>\n<span><a href=\"#cb1-31\"></a> <span>add_info</span> <span>"battery"</span></span>\n<span><a href=\"#cb1-32\"></a><span>else</span></span>\n<span><a href=\"#cb1-33\"></a> <span>while</span> <span>((</span> <span>"</span><span>$#</span><span>"</span> <span>));</span> <span>do</span></span>\n<span><a href=\"#cb1-34\"></a> <span>case</span> <span>"</span><span>$1</span><span>"</span> <span>in</span></span>\n<span><a href=\"#cb1-35\"></a> <span>-t</span><span>|</span><span>--timeout</span><span>)</span></span>\n<span><a href=\"#cb1-36\"></a> <span>TIMEOUT</span><span>=</span><span>$2</span></span>\n<span><a href=\"#cb1-37\"></a> <span>shift</span> 2</span>\n<span><a href=\"#cb1-38\"></a> <span>;;</span></span>\n<span><a href=\"#cb1-39\"></a> <span>*</span><span>)</span></span>\n<span><a href=\"#cb1-40\"></a> <span>case</span> <span>"</span><span>$1</span><span>"</span> <span>in</span></span>\n<span><a href=\"#cb1-41\"></a> <span>date</span><span>)</span> <span>INFOS</span><span>+=</span><span>(</span><span>"</span><span>$DATE</span><span>"</span><span>)</span> <span>;;</span></span>\n<span><a href=\"#cb1-42\"></a> <span>workspace</span><span>)</span> <span>add_info</span> <span>"workspace"</span> <span>;;</span></span>\n<span><a href=\"#cb1-43\"></a> <span>mail</span><span>)</span> <span>add_info</span> <span>"mail"</span> <span>;;</span></span>\n<span><a href=\"#cb1-44\"></a> <span>idle</span><span>)</span> <span>add_info</span> <span>"idle"</span> <span>;;</span></span>\n<span><a href=\"#cb1-45\"></a> <span>disk</span><span>)</span> <span>add_info</span> <span>"disk"</span> <span>;;</span></span>\n<span><a href=\"#cb1-46\"></a> <span>cpu</span><span>)</span> <span>add_info</span> <span>"cpu"</span> <span>;;</span></span>\n<span><a href=\"#cb1-47\"></a> <span>temperature</span><span>)</span> <span>add_info</span> <span>"temperature"</span> <span>;;</span></span>\n<span><a href=\"#cb1-48\"></a> <span>load_average</span><span>)</span> <span>add_info</span> <span>"load_average"</span> <span>;;</span></span>\n<span><a href=\"#cb1-49\"></a> <span>memory</span><span>)</span> <span>add_info</span> <span>"memory"</span> <span>;;</span></span>\n<span><a href=\"#cb1-50\"></a> <span>network</span><span>)</span> <span>add_info</span> <span>"network"</span> <span>;;</span></span>\n<span><a href=\"#cb1-51\"></a> <span>backlight</span><span>)</span> <span>add_info</span> <span>"backlight"</span> <span>;;</span></span>\n<span><a href=\"#cb1-52\"></a> <span>pulse</span><span>)</span> <span>add_info</span> <span>"pulse"</span> <span>;;</span></span>\n<span><a href=\"#cb1-53\"></a> <span>player</span><span>)</span> <span>add_info</span> <span>"player"</span> <span>;;</span></span>\n<span><a href=\"#cb1-54\"></a> <span>battery</span><span>)</span> <span>add_info</span> <span>"battery"</span> <span>;;</span></span>\n<span><a href=\"#cb1-55\"></a> <span>*</span><span>)</span> <span>echo</span> <span>"Warning: Unknown argument '</span><span>$1</span><span>'"</span><span>;;</span></span>\n<span><a href=\"#cb1-56\"></a> <span>esac</span></span>\n<span><a href=\"#cb1-57\"></a> <span>shift</span></span>\n<span><a href=\"#cb1-58\"></a> <span>;;</span></span>\n<span><a href=\"#cb1-59\"></a> <span>esac</span></span>\n<span><a href=\"#cb1-60\"></a> <span>done</span></span>\n<span><a href=\"#cb1-61\"></a><span>fi</span></span>\n<span><a href=\"#cb1-62\"></a></span>\n<span><a href=\"#cb1-63\"></a><span>IFS</span><span>=</span><span>$'</span><span>\\n</span><span>'</span><span>;</span> <span>echo</span> <span>"</span><span>${INFOS</span><span>[*]</span><span>}</span><span>"</span></span>\n<span><a href=\"#cb1-64\"></a></span>\n<span><a href=\"#cb1-65\"></a><span>ID_FILE</span><span>=</span><span>"</span><span>${XDG_CACHE_DIR</span><span>:-</span><span>"</span><span>$HOME</span><span>/.cache"</span><span>}</span><span>/st_id"</span></span>\n<span><a href=\"#cb1-66\"></a><span>ID</span><span>=</span><span>"</span><span>$(</span><span>cat</span> <span>$ID_FILE)</span><span>"</span></span>\n<span><a href=\"#cb1-67\"></a><span>REPLACE_ARG</span><span>=</span><span>""</span></span>\n<span><a href=\"#cb1-68\"></a><span>if</span> <span>[</span> <span>!</span> <span>-z</span> <span>$ID</span> <span>]</span><span>;</span> <span>then</span></span>\n<span><a href=\"#cb1-69\"></a> <span>REPLACE</span><span>=</span><span>"-r"</span></span>\n<span><a href=\"#cb1-70\"></a><span>fi</span></span>\n<span><a href=\"#cb1-71\"></a></span>\n<span><a href=\"#cb1-72\"></a><span>dunstify</span> <span>-t</span> <span>$TIMEOUT</span> <span>-u</span> low <span>"Status"</span> <span>-p</span> <span>$REPLACE</span> <span>$ID</span> <span>"</span><span>`</span><span>IFS</span><span>=</span><span>$'</span><span>\\n</span><span>'</span><span>;</span> <span>echo</span> <span>"</span><span>${INFOS</span><span>[*]</span><span>}</span><span>"</span><span>`</span><span>"</span> <span>></span> <span>$ID_FILE</span></span></code></pre></div>\n<p><span>For example, here is a script which shows\nthe pulse audio status,</span></p>\n<div><pre><code><span><a href=\"#cb2-1\"></a><span>#!/usr/bin/env bash</span></span>\n<span><a href=\"#cb2-2\"></a></span>\n<span><a href=\"#cb2-3\"></a><span>sink_ids</span><span>=</span><span>($(</span><span>pactl</span> list short sinks <span>|</span> <span>cut</span> <span>-f</span> 1<span>))</span></span>\n<span><a href=\"#cb2-4\"></a><span>sinks</span><span>=</span><span>($(</span><span>pactl</span> list short sinks <span>|</span> <span>cut</span> <span>-f</span> 2<span>))</span></span>\n<span><a href=\"#cb2-5\"></a></span>\n<span><a href=\"#cb2-6\"></a><span>default_sink</span><span>=</span><span>$(</span><span>pactl</span> info <span>|</span> <span>sed</span> <span>-En</span> <span>'s/Default Sink: (.*)/\\1/p'</span><span>)</span></span>\n<span><a href=\"#cb2-7\"></a><span>default_source</span><span>=</span><span>$(</span><span>pactl</span> info <span>|</span> <span>sed</span> <span>-En</span> <span>'s/Default Source: (.*)/\\1/p'</span><span>)</span></span>\n<span><a href=\"#cb2-8\"></a></span>\n<span><a href=\"#cb2-9\"></a><span>for</span> i <span>in</span> <span>"</span><span>${</span><span>!</span><span>sinks</span><span>[@]</span><span>}</span><span>"</span><span>;</span> <span>do</span></span>\n<span><a href=\"#cb2-10\"></a> <span>if</span> <span>[[</span> <span>"</span><span>${sinks</span><span>[</span><span>$i</span><span>]</span><span>}</span><span>"</span> <span>=</span> <span>"</span><span>${default_sink}</span><span>"</span> <span>]];</span> <span>then</span></span>\n<span><a href=\"#cb2-11\"></a> <span>break</span></span>\n<span><a href=\"#cb2-12\"></a> <span>fi</span></span>\n<span><a href=\"#cb2-13\"></a><span>done</span></span>\n<span><a href=\"#cb2-14\"></a></span>\n<span><a href=\"#cb2-15\"></a><span>deets</span><span>=</span><span>"</span><span>$(</span><span>pactl</span> list sinks <span>|</span> <span>grep</span> <span>-A14</span> <span>"#</span><span>${sink_ids</span><span>[</span><span>$i</span><span>]</span><span>}</span><span>"</span><span>)</span><span>"</span></span>\n<span><a href=\"#cb2-16\"></a><span>vol</span><span>=</span><span>"</span><span>$(</span><span>echo</span> <span>"</span><span>$deets</span><span>"</span> <span>|</span> <span>grep</span> <span>"Volume"</span> <span>|</span> <span>head</span> <span>-1</span> <span>|</span> <span>awk</span> <span>'{print $5}'</span><span>)</span><span>"</span></span>\n<span><a href=\"#cb2-17\"></a><span>mute</span><span>=</span><span>"</span><span>$(</span><span>echo</span> <span>"</span><span>$deets</span><span>"</span> <span>|</span> <span>grep</span> <span>"Mute: yes"</span><span>)</span><span>"</span></span>\n<span><a href=\"#cb2-18\"></a></span>\n<span><a href=\"#cb2-19\"></a><span>if</span> <span>[</span> <span>!</span> <span>-z</span> <span>"</span><span>$mute</span><span>"</span> <span>]</span><span>;</span> <span>then</span></span>\n<span><a href=\"#cb2-20\"></a> <span>label</span><span>=</span><span>""</span></span>\n<span><a href=\"#cb2-21\"></a><span>else</span></span>\n<span><a href=\"#cb2-22\"></a> <span>label</span><span>=</span><span>""</span></span>\n<span><a href=\"#cb2-23\"></a><span>fi</span></span>\n<span><a href=\"#cb2-24\"></a></span>\n<span><a href=\"#cb2-25\"></a><span>mic_mute</span><span>=</span><span>"</span><span>$(</span><span>pactl</span> list sources <span>|</span> <span>grep</span> <span>-A14</span> <span>"</span><span>$default_source</span><span>"</span> <span>|</span> <span>grep</span> <span>"Mute: no"</span><span>)</span><span>"</span></span>\n<span><a href=\"#cb2-26\"></a><span>if</span> <span>[</span> <span>-z</span> <span>"</span><span>$mic_mute</span><span>"</span> <span>]</span><span>;</span> <span>then</span></span>\n<span><a href=\"#cb2-27\"></a> <span>mic</span><span>=</span><span>""</span></span>\n<span><a href=\"#cb2-28\"></a><span>else</span></span>\n<span><a href=\"#cb2-29\"></a> <span>mic</span><span>=</span><span>""</span></span>\n<span><a href=\"#cb2-30\"></a><span>fi</span></span>\n<span><a href=\"#cb2-31\"></a></span>\n<span><a href=\"#cb2-32\"></a><span>echo</span> <span>"</span><span>$label</span><span> </span><span>$vol</span><span> [</span><span>${sink_ids</span><span>[</span><span>$i</span><span>]</span><span>}</span><span>] </span><span>$mic</span><span>"</span></span></code></pre></div>\n<h2>Workspace history</h2>\n<p><span>I’ve got a few bindings and\nscripts to manage workspaces, for example <code>Super-<number></code> will go to that number\nworkspace, <code>Super-m</code> will take me to the\nnext free workspace, <code>Super-t</code> will rename a\nworkspace, <code>Super+\\</code> will search workspaces\nnames, etc.</span></p>\n<p><span>I often use <code>Super+`</code> to switch <code>back_and_forth</code> between workspaces, but sometimes\nI’m working between 3 or more workspaces and I get a bit\nlost.</span></p>\n<p><span>I’m used to <a href=\"vim.html\">vim</a>’s jumplist behaviour so I wrote <a href=\"https://github.com/RyanGibb/i3-workspace-history/\">i3-workspace-history</a>\nto replicate this behaviour in sway/i3. It uses a daemon to listen for\nworkspace changes through sway/i3’s Inter-Process Communication (IPC)\ninterface and keeps track of workspace history, and a client which can\ntravel back and forth through this history.</span></p>\n<p><span>Using it is as simple\nas,</span></p>\n<pre><code>exec i3-workspace-history -sway\n\nbindsym $mod+i exec i3_workspace_history -mode=forward -sway; exec st workspace -t 500\nbindsym $mod+o exec i3_workspace_history -mode=back -sway; exec st workspace -t 500\n</code></pre>\n<h2>Conclusion</h2>\n<p><span>There’s a hundred other tips and tricks\nin my configuration which you can find <a href=\"https://github.com/RyanGibb/nixos/tree/master/home/gui/wm\">here</a>.</span></p>",
9 "content_type": "html",
10 "categories": [],
11 "source": "https://ryan.freumh.org/atom.xml"
12}