diff --git a/docs/claude/probe-readings.md b/docs/claude/probe-readings.md
index d23280f..cbd7f43 100644
--- a/docs/claude/probe-readings.md
+++ b/docs/claude/probe-readings.md
@@ -1169,6 +1169,9 @@ its pane.
a trigger is configured before it is switched on — so this reads `1` always, and a `0` means the
settings have been made unreachable again. The *cursors'* body is disabled with the cursors, and that
is the pane whose readout has nothing to show.
+- **`arm sensitive with the trigger off=0`** is the one exception inside that body: `Arm` is a *runtime*
+ control, so with trigger mode off there is no engine to arm and it is disabled (and labelled `Arm`
+ again). `1` here is an Arm button that does nothing when clicked.
- **`summary`** is the locked trigger pane's whole content, as `key: value` pairs separated by ` |`. The
pane draws it as a small definition list — `signal`, `condition`, `level`, `mode` on four lines, and
then only the figures that are *not* at their defaults (`noise band`, `HF reject`, `pre-trigger`,
@@ -1348,7 +1351,11 @@ through one row type, for the reason in `invariants-gtk-and-chrome.md`. The form
[udpscope] trigger panel: boxes=15 controls_inside=15/15 search_widgets=4/4 search_inside=4/4
```
-The trigger panel's frame, read from the window: `boxes` is the row boxes the `.ui` holds, `controls_inside`
+The trigger panel's frame, read from the window: **the `.ui`'s own panel** (`trigger_body`), not the box
+this app wraps it in — the heading row and the locked summary are the code's arrangement, and reading the
+*wrapper* made this line report `boxes=2 … search_inside=0/4` the moment the heading moved out of the file.
+That is the failure this line is for, so it is worth knowing it can happen to itself. `boxes` is the row
+boxes the `.ui` holds, `controls_inside`
counts the fifteen controls the code built and then appended into those rows -- the last two being the
noise band and the HF reject, whose rows arrived with the noise-rejection work, `search_widgets` is the four
search buttons having resolved by id, and `search_inside` is those four being inside the block the expander
diff --git a/src/ui.cpp b/src/ui.cpp
index de56837..c941889 100644
--- a/src/ui.cpp
+++ b/src/ui.cpp
@@ -4082,7 +4082,7 @@ gboolean tick(gpointer user) {
if (app->capturing) {
mode = "trigger: CAPTURING (post-trigger window filling)";
} else if (app->event_held) {
- mode = "trigger: EVENT HELD (Arm to re-arm, or 'Go live' for streaming)";
+ mode = "trigger: EVENT HELD (Arm to re-arm, or switch the trigger off to stream)";
} else if (armed && have_trigger_value) {
static char waiting[192];
std::snprintf(waiting, sizeof(waiting),
@@ -4857,6 +4857,8 @@ void on_activate(GtkApplication* application, gpointer user) {
// switch that turns it back on. The trigger's body is deliberately *not* disabled: a trigger is
// configured before it is switched on, so its settings have to stay editable while it is off.
gtk_widget_set_sensitive(app->cursors_body, FALSE);
+ // The trigger's Arm button is the one control in its pane that needs trigger mode running.
+ if (app->arm_button != nullptr) gtk_widget_set_sensitive(app->arm_button, FALSE);
gtk_widget_set_sensitive(app->cursors_reset, FALSE);
if (app->side_stack != nullptr) {
@@ -5968,10 +5970,10 @@ int run_ui(int argc, char** argv, const Config& cfg, ScopeModel& model, Acquisit
app.dbg_badge_frames[3]);
std::printf("[udpscope] trigger panel sensitive before the probe toggled it: %d; "
"signal list items=%d selected=%d; column visible after sidebar toggle off=%d; "
- "pane switches live while their panes are off=%d\n",
+ "pane switches live while their panes are off=%d; arm sensitive with the trigger off=%d\n",
app.dbg_trigger_sensitive_default, app.dbg_trigger_items,
app.dbg_trigger_selected, app.dbg_side_column_after_hide,
- app.dbg_panel_switch_live);
+ app.dbg_panel_switch_live, app.dbg_arm_sensitive);
{
// The panel's *frame* read back: the row boxes the `.ui` holds, and that every control the code built
// ended up inside the panel rather than in a row that is not there. A control is created in code and
@@ -5985,8 +5987,10 @@ int run_ui(int argc, char** argv, const Config& cfg, ScopeModel& model, Acquisit
}
return 0;
};
+ // The *file's* panel (`trigger_body`), not the wrapper this app puts it in: the heading row and the
+ // locked summary are the code's arrangement, and what these counts read is what the `.ui` holds.
int boxes = 0;
- for (GtkWidget* c = gtk_widget_get_first_child(app.trigger_panel); c != nullptr;
+ for (GtkWidget* c = gtk_widget_get_first_child(app.trigger_body); c != nullptr;
c = gtk_widget_get_next_sibling(c)) {
if (GTK_IS_BOX(c)) ++boxes;
}
@@ -5998,8 +6002,8 @@ int run_ui(int argc, char** argv, const Config& cfg, ScopeModel& model, Acquisit
// a throwaway program, all three ways of setting it). So the walk the search widgets are read with has
// to start at the expander's child and not at the panel -- walking to the panel reads 0/4 on a panel
// that is entirely correct, which is what this line did first.
- GtkWidget* search_root = app.trigger_panel;
- for (GtkWidget* c = gtk_widget_get_first_child(app.trigger_panel); c != nullptr;
+ GtkWidget* search_root = app.trigger_body;
+ for (GtkWidget* c = gtk_widget_get_first_child(app.trigger_body); c != nullptr;
c = gtk_widget_get_next_sibling(c)) {
if (GTK_IS_EXPANDER(c)) {
if (GtkWidget* inner = gtk_expander_get_child(GTK_EXPANDER(c))) search_root = inner;
@@ -6013,21 +6017,21 @@ int run_ui(int argc, char** argv, const Config& cfg, ScopeModel& model, Acquisit
"[udpscope] trigger panel: boxes=%d controls_inside=%d/15 search_widgets=%d/4 "
"search_inside=%d/4\n",
boxes,
- inside(app.trigger_signal_drop, app.trigger_panel) +
- inside(app.trigger_type_drop, app.trigger_panel) +
- inside(app.trigger_edge_drop, app.trigger_panel) +
- inside(app.trigger_cmp_drop, app.trigger_panel) +
- inside(app.trigger_mode_drop, app.trigger_panel) +
- inside(app.trigger_width_spin, app.trigger_panel) +
- inside(app.trigger_width2_spin, app.trigger_panel) +
- inside(app.trigger_level2_spin, app.trigger_panel) +
- inside(app.trigger_timeout_spin, app.trigger_panel) +
- inside(app.trigger_level_spin, app.trigger_panel) +
- inside(app.trigger_pre_spin, app.trigger_panel) +
- inside(app.trigger_holdoff_spin, app.trigger_panel) +
- inside(app.trigger_band_spin, app.trigger_panel) +
- inside(app.trigger_hf_spin, app.trigger_panel) +
- inside(app.events_record_switch, app.trigger_panel),
+ inside(app.trigger_signal_drop, app.trigger_body) +
+ inside(app.trigger_type_drop, app.trigger_body) +
+ inside(app.trigger_edge_drop, app.trigger_body) +
+ inside(app.trigger_cmp_drop, app.trigger_body) +
+ inside(app.trigger_mode_drop, app.trigger_body) +
+ inside(app.trigger_width_spin, app.trigger_body) +
+ inside(app.trigger_width2_spin, app.trigger_body) +
+ inside(app.trigger_level2_spin, app.trigger_body) +
+ inside(app.trigger_timeout_spin, app.trigger_body) +
+ inside(app.trigger_level_spin, app.trigger_body) +
+ inside(app.trigger_pre_spin, app.trigger_body) +
+ inside(app.trigger_holdoff_spin, app.trigger_body) +
+ inside(app.trigger_band_spin, app.trigger_body) +
+ inside(app.trigger_hf_spin, app.trigger_body) +
+ inside(app.events_record_switch, app.trigger_body),
search_present,
inside(app.search_run_button, search_root) + inside(app.search_cancel_button, search_root) +
inside(app.search_prev_button, search_root) + inside(app.search_next_button, search_root));
diff --git a/src/ui/trigger-panel.ui b/src/ui/trigger-panel.ui
index 749c1ff..e1130f1 100644
--- a/src/ui/trigger-panel.ui
+++ b/src/ui/trigger-panel.ui
@@ -212,12 +212,6 @@
Arm
-
-
-