#!/bin/bash # Task ID → Template number mapping. # Sourced by other scripts. Provides task_template() and task_wave(). # Template mapping: task ID → template number # Template 1: XEvent* → WMEvent* signature change # Template 2: _x11_raw elimination # Template 3: Xlib → wm_backend vtable # Template 4: Guard X11 block in WINGs (if scr->display) # Template 5: Split into _x11/_wl pair # Template 6: Xlib drawing → WINGs render backend # Template 7: Remove #ifdef guard # Template 8: WPrefs.app Xlib → WINGs API # Template 9: Verification only declare -A TASK_TEMPLATE=( # Phase F: wrlib [F.2]=9 [F.3]=9 [F.4]=9 [F.5]=4 # Phase A: Core Window Management [A4.1]=7 [A5.1]=1 [A5.2]=2 # Phase B: Dock & App Icons [B.1]=3 [B.2]=7 [B.3]=1 # Phase C: Visual Polish [C.1]=3 [C.3]=9 # Phase D: WINGs Widget Porting [D.1]=4 [D.2]=4 [D.3]=5 [D.4]=6 [D.5]=5 [D.6]=5 [D.7]=6 [D.8]=6 [D.9]=6 [D.10]=6 [D.11]=4 [D.12]=6 # Phase E: Dialogs & Panels [E.1]=2 [E.2]=2 [E.3]=1 [E.4]=1 [E.5a]=8 [E.5b]=8 [E.5c]=8 [E.5d]=8 [E.5e]=8 [E.5f]=8 [E.5g]=8 [E.5h]=8 [E.5i]=8 [E.5j]=8 [E.5k]=8 # Phase G: Session & Persistence [G.1]=9 [G.2]=3 # Phase I: EWMH / Foreign Toplevel [I.1]=9 [I.2]=9 # Phase H: Advanced Compositor [H.1]=7 [H.5]=9 # Remaining src/ cleanup [R.1]=2 [R.2]=2 [R.3]=2 [R.4]=3 [R.5]=3 [R.6]=7 [R.7]=7 ) # Wave assignments declare -A TASK_WAVE=( # Immediate [F.2]=0 [F.3]=0 [F.4]=0 [F.5]=0 # Wave 1 [A4.1]=1 [A5.1]=1 [B.1]=1 [B.2]=1 [B.3]=1 [C.1]=1 [C.3]=1 [D.1]=1 [D.3]=1 [D.5]=1 [D.6]=1 [D.10]=1 [D.11]=1 [D.12]=1 [E.3]=1 [E.4]=1 [G.1]=1 [G.2]=1 [I.1]=1 [I.2]=1 [H.1]=1 [H.5]=1 [R.1]=1 [R.2]=1 [R.3]=1 [R.4]=1 [R.5]=1 [R.6]=1 [R.7]=1 # Wave 2 [A5.2]=2 [D.2]=2 [D.4]=2 [D.7]=2 [D.8]=2 [D.9]=2 [E.1]=2 [E.2]=2 # Wave 3 [E.5a]=3 [E.5b]=3 [E.5c]=3 [E.5d]=3 [E.5e]=3 [E.5f]=3 [E.5g]=3 [E.5h]=3 [E.5i]=3 [E.5j]=3 [E.5k]=3 ) # Blocker mapping: task ID → space-separated list of prerequisite task IDs declare -A TASK_BLOCKERS=( [F.3]="F.2" [F.5]="F.2" [A5.2]="A5.1" [D.2]="D.1" [D.4]="D.1" [D.7]="D.1" [D.8]="D.5" [D.9]="D.5" [E.2]="B.3 E.3" [E.5a]="D.1 D.2 D.3 D.4 D.5 D.6 D.7 D.8 D.9 D.10" [E.5b]="D.1 D.2 D.3 D.4 D.5 D.6 D.7 D.8 D.9 D.10" [E.5c]="D.1 D.2 D.3 D.4 D.5 D.6 D.7 D.8 D.9 D.10" [E.5d]="D.1 D.2 D.3 D.4 D.5 D.6 D.7 D.8 D.9 D.10" [E.5e]="D.1 D.2 D.3 D.4 D.5 D.6 D.7 D.8 D.9 D.10" [E.5f]="D.1 D.2 D.3 D.4 D.5 D.6 D.7 D.8 D.9 D.10" [E.5g]="D.1 D.2 D.3 D.4 D.5 D.6 D.7 D.8 D.9 D.10" [E.5h]="D.1 D.2 D.3 D.4 D.5 D.6 D.7 D.8 D.9 D.10" [E.5i]="D.1 D.2 D.3 D.4 D.5 D.6 D.7 D.8 D.9 D.10" [E.5j]="D.1 D.2 D.3 D.4 D.5 D.6 D.7 D.8 D.9 D.10" [E.5k]="D.1 D.2 D.3 D.4 D.5 D.6 D.7 D.8 D.9 D.10" ) # Template names for display declare -A TEMPLATE_NAME=( [1]="Signature XEvent*→WMEvent*" [2]="Eliminate _x11_raw" [3]="Xlib→wm_backend vtable" [4]="Guard X11 block (if scr->display)" [5]="Split into _x11/_wl pair" [6]="Xlib drawing→render backend" [7]="Remove #ifdef guard" [8]="WPrefs Xlib→WINGs API" [9]="Verification only" ) # Get all task IDs in a stable order task_all_ids() { printf '%s\n' "${!TASK_TEMPLATE[@]}" | sort -t. -k1,1 -k2,2n } # Check if a task is done task_is_done() { local id="$1" done_file="$2" [ -f "$done_file" ] && grep -qxF "$id" "$done_file" } # Check if a task is unblocked (all blockers done) task_is_unblocked() { local id="$1" done_file="$2" local blockers="${TASK_BLOCKERS[$id]:-}" [ -z "$blockers" ] && return 0 for dep in $blockers; do task_is_done "$dep" "$done_file" || return 1 done return 0 }