Skip to content

Commit 61f5e30

Browse files
committed
Add EasyMotion
1 parent d1f919f commit 61f5e30

File tree

1 file changed

+125
-108
lines changed
  • modules/nixos/home-manager/profiles/desktop

1 file changed

+125
-108
lines changed

modules/nixos/home-manager/profiles/desktop/xmonad.nix

+125-108
Original file line numberDiff line numberDiff line change
@@ -9,64 +9,72 @@
99

1010
extraPackages = ps: [ ps.dbus ];
1111

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 #-}
1419
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)
3744
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+
]
7078
`additionalKeys` ( first (noModMask,)
7179
<$> [ (xF86XK_MonBrightnessUp, spawn "xbacklight -inc 2"),
7280
(xF86XK_MonBrightnessDown, spawn "xbacklight -dec 2"),
@@ -76,64 +84,73 @@
7684
]
7785
)
7886
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 =
10088
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}"
11394
}
114-
where
115-
positive n = if n > 0 then Just n else Nothing
116-
color c = wrap ("%{F" ++ c ++ "}") "%{F-}"
11795
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
121138
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]
126143
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"
134151
135-
pure logOutput
136-
'';
152+
pure logOutput
153+
'';
137154
};
138155
};
139156
}

0 commit comments

Comments
 (0)