[fix] use SDL keyboard capture on Wayland only

This commit is contained in:
dijunkun
2026-04-21 17:37:19 +08:00
parent d3b886c3f6
commit 2be6e727ce
5 changed files with 19 additions and 160 deletions
+18 -11
View File
@@ -794,16 +794,21 @@ int Render::StopMouseController() {
}
int Render::StartKeyboardCapturer() {
keyboard_capturer_uses_sdl_events_ = false;
#if defined(__linux__) && !defined(__APPLE__)
if (IsWaylandSession()) {
keyboard_capturer_uses_sdl_events_ = true;
LOG_INFO("Start keyboard capturer with SDL Wayland backend");
return 0;
}
#endif
if (!keyboard_capturer_) {
LOG_INFO("keyboard capturer is nullptr");
return -1;
keyboard_capturer_uses_sdl_events_ = true;
LOG_WARN(
"keyboard capturer is nullptr, falling back to SDL keyboard events");
return 0;
}
int keyboard_capturer_init_ret = keyboard_capturer_->Hook(
@@ -815,21 +820,23 @@ int Render::StartKeyboardCapturer() {
},
this);
if (0 != keyboard_capturer_init_ret) {
LOG_ERROR("Start keyboard capturer failed");
keyboard_capturer_uses_sdl_events_ = true;
LOG_WARN(
"Start keyboard capturer failed, falling back to SDL keyboard "
"events");
} else {
LOG_INFO("Start keyboard capturer");
LOG_INFO("Start keyboard capturer with native hook");
}
return keyboard_capturer_init_ret;
return 0;
}
int Render::StopKeyboardCapturer() {
#if defined(__linux__) && !defined(__APPLE__)
if (IsWaylandSession()) {
LOG_INFO("Stop keyboard capturer with SDL Wayland backend");
if (keyboard_capturer_uses_sdl_events_) {
keyboard_capturer_uses_sdl_events_ = false;
LOG_INFO("Stop keyboard capturer with SDL keyboard backend");
return 0;
}
#endif
if (keyboard_capturer_) {
keyboard_capturer_->Unhook();
@@ -2719,8 +2726,8 @@ void Render::ProcessSdlEvent(const SDL_Event& event) {
case SDL_EVENT_KEY_DOWN:
case SDL_EVENT_KEY_UP:
if (keyboard_capturer_is_started_ && focus_on_stream_window_ &&
stream_window_ &&
if (keyboard_capturer_is_started_ && keyboard_capturer_uses_sdl_events_ &&
focus_on_stream_window_ && stream_window_ &&
SDL_GetWindowID(stream_window_) == event.key.windowID) {
ProcessKeyboardEvent(event);
}
+1 -2
View File
@@ -282,8 +282,6 @@ class Render {
std::shared_ptr<SubStreamWindowProperties>& props);
void DrawReceivingScreenText(
std::shared_ptr<SubStreamWindowProperties>& props);
void DrawRemoteUnlockStateText(
std::shared_ptr<SubStreamWindowProperties>& props);
void ResetRemoteServiceStatus(SubStreamWindowProperties& props);
void ApplyRemoteServiceStatus(SubStreamWindowProperties& props,
const ServiceStatus& status);
@@ -478,6 +476,7 @@ class Render {
bool start_keyboard_capturer_ = false;
bool show_cursor_ = false;
bool keyboard_capturer_is_started_ = false;
bool keyboard_capturer_uses_sdl_events_ = false;
bool foucs_on_main_window_ = false;
bool focus_on_stream_window_ = false;
bool main_window_minimized_ = false;
-88
View File
@@ -193,94 +193,6 @@ int Render::ControlBar(std::shared_ptr<SubStreamWindowProperties>& props) {
text_pos, IM_COL32(0, 0, 0, 255),
std::to_string(props->selected_display_ + 1).c_str());
if (props->remote_service_status_received_) {
ImGui::SameLine();
const RemoteUnlockState unlock_state = GetRemoteUnlockState(*props);
bool sas_button_style_pushed = false;
switch (unlock_state) {
case RemoteUnlockState::service_unavailable:
ImGui::PushStyleColor(ImGuiCol_Button,
ImVec4(185 / 255.0f, 28 / 255.0f,
28 / 255.0f, 1.0f));
sas_button_style_pushed = true;
break;
case RemoteUnlockState::credential_ui:
ImGui::PushStyleColor(ImGuiCol_Button,
ImVec4(22 / 255.0f, 163 / 255.0f,
74 / 255.0f, 1.0f));
sas_button_style_pushed = true;
break;
case RemoteUnlockState::lock_screen:
ImGui::PushStyleColor(ImGuiCol_Button,
ImVec4(202 / 255.0f, 138 / 255.0f,
4 / 255.0f, 1.0f));
sas_button_style_pushed = true;
break;
default:
break;
}
const bool can_send_sas =
props->connection_status_ == ConnectionStatus::Connected &&
props->peer_ != nullptr && props->remote_service_available_;
if (!can_send_sas) {
ImGui::BeginDisabled();
}
std::string sas_button = ICON_FA_UNLOCK_KEYHOLE;
ImGui::SetWindowFontScale(0.5f);
if (ImGui::Button(sas_button.c_str(),
ImVec2(button_width, button_height))) {
RemoteAction remote_action{};
remote_action.type = ControlType::service_command;
remote_action.c.flag = ServiceCommandFlag::send_sas;
std::string msg = remote_action.to_json();
SendReliableDataFrame(props->peer_, msg.c_str(), msg.size(),
props->control_data_label_.c_str());
}
if (!can_send_sas) {
ImGui::EndDisabled();
}
if (ImGui::IsItemHovered()) {
std::string tooltip = localization::send_sas[localization_language_index_];
switch (unlock_state) {
case RemoteUnlockState::service_unavailable:
tooltip = localization::remote_service_unavailable
[localization_language_index_];
break;
case RemoteUnlockState::credential_ui:
tooltip = localization::remote_password_box_visible
[localization_language_index_] +
"\n" +
localization::remote_unlock_requires_secure_desktop
[localization_language_index_];
break;
case RemoteUnlockState::lock_screen:
tooltip = localization::remote_lock_screen_hint
[localization_language_index_];
break;
case RemoteUnlockState::secure_desktop:
tooltip = localization::remote_secure_desktop_active
[localization_language_index_];
break;
default:
break;
}
ImGui::BeginTooltip();
ImGui::PushTextWrapPos(button_width * 8.0f);
ImGui::TextWrapped("%s", tooltip.c_str());
ImGui::PopTextWrapPos();
ImGui::EndTooltip();
}
if (sas_button_style_pushed) {
ImGui::PopStyleColor();
}
}
ImGui::SameLine();
float mouse_x = ImGui::GetCursorScreenPos().x;
float mouse_y = ImGui::GetCursorScreenPos().y;
-1
View File
@@ -257,4 +257,3 @@ int Render::ControlWindow(std::shared_ptr<SubStreamWindowProperties>& props) {
return 0;
}
} // namespace crossdesk
-58
View File
@@ -59,62 +59,6 @@ void Render::DrawReceivingScreenText(
ImGui::TextColored(ImVec4(1.0f, 1.0f, 1.0f, 0.92f), "%s", text.c_str());
}
void Render::DrawRemoteUnlockStateText(
std::shared_ptr<SubStreamWindowProperties>& props) {
if (!props->remote_service_status_received_ ||
!props->connection_established_ ||
props->connection_status_ != ConnectionStatus::Connected) {
return;
}
const RemoteUnlockState unlock_state = GetRemoteUnlockState(*props);
std::string text;
ImU32 background_color = IM_COL32(37, 99, 235, 220);
switch (unlock_state) {
case RemoteUnlockState::service_unavailable:
text = localization::remote_service_unavailable
[localization_language_index_];
background_color = IM_COL32(185, 28, 28, 220);
break;
case RemoteUnlockState::credential_ui:
text = localization::remote_password_box_visible
[localization_language_index_];
background_color = IM_COL32(22, 163, 74, 220);
break;
case RemoteUnlockState::lock_screen:
text = localization::remote_lock_screen_hint
[localization_language_index_];
background_color = IM_COL32(202, 138, 4, 220);
break;
case RemoteUnlockState::secure_desktop:
text = localization::remote_secure_desktop_active
[localization_language_index_];
background_color = IM_COL32(147, 51, 234, 220);
break;
default:
return;
}
ImDrawList* draw_list = ImGui::GetWindowDrawList();
ImVec2 window_pos = ImGui::GetWindowPos();
ImVec2 window_size = ImGui::GetWindowSize();
ImVec2 text_size = ImGui::CalcTextSize(text.c_str());
float padding_x = title_bar_height_ * 0.45f;
float padding_y = title_bar_height_ * 0.18f;
float top_margin = fullscreen_button_pressed_ ? title_bar_height_ * 0.35f
: title_bar_height_ * 0.18f;
ImVec2 text_pos(window_pos.x + (window_size.x - text_size.x) * 0.5f,
window_pos.y + top_margin + padding_y);
ImVec2 rect_min(text_pos.x - padding_x, text_pos.y - padding_y);
ImVec2 rect_max(text_pos.x + text_size.x + padding_x,
text_pos.y + text_size.y + padding_y);
draw_list->AddRectFilled(rect_min, rect_max, background_color,
window_rounding_ * 0.9f);
draw_list->AddText(text_pos, IM_COL32(255, 255, 255, 255), text.c_str());
}
void Render::CloseTab(decltype(client_properties_)::iterator& it) {
// std::unique_lock lock(client_properties_mutex_);
if (it != client_properties_.end()) {
@@ -229,7 +173,6 @@ int Render::StreamWindow() {
FileTransferWindow(props);
DrawReceivingScreenText(props);
DrawRemoteUnlockStateText(props);
focused_remote_id_ = props->remote_id_;
@@ -332,7 +275,6 @@ int Render::StreamWindow() {
FileTransferWindow(props);
DrawReceivingScreenText(props);
DrawRemoteUnlockStateText(props);
ImGui::End();