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 ответов


хотя я совсем не уверен в этом, я думаю что ваша проблема возникает, когда вы пытаетесь полноэкранный плиточный окно. Строка в вашей конфигурации, которая говорит

manageHook = manageDocks <+> ...

сообщает xmonad, что вы не хотите, чтобы ваши плиточные окна перекрывали xmobar. Поэтому xmonad пытается подчиниться этому даже для полноэкранных окон, когда они выложены плиткой. Таким образом, есть три части решения:

  1. вы можете обновить ваш Windows до полноэкранным отображением их. Это обычно выполняется, удерживая клавишу modkey и щелкнув левой кнопкой мыши по окну один раз. Когда вы плавали окно, оно может покрыть все другие окна, включая xmobar. Поэтому, если вы затем попытаетесь полноэкранный режим окна, он должен охватывать весь экран.

  2. вы можете сказать xmonad для float VLC по умолчанию. Это встроенное поведение для mplayer, но, по-видимому, не для VLC. Вы делаете это, изменяя свою конфигурацию, чтобы сказать

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

    "управление крючком" является вещь, которая решает, как должны появляться окна. The <+> вещь сочетает в себе опции для управления крючком. Бит, который говорит

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

    просто означает, что "если окно является окном VLC, сделайте его плавающим по умолчанию."

  3. третий, очень жизнеспособный вариант-загрузить xmonad-contrib пакет, который содержит XMonad.Крючки.ManageHelpers модуль. Этот модуль содержит множество умных вспомогательных функций для customsing как xmonad это предполагается, чтобы обрабатывать ваши окна. Например, с его помощью вы можете добавить правило, которое говорит

    (isFullscreen --> doFullFloat)
    

    что означает "если окно пытается быть полноэкранным, автоматически плавает его и делает его охватывать весь экран" - это именно тот эффект, который вы хотите. Вы добавляете это в свой крючок управления точно так же, как имя класса:

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

    и затем VLC должен вести себя правильно, когда вы полноэкранный его независимо от того, есть ли у вас он плавал или нет!


как небольшой совет: когда вы начинаете получать много различных вариантов в вашем управлении крючки, и вы устали от их объединения с <+>, можно написать такую вещь как

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

этой composeAll будет автоматически объединять каждый элемент в списке с <+> оператора.

пожалуйста, спросите, есть ли какой-то бит настройки, который вы не уверены, что это значит. Держу пари, многие здесь рады попробовать. перевести код Хаскелла на человеческий язык. Я знаю,как это расстраивает, чтобы просто дико копировать и вставлять конфигурацию, не зная, как это работает. (И совсем недавно я начал изучать, как работает конфигурация xmonad, и это красота.)


Edit: о границах вашего окна на полноэкранных окнах. Есть модуль XMonad.Layout.NoBorders это обеспечивает аккуратную функцию smartBorders, который изменяет ваш крючок макета, чтобы он не рисовал границы на окна кажется fullscreened. Вы можете изменить свой крюк макета, чтобы использовать эту функцию, изменив строку в конфигурации на

layoutHook = smartBorders . avoidStruts $ layoutHook defaultConfig

на . вещь объединяет несколько функций в одну, в этом случае она будет объединять smartBorders С avoidStruts чтобы дать вам преимущества. Затем он передаст крючок макета по умолчанию в оба из них, чтобы создать измененный, лучший крючок макета.

я, к сожалению, не проверить, насколько хорошо это работает, так как я запуск XMonad без границ.


попробуйте lowerOnStart = True В вы .xmobarrc, есть avoidStruts (у вас уже есть) и сочетание клавиш для переключения стоек, например:

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

Это то, что у меня есть в моей конфигурации (переформатировано немного, чтобы больше походить на ваш):

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

Я написал небольшой модификатор макета поверх макета.Полноэкранный режим, который использует SetStruts (от крючков.ManageDocks), чтобы Скрыть / Показать панель, когда windows go полноэкранный режим:

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


Я думаю, что я получил это от одной из конфигураций по умолчанию, которые я нашел где-то. Мои часы для полноэкранных окон, а затем устанавливает в полноэкранный режим, используя управления крюком.

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
   }

Это не самый минимальный пример, как это сделать, но я просто скопировал и вставил его из моей конфигурации.