gpt4 book ai didi

haskell - Xmonad 切换全屏/xmobar

转载 作者:行者123 更新时间:2023-12-03 21:47:25 25 4
gpt4 key购买 nike

鉴于我对 Haskell 的有限(零)知识,xmonad.hs 可能具有挑战性。

我正在寻找如何修改我的配置文件以允许“真实”全屏使用例如 VLC 观看视频。

我当前的 xmonad.hs:

    import XMonad
import XMonad.Hooks.DynamicLog
import XMonad.Hooks.ManageDocks
import XMonad.Util.Run(spawnPipe)
import XMonad.Util.EZConfig(additionalKeys)
import Graphics.X11.ExtraTypes.XF86
import System.IO

main = do
xmproc <- spawnPipe "xmobar /home/user/.xmobarrc"
xmonad $ defaultConfig
{ terminal = "urxvt",
manageHook = manageDocks <+> manageHook defaultConfig
, layoutHook = avoidStruts $ layoutHook defaultConfig
, logHook = dynamicLogWithPP xmobarPP
{ ppOutput = hPutStrLn xmproc
, ppTitle = xmobarColor "green" "" . shorten 50
}
} `additionalKeys`
[ ((0 , xF86XK_AudioLowerVolume), spawn "amixer set Master on && amixer set Headphone on && amixer set Master 2-"),
((0 , xF86XK_AudioRaiseVolume), spawn "amixer set Master on && amixer set Headphone on && amixer set Master 2+"),
((0 , xF86XK_AudioMute), spawn "amixer set Master toggle && amixer set Headphone toggle")
]

目前,我的 xmobar 在观看视频时也是可见的,我在显示视频的窗口上有一个红色边框。

如何修改此配置以允许例如使用 Mod-b 在全屏模式和正常模式之间切换?

最佳答案

虽然我对此完全不确定,但我认为当您尝试全屏显示平铺窗口时会出现问题。你的配置中的那行说

manageHook = manageDocks <+> ...

告诉 xmonad 您不希望您的平铺窗口与 xmobar 重叠。因此,即使是平铺的全屏窗口,xmonad 也会尝试遵守这一点。所以解决方案分为三个部分:
  • 您可以在全屏显示之前 float 窗口。这通常通过按住 modkey 并左键单击窗口一次来完成。 float 窗口后,它可以覆盖所有其他窗口,包括 xmobar。因此,如果您尝试全屏显示窗口,它应该覆盖整个屏幕。
  • 您可以告诉 xmonad 默认 float VLC。这是 mplayer 的内置行为,但显然不是 VLC。你可以通过改变你的配置来做到这一点

    manageHook = manageDocks <+> (className =? "Vlc" --> doFloat) <+> manageHook defaultConfig

    “管理钩子(Hook)”是决定窗口应该如何出现的东西。 <+> thing 结合了管理钩子(Hook)的选项。说的那一点

    (className =? "Vlc" --> doFloat)

    只是意味着“如果窗口是VLC窗口,则默认使其 float 。”
  • 第三种非常可行的选择是下载 xmonad-contrib包,其中包含 XMonad.Hooks.ManageHelpers模块。该模块包含许多巧妙的帮助函数,用于自定义 xmonad 应该如何处理您的窗口。例如,使用它,您可以添加一条规则,说明

    (isFullscreen --> doFullFloat)

    这意味着“如果窗口试图全屏,自动 float 并使其覆盖整个屏幕”——这正是你想要的效果。你把它添加到你的管理钩子(Hook)中,就像类名一样:

    manageHook = manageDocks <+> (isFullscreen --> doFullFloat) <+> manageHook defaultConfig

    然后无论您是否 float ,VLC 都应该在全屏时正常运行!


  • 作为一个小提示:当你开始在你的管理钩子(Hook)中获得很多不同的选项并且你厌倦了将它们与 <+> 结合使用时, 你也可以把事情写成

    manageHook = composeAll [
    manageDocks,
    isFullscreen --> doFullFloat,
    className =? "Vlc" --> doFloat,
    manageHook defaultConfig
    ]

    这个 composeAll将自动将列表中的每个项目与 <+>运算符(operator)。

    请询问是否有一些配置,您不确定这意味着什么。我敢打赌,这里的很多人都乐于尝试将 Haskell 代码翻译成人类语言。我知道在不知道它是如何工作的情况下不得不疯狂地复制和粘贴配置是多么令人沮丧。 (最近我才开始学习 xmonad 配置的工作原理,真是太棒了。)

    编辑:关于全屏窗口上的窗口边框。有一个模块 XMonad.Layout.NoBorders提供简洁的功能 smartBorders ,它会修改您的布局 Hook ,使其不会在看起来全屏的窗口上绘制边框。您也可以通过将配置中的行更改为来更改布局 Hook 以使用此功能
    layoutHook = smartBorders . avoidStruts $ layoutHook defaultConfig
    . thing 将多个功能合二为一,在这种情况下它将组合 smartBordersavoidStruts为您提供两者的好处。然后它将默认布局钩子(Hook)传递给它们,以创建修改后的更好的布局钩子(Hook)。

    不幸的是,我无法测试它的效果如何,因为我正在无边界地运行 XMonad。

    关于haskell - Xmonad 切换全屏/xmobar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20446348/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com