1
0
Fork 0
mirror of https://gitlab.com/dwt1/dotfiles.git synced 2023-02-13 20:55:19 -05:00
dwt1--dotfiles/.xmonad/xmonad.hs

626 lines
29 KiB
Haskell
Raw Normal View History

2019-03-09 18:52:05 -05:00
-- The xmonad configuration of Derek Taylor (DistroTube)
2020-05-22 01:14:58 -04:00
-- My YouTube: http://www.youtube.com/c/DistroTube
-- My GitLab: http://www.gitlab.com/dwt1/
-- For more information on Xmonad, visit: https://xmonad.org
2019-02-25 21:18:34 -05:00
2019-02-13 10:40:35 -05:00
------------------------------------------------------------------------
2020-05-22 01:14:58 -04:00
-- IMPORTS
2019-02-13 10:40:35 -05:00
------------------------------------------------------------------------
2019-01-15 16:27:01 -05:00
-- Base
import XMonad
import System.IO (hPutStrLn)
import System.Exit (exitSuccess)
import qualified XMonad.StackSet as W
-- Prompt
import XMonad.Prompt
2020-05-27 14:02:54 -04:00
import XMonad.Prompt.Input
import XMonad.Prompt.Man
2020-05-21 13:13:45 -04:00
import XMonad.Prompt.Pass
import XMonad.Prompt.Shell (shellPrompt)
import XMonad.Prompt.Ssh
2020-05-21 22:39:36 -04:00
import XMonad.Prompt.XMonad
2020-05-24 22:27:19 -04:00
import Control.Arrow (first)
-- Data
2020-05-27 14:02:54 -04:00
import Data.Char (isSpace)
import Data.List
import Data.Monoid
import Data.Maybe (isJust)
2020-05-21 13:13:45 -04:00
import qualified Data.Map as M
2019-01-15 16:27:01 -05:00
-- Utilities
2020-05-24 22:27:19 -04:00
import XMonad.Util.EZConfig (additionalKeysP)
2019-02-25 23:08:15 -05:00
import XMonad.Util.NamedScratchpad
2020-05-27 14:02:54 -04:00
import XMonad.Util.Run (runProcessWithInput, safeSpawn, spawnPipe)
2019-01-15 16:27:01 -05:00
import XMonad.Util.SpawnOnce
-- Hooks
2020-05-24 22:27:19 -04:00
import XMonad.Hooks.DynamicLog (dynamicLogWithPP, wrap, xmobarPP, xmobarColor, shorten, PP(..))
2020-06-06 19:40:47 -04:00
import XMonad.Hooks.ManageDocks (avoidStruts, docksEventHook, manageDocks, ToggleStruts(..))
2020-05-24 22:27:19 -04:00
import XMonad.Hooks.ManageHelpers (isFullscreen, doFullFloat)
2020-06-06 19:40:47 -04:00
import XMonad.Hooks.ServerMode
2019-01-15 16:27:01 -05:00
import XMonad.Hooks.SetWMName
2020-05-30 13:30:29 -04:00
import XMonad.Hooks.EwmhDesktops -- for some fullscreen events, also for xcomposite in obs.
2019-01-15 16:27:01 -05:00
-- Actions
2020-05-24 22:27:19 -04:00
import XMonad.Actions.CopyWindow (kill1, killAllOtherCopies)
import XMonad.Actions.CycleWS (moveTo, shiftTo, WSType(..), nextScreen, prevScreen)
2020-02-17 01:07:06 -05:00
import XMonad.Actions.GridSelect
2019-01-15 16:27:01 -05:00
import XMonad.Actions.MouseResize
import XMonad.Actions.Promote
import XMonad.Actions.RotSlaves (rotSlavesDown, rotAllDown)
import XMonad.Actions.WindowGo (runOrRaise)
import XMonad.Actions.WithAll (sinkAll, killAll)
import qualified XMonad.Actions.Search as S
2019-01-15 16:27:01 -05:00
-- Layouts modifiers
2020-06-06 19:40:47 -04:00
import XMonad.Layout.Decoration
2020-05-30 12:49:58 -04:00
import XMonad.Layout.LayoutModifier
2019-01-15 16:27:01 -05:00
import XMonad.Layout.LimitWindows (limitWindows, increaseLimit, decreaseLimit)
import XMonad.Layout.MultiToggle (mkToggle, single, EOT(EOT), Toggle(..), (??))
import XMonad.Layout.MultiToggle.Instances (StdTransformers(NBFULL, MIRROR, NOBORDERS))
2020-05-30 13:30:29 -04:00
import XMonad.Layout.NoBorders
import XMonad.Layout.Reflect (REFLECTX(..), REFLECTY(..))
import XMonad.Layout.Renamed (renamed, Rename(Replace))
import XMonad.Layout.Spacing
2020-06-06 19:40:47 -04:00
import XMonad.Layout.Tabbed
2020-05-30 13:30:29 -04:00
import XMonad.Layout.WindowArranger (windowArrange, WindowArrangerMsg(..))
2019-01-15 16:27:01 -05:00
import qualified XMonad.Layout.ToggleLayouts as T (toggleLayouts, ToggleLayout(Toggle))
-- Layouts
import XMonad.Layout.GridVariants (Grid(Grid))
2020-05-30 13:30:29 -04:00
import XMonad.Layout.SimplestFloat
import XMonad.Layout.Spiral
2019-01-15 16:27:01 -05:00
import XMonad.Layout.ResizableTile
2020-05-30 13:30:29 -04:00
import XMonad.Layout.ThreeColumns
2020-06-06 19:40:47 -04:00
import XMonad.Layout.ZoomRow (zoomReset, ZoomMessage(ZoomFullToggle))
2019-01-15 16:27:01 -05:00
2019-02-13 10:40:35 -05:00
------------------------------------------------------------------------
2020-05-22 01:14:58 -04:00
-- VARIABLES
2019-02-13 10:40:35 -05:00
------------------------------------------------------------------------
2020-05-24 22:27:19 -04:00
myFont :: [Char]
myFont = "xft:Mononoki Nerd Font:bold:pixelsize=13"
2020-05-24 22:27:19 -04:00
myModMask :: KeyMask
myModMask = mod4Mask -- Sets modkey to super/windows key
myTerminal :: [Char]
myTerminal = "alacritty" -- Sets default terminal
myBorderWidth :: Dimension
myBorderWidth = 2 -- Sets border width for windows
myNormColor :: [Char]
myNormColor = "#292d3e" -- Border color of normal windows
myFocusColor :: [Char]
myFocusColor = "#bbc5ff" -- Border color of focused windows
altMask :: KeyMask
altMask = mod1Mask -- Setting this for use in xprompts
windowCount :: X (Maybe String)
windowCount = gets $ Just . show . length . W.integrate' . W.stack . W.workspace . W.current . windowset
2019-01-15 16:27:01 -05:00
2019-02-13 10:40:35 -05:00
------------------------------------------------------------------------
2020-05-22 01:14:58 -04:00
-- AUTOSTART
2019-02-13 10:40:35 -05:00
------------------------------------------------------------------------
2020-05-30 12:49:58 -04:00
myStartupHook :: X ()
2019-01-15 16:27:01 -05:00
myStartupHook = do
spawnOnce "nitrogen --restore &"
2020-05-16 00:04:18 -04:00
spawnOnce "picom &"
spawnOnce "nm-applet &"
spawnOnce "volumeicon &"
spawnOnce "trayer --edge top --align right --widthtype request --padding 6 --SetDockType true --SetPartialStrut true --expand true --monitor 1 --transparent true --alpha 0 --tint 0x292d3e --height 18 &"
spawnOnce "emacs --daemon &"
-- spawnOnce "kak -d -s mysession &"
2019-01-15 16:27:01 -05:00
setWMName "LG3D"
2020-02-17 01:07:06 -05:00
------------------------------------------------------------------------
2020-05-22 01:14:58 -04:00
-- GRID SELECT
2020-02-17 01:07:06 -05:00
------------------------------------------------------------------------
myColorizer :: Window -> Bool -> X (String, String)
myColorizer = colorRangeFromClassName
(0x29,0x2d,0x3e) -- lowest inactive bg
(0x29,0x2d,0x3e) -- highest inactive bg
(0xc7,0x92,0xea) -- active bg
2020-02-17 01:07:06 -05:00
(0xc0,0xa7,0x9a) -- inactive fg
(0x29,0x2d,0x3e) -- active fg
2020-02-17 01:07:06 -05:00
-- gridSelect menu layout
2020-05-24 22:27:19 -04:00
mygridConfig :: p -> GSConfig Window
2020-02-17 01:07:06 -05:00
mygridConfig colorizer = (buildDefaultGSConfig myColorizer)
{ gs_cellheight = 40
, gs_cellwidth = 250
2020-02-17 01:07:06 -05:00
, gs_cellpadding = 8
, gs_originFractX = 0.5
, gs_originFractY = 0.5
, gs_font = myFont
}
2020-06-06 19:40:47 -04:00
2020-02-17 01:07:06 -05:00
spawnSelected' :: [(String, String)] -> X ()
spawnSelected' lst = gridselect conf lst >>= flip whenJust spawn
2020-05-24 22:27:19 -04:00
where conf = def
2020-02-17 01:07:06 -05:00
-- Set favorite apps for the spawnSelected'
myAppGrid :: [([Char], [Char])]
myAppGrid = [ ("Audacity", "audacity")
, ("Deadbeef", "deadbeef")
, ("Emacs", "emacs")
, ("Firefox", "firefox")
, ("Geany", "geany")
, ("Geary", "geary")
, ("Gimp", "gimp")
, ("Kdenlive", "kdenlive")
, ("LibreOffice Impress", "loimpress")
, ("LibreOffice Writer", "lowriter")
, ("OBS", "obs")
, ("PCManFM", "pcmanfm")
, ("Simple Terminal", "st")
, ("Steam", "steam")
, ("Surf Browser", "surf suckless.org")
, ("Xonotic", "xonotic-glx")
]
------------------------------------------------------------------------
-- XPROMPT SETTINGS
------------------------------------------------------------------------
dtXPConfig :: XPConfig
dtXPConfig = def
{ font = "xft:Mononoki Nerd Font:size=9"
, bgColor = "#292d3e"
, fgColor = "#d0d0d0"
, bgHLight = "#c792ea"
, fgHLight = "#000000"
, borderColor = "#535974"
, promptBorderWidth = 0
, promptKeymap = dtXPKeymap
, position = Top
-- , position = CenteredAt { xpCenterY = 0.3, xpWidth = 0.3 }
, height = 20
, historySize = 256
, historyFilter = id
, defaultText = []
, autoComplete = Just 100000 -- set Just 100000 for .1 sec
, showCompletionOnTab = False
, searchPredicate = isPrefixOf
, alwaysHighlight = True
, maxComplRows = Nothing -- set to Just 5 for 5 rows
}
-- The same config minus the autocomplete feature which is annoying on
-- certain Xprompts, like the search engine prompts.
dtXPConfig' :: XPConfig
dtXPConfig' = dtXPConfig
{ autoComplete = Nothing
}
-- A list of all of the standard Xmonad prompts
promptList :: [(String, XPConfig -> X ())]
promptList = [ ("m", manPrompt) -- manpages prompt
, ("p", passPrompt) -- get passwords (requires 'pass')
, ("g", passGeneratePrompt) -- generate passwords (requires 'pass')
, ("r", passRemovePrompt) -- remove passwords (requires 'pass')
, ("s", sshPrompt) -- ssh prompt
, ("x", xmonadPrompt) -- xmonad prompt
]
-- A list of my custom prompts
promptList' :: [(String, XPConfig -> String -> X (), String)]
promptList' = [ ("c", calcPrompt, "qalc") -- requires qalculate-gtk
]
------------------------------------------------------------------------
-- CUSTOM PROMPTS
------------------------------------------------------------------------
-- calcPrompt requires a cli calculator called qalcualte-gtk.
-- You could use this as a template for other custom prompts that
-- use command line programs that return a single line of output.
calcPrompt :: XPConfig -> String -> X ()
calcPrompt c ans =
inputPrompt c (trim ans) ?+ \input ->
liftIO(runProcessWithInput "qalc" [input] "") >>= calcPrompt c
where
trim = f . f
where f = reverse . dropWhile isSpace
------------------------------------------------------------------------
-- XPROMPT KEYMAP (emacs-like key bindings)
------------------------------------------------------------------------
dtXPKeymap :: M.Map (KeyMask,KeySym) (XP ())
dtXPKeymap = M.fromList $
2020-05-22 01:14:58 -04:00
map (first $ (,) controlMask) -- control + <key>
[ (xK_z, killBefore) -- kill line backwards
, (xK_k, killAfter) -- kill line fowards
, (xK_a, startOfLine) -- move to the beginning of the line
, (xK_e, endOfLine) -- move to the end of the line
, (xK_m, deleteString Next) -- delete a character foward
, (xK_b, moveCursor Prev) -- move cursor forward
, (xK_f, moveCursor Next) -- move cursor backward
, (xK_BackSpace, killWord Prev) -- kill the previous word
, (xK_y, pasteString) -- paste a string
, (xK_g, quit) -- quit out of prompt
, (xK_bracketleft, quit)
]
2020-05-22 01:14:58 -04:00
++
map (first $ (,) altMask) -- meta key + <key>
[ (xK_BackSpace, killWord Prev) -- kill the prev word
, (xK_f, moveWord Next) -- move a word forward
, (xK_b, moveWord Prev) -- move a word backward
, (xK_d, killWord Next) -- kill the next word
, (xK_n, moveHistory W.focusUp') -- move up thru history
, (xK_p, moveHistory W.focusDown') -- move down thru history
]
++
map (first $ (,) 0) -- <key>
[ (xK_Return, setSuccess True >> setDone True)
, (xK_KP_Enter, setSuccess True >> setDone True)
, (xK_BackSpace, deleteString Prev)
, (xK_Delete, deleteString Next)
, (xK_Left, moveCursor Prev)
, (xK_Right, moveCursor Next)
, (xK_Home, startOfLine)
, (xK_End, endOfLine)
, (xK_Down, moveHistory W.focusUp')
, (xK_Up, moveHistory W.focusDown')
, (xK_Escape, quit)
]
------------------------------------------------------------------------
-- SEARCH ENGINES
2020-06-06 19:40:47 -04:00
------------------------------------------------------------------------
-- Xmonad has several search engines available to use located in
-- XMonad.Actions.Search. Additionally, you can add other search engines
-- such as those listed below.
archwiki, ebay, news, reddit, urban :: S.SearchEngine
archwiki = S.searchEngine "archwiki" "https://wiki.archlinux.org/index.php?search="
ebay = S.searchEngine "ebay" "https://www.ebay.com/sch/i.html?_nkw="
news = S.searchEngine "news" "https://news.google.com/search?q="
reddit = S.searchEngine "reddit" "https://www.reddit.com/search/?q="
urban = S.searchEngine "urban" "https://www.urbandictionary.com/define.php?term="
-- This is the list of search engines that I want to use. Some are from
-- XMonad.Actions.Search, and some are the ones that I added above.
searchList :: [(String, S.SearchEngine)]
searchList = [ ("a", archwiki)
, ("d", S.duckduckgo)
, ("e", ebay)
, ("g", S.google)
, ("h", S.hoogle)
, ("i", S.images)
, ("n", news)
, ("r", reddit)
, ("s", S.stackage)
, ("t", S.thesaurus)
, ("v", S.vocabulary)
, ("b", S.wayback)
, ("u", urban)
, ("w", S.wikipedia)
, ("y", S.youtube)
, ("z", S.amazon)
]
2020-05-27 14:02:54 -04:00
2019-02-13 10:40:35 -05:00
------------------------------------------------------------------------
2020-05-22 01:14:58 -04:00
-- KEYBINDINGS
2019-02-13 10:40:35 -05:00
------------------------------------------------------------------------
-- I am using the Xmonad.Util.EZConfig module which allows keybindings
-- to be written in simpler, emacs-like format.
2020-05-24 22:27:19 -04:00
myKeys :: [([Char], X ())]
2019-01-15 16:27:01 -05:00
myKeys =
2020-02-17 00:15:06 -05:00
-- Xmonad
2019-02-25 21:18:34 -05:00
[ ("M-C-r", spawn "xmonad --recompile") -- Recompiles xmonad
, ("M-S-r", spawn "xmonad --restart") -- Restarts xmonad
, ("M-S-q", io exitSuccess) -- Quits xmonad
-- Run Prompt
, ("M-S-<Return>", shellPrompt dtXPConfig) -- Shell Prompt
2020-02-17 00:15:06 -05:00
-- Windows
2019-02-25 21:18:34 -05:00
, ("M-S-c", kill1) -- Kill the currently focused client
2020-06-06 19:40:47 -04:00
, ("M-S-a", killAll) -- Kill all windows on current workspace
2019-03-09 18:52:05 -05:00
2020-02-17 00:15:06 -05:00
-- Floating windows
2020-06-06 19:40:47 -04:00
, ("M-f", sendMessage (T.Toggle "floats")) -- Toggles my 'floats' layout
, ("M-<Delete>", withFocused $ windows . W.sink) -- Push floating window back to tile
, ("M-S-<Delete>", sinkAll) -- Push ALL floating windows to tile
2020-03-11 19:20:37 -04:00
2020-02-17 01:07:06 -05:00
-- Grid Select
, ("M-S-t", spawnSelected' myAppGrid) -- grid select favorite apps
2020-05-22 01:14:58 -04:00
, ("M-S-g", goToSelected $ mygridConfig myColorizer) -- goto selected
, ("M-S-b", bringSelected $ mygridConfig myColorizer) -- bring selected
2019-03-09 18:52:05 -05:00
2020-02-17 00:15:06 -05:00
-- Windows navigation
2020-06-06 19:40:47 -04:00
, ("M-m", windows W.focusMaster) -- Move focus to the master window
, ("M-j", windows W.focusDown) -- Move focus to the next window
, ("M-k", windows W.focusUp) -- Move focus to the prev window
--, ("M-S-m", windows W.swapMaster) -- Swap the focused window and the master window
, ("M-S-j", windows W.swapDown) -- Swap focused window with next window
, ("M-S-k", windows W.swapUp) -- Swap focused window with prev window
, ("M-<Backspace>", promote) -- Moves focused window to master, others maintain order
, ("M1-S-<Tab>", rotSlavesDown) -- Rotate all windows except master and keep focus in place
, ("M1-C-<Tab>", rotAllDown) -- Rotate all the windows in the current stack
--, ("M-S-s", windows copyToAll)
2019-02-25 21:18:34 -05:00
, ("M-C-s", killAllOtherCopies)
2019-01-15 16:27:01 -05:00
2019-02-25 21:18:34 -05:00
, ("M-C-M1-<Up>", sendMessage Arrange)
, ("M-C-M1-<Down>", sendMessage DeArrange)
, ("M-<Up>", sendMessage (MoveUp 10)) -- Move focused window to up
, ("M-<Down>", sendMessage (MoveDown 10)) -- Move focused window to down
, ("M-<Right>", sendMessage (MoveRight 10)) -- Move focused window to right
, ("M-<Left>", sendMessage (MoveLeft 10)) -- Move focused window to left
, ("M-S-<Up>", sendMessage (IncreaseUp 10)) -- Increase size of focused window up
, ("M-S-<Down>", sendMessage (IncreaseDown 10)) -- Increase size of focused window down
, ("M-S-<Right>", sendMessage (IncreaseRight 10)) -- Increase size of focused window right
, ("M-S-<Left>", sendMessage (IncreaseLeft 10)) -- Increase size of focused window left
, ("M-C-<Up>", sendMessage (DecreaseUp 10)) -- Decrease size of focused window up
, ("M-C-<Down>", sendMessage (DecreaseDown 10)) -- Decrease size of focused window down
, ("M-C-<Right>", sendMessage (DecreaseRight 10)) -- Decrease size of focused window right
, ("M-C-<Left>", sendMessage (DecreaseLeft 10)) -- Decrease size of focused window left
2019-01-15 16:27:01 -05:00
2020-02-17 00:15:06 -05:00
-- Layouts
2020-06-06 19:40:47 -04:00
, ("M-<Tab>", sendMessage NextLayout) -- Switch to next layout
, ("M-<Space>", sendMessage (Toggle NBFULL) >> sendMessage ToggleStruts) -- Toggles noborder/full
, ("M-S-<Space>", sendMessage ToggleStruts) -- Toggles struts
, ("M-S-n", sendMessage $ Toggle NOBORDERS) -- Toggles noborder
2019-02-25 21:18:34 -05:00
, ("M-S-x", sendMessage $ Toggle REFLECTX)
, ("M-S-y", sendMessage $ Toggle REFLECTY)
--, ("M-S-m", sendMessage $ Toggle MIRROR)
2020-06-06 19:40:47 -04:00
, ("M-<KP_Multiply>", sendMessage (IncMasterN 1)) -- Increase number of clients in master pane
, ("M-<KP_Divide>", sendMessage (IncMasterN (-1))) -- Decrease number of clients in master pane
, ("M-S-<KP_Multiply>", increaseLimit) -- Increase number of windows
, ("M-S-<KP_Divide>", decreaseLimit) -- Decrease number of windows
2019-01-15 16:27:01 -05:00
2020-03-11 19:20:37 -04:00
, ("M-h", sendMessage Shrink)
, ("M-l", sendMessage Expand)
2019-03-09 18:52:05 -05:00
, ("M-C-j", sendMessage MirrorShrink)
, ("M-C-k", sendMessage MirrorExpand)
2019-02-25 21:18:34 -05:00
, ("M-S-;", sendMessage zoomReset)
, ("M-;", sendMessage ZoomFullToggle)
2019-01-15 16:27:01 -05:00
2020-02-17 00:15:06 -05:00
-- Workspaces
2020-06-06 19:40:47 -04:00
, ("M-.", nextScreen) -- Switch focus to next monitor
, ("M-,", prevScreen) -- Switch focus to prev monitor
, ("M-S-<KP_Add>", shiftTo Next nonNSP >> moveTo Next nonNSP) -- Shifts focused window to next ws
, ("M-S-<KP_Subtract>", shiftTo Prev nonNSP >> moveTo Prev nonNSP) -- Shifts focused window to prev ws
2019-01-15 16:27:01 -05:00
2020-02-17 00:15:06 -05:00
-- Scratchpads
, ("M-C-<Return>", namedScratchpadAction myScratchPads "terminal")
, ("M-C-c", namedScratchpadAction myScratchPads "mocp")
2019-02-25 23:08:15 -05:00
-- Controls for mocp music player.
, ("M-u p", spawn "mocp --play")
, ("M-u l", spawn "mocp --next")
, ("M-u h", spawn "mocp --previous")
, ("M-u <Space>", spawn "mocp --toggle-pause")
-- Open My Preferred Terminal. I also run the FISH shell. Setting FISH as my default shell
2020-05-12 02:04:10 -04:00
-- breaks some things so I prefer to just launch "fish" when I open a terminal.
, ("M-<Return>", spawn (myTerminal ++ " -e fish"))
2020-05-24 22:27:19 -04:00
2020-02-17 01:07:06 -05:00
--- Dmenu Scripts (Alt+Ctr+Key)
--, ("M-S-<Return>", spawn "dmenu_run")
2020-02-17 01:07:06 -05:00
, ("M1-C-e", spawn "./.dmenu/dmenu-edit-configs.sh")
, ("M1-C-m", spawn "./.dmenu/dmenu-sysmon.sh")
2020-05-21 13:13:45 -04:00
--, ("M1-C-p", spawn "passmenu")
--, ("M1-C-s", spawn "./.dmenu/dmenu-surfraw.sh")
2020-02-17 01:07:06 -05:00
, ("M1-C-/", spawn "./.dmenu/dmenu-scrot.sh")
--- My Applications (Super+Alt+Key)
, ("M-M1-a", spawn (myTerminal ++ " -e ncpamixer"))
, ("M-M1-b", spawn ("surf www.youtube.com/c/DistroTube/"))
, ("M-M1-e", spawn (myTerminal ++ " -e neomutt"))
, ("M-M1-f", spawn (myTerminal ++ " -e sh ./.config/vifm/scripts/vifmrun"))
, ("M-M1-i", spawn (myTerminal ++ " -e irssi"))
, ("M-M1-j", spawn (myTerminal ++ " -e joplin"))
, ("M-M1-l", spawn (myTerminal ++ " -e lynx -cfg=~/.lynx/lynx.cfg -lss=~/.lynx/lynx.lss gopher://distro.tube"))
2020-06-06 19:40:47 -04:00
, ("M-M1-m", spawn (myTerminal ++ " -e mocp"))
2020-02-17 01:07:06 -05:00
, ("M-M1-n", spawn (myTerminal ++ " -e newsboat"))
, ("M-M1-p", spawn (myTerminal ++ " -e pianobar"))
, ("M-M1-r", spawn (myTerminal ++ " -e rtv"))
2020-06-06 19:40:47 -04:00
, ("M-M1-t", spawn (myTerminal ++ " -e toot curses"))
2020-02-17 01:07:06 -05:00
, ("M-M1-w", spawn (myTerminal ++ " -e wopr report.xml"))
, ("M-M1-y", spawn (myTerminal ++ " -e youtube-viewer"))
2020-02-17 00:15:06 -05:00
-- Multimedia Keys
2019-02-25 21:18:34 -05:00
, ("<XF86AudioPlay>", spawn "cmus toggle")
, ("<XF86AudioPrev>", spawn "cmus prev")
, ("<XF86AudioNext>", spawn "cmus next")
2019-01-15 16:27:01 -05:00
-- , ("<XF86AudioMute>", spawn "amixer set Master toggle") -- Bug prevents it from toggling correctly in 12.04.
, ("<XF86AudioLowerVolume>", spawn "amixer set Master 5%- unmute")
, ("<XF86AudioRaiseVolume>", spawn "amixer set Master 5%+ unmute")
2019-02-25 21:18:34 -05:00
, ("<XF86HomePage>", spawn "firefox")
, ("<XF86Search>", safeSpawn "firefox" ["https://www.google.com/"])
, ("<XF86Mail>", runOrRaise "geary" (resource =? "thunderbird"))
2019-02-25 21:18:34 -05:00
, ("<XF86Calculator>", runOrRaise "gcalctool" (resource =? "gcalctool"))
, ("<XF86Eject>", spawn "toggleeject")
, ("<Print>", spawn "scrotd 0")
]
-- Appending search engines to keybindings list
++ [("M-s " ++ k, S.promptSearch dtXPConfig' f) | (k,f) <- searchList ]
++ [("M-S-s " ++ k, S.selectSearch f) | (k,f) <- searchList ]
++ [("M-p " ++ k, f dtXPConfig') | (k,f) <- promptList ]
++ [("M-p " ++ k, f dtXPConfig' g) | (k,f,g) <- promptList' ]
-- Appending named scratchpads to keybindings list
where nonNSP = WSIs (return (\ws -> W.tag ws /= "nsp"))
nonEmptyNonNSP = WSIs (return (\ws -> isJust (W.stack ws) && W.tag ws /= "nsp"))
2019-01-15 16:27:01 -05:00
2019-02-13 10:40:35 -05:00
------------------------------------------------------------------------
2020-05-22 01:14:58 -04:00
-- WORKSPACES
2019-02-13 10:40:35 -05:00
------------------------------------------------------------------------
-- My workspaces are clickable meaning that the mouse can be used to switch
-- workspaces. This requires xdotool.
2019-01-15 16:27:01 -05:00
2020-05-24 22:27:19 -04:00
xmobarEscape :: [Char] -> [Char]
2019-01-15 16:27:01 -05:00
xmobarEscape = concatMap doubleLts
where
doubleLts '<' = "<<"
doubleLts x = [x]
myWorkspaces :: [String]
myWorkspaces = clickable . (map xmobarEscape)
2020-02-17 01:07:06 -05:00
$ ["dev", "www", "sys", "doc", "vbox", "chat", "mus", "vid", "gfx"]
2019-01-15 16:27:01 -05:00
where
clickable l = [ "<action=xdotool key super+" ++ show (n) ++ ">" ++ ws ++ "</action>" |
2020-02-17 01:07:06 -05:00
(i,ws) <- zip [1..9] l,
2019-01-15 16:27:01 -05:00
let n = i ]
------------------------------------------------------------------------
-- MANAGEHOOK
------------------------------------------------------------------------
-- Sets some rules for certain programs. Examples include forcing certain
-- programs to always float, or to always appear on a certain workspace.
-- Forcing programs to a certain workspace with a doShift requires xdotool
-- if you are using clickable workspaces. You need the className or title
-- of the program. Use xprop to get this info.
myManageHook :: XMonad.Query (Data.Monoid.Endo WindowSet)
myManageHook = composeAll
-- using 'doShift ( myWorkspaces !! 7)' sends program to workspace 8!
-- I'm doing it this way because otherwise I would have to write out
-- the full name of my clickable workspaces, which would look like:
-- doShift "<action xdotool super+8>gfx</action>"
[ className =? "obs" --> doShift ( myWorkspaces !! 7)
, title =? "firefox" --> doShift ( myWorkspaces !! 1)
, title =? "qutebrowser" --> doShift ( myWorkspaces !! 1)
, className =? "mpv" --> doShift ( myWorkspaces !! 7)
, className =? "vlc" --> doShift ( myWorkspaces !! 7)
, className =? "Gimp" --> doShift ( myWorkspaces !! 8)
, className =? "Gimp" --> doFloat
, title =? "Oracle VM VirtualBox Manager" --> doFloat
, className =? "Oracle VM VirtualBox Manager" --> doShift ( myWorkspaces !! 6)
, (className =? "firefox" <&&> resource =? "Dialog") --> doFloat -- Float Firefox Dialog
2019-02-25 23:08:15 -05:00
] <+> namedScratchpadManageHook myScratchPads
2019-01-15 16:27:01 -05:00
2019-02-13 10:40:35 -05:00
------------------------------------------------------------------------
-- LAYOUTS
2019-02-13 10:40:35 -05:00
------------------------------------------------------------------------
2020-05-30 12:49:58 -04:00
-- Makes setting the spacingRaw simpler to write. The spacingRaw
-- module adds a configurable amount of space around windows.
mySpacing :: Integer -> l a -> XMonad.Layout.LayoutModifier.ModifiedLayout Spacing l a
mySpacing i = spacingRaw False (Border i i i i) True (Border i i i i) True
2020-06-06 19:40:47 -04:00
-- Below is a variation of the above except no borders are applied
2020-05-30 12:49:58 -04:00
-- if fewer than two windows. So a single window has no gaps.
2020-06-06 19:40:47 -04:00
mySpacing' :: Integer -> l a -> XMonad.Layout.LayoutModifier.ModifiedLayout Spacing l a
2020-05-30 13:30:29 -04:00
mySpacing' i = spacingRaw True (Border i i i i) True (Border i i i i) True
2020-05-30 12:49:58 -04:00
2020-06-06 19:40:47 -04:00
-- The layouts that I use
2020-05-30 12:49:58 -04:00
tall = renamed [Replace "tall"]
$ limitWindows 12
$ mySpacing 8
$ ResizableTall 1 (3/100) (1/2) []
2020-05-30 13:30:29 -04:00
monocle = renamed [Replace "monocle"]
$ limitWindows 20
$ Full
floats = renamed [Replace "floats"]
$ limitWindows 20
$ simplestFloat
2020-05-30 12:49:58 -04:00
grid = renamed [Replace "grid"]
$ limitWindows 12
$ mySpacing 8
$ mkToggle (single MIRROR)
$ Grid (16/10)
2020-05-30 13:30:29 -04:00
spirals = renamed [Replace "spirals"]
2020-05-30 12:49:58 -04:00
$ mySpacing' 8
2020-05-30 13:30:29 -04:00
$ spiral (6/7)
threeCol = renamed [Replace "threeCol"]
$ limitWindows 7
$ mySpacing' 4
$ ThreeCol 1 (3/100) (1/2)
threeRow = renamed [Replace "threeRow"]
$ limitWindows 7
$ mySpacing' 4
-- Mirror takes a layout and rotates it by 90 degrees.
-- So we are applying Mirror to the ThreeCol layout.
2020-05-30 12:49:58 -04:00
$ Mirror
2020-05-30 13:30:29 -04:00
$ ThreeCol 1 (3/100) (1/2)
2020-06-06 19:40:47 -04:00
tabs = renamed [Replace "tabs"]
-- I cannot add spacing to this layout because it will
-- add spacing between window and tabs which looks bad.
$ tabbed shrinkText myTabConfig
where
myTabConfig = def { fontName = "xft:Mononoki Nerd Font:regular:pixelsize=11"
, activeColor = "#292d3e"
, inactiveColor = "#3e445e"
, activeBorderColor = "#292d3e"
, inactiveBorderColor = "#292d3e"
, activeTextColor = "#ffffff"
, inactiveTextColor = "#d0d0d0"
}
-- The layout hook
2020-05-30 12:49:58 -04:00
myLayoutHook = avoidStruts $ mouseResize $ windowArrange $ T.toggleLayouts floats $
mkToggle (NBFULL ?? NOBORDERS ?? EOT) $ myDefaultLayout
2020-05-30 12:49:58 -04:00
where
2020-06-06 19:40:47 -04:00
myDefaultLayout = tall ||| noBorders monocle ||| floats ||| grid ||| noBorders tabs ||| spirals ||| threeCol ||| threeRow
2019-01-15 16:27:01 -05:00
2019-02-25 23:08:15 -05:00
------------------------------------------------------------------------
-- SCRATCHPADS
2019-02-25 23:08:15 -05:00
------------------------------------------------------------------------
2020-05-24 22:27:19 -04:00
myScratchPads :: [NamedScratchpad]
myScratchPads = [ NS "terminal" spawnTerm findTerm manageTerm
, NS "mocp" spawnMocp findMocp manageMocp
]
where
2020-06-06 19:40:47 -04:00
spawnTerm = myTerminal ++ " -n scratchpad"
findTerm = resource =? "scratchpad"
manageTerm = customFloating $ W.RationalRect l t w h
where
h = 0.9
w = 0.9
t = 0.95 -h
l = 0.95 -w
spawnMocp = myTerminal ++ " -n mocp 'mocp'"
findMocp = resource =? "mocp"
manageMocp = customFloating $ W.RationalRect l t w h
where
h = 0.9
w = 0.9
t = 0.95 -h
l = 0.95 -w
------------------------------------------------------------------------
2020-05-22 01:14:58 -04:00
-- MAIN
------------------------------------------------------------------------
2020-05-24 22:27:19 -04:00
main :: IO ()
main = do
-- Launching three instances of xmobar on their monitors.
xmproc0 <- spawnPipe "xmobar -x 0 /home/dt/.config/xmobar/xmobarrc0"
xmproc1 <- spawnPipe "xmobar -x 1 /home/dt/.config/xmobar/xmobarrc2"
xmproc2 <- spawnPipe "xmobar -x 2 /home/dt/.config/xmobar/xmobarrc1"
-- the xmonad, ya know...what the WM is named after!
2020-06-06 19:40:47 -04:00
xmonad $ ewmh def
{ manageHook = ( isFullscreen --> doFullFloat ) <+> myManageHook <+> manageDocks
-- Run xmonad commands from command line with "xmonadctl command". Commands include:
-- shrink, expand, next-layout, default-layout, restart-wm, xterm, kill, refresh, run,
-- focus-up, focus-down, swap-up, swap-down, swap-master, sink, quit-wm. You can run
-- "xmonadctl 0" to generate full list of commands written to ~/.xsession-errors.
, handleEventHook = serverModeEventHookCmd
<+> serverModeEventHook
<+> serverModeEventHookF "XMONAD_PRINT" (io . putStrLn)
<+> docksEventHook
2020-05-21 22:39:36 -04:00
, modMask = myModMask
, terminal = myTerminal
, startupHook = myStartupHook
, layoutHook = myLayoutHook
, workspaces = myWorkspaces
, borderWidth = myBorderWidth
2020-05-22 01:14:58 -04:00
, normalBorderColor = myNormColor
, focusedBorderColor = myFocusColor
, logHook = dynamicLogWithPP xmobarPP
{ ppOutput = \x -> hPutStrLn xmproc0 x >> hPutStrLn xmproc1 x >> hPutStrLn xmproc2 x
, ppCurrent = xmobarColor "#c3e88d" "" . wrap "[" "]" -- Current workspace in xmobar
, ppVisible = xmobarColor "#c3e88d" "" -- Visible but not current workspace
, ppHidden = xmobarColor "#82AAFF" "" . wrap "*" "" -- Hidden workspaces in xmobar
, ppHiddenNoWindows = xmobarColor "#F07178" "" -- Hidden workspaces (no windows)
, ppTitle = xmobarColor "#d0d0d0" "" . shorten 60 -- Title of active window in xmobar
, ppSep = "<fc=#666666> | </fc>" -- Separators in xmobar
, ppUrgent = xmobarColor "#C45500" "" . wrap "!" "!" -- Urgent workspace
, ppExtras = [windowCount] -- # of windows current workspace
, ppOrder = \(ws:l:t:ex) -> [ws,l]++ex++[t]
}
2020-05-22 01:14:58 -04:00
} `additionalKeysP` myKeys