From UBC Wiki

XMonad MultiTasking Utilities

Authors: Andrew Adair Comminos, Lorien Hu, Shakthi Wijeratne

What is the problem?

XMonad, a framework for building a tiling window manager in Haskell, lacks various multitasking primitives we would like to see in a window manager. The three of us are currently all using XMonad as our window managers, so this project would be of direct benefit to us.

Namely, we want to explore alternative ways to gather and organize windows in a useful manner and investigate alternative workflow paradigms.

Workspace forking

We want to add support for the creation of temporary workspaces originating from a window so that users can view windows in existing workspaces in a temporary new arrangement.

Window attenuation

We want to allow the user to mark a window as a 'focus' window, discouraging the user from straying away from it / getting distracted.


Possibly other useful multi-tasking aides.

What is the something extra?

We hope to build on the groundwork established by the XMonad project, using the power and safety of Haskell to permit an improved user experience.

What did we learn from doing this?

We implemented two new features to use in XMonad. We modified our main feature so that instead of creating a new workspace, we can 'yank' a window from another workspace without switching to it by selecting a window from a list with dmenu. This window can then be conveniently 'deyanked' and returned to its origin.

Our second feature was the focus-keeper extension, which allows you to mark a window as a focused window. Whenever the user dares an attempt at procrastination, xmonad-mtu helpfully corrects this mistake by teleporting the cursor back to the focused window.

Our initial thoughts were that we didn't really know why XMonad was written in Haskell. A window manager needs to be stateful, which seemed to be against the principles of functional programming. We found it very awkward to store information when we were trying to implement saving the last switched window and the focused window. However, as we learned about monads, we now understand that there are benefits to improving code-safety even if not all side-effects can be eliminated. Haskell and the IO monad are useful as they minimize the scope of state-modification.

On a side note, we discovered that remote collaboration with VNC and screen sessions over ssh was a significant improvement over screensharing or clunky online editors. Two of us were also introduced to the beautiful program xeyes.