
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. Bryan On 08/02/2012 09:53 AM, Brandon Allbery wrote:
On Thu, Aug 2, 2012 at 12:29 PM, Bryan Huh
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.