Haskell 可单击的工作区
我将XMonad与两个xmobar实例结合使用,并使用独立屏幕,因为我有一个双监视器设置。自从我引入第二个监视器以来,我一直对可单击的工作区存在问题。问题是,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,但是,文档很模糊,我在任何地方都找不到正确使用的示例
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`>...