initial commit
This commit is contained in:
commit
90cff4f16a
59 changed files with 6855 additions and 0 deletions
44
KiCad/Scripts/kicad-cycle.sh
Normal file
44
KiCad/Scripts/kicad-cycle.sh
Normal 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
|
||||
103
KiCad/Scripts/kicad-launch.sh
Normal file
103
KiCad/Scripts/kicad-launch.sh
Normal 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
|
||||
45
KiCad/Scripts/kicad-lib-launch.sh
Normal file
45
KiCad/Scripts/kicad-lib-launch.sh
Normal 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
|
||||
63
KiCad/Scripts/kicad-projects.sh
Normal file
63
KiCad/Scripts/kicad-projects.sh
Normal 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
|
||||
31
KiCad/Scripts/kicad-show.sh
Normal file
31
KiCad/Scripts/kicad-show.sh
Normal 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
|
||||
23
KiCad/Scripts/kicad-swap.sh
Normal file
23
KiCad/Scripts/kicad-swap.sh
Normal 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
|
||||
Loading…
Add table
Add a link
Reference in a new issue