diff --git a/qt/src/MainWindow.cpp b/qt/src/MainWindow.cpp index 3b74fd107..6629c1039 100644 --- a/qt/src/MainWindow.cpp +++ b/qt/src/MainWindow.cpp @@ -2596,13 +2596,13 @@ bool MainWindow::onAction(ghostty_app_t, ghostty_target_s target, } case GHOSTTY_ACTION_PROGRESS_REPORT: { - // Honor `progress-style`: `none` suppresses the taskbar entry. - // The default is to drive Unity LauncherEntry; future styles - // (e.g. an in-window inline bar) would branch off here. - const QString style = - win ? win->configString("progress-style") : QStringLiteral(""); - if (style == QLatin1String("no") || style == QLatin1String("none")) - return true; + // Honor `progress-style`: when false, OSC 9;4 progress sequences + // are silently ignored (no taskbar entry). It is a *bool* in + // Config.zig — it MUST be read with configBool. configString + // would hand ghostty_config_get a `const char**`; the 1-byte + // bool write leaves a `0x1` pointer that QString::fromUtf8 then + // dereferences and crashes on (e.g. when Claude emits progress). + if (win && !win->configBool("progress-style", true)) return true; const ghostty_action_progress_report_s p = action.action.progress_report; const ghostty_action_progress_report_state_e state = p.state; const double fraction = p.progress >= 0 ? p.progress / 100.0 : 0.0;