1{ config, pkgs, lib, ... }:
2
3let
4 cfg = config.services.desktopManager.lomiri;
5in {
6 options.services.desktopManager.lomiri = {
7 enable = lib.mkEnableOption ''
8 the Lomiri graphical shell (formerly known as Unity8)
9 '';
10 };
11
12 config = lib.mkIf cfg.enable {
13 environment = {
14 systemPackages = (with pkgs; [
15 glib # XDG MIME-related tools identify it as GNOME, add gio for MIME identification to work
16 libayatana-common
17 ubports-click
18 ]) ++ (with pkgs.lomiri; [
19 content-hub
20 hfd-service
21 history-service
22 libusermetrics
23 lomiri
24 lomiri-download-manager
25 lomiri-schemas # exposes some required dbus interfaces
26 lomiri-session # wrappers to properly launch the session
27 lomiri-sounds
28 lomiri-system-settings
29 lomiri-terminal-app
30 lomiri-thumbnailer
31 lomiri-url-dispatcher
32 lomiri-wallpapers
33 mediascanner2 # TODO possibly needs to be kicked off by graphical-session.target
34 morph-browser
35 qtmir # not having its desktop file for Xwayland available causes any X11 application to crash the session
36 suru-icon-theme
37 telephony-service
38 ]);
39 };
40
41 networking.networkmanager.enable = lib.mkDefault true;
42
43 systemd.packages = with pkgs.lomiri; [
44 hfd-service
45 lomiri-download-manager
46 ];
47
48 services.dbus.packages = with pkgs.lomiri; [
49 hfd-service
50 libusermetrics
51 lomiri-download-manager
52 ];
53
54 fonts.packages = with pkgs; [
55 # Applications tend to default to Ubuntu font
56 ubuntu_font_family
57 ];
58
59 # Copy-pasted basic stuff
60 hardware.opengl.enable = lib.mkDefault true;
61 fonts.enableDefaultPackages = lib.mkDefault true;
62 programs.dconf.enable = lib.mkDefault true;
63
64 # 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.
65 # Until Mir/Lomiri can be properly used without it, force it on so everything behaves as expected.
66 programs.xwayland.enable = lib.mkForce true;
67
68 services.accounts-daemon.enable = true;
69
70 services.ayatana-indicators = {
71 enable = true;
72 packages = (with pkgs; [
73 ayatana-indicator-datetime
74 ayatana-indicator-messages
75 ayatana-indicator-power
76 ayatana-indicator-session
77 ]) ++ (with pkgs.lomiri; [
78 telephony-service
79 ] ++ lib.optionals config.networking.networkmanager.enable [
80 lomiri-indicator-network
81 ]);
82 };
83
84 services.udisks2.enable = true;
85 services.upower.enable = true;
86 services.geoclue2.enable = true;
87
88 services.gnome.evolution-data-server = {
89 enable = true;
90 plugins = with pkgs; [
91 # TODO: lomiri.address-book-service
92 ];
93 };
94
95 services.telepathy.enable = true;
96
97 services.displayManager = {
98 defaultSession = lib.mkDefault "lomiri";
99 sessionPackages = with pkgs.lomiri; [ lomiri-session ];
100 };
101
102 services.xserver = {
103 enable = lib.mkDefault true;
104 displayManager.lightdm = {
105 enable = lib.mkDefault true;
106 greeters.lomiri.enable = lib.mkDefault true;
107 };
108 };
109
110 environment.pathsToLink = [
111 # Configs for inter-app data exchange system
112 "/share/content-hub/peers"
113 # Configs for inter-app URL requests
114 "/share/lomiri-url-dispatcher/urls"
115 # Splash screens & other images for desktop apps launched via lomiri-app-launch
116 "/share/lomiri-app-launch"
117 # TODO Try to get maliit stuff working
118 "/share/maliit/plugins"
119 # At least the network indicator is still under the unity name, due to leftover Unity-isms
120 "/share/unity"
121 # Data
122 "/share/locale" # TODO LUITK hardcoded default locale path, fix individual apps to not rely on it
123 "/share/sounds"
124 "/share/wallpapers"
125 ];
126
127 systemd.user.services = {
128 # Unconditionally run service that collects system-installed URL handlers before LUD
129 # TODO also run user-installed one?
130 "lomiri-url-dispatcher-update-system-dir" = {
131 description = "Lomiri URL dispatcher system directory updater";
132 wantedBy = [ "lomiri-url-dispatcher.service" ];
133 before = [ "lomiri-url-dispatcher.service" ];
134 serviceConfig = {
135 Type = "oneshot";
136 ExecStart = "${pkgs.lomiri.lomiri-url-dispatcher}/libexec/lomiri-url-dispatcher/lomiri-update-directory /run/current-system/sw/share/lomiri-url-dispatcher/urls/";
137 };
138 };
139 };
140
141 systemd.services = {
142 "dbus-com.lomiri.UserMetrics" = {
143 serviceConfig = {
144 Type = "dbus";
145 BusName = "com.lomiri.UserMetrics";
146 User = "usermetrics";
147 StandardOutput = "syslog";
148 SyslogIdentifier = "com.lomiri.UserMetrics";
149 ExecStart = "${pkgs.lomiri.libusermetrics}/libexec/libusermetrics/usermetricsservice";
150 } // lib.optionalAttrs (!config.security.apparmor.enable) {
151 # 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
152 Environment = "USERMETRICS_NO_AUTH=1";
153 };
154 };
155 };
156
157 users.users.usermetrics = {
158 group = "usermetrics";
159 home = "/var/lib/usermetrics";
160 createHome = true;
161 isSystemUser = true;
162 };
163
164 users.groups.usermetrics = { };
165
166 # TODO content-hub cannot pass files between applications without asking AA for permissions. And alot of the Lomiri stack is designed with AA availability in mind. This might be a requirement to be closer to upstream?
167 # But content-hub currently fails to pass files between applications even with AA enabled, and we can get away without AA in many places. Let's see how this develops before requiring this for good.
168 # security.apparmor.enable = true;
169 };
170
171 meta.maintainers = lib.teams.lomiri.members;
172}