From 09e30a87fed27f424b47569f2e52ec30da67ccfa Mon Sep 17 00:00:00 2001 From: liu weikai Date: Fri, 24 Jul 2026 16:38:12 +0800 Subject: [PATCH] test(uconsole): support deterministic GTK page captures --- .../src/platform/gtk/gtk_canvas_presenter.cpp | 23 +++++++++++++++++++ .../src/platform/gtk/gtk_canvas_presenter.h | 2 ++ .../src/targets/uconsole_main.cpp | 10 +++++++- 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/apps/linux_uconsole_gtk/src/platform/gtk/gtk_canvas_presenter.cpp b/apps/linux_uconsole_gtk/src/platform/gtk/gtk_canvas_presenter.cpp index 0104574f..6d293e36 100644 --- a/apps/linux_uconsole_gtk/src/platform/gtk/gtk_canvas_presenter.cpp +++ b/apps/linux_uconsole_gtk/src/platform/gtk/gtk_canvas_presenter.cpp @@ -21,6 +21,8 @@ struct GtkCanvasPresenter::Impl GtkDrawingArea* drawing_area = nullptr; GtkEventController* key_controller = nullptr; bool running = true; + bool startup_inputs_queued = false; + bool startup_shortcut_queued = false; PointerState pointer{}; int frame_width = 0; int frame_height = 0; @@ -198,6 +200,27 @@ GtkCanvasPresenter::~GtkCanvasPresenter() bool GtkCanvasPresenter::pump() { + if (!impl_->startup_inputs_queued) + { + for (int step = 0; step < impl_->options.initial_nav_steps; ++step) + { + queueSpecial(impl_->input, InputKey::Tab, "TAB"); + } + if (impl_->options.initial_nav_steps > 0) + { + queueSpecial(impl_->input, InputKey::Enter, "OK"); + } + impl_->startup_inputs_queued = true; + } + else if (!impl_->startup_shortcut_queued && + impl_->presented_frames >= 5 && + impl_->options.initial_shortcut != '\0') + { + impl_->input.push_back(::trailmate::cardputer_zero::app:: + makeCharacterInput( + impl_->options.initial_shortcut)); + impl_->startup_shortcut_queued = true; + } while (g_main_context_pending(nullptr)) { g_main_context_iteration(nullptr, FALSE); diff --git a/apps/linux_uconsole_gtk/src/platform/gtk/gtk_canvas_presenter.h b/apps/linux_uconsole_gtk/src/platform/gtk/gtk_canvas_presenter.h index 99b62990..35282d53 100644 --- a/apps/linux_uconsole_gtk/src/platform/gtk/gtk_canvas_presenter.h +++ b/apps/linux_uconsole_gtk/src/platform/gtk/gtk_canvas_presenter.h @@ -16,6 +16,8 @@ struct GtkCanvasPresenterOptions std::string title = "Trail Mate uConsole"; std::string screenshot_path{}; int screenshot_after_frames = 45; + int initial_nav_steps = 0; + char initial_shortcut = '\0'; }; class GtkCanvasPresenter final diff --git a/apps/linux_uconsole_gtk/src/targets/uconsole_main.cpp b/apps/linux_uconsole_gtk/src/targets/uconsole_main.cpp index a69352ab..d72060ab 100644 --- a/apps/linux_uconsole_gtk/src/targets/uconsole_main.cpp +++ b/apps/linux_uconsole_gtk/src/targets/uconsole_main.cpp @@ -89,7 +89,15 @@ int main(int argc, char** argv) .screenshot_path = envString("TRAIL_MATE_UCONSOLE_SCREENSHOT", ""), .screenshot_after_frames = - envInt("TRAIL_MATE_UCONSOLE_SCREENSHOT_AFTER_FRAMES", 45)}}; + envInt("TRAIL_MATE_UCONSOLE_SCREENSHOT_AFTER_FRAMES", 45), + .initial_nav_steps = + envInt("TRAIL_MATE_UCONSOLE_INITIAL_NAV_STEPS", 0), + .initial_shortcut = + envString("TRAIL_MATE_UCONSOLE_INITIAL_SHORTCUT", "") + .empty() + ? '\0' + : envString("TRAIL_MATE_UCONSOLE_INITIAL_SHORTCUT", "") + .front()}}; trailmate::uconsole::UConsoleShellOptions shell{}; shell.width = options.width; shell.height = options.height;