mirror of
				https://github.com/kunkundi/crossdesk.git
				synced 2025-10-26 20:25:34 +08:00 
			
		
		
		
	[fix] fix mouse contorl error
This commit is contained in:
		| @@ -57,8 +57,8 @@ int Render::ControlBar(std::shared_ptr<SubStreamWindowProperties>& properties) { | ||||
|                             : ICON_FA_COMPUTER_MOUSE; | ||||
|     if (ImGui::Button(mouse.c_str(), ImVec2(25, 25))) { | ||||
|       if (properties->connection_established_) { | ||||
|         control_mouse_ = !control_mouse_; | ||||
|         start_keyboard_capturer_ = !start_keyboard_capturer_; | ||||
|         properties->control_mouse_ = !properties->control_mouse_; | ||||
|         properties->mouse_control_button_pressed_ = | ||||
|             !properties->mouse_control_button_pressed_; | ||||
|         properties->mouse_control_button_label_ = | ||||
|   | ||||
| @@ -78,9 +78,8 @@ int Render::RemoteWindow() { | ||||
|         ConnectTo(remote_id_, remote_password_, false); | ||||
|       } | ||||
|  | ||||
|       std::string client_id = "C-" + remote_id_; | ||||
|       if (client_properties_.find(client_id) != client_properties_.end()) { | ||||
|         auto props = client_properties_[client_id]; | ||||
|       if (client_properties_.find(remote_id_) != client_properties_.end()) { | ||||
|         auto props = client_properties_[remote_id_]; | ||||
|         if (props->rejoin_) { | ||||
|           ConnectTo(remote_id_, remote_password_, | ||||
|                     client_properties_[remote_id_]->remember_password_); | ||||
| @@ -107,41 +106,37 @@ static int InputTextCallback(ImGuiInputTextCallbackData *data) { | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| int Render::ConnectTo(const std::string &host_name, const char *password, | ||||
| int Render::ConnectTo(const std::string &remote_id, const char *password, | ||||
|                       bool remember_password) { | ||||
|   LOG_INFO("Connect to [{}]", host_name); | ||||
|   LOG_INFO("Connect to [{}]", remote_id); | ||||
|  | ||||
|   std::string client_id = "C-" + host_name; | ||||
|   if (client_properties_.find(client_id) == client_properties_.end()) { | ||||
|     client_properties_[client_id] = | ||||
|   if (client_properties_.find(remote_id) == client_properties_.end()) { | ||||
|     client_properties_[remote_id] = | ||||
|         std::make_shared<SubStreamWindowProperties>(); | ||||
|   } | ||||
|     auto props = client_properties_[remote_id]; | ||||
|     props->local_id_ = "C-" + remote_id; | ||||
|     props->remote_id_ = remote_id; | ||||
|     memcpy(&props->params_, ¶ms_, sizeof(Params)); | ||||
|     props->params_.user_id = props->local_id_.c_str(); | ||||
|     props->peer_ = CreatePeer(&props->params_); | ||||
|  | ||||
|   auto props = client_properties_[client_id]; | ||||
|   props->connection_status_ = ConnectionStatus::Connecting; | ||||
|   props->remember_password_ = remember_password; | ||||
|   memcpy(props->remote_password_, password, 6); | ||||
|  | ||||
|   int ret = -1; | ||||
|  | ||||
|   if (!props->connection_established_) { | ||||
|     if (peer_map_.find(client_id) == peer_map_.end()) { | ||||
|       memcpy(&props->params_, ¶ms_, sizeof(Params)); | ||||
|       props->params_.user_id = client_id.c_str(); | ||||
|       peer_map_[client_id] = CreatePeer(&props->params_); | ||||
|     } | ||||
|  | ||||
|     if (peer_map_[client_id]) { | ||||
|       LOG_INFO("[{}] Create peer instance successful", client_id); | ||||
|       Init(peer_map_[client_id]); | ||||
|       LOG_INFO("[{}] Peer init finish", client_id); | ||||
|     if (props->peer_) { | ||||
|       LOG_INFO("[{}] Create peer instance successful", props->local_id_); | ||||
|       Init(props->peer_); | ||||
|       LOG_INFO("[{}] Peer init finish", props->local_id_); | ||||
|     } else { | ||||
|       LOG_INFO("Create peer [{}] instance failed", client_id); | ||||
|       LOG_INFO("Create peer [{}] instance failed", props->local_id_); | ||||
|     } | ||||
|  | ||||
|     ret = JoinConnection(peer_map_[client_id], host_name.c_str(), password); | ||||
|     props->connection_status_ = ConnectionStatus::Connecting; | ||||
|     props->remember_password_ = remember_password; | ||||
|     memcpy(props->remote_password_, password, 6); | ||||
|   } | ||||
|   int ret = -1; | ||||
|   auto props = client_properties_[remote_id]; | ||||
|   if (!props->connection_established_) { | ||||
|     ret = JoinConnection(props->peer_, remote_id.c_str(), password); | ||||
|     if (0 == ret) { | ||||
|       is_client_mode_ = true; | ||||
|       props->rejoin_ = false; | ||||
|     } else { | ||||
|       props->rejoin_ = true; | ||||
|   | ||||
| @@ -431,10 +431,12 @@ int Render::CreateRtcConnection() { | ||||
|     mouse_controller_is_started_ = false; | ||||
|   } | ||||
|  | ||||
|   if (start_keyboard_capturer_ && !keyboard_capturer_is_started_) { | ||||
|     StartKeyboardCapturer(); | ||||
|     keyboard_capturer_is_started_ = true; | ||||
|   } else if (!start_keyboard_capturer_ && keyboard_capturer_is_started_) { | ||||
|   if (start_keyboard_capturer_ && foucs_on_stream_window_) { | ||||
|     if (!keyboard_capturer_is_started_) { | ||||
|       StartKeyboardCapturer(); | ||||
|       keyboard_capturer_is_started_ = true; | ||||
|     } | ||||
|   } else if (keyboard_capturer_is_started_) { | ||||
|     StopKeyboardCapturer(); | ||||
|     keyboard_capturer_is_started_ = false; | ||||
|   } | ||||
| @@ -858,8 +860,7 @@ int Render::Run() { | ||||
|             } | ||||
|  | ||||
|             std::string host_name = it.first; | ||||
|             PeerPtr* peer_client = peer_map_[host_name]; | ||||
|             if (peer_client) { | ||||
|             if (props->peer_) { | ||||
|               std::string client_id; | ||||
|               if (host_name == client_id_) { | ||||
|                 client_id = "C-" + std::string(client_id_); | ||||
| @@ -867,9 +868,9 @@ int Render::Run() { | ||||
|                 client_id = client_id_; | ||||
|               } | ||||
|               LOG_INFO("[{}] Leave connection [{}]", client_id, host_name); | ||||
|               LeaveConnection(peer_client, host_name.c_str()); | ||||
|               LeaveConnection(props->peer_, host_name.c_str()); | ||||
|               LOG_INFO("Destroy peer [{}]", client_id); | ||||
|               DestroyPeer(&peer_client); | ||||
|               DestroyPeer(&props->peer_); | ||||
|             } | ||||
|  | ||||
|             props->streaming_ = false; | ||||
| @@ -1000,8 +1001,49 @@ int Render::Run() { | ||||
|  | ||||
|         SDL_UpdateTexture(props->stream_texture_, NULL, props->dst_buffer_, | ||||
|                           props->texture_width_); | ||||
|       } else if (event.type == SDL_MOUSEMOTION || | ||||
|                  event.type == SDL_MOUSEBUTTONDOWN || | ||||
|                  event.type == SDL_MOUSEBUTTONUP || | ||||
|                  event.type == SDL_MOUSEWHEEL) { | ||||
|         if (!foucs_on_stream_window_) { | ||||
|           continue; | ||||
|         } | ||||
|  | ||||
|         for (auto& it : client_properties_) { | ||||
|           auto props = it.second; | ||||
|           if (props->control_mouse_) { | ||||
|             ProcessMouseEvent(event); | ||||
|           } | ||||
|         } | ||||
|       } else if (event.window.event == SDL_WINDOWEVENT_FOCUS_GAINED) { | ||||
|         if (stream_window_) { | ||||
|           if (SDL_GetWindowID(stream_window_) == event.window.windowID) { | ||||
|             foucs_on_stream_window_ = true; | ||||
|             LOG_INFO("Focus on stream window"); | ||||
|           } | ||||
|         } | ||||
|  | ||||
|         if (main_window_) { | ||||
|           if (SDL_GetWindowID(main_window_) == event.window.windowID) { | ||||
|             foucs_on_main_window_ = true; | ||||
|             LOG_INFO("Focus on main window"); | ||||
|           } | ||||
|         } | ||||
|       } else if (event.window.event == SDL_WINDOWEVENT_FOCUS_LOST) { | ||||
|         if (stream_window_) { | ||||
|           if (SDL_GetWindowID(stream_window_) == event.window.windowID) { | ||||
|             foucs_on_stream_window_ = false; | ||||
|             LOG_INFO("Lost focus on stream window"); | ||||
|           } | ||||
|         } | ||||
|  | ||||
|         if (main_window_) { | ||||
|           if (SDL_GetWindowID(main_window_) == event.window.windowID) { | ||||
|             foucs_on_main_window_ = false; | ||||
|             LOG_INFO("Lost focus on main window"); | ||||
|           } | ||||
|         } | ||||
|       } else { | ||||
|         ProcessMouseEvent(event); | ||||
|       } | ||||
|     } | ||||
|  | ||||
| @@ -1103,7 +1145,7 @@ int Render::Run() { | ||||
|     } | ||||
|  | ||||
|     std::string host_name = it.first; | ||||
|     PeerPtr* peer_client = peer_map_[host_name]; | ||||
|     PeerPtr* peer_client = props->peer_; | ||||
|     if (peer_client) { | ||||
|       std::string client_id; | ||||
|       if (host_name == client_id_) { | ||||
|   | ||||
| @@ -31,6 +31,9 @@ class Render { | ||||
|  public: | ||||
|   struct SubStreamWindowProperties { | ||||
|     Params params_; | ||||
|     PeerPtr *peer_ = nullptr; | ||||
|     std::string local_id_ = ""; | ||||
|     std::string remote_id_ = ""; | ||||
|     bool exit_ = false; | ||||
|     bool signal_connected_ = false; | ||||
|     SignalStatus signal_status_ = SignalStatus::SignalClosed; | ||||
| @@ -40,6 +43,7 @@ class Render { | ||||
|     bool mouse_control_button_pressed_ = false; | ||||
|     bool mouse_controller_is_started_ = false; | ||||
|     bool audio_capture_button_pressed_ = false; | ||||
|     bool control_mouse_ = false; | ||||
|     bool streaming_ = false; | ||||
|     bool is_control_bar_in_left_ = true; | ||||
|     bool control_bar_hovered_ = false; | ||||
| @@ -117,7 +121,7 @@ class Render { | ||||
|  | ||||
|  private: | ||||
|   int CreateRtcConnection(); | ||||
|   int ConnectTo(const std::string &host_name, const char *password, | ||||
|   int ConnectTo(const std::string &remote_id, const char *password, | ||||
|                 bool remember_password); | ||||
|   int CreateMainWindow(); | ||||
|   int DestroyMainWindow(); | ||||
| @@ -243,6 +247,8 @@ class Render { | ||||
|   bool screen_capturer_is_started_ = false; | ||||
|   bool start_keyboard_capturer_ = false; | ||||
|   bool keyboard_capturer_is_started_ = false; | ||||
|   bool foucs_on_main_window_ = false; | ||||
|   bool foucs_on_stream_window_ = false; | ||||
|   bool audio_capture_ = false; | ||||
|   int main_window_width_real_ = 720; | ||||
|   int main_window_height_real_ = 540; | ||||
| @@ -334,7 +340,6 @@ class Render { | ||||
|   double regenerate_password_start_time_ = 0; | ||||
|   SignalStatus signal_status_ = SignalStatus::SignalClosed; | ||||
|   std::string signal_status_str_ = ""; | ||||
|   std::string connection_status_str_ = ""; | ||||
|   bool signal_connected_ = false; | ||||
|   PeerPtr *peer_ = nullptr; | ||||
|   PeerPtr *peer_reserved_ = nullptr; | ||||
| @@ -368,7 +373,6 @@ class Render { | ||||
|   /* ------ sub stream window property start ------ */ | ||||
|   std::unordered_map<std::string, std::shared_ptr<SubStreamWindowProperties>> | ||||
|       client_properties_; | ||||
|   std::unordered_map<std::string, PeerPtr *> peer_map_; | ||||
|   /* ------ stream window property end ------ */ | ||||
|  | ||||
|   std::unordered_map<std::string, std::shared_ptr<SubStreamWindowProperties>> | ||||
|   | ||||
| @@ -43,38 +43,41 @@ int Render::ProcessMouseEvent(SDL_Event &event) { | ||||
|       video_height = props->video_height_; | ||||
|       render_width = props->stream_render_rect_.w; | ||||
|       render_height = props->stream_render_rect_.h; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   float ratio_x = (float)video_width / (float)render_width; | ||||
|   float ratio_y = (float)video_height / (float)render_height; | ||||
|       float ratio_x = (float)video_width / (float)render_width; | ||||
|       float ratio_y = (float)video_height / (float)render_height; | ||||
|  | ||||
|   RemoteAction remote_action; | ||||
|   remote_action.m.x = (size_t)(event.button.x * ratio_x); | ||||
|   remote_action.m.y = (size_t)(event.button.y * ratio_y); | ||||
|       RemoteAction remote_action; | ||||
|       remote_action.m.x = (size_t)(event.button.x * ratio_x); | ||||
|       remote_action.m.y = (size_t)(event.button.y * ratio_y); | ||||
|  | ||||
|   if (SDL_MOUSEBUTTONDOWN == event.type) { | ||||
|     remote_action.type = ControlType::mouse; | ||||
|     if (SDL_BUTTON_LEFT == event.button.button) { | ||||
|       remote_action.m.flag = MouseFlag::left_down; | ||||
|     } else if (SDL_BUTTON_RIGHT == event.button.button) { | ||||
|       remote_action.m.flag = MouseFlag::right_down; | ||||
|       if (SDL_MOUSEBUTTONDOWN == event.type) { | ||||
|         remote_action.type = ControlType::mouse; | ||||
|         if (SDL_BUTTON_LEFT == event.button.button) { | ||||
|           remote_action.m.flag = MouseFlag::left_down; | ||||
|         } else if (SDL_BUTTON_RIGHT == event.button.button) { | ||||
|           remote_action.m.flag = MouseFlag::right_down; | ||||
|         } | ||||
|         remote_action.m.flag = MouseFlag::move; | ||||
|         SendDataFrame(peer_, (const char *)&remote_action, | ||||
|                       sizeof(remote_action)); | ||||
|       } else if (SDL_MOUSEBUTTONUP == event.type) { | ||||
|         remote_action.type = ControlType::mouse; | ||||
|         if (SDL_BUTTON_LEFT == event.button.button) { | ||||
|           remote_action.m.flag = MouseFlag::left_up; | ||||
|         } else if (SDL_BUTTON_RIGHT == event.button.button) { | ||||
|           remote_action.m.flag = MouseFlag::right_up; | ||||
|         } | ||||
|         remote_action.m.flag = MouseFlag::move; | ||||
|         SendDataFrame(peer_, (const char *)&remote_action, | ||||
|                       sizeof(remote_action)); | ||||
|       } else if (SDL_MOUSEMOTION == event.type) { | ||||
|         remote_action.type = ControlType::mouse; | ||||
|         remote_action.m.flag = MouseFlag::move; | ||||
|         SendDataFrame(peer_, (const char *)&remote_action, | ||||
|                       sizeof(remote_action)); | ||||
|       } | ||||
|     } | ||||
|     remote_action.m.flag = MouseFlag::move; | ||||
|     SendDataFrame(peer_, (const char *)&remote_action, sizeof(remote_action)); | ||||
|   } else if (SDL_MOUSEBUTTONUP == event.type) { | ||||
|     remote_action.type = ControlType::mouse; | ||||
|     if (SDL_BUTTON_LEFT == event.button.button) { | ||||
|       remote_action.m.flag = MouseFlag::left_up; | ||||
|     } else if (SDL_BUTTON_RIGHT == event.button.button) { | ||||
|       remote_action.m.flag = MouseFlag::right_up; | ||||
|     } | ||||
|     remote_action.m.flag = MouseFlag::move; | ||||
|     SendDataFrame(peer_, (const char *)&remote_action, sizeof(remote_action)); | ||||
|   } else if (SDL_MOUSEMOTION == event.type) { | ||||
|     remote_action.type = ControlType::mouse; | ||||
|     remote_action.m.flag = MouseFlag::move; | ||||
|     SendDataFrame(peer_, (const char *)&remote_action, sizeof(remote_action)); | ||||
|   } | ||||
|  | ||||
|   return 0; | ||||
| @@ -87,9 +90,13 @@ void Render::SdlCaptureAudioIn(void *userdata, Uint8 *stream, int len) { | ||||
|   } | ||||
|  | ||||
|   if (1) { | ||||
|     if ("Connected" == render->connection_status_str_) { | ||||
|       SendAudioFrame(render->peer_, (const char *)stream, len); | ||||
|     for (auto it : render->client_properties_) { | ||||
|       auto props = it.second; | ||||
|       if (props->connection_status_ == ConnectionStatus::Connected) { | ||||
|         SendAudioFrame(props->peer_, (const char *)stream, len); | ||||
|       } | ||||
|     } | ||||
|  | ||||
|   } else { | ||||
|     memcpy(render->audio_buffer_, stream, len); | ||||
|     render->audio_len_ = len; | ||||
| @@ -102,8 +109,11 @@ void Render::SdlCaptureAudioOut([[maybe_unused]] void *userdata, | ||||
|                                 [[maybe_unused]] Uint8 *stream, | ||||
|                                 [[maybe_unused]] int len) { | ||||
|   // Render *render = (Render *)userdata; | ||||
|   // if ("Connected" == render->connection_status_str_) { | ||||
|   //   SendAudioFrame(render->peer_,  (const char *)stream, len); | ||||
|   // for (auto it : render->client_properties_) { | ||||
|   //   auto props = it.second; | ||||
|   //   if (props->connection_status_ == SignalStatus::SignalConnected) { | ||||
|   //     SendAudioFrame(props->peer_, (const char *)stream, len); | ||||
|   //   } | ||||
|   // } | ||||
|  | ||||
|   // if (!render->audio_buffer_fresh_) { | ||||
| @@ -223,15 +233,15 @@ void Render::OnSignalStatusCb(SignalStatus status, const char *user_id, | ||||
|   if (!render) { | ||||
|     return; | ||||
|   } | ||||
|   std::string remote_id(user_id, user_id_size); | ||||
|  | ||||
|   if (remote_id == render->client_id_) { | ||||
|   std::string client_id(user_id, user_id_size); | ||||
|   if (client_id == render->client_id_) { | ||||
|     render->signal_status_ = status; | ||||
|     if (SignalStatus::SignalConnecting == status) { | ||||
|       render->signal_connected_ = false; | ||||
|     } else if (SignalStatus::SignalConnected == status) { | ||||
|       render->signal_connected_ = true; | ||||
|       LOG_INFO("[{}] connected to signal server", remote_id); | ||||
|       LOG_INFO("[{}] connected to signal server", client_id); | ||||
|     } else if (SignalStatus::SignalFailed == status) { | ||||
|       render->signal_connected_ = false; | ||||
|     } else if (SignalStatus::SignalClosed == status) { | ||||
| @@ -242,6 +252,11 @@ void Render::OnSignalStatusCb(SignalStatus status, const char *user_id, | ||||
|       render->signal_connected_ = false; | ||||
|     } | ||||
|   } else { | ||||
|     if (client_id.rfind("C-", 0) != 0) { | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|     std::string remote_id(client_id.begin() + 2, client_id.end()); | ||||
|     if (render->client_properties_.find(remote_id) == | ||||
|         render->client_properties_.end()) { | ||||
|       return; | ||||
| @@ -292,11 +307,8 @@ void Render::OnConnectionStatusCb(ConnectionStatus status, const char *user_id, | ||||
|   props->connection_status_ = status; | ||||
|   render->show_connection_status_window_ = true; | ||||
|   if (ConnectionStatus::Connecting == status) { | ||||
|     render->connection_status_str_ = "Connecting"; | ||||
|   } else if (ConnectionStatus::Gathering == status) { | ||||
|     render->connection_status_str_ = "Gathering"; | ||||
|   } else if (ConnectionStatus::Connected == status) { | ||||
|     render->connection_status_str_ = "Connected"; | ||||
|     if (!render->need_to_create_stream_window_) { | ||||
|       render->need_to_create_stream_window_ = true; | ||||
|     } | ||||
| @@ -324,18 +336,15 @@ void Render::OnConnectionStatusCb(ConnectionStatus status, const char *user_id, | ||||
|           (int)(render->stream_window_height_ - render->title_bar_height_); | ||||
|     } | ||||
|  | ||||
|     if (render->peer_reserved_ || !render->is_client_mode_) { | ||||
|     if (!render->is_client_mode_) { | ||||
|       render->start_screen_capturer_ = true; | ||||
|       render->start_mouse_controller_ = true; | ||||
|     } | ||||
|   } else if (ConnectionStatus::Disconnected == status) { | ||||
|     render->connection_status_str_ = "Disconnected"; | ||||
|     render->password_validating_time_ = 0; | ||||
|   } else if (ConnectionStatus::Failed == status) { | ||||
|     render->connection_status_str_ = "Failed"; | ||||
|     render->password_validating_time_ = 0; | ||||
|   } else if (ConnectionStatus::Closed == status) { | ||||
|     render->connection_status_str_ = "Closed"; | ||||
|     render->password_validating_time_ = 0; | ||||
|     render->start_screen_capturer_ = false; | ||||
|     render->start_mouse_controller_ = false; | ||||
| @@ -357,7 +366,6 @@ void Render::OnConnectionStatusCb(ConnectionStatus status, const char *user_id, | ||||
|                         props->texture_width_); | ||||
|     } | ||||
|   } else if (ConnectionStatus::IncorrectPassword == status) { | ||||
|     render->connection_status_str_ = "Incorrect password"; | ||||
|     render->password_validating_ = false; | ||||
|     render->password_validating_time_++; | ||||
|     if (render->connect_button_pressed_) { | ||||
| @@ -368,7 +376,6 @@ void Render::OnConnectionStatusCb(ConnectionStatus status, const char *user_id, | ||||
|               : localization::connect[render->localization_language_index_]; | ||||
|     } | ||||
|   } else if (ConnectionStatus::NoSuchTransmissionId == status) { | ||||
|     render->connection_status_str_ = "No such transmission id"; | ||||
|     if (render->connect_button_pressed_) { | ||||
|       props->connection_established_ = false; | ||||
|       render->connect_button_label_ = | ||||
|   | ||||
							
								
								
									
										2
									
								
								thirdparty/projectx
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								thirdparty/projectx
									
									
									
									
										vendored
									
									
								
							 Submodule thirdparty/projectx updated: 9972047199...f48d940b80
									
								
							
		Reference in New Issue
	
	Block a user