initial commit

This commit is contained in:
GammaKinematics 2026-03-30 13:10:42 +07:00
commit 90cff4f16a
59 changed files with 6855 additions and 0 deletions

View file

@ -0,0 +1,44 @@
#!/usr/bin/env bash
# Cycle through KiCad windows/projects
# Usage: kicad-cycle [f|b] (forward/backward, default: f)
# Supports both Hyprland (Wayland) and dwm (X11)
DIRECTION="${1:-f}"
# ==============================================================================
# Environment Detection
# ==============================================================================
if [[ -n "${HYPRLAND_INSTANCE_SIGNATURE:-}" ]]; then
WM="hyprland"
else
WM="dwm"
fi
# ==============================================================================
# Main
# ==============================================================================
if [[ "$WM" == "hyprland" ]]; then
# Hyprland: Cycle through groups on both workspaces
hyprctl dispatch workspace 101
hyprctl dispatch changegroupactive "$DIRECTION"
hyprctl dispatch workspace 102
hyprctl dispatch changegroupactive "$DIRECTION"
else
# Ensure we're on kicad tag on both monitors first
kicad-show
# Determine focus direction
FOCUS_CMD="focus-next"
[[ "$DIRECTION" == "b" ]] && FOCUS_CMD="focus-prev"
if [[ $(autorandr --detected) != "mobile" ]]; then
# Multi-monitor: cycle on both monitors
echo "mon-prim" > /tmp/dwm.fifo
echo "$FOCUS_CMD" > /tmp/dwm.fifo
echo "mon-sec" > /tmp/dwm.fifo
echo "$FOCUS_CMD" > /tmp/dwm.fifo
else
# Single monitor: just cycle windows
echo "$FOCUS_CMD" > /tmp/dwm.fifo
fi
fi

View file

@ -0,0 +1,103 @@
#!/usr/bin/env bash
# Launch KiCad with managed window layout
# Usage: kicad-launch <project.kicad_pro>
# Supports both Hyprland (Wayland) and dwm (X11)
set -euo pipefail
# ==============================================================================
# Environment Detection
# ==============================================================================
if [[ -n "${HYPRLAND_INSTANCE_SIGNATURE:-}" ]]; then
WM="hyprland"
else
WM="dwm"
fi
# ==============================================================================
# Main
# ==============================================================================
PROJECT="${1:-}"
if [[ -z "$PROJECT" ]]; then
echo "Usage: kicad-launch <project.kicad_pro>"
exit 1
fi
PROJECT_NAME=$(basename "$PROJECT" .kicad_pro)
if [[ "$WM" == "hyprland" ]]; then
# Hyprland: Use special workspace for PM
hyprctl dispatch workspace 102
hyprctl dispatch togglespecialworkspace kicad-pm
hyprctl dispatch exec "[workspace special:kicad-pm silent]" -- env GDK_BACKEND=x11 kicad "$PROJECT"
# Wait for project manager window
PM_ADDR=""
for i in {1..50}; do
PM_ADDR=$(hyprctl clients -j | jq -r --arg name "$PROJECT_NAME" \
'.[] | select(.class == "KiCad" and (.title | test($name))) | .address' 2>/dev/null | head -1)
[[ -n "$PM_ADDR" ]] && break
sleep 0.1
done
if [[ -z "$PM_ADDR" ]]; then
hyprctl dispatch togglespecialworkspace kicad-pm
echo "Failed to find KiCad project manager window"
exit 1
fi
# Focus PM and open PCB editor
hyprctl dispatch focuswindow "address:$PM_ADDR"
sleep 0.25
xdotool key ctrl+p
sleep 0.25
# Hide special workspace
hyprctl dispatch togglespecialworkspace kicad-pm
# Focus PCB editor and open schematic
sleep 2
hyprctl dispatch workspace 101
sleep 0.25
xdotool key ctrl+e
sleep 0.25
# Switch to KiCad workspaces
hyprctl dispatch workspace 101
hyprctl dispatch workspace 102
else
# dwm: Launch KiCad, window rules handle placement
# Tag 16 = kicad-pm, Tag 17 = kicad (sch/pcb), Tag 18 = kicad-aux (mobile)
# Detect profile
PROFILE=$(autorandr --detected 2>/dev/null || echo "mobile")
# Switch to PM tag and launch
[[ "$PROFILE" != "mobile" ]] && echo "mon-sec" > /tmp/dwm.fifo
echo "kicad-pm" > /tmp/dwm.fifo
kicad "$PROJECT" &
# Wait for PM, open PCB editor
sleep 1
sleep 0.25
xdotool key ctrl+p
# Wait for PCB Editor
sleep 2
[[ "$PROFILE" != "mobile" ]] && echo "mon-prim" > /tmp/dwm.fifo
echo "kicad" > /tmp/dwm.fifo
if [[ "$PROFILE" == "mobile" ]]; then
# Mobile: retag PCB to tag 18 (kicad-aux)
# PCB landed on tag 17, focus it, retag to 18, follow
xdotool search --name "PCB Editor" windowactivate --sync
sleep 0.25
echo "tag 18" > /tmp/dwm.fifo
echo "kicad-aux" > /tmp/dwm.fifo
fi
# Focus PCB Editor, open Schematic
sleep 0.25
xdotool key ctrl+e
fi

View file

@ -0,0 +1,45 @@
#!/usr/bin/env bash
# Open Symbol + Footprint editors from running schematic/PCB editors
# Supports both Hyprland (Wayland) and dwm (X11)
set -euo pipefail
# ==============================================================================
# Environment Detection
# ==============================================================================
if [[ -n "${HYPRLAND_INSTANCE_SIGNATURE:-}" ]]; then
WM="hyprland"
else
WM="dwm"
PROFILE=$(autorandr --detected 2>/dev/null || echo "mobile")
fi
# ==============================================================================
# Main
# ==============================================================================
if [[ "$WM" == "hyprland" ]]; then
# Hyprland: Focus workspaces and send keys
hyprctl dispatch workspace 101
sleep 0.25
xdotool key ctrl+u # Open Footprint Editor from PCB
sleep 2
hyprctl dispatch workspace 102
sleep 0.25
xdotool key ctrl+i # Open Symbol Editor from Schematic
else
# Focus PCB Editor, open Footprint Editor
[[ "$PROFILE" != "mobile" ]] && echo "mon-prim" > /tmp/dwm.fifo
echo "kicad" > /tmp/dwm.fifo
sleep 0.25
xdotool key ctrl+u
sleep 0.5
# Focus right monitor, Schematic Editor, open Symbol Editor
[[ "$PROFILE" != "mobile" ]] && echo "mon-sec" > /tmp/dwm.fifo
echo "kicad" > /tmp/dwm.fifo
sleep 0.25
xdotool key ctrl+i
fi

View file

@ -0,0 +1,63 @@
#!/usr/bin/env bash
# Rofi KiCad project launcher
# Two-step: select folder, then select project
# Works with both Hyprland and dwm
# Define project folders: "Display Name|/path/to/folder"
PROJECT_FOLDERS=(
"CNC|/data/3D-Printer/Electronics/PCBs"
"Keyboard|/data/Keyboard/PCB"
"eGPU|/data/eGPU"
)
# Step 1: Select project folder
FOLDER_MENU=""
for entry in "${PROJECT_FOLDERS[@]}"; do
FOLDER_MENU+="${entry%%|*}\n"
done
SELECTED_FOLDER=$(echo -e "$FOLDER_MENU" | rofi -dmenu -p "KiCad Folder" -i)
[ -z "$SELECTED_FOLDER" ] && exit 0
# Get the path for selected folder
FOLDER_PATH=""
for entry in "${PROJECT_FOLDERS[@]}"; do
name="${entry%%|*}"
path="${entry#*|}"
if [ "$name" = "$SELECTED_FOLDER" ]; then
FOLDER_PATH="$path"
break
fi
done
[ -z "$FOLDER_PATH" ] && exit 1
# Step 2: Find .kicad_pro files in selected folder
# Sort by path length (shallowest first) to handle submodule duplicates
mapfile -t PROJECTS < <(find "$FOLDER_PATH" -name "*.kicad_pro" -type f 2>/dev/null | awk '{print length, $0}' | sort -n | cut -d' ' -f2-)
if [ ${#PROJECTS[@]} -eq 0 ]; then
rofi -e "No KiCad projects found in $FOLDER_PATH"
exit 1
fi
# Build menu with duplicate filtering (keep shallowest path for each project name)
declare -A SEEN_PROJECTS
MENU=""
for project in "${PROJECTS[@]}"; do
name=$(basename "$project" .kicad_pro)
# Skip if we've already seen this project name (deeper path = submodule)
if [ -z "${SEEN_PROJECTS[$name]}" ]; then
SEEN_PROJECTS[$name]="$project"
MENU+="$name\n"
fi
done
# Show rofi menu
SELECTED=$(echo -e "$MENU" | rofi -dmenu -p "Project" -i)
[ -z "$SELECTED" ] && exit 0
# Launch selected project
PROJECT_PATH="${SEEN_PROJECTS[$SELECTED]}"
if [ -n "$PROJECT_PATH" ]; then
kicad-launch "$PROJECT_PATH"
fi

View file

@ -0,0 +1,31 @@
#!/usr/bin/env bash
# Show KiCad tag on both monitors
# Supports both Hyprland (Wayland) and dwm (X11)
# ==============================================================================
# Environment Detection
# ==============================================================================
if [[ -n "${HYPRLAND_INSTANCE_SIGNATURE:-}" ]]; then
WM="hyprland"
else
WM="dwm"
fi
# ==============================================================================
# Main
# ==============================================================================
if [[ "$WM" == "hyprland" ]]; then
hyprctl dispatch workspace 101
hyprctl dispatch workspace 102
else
if [[ $(autorandr --detected) != "mobile" ]]; then
# Multi-monitor: set kicad tag on both monitors
echo "mon-prim" > /tmp/dwm.fifo
echo "kicad" > /tmp/dwm.fifo
echo "mon-sec" > /tmp/dwm.fifo
echo "kicad" > /tmp/dwm.fifo
else
# Single monitor: just switch to kicad tag
echo "kicad" > /tmp/dwm.fifo
fi
fi

View file

@ -0,0 +1,23 @@
#!/usr/bin/env bash
# Swap KiCad workspaces between monitors
# Supports both Hyprland (Wayland) and dwm (X11)
# ==============================================================================
# Environment Detection
# ==============================================================================
if [[ -n "${HYPRLAND_INSTANCE_SIGNATURE:-}" ]]; then
WM="hyprland"
else
WM="dwm"
fi
# ==============================================================================
# Main
# ==============================================================================
if [[ "$WM" == "hyprland" ]]; then
hyprctl dispatch swapactiveworkspaces DP-3 eDP-1
else
# Ensure we're on kicad tag on both monitors first
kicad-show
echo "mon-swap" > /tmp/dwm.fifo
fi

20
KiCad/kicad.nix Normal file
View file

@ -0,0 +1,20 @@
# KiCad configuration and scripts
# Works with both Hyprland (Wayland) and dwm (X11)
{ pkgs-stable, ... }:
let
scriptsDir = ./Scripts;
in
{
home.packages = with pkgs-stable; [
kicad
# Custom scripts
(writeShellScriptBin "kicad-launch" (builtins.readFile "${scriptsDir}/kicad-launch.sh"))
(writeShellScriptBin "kicad-projects" (builtins.readFile "${scriptsDir}/kicad-projects.sh"))
(writeShellScriptBin "kicad-show" (builtins.readFile "${scriptsDir}/kicad-show.sh"))
(writeShellScriptBin "kicad-swap" (builtins.readFile "${scriptsDir}/kicad-swap.sh"))
(writeShellScriptBin "kicad-cycle" (builtins.readFile "${scriptsDir}/kicad-cycle.sh"))
(writeShellScriptBin "kicad-lib-launch" (builtins.readFile "${scriptsDir}/kicad-lib-launch.sh"))
];
}