packages feed

ymonad-0.1.0.0: src/YMonad/Config.hs

module YMonad.Config (
  YAction (..),
  YConfig (..),
  def,
  defaultKeys,
) where

import Data.Bits ((.|.))
import Data.Map.Strict qualified as M

import YMonad.Core.Common (Dimension (..), TitleBarMode (..))
import YMonad.Core.Layout (Layout, full, mirror, tall, (|||))
import YMonad.Keys
import YMonad.Prompt (YPConfig)

data YAction
  = Spawn String
  | ToggleFullscreen
  | ViewWorkspace String
  | MoveFocusedTo String
  | FocusNext
  | FocusPrev
  | SwapNext
  | SwapPrev
  | KillFocused
  | CycleLayout
  | ShrinkMaster
  | ExpandMaster
  | IncMasterNBy Int
  | ExitSession
  | RecompileRestart
  | ShellPrompt YPConfig
  | SafePrompt FilePath YPConfig
  | UnsafePrompt FilePath YPConfig
  | SshPrompt YPConfig
  | ManPrompt YPConfig
  deriving stock (Eq, Ord, Show)

data YConfig = YConfig
  { terminal :: String
  , modMask :: KeyMask
  , workspaces :: [String]
  , layoutHook :: Layout
  , borderWidth :: Dimension
  , normalBorderColor :: String
  , focusedBorderColor :: String
  , titleBarMode :: TitleBarMode
  , keys :: YConfig -> Map (KeyMask, KeySym) YAction
  }

def :: YConfig
def =
  YConfig
    { terminal = "foot"
    , modMask = mod1Mask
    , workspaces = map show [(1 :: Int) .. 9]
    , layoutHook = tall ||| mirror tall ||| full
    , borderWidth = 1
    , normalBorderColor = "#dddddd"
    , focusedBorderColor = "#ff0000"
    , titleBarMode = NoTitleBar
    , keys = defaultKeys
    }

defaultKeys :: YConfig -> Map (KeyMask, KeySym) YAction
defaultKeys conf =
  M.fromList (baseBindings ++ workspaceBindings)
  where
    modm = modMask conf
    baseBindings =
      [ ((modm .|. shiftMask, xK_Return), Spawn (terminal conf))
      , ((modm, xK_Return), ToggleFullscreen)
      , ((modm, xK_space), CycleLayout)
      , ((modm, xK_Tab), FocusPrev)
      , ((modm, xK_j), FocusPrev)
      , ((modm .|. shiftMask, xK_Tab), FocusNext)
      , ((modm, xK_ISO_Left_Tab), FocusNext)
      , ((modm .|. shiftMask, xK_ISO_Left_Tab), FocusNext)
      , ((modm, xK_k), FocusNext)
      , ((modm .|. shiftMask, xK_j), SwapPrev)
      , ((modm .|. shiftMask, xK_k), SwapNext)
      , ((modm, xK_h), ShrinkMaster)
      , ((modm, xK_l), ExpandMaster)
      , ((modm, xK_comma), IncMasterNBy 1)
      , ((modm, xK_period), IncMasterNBy (-1))
      , ((modm .|. shiftMask, xK_c), KillFocused)
      , ((modm, xK_q), ExitSession)
      , ((modm .|. shiftMask, xK_q), RecompileRestart)
      ]
    workspaceBindings = concatMap mkWorkspaceBinding (zip workspaceKeys (workspaces conf))
    mkWorkspaceBinding (key, workspaceName) =
      [ ((modm, key), ViewWorkspace workspaceName)
      , ((modm .|. shiftMask, key), MoveFocusedTo workspaceName)
      ]
    workspaceKeys = [xK_1, xK_2, xK_3, xK_4, xK_5, xK_6, xK_7, xK_8, xK_9]