|
9 | 9 |
|
10 | 10 | extraPackages = ps: [ ps.dbus ];
|
11 | 11 |
|
12 |
| - config = with config.lib.stylix.colors.withHashtag; pkgs.writeText "xmonad.hs" '' |
13 |
| - {-# LANGUAGE TupleSections #-} |
| 12 | + config = |
| 13 | + let inherit (config.stylix) fonts; |
| 14 | + inherit (config.lib.stylix) colors; |
| 15 | + in |
| 16 | + pkgs.writeText "xmonad.hs" '' |
| 17 | + {-# LANGUAGE ImportQualifiedPost #-} |
| 18 | + {-# LANGUAGE TupleSections #-} |
14 | 19 |
|
15 |
| - import qualified Codec.Binary.UTF8.String as UTF8 |
16 |
| - import qualified DBus as D |
17 |
| - import qualified DBus.Client as D |
18 |
| - import Data.Bifunctor (first) |
19 |
| - import Data.Maybe (catMaybes) |
20 |
| - import Data.Ratio ((%)) |
21 |
| - import Graphics.X11.ExtraTypes.XF86 |
22 |
| - import XMonad |
23 |
| - import XMonad.Actions.Minimize (maximizeWindowAndFocus, minimizeWindow, withLastMinimized, withMinimized) |
24 |
| - import XMonad.Hooks.DynamicLog (PP (..), dynamicLogWithPP, shorten, wrap) |
25 |
| - import XMonad.Hooks.EwmhDesktops (ewmh) |
26 |
| - import XMonad.Hooks.ManageDocks (avoidStruts, docks, manageDocks) |
27 |
| - import XMonad.Layout.BoringWindows (boringWindows, focusDown, focusMaster, focusUp) |
28 |
| - import XMonad.Layout.Grid (Grid (..)) |
29 |
| - import XMonad.Layout.Minimize (minimize) |
30 |
| - import XMonad.Layout.MultiToggle (Toggle (Toggle), mkToggle, single) |
31 |
| - import XMonad.Layout.MultiToggle.Instances |
32 |
| - import XMonad.Layout.Renamed (Rename (CutWordsLeft), renamed) |
33 |
| - import XMonad.Layout.Spacing (spacingWithEdge) |
34 |
| - import XMonad.Layout.ThreeColumns (ThreeCol (..)) |
35 |
| - import qualified XMonad.StackSet as W |
36 |
| - import XMonad.Util.EZConfig (additionalKeys, additionalKeysP) |
| 20 | + import Codec.Binary.UTF8.String qualified as UTF8 |
| 21 | + import DBus qualified as D |
| 22 | + import DBus.Client qualified as D |
| 23 | + import Data.Bifunctor (first) |
| 24 | + import Data.Maybe (catMaybes) |
| 25 | + import Data.Ratio ((%)) |
| 26 | + import Graphics.X11.ExtraTypes.XF86 |
| 27 | + import XMonad |
| 28 | + import XMonad.Actions.EasyMotion (selectWindow) |
| 29 | + import XMonad.Actions.EasyMotion qualified as EM |
| 30 | + import XMonad.Actions.Minimize (maximizeWindowAndFocus, minimizeWindow, withLastMinimized, withMinimized) |
| 31 | + import XMonad.Hooks.DynamicLog (PP (..), dynamicLogWithPP, shorten, wrap) |
| 32 | + import XMonad.Hooks.EwmhDesktops (ewmh) |
| 33 | + import XMonad.Hooks.ManageDocks (avoidStruts, docks, manageDocks) |
| 34 | + import XMonad.Layout.BoringWindows (boringWindows, focusDown, focusMaster, focusUp) |
| 35 | + import XMonad.Layout.Grid (Grid (..)) |
| 36 | + import XMonad.Layout.Minimize (minimize) |
| 37 | + import XMonad.Layout.MultiToggle (Toggle (Toggle), mkToggle, single) |
| 38 | + import XMonad.Layout.MultiToggle.Instances |
| 39 | + import XMonad.Layout.Renamed (Rename (CutWordsLeft), renamed) |
| 40 | + import XMonad.Layout.Spacing (spacingWithEdge) |
| 41 | + import XMonad.Layout.ThreeColumns (ThreeCol (..)) |
| 42 | + import XMonad.StackSet qualified as W |
| 43 | + import XMonad.Util.EZConfig (additionalKeys, additionalKeysP) |
37 | 44 |
|
38 |
| - main = do |
39 |
| - logOutput <- setupLogOutput |
40 |
| - xmonad |
41 |
| - . docks |
42 |
| - . ewmh |
43 |
| - $ def |
44 |
| - { borderWidth = 5, |
45 |
| - normalBorderColor = "${base00}", |
46 |
| - focusedBorderColor = "${base0D}", |
47 |
| - layoutHook = myLayoutHook, |
48 |
| - logHook = mkPolybarLogHook logOutput, |
49 |
| - manageHook = manageDocks, |
50 |
| - modMask = mod4Mask, |
51 |
| - terminal = "wezterm" |
52 |
| - } |
53 |
| - `additionalKeysP` [ ("M-j", focusDown), |
54 |
| - ("M-k", focusUp), |
55 |
| - ("M-m", focusMaster), |
56 |
| - ("M-\\", withFocused minimizeWindow), |
57 |
| - ("M-S-\\", withLastMinimized maximizeWindowAndFocus), |
58 |
| - ("M-x", sendMessage $ Toggle MIRROR), |
59 |
| - ("M-g", spawn "rofi -show-icons -show window"), |
60 |
| - ("M-p", spawn "rofi -show-icons -show drun"), |
61 |
| - ("M-S-p", spawn "rofi -show-icons -show run"), |
62 |
| - ("M-o", spawn "rofi-rbw --keybindings Ctrl-1:type:username:password,Ctrl-2:type:password,Ctrl-3:copy:password,Ctrl-4:type:totp"), |
63 |
| - ("M-i", spawn "rofi -show ssh"), |
64 |
| - ("M-;", spawn "rofi -show emoji"), |
65 |
| - ("M-'", spawn "rofi -show calc -no-show-match -no-sort"), |
66 |
| - ("M-y", spawn "emacsclient -c -n -e '(switch-to-buffer nil)'"), |
67 |
| - ("M-u", spawn "chromium-browser"), |
68 |
| - ("M-s", spawn "dm-tool switch-to-greeter") |
69 |
| - ] |
| 45 | + main = do |
| 46 | + logOutput <- setupLogOutput |
| 47 | + xmonad |
| 48 | + . docks |
| 49 | + . ewmh |
| 50 | + $ def |
| 51 | + { borderWidth = 5, |
| 52 | + normalBorderColor = "${colors.withHashtag.base00}", |
| 53 | + focusedBorderColor = "${colors.withHashtag.base0D}", |
| 54 | + layoutHook = myLayoutHook, |
| 55 | + logHook = mkPolybarLogHook logOutput, |
| 56 | + manageHook = manageDocks, |
| 57 | + modMask = mod4Mask, |
| 58 | + terminal = "wezterm" |
| 59 | + } |
| 60 | + `additionalKeysP` [ ("M-j", focusDown), |
| 61 | + ("M-k", focusUp), |
| 62 | + ("M-m", focusMaster), |
| 63 | + ("M-o", selectWindow emConfig >>= (`whenJust` windows . W.focusWindow)), |
| 64 | + ("M-\\", withFocused minimizeWindow), |
| 65 | + ("M-S-\\", withLastMinimized maximizeWindowAndFocus), |
| 66 | + ("M-x", sendMessage $ Toggle MIRROR), |
| 67 | + ("M-g", spawn "rofi -show-icons -show window"), |
| 68 | + ("M-p", spawn "rofi -show-icons -show drun"), |
| 69 | + ("M-S-p", spawn "rofi -show-icons -show run"), |
| 70 | + ("M-0", spawn "rofi-rbw --keybindings Ctrl-1:type:username:password,Ctrl-2:type:password,Ctrl-3:copy:password,Ctrl-4:type:totp"), |
| 71 | + ("M-i", spawn "rofi -show ssh"), |
| 72 | + ("M-;", spawn "rofi -show emoji"), |
| 73 | + ("M-'", spawn "rofi -show calc -no-show-match -no-sort"), |
| 74 | + ("M-y", spawn "emacsclient -c -n -e '(switch-to-buffer nil)'"), |
| 75 | + ("M-u", spawn "chromium-browser"), |
| 76 | + ("M-s", spawn "dm-tool switch-to-greeter") |
| 77 | + ] |
70 | 78 | `additionalKeys` ( first (noModMask,)
|
71 | 79 | <$> [ (xF86XK_MonBrightnessUp, spawn "xbacklight -inc 2"),
|
72 | 80 | (xF86XK_MonBrightnessDown, spawn "xbacklight -dec 2"),
|
|
76 | 84 | ]
|
77 | 85 | )
|
78 | 86 |
|
79 |
| - myLayoutHook = |
80 |
| - diminish (spacingWithEdge 8) |
81 |
| - . diminish minimize |
82 |
| - . boringWindows |
83 |
| - . avoidStruts |
84 |
| - . mkToggle (single MIRROR) |
85 |
| - $ layout |
86 |
| - where |
87 |
| - layout = |
88 |
| - Tall 1 (1 % 50) (3 % 5) |
89 |
| - ||| ThreeCol 1 (3 % 100) (1 % 2) |
90 |
| - ||| Grid |
91 |
| - ||| Full |
92 |
| -
|
93 |
| - diminish = (renamed [CutWordsLeft 1] .) |
94 |
| -
|
95 |
| - mkPolybarLogHook :: (String -> IO ()) -> X () |
96 |
| - mkPolybarLogHook output = do |
97 |
| - windowCount <- withWindowSet (pure . length . W.index) |
98 |
| - minimizedCount <- withMinimized (pure . length) |
99 |
| - dynamicLogWithPP $ |
| 87 | + emConfig = |
100 | 88 | def
|
101 |
| - { ppSep = color "${base03}" " | ", |
102 |
| - ppTitle = shorten 80, |
103 |
| - ppLayout = |
104 |
| - let windowCountLabel = |
105 |
| - unwords $ |
106 |
| - catMaybes |
107 |
| - [ show <$> positive windowCount, |
108 |
| - color "${base0A}" . wrap "(" ")" . show <$> positive minimizedCount |
109 |
| - ] |
110 |
| - in (++ " " ++ windowCountLabel), |
111 |
| - ppOrder = \(_ : l : win : _) -> [l, win], |
112 |
| - ppOutput = output |
| 89 | + { EM.emFont = "xft:${fonts.monospace.name}:bold:size=18:antialias=true", |
| 90 | + EM.bgCol = "${colors.withHashtag.base01}", |
| 91 | + EM.borderCol = "${colors.withHashtag.base01}", |
| 92 | + EM.overlayF = EM.fixedSize 100 100, |
| 93 | + EM.txtCol = "${colors.withHashtag.base0A}" |
113 | 94 | }
|
114 |
| - where |
115 |
| - positive n = if n > 0 then Just n else Nothing |
116 |
| - color c = wrap ("%{F" ++ c ++ "}") "%{F-}" |
117 | 95 |
|
118 |
| - setupLogOutput :: IO (String -> IO ()) |
119 |
| - setupLogOutput = do |
120 |
| - dbus <- D.connectSession |
| 96 | + myLayoutHook = |
| 97 | + diminish (spacingWithEdge 8) |
| 98 | + . diminish minimize |
| 99 | + . boringWindows |
| 100 | + . avoidStruts |
| 101 | + . mkToggle (single MIRROR) |
| 102 | + $ layout |
| 103 | + where |
| 104 | + layout = |
| 105 | + Tall 1 (1 % 50) (3 % 5) |
| 106 | + ||| ThreeCol 1 (3 % 100) (1 % 2) |
| 107 | + ||| Grid |
| 108 | + ||| Full |
| 109 | +
|
| 110 | + diminish = (renamed [CutWordsLeft 1] .) |
| 111 | +
|
| 112 | + mkPolybarLogHook :: (String -> IO ()) -> X () |
| 113 | + mkPolybarLogHook output = do |
| 114 | + windowCount <- withWindowSet (pure . length . W.index) |
| 115 | + minimizedCount <- withMinimized (pure . length) |
| 116 | + dynamicLogWithPP $ |
| 117 | + def |
| 118 | + { ppSep = color "${colors.withHashtag.base03}" " | ", |
| 119 | + ppTitle = shorten 80, |
| 120 | + ppLayout = |
| 121 | + let windowCountLabel = |
| 122 | + unwords $ |
| 123 | + catMaybes |
| 124 | + [ show <$> positive windowCount, |
| 125 | + color "${colors.withHashtag.base0A}" . wrap "(" ")" . show <$> positive minimizedCount |
| 126 | + ] |
| 127 | + in (++ " " ++ windowCountLabel), |
| 128 | + ppOrder = \(_ : l : win : _) -> [l, win], |
| 129 | + ppOutput = output |
| 130 | + } |
| 131 | + where |
| 132 | + positive n = if n > 0 then Just n else Nothing |
| 133 | + color c = wrap ("%{F" ++ c ++ "}") "%{F-}" |
| 134 | +
|
| 135 | + setupLogOutput :: IO (String -> IO ()) |
| 136 | + setupLogOutput = do |
| 137 | + dbus <- D.connectSession |
121 | 138 |
|
122 |
| - D.requestName |
123 |
| - dbus |
124 |
| - (D.busName_ "org.xmonad.Log") |
125 |
| - [D.nameAllowReplacement, D.nameReplaceExisting, D.nameDoNotQueue] |
| 139 | + D.requestName |
| 140 | + dbus |
| 141 | + (D.busName_ "org.xmonad.Log") |
| 142 | + [D.nameAllowReplacement, D.nameReplaceExisting, D.nameDoNotQueue] |
126 | 143 |
|
127 |
| - let logOutput str = do |
128 |
| - let signal = (D.signal objectPath interfaceName memberName) {D.signalBody = [D.toVariant (UTF8.decodeString str)]} |
129 |
| - D.emit dbus signal |
130 |
| - where |
131 |
| - objectPath = D.objectPath_ "/org/xmonad/Log" |
132 |
| - interfaceName = D.interfaceName_ "org.xmonad.Log" |
133 |
| - memberName = D.memberName_ "Update" |
| 144 | + let logOutput str = do |
| 145 | + let signal = (D.signal objectPath interfaceName memberName) {D.signalBody = [D.toVariant (UTF8.decodeString str)]} |
| 146 | + D.emit dbus signal |
| 147 | + where |
| 148 | + objectPath = D.objectPath_ "/org/xmonad/Log" |
| 149 | + interfaceName = D.interfaceName_ "org.xmonad.Log" |
| 150 | + memberName = D.memberName_ "Update" |
134 | 151 |
|
135 |
| - pure logOutput |
136 |
| - ''; |
| 152 | + pure logOutput |
| 153 | + ''; |
137 | 154 | };
|
138 | 155 | };
|
139 | 156 | }
|
0 commit comments