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 пытается подчиниться этому даже для полноэкранных окон, когда они выложены плиткой. Таким образом, есть три части решения:
вы можете обновить ваш Windows до полноэкранным отображением их. Это обычно выполняется, удерживая клавишу modkey и щелкнув левой кнопкой мыши по окну один раз. Когда вы плавали окно, оно может покрыть все другие окна, включая xmobar. Поэтому, если вы затем попытаетесь полноэкранный режим окна, он должен охватывать весь экран.
-
вы можете сказать xmonad для float VLC по умолчанию. Это встроенное поведение для mplayer, но, по-видимому, не для VLC. Вы делаете это, изменяя свою конфигурацию, чтобы сказать
manageHook = manageDocks <+> (className =? "Vlc" --> doFloat) <+> manageHook defaultConfig
"управление крючком" является вещь, которая решает, как должны появляться окна. The
<+>
вещь сочетает в себе опции для управления крючком. Бит, который говорит(className =? "Vlc" --> doFloat)
просто означает, что "если окно является окном VLC, сделайте его плавающим по умолчанию."
-
третий, очень жизнеспособный вариант-загрузить
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
}
Это не самый минимальный пример, как это сделать, но я просто скопировал и вставил его из моей конфигурации.