我刚刚从 metacity 切换到 xmonad,平铺窗口管理器的概念给我留下了深刻的印象。但有一件事让我很困扰:在 gnome 中,“工作区”由我所有的三个显示器组成,但使用 xmonad 时,每个物理屏幕都有自己的工作区(例如,当我按 mod+1 时,只有一个屏幕会更改其工作区)。
是否有一个平铺窗口管理器可以实现 gnome (metacity) 工作区概念?xmonad 能否以某种方式将所有物理屏幕链接到一个工作区?
答案1
XMonad 无法将所有三个屏幕用作单个工作区,但您也不想这样做。我认为您只需要知道如何更好地导航屏幕。我有一个我非常喜欢的设置,您可以查看该设置的配置文件在 Haskell Wiki 的 XMonad 部分中。我将展示的所有内容都来自我自己的机器上的配置(尽管这不一定是我链接到的页面上的内容)。
那里有两个xmonad-贡献这些库使得多头导航不仅可忍受,而且是天赐之物,它们是循环网络和标签窗口。
CycleWS 允许您循环浏览不同物理屏幕上的工作区(使用 prevScreen 和 nextScreen),还允许您轻松地在屏幕之间移动窗口(使用 shiftPrevScreen 和 shiftNextScreen)。这意味着即使您在每个屏幕上都有不同的工作区,每个工作区都可以在它们之间共享窗口。除非您希望一个窗口横跨您拥有的每个屏幕,否则您就没问题了。以下是我的 xmonad.hs 使用 CycleWS 命令的方式:
-- Alt + Ctrl Left / Right makes the view go left and right
, ((altMask .|. controlMask, xK_Left ), prevScreen >> windowCenter)
, ((altMask .|. controlMask, xK_Right ), nextScreen >> windowCenter)
, ((altMask .|. controlMask, xK_Down ), shiftPrevScreen)
, ((altMask .|. controlMask, xK_Up ), shiftNextScreen)
, ((altMask .|. controlMask .|. shiftMask, xK_Down ), shiftPrevScreen >> prevScreen >> windowCenter)
, ((altMask .|. controlMask .|. shiftMask, xK_Up ), shiftNextScreen >> nextScreen >> windowCenter)
[注意:windowCenter = warpToWindow(1%6)(1%6)]
TagWindows 非常棒,尤其是 viewOnScreen 功能,它可让您在任何屏幕上直接调用任何带标签的程序,尽管我不得不进行一些修改才能使其按我的喜好运行。以下是我使用的键:
, ((myModMask, xK_g ), tagPrompt defaultXPConfig (withFocused . addTag))
, ((myModMask .|. shiftMask, xK_g ), tagDelPrompt defaultXPConfig)
, ((altMask, xK_g ), tagPrompt defaultXPConfig (`withTaggedGlobalP` gotoWindow))
这里是 gotoWindow 函数的定义:
-- Warning: This gotoWindow function assumes you made your workspaces
-- with the 'withScreens' function from XMonad.Layout.IndependentScreens
gotoWindow :: Window -> WindowSet -> WindowSet
gotoWindow window ws = case S.findTag window ws of
Just i -> viewOnScreen (screenIdFromTag i) i ws
Nothing -> ws
where
screenIdFromTag :: WorkspaceId -> ScreenId
screenIdFromTag = S . read . takeWhile (/= '_')
这应该能让你在 XMonad 配置文件中实现多头功能。如果你有任何问题,请随时在评论中向我提问。希望这对你有所帮助。