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}