Skip to content

Instantly share code, notes, and snippets.

@apoelstra
Created July 31, 2019 22:45
Show Gist options
  • Save apoelstra/eba7d412e254d21c7ed29c0427ab1d73 to your computer and use it in GitHub Desktop.
Save apoelstra/eba7d412e254d21c7ed29c0427ab1d73 to your computer and use it in GitHub Desktop.
-- Imports --
import System.IO
import System.Process
import System.Posix.IO
-- XMonad
import XMonad
import XMonad.Core
import qualified XMonad.StackSet as W
import XMonad.Util.Run(spawnPipe, runProcessWithInput)
import XMonad.Util.EZConfig
-- Layout
import XMonad.Layout.Groups.Wmii
import XMonad.Layout.SimpleDecoration
-- Actions
import XMonad.Actions.CycleWS
import XMonad.Actions.OnScreen
import XMonad.Actions.UpdatePointer
-- Hooks
import XMonad.Hooks.DebugStack
import XMonad.Hooks.DynamicLog
import XMonad.Hooks.ManageDocks
import XMonad.Hooks.ManageHelpers
-- Main --
main = do
-- hack from geekosaur to get stderr to a readable place
closeFd 2 >> openFd ".xsession-errors" WriteOnly (Just 0644) defaultFileFlags
-- regular code
xmproc1 <- spawnPipe "xmobar -x 0"
xmproc2 <- spawnPipe "xmobar -x 1"
xmproc3 <- spawnPipe "xmobar -x 2"
xmonad $ def
{ manageHook = manageHook'
, layoutHook = layoutHook'
, terminal = terminal_cmd
, modMask = mod4Mask
-- xmobar
, logHook = dynamicLogWithPP xmobarPP
{ ppOutput = \a -> do hPutStrLn xmproc1 a
hPutStrLn xmproc2 a
hPutStrLn xmproc3 a
, ppLayout = \s -> []
, ppHidden = xmobarColor "#D0D0D0" "" . id
, ppHiddenNoWindows = xmobarColor "#808080" "" . id
, ppTitle = xmobarColor "green" "" . shorten 120
} >> (local (\c -> c { mouseFocused = False }) $ updatePointer (0.5, 0.5) (0, 0))
-- workspace setup
, workspaces = workspaces'
, focusFollowsMouse = False -- interacts poorly with wmii
, handleEventHook = docksEventHook
-- extra
, borderWidth = 5
} `additionalKeysP` keys'
-- Hooks --
manageHook' :: ManageHook
manageHook' = manageDocks
<+> (isFullscreen --> doFullFloat)
<+> manageHook def
layoutHook' = avoidStruts $ wmii shrinkText sdTheme
-- Setup --
terminal_cmd :: String
terminal_cmd = "urxvt -pe selection-to-clipboard"
secondDisplay :: X ScreenId
thirdDisplay = io $ do
s <- runProcessWithInput "/home/apoelstra/.xmonad/monitor-count.sh" [] ""
let n = read s
let n_adjust = if n == 1 then 0
else 1
return (S n_adjust)
thirdDisplay :: X ScreenId
secondDisplay = io $ do
s <- runProcessWithInput "/home/apoelstra/.xmonad/monitor-count.sh" [] ""
let n = read s
let n_adjust = n - 1
return (S n_adjust)
-- Looks --
-- workspaces
workspaces' :: [WorkspaceId]
workspaces' = ["1", "2", "3", "4", "5",
"6", "7", "8", "9", "10",
"11", "12" ]
chooseScreen :: WorkspaceId -> X ScreenId
chooseScreen id | id == "1" = thirdDisplay
| id == "2" = do thirdDisplay
| id == "3" = do thirdDisplay
| id == "4" = thirdDisplay
| id == "5" = thirdDisplay
| id == "6" = do secondDisplay
| id == "7" = do secondDisplay
| id == "8" = do secondDisplay
| id == "9" = do secondDisplay
| id == "10" = do secondDisplay
| id == "11" = do return 0
| id == "12" = do return 0
viewOnSecond :: WorkspaceId -> X ()
viewOnSecond = \tag -> (chooseScreen tag)
>>= (return . viewOnScreen)
>>= (\fn -> windows (fn tag))
-- decorations
sdTheme = def
{ activeColor = "#284880"
, activeTextColor = "#E0E0D0"
, activeBorderColor = "#333344"
, inactiveColor = "#222222"
, inactiveTextColor = "#E0E0D0"
, inactiveBorderColor = "#333300"
}
-- Keybindings
-- keys
keys' = [ -- wmii keybindings
-- group modes
("M-m", groupToFullLayout)
, ("M-s", groupToTabbedLayout)
, ("M-d", groupToVerticalLayout)
, ("M-f", toggleGroupFull)
-- window resizing
, ("M-[", zoomGroupOut)
, ("M-]", zoomGroupIn)
-- window movement
, ("M-<Space>", toggleFocusFloat)
, ("M-j", focusDown)
, ("M-k", focusUp)
, ("S-M-j", swapDown)
, ("S-M-k", swapUp)
, ("M-h", focusGroupUp)
, ("M-l", focusGroupDown)
, ("S-M-h", moveToGroupUp False)
, ("S-M-l", moveToGroupDown False)
-- override numbers since default behaviour (switch to workspace on laptop screen) is surprising
, ("M-1", spawn $ "echo")
, ("M-2", spawn $ "echo")
, ("M-3", spawn $ "echo")
, ("M-4", spawn $ "echo")
, ("M-5", spawn $ "echo")
, ("M-6", spawn $ "echo")
, ("M-7", spawn $ "echo")
, ("M-8", spawn $ "echo")
, ("M-9", spawn $ "echo")
, ("M-0", spawn $ "echo")
-- misc
, ("M-<Tab>", nextScreen)
, ("M-`", spawn "idevicediagnostics restart")
, ("S-M-<Delete>", spawn "touch /tmp/.cancel-shutdown")
, ("S-M-<Return>", spawn $ terminal_cmd ++ " -fn " ++ "-*-terminus-medium-*-*-*-14-*-*-*-*-*-*-*")
, ("M-<Return>", spawn $ terminal_cmd)
, ("S-M-c", kill)
, ("M-q", spawn $ "xmonad --recompile && xmonad --restart")
-- add keybindings here
] ++
[ (shiftKey ++ "M-" ++ key, action tag)
| (tag, key) <- zip workspaces' ["<F1>", "<F2>", "<F3>", "<F4>", "<F5>",
"<F6>", "<F7>", "<F8>", "<F9>", "<F10>",
"<F11>", "<F12>"
]
, (shiftKey, action) <- [
("", viewOnSecond),
("S-", windows . W.shift)
]
]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment