Add framework keyboard bits, tweak niri, add framework plymouth boot screen

This commit is contained in:
Nathan Anderson 2026-02-09 14:35:01 -07:00
parent 01dbe3cbaf
commit d005f748d3
250 changed files with 1339 additions and 82 deletions

View File

@ -1,3 +1,4 @@
# dotfiles/
.git/
flake.lock
frame12/framework-plymouth-theme

426
WORK_TOOLS_MODULE_DESIGN.md Normal file
View File

@ -0,0 +1,426 @@
# Work Tools Module Design Document
## Overview
A modular NixOS configuration for work-specific development tools and services. This allows clean separation between personal and work machines while enabling easy reuse across multiple work systems.
---
## Module Structure
### Proposed Location
```
shared/modules/work/work_tools.nix
```
This places it in the shared modules directory since it could be used across multiple work machines.
### Alternative Location
```
nate-work/modules/work/work_tools.nix
```
Use this if the tools are specific to a single work environment.
---
## Module Design
### Basic Structure
```nix
{ inputs, lib, config, pkgs, ... }:
let
unstable = import inputs.nixpkgs-unstable {
system = "x86_64-linux";
config.allowUnfree = true;
};
in
{
options.work_tools = {
enable = lib.mkEnableOption "Enable work development tools and services";
enableDocker = lib.mkOption {
type = lib.types.bool;
default = true;
description = "Enable Docker and related containerization tools";
};
enableVirtualization = lib.mkOption {
type = lib.types.bool;
default = true;
description = "Enable QEMU/KVM virtualization";
};
enableGoTools = lib.mkOption {
type = lib.types.bool;
default = true;
description = "Enable Go development toolchain";
};
enableNodeTools = lib.mkOption {
type = lib.types.bool;
default = true;
description = "Enable Node.js development tools";
};
enableDatabaseTools = lib.mkOption {
type = lib.types.bool;
default = true;
description = "Enable database clients and tools";
};
user = lib.mkOption {
type = lib.types.str;
description = "Username for service configurations";
};
};
config = lib.mkIf config.work_tools.enable {
# Docker configuration
virtualisation.docker = lib.mkIf config.work_tools.enableDocker {
enable = true;
enableOnBoot = true;
package = unstable.docker_25;
};
users.groups.docker.members = lib.mkIf config.work_tools.enableDocker
[ config.work_tools.user ];
# Virtualization
virtualisation.libvirtd = lib.mkIf config.work_tools.enableVirtualization {
enable = true;
qemu = {
swtpm.enable = true;
};
};
virtualisation.spiceUSBRedirection.enable =
lib.mkIf config.work_tools.enableVirtualization true;
users.groups.libvirtd.members = lib.mkIf config.work_tools.enableVirtualization
[ config.work_tools.user ];
programs.virt-manager.enable =
lib.mkIf config.work_tools.enableVirtualization true;
# NFS support (if needed for remote dev environments)
boot.initrd.supportedFilesystems = lib.mkIf config.work_tools.enableVirtualization
{ nfs = true; };
# System packages that don't fit into categories
environment.systemPackages = with pkgs; lib.lists.flatten [
(lib.optionals config.work_tools.enableDocker [
docker-compose
])
];
};
}
```
### Home Manager Companion Module
Create a companion home-manager module for user-level packages:
```
shared/modules/work/work_tools_home.nix
```
```nix
{ inputs, lib, config, pkgs, ... }:
let
unstable = import inputs.nixpkgs-unstable {
system = "x86_64-linux";
config.allowUnfree = true;
};
in
{
options.work_tools_home = {
enable = lib.mkEnableOption "Enable work development tools in home";
enableGoTools = lib.mkOption {
type = lib.types.bool;
default = true;
description = "Enable Go development toolchain";
};
enableNodeTools = lib.mkOption {
type = lib.types.bool;
default = true;
description = "Enable Node.js development tools";
};
enableDatabaseTools = lib.mkOption {
type = lib.types.bool;
default = true;
description = "Enable database clients";
};
enableAwsTools = lib.mkOption {
type = lib.types.bool;
default = true;
description = "Enable AWS CLI and related tools";
};
};
config = lib.mkIf config.work_tools_home.enable {
home.packages = with pkgs; lib.lists.flatten [
# Development tools
(lib.optionals config.work_tools_home.enableGoTools [
go
unstable.delve
gotools
go-tools
govulncheck
unstable.golangci-lint
go-swag
gopls
])
(lib.optionals config.work_tools_home.enableNodeTools [
nodejs_24
husky
pnpm
yarn
typescript-language-server
])
(lib.optionals config.work_tools_home.enableDatabaseTools [
mariadb
])
(lib.optionals config.work_tools_home.enableAwsTools [
awscli2
])
# General dev tools
vscode-fhs
jq
gnumake
cmake
gcc
gh
trivy
oxker # docker TUI
# Additional LSPs
yaml-language-server
ltex-ls
];
# Work-specific zsh configuration
programs.zsh.initExtra = lib.mkIf config.work_tools_home.enable ''
# Work environment variables
if [ -f ~/.vasion_env ]; then
source ~/.vasion_env
fi
# Work functions
if [ -f ~/.config/zsh_functions.zsh ]; then
source ~/.config/zsh_functions.zsh
fi
export GOBIN=~/go/bin
export PATH=$PATH:$GOBIN
'';
};
}
```
---
## Integration Steps
### 1. Create the module files
- [ ] Create `shared/modules/work/work_tools.nix`
- [ ] Create `shared/modules/work/work_tools_home.nix`
### 2. Import in nate-work system configuration
In `nate-work/desktop-configuration.nix`:
```nix
imports = [
# ... existing imports
../shared/modules/work/work_tools.nix
];
config = {
# ... existing config
work_tools = {
enable = true;
enableDocker = true;
enableVirtualization = true;
enableGoTools = true;
enableNodeTools = true;
enableDatabaseTools = true;
user = deskCfg.userName;
};
};
```
### 3. Import in nate-work home-manager configuration
In `nate-work/modules/home-manager/home.nix`:
```nix
imports = [
# ... existing imports
../../../shared/modules/work/work_tools_home.nix
];
work_tools_home = {
enable = true;
enableGoTools = true;
enableNodeTools = true;
enableDatabaseTools = true;
enableAwsTools = true;
};
```
### 4. Remove work packages from nirihome.homePackages
Clean up the existing package list by removing packages now provided by work_tools_home.
### 5. Test the configuration
```bash
# Dry-run to check for errors
nix build .#nixosConfigurations.nate-work.config.system.build.toplevel --dry-run
# If successful, rebuild
sudo nixos-rebuild switch --flake .#nate-work
```
---
## Benefits
### Modularity
- Easy to enable/disable categories of tools
- Can be reused across multiple work machines
- Keeps personal configs clean
### Flexibility
- Granular control via boolean flags
- Can enable only needed tool categories
- Easy to add new tool categories
### Maintainability
- Single source of truth for work tools
- Easier to update work tooling across systems
- Clear separation of concerns
---
## Future Enhancements
### Additional Tool Categories
```nix
enablePythonTools = lib.mkOption {
type = lib.types.bool;
default = false;
description = "Enable Python development tools";
};
enableRustTools = lib.mkOption {
type = lib.types.bool;
default = false;
description = "Enable Rust development toolchain";
};
enableCloudTools = lib.mkOption {
type = lib.types.bool;
default = false;
description = "Enable cloud provider CLIs (Azure, GCP)";
};
```
### Company-Specific Customization
```nix
company = lib.mkOption {
type = lib.types.enum [ "vasion" "other" ];
default = "vasion";
description = "Company-specific tool configurations";
};
```
### Environment File Management
Could integrate automated setup of `.vasion_env` or similar:
```nix
work_tools_home.envFile = lib.mkOption {
type = lib.types.nullOr lib.types.path;
default = null;
description = "Path to work environment variables file";
};
```
---
## Verification Checklist
After creating the module:
- [ ] Module imports correctly in desktop-configuration.nix
- [ ] Module imports correctly in home.nix
- [ ] Options can be toggled without errors
- [ ] Docker service starts correctly
- [ ] Libvirtd service starts correctly
- [ ] Go tools are in PATH
- [ ] Node tools are in PATH
- [ ] AWS CLI works
- [ ] User is in correct groups (docker, libvirtd)
- [ ] No duplicate packages between work_tools and personal configs
- [ ] Build succeeds with `nix flake check`
- [ ] System rebuilds successfully
---
## Migration Path
### Current State (nate-work)
Work tools scattered across:
- `nate-work/modules/niri/niri_conf.nix` (docker, virt-manager)
- `nate-work/modules/home-manager/home.nix` (go, node, aws tools)
### Target State
Work tools consolidated in:
- `shared/modules/work/work_tools.nix` (system-level)
- `shared/modules/work/work_tools_home.nix` (user-level)
### Steps
1. Create module files
2. Import modules
3. Enable with appropriate flags
4. Remove duplicate package declarations
5. Test rebuild
6. Verify all tools still work
7. Commit changes
---
## Questions to Answer
Before implementing:
1. **Should this be in `shared/` or `nate-work/modules/`?**
- Recommendation: `shared/` if you might have multiple work machines
- Use `nate-work/modules/` if this is Vasion-specific
2. **Do you want separate modules per tool category?**
- Could split into: `work_docker.nix`, `work_go.nix`, etc.
- Tradeoff: More files vs. better separation
3. **Should work tools include LSPs?**
- Currently LSPs are in home.nix
- Could move to work_tools_home for consistency
4. **Do you want cloud-specific tool categories?**
- AWS tools separate from GCP/Azure?
- Or generic "cloud tools" category?
5. **Should VPN proxy module be part of work_tools?**
- Currently separate module
- Could integrate or keep separate

72
flake.lock generated
View File

@ -5,11 +5,11 @@
"nixpkgs": "nixpkgs"
},
"locked": {
"lastModified": 1749223974,
"narHash": "sha256-/GAQYRW1duU81KG//2wI9ax8EkHVG/e1UOD97NdwLOY=",
"lastModified": 1770551880,
"narHash": "sha256-+cS5yXWsSLiK36+PP/+dcQdxpXSclx2d65p7l6Dis+A=",
"owner": "catppuccin",
"repo": "nix",
"rev": "3a42cd79c647360ee8742659e42aeec0947dd3b4",
"rev": "db4dfe3f2a80e9c33492d839accd49f75c7324c2",
"type": "github"
},
"original": {
@ -46,11 +46,11 @@
]
},
"locked": {
"lastModified": 1764866045,
"narHash": "sha256-0GsEtXV9OquDQ1VclQfP16cU5VZh7NEVIOjSH4UaJuM=",
"lastModified": 1770260404,
"narHash": "sha256-3iVX1+7YUIt23hBx1WZsUllhbmP2EnXrV8tCRbLxHc8=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "f63d0fe9d81d36e5fc95497217a72e02b8b7bcab",
"rev": "0d782ee42c86b196acff08acfbf41bb7d13eed5b",
"type": "github"
},
"original": {
@ -62,11 +62,11 @@
},
"nixos-hardware": {
"locked": {
"lastModified": 1761759700,
"narHash": "sha256-zuiwvKAPwtMmwf44tb7Q7Y5d7JkBeuaF89PISUnkWA8=",
"lastModified": 1770631810,
"narHash": "sha256-b7iK/x+zOXbjhRqa+XBlYla4zFvPZyU5Ln2HJkiSnzc=",
"owner": "NixOS",
"repo": "nixos-hardware",
"rev": "2379bc40992ec29feb1933bb4acd224fa055f3f8",
"rev": "2889685785848de940375bf7fea5e7c5a3c8d502",
"type": "github"
},
"original": {
@ -78,11 +78,11 @@
},
"nixpkgs": {
"locked": {
"lastModified": 1744463964,
"narHash": "sha256-LWqduOgLHCFxiTNYi3Uj5Lgz0SR+Xhw3kr/3Xd0GPTM=",
"lastModified": 1770197578,
"narHash": "sha256-AYqlWrX09+HvGs8zM6ebZ1pwUqjkfpnv8mewYwAo+iM=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "2631b0b7abcea6e640ce31cd78ea58910d31e650",
"rev": "00c21e4c93d963c50d4c0c89bfa84ed6e0694df2",
"type": "github"
},
"original": {
@ -94,11 +94,11 @@
},
"nixpkgs-unstable": {
"locked": {
"lastModified": 1769018530,
"narHash": "sha256-MJ27Cy2NtBEV5tsK+YraYr2g851f3Fl1LpNHDzDX15c=",
"lastModified": 1770562336,
"narHash": "sha256-ub1gpAONMFsT/GU2hV6ZWJjur8rJ6kKxdm9IlCT0j84=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "88d3861acdd3d2f0e361767018218e51810df8a1",
"rev": "d6c71932130818840fc8fe9509cf50be8c64634f",
"type": "github"
},
"original": {
@ -110,11 +110,11 @@
},
"nixpkgs_2": {
"locked": {
"lastModified": 1769089682,
"narHash": "sha256-9yA/LIuAVQq0lXelrZPjLuLVuZdm03p8tfmHhnDIkms=",
"lastModified": 1770464364,
"narHash": "sha256-z5NJPSBwsLf/OfD8WTmh79tlSU8XgIbwmk6qB1/TFzY=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "078d69f03934859a181e81ba987c2bb033eebfc5",
"rev": "23d72dabcb3b12469f57b37170fcbc1789bd7457",
"type": "github"
},
"original": {
@ -126,11 +126,11 @@
},
"nixpkgs_3": {
"locked": {
"lastModified": 1749285348,
"narHash": "sha256-frdhQvPbmDYaScPFiCnfdh3B/Vh81Uuoo0w5TkWmmjU=",
"lastModified": 1770562336,
"narHash": "sha256-ub1gpAONMFsT/GU2hV6ZWJjur8rJ6kKxdm9IlCT0j84=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "3e3afe5174c561dee0df6f2c2b2236990146329f",
"rev": "d6c71932130818840fc8fe9509cf50be8c64634f",
"type": "github"
},
"original": {
@ -143,15 +143,14 @@
"nur": {
"inputs": {
"flake-parts": "flake-parts",
"nixpkgs": "nixpkgs_3",
"treefmt-nix": "treefmt-nix"
"nixpkgs": "nixpkgs_3"
},
"locked": {
"lastModified": 1749411920,
"narHash": "sha256-b8gH96+gNoLMudWbM5B3AuAnr1uvOmAIrCuq08BfDGI=",
"lastModified": 1770671471,
"narHash": "sha256-XpSArPAk0WwHVB3Lj4/J9eFUTWhjhL9KXSIOPelCENY=",
"owner": "nix-community",
"repo": "NUR",
"rev": "73d91ecf207a0796b50f5a60c824073363dc52ae",
"rev": "2a64dca9f90414d5cf6d5c49c30aff09dcb709de",
"type": "github"
},
"original": {
@ -169,27 +168,6 @@
"nixpkgs-unstable": "nixpkgs-unstable",
"nur": "nur"
}
},
"treefmt-nix": {
"inputs": {
"nixpkgs": [
"nur",
"nixpkgs"
]
},
"locked": {
"lastModified": 1733222881,
"narHash": "sha256-JIPcz1PrpXUCbaccEnrcUS8jjEb/1vJbZz5KkobyFdM=",
"owner": "numtide",
"repo": "treefmt-nix",
"rev": "49717b5af6f80172275d47a418c9719a31a78b53",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "treefmt-nix",
"type": "github"
}
}
},
"root": "root",

View File

@ -1,4 +1,13 @@
{ config, lib, inputs, outputs, pkgs, timeZone, system, ... }:
{
config,
lib,
inputs,
outputs,
pkgs,
timeZone,
system,
...
}:
let
supportedDesktops = [ "niri" ];
supportedDesktopsStr = lib.strings.concatStringsSep ", " supportedDesktops;
@ -6,35 +15,36 @@ let
in
{
options.deskCfg = {
de = lib.mkOption {
default = "";
type = lib.types.str;
description = "Desktop Environment";
};
userName = lib.mkOption {
type = lib.types.str;
description = "Main username for system";
};
hostName = lib.mkOption {
type = lib.types.str;
description = "Hostname for system";
};
de = lib.mkOption {
default = "";
type = lib.types.str;
description = "Desktop Environment";
};
userName = lib.mkOption {
type = lib.types.str;
description = "Main username for system";
};
hostName = lib.mkOption {
type = lib.types.str;
description = "Hostname for system";
};
};
imports = [
modules/user/main_user.nix
modules/niri/niri_conf.nix
../shared/modules/system/power_manager.nix
];
imports = [
modules/user/main_user.nix
modules/niri/niri_conf.nix
modules/colemak-ec.nix
../shared/modules/system/power_manager.nix
];
config = {
config = {
assertions = [
{
assertion = builtins.elem deskCfg.de supportedDesktops;
message = "Unsupported desktop environment: ${deskCfg.de}\nSupported DE's: ${supportedDesktopsStr}";
}
];
nixpkgs.overlays = [
inputs.nur.overlays.default
];
@ -45,20 +55,29 @@ in
# Enable flakes feature
nix.settings.experimental-features = [
"nix-command" "flakes"
"nix-command"
"flakes"
];
nixpkgs.config.allowUnfree = true;
boot = {
plymouth = {
enable = true;
theme = "circuit";
themePackages = with pkgs; [
# By default we would install all themes
(adi1090x-plymouth-themes.override {
selected_themes = [ "circuit" "circle_flow" ];
})
theme = "framework";
themePackages = [
(pkgs.runCommand "plymouth-framework-theme" { } ''
mkdir -p $out/share/plymouth/themes/framework
cp -r ${./framework-plymouth-theme/framework}/* $out/share/plymouth/themes/framework/
substituteInPlace $out/share/plymouth/themes/framework/framework.plymouth \
--replace-fail "@IMAGEDIR@" "$out/share/plymouth/themes/framework"
'')
];
# themePackages = with pkgs; [
# # By default we would install all themes
# (adi1090x-plymouth-themes.override {
# selected_themes = [ "circuit" "circle_flow" ];
# })
# ];
};
# Enable "Silent Boot"
@ -84,17 +103,17 @@ in
kernelPackages = pkgs.linuxPackages_latest;
};
networking.hostName = deskCfg.hostName; # Define your hostname.
networking.networkmanager.enable = true; # Easiest to use and most distros use this by default.
networking.wireless.iwd.enable = true;
networking.networkmanager.enable = true; # Easiest to use and most distros use this by default.
networking.wireless.iwd.enable = true;
time.timeZone = timeZone;
main_user = {
enable = true;
userName = deskCfg.userName;
isDesktopUser = true;
};
power_manager = {
enable = true;
};
@ -118,6 +137,9 @@ in
# For electron apps in wayland
environment.sessionVariables.NIXOS_OZONE_WL = "1";
# auto write colemak-dh to keyboard ec
colemakEc.enable = true;
services.greetd = {
enable = true;
settings = rec {
@ -128,7 +150,7 @@ in
default_session = initial_session;
};
};
# For yubioath desktop
services.pcscd.enable = true;
system.stateVersion = "25.05"; # Did you read the comment?

224
frame12/dump-matrix.py Executable file
View File

@ -0,0 +1,224 @@
#!/usr/bin/env python3
"""
Dump the full Framework EC keyboard matrix.
Reads all matrix positions and prints those with non-zero scancodes.
Usage:
sudo python3 dump-matrix.py
# or on NixOS:
# nix-shell -p python3 --run 'sudo python3 dump-matrix.py'
"""
import subprocess
import sys
# PS/2 Scan Code Set 2 -> Key name mapping
SCANCODE_NAMES = {
0x00: "(none)",
0x01: "F9",
0x03: "F5",
0x04: "F3",
0x05: "F1",
0x06: "F2",
0x07: "F12",
0x09: "F10",
0x0A: "F8",
0x0B: "F6",
0x0C: "F4",
0x0D: "Tab",
0x0E: "`",
0x11: "L Alt",
0x12: "L Shift",
0x14: "L Ctrl",
0x15: "q",
0x16: "1",
0x1A: "z",
0x1B: "s",
0x1C: "a",
0x1D: "w",
0x1E: "2",
0x21: "c",
0x22: "x",
0x23: "d",
0x24: "e",
0x25: "4",
0x26: "3",
0x29: "Space",
0x2A: "v",
0x2B: "f",
0x2C: "t",
0x2D: "r",
0x2E: "5",
0x31: "n",
0x32: "b",
0x33: "h",
0x34: "g",
0x35: "y",
0x36: "6",
0x3A: "m",
0x3B: "j",
0x3C: "u",
0x3D: "7",
0x3E: "8",
0x41: ",",
0x42: "k",
0x43: "i",
0x44: "o",
0x45: "0",
0x46: "9",
0x49: ".",
0x4A: "/",
0x4B: "l",
0x4C: ";",
0x4D: "p",
0x4E: "-",
0x52: "'",
0x54: "[",
0x55: "=",
0x58: "Caps Lock",
0x59: "R Shift",
0x5A: "Enter",
0x5B: "]",
0x5D: "\\",
0x66: "Backspace",
0x69: "KP 1",
0x6B: "KP 4",
0x6C: "KP 7",
0x70: "KP 0",
0x71: "KP .",
0x72: "KP 2",
0x73: "KP 5",
0x74: "KP 6",
0x75: "KP 8",
0x76: "Esc",
0x77: "Num Lock",
0x78: "F11",
0x79: "KP +",
0x7A: "KP 3",
0x7B: "KP -",
0x7C: "KP *",
0x7D: "KP 9",
0x7E: "Scroll Lock",
0x83: "F7",
0xFF: "Fn",
# Extended keys (E0 prefix) - stored as 16-bit values
0xE011: "R Alt",
0xE014: "R Ctrl",
0xE01F: "L GUI",
0xE027: "R GUI",
0xE02F: "Apps/Menu",
0xE04A: "KP /",
0xE05A: "KP Enter",
0xE069: "End",
0xE06B: "Left Arrow",
0xE06C: "Home",
0xE070: "Insert",
0xE071: "Delete",
0xE072: "Down Arrow",
0xE074: "Right Arrow",
0xE075: "Up Arrow",
0xE07A: "Page Down",
0xE07D: "Page Up",
}
def get_scancode_name(code):
if code in SCANCODE_NAMES:
return SCANCODE_NAMES[code]
return f"unknown"
def read_matrix_position(row, col):
"""Read the scancode at a given matrix position. Returns the 16-bit scancode."""
col_hex = format(col, 'x')
cmd = f"ectool raw 0x3E0C d1,d0,b{row:x},b{col_hex},w0"
try:
result = subprocess.run(
cmd.split(),
capture_output=True, text=True, timeout=5
)
output = result.stdout + result.stderr
# Parse the response bytes. Look for the "Read XXX bytes" line and
# then parse the hex dump that follows.
lines = output.strip().split('\n')
response_bytes = []
reading = False
for line in lines:
if "Read" in line and "bytes" in line:
reading = True
continue
if reading and '|' in line:
# Extract hex bytes before the |
hex_part = line.split('|')[0].strip()
for byte_str in hex_part.split():
if len(byte_str) == 2:
try:
response_bytes.append(int(byte_str, 16))
except ValueError:
pass
# Scancode is at bytes 10-11 (little-endian 16-bit)
if len(response_bytes) >= 12:
scancode = response_bytes[10] | (response_bytes[11] << 8)
return scancode
return None
except (subprocess.TimeoutExpired, Exception) as e:
print(f" Error reading ({row},{col:x}): {e}", file=sys.stderr)
return None
def main():
if subprocess.os.geteuid() != 0:
print("This script must be run as root (sudo).", file=sys.stderr)
sys.exit(1)
# Scan a wide range: rows 0-15, cols 0-15
# This covers well beyond the assumed 8x12 matrix
max_row = 16
max_col = 16
print(f"Scanning matrix positions ({max_row} rows x {max_col} cols)...")
print(f"{'Pos':>8} {'Scancode':>10} Key")
print("-" * 40)
found = []
for row in range(max_row):
for col in range(max_col):
scancode = read_matrix_position(row, col)
if scancode is not None and scancode != 0:
name = get_scancode_name(scancode)
label = f"({row:x},{col:x})"
sc_str = f"{scancode:04x}" if scancode > 0xFF else f"{scancode:02x}"
print(f"{label:>8} {sc_str:>10} {name}")
found.append((row, col, scancode, name))
# Print progress on stderr
print(f"\r Scanning ({row:x},{col:x})... ", end='', file=sys.stderr, flush=True)
print("\r ", file=sys.stderr)
print("-" * 40)
print(f"Found {len(found)} mapped positions.")
# Print a visual grid
print("\n=== Matrix Grid ===")
print(f"{'':>6}", end='')
for col in range(max_col):
print(f" {col:x} ", end='')
print()
for row in range(max_row):
print(f" {row:x} ", end='')
for col in range(max_col):
match = None
for r, c, sc, name in found:
if r == row and c == col:
match = name
break
if match:
print(f" {match:>6}", end='')
else:
print(f" .", end='')
print()
if __name__ == "__main__":
main()

View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2021 Kupke
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -0,0 +1,23 @@
# Framework Plymouth Theme
Theme with animated Framework logo. Inspiration from [KDE Splashscreen](https://github.com/NL-TCH/Frame.Work_SplashScreen-KDE).
Artwork credit to sniss https://community.frame.work/t/framework-fan-art/6626/39
## Installation
Copy the `framework` folder to your Plymouth theme folder (in Fedora, it's `/usr/share/plymouth/themes/`).
To see if it's in the right spot, you can run `plymouth-set-default-theme -l`
To set the theme, execute this command:
```
sudo plymouth-set-default-theme framework -R
```
## Distro Logo
If you want to add your distro logo to the boot animation screen, insert it as `watermark.png`
You should be able to reuse your distro's watermark image from one of your existing themes. Fedora image included for reference; just rename `fedora_watermark.png` to `watermark.png` and move it into the `framework` folder.

Binary file not shown.

After

Width:  |  Height:  |  Size: 616 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 960 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

View File

@ -0,0 +1,54 @@
[Plymouth Theme]
Name=Framework
Description=Theme with animated Framework logo.
ModuleName=two-step
[two-step]
Font=Cantarell 12
TitleFont=Cantarell Light 30
ImageDir=@IMAGEDIR@
DialogHorizontalAlignment=.5
DialogVerticalAlignment=.382
TitleHorizontalAlignment=.5
TitleVerticalAlignment=.382
HorizontalAlignment=.5
VerticalAlignment=.5
WatermarkHorizontalAlignment=.5
WatermarkVerticalAlignment=.96
Transition=none
TransitionDuration=0.0
BackgroundStartColor=0x000000
BackgroundEndColor=0x000000
ProgressBarBackgroundColor=0x606060
ProgressBarForegroundColor=0xffffff
MessageBelowAnimation=true
[boot-up]
UseEndAnimation=false
[shutdown]
UseEndAnimation=false
[reboot]
UseEndAnimation=false
[updates]
SuppressMessages=true
ProgressBarShowPercentComplete=true
UseProgressBar=true
Title=Installing Updates...
SubTitle=Do not turn off your computer
[system-upgrade]
SuppressMessages=true
ProgressBarShowPercentComplete=true
UseProgressBar=true
Title=Upgrading System...
SubTitle=Do not turn off your computer
[firmware-upgrade]
SuppressMessages=true
ProgressBarShowPercentComplete=true
UseProgressBar=true
Title=Upgrading Firmware...
SubTitle=Do not turn off your computer

Binary file not shown.

After

Width:  |  Height:  |  Size: 946 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Some files were not shown because too many files have changed in this diff Show More