diff --git a/src/ui.cpp b/src/ui.cpp index 7129ece..701b09e 100644 --- a/src/ui.cpp +++ b/src/ui.cpp @@ -4654,10 +4654,16 @@ void run_app_action(App& app, AppAction action) { toggle(app.cursors_toggle); break; case AppAction::ShowMeasure: dock_show_section(app, "measure"); break; - case AppAction::ShowSignals: + case AppAction::ShowSignals: { // The `+` badge is insensitive without signals; so is its shortcut. - if (!app.model->signals().empty()) slideover_toggle(app, "signals"); + bool have_signals = false; + { + std::lock_guard lock(app.model->mutex()); + have_signals = !app.model->signals().empty(); + } + if (have_signals) slideover_toggle(app, "signals"); break; + } case AppAction::LayoutEditor: toggle(app.layout_toggle); break; diff --git a/src/ui_badges.cpp b/src/ui_badges.cpp index 0e36e4c..fbdffe5 100644 --- a/src/ui_badges.cpp +++ b/src/ui_badges.cpp @@ -256,12 +256,17 @@ void sync_badge_bar(App& app) { set_text_if_changed(bb.trigger.state, trigger_badge_state(enabled, armed, pending, has_event)); set_open(bb.trigger.button, slideover_page(app) == bb.trigger.page); + bool have_signals = false; + { + std::lock_guard lock(app.model->mutex()); + have_signals = !app.model->signals().empty(); + } if (bb.plus.button != nullptr) { - gtk_widget_set_sensitive(bb.plus.button, !app.model->signals().empty()); + gtk_widget_set_sensitive(bb.plus.button, have_signals); set_open(bb.plus.button, slideover_page(app) == "signals"); } if (bb.overflow.button != nullptr) { - gtk_widget_set_sensitive(bb.overflow.button, !app.model->signals().empty()); + gtk_widget_set_sensitive(bb.overflow.button, have_signals); // The overflow stands for every signal's badge too: a signal page opened from a list row marks it. set_open(bb.overflow.button, slideover_page(app) == bb.overflow.page || slideover_page(app).rfind("signal:", 0) == 0); diff --git a/src/ui_signals.cpp b/src/ui_signals.cpp index 0a1cc28..5b7c392 100644 --- a/src/ui_signals.cpp +++ b/src/ui_signals.cpp @@ -557,7 +557,11 @@ gboolean on_drop_channel(GtkDropTarget*, const GValue* value, double x, double y // Where the drop landed decides the row: one area covers them all. const int row = row_at(*app, x, y); const char* text = g_value_get_string(value); - const std::size_t signal = static_cast(std::atoll(text ? text : "0")); + if (text == nullptr || *text == '\0') return FALSE; + char* end = nullptr; + const unsigned long long parsed = std::strtoull(text, &end, 10); + if (end == nullptr || *end != '\0') return FALSE; + const std::size_t signal = static_cast(parsed); if (!assign_signal_to_row(*app, signal, row)) return FALSE; cancel_drag_on(*app, row); return TRUE;