Displaying a window on more than one workspace is usually called making it sticky. There was talk of supporting sticky windows in XMonad, and it seems to have been implemented but with limitations.
If you want to display a particular window on a particular set of workspaces, this seems to be possible with an extension: Actions.CopyWindow
.
If you're looking for alternatives to XMonad, one (relatively) popular tiling window manager is Awesome. Where XMonad is written and extended in Haskell, Awesome is tied to Lua. Awesome supports
sticky windows through awful.client.sticky
(at least in Awesome 3.4.6 under Debian squeeze; the online documentation looks incomplete). Awesome also supports organizing windows with tags, and a window can be in more than one tag as a matter of course.
Another alternative is Sawfish. It's written and extended in Scheme. Sawfish isn't a tiling window manager, but it's highly configurable, so you could probably build one¹ (I don't know if it's been done). It definitely supports displaying a window on an arbitrary set of workspaces.
¹
In the same way Emacs can emulate vi.
Two months later I figured it out. The problem is that statusBar
does not register the events of Hooks.manageDocks
properly. Once xmonad
is running all works well because manageDocks
is able to update the Struts
on every window event. But in the moment that xmonad
is starting the event of making the first windows fullscreen happens before the events from manageDocks
. This mages that first open window to ignore the existence of xmobar
.
manageDocks
has its event handler that must be set as the last event handler, therefore statusBar
cannot be used. Instead, it is necessary to make xmonad
call and configure xmobar
manually through dynamicLog
, manageHook
, layoutHook
and handleEventHook
. A minimalistic configuration for this would be:
main = do
xmproc <- spawnPipe "xmobar"
xmonad $ defaultConfig
{ modMask = mod4Mask
, manageHook = manageDocks <+> manageHook defaultConfig
, layoutHook = avoidStruts $ layoutHook defaultConfig
-- this must be in this order, docksEventHook must be last
, handleEventHook = handleEventHook defaultConfig <+> docksEventHook
, logHook = dynamicLogWithPP xmobarPP
{ ppOutput = hPutStrLn xmproc
, ppTitle = xmobarColor "darkgreen" "" . shorten 20
, ppHiddenNoWindows = xmobarColor "grey" ""
}
, startupHook = setWMName "LG3D"
} `additionalKeys`
[ ((mod4Mask, xK_b), sendMessage ToggleStruts) ]
This makes all events to be processed by docsEventHook
and ensures that layout changes made by docsEventHook
are the last ones applied. Now
lowerOnStart = False
(or True
) works as expected in all cases within xmobarrc
.
Best Answer
Extremely late answer, but perhaps still helpful to somebody:
The functions that you need are:
windows $ W.swapMaster . W.focusDown
, where:swapMaster
andfocusDown
are imported fromXMonad.StackSet
:A minimal
xmonad.hs
:Here, the keybinding is
Mod-a
.