Capture the last used display when restoring a stream

This commit is contained in:
Yukino Song
2024-07-30 23:37:14 +08:00
parent 093760ac92
commit a8e1ecde6e
3 changed files with 32 additions and 8 deletions

View File

@@ -341,6 +341,7 @@ namespace proc {
#endif #endif
_app_id = -1; _app_id = -1;
display_name.clear();
} }
const std::vector<ctx_t> & const std::vector<ctx_t> &

View File

@@ -67,6 +67,8 @@ namespace proc {
public: public:
KITTY_DEFAULT_CONSTR_MOVE_THROW(proc_t) KITTY_DEFAULT_CONSTR_MOVE_THROW(proc_t)
std::string display_name;
proc_t( proc_t(
boost::process::environment &&env, boost::process::environment &&env,
std::vector<ctx_t> &&apps): std::vector<ctx_t> &&apps):

View File

@@ -16,6 +16,7 @@ extern "C" {
#include <libavutil/pixdesc.h> #include <libavutil/pixdesc.h>
} }
#include "process.h"
#include "cbs.h" #include "cbs.h"
#include "config.h" #include "config.h"
#include "globals.h" #include "globals.h"
@@ -965,7 +966,7 @@ namespace video {
* @param current_display_index The current display index or -1 if not yet known. * @param current_display_index The current display index or -1 if not yet known.
*/ */
void void
refresh_displays(platf::mem_type_e dev_type, std::vector<std::string> &display_names, int &current_display_index) { refresh_displays(platf::mem_type_e dev_type, std::vector<std::string> &display_names, int &current_display_index, std::string &preferred_display_name) {
std::string current_display_name; std::string current_display_name;
// If we have a current display index, let's start with that // 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; BOOST_LOG(warning) << "Previous active display ["sv << current_display_name << "] is no longer present"sv;
} }
else { 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) { 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; current_display_index = x;
return; return;
} }
@@ -1012,6 +1017,12 @@ namespace video {
} }
} }
void
refresh_displays(platf::mem_type_e dev_type, std::vector<std::string> &display_names, int &current_display_index) {
static std::string empty_str = "";
refresh_displays(dev_type, display_names, current_display_index, empty_str);
}
void void
captureThread( captureThread(
std::shared_ptr<safe::queue_t<capture_ctx_t>> capture_ctx_queue, std::shared_ptr<safe::queue_t<capture_ctx_t>> capture_ctx_queue,
@@ -1041,15 +1052,24 @@ namespace video {
} }
capture_ctxs.emplace_back(std::move(*initial_capture_ctx)); 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<std::string> display_names; std::vector<std::string> display_names;
int display_p = -1; int display_p = -1;
refresh_displays(encoder.platform_formats->dev_type, display_names, display_p); std::shared_ptr<platf::display_t> disp;
auto disp = platf::display(encoder.platform_formats->dev_type, display_names[display_p], capture_ctxs.front().config); if (!proc::proc.display_name.empty()) {
if (!disp) { disp = platf::display(encoder.platform_formats->dev_type, proc::proc.display_name, capture_ctxs.front().config);
return;
} }
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; display_wp = disp;
constexpr auto capture_buffer_size = 12; constexpr auto capture_buffer_size = 12;
@@ -1242,6 +1262,7 @@ namespace video {
// reset_display() will sleep between retries // reset_display() will sleep between retries
reset_display(disp, encoder.platform_formats->dev_type, display_names[display_p], capture_ctxs.front().config); reset_display(disp, encoder.platform_formats->dev_type, display_names[display_p], capture_ctxs.front().config);
if (disp) { if (disp) {
proc::proc.display_name = display_names[display_p];
break; break;
} }
} }