windowmaker-wl/tools/wm-port/task-map.sh

132 lines
3.8 KiB
Bash

#!/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
}