# This is a custom file for a surface.
|
|
|
|
{ config, lib, pkgs, modulesPath, ... }:
|
|
|
|
{
|
|
environment.systemPackages = with pkgs; [
|
|
obs-studio
|
|
rnote
|
|
xournalpp
|
|
];
|
|
|
|
|
|
# Set an usable key configuration: Ctrl at capslock, Win at Alt, Alt at Ctrl
|
|
services.xserver.displayManager.sessionCommands =''
|
|
${pkgs.xorg.xmodmap}/bin/xmodmap "${pkgs.writeText "xkb-layout" ''
|
|
!
|
|
! Swap Caps_Lock and Control_L
|
|
!
|
|
|
|
remove Lock = Caps_Lock
|
|
remove Control = Control_L
|
|
! keysym Control_L = Caps_Lock
|
|
keysym Control_L = Mode_switch
|
|
keysym Caps_Lock = Control_L
|
|
add Lock = Caps_Lock
|
|
add Control = Control_L
|
|
|
|
! map arrows to more ergonomic position
|
|
keycode 43 = h H Left
|
|
keycode 44 = j J Down
|
|
keycode 45 = k K Up
|
|
keycode 46 = l L Right
|
|
''}"
|
|
'';
|
|
|
|
|
|
# add pulseaudio support to manage audio
|
|
hardware.pulseaudio.enable = true;
|
|
|
|
# next sleep & wake is code from: https://github.com/hpfr/system/blob/2e5b3b967b0436203d7add6adbd6b6f55e87cf3c/hosts/linux-surface.nix
|
|
systemd.services = {
|
|
surface-sleep = {
|
|
enable = lib.versionOlder config.boot.kernelPackages.kernel.version "5.4";
|
|
before = [ "suspend.target" ];
|
|
wantedBy = [ "suspend.target" ];
|
|
serviceConfig.Type = "oneshot";
|
|
path = with pkgs; [ procps kmod bluez ];
|
|
script = ''
|
|
# Disable bluetooth if no device is connected
|
|
if ps cax | grep bluetoothd && ! bluetoothctl info; then
|
|
bluetoothctl power off
|
|
fi
|
|
|
|
## Disable bluetooth regardless if devices are connected (see notes below)
|
|
# if ps cax | grep bluetoothd; then
|
|
# bluetoothctl power off
|
|
# fi
|
|
|
|
## > Remove IPTS from ME side
|
|
modprobe -r ipts_surface
|
|
modprobe -r intel_ipts
|
|
# modprobe -r mei_hdcp
|
|
modprobe -r mei_me
|
|
modprobe -r mei
|
|
## > Remove IPTS from i915 side
|
|
for i in $(find /sys/kernel/debug/dri -name i915_ipts_cleanup); do
|
|
echo 1 > $i
|
|
done
|
|
'';
|
|
};
|
|
surface-wake = {
|
|
enable = lib.versionOlder config.boot.kernelPackages.kernel.version "5.4";
|
|
after = [ "post-resume.target" ];
|
|
wantedBy = [ "post-resume.target" ];
|
|
serviceConfig.Type = "oneshot";
|
|
path = with pkgs; [ procps kmod bluez ];
|
|
script = ''
|
|
## > Load IPTS from i915 side
|
|
for i in $(find /sys/kernel/debug/dri -name i915_ipts_init); do
|
|
echo 1 > $i
|
|
done
|
|
## > Load IPTS from ME side
|
|
modprobe mei
|
|
modprobe mei_me
|
|
# modprobe mei_hdcp
|
|
modprobe intel_ipts
|
|
modprobe ipts_surface
|
|
|
|
# Restart bluetooth
|
|
if ps cax | grep bluetoothd; then
|
|
bluetoothctl power on
|
|
fi
|
|
'';
|
|
};
|
|
};
|
|
|
|
## NOTES:
|
|
# Susspend issue:
|
|
# https://github.com/linux-surface/linux-surface/wiki/Known-Issues-and-FAQ#suspend-aka-sleep-vs-lid-closingopening-events
|
|
# run:
|
|
# > sudo modprobe -r surface_gpe
|
|
# and:
|
|
# > sudo bash -c 'echo -e "\n# Blacklisting lid vs. suspend issue module\nblacklist surface_gpe" >> /etc/modprobe.d/blacklist.conf'
|
|
#
|
|
# Now folding the keyboard to the screen will not suspend and brick the
|
|
# session, but you will need to manually suspend the session if saving battery
|
|
# is desired.
|
|
}
|