diff --git a/modules/module-list.nix b/modules/module-list.nix index 0f554bdb653..e49a9b3631c 100644 --- a/modules/module-list.nix +++ b/modules/module-list.nix @@ -96,6 +96,8 @@ ./services/x11/xserver/display-managers/default.nix ./services/x11/xserver/display-managers/kdm.nix ./services/x11/xserver/display-managers/slim.nix + ./services/x11/xserver/hardware/synaptics.nix + ./services/x11/xserver/hardware/wacom.nix ./services/x11/xserver/window-managers/compiz.nix ./services/x11/xserver/window-managers/default.nix ./services/x11/xserver/window-managers/kwm.nix diff --git a/modules/services/x11/xserver/default.nix b/modules/services/x11/xserver/default.nix index 9845a7536bc..a3fda74ba83 100644 --- a/modules/services/x11/xserver/default.nix +++ b/modules/services/x11/xserver/default.nix @@ -1,353 +1,38 @@ -{config, pkgs, ...}: -# TODO: this file need some make-up (Nicolas Pierron) +{ config, pkgs, ... }: with pkgs.lib; let + kernelPackages = config.boot.kernelPackages; - # List of font directories. - fontDirectories = config.fonts.fonts; - - options = { - services = { - - xserver = { - - enable = mkOption { - default = false; - description = " - Whether to enable the X server. - "; - }; - - autorun = mkOption { - default = true; - description = " - Switch to false to create upstart-job and configuration, - but not run it automatically - "; - }; - - exportConfiguration = mkOption { - default = false; - description = " - Create /etc/X11/xorg.conf and a file with environment - variables - "; - }; - - tcpEnable = mkOption { - default = false; - description = " - Whether to enable TCP socket for the X server. - "; - }; - - resolutions = mkOption { - default = [{x = 1024; y = 768;} {x = 800; y = 600;} {x = 640; y = 480;}]; - description = " - The screen resolutions for the X server. The first element is the default resolution. - "; - }; - - videoDriver = mkOption { - default = "vesa"; - example = "i810"; - description = " - The name of the video driver for your graphics card. - "; - }; - - driSupport = mkOption { - default = false; - description = " - Whether to enable accelerated OpenGL rendering through the - Direct Rendering Interface (DRI). - "; - }; - -/* - sessionType = mkOption { - default = "gnome"; - example = "xterm"; - description = " - The kind of session to start after login. Current possibilies - are kde (which starts KDE), - gnome (which starts - gnome-terminal) and xterm - (which starts xterm). - "; - }; - - windowManager = mkOption { - default = ""; - description = " - This option selects the window manager. Available values are - twm (extremely primitive), - metacity, xmonad - and compiz. If - left empty, the determines the - window manager, e.g., Metacity for Gnome, and - kwm for KDE. - "; - }; - - sessionStarter = mkOption { - example = "${pkgs.xterm}/bin/xterm -ls"; - description = " - The command executed after login and after the window manager - has been started. Used if - is empty. - "; - }; -*/ - - startSSHAgent = mkOption { - default = true; - description = " - Whether to start the SSH agent when you log in. The SSH agent - remembers private keys for you so that you don't have to type in - passphrases every time you make an SSH connection. Use - ssh-add to add a key to the agent. - "; - }; - - isClone = mkOption { - default = true; - example = false; - description = " - Whether to enable the X server clone mode for dual-head. - "; - }; - - synaptics = { - enable = mkOption { - default = false; - example = true; - description = " - Whether to replace mouse with touchpad. - "; - }; - dev = mkOption { - default = "/dev/input/event0"; - description = " - Event device for Synaptics touchpad. - "; - }; - minSpeed = mkOption { - default = "0.06"; - description = "Cursor speed factor for precision finger motion"; - }; - maxSpeed = mkOption { - default = "0.12"; - description = "Cursor speed factor for highest-speed finger motion"; - }; - twoFingerScroll = mkOption { - default = false; - description = "Whether to enable two-finger drag-scrolling"; - }; - }; - - wacom = { - enable = mkOption { - default = false; - description = "Whether to enable Wacom touchscreen/digitizer"; - }; - - device = mkOption { - default = "/dev/ttyS0"; - description = "Device to use"; - }; - - forceDeviceType = mkOption { - default = "ISDV4"; - example = null; - description = "Some models (think touchscreen) require forcing device type"; - }; - - }; - - layout = mkOption { - default = "us"; - description = " - Keyboard layout. - "; - }; - - xkbModel = mkOption { - default = "pc104"; - example = "presario"; - description = " - Keyboard model. - "; - }; - - xkbOptions = mkOption { - default = ""; - example = "grp:caps_toggle, grp_led:scroll"; - description = " - X keyboard options; layout switching goes here. - "; - }; - - useInternalAGPGART = mkOption { - default = ""; - example = "no"; - description = " - Just the wrapper for an xorg.conf option. - "; - }; - - extraDeviceConfig = mkOption { - default = ""; - example = "VideoRAM 131072"; - description = " - Just anything to add into Device section. - "; - }; - - extraMonitorSettings = mkOption { - default = ""; - example = "HorizSync 28-49"; - description = " - Just anything to add into Monitor section. - "; - }; - - extraDisplaySettings = mkOption { - default = ""; - example = "Virtual 2048 2048"; - description = " - Just anything to add into Display subsection (located in Screen section). - "; - }; - - extraModules = mkOption { - default = ""; - example = " - SubSection \"extmod\" - EndSubsection - "; - description = " - Just anything to add into Modules section. - "; - }; - - serverLayoutOptions = mkOption { - default = ""; - example = " - Option \"AIGLX\" \"true\" - "; - description = " - Just anything to add into Monitor section. - "; - }; - - defaultDepth = mkOption { - default = 24; - example = 8; - description = " - Default colour depth. - "; - }; - - useXFS = mkOption { - default = false; - example = "unix/:7100"; - description = " - Way to access the X Font Server to use. - "; - }; - - tty = mkOption { - default = 7; - example = 9; - description = " - Virtual console for the X server. - "; - }; - - display = mkOption { - default = 0; - example = 1; - description = " - Display number for the X server. - "; - }; - - package = mkOption { - default = pkgs.xorg; - description = " - Alternative X.org package to use. For - example, you can replace individual drivers. - "; - }; - - virtualScreen = mkOption { - default = null; - example = { - x=2048; - y=2048; - }; - description = " - Virtual screen size for Xrandr - "; - }; - }; - - }; - - environment.x11Packages = mkOption { - default = []; - type = types.list types.package; - description = " - List of packages added to the system when the xserver is - activated. (). - "; - }; - }; -in - -let # Abbreviations. cfg = config.services.xserver; - xorg = cfg.package; - stdenv = pkgs.stdenv; + xorg = pkgs.xorg; + + # Map the video driver setting to a driver. knownVideoDrivers = { - nvidia = { modulesFirst = [ kernelPackages.nvidia_x11 ]; }; #make sure it first loads the nvidia libs - vesa = { modules = [xorg.xf86videovesa]; }; - vga = { modules = [xorg.xf86videovga]; }; - sis = { modules = [xorg.xf86videosis]; }; - i810 = { modules = [xorg.xf86videoi810]; }; - intel = { modules = [xorg.xf86videointel]; }; - nv = { modules = [xorg.xf86videonv]; }; - ati = { modules = [xorg.xf86videoati]; }; - openchrome = { modules = [xorg.xf86videoopenchrome]; }; - cirrus = { modules = [xorg.xf86videocirrus]; }; + nvidia = { modules = [ kernelPackages.nvidia_x11 ]; }; + vesa = { modules = [ xorg.xf86videovesa ]; }; + vga = { modules = [ xorg.xf86videovga ]; }; + sis = { modules = [ xorg.xf86videosis ]; }; + i810 = { modules = [ xorg.xf86videoi810 ]; }; + intel = { modules = [ xorg.xf86videointel ]; }; + nv = { modules = [ xorg.xf86videonv ]; }; + ati = { modules = [ xorg.xf86videoati ]; }; + openchrome = { modules = [ xorg.xf86videoopenchrome ]; }; + cirrus = { modules = [ xorg.xf86videocirrus ]; }; + vmware = { modules = [ xorg.xf86videovmware ]; }; }; - # Get a bunch of user settings. videoDriver = cfg.videoDriver; - resolutions = map (res: ''"${toString res.x}x${toString res.y}"'') (cfg.resolutions); - videoDriverModules = attrByPath [videoDriver] (throw "unknown video driver: `${videoDriver}'") knownVideoDrivers; - - modules = - attrByPath ["modulesFirst"] [] videoDriverModules - ++ [ - xorg.xorgserver - xorg.xf86inputevdev - ] - ++ attrByPath ["modules"] [] videoDriverModules - ++ optional cfg.synaptics.enable xorg.xf86inputsynaptics - ++ (optional cfg.wacom.enable ["${pkgs.linuxwacom}"]) - ; + videoDriverInfo = attrByPath [videoDriver] (throw "unknown video driver: `${videoDriver}'") knownVideoDrivers; fontsForXServer = - fontDirectories ++ + config.fonts.fonts ++ # We don't want these fonts in fonts.conf, because then modern, # fontconfig-based applications will get horrible bitmapped # Helvetica fonts. It's better to get a substitution (like Nimbus @@ -359,314 +44,445 @@ let ]; - halConfigFiles = singleton - (pkgs.writeTextFile { - name = "hal-policy-keymap"; - destination = "/share/hal/fdi/policy/30-keymap.fdi"; - text = '' - - - - - hal-setup-keymap - - - - base - ${cfg.xkbModel} - ${cfg.layout} - ${cfg.xkbOptions} - - - - ''; - }); - - - configFile = stdenv.mkDerivation { + configFile = pkgs.stdenv.mkDerivation { name = "xserver.conf"; - src = ./xserver.conf; - inherit fontsForXServer videoDriver resolutions; - isClone = if cfg.isClone then "on" else "off"; - synapticsInputDevice = if cfg.synaptics.enable then '' - Section "InputDevice" - Identifier "Touchpad[0]" - Driver "synaptics" - Option "Device" "${cfg.synaptics.dev}" - Option "Protocol" "PS/2" - Option "LeftEdge" "1700" - Option "RightEdge" "5300" - Option "TopEdge" "1700" - Option "BottomEdge" "4200" - Option "FingerLow" "25" - Option "FingerHigh" "30" - Option "MaxTapTime" "180" - Option "MaxTapMove" "220" - Option "VertScrollDelta" "100" - Option "MinSpeed" "${cfg.synaptics.minSpeed}" - Option "MaxSpeed" "${cfg.synaptics.maxSpeed}" - Option "AccelFactor" "0.0010" - Option "SHMConfig" "on" - Option "Repeater" "/dev/input/mice" - Option "TapButton1" "1" - Option "TapButton2" "2" - Option "TapButton3" "3" - Option "VertTwoFingerScroll" "${if cfg.synaptics.twoFingerScroll then "1" else "0"}" - Option "HorizTwoFingerScroll" "${if cfg.synaptics.twoFingerScroll then "1" else "0"}" - EndSection - '' else ""; - - wacomInputDevice = if cfg.wacom.enable then '' - Section "InputDevice" - Driver "wacom" - Identifier "Wacom_stylus" - Option "Device" "${cfg.wacom.device}" - Option "Type" "stylus" - ${if cfg.wacom.forceDeviceType!=null then ''Option "ForceDevice" "${cfg.wacom.forceDeviceType}"'' else ""} - Option "Button2" "3" - EndSection - Section "InputDevice" - Driver "wacom" - Identifier "Wacom_eraser" - Option "Device" "${cfg.wacom.device}" - Option "Type" "eraser" - ${if cfg.wacom.forceDeviceType!=null then ''Option "ForceDevice" "${cfg.wacom.forceDeviceType}"'' else ""} - Option "Button1" "2" - EndSection - Section "InputDevice" - Driver "wacom" - Identifier "Wacom_cursor" - Option "Device" "${cfg.wacom.device}" - Option "Type" "cursor" - ${if cfg.wacom.forceDeviceType!=null then ''Option "ForceDevice" "${cfg.wacom.forceDeviceType}"'' else ""} - EndSection - '' else ""; - - xkbOptions = if cfg.xkbOptions == "" then "" else '' - Option "XkbOptions" "${cfg.xkbOptions}" - ''; - - setCorePointer = - if cfg.synaptics.enable then '' - InputDevice "Touchpad[0]" "CorePointer" - '' else ""; - - internalAGPGART = - if cfg.useInternalAGPGART == "yes" then - '' Option "UseInternalAGPGART" "yes"'' - else if cfg.useInternalAGPGART == "no" then - '' Option "UseInternalAGPGART" "no"'' - else ""; - - extraDeviceConfig = cfg.extraDeviceConfig; - extraMonitorSettings = cfg.extraMonitorSettings; - extraDisplaySettings = cfg.extraDisplaySettings; - extraModules = cfg.extraModules; - serverLayoutOptions = cfg.serverLayoutOptions + - (if cfg.wacom.enable then '' - InputDevice "Wacom_stylus" - InputDevice "Wacom_cursor" - InputDevice "Wacom_eraser" - '' else "") - ; - defaultDepth = cfg.defaultDepth; - virtualScreen = if cfg.virtualScreen != null then - "Virtual ${toString cfg.virtualScreen.x} ${toString cfg.virtualScreen.y}" - else ""; - - xfs = if cfg.useXFS == false then "" else + xfs = optionalString (cfg.useXFS != false) ''FontPath "${toString cfg.useXFS}"''; - buildCommand = '' - buildCommand= # urgh, don't substitute this + inherit (cfg) config; - export fontPaths= - for i in $fontsForXServer; do - if test "''${i:0:''${#NIX_STORE}}" == "$NIX_STORE"; then - for j in $(find $i -name fonts.dir); do - fontPaths="''${fontPaths}FontPath \"$(dirname $j)\"''\n" - done - fi - done + buildCommand = + '' + echo 'Section "Files"' >> $out + echo $xfs >> $out - export modulePaths= - for i in $(find ${toString modules} -type d); do - if ls $i/*.so* > /dev/null 2>&1; then - modulePaths="''${modulePaths}ModulePath \"$i\"''\n" - fi - done + for i in ${toString fontsForXServer}; do + if test "''${i:0:''${#NIX_STORE}}" == "$NIX_STORE"; then + for j in $(find $i -name fonts.dir); do + echo " FontPath \"$(dirname $j)\"" >> $out + done + fi + done + + for i in $(find ${toString cfg.modules} -type d); do + if test $(echo $i/*.so* | wc -w) -ne 0; then + echo " ModulePath \"$i\"" >> $out + fi + done - export moduleSection="" - export screen="" - export device="" - export extensions="" - - - #if only my gf were this dirty - if test "${toString videoDriver}" == "nvidia"; then - export screen=' - Option "AddARGBGLXVisuals" "true" - Option "DisableGLXRootClipping" "true" - Option "RandRRotation" "on" - ' + echo 'EndSection' >> $out - export device=' - Option "RenderAccel" "true" - Option "AllowGLXWithComposite" "true" - Option "AddARGBGLXVisuals" "true" - ' - - export extensions=' - Option "Composite" "Enable" - ' - fi - - if [ "${toString videoDriver}" = i810 ]; then - export extensions=' - Option "Composite" "Enable" - '; - fi; - - if [ "${toString videoDriver}" = ati ]; then - export extensions=' - Option "Composite" "Enable" - '; - fi; - - if [ "${toString videoDriver}" = radeonhd ]; then - export extensions=' - Option "Composite" "Enable" - '; - fi; - - substituteAll $src $out - ''; # */ + echo "$config" >> $out + ''; # */ }; + halConfigFiles = singleton (pkgs.writeTextFile + { name = "hal-policy-keymap"; + destination = "/share/hal/fdi/policy/30-keymap.fdi"; + text = + '' + + + + + hal-setup-keymap + + + base + ${cfg.xkbModel} + ${cfg.layout} + ${cfg.xkbOptions} + + + + ''; + }); + + in -mkIf cfg.enable { +{ - assertions = [ { assertion = config.services.hal.enable == true; message = "The X server needs HAL running. Set services.hal.enable to true"; } ]; - - require = [ - options - - # services.xserver.*Manager - ./display-managers/default.nix - ./window-managers/default.nix - ./desktop-managers/default.nix - - # services.extraJobs - # ../../upstart-jobs/default.nix - - # environment.etc - # ../../etc/default.nix - - # fonts.fonts - # ../../system/fonts.nix - - # boot.extraModulePackages - # security.extraSetuidPrograms - # environment.extraPackages - ]; - - boot = { - extraModulePackages = mkIf (cfg.videoDriver == "nvidia") [ - kernelPackages.nvidia_x11 - ]; - }; - - environment = { - etc = mkIf cfg.exportConfiguration [ - { source = "${configFile}"; - target = "X11/xorg.conf"; - } - # -xkbdir command line option does not seems to be passed to xkbcomp. - { source = "${pkgs.xkeyboard_config}/etc/X11/xkb"; - target = "X11/xkb"; - } + imports = + [ ./display-managers/default.nix + ./window-managers/default.nix + ./desktop-managers/default.nix ]; - x11Packages = [ - xorg.xrandr - xorg.xrdb - xorg.setxkbmap - xorg.iceauth # required for KDE applications (it's called by dcopserver) - ] - ++ optional (videoDriver == "nvidia") kernelPackages.nvidia_x11; - extraPackages = config.environment.x11Packages; - }; + ###### interface + + options = { + + services.xserver = { - services = { - xserver = { - displayManager = { - xserverArgs = [ - "-ac" - "-logverbose" - "-verbose" - "-terminate" - "-logfile" "/var/log/X.${toString cfg.display}.log" - "-config ${configFile}" - ":${toString cfg.display}" "vt${toString cfg.tty}" - "-xkbdir" "${pkgs.xkeyboard_config}/etc/X11/xkb" - ] ++ optional (!cfg.tcpEnable) "-nolisten tcp"; + enable = mkOption { + default = false; + description = '' + Whether to enable the X server. + ''; }; + + autorun = mkOption { + default = true; + description = '' + Whether to start the X server automatically. + ''; + }; + + exportConfiguration = mkOption { + default = false; + description = '' + Whether to symlink the X server configuration under + /etc/X11/xorg.conf. + ''; + }; + + enableTCP = mkOption { + default = false; + description = '' + Whether to allow the X server to accept TCP connections. + ''; + }; + + modules = mkOption { + default = []; + example = [ pkgs.linuxwacom ]; + description = "Packages to be added to the module search path of the X server."; + }; + + resolutions = mkOption { + default = [ {x = 1024; y = 768;} {x = 800; y = 600;} {x = 640; y = 480;} ]; + description = '' + The screen resolutions for the X server. The first element is the default resolution. + ''; + }; + + videoDriver = mkOption { + default = "vesa"; + example = "i810"; + description = '' + The name of the video driver for your graphics card. + ''; + }; + + driSupport = mkOption { + default = true; + description = '' + Whether to enable accelerated OpenGL rendering through the + Direct Rendering Interface (DRI). + ''; + }; + + startSSHAgent = mkOption { + default = true; + description = '' + Whether to start the SSH agent when you log in. The SSH agent + remembers private keys for you so that you don't have to type in + passphrases every time you make an SSH connection. Use + ssh-add to add a key to the agent. + ''; + }; + + isClone = mkOption { + default = true; + example = false; + description = '' + Whether to enable the X server clone mode for dual-head. + ''; + }; + + layout = mkOption { + default = "us"; + description = '' + Keyboard layout. + ''; + }; + + xkbModel = mkOption { + default = "pc104"; + example = "presario"; + description = '' + Keyboard model. + ''; + }; + + xkbOptions = mkOption { + default = ""; + example = "grp:caps_toggle, grp_led:scroll"; + description = '' + X keyboard options; layout switching goes here. + ''; + }; + + config = mkOption { + description = '' + The contents of the configuration file of the X server + (xorg.conf). + ''; + }; + + deviceSection = mkOption { + default = ""; + example = "VideoRAM 131072"; + description = "Contents of the first Device section of the X server configuration file."; + }; + + monitorSection = mkOption { + default = ""; + example = "HorizSync 28-49"; + description = "Contents of the first Monitor section of the X server configuration file."; + }; + + moduleSection = mkOption { + default = ""; + example = + '' + SubSection "extmod" + EndSubsection + ''; + description = "Contents of the Module section of the X server configuration file."; + }; + + serverLayoutSection = mkOption { + default = ""; + example = + '' + Option "AIGLX" "true" + ''; + description = "Contents of the ServerLayout section of the X server configuration file."; + }; + + extraDisplaySettings = mkOption { + default = ""; + example = "Virtual 2048 2048"; + description = "Lines to be added to every Display subsection of the Screen section."; + }; + + defaultDepth = mkOption { + default = 24; + example = 8; + description = "Default colour depth."; + }; + + useXFS = mkOption { + default = false; + example = "unix/:7100"; + description = "Determines how to connect to the X Font Server."; + }; + + tty = mkOption { + default = 7; + example = 9; + description = "Virtual console for the X server."; + }; + + display = mkOption { + default = 0; + example = 1; + description = "Display number for the X server."; + }; + + virtualScreen = mkOption { + default = null; + example = { x = 2048; y = 2048; }; + description = '' + Virtual screen size for Xrandr. + ''; + }; + }; - hal.packages = halConfigFiles; - - extraJobs = [{ - name = "xserver"; - job = '' - start on ${if cfg.autorun then "hal" else "never"} - - start script - - # Ugly hack: wait until udev has started since the X server - # needs various devices. This would more properly be - # expressed as an Upstart dependency, but AFAIK in "start - # on" we can't express a logical AND. - while ! initctl status udev 2>&1 | grep -q running; do - sleep 1 - done - - rm -f /var/run/opengl-driver - ${if videoDriver == "nvidia" - then '' - ln -sf ${kernelPackages.nvidia_x11} /var/run/opengl-driver - '' - else if cfg.driSupport - then "ln -sf ${pkgs.mesa} /var/run/opengl-driver" - else "" - } - - ${cfg.displayManager.job.beforeScript} - - rm -f /tmp/.X0-lock - - end script - - ${cfg.displayManager.job.env} - env FONTCONFIG_FILE=/etc/fonts/fonts.conf # !!! cleanup - env XKB_BINDIR=${xorg.xkbcomp}/bin # Needed for the Xkb extension. - - ${if videoDriver == "nvidia" - then "env LD_LIBRARY_PATH=${xorg.libX11}/lib:${xorg.libXext}/lib:${kernelPackages.nvidia_x11}/lib" - else "" - } - - ${if videoDriver != "nvidia" - then "env XORG_DRI_DRIVER_PATH=${pkgs.mesa}/lib/dri" - else "" - } - - exec ${cfg.displayManager.job.execCmd} + environment.x11Packages = mkOption { + default = []; + type = types.list types.package; + description = '' + List of packages added to the system when the X server is + activated (). ''; - }]; + }; + }; + + + ###### implementation + + config = mkIf cfg.enable { + + assertions = singleton + { assertion = config.services.hal.enable == true; + message = "The X server needs HAL running. Set services.hal.enable to true"; + }; + + boot.extraModulePackages = + optional (cfg.videoDriver == "nvidia") kernelPackages.nvidia_x11; + + environment.etc = optionals cfg.exportConfiguration + [ { source = "${configFile}"; + target = "X11/xorg.conf"; + } + # -xkbdir command line option does not seems to be passed to xkbcomp. + { source = "${pkgs.xkeyboard_config}/etc/X11/xkb"; + target = "X11/xkb"; + } + ]; + + environment.x11Packages = + [ xorg.xorgserver + xorg.xrandr + xorg.xrdb + xorg.setxkbmap + xorg.iceauth # required for KDE applications (it's called by dcopserver) + xorg.xsetroot + ] + ++ optional (videoDriver == "nvidia") kernelPackages.nvidia_x11; + + environment.systemPackages = config.environment.x11Packages; + + services.hal.packages = halConfigFiles; + + jobs = singleton + { name = "xserver"; + + startOn = if cfg.autorun then "hal" else "never"; + + environment = + { FONTCONFIG_FILE = "/etc/fonts/fonts.conf"; # !!! cleanup + XKB_BINDIR = "${xorg.xkbcomp}/bin"; # Needed for the Xkb extension. + } // optionalAttrs (videoDriver != "nvidia") { + XORG_DRI_DRIVER_PATH = "${pkgs.mesa}/lib/dri"; + } // optionalAttrs (videoDriver == "nvidia") { + LD_LIBRARY_PATH = "${xorg.libX11}/lib:${xorg.libXext}/lib:${kernelPackages.nvidia_x11}/lib"; + } // cfg.displayManager.job.environment; + + preStart = + '' + # Ugly hack: wait until udev has started since the X server + # needs various devices. This would more properly be + # expressed as an Upstart dependency, but AFAIK in "start + # on" we can't express a logical AND. + while ! initctl status udev 2>&1 | grep -q running; do + sleep 1 + done + + rm -f /var/run/opengl-driver + ${if videoDriver == "nvidia" + then '' + ln -sf ${kernelPackages.nvidia_x11} /var/run/opengl-driver + '' + else if cfg.driSupport + then "ln -sf ${pkgs.mesa} /var/run/opengl-driver" + else "" + } + + ${cfg.displayManager.job.beforeScript} + + rm -f /tmp/.X0-lock + ''; + + exec = "${cfg.displayManager.job.execCmd}"; + }; + + services.xserver.displayManager.xserverArgs = + [ "-ac" + "-logverbose" + "-verbose" + "-terminate" + "-logfile" "/var/log/X.${toString cfg.display}.log" + "-config ${configFile}" + ":${toString cfg.display}" "vt${toString cfg.tty}" + "-xkbdir" "${pkgs.xkeyboard_config}/etc/X11/xkb" + ] ++ optional (!cfg.enableTCP) "-nolisten tcp"; + + services.xserver.modules = videoDriverInfo.modules + ++ [ xorg.xorgserver xorg.xf86inputevdev ]; + + services.xserver.config = + '' + Section "ServerFlags" + Option "AllowMouseOpenFail" "on" + EndSection + + Section "Module" + ${cfg.moduleSection} + EndSection + + Section "Monitor" + ${cfg.monitorSection} + EndSection + + Section "Device" + ${cfg.deviceSection} + EndSection + + Section "ServerLayout" + ${cfg.serverLayoutSection} + EndSection + + Section "Screen" + Identifier "Screen[0]" + Device "Device[0]" + Monitor "Monitor[0]" + + ${optionalString (cfg.defaultDepth != 0) '' + DefaultDepth ${toString cfg.defaultDepth} + ''} + + ${optionalString (cfg.videoDriver == "nvidia") '' + Option "RandRRotation" "on" + ''} + + ${ + let + f = depth: + '' + SubSection "Display" + Depth ${toString depth} + Modes ${concatMapStrings (res: ''"${toString res.x}x${toString res.y}"'') cfg.resolutions} + ${cfg.extraDisplaySettings} + ${optionalString (cfg.virtualScreen != null) + "Virtual ${toString cfg.virtualScreen.x} ${toString cfg.virtualScreen.y}"} + EndSubSection + ''; + in concatMapStrings f [8 16 24] + } + + EndSection + + Section "Extensions" + ${optionalString (cfg.videoDriver == "nvidia" || cfg.videoDriver == "i810" || cfg.videoDriver == "ati" || cfg.videoDriver == "radeonhd") '' + Option "Composite" "Enable" + ''} + EndSection + + Section "DRI" + Mode 0666 # !!! FIX THIS! + EndSection + ''; + + services.xserver.monitorSection = + '' + Identifier "Monitor[0]" + ''; + + services.xserver.deviceSection = + '' + Identifier "Device[0]" + Driver "${cfg.videoDriver}" + + # !!! Is the "Clone" option still useful? + Option "Clone" "${if cfg.isClone then "on" else "off"}" + ''; + + services.xserver.serverLayoutSection = + '' + Identifier "Layout[all]" + Screen "Screen[0]" + ''; + + }; + } diff --git a/modules/services/x11/xserver/desktop-managers/kde4.nix b/modules/services/x11/xserver/desktop-managers/kde4.nix index 9ce593f1444..b8edf73815b 100644 --- a/modules/services/x11/xserver/desktop-managers/kde4.nix +++ b/modules/services/x11/xserver/desktop-managers/kde4.nix @@ -6,7 +6,7 @@ let xcfg = config.services.xserver; cfg = xcfg.desktopManager.kde4; - xorg = xcfg.package; + xorg = pkgs.xorg; in diff --git a/modules/services/x11/xserver/display-managers/default.nix b/modules/services/x11/xserver/display-managers/default.nix index 83ccae7a41a..9e251501e5b 100644 --- a/modules/services/x11/xserver/display-managers/default.nix +++ b/modules/services/x11/xserver/display-managers/default.nix @@ -3,10 +3,11 @@ let inherit (pkgs.lib) mkOption mergeOneOption optionals filter concatMap concatMapStrings; cfg = config.services.xserver; - xorg = cfg.package; + xorg = pkgs.xorg; # file provided by services.xserver.displayManager.session.script - xsession = wm: dm: pkgs.writeScript "xsession" ''#!/bin/sh + xsession = wm: dm: pkgs.writeScript "xsession" '' + #!/bin/sh source /etc/profile @@ -161,12 +162,10 @@ in job = mkOption { default = {}; example = { - beforeScript = '' + preStart = '' rm -f /var/log/slim.log ''; - env = '' - env SLIM_CFGFILE=/etc/slim.conf - ''; + environment = { SLIM_CFGFILE = /etc/slim.conf; }; execCmd = "${pkgs.slim}/bin/slim"; }; diff --git a/modules/services/x11/xserver/display-managers/kdm.nix b/modules/services/x11/xserver/display-managers/kdm.nix index cb80c500952..77093e00f81 100644 --- a/modules/services/x11/xserver/display-managers/kdm.nix +++ b/modules/services/x11/xserver/display-managers/kdm.nix @@ -74,11 +74,11 @@ in services.xserver.displayManager.job = { beforeScript = ""; - env = ""; + environment = {}; execCmd = "${kdebase_workspace}/bin/kdm -config ${kdmrc}"; }; - security.pam.services = [ { name = "kde"; localLogin = true; } ]; + security.pam.services = [ { name = "kde"; localLogin = true; ckHack = true; } ]; }; diff --git a/modules/services/x11/xserver/display-managers/slim.nix b/modules/services/x11/xserver/display-managers/slim.nix index 2c50b912e73..acef3879107 100644 --- a/modules/services/x11/xserver/display-managers/slim.nix +++ b/modules/services/x11/xserver/display-managers/slim.nix @@ -93,15 +93,14 @@ in config = mkIf cfg.enable { services.xserver.displayManager.job = - { beforeScript = + { preStart = '' rm -f /var/log/slim.log ''; - env = - '' - env SLIM_CFGFILE=${slimConfig} - env SLIM_THEMESDIR=${slimThemesDir} - ''; + environment = + { SLIM_CFGFILE = slimConfig; + SLIM_THEMESDIR = slimThemesDir; + }; execCmd = "${pkgs.slim}/bin/slim"; }; diff --git a/modules/services/x11/xserver/hardware/synaptics.nix b/modules/services/x11/xserver/hardware/synaptics.nix new file mode 100644 index 00000000000..57e5318f481 --- /dev/null +++ b/modules/services/x11/xserver/hardware/synaptics.nix @@ -0,0 +1,84 @@ +{ config, pkgs, ... }: + +with pkgs.lib; + +let cfg = config.services.xserver.synaptics; in + +{ + + options = { + + services.xserver.synaptics = { + + enable = mkOption { + default = false; + example = true; + description = "Whether to enable touchpad support."; + }; + + dev = mkOption { + default = "/dev/input/event0"; + description = "Event device for Synaptics touchpad."; + }; + + minSpeed = mkOption { + default = "0.06"; + description = "Cursor speed factor for precision finger motion."; + }; + + maxSpeed = mkOption { + default = "0.12"; + description = "Cursor speed factor for highest-speed finger motion."; + }; + + twoFingerScroll = mkOption { + default = false; + description = "Whether to enable two-finger drag-scrolling."; + }; + + }; + + }; + + + config = mkIf cfg.enable { + + services.xserver.modules = [ pkgs.xorg.xf86inputsynaptics ]; + + services.xserver.config = + '' + Section "InputDevice" + Identifier "Touchpad[0]" + Driver "synaptics" + Option "Device" "${cfg.dev}" + Option "Protocol" "PS/2" + Option "LeftEdge" "1700" + Option "RightEdge" "5300" + Option "TopEdge" "1700" + Option "BottomEdge" "4200" + Option "FingerLow" "25" + Option "FingerHigh" "30" + Option "MaxTapTime" "180" + Option "MaxTapMove" "220" + Option "VertScrollDelta" "100" + Option "MinSpeed" "${cfg.minSpeed}" + Option "MaxSpeed" "${cfg.maxSpeed}" + Option "AccelFactor" "0.0010" + Option "SHMConfig" "on" + Option "Repeater" "/dev/input/mice" + Option "TapButton1" "1" + Option "TapButton2" "2" + Option "TapButton3" "3" + Option "VertTwoFingerScroll" "${if cfg.twoFingerScroll then "1" else "0"}" + Option "HorizTwoFingerScroll" "${if cfg.twoFingerScroll then "1" else "0"}" + EndSection + ''; + + services.xserver.serverLayoutSection = + '' + InputDevice "Touchpad[0]" "CorePointer" + ''; + + }; + +} diff --git a/modules/services/x11/xserver/hardware/wacom.nix b/modules/services/x11/xserver/hardware/wacom.nix new file mode 100644 index 00000000000..2ad2c12c495 --- /dev/null +++ b/modules/services/x11/xserver/hardware/wacom.nix @@ -0,0 +1,88 @@ +{ config, pkgs, ... }: + +with pkgs.lib; + +let + + cfg = config.services.xserver.wacom; + +in + +{ + + options = { + + services.xserver.wacom = { + + enable = mkOption { + default = false; + description = "Whether to enable the Wacom touchscreen/digitizer."; + }; + + device = mkOption { + default = "/dev/ttyS0"; + description = "Device to use."; + }; + + forceDeviceType = mkOption { + default = "ISDV4"; + example = null; + description = "Some models (think touchscreen) require the device type to be specified."; + }; + + }; + + }; + + + config = mkIf cfg.enable { + + services.xserver.modules = [ pkgs.linuxwacom ]; + + services.udev.packages = [ pkgs.linuxwacom ]; + + services.xserver.serverLayoutSection = + '' + InputDevice "Wacom_stylus" + InputDevice "Wacom_cursor" + InputDevice "Wacom_eraser" + ''; + + services.xserver.config = + '' + Section "InputDevice" + Driver "wacom" + Identifier "Wacom_stylus" + Option "Device" "${cfg.device}" + Option "Type" "stylus" + ${optionalString (cfg.forceDeviceType != null) '' + Option "ForceDevice" "${cfg.forceDeviceType}" + ''} + Option "Button2" "3" + EndSection + + Section "InputDevice" + Driver "wacom" + Identifier "Wacom_eraser" + Option "Device" "${cfg.device}" + Option "Type" "eraser" + ${optionalString (cfg.forceDeviceType != null) '' + Option "ForceDevice" "${cfg.forceDeviceType}" + ''} + Option "Button1" "2" + EndSection + + Section "InputDevice" + Driver "wacom" + Identifier "Wacom_cursor" + Option "Device" "${cfg.device}" + Option "Type" "cursor" + ${optionalString (cfg.forceDeviceType != null) '' + Option "ForceDevice" "${cfg.forceDeviceType}" + ''} + EndSection + ''; + + }; + +} diff --git a/modules/services/x11/xserver/xserver.conf b/modules/services/x11/xserver/xserver.conf deleted file mode 100644 index 5b784884075..00000000000 --- a/modules/services/x11/xserver/xserver.conf +++ /dev/null @@ -1,92 +0,0 @@ -Section "Files" - # Font directories. - @xfs@ - @fontPaths@ - - # Module (driver) directories. - @modulePaths@ -EndSection - -Section "ServerFlags" - Option "AllowMouseOpenFail" "on" -EndSection - - -Section "Module" - Load "bitmap" - Load "int10" - Load "vbe" - @moduleSection@ - @extraModules@ -EndSection - - -@synapticsInputDevice@ - -@wacomInputDevice@ - -Section "Monitor" - Identifier "Monitor[0]" - Option "DPMS" -# HorizSync 28-49 -# VertRefresh 43-75 - @extraMonitorSettings@ -EndSection - - -Section "Screen" - Identifier "Screen[0]" - Device "Device[0]" - Monitor "Monitor[0]" - DefaultDepth @defaultDepth@ - SubSection "Display" - Depth 16 - Modes @resolutions@ - @extraDisplaySettings@ - @virtualScreen@ - EndSubSection - SubSection "Display" - Depth 24 - Modes @resolutions@ - @extraDisplaySettings@ - @virtualScreen@ - EndSubSection - #SubSection "Display" - # Depth 32 - # Modes @resolutions@ - # @extraDisplaySettings@ - #EndSubSection - - @screen@ -EndSection - - -Section "Device" - Identifier "Device[0]" - Driver "@videoDriver@" - Option "Clone" "@isClone@" - @device@ - @internalAGPGART@ - @extraDeviceConfig@ -EndSection - - -Section "ServerLayout" - Identifier "Layout[all]" - @setCorePointer@ - Screen "Screen[0]" - @serverLayoutOptions@ - # If you want to disable HAL-based configuration, set AutoAddDevices to 0 - # Option "AutoAddDevices" "0" -EndSection - - -Section "Extensions" - @extensions@ -EndSection - - -Section "DRI" - Mode 0666 # !!! FIX THIS! -EndSection -