繁体   English   中英

如何覆盖某些图块的XMonad.Hooks.FadeInactive?

[英]How to override XMonad.Hooks.FadeInactive for some tiles?

我正在尝试将此代码实现到我的xmonad.hs中,因此我可以对非活动磁贴进行选择性淡出,但不知道任何haskell,因此这都是反复试验...

import XMonad
import XMonad.Hooks.FadeInactive
import Control.Monad (filterM,liftM, join)
import Data.IORef
import Data.List
import qualified Data.Set as S
import qualified XMonad.StackSet as W
import XMonad.Util.EZConfig(additionalKeys,removeKeys)

myFadeHook toggleFadeSet = fadeOutLogHook $ fadeIf (testCondition toggleFadeSet) 0.7
doNotFadeOutWindows = title =? "Call with " <||> className =? "QupZilla" <||> className =? "qpdfview"

testCondition :: IORef (S.Set Window) -> Query Bool
testCondition floats =
    liftM not doNotFadeOutWindows <&&> isUnfocused
    <&&> (join . asks $ \w -> liftX . io $ S.notMember w `fmap` readIORef floats)

toggleFadeOut :: Window -> S.Set Window -> S.Set Window
toggleFadeOut w s | w `S.member` s = S.delete w s
                  | otherwise = S.insert w s


main = do
  toggleFadeSet <- newIORef S.empty
  xmonad $ defaultConfig
  {
  logHook = myFadeHook toggleFadeSet
  , modMask = mod4Mask
  } `additionalKeys`
  [
  ((mod4Mask, xK_f), withFocused $ io . modifyIORef toggleFadeSet . toggleFadeOut
  ]

现在看起来像这样:

import           XMonad                          hiding ((|||))
import           XMonad.Hooks.FadeInactive
import           XMonad.Hooks.DynamicLog
import           XMonad.Hooks.ManageDocks
import           XMonad.Hooks.UrgencyHook
import           XMonad.Layout.Accordion
import           XMonad.Layout.DecorationMadness
import           XMonad.Layout.Fullscreen
import           XMonad.Layout.Grid
import           XMonad.Layout.LayoutCombinators
import           XMonad.Layout.NoBorders
import           XMonad.Layout.PerWorkspace
import           XMonad.Layout.Renamed
import           XMonad.Layout.Tabbed
import           XMonad.Layout.Spacing
import           XMonad.Prompt
import           XMonad.Prompt.Input
import qualified XMonad.StackSet                 as W
import           XMonad.Util.EZConfig(additionalKeys,removeKeys)
import           XMonad.Util.Scratchpad
import           XMonad.Util.Run(spawnPipe)
import           System.IO
import           Control.Monad (filterM,liftM, join)
import           Data.IORef
import           Data.List
import qualified Data.Set as S
import qualified XMonad.StackSet as W
import           Data.Ratio                      ((%))

myFadeHook toggleFadeSet = fadeOutLogHook $ fadeIf (testCondition toggleFadeSet) 0.7
doNotFadeOutWindows = title =? "Call with " <||> className =? "QupZilla" <||> className =? "qpdfview"

testCondition :: IORef (S.Set Window) -> Query Bool
testCondition floats =
    liftM not doNotFadeOutWindows <&&> isUnfocused
    <&&> (join . asks $ \w -> liftX . io $ S.notMember w `fmap` readIORef floats)

toggleFadeOut :: Window -> S.Set Window -> S.Set Window
toggleFadeOut w s | w `S.member` s = S.delete w s
                  | otherwise = S.insert w s

main :: IO ()

main = do
  xmproc <- spawnPipe "xmobar"
  toggleFadeSet <- newIORef S.empty
  xmonad $ defaultConfig
    { terminal = "xfce4-terminal"
    , modMask = mod4Mask
    , borderWidth = 0
    , focusedBorderColor = "#56F48B"
    , layoutHook = myLayoutHook
    , manageHook = manageHook defaultConfig <+> myManageHook
    , handleEventHook = mconcat
                  [ docksEventHook
                  , handleEventHook defaultConfig ]
    , logHook = myFadeHook toggleFadeSet
          <+> dynamicLogWithPP xmobarPP
                        { ppOutput = hPutStrLn xmproc
                        , ppTitle = xmobarColor "#56F48B" "" . shorten 50
                        }
    } `additionalKeys` myKeys
  where
      -- keybindings
      myKeys = [ ((mod4Mask,                 xK_b           ), spawn "qupzilla")
               , ((mod4Mask,                 xK_r           ), spawn "emacs")
               , ((mod4Mask,                 xK_u           ), scratchpad)
               , ((mod4Mask,                 xK_y           ), focusUrgent)
               , ((mod4Mask .|. controlMask, xK_space       ), myLayoutPrompt)
               , ((mod4Mask, xK_f), withFocused $ io . modifyIORef toggleFadeSet . toggleFadeOut)
               ]
      scratchpad = scratchpadSpawnActionTerminal "xfce4-terminal"

      -- layouts
      myLayoutHook = avoidStrutsOn [U] $
                     smartBorders $
                     smartSpacingWithEdge 2 $
                     tall ||| wide ||| full ||| circle ||| sTabbed ||| acc
      tall   = renamed [Replace "tall"] $ Tall 1 0.03 0.5
      wide   = renamed [Replace "wide"] $ Mirror tall
      full   = renamed [Replace "full"] $ Full
      circle = renamed [Replace "circle"] $ circleSimpleDefaultResizable
      sTabbed = renamed [Replace "tabbed"] $ simpleTabbed
      acc = renamed [Replace "accordion"] $ Accordion

      -- layout prompt (w/ auto-completion and all layouts)
      myLayoutPrompt = inputPromptWithCompl myXPConfig "Layout"
                       (mkComplFunFromList' allLayouts)
                       ?+ (sendMessage . JumpToLayout)
      myXPConfig = defaultXPConfig { autoComplete = Just 1000 }
      allLayouts = ["tall", "wide", "circle", "full", "tabbed", "accordion"]

      -- manageHook
      myManageHook =     manageDocks
                     <+> floatHook
                     <+> fullscreenManageHook
                     <+> scratchpadManageHookDefault
  -- Inspect with xprop: appName is the first element in WM_CLASS, while
  -- className is the second.
  floatHook = composeAll [ appName =? "gimp-2.8"    --> doFloat
                         , className =? "qupzilla" --> doF (W.shift "1")
                         ]

现在,当我编译时,我只会遇到此错误,我非常感谢如何解决此问题:)

Error detected while loading xmonad configuration file: /home/n3p/.xmonad/xmonad.hs

xmonad.hs:70:68: error:
  * Variable not in scope: toggleFadeSet :: IORef (S.Set Window)
  * Perhaps you meant 'toggleFadeOut' (line 39)

Please check the file for errors.

您将在main do-block中绑定toggleFadeSet

toggleFadeSet <- newIORef S.empty

然而, toggleFadeSet仅在do块的主体范围内,而在其下面的where块中; 因此,当您尝试使用它时(我以为错误消息中提到的第70行)...

myKeys = [ ((mod4Mask,                 xK_b           ), spawn "qupzilla")
         -- etc.
         , ((mod4Mask, xK_f), withFocused $ io . modifyIORef toggleFadeSet . toggleFadeOut)

...您会收到“变量不在范围内”错误。 要解决此问题,您可以将myKeys的定义myKeys do块内的let中。 另一种选择是将myKeys在原处,但将其转换为函数,并向其传递IORef

main = do
  xmproc <- spawnPipe "xmobar"
  toggleFadeSet <- newIORef S.empty
  xmonad $ defaultConfig
    { terminal = "xfce4-terminal"
    -- etc.
    } `additionalKeys` myKeys toggleFadeSet
  where
      -- keybindings
      myKeys toggleFadeSet = 
          [ ((mod4Mask,                 xK_b           ), spawn "qupzilla")
          , ((mod4Mask,                 xK_r           ), spawn "emacs")
          , ((mod4Mask,                 xK_u           ), scratchpad)
          , ((mod4Mask,                 xK_y           ), focusUrgent)
          , ((mod4Mask .|. controlMask, xK_space       ), myLayoutPrompt)
          , ((mod4Mask, xK_f), withFocused $ io . modifyIORef toggleFadeSet . toggleFadeOut)
          ]
      -- etc.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM