繁体   English   中英

Xmonad切换全屏/ xmobar

[英]Xmonad toggle fullscreen / 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?

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

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应该正常运行,无论你是否浮动它!


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

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

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

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


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

layoutHook = smartBorders . avoidStruts $ layoutHook defaultConfig

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

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

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

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
                         }

你不必漂浮你的窗户来完成全屏工作。

使用全屏布局修改器 ,您可以拥有漂亮的全屏功能,例如允许切换到其他窗口(但仍然显示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'

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

请参阅我的github以获取我的xmonad + xmobar配置

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

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

我想我是从某个地方找到的默认配置中得到的。 我的手表可以看全屏窗口,然后使用管理钩子将其设置为全屏。

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
   }

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM