vanadium: refactor autorandr config

This commit is contained in:
Primrose 2025-09-06 15:58:11 +08:00
parent 7d24683787
commit abc5a20069
Signed by: primrose
GPG key ID: 4E887A4CA9714ADA

View file

@ -33,54 +33,56 @@
};
profiles = let
built-in = "00ffffffffffff0009e5ca0b000000002f200104a51c137803de50a3544c99260f505400000001010101010101010101010101010101115cd01881e02d50302036001dbe1000001aa749d01881e02d50302036001dbe1000001a000000fe00424f452043510a202020202020000000fe004e4531333546424d2d4e34310a0073";
asus-monitor = "00ffffffffffff0006b35b27010101012c210103803c22782a29d5ad4f44a7240f5054bfef00714f81809500d1c0d1e8d1fc01010101565e00a0a0a029503020350055502100001a000000fd0030901edf3c000a202020202020000000fc005647323741514c33410a202020000000ff0052414c4d51533139373533370a0111020347f14a90030204014061603f1f230907078301000067030c002000384468d85dc401788003026d1a000002013090f00069096909e305ff01e6060701696900e2006ae20fc0eae70070a0a067500820980455502100001a6fc200a0a0a055503020350055502100001a5aa000a0a0a046503020350055502100001a0000bc";
allExternDevices =
map (portNumber: "DP-${toString portNumber}") (lib.range 1 8);
allDevices = ["eDP-1"] ++ allExternDevices;
# TODO: merge when upstream is merged
# https://github.com/NixOS/nixpkgs/pull/436434
#
# Generate an attribute set by mapping a function over a list of attribute names.
# It allows setting the name of the attribute.
genAttrs' = xs: func: builtins.listToAttrs (map func xs);
singleton = k: v: {${k} = v;};
fingerprints = {
built-in = singleton "eDP-1" "00ffffffffffff0009e5ca0b000000002f200104a51c137803de50a3544c99260f505400000001010101010101010101010101010101115cd01881e02d50302036001dbe1000001aa749d01881e02d50302036001dbe1000001a000000fe00424f452043510a202020202020000000fe004e4531333546424d2d4e34310a0073";
asus-monitor = device: singleton device "00ffffffffffff0006b35b27010101012c210103803c22782a29d5ad4f44a7240f5054bfef00714f81809500d1c0d1e8d1fc01010101565e00a0a0a029503020350055502100001a000000fd0030901edf3c000a202020202020000000fc005647323741514c33410a202020000000ff0052414c4d51533139373533370a0111020347f14a90030204014061603f1f230907078301000067030c002000384468d85dc401788003026d1a000002013090f00069096909e305ff01e6060701696900e2006ae20fc0eae70070a0a067500820980455502100001a6fc200a0a0a055503020350055502100001a5aa000a0a0a046503020350055502100001a0000bc";
};
devices = rec {
built-in = "eDP-1";
# Run `xrandr` to see the max number
extern = map (portNumber: "DP-${toString portNumber}") (lib.range 1 8);
all = [built-in] ++ extern;
};
switches = {
setDPI = {dpi}: {
"10_xrdb-dpi" = "xrdb -merge ${pkgs.writeText "xrdb-dpi-config" ''
setDPI = {dpi}:
singleton "10_xrdb-dpi" "xrdb -merge ${pkgs.writeText "xrdb-dpi-config" ''
Xcursor.size: 64
Xft.dpi: ${toString dpi}
''}";
};
# Is scoped to an output device, no need to be called on built-in display
setSoftwareBrightness = {
device, # obtain with `xrandr`
brightness, # [0..1]
}: {
"10_xrandr_brightness" = ''
}:
singleton "10_xrandr_brightness" ''
xrandr --output ${device} --brightness ${toString brightness}
'';
};
# Is scoped to an output device, no need to be called on built-in display
setDDCBrightness = {
modelName, # obtain with `ddcutil detect`
brightness, # [0..1]
}: {
"10_ddc_brightness" = ''
}:
singleton "10_ddc_brightness" ''
ddcutil --model ${modelName} setvcp 10 ${toString (brightness * 100)}
'';
};
};
# Note: the "position" field corresponds to the "pos" field outputted by autorandr
# To get the current config, run `xrandr --auto` and then `autorandr --config`
configs = {
allOff = lib.genAttrs allDevices (_: {enable = false;});
allOff = lib.genAttrs devices.all (_: {enable = false;});
enableBuiltin = {
eDP-1 = {
enable = true;
@ -103,30 +105,29 @@
};
frameworkBuiltin = {
fingerprint.eDP-1 = built-in;
config = with configs; allOff // enableBuiltin;
hooks.postswitch = with switches; setDPI {dpi = 150;};
fingerprint = fingerprints.built-in;
config = configs.allOff // configs.enableBuiltin;
hooks.postswitch = switches.setDPI {dpi = 150;};
};
mkAsusProfile = name: {
fingerprint = {
${name} = asus-monitor;
eDP-1 = built-in;
};
config = with configs; allOff // enableDevice name;
hooks.postswitch = with switches;
setDPI {dpi = 110;}
// setDDCBrightness {
fingerprint = fingerprints.built-in // fingerprints.asus-monitor name;
config = configs.allOff // configs.enableDevice name;
hooks.postswitch =
switches.setDPI {dpi = 110;}
// switches.setDDCBrightness {
modelName = "VG27AQL3A";
brightness = 0;
}
// setSoftwareBrightness {
// switches.setSoftwareBrightness {
device = name;
brightness = 0.7;
};
};
in
lib.mkMerge [
{default = frameworkBuiltin;}
// genAttrs' allExternDevices (name: lib.nameValuePair "asus-${name}" (mkAsusProfile name));
(genAttrs' devices.extern (name: lib.nameValuePair "asus-${name}" (mkAsusProfile name)))
];
};
}