packages feed

intricacy-0.9.0.0: SDL2Keys.hs

-- This file is part of Intricacy
-- Copyright (C) 2013-2025 Martin Bays <mbays@sdf.org>
--
-- This program is free software: you can redistribute it and/or modify
-- it under the terms of version 3 of the GNU General Public License as
-- published by the Free Software Foundation, or any later version.
--
-- You should have received a copy of the GNU General Public License
-- along with this program.  If not, see http://www.gnu.org/licenses/.

module SDL2Keys (keysymChar) where

import           Data.Bits          (xor)
import           Data.Char          (chr, ord, toUpper)
import           SDL.Input.Keyboard

import           Util               (fi)

applyCtrl, applyMeta :: Char -> Char
applyCtrl ch | c <- fromEnum $ toUpper ch, fromEnum 'A' <= c, c <= fromEnum 'Z' = toEnum $ xor 64 c
applyCtrl ch = ch
applyMeta = toEnum . xor 128 . fromEnum

keysymChar :: Keysym -> Char
keysymChar (Keysym _ k mods) =
    let shift = keyModifierLeftShift mods || keyModifierRightShift mods
        ctrl = keyModifierLeftCtrl mods || keyModifierRightCtrl mods
        meta = keyModifierLeftAlt mods || keyModifierRightAlt mods
    in (if meta then applyMeta else id) .
        (if ctrl then applyCtrl . toUpper else id) $
        case k of
            Keycode n | unwrapKeycode KeycodeA <= n && n <= unwrapKeycode KeycodeZ ->
                chr (ord (if shift then 'A' else 'a') + fi (n - unwrapKeycode KeycodeA))
            Keycode n | unwrapKeycode KeycodeKP1 <= n && n <= unwrapKeycode KeycodeKP9 ->
                chr (ord '1' + fi (n - unwrapKeycode KeycodeKP1))
            KeycodeReturn     -> '\r'
            KeycodeEscape     -> '\ESC'
            KeycodeBackspace  -> '\b'
            KeycodeTab        -> '\t'
            KeycodeSpace      -> ' '
            KeycodeExclaim -> '!'
            KeycodeQuoteDbl -> '"'
            KeycodeHash -> '#'
            KeycodePercent -> '%'
            KeycodeDollar -> '$'
            KeycodeAmpersand -> '&'
            KeycodeQuote -> if shift then '"' else '\''
            KeycodeLeftParen -> '('
            KeycodeRightParen -> ')'
            KeycodeAsterisk -> '*'
            KeycodePlus -> '+'
            KeycodeComma -> if shift then '<' else ','
            KeycodeMinus -> if shift then '_' else '-'
            KeycodePeriod -> if shift then '>' else '.'
            KeycodeSlash -> if shift then '?' else '/'
            Keycode1 -> if shift then '!' else '1'
            Keycode2 -> if shift then '@' else '2'
            Keycode3 -> if shift then '#' else '3'
            Keycode4 -> if shift then '$' else '4'
            Keycode5 -> if shift then '%' else '5'
            Keycode6 -> if shift then '^' else '6'
            Keycode7 -> if shift then '&' else '7'
            Keycode8 -> if shift then '*' else '8'
            Keycode9 -> if shift then '(' else '9'
            Keycode0 -> if shift then ')' else '0'
            KeycodeColon -> ':'
            KeycodeSemicolon -> if shift then ':' else ';'
            KeycodeLess -> '<'
            KeycodeEquals -> if shift then '+' else '='
            KeycodeGreater -> '>'
            KeycodeQuestion -> '?'
            KeycodeAt -> '@'
            KeycodeLeftBracket -> if shift then '{' else '['
            KeycodeBackslash -> if shift then '|' else '\\'
            KeycodeRightBracket -> if shift then '}' else ']'
            KeycodeCaret -> '^'
            KeycodeUnderscore -> '_'
            KeycodeBackquote -> if shift then '~' else '`'
            KeycodeRight      -> '→'
            KeycodeLeft       -> '←'
            KeycodeDown       -> '↓'
            KeycodeUp         -> '↑'
            KeycodeKPDivide   -> if shift then '?' else '/'
            KeycodeKPMultiply -> '*'
            KeycodeKPMinus    -> '-'
            KeycodeKPPlus     -> '+'
            KeycodeKPEnter    -> '\n'
            KeycodeKP0 -> '0'
            KeycodeKPPeriod -> '.'
            _ -> '\0'