Haskell 可单击的工作区

Haskell 可单击的工作区,haskell,xmonad,xmobar,Haskell,Xmonad,Xmobar,我将XMonad与两个xmobar实例结合使用,并使用独立屏幕,因为我有一个双监视器设置。自从我引入第二个监视器以来,我一直对可单击的工作区存在问题。问题是,IndependentScreens将工作空间标记为0_1,1_1,0_2,1_2,…,而我使用的代码仅基于工作空间ID,而不是ScreenId。我已经从源代码处编译了xmonad和xmonad contrib,这样我就可以使用xmonad.Util.ClickableWorkspace,但是,文档很模糊,我在任何地方都找不到正确使用的示例

我将XMonad与两个xmobar实例结合使用,并使用独立屏幕,因为我有一个双监视器设置。自从我引入第二个监视器以来,我一直对可单击的工作区存在问题。问题是,
IndependentScreens
将工作空间标记为
0_1,1_1,0_2,1_2,…
,而我使用的代码仅基于工作空间ID,而不是ScreenId。我已经从源代码处编译了
xmonad
xmonad contrib
,这样我就可以使用
xmonad.Util.ClickableWorkspace
,但是,文档很模糊,我在任何地方都找不到正确使用的示例。我试过很多不值得一提的东西,我想

这是我的配置:

import System.IO
import XMonad
import XMonad.Hooks.DynamicLog
import XMonad.Hooks.ManageDocks
import XMonad.Hooks.ServerMode
import XMonad.Hooks.SetWMName
import XMonad.Layout.IndependentScreens
import XMonad.Layout.Gaps
import XMonad.Layout.Spacing
import XMonad.Util.EZConfig (additionalKeysP)
import XMonad.Util.Run (spawnPipe)
import Data.Ord
import qualified XMonad.StackSet as W
import qualified Data.Map as M
import XMonad.Util.WorkspaceCompare
import XMonad.Util.ClickableWorkspaces

myLayout = gaps [(U, 10), (R, 10), (L, 10), (D, 10)] $ spacingRaw True (Border 0 10 10 10) True (Border 10 10 10 10) True $
             layoutHook def

myWorkspaces = 
  [ (xK_1, "1")
  , (xK_2, "2")
  , (xK_3, "3")
  , (xK_4, "4")
  , (xK_5, "5")
  , (xK_6, "6")
  , (xK_7, "7")
  , (xK_8, "8")
  , (xK_9, "9")
  , (xK_0, "10")
  , (xK_minus, "11")
  , (xK_equal, "12")
  ]


myKeys conf@(XConfig {XMonad.modMask = modMask}) = M.fromList $
    [ ((modMask, key), windows $ onCurrentScreen W.greedyView ws)
      | (key, ws) <- myWorkspaces
    ]
    ++
    [ ((modMask .|. shiftMask, key), windows $ onCurrentScreen W.shift ws)
      | (key, ws) <- myWorkspaces
    ]
    ++
    [
    -- Spawn the terminal
      ((modMask .|. shiftMask, xK_Return), spawn $ XMonad.terminal conf)
    
    -- Spawn dmenu
    , ((modMask, xK_p), spawn "dmenu_run")

    -- Close focused window 
    , ((modMask .|. shiftMask, xK_c), kill)
 
     -- Rotate through the available layout algorithms
    , ((modMask, xK_space ), sendMessage NextLayout)
 
    --  Reset the layouts on the current workspace to default
    , ((modMask .|. shiftMask, xK_space), setLayout $ XMonad.layoutHook conf)
 
    -- Resize viewed windows to the correct size
    , ((modMask, xK_n), refresh)
 
    -- Move focus to the next window
    , ((modMask, xK_Tab), windows W.focusDown)
 
    -- Move focus to the next window
    , ((modMask, xK_j), windows W.focusDown)
 
    -- Move focus to the previous window
    , ((modMask, xK_k), windows W.focusUp)
 
    -- Move focus to the master window
    , ((modMask, xK_m), windows W.focusMaster)
 
    -- Swap the focused window and the master window
    , ((modMask, xK_Return), windows W.swapMaster)
 
    -- Swap the focused window with the next window
    , ((modMask .|. shiftMask, xK_j), windows W.swapDown)
 
    -- Swap the focused window with the previous window
    , ((modMask .|. shiftMask, xK_k), windows W.swapUp)
 
    -- Shrink the master area
    , ((modMask, xK_h), sendMessage Shrink)
 
    -- Expand the master area
    , ((modMask, xK_l), sendMessage Expand)
 
    -- Push window back into tiling
    , ((modMask, xK_t), withFocused $ windows . W.sink)
 
    -- Increment the number of windows in the master area
    , ((modMask, xK_comma), sendMessage (IncMasterN 1))
 
    -- Deincrement the number of windows in the master area
    , ((modMask, xK_period), sendMessage (IncMasterN (-1)))
 
    -- toggle the status bar gap
    , ((modMask, xK_b), sendMessage ToggleStruts)
 
    -- Restart xmonad
    , ((modMask,  xK_q), broadcastMessage ReleaseResources >> restart "xmonad" True)
    ]

myAdditionalKeysP =
    [
      ("M-<F2>", spawn "thunar")
    , ("M-<F3>", spawn "firefox")
    , ("M-<F4>", spawn "code")
    , ("M-<F5>", spawn "thunderbird")
    , ("M-<Escape>", spawn "xfce4-appfinder")
    , ("M4-<Print>", spawn "xfce4-screenshooter")
    , ("M4-<KP_Add>", spawn "amixer -D pulse sset Master 5%+")
    , ("M4-<KP_Subtract>", spawn "amixer -D pulse sset Master 5%-")
    , ("M-C-p", spawn "passmenu") 
    , ("M-C-c", spawn "clipmenu")
    , ("M-C-m", spawn "mailwatch_restart")
    , ("M-C-x", spawn "xfce4-panel -r")
    , ("M-C-<Left>", spawn "playerctl previous")
    , ("M-C-<Right>", spawn "playerctl next")
    , ("M-C-<Space>", spawn "playerctl play-pause")
    ]

clickable' :: WorkspaceId -> String
clickable' w = xmobarAction ("xmonadctl view\\\"" ++ w ++ "\\\"") "1" w

compareNumbers = comparing (read :: String -> Int)

pp h s = marshallPP s def 
    { ppOutput = hPutStrLn h
    , ppCurrent = xmobarColor "blue" "" . wrap "[" "]"
    , ppHiddenNoWindows = xmobarColor "grey" "" . clickable'
    , ppVisible = wrap "(" ")"
    , ppUrgent  = xmobarColor "red" "yellow"
    , ppOrder = \(ws:_:_:_) -> [pad ws]
    , ppHidden = clickable'
    , ppSort = mkWsSort $ return compareNumbers
    }

main = do
    xmprocs <- mapM (\i -> spawnPipe $ "xmobar ~/.config/xmobar/xmobarrc-" ++ show i ++ " -x" ++ show i) [0..1]
    xmonad $ docks def
        {
          workspaces = withScreens 2 (map show [1..12])
          , keys = myKeys
          , borderWidth = 2
          , focusedBorderColor = "#226fa5"
          , normalBorderColor = "#191919"
          , handleEventHook = serverModeEventHookCmd
                            <+> serverModeEventHook
                            <+> serverModeEventHookF "XMONAD_PRINT" (io . putStrLn)
          , layoutHook = avoidStruts myLayout
          , logHook = mapM_ dynamicLogWithPP $ zipWith pp xmprocs [0..1]
          , startupHook = setWMName "LG3D"
          , manageHook = manageDocks
        } `additionalKeysP` myAdditionalKeysP
import System.IO
导入XMonad
导入XMonad.Hooks.DynamicLog
导入XMonad.Hooks.ManageDocks
导入XMonad.Hooks.ServerMode
导入XMonad.Hooks.SetWMName
导入XMonad.Layout.IndependentScreens
导入XMonad.Layout.Gaps
导入XMonad.Layout.spating
导入XMonad.Util.EZConfig(additionalKeysP)
导入XMonad.Util.Run(spawnPipe)
导入数据.Ord
导入合格的XMonad.StackSet作为W
导入符合条件的数据。映射为M
导入XMonad.Util.WorkspaceCompare
导入XMonad.Util.Clickable工作空间
myLayout=间隙[(U,10),(R,10),(L,10),(D,10)]$spacingRaw True(边框0 10 10)True(边框10)True$
layoutHook def
我的工作区=
[(xK_1,“1”)
,(xK_2,“2”)
,(xK_3,“3”)
,(xK_4,“4”)
,(xK_5,“5”)
,(xK_6,“6”)
,(xK_7,“7”)
,(xK_8,“8”)
,(xK_9,“9”)
,(xK_0,“10”)
,(xK_减,“11”)
,(xK_等于“12”)
]
myKeys conf@(XConfig{XMonad.modMask=modMask})=M.fromList$
[((modMask,key),windows$onCurrentScreen W.greedView ws)
|(键,ws)重新启动“xmonad”True)
]
myAdditionalKeysP=
[
(“M-”,繁殖“图纳”)
,(“M-”,派生“firefox”)
,(“M-”,生成“代码”)
,(“M-”,繁殖“雷鸟”)
,(“M-”,派生“xfce4 appfinder”)
,(“M4-”,生成“xfce4屏幕截图”)
,(“M4-”,生成“amixer-D脉冲sset主控5%+”)
,(“M4-”,生成“amixer-D脉冲sset主控5%-”)
,(“M-C-p”,生成“passmenu”)
,(“M-C-C”,派生“clipmenu”)
,(“M-C-M”,生成“mailwatch_restart”)
,(“M-C-x”,衍生“xfce4面板-r”)
,(“M-C-”,派生“playerctl-previous”)
,(“M-C-”,生成“playerctl next”)
,(“M-C-”,生成“playerctl播放暂停”)
]
可单击“::工作空间ID->字符串
可单击“w=xmoAction”(“xmonadctl视图\\\\”++w++\\\”)“1”w
compareNumbers=比较(读取::字符串->整数)
pp h s=编组LPP s def
{ppOutput=hPutStrLn h
,ppCurrent=xmobarColor“blue”“。换行“[”“]”
,ppHiddenNoWindows=xmobarColor“灰色”“。可单击'
,ppVisible=wrap“(“”)
,ppUrgent=xmobarColor“红色”或“黄色”
,ppOrder=\(ws:\)->[pad ws]
,ppHidden=可点击'
,ppSort=mkWsSort$return compareNumbers
}
main=do
xmprocs-spawnPipe$“xmobar~/.config/xmobar/xmobarrc-“++show i++”-x“++show i)[0..1]
xmonad$docks def
{
工作空间=带屏幕2(地图显示[1..12])
,keys=myKeys
,边框宽度=2
,focusedBorderColor=“#226fa5”
,normalBorderColor=“#191919”
,handleEventHook=serverModeEventHookCmd
serverModeEventHook
serverModeEventHookF“XMONAD_打印”(io.putStrLn)
,layoutHook=avoidStruts myLayout
,logHook=mapM\uDynamicLogWithPP$zipWithPP xmprocs[0..1]
,startupHook=setWMName“LG3D”
,manageHook=manageDocks
}`additionalKeysP`myAdditionalKeysP

我如何在设置中正确使用
clickablePP
,或使工作区可点击所需的任何东西?

我认为这样应该可以工作:

clickable' :: ScreenId -> VirtualWorkspace -> String
clickable' s w = xmobarAction ("xmonadctl view\\\"" ++ marshall s w ++ "\\\"") "1" w

pp h s = marshallPP s def
    { ppHiddenNoWindows = xmobarColor "grey" "" . clickable' s
    , -- and the other stuff
    }
我还没有测试过,不过…

在他的

myclickableworkspace::[String]
MyClickableWorkspace=可单击。(X全景地图)
-- $ [" 1 ", " 2 ", " 3 ", " 4 ", " 5 ", " 6 ", " 7 ", " 8 ", " 9 "]
$[“开发”、“www”、“sys”、“doc”、“vbox”、“chat”、“mus”、“vid”、“gfx”]
哪里
可点击的l=[”

,命令=[
...
--在我的配置中,工作区是“可单击的”。
,运行unsastdinreader
]
,template=“

myClickableWorkspaces :: [String]
myClickableWorkspaces = clickable . (map xmobarEscape)
           -- $ [" 1 ", " 2 ", " 3 ", " 4 ", " 5 ", " 6 ", " 7 ", " 8 ", " 9 "]
           $ [" dev ", " www ", " sys ", " doc ", " vbox ", " chat ", " mus ", " vid ", " gfx "]
    where
        clickable l = [ "<action=xdotool key super+" ++ show (n) ++ ">" ++ ws ++ "</action>" |
                  (i,ws) <- zip [1..9] l,
                  let n = i ]
, commands = [
              ...
             -- The workspaces are 'clickable' in my configs.
             , Run UnsafeStdinReader
             ]
, template = " <action=`xdotool key control+alt+g`>...