fix: social gate round 2, part 1 - border-only move cursor, literal-\n

empty state, retail amber row selection

- Move cursor (user-directed, ALL windows): HoverWindowMove now
  advertises only where the window frame element itself wins the
  hit-test - its border pixels; interior points resolve to content
  children. Matches retail's Dragbar-chrome-only move cursor.
  Whole-surface dragging still works, it just does not advertise.
- Empty-state text (round 2): the DAT stores the LITERAL two-character
  escape backslash-n (probe-verified - the dump printed the escape, not
  line breaks), so the round-1 newline split never matched. Escapes are
  normalized before splitting in DatWidgetFactory authored text.
- Selected fellow amber (user: "check retail"): probe-verified - the
  row name band 0x10000282 AUTHORS the retail selected-row art
  (DirectState 0x06001450 + Highlight 0x06001451, the amber). Selection
  flips the band's ActiveState to Highlight; no invented tint.

App suite 4,976/3 skips. Confirmation-text + refused-drop-notification
research (the round's items 4-5) lands as part 2.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-08-13 20:36:24 +02:00
parent 72ceddce2e
commit fc62cb6397
4 changed files with 56 additions and 5 deletions

View file

@ -148,9 +148,13 @@ public sealed class UiRoot : UiElement
var window = FindWindow(target);
if (window is not { Draggable: true })
return false;
return !target.IsDragSource
&& !target.CapturesPointerDrag
&& !target.HandlesClick;
// 2026-08-13 gate (user-directed, all windows): the move cursor
// advertises ONLY on the window's own chrome — the frame's border
// pixels are the only place the frame element itself wins the
// hit-test (interior points resolve to content children), which
// matches retail's Dragbar-chrome-only move cursor. Whole-surface
// dragging still WORKS; it just no longer advertises over content.
return ReferenceEquals(target, window);
}
}
private (uint tex, int w, int h)? _dragGhost;