2013-12-07 84 views
9

鉴于我对Haskell的有限(零)知识,xmonad.hs可能具有挑战性。Xmonad切换全屏/ xmobar

我正在寻找如何修改我的配置文件,以允许“真正的”全屏使用例如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在全屏模式和正常模式之间切换?

+0

你是在xmonad的单窗口模式下显示VLC还是使用VLC全屏?因为当我在我的媒体播放器中进行全屏播放时,他们都覆盖了xmobar并且没有边框。 – kqr

+0

@kqr我指的是在视频帧中双击时获得的全屏类型。如果这就是你所说的单窗口模式,我正在使用Xmonad“full”。 – toeplitz

+0

如果你让VLC窗口浮动(通常按住你的模型,当你点击它),然后双击全屏的视频帧,它是否覆盖整个屏幕呢?这可能是平铺窗户行为不同。 – kqr

回答

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 
         } 
+0

当我尝试这个时,我收到了“不在范围内:'xmproc'”...... – toeplitz

+0

啊,当然,我没有想到就把它从你的conf中复制过来。只需删除该行:) – Tarmil

+0

谢谢,这很适合作为“切换xmobar”键。 – toeplitz

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 
    } 

这不是如何做到这一点最起码的例子,但我只是复制和 从我的配置粘贴它。

1

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

使用fullscreen layout modifiers,你可以有很好的全屏功能,例如允许切换到其他窗口(但仍显示xmobar)。

我在Layout.Fullscreen上使用SetStruts(来自钩子)编写了一个小布局修改器。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 [email protected](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配置

1

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

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

对我来说,这看起来像最简单的解决方案。注意:第一次重新加载配置后,它不能立即工作。它仅在工作区中创建新窗口后才起作用。 –

+0

是的,这不会使xmobar消失,它会让其他窗口显示在其上。没有其他窗口 - > xmobar隐藏在后面 – Gauthier