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