2013-12-07 1 views
9

Учитывая мои ограниченные (нолевые) знания с Haskell, xmonad.hs может быть сложной задачей.Xmonad toggle fullscreen/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

Вы показываете VLC в однооконном режиме в xmonad или используете полноэкранный режим VLC? Потому что, когда я делаю полноэкранный просмотр в своих медиаплеерах, они оба покрывают xmobar и не получают границы. – kqr

+0

@kqr Я имею в виду тип полноэкранного режима, который вы получаете, когда вы дважды щелкаете в видеокадре. Я работаю в Xmonad «full», если это то, что вы подразумеваете под режимом «один-оконный». – toeplitz

+0

Если вы делаете окно VLC плавающим (обычно, удерживая нажатой кнопку «Показывать», когда вы нажимаете на нее), а затем дважды щелкните по видеокадре для полноэкранного просмотра, покрывает ли он весь экран? Возможно, что окна с черепицей ведут себя по-другому. – kqr

ответ

20

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

manageHook = manageDocks <+> ... 

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

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

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

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

    «Управление крюк» это то, что решает, как окна должны появиться. Объект <+> сочетает в себе возможности для управления крючком. Бит, который говорит

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

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

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

    (isFullscreen --> doFullFloat) 
    

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

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

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


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

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

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

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


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

layoutHook = smartBorders . avoidStruts $ layoutHook defaultConfig 

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

К сожалению, я не могу проверить, насколько хорошо это работает, поскольку я бегу 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

Спасибо, это прекрасно работает как ключ «toggle 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).

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

Это даже хорошо работает с несколькими мониторами!

См my github для моего xmonad + xmobar конфигурации

1

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

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

Для меня это выглядит как самое простое решение. Примечание. После перезагрузки конфигурации в первый раз он не работает сразу. Он работает только после создания нового окна в рабочей области. –

+0

Да, это не означает, что xmobar исчезает, а остальные окна отображаются поверх него. Нет другого окна -> ничего для xmobar, чтобы спрятаться – Gauthier