diff --git a/src/process.cpp b/src/process.cpp index 6ab6b317..6acb650f 100644 --- a/src/process.cpp +++ b/src/process.cpp @@ -341,6 +341,7 @@ namespace proc { #endif _app_id = -1; + display_name.clear(); } const std::vector & diff --git a/src/process.h b/src/process.h index 29abaa88..85bbfa3e 100644 --- a/src/process.h +++ b/src/process.h @@ -67,6 +67,8 @@ namespace proc { public: KITTY_DEFAULT_CONSTR_MOVE_THROW(proc_t) + std::string display_name; + proc_t( boost::process::environment &&env, std::vector &&apps): diff --git a/src/video.cpp b/src/video.cpp index 7758d68a..5029c5d8 100644 --- a/src/video.cpp +++ b/src/video.cpp @@ -16,6 +16,7 @@ extern "C" { #include } +#include "process.h" #include "cbs.h" #include "config.h" #include "globals.h" @@ -965,7 +966,7 @@ namespace video { * @param current_display_index The current display index or -1 if not yet known. */ void - refresh_displays(platf::mem_type_e dev_type, std::vector &display_names, int ¤t_display_index) { + refresh_displays(platf::mem_type_e dev_type, std::vector &display_names, int ¤t_display_index, std::string &preferred_display_name) { std::string current_display_name; // If we have a current display index, let's start with that @@ -1003,8 +1004,12 @@ namespace video { BOOST_LOG(warning) << "Previous active display ["sv << current_display_name << "] is no longer present"sv; } else { + current_display_name = preferred_display_name; + if (current_display_name.empty()) { + current_display_name = config::video.output_name; + } for (int x = 0; x < display_names.size(); ++x) { - if (display_names[x] == config::video.output_name) { + if (display_names[x] == current_display_name) { current_display_index = x; return; } @@ -1012,6 +1017,12 @@ namespace video { } } + void + refresh_displays(platf::mem_type_e dev_type, std::vector &display_names, int ¤t_display_index) { + static std::string empty_str = ""; + refresh_displays(dev_type, display_names, current_display_index, empty_str); + } + void captureThread( std::shared_ptr> capture_ctx_queue, @@ -1041,15 +1052,24 @@ namespace video { } capture_ctxs.emplace_back(std::move(*initial_capture_ctx)); - // Get all the monitor names now, rather than at boot, to - // get the most up-to-date list available monitors std::vector display_names; int display_p = -1; - refresh_displays(encoder.platform_formats->dev_type, display_names, display_p); - auto disp = platf::display(encoder.platform_formats->dev_type, display_names[display_p], capture_ctxs.front().config); - if (!disp) { - return; + std::shared_ptr disp; + if (!proc::proc.display_name.empty()) { + disp = platf::display(encoder.platform_formats->dev_type, proc::proc.display_name, capture_ctxs.front().config); } + if (!disp) { + // Get all the monitor names now, rather than at boot, to + // get the most up-to-date list available monitors + refresh_displays(encoder.platform_formats->dev_type, display_names, display_p); + disp = platf::display(encoder.platform_formats->dev_type, display_names[display_p], capture_ctxs.front().config); + if (disp) { + proc::proc.display_name = display_names[display_p]; + } else { + return; + } + } + display_wp = disp; constexpr auto capture_buffer_size = 12; @@ -1242,6 +1262,7 @@ namespace video { // reset_display() will sleep between retries reset_display(disp, encoder.platform_formats->dev_type, display_names[display_p], capture_ctxs.front().config); if (disp) { + proc::proc.display_name = display_names[display_p]; break; } }