2022-11-04 00:42:05 +01:00
|
|
|
---
|
|
|
|
title: "On window managers and XMonad"
|
|
|
|
date: "2022-11-03T23:17:35+01:00"
|
|
|
|
author: "$HUMANOID"
|
2022-11-04 17:57:23 +01:00
|
|
|
tags: ["linux", "window managers", "xmonad"]
|
2022-11-04 19:31:59 +01:00
|
|
|
description: "A ramble about, among other things, a highly configurable window manager"
|
2022-11-04 00:42:05 +01:00
|
|
|
---
|
|
|
|
|
|
|
|
# My journey into Tiling Window Managers
|
|
|
|
|
2022-11-04 19:31:59 +01:00
|
|
|
When I started my Linux journey, I stuck with GNOME 3 something for around the
|
2022-11-04 00:42:05 +01:00
|
|
|
first year. Sure, I tried KDE and Cinnamon and XFCE, but GNOME is the one I
|
|
|
|
always kept coming back to. I think it's because it's pretty much the only one
|
|
|
|
that felt completely different from what the rest of the world was doing. It
|
|
|
|
helped me with thinking about Linux as being different from windows. After this
|
2022-11-04 19:31:59 +01:00
|
|
|
first year though, I came across a few videos about tiling window managers and
|
2022-11-04 00:42:05 +01:00
|
|
|
wanted to try one. The first one I installed was i3.
|
|
|
|
|
|
|
|
I hated it.
|
|
|
|
|
|
|
|
I had a hard time configuring it as I didn't really know what I was doing. Other
|
|
|
|
than that, I found it plain awkward to use. The way it tiles windows -- and how
|
|
|
|
you _still_ have to babysit pretty much every last one of them -- drives me away
|
|
|
|
from i3 to this day. I'm sure it has the potential to be a great window manager.
|
|
|
|
It's just _really_ not for me. Which is a shame, I would really like to properly
|
|
|
|
live in Wayland with Sway for at least a little while.
|
|
|
|
|
|
|
|
After a few hours of trying to get things to work in i3, I went back to GNOME.
|
|
|
|
Some time later, I came across AwesomeWM. It was being recommended as a fairly
|
2022-11-04 19:31:59 +01:00
|
|
|
easy window manager to start with -- it having window decorations and it's own
|
|
|
|
menu system. The first thing I did was try-and fail to rip out said menu system
|
|
|
|
and window decorations. I was putting too much on myself trying to learn the
|
|
|
|
basics of both using a tiling window manager and Lua.
|
2022-11-04 00:42:05 +01:00
|
|
|
|
|
|
|
Some time after that, I came across BSPWM. This was the first time where I felt
|
|
|
|
like I _really_ managed to get a tiling window manger to do what I wanted it to
|
|
|
|
do. For some odd reason, there are people out there who consider BSPWM a more
|
|
|
|
"advanced" window manger. I really don't get why. To this day, I am of the
|
|
|
|
opinion that SXHKD's configuration syntax is some of the best out there. I think
|
|
|
|
it took me around 10 minutes to wrap my head around the basics. Somewhere around
|
2022-11-04 19:31:59 +01:00
|
|
|
an afternoon later, I had a config that served me well for the next few months
|
2022-11-04 00:42:05 +01:00
|
|
|
to come.
|
|
|
|
|
|
|
|
A while after BSPWM, I decided to give suckless' DWM a shot. Despite my lack of
|
|
|
|
knowledge of C, this very quickly became my favorite window manager at the time.
|
|
|
|
There is just something about the insanity of using diff files to configure your
|
|
|
|
piece of software when perfectly functional configuration libraries and
|
|
|
|
languages exist that got it's hooks in me. I also caught the minimalism bug
|
|
|
|
around this time, so DWM's nearly non-existent memory footprint was also great.
|
|
|
|
Despite this really being the first really "advanced" window manager, I had an
|
|
|
|
easier time configuring it than AwesomeWM or i3. It was also the first time
|
|
|
|
where I could appreciate the master-stack layout properly and not having to
|
2022-11-04 19:31:59 +01:00
|
|
|
think about keeping track of windows in two dimensions anymore. It made me
|
2022-11-04 00:42:05 +01:00
|
|
|
realise that I want to have to think as little as possible about window
|
|
|
|
positioning. It was the reason I couldn't deal with i3's paradigm and shifted
|
|
|
|
away from BSPWM the moment I found DWM.
|
|
|
|
|
|
|
|
I ran DWM as my main window manger for over a year before having issues with
|
|
|
|
some fullscreen applications and the JetBrains suite, which I had to use for
|
|
|
|
college activities.
|
|
|
|
|
|
|
|
{{< img class="stickers" link="https://xkcd.com/1806/" src="/images/xkcd/borrow_your_laptop.png" >}}
|
|
|
|
|
|
|
|
I decided to give AwesomeWM another shot after having figured out what I want
|
|
|
|
from a tiling window manger. This time I managed to get something that worked
|
|
|
|
pretty much exactly how I wanted it to. In other words, a fairly basic
|
|
|
|
configuration with most of the default features ripped out and instead my
|
|
|
|
partially-organically-grown-probably-batshit-insane-keybindings (I use `Super` +
|
|
|
|
`Space` to open my run launcher. In fact, on my keyboard I have holding the big
|
2022-11-04 17:57:23 +01:00
|
|
|
space bar (yes it has two space bars, its layout is about as insane as my
|
|
|
|
window management keybindings) bound to `Super` + `Space`).
|
2022-11-04 00:42:05 +01:00
|
|
|
|
|
|
|
To this day I still use DWM quite frequently on machines where I don't really
|
|
|
|
want to think about what graphical interface to chuck on it (hence I half
|
|
|
|
arsedly maintain an Alpine package of my fork).
|
|
|
|
|
|
|
|
For quite a long time I used DWM and AwesomeWM depending on whether I was
|
|
|
|
planning on frequently using fullscreen applications and how strong the machine
|
|
|
|
in question was; AwesomeWM being noticeably slower than DWM on _really_ old
|
|
|
|
machines (like RejuvinatedBrick). Until at some point, I came across XMonad.
|
|
|
|
|
2022-11-04 17:57:23 +01:00
|
|
|
I tried it for an evening.
|
2022-11-04 00:42:05 +01:00
|
|
|
|
2022-11-04 17:57:23 +01:00
|
|
|
I hated the fact that it's configured in _sodding Haskell_ and went back to DWM.
|
2022-11-04 00:42:05 +01:00
|
|
|
|
2022-11-04 17:57:23 +01:00
|
|
|
A few months later, I came across an implementation of chorded keys through
|
2022-11-04 00:42:05 +01:00
|
|
|
the `XMonad.Util.EZConfig` module and decided to give it another shot.
|
|
|
|
|
|
|
|
This time I was hooked.
|
|
|
|
|
2022-11-04 17:57:23 +01:00
|
|
|
The biggest problem I had with it was _still_ the fact that it was configured
|
|
|
|
in Haskell, but the absurd level of customisability made it worth dealing with
|
|
|
|
the functional pain. It was also the first time I decided to not bother with a
|
2022-11-04 00:42:05 +01:00
|
|
|
status bar as getting a basic configuration going had given me enough grief for
|
2022-11-04 17:57:23 +01:00
|
|
|
one month.
|
|
|
|
|
|
|
|
As for gripes I had (and partially still have) with XMonad, they were quite few,
|
|
|
|
surprisingly. Coming from AwesomeWM and DWM, I would've liked XMonad to use tags
|
|
|
|
instead of workspaces; fullscreen is a bit of a pain to get working, but has
|
|
|
|
less fuckups than DWM; the fact that it's configured in Haskell; it not having a
|
|
|
|
set of workspaces per monitor (at least by default, I kind of stopped caring
|
|
|
|
after a little while); the fact that it's configured in Haskell; the
|
|
|
|
`XMonad.Layout.ShowWName` module being kind of unstable and last but not least,
|
|
|
|
the fact that it's configured in _fucking Haskell_.
|
|
|
|
|
|
|
|
It almost seems like I got sick of being sick of it being configured in Haskell
|
|
|
|
and I decided to dive into learning the language with the goal of being able to
|
2022-11-04 19:31:59 +01:00
|
|
|
fully understand my monstrous 384 line config file (586 lines including the
|
|
|
|
documentation in commented sections).
|
2022-11-04 17:57:23 +01:00
|
|
|
|
|
|
|
{{< img class="stickers" src="/images/config_length.png" >}}
|
|
|
|
|
2022-11-04 18:08:10 +01:00
|
|
|
I don't fully understand it yet at the time of writing, but I do understand it
|
|
|
|
a hell of a lot better than when I produced most of those 300 lines.
|
2022-11-04 17:57:23 +01:00
|
|
|
|
|
|
|
The greatest thing about XMonad is simultaneously the thing that kept me away
|
|
|
|
from it: it's written and configured in bloody Haskell. Thus there is barely a
|
2022-11-04 19:31:59 +01:00
|
|
|
separation between configuration and source code. The only difference there
|
|
|
|
_really_ is, is the filename. Once you understand a bit of Haskell (no small
|
|
|
|
task if you're used to imperative languages) adding and integrating your own
|
|
|
|
features is really easy. And then they are _properly_ integrated. Sort of like
|
|
|
|
how DWM works, only with proper documentation and support. Part of me wants to
|
|
|
|
see if I can figure out a way to package my XMonad build as a single binary to
|
|
|
|
be able to chuck it onto systems without putting much thought into it.
|
2022-11-04 17:57:23 +01:00
|
|
|
|
|
|
|
Weird thing with Haskell I'm noticing so far is that I'm slowly but surely
|
|
|
|
managing to dig up old concepts that I tried to implement in imperative
|
|
|
|
languages, but couldn't due to their nature. Things like pattern matching and
|
2022-11-04 18:08:10 +01:00
|
|
|
maps are quite intuitive to me. It's just that Haskell's syntax takes a _lot_ of
|
|
|
|
getting used to. In the mean time, I guess that my experience with POSIX Shell
|
|
|
|
bridged the gap between my knowledge of Go and C#; and Haskell.
|
2022-11-04 17:57:23 +01:00
|
|
|
|
2022-11-04 18:08:10 +01:00
|
|
|
I highly recommend giving XMonad a shot if you're willing to bash your head
|
|
|
|
against the Haskell wall for a while before understanding how your window
|
|
|
|
manager works.
|
2022-11-04 17:57:23 +01:00
|
|
|
|
|
|
|
Looking back I find it quite funny to see how I went from not being able to get
|
|
|
|
i3 to do what I wanted it too and giving up; to barely being able to write or
|
|
|
|
understand Haskell but putting up with it.
|