base16-schemes: unstable-2024-06-21 -> unstable-2024-11-12
[NixPkgs.git] / nixos / modules / services / desktop-managers / lomiri.nix
blobc8faa352a6444bfba54031eae9e39c08c3378af0
2   config,
3   pkgs,
4   lib,
5   ...
6 }:
8 let
9   cfg = config.services.desktopManager.lomiri;
12   options.services.desktopManager.lomiri = {
13     enable = lib.mkEnableOption ''
14       the Lomiri graphical shell (formerly known as Unity8)
15     '';
17     basics = lib.mkOption {
18       internal = true;
19       description = ''
20         Enable basic things for getting Lomiri working.
21       '';
22       type = lib.types.bool;
23       default = config.services.xserver.displayManager.lightdm.greeters.lomiri.enable || cfg.enable;
24     };
25   };
27   config = lib.mkMerge [
28     # Basics for getting Lomiri to work
29     (lib.mkIf cfg.basics {
30       environment = {
31         # To override the default keyboard layout in Lomiri
32         etc.${pkgs.lomiri.lomiri.passthru.etcLayoutsFile}.text = lib.strings.replaceStrings [ "," ] [
33           "\n"
34         ] config.services.xserver.xkb.layout;
36         pathsToLink = [
37           # Data
38           "/share/locale" # TODO LUITK hardcoded default locale path, fix individual apps to not rely on it
39           "/share/wallpapers"
40         ];
42         systemPackages = with pkgs.lomiri; [
43           lomiri-wallpapers # default + additional wallpaper
44           suru-icon-theme # basic indicator icons
45         ];
46       };
48       fonts.packages = with pkgs; [
49         ubuntu-classic # Ubuntu is default font
50       ];
52       # Xwayland is partly hardcoded in Mir so it can't really be fully turned off, and it must be on PATH for X11 apps *and Lomiri's web browser* to work.
53       # Until Mir/Lomiri can be properly used without it, force it on so everything behaves as expected.
54       programs.xwayland.enable = lib.mkForce true;
56       services.ayatana-indicators = {
57         enable = true;
58         packages = (
59           with pkgs;
60           [
61             ayatana-indicator-datetime # Clock
62             ayatana-indicator-session # Controls for shutting down etc
63           ]
64         );
65       };
66     })
68     # Full Lomiri DE
69     (lib.mkIf cfg.enable {
70       # We need the basic setup as well
71       services.desktopManager.lomiri.basics = true;
73       environment = {
74         systemPackages =
75           (with pkgs; [
76             glib # XDG MIME-related tools identify it as GNOME, add gio for MIME identification to work
77             libayatana-common
78             ubports-click
79           ])
80           ++ (with pkgs.lomiri; [
81             hfd-service
82             history-service
83             libusermetrics
84             lomiri
85             lomiri-calculator-app
86             lomiri-camera-app
87             lomiri-clock-app
88             lomiri-content-hub
89             lomiri-docviewer-app
90             lomiri-download-manager
91             lomiri-filemanager-app
92             lomiri-gallery-app
93             lomiri-polkit-agent
94             lomiri-schemas # exposes some required dbus interfaces
95             lomiri-session # wrappers to properly launch the session
96             lomiri-sounds
97             lomiri-system-settings
98             lomiri-terminal-app
99             lomiri-thumbnailer
100             lomiri-url-dispatcher
101             mediascanner2 # TODO possibly needs to be kicked off by graphical-session.target
102             morph-browser
103             qtmir # not having its desktop file for Xwayland available causes any X11 application to crash the session
104             telephony-service
105             teleports
106           ]);
107       };
109       hardware = {
110         bluetooth.enable = lib.mkDefault true;
111       };
113       networking.networkmanager.enable = lib.mkDefault true;
115       systemd.packages = with pkgs.lomiri; [
116         hfd-service
117         lomiri-download-manager
118       ];
120       services.dbus.packages = with pkgs.lomiri; [
121         hfd-service
122         libusermetrics
123         lomiri-download-manager
124       ];
126       # Copy-pasted basic stuff
127       hardware.graphics.enable = lib.mkDefault true;
128       fonts.enableDefaultPackages = lib.mkDefault true;
129       programs.dconf.enable = lib.mkDefault true;
131       services.accounts-daemon.enable = true;
133       services.ayatana-indicators = {
134         enable = true;
135         packages =
136           (
137             with pkgs;
138             [
139               ayatana-indicator-display
140               ayatana-indicator-messages
141               ayatana-indicator-power
142             ]
143             ++ lib.optionals config.hardware.bluetooth.enable [ ayatana-indicator-bluetooth ]
144             ++ lib.optionals (config.hardware.pulseaudio.enable || config.services.pipewire.pulse.enable) [
145               ayatana-indicator-sound
146             ]
147           )
148           ++ (
149             with pkgs.lomiri;
150             [ telephony-service ]
151             ++ lib.optionals config.networking.networkmanager.enable [ lomiri-indicator-network ]
152           );
153       };
155       services.udisks2.enable = true;
156       services.upower.enable = true;
157       services.geoclue2.enable = true;
159       services.gnome.evolution-data-server = {
160         enable = true;
161         plugins = with pkgs; [
162           # TODO: lomiri.address-book-service
163         ];
164       };
166       services.telepathy.enable = true;
168       services.displayManager = {
169         defaultSession = lib.mkDefault "lomiri";
170         sessionPackages = with pkgs.lomiri; [ lomiri-session ];
171       };
173       services.xserver = {
174         enable = lib.mkDefault true;
175         displayManager.lightdm = {
176           enable = lib.mkDefault true;
177           greeters.lomiri.enable = lib.mkDefault true;
178         };
179       };
181       environment.pathsToLink = [
182         # Configs for inter-app data exchange system
183         "/share/lomiri-content-hub/peers"
184         # Configs for inter-app URL requests
185         "/share/lomiri-url-dispatcher/urls"
186         # Splash screens & other images for desktop apps launched via lomiri-app-launch
187         "/share/lomiri-app-launch"
188         # TODO Try to get maliit stuff working
189         "/share/maliit/plugins"
190         # At least the network indicator is still under the unity name, due to leftover Unity-isms
191         "/share/unity"
192         # Data
193         "/share/sounds"
194       ];
196       systemd.user.services = {
197         # Unconditionally run service that collects system-installed URL handlers before LUD
198         # TODO also run user-installed one?
199         "lomiri-url-dispatcher-update-system-dir" = {
200           description = "Lomiri URL dispatcher system directory updater";
201           wantedBy = [ "lomiri-url-dispatcher.service" ];
202           before = [ "lomiri-url-dispatcher.service" ];
203           serviceConfig = {
204             Type = "oneshot";
205             ExecStart = "${pkgs.lomiri.lomiri-url-dispatcher}/libexec/lomiri-url-dispatcher/lomiri-update-directory /run/current-system/sw/share/lomiri-url-dispatcher/urls/";
206           };
207         };
209         "lomiri-polkit-agent" = rec {
210           description = "Lomiri Polkit agent";
211           wantedBy = [
212             "lomiri.service"
213             "lomiri-full-greeter.service"
214             "lomiri-full-shell.service"
215             "lomiri-greeter.service"
216             "lomiri-shell.service"
217           ];
218           after = [ "graphical-session.target" ];
219           partOf = wantedBy;
220           serviceConfig = {
221             Type = "simple";
222             Restart = "always";
223             ExecStart = "${pkgs.lomiri.lomiri-polkit-agent}/libexec/lomiri-polkit-agent/policykit-agent";
224           };
225         };
226       };
228       systemd.services = {
229         "dbus-com.lomiri.UserMetrics" = {
230           serviceConfig =
231             {
232               Type = "dbus";
233               BusName = "com.lomiri.UserMetrics";
234               User = "usermetrics";
235               StandardOutput = "syslog";
236               SyslogIdentifier = "com.lomiri.UserMetrics";
237               ExecStart = "${pkgs.lomiri.libusermetrics}/libexec/libusermetrics/usermetricsservice";
238             }
239             // lib.optionalAttrs (!config.security.apparmor.enable) {
240               # Due to https://gitlab.com/ubports/development/core/libusermetrics/-/issues/8, auth must be disabled when not using AppArmor, lest the next database usage breaks
241               Environment = "USERMETRICS_NO_AUTH=1";
242             };
243         };
244       };
246       users.users.usermetrics = {
247         group = "usermetrics";
248         home = "/var/lib/usermetrics";
249         createHome = true;
250         isSystemUser = true;
251       };
253       users.groups.usermetrics = { };
254     })
255   ];
257   meta.maintainers = lib.teams.lomiri.members;