[fix] fix wheel event grabbing

This commit is contained in:
dijunkun
2025-04-15 17:32:23 +08:00
parent 662cbbc3cc
commit 536fe17055
2 changed files with 110 additions and 107 deletions

View File

@@ -308,6 +308,7 @@ class Render {
int original_display_width_ = 0; int original_display_width_ = 0;
int original_display_height_ = 0; int original_display_height_ = 0;
bool hostname_sent_ = false; bool hostname_sent_ = false;
SDL_Event last_mouse_event;
// stream window render // stream window render
SDL_Window *stream_window_ = nullptr; SDL_Window *stream_window_ = nullptr;
@@ -391,9 +392,6 @@ class Render {
std::unordered_map<std::string, std::shared_ptr<SubStreamWindowProperties>> std::unordered_map<std::string, std::shared_ptr<SubStreamWindowProperties>>
client_properties_; client_properties_;
/* ------ stream window property end ------ */ /* ------ stream window property end ------ */
std::unordered_map<std::string, std::shared_ptr<SubStreamWindowProperties>>
server_properties_;
}; };
#endif #endif

View File

@@ -41,6 +41,8 @@ int Render::ProcessMouseEvent(SDL_Event &event) {
controlled_remote_id_ = ""; controlled_remote_id_ = "";
int video_width, video_height = 0; int video_width, video_height = 0;
int render_width, render_height = 0; int render_width, render_height = 0;
RemoteAction remote_action;
for (auto &it : client_properties_) { for (auto &it : client_properties_) {
auto props = it.second; auto props = it.second;
if (!props->control_mouse_) { if (!props->control_mouse_) {
@@ -56,13 +58,14 @@ int Render::ProcessMouseEvent(SDL_Event &event) {
controlled_remote_id_ = it.first; controlled_remote_id_ = it.first;
render_width = props->stream_render_rect_.w; render_width = props->stream_render_rect_.w;
render_height = props->stream_render_rect_.h; render_height = props->stream_render_rect_.h;
last_mouse_event.button.x = event.button.x;
last_mouse_event.button.y = event.button.y;
float ratio_x = float ratio_x =
(float)props->original_display_width_ / (float)render_width; (float)props->original_display_width_ / (float)render_width;
float ratio_y = float ratio_y =
(float)props->original_display_height_ / (float)render_height; (float)props->original_display_height_ / (float)render_height;
RemoteAction remote_action;
remote_action.m.x = remote_action.m.x =
(size_t)((event.button.x - props->stream_render_rect_.x) * ratio_x); (size_t)((event.button.x - props->stream_render_rect_.x) * ratio_x);
remote_action.m.y = remote_action.m.y =
@@ -93,28 +96,34 @@ int Render::ProcessMouseEvent(SDL_Event &event) {
} else if (SDL_MOUSEMOTION == event.type) { } else if (SDL_MOUSEMOTION == event.type) {
remote_action.type = ControlType::mouse; remote_action.type = ControlType::mouse;
remote_action.m.flag = MouseFlag::move; remote_action.m.flag = MouseFlag::move;
SendDataFrame(props->peer_, (const char *)&remote_action,
sizeof(remote_action));
} else if (SDL_MOUSEWHEEL == event.type) {
int scroll_x = event.wheel.x;
int scroll_y = event.wheel.y;
if (event.wheel.direction == SDL_MOUSEWHEEL_FLIPPED) {
scroll_x = -scroll_x;
scroll_y = -scroll_y;
}
remote_action.type = ControlType::mouse;
if (scroll_x == 0) {
remote_action.m.flag = MouseFlag::wheel_vertical;
remote_action.m.s = scroll_y;
} else if (scroll_y == 0) {
remote_action.m.flag = MouseFlag::wheel_horizontal;
remote_action.m.s = scroll_x;
}
SendDataFrame(props->peer_, (const char *)&remote_action, SendDataFrame(props->peer_, (const char *)&remote_action,
sizeof(remote_action)); sizeof(remote_action));
} }
} else if (SDL_MOUSEWHEEL == event.type &&
last_mouse_event.button.x >= props->stream_render_rect_.x &&
last_mouse_event.button.x <= props->stream_render_rect_.x +
props->stream_render_rect_.w &&
last_mouse_event.button.y >= props->stream_render_rect_.y &&
last_mouse_event.button.y <= props->stream_render_rect_.y +
props->stream_render_rect_.h) {
int scroll_x = event.wheel.x;
int scroll_y = event.wheel.y;
if (event.wheel.direction == SDL_MOUSEWHEEL_FLIPPED) {
scroll_x = -scroll_x;
scroll_y = -scroll_y;
}
remote_action.type = ControlType::mouse;
if (scroll_x == 0) {
remote_action.m.flag = MouseFlag::wheel_vertical;
remote_action.m.s = scroll_y;
} else if (scroll_y == 0) {
remote_action.m.flag = MouseFlag::wheel_horizontal;
remote_action.m.s = scroll_x;
}
SendDataFrame(props->peer_, (const char *)&remote_action,
sizeof(remote_action));
} }
} }
@@ -325,94 +334,90 @@ void Render::OnSignalStatusCb(SignalStatus status, const char *user_id,
void Render::OnConnectionStatusCb(ConnectionStatus status, const char *user_id, void Render::OnConnectionStatusCb(ConnectionStatus status, const char *user_id,
const size_t user_id_size, void *user_data) { const size_t user_id_size, void *user_data) {
Render *render = (Render *)user_data; Render *render = (Render *)user_data;
if (!render) { if (!render) return;
return;
}
bool is_server = false;
std::shared_ptr<SubStreamWindowProperties> props;
std::string remote_id(user_id, user_id_size); std::string remote_id(user_id, user_id_size);
if (render->client_properties_.find(remote_id) != auto it = render->client_properties_.find(remote_id);
render->client_properties_.end()) { auto props = (it != render->client_properties_.end()) ? it->second : nullptr;
props = render->client_properties_.find(remote_id)->second;
if (props) {
render->is_client_mode_ = true;
render->show_connection_status_window_ = true;
props->connection_status_ = status;
switch (status) {
case ConnectionStatus::Connected:
if (!render->need_to_create_stream_window_ &&
!render->client_properties_.empty()) {
render->need_to_create_stream_window_ = true;
}
props->connection_established_ = true;
props->stream_render_rect_ = {
0, (int)render->title_bar_height_,
(int)render->stream_window_width_,
(int)(render->stream_window_height_ - render->title_bar_height_)};
break;
case ConnectionStatus::Disconnected:
case ConnectionStatus::Failed:
case ConnectionStatus::Closed:
render->password_validating_time_ = 0;
render->start_screen_capturer_ = false;
render->start_mouse_controller_ = false;
render->start_keyboard_capturer_ = false;
render->control_mouse_ = false;
render->hostname_sent_ = false;
props->connection_established_ = false;
props->mouse_control_button_pressed_ = false;
if (props->dst_buffer_) {
memset(props->dst_buffer_, 0, props->dst_buffer_capacity_);
SDL_UpdateTexture(props->stream_texture_, NULL, props->dst_buffer_,
props->texture_width_);
}
break;
case ConnectionStatus::IncorrectPassword:
render->password_validating_ = false;
render->password_validating_time_++;
if (render->connect_button_pressed_) {
render->connect_button_pressed_ = false;
props->connection_established_ = false;
render->connect_button_label_ =
localization::connect[render->localization_language_index_];
}
break;
case ConnectionStatus::NoSuchTransmissionId:
if (render->connect_button_pressed_) {
props->connection_established_ = false;
render->connect_button_label_ =
localization::connect[render->localization_language_index_];
}
break;
default:
break;
}
} else { } else {
if (render->server_properties_.find(remote_id) == render->is_client_mode_ = false;
render->server_properties_.end()) { render->show_connection_status_window_ = true;
render->server_properties_[remote_id] =
std::make_shared<SubStreamWindowProperties>();
}
props = render->server_properties_.find(remote_id)->second;
is_server = true;
}
props->connection_status_ = status; switch (status) {
render->show_connection_status_window_ = true; case ConnectionStatus::Connected:
if (ConnectionStatus::Connecting == status) { render->start_screen_capturer_ = true;
} else if (ConnectionStatus::Gathering == status) { render->start_mouse_controller_ = true;
} else if (ConnectionStatus::Connected == status) { break;
if (!render->need_to_create_stream_window_ && case ConnectionStatus::Closed:
!render->client_properties_.empty()) { render->start_screen_capturer_ = false;
render->need_to_create_stream_window_ = true; render->start_mouse_controller_ = false;
} render->start_keyboard_capturer_ = false;
render->hostname_sent_ = false;
props->connection_established_ = true; render->original_display_width_ = 0;
render->original_display_height_ = 0;
if (!is_server) { if (props) props->connection_established_ = false;
props->stream_render_rect_.x = 0; if (render->audio_capture_) {
props->stream_render_rect_.y = (int)render->title_bar_height_; render->StopSpeakerCapturer();
props->stream_render_rect_.w = (int)render->stream_window_width_; render->audio_capture_ = false;
props->stream_render_rect_.h = }
(int)(render->stream_window_height_ - render->title_bar_height_); break;
} default:
break;
if (!render->is_client_mode_) {
render->start_screen_capturer_ = true;
render->start_mouse_controller_ = true;
}
} else if (ConnectionStatus::Disconnected == status) {
render->password_validating_time_ = 0;
} else if (ConnectionStatus::Failed == status) {
render->password_validating_time_ = 0;
} else if (ConnectionStatus::Closed == status) {
render->password_validating_time_ = 0;
render->start_screen_capturer_ = false;
render->start_mouse_controller_ = false;
render->start_keyboard_capturer_ = false;
render->control_mouse_ = false;
render->hostname_sent_ = false;
render->original_display_width_ = 0;
render->original_display_height_ = 0;
props->connection_established_ = false;
props->mouse_control_button_pressed_ = false;
if (render->audio_capture_) {
render->StopSpeakerCapturer();
render->audio_capture_ = false;
}
if (props->dst_buffer_) {
memset(props->dst_buffer_, 0, props->dst_buffer_capacity_);
SDL_UpdateTexture(props->stream_texture_, NULL, props->dst_buffer_,
props->texture_width_);
}
} else if (ConnectionStatus::IncorrectPassword == status) {
render->password_validating_ = false;
render->password_validating_time_++;
if (render->connect_button_pressed_) {
render->connect_button_pressed_ = false;
props->connection_established_ = false;
render->connect_button_label_ =
render->connect_button_pressed_
? localization::disconnect[render->localization_language_index_]
: localization::connect[render->localization_language_index_];
}
} else if (ConnectionStatus::NoSuchTransmissionId == status) {
if (render->connect_button_pressed_) {
props->connection_established_ = false;
render->connect_button_label_ =
render->connect_button_pressed_
? localization::disconnect[render->localization_language_index_]
: localization::connect[render->localization_language_index_];
} }
} }
} }