Add framework keyboard bits, tweak niri, add framework plymouth boot screen
426
WORK_TOOLS_MODULE_DESIGN.md
Normal 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
@ -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",
|
||||
|
||||
@ -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;
|
||||
@ -24,6 +33,7 @@ in
|
||||
imports = [
|
||||
modules/user/main_user.nix
|
||||
modules/niri/niri_conf.nix
|
||||
modules/colemak-ec.nix
|
||||
../shared/modules/system/power_manager.nix
|
||||
];
|
||||
|
||||
@ -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"
|
||||
@ -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 {
|
||||
|
||||
224
frame12/dump-matrix.py
Executable 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()
|
||||
21
frame12/framework-plymouth-theme/LICENSE
Normal 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.
|
||||
23
frame12/framework-plymouth-theme/README.md
Normal 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.
|
||||
|
||||
BIN
frame12/framework-plymouth-theme/framework/bullet.png
Normal file
|
After Width: | Height: | Size: 616 B |
BIN
frame12/framework-plymouth-theme/framework/capslock.png
Normal file
|
After Width: | Height: | Size: 960 B |
BIN
frame12/framework-plymouth-theme/framework/entry.png
Normal file
|
After Width: | Height: | Size: 8.8 KiB |
@ -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
|
||||
BIN
frame12/framework-plymouth-theme/framework/keyboard.png
Normal file
|
After Width: | Height: | Size: 946 B |
BIN
frame12/framework-plymouth-theme/framework/keymap-render.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
frame12/framework-plymouth-theme/framework/lock.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0001.png
Normal file
|
After Width: | Height: | Size: 6.1 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0002.png
Normal file
|
After Width: | Height: | Size: 6.1 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0003.png
Normal file
|
After Width: | Height: | Size: 6.1 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0004.png
Normal file
|
After Width: | Height: | Size: 6.1 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0005.png
Normal file
|
After Width: | Height: | Size: 6.1 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0006.png
Normal file
|
After Width: | Height: | Size: 6.1 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0007.png
Normal file
|
After Width: | Height: | Size: 6.1 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0008.png
Normal file
|
After Width: | Height: | Size: 6.1 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0009.png
Normal file
|
After Width: | Height: | Size: 6.1 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0010.png
Normal file
|
After Width: | Height: | Size: 6.1 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0011.png
Normal file
|
After Width: | Height: | Size: 6.1 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0012.png
Normal file
|
After Width: | Height: | Size: 6.1 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0013.png
Normal file
|
After Width: | Height: | Size: 6.1 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0014.png
Normal file
|
After Width: | Height: | Size: 6.1 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0015.png
Normal file
|
After Width: | Height: | Size: 6.3 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0016.png
Normal file
|
After Width: | Height: | Size: 6.4 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0017.png
Normal file
|
After Width: | Height: | Size: 6.5 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0018.png
Normal file
|
After Width: | Height: | Size: 6.6 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0019.png
Normal file
|
After Width: | Height: | Size: 6.6 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0020.png
Normal file
|
After Width: | Height: | Size: 6.6 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0021.png
Normal file
|
After Width: | Height: | Size: 6.6 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0022.png
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0023.png
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0024.png
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0025.png
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0026.png
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0027.png
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0028.png
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0029.png
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0030.png
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0031.png
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0032.png
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0033.png
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0034.png
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0035.png
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0036.png
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0037.png
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0038.png
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0039.png
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0040.png
Normal file
|
After Width: | Height: | Size: 6.8 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0041.png
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0042.png
Normal file
|
After Width: | Height: | Size: 6.8 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0043.png
Normal file
|
After Width: | Height: | Size: 6.8 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0044.png
Normal file
|
After Width: | Height: | Size: 6.8 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0045.png
Normal file
|
After Width: | Height: | Size: 6.8 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0046.png
Normal file
|
After Width: | Height: | Size: 6.8 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0047.png
Normal file
|
After Width: | Height: | Size: 6.6 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0048.png
Normal file
|
After Width: | Height: | Size: 6.5 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0049.png
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0050.png
Normal file
|
After Width: | Height: | Size: 7.1 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0051.png
Normal file
|
After Width: | Height: | Size: 7.3 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0052.png
Normal file
|
After Width: | Height: | Size: 7.4 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0053.png
Normal file
|
After Width: | Height: | Size: 7.4 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0054.png
Normal file
|
After Width: | Height: | Size: 7.5 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0055.png
Normal file
|
After Width: | Height: | Size: 7.4 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0056.png
Normal file
|
After Width: | Height: | Size: 7.3 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0057.png
Normal file
|
After Width: | Height: | Size: 7.3 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0058.png
Normal file
|
After Width: | Height: | Size: 7.3 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0059.png
Normal file
|
After Width: | Height: | Size: 7.2 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0060.png
Normal file
|
After Width: | Height: | Size: 7.2 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0061.png
Normal file
|
After Width: | Height: | Size: 7.3 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0062.png
Normal file
|
After Width: | Height: | Size: 7.3 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0063.png
Normal file
|
After Width: | Height: | Size: 7.3 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0064.png
Normal file
|
After Width: | Height: | Size: 7.3 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0065.png
Normal file
|
After Width: | Height: | Size: 7.4 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0066.png
Normal file
|
After Width: | Height: | Size: 7.4 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0067.png
Normal file
|
After Width: | Height: | Size: 7.4 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0068.png
Normal file
|
After Width: | Height: | Size: 7.4 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0069.png
Normal file
|
After Width: | Height: | Size: 7.5 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0070.png
Normal file
|
After Width: | Height: | Size: 7.4 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0071.png
Normal file
|
After Width: | Height: | Size: 7.5 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0072.png
Normal file
|
After Width: | Height: | Size: 7.4 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0073.png
Normal file
|
After Width: | Height: | Size: 7.4 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0074.png
Normal file
|
After Width: | Height: | Size: 7.4 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0075.png
Normal file
|
After Width: | Height: | Size: 7.5 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0076.png
Normal file
|
After Width: | Height: | Size: 7.5 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0077.png
Normal file
|
After Width: | Height: | Size: 7.5 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0078.png
Normal file
|
After Width: | Height: | Size: 7.5 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0079.png
Normal file
|
After Width: | Height: | Size: 7.5 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0080.png
Normal file
|
After Width: | Height: | Size: 7.5 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0081.png
Normal file
|
After Width: | Height: | Size: 7.5 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0082.png
Normal file
|
After Width: | Height: | Size: 7.5 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0083.png
Normal file
|
After Width: | Height: | Size: 7.4 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0084.png
Normal file
|
After Width: | Height: | Size: 7.3 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0085.png
Normal file
|
After Width: | Height: | Size: 7.4 KiB |
BIN
frame12/framework-plymouth-theme/framework/throbber-0086.png
Normal file
|
After Width: | Height: | Size: 7.5 KiB |