diff --git a/src/single_window/control_window.cpp b/src/single_window/control_window.cpp index f60c4fb..9c4208b 100644 --- a/src/single_window/control_window.cpp +++ b/src/single_window/control_window.cpp @@ -84,18 +84,23 @@ int Render::ControlWindow() { 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( ImVec2(new_control_window_pos_x, new_control_window_pos_y), ImGuiCond_Always); if (0 != mouse_diff_control_bar_pos_x_ && 0 != mouse_diff_control_bar_pos_y_) { - SDL_WarpMouseInWindow(stream_window_, (int)new_cursor_pos_x, - (int)new_cursor_pos_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_; + + 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; } else if (!reset_control_bar_pos_ && diff --git a/src/single_window/render.cpp b/src/single_window/render.cpp index da2afd4..9c448aa 100644 --- a/src/single_window/render.cpp +++ b/src/single_window/render.cpp @@ -507,10 +507,10 @@ int Render::CreateStreamWindow() { SDL_WindowFlags window_flags = (SDL_WindowFlags)(SDL_WINDOW_ALLOW_HIGHDPI | SDL_WINDOW_BORDERLESS); - stream_window_ = SDL_CreateWindow( - "Stream window", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, - (int)stream_window_width_default_, (int)stream_window_height_default_, - window_flags); + stream_window_ = + SDL_CreateWindow("Stream window", SDL_WINDOWPOS_UNDEFINED, + SDL_WINDOWPOS_UNDEFINED, stream_window_width_default_, + stream_window_height_default_, window_flags); stream_renderer_ = SDL_CreateRenderer( stream_window_, -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED); @@ -529,12 +529,22 @@ int Render::CreateStreamWindow() { // for window region action 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; return 0; } int Render::DestroyStreamWindow() { + stream_window_width_ = (float)stream_window_width_default_; + stream_window_height_ = (float)stream_window_height_default_; + if (stream_ctx_) { ImGui::SetCurrentContext(stream_ctx_); } @@ -626,10 +636,12 @@ int Render::SetupStreamWindow() { SDL_GL_GetDrawableSize(stream_window_, &main_window_width_real_, &main_window_height_real_); + stream_window_dpi_scaling_w_ = stream_window_width_real_ / stream_window_width_; stream_window_dpi_scaling_h_ = stream_window_width_real_ / stream_window_width_; + SDL_RenderSetScale(stream_renderer_, stream_window_dpi_scaling_w_, stream_window_dpi_scaling_h_); LOG_INFO("Use dpi scaling [{}x{}] for stream window", @@ -874,7 +886,6 @@ int Render::Run() { streaming_ = false; rejoin_ = false; connection_established_ = false; - received_frame_ = false; is_client_mode_ = false; audio_capture_button_pressed_ = false; fullscreen_button_pressed_ = false; @@ -884,14 +895,6 @@ int Render::Run() { memset(&net_traffic_stats_, 0, sizeof(net_traffic_stats_)); SDL_SetWindowFullscreen(main_window_, SDL_FALSE); 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; } else { @@ -902,10 +905,15 @@ int Render::Run() { } else if (event.window.event == SDL_WINDOWEVENT_MINIMIZED) { } else if (event.window.event == SDL_WINDOWEVENT_RESTORED) { 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; - SDL_GetWindowSize(stream_window_, (int*)&stream_window_width_, - (int*)&stream_window_height_); + int stream_window_width, 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_reverse = (float)video_height_ / (float)video_width_; diff --git a/src/single_window/render.h b/src/single_window/render.h index 0f01528..7791076 100644 --- a/src/single_window/render.h +++ b/src/single_window/render.h @@ -180,8 +180,8 @@ class Render { float main_window_height_ = 480; float main_window_width_last_ = 640; float main_window_height_last_ = 480; - float stream_window_width_default_ = 1280; - float stream_window_height_default_ = 720; + int stream_window_width_default_ = 1280; + int stream_window_height_default_ = 720; float stream_window_width_ = 1280; float stream_window_height_ = 720; int stream_window_width_last_ = 1280; @@ -279,7 +279,6 @@ class Render { bool mouse_control_button_pressed_ = false; bool audio_capture_button_pressed_ = false; bool show_settings_window_ = false; - bool received_frame_ = false; bool is_create_connection_ = false; bool audio_buffer_fresh_ = false; bool rejoin_ = false; diff --git a/src/single_window/render_callback_func.cpp b/src/single_window/render_callback_func.cpp index 9c0cc95..376f55b 100644 --- a/src/single_window/render_callback_func.cpp +++ b/src/single_window/render_callback_func.cpp @@ -162,11 +162,6 @@ void Render::OnReceiveVideoBufferCb(const XVideoFrame *video_frame, if (!render->dst_buffer_) { render->dst_buffer_capacity_ = 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) { @@ -183,7 +178,6 @@ void Render::OnReceiveVideoBufferCb(const XVideoFrame *video_frame, SDL_Event event; event.type = REFRESH_EVENT; SDL_PushEvent(&event); - render->received_frame_ = true; render->streaming_ = true; } }