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 <+> ...

タイル化されたウィンドウが xmobar に重ならないように xmonad に指示します。したがって、xmonad は、フルスクリーンのウィンドウがタイル表示されている場合でも、これに従おうとします。したがって、ソリューションには 3 つの部分があります。

  1. ウィンドウをフルスクリーンにする前に、ウィンドウをフロートさせることができます。これは通常、modkey を押したままウィンドウを 1 回左クリックすることで実行されます。ウィンドウをフローティングすると、xmobar を含む他のすべてのウィンドウを覆うことができます。したがって、ウィンドウを全画面表示しようとすると、画面全体が表示されます。

  2. xmonad にデフォルトで VLC をフロートするように指示できます。これは mplayer の組み込みの動作ですが、明らかに VLC ではそうではありません。これを行うには、設定を次のように変更します

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

    「manage hook」は、ウィンドウがどのように表示されるかを決定するものです。これ<+>は、manage フックのオプションを組み合わせたものです。と言うビット

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

    「ウィンドウがVLCウィンドウの場合、デフォルトでフローティングにする」という意味です。

  3. 3 つ目の非常に実行可能なオプションは、 XMonad.Hooks.ManageHelpersモジュールxmonad-contribを含むパッケージをダウンロードすることです。このモジュールには、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、きちんとした function を提供するモジュールがあります。smartBordersconfig の行を

layoutHook = smartBorders . avoidStruts $ layoutHook defaultConfig

モノはいくつかの機能を 1 つに結合します。.この場合、 と結合smartBordersavoidStrutsて両方の利点を提供します。次に、デフォルトのレイアウト フックを両方に渡し、変更された、より優れたレイアウト フックを作成します。

残念ながら、国境なしで XMonad を実行しているため、これがどの程度うまく機能するかをテストすることはできません。

于 2013-12-08T00:40:39.967 に答える
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 に答える
1

ただし、フルスクリーンを機能させるためにウィンドウをフロートさせる必要はありません。

フルスクリーン レイアウト修飾子を使用すると、たとえば他のウィンドウに切り替えることができる (ただし、xmobar は引き続き表示される) など、優れたフルスクリーン機能を使用できます。

ウィンドウが全画面表示になったときにバーを非表示/表示するために (Hooks.ManageDocks からの) 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 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 に答える