Created
July 31, 2019 22:45
-
-
Save apoelstra/eba7d412e254d21c7ed29c0427ab1d73 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- 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