Add optional KDE desktop profile

This commit is contained in:
Fabio Scotto di Santolo
2026-06-21 20:45:11 +02:00
parent 2fdda39395
commit bac7d92cf6
13 changed files with 718 additions and 87 deletions

View File

@@ -19,7 +19,7 @@
loop: "{{ void_xbps_repositories | default([]) + host_xbps_repositories | default([]) }}"
loop_control:
label: "{{ item.name }}"
register: void_xbps_repository_configs
register: packages_void_xbps_repository_configs
when: (void_xbps_repositories | default([]) + host_xbps_repositories | default([])) | length > 0
- name: Install Void nonfree repository if needed
@@ -28,7 +28,7 @@
name: void-repo-nonfree
state: present
update_cache: false
register: void_nonfree_repository
register: packages_void_nonfree_repository
when: "'void-repo-nonfree' in (host_packages | default([]) + void_packages_base | default([]))"
- name: Refresh XBPS cache after configuring repositories
@@ -38,7 +38,7 @@
accept_pubkey: true
when: >-
(void_xbps_repositories | default([]) + host_xbps_repositories | default([])) | length > 0
or (void_nonfree_repository is defined and void_nonfree_repository is changed)
or (packages_void_nonfree_repository is defined and packages_void_nonfree_repository is changed)
- name: Synchronize and upgrade Void Linux packages
tags: [packages]
@@ -56,14 +56,25 @@
+ (void_packages_base | default([]))
+ (profile_packages | default([]))
+ (desktop_common_packages | default([]))
+ (
(desktop_minimal_packages | default([]))
if (desktop_environment | default('minimal')) == 'minimal'
else (desktop_kde_packages | default([]))
)
+ (
(desktop_sway_packages | default([]))
if 'sway' in (desktop_sessions_enabled | default([]))
if (
(desktop_environment | default('minimal')) == 'minimal'
and 'sway' in (desktop_sessions_enabled | default([]))
)
else []
)
+ (
(desktop_hyprland_packages | default([]))
if 'hyprland' in (desktop_sessions_enabled | default([]))
if (
(desktop_environment | default('minimal')) == 'minimal'
and 'hyprland' in (desktop_sessions_enabled | default([]))
)
else []
)
+ (host_packages | default([]))
@@ -73,6 +84,40 @@
state: present
update_cache: false
- name: Check whether the selected display manager is active
tags: [packages, display-manager]
ansible.builtin.stat:
path: >-
/var/service/{{ 'sddm' if (desktop_environment | default('minimal')) == 'kde' else 'emptty' }}
register: packages_void_selected_display_manager
- name: Remove packages managed by the inactive desktop environment
tags: [packages]
community.general.xbps:
name: >-
{{
(
(
(desktop_minimal_packages | default([]))
| reject('equalto', 'emptty')
| list
)
+ (desktop_sway_packages | default([]))
+ (desktop_hyprland_packages | default([]))
)
if (desktop_environment | default('minimal')) == 'kde'
else (
(desktop_kde_packages | default([]))
| reject('equalto', 'sddm')
| list
)
}}
state: absent
update_cache: false
when: >-
packages_void_selected_display_manager.stat.exists
or (desktop_allow_display_manager_switch | default(false))
- name: Remove host-absent packages on Void Linux
tags: [packages]
community.general.xbps:

View File

@@ -1,4 +1,22 @@
---
- name: Validate desktop environment selection
tags: [always]
ansible.builtin.assert:
that:
- (desktop_environment | default('minimal')) in ['minimal', 'kde']
- >-
(desktop_environment | default('minimal')) == 'kde'
or (desktop_sessions_enabled | default([]) | length > 0)
- >-
(desktop_environment | default('minimal')) == 'kde'
or (desktop_sessions_enabled | default([]) | difference(['sway', 'hyprland']) | length == 0)
- >-
(desktop_environment | default('minimal')) == 'kde'
or desktop_default_session in (desktop_sessions_enabled | default([]))
fail_msg: >-
desktop_environment must be minimal or kde. Minimal desktops also require
desktop_default_session to be included in desktop_sessions_enabled.
- name: Configure elogind to suspend on lid close
tags: [packages]
ansible.builtin.lineinfile:
@@ -34,32 +52,33 @@
group: "{{ user_group }}"
mode: "0755"
- name: Enable gnome-keyring PAM auth hook
- name: Manage gnome-keyring PAM auth hook
tags: [packages, gnome]
ansible.builtin.lineinfile:
path: /etc/pam.d/login
insertafter: '^auth\s+include\s+system-local-login$'
line: "auth optional pam_gnome_keyring.so"
state: present
state: "{{ 'present' if (desktop_environment | default('minimal')) == 'minimal' else 'absent' }}"
when: "'void' in group_names"
- name: Enable gnome-keyring PAM session hook
- name: Manage gnome-keyring PAM session hook
tags: [packages, gnome]
ansible.builtin.lineinfile:
path: /etc/pam.d/login
insertafter: '^session\s+include\s+system-local-login$'
line: "session optional pam_gnome_keyring.so auto_start"
state: present
state: "{{ 'present' if (desktop_environment | default('minimal')) == 'minimal' else 'absent' }}"
when: "'void' in group_names"
- name: Enable gnome-keyring PAM password hook
- name: Manage gnome-keyring PAM password hook
tags: [packages, gnome]
ansible.builtin.lineinfile:
path: /etc/pam.d/login
insertafter: '^password\s+include\s+system-local-login$'
line: "password optional pam_gnome_keyring.so use_authtok"
state: present
when: "'void' in group_names"
state: "{{ 'present' if (desktop_environment | default('minimal')) == 'minimal' else 'absent' }}"
when:
- "'void' in group_names"
- name: Check whether SSH host ed25519 key exists
tags: [services]
@@ -234,7 +253,9 @@
owner: root
group: root
mode: "0755"
when: "'void' in group_names"
when:
- "'void' in group_names"
- (desktop_environment | default('minimal')) == 'minimal'
- name: Ensure emptty session directories exist
tags: [packages, services, emptty]
@@ -247,7 +268,9 @@
loop:
- /etc/emptty/xsessions
- /etc/emptty/wayland-sessions
when: "'void' in group_names"
when:
- "'void' in group_names"
- (desktop_environment | default('minimal')) == 'minimal'
- name: Configure emptty
tags: [packages, services, emptty]
@@ -258,7 +281,9 @@
group: root
mode: "0644"
notify: Restart emptty
when: "'void' in group_names"
when:
- "'void' in group_names"
- (desktop_environment | default('minimal')) == 'minimal'
- name: Copy common desktop dotfiles
tags: [dotfiles, dotfiles:desktop]
@@ -271,6 +296,11 @@
loop: >-
{{
(desktop_common_dotfiles | default([]))
+ (
(desktop_minimal_dotfiles | default([]))
if (desktop_environment | default('minimal')) == 'minimal'
else []
)
+ ((desktop_void_dotfiles | default([])) if 'void' in group_names else [])
}}
loop_control:
@@ -445,6 +475,14 @@
owner: root
group: root
mode: "0644"
when: (desktop_environment | default('minimal')) == 'minimal'
- name: Remove minimal Qt theme override for KDE
tags: [theme]
ansible.builtin.file:
path: /etc/profile.d/10-qt-theme.sh
state: absent
when: (desktop_environment | default('minimal')) == 'kde'
- name: Ensure flathub remote is configured
tags: [packages]

View File

@@ -16,6 +16,7 @@
loop_control:
label: "{{ item.dest }}"
when:
- (desktop_environment | default('minimal')) == 'minimal'
- "'sway' in (desktop_sessions_enabled | default([]))"
- (host_sway_dotfiles | default([])) | length > 0
@@ -32,5 +33,6 @@
loop_control:
label: "{{ item.dest }}"
when:
- (desktop_environment | default('minimal')) == 'minimal'
- "'hyprland' in (desktop_sessions_enabled | default([]))"
- (host_hyprland_dotfiles | default([])) | length > 0

View File

@@ -15,7 +15,9 @@
- "{{ user_home }}/.config/hypr"
- "{{ user_home }}/.config/rofi"
- "{{ user_home }}/.config/waybar"
when: "'hyprland' in (desktop_sessions_enabled | default([]))"
when:
- (desktop_environment | default('minimal')) == 'minimal'
- "'hyprland' in (desktop_sessions_enabled | default([]))"
- name: Install allowed emptty Hyprland Wayland session
tags: [packages, services, emptty, hyprland]
@@ -25,14 +27,18 @@
owner: root
group: root
mode: "0644"
when: "'hyprland' in (desktop_sessions_enabled | default([]))"
when:
- (desktop_environment | default('minimal')) == 'minimal'
- "'hyprland' in (desktop_sessions_enabled | default([]))"
- name: Remove legacy Hyprland session launcher shadowing package binary
tags: [packages, services, hyprland]
ansible.builtin.file:
path: /usr/local/bin/start-hyprland
state: absent
when: "'hyprland' in (desktop_sessions_enabled | default([]))"
when:
- (desktop_environment | default('minimal')) == 'minimal'
- "'hyprland' in (desktop_sessions_enabled | default([]))"
- name: Install Hyprland session launcher in /usr/local/bin
tags: [packages, services, hyprland]
@@ -42,7 +48,9 @@
owner: root
group: root
mode: "0755"
when: "'hyprland' in (desktop_sessions_enabled | default([]))"
when:
- (desktop_environment | default('minimal')) == 'minimal'
- "'hyprland' in (desktop_sessions_enabled | default([]))"
- name: Ensure /etc/xdg/xdg-desktop-portal exists for Hyprland
tags: [packages, services, hyprland, portal]
@@ -52,7 +60,9 @@
owner: root
group: root
mode: "0755"
when: "'hyprland' in (desktop_sessions_enabled | default([]))"
when:
- (desktop_environment | default('minimal')) == 'minimal'
- "'hyprland' in (desktop_sessions_enabled | default([]))"
- name: Configure xdg-desktop-portal backend preferences for Hyprland
tags: [packages, services, hyprland, portal]
@@ -62,7 +72,9 @@
owner: root
group: root
mode: "0644"
when: "'hyprland' in (desktop_sessions_enabled | default([]))"
when:
- (desktop_environment | default('minimal')) == 'minimal'
- "'hyprland' in (desktop_sessions_enabled | default([]))"
- name: Copy Hyprland desktop dotfiles
tags: [dotfiles, dotfiles:desktop, hyprland]
@@ -75,4 +87,6 @@
loop: "{{ desktop_hyprland_dotfiles | default([]) }}"
loop_control:
label: "{{ item.dest }}"
when: "'hyprland' in (desktop_sessions_enabled | default([]))"
when:
- (desktop_environment | default('minimal')) == 'minimal'
- "'hyprland' in (desktop_sessions_enabled | default([]))"

View File

@@ -0,0 +1,54 @@
---
- name: Check whether SDDM is the active runit display manager
tags: [packages, services, kde, display-manager]
ansible.builtin.stat:
path: /var/service/sddm
register: profile_desktop_kde_sddm_service
when: (desktop_environment | default('minimal')) == 'kde'
- name: Copy KDE MIME application defaults
tags: [dotfiles, dotfiles:desktop, kde]
ansible.builtin.copy:
src: "{{ playbook_dir }}/../dotfiles/desktop/.config/mimeapps.kde.list"
dest: "{{ user_home }}/.config/mimeapps.list"
owner: "{{ username }}"
group: "{{ user_group }}"
mode: "0644"
when: (desktop_environment | default('minimal')) == 'kde'
- name: Remove minimal desktop user configuration managed by Ansible
tags: [dotfiles, dotfiles:desktop, kde]
ansible.builtin.file:
path: "{{ user_home }}/{{ item }}"
state: absent
loop: "{{ desktop_minimal_managed_paths | default([]) }}"
loop_control:
label: "{{ item }}"
when:
- (desktop_environment | default('minimal')) == 'kde'
- profile_desktop_kde_sddm_service.stat.exists
- name: Remove minimal desktop portal preferences
tags: [packages, services, kde, portal]
ansible.builtin.file:
path: "{{ item }}"
state: absent
loop:
- /etc/xdg/xdg-desktop-portal/hyprland-portals.conf
- /etc/xdg/xdg-desktop-portal/sway-portals.conf
when:
- (desktop_environment | default('minimal')) == 'kde'
- profile_desktop_kde_sddm_service.stat.exists
- name: Remove inactive emptty and minimal session launchers
tags: [packages, services, kde, display-manager]
ansible.builtin.file:
path: "{{ item }}"
state: absent
loop:
- /etc/emptty
- /usr/local/bin/start-hyprland-session
- /usr/local/bin/start-sway
when:
- (desktop_environment | default('minimal')) == 'kde'
- profile_desktop_kde_sddm_service.stat.exists

View File

@@ -15,7 +15,9 @@
- "{{ user_home }}/.config/sway"
- "{{ user_home }}/.config/waybar"
- "{{ user_home }}/.config/wlogout"
when: "'sway' in (desktop_sessions_enabled | default([]))"
when:
- (desktop_environment | default('minimal')) == 'minimal'
- "'sway' in (desktop_sessions_enabled | default([]))"
- name: Install allowed emptty Wayland sessions
tags: [packages, services, emptty, sway]
@@ -25,7 +27,9 @@
owner: root
group: root
mode: "0644"
when: "'sway' in (desktop_sessions_enabled | default([]))"
when:
- (desktop_environment | default('minimal')) == 'minimal'
- "'sway' in (desktop_sessions_enabled | default([]))"
- name: Install Sway session launcher in /usr/local/bin
tags: [packages, services, sway]
@@ -35,7 +39,9 @@
owner: root
group: root
mode: "0755"
when: "'sway' in (desktop_sessions_enabled | default([]))"
when:
- (desktop_environment | default('minimal')) == 'minimal'
- "'sway' in (desktop_sessions_enabled | default([]))"
- name: Ensure /etc/xdg/xdg-desktop-portal exists
tags: [packages, services, sway, portal]
@@ -45,7 +51,9 @@
owner: root
group: root
mode: "0755"
when: "'sway' in (desktop_sessions_enabled | default([]))"
when:
- (desktop_environment | default('minimal')) == 'minimal'
- "'sway' in (desktop_sessions_enabled | default([]))"
- name: Configure xdg-desktop-portal backend preferences for sway
tags: [packages, services, sway, portal]
@@ -55,7 +63,9 @@
owner: root
group: root
mode: "0644"
when: "'sway' in (desktop_sessions_enabled | default([]))"
when:
- (desktop_environment | default('minimal')) == 'minimal'
- "'sway' in (desktop_sessions_enabled | default([]))"
- name: Copy sway desktop dotfiles
tags: [dotfiles, dotfiles:desktop, sway]
@@ -68,4 +78,6 @@
loop: "{{ desktop_sway_dotfiles | default([]) }}"
loop_control:
label: "{{ item.dest }}"
when: "'sway' in (desktop_sessions_enabled | default([]))"
when:
- (desktop_environment | default('minimal')) == 'minimal'
- "'sway' in (desktop_sessions_enabled | default([]))"

View File

@@ -14,3 +14,79 @@
dest: "/var/service/{{ item }}"
state: link
loop: "{{ host_enabled_services | default([]) }}"
- name: Define desktop display manager services
tags: [services, packages, display-manager]
ansible.builtin.set_fact:
services_runit_desktop_display_manager_service: >-
{{ 'sddm' if (desktop_environment | default('minimal')) == 'kde' else 'emptty' }}
services_runit_inactive_display_manager_service: >-
{{ 'emptty' if (desktop_environment | default('minimal')) == 'kde' else 'sddm' }}
when: "'desktop' in group_names"
- name: Inspect desktop display manager services
tags: [services, packages, display-manager]
ansible.builtin.stat:
path: "/var/service/{{ item }}"
loop:
- "{{ services_runit_desktop_display_manager_service }}"
- "{{ services_runit_inactive_display_manager_service }}"
loop_control:
label: "{{ item }}"
register: services_runit_display_manager_links
when: "'desktop' in group_names"
- name: Report deferred desktop display manager switch
tags: [services, packages, display-manager]
ansible.builtin.debug:
msg: >-
{{ desktop_environment }} is configured, but {{ services_runit_inactive_display_manager_service }}
is still active. Re-run from a TTY or SSH session with
-e desktop_allow_display_manager_switch=true to switch safely to
{{ services_runit_desktop_display_manager_service }}.
when:
- "'desktop' in group_names"
- services_runit_display_manager_links.results[1].stat.exists
- not (services_runit_display_manager_links.results[0].stat.exists)
- not (desktop_allow_display_manager_switch | default(false))
- name: Disable inactive desktop display manager
tags: [services, packages, display-manager]
ansible.builtin.file:
path: "/var/service/{{ services_runit_inactive_display_manager_service }}"
state: absent
register: services_runit_display_manager_disabled
when:
- "'desktop' in group_names"
- services_runit_display_manager_links.results[1].stat.exists
- not (services_runit_display_manager_links.results[0].stat.exists)
- desktop_allow_display_manager_switch | default(false)
- name: Enable selected desktop display manager
tags: [services, packages, display-manager]
ansible.builtin.file:
src: "/etc/sv/{{ services_runit_desktop_display_manager_service }}"
dest: "/var/service/{{ services_runit_desktop_display_manager_service }}"
state: link
register: services_runit_display_manager_enabled
when:
- "'desktop' in group_names"
- not (services_runit_display_manager_links.results[0].stat.exists)
- >-
not (services_runit_display_manager_links.results[1].stat.exists)
or (desktop_allow_display_manager_switch | default(false))
- name: Remove inactive desktop display manager package after switching
tags: [services, packages, display-manager]
community.general.xbps:
name: "{{ services_runit_inactive_display_manager_service }}"
state: absent
update_cache: false
when:
- "'desktop' in group_names"
- >-
services_runit_display_manager_links.results[0].stat.exists
or (services_runit_display_manager_enabled is defined and services_runit_display_manager_enabled is changed)
- >-
not (services_runit_display_manager_links.results[1].stat.exists)
or (services_runit_display_manager_disabled is defined and services_runit_display_manager_disabled is changed)