Autorotate only in tablet mode
Added support for actions when entering/existing tablet mode for Home Manager and fixed for NixOS
This commit is contained in:
parent
466cdb10b3
commit
1e9fc1d9d5
3 changed files with 112 additions and 59 deletions
|
|
@ -25,64 +25,46 @@ in {
|
|||
|
||||
config = mkIf cfg.enable {
|
||||
# 1. System service for watching
|
||||
systemd.services =
|
||||
{
|
||||
tablet-mode-watcher = {
|
||||
description = "Watch for tablet mode changes";
|
||||
serviceConfig = {
|
||||
ExecStart = "${pkgs.writeShellScript "tablet-mode-eventd" ''
|
||||
in_tablet_mode=$(${pkgs.coreutils}/bin/cat "${cfg.path}" 2>/dev/null || $(echo 0 > "${cfg.path}" && echo 0))
|
||||
systemd.services = {
|
||||
tablet-mode-watcher = {
|
||||
description = "Watch for tablet mode changes";
|
||||
serviceConfig = {
|
||||
ExecStart = "${pkgs.writeShellScript "tablet-mode-eventd" ''
|
||||
if [ -f "${cfg.path}" ]; then
|
||||
in_tablet_mode=$(${pkgs.coreutils}/bin/cat "${cfg.path}")
|
||||
else
|
||||
echo 0 > "${cfg.path}"
|
||||
in_tablet_mode=0
|
||||
fi
|
||||
|
||||
stdbuf -oL -eL ${lib.getExe pkgs.libinput} debug-events --device "${cfg.inputDevice}" | while read -r line; do
|
||||
if [[ "$line" =~ switch\ tablet-mode\ state\ ([01]) ]]; then
|
||||
d="''${BASH_REMATCH[1]}"
|
||||
if [ "$d" -ne "$in_tablet_mode" ]; then
|
||||
in_tablet_mode=$d
|
||||
if [ "$d" -eq 1 ]; then
|
||||
systemctl start tablet-on.target
|
||||
echo "Tablet mode ON"
|
||||
echo 1 > "${cfg.path}"
|
||||
else
|
||||
systemctl start tablet-off.target
|
||||
echo "Tablet mode OFF"
|
||||
echo 0 > "${cfg.path}"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
done
|
||||
''}";
|
||||
Restart = "always";
|
||||
};
|
||||
wantedBy = ["graphical.target"];
|
||||
stdbuf -oL -eL ${lib.getExe pkgs.libinput} debug-events --device "${cfg.inputDevice}" | while read -r line; do
|
||||
if [[ "$line" =~ switch\ tablet-mode\ state\ ([01]) ]]; then
|
||||
d="''${BASH_REMATCH[1]}"
|
||||
if [ "$d" -ne "$in_tablet_mode" ]; then
|
||||
in_tablet_mode=$d
|
||||
if [ "$d" -eq 1 ]; then
|
||||
${concatStringsSep "\n" (map (cmd: ''
|
||||
systemd-run --unit=tablet-on-${cmd.name} --collect sh -c '${cmd.command}'
|
||||
'')
|
||||
cfg.onTabletModeEnable)}
|
||||
echo "Tablet mode ON"
|
||||
echo 1 > "${cfg.path}"
|
||||
else
|
||||
${concatStringsSep "\n" (map (cmd: ''
|
||||
systemd-run --unit=tablet-off-${cmd.name} --collect sh -c '${cmd.command}'
|
||||
'')
|
||||
cfg.onTabletModeDisable)}
|
||||
echo "Tablet mode OFF"
|
||||
echo 0 > "${cfg.path}"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
done
|
||||
''}";
|
||||
Restart = "always";
|
||||
};
|
||||
}
|
||||
// (lib.listToAttrs (map (cmd: {
|
||||
name = "tablet-action-on-${cmd.name}";
|
||||
value = {
|
||||
Unit.PartOf = ["tablet-on.target"];
|
||||
Service = {
|
||||
Type = "oneshot";
|
||||
ExecStart = "sh -c ${cmd.command}";
|
||||
};
|
||||
Install.WantedBy = ["tablet-on.target"];
|
||||
};
|
||||
})
|
||||
cfg.onTabletModeEnable))
|
||||
// (lib.listToAttrs (map (cmd: {
|
||||
name = "tablet-action-off-${cmd.name}";
|
||||
value = {
|
||||
Unit.PartOf = ["tablet-off.target"];
|
||||
Service = {
|
||||
Type = "oneshot";
|
||||
ExecStart = "sh -c ${cmd.command}";
|
||||
};
|
||||
Install.WantedBy = ["tablet-off.target"];
|
||||
};
|
||||
})
|
||||
cfg.onTabletModeDisable));
|
||||
|
||||
# 2. System targets
|
||||
systemd.targets.tablet-on = {};
|
||||
systemd.targets.tablet-off = {};
|
||||
wantedBy = ["graphical.target"];
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue