Xmonad切换全屏/ xmobar

toe*_*itz 12 haskell xmonad xmobar

鉴于我对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")
                ]
Run Code Online (Sandbox Code Playgroud)

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

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

kqr*_*kqr 22

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

manageHook = manageDocks <+> ...
Run Code Online (Sandbox Code Playgroud)

告诉xmonad你不希望平铺的窗口与xmobar重叠.因此,当它们被平铺时,xmonad会尝试遵守这一点,即使对于全屏幕窗口也是如此.因此解决方案有三个部分:

  1. 您可以在全屏显示之前浮动窗口.这通常通过按住mod键并左键单击窗口一次来完成.当您浮动窗口时,它可以覆盖所有其他窗口,包括xmobar.因此,如果您尝试全屏显示窗口,它应覆盖整个屏幕.

  2. 默认情况下,您可以告诉xmonad浮动VLC.这是mplayer的内置行为,但显然不适用于VLC.您可以通过更改配置来执行此操作

    manageHook = manageDocks <+> (className =? "Vlc" --> doFloat) <+> manageHook defaultConfig
    
    Run Code Online (Sandbox Code Playgroud)

    "管理钩子"是决定窗口应该如何出现的东西.该<+>东西结合了管理钩子的选项.有点说

    (className =? "Vlc" --> doFloat)
    
    Run Code Online (Sandbox Code Playgroud)

    只是意味着"如果窗口是VLC窗口,默认情况下使其浮动."

  3. 第三个非常可行的选择是下载xmonad-contrib包,其中包含XMonad.Hooks.ManageHelpers模块.这个模块包含许多聪明的帮助函数,用于跟踪xmonad应该如何处理你的窗口.例如,使用它,您可以添加一个说明的规则

    (isFullscreen --> doFullFloat)
    
    Run Code Online (Sandbox Code Playgroud)

    这意味着"如果窗口试图全屏,自动浮动并使其覆盖整个屏幕" - 这只是你想要的效果.您可以使用与类名称相同的方式将此添加到您的管理挂钩:

    manageHook = manageDocks <+> (isFullscreen --> doFullFloat) <+> manageHook defaultConfig
    
    Run Code Online (Sandbox Code Playgroud)

    然后当你全屏显示它时,VLC应该正常运行,无论你是否浮动它!


作为一个小提示:当你开始在你的管理钩子中获得许多不同的选项并且你厌倦了将它们组合起来时<+>,你可以选择把它写成

manageHook = composeAll [
    manageDocks,
    isFullscreen --> doFullFloat,
    className =? "Vlc" --> doFloat,
    manageHook defaultConfig
  ]
Run Code Online (Sandbox Code Playgroud)

composeAll将自动将列表中的每个项目与<+>运算符组合在一起.

请问是否有一些配置,你不确定它是什么意思.我敢打赌,很多人都很乐意尝试将Haskell代码翻译成人类语言.我知道在不知道它是如何工作的情况下必须疯狂地复制和粘贴配置是多么令人沮丧.(就在最近,我开始学习xmonad配置如何工作,这是一种美.)


编辑:关于完全屏蔽窗口上的窗口边框.有一个模块XMonad.Layout.NoBorders提供了整洁的功能smartBorders,它修改了你的布局钩子,使它不会在看起来全屏的窗口上绘制边框.您可以更改布局挂钩以使用此功能,方法是将配置中的行更改为

layoutHook = smartBorders . avoidStruts $ layoutHook defaultConfig
Run Code Online (Sandbox Code Playgroud)

.东西将多个功能合二为一,在这种情况下,它将结合smartBorders使用avoidStruts,为您提供两者的好处.然后它会将默认布局挂钩传递到它们中,以创建修改后的更好的布局挂钩.

遗憾的是,我无法测试它的工作情况,因为我正在运行没有边框的XMonad.