Compare commits
70 Commits
Author | SHA1 | Date |
---|---|---|
Martin Potier | f0f726f3ab | |
Martin Potier | 8b235d3a65 | |
Martin Potier | e4b903562b | |
Martin Potier | eb9f84e65f | |
Martin Potier | 8b162c7c31 | |
Martin Potier | 6070398070 | |
Martin Potier | db58691676 | |
Martin Potier | 64cedbb27e | |
Martin Potier | 90d4dbb58e | |
Martin Potier | f8bd90fb48 | |
Martin Potier | c70973d131 | |
Martin Potier | 5a9b9d09bd | |
Martin Potier | a131b1bb1b | |
Martin Potier | 5483cbda5e | |
Martin Potier | 18e653b6f2 | |
Martin Potier | 735ec3214a | |
Martin Potier | baac904283 | |
Martin Potier | 6694a0e07a | |
Martin Potier | c830fce008 | |
Martin Potier | 5a280ca7be | |
Martin Potier | 93c88791a1 | |
Martin Potier | 7941767bc4 | |
Martin Potier | b1c417b464 | |
Martin Potier | 049af82a9a | |
Martin Potier | ae1da29574 | |
Martin Potier | 9b561492e8 | |
Martin Potier | 9cacbb2a0b | |
Martin Potier | 558f52c01b | |
Martin Potier | 767c37d492 | |
Martin Potier | 8d1c03a862 | |
Martin Potier | 29a3874b34 | |
Martin Potier | 7f7fd27fd6 | |
Martin Potier | 1b3f67199e | |
Martin Potier | 8cdfff9901 | |
Martin Potier | d9d0f13cbb | |
Martin Potier | 8914400110 | |
Martin Potier | 24581f06d0 | |
Martin Potier | d51ced34d5 | |
Martin Potier | 6f4d2c30c5 | |
Martin Potier | de4c5cc9c4 | |
Martin Potier | e1dfa4b269 | |
Martin Potier | 8bd5e58c8a | |
Martin Potier | 24ec645a56 | |
Martin Potier | ebeb708303 | |
Martin Potier | 05ca473721 | |
Martin Potier | cf5baddf49 | |
Martin Potier | a8b1a0d92d | |
Martin Potier | 1ac9836718 | |
Martin Potier | b0cfdbe530 | |
Martin Potier | 3893cdb68e | |
Martin Potier | 4fe78658cd | |
Martin Potier | 807734ba81 | |
Martin Potier | c7117f7e3e | |
Martin Potier | c604a4c006 | |
Martin Potier | dd15ccfe6e | |
Martin Potier | 9cc302cb98 | |
Martin Potier | 7bfe1c43bc | |
Martin Potier | 26b9fd7e68 | |
Martin Potier | a6f50829ae | |
Martin Potier | 1f4e774ad7 | |
Martin Potier | ba75e65498 | |
Martin Potier | c174503244 | |
Martin Potier | 37631ed6a2 | |
Martin Potier | 5bf31dac93 | |
Martin Potier | c0dba2d167 | |
Martin Potier | 1fba240b51 | |
Martin Potier | bc82caba10 | |
Martin Potier | 310dfd47eb | |
Martin Potier | bdf505f52f | |
Martin Potier | c1c83e186e |
|
@ -1,10 +1,8 @@
|
|||
.*.swp
|
||||
artwork/
|
||||
artwork
|
||||
*.hi
|
||||
*.o
|
||||
.direnv/
|
||||
prompt-history
|
||||
xmonad-x86_64-linux
|
||||
xmonad.errors
|
||||
xmonad.state
|
||||
dist-newstyle
|
||||
|
|
|
@ -1,5 +0,0 @@
|
|||
# Revision history for xmonad-config
|
||||
|
||||
## 0.1.0.0 -- YYYY-mm-dd
|
||||
|
||||
* First version. Released on an unsuspecting world.
|
|
@ -17,11 +17,11 @@
|
|||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1670064435,
|
||||
"narHash": "sha256-+ELoY30UN+Pl3Yn7RWRPabykwebsVK/kYE9JsIsUMxQ=",
|
||||
"lastModified": 1670242877,
|
||||
"narHash": "sha256-jBLh7dRHnbfvPPA9znOC6oQfKrCPJ0El8Zoe0BqnCjQ=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "61a8a98e6d557e6dd7ed0cdb54c3a3e3bbc5e25c",
|
||||
"rev": "6e51c97f1c849efdfd4f3b78a4870e6aa2da4198",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
|
|
@ -11,6 +11,7 @@ import Graphics.X11.Types
|
|||
import System.Exit
|
||||
-- import Text.EditDistance
|
||||
import XMonad
|
||||
import XMonad.Actions.CopyWindow (kill1,copy)
|
||||
import XMonad.Actions.CycleWS
|
||||
import XMonad.Actions.DynamicProjects
|
||||
import XMonad.Core
|
||||
|
@ -20,16 +21,19 @@ import XMonad.Prompt
|
|||
import XMonad.Prompt.ConfirmPrompt
|
||||
import XMonad.Prompt.FuzzyMatch
|
||||
import XMonad.Prompt.Shell
|
||||
import XMonad.Prompt.Workspace (workspacePrompt)
|
||||
import XMonad.Util.EZConfig
|
||||
import XMonad.Util.NamedScratchpad
|
||||
import qualified Nord as N
|
||||
import qualified Solarized as S
|
||||
import qualified Scratchpad as R
|
||||
import qualified XMonad.StackSet as W
|
||||
|
||||
|
||||
-- Custom (in libs)
|
||||
import Password (passPrompt)
|
||||
|
||||
lockScreenCmd =
|
||||
spawn "/etc/profiles/per-user/e/bin/mpc pause; /run/current-system/sw/bin/xset s activate"
|
||||
|
||||
modify :: XConfig l -> XConfig l
|
||||
modify conf = conf
|
||||
{ modMask = mod4Mask -- Use the "Win" key for the mod key
|
||||
|
@ -37,12 +41,20 @@ modify conf = conf
|
|||
|
||||
`additionalKeysP` -- Add some extra key bindings:
|
||||
[ ("M-S-q", confirmPrompt promptConfig "exit" (io exitSuccess))
|
||||
, ("<XF86MonBrightnessDown>", spawn "/run/current-system/sw/bin/xbacklight -10")
|
||||
, ("<XF86MonBrightnessUp>", spawn "/run/current-system/sw/bin/xbacklight +10")
|
||||
, ("<XF86AudioPlay>", spawn "/run/current-system/sw/bin/mpc toggle")
|
||||
, ("<XF86AudioNext>", spawn "/run/current-system/sw/bin/mpc next")
|
||||
, ("<XF86AudioPrev>", spawn "/run/current-system/sw/bin/mpc prev")
|
||||
, ("M-<Delete>", kill)
|
||||
, ("<XF86MonBrightnessDown>", spawn "/run/current-system/sw/bin/light -U 10")
|
||||
, ("<XF86MonBrightnessUp>", spawn "/run/current-system/sw/bin/light -A 10")
|
||||
, ("<XF86AudioPlay>", spawn "/etc/profiles/per-user/e/bin/mpc toggle")
|
||||
, ("<XF86AudioNext>", spawn "/etc/profiles/per-user/e/bin/mpc next")
|
||||
, ("<XF86AudioPrev>", spawn "/etc/profiles/per-user/e/bin/mpc prev")
|
||||
-- KP_1 -> KP_6 macros
|
||||
, ("<XF86Tools>", viewProject "sound")
|
||||
, ("<XF86Launch5>", viewProject "frs")
|
||||
, ("<XF86Launch6>", viewProject "chat")
|
||||
, ("<XF86Launch7>", viewProject "isengard")
|
||||
, ("<XF86Launch8>", viewProject "moria")
|
||||
, ("<XF86Launch9>", viewProject "fre")
|
||||
-- KP_Delete
|
||||
, ("Cancel", lockScreenCmd)
|
||||
, ("M-<Down>", windows W.focusDown)
|
||||
, ("M-<Esc>", sendMessage (Toggle "Full"))
|
||||
, ("M-$", sendMessage (Toggle "Full"))
|
||||
|
@ -52,31 +64,37 @@ modify conf = conf
|
|||
, ("M-<Right>", nextWS)
|
||||
, ("M-<Tab>", toggleWS' ["NSP"])
|
||||
, ("M-<Up>", windows W.focusUp)
|
||||
, ("M-S-<Delete>", spawn "/run/current-system/sw/bin/mpc pause; /run/current-system/sw/bin/xset s activate")
|
||||
, ("M-S-<Delete>", lockScreenCmd)
|
||||
, ("M-S-<Left>", shiftToPrev >> prevWS)
|
||||
, ("M-S-<Right>", shiftToNext >> nextWS)
|
||||
, ("M-s s", spawn "flameshot gui")
|
||||
, ("M-s s", spawn "/etc/profiles/per-user/e/bin/flameshot gui")
|
||||
, ("M-s t", spawn "/run/current-system/sw/bin/scrot /tmp/screen.png")
|
||||
-- Workspace and tasks
|
||||
, ("M-b", switchProjectPrompt promptConfig)
|
||||
, ("M-p c", withFocused centerWindow)
|
||||
, ("M-p m", shiftToProjectPrompt promptConfig)
|
||||
, ("M-p n", switchProjectPrompt promptConfig)
|
||||
, ("M-p r", renameProjectPrompt promptConfig)
|
||||
, ("M-p s", shellPrompt promptConfig)
|
||||
, ("M-p c", withFocused centerWindow)
|
||||
, ("M-d", passPrompt promptConfig)
|
||||
-- Scratchpads
|
||||
, ("M-p p", namedScratchpadAction R.pads "htop")
|
||||
-- Dunst
|
||||
, ("C-<Space>", spawn "dunstctl close")
|
||||
-- Copy windows to workspaces
|
||||
, ("M-<Delete>", kill1)
|
||||
, ("M-c", workspacePrompt promptConfig (\name -> windows $ copy name))
|
||||
-- Mouse stuff
|
||||
, ("<F9>", spawn "find-cursor")
|
||||
-- , ("M-$ $", spawn "xdotool click 3")
|
||||
-- , ("M-$ M-$", spawn "xdotool click 3") -- helpfull to combine M + right click
|
||||
-- resizing the master/slave ratio
|
||||
, ("M-h", sendMessage Shrink) -- Shrink the master area
|
||||
, ("M-l", sendMessage Expand) -- Expand the master area
|
||||
-- dunstctl calls
|
||||
-- , ("C-<Space>", spawn "dunstctl close")
|
||||
, ("C-S-<Space>", spawn "dunstctl close-all")
|
||||
, ("M-n p", spawn "dunstctl set-paused toggle")
|
||||
]
|
||||
|
||||
viewProject :: WorkspaceId -> X ()
|
||||
viewProject id = do
|
||||
project <- lookupProject id
|
||||
forM_ project switchProject
|
||||
|
||||
-- Borrowed from https://www.reddit.com/r/xmonad/comments/gzq316/how_can_i_centre_a_floating_window_without/fthtx29/
|
||||
centerWindow :: Window -> X ()
|
||||
|
@ -85,19 +103,23 @@ centerWindow win = do
|
|||
windows $ W.float win (W.RationalRect ((1 - w) / 2) ((1 - h) / 2) w h)
|
||||
return ()
|
||||
|
||||
viewProject :: WorkspaceId -> X ()
|
||||
viewProject id = do
|
||||
project <- lookupProject id
|
||||
case project of
|
||||
Just p -> switchProject p
|
||||
Nothing -> return ()
|
||||
|
||||
promptConfig = def
|
||||
{ position = Bottom
|
||||
, alwaysHighlight = True
|
||||
, borderColor = N.nord9
|
||||
-- Normal
|
||||
, bgColor = N.nord9
|
||||
, fgColor = N.background
|
||||
-- Selection
|
||||
, bgHLight = N.nord6
|
||||
, fgHLight = N.background
|
||||
--
|
||||
, bgColor = S.magenta
|
||||
, bgHLight = S.base0
|
||||
, borderColor = S.magenta
|
||||
, defaultText = ""
|
||||
, font = "xft:Iosevka Samae:style=Regular:size=8:charwidth=5"
|
||||
, fgColor = S.base02
|
||||
, fgHLight = S.base03
|
||||
, font = "xft:Iosevka Samae:style=Regular:size=10:charwidth=6.5"
|
||||
, height = 24
|
||||
, promptBorderWidth = 5
|
||||
-- Fuzzysearch by default
|
||||
|
|
|
@ -9,3 +9,4 @@ modify :: XConfig l -> XConfig l
|
|||
modify conf = conf
|
||||
{ logHook = logHook conf >> updatePointer (0.5,0.5) (0,0)
|
||||
}
|
||||
|
||||
|
|
91
lib/Nord.hs
91
lib/Nord.hs
|
@ -1,91 +0,0 @@
|
|||
module Nord
|
||||
( nord0
|
||||
, nord1
|
||||
, nord2
|
||||
, nord3
|
||||
, nord4
|
||||
, nord5
|
||||
, nord6
|
||||
, nord7
|
||||
, nord8
|
||||
, nord9
|
||||
, nord10
|
||||
, nord11
|
||||
, nord12
|
||||
, nord13
|
||||
, nord14
|
||||
, nord15
|
||||
, yellow
|
||||
, orange
|
||||
, red
|
||||
, purple
|
||||
, green
|
||||
, background
|
||||
, backgroundhl
|
||||
, foreground
|
||||
, foregroundhl
|
||||
, foregroundll
|
||||
) where
|
||||
|
||||
-- POLAR NIGHT
|
||||
-- The origin color or the Polar Night palette.
|
||||
nord0 = "#2E3440";
|
||||
|
||||
-- A brighter shade color based on nord0.
|
||||
nord1 = "#3B4252";
|
||||
|
||||
-- An even more brighter shade color of nord0.
|
||||
nord2 = "#434C5E";
|
||||
|
||||
-- The brightest shade color based on nord0.
|
||||
nord3 = "#4C566A";
|
||||
|
||||
-- SNOW STORM
|
||||
-- The origin color or the Snow Storm palette.
|
||||
nord4 = "#D8DEE9";
|
||||
|
||||
-- A brighter shade color of nord4.
|
||||
nord5 = "#E5E9F0";
|
||||
|
||||
-- The brightest shade color based on nord4.
|
||||
nord6 = "#ECEFF4";
|
||||
|
||||
-- FROST
|
||||
-- A calm and highly contrasted color reminiscent of frozen polar water.
|
||||
nord7 = "#8FBCBB";
|
||||
|
||||
-- The bright and shiny primary accent color reminiscent of pure and clear ice.
|
||||
nord8 = "#88C0D0";
|
||||
|
||||
-- A more darkened and less saturated color reminiscent of arctic waters.
|
||||
nord9 = "#81A1C1";
|
||||
|
||||
-- A dark and intensive color reminiscent of the deep arctic ocean.
|
||||
nord10 = "#5E81AC";
|
||||
|
||||
-- AURORA
|
||||
-- RED
|
||||
nord11 = "#BF616A";
|
||||
|
||||
-- ORANGE
|
||||
nord12 = "#D08770";
|
||||
|
||||
-- YELLOW
|
||||
nord13 = "#EBCB8B";
|
||||
|
||||
-- GREEN
|
||||
nord14 = "#A3BE8C";
|
||||
|
||||
-- PURPLE
|
||||
nord15 = "#B48EAD";
|
||||
|
||||
foregroundhl = nord6
|
||||
foreground = nord5
|
||||
foregroundll = nord4
|
||||
backgroundhl = nord1
|
||||
background = nord0
|
||||
red = nord11
|
||||
orange = nord12
|
||||
yellow = nord13
|
||||
green = nord14
|
||||
purple = nord15
|
|
@ -33,36 +33,23 @@ passGeneratePrompt :: XPConfig -> X ()
|
|||
passGeneratePrompt _ = return () -- Not implemented
|
||||
|
||||
passPrompt :: XPConfig -> X ()
|
||||
passPrompt = mkPassPrompt "Select password" selectPassword
|
||||
passPrompt = mkPassPrompt "Select password" copyPassword
|
||||
|
||||
mkPassPrompt :: String -> (String -> X ()) -> XPConfig -> X ()
|
||||
mkPassPrompt label f conf = do
|
||||
-- I'm just sorting here, but could use some kind of fuzzy matching instead,
|
||||
-- but it requires a bit more effort
|
||||
-- I'm just sorting here, but could use some kind of fuzzy matching instead, but it requires a bit more effort
|
||||
passwords <- sort <$> liftIO getPasswords
|
||||
mkXPrompt (Pass label) conf (passComplFun passwords) f
|
||||
-- Other change, use infixof instead of prefixof
|
||||
mkXPrompt (Pass label) conf (\input -> pure (sortBy (compare `on` levenshtein input) . take 5 . filter (consumes input) $ passwords)) f
|
||||
where
|
||||
consumes [] _ = True -- everything consumed
|
||||
consumes (_:_) [] = False -- all not consumed
|
||||
consumes (a:xs) (a':ys) | a == a' = consumes xs ys
|
||||
| otherwise = consumes (a:xs) ys
|
||||
getPasswords = do
|
||||
passwordStoreDir <- (</> "pass") <$> getHomeDirectory
|
||||
files <- runProcessWithInput "find"
|
||||
[ passwordStoreDir, "-type", "f", "-name", "*.gpg", "-printf"
|
||||
, "%p\n"] []
|
||||
files <- runProcessWithInput "find" [ passwordStoreDir, "-type", "f", "-name", "*.gpg", "-printf", "%p\n"] []
|
||||
return . lines $ files
|
||||
|
||||
-- | Find all entries (`allPasses`) matching `input`
|
||||
passComplFun :: [String] -> String -> IO [String]
|
||||
passComplFun allPasses input = pure $
|
||||
sortBy (compare `on` levenshtein input)
|
||||
. take 10
|
||||
. filter (consumes input)
|
||||
$ allPasses
|
||||
where
|
||||
consumes [] _ = True -- everything consumed
|
||||
consumes (_:_) [] = False -- all not consumed
|
||||
consumes (a:xs) (a':ys) | a == a' = consumes xs ys
|
||||
| otherwise = consumes (a:xs) ys
|
||||
|
||||
selectPassword :: String -> X ()
|
||||
selectPassword pass = spawn $ "gpg --decrypt " ++ pass ++ " | copy"
|
||||
-- “copy” comes with the xmonad module in the nix configuration
|
||||
|
||||
copyPassword :: String -> X ()
|
||||
copyPassword pass = spawn $ "gpg --decrypt " ++ pass ++ " | copy"
|
||||
|
|
243
lib/Projects.hs
243
lib/Projects.hs
|
@ -6,135 +6,134 @@ import XMonad
|
|||
import XMonad.Actions.DynamicProjects
|
||||
import XMonad.Util.Run
|
||||
|
||||
term = "kitty"
|
||||
spinTextEditorAndTerm :: String -> String -> Project
|
||||
spinTextEditorAndTerm dir name =
|
||||
Project { projectName = name
|
||||
, projectDirectory = dir <> name
|
||||
, projectStartHook = Just
|
||||
$ safeSpawn "nvidia-offload" ["kitty","tmux","new","-A","-s",name]
|
||||
}
|
||||
|
||||
spawnGuiTextEditor :: X ()
|
||||
spawnGuiTextEditor = safeSpawn "neovide" []
|
||||
spinChat :: String -> Project
|
||||
spinChat name =
|
||||
Project { projectName = name
|
||||
, projectDirectory = "/tmp"
|
||||
, projectStartHook = Just $ do safeSpawnProg (name <> "-desktop")
|
||||
}
|
||||
|
||||
singleTermAppWithName :: String -> String -> Project
|
||||
singleTermAppWithName name app = Project
|
||||
{ projectName = name
|
||||
, projectDirectory = "/tmp"
|
||||
, projectStartHook = Just $ do safeSpawn term ["zsh","-c",app]
|
||||
}
|
||||
spinInTermWithName :: String -> String -> Project
|
||||
spinInTermWithName projectName cmd =
|
||||
Project { projectName = projectName
|
||||
, projectDirectory = "/tmp"
|
||||
, projectStartHook = Just $ do safeSpawn "kitty" [cmd]
|
||||
}
|
||||
|
||||
singleAppWithName :: String -> String -> Project
|
||||
singleAppWithName name app = Project
|
||||
{ projectName = name
|
||||
, projectDirectory = "/tmp"
|
||||
, projectStartHook = Just $ do spawn app
|
||||
}
|
||||
spinInTerm :: String -> Project
|
||||
spinInTerm name = spinInTermWithName name name
|
||||
|
||||
singleApp :: String -> Project
|
||||
singleApp app = singleAppWithName app app
|
||||
justStart :: String -> Project
|
||||
justStart name = justStartWithName name name
|
||||
|
||||
justStartWithName :: String -> String -> Project
|
||||
justStartWithName name pgm =
|
||||
Project { projectName = name
|
||||
, projectDirectory = "/tmp"
|
||||
, projectStartHook = Just $ do safeSpawnProg pgm
|
||||
}
|
||||
|
||||
spinNotes :: Project
|
||||
spinNotes =
|
||||
Project { projectName = "notes"
|
||||
, projectDirectory = "~/zk/org-roam/"
|
||||
, projectStartHook = Just $ do safeSpawn "emacs" ["~/zk/org-roam/20240202124747-index.org"]
|
||||
}
|
||||
|
||||
adminProject = spinTextEditorAndTerm "~/admin/"
|
||||
candyProject = spinTextEditorAndTerm "~/candy/"
|
||||
workProject = spinTextEditorAndTerm "~/relex/"
|
||||
workAnsibleProject = spinTextEditorAndTerm "~/relex/ansible-roles/"
|
||||
|
||||
projects :: [Project]
|
||||
projects =
|
||||
[ singleApp "carla"
|
||||
, singleApp "obs"
|
||||
, singleApp "reaper"
|
||||
, singleApp "renoise"
|
||||
, singleApp "mixxx"
|
||||
, singleAppWithName "Books" "calibre"
|
||||
, singleAppWithName "discord" "Discord"
|
||||
, singleAppWithName "matrix" "element-desktop"
|
||||
, singleAppWithName "signal" "signal-desktop"
|
||||
, singleAppWithName "vcv" "Rack"
|
||||
, singleTermAppWithName "email" "neomutt"
|
||||
, Project { projectName = "admin"
|
||||
, projectDirectory = "~/admin/nixos-config"
|
||||
, projectStartHook = Just $ do spawnGuiTextEditor
|
||||
safeSpawnProg term
|
||||
}
|
||||
, Project { projectName = "nixpkgs"
|
||||
, projectDirectory = "~/admin/nixpkgs"
|
||||
, projectStartHook = Just $ do spawnGuiTextEditor
|
||||
safeSpawnProg term
|
||||
}
|
||||
, Project { projectName = "overlays-personal"
|
||||
, projectDirectory = "~/admin/overlays-personal"
|
||||
, projectStartHook = Just $ do spawnGuiTextEditor
|
||||
safeSpawnProg term
|
||||
}
|
||||
, Project { projectName = "steam"
|
||||
, projectDirectory = "/tmp"
|
||||
, projectStartHook = Just $ safeSpawn "steam" ["-pipewire"]
|
||||
}
|
||||
, Project { projectName = "youtube"
|
||||
, projectDirectory = "/tmp"
|
||||
, projectStartHook = Just $ safeSpawn "chromium"
|
||||
["--app=youtube.com"
|
||||
,"--incognito"]
|
||||
}
|
||||
, Project { projectName = "cdc-config"
|
||||
, projectDirectory = "~/admin/cdc-config"
|
||||
, projectStartHook = Just $ do spawnGuiTextEditor
|
||||
safeSpawnProg term
|
||||
}
|
||||
, Project { projectName = "saehkoepoika-config"
|
||||
, projectDirectory = "~/admin/saehkoepoika-configuration-nix"
|
||||
, projectStartHook = Just $ do spawnGuiTextEditor
|
||||
safeSpawnProg term
|
||||
}
|
||||
, Project { projectName = "cdc-documentation"
|
||||
, projectDirectory = "~/admin/cdc-documentation"
|
||||
, projectStartHook = Just $ do
|
||||
safeSpawnProg term
|
||||
spawnGuiTextEditor
|
||||
}
|
||||
, Project { projectName = "adventOfCode"
|
||||
, projectDirectory = "~/candy/adventofcode"
|
||||
, projectStartHook = Just $ do
|
||||
safeSpawnProg term
|
||||
spawnGuiTextEditor
|
||||
}
|
||||
, Project { projectName = "rukokuoppa"
|
||||
, projectDirectory = "~/candy/rukokuoppa"
|
||||
, projectStartHook = Just $ do spawnGuiTextEditor
|
||||
safeSpawnProg term
|
||||
}
|
||||
, Project { projectName = "notes"
|
||||
, projectDirectory = "~/zk/org-roam-private"
|
||||
, projectStartHook = Just $ safeSpawn "emacs" ["~/zk/org-roam-private"]
|
||||
}
|
||||
, Project { projectName = "groceries"
|
||||
, projectDirectory = "/tmp"
|
||||
, projectStartHook = Just $ safeSpawnProg "obsidian"
|
||||
}
|
||||
, Project { projectName = "xmonad"
|
||||
, projectDirectory = "~/.xmonad"
|
||||
, projectStartHook = Just $ do spawnGuiTextEditor
|
||||
safeSpawnProg term
|
||||
}
|
||||
, Project { projectName = "waymonad"
|
||||
, projectDirectory = "~/candy/waymonad"
|
||||
, projectStartHook = Just $ do spawnGuiTextEditor
|
||||
safeSpawnProg term
|
||||
}
|
||||
, Project { projectName = "accounting"
|
||||
, projectDirectory = "~/accounting"
|
||||
, projectStartHook = Just $ do safeSpawnProg term
|
||||
}
|
||||
, Project { projectName = "arrangements"
|
||||
, projectDirectory = "~/candy/Arrangements"
|
||||
, projectStartHook = Just $ do spawnGuiTextEditor
|
||||
safeSpawnProg term
|
||||
}
|
||||
, Project { projectName = "flim"
|
||||
, projectDirectory = "/flims/rtorrent/download"
|
||||
, projectStartHook = Just $ do safeSpawnProg term
|
||||
}
|
||||
, Project { projectName = "sound"
|
||||
, projectDirectory = "/tmp"
|
||||
, projectStartHook = Just $ do safeSpawnProg "pavucontrol"
|
||||
}
|
||||
, Project { projectName = "web"
|
||||
, projectDirectory = "/tmp"
|
||||
, projectStartHook = Just $ do spawn "firefox"
|
||||
}
|
||||
]
|
||||
projects = [ adminProject "wrk-config"
|
||||
, adminProject "cdc-config"
|
||||
, adminProject "overlays-personal"
|
||||
, candyProject "adventofcode"
|
||||
, candyProject "dhall-packages"
|
||||
, candyProject "hfdb"
|
||||
, justStartWithName "fre" "ff-perso"
|
||||
, justStartWithName "frs" "ff-relex"
|
||||
, justStartWithName "chat" "slack"
|
||||
, justStartWithName "meet" "chromium"
|
||||
, spinNotes
|
||||
, justStartWithName "VPN" "gpclient"
|
||||
, spinChat "element"
|
||||
, spinChat "signal"
|
||||
, spinInTerm "k9s"
|
||||
, spinInTermWithName "email" "neomutt"
|
||||
, spinTextEditorAndTerm "~/." "xmonad" -- Dark magic!
|
||||
, workProject "azure-kube-platform"
|
||||
, workProject "azure-kube-platform-environments"
|
||||
, workProject "calculation-node-playbook"
|
||||
, workProject "communication-nix-101"
|
||||
, workProject "communication-nix-102"
|
||||
, workProject "communication-nix-103"
|
||||
, workProject "cooper"
|
||||
, workProject "crebain"
|
||||
, workProject "customer-configs"
|
||||
, workProject "customer-modules"
|
||||
, workProject "docker-images"
|
||||
, workProject "fangorn"
|
||||
, workProject "gitlab-runners"
|
||||
, workProject "gitlab-self-manage"
|
||||
, workProject "infra-inventory"
|
||||
, workProject "isengard"
|
||||
, workProject "isengard-2"
|
||||
, workProject "isengard-3"
|
||||
, workProject "jirawiz"
|
||||
, workAnsibleProject "java"
|
||||
, workProject "morannon"
|
||||
, workProject "mordor-ca"
|
||||
, workProject "mordor-deploy"
|
||||
, workProject "mordor-interview"
|
||||
, workProject "mordor-nixpkgs"
|
||||
, workProject "mordor-ops"
|
||||
, workProject "mordor-the-repo"
|
||||
, workProject "mordorbooks"
|
||||
, workProject "moria"
|
||||
, workProject "muir"
|
||||
, workProject "nix"
|
||||
, workProject "nix-ansible-role"
|
||||
, workProject "nixos-modules"
|
||||
, workProject "nixpkgs"
|
||||
, workProject "one-off-scripts"
|
||||
, workProject "pck-access"
|
||||
, workProject "planning-cloud"
|
||||
, workProject "rfcs"
|
||||
, workProject "runner-tests"
|
||||
, workProject "slog-agent"
|
||||
, workProject "sm-terraform"
|
||||
, workProject "tech-radar"
|
||||
, workProject "time-tracking"
|
||||
, workProject "ugluk-ansible-role"
|
||||
, workProject "unified-application-gateway"
|
||||
, Project { projectName = "minecraft"
|
||||
, projectDirectory = "/tmp"
|
||||
, projectStartHook = Just $ do safeSpawnProg "minecraft-launcher"
|
||||
safeSpawnProg "mumble"
|
||||
}
|
||||
, Project { projectName = "status"
|
||||
, projectDirectory = "/tmp"
|
||||
, projectStartHook = Just $ do
|
||||
safeSpawn "nvidia-offload" ["kitty","gotop"]
|
||||
}
|
||||
, Project { projectName = "sound"
|
||||
, projectDirectory = "/tmp"
|
||||
, projectStartHook = Just $ do
|
||||
safeSpawn "pw-jack" ["patchage"]
|
||||
safeSpawnProg "easyeffects"
|
||||
}
|
||||
]
|
||||
|
||||
modify :: XConfig l -> XConfig l
|
||||
modify conf = dynamicProjects projects conf
|
||||
{ workspaces = [] }
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@ modify conf = conf
|
|||
}
|
||||
|
||||
pads =
|
||||
[ NS "htop" "kitty --title htop tmux" (title =? "htop")
|
||||
[ NS "htop" "nvidia-offload kitty --title htop tmux" (title =? "htop")
|
||||
(customFloating $ W.RationalRect (1/3) (1/3) (1/3) (1/3))
|
||||
-- , NS "stardict" "stardict" (className =? "Stardict")
|
||||
-- (customFloating $ W.RationalRect (1/6) (1/6) (2/3) (2/3))
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
module ScreenEvents (
|
||||
ScreenEvents.modify
|
||||
) where
|
||||
|
||||
import XMonad
|
||||
import Data.Monoid (All(..))
|
||||
import XMonad.Hooks.Rescreen
|
||||
|
||||
-- screenChangeHandler :: Event -> X All
|
||||
-- screenChangeHandler (RRScreenChangeNotifyEvent _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) = do
|
||||
-- spawn "touch /tmp/xmonad-WAAAAAT"
|
||||
-- spawn "/home/e/.fehbg"
|
||||
-- return (All True)
|
||||
-- screenChangeHandler _ = return (All True)
|
||||
|
||||
modify :: XConfig l -> XConfig l
|
||||
modify = addAfterRescreenHook afterRescreen
|
||||
|
||||
afterRescreen :: X ()
|
||||
afterRescreen = spawn "/home/e/.fehbg"
|
||||
|
|
@ -20,8 +20,33 @@ module Solarized
|
|||
, foreground
|
||||
, foregroundhl
|
||||
, foregroundll
|
||||
, theme
|
||||
) where
|
||||
|
||||
import XMonad.Layout.Decoration (Theme(..))
|
||||
|
||||
theme :: Theme
|
||||
theme =
|
||||
Theme { activeColor = violet
|
||||
, inactiveColor = base03
|
||||
, urgentColor = red
|
||||
, activeBorderColor = violet
|
||||
, inactiveBorderColor = base03
|
||||
, urgentBorderColor = red
|
||||
, activeBorderWidth = 1
|
||||
, inactiveBorderWidth = 1
|
||||
, urgentBorderWidth = 1
|
||||
, activeTextColor = base03
|
||||
, inactiveTextColor = base02
|
||||
, urgentTextColor = red
|
||||
, fontName = "-misc-fixed-*-*-*-*-10-*-*-*-*-*-*-*"
|
||||
, decoWidth = 200
|
||||
, decoHeight = 15
|
||||
, windowTitleAddons = []
|
||||
, windowTitleIcons = []
|
||||
}
|
||||
|
||||
|
||||
base03 = "#002b36"
|
||||
base02 = "#073642"
|
||||
base01 = "#586e75"
|
||||
|
|
|
@ -6,7 +6,7 @@ module StatusBar (
|
|||
|
||||
import Data.List
|
||||
import Data.Monoid
|
||||
import Nord as N
|
||||
import Solarized as S
|
||||
import XMonad.Core
|
||||
import XMonad.Hooks.DynamicBars (dynStatusBarStartup,dynStatusBarEventHook,multiPP)
|
||||
import XMonad.Hooks.DynamicLog
|
||||
|
@ -31,24 +31,24 @@ runXmobar :: ScreenId -> IO Handle
|
|||
runXmobar (S id) = spawnPipe
|
||||
$ "/run/current-system/sw/bin/xmobar --screen="
|
||||
<> show id
|
||||
<> " /home/eeva/.xmonad/xmobarrc"
|
||||
<> " /home/e/.xmonad/xmobarrc"
|
||||
|
||||
killXmobar :: IO ()
|
||||
-- killXmobar = spawn "/run/current-system/sw/bin/pkill xmobar"
|
||||
killXmobar = return ()
|
||||
|
||||
otherPP = currentPP
|
||||
{ ppCurrent = xmobarColor N.foreground N.background
|
||||
, ppVisible = xmobarColor N.foreground N.background
|
||||
, ppHidden = xmobarColor N.foreground N.background
|
||||
, ppHiddenNoWindows = xmobarColor N.backgroundhl N.background
|
||||
{ ppCurrent = xmobarColor S.foreground S.background
|
||||
, ppVisible = xmobarColor S.foreground S.background
|
||||
, ppHidden = xmobarColor S.foreground S.background
|
||||
, ppHiddenNoWindows = xmobarColor S.backgroundhl S.background
|
||||
}
|
||||
|
||||
currentPP = def
|
||||
{ ppCurrent = xmobarColor' N.orange
|
||||
, ppVisible = xmobarColor' N.yellow -- other screen
|
||||
, ppHidden = xmobarColor' N.foreground -- other workspaces with windows
|
||||
, ppHiddenNoWindows = xmobarColor' N.foregroundll -- other workspaces
|
||||
{ ppCurrent = xmobarColor' S.orange
|
||||
, ppVisible = xmobarColor' S.yellow -- other screen
|
||||
, ppHidden = xmobarColor' S.foreground -- other workspaces with windows
|
||||
, ppHiddenNoWindows = xmobarColor' S.foregroundll -- other workspaces
|
||||
, ppSep = " "
|
||||
, ppWsSep = " "
|
||||
, ppLayout = printLayout
|
||||
|
|
|
@ -11,7 +11,5 @@ let
|
|||
in
|
||||
|
||||
mkShell {
|
||||
buildInputs = [
|
||||
easy-hls
|
||||
];
|
||||
buildInputs = [ easy-hls ];
|
||||
}
|
||||
|
|
|
@ -1,36 +0,0 @@
|
|||
cabal-version: >=1.10
|
||||
|
||||
name: xmonad-config
|
||||
version: 0.11.0.0
|
||||
-- synopsis:
|
||||
-- description:
|
||||
-- bug-reports:
|
||||
license: AGPL-3.0-or-later
|
||||
author: EEva (JPotier)
|
||||
maintainer: jpo.contributes.to.nixos@marvid.fr
|
||||
-- copyright:
|
||||
-- category:
|
||||
build-type: Simple
|
||||
extra-source-files: CHANGELOG.md
|
||||
|
||||
executable xmonad
|
||||
main-is: xmonad.hs
|
||||
other-modules: KeyBindings
|
||||
, MouseBindings
|
||||
, Nord
|
||||
, Password
|
||||
, Projects
|
||||
, Scratchpad
|
||||
-- other-extensions:
|
||||
build-depends: base
|
||||
, X11
|
||||
, directory
|
||||
, filepath
|
||||
, mtl
|
||||
, unix
|
||||
, xmonad
|
||||
, xmonad-contrib
|
||||
, xmonad-extras
|
||||
hs-source-dirs: .
|
||||
, lib
|
||||
default-language: Haskell2010
|
77
xmonad.hs
77
xmonad.hs
|
@ -8,63 +8,76 @@ import XMonad
|
|||
import XMonad.Actions.DynamicProjects
|
||||
import XMonad.Config.Desktop
|
||||
import XMonad.Hooks.DynamicLog
|
||||
--import XMonad.Hooks.EwmhDesktops (ewmh, ewmhFullscreen)
|
||||
import XMonad.Hooks.EwmhDesktops (ewmh)
|
||||
import XMonad.Hooks.ManageHelpers
|
||||
import XMonad.Layout.NoBorders (noBorders, smartBorders, hasBorder, BorderMessage (HasBorder))
|
||||
|
||||
import XMonad.Layout.NoBorders (noBorders, smartBorders)
|
||||
import XMonad.Layout.NoFrillsDecoration
|
||||
import XMonad.Layout.PerScreen
|
||||
import XMonad.Layout.Reflect
|
||||
import XMonad.Layout.ResizableTile (ResizableTall(..))
|
||||
import XMonad.Layout.Spacing
|
||||
import XMonad.Layout.ThreeColumns (ThreeCol(..))
|
||||
import XMonad.Layout.ToggleLayouts (toggleLayouts)
|
||||
|
||||
import XMonad.StackSet (sink)
|
||||
|
||||
import XMonad.Util.EZConfig
|
||||
import qualified Nord as N
|
||||
import qualified XMonad.Layout.Spacing as SS (Border(..))
|
||||
import XMonad.Util.SpawnOnce
|
||||
import qualified Solarized as S
|
||||
|
||||
-- Tidy modules
|
||||
import KeyBindings as Keys (modify)
|
||||
import MouseBindings as Mouse (modify)
|
||||
import Projects (modify)
|
||||
import Scratchpad (modify)
|
||||
import ScreenEvents (modify)
|
||||
|
||||
--------- toggle btw vvvvvvvvvv or vvvvv
|
||||
-------------------- toggle btw vvvvvvvvvv or vvvvv
|
||||
--layouts = titleBar $ toggleLayouts fullscreen tiled
|
||||
layouts = toggleLayouts fullscreen tiled
|
||||
where
|
||||
smallBorder = SS.Border 5 5 5 5
|
||||
fullscreen = noBorders Full
|
||||
tiled = smarts $ resizableTall ||| Mirror resizableTall
|
||||
smarts = spacingRaw True smallBorder True smallBorder True . smartBorders
|
||||
resizableTall = ResizableTall 1 (5/100) (1/2) []
|
||||
fullscreen = (noBorders Full)
|
||||
tiled = smarts $ ifWider (1920 + 1) wideScreen normalScreen
|
||||
wideScreen = ThreeColMid 1 (5/100) (1/2)
|
||||
normalScreen = ResizableTall 1 (5/100) (1/2) []
|
||||
smarts = (smartSpacingWithEdge 5) . smartBorders
|
||||
--titleBar = noFrillsDeco shrinkText S.theme
|
||||
|
||||
-- Use the `xprop' tool to get the info you need for these matches.
|
||||
-- For className, use the second value that xprop gives you.
|
||||
-------------- Here be the law of windows
|
||||
myManageHook = composeAll
|
||||
[ className =? "Patchage" --> doShift "patchage"
|
||||
, className =? "Pavucontrol" --> doShift "music"
|
||||
, className =? "Pinentry" --> doCenterFloat
|
||||
, className =? "REAPER" --> hasBorder False
|
||||
, className =? "Renoise" --> hasBorder False
|
||||
, className =? "steam" --> doShift "steam"
|
||||
, className =? "steamwebhelper" --> doShift "steam"
|
||||
, className =? "cs2" --> doShift "steam"
|
||||
, isDialog --> doCenterFloat
|
||||
myManageHook = composeOne
|
||||
[ className =? "Gcr-prompter" -?> doCenterFloat
|
||||
, className =? "Pavucontrol" -?> doShift "music"
|
||||
, className =? "Pinentry" -?> doFloat
|
||||
, className =? "VirtualBox" -?> doFloat
|
||||
, className =? "gpclient" -?> doTile <+> (doShift "VPN")
|
||||
, className =? "mpv" -?> doFullFloat <+> (doShift "flims")
|
||||
, className =? "qemu-system-x86_64" -?> doFloat
|
||||
, className =? "qutebrowser" -?> doShift "web"
|
||||
, isDialog -?> doCenterFloat
|
||||
|
||||
-- Move transient windows to their parent:
|
||||
, transience'
|
||||
, transience
|
||||
]
|
||||
|
||||
doTile :: ManageHook
|
||||
doTile = ask >>= doF . sink
|
||||
|
||||
------------ build the full config
|
||||
withConfig =
|
||||
ewmh
|
||||
$ Projects.modify -- Apply projects config
|
||||
$ Keys.modify -- Apply keybindings config
|
||||
$ Mouse.modify -- Apply mouse bindings config
|
||||
$ Scratchpad.modify -- Apply scratchpad managehook config
|
||||
$ desktopConfig -- on a default desktop config
|
||||
{ manageHook = myManageHook
|
||||
Projects.modify -- Apply projects config
|
||||
$ Keys.modify -- Apply keybindings config
|
||||
$ Mouse.modify -- Apply mouse bindings config
|
||||
$ Scratchpad.modify -- Apply scratchpad managehook config
|
||||
$ ScreenEvents.modify -- Apply screen event hook config
|
||||
$ desktopConfig -- on a default desktop config
|
||||
{ manageHook = myManageHook <+> manageHook desktopConfig
|
||||
, layoutHook = desktopLayoutModifiers layouts
|
||||
, terminal = "kitty"
|
||||
, normalBorderColor = N.backgroundhl
|
||||
, focusedBorderColor = N.nord9
|
||||
, startupHook = spawnOnce "sh /home/e/.fehbg"
|
||||
, terminal = "nvidia-offload kitty"
|
||||
, normalBorderColor = S.base03
|
||||
, focusedBorderColor = S.green
|
||||
, borderWidth = 5
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue