mirror of
https://github.com/xmonad/xmonad-contrib.git
synced 2025-05-19 03:20:21 -07:00
Now that we require xmonad 0.18.0, we can do this. Related: https://github.com/xmonad/xmonad/pull/405 Related: 0934fe5cd758 ("X.U.Grab: Hide mkGrabs from XMonad")
93 lines
2.4 KiB
Haskell
93 lines
2.4 KiB
Haskell
{-# LANGUAGE LambdaCase #-}
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- |
|
|
-- Module : XMonad.Util.Grab
|
|
-- Description : Utilities for grabbing/ungrabbing keys.
|
|
-- Copyright : (c) 2018 L. S. Leary
|
|
-- License : BSD3-style (see LICENSE)
|
|
--
|
|
-- Maintainer : L. S. Leary
|
|
-- Stability : unstable
|
|
-- Portability : unportable
|
|
--
|
|
-- This module should not be directly used by users. Its purpose is to
|
|
-- facilitate grabbing and ungrabbing keys.
|
|
--------------------------------------------------------------------------------
|
|
|
|
-- --< Imports & Exports >-- {{{
|
|
|
|
module XMonad.Util.Grab
|
|
(
|
|
-- * Usage
|
|
-- $Usage
|
|
grabKP
|
|
, ungrabKP
|
|
, grabUngrab
|
|
, grab
|
|
, customRegrabEvHook
|
|
) where
|
|
|
|
-- core
|
|
import XMonad
|
|
|
|
import Control.Monad ( when )
|
|
import Data.Foldable ( traverse_ )
|
|
-- base
|
|
import Data.Semigroup ( All(..) )
|
|
|
|
-- }}}
|
|
|
|
-- --< Usage >-- {{{
|
|
|
|
-- $Usage
|
|
--
|
|
-- This module should not be directly used by users. Its purpose is to
|
|
-- facilitate grabbing and ungrabbing keys.
|
|
|
|
-- }}}
|
|
|
|
-- --< Public Utils >-- {{{
|
|
|
|
-- | A more convenient version of 'grabKey'.
|
|
grabKP :: KeyMask -> KeyCode -> X ()
|
|
grabKP mdfr kc = do
|
|
XConf { display = dpy, theRoot = rootw } <- ask
|
|
io (grabKey dpy kc mdfr rootw True grabModeAsync grabModeAsync)
|
|
|
|
-- | A more convenient version of 'ungrabKey'.
|
|
ungrabKP :: KeyMask -> KeyCode -> X ()
|
|
ungrabKP mdfr kc = do
|
|
XConf { display = dpy, theRoot = rootw } <- ask
|
|
io (ungrabKey dpy kc mdfr rootw)
|
|
|
|
-- | A convenience function to grab and ungrab keys
|
|
grabUngrab
|
|
:: [(KeyMask, KeySym)] -- ^ Keys to grab
|
|
-> [(KeyMask, KeySym)] -- ^ Keys to ungrab
|
|
-> X ()
|
|
grabUngrab gr ugr = do
|
|
traverse_ (uncurry ungrabKP) =<< mkGrabs ugr
|
|
traverse_ (uncurry grabKP) =<< mkGrabs gr
|
|
|
|
-- | A convenience function to grab keys. This also ungrabs all
|
|
-- previously grabbed keys.
|
|
grab :: [(KeyMask, KeySym)] -> X ()
|
|
grab ks = do
|
|
XConf { display = dpy, theRoot = rootw } <- ask
|
|
io (ungrabKey dpy anyKey anyModifier rootw)
|
|
grabUngrab ks []
|
|
|
|
-- | An event hook that runs a custom action to regrab the necessary keys.
|
|
customRegrabEvHook :: X () -> Event -> X All
|
|
customRegrabEvHook regr = \case
|
|
e@MappingNotifyEvent{} -> do
|
|
io (refreshKeyboardMapping e)
|
|
when (ev_request e `elem` [mappingKeyboard, mappingModifier])
|
|
$ cacheNumlockMask
|
|
>> regr
|
|
pure (All False)
|
|
_ -> pure (All True)
|
|
|
|
-- }}}
|