a working i3 setup for WSL

i3wm: my personal DOOM

as a corollary to the popular "does it run DOOM?" challenge, i like to do sonmething similar with a particular program, the i3 window manager. of course, over time you do begin to get tired of the somewhat rigorous process to build and install i3 and the necessary libraries and dependencies, so naturally i started to think about automating this process.

on face this might seem odd: i3 is avaliable in almost every major linux distro's main app packaging system. what gives?

quick setup

copying this script into a file and giving it permissions with chmod +x foo.sh will perform an automated installation of a wsl-compatible i3 fork, along with the picom compositor.


# ubuntu install for i3
echo "alright, let's do this!"
sleep 1s
echo "grabbing the Airblader fork of i3, commit @fdf5d3a..."
mkdir -p $HOME/gits && cd $HOME/gits
git clone https://github.com/Airblader/i3 $HOME/gits/i3-gaps
echo "grabbing the files needed to compile library xcb-util-xrm..."
sleep 1s
git clone https://github.com/Airblader/xcb-util-xrm $HOME/gits/xcb-util-xrm
echo "setting commit..."
cd $HOME/gits/;i3-gaps && git checkout fdf5d3a
sleep 1s
echo "let's grab some deps, brah."
sleep 1s
# deps
# ----
sudo apt install -y libxcb1-dev libxcb-keysyms1-dev libpango1.0-dev libxcb-util0-dev libxcb-icccm4-dev libyajl-dev libstartup-notification0-dev libxcb-randr0-dev libev-dev libxcb-cursor-dev libxcb-xinerama0-dev libxcb-xkb-dev libxkbcommon-dev libxkbcommon-x11-dev autoconf xutils-dev libtool
echo "boutique dep creation..."
sleep 1s
cd $HOME/gits/xcb-util-xrm && git submodule update --init
$HOME/gits/xcb-util-xrm/autogen.sh --prefix=/usr
echo "alright let's make this bitch"
sleep 1
make -j8
echo "wasnt that fun? now shove all that down your pc's gaping software hole"
sleep 1s
sudo make install
echo "now let's run the drill again, with gapped i3"
sleep 1s
cd $HOME/gits/i3-gaps && autoreconf --force --install
rm -rf $HOME/gits/i3-gaps/build && mkdir $HOME/gits/i3-gaps/build
cd $HOME/gits/i3-gaps/build && $HOME/gits/i3-gaps/configure --prefix=/usr --sysconfdir=/etc --disable-sanitizers
sudo make install
echo "and there you have it. before launching i3, make sure to run X410 or VcXsrv.exe on the windows side."

# manual compile for a needed dep
# ------------------------------
# mkdir tmp
# cd /tmp
# git clone https://github.com/Airblader/xcb-util-xrm
# cd xcb-util-xrm
# git submodule update --init
# ./autogen.sh --prefix=/usr
# make
# sudo make install

# i3 build
# --------
# i3-gaps-rounded:
# git clone https://github.com/resloved/i3
# i3-gaps:
# git clone https://www.github.com/Airblader/i3 i3-gaps
# cd i3-gaps
# git checkout gaps && git pull
# autoreconf --force --install
# rm -rf build
# mkdir build
# cd build
# ../configure --prefix=/usr --sysconfdir=/etc --disable-sanitizers
# make
# sudo make install

# extras
# ------
# sudo apt-get install wget ranger mediainfo highlight tmux calcurse  newsbeuter moc qutebrowser imagemagick transmission-cli atool xcompmgr blender pinta gimp  markdown mupdf evince audacity vim-latexsuite rsync syncthing cups screenfetch scrot unzip unrar biber ntfs-3g deepin-terminal zip irssi unzip

you will need to setup for windows-side X server, which is outside the scope of this post, but there are plenty of simple guides to get you going. in your shell rc file, you will want to define relevant variables like DISPLAY. i use this nifty piece of code so i can use my universal shell rc file without having to tweak it manually when i use it with WSL:

if [[ "$(</proc/version)" == *Microsoft* ]] 2>/dev/null; then
  export WSL=1
  export DISPLAY=localhost:0
  export NO_AT_BRIDGE=1


with a minimal amount of tweaking, this script can serve as the basis for a far more universal way to setup your preferred fork of i3. i will be coming back to this post at some point to add a list of popular forks and list the standout features and possible pros/cons depending on usecase.

the fastest way to use it just about everywhere except WSL, simply removing the specific commit hash from the git clone command will leave you with a current codebase to build from.

perhaps you're reading this as a relative newcomer to the linux world, looking to jazz up your WSL install. if so, i can guarantee that this script would be a nice piece of code to poke through, because i myself am at best on the lower-end of intermediate-level when it comes to the keyboard-mashing and coding. this means the commands are basically the same basic commands that are important ones to learn when first starting out - i have simply chained them together in more complex ways, and reading through should help you in the quest to understand the ins and outs of shellscripting, as well as the general rhythm and rhyme of programming languages of all varieties.