Xmonad切换全屏/ xmobar

时间:2013-12-07 20:39:05

标签: 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")
                ]

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

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

5 个答案:

答案 0 :(得分:22)

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

manageHook = manageDocks <+> ...

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

  1. 您可以在全屏显示之前浮动窗口。这通常通过按住mod键并左键单击窗口一次来完成。当您浮动窗口时,它可以覆盖所有其他窗口,包括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在全屏显示时应该正常运行,无论你是否浮动它都会出现!


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

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

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

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


    编辑:关于完全屏蔽的窗口上的窗口边框。有一个模块XMonad.Layout.NoBorders提供了整齐的函数smartBorders,它修改了你的布局挂钩,这样它就不会在看似全屏的窗口上绘制边框。您可以通过将配置中的行更改为

    来更改布局挂钩以使用此功能
    layoutHook = smartBorders . avoidStruts $ layoutHook defaultConfig
    

    .事件将多个函数合并为一个,在这种情况下,它会将smartBordersavoidStruts结合起来,为您提供两者的好处。然后它会将默认布局挂钩传递到它们中,以创建修改后的更好的布局挂钩。

    遗憾的是,我无法测试其工作情况,因为我正在运行无边界的XMonad。

答案 1 :(得分: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
                         }

答案 2 :(得分:1)

你不必漂浮你的窗户就可以全屏工作。

使用fullscreen layout modifiers,你可以拥有不错的全屏功能,例如允许切换到其他窗口(但仍显示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'

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

请参阅my github了解我的xmonad + xmobar配置

答案 3 :(得分:1)

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

((mod4Mask .|. shiftMask, xK_f), sendMessage ToggleStruts)

答案 4 :(得分: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
   }

这不是如何做的最简单的例子,但我只是复制和 从我的配置粘贴它。