mirror of
https://github.com/xmonad/xmonad-contrib.git
synced 2025-08-01 20:51:52 -07:00
X.A.EasyMotion: Small nits
Superficial simplifications for certain functions
This commit is contained in:
@@ -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 = [] })
|
||||||
|
Reference in New Issue
Block a user