scope windows take drops, and the signal page lists them
The second windows were read-only by accident: nothing accepted a drop on them, and the
signal page's *Plot on* buttons knew only the main window's rows.
- **Drop target per scope window**: the same string payload a badge drags (the signal index),
handled by `on_scope_drop_channel()` -- the target carries its own window, the row is that
window's cell under the pointer, and `assign_signal_to_scope()` lands the signal in the
window's own row set (enabling an unacquired signal first, exactly as the main drop does).
The rebuild and the area's re-point are the window's next frame in the tick: a drop arrives
from inside the very widget it rearranges, and a synchronous rebuild would reset the drag
controller under it.
- **Plot on, per window**: the signal page carries one named group per scope window ("In
\"plot 2\""), one button per plot of that window, sensitive on that window's own rows. A
window closing refreshes the pages in its destroy handler, before the deferred delete could
dangle a button's scope pointer.
- Probe: `[scope-probe]` drops through the wired handler (`drop=1 slot1='square'`) and counts
the page's groups (`page_groups=2`); the section documents that it must not run with
`UDPSCOPE_ENABLE_ALL_MS` -- the enable-all probe's second leg clears the front plot, which
is the slot this probe copies. README, help and the layout invariant follow.
This commit is contained in:
1 parent
706d247b58
commit
51b4fad386
9 files changed
+231
-21
No files matched your search
@@ -357,7 +357,14 @@ Part of [CLAUDE.md](../../CLAUDE.md). These are rules that cost a defect to lear
|
||||
(same display mode, same epoch), and its span follows the main window's window or pin every frame. It is
|
||||
therefore a second *view* -- the settle rule is that a scope must never acquire, plan or epoch anything of
|
||||
its own. Closing the main window destroys its scopes first: a leftover toplevel keeps the GApplication's
|
||||
loop alive around a window that is gone (the exit run's hang).
|
||||
loop alive around a window that is gone (the exit run's hang). What a user *arranges* in a scope is the
|
||||
scope's own arrangement, and it takes the same two doors the main window's rows take: a badge **dropped on
|
||||
a scope window's plot** lands in that window's row set on the cell under the pointer (its own drop target,
|
||||
its own `assign_signal_to_scope()`), and the signal page's *Plot on* section carries **one named group per
|
||||
window** -- rebuilt out of `App::scopes` on every fill, and again when a window closes (the destroy handler
|
||||
refreshes the pages before the deferred delete can dangle a button's scope pointer). The change itself is
|
||||
never applied synchronously: a drop arrives from inside the very widget it rearranges, so the rebuild and
|
||||
the area's re-point are the window's next frame in the tick.
|
||||
|
||||
- **A figure row's full-screen is one click from two places, and never from one figure.** The
|
||||
toggle sits on the row's top-right corner, **out of hiding only while the pointer is near that
|
||||
|
||||
@@ -1453,10 +1453,14 @@ places), arranged as two single-cell rows with one signal each. The two reads af
|
||||
|
||||
`UDPSCOPE_PROBE_SCOPE_MS`. The **second window**: `open_scope_window()` twice — once copying
|
||||
the main window's figure 0, once empty — and read back a few frames later (the main tick is the
|
||||
scope's bind/acquire/repaint pump). Measured output:
|
||||
scope's bind/acquire/repaint pump). **Do not run it with `UDPSCOPE_ENABLE_ALL_MS`**: the
|
||||
enable-all probe's second leg, two seconds in, clears the front plot through the signal page --
|
||||
exactly the slot this probe copies -- so `copied=''` under that combination is that race and not
|
||||
a defect in the copy. Measured output:
|
||||
|
||||
```
|
||||
[scope-probe] count=2 copied='sine' bound=1 empty_ok=1 windows=1
|
||||
[scope-probe] drop=1 slot1='square' page_groups=2
|
||||
```
|
||||
|
||||
- `count=2` is both windows having been created and retained; `windows=1` each being a visible
|
||||
@@ -1466,6 +1470,14 @@ scope's bind/acquire/repaint pump). Measured output:
|
||||
model, not a snapshot taken at creation.
|
||||
- `empty_ok=1` is the `-1` call producing an empty row, which is the other entry point the
|
||||
overflow menu uses.
|
||||
- The second line is the **window as a drop target and a *Plot on* group**: `drop=1` is
|
||||
`on_scope_drop_channel()` — the handler the window's own target wires — putting `square` in
|
||||
the copied window's second slot (`slot1=`), the rebuild and the area's re-point then left to
|
||||
the window's next frame; `page_groups=2` is the signal page of an unplotted signal carrying
|
||||
**one *Plot on* group per window** (`udpscope-scope-plot-on`), so a signal can be plotted
|
||||
into a scope window without dragging it there. `drop=0` names a refused drop (a full plot or
|
||||
an unacquirable signal); `page_groups` less than the window count is a page rebuilt before
|
||||
the windows were read or a group that lost its window.
|
||||
|
||||
## `[search-probe]`
|
||||
|
||||
|
||||
Reference in new issue
Block a user