Skip to content
Extraits de code Groupes Projets
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