diff options
Diffstat (limited to 'XMonad')
-rw-r--r-- | XMonad/Stockholm/Font.hs | 10 | ||||
-rw-r--r-- | XMonad/Stockholm/Pager.hs | 27 | ||||
-rw-r--r-- | XMonad/Stockholm/Rhombus.hs | 121 | ||||
-rw-r--r-- | XMonad/Stockholm/Submap.hs | 8 |
4 files changed, 75 insertions, 91 deletions
diff --git a/XMonad/Stockholm/Font.hs b/XMonad/Stockholm/Font.hs index b30a1e7..ed801cc 100644 --- a/XMonad/Stockholm/Font.hs +++ b/XMonad/Stockholm/Font.hs @@ -22,8 +22,8 @@ printStringCentered d p xmf gc r s = do text_w <- textWidthXMF d xmf s (text_ascent, _) <- textExtentsXMF xmf s - let text_x = x + round ((fi w - fi text_w) / 2) - text_y = y + round ((fi h + fi text_h) / 2) + let text_x = x + round ((fi w - fi text_w) / (2 :: Double)) + text_y = y + round ((fi h + fi text_h) / (2 :: Double)) text_h = text_ascent printStringXMF' d p xmf gc "" "" text_x text_y s @@ -32,13 +32,13 @@ printStringCentered d p xmf gc r s = do -- from xmonad-contrib's XMonad.Util.Font, (c) 2007 Andrea Rossato and Spencer Janssen printStringXMF' :: (Functor m, MonadIO m) => Display -> Drawable -> XMonadFont -> GC -> String -> String -> Position -> Position -> String -> m () -printStringXMF' d p (Core fs) gc fc bc x y s = io $ do +printStringXMF' d p (Core fs) gc _fc _bc x y s = io $ do setFont d gc $ fontFromFontStruct fs --tv [fc',bc'] <- mapM (stringToPixel d) [fc,bc] --tv setForeground d gc fc' --tv setBackground d gc bc' drawImageString d p gc x y s -printStringXMF' d p (Utf8 fs) gc fc bc x y s = io $ do +printStringXMF' d p (Utf8 fs) gc _fc _bc x y s = io $ do --tv [fc',bc'] <- mapM (stringToPixel d) [fc,bc] --tv setForeground d gc fc' --tv setBackground d gc bc' @@ -59,6 +59,8 @@ printStringXMF' dpy drw fs@(Xft font) gc fc bc x y s = do io $ withXftDraw dpy drw visual colormap $ \draw -> withXftColorName dpy visual colormap fc $ \color -> xftDrawString draw color font x y s +#else +printStringXMF' _ _ (Xft _) _ _ _ _ _ _ = undefined #endif diff --git a/XMonad/Stockholm/Pager.hs b/XMonad/Stockholm/Pager.hs index cdfa432..eb00832 100644 --- a/XMonad/Stockholm/Pager.hs +++ b/XMonad/Stockholm/Pager.hs @@ -1,6 +1,5 @@ module XMonad.Stockholm.Pager - ( defaultPagerConfig - , defaultWindowColors + ( defaultWindowColors , defaultWorkspaceColors , MatchMethod(..) , pager @@ -30,12 +29,12 @@ data PagerConfig = PagerConfig } -defaultPagerConfig :: PagerConfig -defaultPagerConfig = PagerConfig "xft:Sans-8" 100 0 MatchInfix True defaultWorkspaceColors defaultWindowColors +instance Default PagerConfig where + def = PagerConfig "xft:Sans-8" 100 0 MatchInfix True defaultWorkspaceColors defaultWindowColors pager :: PagerConfig -> (String -> X ()) -> [String] -> X () -pager pc = rhombus defaultRhombusConfig +pager pc = rhombus def { rc_font = pc_font pc , rc_cellwidth = pc_cellwidth pc , rc_margin = pc_margin pc @@ -98,7 +97,7 @@ pagerPaint :: -> Bool -> Bool -> X () -pagerPaint pc rc d p gc t r focus match current = do +pagerPaint pc rc _ p gc t r foc match current = do ss <- gets windowset let x = rect_x r @@ -107,14 +106,11 @@ pagerPaint pc rc d p gc t r focus match current = do urgents <- readUrgents let foci = map W.focus $ catMaybes $ map W.stack $ W.workspaces ss - let color = pc_windowColors pc focus match current -- :: Bool -> (String, String) - (_, _, _fg_color) = pc_workspaceColors pc focus match current + let color = pc_windowColors pc foc match current -- :: Bool -> (String, String) + (_, _, _fg_color) = pc_workspaceColors pc foc match current - fg_color <- stringToPixel d _fg_color - - let r = screenRect $ W.screenDetail $ W.current ss - let a = fi (rect_width r) / fi (rect_height r) - let scale = fi (rc_cellwidth rc) / fi (rect_width r) + let sr = screenRect $ W.screenDetail $ W.current ss + let scale = fi (rc_cellwidth rc) / fi (rect_width sr) -- TODO whenNothing print error whenJust (findWorkspace t ss) $ \ ws -> do @@ -129,14 +125,13 @@ pagerPaint pc rc d p gc t r focus match current = do mapM_ (drawMiniWindow d p gc x y color' scale) (W.up s) drawMiniWindow - :: RealFrac a - => Display + :: Display -> Drawable -> GC -> Position -> Position -> (Window -> (String, String)) - -> a + -> Double -> Window -> IO () drawMiniWindow d p gc ox oy color s win = do diff --git a/XMonad/Stockholm/Rhombus.hs b/XMonad/Stockholm/Rhombus.hs index 93ecf07..b4d6861 100644 --- a/XMonad/Stockholm/Rhombus.hs +++ b/XMonad/Stockholm/Rhombus.hs @@ -1,21 +1,19 @@ module XMonad.Stockholm.Rhombus - ( defaultRhombusConfig - , MatchMethod(..) + ( MatchMethod(..) , rhombus , RhombusConfig(..) , RhombusState(..) ) where -import Control.Monad (forM_, zipWithM_) +import Control.Monad (zipWithM_) import Data.Char import Data.List import Data.Ord import Data.Map (fromList) -import Data.Maybe (isJust, fromJust) -import XMonad -import XMonad.StackSet hiding (filter) +import Data.Maybe (fromJust) +import XMonad hiding (keys) +import XMonad.StackSet hiding (filter, tag) import XMonad.Util.Font -import XMonad.Util.Image (drawIcon) import XMonad.Util.XUtils import XMonad.Stockholm.Submap @@ -33,15 +31,25 @@ data RhombusConfig = RhombusConfig , rc_wrap :: Bool , rc_colors :: Bool -> Bool -> Bool -> (String, String, String) , rc_paint :: RhombusConfig -> Display -> Pixmap -> GC -> String -> Rectangle -> Bool -> Bool -> Bool -> X () + , rc_missAction :: X () } -- TODO currently xft is broken -defaultRhombusConfig = RhombusConfig "xft:Sans-8" 100 0 MatchInfix True stupidColors noPaint - where - stupidColors _ _ _ = ("red", "magenta", "yellow") - noPaint _ _ _ _ _ _ _ _ _ = return () - +instance Default RhombusConfig where + def = RhombusConfig + { rc_font = "xft:Sans-8" + , rc_cellwidth = 100 + , rc_margin = 0 + , rc_matchmethod = MatchInfix + , rc_wrap = True + , rc_colors = stupidColors + , rc_paint = noPaint + , rc_missAction = return () + } + where + stupidColors _ _ _ = ("red", "magenta", "yellow") + noPaint _ _ _ _ _ _ _ _ _ = return () data RhombusState = RhombusState { rs_window :: Window @@ -81,14 +89,14 @@ rhombus rc viewFunc as = withGrabbedKeyboard $ do rhombusMode :: (String -> X ()) -> RhombusConfig -> RhombusState -> X () rhombusMode viewFunc rc rs = case match (rc_matchmethod rc) (rs_search rs) (init $ rs_strings rs) of - Nothing -> redraw rc rs >> submapString def keys + Nothing -> redraw rc rs >> submapString defAction keys Just i -> removeRhombus rs >> viewFunc i where - def (ch:[]) | isPrint ch = + defAction (ch:[]) | isPrint ch = incSearchPushChar ch rs >>= rhombusMode viewFunc rc - def _ = - failbeep >> rhombusMode viewFunc rc rs + defAction _ = + rc_missAction rc >> rhombusMode viewFunc rc rs keys = fromList $ [ ((0 , xK_BackSpace ), incSearchPopChar rs >>= rhombusMode viewFunc rc) @@ -106,57 +114,55 @@ rhombusMode viewFunc rc rs = _S = shiftMask --- TODO make failbeep configurable -failbeep = spawn "beep -l 100 -f 500" - - goto :: RhombusConfig -> (Position, Position) -> RhombusState -> X RhombusState -goto RhombusConfig{rc_wrap=True} xy rs = maybe (failbeep >> return rs) return $ wrapFocus xy rs -goto RhombusConfig{rc_wrap=False} xy rs = maybe (failbeep >> return rs) return $ moveFocus xy rs +goto rc xy rs = + maybe (rc_missAction rc >> return rs) return $ op xy rs + where + op = if rc_wrap rc then wrapFocus else moveFocus moveFocus :: (Position, Position) -> RhombusState -> Maybe RhombusState moveFocus (dx, dy) rs@RhombusState{rs_focus=(x,y)} = do - let focus' = (x + dx, y + dy) - if elem focus' (reachableCoords rs) - then Just rs { rs_focus = focus' } + let foc' = (x + dx, y + dy) + if elem foc' (reachableCoords rs) + then Just rs { rs_focus = foc' } else Nothing wrapFocus :: (Position, Position) -> RhombusState -> Maybe RhombusState -wrapFocus (0, dy) rs@RhombusState{rs_focus=focus} = do - let column = sortBy (comparing snd) $ filter ((==) (fst focus) . fst) (reachableCoords rs) - i <- elemIndex focus column +wrapFocus (0, dy) rs@RhombusState{rs_focus=foc} = do + let column = sortBy (comparing snd) $ filter ((==) (fst foc) . fst) (reachableCoords rs) + i <- elemIndex foc column return rs { rs_focus = column `modIndex` (i + fromIntegral dy) } -wrapFocus (dx, 0) rs@RhombusState{rs_focus=focus} = do - let column = sortBy (comparing fst) $ filter ((==) (snd focus) . snd) (reachableCoords rs) - i <- elemIndex focus column +wrapFocus (dx, 0) rs@RhombusState{rs_focus=foc} = do + let column = sortBy (comparing fst) $ filter ((==) (snd foc) . snd) (reachableCoords rs) + i <- elemIndex foc column return rs { rs_focus = column `modIndex` (i + fromIntegral dx) } wrapFocus _ _ = Nothing gotoPrevMatch :: RhombusConfig -> RhombusState -> X RhombusState -gotoPrevMatch rc rs@RhombusState{rs_focus=focus} = do +gotoPrevMatch rc rs@RhombusState{rs_focus=foc} = do case reverse (matchingReachableCoords rc rs) of - [] -> failbeep >> return rs + [] -> rc_missAction rc >> return rs xs -> return rs { rs_focus = maybe (head xs) (modIndex xs . (+1)) - (focus `elemIndex` xs) + (foc `elemIndex` xs) } gotoNextMatch :: RhombusConfig -> RhombusState -> X RhombusState -gotoNextMatch rc rs@RhombusState{rs_focus=focus} = do +gotoNextMatch rc rs@RhombusState{rs_focus=foc} = do case matchingReachableCoords rc rs of - [] -> failbeep >> return rs + [] -> rc_missAction rc >> return rs xs -> return rs { rs_focus = maybe (head xs) (modIndex xs . (+1)) - (focus `elemIndex` xs) + (foc `elemIndex` xs) } @@ -215,12 +221,12 @@ redraw rc rs = do -- TODO fixme color_black <- stringToPixel d "black" - forZipWithM_ tags (reachableCoords rs) $ \ tag oxy@(ox, oy) -> do + forZipWithM_ tags (reachableCoords rs) $ \tag oxy@(ox, oy) -> do - let focus = oxy == rs_focus rs - match = isXOf (rc_matchmethod rc) (rs_search rs) tag - current = tag == last tags - (_b_color, _bg_color, _fg_color) = rc_colors rc focus match current + let isFocused = oxy == rs_focus rs + isMatched = isXOf (rc_matchmethod rc) (rs_search rs) tag + isCurrent = tag == last tags + (_b_color, _bg_color, _fg_color) = rc_colors rc isFocused isMatched isCurrent --cell_x = (ox * dx) + x - fi (cell_w `div` 2) --cell_y = (oy * dy) + y - fi (cell_h `div` 2) cell_x = (ox * dx) + tx + 1 @@ -246,7 +252,7 @@ redraw rc rs = do coordModePrevious -- custom draw - paint rc d p g tag (Rectangle cell_x cell_y cell_w cell_h) focus match current + paint rc d p g tag (Rectangle cell_x cell_y cell_w cell_h) isFocused isMatched isCurrent -- paint text -- TODO custom paint text? @@ -323,12 +329,10 @@ removeRhombus (RhombusState w _ fn _ _) = do wave :: [(Position, Position)] wave = zip (0:(concat $ map (\i -> [0..i]++[i-1,i-2..1] ++ [0,-1..(-i)]++[-i,-i+1..(-1)]) [1..])) (concat $ map (\i -> [0..i]++[i-1,i-2..1] ++ [0,-1..(-i)]++[-i+1,-i+2..(-1)]) [1..]) - where - wave1 = 0:(concat $ map (\i -> [0..i]++[i-1,i-2..1] ++ [0,-1..(-i)]++[-i,-i+1..(-1)]) [1..]) - wave2 = concat $ map (\i -> [0..i]++[i-1,i-2..1] ++ [0,-1..(-i)]++[-i+1,-i+2..(-1)]) [1..] + --where + -- wave1 = 0:(concat $ map (\i -> [0..i]++[i-1,i-2..1] ++ [0,-1..(-i)]++[-i,-i+1..(-1)]) [1..]) + -- wave2 = concat $ map (\i -> [0..i]++[i-1,i-2..1] ++ [0,-1..(-i)]++[-i+1,-i+2..(-1)]) [1..] -commonPrefix (x:xs) (y:ys) | x == y = x:commonPrefix xs ys -commonPrefix _ _ = [] isXOf :: MatchMethod -> String -> String -> Bool @@ -336,32 +340,15 @@ isXOf MatchInfix = isInfixOf isXOf MatchPrefix = isPrefixOf -findXIndex :: (Eq a) => MatchMethod -> [a] -> [a] -> Maybe Int -findXIndex MatchInfix = findInfixIndex -findXIndex MatchPrefix = findPrefixIndex - - -findInfixIndex :: (Eq a) => [a] -> [a] -> Maybe Int -findInfixIndex needle haystack - = (\x -> if null x then Nothing else Just (fst $ head x)) - . dropWhile (\(_,x) -> not $ isPrefixOf needle x) - $ zip [0..] (tails haystack) - - -findPrefixIndex :: (Eq a) => [a] -> [a] -> Maybe Int -findPrefixIndex needle haystack = - if isPrefixOf needle haystack - then Just 0 - else Nothing - - modIndex :: Integral i => [a] -> i -> a modIndex xs i = xs `genericIndex` (i `mod` genericLength xs) +forZipWithM_ :: Monad m => [a] -> [b] -> (a -> b -> m c) -> m () forZipWithM_ a b f = zipWithM_ f a b +withGrabbedKeyboard :: X () -> X () withGrabbedKeyboard f = do XConf { theRoot = root, display = d } <- ask catchX (io (grabKeyboard d root False grabModeAsync grabModeAsync currentTime) >> f) diff --git a/XMonad/Stockholm/Submap.hs b/XMonad/Stockholm/Submap.hs index 8648e6c..601afba 100644 --- a/XMonad/Stockholm/Submap.hs +++ b/XMonad/Stockholm/Submap.hs @@ -12,8 +12,8 @@ import XMonad hiding (keys) -- | Like 'XMonad.Actions.Submap.submapDefault', but provides the looked up string to the default action. submapString :: (String -> X ()) -> M.Map (KeyMask, KeySym) (X ()) -> X () -submapString def keys = do - XConf { theRoot = root, display = d } <- ask +submapString defAction keys = do + XConf { display = d } <- ask (m, s, str) <- io $ allocaXEvent $ \p -> fix $ \nextkey -> do maskEvent d keyPressMask p @@ -22,10 +22,10 @@ submapString def keys = do if isModifierKey keysym then nextkey else do - (mbKeysym, str) <- lookupString (asKeyEvent p) + (_, str) <- lookupString (asKeyEvent p) return (m, keysym, str) -- Remove num lock mask and Xkb group state bits m' <- cleanMask $ m .&. ((1 `shiftL` 12) - 1) - maybe (def str) id (M.lookup (m', s) keys) + maybe (defAction str) id (M.lookup (m', s) keys) |