xmonad.hs 11,38 Kio
-------------
-- Imports --
-------------
-- Base
import System.IO
import System.Exit
import System.Posix.Env
import Data.Map as M
import Data.Char
import Data.List (intercalate)
import Data.List.Split (splitOn)
import Data.Maybe
import Graphics.X11.ExtraTypes.XF86
-- Xmonad
import XMonad
import XMonad.Operations
import XMonad.ManageHook
import XMonad.Config.Desktop
import qualified XMonad.StackSet as W
-- Actions
import XMonad.Actions.SpawnOn
import XMonad.Actions.CycleWS
import XMonad.Actions.Commands
import XMonad.Actions.DynamicWorkspaces
import XMonad.Actions.Submap
import XMonad.Actions.TagWindows
import XMonad.Actions.DynamicWorkspaceGroups
import XMonad.Actions.Minimize
import qualified XMonad.Actions.DynamicWorkspaceOrder as DO
-- Utils
import XMonad.Util.Scratchpad
import XMonad.Util.SessionStart
import XMonad.Util.SpawnOnce
import XMonad.Util.Run
import XMonad.Util.EZConfig (additionalKeys)
import XMonad.Util.NamedWindows
import XMonad.Util.Loggers
import XMonad.Util.WorkspaceCompare
import XMonad.Util.ExclusiveScratchpads
-- Hooks
import XMonad.Hooks.ICCCMFocus
import XMonad.Hooks.DynamicLog hiding (xmobar)
import XMonad.Hooks.ManageDocks
import XMonad.Hooks.ManageHelpers
import XMonad.Hooks.UrgencyHook
import XMonad.Hooks.SetWMName
import XMonad.Hooks.EwmhDesktops (ewmh)
import XMonad.Hooks.DebugStack
import XMonad.Hooks.Minimize
import XMonad.Hooks.ServerMode
-- Prompts
import XMonad.Prompt
import XMonad.Prompt.Window
import XMonad.Prompt.Layout
import XMonad.Prompt.ConfirmPrompt
-- Layouts
import XMonad.Layout.Minimize
import XMonad.Layout.ToggleLayouts
import XMonad.Layout.Named
import XMonad.Layout.ResizableTile
import XMonad.Layout.LayoutModifier
import XMonad.Layout.NoBorders
import XMonad.Layout.BinarySpacePartition
import XMonad.Layout.WindowNavigation as WinNav
import XMonad.Layout.BoringWindows
import XMonad.Layout.SubLayouts
import XMonad.Layout.PerWorkspace
--------------
-- The main --
--------------
main = do
putEnv "GTK_IM_MODULE=ibus"
putEnv "XMODIFIERS=@im=ibus"
putEnv "QT_IM_MODULES=ibus"
path <- getEnv "PATH"
(\path -> if (isJust path) then setEnv "PATH" ("/home/kubat/.local/bin/:" ++ (fromJust path)) True else print "No path defined") path
xmproc <- spawnPipe "/usr/bin/xmobar -x 0 /home/kubat/.xmonad/xmobar.hs"
xmonad $ docks $ ewmh $ withUrgencyHook LibNotifyUrgencyHook $ defaultConfig
{ modMask = mod4Mask
, focusFollowsMouse = False
, focusedBorderColor = "#268bd2"
, normalBorderColor = "#808080"
, terminal = myTerm
, workspaces = ["#"]
, manageHook = manageHook defaultConfig
<+> myManageHook
<+> manageDocks
<+> xScratchpadsManageHook myScratchPads
, startupHook = docksStartupHook
<+> setWMName "LG3D"
<+> myStartupHook
, handleEventHook = docksEventHook
<+> minimizeEventHook
<+> serverModeEventHookCmd
<+> serverModeEventHook
<+> serverModeEventHookF "XMONAD_PRINT" (io . putStrLn)
, layoutHook = myLayoutHook
, borderWidth = 3
, logHook = do
takeTopFocus
dynamicLogWithPP xmobarPP
{ ppOutput = hPutStrLn xmproc
, ppTitle = xmobarColor "#c678dd" "" . shorten 50
, ppLayout = xmobarColor "#b58900" "" . (Prelude.map toLower)
, ppSep = " "
, ppWsSep = " "
, ppCurrent = xmobarColor "#268bd2" "" . (\ x -> x) . (Prelude.map toUpper)
, ppVisible = xmobarColor "grey" "" . (\ x -> x) . (Prelude.map toUpper)
, ppHidden = xmobarColor "grey" "" . (\ x -> x) . (Prelude.map toUpper)
, ppHiddenNoWindows = xmobarColor "#707070" "" . (\ x -> x) . (Prelude.map toUpper)
, ppUrgent = xmobarColor "#b58900" "" . (\ x -> x) . (Prelude.map toUpper)
, ppVisibleNoWindows = Just (xmobarColor "#707070" "" . (\ x -> x) . (Prelude.map toUpper))
, ppOrder = \(ws:layout:title:extra) -> [ (replace "minimize " "" layout), ws ]
}
} `additionalKeys` myAdditionalKeys
------------------
-- My variables --
------------------
myStartupHook = do
spawnOnce "/home/kubat/.local/bin/xbanish"
spawn "/home/kubat/.xmonad/init.sh"
spawn "xrdb /home/kubat/.Xresources"
spawnOnce "twmnd &"
spawnOnce "nm-applet &"
spawnOnce "feh --bg-scale /home/kubat/.xmonad/wallpaper &"
spawn "setxkbmap kubat"
spawnOnce "trayer --edge top --align right --widthtype request --padding 6 --SetDockType true --SetPartialStrut true --expand true --monitor 1 --tint 0x002b36 --transparent true --alpha 0 --height 18 &"
myLayoutHook =
minimize $ boringAuto (toggleLayouts (noBorders Full) others)
where others = (named "Tall" $ avoidStruts $ ResizableTall 1 (3.0 / 100.0) 0.5 [])
||| (named "llaT" $ avoidStruts $ Mirror $ ResizableTall 1 (3.0 / 100.0) 0.5 [])
||| (named "Full" $ avoidStruts $ Full)
myManageHook = do
composeAll . concat $
[ [ resource =? r --> doIgnore | r <- myIgnores ]
, [ className =? c --> doFloat | c <- myFloats ]
, [ title =? "OCaml graphics" --> doFloat ]
, [ title =? "desktop" --> doIgnore ]
, [ isDialog --> doCenterFloat ]
, [ manageDocks ]
] where myIgnores = [ "desktop", "desktop_window" ]
myFloats = [ "Xmessage", "Unity", "Display" ]
myTerm = "st"
myXPConfig = def { font = "xft:Hack Nerd Font Mono:size=9"
, bgColor = "#073642"
, fgColor = "#b9baba"
, position = Top
, promptBorderWidth = 0
}
replace from to = intercalate to . splitOn from
data LibNotifyUrgencyHook = LibNotifyUrgencyHook deriving (Read, Show)
instance UrgencyHook LibNotifyUrgencyHook where
urgencyHook LibNotifyUrgencyHook w = do
name <- getName w
Just idx <- fmap (W.findTag w) $ gets windowset
safeSpawn "notify-send" [show name, "workspace " ++ idx]
-------------
-- My keys --
-------------
myAdditionalKeys =
[ ((mod4Mask, xK_Return), spawn myTerm)
-- Apps
, ((mod4Mask, xK_a), submap . M.fromList $
[ ((0, xK_p), spawn "firefox --private-window")
, ((0, xK_w), spawn "firefox")
, ((0, xK_c), spawn "chromium")
, ((0, xK_v), spawn "/home/kubat/bin/V4")
, ((0, xK_t), spawn "/usr/bin/alacritty")
, ((0, xK_Return), spawn myTerm)
])
-- Passwords
, ((mod4Mask, xK_p), spawn "passmenu -h 18")
-- Utility
, ((mod4Mask, xK_d), spawn "dmenu_run -h 18")
, ((mod4Mask, xK_b), sendMessage ToggleStruts)
, ((mod4Mask, xK_F1), spawn "i3lock -e -u -t -i /home/kubat/.xmonad/lock")
, ((mod4Mask, xK_Print), spawn "scrot $(date +%F-%H:%M:%S).png -e 'mv $f /home/kubat/pictures/screenshot/'")
, ((mod4Mask, xK_F2), confirmPrompt myXPConfig "poweroff" $ spawn "systemctl poweroff")
, ((mod4Mask, xK_q), confirmPrompt myXPConfig "quit" $ io (exitWith ExitSuccess))
, ((mod4Mask .|. shiftMask, xK_c), kill)
-- Workspaces
, ((mod4Mask, xK_j), focusDown)
, ((mod4Mask, xK_k), focusUp)
, ((mod4Mask, xK_m), focusMaster)
, ((mod4Mask, xK_Tab), return ())
, ((mod4Mask .|. shiftMask, xK_Tab), return ())
, ((mod4Mask .|. controlMask, xK_space), withFocused $ windows . W.sink)
, ((mod4Mask, xK_comma), moveTo Prev HiddenWS)
, ((mod4Mask, xK_period), moveTo Next HiddenWS)
, ((mod4Mask .|. shiftMask, xK_comma), shiftTo Prev HiddenWS)
, ((mod4Mask .|. shiftMask, xK_period), shiftTo Next HiddenWS)
, ((mod4Mask, xK_slash), focusMaster)
, ((mod4Mask .|. shiftMask, xK_slash), windows W.swapMaster)
, ((mod4Mask, xK_Escape), sendMessage (Toggle "Full"))
, ((mod4Mask, xK_exclam), nextScreen)
, ((mod4Mask .|. shiftMask, xK_exclam), shiftNextScreen)
, ((mod4Mask .|. shiftMask, xK_8), sendMessage (IncMasterN 1) )
, ((mod4Mask .|. shiftMask, xK_6), sendMessage Expand )
, ((mod4Mask .|. shiftMask, xK_2), sendMessage (IncMasterN (-1)))
, ((mod4Mask .|. shiftMask, xK_4), sendMessage Shrink )
-- Dynamic workspaces and workspace control
, ((mod4Mask, xK_w), submap . M.fromList $
[ ((0, xK_BackSpace), removeWorkspace)
, ((0, xK_n), addWorkspacePrompt myXPConfig)
, ((0, xK_r), renameWorkspace myXPConfig)
])
-- Volume, with pulseaudio
, ((mod4Mask, xK_F11), spawn "pavolume voldown 5 --noshow")
, ((mod4Mask, xK_F12), spawn "pavolume volup 5 --noshow")
, ((mod4Mask, xK_F10), spawn "pavolume mutetoggle")
-- Lektord
, ((mod4Mask .|. mod1Mask, xK_n), spawn "lkt next")
, ((mod4Mask .|. mod1Mask, xK_p), spawn "lkt prev")
, ((mod4Mask .|. mod1Mask, xK_s), spawn "lkt stop")
, ((mod4Mask .|. mod1Mask, xK_space), spawn "lkt play")
, ((mod4Mask .|. mod1Mask, xK_F11), spawn "mpc volume -5")
, ((mod4Mask .|. mod1Mask, xK_F12), spawn "mpc volume +5")
-- Light
, ((mod4Mask, xK_F5), spawn "lux -s 10%")
, ((mod4Mask, xK_F6), spawn "lux -a 10%")
, ((mod4Mask, xK_F3), spawn "asus-kbd-backlight down")
, ((mod4Mask, xK_F4), spawn "asus-kbd-backlight up")
-- Scratchpads
, ((mod4Mask, xK_x), submap . M.fromList $
[ ((0, xK_Return), do { scratchpadAction myScratchPads "terminal" ; focusMaster })
, ((0, xK_d), do { scratchpadAction myScratchPads "discord" ; focusMaster })
, ((0, xK_x), hideAll myScratchPads)
])
]
--------------------
-- My scratchpads --
--------------------
myScratchPads = mkXScratchpads [ ("terminal", "st.sh", resource =? "terminal" )
, ("discord", "discord", className =? "discord" )
] $ customFloating $ W.RationalRect l t w h
where h = 0.9
w = 0.9
t = 0.95 - h
l = 0.95 - w