[xmonad] list of visible workspaces

Bryan Huh bhh1988 at gmail.com
Thu Aug 2 19:19:43 CEST 2012

What I'm trying to do is prevent my focus from switching to a different 
screen if I mistakenly try to switch to an already visible workspace. I 
already am not using greedyView so I don't have the problem of the 
visible workspaces swapping on me. But suppose I have two screens and 
workspace 1 is on the left, workspace 2 is on the right. If I'm focused 
on the left screen, and I were to press mod-2, the focus switches to the 
screen on the right. If I now press mod-3 it will be the right screen 
which switches to workspace 3. This annoys me, because it effectively 
prevents me from cycling through workspaces on one screen. Greedyview I 
think would not have this issue, but the screen swapping confuses me. 
What I want is, when I'm on the left screen and I press mod-2, which is 
an already visible workspace, nothing should happen. No swapping of 
screens, and no moving of focus.

The part of my config I'm trying to modify to achieve this is the last 
line below (the commented line).

myKeys conf@(XConfig {XMonad.modMask = modm}) = M.fromList $
    ... (some key mappings)
    [((m .|. modm, k), windows $ f i)
         | (i, k) <- zip (XMonad.workspaces conf) [xK_1 .. xK_9]
         , (f, m) <- [(W.view, 0), (W.shift, shiftMask)]

        --  , i `notelem` (visible workspaces)

It seemed simple enough, but my understanding of Haskell is not quite 
there to understand the documentation.


On 08/02/2012 09:53 AM, Brandon Allbery wrote:
> On Thu, Aug 2, 2012 at 12:29 PM, Bryan Huh <bhh1988 at gmail.com> wrote:
>> How do you get a list of visible workspaces (only those workspaces that
>> are displayed on the monitors)? Currently I get the entire list of
>> workspaces in my xmonad config with (XMonad.workspaces conf). It looks like
>> this command returns a list of strings, each of which denote a workspace
>> (i.e. ["1", "2"... ] ). But not sure how to get a list of only those which
>> are visible (I could also probably work with a list of hidden workspaces).
> This depends to some extent on how you plan to use it; for example, when
> passing that list to an outside program using ppVisible or ppOrder from
> XMonad.Hooks.DynamicLog may be more convenient than other mechanisms.
> The general case, however, is roughly along the lines of
>      visibleWorkspaces :: X [WorkspaceId]
>      visibleWorkspaces = do
>        ws <- gets windowset
>        return $ map W.tag $ W.current ws : W.visible ws
> Note that this is impure, so you can't simply drop it in place of
> (workspaces conf).  If you give us more detail as to what you're trying to
> do, we can help you work it into your configuration properly.

More information about the xmonad mailing list