import System.IO
import System.Exit
import XMonad
import qualified Data.Map as M
import qualified XMonad.StackSet as W
import XMonad.Hooks.DynamicLog
import XMonad.Hooks.ManageDocks
import XMonad.Hooks.ManageHelpers
import XMonad.Hooks.EwmhDesktops
import XMonad.Config.Desktop
import XMonad.Util.Run
import XMonad.Layout.LayoutHints
import XMonad.Layout.Maximize
import XMonad.Layout.NoBorders
import XMonad.Layout.PerWorkspace
import XMonad.Layout.Reflect
import XMonad.Layout.ResizableTile
import XMonad.Layout.SimplestFloat
import XMonad.Layout.WindowNavigation
import XMonad.Actions.Navigation2D
--------------------------------------
-- Options
-- -------
myBorderWidth = 2
myModMask = mod1Mask
myNormalBorderColor = "#202020"
myFocusedBorderColor = "#819a67"
myTerminal = "termite -e /home/jake/scripts/tmux/new-session.sh"
myWorkspaces = ["tile","float","max", "xtra"]
-- Keybinds
-- --------
myKeys conf@(XConfig {XMonad.modMask = modm}) = M.fromList $
[ ((modm .|. shiftMask, xK_Return), spawn $ XMonad.terminal conf)
, ((modm, xK_p ), spawn "dmenu_run -p 'Run:'")
, ((modm .|. shiftMask, xK_c ), kill)
, ((modm, xK_space ), sendMessage NextLayout)
, ((modm .|. shiftMask, xK_space ), setLayout $ XMonad.layoutHook conf)
, ((modm, xK_Tab ), windows W.focusDown)
, ((modm, xK_j ), windowGo D False )
, ((modm, xK_k ), windowGo U False )
, ((modm, xK_l ), windowGo R False )
, ((modm, xK_h ), windowGo L False )
, ((modm, xK_Return), windows W.swapMaster)
, ((modm .|. shiftMask, xK_j ), windowSwap D False )
, ((modm .|. shiftMask, xK_k ), windowSwap U False )
, ((modm .|. shiftMask, xK_l ), windowSwap R False )
, ((modm .|. shiftMask, xK_h ), windowSwap L False )
, ((modm .|. controlMask, xK_h ), sendMessage Shrink)
, ((modm .|. controlMask, xK_l ), sendMessage Expand)
, ((modm, xK_t ), withFocused $ windows . W.sink)
, ((modm, xK_m ), withFocused (sendMessage . maximizeRestore))
, ((modm, xK_comma ), sendMessage (IncMasterN 1))
, ((modm, xK_period), sendMessage (IncMasterN (-1)))
, ((modm .|. shiftMask, xK_q ), io (exitWith ExitSuccess))
, ((modm .|. shiftMask, xK_r ), restart "xmonad" True)
, ((modm, xK_b ), sendMessage ToggleStruts)
, ((modm .|. controlMask, xK_j ), sendMessage MirrorShrink)
, ((modm .|. controlMask, xK_k ), sendMessage MirrorExpand)
-- Manual Movements
-- ------ ---------
, ((modm .|. controlMask, xK_Right), sendMessage $ Move R)
, ((modm .|. controlMask, xK_Left ), sendMessage $ Move L)
, ((modm .|. controlMask, xK_Up ), sendMessage $ Move U)
, ((modm .|. controlMask, xK_Down ), sendMessage $ Move D)
-- App Shortcuts
, ((mod4Mask .|. shiftMask, xK_Return), spawn "termite")
, ((mod4Mask, xK_w), spawn "termite -e /home/jake/scripts/weelaunch.sh")
, ((mod4Mask .|. shiftMask, xK_w), spawn "termite --profile=Writing -- vim -c Goyo -c Limelight")
, ((modm, xK_F10), spawn "/home/jake/scripts/nkjv/nkjv-menu.sh")
, ((modm, xK_F11), spawn "/home/jake/scripts/nkjv/nkjv-menu.sh md")
, ((modm, xK_F12), spawn "/home/jake/scripts/nkjv/nkjv-menu.sh marp")
]
++
[((m .|. modm, k), windows $ f i)
| (i, k) <- zip (XMonad.workspaces conf) [xK_1 .. xK_9]
, (f, m) <- [(W.greedyView, 0), (W.shift, shiftMask)]]
-- Multi monitor stuff?
-- ++
--[((m .|. modm, key), screenWorkspace sc >>= flip whenJust (windows . f))
-- | (key, sc) <- zip [xK_w, xK_e, xK_r] [0..]
--, (f, m) <- [(W.view, 0), (W.shift, shiftMask)]]
-- Mouse
-- -----
myMouseBindings (XConfig {XMonad.modMask = modMask}) = M.fromList $
[ ((modMask, button1), (\w -> focus w >> mouseMoveWindow w))
, ((modMask, button2), (\w -> focus w >> windows W.swapMaster))
, ((modMask, button3), (\w -> focus w >> mouseResizeWindow w))
]
myFocusFollowsMouse :: Bool
myFocusFollowsMouse = True
-- Layouts
-- -------
myLayout = smartBorders $ maximize ( lays )
where
tiled = ResizableTall 1 (1/100) (132/227) []
tiled2 = ResizableTall 1 (1/100) (1/2) []
w1 = onWorkspace "float" simplestFloat (tiled2)
w2 = reflectHoriz tiled
w3 = ResizableTall 2 (1/100) (55/100) []
lays = onWorkspace "max" Full (w1) ||| Mirror w3 ||| tiled
-- Kludges
-- -------
myManageHook = composeAll
[ className =? "feh" --> doFloat
, className =? "lxappearance" --> doFloat
, className =? "Xmessage" --> doFloat
, className =? "sxiv" --> doFloat
, className =? "Sxiv" --> doFloat
, resource =? "desktop_window" --> doIgnore
, isFullscreen --> doFullFloat ]
where unfloat = ask >>= doF . W.sink
-- Log, Startup
-- -------
myLogHook = return ()
myStartupHook = do
spawn "$HOME/.config/polybar/launch.sh xmonad"
-- spawn "nitrogen --restore"
-- XMobar PP
-- ------ --
-- myPP :: PP
-- myPP = defaultPP
-- { ppCurrent = xmobarColor "#7a8f65" ""
-- , ppSep = xmobarColor "#acacab" "" " // "
-- , ppLayout = xmobarColor "#658f8f" ""
-- , ppUrgent = xmobarColor "8f6f65" ""
-- , ppTitle = xmobarColor "#acacab" "" . pad }
-- Get Ready
-- --- -----
myconfig = desktopConfig {
terminal = myTerminal,
focusFollowsMouse = myFocusFollowsMouse,
borderWidth = myBorderWidth,
modMask = myModMask,
workspaces = myWorkspaces,
normalBorderColor = myNormalBorderColor,
focusedBorderColor = myFocusedBorderColor,
keys = myKeys,
mouseBindings = myMouseBindings,
layoutHook = desktopLayoutModifiers $ myLayout,
manageHook = myManageHook
<+> manageDocks <+> manageHook desktopConfig,
logHook = myLogHook,
handleEventHook = handleEventHook desktopConfig <+> fullscreenEventHook,
startupHook = myStartupHook <+> startupHook desktopConfig
}
-- Make it rain
-- ---- -- ----
main = do
-- xmobar <- spawnPipe "xmobar"
xmonad $ ewmh $ myconfig
-- { logHook = dynamicLogWithPP $ myPP { ppOutput = hPutStrLn xmobar } }