------------- -- 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