From 2d5802f3b180217c2653ff1dcccf852aea34f569 Mon Sep 17 00:00:00 2001 From: Frantisek Bohacek Date: Fri, 3 May 2024 18:49:23 +0200 Subject: [PATCH] feat: use custom session start script instead of DM --- home/modules/profiles/desktop/default.nix | 64 ++++++++++++++++++- home/modules/profiles/desktop/gnome.nix | 18 +++++- .../desktop/qtile/config/autostart.sh | 3 +- .../profiles/desktop/qtile/default.nix | 17 ++++- .../profiles/desktop/qtile/services.nix | 24 ++++++- nixos/hosts/configuration.nix | 2 + nixos/modules/profiles/desktop/default.nix | 2 +- nixos/modules/profiles/desktop/qtile.nix | 26 +++++++- 8 files changed, 144 insertions(+), 12 deletions(-) diff --git a/home/modules/profiles/desktop/default.nix b/home/modules/profiles/desktop/default.nix index e0abfcf..04c2d39 100644 --- a/home/modules/profiles/desktop/default.nix +++ b/home/modules/profiles/desktop/default.nix @@ -1,8 +1,9 @@ -{ config, lib, ... }: +{ config, lib, pkgs, ... }: { imports = [ ./qtile + ./dwl ./gnome.nix ]; @@ -13,6 +14,65 @@ }; config = lib.mkIf config.profiles.desktop.enable { - # TODO? + home.file.".start-session".source = pkgs.writeShellScript "start-session" '' + sessions=($(ls ~/.sessions)) + session_indices=(''${!sessions[@]}) + + timeout=3 + selected="start-dwl" # default + + echo "Default session to start is $selected" + + echo "Available sessions:" + for i in ''${!sessions[@]}; do + echo " $((i+1))) ''${sessions[$i]}" + done + echo " q) Enter tty." + + echo -n "Choose session to start: " + read -t"$timeout" -n1 user_input + echo + + if [[ $user_input == "q" ]]; then + exit + elif [[ $user_input ]]; then + user_input=$((user_input-1)) + echo $user_input + echo ''${session_indices[@]} + if [[ " ''${session_indices[@]} " =~ " $user_input " ]]; then + selected="''${sessions[$user_input]}" + echo "Got $user_input. Going to start $selected" + else + echo "Got unknown option. Exiting." + exit + fi + else + echo "Got no input, starting $selected" + fi + + echo "Going to start $selected" + + exec "~/.sessions/$selected" + + ''; + + programs = { + bash = { + enable = true; + profileExtra = '' + if [[ "$(tty)" == "/dev/tty1" && "$(id -u)" != 0 ]]; then + ~/.start-session + fi + ''; + }; + zsh = { + enable = true; + profileExtra = '' + if [[ "$(tty)" == "/dev/tty1" && "$(id -u)" != 0 ]]; then + ~/.start-session + fi + ''; + }; + }; }; } diff --git a/home/modules/profiles/desktop/gnome.nix b/home/modules/profiles/desktop/gnome.nix index 6800693..163b85a 100644 --- a/home/modules/profiles/desktop/gnome.nix +++ b/home/modules/profiles/desktop/gnome.nix @@ -1,4 +1,4 @@ -{ config, lib, ... }: +{ config, lib, pkgs, ... }: { options = { @@ -8,6 +8,22 @@ }; config = lib.mkIf config.profiles.desktop.gnome.enable { + profiles.desktop.enable = true; + + home.file.".sessions/start-gnome".source = pkgs.writeShellApplication { + name = "start-gnome"; + runtimeInputs = [ + pkgs.xorg.xinit + ]; + text = '' + startx ${pkgs.writeShellScript "gnome-internal" '' + gnome-session + pid=$! + wait $pid + systemctl stop --user graphical-session.target + ''} + ''; + } + "/bin/start-gnome"; dconf.settings = { "org/gnome/shell" = { diff --git a/home/modules/profiles/desktop/qtile/config/autostart.sh b/home/modules/profiles/desktop/qtile/config/autostart.sh index 94570af..3e30038 100644 --- a/home/modules/profiles/desktop/qtile/config/autostart.sh +++ b/home/modules/profiles/desktop/qtile/config/autostart.sh @@ -1,6 +1,7 @@ #!/usr/bin/env sh -systemctl start --user wm-services.target +# systemctl start --user wm-services.target +systemctl start --user xorg-wm-services.target # Browser firefox & diff --git a/home/modules/profiles/desktop/qtile/default.nix b/home/modules/profiles/desktop/qtile/default.nix index 7b33417..01e9ce7 100644 --- a/home/modules/profiles/desktop/qtile/default.nix +++ b/home/modules/profiles/desktop/qtile/default.nix @@ -23,7 +23,7 @@ let startup = { apps = config.home-config.startup.apps; hooks = [ - "systemctl start --user wm-services.target" + "systemctl start --user xorg-wm-services.target" ]; }; }; @@ -41,11 +41,26 @@ in { }; config = lib.mkIf config.profiles.desktop.qtile.enable { + profiles.desktop.enable = true; home.packages = [ pkgs.ksnip ]; + home.file.".sessions/start-qtile".source = pkgs.writeShellApplication { + name = "start-qtile"; + runtimeInputs = [ + pkgs.xorg.xinit + ]; + text = '' + startx ${pkgs.writeShellScript "qtile-internal" '' + autorandr -c + qtile start -b x11 + systemctl stop --user graphical-session.target + ''} + ''; + } + "/bin/start-qtile"; + # xdg.configFile."qtile/config.py".text = '' # import sys # sys.path.insert(0, "${./config}") diff --git a/home/modules/profiles/desktop/qtile/services.nix b/home/modules/profiles/desktop/qtile/services.nix index f5b84fb..d8bdab7 100644 --- a/home/modules/profiles/desktop/qtile/services.nix +++ b/home/modules/profiles/desktop/qtile/services.nix @@ -16,6 +16,7 @@ in { services = { # Applets network-manager-applet.enable = true; # Network + blueman-applet.enable = true; autorandr.enable = true; dunst = { @@ -140,10 +141,19 @@ in { }; xdg.dataFile."dbus-1/services/org.knopwob.dunst.service".source = "${pkgs.dunst}/share/dbus-1/services/org.knopwob.dunst.service"; + systemd.user.targets.xorg-wm-services = { + Unit = { + Description = "A target that is enabled when starting Qtile"; + Requires = [ "graphical-session.target" "wm-services.target" ]; + PartOf = [ "graphical-session.target" ]; + }; + }; + systemd.user.targets.wm-services = { Unit = { Description = "A target that is enabled when starting Qtile"; Requires = [ "graphical-session.target" ]; + PartOf = [ "graphical-session.target" ]; }; }; @@ -171,11 +181,19 @@ in { Install.WantedBy = lib.mkForce [ "wm-services.target" ]; }; - autorandr = lib.mkIf config.services.autorandr.enable { - Unit.PartOf = lib.mkForce [ "wm-services.target" ]; + blueman-applet = lib.mkIf config.services.network-manager-applet.enable { + Unit = { + After = lib.mkForce []; + PartOf = lib.mkForce [ "wm-services.target" ]; + }; Install.WantedBy = lib.mkForce [ "wm-services.target" ]; }; + autorandr = lib.mkIf config.services.autorandr.enable { + Unit.PartOf = lib.mkForce [ "xorg-wm-services.target" ]; + Install.WantedBy = lib.mkForce [ "xorg-wm-services.target" ]; + }; + dunst = lib.mkIf config.services.dunst.enable { Unit = { PartOf = lib.mkForce [ "wm-services.target" ]; @@ -211,7 +229,7 @@ in { redshift = lib.mkIf config.services.redshift.enable { Unit = { - PartOf = lib.mkForce [ "wm-services.target" ]; + PartOf = lib.mkForce [ "xorg-wm-services.target" ]; }; Install = { WantedBy = lib.mkForce [ "wm-services.target" ]; diff --git a/nixos/hosts/configuration.nix b/nixos/hosts/configuration.nix index f0f6ae0..b716099 100644 --- a/nixos/hosts/configuration.nix +++ b/nixos/hosts/configuration.nix @@ -6,6 +6,8 @@ ../modules ]; + services.xserver.displayManager.startx.enable = true; + home-manager.useUserPackages = true; home-manager.useGlobalPkgs = true; home-manager.extraSpecialArgs = { diff --git a/nixos/modules/profiles/desktop/default.nix b/nixos/modules/profiles/desktop/default.nix index 810ce89..a5cd34e 100644 --- a/nixos/modules/profiles/desktop/default.nix +++ b/nixos/modules/profiles/desktop/default.nix @@ -23,7 +23,7 @@ xserver = { enable = true; - displayManager.gdm.enable = true; + # displayManager.gdm.enable = true; xkb = { layout = "us,cz"; # Keyboard layout & €-sign diff --git a/nixos/modules/profiles/desktop/qtile.nix b/nixos/modules/profiles/desktop/qtile.nix index ea22fc7..17c72cb 100644 --- a/nixos/modules/profiles/desktop/qtile.nix +++ b/nixos/modules/profiles/desktop/qtile.nix @@ -8,6 +8,15 @@ let ppkgs.pyudev ppkgs.pydbus ]; + finalPackage = pkgs.qtile-unwrapped.overridePythonAttrs(oldAttrs: { + propagatedBuildInputs = oldAttrs.propagatedBuildInputs ++ pythonEnvPackages pkgs.python3Packages; + passthru.providedSessions = [ "qtile" "qtile-wayland" ]; + postInstall = (oldAttrs.postInstall or "") + '' + mkdir -p $out/share/xsessions $out/share/wayland-sessions + cp resources/qtile-wayland.desktop $out/share/wayland-sessions + cp resources/qtile.desktop $out/share/xsessions + ''; + }); in { options = { profiles.desktop.qtile = { @@ -21,11 +30,22 @@ in { services.xserver.windowManager.qtile = { enable = true; - package = pkgs.qtile-unwrapped.overridePythonAttrs(oldAttrs: { - propagatedBuildInputs = oldAttrs.propagatedBuildInputs ++ pythonEnvPackages pkgs.python3Packages; - }); + package = finalPackage; extraPackages = pythonEnvPackages; }; + + # xdg.portal.wlr.enable = true; + # xdg.portal.config.qtile.default = lib.mkDefault [ "wlr" "gtk" ]; + + services.displayManager.sessionPackages = [ finalPackage ]; + + services.xserver.windowManager.session = [{ + name = "qtile-wayland"; + start = '' + ${finalPackage}/bin/qtile start -b wayland & + waitPID=$! + ''; + }]; }; } -- 2.48.1