Compare commits
191 Commits
c640e5514e
...
modern
| Author | SHA1 | Date | |
|---|---|---|---|
| 400b1a89d2 | |||
| f4bb5e4ca8 | |||
| 1a435a8676 | |||
| 53f9e2d925 | |||
| c85ba7f69b | |||
| 263133a86a | |||
| 4c37e35d2c | |||
| 99f57dca0c | |||
| b5f2538c19 | |||
| 91f91212db | |||
| 9071abeacc | |||
| f7ab887ed0 | |||
| fe0d006f2e | |||
| 40b7db2c00 | |||
| 4205ab5429 | |||
| 8c43b183eb | |||
| 8c5200d2fb | |||
| 38ba89c2b7 | |||
| d22beb4580 | |||
| ccbd2362b2 | |||
| 9b85f9edd5 | |||
| 459ad6081b | |||
| 1c1ba8b776 | |||
| f76b350d94 | |||
| 25ad6502fc | |||
| ba8c0bdf3d | |||
| c161673102 | |||
| 6929369c28 | |||
| ee4ab0e8a6 | |||
| f7108a173a | |||
| 0a3f0ada27 | |||
| 74699ff880 | |||
| 1b5cf2cf39 | |||
| a4f0cbb017 | |||
| 6b5dedb3e6 | |||
| 2f11bf580d | |||
| f58cd9a516 | |||
| 7bf2c6fea2 | |||
| ba09321f6b | |||
| 7d938288ab | |||
| 9f16735547 | |||
| 19a4870450 | |||
| f33330b2d6 | |||
| 2de8603b49 | |||
| 13524322a2 | |||
| ecb13d8b19 | |||
| 3558d604eb | |||
| fffe6bc7cc | |||
| 1c71784ac9 | |||
| dca67e19bc | |||
| 4a9aa15b77 | |||
| 86f044235a | |||
| 5b6477cab6 | |||
| c86358010c | |||
| 318718aabd | |||
| d592750de7 | |||
| 688f8e8a1e | |||
| c986952c50 | |||
| d914905d01 | |||
| 784e44901d | |||
| 35707279b4 | |||
| 4fb3325326 | |||
| ae3a43d25d | |||
| acadd94b31 | |||
| 7cadace240 | |||
| f097c9e15f | |||
| 9b5134c32d | |||
| e39f5d46ff | |||
| b21bcf5e7a | |||
| 0bb78842c0 | |||
| d148acd6dd | |||
| 00011ed365 | |||
| 54737695af | |||
| ac3232ac80 | |||
| 5bb996c93f | |||
| 8a7b475562 | |||
| dccc191c24 | |||
| 25477c0f7c | |||
| 6351495541 | |||
| 428488f11d | |||
| f8e843ec94 | |||
| 679f2e8f6b | |||
| 9aae7d6df9 | |||
| c6cd00f955 | |||
| 33cb851539 | |||
| 5ec7f5edc7 | |||
| e7e5226c87 | |||
| b550064a15 | |||
| 9ff47e94b2 | |||
| 3dc170984b | |||
| 97a23a26dd | |||
| da383a3526 | |||
| ad8b59f314 | |||
| cfcf9d6f3a | |||
| 44af726a53 | |||
| 35f810dcf1 | |||
| af331d967a | |||
| d54fa4e999 | |||
| 0197c58ea1 | |||
| 1b4cfbe350 | |||
| c4ed00e6c8 | |||
| b720c1ff02 | |||
| 9ee5f40aa8 | |||
| 2ef1d58ea7 | |||
| 7281eedf56 | |||
| 8394a4cf35 | |||
| f50c57c7b2 | |||
| 795a7babd0 | |||
| 97d50851f6 | |||
| 870c8d2df3 | |||
| 80e38516a6 | |||
| 04627242a8 | |||
| bcad6c2f69 | |||
| 0940fd31d7 | |||
| 9fc1763073 | |||
| 3d51e1db83 | |||
| 992ca558dd | |||
| 72c94dbd63 | |||
| 0a4bfdfab8 | |||
| cfbc56ab6d | |||
| 516fe436e6 | |||
| 373f3f1f3f | |||
| 283f572371 | |||
| 272b5b8545 | |||
| f345fef540 | |||
| dd9281dcf1 | |||
| 14b873d704 | |||
| a793429622 | |||
| d9f848f626 | |||
| 2d77a5d42e | |||
| 8d01f300be | |||
| 975b2c2002 | |||
| f28ed60390 | |||
| 63becaaa09 | |||
| 78f6ede871 | |||
| d34494d3be | |||
| 7930757d88 | |||
| f3517d04fc | |||
| 5edc88fc23 | |||
| 461b1099ad | |||
| 51a35355df | |||
| cc681ffe91 | |||
| 45213f1f7d | |||
| 27f52450c3 | |||
| 4bfc554e35 | |||
| 2558f4a9b0 | |||
| 4e882084b1 | |||
| aa28cf999f | |||
| 4a911de198 | |||
| a4f5cddcb2 | |||
| bd75285889 | |||
| d263ea39f8 | |||
| 002799deee | |||
| 6f884ad114 | |||
| 1f3c44afb7 | |||
| 7bc837aeaf | |||
| cd440d2b00 | |||
| 5e3902c22c | |||
| 7280b68f14 | |||
| 2b9067f87b | |||
| 7fd73ba79e | |||
| 00f6c9840b | |||
| 8da1baea93 | |||
| 75d5fc850e | |||
| 283f6cd29f | |||
| d3d9371e71 | |||
| eec7fe5808 | |||
| 683ceefae3 | |||
| b8f28a6277 | |||
| 73aab2452e | |||
| 109fdb4672 | |||
| 6281f9ea6f | |||
| edfb269308 | |||
| eed84ec64c | |||
| ae7d017d2b | |||
| e17b21ab69 | |||
| 59d29c6cea | |||
| 29792a1307 | |||
| b86df062df | |||
| b02be43aa0 | |||
| 6d19db6577 | |||
| e8f35bf283 | |||
| ec1e9a9b59 | |||
| f1fede7cd5 | |||
| 9d3ba797d7 | |||
| 39b190fcc3 | |||
| b8df78e935 | |||
| 425c429297 | |||
| c656cf81d2 | |||
| 2ed2e28ba2 | |||
| daa3ed6eef |
@@ -5,9 +5,15 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
|
|||||||
## Build Commands
|
## Build Commands
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Rebuild and switch to new configuration
|
# Rebuild and switch to new configuration (desktop x86_64)
|
||||||
sudo nixos-rebuild switch --flake ~/.config/nixos/#hakase
|
sudo nixos-rebuild switch --flake ~/.config/nixos/#hakase
|
||||||
|
|
||||||
|
# Rebuild MacBook configuration (aarch64)
|
||||||
|
sudo nixos-rebuild switch --flake ~/.config/nixos/#macbook
|
||||||
|
|
||||||
|
# Dry-run build to check for errors without applying
|
||||||
|
sudo nixos-rebuild build --flake ~/.config/nixos/#hakase
|
||||||
|
|
||||||
# Manage SOPS secrets
|
# Manage SOPS secrets
|
||||||
nix-shell -p sops --run "sops secrets/secrets.yaml"
|
nix-shell -p sops --run "sops secrets/secrets.yaml"
|
||||||
nix-shell -p sops --run "sops updatekeys secrets/secrets.yaml"
|
nix-shell -p sops --run "sops updatekeys secrets/secrets.yaml"
|
||||||
@@ -15,65 +21,100 @@ nix-shell -p sops --run "sops updatekeys secrets/secrets.yaml"
|
|||||||
|
|
||||||
## Architecture Overview
|
## Architecture Overview
|
||||||
|
|
||||||
This is a modular, flake-based NixOS configuration for a single host (`hakase`).
|
This is a modular, flake-based NixOS configuration supporting two hosts: `hakase` (x86_64 desktop) and `macbook` (aarch64 Apple Silicon).
|
||||||
|
|
||||||
### Key Entry Points
|
### Key Entry Points
|
||||||
|
|
||||||
- `flake.nix` - Declares inputs and creates NixOS configuration
|
- `flake.nix` - Declares inputs and creates both NixOS configurations (hakase, macbook)
|
||||||
- `config.nix` - Central configuration values (username, hostname, paths, theme settings, bookmarks)
|
- `config.nix` - Central configuration values separated by host (hakase, macbook keys)
|
||||||
- `hosts/hakase/configuration.nix` - Host-level entry point that imports system modules
|
- `hosts/{hakase,macbook}/configuration.nix` - Host-level entry points importing system modules
|
||||||
|
- `home/hakase.nix` - Home Manager entry point for user environment (referenced from flake)
|
||||||
|
|
||||||
### Module Organization
|
### Module Organization
|
||||||
|
|
||||||
**Two-tier module system:**
|
**Three-tier system:**
|
||||||
- `modules/nixos/` - NixOS system-level modules (boot, kernel, services, hardware)
|
1. **System modules** (`modules/nixos/`) - NixOS-level settings (boot, kernel, services, hardware)
|
||||||
- `modules/home/` - Home Manager user-level modules (imported via `home/hakase.nix`)
|
2. **Home Manager modules** (`modules/home/`) - User-level environment and applications
|
||||||
|
3. **Application configs** (`apps/`) - Per-application configuration directories with `default.nix` files
|
||||||
|
|
||||||
**Application configs:** Each application has its own directory in `apps/` with a `default.nix` and optional sub-modules (e.g., `apps/hyprland/hypr/*.nix` for Hyprland settings).
|
Examples:
|
||||||
|
- `apps/hyprland/default.nix` + `apps/hyprland/hypr/*.nix` - Hyprland compositor config
|
||||||
|
- `apps/firefox/default.nix` - Browser with bookmarks and theming
|
||||||
|
- `apps/ghostty/default.nix` - Terminal emulator
|
||||||
|
- `apps/neovim/default.nix` - Editor (via nixovim external flake)
|
||||||
|
|
||||||
### Configuration Flow
|
### Configuration Flow
|
||||||
|
|
||||||
```
|
```
|
||||||
flake.nix
|
flake.nix (outputs)
|
||||||
└─ nixosConfigurations.hakase
|
├─ hakase (x86_64-linux)
|
||||||
├─ hosts/hakase/configuration.nix
|
│ ├─ hosts/hakase/configuration.nix
|
||||||
│ └─ modules/nixos/default.nix (imports all system modules)
|
│ │ └─ modules/nixos/default.nix (imports system modules)
|
||||||
└─ home-manager
|
│ └─ home-manager
|
||||||
└─ home/hakase.nix
|
│ └─ home/hakase.nix
|
||||||
└─ modules/home/* → apps/*
|
│ └─ modules/home/* (imports Home Manager modules)
|
||||||
|
│ └─ apps/* (application configurations)
|
||||||
|
│
|
||||||
|
└─ macbook (aarch64-linux)
|
||||||
|
├─ hosts/macbook/configuration.nix
|
||||||
|
│ └─ modules/nixos/default.nix
|
||||||
|
└─ Similar home-manager structure
|
||||||
|
|
||||||
|
config.nix provides myConfig via specialArgs to both configurations
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Configuration Structure (config.nix)
|
||||||
|
|
||||||
|
The `config.nix` file defines host-specific configuration under `hakase` and `macbook` keys. Common values include:
|
||||||
|
|
||||||
|
```nix
|
||||||
|
myConfig = {
|
||||||
|
nixos = { username, hostname, timezone }
|
||||||
|
git = { username, email, defaultBranch }
|
||||||
|
theme = { mode } # "dark" or "light"
|
||||||
|
terminal = { default, font, aliases }
|
||||||
|
font = { monospace, monospaceScript, sans }
|
||||||
|
hyprland = { monitors, wallpaper, kb_options }
|
||||||
|
firefox = { bookmarks, newtabpage }
|
||||||
|
# ... more app-specific configs
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
To add a host-specific override, define it in the host's `myConfig` section in `config.nix`. The flake passes `allConfig.{hostname}` as specialArgs, so modules access the correct host configuration.
|
||||||
|
|
||||||
### Module Pattern
|
### Module Pattern
|
||||||
|
|
||||||
Modules receive these parameters:
|
Modules receive standard NixOS parameters plus custom ones:
|
||||||
```nix
|
```nix
|
||||||
{ pkgs, config, myConfig, inputs, ... }:
|
{ pkgs, config, lib, myConfig, inputs, system, ... }:
|
||||||
```
|
```
|
||||||
|
|
||||||
Access configuration values via `myConfig`:
|
**Key patterns:**
|
||||||
```nix
|
- Access host config: `myConfig.nixos.username`, `myConfig.terminal.default`
|
||||||
myConfig.nixos.username # "hakase"
|
- Use host-specific packages: `pkgs.unstable` (from nixpkgs), `inputs.neovim` (from flake inputs)
|
||||||
myConfig.nixos.hostname # "hakase"
|
- Reference other modules via `config` (e.g., `config.home.homeDirectory`)
|
||||||
myConfig.terminal.default # Terminal emulator
|
- Conditional logic: Check `system` or `myConfig` values
|
||||||
myConfig.hyprland.monitors # Monitor configuration
|
|
||||||
```
|
|
||||||
|
|
||||||
### Secrets Management
|
### Secrets Management
|
||||||
|
|
||||||
Uses SOPS for encrypted secrets. Keys stored at `~/.config/sops/age/keys.txt`.
|
SOPS-encrypted secrets stored in `secrets/secrets.yaml`. Age key at `~/.config/sops/age/keys.txt`.
|
||||||
|
|
||||||
Access secrets in modules:
|
In modules, reference secrets via:
|
||||||
```nix
|
```nix
|
||||||
config.sops.secrets.secret_name.path
|
config.sops.secrets.secret_name.path
|
||||||
```
|
```
|
||||||
|
|
||||||
## Key Technologies
|
## Key Technologies
|
||||||
|
|
||||||
- **Hyprland** with UWSM (systemd session management)
|
- **Hyprland** with UWSM (systemd user session management)
|
||||||
- **Stylix** for system-wide theming from wallpaper colors
|
- **Matugen** for automatic system-wide theming from wallpaper colors
|
||||||
- **Home Manager** for user environment
|
- **Home Manager** for user environment and program configuration
|
||||||
- **nixovim** flake for Neovim configuration
|
- **nixovim** external flake for Neovim configuration (treesitter disabled due to read-only NixOS constraints)
|
||||||
|
- **SOPS-Nix** for secrets encryption
|
||||||
|
- **CachyOS kernel** on hakase (x86_64), **Asahi Linux** on macbook (aarch64)
|
||||||
|
|
||||||
## Git Commit Convention
|
## Git Commit Convention
|
||||||
|
|
||||||
Use conventional commits: `feat(scope):`, `fix(scope):`, `refactor:`, `add:`, `remove:`, `cleanup:`
|
Use conventional commits with scope: `feat(scope):`, `fix(scope):`, `refactor:`, `add:`, `remove:`, `cleanup:`
|
||||||
|
|
||||||
|
Common scopes: `nixos`, `home`, `apps`, `config`, `modules`, `hyprland`, `firefox`, etc.
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
# HakaseOS
|
# HakaseOS
|
||||||
|
|
||||||
A modular, flake-based NixOS configuration for a single host (`hakase`). Heavily inspired by [OmarchyOS](https://omarchy.org/).
|
A modular, flake-based NixOS configuration for my personal devices (`hakase` desktop and `macbook`). Heavily inspired by [OmarchyOS](https://omarchy.org/).
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
- **Hyprland** compositor with UWSM (systemd session management)
|
- **Hyprland** compositor with UWSM (systemd session management)
|
||||||
|
- **Multi-Architecture Support**: Runs on x86_64 (Desktop) and aarch64 (Apple Silicon M1/M2)
|
||||||
- **Matugen** for automatic system-wide theming from wallpaper colors
|
- **Matugen** for automatic system-wide theming from wallpaper colors
|
||||||
- **Multi-monitor support** for intuitive desktop management
|
|
||||||
- **Hardened Firefox** with custom bookmarks and new tab page
|
- **Hardened Firefox** with custom bookmarks and new tab page
|
||||||
- **Vim keybindings** throughout the system
|
- **Vim keybindings** throughout the system
|
||||||
- **SOPS** for encrypted secrets management
|
- **SOPS** for encrypted secrets management
|
||||||
- **CachyOS kernel** via chaotic-nyx for performance optimizations
|
- **CachyOS kernel** (Desktop) and **Asahi Linux** (MacBook) support
|
||||||
|
|
||||||
## 🚧 TODO
|
## 🚧 TODO
|
||||||
- LUKS designed
|
- LUKS designed
|
||||||
@@ -24,19 +24,19 @@ A modular, flake-based NixOS configuration for a single host (`hakase`). Heavily
|
|||||||

|

|
||||||

|

|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Structure
|
## Structure
|
||||||
|
|
||||||
```
|
```
|
||||||
.
|
.
|
||||||
├── flake.nix # Flake inputs and NixOS configuration
|
├── flake.nix # Entry point defining hosts (hakase, macbook)
|
||||||
├── config.nix # Central configuration values
|
├── config.nix # Central configuration values per host
|
||||||
├── hosts/
|
├── hosts/
|
||||||
│ └── hakase/ # Host-specific configuration
|
│ ├── hakase/ # Desktop configuration (x86_64)
|
||||||
|
│ └── macbook/ # Laptop configuration (aarch64, Apple Silicon)
|
||||||
├── modules/
|
├── modules/
|
||||||
│ ├── nixos/ # System-level modules (boot, kernel, services)
|
│ ├── nixos/ # System-level modules (boot, kernel, services)
|
||||||
│ └── home/ # Home Manager modules
|
│ └── home/ # Home Manager modules
|
||||||
|
├── home/ # Host-specific Home Manager entry points
|
||||||
├── apps/ # Per-application configurations
|
├── apps/ # Per-application configurations
|
||||||
│ ├── hyprland/ # Hyprland window manager
|
│ ├── hyprland/ # Hyprland window manager
|
||||||
│ ├── waybar/ # Status bar
|
│ ├── waybar/ # Status bar
|
||||||
@@ -53,14 +53,14 @@ A modular, flake-based NixOS configuration for a single host (`hakase`). Heavily
|
|||||||
|
|
||||||
### Rebuild System
|
### Rebuild System
|
||||||
|
|
||||||
|
**Desktop (Hakase):**
|
||||||
```bash
|
```bash
|
||||||
sudo nixos-rebuild switch --flake ~/.config/nixos/#hakase
|
sudo nixos-rebuild switch --flake ~/.config/nixos/#hakase
|
||||||
```
|
```
|
||||||
|
|
||||||
Or use the configured alias:
|
**MacBook (Asahi):**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
update
|
sudo nixos-rebuild switch --flake ~/.config/nixos/#macbook
|
||||||
```
|
```
|
||||||
|
|
||||||
### Manage Secrets
|
### Manage Secrets
|
||||||
@@ -75,13 +75,11 @@ nix-shell -p sops --run "sops updatekeys secrets/secrets.yaml"
|
|||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
Central configuration values are defined in `config.nix`:
|
Central configuration values are defined in `config.nix`, separated by host:
|
||||||
|
|
||||||
|
- `hakase` / `macbook` keys define host-specific overrides
|
||||||
- `myConfig.nixos` - System settings (username, hostname, timezone)
|
- `myConfig.nixos` - System settings (username, hostname, timezone)
|
||||||
- `myConfig.git` - Git configuration
|
- `myConfig.hyprland` - Monitor configuration (Hz, Resolution) and wallpaper
|
||||||
- `myConfig.terminal` - Default terminal and aliases
|
|
||||||
- `myConfig.hyprland` - Monitor configuration and wallpaper
|
|
||||||
- `myConfig.firefox` - Bookmarks and new tab settings
|
|
||||||
|
|
||||||
## Flake Inputs
|
## Flake Inputs
|
||||||
|
|
||||||
@@ -90,7 +88,8 @@ Central configuration values are defined in `config.nix`:
|
|||||||
| nixpkgs | NixOS unstable |
|
| nixpkgs | NixOS unstable |
|
||||||
| home-manager | User environment management |
|
| home-manager | User environment management |
|
||||||
| hyprland | Wayland compositor |
|
| hyprland | Wayland compositor |
|
||||||
| chaotic | CachyOS kernel and packages |
|
| chaotic | CachyOS kernel and packages (x86 only) |
|
||||||
|
| apple-silicon | Asahi Linux support for NixOS (aarch64 only) |
|
||||||
| sops-nix | Secrets management |
|
| sops-nix | Secrets management |
|
||||||
| nixovim | Neovim configuration |
|
| nixovim | Neovim configuration |
|
||||||
| matugen | System-wide theming |
|
| matugen | System-wide theming |
|
||||||
@@ -99,4 +98,4 @@ Central configuration values are defined in `config.nix`:
|
|||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
Personal configuration - use at your own discretion.
|
Personal configuration - use at your own discretion.
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
{pkgs, ...}: {
|
||||||
|
home.packages = with pkgs; [anki-bin];
|
||||||
|
|
||||||
|
xdg.mimeApps = {
|
||||||
|
enable = true;
|
||||||
|
defaultApplications = {
|
||||||
|
"application/x-apkg" = "anki.desktop";
|
||||||
|
"application/x-anki-deck" = "anki.desktop";
|
||||||
|
"application/x-anki-collection" = "anki.desktop";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
{pkgs, ...}: {
|
||||||
|
programs.bottom = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
flags = {
|
||||||
|
rate = 1000;
|
||||||
|
hide_table_gap = true;
|
||||||
|
hide_time = true;
|
||||||
|
left_legend = true;
|
||||||
|
network_use_bytes = true;
|
||||||
|
temperature_type = "c";
|
||||||
|
mem_as_value = true;
|
||||||
|
current_usage = true;
|
||||||
|
};
|
||||||
|
row = [
|
||||||
|
{
|
||||||
|
ratio = 4;
|
||||||
|
child = [
|
||||||
|
{ type = "cpu"; }
|
||||||
|
];
|
||||||
|
}
|
||||||
|
{
|
||||||
|
ratio = 3;
|
||||||
|
child = [
|
||||||
|
{ type = "mem"; }
|
||||||
|
{ type = "net"; }
|
||||||
|
];
|
||||||
|
}
|
||||||
|
{
|
||||||
|
ratio = 3;
|
||||||
|
child = [
|
||||||
|
{ type = "temp"; }
|
||||||
|
{ type = "disk"; }
|
||||||
|
];
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -1,10 +1,35 @@
|
|||||||
{
|
{
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
myConfig,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
# This enables the btop configuration file generation in your home directory.
|
||||||
|
# The btop package itself is now installed system-wide via modules/nixos/btop.nix
|
||||||
programs.btop = {
|
programs.btop = {
|
||||||
enable = true;
|
enable = true;
|
||||||
settings = {
|
settings = {
|
||||||
vim_keys = true;
|
vim_keys = true;
|
||||||
color_theme = "TTY";
|
color_theme = "TTY";
|
||||||
theme_background = false;
|
theme_background = false;
|
||||||
|
presets = "cpu:1:default,proc:0:default cpu:0:default,mem:0:default,net:0:default cpu:0:block,net:0:tty cpu:0:default,mem:0:default,net:0:default,gpu0:0:default";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
|
||||||
|
# This updates your Hyprland settings to use the btop-power wrapper.
|
||||||
|
wayland.windowManager.hyprland.settings = lib.mkMerge [
|
||||||
|
{
|
||||||
|
bindd = [
|
||||||
|
"CTRL SHIFT, Escape, Open Btop Minimal, exec, uwsm app -- xdg-terminal-exec -e btop-power -p 2"
|
||||||
|
];
|
||||||
|
}
|
||||||
|
(lib.mkIf (myConfig.btop.autostart) {
|
||||||
|
exec-once = [
|
||||||
|
"uwsm app -- xdg-terminal-exec -e btop-power -p 2"
|
||||||
|
];
|
||||||
|
windowrule = [
|
||||||
|
"match:title ^(btop)$, monitor ${myConfig.btop.monitor}"
|
||||||
|
];
|
||||||
|
})
|
||||||
|
];
|
||||||
|
}
|
||||||
@@ -8,6 +8,25 @@
|
|||||||
exec-once = [
|
exec-once = [
|
||||||
"uwsm app -- pywalfox start"
|
"uwsm app -- pywalfox start"
|
||||||
];
|
];
|
||||||
|
|
||||||
|
bindd = [
|
||||||
|
"SUPER, W, Open Browser, exec, uwsm app -- firefox"
|
||||||
|
"SUPER, Y, Toggle YouTube, togglespecialworkspace, youtube"
|
||||||
|
"SUPER SHIFT, Y, Move to YouTube Special Workspace, movetoworkspace, special:youtube"
|
||||||
|
"SUPER, I, Toggle Jellyfin, togglespecialworkspace, jellyfin"
|
||||||
|
"SUPER SHIFT, I, Move to Jellyfin Special Workspace, movetoworkspace, special:jellyfin"
|
||||||
|
];
|
||||||
|
|
||||||
|
workspace = [
|
||||||
|
"special:youtube, on-created-empty:uwsm app -- firefox -P web-app --name youtube https://youtube.com"
|
||||||
|
"special:jellyfin, on-created-empty:uwsm app -- firefox -P web-app --name jellyfin https://watch.sakamoto.dev"
|
||||||
|
];
|
||||||
|
|
||||||
|
windowrule = [
|
||||||
|
"match:class (?i)(firefox|youtube|jellyfin), opacity 1 1"
|
||||||
|
"match:class ^(youtube)$, workspace special:youtube"
|
||||||
|
"match:class ^(jellyfin)$, workspace special:jellyfin"
|
||||||
|
];
|
||||||
};
|
};
|
||||||
imports = [
|
imports = [
|
||||||
inputs.textfox.homeManagerModules.default
|
inputs.textfox.homeManagerModules.default
|
||||||
@@ -24,8 +43,22 @@
|
|||||||
bind J tabnext
|
bind J tabnext
|
||||||
bind K tabprev
|
bind K tabprev
|
||||||
unbind <C-e>
|
unbind <C-e>
|
||||||
|
|
||||||
|
" Force Tridactyl to yield new tab control to Firefox/Extensions
|
||||||
|
set newtab about:newtab
|
||||||
'';
|
'';
|
||||||
|
|
||||||
|
xdg.mimeApps = {
|
||||||
|
enable = true;
|
||||||
|
defaultApplications = {
|
||||||
|
"text/html" = "firefox.desktop";
|
||||||
|
"x-scheme-handler/http" = "firefox.desktop";
|
||||||
|
"x-scheme-handler/https" = "firefox.desktop";
|
||||||
|
"x-scheme-handler/about" = "firefox.desktop";
|
||||||
|
"x-scheme-handler/unknown" = "firefox.desktop";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
programs.firefox = {
|
programs.firefox = {
|
||||||
enable = true;
|
enable = true;
|
||||||
languagePacks = ["en-US"];
|
languagePacks = ["en-US"];
|
||||||
@@ -35,15 +68,34 @@
|
|||||||
];
|
];
|
||||||
|
|
||||||
profiles = {
|
profiles = {
|
||||||
youtube = import ./profiles/youtube.nix {inherit pkgs myConfig;};
|
youtube = import ./profiles/web-app.nix {
|
||||||
|
inherit pkgs myConfig;
|
||||||
|
id = 1;
|
||||||
|
name = "YouTube";
|
||||||
|
url = "https://youtube.com";
|
||||||
|
};
|
||||||
|
jellyfin = import ./profiles/web-app.nix {
|
||||||
|
inherit pkgs myConfig;
|
||||||
|
id = 2;
|
||||||
|
name = "Jellyfin";
|
||||||
|
url = "https://watch.sakamoto.dev";
|
||||||
|
};
|
||||||
|
web-app = import ./profiles/web-app.nix {
|
||||||
|
inherit pkgs myConfig;
|
||||||
|
id = 3;
|
||||||
|
name = "web-app";
|
||||||
|
url = "about:blank";
|
||||||
|
};
|
||||||
hakase = {
|
hakase = {
|
||||||
search.force = true;
|
search.force = true;
|
||||||
isDefault = true;
|
isDefault = true;
|
||||||
search.default = "ddg";
|
search.default = "ddg";
|
||||||
extensions.packages = with pkgs.nur.repos.rycee.firefox-addons; [
|
extensions.packages = with pkgs.nur.repos.rycee.firefox-addons; [
|
||||||
|
pywalfox
|
||||||
ublock-origin
|
ublock-origin
|
||||||
bitwarden
|
bitwarden
|
||||||
tridactyl
|
tridactyl
|
||||||
|
new-tab-override
|
||||||
];
|
];
|
||||||
|
|
||||||
bookmarks = {
|
bookmarks = {
|
||||||
|
|||||||
@@ -0,0 +1,178 @@
|
|||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
myConfig,
|
||||||
|
id,
|
||||||
|
name,
|
||||||
|
url,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
inherit id name;
|
||||||
|
# Note: This profile relies on the global tridactylrc logic in default.nix
|
||||||
|
# to dynamically set 'newtab' via the TRIDACTYL_NEWTAB environment variable.
|
||||||
|
search.force = true;
|
||||||
|
search.default = "ddg";
|
||||||
|
extensions.force = true;
|
||||||
|
extensions.packages = with pkgs.nur.repos.rycee.firefox-addons; [
|
||||||
|
ublock-origin
|
||||||
|
bitwarden
|
||||||
|
tridactyl
|
||||||
|
new-tab-override
|
||||||
|
pywalfox
|
||||||
|
];
|
||||||
|
|
||||||
|
settings = {
|
||||||
|
# --- New Tab Override ---
|
||||||
|
"extensions.newtaboverride@agenedia.com.url" = url;
|
||||||
|
"extensions.newtaboverride@agenedia.com.type" = 1; # URL mode
|
||||||
|
|
||||||
|
# --- Privacy & Hardening ---
|
||||||
|
"browser.contentblocking.category" = "strict";
|
||||||
|
"privacy.trackingprotection.enabled" = true;
|
||||||
|
"privacy.resistFingerprinting" = true; # Note: Spoofs timezone and caps FPS to 60
|
||||||
|
"geo.enabled" = false;
|
||||||
|
"media.peerconnection.enabled" = false; # Prevents WebRTC IP leaks
|
||||||
|
"network.dns.disablePrefetch" = true;
|
||||||
|
"network.prefetch-next" = false;
|
||||||
|
|
||||||
|
# --- NixOS / Hyprland Integration ---
|
||||||
|
"widget.use-xdg-desktop-portal.file-picker" = 1; # Use native file picker
|
||||||
|
|
||||||
|
# --- UI & Behavior ---
|
||||||
|
"browser.toolbars.bookmarks.visibility" = "never";
|
||||||
|
"browser.compactmode.show" = true;
|
||||||
|
"browser.tabs.closeWindowWithLastTab" = false;
|
||||||
|
"extensions.pocket.enabled" = false;
|
||||||
|
"extensions.screenshots.disabled" = true;
|
||||||
|
"browser.topsites.contile.enabled" = false;
|
||||||
|
"browser.formfill.enable" = false;
|
||||||
|
"browser.search.suggest.enabled" = false;
|
||||||
|
"browser.search.suggest.enabled.private" = false;
|
||||||
|
"browser.urlbar.suggest.searches" = false;
|
||||||
|
"browser.urlbar.showSearchSuggestionsFirst" = false;
|
||||||
|
"browser.newtabpage.activity-stream.feeds.section.topstories" = false;
|
||||||
|
"browser.newtabpage.activity-stream.feeds.snippets" = false;
|
||||||
|
"browser.newtabpage.activity-stream.section.highlights.includePocket" = false;
|
||||||
|
"browser.newtabpage.activity-stream.section.highlights.includeBookmarks" = false;
|
||||||
|
"browser.newtabpage.activity-stream.section.highlights.includeDownloads" = false;
|
||||||
|
"browser.newtabpage.activity-stream.section.highlights.includeVisited" = false;
|
||||||
|
"browser.newtabpage.activity-stream.showSponsored" = false;
|
||||||
|
"browser.newtabpage.activity-stream.system.showSponsored" = false;
|
||||||
|
"browser.newtabpage.activity-stream.showSponsoredTopSites" = false;
|
||||||
|
"toolkit.legacyUserProfileCustomizations.stylesheets" = true;
|
||||||
|
"extensions.autoDisableScopes" = 0; # Enable extensions by default
|
||||||
|
|
||||||
|
# --- Homepage & Navigation ---
|
||||||
|
"browser.startup.page" = 1; # Always open the homepage
|
||||||
|
"browser.startup.homepage" = url;
|
||||||
|
"browser.newtab.url" = url; # Try to set newtab to homepage
|
||||||
|
"browser.sessionstore.resume_from_crash" = false; # Always start fresh
|
||||||
|
"browser.sessionstore.max_tabs_undo" = 0; # Disable undo close tab
|
||||||
|
|
||||||
|
# --- DNS over HTTPS (Quad9) ---
|
||||||
|
"network.trr.mode" = 2; # Use DoH with system fallback
|
||||||
|
"network.trr.uri" = "https://dns.quad9.net/dns-query";
|
||||||
|
};
|
||||||
|
#
|
||||||
|
# userChrome = ''
|
||||||
|
# /* --- Autohide Entire Toolbox (Tabs + Address Bar) --- */
|
||||||
|
# /* Adapted from MrOtherGuy's autohide_main_toolbar.css */
|
||||||
|
#
|
||||||
|
# :root{
|
||||||
|
# /* Height of Tabs + Nav Bar approx 80px */
|
||||||
|
# --uc-navbar-transform: -85px;
|
||||||
|
# --uc-autohide-toolbar-delay: 0.1s;
|
||||||
|
# --uc-autohide-toolbar-duration: 200ms;
|
||||||
|
# }
|
||||||
|
# :root[uidensity="compact"]{ --uc-navbar-transform: -70px }
|
||||||
|
#
|
||||||
|
# #navigator-toolbox > div{ display: contents; }
|
||||||
|
#
|
||||||
|
# /* Apply transform to TabsToolbar AND Nav-bar */
|
||||||
|
# :root[sessionrestored] :where(#nav-bar,#PersonalToolbar,#TabsToolbar,#tab-notification-deck,.global-notificationbox,#notifications-toolbar){
|
||||||
|
# transform: translateY(var(--uc-navbar-transform))
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# :root:is([customizing],[chromehidden*="toolbar"]) :where(#nav-bar,#PersonalToolbar,#TabsToolbar,#tab-notification-deck,.global-notificationbox,#notifications-toolbar){
|
||||||
|
# transform: none !important;
|
||||||
|
# opacity: 1 !important;
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# /* Hide styles for Nav-Bar AND TabsToolbar */
|
||||||
|
# :where(#nav-bar,#TabsToolbar):not([customizing]){
|
||||||
|
# opacity: 0;
|
||||||
|
# transition: transform var(--uc-autohide-toolbar-duration) ease var(--uc-autohide-toolbar-delay), opacity var(--uc-autohide-toolbar-duration) ease var(--uc-autohide-toolbar-delay) !important;
|
||||||
|
# position: relative;
|
||||||
|
# z-index: 2;
|
||||||
|
# background-color: #1c1b22 !important; /* Solid background */
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# #navigator-toolbox,
|
||||||
|
# #sidebar-box,
|
||||||
|
# #sidebar-main,
|
||||||
|
# #sidebar-splitter,
|
||||||
|
# #tabbrowser-tabbox{
|
||||||
|
# z-index: auto !important;
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# /* Show when toolbox is focused or hovered */
|
||||||
|
# #navigator-toolbox:focus-within > .browser-toolbar,
|
||||||
|
# .browser-titlebar:hover ~ :is(#nav-bar,#PersonalToolbar,#TabsToolbar),
|
||||||
|
# #nav-bar:hover,
|
||||||
|
# #TabsToolbar:hover,
|
||||||
|
# #nav-bar:hover + #PersonalToolbar{
|
||||||
|
# transform: translateY(0);
|
||||||
|
# opacity: 1;
|
||||||
|
# transition-duration: var(--uc-autohide-toolbar-duration), var(--uc-autohide-toolbar-duration) !important;
|
||||||
|
# transition-delay: 0s !important;
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# /* Ensure popups still work (URL bar) */
|
||||||
|
# :root[sessionrestored] #urlbar[popover]{
|
||||||
|
# opacity: 0;
|
||||||
|
# pointer-events: none;
|
||||||
|
# transition: transform var(--uc-autohide-toolbar-duration) ease var(--uc-autohide-toolbar-delay), opacity var(--uc-autohide-toolbar-duration) ease var(--uc-autohide-toolbar-delay);
|
||||||
|
# transform: translateY(var(--uc-navbar-transform));
|
||||||
|
# }
|
||||||
|
# #mainPopupSet:has(> [panelopen]:not(#ask-chat-shortcuts,#selection-shortcut-action-panel,#chat-shortcuts-options-panel,#tab-preview-panel)) ~ toolbox #urlbar[popover],
|
||||||
|
# .browser-titlebar:is(:hover,:focus-within) ~ #nav-bar #urlbar[popover],
|
||||||
|
# #nav-bar:is(:hover,:focus-within) #urlbar[popover],
|
||||||
|
# #urlbar-container > #urlbar[popover]:is([focused],[open]){
|
||||||
|
# opacity: 1;
|
||||||
|
# pointer-events: auto;
|
||||||
|
# transition-delay: 0ms;
|
||||||
|
# transform: translateY(0);
|
||||||
|
# }
|
||||||
|
# :where(:root[sessionrestored]) #urlbar-container > #urlbar[popover]:is([focused],[open]){
|
||||||
|
# transition-duration: 100ms;
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# /* --- CRITICAL FIX: Trigger Zone --- */
|
||||||
|
# /* Since we hide EVERYTHING, we need a hitbox at the top of the screen */
|
||||||
|
# #navigator-toolbox::after {
|
||||||
|
# content: "";
|
||||||
|
# position: fixed;
|
||||||
|
# top: 0;
|
||||||
|
# left: 0;
|
||||||
|
# width: 100%;
|
||||||
|
# height: 20px; /* Generous hit target */
|
||||||
|
# z-index: 10000;
|
||||||
|
# pointer-events: auto;
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# /* When hitbox is hovered, reveal bars */
|
||||||
|
# #navigator-toolbox:hover :where(#nav-bar,#PersonalToolbar,#TabsToolbar) {
|
||||||
|
# transform: translateY(0) !important;
|
||||||
|
# opacity: 1 !important;
|
||||||
|
# transition-delay: 0s !important;
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# /* Move up the content view to fill the gap */
|
||||||
|
# :root[sessionrestored]:not([chromehidden~="toolbar"]) > body > #browser{
|
||||||
|
# margin-top: var(--uc-navbar-transform);
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# /* Fix Titlebar and Bookmarks */
|
||||||
|
# #titlebar { appearance: none !important; }
|
||||||
|
# #PersonalToolbar { visibility: collapse !important; }
|
||||||
|
# '';
|
||||||
|
}
|
||||||
@@ -1,120 +0,0 @@
|
|||||||
{
|
|
||||||
pkgs,
|
|
||||||
myConfig,
|
|
||||||
...
|
|
||||||
}: {
|
|
||||||
id = 1;
|
|
||||||
name = "YouTube";
|
|
||||||
search.force = true;
|
|
||||||
search.default = "ddg";
|
|
||||||
extensions.force = true;
|
|
||||||
extensions.packages = with pkgs.nur.repos.rycee.firefox-addons; [
|
|
||||||
ublock-origin
|
|
||||||
bitwarden
|
|
||||||
tridactyl
|
|
||||||
];
|
|
||||||
|
|
||||||
settings = {
|
|
||||||
# --- Privacy & Hardening ---
|
|
||||||
"browser.contentblocking.category" = "strict";
|
|
||||||
"privacy.trackingprotection.enabled" = true;
|
|
||||||
"privacy.resistFingerprinting" = true; # Note: Spoofs timezone and caps FPS to 60
|
|
||||||
"geo.enabled" = false;
|
|
||||||
"media.peerconnection.enabled" = false; # Prevents WebRTC IP leaks
|
|
||||||
"network.dns.disablePrefetch" = true;
|
|
||||||
"network.prefetch-next" = false;
|
|
||||||
|
|
||||||
# --- NixOS / Hyprland Integration ---
|
|
||||||
"widget.use-xdg-desktop-portal.file-picker" = 1; # Use native file picker
|
|
||||||
|
|
||||||
# --- UI & Behavior ---
|
|
||||||
"browser.compactmode.show" = true;
|
|
||||||
"browser.tabs.closeWindowWithLastTab" = false;
|
|
||||||
"extensions.pocket.enabled" = false;
|
|
||||||
"extensions.screenshots.disabled" = true;
|
|
||||||
"browser.topsites.contile.enabled" = false;
|
|
||||||
"browser.formfill.enable" = false;
|
|
||||||
"browser.search.suggest.enabled" = false;
|
|
||||||
"browser.search.suggest.enabled.private" = false;
|
|
||||||
"browser.urlbar.suggest.searches" = false;
|
|
||||||
"browser.urlbar.showSearchSuggestionsFirst" = false;
|
|
||||||
"browser.newtabpage.activity-stream.feeds.section.topstories" = false;
|
|
||||||
"browser.newtabpage.activity-stream.feeds.snippets" = false;
|
|
||||||
"browser.newtabpage.activity-stream.section.highlights.includePocket" = false;
|
|
||||||
"browser.newtabpage.activity-stream.section.highlights.includeBookmarks" = false;
|
|
||||||
"browser.newtabpage.activity-stream.section.highlights.includeDownloads" = false;
|
|
||||||
"browser.newtabpage.activity-stream.section.highlights.includeVisited" = false;
|
|
||||||
"browser.newtabpage.activity-stream.showSponsored" = false;
|
|
||||||
"browser.newtabpage.activity-stream.system.showSponsored" = false;
|
|
||||||
"browser.newtabpage.activity-stream.showSponsoredTopSites" = false;
|
|
||||||
"toolkit.legacyUserProfileCustomizations.stylesheets" = true;
|
|
||||||
"extensions.autoDisableScopes" = 0; # Enable extensions by default
|
|
||||||
|
|
||||||
# --- Homepage & Navigation ---
|
|
||||||
"browser.startup.homepage" = "https://youtube.com";
|
|
||||||
"browser.newtabpage.pinned" = myConfig.firefox.newtabpage;
|
|
||||||
|
|
||||||
# --- DNS over HTTPS (Quad9) ---
|
|
||||||
"network.trr.mode" = 2; # Use DoH with system fallback
|
|
||||||
"network.trr.uri" = "https://dns.quad9.net/dns-query";
|
|
||||||
};
|
|
||||||
|
|
||||||
userChrome = ''
|
|
||||||
/* --- Floating Autohide Toolbox (Tabs Only) --- */
|
|
||||||
|
|
||||||
/* Take toolbox out of the document flow so web content is 100% height */
|
|
||||||
#navigator-toolbox {
|
|
||||||
position: fixed !important;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
width: 100%;
|
|
||||||
z-index: 9999 !important;
|
|
||||||
background-color: var(--toolbar-bgcolor, #1c1b22) !important;
|
|
||||||
|
|
||||||
/* Start hidden */
|
|
||||||
transform: translateY(-100%) !important;
|
|
||||||
opacity: 0 !important;
|
|
||||||
transition: transform 0.2s ease, opacity 0.2s ease !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Trigger zone */
|
|
||||||
#navigator-toolbox::after {
|
|
||||||
content: "";
|
|
||||||
position: absolute;
|
|
||||||
top: 100%;
|
|
||||||
left: 0;
|
|
||||||
width: 100%;
|
|
||||||
height: 10px;
|
|
||||||
z-index: 10000 !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Reveal when hovering */
|
|
||||||
#navigator-toolbox:hover {
|
|
||||||
transform: translateY(0) !important;
|
|
||||||
opacity: 1 !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* --- Hide specific bars --- */
|
|
||||||
|
|
||||||
/* Hide Navigation Bar (Address Bar) COMPLETELY */
|
|
||||||
#nav-bar {
|
|
||||||
visibility: collapse !important;
|
|
||||||
height: 0px !important;
|
|
||||||
min-height: 0px !important;
|
|
||||||
padding: 0 !important;
|
|
||||||
margin: 0 !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Hide Bookmarks Toolbar */
|
|
||||||
#PersonalToolbar { visibility: collapse !important; }
|
|
||||||
|
|
||||||
/* Hide Titlebar */
|
|
||||||
#titlebar { appearance: none !important; }
|
|
||||||
|
|
||||||
/* Ensure TabsToolbar looks okay on its own */
|
|
||||||
#TabsToolbar {
|
|
||||||
border: none !important;
|
|
||||||
background: transparent !important;
|
|
||||||
}
|
|
||||||
'';
|
|
||||||
}
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
textfox = {
|
textfox = {
|
||||||
enable = true;
|
enable = true;
|
||||||
profile = "hakase";
|
profiles = ["hakase" "web-app"];
|
||||||
config = {
|
config = {
|
||||||
# background = {
|
# background = {
|
||||||
# color = "#123456";
|
# color = "#123456";
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
config,
|
config,
|
||||||
pkgs,
|
pkgs,
|
||||||
|
myConfig,
|
||||||
...
|
...
|
||||||
}: {
|
}: {
|
||||||
home.packages = [
|
home.packages = [
|
||||||
@@ -54,11 +55,26 @@
|
|||||||
enableFishIntegration = true;
|
enableFishIntegration = true;
|
||||||
|
|
||||||
settings = {
|
settings = {
|
||||||
|
font-family = myConfig.terminal.font;
|
||||||
confirm-close-surface = false;
|
confirm-close-surface = false;
|
||||||
app-notifications = false;
|
app-notifications = false;
|
||||||
window-padding-x = 15;
|
window-padding-x = 15;
|
||||||
window-padding-y = 15;
|
window-padding-y = 15;
|
||||||
window-padding-balance = true;
|
window-padding-balance = true;
|
||||||
|
gtk-titlebar = false;
|
||||||
|
mouse-hide-while-typing = true;
|
||||||
|
copy-on-select = "clipboard";
|
||||||
|
auto-update = "off";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
wayland.windowManager.hyprland.settings.bindd = [
|
||||||
|
"SUPER, P, Toggle Preload, togglespecialworkspace, preload"
|
||||||
|
"SUPER SHIFT, P, Move to Preload Special Workspace, movetoworkspace, special:preload"
|
||||||
|
];
|
||||||
|
|
||||||
|
wayland.windowManager.hyprland.settings.exec-once = [
|
||||||
|
"[workspace special:preload silent] uwsm app -- xdg-terminal-exec"
|
||||||
|
"[workspace 1] uwsm app -- ghostty -e bash -c 'fastfetch; exec $SHELL'" # TODO: must be xdg-terminal-exec, or default user terminal
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,8 +10,8 @@
|
|||||||
general = {
|
general = {
|
||||||
after_sleep_cmd = "hyprctl dispatch dpms on";
|
after_sleep_cmd = "hyprctl dispatch dpms on";
|
||||||
ignore_dbus_inhibit = false;
|
ignore_dbus_inhibit = false;
|
||||||
lock_cmd = "hyprlock";
|
lock_cmd = "hakase-hyprlock";
|
||||||
before_sleep_cmd = "loginctl lock-session"; # lock before suspend
|
before_sleep_cmd = "hakase-hyprlock"; # lock before suspend
|
||||||
};
|
};
|
||||||
|
|
||||||
listener = [
|
listener = [
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
# }
|
# }
|
||||||
{
|
{
|
||||||
timeout = 300; # 5min
|
timeout = 300; # 5min
|
||||||
on-timeout = "loginctl lock-session"; # lock screen when timeout has passed
|
on-timeout = "hakase-hyprlock"; # lock screen when timeout has passed
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
timeout = 330; # 5.5min
|
timeout = 330; # 5.5min
|
||||||
@@ -29,7 +29,7 @@
|
|||||||
on-resume = "hyprctl dispatch dpms on"; # screen on when activity is detected after timeout has passed
|
on-resume = "hyprctl dispatch dpms on"; # screen on when activity is detected after timeout has passed
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
timeout = 1800; # 30min
|
timeout = 660;
|
||||||
on-timeout = "systemctl suspend"; # suspend pc
|
on-timeout = "systemctl suspend"; # suspend pc
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -14,13 +14,15 @@
|
|||||||
./hypr/rules.nix
|
./hypr/rules.nix
|
||||||
|
|
||||||
./scripts/movement.nix
|
./scripts/movement.nix
|
||||||
|
./scripts/window-rules.nix
|
||||||
|
./scripts/workspace-toggle.nix
|
||||||
];
|
];
|
||||||
wayland.windowManager.hyprland.enable = true;
|
wayland.windowManager.hyprland.enable = true;
|
||||||
wayland.windowManager.hyprland.systemd.enable = false; # for UWSM support...
|
wayland.windowManager.hyprland.systemd.enable = false; # for UWSM support...
|
||||||
wayland.windowManager.hyprland.plugins = [
|
wayland.windowManager.hyprland.plugins = [
|
||||||
pkgs.hyprlandPlugins.hyprsplit
|
inputs.hyprsplit.packages.${pkgs.system}.hyprsplit
|
||||||
pkgs.hyprlandPlugins.hypr-dynamic-cursors
|
# inputs.hypr-dynamic-cursors.packages.${pkgs.system}.hypr-dynamic-cursors
|
||||||
pkgs.hyprlandPlugins.hyprspace
|
# inputs.hyprspace.packages.${pkgs.system}.Hyprspace
|
||||||
pkgs.hyprlandPlugins.hyprbars
|
pkgs.hyprlandPlugins.hyprbars
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
{pkgs, ...}: {
|
{pkgs, ...}: {
|
||||||
# TODO: implement a way to show binds, preferably use vicinae.
|
# TODO: implement a way to show binds, preferably use vicinae.
|
||||||
wayland.windowManager.hyprland.settings = {
|
wayland.windowManager.hyprland.settings = {
|
||||||
|
binds = {
|
||||||
|
workspace_back_and_forth = true;
|
||||||
|
};
|
||||||
bindel = [
|
bindel = [
|
||||||
", XF86MonBrightnessUp, exec, ddcutil setvcp 10 + 10"
|
", XF86MonBrightnessUp, exec, ddcutil setvcp 10 + 10"
|
||||||
", XF86MonBrightnessDown, exec, ddcutil setvcp 10 - 10"
|
", XF86MonBrightnessDown, exec, ddcutil setvcp 10 - 10"
|
||||||
@@ -15,7 +18,6 @@
|
|||||||
# essential
|
# essential
|
||||||
"SUPER, Return, Open Terminal, exec, uwsm app -- xdg-terminal-exec"
|
"SUPER, Return, Open Terminal, exec, uwsm app -- xdg-terminal-exec"
|
||||||
"SUPER, Q, Kill active, killactive"
|
"SUPER, Q, Kill active, killactive"
|
||||||
"SUPER, SPACE, Open Vicinae, exec, vicinae toggle"
|
|
||||||
|
|
||||||
# resize
|
# resize
|
||||||
"SUPER CTRL, H, Resize Left, resizeactive, -40 0"
|
"SUPER CTRL, H, Resize Left, resizeactive, -40 0"
|
||||||
@@ -28,6 +30,7 @@
|
|||||||
"SUPER, K, Move focus up, movefocus, u"
|
"SUPER, K, Move focus up, movefocus, u"
|
||||||
"SUPER, H, Move focus left, movefocus, l"
|
"SUPER, H, Move focus left, movefocus, l"
|
||||||
"SUPER, L, Move focus right, movefocus, r"
|
"SUPER, L, Move focus right, movefocus, r"
|
||||||
|
"SUPER, G, Switch Focus (Float/Tile), exec, hakase-focus-switch"
|
||||||
|
|
||||||
# move window
|
# move window
|
||||||
"SUPER SHIFT, h, Move window left, movewindow, l"
|
"SUPER SHIFT, h, Move window left, movewindow, l"
|
||||||
@@ -43,31 +46,9 @@
|
|||||||
"SUPER, O, Toggle Split, layoutmsg, togglesplit"
|
"SUPER, O, Toggle Split, layoutmsg, togglesplit"
|
||||||
|
|
||||||
# apps
|
# apps
|
||||||
"SUPER, W, Open Browser, exec, uwsm app -- firefox" # TODO: must be modular
|
|
||||||
# "SUPER, SPACE, Open App Launcher, exec, nc -U $XDG_RUNTIME_DIR/walker/walker.sock"
|
# "SUPER, SPACE, Open App Launcher, exec, nc -U $XDG_RUNTIME_DIR/walker/walker.sock"
|
||||||
"SUPER, T, Toggle Steam, togglespecialworkspace, steam"
|
|
||||||
"SUPER SHIFT, T, Move to Steam Special Workspace, movetoworkspace, special:steam"
|
|
||||||
|
|
||||||
"SUPER, M, Toggle Music, togglespecialworkspace, music"
|
|
||||||
"SUPER SHIFT, M, Move to Music Special Workspace, movetoworkspace, special:music"
|
|
||||||
|
|
||||||
"SUPER, Y, Toggle YouTube, togglespecialworkspace, youtube"
|
|
||||||
"SUPER SHIFT, Y, Move to YouTube Special Workspace, movetoworkspace, special:youtube"
|
|
||||||
|
|
||||||
"SUPER, P, Toggle Preload, togglespecialworkspace, preload"
|
|
||||||
"SUPER SHIFT, P, Move to Preload Special Workspace, movetoworkspace, special:preload"
|
|
||||||
|
|
||||||
"SUPER SHIFT, T, Move to Steam Special Workspace, movetoworkspace, special:steam"
|
|
||||||
"SUPER CTRL, I, Switch Wallpaper, exec, hakase-wallpaper-switch"
|
|
||||||
|
|
||||||
# Screenshots
|
|
||||||
"SUPER, S, Screenshot Region (with edit), exec, screenshot region"
|
|
||||||
"SUPER SHIFT, S, Screenshot Active Window, exec, screenshot window"
|
|
||||||
"SUPER ALT, S, Quick Screenshot (no edit), exec, screenshot region-save"
|
|
||||||
"SUPER ALT SHIFT, S, Screenshot Current Monitor, exec, screenshot screen"
|
|
||||||
|
|
||||||
# TODO:
|
# TODO:
|
||||||
# add text clipping from pictures
|
|
||||||
# add screen recording
|
# add screen recording
|
||||||
|
|
||||||
# Special workspace
|
# Special workspace
|
||||||
@@ -77,18 +58,24 @@
|
|||||||
# [Workspaces] Toggle between most recent workspaces
|
# [Workspaces] Toggle between most recent workspaces
|
||||||
"SUPER, Tab, Cycle workspaces, workspace, previous"
|
"SUPER, Tab, Cycle workspaces, workspace, previous"
|
||||||
|
|
||||||
|
# [Workspaces] Move to another workspace
|
||||||
|
"CTRL SHIFT, H, Move to previous workspace, split:workspace, -1"
|
||||||
|
"CTRL SHIFT, L, Move to next workspace, split:workspace, +1"
|
||||||
|
"CTRL SHIFT, K, Move to previous workspace, split:workspace, -1"
|
||||||
|
"CTRL SHIFT, J, Move to next workspace, split:workspace, +1"
|
||||||
|
|
||||||
# hyprspace - workspace overview
|
# hyprspace - workspace overview
|
||||||
"SUPER, E, Toggle Workspace Overview, overview:toggle"
|
# "SUPER, E, Toggle Workspace Overview, overview:toggle"
|
||||||
]
|
]
|
||||||
++ (
|
++ (
|
||||||
# Generate binds for Super + [1-5] to switch workspaces on current monitor
|
# Generate binds for Super + [1-5] to switch workspaces with special workspace toggle support
|
||||||
# and Super + Shift + [1-5] to move window to workspace on current monitor
|
# and Super + Shift + [1-5] to move window to workspace on current monitor
|
||||||
builtins.concatLists (builtins.genList (
|
builtins.concatLists (builtins.genList (
|
||||||
i: let
|
i: let
|
||||||
ws = i + 1;
|
ws = i + 1;
|
||||||
key = toString ws;
|
key = toString ws;
|
||||||
in [
|
in [
|
||||||
"SUPER, ${key}, Switch to workspace ${toString ws}, split:workspace, ${toString ws}"
|
"SUPER, ${key}, Switch to workspace ${toString ws}, exec, workspace-toggle ${toString ws}"
|
||||||
"SUPER SHIFT, ${key}, Move window to workspace ${toString ws}, split:movetoworkspace, ${toString ws}"
|
"SUPER SHIFT, ${key}, Move window to workspace ${toString ws}, split:movetoworkspace, ${toString ws}"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -4,8 +4,6 @@
|
|||||||
];
|
];
|
||||||
wayland.windowManager.hyprland.settings = {
|
wayland.windowManager.hyprland.settings = {
|
||||||
env = [
|
env = [
|
||||||
"HYPRCURSOR_THEME,rose-pine-hyprcursor"
|
|
||||||
"HYPRCURSOR_SIZE,24"
|
|
||||||
"GUM_CONFIRM_PROMPT_FOREGROUND,6"
|
"GUM_CONFIRM_PROMPT_FOREGROUND,6"
|
||||||
"GUM_CONFIRM_SELECTED_FOREGROUND,0"
|
"GUM_CONFIRM_SELECTED_FOREGROUND,0"
|
||||||
"GUM_CONFIRM_SELECTED_BACKGROUND,2"
|
"GUM_CONFIRM_SELECTED_BACKGROUND,2"
|
||||||
|
|||||||
@@ -14,16 +14,9 @@
|
|||||||
exec-once = [
|
exec-once = [
|
||||||
# essentials
|
# essentials
|
||||||
"hyprpm reload -n"
|
"hyprpm reload -n"
|
||||||
"vicinae server"
|
|
||||||
"systemctl --user start hyprpolkitagent"
|
"systemctl --user start hyprpolkitagent"
|
||||||
"hyprsunset -t 4500" # TODO: must be optional
|
"systemctl --user start swayosd"
|
||||||
|
# "hyprsunset -t 4500" # TODO: must be optional
|
||||||
# apps
|
|
||||||
"fcitx5 -d --replace" # TODO: find a way to implement this line on fcitx5 app instead
|
|
||||||
|
|
||||||
"[workspace special:preload silent] uwsm app -- xdg-terminal-exec"
|
|
||||||
"[workspace 1] uwsm app -- ghostty -e bash -c 'fastfetch; exec $SHELL'" # TODO: must be xdg-terminal-exec, or default user terminal
|
|
||||||
"[workspace special:steam silent] uwsm app -- steam"
|
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,11 +4,13 @@
|
|||||||
gaps_in = 5;
|
gaps_in = 5;
|
||||||
gaps_out = 15;
|
gaps_out = 15;
|
||||||
layout = "dwindle";
|
layout = "dwindle";
|
||||||
|
allow_tearing = true;
|
||||||
|
resize_on_border = true;
|
||||||
};
|
};
|
||||||
decoration = {
|
decoration = {
|
||||||
rounding = 0;
|
rounding = 0;
|
||||||
active_opacity = 0.99;
|
active_opacity = 1;
|
||||||
inactive_opacity = 0.70;
|
inactive_opacity = 0.99;
|
||||||
shadow = {
|
shadow = {
|
||||||
enabled = true;
|
enabled = true;
|
||||||
range = 2;
|
range = 2;
|
||||||
@@ -19,6 +21,7 @@
|
|||||||
enabled = true;
|
enabled = true;
|
||||||
size = 8;
|
size = 8;
|
||||||
passes = 2;
|
passes = 2;
|
||||||
|
new_optimizations = true;
|
||||||
special = true;
|
special = true;
|
||||||
brightness = 0.60;
|
brightness = 0.60;
|
||||||
contrast = 0.75;
|
contrast = 0.75;
|
||||||
@@ -26,7 +29,6 @@
|
|||||||
};
|
};
|
||||||
monitor = myConfig.hyprland.monitors;
|
monitor = myConfig.hyprland.monitors;
|
||||||
dwindle = {
|
dwindle = {
|
||||||
pseudotile = true;
|
|
||||||
preserve_split = true;
|
preserve_split = true;
|
||||||
smart_split = false;
|
smart_split = false;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,12 +1,14 @@
|
|||||||
{
|
{myConfig, ...}: {
|
||||||
wayland.windowManager.hyprland.settings = {
|
wayland.windowManager.hyprland.settings = {
|
||||||
input = {
|
input = {
|
||||||
repeat_rate = 50;
|
repeat_rate = 50;
|
||||||
repeat_delay = 300;
|
repeat_delay = 300;
|
||||||
|
numlock_by_default = true;
|
||||||
|
kb_options = myConfig.hyprland.kb_options;
|
||||||
};
|
};
|
||||||
cursor = {
|
cursor = {
|
||||||
hide_on_key_press = false;
|
hide_on_key_press = false;
|
||||||
no_warps = true;
|
no_warps = false;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,7 @@
|
|||||||
{pkgs, ...}: {
|
{pkgs, ...}: {
|
||||||
wayland.windowManager.hyprland.settings = {
|
wayland.windowManager.hyprland.settings = {
|
||||||
layerrule = [
|
layerrule = [
|
||||||
# Blur and transparency for vicinae
|
"match:namespace vicinae, blur true, ignore_alpha 0.0, no_anim true"
|
||||||
"blur, vicinae"
|
|
||||||
"ignorealpha 0, vicinae"
|
|
||||||
|
|
||||||
# Disable animation for vicinae
|
|
||||||
"noanim, vicinae"
|
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,17 @@
|
|||||||
{
|
{myConfig, ...}: {
|
||||||
wayland.windowManager.hyprland.settings = {
|
wayland.windowManager.hyprland.settings = {
|
||||||
misc = {
|
misc = {
|
||||||
disable_hyprland_logo = true;
|
disable_hyprland_logo = true;
|
||||||
disable_splash_rendering = true;
|
disable_splash_rendering = true;
|
||||||
focus_on_activate = true;
|
focus_on_activate = true;
|
||||||
anr_missed_pings = 3;
|
anr_missed_pings = 3;
|
||||||
new_window_takes_over_fullscreen = 1;
|
on_focus_under_fullscreen = 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# experimental = {
|
||||||
|
# hdr = true;
|
||||||
|
# };
|
||||||
|
|
||||||
cursor = {
|
cursor = {
|
||||||
no_hardware_cursors = true;
|
no_hardware_cursors = true;
|
||||||
no_break_fs_vrr = true;
|
no_break_fs_vrr = true;
|
||||||
@@ -30,7 +34,8 @@
|
|||||||
shake = {
|
shake = {
|
||||||
enabled = true;
|
enabled = true;
|
||||||
threshold = 4.0;
|
threshold = 4.0;
|
||||||
factor = 1.5;
|
limit = 4.0;
|
||||||
|
timeout = 200;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -43,10 +48,11 @@
|
|||||||
bar_color = "$surface_container_high";
|
bar_color = "$surface_container_high";
|
||||||
bar_text_color = "$on_surface";
|
bar_text_color = "$on_surface";
|
||||||
bar_text_size = 0;
|
bar_text_size = 0;
|
||||||
bar_text_font = "Sans";
|
bar_text_font = myConfig.font.sans;
|
||||||
bar_button_padding = 4;
|
bar_button_padding = 4;
|
||||||
bar_padding = 8;
|
bar_padding = 8;
|
||||||
bar_precedence_over_border = true;
|
bar_precedence_over_border = true;
|
||||||
|
on_double_click = "hyprctl dispatch fullscreen 1";
|
||||||
hyprbars-button = [
|
hyprbars-button = [
|
||||||
"$error, 10, , hyprctl dispatch killactive"
|
"$error, 10, , hyprctl dispatch killactive"
|
||||||
"$tertiary, 10, , hyprctl dispatch fullscreen 1"
|
"$tertiary, 10, , hyprctl dispatch fullscreen 1"
|
||||||
|
|||||||
@@ -1,57 +1,11 @@
|
|||||||
{
|
{
|
||||||
wayland.windowManager.hyprland.settings = {
|
wayland.windowManager.hyprland.settings = {
|
||||||
workspace = [
|
windowrule = [
|
||||||
"special:youtube, on-created-empty:uwsm app -- firefox -P YouTube --name youtube"
|
# Make all inactive windows transparent
|
||||||
"special:music, on-created-empty:hakase-music-launch"
|
"match:class .*, opacity 1 0.8"
|
||||||
|
"match:class firefox, match:title (?i).*bitwarden.*, no_screen_share on"
|
||||||
];
|
];
|
||||||
|
workspace = [
|
||||||
windowrulev2 = [
|
|
||||||
# --- POPUP RULES (Wifi, BT, Audio) ---
|
|
||||||
"float, class:^(org\.hakase\.popup\..*)$"
|
|
||||||
"animation slide right, class:^(org\.hakase\.popup\..*)$"
|
|
||||||
"dimaround, class:^(org\.hakase\.popup\..*)$"
|
|
||||||
# --- WALLPAPER PICKER ---
|
|
||||||
"float, class:^(org\.hakase\.switch-wallpaper)$"
|
|
||||||
"float, initialTitle:^(Wallpaper Selector)$"
|
|
||||||
"center, class:^(org\.hakase\.switch-wallpaper)$"
|
|
||||||
"center, initialTitle:^(Wallpaper Selector)$"
|
|
||||||
"size 60% 60%, class:^(org\.hakase\.switch-wallpaper)$"
|
|
||||||
"size 60% 60%, initialTitle:^(Wallpaper Selector)$"
|
|
||||||
"dimaround, class:^(org\.hakase\.switch-wallpaper)$"
|
|
||||||
"dimaround, initialTitle:^(Wallpaper Selector)$"
|
|
||||||
|
|
||||||
# --- STEAM RULES ---
|
|
||||||
"workspace special:steam silent, class:^(steam)$"
|
|
||||||
"noinitialfocus, class:^(steam)$"
|
|
||||||
"suppressevent activate, class:^(steam)$"
|
|
||||||
|
|
||||||
# --- MUSIC RULES (Jellyfin-TUI) ---
|
|
||||||
"workspace special:music silent, title:^(jellyfin-tui)$"
|
|
||||||
"workspace special:music silent, initialTitle:^(jellyfin-tui)$"
|
|
||||||
|
|
||||||
# --- CAVA RULES ---
|
|
||||||
"workspace special:music silent, title:^(cava)$"
|
|
||||||
"workspace special:music silent, initialTitle:^(cava)$"
|
|
||||||
|
|
||||||
# --- YOUTUBE RULES ---
|
|
||||||
"workspace special:youtube, class:^(youtube)$"
|
|
||||||
|
|
||||||
# --- GAMING RULES ---
|
|
||||||
# Steam Apps, Gamescope, Lutris, Heroic, and Wine/Proton apps
|
|
||||||
"fullscreen, class:^steam_app_\d+$"
|
|
||||||
"monitor 0, class:^steam_app_\d+$"
|
|
||||||
"workspace 1, class:^steam_app_\d+$"
|
|
||||||
|
|
||||||
"fullscreen, class:^(gamescope)$"
|
|
||||||
"fullscreen, class:^(lutris)$"
|
|
||||||
"fullscreen, class:^(heroic)$"
|
|
||||||
"fullscreen, class:^wine-.*$"
|
|
||||||
"fullscreen, title:^Wine .*$"
|
|
||||||
|
|
||||||
# --- IMAGE VIEWER (Loupe) ---
|
|
||||||
"float, class:^(org\.gnome\.Loupe)$"
|
|
||||||
"center, class:^(org\.gnome\.Loupe)$"
|
|
||||||
"size 70% 70%, class:^(org\.gnome\.Loupe)$"
|
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,8 +28,29 @@
|
|||||||
|
|
||||||
exit 0
|
exit 0
|
||||||
'';
|
'';
|
||||||
|
|
||||||
|
# TODO: revise
|
||||||
|
hakase-focus-switch = pkgs.writeShellScriptBin "hakase-focus-switch" ''
|
||||||
|
HYPRCTL="${pkgs.hyprland}/bin/hyprctl"
|
||||||
|
JQ="${pkgs.jq}/bin/jq"
|
||||||
|
|
||||||
|
workspace_id=$($HYPRCTL activeworkspace -j | $JQ '.id')
|
||||||
|
active_window=$($HYPRCTL activewindow -j)
|
||||||
|
is_floating=$(echo "$active_window" | $JQ '.floating')
|
||||||
|
|
||||||
|
if [ "$is_floating" == "true" ]; then
|
||||||
|
target_addr=$($HYPRCTL clients -j | $JQ -r --argjson ws "$workspace_id" '[.[] | select(.workspace.id == $ws and .floating == false)] | .[0].address')
|
||||||
|
else
|
||||||
|
target_addr=$($HYPRCTL clients -j | $JQ -r --argjson ws "$workspace_id" '[.[] | select(.workspace.id == $ws and .floating == true)] | .[0].address')
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$target_addr" != "null" ] && [ -n "$target_addr" ]; then
|
||||||
|
$HYPRCTL dispatch focuswindow address:$target_addr
|
||||||
|
fi
|
||||||
|
'';
|
||||||
in {
|
in {
|
||||||
home.packages = [
|
home.packages = [
|
||||||
hakase-workspace-switch-force
|
hakase-workspace-switch-force
|
||||||
|
hakase-focus-switch
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,71 @@
|
|||||||
|
{pkgs, ...}: let
|
||||||
|
hyprctl = "${pkgs.hyprland}/bin/hyprctl";
|
||||||
|
jq = "${pkgs.jq}/bin/jq";
|
||||||
|
socat = "${pkgs.socat}/bin/socat";
|
||||||
|
|
||||||
|
hypr-window-rules = pkgs.writeShellScriptBin "hypr-window-rules" ''
|
||||||
|
LOG=/tmp/hypr-window-rules.log
|
||||||
|
log() { echo "[$(date +%T)] $*" >> "$LOG"; }
|
||||||
|
|
||||||
|
handle() {
|
||||||
|
local event="$1"
|
||||||
|
case "$event" in
|
||||||
|
windowtitlev2*)
|
||||||
|
local data="''${event#windowtitlev2>>}"
|
||||||
|
local addr="0x''${data%%,*}"
|
||||||
|
local title="''${data#*,}"
|
||||||
|
|
||||||
|
if echo "$title" | grep -qi "bitwarden"; then
|
||||||
|
log "bitwarden title detected: addr=$addr title=$title"
|
||||||
|
local info
|
||||||
|
info=$(${hyprctl} clients -j | ${jq} -r --arg addr "$addr" \
|
||||||
|
'.[] | select(.address == $addr) | "\(.class)|\(.floating)"')
|
||||||
|
local class="''${info%|*}"
|
||||||
|
local floating="''${info#*|}"
|
||||||
|
log " -> class=$class floating=$floating"
|
||||||
|
|
||||||
|
if [[ "$class" == "firefox" && "$floating" == "false" ]]; then
|
||||||
|
${hyprctl} dispatch togglefloating "address:$addr"
|
||||||
|
|
||||||
|
local target_w=600
|
||||||
|
local target_h=800
|
||||||
|
|
||||||
|
local mon_id
|
||||||
|
mon_id=$(${hyprctl} clients -j | ${jq} -r --arg addr "$addr" \
|
||||||
|
'.[] | select(.address == $addr) | .monitor')
|
||||||
|
|
||||||
|
local center
|
||||||
|
center=$(${hyprctl} monitors -j | ${jq} -r \
|
||||||
|
--argjson id "$mon_id" --argjson tw "$target_w" --argjson th "$target_h" \
|
||||||
|
'.[] | select(.id == $id) |
|
||||||
|
"\(.x + ((.width / .scale) - $tw) / 2 | floor)|\(.y + ((.height / .scale) - $th) / 2 | floor)"')
|
||||||
|
|
||||||
|
local cx="''${center%%|*}"
|
||||||
|
local cy="''${center#*|}"
|
||||||
|
|
||||||
|
${hyprctl} dispatch resizewindowpixel "exact $target_w $target_h, address:$addr"
|
||||||
|
${hyprctl} dispatch movewindowpixel "exact $cx $cy, address:$addr"
|
||||||
|
log " -> floated, resized to $target_w x $target_h, moved to $cx,$cy"
|
||||||
|
else
|
||||||
|
log " -> skipped (class or floating mismatch)"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
log "started (HYPRLAND_INSTANCE_SIGNATURE=$HYPRLAND_INSTANCE_SIGNATURE)"
|
||||||
|
${socat} -u \
|
||||||
|
"UNIX-CONNECT:$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock" \
|
||||||
|
- \
|
||||||
|
| while IFS= read -r line; do handle "$line"; done
|
||||||
|
log "socat exited"
|
||||||
|
'';
|
||||||
|
in {
|
||||||
|
home.packages = [hypr-window-rules];
|
||||||
|
|
||||||
|
wayland.windowManager.hyprland.settings.exec-once = [
|
||||||
|
# FIXME: removed `hypr-window-rule` for excessive CPU usage. Reason unknown.
|
||||||
|
# "hypr-window-rules"
|
||||||
|
];
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
{pkgs, ...}: let
|
||||||
|
workspace-toggle = pkgs.writeShellScriptBin "workspace-toggle" ''
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
target_workspace="$1"
|
||||||
|
|
||||||
|
# activeworkspace always returns the underlying workspace, even when a special
|
||||||
|
# workspace is open. Check the monitor's specialWorkspace field instead.
|
||||||
|
special=$(${pkgs.hyprland}/bin/hyprctl monitors -j | ${pkgs.jq}/bin/jq -r '.[] | select(.focused) | .specialWorkspace.name')
|
||||||
|
|
||||||
|
if [[ -n "$special" ]]; then
|
||||||
|
${pkgs.hyprland}/bin/hyprctl dispatch togglespecialworkspace "''${special#special:}"
|
||||||
|
current=$(${pkgs.hyprland}/bin/hyprctl activeworkspace -j | ${pkgs.jq}/bin/jq -r '.id')
|
||||||
|
if [[ $current -ne $target_workspace ]]; then
|
||||||
|
${pkgs.hyprland}/bin/hyprctl dispatch focusworkspaceoncurrentmonitor "$target_workspace"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
current=$(${pkgs.hyprland}/bin/hyprctl activeworkspace -j | ${pkgs.jq}/bin/jq -r '.id')
|
||||||
|
if [[ $current -eq $target_workspace ]]; then
|
||||||
|
${pkgs.hyprland}/bin/hyprctl dispatch workspace previous
|
||||||
|
else
|
||||||
|
${pkgs.hyprland}/bin/hyprctl dispatch split:workspace "$target_workspace"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
'';
|
||||||
|
in {
|
||||||
|
home.packages = [workspace-toggle];
|
||||||
|
}
|
||||||
@@ -1,20 +1,45 @@
|
|||||||
{
|
{
|
||||||
config,
|
config,
|
||||||
pkgs,
|
pkgs,
|
||||||
|
myConfig,
|
||||||
...
|
...
|
||||||
}: let
|
}: let
|
||||||
cacheWallpaper = "${config.home.homeDirectory}/.cache/current_wallpaper";
|
cacheWallpaper = "${config.home.homeDirectory}/.cache/current_wallpaper";
|
||||||
clockFont = "JetBrains Mono";
|
clockFont = myConfig.font.monospace;
|
||||||
|
scriptFont = myConfig.font.monospaceScript;
|
||||||
|
greetingConf = "${config.home.homeDirectory}/.cache/hyprlock-greeting.conf";
|
||||||
|
|
||||||
|
hakase-hyprlock = pkgs.writeShellScriptBin "hakase-hyprlock" ''
|
||||||
|
# Get focused monitor
|
||||||
|
monitor=$(hyprctl monitors -j | ${pkgs.jq}/bin/jq -r '.[] | select(.focused) | .name')
|
||||||
|
|
||||||
|
# Generate greeting label config
|
||||||
|
cat > ${greetingConf} << EOF
|
||||||
|
label {
|
||||||
|
monitor = $monitor
|
||||||
|
text = cmd[update:200] hakase-hyprlock-typewriter "\$(hakase-hyprlock-text-generator)"
|
||||||
|
color = \$on_surface_variant
|
||||||
|
font_size = 120
|
||||||
|
font_family = ${clockFont} Bold
|
||||||
|
position = 0, 480
|
||||||
|
halign = center
|
||||||
|
valign = center
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
exec hyprlock "$@"
|
||||||
|
'';
|
||||||
in {
|
in {
|
||||||
imports = [
|
imports = [
|
||||||
./scripts/typewriter.nix
|
./scripts/typewriter.nix
|
||||||
./scripts/random-text.nix
|
./scripts/random-text.nix
|
||||||
];
|
];
|
||||||
|
home.packages = [hakase-hyprlock];
|
||||||
programs.hyprlock = {
|
programs.hyprlock = {
|
||||||
# FIXME: `greeting` has as inconsistency in pos for different monitors
|
|
||||||
enable = true;
|
enable = true;
|
||||||
extraConfig = ''
|
extraConfig = ''
|
||||||
source = ~/.config/hypr/hyprlock-colors.conf
|
source = ~/.config/hypr/hyprlock-colors.conf
|
||||||
|
source = ${greetingConf}
|
||||||
|
|
||||||
general {
|
general {
|
||||||
hide_cursor = true
|
hide_cursor = true
|
||||||
@@ -31,18 +56,6 @@ in {
|
|||||||
vibrancy = 0.2
|
vibrancy = 0.2
|
||||||
}
|
}
|
||||||
|
|
||||||
# Greeting (above clock)
|
|
||||||
label {
|
|
||||||
monitor = DP-1
|
|
||||||
text = cmd[update:1000] hakase-hyprlock-text-generator
|
|
||||||
color = $on_surface_variant
|
|
||||||
font_size = 120
|
|
||||||
font_family = ${clockFont} Bold
|
|
||||||
position = 0, 480
|
|
||||||
halign = center
|
|
||||||
valign = center
|
|
||||||
}
|
|
||||||
|
|
||||||
# Hours (top)
|
# Hours (top)
|
||||||
label {
|
label {
|
||||||
monitor =
|
monitor =
|
||||||
@@ -70,10 +83,10 @@ in {
|
|||||||
# Date
|
# Date
|
||||||
label {
|
label {
|
||||||
monitor =
|
monitor =
|
||||||
text = cmd[update:60000] date '+%A, %B %d'
|
text = cmd[update:60000] echo "<span font_features='ss02'>$(date '+%A, %B %d')</span>"
|
||||||
color = $on_surface_variant
|
color = $on_surface_variant
|
||||||
font_size = 18
|
font_size = 18
|
||||||
font_family = ${clockFont}
|
font_family = ${clockFont} Italic
|
||||||
position = 0, -320
|
position = 0, -320
|
||||||
halign = center
|
halign = center
|
||||||
valign = center
|
valign = center
|
||||||
|
|||||||
@@ -1,16 +1,243 @@
|
|||||||
{pkgs, ...}: let
|
{pkgs, ...}: let
|
||||||
hakase-hyprlock-text-generator = pkgs.writeShellScriptBin "hakase-hyprlock-text-generator" ''
|
hakase-hyprlock-text-generator = pkgs.writeShellScriptBin "hakase-hyprlock-text-generator" ''
|
||||||
hour=$(date +%H)
|
cache_file="''${XDG_RUNTIME_DIR:-/tmp}/hyprlock_greeting"
|
||||||
name="$USER"
|
pid_file="''${XDG_RUNTIME_DIR:-/tmp}/hyprlock_greeting_pid"
|
||||||
|
|
||||||
if [[ $hour -lt 12 ]]; then
|
current_pid=$(pgrep -x hyprlock | head -1)
|
||||||
greeting="おはよう"
|
|
||||||
elif [[ $hour -lt 18 ]]; then
|
# Pick new greeting only when hyprlock restarts
|
||||||
greeting="こんにちは"
|
if [[ -f $pid_file && -f $cache_file ]]; then
|
||||||
else
|
old_pid=$(cat "$pid_file")
|
||||||
greeting="こんばんは"
|
if [[ "$old_pid" == "$current_pid" ]]; then
|
||||||
|
cat "$cache_file"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
greetings=(
|
||||||
|
"Hello"
|
||||||
|
"Hola"
|
||||||
|
"Bonjour"
|
||||||
|
"Hallo"
|
||||||
|
"Ciao"
|
||||||
|
"Olá"
|
||||||
|
"Привет"
|
||||||
|
"こんにちは"
|
||||||
|
"你好"
|
||||||
|
"안녕하세요"
|
||||||
|
"مرحبا"
|
||||||
|
"שלום"
|
||||||
|
"नमस्ते"
|
||||||
|
"สวัสดี"
|
||||||
|
"Γειά σου"
|
||||||
|
"Merhaba"
|
||||||
|
"Xin chào"
|
||||||
|
"Cześć"
|
||||||
|
"Hej"
|
||||||
|
"Ahoj"
|
||||||
|
"Szia"
|
||||||
|
"Salut"
|
||||||
|
"Привіт"
|
||||||
|
"হ্যালো"
|
||||||
|
"வணக்கம்"
|
||||||
|
"Jambo"
|
||||||
|
"Aloha"
|
||||||
|
"Sawubona"
|
||||||
|
"Hei"
|
||||||
|
"Hallå"
|
||||||
|
"Kamusta"
|
||||||
|
"Salam"
|
||||||
|
"Selamat"
|
||||||
|
"Saluton"
|
||||||
|
"Tere"
|
||||||
|
"Sveiki"
|
||||||
|
"Labas"
|
||||||
|
"Здраво"
|
||||||
|
"Здравей"
|
||||||
|
"Bok"
|
||||||
|
"Përshëndetje"
|
||||||
|
"Բարև"
|
||||||
|
"გამარჯობა"
|
||||||
|
"Сайн уу"
|
||||||
|
"ສະບາຍດີ"
|
||||||
|
"ជំរាបសួរ"
|
||||||
|
"မင်္ဂလာပါ"
|
||||||
|
"ආයුබෝවන්"
|
||||||
|
"Dia dhuit"
|
||||||
|
"Halò"
|
||||||
|
"Shwmae"
|
||||||
|
"Hoi"
|
||||||
|
"Halló"
|
||||||
|
"Kaixo"
|
||||||
|
"Bon dia"
|
||||||
|
"Ola"
|
||||||
|
"Ħello"
|
||||||
|
"ਸਤਿ ਸ਼੍ਰੀ ਅਕਾਲ"
|
||||||
|
"કેમ છો"
|
||||||
|
"नमस्कार"
|
||||||
|
"ನಮಸ್ಕಾರ"
|
||||||
|
"നമസ്കാരം"
|
||||||
|
"నమస్కారం"
|
||||||
|
"ሰላም"
|
||||||
|
"Bawo"
|
||||||
|
"Ndeewo"
|
||||||
|
"Sannu"
|
||||||
|
"Iska warran"
|
||||||
|
"Kia ora"
|
||||||
|
"Bula"
|
||||||
|
"Talofa"
|
||||||
|
"Mālō e lelei"
|
||||||
|
"ᐊᐃᖓᐃ"
|
||||||
|
"ᎣᏏᏲ"
|
||||||
|
"Yá'át'ééh"
|
||||||
|
"Allinllachu"
|
||||||
|
"Mba'éichapa"
|
||||||
|
"Salve"
|
||||||
|
"Moien"
|
||||||
|
"Apa khabar"
|
||||||
|
"Сәлем"
|
||||||
|
"Assalomu alaykum"
|
||||||
|
"Slav"
|
||||||
|
"བཀྲ་ཤིས་བདེ་ལེགས།"
|
||||||
|
)
|
||||||
|
|
||||||
|
inspirations=(
|
||||||
|
"Dream Big"
|
||||||
|
"Stay True"
|
||||||
|
"Be Kind"
|
||||||
|
"Work Hard"
|
||||||
|
"Keep Going"
|
||||||
|
"Be Brave"
|
||||||
|
"Love Life"
|
||||||
|
"Stay Calm"
|
||||||
|
"Think Positive"
|
||||||
|
"Be Happy"
|
||||||
|
"No Fear"
|
||||||
|
"Have Faith"
|
||||||
|
"Trust Yourself"
|
||||||
|
"Focus Now"
|
||||||
|
"Take Action"
|
||||||
|
"Never Settle"
|
||||||
|
"Rise Up"
|
||||||
|
"Shine On"
|
||||||
|
"Stand Tall"
|
||||||
|
"Live Free"
|
||||||
|
"Just Begin"
|
||||||
|
"Create Joy"
|
||||||
|
"Stay Strong"
|
||||||
|
"Breathe Deep"
|
||||||
|
"Be Bold"
|
||||||
|
"Look Ahead"
|
||||||
|
"Move Forward"
|
||||||
|
"Aim High"
|
||||||
|
"Stay Humble"
|
||||||
|
"Find Peace"
|
||||||
|
"Do Good"
|
||||||
|
"Seek Truth"
|
||||||
|
"Love More"
|
||||||
|
"Be Yourself"
|
||||||
|
"Let Go"
|
||||||
|
"Keep Smiling"
|
||||||
|
"Stay Wild"
|
||||||
|
"Think Big"
|
||||||
|
"Be Awesome"
|
||||||
|
"Start Now"
|
||||||
|
"Enjoy Today"
|
||||||
|
"Choose Joy"
|
||||||
|
"Dream On"
|
||||||
|
"Fly High"
|
||||||
|
"Stay Focused"
|
||||||
|
"Be Fearless"
|
||||||
|
"Don't Stop"
|
||||||
|
"Make Waves"
|
||||||
|
"Be Original"
|
||||||
|
"Stay Curious"
|
||||||
|
"Be grateful"
|
||||||
|
"Keep pushing"
|
||||||
|
"Stay sharp"
|
||||||
|
"Why not?"
|
||||||
|
"Be still"
|
||||||
|
"Keep cool"
|
||||||
|
"Think twice"
|
||||||
|
"Be ready"
|
||||||
|
"Stay gold"
|
||||||
|
"Game on"
|
||||||
|
"Level up"
|
||||||
|
"Code on"
|
||||||
|
"Git commit"
|
||||||
|
"Hack on"
|
||||||
|
)
|
||||||
|
|
||||||
|
cyberpunk=(
|
||||||
|
"System: ONLINE"
|
||||||
|
"Encryption: ACTIVE"
|
||||||
|
"Access: GRANTED"
|
||||||
|
"Uptime: OPTIMAL"
|
||||||
|
"Link: ESTABLISHED"
|
||||||
|
"Protocol: SECURE"
|
||||||
|
"Daemon: WATCHING"
|
||||||
|
"Netrunner: READY"
|
||||||
|
"Signal: STRONG"
|
||||||
|
"Proxy: ENGAGED"
|
||||||
|
"Root: ACCESS"
|
||||||
|
"Kernel: PANIC"
|
||||||
|
)
|
||||||
|
|
||||||
|
yojijukugo=(
|
||||||
|
"一期一会"
|
||||||
|
"花鳥風月"
|
||||||
|
"温故知新"
|
||||||
|
"七転八起"
|
||||||
|
"自業自得"
|
||||||
|
"以心伝心"
|
||||||
|
"羊頭狗肉"
|
||||||
|
"諸行無常"
|
||||||
|
)
|
||||||
|
|
||||||
|
habits=(
|
||||||
|
"Check posture"
|
||||||
|
"Drink water"
|
||||||
|
"Shoulders down"
|
||||||
|
"Eyes off screen"
|
||||||
|
"Deep breath"
|
||||||
|
"Stretch now"
|
||||||
|
"Unclench jaw"
|
||||||
|
"Touch grass"
|
||||||
|
"Blink now"
|
||||||
|
"Stand up"
|
||||||
|
)
|
||||||
|
|
||||||
|
dev=(
|
||||||
|
"It works locally"
|
||||||
|
"Sudo please"
|
||||||
|
"Flake locked"
|
||||||
|
"Compiling..."
|
||||||
|
"Git push force"
|
||||||
|
"rm -rf /"
|
||||||
|
":q! to exit"
|
||||||
|
"Works on my machine"
|
||||||
|
"Coffee needed"
|
||||||
|
"Fixing bugs"
|
||||||
|
"Hello World"
|
||||||
|
"Null Pointer"
|
||||||
|
"Segfault"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Combine all arrays
|
||||||
|
combined=(
|
||||||
|
"''${greetings[@]}"
|
||||||
|
"''${inspirations[@]}"
|
||||||
|
# "''${cyberpunk[@]}"
|
||||||
|
"''${yojijukugo[@]}"
|
||||||
|
"''${habits[@]}"
|
||||||
|
"''${dev[@]}"
|
||||||
|
)
|
||||||
|
|
||||||
|
idx=$((RANDOM % ''${#combined[@]}))
|
||||||
|
greeting="''${combined[$idx]}"
|
||||||
|
|
||||||
|
echo "$current_pid" > "$pid_file"
|
||||||
|
echo "$greeting" > "$cache_file"
|
||||||
echo "$greeting"
|
echo "$greeting"
|
||||||
'';
|
'';
|
||||||
in {
|
in {
|
||||||
|
|||||||
@@ -37,7 +37,7 @@
|
|||||||
echo "''${text:0:$letter}_"
|
echo "''${text:0:$letter}_"
|
||||||
else
|
else
|
||||||
# Toggle every 4 calls (at 200ms update = ~800ms blink)
|
# Toggle every 4 calls (at 200ms update = ~800ms blink)
|
||||||
if (((blink / 20) % 2 == 0)); then
|
if (((blink / 4) % 2 == 0)); then
|
||||||
echo "''${text}_"
|
echo "''${text}_"
|
||||||
else
|
else
|
||||||
echo "''${text}<span alpha=\"1%\">_</span>"
|
echo "''${text}<span alpha=\"1%\">_</span>"
|
||||||
|
|||||||
@@ -22,13 +22,24 @@
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
tmp_file=$(mktemp)
|
tmp_file=$(mktemp)
|
||||||
target_dir="$HOME/Pictures/Wallpapers"
|
LAST_WALLPAPER_FILE="$HOME/.cache/last_wallpaper_path"
|
||||||
if [ ! -d "$target_dir" ]; then
|
|
||||||
target_dir="$HOME"
|
if [ -f "$LAST_WALLPAPER_FILE" ]; then
|
||||||
|
last_path=$(cat "$LAST_WALLPAPER_FILE")
|
||||||
|
if [ -f "$last_path" ]; then
|
||||||
|
yazi_target="$last_path"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$yazi_target" ]; then
|
||||||
|
yazi_target="$HOME/Pictures/Wallpapers"
|
||||||
|
if [ ! -d "$yazi_target" ]; then
|
||||||
|
yazi_target="$HOME"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Ensure we are in a terminal that supports yazi
|
# Ensure we are in a terminal that supports yazi
|
||||||
${pkgs.yazi}/bin/yazi "$target_dir" --chooser-file="$tmp_file"
|
${pkgs.yazi}/bin/yazi "$yazi_target" --chooser-file="$tmp_file"
|
||||||
|
|
||||||
if [ ! -f "$tmp_file" ]; then
|
if [ ! -f "$tmp_file" ]; then
|
||||||
echo "No selection file created."
|
echo "No selection file created."
|
||||||
@@ -46,24 +57,42 @@
|
|||||||
# Persistence logic
|
# Persistence logic
|
||||||
CACHE_FILE="$HOME/.cache/current_wallpaper"
|
CACHE_FILE="$HOME/.cache/current_wallpaper"
|
||||||
cp "$WALLPAPER" "$CACHE_FILE"
|
cp "$WALLPAPER" "$CACHE_FILE"
|
||||||
|
echo "$WALLPAPER" > "$HOME/.cache/last_wallpaper_path"
|
||||||
|
|
||||||
# Reload hyprpaper
|
# Reload hyprpaper
|
||||||
${pkgs.hyprland}/bin/hyprctl hyprpaper unload all
|
${pkgs.hyprland}/bin/hyprctl hyprpaper unload all
|
||||||
${pkgs.hyprland}/bin/hyprctl hyprpaper preload "$CACHE_FILE"
|
${pkgs.hyprland}/bin/hyprctl hyprpaper preload "$CACHE_FILE"
|
||||||
${pkgs.hyprland}/bin/hyprctl hyprpaper wallpaper ",$CACHE_FILE"
|
${pkgs.hyprland}/bin/hyprctl hyprpaper wallpaper ",$CACHE_FILE"
|
||||||
|
|
||||||
exec matugen image "$CACHE_FILE"
|
exec matugen image "$CACHE_FILE" --source-color-index 0
|
||||||
'';
|
'';
|
||||||
in {
|
in {
|
||||||
wayland.windowManager.hyprland.settings = {
|
wayland.windowManager.hyprland.settings = {
|
||||||
exec-once = [
|
exec-once = [
|
||||||
"uwsm app -- hyprpaper"
|
"uwsm app -- hyprpaper"
|
||||||
];
|
];
|
||||||
|
|
||||||
|
bindd = [
|
||||||
|
"SUPER CTRL, I, Switch Wallpaper, exec, hakase-wallpaper-switch"
|
||||||
|
];
|
||||||
|
|
||||||
|
windowrule = [
|
||||||
|
# --- WALLPAPER PICKER ---
|
||||||
|
"match:class ^(org\.hakase\.switch-wallpaper)$, float on"
|
||||||
|
"match:initial_title ^(Wallpaper Selector)$, float on"
|
||||||
|
"match:class ^(org\.hakase\.switch-wallpaper)$, center on"
|
||||||
|
"match:initial_title ^(Wallpaper Selector)$, center on"
|
||||||
|
"match:class ^(org\.hakase\.switch-wallpaper)$, size 60% 60%"
|
||||||
|
"match:initial_title ^(Wallpaper Selector)$, size 60% 60%"
|
||||||
|
"match:class ^(org\.hakase\.switch-wallpaper)$, dim_around on"
|
||||||
|
"match:initial_title ^(Wallpaper Selector)$, dim_around on"
|
||||||
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
services.hyprpaper = {
|
services.hyprpaper = {
|
||||||
enable = true;
|
enable = true;
|
||||||
settings = {
|
settings = {
|
||||||
|
splash = false;
|
||||||
preload = [cacheWallpaper];
|
preload = [cacheWallpaper];
|
||||||
wallpaper = [
|
wallpaper = [
|
||||||
",${cacheWallpaper}"
|
",${cacheWallpaper}"
|
||||||
|
|||||||
@@ -0,0 +1,81 @@
|
|||||||
|
{pkgs, ...}: let
|
||||||
|
# Max window size (leave room for waybar/hyprbars)
|
||||||
|
maxW = 2800;
|
||||||
|
maxH = 1100;
|
||||||
|
|
||||||
|
swayimg-wrapper = pkgs.writeShellScriptBin "swayimg-wrapper" ''
|
||||||
|
if [ -z "$1" ]; then
|
||||||
|
exec ${pkgs.swayimg}/bin/swayimg
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Get image dimensions
|
||||||
|
dims=$(${pkgs.file}/bin/file -b "$1" | ${pkgs.gnugrep}/bin/grep -oP '\d+ ?x ?\d+' | head -1 | tr -d ' ')
|
||||||
|
if [ -z "$dims" ]; then
|
||||||
|
# Fallback if file doesn't report dimensions
|
||||||
|
exec ${pkgs.swayimg}/bin/swayimg "$@"
|
||||||
|
fi
|
||||||
|
|
||||||
|
imgW=$(echo "$dims" | cut -dx -f1)
|
||||||
|
imgH=$(echo "$dims" | cut -dx -f2)
|
||||||
|
|
||||||
|
# Calculate scale to fit within max bounds while preserving aspect ratio
|
||||||
|
scaleW=$(echo "scale=4; ${toString maxW} / $imgW" | ${pkgs.bc}/bin/bc)
|
||||||
|
scaleH=$(echo "scale=4; ${toString maxH} / $imgH" | ${pkgs.bc}/bin/bc)
|
||||||
|
|
||||||
|
# Use the smaller scale factor
|
||||||
|
if [ $(echo "$scaleW < $scaleH" | ${pkgs.bc}/bin/bc) -eq 1 ]; then
|
||||||
|
scale=$scaleW
|
||||||
|
else
|
||||||
|
scale=$scaleH
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Only scale down, not up
|
||||||
|
if [ $(echo "$scale >= 1" | ${pkgs.bc}/bin/bc) -eq 1 ]; then
|
||||||
|
exec ${pkgs.swayimg}/bin/swayimg "$@"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Calculate new size
|
||||||
|
newW=$(echo "$imgW * $scale / 1" | ${pkgs.bc}/bin/bc)
|
||||||
|
newH=$(echo "$imgH * $scale / 1" | ${pkgs.bc}/bin/bc)
|
||||||
|
|
||||||
|
exec ${pkgs.swayimg}/bin/swayimg --size="$newW,$newH" "$@"
|
||||||
|
'';
|
||||||
|
in {
|
||||||
|
home.packages = [pkgs.swayimg swayimg-wrapper];
|
||||||
|
|
||||||
|
xdg.mimeApps = {
|
||||||
|
enable = true;
|
||||||
|
defaultApplications = {
|
||||||
|
"image/png" = "swayimg-wrapper.desktop";
|
||||||
|
"image/jpeg" = "swayimg-wrapper.desktop";
|
||||||
|
"image/gif" = "swayimg-wrapper.desktop";
|
||||||
|
"image/webp" = "swayimg-wrapper.desktop";
|
||||||
|
"image/bmp" = "swayimg-wrapper.desktop";
|
||||||
|
"image/svg+xml" = "swayimg-wrapper.desktop";
|
||||||
|
"image/tiff" = "swayimg-wrapper.desktop";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
xdg.desktopEntries.swayimg-wrapper = {
|
||||||
|
name = "Swayimg";
|
||||||
|
exec = "swayimg-wrapper %f";
|
||||||
|
terminal = false;
|
||||||
|
type = "Application";
|
||||||
|
mimeType = ["image/png" "image/jpeg" "image/gif" "image/webp" "image/bmp" "image/svg+xml" "image/tiff"];
|
||||||
|
};
|
||||||
|
|
||||||
|
# swayimg config
|
||||||
|
xdg.configFile."swayimg/config".text = ''
|
||||||
|
[viewer]
|
||||||
|
scale = fit
|
||||||
|
|
||||||
|
[info]
|
||||||
|
show = no
|
||||||
|
'';
|
||||||
|
|
||||||
|
wayland.windowManager.hyprland.settings.windowrule = [
|
||||||
|
# --- IMAGE VIEWER (swayimg) ---
|
||||||
|
"match:class ^(swayimg)$, float on"
|
||||||
|
"match:class ^(swayimg)$, center on"
|
||||||
|
];
|
||||||
|
}
|
||||||
@@ -0,0 +1,75 @@
|
|||||||
|
{pkgs, ...}: {
|
||||||
|
services.jellyfin-mpv-shim = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.jellyfin-mpv-shim;
|
||||||
|
|
||||||
|
mpvConfig = {
|
||||||
|
osc = false;
|
||||||
|
osd-bar = false;
|
||||||
|
load-scripts = true;
|
||||||
|
input-vo-keyboard = true;
|
||||||
|
input-default-bindings = true;
|
||||||
|
|
||||||
|
# Automatic subtitle selection logic:
|
||||||
|
# Prefer English subtitles
|
||||||
|
slang = "eng,en";
|
||||||
|
# Prefer Japanese/Non-English audio first (if that's what you usually watch)
|
||||||
|
# or just ensure English subs are picked when audio isn't English.
|
||||||
|
sub-auto = "fuzzy";
|
||||||
|
sub-visibility = "yes";
|
||||||
|
};
|
||||||
|
|
||||||
|
mpvBindings = {
|
||||||
|
"j" = "cycle sub";
|
||||||
|
"S-j" = "cycle sub rev";
|
||||||
|
"v" = "cycle sub-visibility";
|
||||||
|
};
|
||||||
|
|
||||||
|
settings = {
|
||||||
|
use_mpv_config = false;
|
||||||
|
enable_osc = false;
|
||||||
|
menu_mouse = true;
|
||||||
|
|
||||||
|
# Shim specific auto-sub logic
|
||||||
|
# "subs-fallback" is a known good setting for the shim to handle this
|
||||||
|
subtitle_color = "#FFFFFFFF";
|
||||||
|
subtitle_size = 100;
|
||||||
|
|
||||||
|
audio_output = "hdmi";
|
||||||
|
auto_play = true;
|
||||||
|
fullscreen = true;
|
||||||
|
player_name = "hakase";
|
||||||
|
remote_kbps = 100000;
|
||||||
|
local_kbps = 1000000;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# Modern OSC + Quality scripts
|
||||||
|
home.file.".config/jellyfin-mpv-shim/scripts/uosc" = {
|
||||||
|
source = "${pkgs.mpvScripts.uosc}/share/mpv/scripts/uosc";
|
||||||
|
};
|
||||||
|
home.file.".config/jellyfin-mpv-shim/scripts/thumbfast.lua" = {
|
||||||
|
source = "${pkgs.mpvScripts.thumbfast}/share/mpv/scripts/thumbfast.lua";
|
||||||
|
};
|
||||||
|
home.file.".config/jellyfin-mpv-shim/scripts/autocrop.lua" = {
|
||||||
|
source = "${pkgs.mpvScripts.autocrop}/share/mpv/scripts/autocrop.lua";
|
||||||
|
};
|
||||||
|
|
||||||
|
home.file.".config/jellyfin-mpv-shim/fonts" = {
|
||||||
|
source = "${pkgs.mpvScripts.uosc}/share/fonts";
|
||||||
|
recursive = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
wayland.windowManager.hyprland.settings = {
|
||||||
|
exec-once = [ "systemctl --user start jellyfin-mpv-shim" ];
|
||||||
|
windowrule = [
|
||||||
|
# --- JELLYFIN MPV SHIM ---
|
||||||
|
"match:class ^(jellyfin-mpv-shim)$, float on"
|
||||||
|
"match:class ^(jellyfin-mpv-shim)$, center on"
|
||||||
|
"match:class ^(jellyfin-mpv-shim)$, size 70% 70%"
|
||||||
|
"match:class ^(jellyfin-mpv-shim)$, opacity 1.0 override 1.0 override"
|
||||||
|
"match:class ^(jellyfin-mpv-shim)$, idle_inhibit focus"
|
||||||
|
"match:class ^(jellyfin-mpv-shim)$, no_blur on"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
{pkgs, ...}: {
|
{pkgs, ...}: {
|
||||||
home.packages = with pkgs; [
|
home.packages = with pkgs; [
|
||||||
|
# FIXME: only dark mode works. use matugen
|
||||||
jellyfin-tui
|
jellyfin-tui
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{pkgs, ...}: {
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
libreoffice-fresh
|
||||||
|
];
|
||||||
|
}
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
{pkgs, ...}: {
|
|
||||||
home.packages = with pkgs; [loupe];
|
|
||||||
|
|
||||||
xdg.mimeApps = {
|
|
||||||
enable = true;
|
|
||||||
defaultApplications = {
|
|
||||||
"image/png" = "org.gnome.Loupe.desktop";
|
|
||||||
"image/jpeg" = "org.gnome.Loupe.desktop";
|
|
||||||
"image/gif" = "org.gnome.Loupe.desktop";
|
|
||||||
"image/webp" = "org.gnome.Loupe.desktop";
|
|
||||||
"image/bmp" = "org.gnome.Loupe.desktop";
|
|
||||||
"image/svg+xml" = "org.gnome.Loupe.desktop";
|
|
||||||
"image/tiff" = "org.gnome.Loupe.desktop";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -24,6 +24,10 @@ output_path = "~/.config/starship.toml"
|
|||||||
input_path = "~/.config/matugen/templates/walker"
|
input_path = "~/.config/matugen/templates/walker"
|
||||||
output_path = "~/.config/walker/themes/nixos/style.css"
|
output_path = "~/.config/walker/themes/nixos/style.css"
|
||||||
|
|
||||||
|
[templates.zathura]
|
||||||
|
input_path = "~/.config/matugen/templates/zathura"
|
||||||
|
output_path = "~/.config/zathura/zathura-matugen"
|
||||||
|
|
||||||
[templates.pywalfox]
|
[templates.pywalfox]
|
||||||
input_path = '~/.config/matugen/templates/firefox'
|
input_path = '~/.config/matugen/templates/firefox'
|
||||||
output_path = '~/.cache/wal/colors.json'
|
output_path = '~/.cache/wal/colors.json'
|
||||||
@@ -55,3 +59,8 @@ post_hook = "makoctl reload"
|
|||||||
input_path = "~/.config/matugen/templates/vicinae"
|
input_path = "~/.config/matugen/templates/vicinae"
|
||||||
output_path = "~/.local/share/vicinae/themes/matugen.toml"
|
output_path = "~/.local/share/vicinae/themes/matugen.toml"
|
||||||
post_hook = "vicinae theme set matugen"
|
post_hook = "vicinae theme set matugen"
|
||||||
|
|
||||||
|
[templates.theme-switch]
|
||||||
|
input_path = "~/.config/matugen/templates/theme-switch"
|
||||||
|
output_path = "~/.config/matugen/scripts/theme-switch.sh"
|
||||||
|
post_hook = "sh ~/.config/matugen/scripts/theme-switch.sh"
|
||||||
|
|||||||
@@ -1,20 +1,350 @@
|
|||||||
{
|
{
|
||||||
pkgs,
|
pkgs,
|
||||||
inputs,
|
inputs,
|
||||||
|
myConfig,
|
||||||
...
|
...
|
||||||
}: {
|
}: {
|
||||||
home.packages = with pkgs; [
|
home.packages = with pkgs; [
|
||||||
matugen
|
inputs.matugen.packages.${pkgs.system}.default
|
||||||
|
dconf
|
||||||
psmisc # for killall
|
psmisc # for killall
|
||||||
];
|
];
|
||||||
home.file.".config/matugen/config.toml" = {
|
home.file.".config/matugen/config.toml" = {
|
||||||
source = ./config.toml;
|
source = ./config.toml;
|
||||||
};
|
};
|
||||||
|
|
||||||
home.file.".config/matugen/templates" = {
|
# Copy static templates
|
||||||
source = ./templates;
|
home.file.".config/matugen/templates/theme-switch".text = ''
|
||||||
recursive = true;
|
#!/bin/sh
|
||||||
};
|
# Generated by Matugen
|
||||||
|
|
||||||
|
# mode will be replaced by 'dark' or 'light'
|
||||||
|
MODE="{{mode}}"
|
||||||
|
|
||||||
|
if [ "$MODE" = "dark" ]; then
|
||||||
|
${pkgs.dconf}/bin/dconf write /org/gnome/desktop/interface/color-scheme "'prefer-dark'"
|
||||||
|
else
|
||||||
|
${pkgs.dconf}/bin/dconf write /org/gnome/desktop/interface/color-scheme "'prefer-light'"
|
||||||
|
fi
|
||||||
|
'';
|
||||||
|
home.file.".config/matugen/templates/cava".source = ./templates/cava;
|
||||||
|
home.file.".config/matugen/templates/firefox".source = ./templates/firefox;
|
||||||
|
home.file.".config/matugen/templates/ghostty".source = ./templates/ghostty;
|
||||||
|
home.file.".config/matugen/templates/gtk3".source = ./templates/gtk3;
|
||||||
|
home.file.".config/matugen/templates/gtk4".source = ./templates/gtk4;
|
||||||
|
home.file.".config/matugen/templates/hyprland".source = ./templates/hyprland;
|
||||||
|
home.file.".config/matugen/templates/hyprlock".source = ./templates/hyprlock;
|
||||||
|
home.file.".config/matugen/templates/starship".source = ./templates/starship;
|
||||||
|
home.file.".config/matugen/templates/waybar".source = ./templates/waybar;
|
||||||
|
home.file.".config/matugen/templates/zathura".source = ./templates/zathura;
|
||||||
|
|
||||||
|
home.file.".config/matugen/templates/vicinae".text = ''
|
||||||
|
# Vicinae Matugen Theme Template
|
||||||
|
|
||||||
|
[meta]
|
||||||
|
name = "Matugen"
|
||||||
|
description = "Material You theme generated by Matugen - {{mode}} variant"
|
||||||
|
variant = "{{mode}}"
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# Typography
|
||||||
|
# ============================================================================
|
||||||
|
|
||||||
|
[typography]
|
||||||
|
font_family = "${myConfig.font.monospace}"
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# Core Colors
|
||||||
|
# ============================================================================
|
||||||
|
|
||||||
|
[colors.core]
|
||||||
|
accent = "{{colors.primary.default.hex}}"
|
||||||
|
accent_foreground = "{{colors.on_primary.default.hex}}"
|
||||||
|
background = "{{colors.surface.default.hex}}"
|
||||||
|
foreground = "{{colors.on_surface.default.hex}}"
|
||||||
|
secondary_background = "{{colors.surface_container.default.hex}}"
|
||||||
|
border = "{{colors.outline_variant.default.hex}}"
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# Window Borders
|
||||||
|
# ============================================================================
|
||||||
|
|
||||||
|
[colors.main_window]
|
||||||
|
border = "{{colors.outline_variant.default.hex}}"
|
||||||
|
|
||||||
|
[colors.settings_window]
|
||||||
|
border = "{{colors.outline.default.hex}}"
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# Accent Palette
|
||||||
|
# ============================================================================
|
||||||
|
|
||||||
|
[colors.accents]
|
||||||
|
blue = "{{colors.primary.default.hex}}"
|
||||||
|
green = "{{colors.tertiary.default.hex}}"
|
||||||
|
magenta = "{{colors.secondary.default.hex}}"
|
||||||
|
orange = { name = "{{colors.error.default.hex}}", lighter = 40 }
|
||||||
|
red = "{{colors.error.default.hex}}"
|
||||||
|
yellow = { name = "{{colors.tertiary.default.hex}}", lighter = 80 }
|
||||||
|
cyan = { name = "{{colors.primary.default.hex}}", lighter = 50 }
|
||||||
|
purple = "{{colors.secondary.default.hex}}"
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# Text System
|
||||||
|
# ============================================================================
|
||||||
|
|
||||||
|
[colors.text]
|
||||||
|
default = "{{colors.on_surface.default.hex}}"
|
||||||
|
muted = "{{colors.on_surface_variant.default.hex}}"
|
||||||
|
danger = "{{colors.error.default.hex}}"
|
||||||
|
success = "{{colors.tertiary.default.hex}}"
|
||||||
|
placeholder = { name = "{{colors.on_surface_variant.default.hex}}", opacity = 0.6 }
|
||||||
|
|
||||||
|
[colors.text.selection]
|
||||||
|
background = "{{colors.primary.default.hex}}"
|
||||||
|
foreground = "{{colors.on_primary.default.hex}}"
|
||||||
|
|
||||||
|
[colors.text.links]
|
||||||
|
default = "{{colors.primary.default.hex}}"
|
||||||
|
visited = { name = "{{colors.tertiary.default.hex}}", darker = 20 }
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# Input Fields
|
||||||
|
# ============================================================================
|
||||||
|
|
||||||
|
[colors.input]
|
||||||
|
border = "{{colors.outline.default.hex}}"
|
||||||
|
border_focus = "{{colors.primary.default.hex}}"
|
||||||
|
border_error = "{{colors.error.default.hex}}"
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# Buttons
|
||||||
|
# ============================================================================
|
||||||
|
|
||||||
|
[colors.button.primary]
|
||||||
|
background = "{{colors.surface_container_high.default.hex}}"
|
||||||
|
foreground = "{{colors.on_surface.default.hex}}"
|
||||||
|
|
||||||
|
[colors.button.primary.hover]
|
||||||
|
background = "{{colors.surface_container_highest.default.hex}}"
|
||||||
|
|
||||||
|
[colors.button.primary.focus]
|
||||||
|
outline = "{{colors.primary.default.hex}}"
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# Lists
|
||||||
|
# ============================================================================
|
||||||
|
|
||||||
|
[colors.list.item.hover]
|
||||||
|
background = { name = "{{colors.primary_container.default.hex}}", opacity = 0.25 }
|
||||||
|
foreground = "{{colors.on_surface.default.hex}}"
|
||||||
|
|
||||||
|
[colors.list.item.selection]
|
||||||
|
background = { name = "{{colors.primary_container.default.hex}}", opacity = 0.50 }
|
||||||
|
foreground = "{{colors.on_primary_container.default.hex}}"
|
||||||
|
secondary_background = "{{colors.primary_container.default.hex}}"
|
||||||
|
secondary_foreground = "{{colors.on_primary_container.default.hex}}"
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# Grid Items
|
||||||
|
# ============================================================================
|
||||||
|
|
||||||
|
[colors.grid.item]
|
||||||
|
background = "{{colors.surface_container.default.hex}}"
|
||||||
|
|
||||||
|
[colors.grid.item.hover]
|
||||||
|
outline = { name = "{{colors.secondary.default.hex}}", opacity = 0.8 }
|
||||||
|
|
||||||
|
[colors.grid.item.selection]
|
||||||
|
outline = { name = "{{colors.primary.default.hex}}" }
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# Scrollbars
|
||||||
|
# ============================================================================
|
||||||
|
|
||||||
|
[colors.scrollbars]
|
||||||
|
background = { name = "{{colors.primary.default.hex}}", opacity = 0.2 }
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# Loading States
|
||||||
|
# ============================================================================
|
||||||
|
|
||||||
|
[colors.loading]
|
||||||
|
bar = "{{colors.primary.default.hex}}"
|
||||||
|
spinner = "{{colors.primary.default.hex}}"
|
||||||
|
'';
|
||||||
|
|
||||||
|
# Generate templates with font interpolation
|
||||||
|
home.file.".config/matugen/templates/walker".text = ''
|
||||||
|
/* @import "../../../../../../../.config/omarchy/current/theme/walker.css"; */
|
||||||
|
|
||||||
|
/* Define Matugen Colors */
|
||||||
|
@define-color text {{colors.on_surface.default.hex}};
|
||||||
|
@define-color base {{colors.surface_container.default.hex}};
|
||||||
|
@define-color border {{colors.primary.default.hex}};
|
||||||
|
@define-color selected_text {{colors.primary.default.hex}};
|
||||||
|
@define-color background {{colors.surface.default.hex}};
|
||||||
|
|
||||||
|
* {
|
||||||
|
all: unset;
|
||||||
|
}
|
||||||
|
|
||||||
|
* {
|
||||||
|
font-family: ${myConfig.font.monospace};
|
||||||
|
font-size: 18px;
|
||||||
|
color: @text;
|
||||||
|
}
|
||||||
|
|
||||||
|
scrollbar {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.normal-icons {
|
||||||
|
-gtk-icon-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.large-icons {
|
||||||
|
-gtk-icon-size: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.box-wrapper {
|
||||||
|
background: alpha(@base, 0.95);
|
||||||
|
padding: 20px;
|
||||||
|
border: 2px solid @border;
|
||||||
|
}
|
||||||
|
|
||||||
|
.preview-box {
|
||||||
|
}
|
||||||
|
|
||||||
|
.box {
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-container {
|
||||||
|
background: @base;
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input placeholder {
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input {
|
||||||
|
}
|
||||||
|
|
||||||
|
.input:focus,
|
||||||
|
.input:active {
|
||||||
|
box-shadow: none;
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content-container {
|
||||||
|
}
|
||||||
|
|
||||||
|
.placeholder {
|
||||||
|
}
|
||||||
|
|
||||||
|
.scroll {
|
||||||
|
}
|
||||||
|
|
||||||
|
.list {
|
||||||
|
}
|
||||||
|
|
||||||
|
child,
|
||||||
|
child > * {
|
||||||
|
}
|
||||||
|
|
||||||
|
child:hover .item-box {
|
||||||
|
}
|
||||||
|
|
||||||
|
child:selected .item-box {
|
||||||
|
}
|
||||||
|
|
||||||
|
child:selected .item-box * {
|
||||||
|
color: @selected_text;
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-box {
|
||||||
|
padding-left: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-text-box {
|
||||||
|
all: unset;
|
||||||
|
padding: 14px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-text {
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-subtext {
|
||||||
|
font-size: 0px;
|
||||||
|
min-height: 0px;
|
||||||
|
margin: 0px;
|
||||||
|
padding: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-image {
|
||||||
|
margin-right: 14px;
|
||||||
|
-gtk-icon-transform: scale(0.9);
|
||||||
|
}
|
||||||
|
|
||||||
|
.current {
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
.keybind-hints {
|
||||||
|
background: @background;
|
||||||
|
padding: 10px;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.preview {
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
|
||||||
|
home.file.".config/matugen/templates/mako".text = ''
|
||||||
|
# Mako notification daemon configuration
|
||||||
|
# Generated by matugen
|
||||||
|
|
||||||
|
# Appearance
|
||||||
|
font=${myConfig.font.sans} 11
|
||||||
|
width=350
|
||||||
|
height=150
|
||||||
|
margin=10
|
||||||
|
padding=15
|
||||||
|
border-size=2
|
||||||
|
border-radius=8
|
||||||
|
|
||||||
|
# Behavior
|
||||||
|
default-timeout=5000
|
||||||
|
ignore-timeout=false
|
||||||
|
layer=overlay
|
||||||
|
anchor=top-right
|
||||||
|
|
||||||
|
# Interaction
|
||||||
|
markup=true
|
||||||
|
actions=true
|
||||||
|
|
||||||
|
# Grouping
|
||||||
|
group-by=app-name
|
||||||
|
max-visible=5
|
||||||
|
sort=-time
|
||||||
|
|
||||||
|
# Theme colors from matugen
|
||||||
|
background-color=#{{colors.surface_container_high.default.hex_stripped}}
|
||||||
|
text-color=#{{colors.on_surface.default.hex_stripped}}
|
||||||
|
border-color=#{{colors.primary.default.hex_stripped}}
|
||||||
|
progress-color=over #{{colors.primary_container.default.hex_stripped}}
|
||||||
|
|
||||||
|
[urgency=low]
|
||||||
|
border-color=#{{colors.tertiary.default.hex_stripped}}
|
||||||
|
|
||||||
|
[urgency=normal]
|
||||||
|
border-color=#{{colors.primary.default.hex_stripped}}
|
||||||
|
|
||||||
|
[urgency=high]
|
||||||
|
border-color=#{{colors.error.default.hex_stripped}}
|
||||||
|
default-timeout=0
|
||||||
|
'';
|
||||||
|
|
||||||
# Qt theming - follow GTK theme
|
# Qt theming - follow GTK theme
|
||||||
qt = {
|
qt = {
|
||||||
@@ -22,11 +352,20 @@
|
|||||||
platformTheme.name = "gtk";
|
platformTheme.name = "gtk";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
dconf.settings = {
|
||||||
|
"org/gnome/desktop/interface" = {
|
||||||
|
color-scheme =
|
||||||
|
if myConfig.theme.mode == "dark"
|
||||||
|
then "prefer-dark"
|
||||||
|
else "prefer-light";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
# GTK theming with adw-gtk3 and Matugen colors
|
# GTK theming with adw-gtk3 and Matugen colors
|
||||||
gtk = {
|
gtk = {
|
||||||
enable = true;
|
enable = true;
|
||||||
theme = {
|
theme = {
|
||||||
name = "adw-gtk3-dark";
|
name = "adw-gtk3";
|
||||||
package = pkgs.adw-gtk3;
|
package = pkgs.adw-gtk3;
|
||||||
};
|
};
|
||||||
iconTheme = {
|
iconTheme = {
|
||||||
@@ -34,7 +373,19 @@
|
|||||||
package = pkgs.papirus-icon-theme;
|
package = pkgs.papirus-icon-theme;
|
||||||
};
|
};
|
||||||
gtk3.extraCss = ''@import url("colors.css");'';
|
gtk3.extraCss = ''@import url("colors.css");'';
|
||||||
|
gtk3.extraConfig = {
|
||||||
|
gtk-application-prefer-dark-theme =
|
||||||
|
if myConfig.theme.mode == "dark"
|
||||||
|
then 1
|
||||||
|
else 0;
|
||||||
|
};
|
||||||
gtk4.extraCss = ''@import url("colors.css");'';
|
gtk4.extraCss = ''@import url("colors.css");'';
|
||||||
|
gtk4.extraConfig = {
|
||||||
|
gtk-application-prefer-dark-theme =
|
||||||
|
if myConfig.theme.mode == "dark"
|
||||||
|
then 1
|
||||||
|
else 0;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
programs.ghostty.settings.theme = "matugen";
|
programs.ghostty.settings.theme = "matugen";
|
||||||
|
|||||||
@@ -76,3 +76,19 @@
|
|||||||
@define-color dark_3 {{colors.surface_container.default.hex}};
|
@define-color dark_3 {{colors.surface_container.default.hex}};
|
||||||
@define-color dark_4 {{colors.surface_container_high.default.hex}};
|
@define-color dark_4 {{colors.surface_container_high.default.hex}};
|
||||||
@define-color dark_5 {{colors.surface_container_highest.default.hex}};
|
@define-color dark_5 {{colors.surface_container_highest.default.hex}};
|
||||||
|
|
||||||
|
/* Sidebar Fixes */
|
||||||
|
.sidebar, .navigation-sidebar {
|
||||||
|
background-color: @view_bg_color;
|
||||||
|
color: @view_fg_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar list, .navigation-sidebar list {
|
||||||
|
background-color: transparent;
|
||||||
|
color: @view_fg_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
filechooser .sidebar {
|
||||||
|
background-color: @view_bg_color;
|
||||||
|
color: @view_fg_color;
|
||||||
|
}
|
||||||
|
|||||||
@@ -76,3 +76,19 @@
|
|||||||
@define-color dark_3 {{colors.surface_container.default.hex}};
|
@define-color dark_3 {{colors.surface_container.default.hex}};
|
||||||
@define-color dark_4 {{colors.surface_container_high.default.hex}};
|
@define-color dark_4 {{colors.surface_container_high.default.hex}};
|
||||||
@define-color dark_5 {{colors.surface_container_highest.default.hex}};
|
@define-color dark_5 {{colors.surface_container_highest.default.hex}};
|
||||||
|
|
||||||
|
/* Sidebar Fixes */
|
||||||
|
.sidebar, .navigation-sidebar {
|
||||||
|
background-color: @view_bg_color;
|
||||||
|
color: @view_fg_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar list, .navigation-sidebar list {
|
||||||
|
background-color: transparent;
|
||||||
|
color: @view_fg_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
filechooser .sidebar {
|
||||||
|
background-color: @view_bg_color;
|
||||||
|
color: @view_fg_color;
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,126 +0,0 @@
|
|||||||
# Vicinae Matugen Theme Template
|
|
||||||
|
|
||||||
[meta]
|
|
||||||
name = "Matugen"
|
|
||||||
description = "Material You theme generated by Matugen - {{mode}} variant"
|
|
||||||
variant = "{{mode}}"
|
|
||||||
|
|
||||||
# ============================================================================
|
|
||||||
# Core Colors
|
|
||||||
# ============================================================================
|
|
||||||
|
|
||||||
[colors.core]
|
|
||||||
accent = "{{colors.primary.default.hex}}"
|
|
||||||
accent_foreground = "{{colors.on_primary.default.hex}}"
|
|
||||||
background = "{{colors.surface.default.hex}}"
|
|
||||||
foreground = "{{colors.on_surface.default.hex}}"
|
|
||||||
secondary_background = "{{colors.surface_container.default.hex}}"
|
|
||||||
border = "{{colors.outline_variant.default.hex}}"
|
|
||||||
|
|
||||||
# ============================================================================
|
|
||||||
# Window Borders
|
|
||||||
# ============================================================================
|
|
||||||
|
|
||||||
[colors.main_window]
|
|
||||||
border = "{{colors.outline_variant.default.hex}}"
|
|
||||||
|
|
||||||
[colors.settings_window]
|
|
||||||
border = "{{colors.outline.default.hex}}"
|
|
||||||
|
|
||||||
# ============================================================================
|
|
||||||
# Accent Palette
|
|
||||||
# ============================================================================
|
|
||||||
|
|
||||||
[colors.accents]
|
|
||||||
blue = "{{colors.primary.default.hex}}"
|
|
||||||
green = "{{colors.tertiary.default.hex}}"
|
|
||||||
magenta = "{{colors.secondary.default.hex}}"
|
|
||||||
orange = { name = "{{colors.error.default.hex}}", lighter = 40 }
|
|
||||||
red = "{{colors.error.default.hex}}"
|
|
||||||
yellow = { name = "{{colors.tertiary.default.hex}}", lighter = 80 }
|
|
||||||
cyan = { name = "{{colors.primary.default.hex}}", lighter = 50 }
|
|
||||||
purple = "{{colors.secondary.default.hex}}"
|
|
||||||
|
|
||||||
# ============================================================================
|
|
||||||
# Text System
|
|
||||||
# ============================================================================
|
|
||||||
|
|
||||||
[colors.text]
|
|
||||||
default = "{{colors.on_surface.default.hex}}"
|
|
||||||
muted = "{{colors.on_surface_variant.default.hex}}"
|
|
||||||
danger = "{{colors.error.default.hex}}"
|
|
||||||
success = "{{colors.tertiary.default.hex}}"
|
|
||||||
placeholder = { name = "{{colors.on_surface_variant.default.hex}}", opacity = 0.6 }
|
|
||||||
|
|
||||||
[colors.text.selection]
|
|
||||||
background = "{{colors.primary.default.hex}}"
|
|
||||||
foreground = "{{colors.on_primary.default.hex}}"
|
|
||||||
|
|
||||||
[colors.text.links]
|
|
||||||
default = "{{colors.primary.default.hex}}"
|
|
||||||
visited = { name = "{{colors.tertiary.default.hex}}", darker = 20 }
|
|
||||||
|
|
||||||
# ============================================================================
|
|
||||||
# Input Fields
|
|
||||||
# ============================================================================
|
|
||||||
|
|
||||||
[colors.input]
|
|
||||||
border = "{{colors.outline.default.hex}}"
|
|
||||||
border_focus = "{{colors.primary.default.hex}}"
|
|
||||||
border_error = "{{colors.error.default.hex}}"
|
|
||||||
|
|
||||||
# ============================================================================
|
|
||||||
# Buttons
|
|
||||||
# ============================================================================
|
|
||||||
|
|
||||||
[colors.button.primary]
|
|
||||||
background = "{{colors.surface_container_high.default.hex}}"
|
|
||||||
foreground = "{{colors.on_surface.default.hex}}"
|
|
||||||
|
|
||||||
[colors.button.primary.hover]
|
|
||||||
background = "{{colors.surface_container_highest.default.hex}}"
|
|
||||||
|
|
||||||
[colors.button.primary.focus]
|
|
||||||
outline = "{{colors.primary.default.hex}}"
|
|
||||||
|
|
||||||
# ============================================================================
|
|
||||||
# Lists
|
|
||||||
# ============================================================================
|
|
||||||
|
|
||||||
[colors.list.item.hover]
|
|
||||||
background = { name = "{{colors.primary_container.default.hex}}", opacity = 0.25 }
|
|
||||||
foreground = "{{colors.on_surface.default.hex}}"
|
|
||||||
|
|
||||||
[colors.list.item.selection]
|
|
||||||
background = { name = "{{colors.primary_container.default.hex}}", opacity = 0.50 }
|
|
||||||
foreground = "{{colors.on_primary_container.default.hex}}"
|
|
||||||
secondary_background = "{{colors.primary_container.default.hex}}"
|
|
||||||
secondary_foreground = "{{colors.on_primary_container.default.hex}}"
|
|
||||||
|
|
||||||
# ============================================================================
|
|
||||||
# Grid Items
|
|
||||||
# ============================================================================
|
|
||||||
|
|
||||||
[colors.grid.item]
|
|
||||||
background = "{{colors.surface_container.default.hex}}"
|
|
||||||
|
|
||||||
[colors.grid.item.hover]
|
|
||||||
outline = { name = "{{colors.secondary.default.hex}}", opacity = 0.8 }
|
|
||||||
|
|
||||||
[colors.grid.item.selection]
|
|
||||||
outline = { name = "{{colors.primary.default.hex}}" }
|
|
||||||
|
|
||||||
# ============================================================================
|
|
||||||
# Scrollbars
|
|
||||||
# ============================================================================
|
|
||||||
|
|
||||||
[colors.scrollbars]
|
|
||||||
background = { name = "{{colors.primary.default.hex}}", opacity = 0.2 }
|
|
||||||
|
|
||||||
# ============================================================================
|
|
||||||
# Loading States
|
|
||||||
# ============================================================================
|
|
||||||
|
|
||||||
[colors.loading]
|
|
||||||
bar = "{{colors.primary.default.hex}}"
|
|
||||||
spinner = "{{colors.primary.default.hex}}"
|
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
set default-bg "#{{colors.surface.default.hex_stripped}}"
|
||||||
|
set default-fg "#{{colors.on_surface.default.hex_stripped}}"
|
||||||
|
|
||||||
|
set statusbar-bg "#{{colors.surface.default.hex_stripped}}"
|
||||||
|
set statusbar-fg "#{{colors.on_surface.default.hex_stripped}}"
|
||||||
|
|
||||||
|
set inputbar-bg "#{{colors.surface.default.hex_stripped}}"
|
||||||
|
set inputbar-fg "#{{colors.on_surface.default.hex_stripped}}"
|
||||||
|
|
||||||
|
set notification-bg "#{{colors.surface.default.hex_stripped}}"
|
||||||
|
set notification-fg "#{{colors.on_surface.default.hex_stripped}}"
|
||||||
|
|
||||||
|
set notification-error-bg "#{{colors.error.default.hex_stripped}}"
|
||||||
|
set notification-error-fg "#{{colors.on_error.default.hex_stripped}}"
|
||||||
|
|
||||||
|
set notification-warning-bg "#{{colors.tertiary.default.hex_stripped}}"
|
||||||
|
set notification-warning-fg "#{{colors.on_tertiary.default.hex_stripped}}"
|
||||||
|
|
||||||
|
set highlight-color "#{{colors.tertiary.default.hex_stripped}}"
|
||||||
|
set highlight-active-color "#{{colors.secondary.default.hex_stripped}}"
|
||||||
|
|
||||||
|
set completion-bg "#{{colors.surface.default.hex_stripped}}"
|
||||||
|
set completion-fg "#{{colors.on_surface.default.hex_stripped}}"
|
||||||
|
|
||||||
|
set completion-group-bg "#{{colors.surface.default.hex_stripped}}"
|
||||||
|
set completion-group-fg "#{{colors.on_surface.default.hex_stripped}}"
|
||||||
|
|
||||||
|
set completion-highlight-bg "#{{colors.on_surface.default.hex_stripped}}"
|
||||||
|
set completion-highlight-fg "#{{colors.surface.default.hex_stripped}}"
|
||||||
|
|
||||||
|
set index-bg "#{{colors.surface.default.hex_stripped}}"
|
||||||
|
set index-fg "#{{colors.on_surface.default.hex_stripped}}"
|
||||||
|
|
||||||
|
set index-active-bg "#{{colors.surface_container.default.hex_stripped}}"
|
||||||
|
set index-active-fg "#{{colors.on_surface.default.hex_stripped}}"
|
||||||
|
|
||||||
|
set render-loading-bg "#{{colors.surface.default.hex_stripped}}"
|
||||||
|
set render-loading-fg "#{{colors.on_surface.default.hex_stripped}}"
|
||||||
|
|
||||||
|
set recolor-lightcolor "#{{colors.surface.default.hex_stripped}}"
|
||||||
|
set recolor-darkcolor "#{{colors.on_surface.default.hex_stripped}}"
|
||||||
@@ -1,5 +1,22 @@
|
|||||||
{pkgs, ...}: {
|
{pkgs, ...}: {
|
||||||
home.packages = with pkgs; [mpv];
|
programs.mpv = {
|
||||||
|
enable = true;
|
||||||
|
scripts = with pkgs.mpvScripts; [
|
||||||
|
uosc
|
||||||
|
thumbfast
|
||||||
|
];
|
||||||
|
config = {
|
||||||
|
# uosc provides its own UI
|
||||||
|
osc = "no";
|
||||||
|
osd-bar = "no";
|
||||||
|
border = "no";
|
||||||
|
|
||||||
|
# Subtitle preferences - prefer full subtitles over forced
|
||||||
|
# slang = "eng,en,enm"; # English subtitle preference order
|
||||||
|
# subs-fallback = "default"; # Use default if preferred not found
|
||||||
|
# sub-forced-events-only = "no"; # Don't limit to forced subtitle events
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
xdg.mimeApps = {
|
xdg.mimeApps = {
|
||||||
enable = true;
|
enable = true;
|
||||||
@@ -12,4 +29,11 @@
|
|||||||
"video/quicktime" = "mpv.desktop";
|
"video/quicktime" = "mpv.desktop";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
wayland.windowManager.hyprland.settings.windowrule = [
|
||||||
|
# --- VIDEO PLAYER (mpv) ---
|
||||||
|
"match:class ^(mpv)$, float on"
|
||||||
|
"match:class ^(mpv)$, center on"
|
||||||
|
"match:class ^(mpv)$, size 60% 70%"
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
...
|
...
|
||||||
}: {
|
}: {
|
||||||
home.packages = [
|
home.packages = [
|
||||||
|
# FIXME: does not dynamically update with matugen when open
|
||||||
inputs.nixovim.packages.${pkgs.system}.full
|
inputs.nixovim.packages.${pkgs.system}.full
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
{pkgs, ...}: {
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
nextcloud-client
|
||||||
|
];
|
||||||
|
|
||||||
|
wayland.windowManager.hyprland.settings.exec-once = [
|
||||||
|
"uwsm app -- nextcloud --background"
|
||||||
|
];
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
{ pkgs }:
|
||||||
|
|
||||||
|
pkgs.stdenv.mkDerivation {
|
||||||
|
pname = "hakase-plymouth-theme";
|
||||||
|
version = "1.0";
|
||||||
|
|
||||||
|
src = ./themes/hakase;
|
||||||
|
|
||||||
|
installPhase = ''
|
||||||
|
mkdir -p $out/share/plymouth/themes/hakase
|
||||||
|
cp * $out/share/plymouth/themes/hakase/
|
||||||
|
|
||||||
|
# Patch the .plymouth file to point to the store path
|
||||||
|
sed -i "s@ImageDir=.*@ImageDir=$out/share/plymouth/themes/hakase@" $out/share/plymouth/themes/hakase/hakase.plymouth
|
||||||
|
sed -i "s@ScriptFile=.*@ScriptFile=$out/share/plymouth/themes/hakase/hakase.script@" $out/share/plymouth/themes/hakase/hakase.plymouth
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 293 B |
|
After Width: | Height: | Size: 694 B |
@@ -0,0 +1,11 @@
|
|||||||
|
[Plymouth Theme]
|
||||||
|
Name=Omarchy
|
||||||
|
Description=Omarchy splash screen.
|
||||||
|
ModuleName=script
|
||||||
|
|
||||||
|
[script]
|
||||||
|
ImageDir=/usr/share/plymouth/themes/omarchy
|
||||||
|
ScriptFile=/usr/share/plymouth/themes/omarchy/omarchy.script
|
||||||
|
ConsoleLogBackgroundColor=0x1a1b26
|
||||||
|
MonospaceFont=Cantarell 11
|
||||||
|
Font=Cantarell 11
|
||||||
@@ -0,0 +1,257 @@
|
|||||||
|
# Omarchy Plymouth Theme Script
|
||||||
|
|
||||||
|
Window.SetBackgroundTopColor(0.176, 0.067, 0.165);
|
||||||
|
Window.SetBackgroundBottomColor(0.176, 0.067, 0.165);
|
||||||
|
|
||||||
|
logo.image = Image("logo.png");
|
||||||
|
logo.sprite = Sprite(logo.image);
|
||||||
|
logo.sprite.SetX (Window.GetWidth() / 2 - logo.image.GetWidth() / 2);
|
||||||
|
logo.sprite.SetY (Window.GetHeight() / 2 - logo.image.GetHeight() / 2);
|
||||||
|
logo.sprite.SetOpacity (1);
|
||||||
|
|
||||||
|
# Use these to adjust the progress bar timing
|
||||||
|
global.fake_progress_limit = 0.7; # Target percentage for fake progress (0.0 to 1.0)
|
||||||
|
global.fake_progress_duration = 15.0; # Duration in seconds to reach limit
|
||||||
|
|
||||||
|
# Progress bar animation variables
|
||||||
|
global.fake_progress = 0.0;
|
||||||
|
global.real_progress = 0.0;
|
||||||
|
global.fake_progress_active = 0; # 0 / 1 boolean
|
||||||
|
global.animation_frame = 0;
|
||||||
|
global.fake_progress_start_time = 0; # Track when fake progress started
|
||||||
|
global.password_shown = 0; # Track if password dialog has been shown
|
||||||
|
global.max_progress = 0.0; # Track the maximum progress reached to prevent backwards movement
|
||||||
|
|
||||||
|
fun refresh_callback ()
|
||||||
|
{
|
||||||
|
global.animation_frame++;
|
||||||
|
|
||||||
|
# Animate fake progress to limit over time with easing
|
||||||
|
if (global.fake_progress_active == 1)
|
||||||
|
{
|
||||||
|
# Calculate elapsed time since start
|
||||||
|
elapsed_time = global.animation_frame / 50.0; # Convert frames to seconds (50 FPS)
|
||||||
|
|
||||||
|
# Calculate linear progress ratio (0 to 1) based on time
|
||||||
|
time_ratio = elapsed_time / global.fake_progress_duration;
|
||||||
|
if (time_ratio > 1.0)
|
||||||
|
time_ratio = 1.0;
|
||||||
|
|
||||||
|
# Apply easing curve: ease-out quadratic
|
||||||
|
# Formula: 1 - (1 - x)^2
|
||||||
|
eased_ratio = 1 - ((1 - time_ratio) * (1 - time_ratio));
|
||||||
|
|
||||||
|
# Calculate fake progress based on eased ratio
|
||||||
|
global.fake_progress = eased_ratio * global.fake_progress_limit;
|
||||||
|
|
||||||
|
# Update progress bar with fake progress
|
||||||
|
update_progress_bar(global.fake_progress);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Plymouth.SetRefreshFunction (refresh_callback);
|
||||||
|
|
||||||
|
#----------------------------------------- Helper Functions --------------------------------
|
||||||
|
|
||||||
|
fun update_progress_bar(progress)
|
||||||
|
{
|
||||||
|
# Only update if progress is moving forward
|
||||||
|
if (progress > global.max_progress)
|
||||||
|
{
|
||||||
|
global.max_progress = progress;
|
||||||
|
width = Math.Int(progress_bar.original_image.GetWidth() * progress);
|
||||||
|
if (width < 1) width = 1; # Ensure minimum width of 1 pixel
|
||||||
|
|
||||||
|
progress_bar.image = progress_bar.original_image.Scale(width, progress_bar.original_image.GetHeight());
|
||||||
|
progress_bar.sprite.SetImage(progress_bar.image);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun show_progress_bar()
|
||||||
|
{
|
||||||
|
progress_box.sprite.SetOpacity(1);
|
||||||
|
progress_bar.sprite.SetOpacity(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
fun hide_progress_bar()
|
||||||
|
{
|
||||||
|
progress_box.sprite.SetOpacity(0);
|
||||||
|
progress_bar.sprite.SetOpacity(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
fun show_password_dialog()
|
||||||
|
{
|
||||||
|
lock.sprite.SetOpacity(1);
|
||||||
|
entry.sprite.SetOpacity(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
fun hide_password_dialog()
|
||||||
|
{
|
||||||
|
lock.sprite.SetOpacity(0);
|
||||||
|
entry.sprite.SetOpacity(0);
|
||||||
|
for (index = 0; bullet.sprites[index]; index++)
|
||||||
|
bullet.sprites[index].SetOpacity(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
fun start_fake_progress()
|
||||||
|
{
|
||||||
|
# Don't reset if we already have progress
|
||||||
|
if (global.max_progress == 0.0)
|
||||||
|
{
|
||||||
|
global.fake_progress = 0.0;
|
||||||
|
global.real_progress = 0.0;
|
||||||
|
update_progress_bar(0.0);
|
||||||
|
}
|
||||||
|
global.fake_progress_active = 1;
|
||||||
|
global.animation_frame = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
fun stop_fake_progress()
|
||||||
|
{
|
||||||
|
global.fake_progress_active = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#----------------------------------------- Dialogue --------------------------------
|
||||||
|
|
||||||
|
lock.image = Image("lock.png");
|
||||||
|
entry.image = Image("entry.png");
|
||||||
|
bullet.image = Image("bullet.png");
|
||||||
|
|
||||||
|
entry.sprite = Sprite(entry.image);
|
||||||
|
entry.x = Window.GetWidth()/2 - entry.image.GetWidth() / 2;
|
||||||
|
entry.y = logo.sprite.GetY() + logo.image.GetHeight() + 40;
|
||||||
|
entry.sprite.SetPosition(entry.x, entry.y, 10001);
|
||||||
|
entry.sprite.SetOpacity(0);
|
||||||
|
|
||||||
|
# Scale lock to be slightly shorter than entry field height
|
||||||
|
# Original lock is 84x96, entry height determines scale
|
||||||
|
lock_height = entry.image.GetHeight() * 0.8;
|
||||||
|
lock_scale = lock_height / 96;
|
||||||
|
lock_width = 84 * lock_scale;
|
||||||
|
|
||||||
|
scaled_lock = lock.image.Scale(lock_width, lock_height);
|
||||||
|
lock.sprite = Sprite(scaled_lock);
|
||||||
|
lock.x = entry.x - lock_width - 15;
|
||||||
|
lock.y = entry.y + entry.image.GetHeight()/2 - lock_height/2;
|
||||||
|
lock.sprite.SetPosition(lock.x, lock.y, 10001);
|
||||||
|
lock.sprite.SetOpacity(0);
|
||||||
|
|
||||||
|
# Bullet array
|
||||||
|
bullet.sprites = [];
|
||||||
|
|
||||||
|
fun display_normal_callback ()
|
||||||
|
{
|
||||||
|
hide_password_dialog();
|
||||||
|
|
||||||
|
# Get current mode
|
||||||
|
mode = Plymouth.GetMode();
|
||||||
|
|
||||||
|
# Only show progress bar for boot and resume modes
|
||||||
|
if ((mode == "boot" || mode == "resume") && global.password_shown == 1)
|
||||||
|
{
|
||||||
|
show_progress_bar();
|
||||||
|
start_fake_progress();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun display_password_callback (prompt, bullets)
|
||||||
|
{
|
||||||
|
global.password_shown = 1; # Mark that password dialog has been shown
|
||||||
|
|
||||||
|
# Reset progress when password dialog appears
|
||||||
|
stop_fake_progress();
|
||||||
|
hide_progress_bar();
|
||||||
|
global.max_progress = 0.0;
|
||||||
|
global.fake_progress = 0.0;
|
||||||
|
global.real_progress = 0.0;
|
||||||
|
show_password_dialog();
|
||||||
|
|
||||||
|
# Clear all bullets first
|
||||||
|
for (index = 0; bullet.sprites[index]; index++)
|
||||||
|
bullet.sprites[index].SetOpacity(0);
|
||||||
|
|
||||||
|
# Create and show bullets for current password (max 21)
|
||||||
|
max_bullets = 21;
|
||||||
|
bullets_to_show = bullets;
|
||||||
|
if (bullets_to_show > max_bullets)
|
||||||
|
bullets_to_show = max_bullets;
|
||||||
|
|
||||||
|
for (index = 0; index < bullets_to_show; index++)
|
||||||
|
{
|
||||||
|
if (!bullet.sprites[index])
|
||||||
|
{
|
||||||
|
# Scale bullet image to 7x7 pixels
|
||||||
|
scaled_bullet = bullet.image.Scale(7, 7);
|
||||||
|
bullet.sprites[index] = Sprite(scaled_bullet);
|
||||||
|
bullet.x = entry.x + 20 + index * (7 + 5);
|
||||||
|
bullet.y = entry.y + entry.image.GetHeight() / 2 - 3.5;
|
||||||
|
bullet.sprites[index].SetPosition(bullet.x, bullet.y, 10002);
|
||||||
|
}
|
||||||
|
bullet.sprites[index].SetOpacity(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Plymouth.SetDisplayNormalFunction(display_normal_callback);
|
||||||
|
Plymouth.SetDisplayPasswordFunction(display_password_callback);
|
||||||
|
|
||||||
|
#----------------------------------------- Progress Bar --------------------------------
|
||||||
|
|
||||||
|
progress_box.image = Image("progress_box.png");
|
||||||
|
progress_box.sprite = Sprite(progress_box.image);
|
||||||
|
|
||||||
|
progress_box.x = Window.GetWidth() / 2 - progress_box.image.GetWidth() / 2;
|
||||||
|
progress_box.y = entry.y + entry.image.GetHeight() / 2 - progress_box.image.GetHeight() / 2;
|
||||||
|
progress_box.sprite.SetPosition(progress_box.x, progress_box.y, 0);
|
||||||
|
progress_box.sprite.SetOpacity(0);
|
||||||
|
|
||||||
|
progress_bar.original_image = Image("progress_bar.png");
|
||||||
|
progress_bar.sprite = Sprite();
|
||||||
|
progress_bar.image = progress_bar.original_image.Scale(1, progress_bar.original_image.GetHeight());
|
||||||
|
|
||||||
|
progress_bar.x = Window.GetWidth() / 2 - progress_bar.original_image.GetWidth() / 2;
|
||||||
|
progress_bar.y = progress_box.y + (progress_box.image.GetHeight() - progress_bar.original_image.GetHeight()) / 2;
|
||||||
|
progress_bar.sprite.SetPosition(progress_bar.x, progress_bar.y, 1);
|
||||||
|
progress_bar.sprite.SetOpacity(0);
|
||||||
|
|
||||||
|
fun progress_callback (duration, progress)
|
||||||
|
{
|
||||||
|
global.real_progress = progress;
|
||||||
|
|
||||||
|
# If real progress is above limit, stop fake progress and use real progress
|
||||||
|
if (progress > global.fake_progress_limit)
|
||||||
|
{
|
||||||
|
stop_fake_progress();
|
||||||
|
update_progress_bar(progress);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Plymouth.SetBootProgressFunction(progress_callback);
|
||||||
|
|
||||||
|
#----------------------------------------- Quit --------------------------------
|
||||||
|
|
||||||
|
fun quit_callback ()
|
||||||
|
{
|
||||||
|
logo.sprite.SetOpacity (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
Plymouth.SetQuitFunction(quit_callback);
|
||||||
|
|
||||||
|
#----------------------------------------- Message --------------------------------
|
||||||
|
|
||||||
|
message_sprite = Sprite();
|
||||||
|
message_sprite.SetPosition(10, 10, 10000);
|
||||||
|
|
||||||
|
fun display_message_callback (text)
|
||||||
|
{
|
||||||
|
my_image = Image.Text(text, 1, 1, 1);
|
||||||
|
message_sprite.SetImage(my_image);
|
||||||
|
}
|
||||||
|
|
||||||
|
fun hide_message_callback (text)
|
||||||
|
{
|
||||||
|
message_sprite.SetOpacity(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Plymouth.SetDisplayMessageFunction (display_message_callback);
|
||||||
|
Plymouth.SetHideMessageFunction (hide_message_callback);
|
||||||
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 314 B |
|
After Width: | Height: | Size: 314 B |
@@ -0,0 +1,4 @@
|
|||||||
|
{pkgs, ...}: {
|
||||||
|
environment.systemPackages = with pkgs; [via];
|
||||||
|
services.udev.packages = with pkgs; [via];
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
{pkgs, ...}: let
|
{pkgs, myConfig, ...}: let
|
||||||
# Screenshot script with swappy integration
|
# Screenshot script with swappy integration
|
||||||
screenshot = pkgs.writeShellScriptBin "screenshot" ''
|
screenshot = pkgs.writeShellScriptBin "screenshot" ''
|
||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
@@ -27,8 +27,13 @@
|
|||||||
wl-copy < "$filepath"
|
wl-copy < "$filepath"
|
||||||
notify-send "Screenshot saved" "Saved and copied to clipboard"
|
notify-send "Screenshot saved" "Saved and copied to clipboard"
|
||||||
;;
|
;;
|
||||||
|
ocr)
|
||||||
|
# OCR Selection
|
||||||
|
grim -g "$(slurp)" - | tesseract stdin stdout | wl-copy
|
||||||
|
notify-send "OCR" "Text extracted to clipboard"
|
||||||
|
;;
|
||||||
*)
|
*)
|
||||||
echo "Usage: screenshot {region|window|screen|all|region-save}"
|
echo "Usage: screenshot {region|window|screen|all|region-save|ocr}"
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
@@ -40,6 +45,7 @@ in {
|
|||||||
swappy # Annotation tool
|
swappy # Annotation tool
|
||||||
jq # For window selection
|
jq # For window selection
|
||||||
wl-clipboard # For copying to clipboard
|
wl-clipboard # For copying to clipboard
|
||||||
|
tesseract # OCR tool
|
||||||
screenshot # Our wrapper script
|
screenshot # Our wrapper script
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -54,9 +60,18 @@ in {
|
|||||||
show_panel=true
|
show_panel=true
|
||||||
line_size=5
|
line_size=5
|
||||||
text_size=20
|
text_size=20
|
||||||
text_font=sans-serif
|
text_font=${myConfig.font.sans}
|
||||||
paint_mode=brush
|
paint_mode=brush
|
||||||
early_exit=false
|
early_exit=false
|
||||||
fill_shape=false
|
fill_shape=false
|
||||||
'';
|
'';
|
||||||
|
|
||||||
|
wayland.windowManager.hyprland.settings.bindd = [
|
||||||
|
# Screenshots
|
||||||
|
"SUPER, S, Screenshot Region (with edit), exec, screenshot region"
|
||||||
|
"SUPER SHIFT, S, Screenshot Active Window, exec, screenshot window"
|
||||||
|
"SUPER ALT, S, Quick Screenshot (no edit), exec, screenshot region-save"
|
||||||
|
"SUPER ALT SHIFT, S, Screenshot Current Monitor, exec, screenshot screen"
|
||||||
|
"SUPER ALT, E, OCR Selection, exec, screenshot ocr"
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,17 +1,33 @@
|
|||||||
{pkgs, ...}: {
|
{
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
services.swayosd.enable = true;
|
services.swayosd.enable = true;
|
||||||
|
|
||||||
|
# Auto-restart swayosd on crash
|
||||||
|
systemd.user.services.swayosd = {
|
||||||
|
Unit = {
|
||||||
|
StartLimitBurst = lib.mkForce 5;
|
||||||
|
StartLimitIntervalSec = lib.mkForce 30;
|
||||||
|
After = [ "graphical-session.target" ];
|
||||||
|
PartOf = [ "graphical-session.target" ];
|
||||||
|
};
|
||||||
|
Service = {
|
||||||
|
Restart = lib.mkForce "on-failure";
|
||||||
|
RestartSec = lib.mkForce "1s";
|
||||||
|
};
|
||||||
|
Install.WantedBy = [ "graphical-session.target" ];
|
||||||
|
};
|
||||||
|
|
||||||
wayland.windowManager.hyprland.settings = {
|
wayland.windowManager.hyprland.settings = {
|
||||||
exec-once = [
|
|
||||||
"uwsm app -- swayosd-server"
|
|
||||||
];
|
|
||||||
bindel = [
|
bindel = [
|
||||||
", XF86AudioRaiseVolume, exec, swayosd-client --output-volume raise"
|
", XF86AudioRaiseVolume, exec, swayosd-client --output-volume raise"
|
||||||
", XF86AudioLowerVolume, exec, swayosd-client --output-volume lower"
|
", XF86AudioLowerVolume, exec, swayosd-client --output-volume lower"
|
||||||
];
|
];
|
||||||
bindl = [
|
bindl = [
|
||||||
", XF86AudioMute, exec, swayosd-client --output-volume mute-toggle"
|
", XF86AudioMute, exec, swayosd-client --output-volume mute-toggle"
|
||||||
", Caps_Lock, exec, swayosd-client --caps-lock"
|
", Caps_Lock, exec, sleep 0.1 && swayosd-client --caps-lock"
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{ pkgs, ... }: {
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
ttyper
|
||||||
|
];
|
||||||
|
}
|
||||||
@@ -1,5 +1,22 @@
|
|||||||
{pkgs, ...}: {
|
{
|
||||||
# TODO: create a script that initializes vicinae if `vicinae server` is off.
|
pkgs,
|
||||||
|
inputs,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
vicinae-toggle = pkgs.writeShellScriptBin "vicinae-toggle" ''
|
||||||
|
VICINAE_BIN="${inputs.vicinae.packages.${pkgs.system}.default}/bin/vicinae"
|
||||||
|
ARGS=("$@")
|
||||||
|
if [ ''${#ARGS[@]} -eq 0 ]; then
|
||||||
|
ARGS=("toggle")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! "$VICINAE_BIN" "''${ARGS[@]}" 2>/dev/null; then
|
||||||
|
${pkgs.systemd}/bin/systemctl --user restart vicinae || "$VICINAE_BIN" server &
|
||||||
|
sleep 0.4
|
||||||
|
exec "$VICINAE_BIN" "''${ARGS[@]}"
|
||||||
|
fi
|
||||||
|
'';
|
||||||
|
in {
|
||||||
services.vicinae = {
|
services.vicinae = {
|
||||||
enable = true;
|
enable = true;
|
||||||
systemd = {
|
systemd = {
|
||||||
@@ -36,9 +53,34 @@
|
|||||||
"action.new" = "control+N";
|
"action.new" = "control+N";
|
||||||
"action.save" = "control+S";
|
"action.save" = "control+S";
|
||||||
};
|
};
|
||||||
|
theme = {
|
||||||
|
light = {
|
||||||
|
name = "matugen";
|
||||||
|
icon_theme = "Papirus-Dark";
|
||||||
|
};
|
||||||
|
dark = {
|
||||||
|
name = "matugen";
|
||||||
|
icon_theme = "Papirus-Dark";
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
# Ensure vicinae themes directory exists for matugen output
|
# Ensure vicinae themes directory exists for matugen output
|
||||||
home.file.".local/share/vicinae/themes/.keep".text = "";
|
home.file.".local/share/vicinae/themes/.keep".text = "";
|
||||||
|
|
||||||
|
home.packages = [vicinae-toggle];
|
||||||
|
|
||||||
|
wayland.windowManager.hyprland.settings = {
|
||||||
|
exec-once = [
|
||||||
|
"vicinae server"
|
||||||
|
];
|
||||||
|
|
||||||
|
bindd = [
|
||||||
|
"SUPER, SPACE, Open Vicinae, exec, vicinae-toggle"
|
||||||
|
"SUPER, period, Open Emoji Picker, exec, vicinae-toggle deeplink vicinae://launch/core/search-emojis"
|
||||||
|
"SUPER, C, Open Calculator, exec, vicinae-toggle deeplink vicinae://launch/calculator/history"
|
||||||
|
"SUPER, V, Open Clipboard History, exec, vicinae-toggle deeplink vicinae://launch/clipboard/history"
|
||||||
|
];
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,59 +4,75 @@
|
|||||||
myConfig,
|
myConfig,
|
||||||
...
|
...
|
||||||
}: let
|
}: let
|
||||||
|
# FIXME: waybar overlaps fullscreen display when restarting waybar
|
||||||
hakase-popup-launch = pkgs.writeShellScriptBin "hakase-popup-launch" ''
|
hakase-popup-launch = pkgs.writeShellScriptBin "hakase-popup-launch" ''
|
||||||
tui_name=$1
|
tui_name=$1
|
||||||
active_popup=$(${pkgs.hyprland}/bin/hyprctl clients -j | ${pkgs.jq}/bin/jq -r '.[] | select(.class | startswith("org.hakase.")) | .class')
|
active_popup=$(${pkgs.hyprland}/bin/hyprctl clients -j | ${pkgs.jq}/bin/jq -r '.[] | select(.class | startswith("org.hakase.")) | .class')
|
||||||
|
|
||||||
if [[ -z "''${tui_name}" ]]; then
|
if [[ -z "''${tui_name}" ]]; then
|
||||||
echo "Usage: $(basename "$0") [tui-name]"
|
echo "Usage: $(basename "$0") [tui-name]"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
popup_checker() {
|
|
||||||
if [[ -z "$active_popup" ]]; then
|
|
||||||
echo "no_popup"
|
|
||||||
elif [[ "$active_popup" != "org.hakase.popup.''${tui_name}" ]]; then
|
|
||||||
echo "different"
|
|
||||||
else
|
|
||||||
echo "same"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
|
popup_checker() {
|
||||||
|
if [[ -z "$active_popup" ]]; then
|
||||||
|
echo "no_popup"
|
||||||
|
elif [[ "$active_popup" != "org.hakase.popup.''${tui_name}" ]]; then
|
||||||
|
echo "different"
|
||||||
|
else
|
||||||
|
echo "same"
|
||||||
|
fi
|
||||||
|
}
|
||||||
launch() {
|
launch() {
|
||||||
exec ${pkgs.util-linux}/bin/setsid uwsm-app -- xdg-terminal-exec --app-id=org.hakase.popup."''${tui_name}" -e "''${tui_name}"
|
exec ${pkgs.util-linux}/bin/setsid uwsm-app -- xdg-terminal-exec --app-id=org.hakase.popup."''${tui_name}" -e "''${tui_name}"
|
||||||
}
|
}
|
||||||
|
|
||||||
focus() {
|
focus() {
|
||||||
exec ${pkgs.hyprland}/bin/hyprctl dispatch focuswindow "class:org.hakase.popup.''${tui_name}"
|
exec ${pkgs.hyprland}/bin/hyprctl dispatch focuswindow "class:org.hakase.popup.''${tui_name}"
|
||||||
}
|
}
|
||||||
|
|
||||||
replace() {
|
replace() {
|
||||||
${pkgs.hyprland}/bin/hyprctl dispatch closewindow "class:''${active_popup}"
|
${pkgs.hyprland}/bin/hyprctl dispatch closewindow "class:''${active_popup}"
|
||||||
sleep 1
|
sleep 0.3
|
||||||
launch
|
launch
|
||||||
}
|
}
|
||||||
|
|
||||||
run() {
|
run() {
|
||||||
local status
|
local status
|
||||||
status=$(popup_checker)
|
status=$(popup_checker)
|
||||||
|
|
||||||
if [[ "$status" == "no_popup" ]]; then
|
if [[ "$status" == "no_popup" ]]; then
|
||||||
launch
|
launch
|
||||||
elif [[ "$status" == "same" ]]; then
|
elif [[ "$status" == "same" ]]; then
|
||||||
focus
|
focus
|
||||||
elif [[ "$status" == "different" ]]; then
|
elif [[ "$status" == "different" ]]; then
|
||||||
replace
|
replace
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
run
|
run
|
||||||
'';
|
'';
|
||||||
in {
|
in {
|
||||||
wayland.windowManager.hyprland.settings = {
|
wayland.windowManager.hyprland.settings = {
|
||||||
exec-once = [
|
exec-once = [
|
||||||
"uwsm app -- waybar"
|
"uwsm app -- waybar"
|
||||||
];
|
];
|
||||||
|
|
||||||
|
bind = [
|
||||||
|
"SUPER, Escape, exec, hakase-popup-launch btop"
|
||||||
|
"SUPER, N, exec, hakase-popup-launch impala"
|
||||||
|
"SUPER, B, exec, hakase-popup-launch bluetui"
|
||||||
|
"SUPER, T, exec, hakase-popup-launch wiremix"
|
||||||
|
];
|
||||||
|
|
||||||
|
windowrule = [
|
||||||
|
# --- POPUP RULES (Wifi, BT, Audio) ---
|
||||||
|
"match:class ^(org\.hakase\.popup\..*)$, float on"
|
||||||
|
"match:class ^(org\.hakase\.popup\..*)$, size 900 600"
|
||||||
|
"match:class ^(org\.hakase\.popup\..*)$, center on"
|
||||||
|
"match:class ^(org\.hakase\.popup\..*)$, animation slide right"
|
||||||
|
"match:class ^(org\.hakase\.popup\..*)$, dim_around on"
|
||||||
|
];
|
||||||
};
|
};
|
||||||
imports = [
|
imports = [
|
||||||
./style.nix
|
./style.nix
|
||||||
@@ -100,18 +116,38 @@ in {
|
|||||||
all-outputs = true;
|
all-outputs = true;
|
||||||
format = "{icon}";
|
format = "{icon}";
|
||||||
format-icons = {
|
format-icons = {
|
||||||
|
"music" = "";
|
||||||
|
"gaming" = "";
|
||||||
"default" = "";
|
"default" = "";
|
||||||
|
"active" = "";
|
||||||
|
|
||||||
|
# Numbered workspaces 1-5
|
||||||
"1" = "1";
|
"1" = "1";
|
||||||
"2" = "2";
|
"2" = "2";
|
||||||
"3" = "3";
|
"3" = "3";
|
||||||
"4" = "4";
|
"4" = "4";
|
||||||
"5" = "5";
|
"5" = "5";
|
||||||
"6" = "6";
|
|
||||||
"7" = "7";
|
# Kanji for workspaces 6-10
|
||||||
"8" = "8";
|
"6" = "1";
|
||||||
"9" = "9";
|
"7" = "2";
|
||||||
"10" = "0";
|
"8" = "3";
|
||||||
"active" = "";
|
"9" = "4";
|
||||||
|
"10" = "5";
|
||||||
|
|
||||||
|
# Dice for workspaces 11-15
|
||||||
|
"11" = "1";
|
||||||
|
"12" = "2";
|
||||||
|
"13" = "3";
|
||||||
|
"14" = "4";
|
||||||
|
"15" = "5";
|
||||||
|
|
||||||
|
# Circled numbers for 16-20
|
||||||
|
"16" = "1";
|
||||||
|
"17" = "2";
|
||||||
|
"18" = "3";
|
||||||
|
"19" = "4";
|
||||||
|
"20" = "5";
|
||||||
};
|
};
|
||||||
persistent-workspaces = {
|
persistent-workspaces = {
|
||||||
"1" = [];
|
"1" = [];
|
||||||
@@ -119,6 +155,11 @@ in {
|
|||||||
"3" = [];
|
"3" = [];
|
||||||
"4" = [];
|
"4" = [];
|
||||||
"5" = [];
|
"5" = [];
|
||||||
|
"6" = [];
|
||||||
|
"7" = [];
|
||||||
|
"8" = [];
|
||||||
|
"9" = [];
|
||||||
|
"10" = [];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -127,26 +168,34 @@ in {
|
|||||||
show-special = true;
|
show-special = true;
|
||||||
special-visible-only = true;
|
special-visible-only = true;
|
||||||
all-outputs = true;
|
all-outputs = true;
|
||||||
ignore-workspaces = ["1" "2" "3" "4" "5" "6" "7" "8" "9" "10"];
|
ignore-workspaces = ["^([0-9]+|gaming|music|jellyfin)$"];
|
||||||
format = "{icon}";
|
format = "{icon}";
|
||||||
format-icons = {
|
format-icons = {
|
||||||
"special:youtube" = "";
|
"special:youtube" = "";
|
||||||
"special:music" = "";
|
|
||||||
"special:steam" = "";
|
"special:steam" = "";
|
||||||
|
"special:custom" = "";
|
||||||
|
"special:preload" = "";
|
||||||
|
"special:jellyfin" = "";
|
||||||
|
"jellyfin" = "";
|
||||||
|
"youtube" = "";
|
||||||
|
"steam" = "";
|
||||||
|
"custom" = "";
|
||||||
|
"preload" = "";
|
||||||
|
"default" = "";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
"custom/omarchy" = {
|
"custom/omarchy" = {
|
||||||
format = "";
|
format = "";
|
||||||
on-click = "vicinae toggle"; # TODO: add fallback
|
on-click = "vicinae-toggle";
|
||||||
on-click-right = "xdg-terminal-exec";
|
on-click-right = "hyprctl dispatch overview:toggle";
|
||||||
tooltip-format = "Omarchy Menu\n\nSuper + Alt + Space";
|
tooltip-format = "Omarchy Menu\n\nSuper + Alt + Space";
|
||||||
};
|
};
|
||||||
|
|
||||||
"cpu" = {
|
"cpu" = {
|
||||||
interval = 5;
|
interval = 5;
|
||||||
format = "";
|
format = "";
|
||||||
on-click = "hakase-focus-wrapper btop";
|
on-click = "hakase-popup-launch btop";
|
||||||
on-click-right = "xdg-terminal-exec";
|
on-click-right = "xdg-terminal-exec";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,8 @@
|
|||||||
{config, ...}: {
|
{
|
||||||
|
config,
|
||||||
|
myConfig,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
programs.waybar = {
|
programs.waybar = {
|
||||||
style = ''
|
style = ''
|
||||||
@import "matugen.css";
|
@import "matugen.css";
|
||||||
@@ -9,7 +13,7 @@
|
|||||||
border: none;
|
border: none;
|
||||||
border-radius: 0;
|
border-radius: 0;
|
||||||
min-height: 0;
|
min-height: 0;
|
||||||
font-family: 'JetBrainsMono Nerd Font';
|
font-family: '${myConfig.font.monospace}';
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -32,6 +36,18 @@
|
|||||||
opacity: 0.5;
|
opacity: 0.5;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Add spacing separator every 5 workspaces */
|
||||||
|
#workspaces button:nth-child(5),
|
||||||
|
#workspaces button:nth-child(10),
|
||||||
|
#workspaces button:nth-child(15) {
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Separator between normal and special workspaces */
|
||||||
|
#workspaces.special {
|
||||||
|
margin-left: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
#cpu,
|
#cpu,
|
||||||
#battery,
|
#battery,
|
||||||
#pulseaudio,
|
#pulseaudio,
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
programs.wireshark.enable = true;
|
||||||
|
# dumpcap.enable = true;
|
||||||
|
usbmon.enable = true;
|
||||||
|
}
|
||||||
@@ -1,14 +1,162 @@
|
|||||||
{pkgs, ...}: {
|
{
|
||||||
|
pkgs,
|
||||||
|
myConfig,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
# Yazi wrapper for xdg-desktop-portal-termfilechooser
|
||||||
|
# TODO: rewrite in the future
|
||||||
|
yaziWrapper = pkgs.writeShellScript "yazi-wrapper.sh" ''
|
||||||
|
if [[ "$6" == "1" ]]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
|
multiple="$1"
|
||||||
|
directory="$2"
|
||||||
|
save="$3"
|
||||||
|
path="$4"
|
||||||
|
out="$5"
|
||||||
|
|
||||||
|
termcmd="${pkgs.util-linux}/bin/setsid uwsm-app -- xdg-terminal-exec --app-id=org.hakase.popup.yazi -e"
|
||||||
|
|
||||||
|
cleanup() {
|
||||||
|
if [ -f "$tmpfile" ]; then
|
||||||
|
rm "$tmpfile" || :
|
||||||
|
fi
|
||||||
|
if [ "$save" = "1" ] && [ ! -s "$out" ]; then
|
||||||
|
rm "$path" || :
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
trap cleanup EXIT HUP INT QUIT ABRT TERM
|
||||||
|
|
||||||
|
if [ "$save" = "1" ]; then
|
||||||
|
tmpfile=$(mktemp)
|
||||||
|
|
||||||
|
printf '%s' 'xdg-desktop-portal-termfilechooser saving files tutorial
|
||||||
|
|
||||||
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||||
|
!!! === WARNING! === !!!
|
||||||
|
!!! The contents of *whatever* file you open last in !!!
|
||||||
|
!!! yazi will be *overwritten*! !!!
|
||||||
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||||
|
|
||||||
|
Instructions:
|
||||||
|
1) Move this file wherever you want.
|
||||||
|
2) Rename the file if needed.
|
||||||
|
3) Confirm your selection by opening the file, for
|
||||||
|
example by pressing <Enter>.
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
1) This file is provided for your convenience. You can
|
||||||
|
only choose this placeholder file otherwise the save operation aborted.
|
||||||
|
2) If you quit yazi without opening a file, this file
|
||||||
|
will be removed and the save operation aborted.
|
||||||
|
' >"$path"
|
||||||
|
|
||||||
|
$termcmd ${pkgs.yazi}/bin/yazi --chooser-file="$tmpfile" "$path"
|
||||||
|
elif [ "$directory" = "1" ]; then
|
||||||
|
$termcmd ${pkgs.yazi}/bin/yazi --cwd-file="$out" "$path"
|
||||||
|
elif [ "$multiple" = "1" ]; then
|
||||||
|
$termcmd ${pkgs.yazi}/bin/yazi --chooser-file="$out" "$path"
|
||||||
|
else
|
||||||
|
$termcmd ${pkgs.yazi}/bin/yazi --chooser-file="$out" "$path"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Handle save file case
|
||||||
|
if [ "$save" = "1" ] && [ -s "$tmpfile" ]; then
|
||||||
|
selected_file=$(head -n 1 "$tmpfile")
|
||||||
|
if [ -f "$selected_file" ] && grep -qi "^xdg-desktop-portal-termfilechooser saving files tutorial" "$selected_file"; then
|
||||||
|
echo "$selected_file" >"$out"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
'';
|
||||||
|
in {
|
||||||
|
wayland.windowManager.hyprland.settings = {
|
||||||
|
bindd = [
|
||||||
|
"SUPER, X, Open File Manager, exec, uwsm app -- yazi"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
programs.yazi = {
|
programs.yazi = {
|
||||||
enable = true;
|
enable = true;
|
||||||
enableFishIntegration = true;
|
enableFishIntegration = true;
|
||||||
settings = {
|
settings = {
|
||||||
manager = {
|
manager = {
|
||||||
show_hidden = true;
|
show_hidden = false;
|
||||||
sort_by = "natural";
|
sort_by = "mtime";
|
||||||
sort_dir_first = true;
|
sort_reverse = true;
|
||||||
|
sort_dir_first = false;
|
||||||
linemode = "size";
|
linemode = "size";
|
||||||
|
mouse_events = ["click" "scroll" "touch" "move" "drag"];
|
||||||
|
};
|
||||||
|
tasks = {
|
||||||
|
image_bound = [10000 10000];
|
||||||
|
};
|
||||||
|
opener = {
|
||||||
|
anki = [
|
||||||
|
{
|
||||||
|
run = "anki \"$@\"";
|
||||||
|
desc = "Open with Anki";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
pdf = [
|
||||||
|
{
|
||||||
|
run = "zathura \"$@\"";
|
||||||
|
desc = "Open with Zathura";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
run = "firefox \"$@\"";
|
||||||
|
desc = "Open with Firefox";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
open = {
|
||||||
|
prepend_rules = [
|
||||||
|
{
|
||||||
|
name = "*.{apkg,colpkg}";
|
||||||
|
use = "anki";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
mime = "application/pdf";
|
||||||
|
use = "pdf";
|
||||||
|
}
|
||||||
|
];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# Portal packages need to be in user profile for proper path resolution
|
||||||
|
home.packages = [
|
||||||
|
pkgs.xdg-desktop-portal-hyprland
|
||||||
|
pkgs.xdg-desktop-portal-gtk
|
||||||
|
pkgs.xdg-desktop-portal-termfilechooser
|
||||||
|
];
|
||||||
|
|
||||||
|
# xdg-desktop-portal-termfilechooser configuration
|
||||||
|
xdg.configFile."xdg-desktop-portal-termfilechooser/config".text = ''
|
||||||
|
[filechooser]
|
||||||
|
cmd=${yaziWrapper}
|
||||||
|
default_dir=$HOME/Downloads
|
||||||
|
'';
|
||||||
|
|
||||||
|
# Portal routing configuration - use termfilechooser for file dialogs
|
||||||
|
xdg.configFile."xdg-desktop-portal/portals.conf".text = ''
|
||||||
|
[preferred]
|
||||||
|
default=hyprland;gtk
|
||||||
|
org.freedesktop.impl.portal.FileChooser=termfilechooser
|
||||||
|
'';
|
||||||
|
|
||||||
|
xdg.mimeApps = {
|
||||||
|
enable = true;
|
||||||
|
defaultApplications = {
|
||||||
|
"inode/directory" = "yazi.desktop";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
wayland.windowManager.hyprland.settings.windowrule = [
|
||||||
|
# File picker yazi - floating, centered, smaller size
|
||||||
|
"match:class ^(org\\.hakase\\.popup\\.yazi)$, float on"
|
||||||
|
"match:class ^(org\\.hakase\\.popup\\.yazi)$, size 60% 70%"
|
||||||
|
"match:class ^(org\\.hakase\\.popup\\.yazi)$, center on"
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,38 @@
|
|||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
ocrmypdf
|
||||||
|
];
|
||||||
|
programs.zathura = {
|
||||||
|
enable = true;
|
||||||
|
options = {
|
||||||
|
selection-clipboard = "clipboard";
|
||||||
|
adjust-open = "best-fit";
|
||||||
|
pages-per-row = 1;
|
||||||
|
scroll-page-aware = "true";
|
||||||
|
scroll-full-overlap = "0.01";
|
||||||
|
scroll-step = 100;
|
||||||
|
zoom-min = 10;
|
||||||
|
recolor = true;
|
||||||
|
recolor-keephue = true;
|
||||||
|
};
|
||||||
|
extraConfig = "include ${config.home.homeDirectory}/.config/zathura/zathura-matugen";
|
||||||
|
};
|
||||||
|
|
||||||
|
home.activation.createZathuraMatugen = lib.hm.dag.entryAfter ["writeBoundary"] ''
|
||||||
|
if [ ! -f "${config.home.homeDirectory}/.config/zathura/zathura-matugen" ]; then
|
||||||
|
touch "${config.home.homeDirectory}/.config/zathura/zathura-matugen"
|
||||||
|
fi
|
||||||
|
'';
|
||||||
|
|
||||||
|
xdg.mimeApps = {
|
||||||
|
enable = true;
|
||||||
|
defaultApplications = {
|
||||||
|
"application/pdf" = "org.pwmt.zathura.desktop";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 4.3 MiB |
@@ -1,51 +1,127 @@
|
|||||||
{
|
{
|
||||||
myConfig = {
|
hakase = {
|
||||||
nixos = {
|
myConfig = {
|
||||||
username = "kenji";
|
font = {
|
||||||
hostname = "hakase";
|
monospace = "MonoLisa";
|
||||||
timezone = "America/Chicago";
|
monospaceScript = "MonoLisa Italic @ss02=1";
|
||||||
};
|
sans = "Sans";
|
||||||
git = {
|
};
|
||||||
username = "kenji";
|
nixos = {
|
||||||
email = "kenji@hakase";
|
username = "kenji";
|
||||||
defaultBranch = "master";
|
hostname = "hakase";
|
||||||
};
|
timezone = "America/Chicago";
|
||||||
terminal = {
|
};
|
||||||
default = "ghostty";
|
git = {
|
||||||
aliases = {
|
username = "kenji";
|
||||||
update = "sudo nixos-rebuild switch --flake ~/.config/nixos/#hakase";
|
email = "kenji@hakase";
|
||||||
|
defaultBranch = "master";
|
||||||
|
};
|
||||||
|
theme = {
|
||||||
|
mode = "dark";
|
||||||
|
};
|
||||||
|
terminal = {
|
||||||
|
default = "ghostty";
|
||||||
|
font = "MonoLisa";
|
||||||
|
aliases = {
|
||||||
|
update = "sudo nixos-rebuild switch --flake ~/.config/nixos/#hakase";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
btop = {
|
||||||
|
autostart = true;
|
||||||
|
monitor = "HDMI-A-1";
|
||||||
|
};
|
||||||
|
hyprland = {
|
||||||
|
monitors = [
|
||||||
|
# "DP-1,highres@180,0x1080,1,vrr,1,bitdepth,10,cm,hdr,sdrbrightness,2.5"
|
||||||
|
"DP-1,highres@180,0x1080,1,vrr,0"
|
||||||
|
"DP-2, highres@165,760x0,1"
|
||||||
|
"HDMI-A-1, highres@highrr@120, 3440x1440, 1.6"
|
||||||
|
];
|
||||||
|
|
||||||
|
wallpaper = "firewatch.png";
|
||||||
|
kb_options = "";
|
||||||
|
};
|
||||||
|
wakeup = {
|
||||||
|
mouse = {
|
||||||
|
disable = true;
|
||||||
|
vendor = "3710";
|
||||||
|
product = "5406";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
firefox = {
|
||||||
|
bookmarks = [
|
||||||
|
{
|
||||||
|
name = "Home Manager";
|
||||||
|
url = "https://mynixos.com/home-manager/options/programs";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "YouTube";
|
||||||
|
url = "https://youtube.com";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Nur";
|
||||||
|
url = "https://nur.nix-community.org/repos";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
newtabpage = [
|
||||||
|
{
|
||||||
|
title = "Dashboard";
|
||||||
|
url = "https://dash.sakamoto.dev";
|
||||||
|
}
|
||||||
|
];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
hyprland = {
|
};
|
||||||
monitors = [
|
|
||||||
"DP-1,highres@180,0x1080,1,bitdepth,10,cm,hdr,sdrbrightness,1.4,sdrsaturation,0.98,vrr,0"
|
|
||||||
"DP-2, highres@165,760x0,1"
|
|
||||||
"HDMI-A-1, highres@highrr@120, 3440x1440, 1.6"
|
|
||||||
];
|
|
||||||
|
|
||||||
wallpaper = "firewatch.png";
|
macbook = {
|
||||||
};
|
myConfig = {
|
||||||
firefox = {
|
font = {
|
||||||
bookmarks = [
|
monospace = "MonoLisa";
|
||||||
{
|
monospaceScript = "MonoLisa Italic @ss02=1";
|
||||||
name = "Home Manager";
|
sans = "Sans";
|
||||||
url = "https://mynixos.com/home-manager/options/programs";
|
};
|
||||||
}
|
nixos = {
|
||||||
{
|
username = "kenji";
|
||||||
name = "YouTube";
|
hostname = "macbook";
|
||||||
url = "https://youtube.com";
|
timezone = "America/Chicago";
|
||||||
}
|
};
|
||||||
{
|
git = {
|
||||||
name = "Nur";
|
username = "kenji";
|
||||||
url = "https://nur.nix-community.org/repos";
|
email = "kenji@macbook";
|
||||||
}
|
defaultBranch = "master";
|
||||||
];
|
};
|
||||||
newtabpage = [
|
theme = {
|
||||||
{
|
mode = "dark";
|
||||||
title = "Dashboard";
|
};
|
||||||
url = "https://dash.sakamoto.dev";
|
terminal = {
|
||||||
}
|
default = "ghostty";
|
||||||
];
|
font = "MonoLisa";
|
||||||
|
aliases = {
|
||||||
|
update = "sudo nixos-rebuild switch --flake ~/.config/nixos/#macbook";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
btop = {
|
||||||
|
autostart = false;
|
||||||
|
monitor = "eDP-1";
|
||||||
|
};
|
||||||
|
hyprland = {
|
||||||
|
# M1 Pro/Max/Air screens are usually built-in eDP-1.
|
||||||
|
# HiDPI scale 2.0 is safe for Retina.
|
||||||
|
monitors = [
|
||||||
|
"eDP-1, highres, auto, 2"
|
||||||
|
];
|
||||||
|
wallpaper = "firewatch.png";
|
||||||
|
kb_options = "";
|
||||||
|
};
|
||||||
|
firefox = {
|
||||||
|
bookmarks = [
|
||||||
|
{
|
||||||
|
name = "Asahi Linux";
|
||||||
|
url = "https://asahilinux.org/";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
newtabpage = [];
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,26 @@
|
|||||||
{
|
{
|
||||||
"nodes": {
|
"nodes": {
|
||||||
|
"apple-silicon": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-compat": "flake-compat",
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1767637567,
|
||||||
|
"narHash": "sha256-njwPfL5gM/KRGLJ29CbQ4nLBoEkNPMvEHBAAPOP8BZc=",
|
||||||
|
"owner": "tpwrules",
|
||||||
|
"repo": "nixos-apple-silicon",
|
||||||
|
"rev": "530aa73aa9a21a078ff861b84767ae1d469715fa",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "tpwrules",
|
||||||
|
"repo": "nixos-apple-silicon",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"aquamarine": {
|
"aquamarine": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"hyprutils": [
|
"hyprutils": [
|
||||||
@@ -20,11 +41,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1765900596,
|
"lastModified": 1778857089,
|
||||||
"narHash": "sha256-+hn8v9jkkLP9m+o0Nm5SiEq10W0iWDSotH2XfjU45fA=",
|
"narHash": "sha256-TclWRW2SdFeETLaiTG4BA8C8C4m/LppQEldncqyTzAQ=",
|
||||||
"owner": "hyprwm",
|
"owner": "hyprwm",
|
||||||
"repo": "aquamarine",
|
"repo": "aquamarine",
|
||||||
"rev": "d83c97f8f5c0aae553c1489c7d9eff3eadcadace",
|
"rev": "ab2b0af63fbc9fb779d684f19149b790978be8a8",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -103,17 +124,32 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"flake-compat": {
|
"flake-compat": {
|
||||||
"flake": false,
|
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1761588595,
|
"lastModified": 1746162366,
|
||||||
"narHash": "sha256-XKUZz9zewJNUj46b4AJdiRZJAvSZ0Dqj2BNfXvFlJC4=",
|
"narHash": "sha256-5SSSZ/oQkwfcAz/o/6TlejlVGqeK08wyREBQ5qFFPhM=",
|
||||||
"owner": "edolstra",
|
"owner": "nix-community",
|
||||||
"repo": "flake-compat",
|
"repo": "flake-compat",
|
||||||
"rev": "f387cd2afec9419c8ee37694406ca490c3f34ee5",
|
"rev": "0f158086a2ecdbb138cd0429410e44994f1b7e4b",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "edolstra",
|
"owner": "nix-community",
|
||||||
|
"repo": "flake-compat",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-compat_2": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1767039857,
|
||||||
|
"narHash": "sha256-vNpUSpF5Nuw8xvDLj2KCwwksIbjua2LZCqhV1LNRDns=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "flake-compat",
|
||||||
|
"rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
"repo": "flake-compat",
|
"repo": "flake-compat",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
@@ -145,11 +181,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1765835352,
|
"lastModified": 1778716662,
|
||||||
"narHash": "sha256-XswHlK/Qtjasvhd1nOa1e8MgZ8GS//jBoTqWtrS1Giw=",
|
"narHash": "sha256-m1Yf0wZ8j1OHjTc2UwHwyQRSnNeSgLJOd7q5Y45hzi4=",
|
||||||
"owner": "hercules-ci",
|
"owner": "hercules-ci",
|
||||||
"repo": "flake-parts",
|
"repo": "flake-parts",
|
||||||
"rev": "a34fae9c08a15ad73f295041fec82323541400a9",
|
"rev": "f7c1a2d347e4c52d5fb8d10cb4d94b5884e546fb",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -193,6 +229,24 @@
|
|||||||
"url": "https://flakehub.com/f/DeterminateSystems/flake-schemas/%3D0.1.5.tar.gz"
|
"url": "https://flakehub.com/f/DeterminateSystems/flake-schemas/%3D0.1.5.tar.gz"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"flake-utils": {
|
||||||
|
"inputs": {
|
||||||
|
"systems": "systems_6"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1731533236,
|
||||||
|
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"gitignore": {
|
"gitignore": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"nixpkgs": [
|
"nixpkgs": [
|
||||||
@@ -256,6 +310,27 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"hypr-dynamic-cursors": {
|
||||||
|
"inputs": {
|
||||||
|
"hyprland": [
|
||||||
|
"hyprland"
|
||||||
|
],
|
||||||
|
"nixpkgs": "nixpkgs"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1779050734,
|
||||||
|
"narHash": "sha256-uE/I8TrhVEyQJb8t+HeHNYQRv7VlwbZxXlTrMfP0x/A=",
|
||||||
|
"owner": "Virtcode",
|
||||||
|
"repo": "hypr-dynamic-cursors",
|
||||||
|
"rev": "39fe4ab66b45b011667f548d759d58e707521378",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "Virtcode",
|
||||||
|
"repo": "hypr-dynamic-cursors",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"hyprcursor": {
|
"hyprcursor": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"hyprlang": [
|
"hyprlang": [
|
||||||
@@ -272,11 +347,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1753964049,
|
"lastModified": 1776511930,
|
||||||
"narHash": "sha256-lIqabfBY7z/OANxHoPeIrDJrFyYy9jAM4GQLzZ2feCM=",
|
"narHash": "sha256-fCpwFiTW0rT7oKJqr3cqHMnkwypSwQKpbtUEtxdkgrM=",
|
||||||
"owner": "hyprwm",
|
"owner": "hyprwm",
|
||||||
"repo": "hyprcursor",
|
"repo": "hyprcursor",
|
||||||
"rev": "44e91d467bdad8dcf8bbd2ac7cf49972540980a5",
|
"rev": "39435900785d0c560c6ae8777d29f28617d031ef",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -301,11 +376,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1763733840,
|
"lastModified": 1776426399,
|
||||||
"narHash": "sha256-JnET78yl5RvpGuDQy3rCycOCkiKoLr5DN1fPhRNNMco=",
|
"narHash": "sha256-RUESLKNikIeEq9ymGJ6nmcDXiSFQpUW1IhJ245nL3xM=",
|
||||||
"owner": "hyprwm",
|
"owner": "hyprwm",
|
||||||
"repo": "hyprgraphics",
|
"repo": "hyprgraphics",
|
||||||
"rev": "8f1bec691b2d198c60cccabca7a94add2df4ed1a",
|
"rev": "68d064434787cf1ed4a2fe257c03c5f52f33cf84",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -333,11 +408,11 @@
|
|||||||
"xdph": "xdph"
|
"xdph": "xdph"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1767300597,
|
"lastModified": 1779983308,
|
||||||
"narHash": "sha256-lGE1j1bEuNp7XoDP+oyyF/c+MzYAs6S+sz0NK71nXZE=",
|
"narHash": "sha256-mvjt5EqRubXF5w1RnyLsWOduJQzHDZCjohWJz/TUvJM=",
|
||||||
"ref": "refs/heads/main",
|
"ref": "refs/heads/main",
|
||||||
"rev": "31d3181e1ee91e338fb4fb8207d64b8d689310fc",
|
"rev": "ebc1816dfb27f1091c9713876669e092a215382d",
|
||||||
"revCount": 6766,
|
"revCount": 7376,
|
||||||
"submodules": true,
|
"submodules": true,
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/hyprwm/Hyprland"
|
"url": "https://github.com/hyprwm/Hyprland"
|
||||||
@@ -381,11 +456,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1765643131,
|
"lastModified": 1776426575,
|
||||||
"narHash": "sha256-CCGohW5EBIRy4B7vTyBMqPgsNcaNenVad/wszfddET0=",
|
"narHash": "sha256-KI6nIfVihn/DPaeB5Et46Xg3dkNHrrEtUd5LBBVomB0=",
|
||||||
"owner": "hyprwm",
|
"owner": "hyprwm",
|
||||||
"repo": "hyprland-guiutils",
|
"repo": "hyprland-guiutils",
|
||||||
"rev": "e50ae912813bdfa8372d62daf454f48d6df02297",
|
"rev": "a968d211048e3ed538e47b84cb3649299578f19d",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -411,11 +486,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1767304464,
|
"lastModified": 1779209205,
|
||||||
"narHash": "sha256-HsdfmPf5291Y3yXScMoj53P/9SS1DK3KgbprBuR8A4k=",
|
"narHash": "sha256-asc7NpeB8vD66gvZeYcQkaWOs2X6Jgd29vBtP17vjxo=",
|
||||||
"owner": "hyprwm",
|
"owner": "hyprwm",
|
||||||
"repo": "hyprland-plugins",
|
"repo": "hyprland-plugins",
|
||||||
"rev": "7a8521112361997d071fd1fef06d6becc7e53240",
|
"rev": "1cb37fad68dff5f5840010c314fed5809b4ee66f",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -436,11 +511,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1765214753,
|
"lastModified": 1772460177,
|
||||||
"narHash": "sha256-P9zdGXOzToJJgu5sVjv7oeOGPIIwrd9hAUAP3PsmBBs=",
|
"narHash": "sha256-/6G/MsPvtn7bc4Y32pserBT/Z4SUUdBd4XYJpOEKVR4=",
|
||||||
"owner": "hyprwm",
|
"owner": "hyprwm",
|
||||||
"repo": "hyprland-protocols",
|
"repo": "hyprland-protocols",
|
||||||
"rev": "3f3860b869014c00e8b9e0528c7b4ddc335c21ab",
|
"rev": "1cb6db5fd6bb8aee419f4457402fa18293ace917",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -465,11 +540,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1764612430,
|
"lastModified": 1777320127,
|
||||||
"narHash": "sha256-54ltTSbI6W+qYGMchAgCR6QnC1kOdKXN6X6pJhOWxFg=",
|
"narHash": "sha256-Qu+Wf2Bp5qUjyn2YpZNq8a7JyzTGowhT1knrwE38a9U=",
|
||||||
"owner": "hyprwm",
|
"owner": "hyprwm",
|
||||||
"repo": "hyprlang",
|
"repo": "hyprlang",
|
||||||
"rev": "0d00dc118981531aa731150b6ea551ef037acddd",
|
"rev": "090117506ddc3d7f26e650ff344d378c2ec329cc",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -478,18 +553,40 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"hyprspace": {
|
||||||
|
"inputs": {
|
||||||
|
"hyprland": [
|
||||||
|
"hyprland"
|
||||||
|
],
|
||||||
|
"systems": "systems_3"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1775071961,
|
||||||
|
"narHash": "sha256-LXkeeH9Blr6ohS1LAsVZbkJ/EAkkMDATh5qu45hC7Zo=",
|
||||||
|
"owner": "KZDKM",
|
||||||
|
"repo": "Hyprspace",
|
||||||
|
"rev": "12ddde04f8584bf7de3151e6169918e0dda9f822",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "KZDKM",
|
||||||
|
"repo": "Hyprspace",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"hyprsplit": {
|
"hyprsplit": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"hyprland": [
|
"hyprland": [
|
||||||
"hyprland"
|
"hyprland"
|
||||||
]
|
],
|
||||||
|
"nixpkgs": "nixpkgs_2"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1766546378,
|
"lastModified": 1779414137,
|
||||||
"narHash": "sha256-GSoSLHErh1mRfgXM57W98L67MMBHKCemHzxoZPrejSI=",
|
"narHash": "sha256-XpwuFhwnfwPbzImZeUWWns///UEpoKNkpl1hN90C3Ag=",
|
||||||
"owner": "shezdy",
|
"owner": "shezdy",
|
||||||
"repo": "hyprsplit",
|
"repo": "hyprsplit",
|
||||||
"rev": "9a8b55f4269bfa5c59d03ed9f4502f433572c616",
|
"rev": "0fc01e7930625ecb3e069f5dc8e1d61eab929f3b",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -537,11 +634,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1764592794,
|
"lastModified": 1772462885,
|
||||||
"narHash": "sha256-7CcO+wbTJ1L1NBQHierHzheQGPWwkIQug/w+fhTAVuU=",
|
"narHash": "sha256-5pHXrQK9zasMnIo6yME6EOXmWGFMSnCITcfKshhKJ9I=",
|
||||||
"owner": "hyprwm",
|
"owner": "hyprwm",
|
||||||
"repo": "hyprtoolkit",
|
"repo": "hyprtoolkit",
|
||||||
"rev": "5cfe0743f0e608e1462972303778d8a0859ee63e",
|
"rev": "9af245a69fa6b286b88ddfc340afd288e00a6998",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -562,11 +659,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1766160771,
|
"lastModified": 1779475241,
|
||||||
"narHash": "sha256-roINUGikWRqqgKrD4iotKbGj3ZKJl3hjMz5l/SyKrHw=",
|
"narHash": "sha256-Nw4DN0A5krWNcPBvuWe5Gz2yuxsUUPiDgtu6SVPJQeU=",
|
||||||
"owner": "hyprwm",
|
"owner": "hyprwm",
|
||||||
"repo": "hyprutils",
|
"repo": "hyprutils",
|
||||||
"rev": "5ac060bfcf2f12b3a6381156ebbc13826a05b09f",
|
"rev": "3cd3972b2ee658a14d2610d8494e09259e530124",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -587,11 +684,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1763640274,
|
"lastModified": 1777159683,
|
||||||
"narHash": "sha256-Uan1Nl9i4TF/kyFoHnTq1bd/rsWh4GAK/9/jDqLbY5A=",
|
"narHash": "sha256-Jxixw6wZphUp+nHYxOKUYSckL17QMBx2d5Zp0rJHr1g=",
|
||||||
"owner": "hyprwm",
|
"owner": "hyprwm",
|
||||||
"repo": "hyprwayland-scanner",
|
"repo": "hyprwayland-scanner",
|
||||||
"rev": "f6cf414ca0e16a4d30198fd670ec86df3c89f671",
|
"rev": "b8632713a6beaf28b56f2a7b0ab2fb7088dbb404",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -616,11 +713,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1766253200,
|
"lastModified": 1778410714,
|
||||||
"narHash": "sha256-26qPwrd3od+xoYVywSB7hC2cz9ivN46VPLlrsXyGxvE=",
|
"narHash": "sha256-o6RzFj4nJXaPRY7EM01siuCQeT41RfwwmcmFQqwFJJg=",
|
||||||
"owner": "hyprwm",
|
"owner": "hyprwm",
|
||||||
"repo": "hyprwire",
|
"repo": "hyprwire",
|
||||||
"rev": "1079777525b30a947c8d657fac158e00ae85de9d",
|
"rev": "85148a8e612808cf5ddb25d0b3c5840f3498a7dc",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -651,6 +748,27 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"matugen": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
],
|
||||||
|
"systems": "systems_4"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1780068618,
|
||||||
|
"narHash": "sha256-LFiV5gdD4MkPrzBrc3Lq966vTQGuwwXC5WkgglWz7i4=",
|
||||||
|
"owner": "InioX",
|
||||||
|
"repo": "Matugen",
|
||||||
|
"rev": "74bfe9369a46589c5048072142796343a8d74168",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "InioX",
|
||||||
|
"repo": "Matugen",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"nix-github-actions": {
|
"nix-github-actions": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"nixpkgs": [
|
"nixpkgs": [
|
||||||
@@ -684,11 +802,11 @@
|
|||||||
"rust-overlay": "rust-overlay_2"
|
"rust-overlay": "rust-overlay_2"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1766882181,
|
"lastModified": 1779062503,
|
||||||
"narHash": "sha256-Xmu3JL68gT623ySytIOoyKqoH0tj3qhtNOnT79RRews=",
|
"narHash": "sha256-CYyaA/qV6TzccHJuEwi8LE9x/rVpMAFztsymq+HYsQ8=",
|
||||||
"ref": "refs/heads/master",
|
"ref": "refs/heads/master",
|
||||||
"rev": "ddb728dae4c9d6842664395635c9d55fb65c8b56",
|
"rev": "4fd264f24fdf87d701ec82e7c6a4ca3e15c1c0aa",
|
||||||
"revCount": 78,
|
"revCount": 79,
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://git.sakamoto.dev/kenji/nixovim.git"
|
"url": "https://git.sakamoto.dev/kenji/nixovim.git"
|
||||||
},
|
},
|
||||||
@@ -699,16 +817,16 @@
|
|||||||
},
|
},
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1744536153,
|
"lastModified": 1768127708,
|
||||||
"narHash": "sha256-awS2zRgF4uTwrOKwwiJcByDzDOdo3Q1rPZbiHQg/N38=",
|
"narHash": "sha256-1Sm77VfZh3mU0F5OqKABNLWxOuDeHIlcFjsXeeiPazs=",
|
||||||
"owner": "NixOS",
|
"owner": "nixos",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "18dd725c29603f582cf1900e0d25f9f1063dbf11",
|
"rev": "ffbc9f8cbaacfb331b6017d5a5abb21a492c9a38",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "NixOS",
|
"owner": "nixos",
|
||||||
"ref": "nixpkgs-unstable",
|
"ref": "nixos-unstable",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
@@ -727,11 +845,43 @@
|
|||||||
},
|
},
|
||||||
"nixpkgs_2": {
|
"nixpkgs_2": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1766309749,
|
"lastModified": 1778869304,
|
||||||
"narHash": "sha256-3xY8CZ4rSnQ0NqGhMKAy5vgC+2IVK0NoVEzDoOh4DA4=",
|
"narHash": "sha256-30sZNZoA1cqF5JNO9fVX+wgiQYjB7HJqqJ4ztCDeBZE=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816",
|
"rev": "d233902339c02a9c334e7e593de68855ad26c4cb",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixos-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs_3": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1744536153,
|
||||||
|
"narHash": "sha256-awS2zRgF4uTwrOKwwiJcByDzDOdo3Q1rPZbiHQg/N38=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "18dd725c29603f582cf1900e0d25f9f1063dbf11",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixpkgs-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs_4": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1778869304,
|
||||||
|
"narHash": "sha256-30sZNZoA1cqF5JNO9fVX+wgiQYjB7HJqqJ4ztCDeBZE=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "d233902339c02a9c334e7e593de68855ad26c4cb",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -748,14 +898,14 @@
|
|||||||
"nixovim",
|
"nixovim",
|
||||||
"nixpkgs"
|
"nixpkgs"
|
||||||
],
|
],
|
||||||
"systems": "systems_3"
|
"systems": "systems_5"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1766443759,
|
"lastModified": 1779023681,
|
||||||
"narHash": "sha256-iGDhUPOPyY9NOTNHkhNzZKoz3+OlBNGg451qtvPq/Ic=",
|
"narHash": "sha256-K7RLGyiK3J6wHr/JDxXdlGF0+0DEsdBf1w9mXjSyL8I=",
|
||||||
"owner": "nix-community",
|
"owner": "nix-community",
|
||||||
"repo": "nixvim",
|
"repo": "nixvim",
|
||||||
"rev": "1787eeda5a2ce35bcd57dbb482718b0d897786ae",
|
"rev": "0d05726bfb060f6559f6d64c1d427f3663dba178",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -787,7 +937,7 @@
|
|||||||
},
|
},
|
||||||
"pre-commit-hooks": {
|
"pre-commit-hooks": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"flake-compat": "flake-compat",
|
"flake-compat": "flake-compat_2",
|
||||||
"gitignore": "gitignore",
|
"gitignore": "gitignore",
|
||||||
"nixpkgs": [
|
"nixpkgs": [
|
||||||
"hyprland",
|
"hyprland",
|
||||||
@@ -795,11 +945,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1765911976,
|
"lastModified": 1778507602,
|
||||||
"narHash": "sha256-t3T/xm8zstHRLx+pIHxVpQTiySbKqcQbK+r+01XVKc0=",
|
"narHash": "sha256-kTwur1wV+01SdqskVMSo6JMEpg71ps3HpbFY2GsflKs=",
|
||||||
"owner": "cachix",
|
"owner": "cachix",
|
||||||
"repo": "git-hooks.nix",
|
"repo": "git-hooks.nix",
|
||||||
"rev": "b68b780b69702a090c8bb1b973bab13756cc7a27",
|
"rev": "61ab0e80d9c7ab14c256b5b453d8b3fb0189ba0a",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -810,17 +960,22 @@
|
|||||||
},
|
},
|
||||||
"root": {
|
"root": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
|
"apple-silicon": "apple-silicon",
|
||||||
"chaotic": "chaotic",
|
"chaotic": "chaotic",
|
||||||
"elephant": "elephant",
|
"elephant": "elephant",
|
||||||
"home-manager": "home-manager_2",
|
"home-manager": "home-manager_2",
|
||||||
|
"hypr-dynamic-cursors": "hypr-dynamic-cursors",
|
||||||
"hyprland": "hyprland",
|
"hyprland": "hyprland",
|
||||||
"hyprland-plugins": "hyprland-plugins",
|
"hyprland-plugins": "hyprland-plugins",
|
||||||
|
"hyprspace": "hyprspace",
|
||||||
"hyprsplit": "hyprsplit",
|
"hyprsplit": "hyprsplit",
|
||||||
|
"matugen": "matugen",
|
||||||
"nixovim": "nixovim",
|
"nixovim": "nixovim",
|
||||||
"nixpkgs": "nixpkgs_2",
|
"nixpkgs": "nixpkgs_4",
|
||||||
"nur": "nur",
|
"nur": "nur",
|
||||||
"sops-nix": "sops-nix",
|
"sops-nix": "sops-nix",
|
||||||
"textfox": "textfox",
|
"textfox": "textfox",
|
||||||
|
"unlisted-fonts": "unlisted-fonts",
|
||||||
"vicinae": "vicinae",
|
"vicinae": "vicinae",
|
||||||
"walker": "walker"
|
"walker": "walker"
|
||||||
}
|
}
|
||||||
@@ -848,7 +1003,7 @@
|
|||||||
},
|
},
|
||||||
"rust-overlay_2": {
|
"rust-overlay_2": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"nixpkgs": "nixpkgs"
|
"nixpkgs": "nixpkgs_3"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1766544144,
|
"lastModified": 1766544144,
|
||||||
@@ -871,11 +1026,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1766289575,
|
"lastModified": 1777944972,
|
||||||
"narHash": "sha256-BOKCwOQQIP4p9z8DasT5r+qjri3x7sPCOq+FTjY8Z+o=",
|
"narHash": "sha256-VfGRo1qTBKOe3s2gOv8LSoA6Fk19PvBlwQ1ECN0Evn8=",
|
||||||
"owner": "Mic92",
|
"owner": "Mic92",
|
||||||
"repo": "sops-nix",
|
"repo": "sops-nix",
|
||||||
"rev": "9836912e37aef546029e48c8749834735a6b9dad",
|
"rev": "c591bf665727040c6cc5cb409079acb22dcce33c",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -916,20 +1071,35 @@
|
|||||||
},
|
},
|
||||||
"systems_3": {
|
"systems_3": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1681028828,
|
"lastModified": 1689347949,
|
||||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
"narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=",
|
||||||
"owner": "nix-systems",
|
"owner": "nix-systems",
|
||||||
"repo": "default",
|
"repo": "default-linux",
|
||||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
"rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "nix-systems",
|
"owner": "nix-systems",
|
||||||
"repo": "default",
|
"repo": "default-linux",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"systems_4": {
|
"systems_4": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1689347949,
|
||||||
|
"narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default-linux",
|
||||||
|
"rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default-linux",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems_5": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1681028828,
|
"lastModified": 1681028828,
|
||||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
@@ -944,7 +1114,37 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"systems_5": {
|
"systems_6": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems_7": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems_8": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1689347949,
|
"lastModified": 1689347949,
|
||||||
"narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=",
|
"narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=",
|
||||||
@@ -967,11 +1167,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1763730250,
|
"lastModified": 1767427579,
|
||||||
"narHash": "sha256-OPlKRltdA2iIm70Nw/kWt5FnwxR1xmxC44tqGUX7Hro=",
|
"narHash": "sha256-q9aFfPohbMS6ehkQHReMeIjtld0wGiUsxlHoPRRvsp4=",
|
||||||
"owner": "adriankarlen",
|
"owner": "adriankarlen",
|
||||||
"repo": "textfox",
|
"repo": "textfox",
|
||||||
"rev": "2f385d16abab56984b874627ca0dd4f3ca7ae4ac",
|
"rev": "29c31979e5583d9367247f0af8675f88482ff481",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -980,19 +1180,40 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"unlisted-fonts": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-utils": "flake-utils",
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1748987994,
|
||||||
|
"narHash": "sha256-13QQRwZx9tRDmL79+XBM1YaC4W68mVrVW2NCv2w25WA=",
|
||||||
|
"ref": "refs/heads/master",
|
||||||
|
"rev": "468d51f24d3dd22c543e657c359fb333ff4df726",
|
||||||
|
"revCount": 1,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.sakamoto.dev/kenji/nix-fonts.git"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.sakamoto.dev/kenji/nix-fonts.git"
|
||||||
|
}
|
||||||
|
},
|
||||||
"vicinae": {
|
"vicinae": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"nixpkgs": [
|
"nixpkgs": [
|
||||||
"nixpkgs"
|
"nixpkgs"
|
||||||
],
|
],
|
||||||
"systems": "systems_4"
|
"systems": "systems_7"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1767353605,
|
"lastModified": 1779832601,
|
||||||
"narHash": "sha256-j2nuPawvb33wjTV93htSiMRxGeTLLrKhwOEqmmTu5uY=",
|
"narHash": "sha256-/dtn1sOTEcb/rNInzkdnK8PNIIDfQi7fEJfQEq+Is4g=",
|
||||||
"owner": "vicinaehq",
|
"owner": "vicinaehq",
|
||||||
"repo": "vicinae",
|
"repo": "vicinae",
|
||||||
"rev": "d89a9c9656486de144fd035bea7c2ea3b97fedf8",
|
"rev": "dc1f7d47725c68debdb31be26781a96c14bac059",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -1009,7 +1230,7 @@
|
|||||||
"nixpkgs": [
|
"nixpkgs": [
|
||||||
"nixpkgs"
|
"nixpkgs"
|
||||||
],
|
],
|
||||||
"systems": "systems_5"
|
"systems": "systems_8"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1766324177,
|
"lastModified": 1766324177,
|
||||||
@@ -1053,11 +1274,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1761431178,
|
"lastModified": 1778265244,
|
||||||
"narHash": "sha256-xzjC1CV3+wpUQKNF+GnadnkeGUCJX+vgaWIZsnz9tzI=",
|
"narHash": "sha256-8jlPtGSsv/CQY6tVVyLF4Jjd0gnS+Zbn9yk/V13A9nM=",
|
||||||
"owner": "hyprwm",
|
"owner": "hyprwm",
|
||||||
"repo": "xdg-desktop-portal-hyprland",
|
"repo": "xdg-desktop-portal-hyprland",
|
||||||
"rev": "4b8801228ff958d028f588f0c2b911dbf32297f9",
|
"rev": "813ea5ca9a1702a9a2d1f5836bc00172ef698968",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|||||||
@@ -34,6 +34,14 @@
|
|||||||
url = "github:hyprwm/hyprland-plugins";
|
url = "github:hyprwm/hyprland-plugins";
|
||||||
inputs.hyprland.follows = "hyprland";
|
inputs.hyprland.follows = "hyprland";
|
||||||
};
|
};
|
||||||
|
hyprspace = {
|
||||||
|
url = "github:KZDKM/Hyprspace";
|
||||||
|
inputs.hyprland.follows = "hyprland";
|
||||||
|
};
|
||||||
|
hypr-dynamic-cursors = {
|
||||||
|
url = "github:Virtcode/hypr-dynamic-cursors";
|
||||||
|
inputs.hyprland.follows = "hyprland";
|
||||||
|
};
|
||||||
nixovim = {
|
nixovim = {
|
||||||
# FIXME: treesitter does not install automatically (disabled due to read-only problems)
|
# FIXME: treesitter does not install automatically (disabled due to read-only problems)
|
||||||
url = "git+https://git.sakamoto.dev/kenji/nixovim.git";
|
url = "git+https://git.sakamoto.dev/kenji/nixovim.git";
|
||||||
@@ -52,6 +60,21 @@
|
|||||||
url = "github:vicinaehq/vicinae";
|
url = "github:vicinaehq/vicinae";
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
};
|
};
|
||||||
|
apple-silicon = {
|
||||||
|
url = "github:tpwrules/nixos-apple-silicon";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
unlisted-fonts = {
|
||||||
|
url = "git+https://git.sakamoto.dev/kenji/nix-fonts.git";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
# TODO: unstable.nixpkgs `matugen` is stuck at v4.0.0
|
||||||
|
# may need to use `git` version first
|
||||||
|
matugen = {
|
||||||
|
url = "github:/InioX/Matugen";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
# ...
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
outputs = {
|
outputs = {
|
||||||
@@ -62,26 +85,44 @@
|
|||||||
chaotic,
|
chaotic,
|
||||||
sops-nix,
|
sops-nix,
|
||||||
textfox,
|
textfox,
|
||||||
|
apple-silicon,
|
||||||
...
|
...
|
||||||
} @ inputs: let
|
} @ inputs: let
|
||||||
config = import ./config.nix;
|
allConfig = import ./config.nix;
|
||||||
system = "x86_64-linux";
|
|
||||||
args =
|
|
||||||
{
|
|
||||||
inherit inputs system;
|
|
||||||
}
|
|
||||||
// config;
|
|
||||||
in {
|
in {
|
||||||
nixosConfigurations = {
|
nixosConfigurations = {
|
||||||
hakase = nixpkgs.lib.nixosSystem {
|
hakase = nixpkgs.lib.nixosSystem {
|
||||||
specialArgs = args;
|
system = "x86_64-linux";
|
||||||
|
specialArgs =
|
||||||
|
{
|
||||||
|
inherit inputs;
|
||||||
|
system = "x86_64-linux";
|
||||||
|
}
|
||||||
|
// allConfig.hakase;
|
||||||
modules = [
|
modules = [
|
||||||
|
inputs.matugen.nixosModules.default
|
||||||
home-manager.nixosModules.home-manager
|
home-manager.nixosModules.home-manager
|
||||||
sops-nix.nixosModules.sops
|
sops-nix.nixosModules.sops
|
||||||
chaotic.nixosModules.default
|
chaotic.nixosModules.default
|
||||||
./hosts/hakase/configuration.nix
|
./hosts/hakase/configuration.nix
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
macbook = nixpkgs.lib.nixosSystem {
|
||||||
|
system = "aarch64-linux";
|
||||||
|
specialArgs =
|
||||||
|
{
|
||||||
|
inherit inputs;
|
||||||
|
system = "aarch64-linux";
|
||||||
|
}
|
||||||
|
// allConfig.macbook;
|
||||||
|
modules = [
|
||||||
|
home-manager.nixosModules.home-manager
|
||||||
|
sops-nix.nixosModules.sops
|
||||||
|
apple-silicon.nixosModules.apple-silicon-support
|
||||||
|
./hosts/macbook/configuration.nix
|
||||||
|
];
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
}: {
|
}: {
|
||||||
imports = [
|
imports = [
|
||||||
../modules/home/terminal.nix
|
../modules/home/terminal.nix
|
||||||
|
# ../modules/home/flatpak.nix
|
||||||
../modules/home/apps.nix
|
../modules/home/apps.nix
|
||||||
../modules/home/apps-optional.nix
|
../modules/home/apps-optional.nix
|
||||||
../modules/home/hyprland.nix
|
../modules/home/hyprland.nix
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
inputs,
|
||||||
|
config,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
imports = [
|
||||||
|
../modules/home/terminal.nix
|
||||||
|
../modules/home/apps.nix
|
||||||
|
../modules/home/apps-optional.nix
|
||||||
|
../modules/home/hyprland.nix
|
||||||
|
../modules/home/waybar.nix
|
||||||
|
../modules/home/theme.nix
|
||||||
|
../modules/home/music.nix
|
||||||
|
# No gaming.nix for MacBook
|
||||||
|
inputs.walker.homeManagerModules.default
|
||||||
|
inputs.sops-nix.homeManagerModules.sops
|
||||||
|
inputs.vicinae.homeManagerModules.default
|
||||||
|
];
|
||||||
|
|
||||||
|
home.sessionVariables = {
|
||||||
|
};
|
||||||
|
|
||||||
|
home.stateVersion = "25.05";
|
||||||
|
}
|
||||||
@@ -8,5 +8,7 @@
|
|||||||
../../modules/nixos/default.nix
|
../../modules/nixos/default.nix
|
||||||
../../modules/nixos/hyprland.nix
|
../../modules/nixos/hyprland.nix
|
||||||
../../modules/nixos/gaming.nix
|
../../modules/nixos/gaming.nix
|
||||||
|
../../modules/nixos/amd.nix
|
||||||
|
../../modules/nixos/amdcpu.nix
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
myConfig,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
imports = [
|
||||||
|
./hardware-configuration.nix
|
||||||
|
../../modules/nixos/default.nix
|
||||||
|
../../modules/nixos/hyprland.nix
|
||||||
|
# No gaming.nix (Steam is x86 only)
|
||||||
|
# No amd.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
# Apple Silicon specific hardware tweaks
|
||||||
|
hardware.asahi = {
|
||||||
|
# peripheralFirmwareDirectory = ./firmware; # If you have extracted firmware
|
||||||
|
useExperimentalGPUDriver = true;
|
||||||
|
experimentalGPUInstallMode = "replace";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Bootloader for Asahi is usually systemd-boot or grub, but asahi-module handles m1n1
|
||||||
|
boot.loader.systemd-boot.enable = true;
|
||||||
|
boot.loader.efi.canTouchEfiVariables = false; # Asahi often prefers this false to avoid bricking nvram
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||||
|
# and may be overwritten by future invocations. Please make changes
|
||||||
|
# to /etc/nixos/configuration.nix instead.
|
||||||
|
{ config, lib, pkgs, modulesPath, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports =
|
||||||
|
[ (modulesPath + "/installer/scan/not-detected.nix")
|
||||||
|
];
|
||||||
|
|
||||||
|
boot.initrd.availableKernelModules = [ "usb_storage" ];
|
||||||
|
boot.initrd.kernelModules = [ ];
|
||||||
|
boot.kernelModules = [ ];
|
||||||
|
boot.extraModulePackages = [ ];
|
||||||
|
|
||||||
|
fileSystems."/" =
|
||||||
|
{ device = "/dev/disk/by-uuid/00000000-0000-0000-0000-000000000000";
|
||||||
|
fsType = "ext4";
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/boot" =
|
||||||
|
{ device = "/dev/disk/by-uuid/0000-0000";
|
||||||
|
fsType = "vfat";
|
||||||
|
};
|
||||||
|
|
||||||
|
swapDevices = [ ];
|
||||||
|
|
||||||
|
networking.useDHCP = lib.mkDefault true;
|
||||||
|
nixpkgs.hostPlatform = lib.mkDefault "aarch64-linux";
|
||||||
|
}
|
||||||
@@ -1,9 +1,21 @@
|
|||||||
{
|
{pkgs, ...}: {
|
||||||
imports = [
|
imports = [
|
||||||
../../apps/btop
|
../../apps/btop
|
||||||
|
../../apps/bottom
|
||||||
|
../../apps/anki
|
||||||
|
../../apps/gemini
|
||||||
../../apps/jellyfin
|
../../apps/jellyfin
|
||||||
../../apps/tickrs
|
../../apps/tickrs
|
||||||
../../apps/claude
|
../../apps/claude
|
||||||
../../apps/delfin
|
../../apps/delfin
|
||||||
|
../../apps/jellyfin-mpv-shim
|
||||||
|
../../apps/nextcloud
|
||||||
|
../../apps/ttyper
|
||||||
|
../../apps/libreoffice
|
||||||
|
];
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
chromium
|
||||||
|
imagemagick
|
||||||
|
hidapitester
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
../../apps/yazi
|
../../apps/yazi
|
||||||
../../apps/gemini
|
|
||||||
../../apps/firefox
|
../../apps/firefox
|
||||||
../../apps/loupe
|
../../apps/imv
|
||||||
|
../../apps/zathura
|
||||||
../../apps/mpv
|
../../apps/mpv
|
||||||
../../apps/mako
|
../../apps/mako
|
||||||
# ../../apps/starship
|
# ../../apps/starship
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
{pkgs, ...}: let
|
||||||
|
flatpak-install = pkgs.writeShellScriptBin "flatpak-install" ''
|
||||||
|
flatpak install --user --bundle "$1"
|
||||||
|
echo
|
||||||
|
read -p "Press Enter to close..."
|
||||||
|
'';
|
||||||
|
in {
|
||||||
|
home.packages = [flatpak-install];
|
||||||
|
|
||||||
|
xdg.mimeApps = {
|
||||||
|
enable = true;
|
||||||
|
defaultApplications = {
|
||||||
|
"application/vnd.flatpak" = "flatpak-bundle-installer.desktop";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
xdg.desktopEntries.flatpak-bundle-installer = {
|
||||||
|
name = "Flatpak Bundle Installer";
|
||||||
|
exec = "flatpak-install %f";
|
||||||
|
terminal = true;
|
||||||
|
noDisplay = true;
|
||||||
|
type = "Application";
|
||||||
|
mimeType = ["application/vnd.flatpak"];
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -1,8 +1,58 @@
|
|||||||
{pkgs, ...}: {
|
{
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
myConfig,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
gamingMonitor = "DP-1";
|
||||||
|
|
||||||
|
gaming-focus = pkgs.writeShellScriptBin "gaming-focus" ''
|
||||||
|
# If already on gaming workspace on the gaming monitor, go back
|
||||||
|
current=$(${pkgs.hyprland}/bin/hyprctl activeworkspace -j | ${pkgs.jq}/bin/jq -r '.name')
|
||||||
|
focused=$(${pkgs.hyprland}/bin/hyprctl monitors -j | ${pkgs.jq}/bin/jq -r '.[] | select(.focused) | .name')
|
||||||
|
if [[ "$current" == "gaming" && "$focused" == "${gamingMonitor}" ]]; then
|
||||||
|
${pkgs.hyprland}/bin/hyprctl dispatch workspace previous
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Close special workspace on gaming monitor if open
|
||||||
|
special=$(${pkgs.hyprland}/bin/hyprctl monitors -j | ${pkgs.jq}/bin/jq -r '.[] | select(.name == "${gamingMonitor}") | .specialWorkspace.name')
|
||||||
|
if [[ -n "$special" ]]; then
|
||||||
|
# Gaming workspace is already underneath — just close the special overlay
|
||||||
|
${pkgs.hyprland}/bin/hyprctl --batch "dispatch focusmonitor ${gamingMonitor};dispatch togglespecialworkspace ''${special#special:}"
|
||||||
|
else
|
||||||
|
${pkgs.hyprland}/bin/hyprctl --batch "dispatch focusmonitor ${gamingMonitor};dispatch workspace name:gaming"
|
||||||
|
fi
|
||||||
|
'';
|
||||||
|
|
||||||
|
# Games that should have `stayfocused` applied (to avoid multi-monitor focus issues)
|
||||||
|
stayFocusedGames = [
|
||||||
|
# "Deadlock"
|
||||||
|
# "project8"
|
||||||
|
# "citadel"
|
||||||
|
];
|
||||||
|
|
||||||
|
mkGameRules = selector: [
|
||||||
|
"match:${selector}, monitor ${gamingMonitor}"
|
||||||
|
"match:${selector}, fullscreen on"
|
||||||
|
"match:${selector}, immediate on"
|
||||||
|
"match:${selector}, tile on"
|
||||||
|
];
|
||||||
|
|
||||||
|
stayFocusedRules = lib.flatten (map (
|
||||||
|
game: [
|
||||||
|
"match:title ^(${game})$, stay_focused on"
|
||||||
|
"match:class ^(${game})$, stay_focused on"
|
||||||
|
]
|
||||||
|
)
|
||||||
|
stayFocusedGames);
|
||||||
|
in {
|
||||||
home.packages = with pkgs; [
|
home.packages = with pkgs; [
|
||||||
protonup-qt
|
protonup-qt
|
||||||
protontricks
|
protontricks
|
||||||
mangohud
|
mangohud
|
||||||
|
gaming-focus
|
||||||
|
# via
|
||||||
];
|
];
|
||||||
|
|
||||||
programs.mangohud = {
|
programs.mangohud = {
|
||||||
@@ -16,4 +66,67 @@
|
|||||||
vram = true;
|
vram = true;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
wayland.windowManager.hyprland.settings = {
|
||||||
|
workspace = [
|
||||||
|
"name:gaming, monitor:${gamingMonitor}, default:true"
|
||||||
|
];
|
||||||
|
|
||||||
|
exec-once = [
|
||||||
|
"[workspace special:steam silent] steam"
|
||||||
|
];
|
||||||
|
|
||||||
|
bindd = [
|
||||||
|
"SUPER, A, Toggle Steam, togglespecialworkspace, steam"
|
||||||
|
"SUPER SHIFT, A, Move to Steam Special Workspace, movetoworkspace, special:steam"
|
||||||
|
"SUPER, G, Switch to Gaming Workspace, exec, gaming-focus"
|
||||||
|
"SUPER SHIFT, G, Move to Gaming Workspace, movetoworkspace, name:gaming"
|
||||||
|
];
|
||||||
|
|
||||||
|
windowrule =
|
||||||
|
[
|
||||||
|
"match:class ^(steam)$, hyprbars:no_bar on"
|
||||||
|
"match:class ^(steam_app_\\d+)$, hyprbars:no_bar on"
|
||||||
|
|
||||||
|
# --- STEAM GENERAL RULES ---
|
||||||
|
# Default ALL steam class windows to float. This catches all dialogs & properties windows.
|
||||||
|
"match:class ^(steam)$, float on"
|
||||||
|
# Suppress focus stealing from dialogs/etc.
|
||||||
|
"match:class ^(steam)$, no_initial_focus on"
|
||||||
|
"match:class ^(steam)$, suppress_event activate fullscreen maximize"
|
||||||
|
|
||||||
|
# --- STEAM CLIENT OVERRIDE ---
|
||||||
|
# Override the float for the main Steam client, tile it, and move it to the special workspace.
|
||||||
|
"match:class ^(steam)$, tile on"
|
||||||
|
"match:class ^(steam)$, workspace special:steam"
|
||||||
|
|
||||||
|
# --- STEAM GAME OVERRIDES ---
|
||||||
|
# Override the float for actual games and move them to the gaming workspace.
|
||||||
|
# 1. Auto-detected steam_app games (like Deadlock).
|
||||||
|
"match:class ^(steam_app_\\d+)$, monitor ${gamingMonitor}"
|
||||||
|
"match:class ^(steam_app_\\d+)$, tile on"
|
||||||
|
"match:class ^(steam_app_\\d+)$, fullscreen on"
|
||||||
|
"match:class ^(steam_app_\\d+)$, immediate on"
|
||||||
|
"match:class ^(steam_app_\\d+)$, workspace name:gaming"
|
||||||
|
|
||||||
|
# 2. Behavior-detected manual games (e.g. ARC Raiders).
|
||||||
|
# This moves any steam game to the gaming workspace and tiles it when it becomes fullscreen.
|
||||||
|
"match:class ^(steam)$, match:fullscreen true, tile on"
|
||||||
|
"match:class ^(steam)$, match:fullscreen true, workspace name:gaming"
|
||||||
|
]
|
||||||
|
# Other auto-detected non-steam games
|
||||||
|
++ (mkGameRules "class ^(gamescope)$")
|
||||||
|
++ (mkGameRules "class ^(lutris)$")
|
||||||
|
++ (mkGameRules "class ^(heroic)$")
|
||||||
|
++ (mkGameRules "class ^wine-.*$")
|
||||||
|
++ (mkGameRules "title ^Wine .*$")
|
||||||
|
++ (mkGameRules "initial_title ^(?i)godot.*$")
|
||||||
|
# ++ [
|
||||||
|
# "monitor 0, initialTitle:^(?i)godot.*$"
|
||||||
|
# "fullscreen, initialTitle:^(?i)godot.*$"
|
||||||
|
# "tile, initialTitle:^(?i)godot.*$"
|
||||||
|
# ]
|
||||||
|
# Stayfocused rules
|
||||||
|
++ stayFocusedRules;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,5 +10,6 @@
|
|||||||
../../apps/tte
|
../../apps/tte
|
||||||
../../apps/swayosd
|
../../apps/swayosd
|
||||||
../../apps/playerctl
|
../../apps/playerctl
|
||||||
|
../../apps/fcitx5
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,4 +31,25 @@ in {
|
|||||||
home.packages = [
|
home.packages = [
|
||||||
launch-music
|
launch-music
|
||||||
];
|
];
|
||||||
|
|
||||||
|
wayland.windowManager.hyprland.settings = {
|
||||||
|
workspace = [
|
||||||
|
"name:music, on-created-empty:hakase-music-launch"
|
||||||
|
];
|
||||||
|
|
||||||
|
bindd = [
|
||||||
|
"SUPER, M, Switch to Music, workspace, name:music"
|
||||||
|
"SUPER SHIFT, M, Move to Music Workspace, movetoworkspace, name:music"
|
||||||
|
];
|
||||||
|
|
||||||
|
windowrule = [
|
||||||
|
# --- MUSIC RULES (Jellyfin-TUI) ---
|
||||||
|
"match:title ^(jellyfin-tui)$, workspace name:music silent"
|
||||||
|
"match:initial_title ^(jellyfin-tui)$, workspace name:music silent"
|
||||||
|
|
||||||
|
# --- CAVA RULES ---
|
||||||
|
"match:title ^(cava)$, workspace name:music silent"
|
||||||
|
"match:initial_title ^(cava)$, workspace name:music silent"
|
||||||
|
];
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,18 @@
|
|||||||
{ pkgs, ... }:
|
{pkgs, ...}: {
|
||||||
{
|
|
||||||
imports = [
|
imports = [
|
||||||
../../apps/matugen
|
../../apps/matugen
|
||||||
];
|
];
|
||||||
|
|
||||||
home.pointerCursor = {
|
home.pointerCursor = {
|
||||||
gtk.enable = true;
|
gtk.enable = true;
|
||||||
package = pkgs.rose-pine-hyprcursor;
|
package = pkgs.bibata-cursors;
|
||||||
name = "rose-pine-hyprcursor";
|
name = "Bibata-Modern-Ice";
|
||||||
size = 24;
|
size = 24;
|
||||||
};
|
};
|
||||||
|
wayland.windowManager.hyprland.settings = {
|
||||||
|
env = [
|
||||||
|
"HYPRCURSOR_THEME,Bibata-Modern-Ice"
|
||||||
|
"HYPRCURSOR_SIZE,24"
|
||||||
|
];
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
{pkgs, ...}: {
|
||||||
|
boot.kernelModules = ["zenpower"];
|
||||||
|
boot.blacklistedKernelModules = ["k10temp"];
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
imports = [
|
||||||
|
../../apps/qmk
|
||||||
|
./asrock-a620i.nix
|
||||||
|
# ../../apps/wireshark
|
||||||
|
];
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
{pkgs, ...}: {
|
||||||
|
# fan setup
|
||||||
|
programs.coolercontrol.enable = true;
|
||||||
|
boot.kernelModules = ["nct6683"];
|
||||||
|
boot.extraModprobeConfig = ''
|
||||||
|
options nct6683 force=1
|
||||||
|
'';
|
||||||
|
}
|
||||||
@@ -2,6 +2,12 @@
|
|||||||
boot = {
|
boot = {
|
||||||
consoleLogLevel = 3;
|
consoleLogLevel = 3;
|
||||||
initrd.verbose = false;
|
initrd.verbose = false;
|
||||||
|
|
||||||
|
# Global kernel parameters
|
||||||
|
kernelParams = [
|
||||||
|
"usbcore.autosuspend=-1" # Disable USB autosuspend to fix keyboard wakeup issues
|
||||||
|
];
|
||||||
|
|
||||||
loader = {
|
loader = {
|
||||||
timeout = 0;
|
timeout = 0;
|
||||||
systemd-boot = {
|
systemd-boot = {
|
||||||
@@ -17,14 +23,13 @@
|
|||||||
initrd = {
|
initrd = {
|
||||||
systemd.enable = true;
|
systemd.enable = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
plymouth = {
|
plymouth = {
|
||||||
enable = true;
|
enable = true;
|
||||||
# themePackages = [
|
themePackages = [
|
||||||
# (pkgs.adi1090x-plymouth-themes.override {
|
(pkgs.callPackage ../../apps/plymouth/theme.nix {})
|
||||||
# selected_themes = ["circle_hud"];
|
];
|
||||||
# })
|
theme = "hakase";
|
||||||
# ];
|
|
||||||
# theme = "circle_hud";
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
{ pkgs, ... }: {
|
||||||
|
# Install btop system-wide with ROCm support for GPU monitoring.
|
||||||
|
environment.systemPackages = [
|
||||||
|
(pkgs.btop.override { rocmSupport = true; })
|
||||||
|
];
|
||||||
|
|
||||||
|
# Create a security wrapper for btop to grant it capabilities
|
||||||
|
# to read CPU power information without running as root.
|
||||||
|
security.wrappers."btop-power" = {
|
||||||
|
source = "${pkgs.btop.override { rocmSupport = true; }}/bin/btop";
|
||||||
|
owner = "root";
|
||||||
|
group = "root";
|
||||||
|
capabilities = "cap_dac_read_search,cap_sys_ptrace+ep";
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -1,7 +1,9 @@
|
|||||||
{pkgs, ...}: {
|
{pkgs, ...}: {
|
||||||
imports = [
|
imports = [
|
||||||
./amd.nix
|
./apps-optional.nix
|
||||||
./backlight.nix
|
./backlight.nix
|
||||||
|
./flatpak.nix
|
||||||
|
./btop.nix
|
||||||
./boot.nix
|
./boot.nix
|
||||||
./fonts.nix
|
./fonts.nix
|
||||||
./hardware.nix
|
./hardware.nix
|
||||||
@@ -10,6 +12,7 @@
|
|||||||
./kernel.nix
|
./kernel.nix
|
||||||
./nix.nix
|
./nix.nix
|
||||||
./power.nix # TODO: this one has to be optional
|
./power.nix # TODO: this one has to be optional
|
||||||
|
./mouse-wakeup.nix
|
||||||
./programs.nix
|
./programs.nix
|
||||||
./security.nix
|
./security.nix
|
||||||
./services.nix
|
./services.nix
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
{pkgs, ...}: {
|
||||||
|
services.flatpak.enable = true;
|
||||||
|
|
||||||
|
# GTK portal required by most Flatpak apps for file chooser and other dialogs
|
||||||
|
xdg.portal.extraPortals = [pkgs.xdg-desktop-portal-gtk];
|
||||||
|
}
|
||||||
@@ -1,5 +1,11 @@
|
|||||||
{pkgs, ...}: {
|
{
|
||||||
|
pkgs,
|
||||||
|
inputs,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
fonts.packages = with pkgs; [
|
fonts.packages = with pkgs; [
|
||||||
|
inputs.unlisted-fonts.packages.${pkgs.system}.monolisa
|
||||||
|
|
||||||
nerd-fonts.fira-code
|
nerd-fonts.fira-code
|
||||||
nerd-fonts.jetbrains-mono
|
nerd-fonts.jetbrains-mono
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,9 @@
|
|||||||
hardware.steam-hardware.enable = true;
|
hardware.steam-hardware.enable = true;
|
||||||
hardware.xpadneo.enable = true; # Xbox controllers via Bluetooth
|
hardware.xpadneo.enable = true; # Xbox controllers via Bluetooth
|
||||||
hardware.uinput.enable = true;
|
hardware.uinput.enable = true;
|
||||||
# services.udev.packages = [pkgs.game-devices-udev-rules];
|
services.udev.packages = [
|
||||||
|
pkgs.game-devices-udev-rules
|
||||||
|
];
|
||||||
|
|
||||||
programs.steam = {
|
programs.steam = {
|
||||||
enable = true;
|
enable = true;
|
||||||
@@ -25,4 +27,3 @@
|
|||||||
# Fix slow Steam Download speeds
|
# Fix slow Steam Download speeds
|
||||||
services.resolved.enable = true;
|
services.resolved.enable = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
useGlobalPkgs = true;
|
useGlobalPkgs = true;
|
||||||
useUserPackages = true;
|
useUserPackages = true;
|
||||||
extraSpecialArgs = specialArgs;
|
extraSpecialArgs = specialArgs;
|
||||||
users.${myConfig.nixos.username} = import ../../home/hakase.nix;
|
users.${myConfig.nixos.username} = import ../../home/${myConfig.nixos.hostname}.nix;
|
||||||
};
|
};
|
||||||
|
|
||||||
imports = [
|
imports = [
|
||||||
|
|||||||
@@ -24,4 +24,12 @@
|
|||||||
default = ["${myConfig.terminal.default}"];
|
default = ["${myConfig.terminal.default}"];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# XDG Desktop Portal - portal packages are in home-manager for proper path resolution
|
||||||
|
xdg.portal.enable = true;
|
||||||
|
|
||||||
|
# Required for portal file chooser integration
|
||||||
|
environment.sessionVariables = {
|
||||||
|
GTK_USE_PORTAL = "1";
|
||||||
|
};
|
||||||
}
|
}
|
||||||
@@ -4,9 +4,12 @@
|
|||||||
kernelParams = [
|
kernelParams = [
|
||||||
"quiet"
|
"quiet"
|
||||||
"splash"
|
"splash"
|
||||||
"intremap=on"
|
"boot.shell_on_fail"
|
||||||
|
"loglevel=3"
|
||||||
|
"rd.systemd.show_status=false"
|
||||||
|
"rd.udev.log_level=3"
|
||||||
"udev.log_priority=3"
|
"udev.log_priority=3"
|
||||||
"rd.systemd.show_status=auto"
|
"intremap=on"
|
||||||
# Security hardening
|
# Security hardening
|
||||||
"slab_nomerge"
|
"slab_nomerge"
|
||||||
"init_on_alloc=1"
|
"init_on_alloc=1"
|
||||||
|
|||||||
@@ -0,0 +1,14 @@
|
|||||||
|
{ lib, myConfig, ... }:
|
||||||
|
|
||||||
|
with lib;
|
||||||
|
let
|
||||||
|
cfg = myConfig.wakeup.mouse or {};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
config = mkIf (cfg.disable or false && cfg.vendor != null && cfg.product != null) {
|
||||||
|
services.udev.extraRules = ''
|
||||||
|
# Disable wakeup for mouse configured in config.nix
|
||||||
|
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="${cfg.vendor}", ATTRS{idProduct}=="${cfg.product}", ATTR{power/wakeup}="disabled"
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -1,10 +1,4 @@
|
|||||||
{pkgs, ...}: {
|
{
|
||||||
# USB wakeup configuration
|
# This file is intentionally left blank.
|
||||||
# services.udev.extraRules = ''
|
# USB wakeup is now handled by modules/nixos/mouse-wakeup.nix
|
||||||
# # Enable keyboard (NuPhy Air96 V2) wakeup from suspend
|
}
|
||||||
# ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="19f5", ATTRS{idProduct}=="3247", ATTR{power/wakeup}="enabled"
|
|
||||||
#
|
|
||||||
# # Disable mouse (Pulsar 8Kdx) wakeup from suspend
|
|
||||||
# ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="3710", ATTRS{idProduct}=="5406", ATTR{power/wakeup}="disabled"
|
|
||||||
# '';
|
|
||||||
}
|
|
||||||
@@ -8,11 +8,11 @@
|
|||||||
enable = true;
|
enable = true;
|
||||||
settings = {
|
settings = {
|
||||||
initial_session = {
|
initial_session = {
|
||||||
command = "${pkgs.hyprland}/bin/Hyprland";
|
command = "${pkgs.uwsm}/bin/start-hyprland";
|
||||||
user = "${myConfig.nixos.username}";
|
user = "${myConfig.nixos.username}";
|
||||||
};
|
};
|
||||||
default_session = {
|
default_session = {
|
||||||
command = "${pkgs.tuigreet}/bin/tuigreet --time --remember --cmd Hyprland";
|
command = "${pkgs.tuigreet}/bin/tuigreet --time --remember --cmd start-hyprland";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@@ -24,11 +24,19 @@
|
|||||||
gnome.gnome-keyring.enable = true;
|
gnome.gnome-keyring.enable = true;
|
||||||
|
|
||||||
# Complements printer support
|
# Complements printer support
|
||||||
printing.enable = true;
|
printing = {
|
||||||
|
enable = true;
|
||||||
|
drivers = with pkgs; [
|
||||||
|
gutenprint
|
||||||
|
cups-filters
|
||||||
|
hplip
|
||||||
|
cups-browsed
|
||||||
|
];
|
||||||
|
};
|
||||||
avahi = {
|
avahi = {
|
||||||
enable = true;
|
enable = true;
|
||||||
nssmdns4 = true;
|
nssmdns4 = true;
|
||||||
openFirewall = false;
|
openFirewall = true;
|
||||||
};
|
};
|
||||||
pipewire = {
|
pipewire = {
|
||||||
enable = true;
|
enable = true;
|
||||||
|
|||||||
@@ -5,12 +5,12 @@
|
|||||||
...
|
...
|
||||||
}: {
|
}: {
|
||||||
users = {
|
users = {
|
||||||
mutableUsers = false;
|
mutableUsers = true;
|
||||||
users = {
|
users = {
|
||||||
${myConfig.nixos.username} = {
|
${myConfig.nixos.username} = {
|
||||||
isNormalUser = true;
|
isNormalUser = true;
|
||||||
extraGroups = ["wheel" "networkmanager" "input" "video"];
|
extraGroups = ["wheel" "networkmanager" "input" "video" "wireshark"];
|
||||||
hashedPasswordFile = config.sops.secrets.default_password.path; # FIXME: may not work!
|
initialPassword = "password";
|
||||||
useDefaultShell = true;
|
useDefaultShell = true;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -3,5 +3,9 @@
|
|||||||
git
|
git
|
||||||
cloudflared
|
cloudflared
|
||||||
cachix
|
cachix
|
||||||
|
appimage-run
|
||||||
|
python314
|
||||||
|
usbutils
|
||||||
|
wireshark
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Get current workspace ID
|
||||||
|
workspace_id=$(hyprctl activeworkspace -j | jq '.id')
|
||||||
|
|
||||||
|
# Get active window info
|
||||||
|
active_window=$(hyprctl activewindow -j)
|
||||||
|
is_floating=$(echo "$active_window" | jq '.floating')
|
||||||
|
|
||||||
|
echo "Current Workspace: $workspace_id"
|
||||||
|
echo "Active Window Floating: $is_floating"
|
||||||
|
|
||||||
|
if [ "$is_floating" == "true" ]; then
|
||||||
|
echo "Switching to Tiled..."
|
||||||
|
# Find a tiled window on the current workspace
|
||||||
|
# We sort by focus history or just pick the first one
|
||||||
|
target_addr=$(hyprctl clients -j | jq -r --argjson ws "$workspace_id" '[.[] | select(.workspace.id == $ws and .floating == false)] | sort_by(.focusHistoryID) | .[0].address')
|
||||||
|
else
|
||||||
|
echo "Switching to Floating..."
|
||||||
|
# Find a floating window on the current workspace
|
||||||
|
target_addr=$(hyprctl clients -j | jq -r --argjson ws "$workspace_id" '[.[] | select(.workspace.id == $ws and .floating == true)] | sort_by(.focusHistoryID) | .[0].address')
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Target Address: $target_addr"
|
||||||
|
|
||||||
|
if [ "$target_addr" != "null" ] && [ -n "$target_addr" ]; then
|
||||||
|
hyprctl dispatch focuswindow address:$target_addr
|
||||||
|
else
|
||||||
|
echo "No target window found."
|
||||||
|
fi
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
hour=$(date +%H)
|
hour=$(date +%H)
|
||||||
# TODO(human): Set your name here
|
|
||||||
name="kenji"
|
name="kenji"
|
||||||
|
|
||||||
if [[ $hour -lt 12 ]]; then
|
if [[ $hour -lt 12 ]]; then
|
||||||
|
|||||||