9 cfg = config.services.desktopManager.lomiri;
12 options.services.desktopManager.lomiri = {
13 enable = lib.mkEnableOption ''
14 the Lomiri graphical shell (formerly known as Unity8)
17 basics = lib.mkOption {
20 Enable basic things for getting Lomiri working.
22 type = lib.types.bool;
23 default = config.services.xserver.displayManager.lightdm.greeters.lomiri.enable || cfg.enable;
27 config = lib.mkMerge [
28 # Basics for getting Lomiri to work
29 (lib.mkIf cfg.basics {
31 # To override the default keyboard layout in Lomiri
32 etc.${pkgs.lomiri.lomiri.passthru.etcLayoutsFile}.text = lib.strings.replaceStrings [ "," ] [
34 ] config.services.xserver.xkb.layout;
38 "/share/locale" # TODO LUITK hardcoded default locale path, fix individual apps to not rely on it
42 systemPackages = with pkgs.lomiri; [
43 lomiri-wallpapers # default + additional wallpaper
44 suru-icon-theme # basic indicator icons
48 fonts.packages = with pkgs; [
49 ubuntu-classic # Ubuntu is default font
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 = {
61 ayatana-indicator-datetime # Clock
62 ayatana-indicator-session # Controls for shutting down etc
69 (lib.mkIf cfg.enable {
70 # We need the basic setup as well
71 services.desktopManager.lomiri.basics = true;
76 glib # XDG MIME-related tools identify it as GNOME, add gio for MIME identification to work
80 ++ (with pkgs.lomiri; [
90 lomiri-download-manager
91 lomiri-filemanager-app
94 lomiri-schemas # exposes some required dbus interfaces
95 lomiri-session # wrappers to properly launch the session
97 lomiri-system-settings
100 lomiri-url-dispatcher
101 mediascanner2 # TODO possibly needs to be kicked off by graphical-session.target
103 qtmir # not having its desktop file for Xwayland available causes any X11 application to crash the session
110 bluetooth.enable = lib.mkDefault true;
113 networking.networkmanager.enable = lib.mkDefault true;
115 systemd.packages = with pkgs.lomiri; [
117 lomiri-download-manager
120 services.dbus.packages = with pkgs.lomiri; [
123 lomiri-download-manager
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 = {
139 ayatana-indicator-display
140 ayatana-indicator-messages
141 ayatana-indicator-power
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
150 [ telephony-service ]
151 ++ lib.optionals config.networking.networkmanager.enable [ lomiri-indicator-network ]
155 services.udisks2.enable = true;
156 services.upower.enable = true;
157 services.geoclue2.enable = true;
159 services.gnome.evolution-data-server = {
161 plugins = with pkgs; [
162 # TODO: lomiri.address-book-service
166 services.telepathy.enable = true;
168 services.displayManager = {
169 defaultSession = lib.mkDefault "lomiri";
170 sessionPackages = with pkgs.lomiri; [ lomiri-session ];
174 enable = lib.mkDefault true;
175 displayManager.lightdm = {
176 enable = lib.mkDefault true;
177 greeters.lomiri.enable = lib.mkDefault true;
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
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" ];
205 ExecStart = "${pkgs.lomiri.lomiri-url-dispatcher}/libexec/lomiri-url-dispatcher/lomiri-update-directory /run/current-system/sw/share/lomiri-url-dispatcher/urls/";
209 "lomiri-polkit-agent" = rec {
210 description = "Lomiri Polkit agent";
213 "lomiri-full-greeter.service"
214 "lomiri-full-shell.service"
215 "lomiri-greeter.service"
216 "lomiri-shell.service"
218 after = [ "graphical-session.target" ];
223 ExecStart = "${pkgs.lomiri.lomiri-polkit-agent}/libexec/lomiri-polkit-agent/policykit-agent";
229 "dbus-com.lomiri.UserMetrics" = {
233 BusName = "com.lomiri.UserMetrics";
234 User = "usermetrics";
235 StandardOutput = "syslog";
236 SyslogIdentifier = "com.lomiri.UserMetrics";
237 ExecStart = "${pkgs.lomiri.libusermetrics}/libexec/libusermetrics/usermetricsservice";
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";
246 users.users.usermetrics = {
247 group = "usermetrics";
248 home = "/var/lib/usermetrics";
253 users.groups.usermetrics = { };
257 meta.maintainers = lib.teams.lomiri.members;