packages feed

ymonad-0.1.0.0: src/YMonad/Keys.hs

{-# LANGUAGE GeneralizedNewtypeDeriving #-}

module YMonad.Keys (
  KeyMask (..),
  KeySym (..),
  noModMask,
  shiftMask,
  controlMask,
  mod1Mask,
  mod3Mask,
  mod4Mask,
  mod5Mask,
  xK_Return,
  xK_return,
  xK_Tab,
  xK_ISO_Left_Tab,
  xK_space,
  xK_j,
  xK_k,
  xK_h,
  xK_l,
  xK_c,
  xK_p,
  xK_s,
  xK_q,
  xK_F1,
  xK_comma,
  xK_period,
  xK_1,
  xK_2,
  xK_3,
  xK_4,
  xK_5,
  xK_6,
  xK_7,
  xK_8,
  xK_9,
  renderKeyMask,
  renderKeySym,
  keySymToXkb,
) where

import Data.Bits (Bits, FiniteBits, (.&.))
import Data.Text qualified as T

newtype KeyMask = KeyMask
  { unKeyMask :: Word32
  }
  deriving stock (Eq, Ord, Show)
  deriving newtype (Bits, FiniteBits, Num)

newtype KeySym = KeySym
  { unKeySym :: Text
  }
  deriving stock (Eq, Ord, Show)

noModMask, shiftMask, controlMask, mod1Mask, mod3Mask, mod4Mask, mod5Mask :: KeyMask
noModMask = KeyMask 0
shiftMask = KeyMask 1
controlMask = KeyMask 4
mod1Mask = KeyMask 8
mod3Mask = KeyMask 32
mod4Mask = KeyMask 64
mod5Mask = KeyMask 128

xK_Return, xK_return, xK_Tab, xK_ISO_Left_Tab, xK_space, xK_j, xK_k, xK_h, xK_l, xK_c, xK_p, xK_s, xK_q, xK_comma, xK_period, xK_F1 :: KeySym
xK_Return = KeySym "Return"
xK_return = xK_Return
xK_Tab = KeySym "Tab"
xK_ISO_Left_Tab = KeySym "ISO_Left_Tab"
xK_space = KeySym "space"
xK_j = KeySym "j"
xK_k = KeySym "k"
xK_h = KeySym "h"
xK_l = KeySym "l"
xK_c = KeySym "c"
xK_p = KeySym "p"
xK_s = KeySym "s"
xK_q = KeySym "q"
xK_F1 = KeySym "F1"
xK_comma = KeySym "comma"
xK_period = KeySym "period"

xK_1, xK_2, xK_3, xK_4, xK_5, xK_6, xK_7, xK_8, xK_9 :: KeySym
xK_1 = KeySym "1"
xK_2 = KeySym "2"
xK_3 = KeySym "3"
xK_4 = KeySym "4"
xK_5 = KeySym "5"
xK_6 = KeySym "6"
xK_7 = KeySym "7"
xK_8 = KeySym "8"
xK_9 = KeySym "9"

renderKeyMask :: KeyMask -> Text
renderKeyMask mask
  | unKeyMask mask == 0 = "None"
  | otherwise = T.intercalate "+" (map snd (filter fst parts))
  where
    includes wanted = (unKeyMask mask .&. unKeyMask wanted) /= 0
    parts =
      [ (includes shiftMask, "Shift")
      , (includes controlMask, "Control")
      , (includes mod1Mask, "Mod1")
      , (includes mod3Mask, "Mod3")
      , (includes mod4Mask, "Mod4")
      , (includes mod5Mask, "Mod5")
      ]

renderKeySym :: KeySym -> Text
renderKeySym = unKeySym

keySymToXkb :: KeySym -> Maybe Word32
keySymToXkb (KeySym sym) =
  case sym of
    "Return" -> Just 0xFF0D
    "Escape" -> Just 0xFF1B
    "Tab" -> Just 0xFF09
    "ISO_Left_Tab" -> Just 0xFE20
    "space" -> Just 0x0020
    "comma" -> Just 0x002C
    "period" -> Just 0x002E
    "F1" -> Just 0xFFBE
    _ ->
      case toString sym of
        [ch] -> Just (fromIntegral (ord ch))
        _ -> Nothing