16

鉴于我对 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 在全屏模式和正常模式之间切换?

4

5 回答 5

28

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

manageHook = manageDocks <+> ...

告诉 xmonad 您不希望您的平铺窗口与 xmobar 重叠。因此,即使是平铺的全屏窗口,xmonad 也会尝试遵守这一点。所以解决方案分为三个部分:

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

  2. 您可以告诉 xmonad 默认浮动 VLC。这是 mplayer 的内置行为,但显然不是 VLC。你可以通过改变你的配置来做到这一点

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

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

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

    只是意味着“如果窗口是VLC窗口,则默认使其浮动。”

  3. 第三个非常可行的选项是下载xmonad-contrib包含XMonad.Hooks.ManageHelpers模块的包。该模块包含许多巧妙的帮助函数,用于自定义 xmonad 应该如何处理您的窗口。例如,使用它,您可以添加一条规则,说明

    (isFullscreen --> doFullFloat)
    

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

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

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


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

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

composeAll将自动将列表中的每个项目与<+>运算符结合起来。

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


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

layoutHook = smartBorders . avoidStruts $ layoutHook defaultConfig

.事物将多个功能合二为一,在这种情况下,它将与 结合smartBordersavoidStruts您提供两者的好处。然后它将默认布局钩子传递给它们,以创建修改后的更好的布局钩子。

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

于 2013-12-08T00:40:39.967 回答
2

尝试lowerOnStart = True在你的 .xmobarrc 中设置,拥有avoidStruts(你已经拥有它),以及切换 struts 的键盘快捷键,例如:

((mod4Mask .|. shiftMask, xK_f), sendMessage ToggleStruts)
于 2014-12-25T11:09:35.703 回答
1

不过,您不必浮动窗口即可进行全屏工作。

使用全屏布局修饰符,您可以获得很好的全屏功能,例如允许切换到其他窗口(但仍显示 xmobar)。

我在 Layout.Fullscreen 之上编写了一个小的布局修改器,它使用 SetStruts(来自 Hooks.ManageDocks)在窗口全屏时隐藏/显示栏:

{-# LANGUAGE DeriveDataTypeable, MultiParamTypeClasses, FlexibleInstances, TypeSynonymInstances #-}
import XMonad
import qualified XMonad.Layout.Fullscreen as FS
import XMonad.Hooks.ManageDocks (SetStruts(..))
import XMonad.Layout.LayoutModifier (LayoutModifier(..), ModifiedLayout(..))
import Data.List (delete, nub)

fullscreenToggleStruts = ModifiedLayout $ FullscreenToggleStruts []
data FullscreenToggleStruts a = FullscreenToggleStruts [a]
     deriving (Read, Show)
instance LayoutModifier FullscreenToggleStruts Window where
    handleMess ff@(FullscreenToggleStruts fulls) m = case fromMessage m of
        Just (FS.AddFullscreen win) -> setStruts $ nub $ win:fulls
        Just (FS.RemoveFullscreen win) -> setStruts $ delete win fulls
        Just FS.FullscreenChanged -> return $ Just ff
        _ -> return Nothing
        where setStruts f = do
                let m = if null f
                        then SetStruts [minBound .. maxBound] []
                        else SetStruts [] [minBound .. maxBound]
                sendMessage m
                return $ Just $ FullscreenToggleStruts f

例如像这样使用它:

layoutHook = fullscreenToggleStruts $ FS.fullscreenFocus $ avoidStruts $ layoutHook'

它甚至适用于多台显示器!

有关我的 xmonad+xmobar 配置,请参见我的 github

于 2014-11-12T19:50:28.417 回答
1

这就是我在我的配置中的内容(重新格式化了一下,看起来更像你的):

main = do
    config <- statusBar "xmobar" myPP toggleXMobarKey myConfig
    xmonad config

myPP = xmobarPP { -- your PP customizations...
                  ppOutput = hPutStrLn xmproc
                , ppTitle = xmobarColor "green" "" . shorten 50
                }

toggleXMobarKey XConfig { XMonad.modMask = modMask } = (modMask, xK_b)

myConfig = defaultConfig { -- put your config here...
                           -- not including your logHook
                         }
于 2013-12-07T21:21:55.717 回答
0

我想我是从我在某处找到的默认配置之一得到的。我的监视全屏窗口,然后使用管理挂钩将其设置为全屏。

myManageHook = composeAll
    [ className =? "Firefox"        --> doShift (head myWorkspaces)
    , className =? "banshee"        --> doShift (last myWorkspaces)
    , resource  =? "desktop_window" --> doIgnore
    , isFullscreen                  --> doFullFloat ] -- this one

然后它只是将它添加到钩子列表中。

allHooks = [manageDocks, myManageHook, manageHook defaultConfig, manageSpawn]

最后,将所有的钩子组合在一起

defaults xmproc = defaultConfig
   { -- Simple Stuff
     terminal           = myTerminal
   , focusFollowsMouse  = myFocusFollowsMouse
   , borderWidth        = myBorderWidth
   , modMask            = myModMask
     -- numlockMask        = myNumlockMask,
   , workspaces         = myWorkspaces
   , normalBorderColor  = myNormalBorderColor
   , focusedBorderColor = myFocusedBorderColor

     -- key bindings
   , keys               = myKeys
   , mouseBindings      = myMouseBindings
     -- hooks, layouts
   , layoutHook         = myLayout
   , manageHook         = foldr1 (<+>) allHooks -- Right here
   , logHook            = myLogHook xmproc
   , startupHook        = myStartupHook
   }

这不是如何做到这一点的最小示例,但我只是从我的配置中复制并粘贴了它。

于 2013-12-07T22:51:23.350 回答