如何覆盖某些图块的 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 块中绑定 toggleFadeSet
:
toggleFadeSet <- newIORef S.empty
然而,toggleFadeSet
仅在 do 块的主体范围内,而不在其下方的 where 块内;因此,当您尝试使用它时(我推测是错误消息中提到的第 70 行)...
myKeys = [ ((mod4Mask, xK_b ), spawn "qupzilla")
-- etc.
, ((mod4Mask, xK_f), withFocused $ io . modifyIORef toggleFadeSet . toggleFadeOut)
...您收到 "variable not in scope" 错误。要修复它,您可以将 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.
我正在尝试将此代码实施到我的 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 块中绑定 toggleFadeSet
:
toggleFadeSet <- newIORef S.empty
然而,toggleFadeSet
仅在 do 块的主体范围内,而不在其下方的 where 块内;因此,当您尝试使用它时(我推测是错误消息中提到的第 70 行)...
myKeys = [ ((mod4Mask, xK_b ), spawn "qupzilla")
-- etc.
, ((mod4Mask, xK_f), withFocused $ io . modifyIORef toggleFadeSet . toggleFadeOut)
...您收到 "variable not in scope" 错误。要修复它,您可以将 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.