1{ config, lib, pkgs, utils, ... }:
2
3with lib;
4
5let
6 xcfg = config.services.xserver;
7 cfg = xcfg.desktopManager.deepin;
8
9 nixos-gsettings-overrides = pkgs.deepin.dde-gsettings-schemas.override {
10 extraGSettingsOverridePackages = cfg.extraGSettingsOverridePackages;
11 extraGSettingsOverrides = cfg.extraGSettingsOverrides;
12 };
13in
14{
15 options = {
16
17 services.xserver.desktopManager.deepin = {
18 enable = mkEnableOption (lib.mdDoc "Enable Deepin desktop manager");
19 extraGSettingsOverrides = mkOption {
20 default = "";
21 type = types.lines;
22 description = lib.mdDoc "Additional gsettings overrides.";
23 };
24 extraGSettingsOverridePackages = mkOption {
25 default = [ ];
26 type = types.listOf types.path;
27 description = lib.mdDoc "List of packages for which gsettings are overridden.";
28 };
29 };
30
31 environment.deepin.excludePackages = mkOption {
32 default = [ ];
33 type = types.listOf types.package;
34 description = lib.mdDoc "List of default packages to exclude from the configuration";
35 };
36
37 };
38
39 config = mkIf cfg.enable
40 {
41 services.xserver.displayManager.sessionPackages = [ pkgs.deepin.startdde ];
42 services.xserver.displayManager.defaultSession = mkDefault "deepin";
43
44 # Update the DBus activation environment after launching the desktop manager.
45 services.xserver.displayManager.sessionCommands = ''
46 ${lib.getBin pkgs.dbus}/bin/dbus-update-activation-environment --systemd --all
47 '';
48
49 hardware.bluetooth.enable = mkDefault true;
50 hardware.pulseaudio.enable = mkDefault true;
51 security.polkit.enable = true;
52
53 services.deepin.dde-daemon.enable = mkForce true;
54 services.deepin.dde-api.enable = mkForce true;
55 services.deepin.app-services.enable = mkForce true;
56
57 services.colord.enable = mkDefault true;
58 services.accounts-daemon.enable = mkDefault true;
59 services.gvfs.enable = mkDefault true;
60 services.gnome.glib-networking.enable = mkDefault true;
61 services.gnome.gnome-keyring.enable = mkDefault true;
62 services.bamf.enable = mkDefault true;
63
64 services.xserver.libinput.enable = mkDefault true;
65 services.udisks2.enable = true;
66 services.upower.enable = mkDefault config.powerManagement.enable;
67 networking.networkmanager.enable = mkDefault true;
68 programs.dconf.enable = mkDefault true;
69
70 fonts.fonts = with pkgs; [ noto-fonts ];
71 xdg.mime.enable = true;
72 xdg.menus.enable = true;
73 xdg.icons.enable = true;
74 xdg.portal.enable = mkDefault true;
75 xdg.portal.extraPortals = mkDefault [
76 (pkgs.xdg-desktop-portal-gtk.override {
77 buildPortalsInGnome = false;
78 })
79 ];
80
81 environment.sessionVariables = {
82 NIX_GSETTINGS_OVERRIDES_DIR = "${nixos-gsettings-overrides}/share/gsettings-schemas/nixos-gsettings-overrides/glib-2.0/schemas";
83 DDE_POLKIT_AGENT_PLUGINS_DIRS = [ "${pkgs.deepin.dpa-ext-gnomekeyring}/lib/polkit-1-dde/plugins" ];
84 };
85
86 environment.pathsToLink = [
87 "/lib/dde-dock/plugins"
88 "/lib/dde-control-center"
89 "/lib/dde-session-shell"
90 "/lib/dde-file-manager"
91 "/share/backgrounds"
92 "/share/wallpapers"
93 ];
94
95 environment.etc = {
96 "distribution.info".text = ''
97 [Distribution]
98 Name=NixOS
99 WebsiteName=www.nixos.org
100 Website=https://www.nixos.org
101 Logo=${pkgs.nixos-icons}/share/icons/hicolor/96x96/apps/nix-snowflake.png
102 LogoLight=${pkgs.nixos-icons}/share/icons/hicolor/32x32/apps/nix-snowflake.png
103 LogoTransparent=${pkgs.deepin.deepin-desktop-base}/share/pixmaps/distribution_logo_transparent.svg
104 '';
105 "deepin-installer.conf".text = ''
106 system_info_vendor_name="Copyright (c) 2003-2023 NixOS contributors"
107 '';
108 };
109
110 systemd.tmpfiles.rules = [
111 "d /var/lib/AccountsService 0775 root root - -"
112 "C /var/lib/AccountsService/icons 0775 root root - ${pkgs.deepin.dde-account-faces}/var/lib/AccountsService/icons"
113 ];
114
115 security.pam.services.dde-lock.text = ''
116 # original at {dde-session-shell}/etc/pam.d/dde-lock
117 auth substack login
118 account include login
119 password substack login
120 session include login
121 '';
122
123 environment.systemPackages = with pkgs; with deepin;
124 let
125 requiredPackages = [
126 pciutils # for dtkcore/startdde
127 xdotool # for dde-daemon
128 glib # for gsettings program / gdbus
129 gtk3 # for gtk-launch program
130 xdg-user-dirs # Update user dirs
131 util-linux # runuser
132 polkit_gnome
133 librsvg # dde-api use rsvg-convert
134 lshw # for dtkcore
135 libsForQt5.kde-gtk-config # deepin-api/gtk-thumbnailer need
136 libsForQt5.kglobalaccel
137 xsettingsd # lightdm-deepin-greeter
138 qt5platform-plugins
139 deepin-pw-check
140 deepin-turbo
141
142 dde-account-faces
143 deepin-icon-theme
144 deepin-sound-theme
145 deepin-gtk-theme
146 deepin-wallpapers
147
148 startdde
149 dde-dock
150 dde-launcher
151 dde-session-ui
152 dde-session-shell
153 dde-file-manager
154 dde-control-center
155 dde-network-core
156 dde-clipboard
157 dde-calendar
158 dde-polkit-agent
159 dpa-ext-gnomekeyring
160 deepin-desktop-schemas
161 deepin-terminal
162 dde-kwin
163 deepin-kwin
164 ];
165 optionalPackages = [
166 onboard # dde-dock plugin
167 deepin-camera
168 deepin-calculator
169 deepin-compressor
170 deepin-editor
171 deepin-picker
172 deepin-draw
173 deepin-album
174 deepin-image-viewer
175 deepin-music
176 deepin-movie-reborn
177 deepin-system-monitor
178 deepin-screen-recorder
179 deepin-shortcut-viewer
180 ];
181 in
182 requiredPackages
183 ++ utils.removePackagesByName optionalPackages config.environment.deepin.excludePackages;
184
185 services.dbus.packages = with pkgs.deepin; [
186 dde-dock
187 dde-launcher
188 dde-session-ui
189 dde-session-shell
190 dde-file-manager
191 dde-control-center
192 dde-calendar
193 dde-clipboard
194 dde-kwin
195 deepin-kwin
196 deepin-pw-check
197 ];
198
199 systemd.packages = with pkgs.deepin; [
200 dde-launcher
201 dde-file-manager
202 dde-calendar
203 dde-clipboard
204 deepin-kwin
205 ];
206 };
207}
208