diff --git a/src/gui/render.cpp b/src/gui/render.cpp index 8a843b28..0a2d459b 100644 --- a/src/gui/render.cpp +++ b/src/gui/render.cpp @@ -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); } diff --git a/src/gui/render.h b/src/gui/render.h index 950f4d6d..c6b8a347 100644 --- a/src/gui/render.h +++ b/src/gui/render.h @@ -282,8 +282,6 @@ class Render { std::shared_ptr& props); void DrawReceivingScreenText( std::shared_ptr& props); - void DrawRemoteUnlockStateText( - std::shared_ptr& 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; diff --git a/src/gui/toolbars/control_bar.cpp b/src/gui/toolbars/control_bar.cpp index c8200586..9f0cf301 100644 --- a/src/gui/toolbars/control_bar.cpp +++ b/src/gui/toolbars/control_bar.cpp @@ -193,94 +193,6 @@ int Render::ControlBar(std::shared_ptr& 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; diff --git a/src/gui/windows/control_window.cpp b/src/gui/windows/control_window.cpp index 0183e38b..bd55e4a7 100644 --- a/src/gui/windows/control_window.cpp +++ b/src/gui/windows/control_window.cpp @@ -257,4 +257,3 @@ int Render::ControlWindow(std::shared_ptr& props) { return 0; } } // namespace crossdesk - diff --git a/src/gui/windows/stream_window.cpp b/src/gui/windows/stream_window.cpp index 44addbd5..06e13d7f 100644 --- a/src/gui/windows/stream_window.cpp +++ b/src/gui/windows/stream_window.cpp @@ -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& 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();