Add Hyprland support for nymph: packages, repo, dotfiles, and emptty session

This commit is contained in:
Fabio Scotto di Santolo
2026-03-28 20:09:50 +01:00
parent 654437843b
commit df0c9ea905
9 changed files with 535 additions and 6 deletions

13
.yamllint Normal file
View File

@@ -0,0 +1,13 @@
---
extends: default
rules:
line-length:
max: 120
level: warning
comments-indentation: disable
document-start: disable
ignore: |
ansible/roles/**/files/*.desktop

View File

@@ -1,6 +1,13 @@
--- ---
hostname: nymph hostname: nymph
host_xbps_repositories:
- name: hyprland-void
url: "https://raw.githubusercontent.com/Makrennel/hyprland-void/repository-x86_64-glibc"
host_emptty_wayland_sessions:
- Hyprland.desktop
host_packages: host_packages:
- nvidia - nvidia
- mesa-dri - mesa-dri
@@ -9,6 +16,11 @@ host_packages:
- intel-video-accel - intel-video-accel
- tlp - tlp
- tlp-rdw - tlp-rdw
- hyprland
- hyprpaper
- xdg-desktop-portal-hyprland
- waybar
- wlogout
host_enabled_services: host_enabled_services:
- tlp - tlp
@@ -17,3 +29,9 @@ host_dotfiles:
- src: .config/autorandr/ - src: .config/autorandr/
dest: .config/autorandr/ dest: .config/autorandr/
mode: preserve mode: preserve
- src: .config/hypr/
dest: .config/hypr/
mode: preserve
- src: .config/waybar/
dest: .config/waybar/
mode: preserve

View File

@@ -1,22 +1,49 @@
--- ---
- name: Ensure XBPS extra repositories directory exists
tags: [packages]
ansible.builtin.file:
path: /etc/xbps.d
state: directory
mode: "0755"
when: (host_xbps_repositories | default([])) | length > 0
- name: Configure host-specific XBPS repositories
tags: [packages]
ansible.builtin.copy:
dest: "/etc/xbps.d/{{ item.name }}.conf"
content: |
repository={{ item.url }}
owner: root
group: root
mode: "0644"
loop: "{{ host_xbps_repositories | default([]) }}"
loop_control:
label: "{{ item.name }}"
register: host_xbps_repository_configs
when: (host_xbps_repositories | default([])) | length > 0
- name: Install Void nonfree repository if needed - name: Install Void nonfree repository if needed
tags: [packages] tags: [packages]
community.general.xbps: community.general.xbps:
name: void-repo-nonfree name: void-repo-nonfree
state: present state: present
update_cache: true update_cache: false
register: void_nonfree_repository
when: "'void-repo-nonfree' in (host_packages | default([]) + void_packages_base | default([]))" when: "'void-repo-nonfree' in (host_packages | default([]) + void_packages_base | default([]))"
- name: Refresh XBPS cache after enabling nonfree repository - name: Refresh XBPS cache after configuring repositories
tags: [packages] tags: [packages]
ansible.builtin.command: xbps-install -S community.general.xbps:
changed_when: false update_cache: true
when: "'void-repo-nonfree' in (host_packages | default([]) + void_packages_base | default([]))" accept_pubkey: true
when: >-
(host_xbps_repositories | default([])) | length > 0
or (void_nonfree_repository is defined and void_nonfree_repository is changed)
- name: Synchronize and upgrade Void Linux packages - name: Synchronize and upgrade Void Linux packages
tags: [packages] tags: [packages]
community.general.xbps: community.general.xbps:
update_cache: true update_cache: false
upgrade: true upgrade: true
- name: Install packages on Void Linux - name: Install packages on Void Linux

View File

@@ -0,0 +1,8 @@
[Desktop Entry]
Name=Hyprland
Comment=Hyprland Wayland compositor
Exec=Hyprland
TryExec=Hyprland
Type=Application
DesktopNames=Hyprland
Keywords=wayland;wm;windowmanager;window;manager;tiling;compositor;

View File

@@ -126,6 +126,19 @@
group: root group: root
mode: "0644" mode: "0644"
- name: Install host-specific Wayland sessions for emptty
tags: [packages, services, emptty, hyprland]
ansible.builtin.copy:
src: "{{ item }}"
dest: "/etc/emptty/wayland-sessions/{{ item }}"
owner: root
group: root
mode: "0644"
loop: "{{ host_emptty_wayland_sessions | default([]) }}"
loop_control:
label: "{{ item }}"
when: (host_emptty_wayland_sessions | default([])) | length > 0
- name: Configure emptty - name: Configure emptty
tags: [packages, services, emptty] tags: [packages, services, emptty]
ansible.builtin.template: ansible.builtin.template:

View File

@@ -0,0 +1,193 @@
#############################################
# HYPRLAND CONFIG
# ThinkPad T480 (Intel + NVIDIA)
# Intel primary GPU + NVIDIA offload
#############################################
################
# Variables
################
$mod = SUPER
#$terminal = WINIT_UNIX_BACKEND=x11 ~/.local/bin/nvidia-run alacritty
$terminal = alacritty
$menu = rofi -show drun -config ~/.config/rofi/config.rasi
$powermenu = ~/.local/bin/powermenu
################
# Autostart
################
exec-once = hyprpaper
exec-once = waybar
exec-once = dunst
################
# Environment
################
env = AQ_DRM_DEVICES,/dev/dri/card0:/dev/dri/card1
env = __GLX_VENDOR_LIBRARY_NAME,nvidia
env = GBM_BACKEND,nvidia-drm
env = LIBVA_DRIVER_NAME,iHD
env = WLR_NO_HARDWARE_CURSORS,1
################
# Monitor
################
monitor = ,preferred,auto,1
################
# Input
################
input {
kb_layout = us
kb_variant = alt-intl
follow_mouse = 1
sensitivity = 0
touchpad {
natural_scroll = true
}
}
################
# General
################
general {
layout = master
gaps_in = 6
gaps_out = 10
border_size = 1
col.active_border = rgb(ffffff)
col.inactive_border = rgb(1a1a1a)
allow_tearing = false
}
################
# Master layout
################
master {
new_status = master
mfact = 0.55
inherit_fullscreen = true
}
################
# Decoration
################
decoration {
rounding = 0
blur {
enabled = false
}
}
################
# Animations
################
animations {
enabled = yes
bezier = easeOut, 0.16, 1, 0.3, 1
animation = windows,1,4,easeOut
animation = fade,1,4,easeOut
animation = workspaces,1,4,easeOut
}
################
# Misc
################
misc {
disable_hyprland_logo = true
disable_splash_rendering = true
}
################
# Window rules
################
windowrulev2 = opacity 0.96 0.96,class:^(Alacritty)$
windowrulev2 = float,class:^(Rofi)$
################
# Keybinds
################
# Terminal
bind = $mod, Return, exec, $terminal
# Launcher
bind = $mod, D, exec, $menu
# Powermenu
bind = $mod, Escape, exec, $powermenu
# Exit Hyprland (default)
bind = $mod SHIFT, E, exit
# Close window
bind = $mod, Q, killactive
# Fullscreen
bind = $mod, F, fullscreen, 1
# Floating
bind = $mod, Space, togglefloating
################
# Focus movement
################
bind = $mod, H, movefocus, l
bind = $mod, L, movefocus, r
bind = $mod, K, movefocus, u
bind = $mod, J, movefocus, d
################
# Master navigation
################
bind = $mod, J, layoutmsg, cyclenext
bind = $mod, K, layoutmsg, cycleprev
################
# Workspaces
################
bind = $mod, 1, workspace, 1
bind = $mod, 2, workspace, 2
bind = $mod, 3, workspace, 3
bind = $mod, 4, workspace, 4
bind = $mod, 5, workspace, 5
bind = $mod SHIFT, 1, movetoworkspace, 1
bind = $mod SHIFT, 2, movetoworkspace, 2
bind = $mod SHIFT, 3, movetoworkspace, 3
bind = $mod SHIFT, 4, movetoworkspace, 4
bind = $mod SHIFT, 5, movetoworkspace, 5

View File

@@ -0,0 +1,4 @@
preload = ~/Pictures/wallpapers/gargantua-black-hyprland.png
wallpaper = ,~/Pictures/wallpapers/gargantua-black-hyprland.png
splash = false
ipc = on

View File

@@ -0,0 +1,146 @@
{
"layer": "top",
"position": "top",
"height": 28,
"spacing": 4,
"modules-left": [
"hyprland/workspaces"
],
"modules-center": [
"custom/music"
],
"modules-right": [
"temperature",
"memory",
"cpu",
//"pulseaudio",
"backlight",
"network",
"bluetooth",
"battery",
"clock",
"custom/powermenu",
"tray"
],
"hyprland/workspaces": {
"disable-scroll": true,
"all-outputs": true,
"format": "{name}",
"on-click": "activate",
"persistent-workspaces": {
"*": [1, 2, 3, 4, 5]
}
},
"backlight": {
"device": "intel_backlight",
"on-scroll-up": "light -A 5",
"on-scroll-down": "light -U 5",
"format": "{percent}% {icon}",
"format-icons": ["", "", "", "", "", "", "", "", ""]
},
"pulseaudio": {
"scroll-step": 1,
"format": "{volume}% {icon}",
"format-muted": "mute ",
"format-icons": {
"headphone": "",
"phone": "",
"portable": "",
"car": "",
"default": ["", "", ""]
},
"on-click": "pavucontrol",
"tooltip": false
},
"battery": {
"interval": 10,
"states": {
"warning": 20,
"critical": 10
},
"format": "{capacity}% {icon}",
"format-charging": "{capacity}% 󰂄",
"format-plugged": "{capacity}% ",
"format-alt": "{time} {icon}",
"format-icons": ["󰁺", "󰁻", "󰁼", "󰁽", "󰁾", "󰁿", "󰂀", "󰂁", "󰂂"]
},
"clock": {
"interval": 1,
"timezone": "Europe/Rome",
"format": "{:%H:%M}",
"tooltip-format": "{:%Y %B}\n{calendar}",
"format-alt": "{:%A %d/%m/%Y}"
},
"memory": {
"interval": 1,
"format": "{percentage}% ",
"states": {
"warning": 85
}
},
"cpu": {
"interval": 1,
"format": "{usage}% ",
"tooltip": false
},
"network": {
"interval": 1,
"tooltip": true,
"format-wifi": "{icon}",
"format-ethernet": "{icon}",
"format-linked": "󰈁",
"format-icons": ["󰤟", "󰤢", "󰤥", "󰤨"],
"format-disconnected": "󰈂",
"tooltip-format": "{ifname}",
"tooltip-format-wifi": "{essid} ({signalStrength}%) ",
"tooltip-format-ethernet": "{ifname} ",
"tooltip-format-disconnected": "Disconnected",
"on-click": "nm-connection-editor"
},
"temperature": {
"critical-threshold": 80,
"format": "{temperatureC}°C ",
"tooltip": false
},
"custom/powermenu": {
"format": "",
"on-click": "~/.local/bin/powermenu",
"tooltip": false
},
"tray": {
"icon-size": 15,
"spacing": 6
},
"bluetooth": {
"format": "",
"format-connected": "{device_alias} ",
"format-connected-battery": "{device_alias} {device_battery_percentage}% ",
"format-off": "󰂲",
"tooltip-format": "{controller_alias}\t{controller_address}\n\n{num_connections} connected",
"tooltip-format-connected": "{controller_alias}\t{controller_address}\n\n{num_connections} connected\n\n{device_enumerate}",
"tooltip-format-enumerate-connected": "{device_alias}\t{device_address}",
"tooltip-format-enumerate-connected-battery": "{device_alias}\t{device_address}\t{device_battery_percentage}%",
"on-click": "blueman-manager"
},
"custom/music": {
"format": "{}",
"return-type": "json",
"exec": "waybar-module-music"
}
}

View File

@@ -0,0 +1,107 @@
* {
border: none;
border-radius: 0;
min-height: 0;
padding: 0;
margin: 0;
font-family: "Liberation Mono", "Font Awesome 6 Free", "Font Awesome 6 Brands", monospace;
font-size: 12px;
}
window#waybar {
background: #000000;
color: #dcdcdc;
border-bottom: 1px solid #101010;
}
/* blocchi principali */
#workspaces,
#custom-music,
#temperature,
#memory,
#cpu,
#pulseaudio,
#backlight,
#network,
#bluetooth,
#battery,
#clock,
#custom-powermenu,
#tray {
font-size: 16px;
padding: 0 8px;
margin: 3px 0;
}
/* workspaces */
#workspaces {
padding-left: 10px;
}
#workspaces button {
background: transparent;
color: #6f6f6f;
padding: 0 7px;
margin: 0 2px;
border-bottom: 1px solid transparent;
}
#workspaces button:hover {
color: #dcdcdc;
background: transparent;
}
#workspaces button.active {
color: #ffffff;
border-bottom: 1px solid #ffffff;
}
#workspaces button.urgent {
color: #ffffff;
background: #0f0f0f;
}
/* centro */
#custom-music {
color: #bfbfbf;
}
/* moduli destra */
#temperature,
#memory,
#cpu,
#pulseaudio,
#backlight,
#network,
#bluetooth,
#battery {
color: #d0d0d0;
}
/* clock e power leggermente più evidenti */
#clock,
#custom-powermenu {
color: #ffffff;
}
#clock {
letter-spacing: 0.5px;
padding: 0 12px;
}
#custom-powermenu {
padding-left: 12px;
padding-right: 12px;
}
#tray {
padding-right: 12px;
}
/* tooltip */
tooltip {
background: #000000;
border: 1px solid #ffffff;
color: #e6e6e6;
padding: 10px;
}