Some modularization + dynamic statusbar
This commit is contained in:
parent
ab8e2390e0
commit
41d9ca1d38
3 changed files with 158 additions and 94 deletions
80
lib/KeyBindings.hs
Normal file
80
lib/KeyBindings.hs
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
|
||||||
|
module KeyBindings (
|
||||||
|
KeyBindings.modify
|
||||||
|
) where
|
||||||
|
|
||||||
|
import Data.List (sort, isSuffixOf)
|
||||||
|
import Graphics.X11.Types
|
||||||
|
import System.Exit
|
||||||
|
import Text.EditDistance
|
||||||
|
import XMonad
|
||||||
|
import XMonad.Actions.CycleWS
|
||||||
|
import XMonad.Core
|
||||||
|
import XMonad.Layout.ToggleLayouts
|
||||||
|
import XMonad.Operations
|
||||||
|
import XMonad.Prompt
|
||||||
|
import XMonad.Prompt.ConfirmPrompt
|
||||||
|
import XMonad.Prompt.Shell
|
||||||
|
import XMonad.Util.EZConfig
|
||||||
|
import qualified Solarized as S
|
||||||
|
import qualified XMonad.StackSet as W
|
||||||
|
|
||||||
|
modify :: XConfig l -> XConfig l
|
||||||
|
modify conf = conf
|
||||||
|
{ modMask = mod4Mask -- Use the "Win" key for the mod key
|
||||||
|
}
|
||||||
|
|
||||||
|
`additionalKeysP` -- Add some extra key bindings:
|
||||||
|
[ ("M-S-q", confirmPrompt promptConfig "exit" (io exitSuccess))
|
||||||
|
, ("<Tab>-b", sendMessage (Toggle "Full"))
|
||||||
|
, ("<XF86MonBrightnessDown>", spawn "/run/current-system/sw/bin/xbacklight -10")
|
||||||
|
, ("<XF86MonBrightnessUp>", spawn "/run/current-system/sw/bin/xbacklight +10")
|
||||||
|
, ("M-<Delete>", kill)
|
||||||
|
, ("M-<Down>", windows W.focusDown)
|
||||||
|
, ("M-<Esc>", sendMessage (Toggle "Full"))
|
||||||
|
, ("M-$", sendMessage (Toggle "Full"))
|
||||||
|
, ("M-<Left>", prevWS)
|
||||||
|
, ("M-e", nextScreen)
|
||||||
|
, ("M-<Right>", nextWS)
|
||||||
|
, ("M-<Tab>", toggleWS)
|
||||||
|
, ("M-<Up>", windows W.focusUp)
|
||||||
|
, ("M-S-<Delete>", spawn "/run/current-system/sw/bin/i3lock-fancy -g -p")
|
||||||
|
, ("M-S-<Left>", shiftToPrev >> prevWS)
|
||||||
|
, ("M-S-<Right>", shiftToNext >> nextWS)
|
||||||
|
, ("M-S-p", shellPrompt promptConfig)
|
||||||
|
, ("M-S-s", spawn "sleep 0.2 ; /run/current-system/sw/bin/scrot -s /tmp/screenSel.png")
|
||||||
|
, ("M-p", fuzzyPrompt promptConfig)
|
||||||
|
, ("M-s", spawn "/run/current-system/sw/bin/scrot /tmp/screen.png")
|
||||||
|
]
|
||||||
|
|
||||||
|
`additionalKeys`-- Add some more (automatic) key bindings:
|
||||||
|
[ ((mod4Mask .|. mask, key), windows $ actionWith tag)
|
||||||
|
| (tag, key) <- zip (workspaces conf) [ xK_F1 .. ]
|
||||||
|
, (mask, actionWith) <- zip [ 0, shiftMask ] [ W.view, W.shift ] ]
|
||||||
|
|
||||||
|
promptConfig = def
|
||||||
|
{ position = Top
|
||||||
|
, alwaysHighlight = True
|
||||||
|
, bgColor = S.magenta
|
||||||
|
, bgHLight = S.base0
|
||||||
|
, borderColor = S.magenta
|
||||||
|
, defaultText = ""
|
||||||
|
, fgColor = S.base02
|
||||||
|
, fgHLight = S.base03
|
||||||
|
, font = "xft:Fira Code:style=Regular:size=9"
|
||||||
|
, height = 24
|
||||||
|
, promptBorderWidth = 5
|
||||||
|
}
|
||||||
|
|
||||||
|
-- Slightly taken from
|
||||||
|
-- https://mail.haskell.org/pipermail/xmonad/2010-October/010671.html
|
||||||
|
data FuzzySpawn = FuzzySpawn deriving (Read, Show)
|
||||||
|
instance XPrompt FuzzySpawn where showXPrompt _ = "RunC: "
|
||||||
|
fuzzyPrompt config = do
|
||||||
|
cmds <- io getCommands
|
||||||
|
let compl s
|
||||||
|
| null s = []
|
||||||
|
| otherwise = let weight c = levenshteinDistance defaultEditCosts s c
|
||||||
|
in map snd $ take 20 $ sort $ map (\c -> (weight c,c)) cmds
|
||||||
|
mkXPrompt FuzzySpawn config (return . compl) spawn
|
||||||
|
|
66
lib/StatusBar.hs
Normal file
66
lib/StatusBar.hs
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
{-# LANGUAGE FlexibleContexts #-}
|
||||||
|
|
||||||
|
module StatusBar (
|
||||||
|
StatusBar.modify
|
||||||
|
) where
|
||||||
|
|
||||||
|
import Data.List
|
||||||
|
import Data.Monoid
|
||||||
|
import Solarized as S
|
||||||
|
import XMonad.Core
|
||||||
|
import XMonad.Hooks.DynamicBars (dynStatusBarStartup,dynStatusBarEventHook,multiPP)
|
||||||
|
import XMonad.Hooks.DynamicLog
|
||||||
|
import XMonad.ManageHook
|
||||||
|
import XMonad.Util.Run
|
||||||
|
|
||||||
|
-- Type constructors
|
||||||
|
import GHC.IO.Handle (Handle)
|
||||||
|
|
||||||
|
modify :: XConfig l -> XConfig l
|
||||||
|
modify conf = conf
|
||||||
|
{ startupHook = do
|
||||||
|
startupHook conf
|
||||||
|
dynStatusBarStartup runXmobar killXmobar
|
||||||
|
, handleEventHook = handleEventHook conf <+> dynStatusBarEventHook runXmobar killXmobar
|
||||||
|
, logHook = do
|
||||||
|
logHook conf
|
||||||
|
multiPP currentPP otherPP
|
||||||
|
}
|
||||||
|
|
||||||
|
runXmobar :: ScreenId -> IO Handle
|
||||||
|
runXmobar (S id) = spawnPipe
|
||||||
|
$ "/run/current-system/sw/bin/xmobar --screen="
|
||||||
|
<> show id
|
||||||
|
<> " /home/eeva/.xmonad/xmobarrc"
|
||||||
|
|
||||||
|
killXmobar :: IO ()
|
||||||
|
-- killXmobar = spawn "/run/current-system/sw/bin/pkill xmobar"
|
||||||
|
killXmobar = return ()
|
||||||
|
|
||||||
|
otherPP = currentPP
|
||||||
|
{ ppCurrent = xmobarColor S.blue S.base03
|
||||||
|
}
|
||||||
|
|
||||||
|
currentPP = def
|
||||||
|
{ ppCurrent = xmobarColor' S.orange
|
||||||
|
, ppVisible = xmobarColor' S.yellow -- other screen
|
||||||
|
, ppHidden = xmobarColor' S.foreground -- other workspaces with windows
|
||||||
|
, ppHiddenNoWindows = xmobarColor' S.foregroundll -- other workspaces
|
||||||
|
, ppSep = " "
|
||||||
|
, ppWsSep = " "
|
||||||
|
, ppLayout = printLayout
|
||||||
|
, ppTitle = printTitle
|
||||||
|
}
|
||||||
|
where xmobarColor' fg = xmobarColor fg S.base03
|
||||||
|
|
||||||
|
printLayout s | "Mirror ResizableTall" `isSuffixOf` s = "[ — ]"
|
||||||
|
printLayout s | "ResizableTall" `isSuffixOf` s = "[ | ]"
|
||||||
|
printLayout "Full" = "[ F ]"
|
||||||
|
printLayout l = "[" ++ l ++ "]"
|
||||||
|
|
||||||
|
printTitle t = let t' = shorten 120 t
|
||||||
|
in xmobarColor' S.foregroundll "« "
|
||||||
|
++ xmobarColor' S.foregroundhl t'
|
||||||
|
++ xmobarColor' S.foregroundll " »"
|
||||||
|
|
||||||
|
|
106
xmonad.hs
106
xmonad.hs
|
@ -2,20 +2,15 @@
|
||||||
-- including best practises.
|
-- including best practises.
|
||||||
-- https://github.com/xmonad/xmonad-contrib/blob/master/XMonad/Config/Example.hs
|
-- https://github.com/xmonad/xmonad-contrib/blob/master/XMonad/Config/Example.hs
|
||||||
|
|
||||||
{-# LANGUAGE FlexibleContexts, OverloadedStrings #-}
|
|
||||||
|
|
||||||
module Main (main) where
|
module Main (main) where
|
||||||
|
|
||||||
import Data.Ratio ((%))
|
import Data.Ratio ((%))
|
||||||
import Data.List (sort, isSuffixOf)
|
|
||||||
import Text.EditDistance
|
|
||||||
import System.Exit
|
|
||||||
import XMonad
|
import XMonad
|
||||||
import XMonad.Actions.CycleWS
|
|
||||||
import XMonad.Actions.UpdatePointer
|
import XMonad.Actions.UpdatePointer
|
||||||
import XMonad.Config.Desktop
|
import XMonad.Config.Desktop
|
||||||
import XMonad.Hooks.DynamicLog
|
import XMonad.Hooks.DynamicLog
|
||||||
import XMonad.Hooks.ManageHelpers
|
import XMonad.Hooks.ManageHelpers
|
||||||
|
import XMonad.Hooks.ManageDocks (docksEventHook)
|
||||||
import XMonad.Layout.NoBorders (noBorders, smartBorders)
|
import XMonad.Layout.NoBorders (noBorders, smartBorders)
|
||||||
import XMonad.Layout.ResizableTile (ResizableTall(..))
|
import XMonad.Layout.ResizableTile (ResizableTall(..))
|
||||||
import XMonad.Layout.Spacing
|
import XMonad.Layout.Spacing
|
||||||
|
@ -24,14 +19,17 @@ import XMonad.Prompt
|
||||||
import XMonad.Prompt.ConfirmPrompt
|
import XMonad.Prompt.ConfirmPrompt
|
||||||
import XMonad.Prompt.Shell
|
import XMonad.Prompt.Shell
|
||||||
import XMonad.Util.EZConfig
|
import XMonad.Util.EZConfig
|
||||||
|
import XMonad.Util.Run (spawnPipe)
|
||||||
import qualified Solarized as S
|
import qualified Solarized as S
|
||||||
import qualified XMonad.StackSet as W
|
|
||||||
|
|
||||||
-- Contructors imports
|
-- Contructors imports
|
||||||
import XMonad.Core (XConfig)
|
|
||||||
import XMonad.Hooks.ManageDocks (AvoidStruts)
|
import XMonad.Hooks.ManageDocks (AvoidStruts)
|
||||||
import XMonad.Layout.LayoutModifier (ModifiedLayout)
|
import XMonad.Layout.LayoutModifier (ModifiedLayout)
|
||||||
|
|
||||||
|
-- Tidy modules
|
||||||
|
import StatusBar as Bar (modify)
|
||||||
|
import KeyBindings as Keys (modify)
|
||||||
|
|
||||||
wkspcs :: [String]
|
wkspcs :: [String]
|
||||||
-------- ["●", "◕", "◑", "◔", "◯", "◐", "◒", "◓", "☦", "λ"]
|
-------- ["●", "◕", "◑", "◔", "◯", "◐", "◒", "◓", "☦", "λ"]
|
||||||
-------- ["α", "β", "γ", "δ", "ε", "ζ", "η", "θ", "ι", "κ"]
|
-------- ["α", "β", "γ", "δ", "ε", "ζ", "η", "θ", "ι", "κ"]
|
||||||
|
@ -47,40 +45,14 @@ wkspcs = [ wrap "<fn=1>" "</fn>" "\xF0E0" -- email
|
||||||
, wrap "<fn=1>" "</fn>" "\xF03D" -- movie
|
, wrap "<fn=1>" "</fn>" "\xF03D" -- movie
|
||||||
]
|
]
|
||||||
|
|
||||||
barPP = def
|
|
||||||
{ ppCurrent = xmobarColor' S.orange
|
|
||||||
, ppVisible = xmobarColor' S.yellow -- other screen
|
|
||||||
, ppHidden = xmobarColor' S.foreground -- other workspaces with windows
|
|
||||||
, ppHiddenNoWindows = xmobarColor' S.foregroundll -- other workspaces
|
|
||||||
, ppSep = " "
|
|
||||||
, ppWsSep = " "
|
|
||||||
, ppLayout = printLayout
|
|
||||||
, ppTitle = printTitle
|
|
||||||
}
|
|
||||||
where xmobarColor' fg = xmobarColor fg S.base03
|
|
||||||
|
|
||||||
printLayout s | "Mirror ResizableTall" `isSuffixOf` s = "[ — ]"
|
|
||||||
printLayout s | "ResizableTall" `isSuffixOf` s = "[ | ]"
|
|
||||||
printLayout "Full" = "[ F ]"
|
|
||||||
printLayout l = "[" ++ l ++ "]"
|
|
||||||
|
|
||||||
printTitle t = let t' = shorten 120 t
|
|
||||||
in xmobarColor' S.foregroundll "« "
|
|
||||||
++ xmobarColor' S.foregroundhl t'
|
|
||||||
++ xmobarColor' S.foregroundll " »"
|
|
||||||
|
|
||||||
bar :: LayoutClass l Window => XConfig l -> IO (XConfig (ModifiedLayout AvoidStruts l))
|
|
||||||
bar conf = statusBar "xmobar /home/eeva/.xmonad/xmobarrc" barPP hideBarsKey conf
|
|
||||||
where hideBarsKey XConfig{modMask = modm} = (modm, xK_b)
|
|
||||||
|
|
||||||
lh = do
|
lh = do
|
||||||
ls <- dynamicLogString def
|
|
||||||
xmonadPropLog ls
|
|
||||||
updatePointer (0.5,0.5) (0,0)
|
updatePointer (0.5,0.5) (0,0)
|
||||||
|
logHook desktopConfig
|
||||||
|
|
||||||
myConfig = desktopConfig
|
myConfig = Bar.modify
|
||||||
{ modMask = mod4Mask -- Use the "Win" key for the mod key
|
$ Keys.modify
|
||||||
, manageHook = myManageHook <+> manageHook desktopConfig
|
$ desktopConfig
|
||||||
|
{ manageHook = myManageHook <+> manageHook desktopConfig
|
||||||
, layoutHook = desktopLayoutModifiers myLayouts
|
, layoutHook = desktopLayoutModifiers myLayouts
|
||||||
, logHook = lh
|
, logHook = lh
|
||||||
, terminal = "/run/current-system/sw/bin/kitty"
|
, terminal = "/run/current-system/sw/bin/kitty"
|
||||||
|
@ -90,34 +62,6 @@ myConfig = desktopConfig
|
||||||
, borderWidth = 5
|
, borderWidth = 5
|
||||||
}
|
}
|
||||||
|
|
||||||
`additionalKeysP` -- Add some extra key bindings:
|
|
||||||
[ ("M-S-q", confirmPrompt myXPConfig "exit" (io exitSuccess))
|
|
||||||
, ("<Tab>-b", sendMessage (Toggle "Full"))
|
|
||||||
, ("<XF86MonBrightnessDown>", spawn "/run/current-system/sw/bin/xbacklight -10")
|
|
||||||
, ("<XF86MonBrightnessUp>", spawn "/run/current-system/sw/bin/xbacklight +10")
|
|
||||||
, ("M-<Delete>", kill)
|
|
||||||
, ("M-<Down>", windows W.focusDown)
|
|
||||||
, ("M-<Esc>", sendMessage (Toggle "Full"))
|
|
||||||
, ("M-$", sendMessage (Toggle "Full"))
|
|
||||||
, ("M-<Left>", prevWS)
|
|
||||||
, ("M-e", nextScreen)
|
|
||||||
, ("M-<Right>", nextWS)
|
|
||||||
, ("M-<Tab>", toggleWS)
|
|
||||||
, ("M-<Up>", windows W.focusUp)
|
|
||||||
, ("M-S-<Delete>", spawn "/run/current-system/sw/bin/i3lock-fancy -g -p")
|
|
||||||
, ("M-S-<Left>", shiftToPrev >> prevWS)
|
|
||||||
, ("M-S-<Right>", shiftToNext >> nextWS)
|
|
||||||
, ("M-S-p", shellPrompt myXPConfig)
|
|
||||||
, ("M-S-s", spawn "sleep 0.2 ; /run/current-system/sw/bin/scrot -s /tmp/screenSel.png")
|
|
||||||
, ("M-p", fuzzyPrompt myXPConfig)
|
|
||||||
, ("M-s", spawn "/run/current-system/sw/bin/scrot /tmp/screen.png")
|
|
||||||
]
|
|
||||||
|
|
||||||
`additionalKeys`-- Add some more (automatic) key bindings:
|
|
||||||
[ ((mod4Mask .|. mask, key), windows $ actionWith tag)
|
|
||||||
| (tag, key) <- zip wkspcs [ xK_F1 .. ]
|
|
||||||
, (mask, actionWith) <- zip [ 0, shiftMask ] [ W.view, W.shift ] ]
|
|
||||||
|
|
||||||
myLayouts = toggleLayouts fullscreen tiled
|
myLayouts = toggleLayouts fullscreen tiled
|
||||||
where
|
where
|
||||||
fullscreen = (noBorders Full)
|
fullscreen = (noBorders Full)
|
||||||
|
@ -125,20 +69,6 @@ myLayouts = toggleLayouts fullscreen tiled
|
||||||
smarts = (smartSpacingWithEdge 5) . smartBorders
|
smarts = (smartSpacingWithEdge 5) . smartBorders
|
||||||
resizableTall = ResizableTall 1 (5/100) (1/2) []
|
resizableTall = ResizableTall 1 (5/100) (1/2) []
|
||||||
|
|
||||||
myXPConfig = def
|
|
||||||
{ position = Top
|
|
||||||
, alwaysHighlight = True
|
|
||||||
, bgColor = S.magenta
|
|
||||||
, bgHLight = S.base0
|
|
||||||
, borderColor = S.magenta
|
|
||||||
, defaultText = ""
|
|
||||||
, fgColor = S.base02
|
|
||||||
, fgHLight = S.base03
|
|
||||||
, font = "xft:Fira Code:style=Regular:size=9"
|
|
||||||
, height = 24
|
|
||||||
, promptBorderWidth = 5
|
|
||||||
}
|
|
||||||
|
|
||||||
-- Use the `xprop' tool to get the info you need for these matches.
|
-- Use the `xprop' tool to get the info you need for these matches.
|
||||||
-- For className, use the second value that xprop gives you.
|
-- For className, use the second value that xprop gives you.
|
||||||
myManageHook = composeOne
|
myManageHook = composeOne
|
||||||
|
@ -152,22 +82,10 @@ myManageHook = composeOne
|
||||||
]
|
]
|
||||||
|
|
||||||
-- Finally:
|
-- Finally:
|
||||||
main = xmonad =<< bar myConfig
|
main = xmonad myConfig
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-- Slightly taken from
|
|
||||||
-- https://mail.haskell.org/pipermail/xmonad/2010-October/010671.html
|
|
||||||
data FuzzySpawn = FuzzySpawn deriving (Read, Show)
|
|
||||||
instance XPrompt FuzzySpawn where showXPrompt _ = "RunC: "
|
|
||||||
fuzzyPrompt config = do
|
|
||||||
cmds <- io getCommands
|
|
||||||
let compl s
|
|
||||||
| null s = []
|
|
||||||
| otherwise = let weight c = levenshteinDistance defaultEditCosts s c
|
|
||||||
in map snd $ take 20 $ sort $ map (\c -> (weight c,c)) cmds
|
|
||||||
mkXPrompt FuzzySpawn config (return . compl) spawn
|
|
||||||
|
|
||||||
--- import qualified Data.Map as Map
|
--- import qualified Data.Map as Map
|
||||||
--- import XMonad
|
--- import XMonad
|
||||||
--- import XMonad.Util.EZConfig
|
--- import XMonad.Util.EZConfig
|
||||||
|
|
Loading…
Reference in a new issue