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

540 lines
26 KiB
Haskell
Raw Normal View History

2021-04-21 15:32:19 -04:00
-- Base
2019-01-15 16:27:01 -05:00
import XMonad
2020-12-17 02:05:21 -05:00
import System.Directory
import System.IO (hPutStrLn)
import System.Exit (exitSuccess)
import qualified XMonad.StackSet as W
-- Actions
2021-04-28 13:15:17 -04:00
import XMonad.Actions.CopyWindow (kill1, killAllOtherCopies, copyWindow)
2021-04-14 00:56:09 -04:00
import XMonad.Actions.CycleWS (Direction1D(..), moveTo, shiftTo, WSType(..), nextScreen, prevScreen)
import XMonad.Actions.GridSelect
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
-- Data
2020-11-12 17:57:50 -05:00
import Data.Char (isSpace, toUpper)
2021-02-26 01:10:02 -05:00
import Data.Maybe (fromJust)
import Data.Monoid
import Data.Maybe (isJust)
import Data.Tree
import qualified Data.Map as M
2019-01-15 16:27:01 -05:00
-- Hooks
2020-05-24 22:27:19 -04:00
import XMonad.Hooks.DynamicLog (dynamicLogWithPP, wrap, xmobarPP, xmobarColor, shorten, PP(..))
import XMonad.Hooks.EwmhDesktops -- for some fullscreen events, also for xcomposite in obs.
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
import XMonad.Hooks.WorkspaceHistory
2019-01-15 16:27:01 -05:00
-- Layouts
2021-04-20 18:54:29 -04:00
import XMonad.Layout.Accordion
import XMonad.Layout.GridVariants (Grid(Grid))
import XMonad.Layout.SimplestFloat
import XMonad.Layout.Spiral
import XMonad.Layout.ResizableTile
import XMonad.Layout.Tabbed
import XMonad.Layout.ThreeColumns
-- Layouts modifiers
import XMonad.Layout.LayoutModifier
import XMonad.Layout.LimitWindows (limitWindows, increaseLimit, decreaseLimit)
import XMonad.Layout.Magnifier
import XMonad.Layout.MultiToggle (mkToggle, single, EOT(EOT), (??))
import XMonad.Layout.MultiToggle.Instances (StdTransformers(NBFULL, MIRROR, NOBORDERS))
import XMonad.Layout.NoBorders
2020-11-12 17:57:50 -05:00
import XMonad.Layout.Renamed
import XMonad.Layout.ShowWName
2020-11-12 17:57:50 -05:00
import XMonad.Layout.Simplest
import XMonad.Layout.Spacing
2020-11-12 17:57:50 -05:00
import XMonad.Layout.SubLayouts
import XMonad.Layout.WindowArranger (windowArrange, WindowArrangerMsg(..))
import qualified XMonad.Layout.ToggleLayouts as T (toggleLayouts, ToggleLayout(Toggle))
import qualified XMonad.Layout.MultiToggle as MT (Toggle(..))
2020-10-23 21:39:58 -04:00
-- Utilities
2021-04-12 19:56:03 -04:00
import XMonad.Util.Dmenu
import XMonad.Util.EZConfig (additionalKeysP)
import XMonad.Util.NamedScratchpad
import XMonad.Util.Run (runProcessWithInput, safeSpawn, spawnPipe)
import XMonad.Util.SpawnOnce
2019-01-15 16:27:01 -05:00
myFont :: String
2020-12-15 18:16:29 -05:00
myFont = "xft:SauceCodePro Nerd Font Mono:regular:size=9:antialias=true:hinting=true"
myModMask :: KeyMask
2021-04-14 00:56:09 -04:00
myModMask = mod4Mask -- Sets modkey to super/windows key
myTerminal :: String
2021-04-14 00:56:09 -04:00
myTerminal = "alacritty" -- Sets default terminal
myBrowser :: String
2021-04-14 00:56:09 -04:00
myBrowser = "qutebrowser " -- Sets qutebrowser as browser
myEmacs :: String
myEmacs = "emacsclient -c -a 'emacs' " -- Makes emacs keybindings easier to type
myEditor :: String
myEditor = "emacsclient -c -a 'emacs' " -- Sets emacs as editor
2021-04-14 00:56:09 -04:00
-- myEditor = myTerminal ++ " -e vim " -- Sets vim as editor
myBorderWidth :: Dimension
2021-04-14 00:56:09 -04:00
myBorderWidth = 2 -- Sets border width for windows
myNormColor :: String
2021-04-14 00:56:09 -04:00
myNormColor = "#282c34" -- Border color of normal windows
myFocusColor :: String
2021-04-14 00:56:09 -04:00
myFocusColor = "#46d9ff" -- Border color of focused windows
windowCount :: X (Maybe String)
windowCount = gets $ Just . show . length . W.integrate' . W.stack . W.workspace . W.current . windowset
2020-05-30 12:49:58 -04:00
myStartupHook :: X ()
2019-01-15 16:27:01 -05:00
myStartupHook = do
2021-04-21 17:38:06 -04:00
spawnOnce "lxsession &"
spawnOnce "picom &"
spawnOnce "nm-applet &"
spawnOnce "volumeicon &"
spawnOnce "conky -c $HOME/.config/conky/xmonad.conkyrc"
spawnOnce "trayer --edge top --align right --widthtype request --padding 6 --SetDockType true --SetPartialStrut true --expand true --monitor 1 --transparent true --alpha 0 --tint 0x282c34 --height 22 &"
spawnOnce "/usr/bin/emacs --daemon &" -- emacs daemon for the emacsclient
-- spawnOnce "kak -d -s mysession &" -- kakoune daemon for better performance
-- spawnOnce "urxvtd -q -o -f &" -- urxvt daemon for better performance
spawnOnce "xargs xwallpaper --stretch < ~/.xwallpaper" -- set last saved with xwallpaper
-- spawnOnce "/bin/ls ~/wallpapers | shuf -n 1 | xargs xwallpaper --stretch" -- set random xwallpaper
-- spawnOnce "~/.fehbg &" -- set last saved feh wallpaper
-- spawnOnce "feh --randomize --bg-fill ~/wallpapers/*" -- feh set random wallpaper
-- spawnOnce "nitrogen --restore &" -- if you prefer nitrogen to feh
setWMName "LG3D"
2019-01-15 16:27:01 -05:00
myColorizer :: Window -> Bool -> X (String, String)
myColorizer = colorRangeFromClassName
2020-09-29 17:28:27 -04:00
(0x28,0x2c,0x34) -- lowest inactive bg
(0x28,0x2c,0x34) -- highest inactive bg
(0xc7,0x92,0xea) -- active bg
(0xc0,0xa7,0x9a) -- inactive fg
2020-09-29 17:28:27 -04:00
(0x28,0x2c,0x34) -- active fg
-- gridSelect menu layout
mygridConfig :: p -> GSConfig Window
mygridConfig colorizer = (buildDefaultGSConfig myColorizer)
{ gs_cellheight = 40
, gs_cellwidth = 200
, gs_cellpadding = 6
, gs_originFractX = 0.5
, gs_originFractY = 0.5
, gs_font = myFont
}
spawnSelected' :: [(String, String)] -> X ()
spawnSelected' lst = gridselect conf lst >>= flip whenJust spawn
where conf = def
{ gs_cellheight = 40
, gs_cellwidth = 200
, gs_cellpadding = 6
, gs_originFractX = 0.5
, gs_originFractY = 0.5
, gs_font = myFont
}
myAppGrid = [ ("Audacity", "audacity")
, ("Deadbeef", "deadbeef")
, ("Emacs", "emacsclient -c -a emacs")
, ("Firefox", "firefox")
, ("Geany", "geany")
, ("Geary", "geary")
, ("Gimp", "gimp")
, ("Kdenlive", "kdenlive")
, ("LibreOffice Impress", "loimpress")
, ("LibreOffice Writer", "lowriter")
, ("OBS", "obs")
, ("PCManFM", "pcmanfm")
]
myScratchPads :: [NamedScratchpad]
myScratchPads = [ NS "terminal" spawnTerm findTerm manageTerm
, NS "mocp" spawnMocp findMocp manageMocp
, NS "calculator" spawnCalc findCalc manageCalc
]
where
2021-04-14 00:56:09 -04:00
spawnTerm = myTerminal ++ " -t scratchpad"
findTerm = title =? "scratchpad"
manageTerm = customFloating $ W.RationalRect l t w h
where
h = 0.9
w = 0.9
t = 0.95 -h
l = 0.95 -w
2021-04-14 00:56:09 -04:00
spawnMocp = myTerminal ++ " -t mocp -e mocp"
findMocp = title =? "mocp"
manageMocp = customFloating $ W.RationalRect l t w h
where
h = 0.9
w = 0.9
t = 0.95 -h
l = 0.95 -w
spawnCalc = "qalculate-gtk"
findCalc = className =? "Qalculate-gtk"
manageCalc = customFloating $ W.RationalRect l t w h
where
h = 0.5
w = 0.4
t = 0.75 -h
l = 0.70 -w
2020-12-18 11:24:49 -05: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
-- Below is a variation of the above except no borders are applied
-- if fewer than two windows. So a single window has no gaps.
mySpacing' :: Integer -> l a -> XMonad.Layout.LayoutModifier.ModifiedLayout Spacing l a
mySpacing' i = spacingRaw True (Border i i i i) True (Border i i i i) True
-- Defining a bunch of layouts, many that I don't use.
2020-12-18 11:24:49 -05:00
-- limitWindows n sets maximum number of windows displayed for layout.
-- mySpacing n sets the gap size around the windows.
tall = renamed [Replace "tall"]
$ smartBorders
2020-11-12 17:57:50 -05:00
$ addTabs shrinkText myTabTheme
$ subLayout [] (smartBorders Simplest)
$ limitWindows 12
$ mySpacing 8
$ ResizableTall 1 (3/100) (1/2) []
magnify = renamed [Replace "magnify"]
$ smartBorders
2020-11-12 17:57:50 -05:00
$ addTabs shrinkText myTabTheme
$ subLayout [] (smartBorders Simplest)
$ magnifier
$ limitWindows 12
$ mySpacing 8
$ ResizableTall 1 (3/100) (1/2) []
monocle = renamed [Replace "monocle"]
$ smartBorders
2020-11-12 17:57:50 -05:00
$ addTabs shrinkText myTabTheme
$ subLayout [] (smartBorders Simplest)
$ limitWindows 20 Full
floats = renamed [Replace "floats"]
$ smartBorders
$ limitWindows 20 simplestFloat
grid = renamed [Replace "grid"]
$ smartBorders
2020-11-12 17:57:50 -05:00
$ addTabs shrinkText myTabTheme
$ subLayout [] (smartBorders Simplest)
$ limitWindows 12
2021-04-20 18:54:29 -04:00
$ mySpacing 8
$ mkToggle (single MIRROR)
$ Grid (16/10)
spirals = renamed [Replace "spirals"]
$ smartBorders
2020-11-12 17:57:50 -05:00
$ addTabs shrinkText myTabTheme
$ subLayout [] (smartBorders Simplest)
$ mySpacing' 8
$ spiral (6/7)
threeCol = renamed [Replace "threeCol"]
$ smartBorders
2020-11-12 17:57:50 -05:00
$ addTabs shrinkText myTabTheme
$ subLayout [] (smartBorders Simplest)
$ limitWindows 7
$ ThreeCol 1 (3/100) (1/2)
threeRow = renamed [Replace "threeRow"]
$ smartBorders
2020-11-12 17:57:50 -05:00
$ addTabs shrinkText myTabTheme
$ subLayout [] (smartBorders Simplest)
$ limitWindows 7
-- Mirror takes a layout and rotates it by 90 degrees.
-- So we are applying Mirror to the ThreeCol layout.
$ Mirror
$ ThreeCol 1 (3/100) (1/2)
tabs = renamed [Replace "tabs"]
-- I cannot add spacing to this layout because it will
-- add spacing between window and tabs which looks bad.
2020-11-12 17:57:50 -05:00
$ tabbed shrinkText myTabTheme
2021-04-20 18:54:29 -04:00
tallAccordion = renamed [Replace "tallAccordion"]
$ Accordion
wideAccordion = renamed [Replace "wideAccordion"]
$ Mirror Accordion
2020-11-12 17:57:50 -05:00
2020-12-18 11:24:49 -05:00
-- setting colors for tabs layout and tabs sublayout.
2020-11-12 17:57:50 -05:00
myTabTheme = def { fontName = myFont
, activeColor = "#46d9ff"
, inactiveColor = "#313846"
, activeBorderColor = "#46d9ff"
, inactiveBorderColor = "#282c34"
, activeTextColor = "#282c34"
, inactiveTextColor = "#d0d0d0"
}
-- Theme for showWName which prints current workspace when you change workspaces.
myShowWNameTheme :: SWNConfig
myShowWNameTheme = def
2020-11-12 17:57:50 -05:00
{ swn_font = "xft:Ubuntu:bold:size=60"
, swn_fade = 1.0
2020-11-12 17:57:50 -05:00
, swn_bgcolor = "#1c1f24"
, swn_color = "#ffffff"
}
-- The layout hook
2020-11-12 17:57:50 -05:00
myLayoutHook = avoidStruts $ mouseResize $ windowArrange $ T.toggleLayouts floats
$ mkToggle (NBFULL ?? NOBORDERS ?? EOT) myDefaultLayout
where
2021-04-20 19:57:16 -04:00
myDefaultLayout = withBorder myBorderWidth tall
||| magnify
||| noBorders monocle
||| floats
||| noBorders tabs
2020-11-12 17:57:50 -05:00
||| grid
||| spirals
||| threeCol
||| threeRow
2021-04-20 18:54:29 -04:00
||| tallAccordion
||| wideAccordion
2020-11-12 17:57:50 -05:00
-- myWorkspaces = [" 1 ", " 2 ", " 3 ", " 4 ", " 5 ", " 6 ", " 7 ", " 8 ", " 9 "]
myWorkspaces = [" dev ", " www ", " sys ", " doc ", " vbox ", " chat ", " mus ", " vid ", " gfx "]
2021-02-26 01:10:02 -05:00
myWorkspaceIndices = M.fromList $ zipWith (,) myWorkspaces [1..] -- (,) == \x y -> (x,y)
2021-02-26 01:10:02 -05:00
clickable ws = "<action=xdotool key super+"++show i++">"++ws++"</action>"
where i = fromJust $ M.lookup ws myWorkspaceIndices
2021-04-28 13:15:17 -04:00
-- 'doCopy' copies the managed window into another workspace.
-- If you use this feature then you need to change your kill keybinding
-- from kill1 to killAllOtherCopies <+> kill1
-- I personally have two different keybindings, one for killing only copies, one for killing all of them.
doCopy :: WorkspaceId -> ManageHook
doCopy m = ask >>= \w -> doF (copyWindow w m)
-- 'doCopyToAll' simply copies managed window into the all workspaces.
-- Since scracthpads and dynamic workspaces are not presented in the 'myWorkspaces'
-- they will not be affected. I personally use this feature for my webcam.
-- , title =? "video - mpv" --> doFloat <+> doCopyToAll
-- If you use this feature then you need to change your kill keybinding
-- from kill1 to killAllOtherCopies <+> kill1
-- I personally have two different keybindings, one for killing only copies, one for killing all of them.
doCopyToAll :: ManageHook
doCopyToAll = foldr (\w rest -> doCopy (w) <+> rest) (doCopy (myWorkspaces !! 1)) myWorkspaces
myManageHook :: XMonad.Query (Data.Monoid.Endo WindowSet)
myManageHook = composeAll
-- 'doFloat' forces a window to float. Useful for dialog boxes and such.
-- using 'doShift ( myWorkspaces !! 7)' sends program to workspace 8!
2020-11-12 17:57:50 -05:00
-- I'm doing it this way because otherwise I would have to write out the full
-- name of my workspaces and the names would be very long if using clickable workspaces.
[ className =? "confirm" --> doFloat
, className =? "file_progress" --> doFloat
, className =? "dialog" --> doFloat
, className =? "download" --> doFloat
, className =? "error" --> doFloat
, className =? "Gimp" --> doFloat
, className =? "notification" --> doFloat
, className =? "pinentry-gtk-2" --> doFloat
, className =? "splash" --> doFloat
, className =? "toolbar" --> doFloat
, title =? "Oracle VM VirtualBox Manager" --> doFloat
2021-04-20 18:54:29 -04:00
, title =? "Mozilla Firefox" --> doShift ( myWorkspaces !! 1 )
, className =? "brave-browser" --> doShift ( myWorkspaces !! 1 )
, className =? "qutebrowser" --> doShift ( myWorkspaces !! 1 )
, className =? "mpv" --> doShift ( myWorkspaces !! 7 )
, className =? "Gimp" --> doShift ( myWorkspaces !! 8 )
2020-07-04 12:36:50 -04:00
, className =? "VirtualBox Manager" --> doShift ( myWorkspaces !! 4 )
, (className =? "firefox" <&&> resource =? "Dialog") --> doFloat -- Float Firefox Dialog
, isFullscreen --> doFullFloat
2019-02-25 23:08:15 -05:00
] <+> namedScratchpadManageHook myScratchPads
2019-01-15 16:27:01 -05:00
2021-02-26 01:26:50 -05:00
myKeys :: [(String, X ())]
myKeys =
-- Xmonad
2021-04-19 22:13:26 -04:00
[ ("M-C-r", spawn "xmonad --recompile") -- Recompiles xmonad
, ("M-S-r", spawn "xmonad --restart") -- Restarts xmonad
, ("M-S-q", io exitSuccess) -- Quits xmonad
2020-11-12 17:57:50 -05:00
-- Run Prompt
2021-04-14 00:56:09 -04:00
, ("M-S-<Return>", spawn "dmenu_run -i -p \"Run: \"") -- Dmenu
2020-11-12 17:57:50 -05:00
2021-04-19 22:13:26 -04:00
-- Other Dmenu Prompts
-- In Xmonad and many tiling window managers, M-p is the default keybinding to
-- launch dmenu_run, so I've decided to use M-p plus KEY for these dmenu scripts.
, ("M-p c", spawn "dcolors") -- pick color from our scheme
, ("M-p e", spawn "dmconf") -- edit config files
, ("M-p i", spawn "dmscrot") -- screenshots (images)
, ("M-p k", spawn "dmkill") -- kill processes
, ("M-p m", spawn "dman") -- manpages
, ("M-p o", spawn "dmqute") -- qutebrowser bookmarks/history
, ("M-p p", spawn "passmenu") -- passmenu
, ("M-p q", spawn "dmlogout") -- logout menu
, ("M-p r", spawn "dmred") -- reddio (a reddit viewer)
, ("M-p s", spawn "dmsearch") -- search various search engines
2020-12-17 02:05:21 -05:00
2020-11-12 17:57:50 -05:00
-- Useful programs to have a keybinding for launch
2021-03-20 14:06:31 -04:00
, ("M-<Return>", spawn (myTerminal))
2020-11-12 17:57:50 -05:00
, ("M-b", spawn (myBrowser ++ " www.youtube.com/c/DistroTube/"))
, ("M-M1-h", spawn (myTerminal ++ " -e htop"))
2020-11-12 17:57:50 -05:00
-- Kill windows
2020-12-17 02:05:21 -05:00
, ("M-S-c", kill1) -- Kill the currently focused client
, ("M-S-a", killAll) -- Kill all windows on current workspace
2020-11-12 17:57:50 -05:00
-- Workspaces
, ("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
-- Floating windows
2020-11-12 17:57:50 -05:00
, ("M-f", sendMessage (T.Toggle "floats")) -- Toggles my 'floats' layout
, ("M-t", withFocused $ windows . W.sink) -- Push floating window back to tile
, ("M-S-t", sinkAll) -- Push ALL floating windows to tile
2020-11-12 17:57:50 -05:00
-- Increase/decrease spacing (gaps)
, ("C-M1-j", decWindowSpacing 4) -- Decrease window spacing
, ("C-M1-k", incWindowSpacing 4) -- Increase window spacing
, ("C-M1-h", decScreenSpacing 4) -- Decrease screen spacing
, ("C-M1-l", incScreenSpacing 4) -- Increase screen spacing
2020-11-12 17:57:50 -05:00
-- Grid Select (CTR-g followed by a key)
, ("C-g g", spawnSelected' myAppGrid) -- grid select favorite apps
, ("C-g t", goToSelected $ mygridConfig myColorizer) -- goto selected window
, ("C-g b", bringSelected $ mygridConfig myColorizer) -- bring selected window
-- Windows navigation
2020-11-12 17:57:50 -05: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
, ("M-S-<Tab>", rotSlavesDown) -- Rotate all windows except master and keep focus in place
, ("M-C-<Tab>", rotAllDown) -- Rotate all the windows in the current stack
-- Layouts
, ("M-<Tab>", sendMessage NextLayout) -- Switch to next layout
, ("M-<Space>", sendMessage (MT.Toggle NBFULL) >> sendMessage ToggleStruts) -- Toggles noborder/full
2020-11-12 17:57:50 -05:00
-- Increase/decrease windows in the master pane or the stack
2021-04-19 22:13:26 -04:00
, ("M-S-<Up>", sendMessage (IncMasterN 1)) -- Increase # of clients master pane
, ("M-S-<Down>", sendMessage (IncMasterN (-1))) -- Decrease # of clients master pane
, ("M-C-<Up>", increaseLimit) -- Increase # of windows
, ("M-C-<Down>", decreaseLimit) -- Decrease # of windows
2020-11-12 17:57:50 -05:00
-- Window resizing
, ("M-h", sendMessage Shrink) -- Shrink horiz window width
, ("M-l", sendMessage Expand) -- Expand horiz window width
, ("M-M1-j", sendMessage MirrorShrink) -- Shrink vert window width
2021-04-20 18:54:29 -04:00
, ("M-M1-k", sendMessage MirrorExpand) -- Expand vert window width
2020-11-12 17:57:50 -05:00
-- Sublayouts
-- This is used to push windows to tabbed sublayouts, or pull them out of it.
, ("M-C-h", sendMessage $ pullGroup L)
, ("M-C-l", sendMessage $ pullGroup R)
, ("M-C-k", sendMessage $ pullGroup U)
, ("M-C-j", sendMessage $ pullGroup D)
, ("M-C-m", withFocused (sendMessage . MergeAll))
-- , ("M-C-u", withFocused (sendMessage . UnMerge))
2020-11-12 17:57:50 -05:00
, ("M-C-/", withFocused (sendMessage . UnMergeAll))
, ("M-C-.", onGroup W.focusUp') -- Switch focus to next tab
, ("M-C-,", onGroup W.focusDown') -- Switch focus to prev tab
-- Scratchpads
-- Toggle show/hide these programs. They run on a hidden workspace.
-- When you toggle them to show, it brings them to your current workspace.
-- Toggle them to hide and it sends them back to hidden workspace (NSP).
, ("C-s t", namedScratchpadAction myScratchPads "terminal")
, ("C-s m", namedScratchpadAction myScratchPads "mocp")
, ("C-s c", namedScratchpadAction myScratchPads "calculator")
-- Set wallpaper with 'feh'. Type 'SUPER+F1' to launch sxiv in the wallpapers directory.
-- Then in sxiv, type 'C-x w' to set the wallpaper that you choose.
, ("M-<F1>", spawn "sxiv -r -q -t -o ~/wallpapers/*")
2021-04-21 17:38:06 -04:00
, ("M-<F2>", spawn "/bin/ls ~/wallpapers | shuf -n 1 | xargs xwallpaper --stretch")
--, ("M-<F2>", spawn "feh --randomize --bg-fill ~/wallpapers/*")
2020-11-12 17:57:50 -05:00
-- Controls for mocp music player (SUPER-u followed by a key)
, ("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")
-- Emacs (CTRL-e followed by a key)
2021-04-21 15:32:19 -04:00
-- , ("C-e e", spawn myEmacs) -- start emacs
, ("C-e e", spawn (myEmacs ++ ("--eval '(dashboard-refresh-buffer)'"))) -- emacs dashboard
, ("C-e b", spawn (myEmacs ++ ("--eval '(ibuffer)'"))) -- list buffers
, ("C-e d", spawn (myEmacs ++ ("--eval '(dired nil)'"))) -- dired
, ("C-e i", spawn (myEmacs ++ ("--eval '(erc)'"))) -- erc irc client
2021-04-20 18:54:29 -04:00
, ("C-e m", spawn (myEmacs ++ ("--eval '(mu4e)'"))) -- mu4e email
, ("C-e n", spawn (myEmacs ++ ("--eval '(elfeed)'"))) -- elfeed rss
, ("C-e s", spawn (myEmacs ++ ("--eval '(eshell)'"))) -- eshell
, ("C-e t", spawn (myEmacs ++ ("--eval '(mastodon)'"))) -- mastodon.el
2021-04-21 15:32:19 -04:00
-- , ("C-e v", spawn (myEmacs ++ ("--eval '(vterm nil)'"))) -- vterm if on GNU Emacs
, ("C-e v", spawn (myEmacs ++ ("--eval '(+vterm/here nil)'"))) -- vterm if on Doom Emacs
-- , ("C-e w", spawn (myEmacs ++ ("--eval '(eww \"distrotube.com\")'"))) -- eww browser if on GNU Emacs
, ("C-e w", spawn (myEmacs ++ ("--eval '(doom/window-maximize-buffer(eww \"distrotube.com\"))'"))) -- eww browser if on Doom Emacs
-- emms is an emacs audio player. I set it to auto start playing in a specific directory.
, ("C-e a", spawn (myEmacs ++ ("--eval '(emms)' --eval '(emms-play-directory-tree \"~/Music/Non-Classical/70s-80s/\")'")))
-- Multimedia Keys
2020-11-12 17:57:50 -05:00
, ("<XF86AudioPlay>", spawn (myTerminal ++ "mocp --play"))
, ("<XF86AudioPrev>", spawn (myTerminal ++ "mocp --previous"))
, ("<XF86AudioNext>", spawn (myTerminal ++ "mocp --next"))
, ("<XF86AudioMute>", spawn "amixer set Master toggle")
, ("<XF86AudioLowerVolume>", spawn "amixer set Master 5%- unmute")
, ("<XF86AudioRaiseVolume>", spawn "amixer set Master 5%+ unmute")
, ("<XF86HomePage>", spawn "qutebrowser https://www.youtube.com/c/DistroTube")
, ("<XF86Search>", spawn "dmsearch")
2020-12-17 02:05:21 -05:00
, ("<XF86Mail>", runOrRaise "thunderbird" (resource =? "thunderbird"))
, ("<XF86Calculator>", runOrRaise "qalculate-gtk" (resource =? "qalculate-gtk"))
, ("<XF86Eject>", spawn "toggleeject")
, ("<Print>", spawn "dmscrot")
]
2020-11-12 17:57:50 -05:00
-- The following lines are needed for named scratchpads.
2021-04-14 00:56:09 -04:00
where nonNSP = WSIs (return (\ws -> W.tag ws /= "NSP"))
nonEmptyNonNSP = WSIs (return (\ws -> isJust (W.stack ws) && W.tag ws /= "NSP"))
2020-05-24 22:27:19 -04:00
main :: IO ()
main = do
-- Launching three instances of xmobar on their monitors.
2020-12-18 11:24:49 -05:00
xmproc0 <- spawnPipe "xmobar -x 0 $HOME/.config/xmobar/xmobarrc0"
xmproc1 <- spawnPipe "xmobar -x 1 $HOME/.config/xmobar/xmobarrc1"
xmproc2 <- spawnPipe "xmobar -x 2 $HOME/.config/xmobar/xmobarrc2"
-- the xmonad, ya know...what the WM is named after!
2020-06-06 19:40:47 -04:00
xmonad $ ewmh def
{ manageHook = myManageHook <+> manageDocks
, handleEventHook = docksEventHook
-- Uncomment this line to enable fullscreen support on things like YouTube/Netflix.
-- This works perfect on SINGLE monitor systems. On multi-monitor systems,
-- it adds a border around the window if screen does not have focus. So, my solution
-- is to use a keybinding to toggle fullscreen noborders instead. (M-<Space>)
-- <+> fullscreenEventHook
2020-05-21 22:39:36 -04:00
, modMask = myModMask
, terminal = myTerminal
, startupHook = myStartupHook
2020-11-12 17:57:50 -05:00
, layoutHook = showWName' myShowWNameTheme $ myLayoutHook
2020-07-04 12:36:50 -04:00
, workspaces = myWorkspaces
2020-05-21 22:39:36 -04:00
, borderWidth = myBorderWidth
2020-05-22 01:14:58 -04:00
, normalBorderColor = myNormColor
, focusedBorderColor = myFocusColor
2021-04-14 00:56:09 -04:00
, logHook = dynamicLogWithPP $ namedScratchpadFilterOutWorkspacePP $ xmobarPP
2021-04-19 22:13:26 -04:00
-- the following variables beginning with 'pp' are settings for xmobar.
{ ppOutput = \x -> hPutStrLn xmproc0 x -- xmobar on monitor 1
>> hPutStrLn xmproc1 x -- xmobar on monitor 2
>> hPutStrLn xmproc2 x -- xmobar on monitor 3
, ppCurrent = xmobarColor "#98be65" "" . wrap "[" "]" -- Current workspace
, ppVisible = xmobarColor "#98be65" "" . clickable -- Visible but not current workspace
, ppHidden = xmobarColor "#82AAFF" "" . wrap "*" "" . clickable -- Hidden workspaces
, ppHiddenNoWindows = xmobarColor "#c792ea" "" . clickable -- Hidden workspaces (no windows)
, ppTitle = xmobarColor "#b3afc2" "" . shorten 60 -- Title of active window
, ppSep = "<fc=#666666> <fn=1>|</fn> </fc>" -- Separator character
, ppUrgent = xmobarColor "#C45500" "" . wrap "!" "!" -- Urgent workspace
, ppExtras = [windowCount] -- # of windows current workspace
, ppOrder = \(ws:l:t:ex) -> [ws,l]++ex++[t] -- order of things in xmobar
}
2021-02-26 01:26:50 -05:00
} `additionalKeysP` myKeys