diff --git a/.config/xmobar/.gitignore b/.config/xmobar/.gitignore deleted file mode 100644 index 8a085be..0000000 --- a/.config/xmobar/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/dist-* diff --git a/.config/xmobar/xmobar-frosty.cabal b/.config/xmobar/xmobar-frosty.cabal deleted file mode 100644 index 6e1c894..0000000 --- a/.config/xmobar/xmobar-frosty.cabal +++ /dev/null @@ -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 diff --git a/.config/xmonad/build b/.config/xmonad/build new file mode 100755 index 0000000..42c08e6 --- /dev/null +++ b/.config/xmonad/build @@ -0,0 +1,4 @@ +#!/bin/sh + +cd "$XDG_CONFIG_HOME/xmonad" || exit +cabal install --overwrite-policy=always diff --git a/.config/xmobar/xmobar.hs b/.config/xmonad/xmobar.hs similarity index 100% rename from .config/xmobar/xmobar.hs rename to .config/xmonad/xmobar.hs diff --git a/.config/xmonad/xmonad-frosty.cabal b/.config/xmonad/xmonad-frosty.cabal index 30f5655..beb8aea 100644 --- a/.config/xmonad/xmonad-frosty.cabal +++ b/.config/xmonad/xmonad-frosty.cabal @@ -1,13 +1,30 @@ -cabal-version: 3.0 -name: xmonad-frosty -version: 0.1.0.0 -build-type: Simple +cabal-version: 3.0 +name: xmonad-frosty +version: 0.1.0.0 +build-type: Simple executable xmonad - main-is: xmonad.hs - build-depends: base ^>=4.17.2.1 - , xmonad >=0.18 - , xmonad-contrib >=0.18 - , containers - , X11 - default-language: Haskell2010 + main-is: xmonad.hs + ghc-options: -Wall -rtsopts -threaded -with-rtsopts=-N + build-depends: + , base + , containers + , X11 + , 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 diff --git a/.config/xmonad/xmonad.hs b/.config/xmonad/xmonad.hs index 8eab860..9c6c14c 100644 --- a/.config/xmonad/xmonad.hs +++ b/.config/xmonad/xmonad.hs @@ -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 -------------------------------------------------------- @@ -37,7 +37,7 @@ myBorderWidth :: Dimension myBorderWidth = 1 myNormalBorderColor, myFocusedBorderColor :: String -myNormalBorderColor = "#222222" +myNormalBorderColor = "#222222" myFocusedBorderColor = "#80b7ff" floatClasses, swallowClasses :: [String] @@ -47,238 +47,238 @@ 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") - - -- 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") - - -- 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") - - -- 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") - - -- 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_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"), + -- 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"), + -- 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"), + -- 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_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) - - -- 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) - - -- Window actions - , ((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") - - -- Session - , ((modMask .|. controlMask, xK_Delete), io $ exitWith ExitSuccess) - , ((modMask .|. controlMask, xK_s), spawn "xmonad --recompile && xmonad --restart") - ] ++ - - -- 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)] + ), + ((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), + -- 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), + -- Window actions + ((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"), + -- Session + ((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)] + ] where toggleFloat :: Window -> X () toggleFloat w = do - isFloating <- gets (M.member w . W.floating . windowset) - if isFloating - then windows $ W.sink w - else withFocused float - + isFloating <- gets (M.member w . W.floating . windowset) + if isFloating + then windows $ W.sink w + else withFocused float + spawnTerminal :: String -> X () spawnTerminal x = do - spawn $ printf "%s -e %s" myTerminal x - + spawn $ printf "%s -e %s" myTerminal x + spawnEditor :: String -> X () spawnEditor x = do - spawnTerminal $ printf "%s %s" myEditor x - + spawnTerminal $ printf "%s %s" myEditor x + spawnDmenu :: String -> X () spawnDmenu x = do - spawn $ printf "%s -h %s -fn %s -nb '%s' -nf '%s' -sb '%s' -sf '%s'" x "17" "Terminus-8" "#1d2021" "#ebdbb2" "#fabd2f" "#282828" + spawn $ printf "%s -h %s -fn %s -nb '%s' -nf '%s' -sb '%s' -sf '%s'" x "17" "Terminus-8" "#1d2021" "#ebdbb2" "#fabd2f" "#282828" -- 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)) - -- Raise the window to the top of the stack - , ((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)) - -- Switch to previous workspace - , ((modMask, button4), (\_ -> prevWS)) - -- Switch to next workspace - , ((modMask, button5), (\_ -> nextWS)) - -- Send client to previous workspace - , ((modMask .|. shiftMask, button4), (\_ -> shiftToPrev >> prevWS)) - -- Send client to next workspace - , ((modMask .|. shiftMask, button5), (\_ -> shiftToNext >> nextWS)) + [ ((modMask, button1), (\w -> focus w >> mouseMoveWindow w)), + -- Raise the window to the top of the stack + ((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)), + -- Switch to previous workspace + ((modMask, button4), (\_ -> prevWS)), + -- Switch to next workspace + ((modMask, button5), (\_ -> nextWS)), + -- Send client to previous workspace + ((modMask .|. shiftMask, button4), (\_ -> shiftToPrev >> prevWS)), + -- Send client to next workspace + ((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 - (case maybeExec of - Just exec -> printf "%s -c %s -e %s" myTerminal cls exec - Nothing -> printf "%s -c %s" myTerminal cls - ) - (className =? cls) - (customFloating $ W.RationalRect (3/5) (4/6) (1/5) (1/6)) + NS + name + ( case maybeExec of + Just exec -> printf "%s -c %s -e %s" myTerminal cls exec + Nothing -> printf "%s -c %s" myTerminal cls + ) + (className =? cls) + (customFloating $ W.RationalRect (3 / 5) (4 / 6) (1 / 5) (1 / 6)) -- 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 myEventHook = - swallowEventHook (foldr1 (<||>) $ map (\c -> className =? c) swallowClasses) (return True) + swallowEventHook (foldr1 (<||>) $ map (\c -> className =? c) swallowClasses) (return True) myStartupHook :: X () myStartupHook = do - spawn "sleep 0.5 && initialize_pipes" + spawn "sleep 0.5 && initialize_pipes" -- 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 noScratchPad ws = if ws == "NSP" then "" else ws sep, current :: String -> String - sep = xmobarColor "#777777" "" + sep = xmobarColor "#777777" "" current = xmobarColor "#6eadff" "" -- 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 + }