2013-12-07 2 views
9

하스켈에 대한 제 한적 인 (제로) 지식을 감안할 때 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 창을 부동 상태로 만들면 (일반적으로 사용자가 클릭 할 때마다 modkey 키를 누른 상태에서) 전체 화면을위한 비디오 프레임을 두 번 클릭하면 전체 화면을 덮을까요? 타일링 윈도우가 다르게 동작 할 수 있습니다. – kqr

답변

20

나는 이것에 대해 전혀 확신하지는 않지만, 은 바둑판 식 창을 전체 화면으로 표시하려고 할 때 문제가 발생한다고 생각합니다.

manageHook = manageDocks <+> ... 

을 말한다 당신의 설정에서 선은 당신이 당신의 타일 창 xmobar 중복 싶지 않아 xmonad 알려줍니다. 그래서 xmonad는 바둑판 식으로 배열되어있을 때 전체 화면의 창에 대해서조차이 규칙을 지키려고합니다. 따라서 솔루션에는 세 부분이 있습니다.

  1. 전체 화면으로 표시하기 전에 창을 떠올리게 할 수 있습니다. 이것은 일반적으로 modkey를 누르고 창을 한 번 왼쪽 클릭하여 수행됩니다. 창을 플로팅하면 xmobar를 포함하여 다른 모든 창을 덮을 수 있습니다. 따라서 창을 전체 화면으로 표시하려고하면 전체 화면을 덮어야합니다.

  2. 기본적으로 xmonad가 VLC를 플로팅하도록 지정할 수 있습니다. 이것은 mplayer에 대한 내장 동작이지만 VLC에는 해당되지 않습니다. 구성을 변경하여이 작업을 수행하십시오.

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

    "관리 훅"은 창 표시 방법을 결정하는 것입니다. <+> 것은 관리 후크에 대한 옵션을 결합합니다.

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

    을 말한다 비트는 윈도우가 VLC 윈도우 인 경우는 기본적으로 부동하게 "것을 의미한다."

  3. 세 번째, 아주 실행 가능한 옵션이 XMonad.Hooks.ManageHelpers 모듈을 포함하는 xmonad-contrib 패키지를 다운로드하는 것입니다.이 모듈은 xmonad가 창문을 처리하도록되어 방법 customsing에 대한 영리 도우미 기능을 많이 포함하고 있습니다. 예를 들어, 함께 그것은, 당신은

    "창이 자동으로 전체 화면 수를 부유하고 화면 전체를 커버 만들려고 노력하는 경우"를 의미
    (isFullscreen --> doFullFloat) 
    

    말한다 규칙을 추가 할 수 있습니다 -. 이것은 단지 당신이 원하는 효과를 당신은 추가 클래스 이름과 같은 방법으로 관리하는이 작업을 수행하십시오.

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

    그리고 VLC는 플로트 여부에 상관없이 전체 화면으로 표시 할 때 제대로 작동해야합니다! 작은 팁으로


: 당신이 당신의 관리 후크에 다른 선택의 여지를 받기 시작하고 <+>로 결합 피곤하면 다른 방법

manageHook = composeAll [ 
    manageDocks, 
    isFullscreen --> doFullFloat, 
    className =? "Vlc" --> doFloat, 
    manageHook defaultConfig 
    ] 
로 일을 쓸 수 있습니다

composeAll은 목록의 모든 항목을 <+> 운영자와 자동으로 결합합니다.

어떤 의미인지 확신 할 수없는 구성이 있는지 물어보십시오. 하스켈 코드를 인간 언어로 번역하려고하는 사람들이 많이 있습니다. 어떻게 작동하는지 모른 채 구성을 복사하여 붙여 넣기 만하면 얼마나 실망 스러운지 알 수 있습니다. (그리고 내가 구성이 어떻게 작동하는지 xmonad 배우기 시작하는 것이 최근이고, 그것은 아름다움입니다.)


편집 : 풀 스크린 창에 귀하의 창 경계에 대해. 은 깔끔한 기능을 제공합니다. smartBorders은 레이아웃 훅을 수정하여 전체 화면처럼 보이는 윈도우에 테두리를 그리지 않습니다. 당신은 당신에게 혜택을 제공하는 것이 avoidStrutssmartBorders을 결합한다이 경우, 하나에 . 것은 여러 가지 기능을 결합

layoutHook = smartBorders . avoidStruts $ layoutHook defaultConfig 

로 설정의 라인을 변경하여도이 기능을 사용하기 위해 레이아웃 후크를 변경할 수 있습니다 둘 다. 그런 다음 기본 레이아웃 훅을 양쪽 모두에 전달하여 수정 된 더 나은 레이아웃 훅을 만듭니다.

테두리가없는 XMonad를 실행하고 있기 때문에 불행하게도이 기능이 얼마나 작동하는지 테스트 할 수 없습니다.

+0

감사. 나는 옵션 3을 사용하고있다. 나는 풀 스크린으로 갈 때 그것은 작동하고 xmobar를 다룬다. 그러나 전체 화면 모드에서 여전히 빨간색 "활성 창"경계가 표시됩니다. 또한 내가 뒤돌아 볼 때 나는 xmobar를 더 이상 볼 수 없다. "빨간색 테두리"를 제거해야 할 필요가 있습니까? – toeplitz

+0

@toeplitz 나는 그에 대한 정보를 포함하도록 나의 대답을 편집했다. – kqr

+0

훌륭한 답변을 보내 주셔서 감사합니다. – toeplitz

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

나는 내가 어딘가에있는 기본 구성 중 하나에서이 거 같아요. Mine은 전체 화면 창을 감시 한 다음 관리 훅을 사용하여 전체 화면으로 설정합니다.

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를 보여줍니다).

나는 Hooks의 SetStruts를 사용하는 Layout.Fullscreen 위에 작은 레이아웃 수정자를 작성했습니다.

{-# 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' 

그것도 여러 대의 모니터와 함께 잘 작동 ManageDocks)은 창을 전체 화면으로 갈 때 막대를 표시/숨기기합니다!

에 대한 my github를 참조하십시오 내 xmonad + xmobar 설정

1

.xmobarrc 당신을 lowerOnStart = True을 설정해보십시오, avoidStruts (당신은 이미 그것을 가지고), 및 스트럿을 전환 할 수있는 키보드 단축키, 예를 들어 한 :

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

나에게 이것은 가장 쉬운 해결책처럼 보인다. 참고 : 구성을 처음으로 다시로드 한 후 즉시 작동하지 않습니다. 새 창을 작업 영역에서 작성한 후에 만 ​​작동합니다. –

+0

예, xmobar가 사라지지 않습니다. 다른 윈도우가 표시됩니다. 다른 창 없음 - xmobar가 뒤에 숨기려면 아무 것도 없음 – Gauthier

관련 문제