Several hyprland updates:
plugins, new cursor, light/dark themes, new app launcher, ...
This commit is contained in:
@@ -14,19 +14,23 @@
|
||||
../common/programs/desktop
|
||||
../common/programs/zen-browser.nix
|
||||
../common/programs/hyprland
|
||||
../common/programs/i3.nix
|
||||
../common/programs/kitty
|
||||
../common/programs/syncthing.nix
|
||||
../common/programs/unity.nix
|
||||
../common/programs/ethui.nix
|
||||
../common/programs/gpg.nix
|
||||
../common/features/xdg.nix
|
||||
../common/features/downloads-cleanup.nix
|
||||
../common/programs/3d.nix
|
||||
../common/features/bluetooth.nix
|
||||
./monitors.nix
|
||||
];
|
||||
|
||||
wayland.windowManager.hyprland.settings = {
|
||||
exec-once = [
|
||||
"hyprctl setcursor Nordzy-cursors 32"
|
||||
];
|
||||
|
||||
workspace = [
|
||||
"1, monitor:DP-3"
|
||||
"2, monitor:eDP-1"
|
||||
@@ -42,14 +46,6 @@
|
||||
];
|
||||
};
|
||||
|
||||
programs.hyprpanel.settings.bar.layouts = {
|
||||
"0" = {
|
||||
right = [
|
||||
"battery"
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
home = {
|
||||
username = lib.mkDefault "naps62";
|
||||
stateVersion = lib.mkDefault "24.05";
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
{ pkgs, config, lib, ... }:
|
||||
|
||||
let
|
||||
downloadsDir = "${config.home.homeDirectory}/downloads";
|
||||
# Age in days after which files should be deleted
|
||||
maxAge = 30;
|
||||
in
|
||||
{
|
||||
systemd.user.services.downloads-cleanup = {
|
||||
Unit = {
|
||||
Description = "Clean old files from downloads subdirectories";
|
||||
};
|
||||
|
||||
Service = {
|
||||
Type = "oneshot";
|
||||
ExecStart = "${pkgs.writeShellScript "downloads-cleanup" ''
|
||||
set -euo pipefail
|
||||
|
||||
echo "Starting downloads cleanup..."
|
||||
echo "Cleaning files older than ${toString maxAge} days from ${downloadsDir}/*/ (including hidden files)"
|
||||
|
||||
# Find and delete files older than maxAge days in subdirectories of downloads
|
||||
# -mindepth 2 ensures we only look inside subdirectories, not in downloads/ itself
|
||||
# -type f ensures we only delete files, not directories
|
||||
# This includes hidden files and directories
|
||||
if [ -d "${downloadsDir}" ]; then
|
||||
${pkgs.findutils}/bin/find "${downloadsDir}" \
|
||||
-mindepth 2 \
|
||||
-type f \
|
||||
-mtime +${toString maxAge} \
|
||||
-print \
|
||||
-delete 2>/dev/null || true
|
||||
|
||||
# Also remove empty directories (including hidden ones)
|
||||
${pkgs.findutils}/bin/find "${downloadsDir}" \
|
||||
-mindepth 2 \
|
||||
-type d \
|
||||
-empty \
|
||||
-print \
|
||||
-delete 2>/dev/null || true
|
||||
|
||||
echo "Cleanup completed successfully"
|
||||
else
|
||||
echo "Downloads directory does not exist, skipping cleanup"
|
||||
fi
|
||||
''}";
|
||||
};
|
||||
};
|
||||
|
||||
systemd.user.timers.downloads-cleanup = {
|
||||
Unit = {
|
||||
Description = "Timer for downloads cleanup";
|
||||
};
|
||||
|
||||
Timer = {
|
||||
OnCalendar = "daily";
|
||||
Persistent = true;
|
||||
};
|
||||
|
||||
Install = {
|
||||
WantedBy = [ "timers.target" ];
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -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
|
||||
'';
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
@@ -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 {}
|
||||
}
|
||||
@@ -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
|
||||
};
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
'';
|
||||
};
|
||||
}
|
||||
@@ -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;
|
||||
};
|
||||
}
|
||||
@@ -14,7 +14,6 @@
|
||||
../common/programs/desktop
|
||||
../common/programs/zen-browser.nix
|
||||
../common/programs/hyprland
|
||||
../common/programs/i3.nix
|
||||
../common/programs/kitty
|
||||
../common/programs/syncthing.nix
|
||||
../common/programs/unity.nix
|
||||
@@ -23,6 +22,7 @@
|
||||
../common/programs/3d.nix
|
||||
../common/programs/nerd-dictation.nix
|
||||
../common/features/xdg.nix
|
||||
../common/features/downloads-cleanup.nix
|
||||
../common/features/bluetooth.nix
|
||||
./monitors.nix
|
||||
];
|
||||
@@ -31,11 +31,24 @@
|
||||
LIBVA_DRIVER_NAME = "nvidia";
|
||||
GDM_BACKEND = "nvidia-drm";
|
||||
__GLX_VENDOR_LIBRARY_NAME = "nvidia";
|
||||
# Larger cursor size for desktop (4K monitors)
|
||||
XCURSOR_SIZE = lib.mkForce 42;
|
||||
HYPRCURSOR_SIZE = lib.mkForce 42;
|
||||
};
|
||||
|
||||
wayland.windowManager.hyprland.settings = {
|
||||
env = [
|
||||
"WEBKIT_DISABLE_DMABUF_RENDERER, 1"
|
||||
"XCURSOR_SIZE, 42"
|
||||
"HYPRCURSOR_SIZE, 42"
|
||||
];
|
||||
|
||||
cursor = {
|
||||
no_hardware_cursors = true; # For NVIDIA
|
||||
};
|
||||
|
||||
exec-once = [
|
||||
"hyprctl setcursor Nordzy-cursors 42"
|
||||
];
|
||||
|
||||
windowrule = [
|
||||
|
||||
@@ -22,53 +22,22 @@ in
|
||||
{
|
||||
wayland.windowManager.hyprland.settings = {
|
||||
monitor = [
|
||||
# monitor, res, position, scale, transform, rotation
|
||||
# List HDMI-A-1 first so it becomes the primary monitor (ID 0)
|
||||
"HDMI-A-1, 3840x2160, 0x2160, 1"
|
||||
"DP-1, 3840x2160, 0x0, 1"
|
||||
# 300 instead of 0 is so that 'move left' actually focuses the bottom one instead of the top one
|
||||
# for some reason, that's the minimum value for which this works
|
||||
# Then the other monitors
|
||||
"DP-2, 3840x2160, 3840x180, 1, transform, 1"
|
||||
"DP-1, 3840x2160, 0x0, 1"
|
||||
];
|
||||
workspace = [
|
||||
"1, monitor=DP-2"
|
||||
"2, monitor=DP-1"
|
||||
"3, monitor=DP-2"
|
||||
"4, monitor=HDMI-A-1"
|
||||
"5, monitor=HDMI-A-1"
|
||||
"1, monitor:HDMI-A-1, default:true, persistent:true" # bottom-left (primary)
|
||||
"2, monitor:DP-2, persistent:true" # right (vertical)
|
||||
"3, monitor:DP-1, persistent:true" # top-left
|
||||
"4, monitor:HDMI-A-1" # bottom-left
|
||||
"5, monitor:DP-2" # right (vertical)
|
||||
"6, monitor:DP-1" # top-left
|
||||
];
|
||||
};
|
||||
|
||||
xsession.windowManager.i3 = {
|
||||
extraConfig = lib.mkAfter ''
|
||||
workspace 1 output HDMI-0
|
||||
workspace 2 output DP-2
|
||||
workspace 3 output DP-0
|
||||
|
||||
for_window [title="^ethui-test - main$"] workspace 2
|
||||
for_window [title="^ethui-test - main$"] border normal 2, floating enable, resize set 1280 1200, move position 4720 500
|
||||
for_window [title="^ethui-test - dialog.*"] border normal 2, floating enable, resize set 800 800, move position mouse
|
||||
no_focus [title="^ethui-test - main$"]
|
||||
no_focus [title="^ethui-test - dialog.*"]
|
||||
|
||||
for_window [title="^ethui-dev - main$"] workspace 2
|
||||
for_window [title="^ethui-dev - main$"] border normal 2, floating enable, resize set 1280 1200, move position 4720 500
|
||||
for_window [title="^ethui-dev - dialog.*"] border normal 2, floating enable, resize set 800 800, move position mouse
|
||||
no_focus [title="^ethui-dev - main$"]
|
||||
no_focus [title="^ethui-dev - dialog.*"]
|
||||
|
||||
for_window [title="^ethui - main$"] workspace 2
|
||||
for_window [title="^ethui - main$"] border normal 2, floating enable, resize set 1280 1200, move position 4720 500
|
||||
for_window [title="^ethui - dialog.*"] border normal 2, floating enable, resize set 800 800, move position mouse
|
||||
no_focus [title="^ethui - main$"]
|
||||
no_focus [title="^ethui - dialog.*"]
|
||||
|
||||
# for_window [class="^Ethui$"] border normal 2, floating enable, resize set 1280 1200, move position mouse
|
||||
|
||||
for_window [title="^egui-test$"] floating enable, border none, resize set 800 800, move position 2720 500
|
||||
no_focus [title="^egui-test$"]
|
||||
'';
|
||||
};
|
||||
|
||||
services.hyprpaper.settings.preload = [
|
||||
(builtins.toString wallpaper1)
|
||||
(builtins.toString wallpaper2)
|
||||
|
||||
Reference in New Issue
Block a user