Merge pull request #20904 from offlinehacker/nixos/xserver/xpra

Add xpra display-manager
This commit is contained in:
Jaka Hudoklin 2017-03-05 01:32:23 +01:00 committed by GitHub
commit f5d81ed79b
6 changed files with 297 additions and 26 deletions

View File

@ -274,6 +274,8 @@ in {
RestartSec = "500ms"; RestartSec = "500ms";
}; };
}; };
environment.variables.PULSE_COOKIE = "${stateDir}/.config/pulse/cookie";
}) })
]; ];

View File

@ -571,6 +571,7 @@
./services/x11/display-managers/lightdm.nix ./services/x11/display-managers/lightdm.nix
./services/x11/display-managers/sddm.nix ./services/x11/display-managers/sddm.nix
./services/x11/display-managers/slim.nix ./services/x11/display-managers/slim.nix
./services/x11/display-managers/xpra.nix
./services/x11/hardware/libinput.nix ./services/x11/hardware/libinput.nix
./services/x11/hardware/multitouch.nix ./services/x11/hardware/multitouch.nix
./services/x11/hardware/synaptics.nix ./services/x11/hardware/synaptics.nix

View File

@ -0,0 +1,249 @@
{ config, lib, pkgs, ... }:
with lib;
let
cfg = config.services.xserver.displayManager.xpra;
dmcfg = config.services.xserver.displayManager;
in
{
###### interface
options = {
services.xserver.displayManager.xpra = {
enable = mkOption {
type = types.bool;
default = false;
description = "Whether to enable xpra as display manager.";
};
bindTcp = mkOption {
default = "127.0.0.1:10000";
example = "0.0.0.0:10000";
type = types.nullOr types.str;
description = "Bind xpra to TCP";
};
auth = mkOption {
type = types.str;
default = "pam";
example = "password:value=mysecret";
description = "Authentication to use when connecting to xpra";
};
pulseaudio = mkEnableOption "pulseaudio audio streaming.";
};
};
###### implementation
config = mkIf cfg.enable {
services.xserver.videoDrivers = ["dummy"];
services.xserver.monitorSection = ''
HorizSync 1.0 - 2000.0
VertRefresh 1.0 - 200.0
#To add your own modes here, use a modeline calculator, like:
# cvt:
# http://www.x.org/archive/X11R7.5/doc/man/man1/cvt.1.html
# xtiming:
# http://xtiming.sourceforge.net/cgi-bin/xtiming.pl
# gtf:
# http://gtf.sourceforge.net/
#This can be used to get a specific DPI, but only for the default resolution:
#DisplaySize 508 317
#NOTE: the highest modes will not work without increasing the VideoRam
# for the dummy video card.
#Modeline "16000x15000" 300.00 16000 16408 18000 20000 15000 15003 15013 15016
#Modeline "15000x15000" 281.25 15000 15376 16872 18744 15000 15003 15013 15016
#Modeline "16384x8192" 167.75 16384 16800 18432 20480 8192 8195 8205 8208
#Modeline "15360x8640" 249.00 15360 15752 17280 19200 8640 8643 8648 8651
Modeline "8192x4096" 193.35 8192 8224 8952 8984 4096 4196 4200 4301
Modeline "7680x4320" 208.00 7680 7880 8640 9600 4320 4323 4328 4335
Modeline "6400x4096" 151.38 6400 6432 7000 7032 4096 4196 4200 4301
Modeline "6400x2560" 91.59 6400 6432 6776 6808 2560 2623 2626 2689
Modeline "6400x2160" 160.51 6400 6432 7040 7072 2160 2212 2216 2269
Modeline "5760x2160" 149.50 5760 5768 6320 6880 2160 2161 2164 2173
Modeline "5680x1440" 142.66 5680 5712 6248 6280 1440 1474 1478 1513
Modeline "5496x1200" 199.13 5496 5528 6280 6312 1200 1228 1233 1261
Modeline "5280x2560" 75.72 5280 5312 5592 5624 2560 2623 2626 2689
Modeline "5280x1920" 56.04 5280 5312 5520 5552 1920 1967 1969 2017
Modeline "5280x1200" 191.40 5280 5312 6032 6064 1200 1228 1233 1261
Modeline "5280x1080" 169.96 5280 5312 5952 5984 1080 1105 1110 1135
Modeline "5120x3200" 199.75 5120 5152 5904 5936 3200 3277 3283 3361
Modeline "5120x2560" 73.45 5120 5152 5424 5456 2560 2623 2626 2689
Modeline "5120x2880" 185.50 5120 5256 5760 6400 2880 2883 2888 2899
Modeline "4800x1200" 64.42 4800 4832 5072 5104 1200 1229 1231 1261
Modeline "4720x3840" 227.86 4720 4752 5616 5648 3840 3933 3940 4033
Modeline "4400x2560" 133.70 4400 4432 4936 4968 2560 2622 2627 2689
Modeline "4480x1440" 72.94 4480 4512 4784 4816 1440 1475 1478 1513
Modeline "4240x1440" 69.09 4240 4272 4528 4560 1440 1475 1478 1513
Modeline "4160x1440" 67.81 4160 4192 4448 4480 1440 1475 1478 1513
Modeline "4096x2304" 249.25 4096 4296 4720 5344 2304 2307 2312 2333
Modeline "4096x2160" 111.25 4096 4200 4608 5120 2160 2163 2173 2176
Modeline "4000x1660" 170.32 4000 4128 4536 5072 1660 1661 1664 1679
Modeline "4000x1440" 145.00 4000 4088 4488 4976 1440 1441 1444 1457
Modeline "3904x1440" 63.70 3904 3936 4176 4208 1440 1475 1478 1513
Modeline "3840x2880" 133.43 3840 3872 4376 4408 2880 2950 2955 3025
Modeline "3840x2560" 116.93 3840 3872 4312 4344 2560 2622 2627 2689
Modeline "3840x2160" 104.25 3840 3944 4320 4800 2160 2163 2168 2175
Modeline "3840x2048" 91.45 3840 3872 4216 4248 2048 2097 2101 2151
Modeline "3840x1200" 108.89 3840 3872 4280 4312 1200 1228 1232 1261
Modeline "3840x1080" 100.38 3840 3848 4216 4592 1080 1081 1084 1093
Modeline "3864x1050" 94.58 3864 3896 4248 4280 1050 1074 1078 1103
Modeline "3600x1200" 106.06 3600 3632 3984 4368 1200 1201 1204 1214
Modeline "3600x1080" 91.02 3600 3632 3976 4008 1080 1105 1109 1135
Modeline "3520x1196" 99.53 3520 3552 3928 3960 1196 1224 1228 1256
Modeline "3360x2560" 102.55 3360 3392 3776 3808 2560 2622 2627 2689
Modeline "3360x1050" 293.75 3360 3576 3928 4496 1050 1053 1063 1089
Modeline "3288x1080" 39.76 3288 3320 3464 3496 1080 1106 1108 1135
Modeline "3200x1800" 233.00 3200 3384 3720 4240 1800 1803 1808 1834
Modeline "3200x1080" 236.16 3200 3232 4128 4160 1080 1103 1112 1135
Modeline "3120x2560" 95.36 3120 3152 3512 3544 2560 2622 2627 2689
Modeline "3120x1050" 272.75 3120 3320 3648 4176 1050 1053 1063 1089
Modeline "3072x2560" 93.92 3072 3104 3456 3488 2560 2622 2627 2689
Modeline "3008x1692" 130.93 3008 3112 3416 3824 1692 1693 1696 1712
Modeline "3000x2560" 91.77 3000 3032 3376 3408 2560 2622 2627 2689
Modeline "2880x1620" 396.25 2880 3096 3408 3936 1620 1623 1628 1679
Modeline "2728x1680" 148.02 2728 2760 3320 3352 1680 1719 1726 1765
Modeline "2560x2240" 151.55 2560 2688 2952 3344 2240 2241 2244 2266
Modeline "2560x1600" 47.12 2560 2592 2768 2800 1600 1639 1642 1681
Modeline "2560x1440" 42.12 2560 2592 2752 2784 1440 1475 1478 1513
Modeline "2560x1400" 267.86 2560 2592 3608 3640 1400 1429 1441 1471
Modeline "2048x2048" 49.47 2048 2080 2264 2296 2048 2097 2101 2151
Modeline "2048x1536" 80.06 2048 2104 2312 2576 1536 1537 1540 1554
Modeline "2048x1152" 197.97 2048 2184 2408 2768 1152 1153 1156 1192
Modeline "2048x1152" 165.92 2048 2080 2704 2736 1152 1176 1186 1210
Modeline "1920x1440" 69.47 1920 1960 2152 2384 1440 1441 1444 1457
Modeline "1920x1200" 26.28 1920 1952 2048 2080 1200 1229 1231 1261
Modeline "1920x1080" 23.53 1920 1952 2040 2072 1080 1106 1108 1135
Modeline "1728x1520" 205.42 1728 1760 2536 2568 1520 1552 1564 1597
Modeline "1680x1050" 20.08 1680 1712 1784 1816 1050 1075 1077 1103
Modeline "1600x1200" 22.04 1600 1632 1712 1744 1200 1229 1231 1261
Modeline "1600x900" 33.92 1600 1632 1760 1792 900 921 924 946
Modeline "1440x900" 30.66 1440 1472 1584 1616 900 921 924 946
Modeline "1400x900" 103.50 1400 1480 1624 1848 900 903 913 934
ModeLine "1366x768" 72.00 1366 1414 1446 1494 768 771 777 803
Modeline "1360x768" 24.49 1360 1392 1480 1512 768 786 789 807
Modeline "1280x1024" 31.50 1280 1312 1424 1456 1024 1048 1052 1076
Modeline "1280x800" 24.15 1280 1312 1400 1432 800 819 822 841
Modeline "1280x768" 23.11 1280 1312 1392 1424 768 786 789 807
Modeline "1280x720" 59.42 1280 1312 1536 1568 720 735 741 757
Modeline "1024x768" 18.71 1024 1056 1120 1152 768 786 789 807
Modeline "1024x640" 41.98 1024 1056 1208 1240 640 653 659 673
Modeline "1024x576" 46.50 1024 1064 1160 1296 576 579 584 599
Modeline "768x1024" 19.50 768 800 872 904 1024 1048 1052 1076
Modeline "960x540" 40.75 960 992 1088 1216 540 543 548 562
Modeline "864x486" 32.50 864 888 968 1072 486 489 494 506
Modeline "720x405" 22.50 720 744 808 896 405 408 413 422
Modeline "640x360" 14.75 640 664 720 800 360 363 368 374
#common resolutions for android devices (both orientations):
Modeline "800x1280" 25.89 800 832 928 960 1280 1310 1315 1345
Modeline "1280x800" 24.15 1280 1312 1400 1432 800 819 822 841
Modeline "720x1280" 30.22 720 752 864 896 1280 1309 1315 1345
Modeline "1280x720" 27.41 1280 1312 1416 1448 720 737 740 757
Modeline "768x1024" 24.93 768 800 888 920 1024 1047 1052 1076
Modeline "1024x768" 23.77 1024 1056 1144 1176 768 785 789 807
Modeline "600x1024" 19.90 600 632 704 736 1024 1047 1052 1076
Modeline "1024x600" 18.26 1024 1056 1120 1152 600 614 617 631
Modeline "536x960" 16.74 536 568 624 656 960 982 986 1009
Modeline "960x536" 15.23 960 992 1048 1080 536 548 551 563
Modeline "600x800" 15.17 600 632 688 720 800 818 822 841
Modeline "800x600" 14.50 800 832 880 912 600 614 617 631
Modeline "480x854" 13.34 480 512 560 592 854 873 877 897
Modeline "848x480" 12.09 848 880 920 952 480 491 493 505
Modeline "480x800" 12.43 480 512 552 584 800 818 822 841
Modeline "800x480" 11.46 800 832 872 904 480 491 493 505
#resolutions for android devices (both orientations)
#minus the status bar
#38px status bar (and width rounded up)
Modeline "800x1242" 25.03 800 832 920 952 1242 1271 1275 1305
Modeline "1280x762" 22.93 1280 1312 1392 1424 762 780 783 801
Modeline "720x1242" 29.20 720 752 856 888 1242 1271 1276 1305
Modeline "1280x682" 25.85 1280 1312 1408 1440 682 698 701 717
Modeline "768x986" 23.90 768 800 888 920 986 1009 1013 1036
Modeline "1024x730" 22.50 1024 1056 1136 1168 730 747 750 767
Modeline "600x986" 19.07 600 632 704 736 986 1009 1013 1036
Modeline "1024x562" 17.03 1024 1056 1120 1152 562 575 578 591
Modeline "536x922" 16.01 536 568 624 656 922 943 947 969
Modeline "960x498" 14.09 960 992 1040 1072 498 509 511 523
Modeline "600x762" 14.39 600 632 680 712 762 779 783 801
Modeline "800x562" 13.52 800 832 880 912 562 575 578 591
Modeline "480x810" 12.59 480 512 552 584 810 828 832 851
Modeline "848x442" 11.09 848 880 920 952 442 452 454 465
Modeline "480x762" 11.79 480 512 552 584 762 779 783 801
'';
services.xserver.resolutions = [
{x="8192"; y="4096";}
{x="5120"; y="3200";}
{x="3840"; y="2880";}
{x="3840"; y="2560";}
{x="3840"; y="2048";}
{x="3840"; y="2160";}
{x="2048"; y="2048";}
{x="2560"; y="1600";}
{x="1920"; y="1440";}
{x="1920"; y="1200";}
{x="1920"; y="1080";}
{x="1600"; y="1200";}
{x="1680"; y="1050";}
{x="1600"; y="900";}
{x="1400"; y="1050";}
{x="1440"; y="900";}
{x="1280"; y="1024";}
{x="1366"; y="768";}
{x="1280"; y="800";}
{x="1024"; y="768";}
{x="1024"; y="600";}
{x="800"; y="600";}
{x="320"; y="200";}
];
services.xserver.serverFlagsSection = ''
Option "DontVTSwitch" "true"
Option "PciForceNone" "true"
Option "AutoEnableDevices" "false"
Option "AutoAddDevices" "false"
'';
services.xserver.deviceSection = ''
VideoRam 192000
'';
services.xserver.displayManager.job = {
logsXsession = true;
execCmd = ''
${optionalString (cfg.pulseaudio)
"export PULSE_COOKIE=/var/run/pulse/.config/pulse/cookie"}
exec ${pkgs.xpra}/bin/xpra start \
--daemon=off \
--log-dir=/var/log \
--log-file=xpra.log \
--opengl=on \
--clipboard=on \
--notifications=on \
--speaker=yes \
--mdns=no \
--pulseaudio=no \
${optionalString (cfg.pulseaudio) "--sound-source=pulse"} \
--socket-dirs=/var/run/xpra \
--xvfb="xpra_Xdummy ${concatStringsSep " " dmcfg.xserverArgs}" \
${optionalString (cfg.bindTcp != null) "--bind-tcp=${cfg.bindTcp}"} \
--auth=${cfg.auth}
'';
};
services.xserver.terminateOnReset = false;
environment.systemPackages = [pkgs.xpra];
virtualisation.virtualbox.guest.x11 = false;
hardware.pulseaudio.enable = mkDefault cfg.pulseaudio;
hardware.pulseaudio.systemWide = mkDefault cfg.pulseaudio;
};
}

View File

@ -435,6 +435,14 @@ in
by default. by default.
''; '';
}; };
terminateOnReset = mkOption {
type = types.bool;
default = true;
description = ''
Whether to terminate X upon server reset.
'';
};
}; };
}; };
@ -550,8 +558,7 @@ in
}; };
services.xserver.displayManager.xserverArgs = services.xserver.displayManager.xserverArgs =
[ "-terminate" [ "-config ${configFile}"
"-config ${configFile}"
"-xkbdir" "${cfg.xkbDir}" "-xkbdir" "${cfg.xkbDir}"
# Log at the default verbosity level to stderr rather than /var/log/X.*.log. # Log at the default verbosity level to stderr rather than /var/log/X.*.log.
"-verbose" "3" "-logfile" "/dev/null" "-verbose" "3" "-logfile" "/dev/null"
@ -560,7 +567,8 @@ in
++ optional (cfg.dpi != null) "-dpi ${toString cfg.dpi}" ++ optional (cfg.dpi != null) "-dpi ${toString cfg.dpi}"
++ optional (!cfg.enableTCP) "-nolisten tcp" ++ optional (!cfg.enableTCP) "-nolisten tcp"
++ optional (cfg.autoRepeatDelay != null) "-ardelay ${toString cfg.autoRepeatDelay}" ++ optional (cfg.autoRepeatDelay != null) "-ardelay ${toString cfg.autoRepeatDelay}"
++ optional (cfg.autoRepeatInterval != null) "-arinterval ${toString cfg.autoRepeatInterval}"; ++ optional (cfg.autoRepeatInterval != null) "-arinterval ${toString cfg.autoRepeatInterval}"
++ optional cfg.terminateOnReset "-terminate";
services.xserver.modules = services.xserver.modules =
concatLists (catAttrs "modules" cfg.drivers) ++ concatLists (catAttrs "modules" cfg.drivers) ++

View File

@ -15,18 +15,27 @@ in
###### interface ###### interface
options.virtualisation.virtualbox.guest.enable = mkOption { options.virtualisation.virtualbox.guest = {
default = false; enable = mkOption {
description = "Whether to enable the VirtualBox service and other guest additions."; default = false;
type = types.bool;
description = "Whether to enable the VirtualBox service and other guest additions.";
};
x11 = mkOption {
default = true;
type = types.bool;
description = "Whether to enable x11 graphics";
};
}; };
###### implementation ###### implementation
config = mkIf cfg.enable { config = mkIf cfg.enable (mkMerge [{
assertions = [ { assertions = [{
assertion = pkgs.stdenv.isi686 || pkgs.stdenv.isx86_64; assertion = pkgs.stdenv.isi686 || pkgs.stdenv.isx86_64;
message = "Virtualbox not currently supported on ${pkgs.stdenv.system}"; message = "Virtualbox not currently supported on ${pkgs.stdenv.system}";
} ]; }];
environment.systemPackages = [ kernel.virtualboxGuestAdditions ]; environment.systemPackages = [ kernel.virtualboxGuestAdditions ];
@ -49,6 +58,16 @@ in
serviceConfig.ExecStart = "@${kernel.virtualboxGuestAdditions}/bin/VBoxService VBoxService --foreground"; serviceConfig.ExecStart = "@${kernel.virtualboxGuestAdditions}/bin/VBoxService VBoxService --foreground";
}; };
services.udev.extraRules =
''
# /dev/vboxuser is necessary for VBoxClient to work. Maybe we
# should restrict this to logged-in users.
KERNEL=="vboxuser", OWNER="root", GROUP="root", MODE="0666"
# Allow systemd dependencies on vboxguest.
SUBSYSTEM=="misc", KERNEL=="vboxguest", TAG+="systemd"
'';
} (mkIf cfg.x11 {
services.xserver.videoDrivers = mkOverride 50 [ "virtualbox" "modesetting" ]; services.xserver.videoDrivers = mkOverride 50 [ "virtualbox" "modesetting" ];
services.xserver.config = services.xserver.config =
@ -69,16 +88,6 @@ in
PATH=${makeBinPath [ pkgs.gnugrep pkgs.which pkgs.xorg.xorgserver.out ]}:$PATH \ PATH=${makeBinPath [ pkgs.gnugrep pkgs.which pkgs.xorg.xorgserver.out ]}:$PATH \
${kernel.virtualboxGuestAdditions}/bin/VBoxClient-all ${kernel.virtualboxGuestAdditions}/bin/VBoxClient-all
''; '';
})]);
services.udev.extraRules =
''
# /dev/vboxuser is necessary for VBoxClient to work. Maybe we
# should restrict this to logged-in users.
KERNEL=="vboxuser", OWNER="root", GROUP="root", MODE="0666"
# Allow systemd dependencies on vboxguest.
SUBSYSTEM=="misc", KERNEL=="vboxguest", TAG+="systemd"
'';
};
} }

View File

@ -3,7 +3,8 @@
, makeWrapper, xkbcomp, xorgserver, getopt, xauth, utillinux, which, fontsConf , makeWrapper, xkbcomp, xorgserver, getopt, xauth, utillinux, which, fontsConf
, ffmpeg, x264, libvpx, libwebp , ffmpeg, x264, libvpx, libwebp
, libfakeXinerama , libfakeXinerama
, gst_all_1, pulseaudioLight, gobjectIntrospection }: , gst_all_1, pulseaudioLight, gobjectIntrospection
, pam }:
with lib; with lib;
@ -36,16 +37,19 @@ in buildPythonApplication rec {
gst_all_1.gst-plugins-bad gst_all_1.gst-plugins-bad
gst_all_1.gst-libav gst_all_1.gst-libav
pam
makeWrapper makeWrapper
]; ];
propagatedBuildInputs = with python2Packages; [ propagatedBuildInputs = with python2Packages; [
pillow pygtk pygobject2 rencode pycrypto cryptography pycups lz4 dbus-python pillow pygtk pygobject2 rencode pycrypto cryptography pycups lz4 dbus-python
netifaces numpy websockify pygobject3 gst-python netifaces numpy websockify pygobject3 gst-python pam
]; ];
preBuild = '' preBuild = ''
export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE $(pkg-config --cflags gtk+-2.0) $(pkg-config --cflags pygtk-2.0) $(pkg-config --cflags xtst)" export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE $(pkg-config --cflags gtk+-2.0) $(pkg-config --cflags pygtk-2.0) $(pkg-config --cflags xtst)"
substituteInPlace xpra/server/auth/pam.py --replace "/lib/libpam.so.1" "${pam}/lib/libpam.so"
''; '';
setupPyBuildFlags = ["--with-Xdummy" "--without-strict"]; setupPyBuildFlags = ["--with-Xdummy" "--without-strict"];
@ -57,13 +61,11 @@ in buildPythonApplication rec {
postInstall = '' postInstall = ''
wrapProgram $out/bin/xpra \ wrapProgram $out/bin/xpra \
--set FONTCONFIG_FILE "${fontsConf}" \
--set XPRA_LOG_DIR "\$HOME/.xpra" \
--set XPRA_INSTALL_PREFIX "$out" \ --set XPRA_INSTALL_PREFIX "$out" \
--set GI_TYPELIB_PATH "$GI_TYPELIB_PATH" \ --set GI_TYPELIB_PATH "$GI_TYPELIB_PATH" \
--set GST_PLUGIN_SYSTEM_PATH_1_0 "$GST_PLUGIN_SYSTEM_PATH_1_0" \ --set GST_PLUGIN_SYSTEM_PATH_1_0 "$GST_PLUGIN_SYSTEM_PATH_1_0" \
--prefix LD_LIBRARY_PATH : ${libfakeXinerama}/lib \ --prefix LD_LIBRARY_PATH : ${libfakeXinerama}/lib \
--prefix PATH : ${stdenv.lib.makeBinPath [ getopt xorgserver xauth which utillinux pulseaudioLight ]} \ --prefix PATH : ${stdenv.lib.makeBinPath [ getopt xorgserver xauth which utillinux pulseaudioLight ]}
''; '';
preCheck = "exit 0"; preCheck = "exit 0";