[fix] fix display errors when stream window resized

This commit is contained in:
dijunkun
2024-11-27 16:14:14 +08:00
parent 10cdc440a0
commit e0457213ea
4 changed files with 37 additions and 31 deletions

View File

@@ -84,18 +84,23 @@ int Render::ControlWindow() {
stream_render_rect_.y; stream_render_rect_.y;
} }
// set cursor pos
new_cursor_pos_x = new_control_window_pos_x + mouse_diff_control_bar_pos_x_;
new_cursor_pos_y = new_control_window_pos_y + mouse_diff_control_bar_pos_y_;
ImGui::SetNextWindowPos( ImGui::SetNextWindowPos(
ImVec2(new_control_window_pos_x, new_control_window_pos_y), ImVec2(new_control_window_pos_x, new_control_window_pos_y),
ImGuiCond_Always); ImGuiCond_Always);
if (0 != mouse_diff_control_bar_pos_x_ && if (0 != mouse_diff_control_bar_pos_x_ &&
0 != mouse_diff_control_bar_pos_y_) { 0 != mouse_diff_control_bar_pos_y_) {
SDL_WarpMouseInWindow(stream_window_, (int)new_cursor_pos_x, // set cursor pos
(int)new_cursor_pos_y); new_cursor_pos_x =
new_control_window_pos_x + mouse_diff_control_bar_pos_x_;
new_cursor_pos_y =
new_control_window_pos_y + mouse_diff_control_bar_pos_y_;
if (new_cursor_pos_x < stream_window_width_ &&
new_cursor_pos_y < stream_window_height_) {
SDL_WarpMouseInWindow(stream_window_, (int)new_cursor_pos_x,
(int)new_cursor_pos_y);
}
} }
reset_control_bar_pos_ = false; reset_control_bar_pos_ = false;
} else if (!reset_control_bar_pos_ && } else if (!reset_control_bar_pos_ &&

View File

@@ -507,10 +507,10 @@ int Render::CreateStreamWindow() {
SDL_WindowFlags window_flags = SDL_WindowFlags window_flags =
(SDL_WindowFlags)(SDL_WINDOW_ALLOW_HIGHDPI | SDL_WINDOW_BORDERLESS); (SDL_WindowFlags)(SDL_WINDOW_ALLOW_HIGHDPI | SDL_WINDOW_BORDERLESS);
stream_window_ = SDL_CreateWindow( stream_window_ =
"Stream window", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SDL_CreateWindow("Stream window", SDL_WINDOWPOS_UNDEFINED,
(int)stream_window_width_default_, (int)stream_window_height_default_, SDL_WINDOWPOS_UNDEFINED, stream_window_width_default_,
window_flags); stream_window_height_default_, window_flags);
stream_renderer_ = SDL_CreateRenderer( stream_renderer_ = SDL_CreateRenderer(
stream_window_, -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED); stream_window_, -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED);
@@ -529,12 +529,22 @@ int Render::CreateStreamWindow() {
// for window region action // for window region action
SDL_SetWindowHitTest(stream_window_, HitTestCallback, this); SDL_SetWindowHitTest(stream_window_, HitTestCallback, this);
// change stream_render_rect_
SDL_Event event;
event.type = SDL_WINDOWEVENT;
event.window.windowID = SDL_GetWindowID(stream_window_);
event.window.event = SDL_WINDOWEVENT_SIZE_CHANGED;
SDL_PushEvent(&event);
stream_window_created_ = true; stream_window_created_ = true;
return 0; return 0;
} }
int Render::DestroyStreamWindow() { int Render::DestroyStreamWindow() {
stream_window_width_ = (float)stream_window_width_default_;
stream_window_height_ = (float)stream_window_height_default_;
if (stream_ctx_) { if (stream_ctx_) {
ImGui::SetCurrentContext(stream_ctx_); ImGui::SetCurrentContext(stream_ctx_);
} }
@@ -626,10 +636,12 @@ int Render::SetupStreamWindow() {
SDL_GL_GetDrawableSize(stream_window_, &main_window_width_real_, SDL_GL_GetDrawableSize(stream_window_, &main_window_width_real_,
&main_window_height_real_); &main_window_height_real_);
stream_window_dpi_scaling_w_ = stream_window_dpi_scaling_w_ =
stream_window_width_real_ / stream_window_width_; stream_window_width_real_ / stream_window_width_;
stream_window_dpi_scaling_h_ = stream_window_dpi_scaling_h_ =
stream_window_width_real_ / stream_window_width_; stream_window_width_real_ / stream_window_width_;
SDL_RenderSetScale(stream_renderer_, stream_window_dpi_scaling_w_, SDL_RenderSetScale(stream_renderer_, stream_window_dpi_scaling_w_,
stream_window_dpi_scaling_h_); stream_window_dpi_scaling_h_);
LOG_INFO("Use dpi scaling [{}x{}] for stream window", LOG_INFO("Use dpi scaling [{}x{}] for stream window",
@@ -874,7 +886,6 @@ int Render::Run() {
streaming_ = false; streaming_ = false;
rejoin_ = false; rejoin_ = false;
connection_established_ = false; connection_established_ = false;
received_frame_ = false;
is_client_mode_ = false; is_client_mode_ = false;
audio_capture_button_pressed_ = false; audio_capture_button_pressed_ = false;
fullscreen_button_pressed_ = false; fullscreen_button_pressed_ = false;
@@ -884,14 +895,6 @@ int Render::Run() {
memset(&net_traffic_stats_, 0, sizeof(net_traffic_stats_)); memset(&net_traffic_stats_, 0, sizeof(net_traffic_stats_));
SDL_SetWindowFullscreen(main_window_, SDL_FALSE); SDL_SetWindowFullscreen(main_window_, SDL_FALSE);
memset(audio_buffer_, 0, 720); memset(audio_buffer_, 0, 720);
SDL_SetWindowSize(main_window_, (int)main_window_width_default_,
(int)main_window_height_default_);
// SDL_Rect display_bounds;
// SDL_GetDisplayBounds(0, &display_bounds);
// int center_x = (display_bounds.w - main_window_width_default_) / 2;
// int center_y = (display_bounds.h - main_window_height_default_) /
// 2; SDL_SetWindowPosition(main_window_, center_x, center_y);
continue; continue;
} else { } else {
@@ -902,10 +905,15 @@ int Render::Run() {
} else if (event.window.event == SDL_WINDOWEVENT_MINIMIZED) { } else if (event.window.event == SDL_WINDOWEVENT_MINIMIZED) {
} else if (event.window.event == SDL_WINDOWEVENT_RESTORED) { } else if (event.window.event == SDL_WINDOWEVENT_RESTORED) {
window_maximized_ = false; window_maximized_ = false;
} else if (event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) { } else if (event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED &&
stream_window_created_ &&
event.window.windowID == SDL_GetWindowID(stream_window_)) {
reset_control_bar_pos_ = true; reset_control_bar_pos_ = true;
SDL_GetWindowSize(stream_window_, (int*)&stream_window_width_, int stream_window_width, stream_window_height;
(int*)&stream_window_height_); SDL_GetWindowSize(stream_window_, &stream_window_width,
&stream_window_height);
stream_window_width_ = (float)stream_window_width;
stream_window_height_ = (float)stream_window_height;
float video_ratio = (float)video_width_ / (float)video_height_; float video_ratio = (float)video_width_ / (float)video_height_;
float video_ratio_reverse = (float)video_height_ / (float)video_width_; float video_ratio_reverse = (float)video_height_ / (float)video_width_;

View File

@@ -180,8 +180,8 @@ class Render {
float main_window_height_ = 480; float main_window_height_ = 480;
float main_window_width_last_ = 640; float main_window_width_last_ = 640;
float main_window_height_last_ = 480; float main_window_height_last_ = 480;
float stream_window_width_default_ = 1280; int stream_window_width_default_ = 1280;
float stream_window_height_default_ = 720; int stream_window_height_default_ = 720;
float stream_window_width_ = 1280; float stream_window_width_ = 1280;
float stream_window_height_ = 720; float stream_window_height_ = 720;
int stream_window_width_last_ = 1280; int stream_window_width_last_ = 1280;
@@ -279,7 +279,6 @@ class Render {
bool mouse_control_button_pressed_ = false; bool mouse_control_button_pressed_ = false;
bool audio_capture_button_pressed_ = false; bool audio_capture_button_pressed_ = false;
bool show_settings_window_ = false; bool show_settings_window_ = false;
bool received_frame_ = false;
bool is_create_connection_ = false; bool is_create_connection_ = false;
bool audio_buffer_fresh_ = false; bool audio_buffer_fresh_ = false;
bool rejoin_ = false; bool rejoin_ = false;

View File

@@ -162,11 +162,6 @@ void Render::OnReceiveVideoBufferCb(const XVideoFrame *video_frame,
if (!render->dst_buffer_) { if (!render->dst_buffer_) {
render->dst_buffer_capacity_ = video_frame->size; render->dst_buffer_capacity_ = video_frame->size;
render->dst_buffer_ = new unsigned char[video_frame->size]; render->dst_buffer_ = new unsigned char[video_frame->size];
// Adapt stream_render_rect_ to the video resolution
SDL_Event event;
event.type = SDL_WINDOWEVENT;
event.window.event = SDL_WINDOWEVENT_SIZE_CHANGED;
SDL_PushEvent(&event);
} }
if (render->dst_buffer_capacity_ < video_frame->size) { if (render->dst_buffer_capacity_ < video_frame->size) {
@@ -183,7 +178,6 @@ void Render::OnReceiveVideoBufferCb(const XVideoFrame *video_frame,
SDL_Event event; SDL_Event event;
event.type = REFRESH_EVENT; event.type = REFRESH_EVENT;
SDL_PushEvent(&event); SDL_PushEvent(&event);
render->received_frame_ = true;
render->streaming_ = true; render->streaming_ = true;
} }
} }