[xmonad] Stash and replace for workspace?

Norbert Zeh nzeh at cs.dal.ca
Thu Jun 25 13:59:16 EDT 2009

On Thu, Jun 25, 2009 at 01:52:19PM -0400, wagnerdm at seas.upenn.edu wrote:
> Quoting Norbert Zeh <nzeh at cs.dal.ca>:
>> assume that I am currently looking at workspace A on the primary screen,
>> while the secondary screen shows workspace B.  Next I need to do some
>> work on workspace C, but I would like to keep what I did on WS A
>> visible.  So I'd like to create a keybinding that shunts A off to my
>> secondary screen (replacing B) and brings up C on my primary screen
>> (replacing A).
>> Now here's the question:  Is there a simple and elegant way to do this
>> with the functions available in XMonadContrib?  If not, am I right in
>> assuming that I have to do some stackset surgery to achieve this?  Any
>> pointers are appreciated.
> I'm not sure if there's anything already in XMonadContrib, but it should 
> be totally easy to write on your own.  We have
> windows :: (WindowSet -> WindowSet) -> X ()
> type WindowSet = StackSet WorkspaceId (Layout Window) Window ScreenId  
> ScreenDetail
> data StackSet i l a sid sd = StackSet {
>   current :: Screen i l a sid sd,
>   visible :: [Screen i l a sid sd],
>   ...}
> So, we could maybe define a cycleScreens function:
> cycleScreens :: WindowSet -> WindowSet
> cycleScreens ss@(StackSet { current = c, visible = vs }) = let (c':vs') = 
> vs ++ [c] in ss { current = c', visible = vs' }
> Then the keybindings you're asking for would something like
> [((modMask conf, key), windows (greedyView name . cycleScreens)) | (key, 
> name) <- zip [xK_1 .. xK_9] (workspaces conf)]
> Note: this is all extemporaneous, not tested or even type-checked, so  
> use at your own risk!

Thanks.  In the meantime I couldn't resist hacking and came up with the
same solution ;)  The only thing I noticed is that swapping the screens
as above (which is what I also did first) also moves the focus between
screens.  The trick to get the behaviour I want is to swap the workspace
inside (current ss) and (head . visible $ ss), as this does not touch
the screens, only the associated workspaces.

In any case, thanks a lot for answering.  If it's not there already, do
we think this is something worthwhile to put into XMonadContrib?


"And it happened all the time that the compromise between two perfectly
rational alternatives was something that made no sense at all."
  -- Neal Stephenson, Anathem

More information about the xmonad mailing list