diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix index 9d9f2e9057c..4d51eabccb8 100644 --- a/nixos/modules/module-list.nix +++ b/nixos/modules/module-list.nix @@ -196,7 +196,6 @@ ./programs/partition-manager.nix ./programs/plotinus.nix ./programs/proxychains.nix - ./programs/phosh.nix ./programs/qt5ct.nix ./programs/screen.nix ./programs/sedutil.nix diff --git a/nixos/modules/programs/phosh.nix b/nixos/modules/programs/phosh.nix deleted file mode 100644 index ad875616ac9..00000000000 --- a/nixos/modules/programs/phosh.nix +++ /dev/null @@ -1,162 +0,0 @@ -{ config, lib, pkgs, ... }: - -with lib; - -let - cfg = config.programs.phosh; - - # Based on https://source.puri.sm/Librem5/librem5-base/-/blob/4596c1056dd75ac7f043aede07887990fd46f572/default/sm.puri.OSK0.desktop - oskItem = pkgs.makeDesktopItem { - name = "sm.puri.OSK0"; - desktopName = "On-screen keyboard"; - exec = "${pkgs.squeekboard}/bin/squeekboard"; - categories = [ "GNOME" "Core" ]; - onlyShowIn = [ "GNOME" ]; - noDisplay = true; - extraConfig = { - X-GNOME-Autostart-Phase = "Panel"; - X-GNOME-Provides = "inputmethod"; - X-GNOME-Autostart-Notify = "true"; - X-GNOME-AutoRestart = "true"; - }; - }; - - phocConfigType = types.submodule { - options = { - xwayland = mkOption { - description = '' - Whether to enable XWayland support. - - To start XWayland immediately, use `immediate`. - ''; - type = types.enum [ "true" "false" "immediate" ]; - default = "false"; - }; - cursorTheme = mkOption { - description = '' - Cursor theme to use in Phosh. - ''; - type = types.str; - default = "default"; - }; - outputs = mkOption { - description = '' - Output configurations. - ''; - type = types.attrsOf phocOutputType; - default = { - DSI-1 = { - scale = 2; - }; - }; - }; - }; - }; - - phocOutputType = types.submodule { - options = { - modeline = mkOption { - description = '' - One or more modelines. - ''; - type = types.either types.str (types.listOf types.str); - default = []; - example = [ - "87.25 720 776 848 976 1440 1443 1453 1493 -hsync +vsync" - "65.13 768 816 896 1024 1024 1025 1028 1060 -HSync +VSync" - ]; - }; - mode = mkOption { - description = '' - Default video mode. - ''; - type = types.nullOr types.str; - default = null; - example = "768x1024"; - }; - scale = mkOption { - description = '' - Display scaling factor. - ''; - type = types.nullOr types.ints.unsigned; - default = null; - example = 2; - }; - rotate = mkOption { - description = '' - Screen transformation. - ''; - type = types.enum [ - "90" "180" "270" "flipped" "flipped-90" "flipped-180" "flipped-270" null - ]; - default = null; - }; - }; - }; - - optionalKV = k: v: if v == null then "" else "${k} = ${builtins.toString v}"; - - renderPhocOutput = name: output: let - modelines = if builtins.isList output.modeline - then output.modeline - else [ output.modeline ]; - renderModeline = l: "modeline = ${l}"; - in '' - [output:${name}] - ${concatStringsSep "\n" (map renderModeline modelines)} - ${optionalKV "mode" output.mode} - ${optionalKV "scale" output.scale} - ${optionalKV "rotate" output.rotate} - ''; - - renderPhocConfig = phoc: let - outputs = mapAttrsToList renderPhocOutput phoc.outputs; - in '' - [core] - xwayland = ${phoc.xwayland} - ${concatStringsSep "\n" outputs} - [cursor] - theme = ${phoc.cursorTheme} - ''; -in { - options = { - programs.phosh = { - enable = mkEnableOption '' - Whether to enable, Phosh, related packages and default configurations. - ''; - phocConfig = mkOption { - description = '' - Configurations for the Phoc compositor. - ''; - type = types.oneOf [ types.lines types.path phocConfigType ]; - default = {}; - }; - }; - }; - - config = mkIf cfg.enable { - environment.systemPackages = [ - pkgs.phoc - pkgs.phosh - pkgs.squeekboard - oskItem - ]; - - systemd.packages = [ pkgs.phosh ]; - - programs.feedbackd.enable = true; - - security.pam.services.phosh = {}; - - hardware.opengl.enable = mkDefault true; - - services.gnome.core-shell.enable = true; - services.gnome.core-os-services.enable = true; - services.xserver.displayManager.sessionPackages = [ pkgs.phosh ]; - - environment.etc."phosh/phoc.ini".source = - if builtins.isPath cfg.phocConfig then cfg.phocConfig - else if builtins.isString cfg.phocConfig then pkgs.writeText "phoc.ini" cfg.phocConfig - else pkgs.writeText "phoc.ini" (renderPhocConfig cfg.phocConfig); - }; -} diff --git a/nixos/modules/services/x11/desktop-managers/phosh.nix b/nixos/modules/services/x11/desktop-managers/phosh.nix index e768f6f4c63..4bf78fa16e7 100644 --- a/nixos/modules/services/x11/desktop-managers/phosh.nix +++ b/nixos/modules/services/x11/desktop-managers/phosh.nix @@ -4,6 +4,120 @@ with lib; let cfg = config.services.xserver.desktopManager.phosh; + + # Based on https://source.puri.sm/Librem5/librem5-base/-/blob/4596c1056dd75ac7f043aede07887990fd46f572/default/sm.puri.OSK0.desktop + oskItem = pkgs.makeDesktopItem { + name = "sm.puri.OSK0"; + desktopName = "On-screen keyboard"; + exec = "${pkgs.squeekboard}/bin/squeekboard"; + categories = [ "GNOME" "Core" ]; + onlyShowIn = [ "GNOME" ]; + noDisplay = true; + extraConfig = { + X-GNOME-Autostart-Phase = "Panel"; + X-GNOME-Provides = "inputmethod"; + X-GNOME-Autostart-Notify = "true"; + X-GNOME-AutoRestart = "true"; + }; + }; + + phocConfigType = types.submodule { + options = { + xwayland = mkOption { + description = '' + Whether to enable XWayland support. + + To start XWayland immediately, use `immediate`. + ''; + type = types.enum [ "true" "false" "immediate" ]; + default = "false"; + }; + cursorTheme = mkOption { + description = '' + Cursor theme to use in Phosh. + ''; + type = types.str; + default = "default"; + }; + outputs = mkOption { + description = '' + Output configurations. + ''; + type = types.attrsOf phocOutputType; + default = { + DSI-1 = { + scale = 2; + }; + }; + }; + }; + }; + + phocOutputType = types.submodule { + options = { + modeline = mkOption { + description = '' + One or more modelines. + ''; + type = types.either types.str (types.listOf types.str); + default = []; + example = [ + "87.25 720 776 848 976 1440 1443 1453 1493 -hsync +vsync" + "65.13 768 816 896 1024 1024 1025 1028 1060 -HSync +VSync" + ]; + }; + mode = mkOption { + description = '' + Default video mode. + ''; + type = types.nullOr types.str; + default = null; + example = "768x1024"; + }; + scale = mkOption { + description = '' + Display scaling factor. + ''; + type = types.nullOr types.ints.unsigned; + default = null; + example = 2; + }; + rotate = mkOption { + description = '' + Screen transformation. + ''; + type = types.enum [ + "90" "180" "270" "flipped" "flipped-90" "flipped-180" "flipped-270" null + ]; + default = null; + }; + }; + }; + + optionalKV = k: v: if v == null then "" else "${k} = ${builtins.toString v}"; + + renderPhocOutput = name: output: let + modelines = if builtins.isList output.modeline + then output.modeline + else [ output.modeline ]; + renderModeline = l: "modeline = ${l}"; + in '' + [output:${name}] + ${concatStringsSep "\n" (map renderModeline modelines)} + ${optionalKV "mode" output.mode} + ${optionalKV "scale" output.scale} + ${optionalKV "rotate" output.rotate} + ''; + + renderPhocConfig = phoc: let + outputs = mapAttrsToList renderPhocOutput phoc.outputs; + in '' + [core] + xwayland = ${phoc.xwayland} + ${concatStringsSep "\n" outputs} + [cursor] + theme = ${phoc.cursorTheme} + ''; in { @@ -36,12 +150,18 @@ in type = types.str; example = "users"; }; + + phocConfig = mkOption { + description = '' + Configurations for the Phoc compositor. + ''; + type = types.oneOf [ types.lines types.path phocConfigType ]; + default = {}; + }; }; }; config = mkIf cfg.enable { - programs.phosh.enable = true; - systemd.defaultUnit = "graphical.target"; # Inspired by https://gitlab.gnome.org/World/Phosh/phosh/-/blob/main/data/phosh.service systemd.services.phosh = { @@ -69,5 +189,29 @@ in UtmpMode = "user"; }; }; + + environment.systemPackages = [ + pkgs.phoc + cfg.package + pkgs.squeekboard + oskItem + ]; + + systemd.packages = [ cfg.package ]; + + programs.feedbackd.enable = true; + + security.pam.services.phosh = {}; + + hardware.opengl.enable = mkDefault true; + + services.gnome.core-shell.enable = true; + services.gnome.core-os-services.enable = true; + services.xserver.displayManager.sessionPackages = [ cfg.package ]; + + environment.etc."phosh/phoc.ini".source = + if builtins.isPath cfg.phocConfig then cfg.phocConfig + else if builtins.isString cfg.phocConfig then pkgs.writeText "phoc.ini" cfg.phocConfig + else pkgs.writeText "phoc.ini" (renderPhocConfig cfg.phocConfig); }; }