module XMonad.Config.Vanessa (vConfig) where
import qualified Data.Map as M
import Data.Maybe
import Data.Monoid
import Data.Ratio ((%))
import XMonad hiding (workspaces)
import XMonad.Actions.GridSelect
import XMonad.Hooks.DynamicLog
import XMonad.Hooks.ManageDocks
import XMonad.Layout.Fullscreen
import XMonad.Layout.Hidden
import XMonad.Layout.Mosaic
import XMonad.Layout.Reflect
import XMonad.Layout.Spiral
import XMonad.StackSet hiding (filter)
import XMonad.Util.Brightness
import XMonad.Util.Keyboard
import XMonad.Util.MediaKeys
import XMonad.Util.NamedWindows
import XMonad.Util.Run
import XMonad.Util.Volume
vConfig :: IO ()
vConfig = xmonad . config =<< spawnPipe "xmobar"
where config = myConfig
myConfig xmproc = fullscreenSupport $ docks $ def { terminal = "alacritty"
, keys = newKeys
, layoutHook = myLayout
, logHook = vLogHook xmproc
, manageHook = myManageHook <+> manageDocks
, handleEventHook = docksEventHook
, startupHook = docksStartupHook }
musicString :: X String
musicString = do
winset <- gets windowset
wt <- maybe (pure "") (fmap show . getName) . fmap snd . listToMaybe $ zip ((map tag . workspaces) winset) (allWindows winset)
pure . xmobarColor "green" "black" . take 40 $ wt
vLogHook xmproc = musicString >>= \m -> dynamicLogWithPP xmobarPP { ppOutput = hPutStrLn xmproc
, ppTitle = const m
, ppLayout = const ""
, ppHiddenNoWindows = id
, ppHidden = xmobarColor "darkorange" "black"
, ppVisible = xmobarColor "yellow" "black"
}
myManageHook :: Query (Endo WindowSet)
myManageHook = composeAll [ className =? "Gimp-2.8" --> doFloat
, resource =? "spotify" --> doF (shift "5")
, className =? "Firefox" --> doF (shift "5")
, className =? "google-chrome" --> doF (shift "3")
, resource =? "crx_bikioccmkafdpakkkcpdbppfkghcmihk" --> doF (shift "7")
, resource =? "crx_bgkodfmeijboinjdegggmkbkjfiagaan" --> doF (shift "7")
, resource =? "launcher" --> doFloat
, resource =? "qemu-system-arm" --> doFloat
, className =? "libreoffice-writer" --> doFloat
, className =? "Gimp" --> doFloat
, className =? "keepassx" --> doFloat
, className =? "xviewer" --> doFloat
, className =? "qemu-system-x86_64" --> doFloat
]
myKeys :: XConfig t -> M.Map (KeyMask, KeySym) (X ())
myKeys XConfig {XMonad.modMask = modm} = mediaKeys . M.fromList $
[
((modm, xK_Up), raiseVolume 5)
, ((modm, xK_Down), lowerVolume 5)
, ((modm, xK_Delete), toggleMute)
, ((modm, xK_Page_Down), audioNext)
, ((modm, xK_Page_Up), audioPrev)
, ((modm, xK_Home), audioPlayPause)
--brightness
, ((modm, xK_Left), brighten (100))
, ((modm, xK_Right), brighten 100)
, ((modm, xK_q), spawn "spotify")
, ((modm .|. controlMask, xK_Return), spawn "gnome-terminal")
, ((modm .|. shiftMask, xK_n), spawn "google-chrome --profile-directory=Default --app-id=bikioccmkafdpakkkcpdbppfkghcmihk")
, ((modm, xK_p), spawn "$(yeganesh -x)")
, ((modm .|. shiftMask, xK_l), spawn "launcher")
--screenshots
, ((0, xK_Print), spawn "cd ~/.screenshots && scrot")
, ((modm .|. shiftMask, xK_End), spawn "shutdown now")
, ((controlMask, xK_End), spawn "slock")
, ((modm, xK_F1), setLang def)
, ((modm, xK_F2), setLang tibetan)
, ((modm, xK_F3), setLang accented)
, ((modm, xK_F4), setLang français)
, ((modm, xK_F5), setLang deutsch)
, ((modm, xK_F6), setLang anglisc)
, ((modm, xK_F7), setLang dansk)
, ((modm, xK_F9), setLang dzongkha)
, ((modm .|. shiftMask, xK_h), withFocused hide >> withFocused hideWindow)
, ((modm, xK_u), popNewestHiddenWindow >> withFocused reveal)
, ((modm, xK_g), goToSelected def)
, ((modm, xK_a), sendMessage Taller)
, ((modm, xK_s), sendMessage Wider)
, ((modm, xK_r), sendMessage Reset)
]
keysToRemove :: XConfig Layout -> M.Map (KeyMask, KeySym) (X ())
keysToRemove XConfig {XMonad.modMask = modm} = M.fromList
[ ((modm, xK_p), pure ()) ]
myLayout = (avoidStruts . hiddenWindows $ mosaic 1.33 (take 6 $ iterate (* (4 % 5)) 1) ||| normalPanes ||| reflectHoriz normalPanes ||| Full) ||| hiddenWindows (spiral (6/7))
where normalPanes = Tall 1 (3/100) (3/7)
newKeys :: XConfig Layout -> M.Map (KeyMask, KeySym) (X ())
newKeys x = myKeys x `M.union` (keys def x `M.difference` keysToRemove x)