diff --git a/flake.lock b/flake.lock
index aef38d2..14ce230 100644
--- a/flake.lock
+++ b/flake.lock
@@ -60,11 +60,11 @@
]
},
"locked": {
- "lastModified": 1766553861,
- "narHash": "sha256-ZbnG01yA3O8Yr1vUm3+NQ2qk9iRhS5bloAnuXHHy7+c=",
+ "lastModified": 1767619900,
+ "narHash": "sha256-KpoCBPvwHz3gAQtIUkohE2InRBFK3r0/FM6z5SPWfvM=",
"owner": "nix-community",
"repo": "home-manager",
- "rev": "0999ed8f965bbbd991437ad9c5ed3434cecbc30e",
+ "rev": "6bd04da47cfb48dfd15eabf08364b78ad894f5b2",
"type": "github"
},
"original": {
@@ -94,11 +94,11 @@
},
"nixpkgs": {
"locked": {
- "lastModified": 1766473571,
- "narHash": "sha256-5G1NDO2PulBx1RoaA6U1YoUDX0qZslpPxv+n5GX6Qto=",
+ "lastModified": 1767480499,
+ "narHash": "sha256-8IQQUorUGiSmFaPnLSo2+T+rjHtiNWc+OAzeHck7N48=",
"owner": "nixos",
"repo": "nixpkgs",
- "rev": "76701a179d3a98b07653e2b0409847499b2a07d3",
+ "rev": "30a3c519afcf3f99e2c6df3b359aec5692054d92",
"type": "github"
},
"original": {
@@ -207,11 +207,11 @@
]
},
"locked": {
- "lastModified": 1766614843,
- "narHash": "sha256-upUQfQv7Xiy5IZzfsVOL0lH4A/wuUQjG2jlzmBmVuwU=",
+ "lastModified": 1767568852,
+ "narHash": "sha256-6s8hL3YX9zAq2T7qvcwwzaEVwc9MEYbW+C2LcAAQfbk=",
"owner": "0xc000022070",
"repo": "zen-browser-flake",
- "rev": "b01d17acbec3d1b76fecf500289d8509da202585",
+ "rev": "350c729b261e6f5529460140a5f0943dd4c5e156",
"type": "github"
},
"original": {
diff --git a/flake.nix b/flake.nix
index e002deb..717171c 100644
--- a/flake.nix
+++ b/flake.nix
@@ -21,6 +21,7 @@
url = "path:./personal.stub.nix";
flake = false;
};
+
};
outputs = inputs@{ self, nixpkgs, home-manager, ... }:
diff --git a/home-manager/home.nix b/home-manager/home.nix
index 623536d..279dbde 100755
--- a/home-manager/home.nix
+++ b/home-manager/home.nix
@@ -17,9 +17,74 @@
./modules/hypr/hypr.nix
++ lib.optional (builtins.pathExists ./modules/my.nix) ./modules/my.nix;
- # TODO: make it universal
-
home.username = username;
home.homeDirectory = "/home/${username}";
home.stateVersion = "25.11";
+
+ gtk = {
+ enable = true;
+ iconTheme = {
+ name = "Nordzy";
+ package = pkgs.nordzy-icon-theme;
+ };
+ };
+ home.sessionVariables.QS_ICON_THEME = "Nordzy";
+
+ home.packages = with pkgs; [ vlc imv eog ];
+
+ xdg.mimeApps = {
+ enable = true;
+
+ # Optional but often helpful: ensure these associations exist at all
+ associations.added = {
+ "image/jpeg" = [ "imv.desktop" ];
+ "image/png" = [ "imv.desktop" ];
+ "video/mp4" = [ "vlc.desktop" ];
+ };
+
+ defaultApplications = {
+ # Images
+ "image/jpeg" = "imv.desktop";
+ "image/png" = "imv.desktop";
+ "image/webp" = "imv.desktop";
+ "image/gif" = "imv.desktop";
+ "image/svg+xml" = "org.gnome.eog.desktop"; # example: Eye of GNOME for SVG
+
+ # Videos
+ "video/mp4" = "vlc.desktop";
+ "video/x-matroska" = "vlc.desktop"; # mkv
+ "video/x-msvideo" = "vlc.desktop"; # avi
+ "video/quicktime" = "vlc.desktop"; # mov
+ "video/webm" = "vlc.desktop";
+
+ # Audio (optional: also vlc, or a dedicated player)
+ "audio/mpeg" = "vlc.desktop";
+ "audio/flac" = "vlc.desktop";
+ "audio/ogg" = "vlc.desktop";
+
+ # PDFs
+ # "application/pdf" = "org.gnome.Evince.desktop"; # or "okular.desktop"
+
+ # Plain text (example)
+ "text/plain" = "code.desktop"; # VS Code, for example
+
+ "x-scheme-handler/http" = "zen-twilight.desktop";
+ "x-scheme-handler/https" = "zen-twilight.desktop";
+ "x-scheme-handler/chrome" = "zen-twilight.desktop";
+
+ "text/html" = "zen-twilight.desktop";
+ "application/xhtml+xml" = "zen-twilight.desktop";
+ "application/x-extension-htm" = "zen-twilight.desktop";
+ "application/x-extension-html" = "zen-twilight.desktop";
+ "application/x-extension-shtml" = "zen-twilight.desktop";
+ "application/x-extension-xhtml" = "zen-twilight.desktop";
+ "application/x-extension-xht" = "zen-twilight.desktop";
+
+ "x-scheme-handler/tg" = "org.telegram.desktop.desktop";
+ "x-scheme-handler/tonsite" = "org.telegram.desktop.desktop";
+
+ "application/pdf" = "zen-twilight.desktop";
+ "application/zip" = "userapp-unzip-WB99H3.desktop";
+ };
+ };
}
diff --git a/home-manager/modules/hypr/hypr.nix b/home-manager/modules/hypr/hypr.nix
index 721717f..56fc9de 100644
--- a/home-manager/modules/hypr/hypr.nix
+++ b/home-manager/modules/hypr/hypr.nix
@@ -27,7 +27,7 @@
nemo
pywal
jq
- # quickshell
+ quickshell
];
programs.vicinae.enable = true;
services.swww.enable = true;
@@ -39,8 +39,12 @@
home.file.".config/hypr/scripts" = {
source = ./scripts;
recursive = true;
+ executable = true;
};
+ home.file.".config/background".source =
+ config.lib.file.mkOutOfStoreSymlink "/home/krosh/Pictures/wallpaper.png";
+
wayland.windowManager.hyprland = {
enable = true;
plugins = [ pkgs.hyprlandPlugins.hyprexpo ];
diff --git a/home-manager/modules/hypr/hyprland/keybinds.nix b/home-manager/modules/hypr/hyprland/keybinds.nix
index 8c96022..9ec40ca 100644
--- a/home-manager/modules/hypr/hyprland/keybinds.nix
+++ b/home-manager/modules/hypr/hyprland/keybinds.nix
@@ -26,6 +26,7 @@
"${super}, P, pseudo"
"${super}, Q, killactive"
"${super}+Shift+Alt, Q, exec, hyprctl kill"
+ "${super}+Shift, R, exec, reload"
"${super}, Left, movefocus, l"
"${super}, Right, movefocus, r"
@@ -86,7 +87,7 @@
''
"${super}, T, exec, Telegram"
''
- ${super}, E, exec, ~/.config/hypr/scripts/launch_first_available.sh "nemo" "dolphin" "nautilus" "thunar" "kitty -1 zsh -c yazi"''
+ ${super}, E, exec, ~/.config/hypr/scripts/launch_first_available.sh "thunar" "nemo" "nautilus" "dolphin" "kitty -1 zsh -c yazi"''
''
${super}, W, exec, ~/.config/hypr/scripts/launch_first_available.sh "google-chrome-stable" "zen" "firefox" "brave" "chromium" "microsoft-edge-stable" "opera" "librewolf"''
''
@@ -104,7 +105,7 @@
"${super}+Shift, 8, exec, ~/.config/hypr/scripts/workspace_action.sh movetoworkspacesilent 8"
"${super}+Shift, 9, exec, ~/.config/hypr/scripts/workspace_action.sh movetoworkspacesilent 9"
"${super}+Shift, 0, exec, ~/.config/hypr/scripts/workspace_action.sh movetoworkspacesilent 10"
- "${super}+Shift, S, movetoworkspacesilent, special"
+ # "${super}+Shift, S, movetoworkspacesilent, special"
"${super}, S, togglespecialworkspace, special"
"RCtrl, 1, togglespecialworkspace, s1"
@@ -128,7 +129,8 @@
bindd = [
"${super}, M, Toggle power profile,exec, ~/.config/hypr/scripts/switch_config.sh"
# "${super}+Shift, S, Screenshot, exec, hyprshot --freeze --clipboard-only --mode region --silent"
- ", Print, Screenshot, exec, hyprshot --freeze --clipboard-only --mode region --silent"
+ ", Print, Screenshot screen to file, exec, hyprshot --mode output --mode active "
+ "${super}+Shift, S, Screenshot region, exec, hyprshot --freeze --clipboard-only --mode region --silent"
"${super}+Shift, T, OCR, exec, hyprshot -m region --raw | tesseract stdin stdout"
"${super}, L, Lock screen, exec, hyprlock --immediate-render --no-fade-in"
];
@@ -152,6 +154,7 @@
''
, XF86AudioNext, exec, playerctl next || playerctl position `bc <<< "100 * $(playerctl metadata mpris:length) / 1000000 / 100"`''
", XF86AudioPrev, exec, playerctl previous"
+ ", XF86AudioPlay, exec, playerctl play-pause"
# ", Print, exec, hyprshot -m output"
];
diff --git a/home-manager/modules/hypr/hyprlock.nix b/home-manager/modules/hypr/hyprlock.nix
index b31ae00..f4f0dd5 100644
--- a/home-manager/modules/hypr/hyprlock.nix
+++ b/home-manager/modules/hypr/hyprlock.nix
@@ -1,6 +1,7 @@
{ config, pkgs, ... }:
{
+ home.packages = with pkgs; [ playerctl ];
programs.hyprlock = {
enable = true;
extraConfig = ''
@@ -29,8 +30,8 @@
color = rgba(181818FF)
path = ${config.home.homeDirectory}/Pictures/wallpaper.png
- blur_size = 4
- blur_passes = 3
+ blur_size = 0 # 4 by default
+ blur_passes = 0 # 3 by default
noise = 0.0117
contrast = 1.3000
brightness = 0.8000
@@ -80,7 +81,29 @@
valign = center
}
- # FP
+ #Now playing
+ label {
+ monitor =
+ text = cmd[update:5000] ${config.home.homeDirectory}/.config/hypr/scripts/hyprlock/music.sh
+ color = $text_color
+ font_size = 18
+ font_family = $font_family
+
+ shadow_passes = 3
+ shadow_size = 4
+
+ # position = 30, 30
+ # halign = left
+ # valign = bottom
+ # position = 0, -80
+ # halign = center
+ # valign = center
+ position = -30, -30
+ halign = right
+ valign = top
+ }
+
+ # Fingerprint prompt
label {
monitor =
text = cmd[update:1000] echo $FPRINTPROMPT
@@ -142,23 +165,6 @@
valign = center
}
- # Degrees
- label {
- monitor =
- text = cmd[update:18000000] echo "Feels like $(curl -s \'wttr.in?format=%t\' | tr -d \'+\') "
- color = $text_color
- font_size = 18
- font_family = $font_family
-
- shadow_passes = 3
- shadow_size = 4
-
- position = 0, 30
- halign = center
- valign = bottom
- }
-
-
label { # User
monitor =
text = $USER
@@ -177,7 +183,7 @@
label { # Status bat
monitor =
- text = cmd[update:5000] ${config.home.homeDirectory}/.config/hypr/scripts/hyprlock-status.sh
+ text = cmd[update:5000] ${config.home.homeDirectory}/.config/hypr/scripts/hyprlock/bat_status.sh
color = $text_color
shadow_passes = 3
@@ -190,6 +196,22 @@
halign = left
valign = top
}
+
+ # Degrees
+ label {
+ monitor =
+ text = cmd[update:120000] ${config.home.homeDirectory}/.config/hypr/scripts/hyprlock/weather.sh
+ color = $text_color
+ font_size = 18
+ font_family = $font_family
+
+ shadow_passes = 3
+ shadow_size = 4
+
+ position = 0, 30
+ halign = center
+ valign = bottom
+ }
'';
};
}
diff --git a/home-manager/modules/hypr/qs/qs.nix b/home-manager/modules/hypr/qs/qs.nix
index 5294004..3b352d0 100644
--- a/home-manager/modules/hypr/qs/qs.nix
+++ b/home-manager/modules/hypr/qs/qs.nix
@@ -1,552 +1,23 @@
{ config, pkgs, lib, ... }:
let
- shellQml = pkgs.writeText "shell.qml" ''
- import Quickshell
- import QtQuick
- import QtQuick.Layouts
-
- import Quickshell.Wayland
- import Quickshell.Hyprland
-
- import Quickshell.Services.Mpris
- import Quickshell.Services.Pipewire
- import Quickshell.Services.SystemTray
- import Quickshell.Services.UPower
- import Quickshell.Bluetooth
-
- import "widgets" as W
-
- ShellRoot {
- id: root
-
- property int barHeight: 34
- property int paddingX: 10
- property int spacing: 10
-
- property real backgroundOpacity: 0.45
- property int radius: 10
- property int borderWidth: 1
-
- SystemClock { id: clock; precision: SystemClock.Minutes }
-
- Variants {
- model: Quickshell.screens
-
- PanelWindow {
- id: win
-
- required property var modelData
- screen: modelData
-
- anchors {
- top: true
- left: true
- right: true
- }
-
- implicitHeight: root.barHeight
- exclusiveZone: implicitHeight
-
- aboveWindows: true
- focusable: false
- color: "transparent"
-
- Rectangle {
- anchors.fill: parent
- radius: root.radius
- border.width: root.borderWidth
- border.color: Qt.rgba(1, 1, 1, 0.15)
- color: Qt.rgba(0, 0, 0, root.backgroundOpacity)
- }
-
- RowLayout {
- anchors.fill: parent
- anchors.leftMargin: root.paddingX
- anchors.rightMargin: root.paddingX
- spacing: root.spacing
-
- RowLayout {
- spacing: root.spacing
- Layout.alignment: Qt.AlignLeft
- W.DashboardButton { }
- W.Workspaces { }
- W.Separator { }
- W.WindowTitle { screen: modelData }
- }
-
- Item { Layout.fillWidth: true }
-
- RowLayout {
- spacing: root.spacing
- Layout.alignment: Qt.AlignHCenter
- W.Media { }
- }
-
- Item { Layout.fillWidth: true }
-
- RowLayout {
- spacing: root.spacing
- Layout.alignment: Qt.AlignRight
- W.Volume { }
- W.Network { }
- W.BluetoothIndicator { }
- W.Battery { }
- W.Separator { }
- W.Tray { parentWindow: win }
- W.KeyboardLayout { }
- W.Clock { clock: clock }
- W.Notifications { }
- }
- }
- }
- }
- }
- '';
-
- barButtonQml = pkgs.writeText "BarButton.qml" ''
- import QtQuick
- import QtQuick.Layouts
-
- Item {
- id: root
-
- property string label: ""
- property string iconSource: ""
- property bool emphasized: false
-
- signal clicked()
- signal rightClicked()
-
- implicitHeight: 24
- implicitWidth: content.implicitWidth + 14
-
- Rectangle {
- anchors.fill: parent
- radius: 8
- color: emphasized ? Qt.rgba(1, 1, 1, 0.18) : Qt.rgba(1, 1, 1, 0.10)
- border.width: 0
- }
-
- RowLayout {
- id: content
- anchors.centerIn: parent
- spacing: 6
-
- Image {
- visible: root.iconSource !== ""
- source: root.iconSource
- width: 16
- height: 16
- fillMode: Image.PreserveAspectFit
- smooth: true
- }
-
- Text {
- text: root.label
- font.weight: 300
- color: "white"
- elide: Text.ElideRight
- }
- }
-
- MouseArea {
- anchors.fill: parent
- acceptedButtons: Qt.LeftButton | Qt.RightButton
- onClicked: function(mouse) {
- if (mouse.button === Qt.LeftButton) root.clicked();
- if (mouse.button === Qt.RightButton) root.rightClicked();
- }
- }
- }
- '';
-
- separatorQml = pkgs.writeText "Separator.qml" ''
- import QtQuick
- import QtQuick.Layouts
-
- Rectangle {
- Layout.preferredWidth: 1
- Layout.preferredHeight: 16
- radius: 1
- color: Qt.rgba(1, 1, 1, 0.18)
- }
- '';
-
- dashboardQml = pkgs.writeText "DashboardButton.qml" ''
- import QtQuick
- import Quickshell.Io
- import "."
-
- BarButton {
- label: "≡"
-
- Process { id: proc }
-
- function run(cmd) {
- proc.running = false
- proc.command = ["sh", "-lc", cmd]
- proc.running = true
- }
-
- onClicked: run("command -v fuzzel >/dev/null && fuzzel || true")
- onRightClicked: run("command -v wlogout >/dev/null && wlogout || true")
- }
- '';
-
- workspacesQml = pkgs.writeText "Workspaces.qml" ''
- import QtQuick
- import QtQuick.Layouts
- import Quickshell.Hyprland
- import Quickshell.Io
- import "."
-
- RowLayout {
- spacing: 6
-
- Process { id: hypr }
-
- function dispatchWorkspace(id) {
- hypr.running = false
- hypr.command = ["sh", "-lc", "hyprctl dispatch workspace " + id]
- hypr.running = true
- }
-
- Repeater {
- model: Hyprland.workspaces
- delegate: BarButton {
- label: (modelData.name && modelData.name !== "") ? modelData.name : ("" + modelData.id)
- emphasized: modelData.focused
- onClicked: {
- if (modelData.activate) modelData.activate()
- else dispatchWorkspace(modelData.id)
- }
- }
- }
- }
- '';
-
- windowTitleQml = pkgs.writeText "WindowTitle.qml" ''
- import QtQuick
- import Quickshell.Wayland
-
- Item {
- id: root
- property var screen
-
- implicitHeight: 24
- implicitWidth: 320
-
- Text {
- anchors.verticalCenter: parent.verticalCenter
- width: parent.implicitWidth
- color: "white"
- font.weight: 300
- elide: Text.ElideRight
-
- text: {
- const t = ToplevelManager.activeToplevel; // singleton property :contentReference[oaicite:1]{index=1}
- if (!t) return "";
-
- // опционально: фильтр по монитору
- if (root.screen && t.screens && t.screens.indexOf && t.screens.indexOf(root.screen) === -1)
- return "";
-
- return t.title || "";
- }
- }
- }
-
- '';
-
- mediaQml = pkgs.writeText "Media.qml" ''
- import QtQuick
- import Quickshell.Services.Mpris
-
- Item {
- implicitHeight: 24
- implicitWidth: 360
-
- function pickPlayer() {
- const list = Mpris.players.values || [];
- if (list.length === 0) return null;
- for (let i = 0; i < list.length; i++) {
- if (list[i].playbackState === MprisPlaybackState.Playing) return list[i];
- }
- return list[0];
- }
-
- Text {
- anchors.verticalCenter: parent.verticalCenter
- width: parent.implicitWidth
- color: "white"
- font.weight: 300
- elide: Text.ElideRight
- text: {
- const p = pickPlayer();
- if (!p) return "";
- const title = p.trackTitle || "";
- const artist = p.trackArtist || "";
- if (title === "" && artist === "") return "";
- return "\"" + (title || "Unknown Title") + "\" by " + (artist || "Unknown Artist");
- }
- }
- }
- '';
-
- volumeQml = pkgs.writeText "Volume.qml" ''
- import QtQuick
- import Quickshell.Services.Pipewire
- import "."
-
- BarButton {
- id: root
-
- PwObjectTracker { objects: [ Pipewire.defaultAudioSink ] }
-
- function clamp(x, lo, hi) { return Math.max(lo, Math.min(hi, x)); }
-
- label: {
- const s = Pipewire.defaultAudioSink;
- if (!s || !s.audio) return "Vol: --";
- return "Vol: " + Math.round(s.audio.volume * 100) + "%";
- }
-
- WheelHandler {
- onWheel: function(event) {
- const s = Pipewire.defaultAudioSink;
- if (!s || !s.audio) return;
- const step = 0.05;
- const dir = event.angleDelta.y > 0 ? -1 : 1;
- s.audio.volume = root.clamp(s.audio.volume + (dir * step), 0.0, 1.0);
- event.accepted = true;
- }
- }
- }
- '';
-
- networkQml = pkgs.writeText "Network.qml" ''
- import QtQuick
- import Quickshell.Io
- import "."
-
- BarButton {
- id: root
- property string ssid: ""
- property int signal: -1
-
- Process {
- id: proc
- stdout: StdioCollector {
- waitForEnd: true
- onStreamFinished: {
- const text = this.text || "";
- const lines = text.split("\n");
- for (let i = 0; i < lines.length; i++) {
- const parts = lines[i].split(":");
- if (parts.length >= 3 && parts[0] === "yes") {
- root.ssid = parts[1] || "";
- root.signal = parseInt(parts[2]) || -1;
- return;
- }
- }
- root.ssid = "";
- root.signal = -1;
- }
- }
- }
-
- Timer {
- interval: 5000
- repeat: true
- running: true
- triggeredOnStart: true
- onTriggered: {
- proc.exec(["sh", "-lc", "nmcli -t -f active,ssid,signal dev wifi 2>/dev/null || true"]);
- }
- }
-
- function trunc(s, n) { return (s.length > n) ? (s.slice(0, n) + "…") : s; }
- label: (ssid === "") ? "WiFi: --" : ("WiFi: " + trunc(ssid, 13))
- }
- '';
-
- btQml = pkgs.writeText "BluetoothIndicator.qml" ''
- import QtQuick
- import Quickshell.Bluetooth
- import "."
-
- BarButton {
- label: {
- const n = (Bluetooth.devices && Bluetooth.devices.values) ? Bluetooth.devices.values.length : 0;
- return n > 0 ? ("BT: " + n) : "BT: --";
- }
- }
- '';
-
- batteryQml = pkgs.writeText "Battery.qml" ''
- import QtQuick
- import Quickshell.Services.UPower
- import "."
-
- BarButton {
- label: {
- const d = UPower.displayDevice;
- if (!d || !d.ready) return "Bat: --";
- return "Bat: " + Math.round(d.percentage) + "%";
- }
- }
- '';
-
- trayQml = pkgs.writeText "Tray.qml" ''
- import QtQuick
- import QtQuick.Layouts
- import Quickshell.Services.SystemTray
-
- RowLayout {
- id: root
- property var parentWindow
- spacing: 6
-
- Repeater {
- model: SystemTray.items
- delegate: Item {
- implicitWidth: 18
- implicitHeight: 18
-
- Image {
- anchors.fill: parent
- source: modelData.icon
- fillMode: Image.PreserveAspectFit
- smooth: true
- }
-
- MouseArea {
- anchors.fill: parent
- acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton
- onClicked: function(mouse) {
- if (mouse.button === Qt.LeftButton) {
- if (!modelData.onlyMenu) modelData.activate();
- else if (root.parentWindow) modelData.display(root.parentWindow, mouse.x, mouse.y);
- } else if (mouse.button === Qt.RightButton) {
- if (root.parentWindow && modelData.hasMenu) modelData.display(root.parentWindow, mouse.x, mouse.y);
- else modelData.secondaryActivate();
- } else if (mouse.button === Qt.MiddleButton) {
- modelData.secondaryActivate();
- }
- }
- }
- }
- }
- }
- '';
-
- kbQml = pkgs.writeText "KeyboardLayout.qml" ''
- import QtQuick
- import Quickshell.Io
- import "."
-
- BarButton {
- id: root
- property string layout: "--"
-
- Process {
- id: proc
- stdout: StdioCollector {
- waitForEnd: true
- onStreamFinished: {
- try {
- const obj = JSON.parse(this.text || "{}");
- const kbs = obj.keyboards || [];
- let active = null;
-
- for (let i = 0; i < kbs.length; i++) {
- if (kbs[i].main === true) { active = kbs[i]; break; }
- }
- if (!active && kbs.length > 0) active = kbs[0];
-
- const km = active ? (active.active_keymap || active.keymap || "") : "";
- root.layout = km !== "" ? km : "--";
- } catch (e) {
- root.layout = "--";
- }
- }
- }
- }
-
- Timer {
- interval: 3000
- repeat: true
- running: true
- triggeredOnStart: true
- onTriggered: {
- proc.exec(["sh", "-lc", "hyprctl devices -j 2>/dev/null || echo '{}'"]);
- }
- }
-
- label: "KB: " + layout
- }
- '';
-
- clockQml = pkgs.writeText "Clock.qml" ''
- import QtQuick
- import "."
-
- BarButton {
- property var clock
- label: clock ? Qt.formatDateTime(clock.date, "ddd dd HH:mm") : "--"
- }
- '';
-
- notifQml = pkgs.writeText "Notifications.qml" ''
- import QtQuick
- import Quickshell.Io
- import "."
-
- BarButton {
- label: "Notif"
- Process { id: proc }
-
- function run(cmd) {
- proc.running = false
- proc.command = ["sh", "-lc", cmd]
- proc.running = true
- }
-
- onClicked: run(
- "command -v swaync-client >/dev/null && swaync-client -t || " +
- "command -v dunstctl >/dev/null && dunstctl history-pop || true"
- )
- }
- '';
-
- quickshellDefault = pkgs.runCommand "quickshell-default-config" { } ''
- mkdir -p "$out/widgets"
-
- install -m644 ${shellQml} "$out/shell.qml"
-
- install -m644 ${barButtonQml} "$out/widgets/BarButton.qml"
- install -m644 ${separatorQml} "$out/widgets/Separator.qml"
- install -m644 ${dashboardQml} "$out/widgets/DashboardButton.qml"
- install -m644 ${workspacesQml} "$out/widgets/Workspaces.qml"
- install -m644 ${windowTitleQml} "$out/widgets/WindowTitle.qml"
- install -m644 ${mediaQml} "$out/widgets/Media.qml"
- install -m644 ${volumeQml} "$out/widgets/Volume.qml"
- install -m644 ${networkQml} "$out/widgets/Network.qml"
- install -m644 ${btQml} "$out/widgets/BluetoothIndicator.qml"
- install -m644 ${batteryQml} "$out/widgets/Battery.qml"
- install -m644 ${trayQml} "$out/widgets/Tray.qml"
- install -m644 ${kbQml} "$out/widgets/KeyboardLayout.qml"
- install -m644 ${clockQml} "$out/widgets/Clock.qml"
- install -m644 ${notifQml} "$out/widgets/Notifications.qml"
+ qmlPrefix = pkgs.qt6Packages.qtbase.qtQmlPrefix;
+ qmlDir = pkg: "${pkg}/${qmlPrefix}";
+
+ qsWrapped = pkgs.writeShellScriptBin "qss" ''
+ export QML_IMPORT_PATH="${qmlDir pkgs.qt6Packages.qtpositioning}:${
+ qmlDir pkgs.qt6Packages.qtlocation
+ }:${qmlDir pkgs.qt6Packages.qt5compat}:''${QML_IMPORT_PATH:-}"
+ export QML2_IMPORT_PATH="$QML_IMPORT_PATH"
+ exec ${pkgs.quickshell}/bin/qs "$@"
'';
in {
- home.packages = with pkgs; [ quickshell networkmanager ];
+ home.packages = [
+ pkgs.quickshell
+ pkgs.qt6Packages.qt5compat
+ pkgs.qt6Packages.qtpositioning
+ pkgs.qt6Packages.qtlocation
+ qsWrapped
+ ];
- # Важно: default должен быть обычной writable директорией в $HOME.
- home.file.".config/quickshell/default" = {
- source = quickshellDefault;
- recursive = true;
- force = true;
- };
}
diff --git a/home-manager/modules/hypr/scripts/hyprlock-status.sh b/home-manager/modules/hypr/scripts/hyprlock/bat_status.sh
similarity index 100%
rename from home-manager/modules/hypr/scripts/hyprlock-status.sh
rename to home-manager/modules/hypr/scripts/hyprlock/bat_status.sh
diff --git a/home-manager/modules/hypr/scripts/hyprlock/music.sh b/home-manager/modules/hypr/scripts/hyprlock/music.sh
new file mode 100755
index 0000000..329d661
--- /dev/null
+++ b/home-manager/modules/hypr/scripts/hyprlock/music.sh
@@ -0,0 +1,9 @@
+# check if playerctl status is playing ond output song info
+status=$(playerctl status 2>/dev/null)
+if [ "$status" = "Playing" ]; then
+ # song_info=$(playerctl metadata --format '\u266A {{ artist }} - {{ title }}' 2>/dev/null)
+ song_info=$(printf "\u266A %s - %s" "$(playerctl metadata artist 2>/dev/null)" "$(playerctl metadata title 2>/dev/null)")
+ echo "$song_info"
+else
+ echo ""
+fi
\ No newline at end of file
diff --git a/home-manager/modules/hypr/scripts/hyprlock/weather.sh b/home-manager/modules/hypr/scripts/hyprlock/weather.sh
new file mode 100755
index 0000000..a657367
--- /dev/null
+++ b/home-manager/modules/hypr/scripts/hyprlock/weather.sh
@@ -0,0 +1 @@
+echo "Feels like $(curl -s 'wttr.in/Ramenki?format=%t' | tr -d '+') "
diff --git a/home-manager/modules/programs.nix b/home-manager/modules/programs.nix
index 4297953..6089ed4 100644
--- a/home-manager/modules/programs.nix
+++ b/home-manager/modules/programs.nix
@@ -24,6 +24,7 @@
gtypist
zip
unzip
+ vlc
# yubikey-manager-qt
# paprefs
];
@@ -36,20 +37,20 @@
programs.direnv.enableZshIntegration = true;
imports = [ inputs.zen-browser.homeModules.twilight ];
- programs.zen-browser = {
+ programs.zen-browser = {
enable = true;
#profiles."Default Profile" = {
# search = {
# default = "Perplexity"; # Use the ID of your custom engine below
- #engines = {
- #"perplexity" = { # Custom engine ID (lowercase, no spaces)
- #name = "Perplexity";
- #urls = [{
- # template = "https://www.perplexity.ai/search?q=%s";
- #}];
- #definedAliases = [ "@per" ];
- #};
- # };
+ #engines = {
+ #"perplexity" = { # Custom engine ID (lowercase, no spaces)
+ #name = "Perplexity";
+ #urls = [{
+ # template = "https://www.perplexity.ai/search?q=%s";
+ #}];
+ #definedAliases = [ "@per" ];
+ #};
+ # };
#};
};
diff --git a/home-manager/modules/zsh/zsh.nix b/home-manager/modules/zsh/zsh.nix
index 1e191e3..58d456d 100644
--- a/home-manager/modules/zsh/zsh.nix
+++ b/home-manager/modules/zsh/zsh.nix
@@ -21,6 +21,8 @@
bat
ripgrep
entr
+
+ github-copilot-cli
];
home.file.".p10k.zsh".source = ./p10k.zsh;
diff --git a/hosts/loki-nixos/configuration.nix b/hosts/loki-nixos/configuration.nix
index d530228..1f5fdf9 100644
--- a/hosts/loki-nixos/configuration.nix
+++ b/hosts/loki-nixos/configuration.nix
@@ -13,6 +13,7 @@
boot.resumeDevice = "/dev/nvme0n1p2";
# -- tmp --
+ programs.dconf.enable = true;
# No display manager / X11 required
services.xserver.enable = false;
@@ -83,6 +84,4 @@
# ];
- # programs.dconf.enable = true;
-
}
diff --git a/nixos/custom.nix b/nixos/custom.nix
index 110d3fe..950c5a8 100644
--- a/nixos/custom.nix
+++ b/nixos/custom.nix
@@ -1,7 +1,5 @@
{ config, pkgs, lib, ... }:
-# KROSH mention
-
{
imports = [
./modules/amnezia.nix
@@ -15,32 +13,8 @@
./modules/security.nix
./modules/timelang.nix
./modules/wm.nix
- ];
-
- system.stateVersion = "25.11";
- nix.settings.experimental-features = [ "nix-command" "flakes" ];
- nix.gc = {
- automatic = true;
- dates = "weekly";
- options = "--delete-older-than 14d";
- };
-
- services.printing.enable = true;
- environment.sessionVariables.NIXOS_OZONE_WL = "1";
-
- users.users.krosh = {
- isNormalUser = true;
- description = "krosh";
- extraGroups = [ "fprint" "networkmanager" "wheel" "libvirtd" ];
- shell = pkgs.zsh;
- };
-
- services.upower.enable = true;
- hardware.bluetooth.enable = true;
-
- environment.systemPackages = with pkgs; [
- (writeShellScriptBin "power_max" (builtins.readFile ./scripts/max.sh))
- (writeShellScriptBin "power_min" (builtins.readFile ./scripts/min.sh))
+ ./modules/unsorted.nix
+ ./modules/thunar.nix
];
}
diff --git a/nixos/modules/programs.nix b/nixos/modules/programs.nix
index 3e5b342..1dfc5e9 100644
--- a/nixos/modules/programs.nix
+++ b/nixos/modules/programs.nix
@@ -3,7 +3,7 @@
{
nixpkgs.config.allowUnfree = true;
- environment.systemPackages = with pkgs; [ kitty qbittorrent ];
+ environment.systemPackages = with pkgs; [ kitty qbittorrent ncdu ];
programs.ssh.startAgent = true;
services.gnome.gcr-ssh-agent.enable = lib.mkForce false;
diff --git a/nixos/modules/security.nix b/nixos/modules/security.nix
index 3c4a703..3b21678 100644
--- a/nixos/modules/security.nix
+++ b/nixos/modules/security.nix
@@ -15,5 +15,7 @@
services.fprintd.enable = true;
security.pam.services.sudo.fprintAuth = true;
security.pam.services.login.fprintAuth = lib.mkForce true;
+ security.pam.services.sddm.fprintAuth = true; # For login/lock (?)
+
security.polkit.enable = true;
}
diff --git a/nixos/modules/thunar.nix b/nixos/modules/thunar.nix
new file mode 100644
index 0000000..a1cd725
--- /dev/null
+++ b/nixos/modules/thunar.nix
@@ -0,0 +1,36 @@
+{ config, pkgs, ... }: {
+ # Thunar (use the module)
+ programs.thunar.enable = true; # :contentReference[oaicite:1]{index=1}
+
+ # If you are NOT running full XFCE, you need xfconf or Thunar settings won’t persist
+ programs.xfconf.enable = true; # :contentReference[oaicite:2]{index=2}
+
+ # Plugins (add them here, not in systemPackages)
+ programs.thunar.plugins = with pkgs.xfce; [
+ thunar-archive-plugin # right-click extract/compress
+ thunar-volman # removable media handling
+ ]; # :contentReference[oaicite:3]{index=3}
+
+ # Mount/trash and thumbnails
+ services.gvfs.enable = true; # :contentReference[oaicite:4]{index=4}
+ services.tumbler.enable = true; # :contentReference[oaicite:5]{index=5}
+
+ # Removable drives typically rely on udisks2 + polkit
+ services.udisks2.enable = true; # :contentReference[oaicite:6]{index=6}
+ security.polkit.enable = true; # :contentReference[oaicite:7]{index=7}
+
+ # Usually already enabled, but harmless to be explicit on minimal installs
+ services.dbus.enable = true;
+
+ # Set default applications for Thunar (and others) via xdg-mime
+ environment.systemPackages = with pkgs; [
+ gdk-pixbuf # image thumbnailer :contentReference[oaicite:5]{index=5}
+ ffmpegthumbnailer # video thumbnails :contentReference[oaicite:6]{index=6}
+ ffmpeg-headless # decoding support often used alongside ffmpegthumbnailer :contentReference[oaicite:7]{index=7}
+ ];
+
+ # Make .thumbnailer definitions visible under the system profile
+ environment.pathsToLink =
+ [ "share/thumbnailers" ]; # :contentReference[oaicite:8]{index=8}
+
+}
diff --git a/nixos/modules/unsorted.nix b/nixos/modules/unsorted.nix
new file mode 100644
index 0000000..d5ffb8b
--- /dev/null
+++ b/nixos/modules/unsorted.nix
@@ -0,0 +1,37 @@
+{ config, pkgs, lib, ... }:
+
+# KROSH mention
+
+{
+ system.stateVersion = "25.11";
+ nix.settings.experimental-features = [ "nix-command" "flakes" ];
+ nix.gc = {
+ automatic = true;
+ dates = "weekly";
+ options = "--delete-older-than 14d";
+ };
+
+ services.printing.enable = true;
+ environment.sessionVariables.NIXOS_OZONE_WL = "1";
+
+ users.users.krosh = {
+ isNormalUser = true;
+ description = "krosh";
+ extraGroups =
+ [ "fprint" "networkmanager" "wheel" "libvirtd" "plugdev" "lp" ];
+ shell = pkgs.zsh;
+ };
+
+ services.upower.enable = true;
+ hardware.bluetooth.enable = true;
+
+ environment.systemPackages = with pkgs; [
+ (writeShellScriptBin "power_max" (builtins.readFile ../scripts/max.sh))
+ (writeShellScriptBin "power_min" (builtins.readFile ../scripts/min.sh))
+ (writeShellScriptBin "reload" (builtins.readFile ../scripts/reload.sh))
+ # papirus-icon-theme
+ nordzy-icon-theme
+ adwaita-icon-theme
+ # hicolor-icon-theme
+ ];
+}
diff --git a/nixos/scripts/reload.sh b/nixos/scripts/reload.sh
new file mode 100644
index 0000000..a018908
--- /dev/null
+++ b/nixos/scripts/reload.sh
@@ -0,0 +1,13 @@
+# mouse reload
+sudo modprobe psmouse
+
+#hyprland reload
+hyprctl reload
+
+#hyprbar reload
+hyprpanel -q; hyprpanel & disown
+
+#fingerprint reload
+# systemctl --user restart fprintd # user service
+sudo systemctl restart fprintd
+