diff options
Diffstat (limited to '')
| -rw-r--r-- | src/Chelleport.hs | 10 | ||||
| -rw-r--r-- | src/Chelleport/AppState.hs | 5 | ||||
| -rw-r--r-- | src/Chelleport/Control.hs | 9 | ||||
| -rw-r--r-- | src/Chelleport/KeySequence.hs | 6 |
4 files changed, 17 insertions, 13 deletions
diff --git a/src/Chelleport.hs b/src/Chelleport.hs index b5b76e2..0f5569e 100644 --- a/src/Chelleport.hs +++ b/src/Chelleport.hs @@ -3,7 +3,7 @@ module Chelleport where import Chelleport.AppShell (setupAppShell) import qualified Chelleport.AppState as AppState import Chelleport.Context (initializeContext) -import Chelleport.Control (anyAlphabetic, anyDigit, checkKey, ctrl, eventToKeycode, hjklDirection, key, pressed, released, shift) +import Chelleport.Control (anyAlphabetic, anyDigit, checkKey, ctrl, eventToKeycode, hjkl, hjklDirection, key, pressed, released, shift) import Chelleport.KeySequence (keycodeToInt, toKeyChar) import Chelleport.Types import Chelleport.Utils ((<||>)) @@ -24,9 +24,7 @@ run = do runAppWithCtx ctx = (`runReaderT` ctx) . runAppM eventHandler :: State -> SDL.Event -> Maybe AppAction -eventHandler state event = do - let hjkl = (`elem` ("HJKL" :: String)) . fromMaybe ' ' . toKeyChar . eventToKeycode - +eventHandler state event = case SDL.eventPayload event of SDL.QuitEvent -> Just ShutdownApp SDL.KeyboardEvent ev @@ -64,10 +62,10 @@ eventHandler state event = do then Just $ ChainMouseClick RightClick else Just $ TriggerMouseClick RightClick -- 0-9: Repetition digit - | checkKey [anyDigit, pressed] ev -> + | checkKey [anyDigit, not . ctrl, pressed] ev -> Just $ UpdateRepetition (fromMaybe 0 $ keycodeToInt $ eventToKeycode ev) -- A-Z: hint keys and search text - | checkKey [anyAlphabetic, pressed] ev -> + | checkKey [anyAlphabetic, not . ctrl, pressed] ev -> Just $ HandleKeyInput $ eventToKeycode ev -- Shift press/release: Toggle shift mode | checkKey [pressed, key SDL.KeycodeRShift <||> key SDL.KeycodeLShift] ev -> diff --git a/src/Chelleport/AppState.hs b/src/Chelleport/AppState.hs index 72a1afe..8c7bac1 100644 --- a/src/Chelleport/AppState.hs +++ b/src/Chelleport/AppState.hs @@ -9,13 +9,12 @@ import Chelleport.Types import Chelleport.Utils (cIntToInt, clamp, intToCInt, isEmpty, itemAt) import Control.Monad (replicateM_) import Data.Char (toLower) -import Data.List (isInfixOf) -import Data.Maybe (fromMaybe, isJust) +import Data.Maybe (isJust) import qualified Text.Fuzzy as Fuzzy initialState :: (Monad m) => m (State, Maybe AppAction) initialState = do - let cells = fromMaybe (pure undefined) $ generateGrid 0 (rows, columns) hintKeys + let cells = either error id $ generateGrid 0 (rows, columns) hintKeys pure (defaultAppState {stateGrid = cells}, Just $ SetMode defaultHintsMode) where rows = 9 diff --git a/src/Chelleport/Control.hs b/src/Chelleport/Control.hs index a7c475f..b987564 100644 --- a/src/Chelleport/Control.hs +++ b/src/Chelleport/Control.hs @@ -1,12 +1,13 @@ module Chelleport.Control where -import Chelleport.KeySequence (isAlphabetic, isKeycodeDigit) +import Chelleport.KeySequence (isAlphabetic, isKeycodeDigit, toKeyChar) import Chelleport.Types import Chelleport.Utils import Control.Concurrent (threadDelay) import Control.Monad (unless) import Control.Monad.IO.Class (MonadIO (liftIO)) import Control.Monad.Reader (MonadReader (ask)) +import Data.Maybe (fromMaybe) import qualified Debug.Trace as Debug import Foreign.C.Types import qualified Graphics.X11 as X11 @@ -85,6 +86,9 @@ key keycode = (keycode ==) . eventToKeycode ctrl :: SDL.KeyboardEventData -> Bool ctrl ev = SDL.keyModifierLeftCtrl (keyModifier ev) || SDL.keyModifierRightCtrl (keyModifier ev) +alt :: SDL.KeyboardEventData -> Bool +alt ev = SDL.keyModifierLeftAlt (keyModifier ev) || SDL.keyModifierRightAlt (keyModifier ev) + shift :: SDL.KeyboardEventData -> Bool shift ev = SDL.keyModifierLeftShift (keyModifier ev) || SDL.keyModifierRightShift (keyModifier ev) @@ -94,6 +98,9 @@ anyDigit = isKeycodeDigit . eventToKeycode anyAlphabetic :: SDL.KeyboardEventData -> Bool anyAlphabetic = isAlphabetic . eventToKeycode +hjkl :: SDL.KeyboardEventData -> Bool +hjkl = (`elem` ("HJKL" :: String)) . fromMaybe ' ' . toKeyChar . eventToKeycode + hjklDirection :: Char -> Direction hjklDirection = \case 'H' -> DirLeft diff --git a/src/Chelleport/KeySequence.hs b/src/Chelleport/KeySequence.hs index 70d56e2..141e71e 100644 --- a/src/Chelleport/KeySequence.hs +++ b/src/Chelleport/KeySequence.hs @@ -37,10 +37,10 @@ lcg seed = (multiplier * seed + increment) `mod` modulus getIndexRounded :: Int -> [a] -> a getIndexRounded i ls = ls !! (i `mod` length ls) -generateGrid :: Int -> (Int, Int) -> KeySequence -> Maybe KeyGrid +generateGrid :: Int -> (Int, Int) -> KeySequence -> Either String KeyGrid generateGrid seed (rows, columns) hintKeys - | rows * columns > length hintKeys * length hintKeys = Nothing - | otherwise = Just $ (\row -> getKeySeq row <$> [0 .. columns - 1]) <$> [0 .. rows - 1] + | rows * columns >= length hintKeys * length hintKeys = Left "Row/Column counts too high" + | otherwise = Right $ (\row -> getKeySeq row <$> [0 .. columns - 1]) <$> [0 .. rows - 1] where allKeySeq = take numPairs . uniq $ generatePairs numPairs = rows * columns |
