X.A.EasyMotion: Small nits

Superficial simplifications for certain functions
This commit is contained in:
slotThe
2021-04-12 20:13:02 +02:00
parent 78f3ad26ed
commit c649d314fa

View File

@@ -43,8 +43,9 @@ import XMonad.Util.Font (releaseXMF, initXMF, Align(AlignCente
import XMonad.Util.XUtils (fi, createNewWindow, paintAndWrite, deleteWindow, showWindow) import XMonad.Util.XUtils (fi, createNewWindow, paintAndWrite, deleteWindow, showWindow)
import Control.Monad (replicateM) import Control.Monad (replicateM)
import Control.Arrow ((&&&)) import Control.Arrow ((&&&))
import Data.Maybe (isJust) import Data.Functor (($>))
import qualified Data.Map.Strict as M (Map, map, foldr, mapWithKey) import Data.Maybe (isJust, listToMaybe)
import qualified Data.Map.Strict as M (Map, map, mapWithKey, elems)
import Data.Set (toList) import Data.Set (toList)
import Graphics.X11.Xlib.Extras (getWindowAttributes, getEvent) import Graphics.X11.Xlib.Extras (getWindowAttributes, getEvent)
import qualified Data.List as L (filter, partition, find, nub) import qualified Data.List as L (filter, partition, find, nub)
@@ -268,11 +269,11 @@ handleSelectWindow c = do
PerScreenKeys m -> PerScreenKeys m ->
fmap concat fmap concat
$ sequence $ sequence
$ M.foldr (:) [] $ M.elems
$ M.mapWithKey (\sid ks -> buildOverlays ks <$> sortedOverlayWindows sid) m $ M.mapWithKey (\sid ks -> buildOverlays ks <$> sortedOverlayWindows sid) m
where where
screenById :: ScreenId -> Maybe (W.Screen WorkspaceId (Layout Window) Window ScreenId ScreenDetail) screenById :: ScreenId -> Maybe (W.Screen WorkspaceId (Layout Window) Window ScreenId ScreenDetail)
screenById sid = L.find ((== sid) . screen) (W.current ws : W.visible ws) screenById sid = L.find ((== sid) . screen) (W.screens ws)
visibleWindowsOnScreen :: ScreenId -> [Window] visibleWindowsOnScreen :: ScreenId -> [Window]
visibleWindowsOnScreen sid = L.filter (`elem` toList mappedWins) $ W.integrate' $ screenById sid >>= W.stack . W.workspace visibleWindowsOnScreen sid = L.filter (`elem` toList mappedWins) $ W.integrate' $ screenById sid >>= W.stack . W.workspace
sortedOverlayWindows :: ScreenId -> X [OverlayWindow] sortedOverlayWindows :: ScreenId -> X [OverlayWindow]
@@ -289,12 +290,12 @@ handleSelectWindow c = do
-- focus the selected window -- focus the selected window
Selected o -> return . Just . win . overlayWin $ o Selected o -> return . Just . win . overlayWin $ o
-- return focus correctly -- return focus correctly
_ -> whenJust (W.peek ws) (windows . W.focusWindow) >> return Nothing _ -> whenJust (W.peek ws) (windows . W.focusWindow) $> Nothing
else releaseXMF f >> return Nothing else releaseXMF f $> Nothing
where where
allKeys :: ChordKeys -> [KeySym] allKeys :: ChordKeys -> [KeySym]
allKeys (AnyKeys ks) = ks allKeys (AnyKeys ks) = ks
allKeys (PerScreenKeys m) = concat $ M.foldr (:) [] m allKeys (PerScreenKeys m) = concat $ M.elems m
buildOverlays :: [KeySym] -> [OverlayWindow] -> [Overlay] buildOverlays :: [KeySym] -> [OverlayWindow] -> [Overlay]
buildOverlays ks = appendChords (maxChordLen c) ks buildOverlays ks = appendChords (maxChordLen c) ks
@@ -326,7 +327,7 @@ selectWindow :: EasyMotionConfig -> X (Maybe Window)
selectWindow conf = selectWindow conf =
handleSelectWindow conf { sKeys = sanitiseKeys (sKeys conf) } handleSelectWindow conf { sKeys = sanitiseKeys (sKeys conf) }
where where
-- make sure the key lists don't contain: backspace, or duplicates -- make sure the key lists don't contain: backspace, our cancel key, or duplicates
sanitise :: [KeySym] -> [KeySym] sanitise :: [KeySym] -> [KeySym]
sanitise = L.nub . L.filter (`notElem` [xK_BackSpace, cancelKey conf]) sanitise = L.nub . L.filter (`notElem` [xK_BackSpace, cancelKey conf])
sanitiseKeys :: ChordKeys -> ChordKeys sanitiseKeys :: ChordKeys -> ChordKeys
@@ -339,7 +340,7 @@ selectWindow conf =
appendChords :: Int -> [KeySym] -> [OverlayWindow] -> [Overlay] appendChords :: Int -> [KeySym] -> [OverlayWindow] -> [Overlay]
appendChords _ [] _ = [] appendChords _ [] _ = []
appendChords maxUserSelectedLen ks overlayWins = appendChords maxUserSelectedLen ks overlayWins =
zipWith (\ow c -> Overlay { overlayWin=ow, chord=c }) overlayWins chords zipWith Overlay overlayWins chords
where where
chords = replicateM chordLen ks chords = replicateM chordLen ks
-- the minimum necessary chord length to assign a unique chord to each visible window -- the minimum necessary chord length to assign a unique chord to each visible window
@@ -368,6 +369,7 @@ handleKeyboard dpy drawFn cancel selected deselected = do
| isNextOverlayKey s -> handleNextOverlayKey s | isNextOverlayKey s -> handleNextOverlayKey s
| otherwise -> handleKeyboard dpy drawFn cancel selected deselected | otherwise -> handleKeyboard dpy drawFn cancel selected deselected
| ev_event_type ev == buttonPress -> do | ev_event_type ev == buttonPress -> do
-- See XMonad.Prompt Note [Allow ButtonEvents]
io $ allowEvents dpy replayPointer currentTime io $ allowEvents dpy replayPointer currentTime
handleKeyboard dpy drawFn cancel selected deselected handleKeyboard dpy drawFn cancel selected deselected
| otherwise -> handleKeyboard dpy drawFn cancel selected deselected | otherwise -> handleKeyboard dpy drawFn cancel selected deselected
@@ -377,12 +379,12 @@ handleKeyboard dpy drawFn cancel selected deselected = do
case x of case x of
Backspace -> redraw >> handleKeyboard dpy drawFn cancel selected deselected Backspace -> redraw >> handleKeyboard dpy drawFn cancel selected deselected
_ -> return x _ -> return x
isNextOverlayKey keySym = isJust (L.find ((== keySym) . head .chord) selected) isNextOverlayKey keySym = isJust (L.find ((== Just keySym) . listToMaybe .chord) selected)
handleNextOverlayKey keySym = handleNextOverlayKey keySym =
case fg of case fg of
[x] -> return $ Selected x [x] -> return $ Selected x
_ -> handleKeyboard dpy drawFn cancel (trim fg) (clear bg) >>= retryBackspace _ -> handleKeyboard dpy drawFn cancel (trim fg) (clear bg) >>= retryBackspace
where where
(fg, bg) = L.partition ((== keySym) . head . chord) selected (fg, bg) = L.partition ((== Just keySym) . listToMaybe . chord) selected
trim = map (\o -> o { chord = tail $ chord o }) trim = map (\o -> o { chord = tail $ chord o })
clear = map (\o -> o { chord = [] }) clear = map (\o -> o { chord = [] })