diff --git a/home/programs/xmonad/default.nix b/home/programs/xmonad/default.nix index 28d4ccf..b70da1a 100644 --- a/home/programs/xmonad/default.nix +++ b/home/programs/xmonad/default.nix @@ -1,19 +1,4 @@ -{ pkgs, ... }: let - - xmonadHs = pkgs.stdenv.mkDerivation { - name = "xmonad.hs"; - src = ./.; - - buildInputs = with pkgs; [ emacs ]; - buildPhase = '' - emacs --batch --eval "(require 'org)" --eval '(org-babel-tangle-file "xmonad.org")' - ''; - - installPhase = '' - cp xmonad.haskell $out - ''; - }; - -in { - home.file.".xmonad/xmonad.hs".source = xmonadHs.outPath; +{ pkgs, ... }: +{ + home.file.".xmonad/xmonad.hs".source = ./xmonad.hs; } diff --git a/home/programs/xmonad/xmonad.org b/home/programs/xmonad/xmonad.hs similarity index 68% rename from home/programs/xmonad/xmonad.org rename to home/programs/xmonad/xmonad.hs index 60f5905..6354ee7 100644 --- a/home/programs/xmonad/xmonad.org +++ b/home/programs/xmonad/xmonad.hs @@ -1,11 +1,3 @@ -#+TITLE: XMonad Configuration -#+AUTHOR: h7x4 -#+PROPERTY: header-args :haskell :tangle yes -#+STARTUP: org-startup-folded: t - -* Imports - -#+BEGIN_SRC haskell {-# LANGUAGE LambdaCase #-} import XMonad @@ -13,7 +5,12 @@ import XMonad import System.Exit import XMonad.Hooks.ManageDocks -import XMonad.Hooks.DynamicLog (dynamicLogWithPP, wrap, xmobarPP, xmobarColor, shorten, PP(..)) +-- import XMonad.Hooks.DynamicLog (dynamicLogWithPP, wrap, xmobarPP, xmobarColor, shorten, PP(..)) + +import qualified Codec.Binary.UTF8.String as UTF8 +import qualified DBus as D +import qualified DBus.Client as D +import XMonad.Hooks.DynamicLog import XMonad.ManageHook @@ -36,11 +33,7 @@ import XMonad.Layout.MultiToggle.Instances import qualified XMonad.Layout.Magnifier as Mag import Graphics.X11.ExtraTypes.XF86 -#+END_SRC -* Colors - -#+BEGIN_SRC haskell type Color = String background = "#272822" @@ -51,11 +44,7 @@ yellow = "#f4bf75" blue = "#66d9ef" magenta = "#ae81ff" cyan = "#a1efe4" -#+END_SRC -* Config - -#+BEGIN_SRC haskell type TerminalCommand = String myTerminal = "alacritty" @@ -76,59 +65,67 @@ myModMask :: KeyMask myModMask = mod4Mask myWorkspaces :: [WorkspaceId] -myWorkspaces = ["gen","www","emx","dev","slk","6","7","8","com"] +myWorkspaces = map (UTF8.decode . UTF8.encode) ["総","草","書","企","連","総2","総3"] + +wsWeb = myWorkspaces !! 1 +wsDev = myWorkspaces !! 2 +wsCom = myWorkspaces !! 4 myNormalBorderColor = "#dddddd" myFocusedBorderColor = "#ff0000" myBorderWidth = 4 -myScratchpads = [ NS "ncmpcpp" spawnNC findNC layoutNC - , NS "terminal" spawnTM findTM layoutTM - , NS "schedule" spawnSC findSC layoutNC - , NS "help" spawnH findH layoutNC ] +myScratchpads = [ NS "ncmpcpp" spawnNC findNC layoutA + , NS "terminal" spawnTM findTM layoutB + -- , NS "matrix" spawnMX findMX layoutB + , NS "filebrowser" spawnFB findFB layoutA + , NS "emacs" spawnEX findEX layoutB + , NS "schedule" spawnSC findSC layoutA + , NS "help" spawnHP findHP layoutA + ] where - spawnNC = myTerminal ++ " --title ncmpcppScratchpad -e ncmpcpp" - findNC = title =? "ncmpcppScratchpad" - layoutNC = customFloating $ W.RationalRect l t w h - where - h = 0.9 - w = 0.9 - t = 0.05 - l = 0.05 + spawnNC = myTerminal ++ " --title ncmpcppScratchpad -e ncmpcpp" + spawnTM = myTerminal ++ " --class instanceClass,floatingTerminal -e tmux new-session -A -s f" + -- spawnMX = "element" + spawnFB = "thunar --class=floatingThunar" + spawnEX = "emacs --name=floatingEmacs" + spawnSC = "sxiv -N floatingSchedule ~/uni/schedule.png" + spawnHP = "echo \"" ++ help ++ "\" | xmessage -file -" - spawnTM = myTerminal ++ " --class instanceClass,floatingTerminal -e tmux new-session -A -s f" - findTM = className =? "floatingTerminal" - - layoutTM = customFloating $ W.RationalRect l t w h + findNC = title =? "ncmpcppScratchpad" + findTM = className =? "floatingTerminal" + findSC = className =? "floatingSchedule" + -- findMX = className =? "element" + findFB = className =? "floatingThunar" + findEX = className =? "floatingEmacs" + findHP = className =? "Xmessage" + + layoutA = customFloating $ W.RationalRect l t w h + where + t = 0.05 + l = 0.05 + h = 0.9 + w = 0.9 + + layoutB = customFloating $ W.RationalRect l t w h where l = 0.025 t = 0.05 h = 0.9 w = 0.95 - spawnSC = "sxiv ~/uni/schedule.png" - findSC = className =? "sxiv" - - spawnH = "echo \"" ++ help ++ "\" | xmessage -file -" - findH = className =? "Xmessage" -#+END_SRC - -* Keys - -#+BEGIN_SRC haskell myKeys :: XConfig Layout -> M.Map (KeyMask, KeySym) (X ()) myKeys conf@(XConfig {XMonad.modMask = modm}) = M.fromList $ [ ((modm .|. shiftMask, xK_l ), sendMessage NextLayout) -- , ((modm .|. shiftMask, xK_space ), setLayout $ XMonad.layoutHook conf) -- , ((modm, xK_n ), refresh) - , ((modm, xK_Tab ), windows W.focusDown) , ((modm, xK_j ), windows W.focusDown) - , ((modm, xK_k ), windows W.focusUp ) + , ((modm, xK_k ), windows W.focusUp) -- , ((modm, xK_m ), windows W.focusMaster ) -- , ((modm, xK_Return), windows W.swapMaster) - , ((modm .|. shiftMask, xK_j ), windows W.swapDown ) - , ((modm .|. shiftMask, xK_k ), windows W.swapUp ) + , ((modm .|. shiftMask, xK_j ), windows W.swapDown) + , ((modm .|. shiftMask, xK_k ), windows W.swapUp) , ((modm, xK_h ), sendMessage Shrink) , ((modm, xK_l ), sendMessage Expand) , ((modm, xK_t ), withFocused $ windows . W.sink) @@ -136,7 +133,7 @@ myKeys conf@(XConfig {XMonad.modMask = modm}) = M.fromList $ , ((modm , xK_period), sendMessage (IncMasterN (-1))) -- , ((modm , xK_b ), sendMessage ToggleStruts) , ((modm .|. shiftMask, xK_q ), io exitSuccess) - , ((modm , xK_c ), myRestartHook ) + , ((modm , xK_c ), myRestartHook) ] ++ @@ -159,50 +156,27 @@ myKeys conf@(XConfig {XMonad.modMask = modm}) = M.fromList $ -- TODO: Clean up formatting [ - ((modm .|. shiftMask , xK_Return), spawn $ myTerminal ++ " --class instanceClass,termTerminal -e tmux new-session -A -s term") - , ((modm , xK_BackSpace), kill) - -- , ((modm , xK_s), spawn myBrowser) - , ((modm , xK_f), sendMessage $ Toggle FULL) - -- , ((modm .|. shiftMask , xK_w), spawn "io.elementary.code -t") - -- , ((modm , xK_a), spawn "copyq toggle") - -- , ((modm , xK_e), spawn emacsCommand) - -- , ((modm .|. shiftMask , xK_e), spawn myFileBrowser) - -- , ((modm , xK_r), spawn "rofi -show drun") - -- , ((modm , xK_p), spawn "mpc toggle") - , ((modm , xK_q), namedScratchpadAction myScratchpads "ncmpcpp") - -- , ((modm , xK_minus), namedScratchpadAction myScratchpads "schedule") - -- , ((modm , xK_F7), spawn "amixer set Master 2%-") - -- , ((modm , xK_F8), spawn "amixer set Master 2%+") + ((modm , xK_BackSpace), kill) -- , ((modm , xK_c), spawn myTerminal ++ " -e cfile") - -- , ((modm , xK_n), spawn "fcitx-remote -s fcitx-keyboard-no") - -- , ((modm , xK_m), spawn "fcitx-remote -s fcitx-keyboard-us") - -- , ((modm , xK_b), spawn "fcitx-remote -s mozc") + , ((modm , xK_f), sendMessage $ Toggle FULL) + , ((modm , xK_w), namedScratchpadAction myScratchpads "emacs") + , ((modm , xK_e), namedScratchpadAction myScratchpads "filebrowser") + , ((modm , xK_q), namedScratchpadAction myScratchpads "ncmpcpp") + , ((modm , xK_minus), namedScratchpadAction myScratchpads "schedule") + , ((modm .|. shiftMask, xK_slash), namedScratchpadAction myScratchpads "help") + , ((modm , xK_Return), namedScratchpadAction myScratchpads "terminal") - , ((modm , xK_space ), namedScratchpadAction myScratchpads "terminal") + , ((modm , xK_space), namedScratchpadAction myScratchpads "terminal") + , ((modm .|. shiftMask , xK_Return), spawn $ myTerminal ++ " --class instanceClass,termTerminal -e tmux new-session -A -s term") , ((modm .|. shiftMask , xK_space ), spawn $ myTerminal ++ " -e tmux") - -- , ((0 , xK_Print ), spawn "skushoclip") - -- , ((shiftMask , xK_Print ), spawn "skusho") - -- , ((modm , xK_Print ), spawn "$HOME/.scripts/git/boomer/boomer") + -- , ((modm , xK_v ), spawn "rofi -modi lpass:$HOME/.scripts/rofi/lpass//rofi-lpass -show lpass") - - -- , ((0, xF86XK_AudioRaiseVolume ), spawn "amixer set Master 2%+") - -- , ((0, xF86XK_AudioLowerVolume ), spawn "amixer set Master 2%-") - -- , ((0, xF86XK_AudioMute ), spawn "pactl set-sink-mute @DEFAULT_SINK@ toggle") - - -- , ((0, xF86XK_AudioPlay ), spawn "mpc toggle") - -- , ((0, xF86XK_AudioPrev ), spawn "mpc prev") - -- , ((0, xF86XK_AudioNext ), spawn "mpc next") - - -- , ((0, xF86XK_MonBrightnessUp ), spawn "light -A 5") - -- , ((0, xF86XK_MonBrightnessDown ), spawn "light -U 5") - - , ((modm .|. shiftMask, xK_slash ), namedScratchpadAction myScratchpads "help") , ((modm .|. shiftMask, xK_d ), viewDropboxStatus) ] termIsOpen :: X Bool termIsOpen = isOpen - where + where output :: X String output = liftIO $ runProcessWithInput "tmux" ["ls", "-F", "#{session_name}", "#{?session_attached,1,}"] "" @@ -219,12 +193,6 @@ viewDropboxStatus = spawn =<< ((++) "notify-send -t 3000 " . unpack) <$> status unpack :: String -> String unpack = wrap "\" " "\"" . unwords . map (wrap " [" "] "). lines - -#+END_SRC - -** Mouse Bindings - -#+BEGIN_SRC haskell ------------------------------------------------------------------------ -- Mouse bindings: default actions bound to mouse events -- @@ -242,11 +210,7 @@ myMouseBindings XConfig {XMonad.modMask = modm} = M.fromList -- you may also bind events to the mouse scroll wheel (button4 and button5) ] -#+END_SRC -* Layout - -#+BEGIN_SRC haskell myLayout = fullscreenFull $ avoidStruts $ @@ -294,7 +258,15 @@ myManageHook = composeAll , resource =? "kdesktop" --> doIgnore , resource =? "fcitx-config" --> doFloat , className =? "copyq" --> doFloat - , className =? "discord" --> doShift "com" + + , className =? "firefox" --> doShift wsWeb + , className =? "google-chrome" --> doShift wsWeb + + , className =? "Emacs" --> doShift wsDev + , className =? "Code" --> doShift wsDev + + , className =? "discord" --> doShift wsCom + , className =? "Element" --> doShift wsCom ] <+> namedScratchpadManageHook myScratchpads ------------------------------------------------------------------------ @@ -309,43 +281,58 @@ myManageHook = composeAll myEventHook = mempty ------------------------------------------------------------------------ -#+END_SRC -* XMobar - -#+BEGIN_SRC haskell -- Perform an arbitrary action on each internal state change or X event. -- See the 'XMonad.Hooks.DynamicLog' extension for examples. windowCount :: X (Maybe String) windowCount = gets $ Just . show . length . W.integrate' . W.stack . W.workspace . W.current . windowset -myLogHook xmproc = dynamicLogWithPP $ xmobarPP - { - ppOutput = hPutStrLn xmproc - , ppCurrent = xmobarColor green "" . wrap "[" "]" - , ppVisible = xmobarColor green "" - , ppHidden = xmobarColor blue "" - , ppHiddenNoWindows = xmobarColor yellow "" - , ppTitle = xmobarColor foreground "" . shorten 60 - , ppSep = " | " - , ppUrgent = xmobarColor red "" . wrap "!" "!" - , ppExtras = [windowCount] - , ppLayout = - wrap "" "" . - (\case - "Spacing Full" -> "🖵" - "Spacing Tall" -> "🗗" - "Spacing Magnifier Tall" -> "\128269" -- 🔍 - "Spacing Mirror Tall" -> "\129694" -- 🪞 - ) - , ppOrder = \(ws:l:t:ex) -> [ws,l] ++ ex ++ [t] - } -#+END_SRC +mkDbusClient :: IO D.Client +mkDbusClient = do + dbus <- D.connectSession + D.requestName dbus (D.busName_ "org.xmonad.log") opts + return dbus + where + opts = [D.nameAllowReplacement, D.nameReplaceExisting, D.nameDoNotQueue] -* Startup hook +-- Emit a DBus signal on log updates +dbusOutput :: D.Client -> String -> IO () +dbusOutput dbus str = D.emit dbus $ signal { D.signalBody = body } + where + opath = D.objectPath_ "/org/xmonad/Log" + iname = D.interfaceName_ "org.xmonad.Log" + mname = D.memberName_ "Update" + signal = (D.signal opath iname mname) + body = [D.toVariant str] + +polybarHook :: D.Client -> PP +polybarHook dbus = + let wrapper c s | s /= "NSP" = wrap ("%{F" <> c <> "}%{T2}") "%{T-}%{F-}" s + | otherwise = mempty + in def { ppOutput = dbusOutput dbus + , ppCurrent = wrapper green . wrap "[" "]" + , ppVisible = wrapper magenta + , ppUrgent = wrapper red + , ppHidden = wrapper blue + , ppHiddenNoWindows = wrapper yellow + , ppTitle = shorten 44 . wrapper magenta + , ppExtras = [windowCount] + , ppSep = " | " + , ppLayout = + wrap "%{T3}" "%{T-}" . + (\case + "Spacing Full" -> "\62160" + "Spacing Tall" -> "\57934" + "Spacing Magnifier Tall" -> "\61442" -- 🔍 + "Spacing Mirror Tall" -> "\57935" -- 🪞 + ) + , ppOrder = \(ws:l:t:ex) -> [ws,l] ++ ex ++ [t] + } + +-- myPolybarLogHook dbus = myLogHook <+> dynamicLogWithPP (polybarHook dbus) +myPolybarLogHook dbus = dynamicLogWithPP (polybarHook dbus) -#+BEGIN_SRC haskell ------------------------------------------------------------------------ -- Startup hook @@ -354,27 +341,23 @@ myLogHook xmproc = dynamicLogWithPP $ xmobarPP -- per-workspace layout choices. -- myStartupHook :: X () -myStartupHook = do - spawn "stalonetray &" - spawnOnce "$HOME/.xmonad/setup-script/xinit.sh" +myStartupHook = + spawnOnce "sxhkd &" + -- spawnOnce "$HOME/.xmonad/setup-script/xinit.sh" myRestartHook :: X () myRestartHook = do - spawn "killall stalonetray" - spawn "killall xmobar" + spawn "notify-send 'XMonad' 'Restarted XMonad/Polybar' --icon=dialog-information" spawn "xmonad --recompile" spawn "xmonad --restart" + spawn "systemctl --user restart polybar" ------------------------------------------------------------------------ -#+END_SRC - -* Main - -#+BEGIN_SRC haskell main :: IO () main = do - xmproc <- spawnPipe "xmobar --recompile" + -- xmproc <- spawnPipe "xmobar --recompile" + dbus <- mkDbusClient xmonad $ fullscreenSupport $ docks def { @@ -396,14 +379,10 @@ main = do layoutHook = myLayout, manageHook = myManageHook, handleEventHook = myEventHook, - logHook = myLogHook xmproc, + logHook = myPolybarLogHook dbus, startupHook = myStartupHook } -#+END_SRC -* Help - -#+BEGIN_SRC haskell -- TODO: Generate this automatically help :: String help = unlines ["The default modifier key is 'alt'. Default keybindings:", @@ -454,4 +433,3 @@ help = unlines ["The default modifier key is 'alt'. Default keybindings:", "mod-button1 Set the window to floating mode and move by dragging", "mod-button2 Raise the window to the top of the stack", "mod-button3 Set the window to floating mode and resize by dragging"] -#+END_SRC diff --git a/home/services/polybar.nix b/home/services/polybar.nix new file mode 100644 index 0000000..86279c4 --- /dev/null +++ b/home/services/polybar.nix @@ -0,0 +1,291 @@ +{ pkgs, config, ... }: let + colors = config.colors.defaultColorSet; + inherit (config) machineVars; +in { + services.polybar = { + enable = true; + + script = '' + polybar top & + ''; + + package = pkgs.polybar.override { + githubSupport = true; + mpdSupport = true; + }; + + settings = { + "bar/top" = { + bottom = false; + # monitor = + tray.position = "right"; + + background = colors.background; + foreground = colors.foreground; + + padding = { + left = 2; + right = 2; + }; + width = "100%"; + height = 40; + + fixed-center = true; + + font = map (f: f + ":pixelsize=12:antialias=true:hinting=true") [ + "Fira Code Retina" + "Noto Sans CJK JP" + "FiraCode Nerd Font" + ]; + + modules = { + left = "xmonad"; + center = "date"; + right = builtins.concatStringsSep " " [ + "filesystem " + (if machineVars.wlanInterface != null then "wlan " else "") + (if machineVars.battery != null then "batt " else "") + "vol" + "mpd" + ]; + }; + + tray = { + padding = 4; + maxsize = 25; + background = colors.background; + }; + }; + + "module/xmonad" = { + type = "custom/script"; + exec = "${pkgs.xmonad-log}/bin/xmonad-log"; + tail = "true"; + }; + + "module/date" = { + type = "internal/date"; + interval = 1.0; + + format-padding = 1; + + label = "%date% | %time%"; + label-padding = 1; + + date = "W%W | %Y.%M.%d | %A"; + time = "%R"; + }; + + "module/wlan" = { + type = "internal/network"; + interval = 1.0; + unknown-as-up = true; + # Wireless interfaces often start with `wl` and ethernet interface with `eno` or `eth`. Check " ifconfig/iwconfig " + interface = pkgs.lib.mkIf (machineVars.wlanInterface != null) machineVars.wlanInterface; + + format = { + connected = ""; + connected-padding = 1; + # connected-suffix = "%{A1:networkmanager_dmenu &:}%{A}" + # connected-suffix-padding = 1 + # connected-suffix-foreground = ${colors.fg-alt} + # connected-suffix-background = ${colors.accent} + + disconnected = ""; + disconnected-padding = 1; + # disconnected-suffix = "%{A1:networkmanager_dmenu &:}%{A}" + # disconnected-suffix-padding = 1 + # disconnected-suffix-foreground = ${colors.fg-alt} + # disconnected-suffix-background = ${colors.accent} + + label = { + connected = "%essid%"; + connected-padding = 1; + # connected-background = ${colors.fg-alt} + + disconnected = "OFF"; + disconnected-padding = 1; + # disconnected-background = ${colors.fg-alt} + }; + }; + }; + + "module/batt" = { + type = "internal/battery"; + full-at = 99; + + battery = pkgs.lib.mkIf (machineVars.battery != null) machineVars.battery; + adapter = "AC"; + + poll.interval = 5; + + # format-charging = "" + format.charging.padding = 1; + + # format-charging-suffix = "%{A1:xfce4-power-manager-settings &:}%{A}" + # format-charging-suffix-padding = 1 + # format-charging-suffix-foreground = ${colors.fg-alt} + # format-charging-suffix-background = ${colors.accent} + # + # format-discharging = "" + # format-discharging-padding = 1 + # + # format-discharging-suffix = "%{A1:xfce4-power-manager-settings &:}%{A}" + # format-discharging-suffix-padding = 1 + # format-discharging-suffix-foreground = ${colors.fg-alt} + # format-discharging-suffix-background = ${colors.accent} + # + + label-charging = "%percentage%%"; + label-discharging = "%percentage%%"; + label-full = "FULL"; + label = { + charging = { + padding = 1; + foreground = colors.green; + # background = ${colors.fg-alt} + }; + discharging = { + padding = 1; + foreground = colors.yellow; + }; + full = { + padding = 1; + foreground = colors.blue; + }; + }; + }; + + "module/vol" = { + type = "internal/alsa"; + # format-volume = "}" + # format-volume = "%{A1:bash -c '~/.scripts/get-volume' &:}%{A}" + # format-volume = + + # format-volume-padding = 1 + # format-muted-padding = 1 + format-volume = "%{T3}%{T-} "; + # label-volume =  + label-volume-foreground = colors.magenta; + # format-muted-foreground = "${colors.foreground-alt}"; + label-muted = "mute"; + + bar.volume = { + width = 8; + foreground = [ + "#55aa55" + "#55aa55" + "#55aa55" + "#55aa55" + "#55aa55" + "#f5a70a" + "#ff5555" + ]; + gradient = false; + indicator = "|"; + # indicator-font = 1 + fill = "─"; + # fill-font = 1 + empty = "─"; + # empty-font = 1 + # empty-foreground = "${colors.foreground-alt}"; + }; + + # + # format-volume-prefix = "%{A3:pavucontrol &:}%{A}" + # format-volume-prefix-padding = 1 + # format-volume-prefix-background = ${colors.fg-alt} + # + # + # format-muted-prefix = "%{A3:pavucontrol &:}%{A}" + # format-muted-prefix-padding = 1 + # format-muted-prefix-background = ${colors.fg-alt} + # + # label-muted = " " + # label-muted-background = ${colors.fg-alt} + # + # bar-volume-width = 5 + # bar-volume-indicator = "" + # bar-volume-empty = "" + # bar-volume-fill = "" + # + # bar-volume-indicator-foreground = ${colors.fg} + # bar-volume-indicator-background = ${colors.fg-alt} + # + # bar-volume-empty-foreground = ${colors.fg-alt} + # bar-volume-empty-background = ${colors.fg-alt} + # + # bar-volume-fill-foreground = ${colors.accent-alt} + # bar-volume-fill-background = ${colors.fg-alt} + }; + + "module/mpd" = { + type = "internal/mpd"; + + # your port and host here + host = "127.0.0.1"; + port = "6600"; + + format-online = " "; + + # These are opposite, because polybar expects you to click the icon to change state, + # instead of showing the current state. + + icon-pause = ""; + icon.pause = { + font = 3; + padding = 1; + foreground = colors.green; + } ; + + icon-play = ""; + icon.play = { + font = 3; + padding = 1; + foreground = colors.red; + } ; + + label-song = "%title%"; + label.song = { + maxlen = 15; + ellipsis = true; + padding = 1; + }; + }; + + "module/filesystem" = { + type = "internal/fs"; + + # Mountpoints to display + mount = [ + "/" + ]; + # ] ++ (builtins.values machineVars.dataDrives.drives); + + format.mount = [ + { background = "#101010"; } + ]; + + # Seconds to sleep between updates + # Default: 30 + interval = 10; + + # Display fixed precision values + # Default: false + fixed-values = true; + + # Spacing (number of spaces, pixels, points) between entries + # Default: 2 + spacing = 4; + + # Default: 90 + # New in version 3.6.0 + warn-percentage = 75; + }; + + "settings" = { + screenchange-reload = true; + }; + }; + }; +} diff --git a/hosts/common.nix b/hosts/common.nix index a3f55cc..8ea5916 100644 --- a/hosts/common.nix +++ b/hosts/common.nix @@ -257,6 +257,10 @@ in { windowManager.xmonad = { enable = true; enableContribAndExtras = true; + enableConfiguredRecompile = true; + extraPackages = hPkgs: with hPkgs; [ + dbus + ]; }; # displayManager.startx.enable = true; diff --git a/hosts/kasei/configuration.nix b/hosts/kasei/configuration.nix index 4486334..8f463fa 100644 --- a/hosts/kasei/configuration.nix +++ b/hosts/kasei/configuration.nix @@ -14,6 +14,8 @@ development = true; creative = true; + wlanInterface = "wlp2s0f0u7u3"; + dataDrives = let main = "/data"; in { diff --git a/modules/machineVars.nix b/modules/machineVars.nix index 2bc80ef..5c3bde3 100644 --- a/modules/machineVars.nix +++ b/modules/machineVars.nix @@ -40,6 +40,17 @@ t tools preinstalled."; creative = mkEnableOption "Whether or not the machine should have creative software (music, video and image editing) installed."; + wlanInterface = mkOption { + type = types.nullOr types.string; + default = null; + }; + + # Check " ls -1 /sys/class/power_supply/ " + battery = mkOption { + type = types.nullOr types.string; + default = null; + }; + laptop = mkEnableOption "Whether the machine is a laptop"; fixDisplayCommand = mkOption { @@ -88,6 +99,10 @@ t tools preinstalled."; assertion = cfg.headless -> (cfg.screens == { } && cfg.fixDisplayCommand == null); message = "A headless machine can't have any screens."; } + { + assertion = cfg.battery != null -> cfg.laptop; + message = "A battery shouldn't exist on a non laptop machine"; + } ]; warnings = lib.optionals (0 < (lib.length (builtins.attrNames cfg.screens)) && (cfg.fixDisplayCommand != null)) [