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. Вы можете всплывать ваши окна, прежде чем их полный экран. Обычно это достигается, удерживая клавишу мод и щелкнув левой кнопкой мыши в окне один раз. Когда вы открыли окно, оно может покрыть все остальные окна, включая 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

. вещь объединяет несколько функций в одну, в этом случае она объединит 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).

Я написал небольшой модификатор макета поверх 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

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

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
   }

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

Другие вопросы по тегам