    {-# OPTIONS_GHC -fno-warn-missing-signatures #-}

    -----------------------------------------------------------------------------
    -- |
    -- Module       : XMonad.Config.Azerty
    -- Copyright    : (c) Devin Mullins <me@twifkak.com>
    -- License      : BSD
    --
    -- Maintainer   : Devin Mullins <me@twifkak.com>
    -- Stability    : stable
    -- Portability  : unportable
    --
    -- This module fixes some of the keybindings for the francophone among you who
    -- use an AZERTY keyboard layout. Config stolen from TeXitoi's config on the
    -- wiki.

    module XMonad.Config.Azerty (
        -- * Usage
        -- $usage
        azertyConfig, azertyKeys, belgianConfig, belgianKeys
        ) where

    import XMonad
    import qualified XMonad.StackSet as W

    import qualified Data.Map as M

    -- $usage
    -- To use this module, start with the following @~\/.xmonad\/xmonad.hs@:
    --
    -- > import XMonad
    -- > import XMonad.Config.Azerty
    -- >
    -- > main = xmonad azertyConfig
    --
    -- If you prefer, an azertyKeys function is provided which you can use as so:
    --
    -- > import qualified Data.Map as M
    -- > main = xmonad someConfig { keys = \c -> azertyKeys c <+> keys someConfig c }

    azertyConfig :: XConfig (Choose Tall (Choose (Mirror Tall) Full))
    azertyConfig = XConfig (Choose Tall (Choose (Mirror Tall) Full))
    forall a. Default a => a
    def { keys :: XConfig Layout -> Map (ButtonMask, KeySym) (X ())
    keys = XConfig Layout -> Map (ButtonMask, KeySym) (X ())
    forall (l :: * -> *). XConfig l -> Map (ButtonMask, KeySym) (X ())
    azertyKeys (XConfig Layout -> Map (ButtonMask, KeySym) (X ()))
    -> (XConfig Layout -> Map (ButtonMask, KeySym) (X ()))
    -> XConfig Layout
    -> Map (ButtonMask, KeySym) (X ())
    forall m. Monoid m => m -> m -> m
    <+> XConfig (Choose Tall (Choose (Mirror Tall) Full))
    -> XConfig Layout -> Map (ButtonMask, KeySym) (X ())
    forall (l :: * -> *).
    XConfig l -> XConfig Layout -> Map (ButtonMask, KeySym) (X ())
    keys XConfig (Choose Tall (Choose (Mirror Tall) Full))
    forall a. Default a => a
    def }

    belgianConfig :: XConfig (Choose Tall (Choose (Mirror Tall) Full))
    belgianConfig = XConfig (Choose Tall (Choose (Mirror Tall) Full))
    forall a. Default a => a
    def { keys :: XConfig Layout -> Map (ButtonMask, KeySym) (X ())
    keys = XConfig Layout -> Map (ButtonMask, KeySym) (X ())
    forall (l :: * -> *). XConfig l -> Map (ButtonMask, KeySym) (X ())
    belgianKeys (XConfig Layout -> Map (ButtonMask, KeySym) (X ()))
    -> (XConfig Layout -> Map (ButtonMask, KeySym) (X ()))
    -> XConfig Layout
    -> Map (ButtonMask, KeySym) (X ())
    forall m. Monoid m => m -> m -> m
    <+> XConfig (Choose Tall (Choose (Mirror Tall) Full))
    -> XConfig Layout -> Map (ButtonMask, KeySym) (X ())
    forall (l :: * -> *).
    XConfig l -> XConfig Layout -> Map (ButtonMask, KeySym) (X ())
    keys XConfig (Choose Tall (Choose (Mirror Tall) Full))
    forall a. Default a => a
    def }

    azertyKeys :: XConfig l -> Map (ButtonMask, KeySym) (X ())
    azertyKeys = [KeySym] -> XConfig l -> Map (ButtonMask, KeySym) (X ())
    forall (l :: * -> *).
    [KeySym] -> XConfig l -> Map (ButtonMask, KeySym) (X ())
    azertyKeysTop [0x26,0xe9,0x22,0x27,0x28,0x2d,0xe8,0x5f,0xe7,0xe0]

    belgianKeys :: XConfig l -> Map (ButtonMask, KeySym) (X ())
    belgianKeys = [KeySym] -> XConfig l -> Map (ButtonMask, KeySym) (X ())
    forall (l :: * -> *).
    [KeySym] -> XConfig l -> Map (ButtonMask, KeySym) (X ())
    azertyKeysTop [0x26,0xe9,0x22,0x27,0x28,0xa7,0xe8,0x21,0xe7,0xe0]

    azertyKeysTop :: [KeySym] -> XConfig l -> Map (ButtonMask, KeySym) (X ())
    azertyKeysTop topRow :: [KeySym]
    topRow conf :: XConfig l
    conf@(XConfig {modMask :: forall (l :: * -> *). XConfig l -> ButtonMask
    modMask = ButtonMask
    modm}) = [((ButtonMask, KeySym), X ())] -> Map (ButtonMask, KeySym) (X ())
    forall k a. Ord k => [(k, a)] -> Map k a
    M.fromList ([((ButtonMask, KeySym), X ())] -> Map (ButtonMask, KeySym) (X ()))
    -> [((ButtonMask, KeySym), X ())]
    -> Map (ButtonMask, KeySym) (X ())
    forall a b. (a -> b) -> a -> b
    $
        [((ButtonMask
    modm, KeySym
    xK_semicolon), IncMasterN -> X ()
    forall a. Message a => a -> X ()
    sendMessage (Int -> IncMasterN
    IncMasterN (-1)))]
        [((ButtonMask, KeySym), X ())]
    -> [((ButtonMask, KeySym), X ())] -> [((ButtonMask, KeySym), X ())]
    forall a. [a] -> [a] -> [a]
    ++
        [((ButtonMask
    m ButtonMask -> ButtonMask -> ButtonMask
    forall a. Bits a => a -> a -> a
    .|. ButtonMask
    modm, KeySym
    k), (WindowSet -> WindowSet) -> X ()
    windows ((WindowSet -> WindowSet) -> X ())
    -> (WindowSet -> WindowSet) -> X ()
    forall a b. (a -> b) -> a -> b
    $ String -> WindowSet -> WindowSet
    f String
    i)
            | (i :: String
    i, k :: KeySym
    k) <- [String] -> [KeySym] -> [(String, KeySym)]
    forall a b. [a] -> [b] -> [(a, b)]
    zip (XConfig l -> [String]
    forall (l :: * -> *). XConfig l -> [String]
    workspaces XConfig l
    conf) [KeySym]
    topRow,
              (f :: String -> WindowSet -> WindowSet
    f, m :: ButtonMask
    m) <- [(String -> WindowSet -> WindowSet
    forall s i l a sd.
    (Eq s, Eq i) =>
    i -> StackSet i l a s sd -> StackSet i l a s sd
    W.greedyView, 0), (String -> WindowSet -> WindowSet
    forall a s i l sd.
    (Ord a, Eq s, Eq i) =>
    i -> StackSet i l a s sd -> StackSet i l a s sd
    W.shift, ButtonMask
    shiftMask)]]
        [((ButtonMask, KeySym), X ())]
    -> [((ButtonMask, KeySym), X ())] -> [((ButtonMask, KeySym), X ())]
    forall a. [a] -> [a] -> [a]
    ++
        -- mod-{z,e,r} %! Switch to physical/Xinerama screens 1, 2, or 3
        -- mod-shift-{z,e,r} %! Move client to screen 1, 2, or 3
        [((ButtonMask
    m ButtonMask -> ButtonMask -> ButtonMask
    forall a. Bits a => a -> a -> a
    .|. ButtonMask
    modm, KeySym
    key), ScreenId -> X (Maybe String)
    screenWorkspace ScreenId
    sc X (Maybe String) -> (Maybe String -> X ()) -> X ()
    forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
    >>= (Maybe String -> (String -> X ()) -> X ())
    -> (String -> X ()) -> Maybe String -> X ()
    forall a b c. (a -> b -> c) -> b -> a -> c
    flip Maybe String -> (String -> X ()) -> X ()
    forall (m :: * -> *) a. Monad m => Maybe a -> (a -> m ()) -> m ()
    whenJust ((WindowSet -> WindowSet) -> X ()
    windows ((WindowSet -> WindowSet) -> X ())
    -> (String -> WindowSet -> WindowSet) -> String -> X ()
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . String -> WindowSet -> WindowSet
    f))
            | (key :: KeySym
    key, sc :: ScreenId
    sc) <- [KeySym] -> [ScreenId] -> [(KeySym, ScreenId)]
    forall a b. [a] -> [b] -> [(a, b)]
    zip [KeySym
    xK_z, KeySym
    xK_e, KeySym
    xK_r] [0..],
              (f :: String -> WindowSet -> WindowSet
    f, m :: ButtonMask
    m) <- [(String -> WindowSet -> WindowSet
    forall s i l a sd.
    (Eq s, Eq i) =>
    i -> StackSet i l a s sd -> StackSet i l a s sd
    W.view, 0), (String -> WindowSet -> WindowSet
    forall a s i l sd.
    (Ord a, Eq s, Eq i) =>
    i -> StackSet i l a s sd -> StackSet i l a s sd
    W.shift, ButtonMask
    shiftMask)]]