blob: 47de6c21576c7031457f31b797deb1bfe471a989 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
{ pkgs, lib, config, ... }:
with lib;
let
inherit (config.services.xserver) xrandrHeads;
# The symbols if you press shift and a number key.
wsNumberSymbols = [
"exclam" "at" "numbersign" "dollar" "percent"
"asciicircum" "ampersand" "asterisk" "parenleft" "parenright"
];
wsCount = length wsNumberSymbols;
headCount = length xrandrHeads;
wsPerHead = wsCount / headCount;
excessWs = wsCount - (headCount * wsPerHead);
headModifier = if config.vuizvui.i3.reverseHeads then reverseList else id;
getHeadAt = elemAt (headModifier xrandrHeads);
mkDefaultWorkspace = number: numberSymbol: {
name = toString number;
value = mkDefault {
label = null;
labelPrefix = "${toString number}: ";
keys.switchTo = "$mod+${if number == 10 then "0" else toString number}";
keys.moveTo = "$mod+Shift+${numberSymbol}";
head = if headCount == 0 then null
else getHeadAt ((number - (excessWs + 1)) / wsPerHead);
};
};
wsCfgList = mapAttrsToList (_: getAttr "config") config.vuizvui.i3.workspaces;
wsConfig = concatStrings wsCfgList;
defaultWorkspaces = listToAttrs (imap mkDefaultWorkspace wsNumberSymbols);
conky = import ./conky.nix {
inherit pkgs;
};
mkBar = output: statusCmd: singleton ''
bar {
${optionalString (output != null) "output ${output}"}
${optionalString (statusCmd != null) "status_command ${statusCmd}"}
colors {
focused_workspace #5c5cff #e5e5e5
active_workspace #ffffff #0000ee
inactive_workspace #00cdcd #0000ee
urgent_workspace #ffff00 #cd0000
}
}
'';
barConfig = let
barHeads = headModifier xrandrHeads;
bars = if headCount == 0 then mkBar null conky.single
else if headCount == 1 then mkBar (head barHeads) conky.single
else let inner = take (length barHeads - 2) (tail barHeads);
in mkBar (head barHeads) conky.left
++ map (flip mkBar null) inner
++ mkBar (last barHeads) conky.right;
in concatStrings (headModifier bars);
in
{
options.vuizvui.i3 = {
enable = mkEnableOption "i3";
workspaces = mkOption {
type = types.attrsOf (types.submodule ./workspace.nix);
default = listToAttrs (imap mkDefaultWorkspace wsNumberSymbols);
description = ''
Workspace to monitor assignment.
Workspaces are by default assigned starting from the leftmost monitor
being workspace 1 and the rightmost monitor being workspace 10. The
workspaces are divided by the number of available heads, so if you have
a dual head system, you'll end up having workspace 1 to 5 on the left
monitor and 6 to 10 on the right.
'';
};
reverseHeads = mkOption {
type = types.bool;
default = false;
description = ''
Reverse the order of the heads, so if enabled and you have two heads,
you'll end up having workspaces 1 to 5 on the right head and 6 to 10 on
the left head.
'';
};
};
config.vuizvui.i3.workspaces = defaultWorkspaces;
config.services.xserver.windowManager = mkIf config.vuizvui.i3.enable {
default = "i3";
i3.enable = true;
i3.configFile = pkgs.substituteAll {
name = "i3.conf";
src = ./i3.conf;
inherit (pkgs) dmenu xterm pvolctrl;
inherit (pkgs.xorg) xsetroot;
inherit wsConfig barConfig;
postInstall = ''
${pkgs.i3}/bin/i3 -c "$target" -C
'';
};
};
}
|