(xmonad): combine xmonad and xmobar into single cabal project

This commit is contained in:
frosty 2024-07-12 17:25:58 -04:00
parent ff57c00793
commit 1f70d1f07e
6 changed files with 220 additions and 210 deletions

View file

@ -1 +0,0 @@
/dist-*

View file

@ -1,10 +0,0 @@
cabal-version: 3.0
name: xmobar-frosty
version: 0.1.0.0
build-type: Simple
executable xmobar
main-is: xmobar.hs
build-depends: base ^>=4.17.2.1
, xmobar >=0.48.1
default-language: Haskell2010

4
.config/xmonad/build Executable file
View file

@ -0,0 +1,4 @@
#!/bin/sh
cd "$XDG_CONFIG_HOME/xmonad" || exit
cabal install --overwrite-policy=always

View file

@ -5,9 +5,26 @@ build-type: Simple
executable xmonad
main-is: xmonad.hs
build-depends: base ^>=4.17.2.1
, xmonad >=0.18
, xmonad-contrib >=0.18
ghc-options: -Wall -rtsopts -threaded -with-rtsopts=-N
build-depends:
, base
, containers
, X11
default-language: Haskell2010
, xmonad >=0.18
, xmonad-contrib >=0.18
default-language: GHC2021
default-extensions: ImportQualifiedPost
executable xmobar
main-is: xmobar.hs
ghc-options:
-O2 -Wall -Wcompat -Wincomplete-record-updates
-Wredundant-constraints -rtsopts -threaded -with-rtsopts=-N
build-depends:
, base
, xmobar >=0.48
default-language: GHC2021
default-extensions: ImportQualifiedPost

View file

@ -1,4 +1,19 @@
import Data.Map qualified as M
import Data.Monoid
import Graphics.X11.ExtraTypes.XF86
import System.Exit
import Text.Printf
import XMonad
import XMonad.Actions.CycleWS
import XMonad.Actions.Submap
import XMonad.Actions.ToggleFullFloat
import XMonad.Hooks.DynamicLog
import XMonad.Hooks.EwmhDesktops
import XMonad.Hooks.InsertPosition
import XMonad.Hooks.ManageDocks (ToggleStruts (..), avoidStruts, manageDocks)
import XMonad.Hooks.Place
import XMonad.Hooks.StatusBar
import XMonad.Hooks.WindowSwallowing
import XMonad.Layout.CircleEx
import XMonad.Layout.Grid
import XMonad.Layout.LayoutModifier
@ -6,23 +21,8 @@ import XMonad.Layout.NoBorders (noBorders, smartBorders)
import XMonad.Layout.Renamed (named)
import XMonad.Layout.ShowWName
import XMonad.Layout.Spacing
import XMonad.Hooks.DynamicLog
import XMonad.Hooks.EwmhDesktops
import XMonad.Hooks.InsertPosition
import XMonad.Hooks.ManageDocks (avoidStruts, manageDocks, ToggleStruts(..))
import XMonad.Hooks.Place
import XMonad.Hooks.StatusBar
import XMonad.Hooks.WindowSwallowing
import XMonad.StackSet qualified as W
import XMonad.Util.NamedScratchpad
import XMonad.Actions.CycleWS
import XMonad.Actions.Submap
import XMonad.Actions.ToggleFullFloat
import Data.Monoid
import Graphics.X11.ExtraTypes.XF86
import System.Exit
import Text.Printf
import qualified XMonad.StackSet as W
import qualified Data.Map as M
-- MAIN OPTIONS --------------------------------------------------------
@ -47,100 +47,93 @@ swallowClasses = ["St", "XTerm"]
-- KEY BINDS -----------------------------------------------------------
myKeys :: XConfig Layout -> M.Map (KeyMask, KeySym) (X ())
myKeys conf@(XConfig {XMonad.modMask = modMask}) = M.fromList $
myKeys conf@(XConfig {XMonad.modMask = modMask}) =
M.fromList $
-- Spawning programs
[ ((modMask, xK_Return), spawn myTerminal)
, ((modMask, xK_p), spawnDmenu "dmenu_run")
, ((modMask, xK_w), spawn "firefox")
, ((modMask .|. controlMask, xK_q), spawn "qutebrowser")
, ((modMask, xK_e), spawnTerminal myEditor)
, ((modMask, xK_f), spawnTerminal "lf")
, ((modMask, xK_t), spawnTerminal "ncmpcpp")
, ((modMask .|. controlMask, xK_e), spawnTerminal "ncspot")
, ((modMask, xK_v), spawnTerminal "pulsemixer")
, ((modMask .|. controlMask, xK_y), spawn "pavucontrol")
, ((modMask .|. controlMask, xK_semicolon), spawn "simplescreenrecorder")
, ((modMask .|. controlMask, xK_apostrophe), spawn "obs")
, ((modMask .|. controlMask, xK_o), spawnTerminal "cava")
, ((modMask .|. controlMask, xK_l), spawn "run-i3lock")
, ((modMask .|. controlMask, xK_d), spawn "arandr")
, ((modMask .|. controlMask, xK_v), spawn "screenlayouts-open")
, ((modMask .|. controlMask, xK_w), spawn "wallpapers-open")
, ((modMask .|. controlMask, xK_bracketright), spawn "find ~/pictures/screenshots -type f | nsxiv -ti")
[ ((modMask, xK_Return), spawn myTerminal),
((modMask, xK_p), spawnDmenu "dmenu_run"),
((modMask, xK_w), spawn "firefox"),
((modMask .|. controlMask, xK_q), spawn "qutebrowser"),
((modMask, xK_e), spawnTerminal myEditor),
((modMask, xK_f), spawnTerminal "lf"),
((modMask, xK_t), spawnTerminal "ncmpcpp"),
((modMask .|. controlMask, xK_e), spawnTerminal "ncspot"),
((modMask, xK_v), spawnTerminal "pulsemixer"),
((modMask .|. controlMask, xK_y), spawn "pavucontrol"),
((modMask .|. controlMask, xK_semicolon), spawn "simplescreenrecorder"),
((modMask .|. controlMask, xK_apostrophe), spawn "obs"),
((modMask .|. controlMask, xK_o), spawnTerminal "cava"),
((modMask .|. controlMask, xK_l), spawn "run-i3lock"),
((modMask .|. controlMask, xK_d), spawn "arandr"),
((modMask .|. controlMask, xK_v), spawn "screenlayouts-open"),
((modMask .|. controlMask, xK_w), spawn "wallpapers-open"),
((modMask .|. controlMask, xK_bracketright), spawn "find ~/pictures/screenshots -type f | nsxiv -ti"),
-- Screenshotting
, ((0, xK_Print), spawn "epicshot -cs select")
, ((controlMask, xK_Print), spawn "epicshot -cs full")
, ((modMask, xK_Print), spawn "epicshot -so select")
, ((modMask .|. controlMask, xK_r), spawn "epicshot -cs select")
, ((modMask .|. controlMask, xK_t), spawn "epicshot -cs full")
, ((modMask .|. controlMask, xK_g), spawn "epicshot -so select")
((0, xK_Print), spawn "epicshot -cs select"),
((controlMask, xK_Print), spawn "epicshot -cs full"),
((modMask, xK_Print), spawn "epicshot -so select"),
((modMask .|. controlMask, xK_r), spawn "epicshot -cs select"),
((modMask .|. controlMask, xK_t), spawn "epicshot -cs full"),
((modMask .|. controlMask, xK_g), spawn "epicshot -so select"),
-- Custom function row
, ((modMask .|. controlMask, xK_F5), spawn "mpc prev")
, ((modMask .|. controlMask, xK_F6), spawn "mpc next")
, ((modMask .|. controlMask, xK_F7), spawn "mpc toggle")
, ((modMask .|. controlMask, xK_F8), spawn "mpc stop")
, ((modMask .|. controlMask, xK_F9), spawn "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle && pipe_volume")
, ((modMask .|. controlMask, xK_F10), spawn "wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- && pipe_volume")
, ((modMask .|. controlMask, xK_F11), spawn "wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+ && pipe_volume")
, ((modMask .|. controlMask, xK_F12), spawn "run-i3lock")
((modMask .|. controlMask, xK_F5), spawn "mpc prev"),
((modMask .|. controlMask, xK_F6), spawn "mpc next"),
((modMask .|. controlMask, xK_F7), spawn "mpc toggle"),
((modMask .|. controlMask, xK_F8), spawn "mpc stop"),
((modMask .|. controlMask, xK_F9), spawn "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle && pipe_volume"),
((modMask .|. controlMask, xK_F10), spawn "wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- && pipe_volume"),
((modMask .|. controlMask, xK_F11), spawn "wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+ && pipe_volume"),
((modMask .|. controlMask, xK_F12), spawn "run-i3lock"),
-- XF86 keys
, ((0, xF86XK_Explorer), spawnTerminal "nnn")
, ((0, xF86XK_Search), spawnDmenu "dmenu_run")
, ((0, xF86XK_Calculator), spawnTerminal "bc -i")
, ((0, xF86XK_Tools), spawnTerminal "ncmpcpp")
, ((0, xF86XK_AudioPrev), spawn "mpc prev")
, ((0, xF86XK_AudioNext), spawn "mpc next")
, ((0, xF86XK_AudioPlay), spawn "mpc toggle")
, ((0, xF86XK_AudioStop), spawn "mpc stop")
, ((0, xF86XK_AudioMute), spawn "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle && pipe_volume")
, ((0, xF86XK_AudioLowerVolume), spawn "wpctl set-mute @DEFAULT_AUDIO_SINK@ 5%- && pipe_volume")
, ((0, xF86XK_AudioRaiseVolume), spawn "wpctl set-mute @DEFAULT_AUDIO_SINK@ 5%+ && pipe_volume")
((0, xF86XK_Explorer), spawnTerminal "nnn"),
((0, xF86XK_Search), spawnDmenu "dmenu_run"),
((0, xF86XK_Calculator), spawnTerminal "bc -i"),
((0, xF86XK_Tools), spawnTerminal "ncmpcpp"),
((0, xF86XK_AudioPrev), spawn "mpc prev"),
((0, xF86XK_AudioNext), spawn "mpc next"),
((0, xF86XK_AudioPlay), spawn "mpc toggle"),
((0, xF86XK_AudioStop), spawn "mpc stop"),
((0, xF86XK_AudioMute), spawn "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle && pipe_volume"),
((0, xF86XK_AudioLowerVolume), spawn "wpctl set-mute @DEFAULT_AUDIO_SINK@ 5%- && pipe_volume"),
((0, xF86XK_AudioRaiseVolume), spawn "wpctl set-mute @DEFAULT_AUDIO_SINK@ 5%+ && pipe_volume"),
-- Layouts
, ((modMask, xK_a), submap . M.fromList $
[ ((modMask, xK_t), sendMessage $ JumpToLayout "Tall")
, ((modMask, xK_y), sendMessage $ JumpToLayout "Wide")
, ((modMask, xK_g), sendMessage $ JumpToLayout "Grid")
, ((modMask, xK_a), sendMessage $ NextLayout)
( (modMask, xK_a),
submap . M.fromList $
[ ((modMask, xK_t), sendMessage $ JumpToLayout "Tall"),
((modMask, xK_y), sendMessage $ JumpToLayout "Wide"),
((modMask, xK_g), sendMessage $ JumpToLayout "Grid"),
((modMask, xK_a), sendMessage NextLayout)
]
)
, ((modMask, xK_b), sendMessage ToggleStruts)
),
((modMask, xK_b), sendMessage ToggleStruts),
-- Window focus/swap
, ((modMask, xK_j), windows W.focusDown)
, ((modMask, xK_k), windows W.focusUp)
, ((modMask .|. shiftMask, xK_j), windows W.swapDown)
, ((modMask .|. shiftMask, xK_k), windows W.swapUp)
((modMask, xK_j), windows W.focusDown),
((modMask, xK_k), windows W.focusUp),
((modMask .|. shiftMask, xK_j), windows W.swapDown),
((modMask .|. shiftMask, xK_k), windows W.swapUp),
-- Master control
, ((modMask, xK_h), sendMessage Shrink)
, ((modMask, xK_l), sendMessage Expand)
, ((modMask, xK_i), sendMessage $ IncMasterN 1)
, ((modMask, xK_d), sendMessage $ IncMasterN $ -1)
, ((modMask, xK_s), windows W.focusMaster)
, ((modMask .|. shiftMask, xK_s), windows W.swapMaster)
((modMask, xK_h), sendMessage Shrink),
((modMask, xK_l), sendMessage Expand),
((modMask, xK_i), sendMessage $ IncMasterN 1),
((modMask, xK_d), sendMessage $ IncMasterN $ -1),
((modMask, xK_s), windows W.focusMaster),
((modMask .|. shiftMask, xK_s), windows W.swapMaster),
-- Window actions
, ((modMask .|. shiftMask, xK_c), kill)
, ((modMask .|. shiftMask, xK_f), withFocused toggleFullFloat)
, ((modMask .|. shiftMask, xK_space), withFocused toggleFloat)
((modMask .|. shiftMask, xK_c), kill),
((modMask .|. shiftMask, xK_f), withFocused toggleFullFloat),
((modMask .|. shiftMask, xK_space), withFocused toggleFloat),
-- Scratchpads
, ((modMask .|. controlMask, xK_Return), namedScratchpadAction myScratchPads "terminal")
, ((modMask .|. controlMask, xK_c), namedScratchpadAction myScratchPads "ncmpcpp")
((modMask .|. controlMask, xK_Return), namedScratchpadAction myScratchPads "terminal"),
((modMask .|. controlMask, xK_c), namedScratchpadAction myScratchPads "ncmpcpp"),
-- Session
, ((modMask .|. controlMask, xK_Delete), io $ exitWith ExitSuccess)
, ((modMask .|. controlMask, xK_s), spawn "xmonad --recompile && xmonad --restart")
] ++
((modMask .|. controlMask, xK_Delete), io $ exitWith ExitSuccess),
((modMask .|. controlMask, xK_s), spawn "xmonad --recompile && xmonad --restart && notify-send 'xmonad' 'Successfully rebuilt and restarted.'")
]
++
-- View and send windows to workspaces 1-9
[ ((modMask .|. m, k), windows $ f i)
| (k, i) <- zip [xK_1 .. xK_9] (XMonad.workspaces conf)
, (m, f) <- [(0, W.view), (shiftMask, W.shift)]
| (k, i) <- zip [xK_1 .. xK_9] (XMonad.workspaces conf),
(m, f) <- [(0, W.view), (shiftMask, W.shift)]
]
where
toggleFloat :: Window -> X ()
@ -165,55 +158,61 @@ myKeys conf@(XConfig {XMonad.modMask = modMask}) = M.fromList $
-- MOUSE BINDS ---------------------------------------------------------
myMouseBindings :: XConfig Layout -> M.Map (KeyMask, Button) (Window -> X ())
myMouseBindings (XConfig {XMonad.modMask = modMask}) = M.fromList $
myMouseBindings (XConfig {XMonad.modMask = modMask}) =
M.fromList $
-- Set the window to floating mode and move by dragging
[ ((modMask, button1), (\w -> focus w >> mouseMoveWindow w))
[ ((modMask, button1), (\w -> focus w >> mouseMoveWindow w)),
-- Raise the window to the top of the stack
, ((modMask, button2), (\w -> focus w >> windows W.shiftMaster))
((modMask, button2), (\w -> focus w >> windows W.shiftMaster)),
-- Set the window to floating mode and resize by dragging
, ((modMask, button3), (\w -> focus w >> mouseResizeWindow w))
((modMask, button3), (\w -> focus w >> mouseResizeWindow w)),
-- Switch to previous workspace
, ((modMask, button4), (\_ -> prevWS))
((modMask, button4), (\_ -> prevWS)),
-- Switch to next workspace
, ((modMask, button5), (\_ -> nextWS))
((modMask, button5), (\_ -> nextWS)),
-- Send client to previous workspace
, ((modMask .|. shiftMask, button4), (\_ -> shiftToPrev >> prevWS))
((modMask .|. shiftMask, button4), (\_ -> shiftToPrev >> prevWS)),
-- Send client to next workspace
, ((modMask .|. shiftMask, button5), (\_ -> shiftToNext >> nextWS))
((modMask .|. shiftMask, button5), (\_ -> shiftToNext >> nextWS))
]
-- LAYOUTS -------------------------------------------------------------
myLayoutHook =
avoidStruts
$ tall ||| wide ||| grid
avoidStruts $
tall ||| wide ||| grid
where
tall = named "Tall"
$ Tall 1 (3/100) (1/2)
wide = named "Wide"
$ Mirror tall
grid = named "Grid"
$ Grid
tall =
named "Tall" $
Tall 1 (3 / 100) (1 / 2)
wide =
named "Wide" $
Mirror tall
grid =
named "Grid" $
Grid
mySWNConfig :: SWNConfig
mySWNConfig = def
{ swn_font = "Fira Mono 24"
, swn_fade = 1.0
, swn_bgcolor = "#121212"
, swn_color = "#cccccc"
mySWNConfig =
def
{ swn_font = "Fira Mono 24",
swn_fade = 1.0,
swn_bgcolor = "#121212",
swn_color = "#cccccc"
}
-- SCRATCHPADS ---------------------------------------------------------
myScratchPads :: [NamedScratchpad]
myScratchPads =
[ constructScratchpad "terminal" "scTerminal" Nothing
, constructScratchpad "ncmpcpp" "scNcmpcpp" (Just "ncmpcpp")
[ constructScratchpad "terminal" "scTerminal" Nothing,
constructScratchpad "ncmpcpp" "scNcmpcpp" (Just "ncmpcpp")
]
where
constructScratchpad :: String -> String -> Maybe String -> NamedScratchpad
constructScratchpad name cls maybeExec =
NS name
NS
name
( case maybeExec of
Just exec -> printf "%s -c %s -e %s" myTerminal cls exec
Nothing -> printf "%s -c %s" myTerminal cls
@ -224,12 +223,13 @@ myScratchPads =
-- HOOKS ---------------------------------------------------------------
myManageHook :: ManageHook
myManageHook = composeAll
[ placeHook $ smart (0.5, 0.5)
, namedScratchpadManageHook myScratchPads
, insertPosition End Newer
, manageDocks
, composeAll [ className =? c --> doFloat | c <- floatClasses ]
myManageHook =
composeAll
[ placeHook $ smart (0.5, 0.5),
namedScratchpadManageHook myScratchPads,
insertPosition End Newer,
manageDocks,
composeAll [className =? c --> doFloat | c <- floatClasses]
]
myEventHook :: Event -> X All
@ -243,11 +243,12 @@ myStartupHook = do
-- XMOBAR --------------------------------------------------------------
myPP :: PP
myPP = def
{ ppSep = sep " | "
, ppCurrent = current . wrap "" "*"
, ppHidden = noScratchPad
, ppHiddenNoWindows = \_ -> ""
myPP =
def
{ ppSep = sep " | ",
ppCurrent = current . wrap "" "*",
ppHidden = noScratchPad,
ppHiddenNoWindows = \_ -> ""
}
where
noScratchPad :: String -> String
@ -260,25 +261,24 @@ myPP = def
-- MAIN ----------------------------------------------------------------
main :: IO ()
main = xmonad
main =
xmonad
. withSB (statusBarProp "xmobar" $ pure myPP)
. toggleFullFloatEwmhFullscreen
. ewmhFullscreen
. ewmh
$ myConfig
myConfig = def
{ borderWidth = myBorderWidth
, normalBorderColor = myNormalBorderColor
, focusedBorderColor = myFocusedBorderColor
, layoutHook = myLayoutHook
, workspaces = myWorkspaces
, manageHook = myManageHook
, handleEventHook = myEventHook
, startupHook = myStartupHook
, focusFollowsMouse = True
, clickJustFocuses = False
, modMask = mod4Mask
, mouseBindings = myMouseBindings
, keys = myKeys
$ def
{ borderWidth = myBorderWidth,
normalBorderColor = myNormalBorderColor,
focusedBorderColor = myFocusedBorderColor,
layoutHook = myLayoutHook,
workspaces = myWorkspaces,
manageHook = myManageHook,
handleEventHook = myEventHook,
startupHook = myStartupHook,
focusFollowsMouse = True,
clickJustFocuses = False,
modMask = mod4Mask,
mouseBindings = myMouseBindings,
keys = myKeys
}