Several hyprland updates:

plugins, new cursor, light/dark themes, new app launcher, ...
This commit is contained in:
Miguel Palhas
2026-02-16 17:33:40 +00:00
parent 48225afa6d
commit e8086e8528
48 changed files with 1436 additions and 290 deletions
+25 -1
View File
@@ -13,6 +13,17 @@
${pkgs.dconf}/bin/dconf write \
/org/gnome/desktop/interface/gtk-theme "'Orchis-Dark-Compact'"
'';
cursor-theme = ''
${pkgs.dconf}/bin/dconf write \
/org/gnome/desktop/interface/cursor-theme "'Nordzy-cursors'"
# Set environment variables for current session
export HYPRCURSOR_THEME="Nordzy-cursors"
export XCURSOR_THEME="Nordzy-cursors"
# Update Hyprland cursor theme
${pkgs.hyprland}/bin/hyprctl setcursor Nordzy-cursors 42
'';
};
lightModeScripts = {
gtk-theme = ''
@@ -21,10 +32,23 @@
${pkgs.dconf}/bin/dconf write \
/org/gnome/desktop/interface/gtk-theme "'Orchis-Compact'"
'';
cursor-theme = ''
${pkgs.dconf}/bin/dconf write \
/org/gnome/desktop/interface/cursor-theme "'Nordzy-white'"
# Set environment variables for current session
export HYPRCURSOR_THEME="Nordzy-white"
export XCURSOR_THEME="Nordzy-white"
# Update Hyprland cursor theme
${pkgs.hyprland}/bin/hyprctl setcursor Nordzy-white 42
'';
};
};
xdg.configFile."darkman/config.yaml".text = ''
usegeoclue: true
lat: 41.55
lng: -8.42
dbusserver: true
'';
}
+7 -5
View File
@@ -1,14 +1,16 @@
{ pkgs, inputs, ... }:
let
nordzy-cursors = pkgs.callPackage ../../../../pkgs/nordzy-cursors/package.nix { };
in
{
home.packages = with pkgs; [
rose-pine-cursor
inputs.rose-pine-hyprcursor.packages.${pkgs.stdenv.hostPlatform.system}.default
home.packages = [
nordzy-cursors
];
home.sessionVariables = {
HYPRCURSOR_THEME = "BreezeX-RosePine-Linux";
HYPRCURSOR_THEME = "Nordzy-cursors"; # Dark variant (default)
HYPRCURSOR_SIZE = 32;
XCURSOR_THEME = "BreezeX-RosePine-Linux";
XCURSOR_THEME = "Nordzy-cursors";
XCURSOR_SIZE = 32;
};
+46 -25
View File
@@ -1,12 +1,19 @@
{ config, pkgs, ... }:
{
config,
inputs,
pkgs,
...
}:
let
rofiLaunchers = import ../../../pkgs/rofi-launchers/package.nix { };
in
{
imports = [
./rofi.nix
./walker.nix
./cursor.nix
./hyprpanel.nix
./waybar.nix
./quickshell.nix
];
home.packages = with pkgs; [
@@ -25,7 +32,34 @@ in
wayland.windowManager.hyprland = {
enable = true;
package = null;
portalPackage = null;
plugins = [
inputs.hyprland-plugins.packages.${pkgs.stdenv.hostPlatform.system}.hyprexpo
inputs.hyprland-plugins.packages.${pkgs.stdenv.hostPlatform.system}.hyprfocus
# inputs.hyprspace.packages.${pkgs.stdenv.hostPlatform.system}.Hyprspace
];
settings = {
plugin = {
hyprexpo = {
columns = 3;
gap_size = 5;
bg_col = "rgb(000000)";
workspace_method = "center current";
};
hyprfocus = {
enabled = true;
mode = "flash";
flash_opacity = 1.8; # Flash brighter instead of dimmer
};
overview = {
autoDrag = true;
exitOnClick = true;
exitOnSwitch = true;
showNewWorkspace = false;
showEmptyWorkspace = false;
};
};
input = {
kb_options = "ctrl:nocaps";
repeat_delay = 150;
@@ -71,34 +105,17 @@ in
blur = {
enabled = true;
# new_optimizations = false;
popups = false;
};
shadow = {
enabled = false;
};
};
# keep default animations, but speed them all up
animations = {
bezier = [
"wind, 0.05, 0.9, 0.1, 1.0"
"winIn, 0.1, 1.0, 0.1, 1.0"
"winOut, 0.3, -0.3, 0, 1"
"liner, 1, 1, 1, 1"
"fadeIn, 0, 0, 0.98, 1"
];
animation = [
"windows, 1, 2, wind, popin 80%"
"windowsIn, 1, 2, fadeIn, popin 80%"
"windowsOut, 1, 5, winOut, popin 80%"
"windowsMove, 1, 5, wind, slide"
"border, 1, 1, liner"
"borderangle, 1, 30, liner, loop"
"fade, 1, 2, fadeIn"
"fadeIn, 1, 2, fadeIn"
"fadeOut, 1, 2, winOut"
"workspaces, 1, 2, wind"
"windowsMove, 0, 1, default, slide"
# "specialWorkspace, 0, 2, default, fade"
"specialWorkspace, 1, 2, fadeIn, fade"
"global, 1, 2, default"
];
};
@@ -111,7 +128,6 @@ in
"exec-once" = [
"dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP"
"hyprpanel"
"nm-applet"
"hyprsunset"
"nerd-dictation begin --simulate-input-tool WTYPE --suspend-on-start && touch ~/.cache/nerd-dictation-suspended"
@@ -165,14 +181,19 @@ in
"$mod" = "SUPER";
bind = [
"$mod, g, hyprexpo:expo, toggle"
# "$mod, tab, overview:toggle,"
"$mod, b, exec, pkill waybar || waybar"
"$mod, t, exec, kitty"
"$mod, v, togglefloating"
"$mod, q, killactive"
"$mod, f, fullscreen, 0"
"$mod SHIFT, f, fullscreen, 1"
# rofi
"$mod, space, exec, launcher_t2"
# walker app launcher
"$mod, space, exec, walker"
# rofi (old)
# "$mod, space, exec, launcher_t2"
# nerd-dictation
# "$mod, d, exec, nerd-dictation-toggle"
@@ -0,0 +1,11 @@
{ inputs, pkgs, ... }:
{
home.packages = [
inputs.quickshell.packages.${pkgs.stdenv.hostPlatform.system}.default
];
xdg.configFile."quickshell" = {
source = ./quickshell;
recursive = true;
};
}
@@ -0,0 +1,94 @@
import Quickshell
import Quickshell.Hyprland
import QtQuick
import QtQuick.Layouts
Scope {
id: root
property bool barVisible: false
Variants {
model: Quickshell.screens
Scope {
id: perScreen
required property var modelData
// invisible trigger zone at the top edge
PanelWindow {
id: trigger
screen: perScreen.modelData
visible: !root.barVisible
anchors {
top: true
left: true
right: true
}
exclusionMode: ExclusionMode.Ignore
implicitHeight: 4
color: "transparent"
MouseArea {
anchors.fill: parent
hoverEnabled: true
onEntered: root.barVisible = true
}
}
// the actual bar
PanelWindow {
id: bar
screen: perScreen.modelData
visible: root.barVisible
anchors {
top: true
left: true
right: true
}
exclusionMode: ExclusionMode.Ignore
implicitHeight: 32
color: "#e611111b"
MouseArea {
anchors.fill: parent
hoverEnabled: true
propagateComposedEvents: true
// keep bar visible while mouse is on it
onExited: hideTimer.restart()
}
RowLayout {
anchors.fill: parent
anchors.leftMargin: 12
anchors.rightMargin: 12
spacing: 0
Workspaces {
Layout.alignment: Qt.AlignLeft
}
Item { Layout.fillWidth: true }
SysTray {
Layout.alignment: Qt.AlignRight
Layout.rightMargin: 16
}
ClockWidget {
Layout.alignment: Qt.AlignRight
}
}
}
Timer {
id: hideTimer
interval: 500
onTriggered: root.barVisible = false
}
}
}
}
@@ -0,0 +1,20 @@
import QtQuick
import QtQuick.Layouts
RowLayout {
spacing: 12
Text {
text: Time.date
font.family: "FiraCode Nerd Font"
font.pixelSize: 13
color: "#6c7086"
}
Text {
text: Time.clock
font.family: "FiraCode Nerd Font"
font.pixelSize: 14
color: "#bac2de"
}
}
@@ -0,0 +1,47 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import Quickshell
import Quickshell.Services.SystemTray
RowLayout {
spacing: 6
Repeater {
model: SystemTray.items
Image {
required property SystemTrayItem modelData
Layout.preferredWidth: 18
Layout.preferredHeight: 18
source: modelData.icon
fillMode: Image.PreserveAspectFit
MouseArea {
anchors.fill: parent
acceptedButtons: Qt.LeftButton | Qt.RightButton
onClicked: (mouse) => {
if (mouse.button === Qt.RightButton || modelData.onlyMenu) {
modelData.display(bar, parent.x, bar.height)
} else {
modelData.activate()
}
}
}
ToolTip {
id: tooltip
visible: hoverArea.containsMouse
text: modelData.tooltipTitle || modelData.title || ""
}
MouseArea {
id: hoverArea
anchors.fill: parent
hoverEnabled: true
acceptedButtons: Qt.NoButton
}
}
}
}
@@ -0,0 +1,15 @@
pragma Singleton
import Quickshell
import QtQuick
Singleton {
id: root
readonly property string clock: Qt.formatDateTime(sysClock.date, "hh:mm")
readonly property string date: Qt.formatDateTime(sysClock.date, "ddd MMM d")
SystemClock {
id: sysClock
precision: SystemClock.Minutes
}
}
@@ -0,0 +1,41 @@
import QtQuick
import QtQuick.Layouts
import Quickshell.Hyprland
RowLayout {
spacing: 4
Repeater {
model: [1, 2, 3, 4, 5, 6]
Rectangle {
required property int modelData
property bool active: Hyprland.focusedMonitor?.activeWorkspace?.id === modelData
property bool occupied: {
for (let i = 0; i < Hyprland.workspaces.values.length; i++) {
let ws = Hyprland.workspaces.values[i];
if (ws.id === modelData && ws.windows > 0) return true;
}
return false;
}
Layout.preferredWidth: 24
Layout.preferredHeight: 24
radius: 4
color: active ? "#b4befe" : "transparent"
Text {
anchors.centerIn: parent
text: modelData
font.family: "FiraCode Nerd Font"
font.pixelSize: 13
color: active ? "#11111b" : occupied ? "#bac2de" : "#6c7086"
}
MouseArea {
anchors.fill: parent
onClicked: Hyprland.dispatch("workspace " + modelData)
}
}
}
}
@@ -0,0 +1,5 @@
import Quickshell
Scope {
Bar {}
}
+13
View File
@@ -0,0 +1,13 @@
{ inputs, pkgs, ... }:
{
imports = [ inputs.walker.homeManagerModules.default ];
programs.walker = {
enable = true;
runAsService = true;
# Using default theme - clean dark theme with good defaults
# You can customize later by copying from:
# https://github.com/abenz1267/walker/tree/master/resources/themes/default
};
}
+173
View File
@@ -0,0 +1,173 @@
{ pkgs, ... }:
{
programs.waybar = {
enable = true;
settings = {
mainBar = {
layer = "top";
position = "top";
height = 32;
exclusive = false;
modules-left = [ "hyprland/workspaces" ];
modules-center = [ "hyprland/window" ];
modules-right = [
"tray"
"bluetooth"
"network"
"pulseaudio"
"battery"
"clock"
];
"hyprland/workspaces" = {
format = "{icon}";
format-icons = {
"1" = "1";
"2" = "2";
"3" = "3";
"4" = "4";
"5" = "5";
"6" = "6";
};
persistent-workspaces = {
"*" = [ 1 2 3 4 5 6 ];
};
};
"hyprland/window" = {
max-length = 50;
};
tray = {
icon-size = 16;
spacing = 8;
};
bluetooth = {
format = "󰂯";
format-disabled = "󰂲";
format-connected = "󰂱";
tooltip-format = "{controller_alias}\t{controller_address}";
tooltip-format-connected = "{controller_alias}\t{controller_address}\n\n{device_enumerate}";
tooltip-format-enumerate-connected = "{device_alias}\t{device_address}";
on-click = "blueman-manager";
};
network = {
format-wifi = "󰤨";
format-ethernet = "󰈀";
format-disconnected = "󰤭";
tooltip-format-wifi = "{essid} ({signalStrength}%)";
tooltip-format-ethernet = "{ifname}: {ipaddr}/{cidr}";
tooltip-format-disconnected = "Disconnected";
};
pulseaudio = {
format = "{icon}";
format-muted = "󰝟";
format-icons = {
default = [ "󰕿" "󰖀" "󰕾" ];
};
tooltip-format = "{volume}%";
on-click = "pavucontrol";
on-click-right = "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle";
scroll-step = 5;
};
battery = {
format = "{icon} {capacity}%";
format-charging = "󰂄 {capacity}%";
format-icons = [ "󰁺" "󰁻" "󰁼" "󰁽" "󰁾" "󰁿" "󰂀" "󰂁" "󰂂" "󰁹" ];
states = {
warning = 20;
critical = 10;
};
};
clock = {
format = "{:%H:%M}";
tooltip-format = "{:%A, %B %d, %Y}";
};
};
};
style = ''
@define-color foreground #bac2de;
@define-color background #11111b;
@define-color active #b4befe;
@define-color warning #f9e2af;
@define-color critical #f38ba8;
@define-color muted #6c7086;
* {
background-color: transparent;
color: @foreground;
border: none;
border-radius: 0;
min-height: 0;
font-family: FiraCode Nerd Font;
font-size: 15px;
}
window#waybar {
background-color: @background;
}
.modules-left {
margin-left: 10px;
}
.modules-right {
margin-right: 10px;
}
#workspaces button {
padding: 0 6px;
margin: 0 2px;
color: @muted;
}
#workspaces button.active {
color: @active;
}
#workspaces button.urgent {
color: @critical;
}
#window {
color: @muted;
font-size: 14px;
}
#tray,
#bluetooth,
#network,
#pulseaudio,
#battery,
#clock {
padding: 0 10px;
color: @foreground;
}
#battery.warning {
color: @warning;
}
#battery.critical {
color: @critical;
}
#pulseaudio.muted {
color: @muted;
}
tooltip {
background-color: @background;
border: 1px solid @muted;
border-radius: 4px;
}
'';
};
}
-88
View File
@@ -1,88 +0,0 @@
{
lib,
config,
pkgs,
...
}:
{
xsession.windowManager.i3 = {
enable = true;
package = pkgs.i3;
config = {
modifier = "Mod4";
terminal = "${pkgs.kitty}/bin/kitty";
gaps = {
inner = 10;
outer = 0;
};
keybindings =
let
modifier = config.xsession.windowManager.i3.config.modifier;
in
lib.mkOptionDefault {
"${modifier}+h" = "focus left";
"${modifier}+j" = "focus down";
"${modifier}+k" = "focus up";
"${modifier}+l" = "focus right";
"XF86AudioRaiseVolume" = "exec wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+";
"XF86AudioLowerVolume" = "exec wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-";
"XF86AudioMute" = "exec pactl set-sink-mute @DEFAULT_SINK@ toggle";
"XF86AudioMicMute" = "exec volumectl -m toggle-mute";
"XF86AudioNext" = "exec playerctl next";
"XF86AudioPrev" = "exec playerctl previous";
"XF86AudioPlay" = "exec playerctl play-pause";
"XF86MonBrightnessUp" = "exec brightnessctl set 5%+";
"XF86MonBrightnessDown" = "exec brightnessctl set 5%-";
"Print" = "exec flameshot gui";
"${modifier}+space" = "exec launcher_t2";
};
bars = [
{
position = "top";
statusCommand = "i3status-rs ~/.config/i3status-rust/config-default.toml";
}
];
};
extraConfig = ''
smart_gaps on
hide_edge_borders smart_no_gaps
for_window [class="kitty"] border none
for_window [class="kitty"] gaps inner current set 0
for_window [class="kitty"] gaps outer current set 0
for_window [class="^zen"] border none
for_window [class="^zen"] gaps inner current set 0
for_window [class="^zen"] gaps outer current set 0
'';
};
programs = {
i3status-rust = {
enable = true;
};
};
# services.picom = {
# enable = true;
# backend = "glx";
# vSync = true;
# };
services.flameshot = {
enable = true;
settings.General = {
drawFontSize = 10;
};
};
xdg.portal = {
enable = true;
xdgOpenUsePortal = true;
};
}