diff --git a/src/gui/main.cpp b/src/gui/main.cpp index 47ab36a..28b3c8a 100644 --- a/src/gui/main.cpp +++ b/src/gui/main.cpp @@ -7,13 +7,13 @@ #endif #include "log.h" -#include "main_window.h" +#include "render.h" int main(int argc, char *argv[]) { LOG_INFO("Remote desk"); - MainWindow main_window; + Render render; - main_window.Run(); + render.Run(); return 0; } \ No newline at end of file diff --git a/src/multiple_windows/layout_style.h b/src/multiple_windows/layout_style.h index 183c5c5..ce7d67e 100644 --- a/src/multiple_windows/layout_style.h +++ b/src/multiple_windows/layout_style.h @@ -10,6 +10,10 @@ #ifdef _WIN32 #define MENU_WINDOW_WIDTH_CN 300 #define MENU_WINDOW_HEIGHT_CN 280 +#define LOCAL_WINDOW_WIDTH_CN 300 +#define LOCAL_WINDOW_HEIGHT_CN 280 +#define REMOTE_WINDOW_WIDTH_CN 300 +#define REMOTE_WINDOW_HEIGHT_CN 280 #define MENU_WINDOW_WIDTH_EN 190 #define MENU_WINDOW_HEIGHT_EN 245 #define IPUT_WINDOW_WIDTH 190 diff --git a/src/multiple_windows/local_peer_window.cpp b/src/multiple_windows/local_peer_window.cpp new file mode 100644 index 0000000..7785eb6 --- /dev/null +++ b/src/multiple_windows/local_peer_window.cpp @@ -0,0 +1,112 @@ +#include "IconsFontAwesome6.h" +#include "layout_style.h" +#include "localization.h" +#include "render.h" + +int Render::LocalWindow() { + // if (ConfigCenter::LANGUAGE::CHINESE == localization_language_) { + // ImGui::SetNextWindowSize(ImVec2(MENU_WINDOW_WIDTH_CN + 50, + // main_window_height_ - + // menu_window_height_)); + // } else { + // ImGui::SetNextWindowSize( + // ImVec2(MENU_WINDOW_WIDTH_EN, MENU_WINDOW_HEIGHT_EN)); + // } + + ImGui::SetNextWindowPos(ImVec2(0, menu_window_height_), ImGuiCond_Always); + ImGui::BeginChild( + u8"本桌面main", + ImVec2(local_window_width_, main_window_height_ - menu_window_height_), + ImGuiChildFlags_Border, + ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse | + ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar); + ImGui::SetWindowFontScale(0.5f); + ImGui::Text(u8"本桌面"); + + ImGui::Spacing(); + ImGui::SetWindowFontScale(1.0f); + { + // local + // ImGui::SetNextWindowSize(ImVec2(300, 180)); + ImGui::PushStyleVar(ImGuiStyleVar_ChildRounding, 10.0f); + // ImGui::SetNextWindowPos(ImVec2(0, 50), ImGuiCond_Always); + ImGui::PushStyleColor(ImGuiCol_ChildBg, ImVec4(0, 0, 0, 0.05)); + ImGui::BeginChild(u8"窗口1", ImVec2(330, 180), ImGuiChildFlags_Border); + { + ImGui::SetWindowFontScale(0.5f); + + ImGui::Text(localization::local_id[localization_language_index_].c_str()); + + ImGui::Spacing(); + + ImGui::SetNextItemWidth(IPUT_WINDOW_WIDTH); + ImGui::SetWindowFontScale(1.0f); + ImGui::InputText( + "##local_id", (char *)mac_addr_str_.c_str(), + mac_addr_str_.length() + 1, + ImGuiInputTextFlags_CharsUppercase | ImGuiInputTextFlags_ReadOnly); + ImGui::Spacing(); + ImGui::Separator(); + ImGui::Spacing(); + + ImGui::SetWindowFontScale(0.5f); + + ImGui::Text(localization::password[localization_language_index_].c_str()); + + strncpy(input_password_tmp_, input_password_, sizeof(input_password_)); + ImGui::SetNextItemWidth(IPUT_WINDOW_WIDTH); + ImGui::Spacing(); + ImGui::SetWindowFontScale(1.0f); + ImGui::InputTextWithHint( + "##server_pwd", + localization::max_password_len[localization_language_index_].c_str(), + input_password_, IM_ARRAYSIZE(input_password_), + show_password_ ? ImGuiInputTextFlags_CharsNoBlank + : ImGuiInputTextFlags_CharsNoBlank | + ImGuiInputTextFlags_Password); + + ImGui::SameLine(); + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0)); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(0, 0, 0, 0)); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(0, 0, 0, 0)); + + ImGui::SetWindowFontScale(0.5f); + if (ImGui::Button(show_password_ ? ICON_FA_EYE : ICON_FA_EYE_SLASH, + ImVec2(35, 35))) { + show_password_ = !show_password_; + } + ImGui::PopStyleColor(3); + + ImGui::SameLine(); + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0)); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(0, 0, 0, 0)); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(0, 0, 0, 0)); + if (!regenerate_password_) { + if (ImGui::Button(ICON_FA_ARROWS_ROTATE, ImVec2(35, 35))) { + regenerate_password_ = true; + } + } else { + regenerate_password_frame_count_++; + if (ImGui::Button(ICON_FA_SPINNER, ImVec2(35, 35))) { + } + if (regenerate_password_frame_count_ == 15) { + regenerate_password_frame_count_ = 0; + regenerate_password_ = false; + } + } + ImGui::SetWindowFontScale(1.0f); + ImGui::PopStyleColor(3); + + if (strcmp(input_password_tmp_, input_password_)) { + SaveSettingsIntoCacheFile(); + } + } + ImGui::PopStyleColor(); + ImGui::EndChild(); + ImGui::PopStyleVar(); + } + + ImGui::EndChild(); + + return 0; +} \ No newline at end of file diff --git a/src/multiple_windows/main_window.cpp b/src/multiple_windows/main_window.cpp index e17d43f..35f1d70 100644 --- a/src/multiple_windows/main_window.cpp +++ b/src/multiple_windows/main_window.cpp @@ -1,969 +1,17 @@ -#include "main_window.h" - -#include -#include -#include - -#include "IconsFontAwesome6.h" -#include "device_controller_factory.h" -#include "layout_style.h" -#include "localization.h" -#include "log.h" -#include "platform.h" -#include "screen_capturer_factory.h" - -// Refresh Event -#define REFRESH_EVENT (SDL_USEREVENT + 1) -#define NV12_BUFFER_SIZE 1280 * 720 * 3 / 2 - -MainWindow::MainWindow() {} - -MainWindow::~MainWindow() {} - -int MainWindow::SaveSettingsIntoCacheFile() { - cd_cache_file_ = fopen("cache.cd", "w+"); - if (!cd_cache_file_) { - return -1; - } - - fseek(cd_cache_file_, 0, SEEK_SET); - strncpy(cd_cache_.password, input_password_, sizeof(input_password_)); - memcpy(&cd_cache_.language, &language_button_value_, - sizeof(language_button_value_)); - memcpy(&cd_cache_.video_quality, &video_quality_button_value_, - sizeof(video_quality_button_value_)); - memcpy(&cd_cache_.video_encode_format, &video_encode_format_button_value_, - sizeof(video_encode_format_button_value_)); - memcpy(&cd_cache_.enable_hardware_video_codec, &enable_hardware_video_codec_, - sizeof(enable_hardware_video_codec_)); - fwrite(&cd_cache_, sizeof(cd_cache_), 1, cd_cache_file_); - fclose(cd_cache_file_); - - return 0; -} - -int MainWindow::LoadSettingsIntoCacheFile() { - cd_cache_file_ = fopen("cache.cd", "r+"); - if (!cd_cache_file_) { - return -1; - } - - fseek(cd_cache_file_, 0, SEEK_SET); - fread(&cd_cache_, sizeof(cd_cache_), 1, cd_cache_file_); - fclose(cd_cache_file_); - strncpy(input_password_, cd_cache_.password, sizeof(cd_cache_.password)); - language_button_value_ = cd_cache_.language; - video_quality_button_value_ = cd_cache_.video_quality; - video_encode_format_button_value_ = cd_cache_.video_encode_format; - enable_hardware_video_codec_ = cd_cache_.enable_hardware_video_codec; - - return 0; -} - -int MainWindow::StartScreenCapture() { - screen_capturer_ = (ScreenCapturer *)screen_capturer_factory_->Create(); - ScreenCapturer::RECORD_DESKTOP_RECT rect; - rect.left = 0; - rect.top = 0; - rect.right = screen_width_; - rect.bottom = screen_height_; - last_frame_time_ = std::chrono::high_resolution_clock::now(); - - int screen_capturer_init_ret = screen_capturer_->Init( - rect, 60, - [this](unsigned char *data, int size, int width, int height) -> void { - auto now_time = std::chrono::high_resolution_clock::now(); - std::chrono::duration duration = now_time - last_frame_time_; - auto tc = duration.count() * 1000; - - if (tc >= 0) { - SendData(peer_, DATA_TYPE::VIDEO, (const char *)data, - NV12_BUFFER_SIZE); - last_frame_time_ = now_time; - } - }); - - if (0 == screen_capturer_init_ret) { - screen_capturer_->Start(); - } else { - screen_capturer_->Destroy(); - delete screen_capturer_; - screen_capturer_ = nullptr; - } - - return 0; -} - -int MainWindow::StopScreenCapture() { - if (screen_capturer_) { - LOG_INFO("Destroy screen capturer") - screen_capturer_->Destroy(); - delete screen_capturer_; - screen_capturer_ = nullptr; - } - - return 0; -} - -int MainWindow::StartMouseControl() { - device_controller_factory_ = new DeviceControllerFactory(); - mouse_controller_ = (MouseController *)device_controller_factory_->Create( - DeviceControllerFactory::Device::Mouse); - int mouse_controller_init_ret = - mouse_controller_->Init(screen_width_, screen_height_); - if (0 != mouse_controller_init_ret) { - LOG_INFO("Destroy mouse controller") - mouse_controller_->Destroy(); - mouse_controller_ = nullptr; - } - - return 0; -} - -int MainWindow::StopMouseControl() { - if (mouse_controller_) { - mouse_controller_->Destroy(); - delete mouse_controller_; - mouse_controller_ = nullptr; - } - return 0; -} - -int MainWindow::CreateConnectionPeer() { - mac_addr_str_ = GetMac(); - - params_.use_cfg_file = false; - params_.signal_server_ip = "150.158.81.30"; - params_.signal_server_port = 9099; - params_.stun_server_ip = "150.158.81.30"; - params_.stun_server_port = 3478; - params_.turn_server_ip = "150.158.81.30"; - params_.turn_server_port = 3478; - params_.turn_server_username = "dijunkun"; - params_.turn_server_password = "dijunkunpw"; - params_.hardware_acceleration = config_center_.IsHardwareVideoCodec(); - params_.av1_encoding = config_center_.GetVideoEncodeFormat() == - ConfigCenter::VIDEO_ENCODE_FORMAT::AV1 - ? true - : false; - params_.on_receive_video_buffer = OnReceiveVideoBufferCb; - params_.on_receive_audio_buffer = OnReceiveAudioBufferCb; - params_.on_receive_data_buffer = OnReceiveDataBufferCb; - params_.on_signal_status = OnSignalStatusCb; - params_.on_connection_status = OnConnectionStatusCb; - params_.user_data = this; - - peer_ = CreatePeer(¶ms_); - if (peer_) { - LOG_INFO("Create peer instance successful"); - local_id_ = mac_addr_str_; - Init(peer_, local_id_.c_str()); - LOG_INFO("Peer init finish"); - } else { - LOG_INFO("Create peer instance failed"); - } - - return 0; -} - -int MainWindow::Run() { - LoadSettingsIntoCacheFile(); - - localization_language_ = (ConfigCenter::LANGUAGE)language_button_value_; - localization_language_index_ = language_button_value_; - - // Setup SDL - if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER | - SDL_INIT_GAMECONTROLLER) != 0) { - printf("Error: %s\n", SDL_GetError()); - return -1; - } - - // From 2.0.18: Enable native IME. -#ifdef SDL_HINT_IME_SHOW_UI - SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1"); -#endif - - // Create main window with SDL_Renderer graphics context - SDL_WindowFlags window_flags = - (SDL_WindowFlags)(SDL_WINDOW_ALLOW_HIGHDPI | SDL_WINDOW_RESIZABLE | - SDL_WINDOW_BORDERLESS); - main_window_ = SDL_CreateWindow("Remote Desk", SDL_WINDOWPOS_CENTERED, - SDL_WINDOWPOS_CENTERED, main_window_width_, - main_window_height_, window_flags); - - SDL_DisplayMode DM; - SDL_GetCurrentDisplayMode(0, &DM); - screen_width_ = DM.w; - screen_height_ = DM.h; - - sdl_renderer_ = SDL_CreateRenderer( - main_window_, -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED); - if (sdl_renderer_ == nullptr) { - SDL_Log("Error creating SDL_Renderer!"); - return 0; - } - - pixformat_ = SDL_PIXELFORMAT_NV12; - - sdl_texture_ = - SDL_CreateTexture(sdl_renderer_, pixformat_, SDL_TEXTUREACCESS_STREAMING, - texture_width_, texture_height_); - - // Setup Dear ImGui context - IMGUI_CHECKVERSION(); - ImGui::CreateContext(); - ImGuiIO &io = ImGui::GetIO(); - - io.ConfigFlags |= - ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls - io.ConfigFlags |= - ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls - - if (config_center_.GetLanguage() == ConfigCenter::LANGUAGE::CHINESE) { - // Load Fonts -#ifdef _WIN32 - std::string default_font_path = "c:/windows/fonts/simhei.ttf"; - std::ifstream font_path_f(default_font_path.c_str()); - std::string font_path = - font_path_f.good() ? "c:/windows/fonts/simhei.ttf" : ""; - if (!font_path.empty()) { - io.Fonts->AddFontFromFileTTF(font_path.c_str(), 30.0f, NULL, - io.Fonts->GetGlyphRangesChineseFull()); - } -#elif __APPLE__ - std::string default_font_path = "/System/Library/Fonts/PingFang.ttc"; - std::ifstream font_path_f(default_font_path.c_str()); - std::string font_path = - font_path_f.good() ? "/System/Library/Fonts/PingFang.ttc" : ""; - if (!font_path.empty()) { - io.Fonts->AddFontFromFileTTF(font_path.c_str(), 13.0f, NULL, - io.Fonts->GetGlyphRangesChineseFull()); - } -#elif __linux__ - io.Fonts->AddFontFromFileTTF("c:/windows/fonts/msyh.ttc", 13.0f, NULL, - io.Fonts->GetGlyphRangesChineseFull()); -#endif - } - - ImFontConfig config; - config.MergeMode = true; - config.GlyphMinAdvanceX = - 13.0f; // Use if you want to make the icon monospaced - static const ImWchar icon_ranges[] = {ICON_MIN_FA, ICON_MAX_FA, 0}; - io.Fonts->AddFontFromFileTTF("fonts/fa-solid-900.ttf", 30.0f, &config, - icon_ranges); - io.Fonts->Build(); - - // Setup Dear ImGui style - // ImGui::StyleColorsDark(); - ImGui::StyleColorsLight(); - - // Setup Platform/Renderer backends - ImGui_ImplSDL2_InitForSDLRenderer(main_window_, sdl_renderer_); - ImGui_ImplSDLRenderer2_Init(sdl_renderer_); - - CreateConnectionPeer(); - - { - nv12_buffer_ = new char[NV12_BUFFER_SIZE]; - - // Screen capture - screen_capturer_factory_ = new ScreenCapturerFactory(); - - // Mouse control - device_controller_factory_ = new DeviceControllerFactory(); - } - - // Main loop - while (!exit_) { - if (SignalStatus::SignalConnected == signal_status_ && - !is_create_connection_) { - is_create_connection_ = - CreateConnection(peer_, mac_addr_str_.c_str(), input_password_) - ? false - : true; - LOG_INFO("Connected with signal server, create p2p connection"); - } - - if (!inited_ || - localization_language_index_last_ != localization_language_index_) { - connect_button_label_ = - connect_button_pressed_ - ? localization::disconnect[localization_language_index_] - : localization::connect[localization_language_index_]; - fullscreen_button_label_ = - fullscreen_button_pressed_ - ? localization::exit_fullscreen[localization_language_index_] - : localization::fullscreen[localization_language_index_]; - - mouse_control_button_label_ = - mouse_control_button_pressed_ - ? localization::release_mouse[localization_language_index_] - : localization::control_mouse[localization_language_index_]; - - settings_button_label_ = - localization::settings[localization_language_index_]; - inited_ = true; - localization_language_index_last_ = localization_language_index_; - } - - if (start_screen_capture_ && !screen_capture_is_started_) { - StartScreenCapture(); - screen_capture_is_started_ = true; - } else if (!start_screen_capture_ && screen_capture_is_started_) { - StopScreenCapture(); - screen_capture_is_started_ = false; - } - - if (start_mouse_control_ && !mouse_control_is_started_) { - StartMouseControl(); - mouse_control_is_started_ = true; - } else if (!start_mouse_control_ && mouse_control_is_started_) { - StopMouseControl(); - mouse_control_is_started_ = false; - } - - // Start the Dear ImGui frame - ImGui_ImplSDLRenderer2_NewFrame(); - ImGui_ImplSDL2_NewFrame(); - ImGui::NewFrame(); - - // tabbar - { - ImGui::SetNextWindowPos(ImVec2(0, 0), ImGuiCond_Always); - ImGui::Begin(localization::menu[localization_language_index_].c_str(), - nullptr, - ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse | - ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar); - ImGui::PushStyleColor(ImGuiCol_Tab, ImVec4(0, 0, 0, 0.8)); - if (ImGui::BeginTabBar("TabBar1", ImGuiTabBarFlags_None)) { - ImGui::BeginTabItem( - localization::menu[localization_language_index_].c_str()); - ImGui::EndTabBar(); - ImGui::PopStyleColor(); - } - ImGui::End(); - } - - // main window layout - { - ImGui::SetNextWindowPos(ImVec2(0, 0), ImGuiCond_Once); - - if (ConfigCenter::LANGUAGE::CHINESE == localization_language_) { - ImGui::SetNextWindowSize( - ImVec2(MENU_WINDOW_WIDTH_CN + 50, main_window_height_)); - } else { - ImGui::SetNextWindowSize( - ImVec2(MENU_WINDOW_WIDTH_EN, MENU_WINDOW_HEIGHT_EN)); - } - - if (!connection_established_) { - ImGui::SetNextWindowPos(ImVec2(0, 0), ImGuiCond_Always); - ImGui::Begin(localization::menu[localization_language_index_].c_str(), - nullptr, - ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse | - ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar); - ImGui::SetWindowFontScale(0.5f); - ImGui::Text(u8"本桌面"); - } else { - // ImGui::SetNextWindowCollapsed(true, ImGuiCond_Once); - ImGui::Begin(localization::menu[localization_language_index_].c_str(), - nullptr, ImGuiWindowFlags_None); - } - - ImGui::Spacing(); - - { - // local - ImGui::SetNextWindowSize(ImVec2(300, 180)); - ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 10.0f); - ImGui::SetNextWindowPos(ImVec2(0, 50), ImGuiCond_Always); - ImGui::Begin(u8"窗口1", nullptr, - ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | - ImGuiWindowFlags_NoTitleBar); - - { - ImGui::SetWindowFontScale(0.5f); - ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(0, 0, 0, 0.3)); - ImGui::Text( - localization::local_id[localization_language_index_].c_str()); - ImGui::PopStyleColor(); - - ImGui::Spacing(); - - ImGui::SetNextItemWidth(IPUT_WINDOW_WIDTH); - ImGui::Spacing(); - ImGui::SetWindowFontScale(1.0f); - ImGui::InputText("##local_id", (char *)mac_addr_str_.c_str(), - mac_addr_str_.length() + 1, - ImGuiInputTextFlags_CharsUppercase | - ImGuiInputTextFlags_ReadOnly); - ImGui::Spacing(); - ImGui::Spacing(); - ImGui::Separator(); - ImGui::Spacing(); - ImGui::Spacing(); - - ImGui::SetWindowFontScale(0.5f); - ImGui::Text( - localization::password[localization_language_index_].c_str()); - - strncpy(input_password_tmp_, input_password_, - sizeof(input_password_)); - ImGui::SetNextItemWidth(IPUT_WINDOW_WIDTH); - ImGui::Spacing(); - ImGui::SetWindowFontScale(1.0f); - ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(0, 0, 0, 0.3)); - ImGui::InputTextWithHint( - "##server_pwd", - localization::max_password_len[localization_language_index_] - .c_str(), - input_password_, IM_ARRAYSIZE(input_password_), - show_password_ ? ImGuiInputTextFlags_CharsNoBlank - : ImGuiInputTextFlags_CharsNoBlank | - ImGuiInputTextFlags_Password); - ImGui::PopStyleColor(); - ImGui::SameLine(); - ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0)); - ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(0, 0, 0, 0)); - ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(0, 0, 0, 0)); - - if (ImGui::Button(show_password_ ? ICON_FA_EYE : ICON_FA_EYE_SLASH, - ImVec2(50, 35))) { - show_password_ = !show_password_; - } - ImGui::PopStyleColor(3); - - ImGui::SameLine(); - ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0)); - ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(0, 0, 0, 0)); - ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(0, 0, 0, 0)); - if (!regenerate_password_) { - if (ImGui::Button(ICON_FA_ARROWS_ROTATE, ImVec2(38, 38))) { - regenerate_password_ = true; - } - } else { - regenerate_password_frame_count_++; - if (ImGui::Button(ICON_FA_SPINNER)) { - } - if (regenerate_password_frame_count_ == 30) { - regenerate_password_frame_count_ = 0; - regenerate_password_ = false; - } - } - ImGui::PopStyleColor(3); - - if (strcmp(input_password_tmp_, input_password_)) { - SaveSettingsIntoCacheFile(); - } - } - ImGui::End(); - ImGui::PopStyleVar(); - } - - ImGui::Spacing(); - ImGui::Separator(); - ImGui::Spacing(); - - ImGui::SetWindowFontScale(0.5f); - ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f); - // Mouse control - std::string mouse = ICON_FA_COMPUTER_MOUSE; - if (ImGui::Button(mouse.c_str(), ImVec2(25, 25))) { - if (mouse_control_button_label_ == - localization::control_mouse[localization_language_index_] && - connection_established_) { - mouse_control_button_pressed_ = true; - control_mouse_ = true; - mouse_control_button_label_ = - localization::release_mouse[localization_language_index_]; - } else { - control_mouse_ = false; - mouse_control_button_label_ = - localization::control_mouse[localization_language_index_]; - } - mouse_control_button_pressed_ = !mouse_control_button_pressed_; - } - - ImGui::SameLine(); - // Fullscreen - std::string fullscreen = ICON_FA_EXPAND; - if (ImGui::Button(fullscreen.c_str(), ImVec2(25, 25))) { - if (fullscreen_button_label_ == - localization::fullscreen[localization_language_index_]) { - main_window_width_before_fullscreen_ = main_window_width_; - main_window_height_before_fullscreen_ = main_window_height_; - SDL_SetWindowFullscreen(main_window_, SDL_WINDOW_FULLSCREEN_DESKTOP); - fullscreen_button_label_ = - localization::exit_fullscreen[localization_language_index_]; - } else { - SDL_SetWindowFullscreen(main_window_, SDL_FALSE); - SDL_SetWindowSize(main_window_, main_window_width_before_fullscreen_, - main_window_height_before_fullscreen_); - main_window_width_ = main_window_width_before_fullscreen_; - main_window_height_ = main_window_height_before_fullscreen_; - fullscreen_button_label_ = - localization::fullscreen[localization_language_index_]; - } - fullscreen_button_pressed_ = !fullscreen_button_pressed_; - } - - ImGui::SameLine(); - - // std::string gear = ICON_FA_GEAR; - // if (ImGui::Button(gear.c_str(), ImVec2(25, 25))) { - // settings_button_pressed_ = !settings_button_pressed_; - // settings_window_pos_reset_ = true; - // } - - // if (settings_button_pressed_) { - // if (settings_window_pos_reset_) { - // const ImGuiViewport *viewport = ImGui::GetMainViewport(); - // if (ConfigCenter::LANGUAGE::CHINESE == localization_language_) { - // ImGui::SetNextWindowPos( - // ImVec2((viewport->WorkSize.x - viewport->WorkPos.x - - // SETTINGS_WINDOW_WIDTH_CN) / - // 2, - // (viewport->WorkSize.y - viewport->WorkPos.y - - // SETTINGS_WINDOW_HEIGHT_CN) / - // 2)); - - // ImGui::SetNextWindowSize( - // ImVec2(SETTINGS_WINDOW_WIDTH_CN, SETTINGS_WINDOW_HEIGHT_CN)); - // } else { - // ImGui::SetNextWindowPos( - // ImVec2((viewport->WorkSize.x - viewport->WorkPos.x - - // SETTINGS_WINDOW_WIDTH_EN) / - // 2, - // (viewport->WorkSize.y - viewport->WorkPos.y - - // SETTINGS_WINDOW_HEIGHT_EN) / - // 2)); - - // ImGui::SetNextWindowSize( - // ImVec2(SETTINGS_WINDOW_WIDTH_EN, SETTINGS_WINDOW_HEIGHT_EN)); - // } - - // settings_window_pos_reset_ = false; - // } - - // ImGui::SetWindowFontScale(0.5f); - // // Settings - // ImGui::Begin( - // localization::settings[localization_language_index_].c_str(), - // nullptr, - // ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse | - // ImGuiWindowFlags_NoSavedSettings); - // ImGui::SetWindowFontScale(0.5f); - // { - // const char *language_items[] = { - // localization::language_zh[localization_language_index_].c_str(), - // localization::language_en[localization_language_index_].c_str()}; - - // ImGui::SetCursorPosY(32); - // ImGui::Text( - // localization::language[localization_language_index_].c_str()); - // if (ConfigCenter::LANGUAGE::CHINESE == localization_language_) { - // ImGui::SetCursorPosX(LANGUAGE_SELECT_WINDOW_PADDING_CN); - // } else { - // ImGui::SetCursorPosX(LANGUAGE_SELECT_WINDOW_PADDING_EN); - // } - // ImGui::SetCursorPosY(30); - // ImGui::SetNextItemWidth(SETTINGS_SELECT_WINDOW_WIDTH); - - // ImGui::Combo("##language", &language_button_value_, language_items, - // IM_ARRAYSIZE(language_items)); - // } - - // ImGui::Separator(); - - // { - // const char *video_quality_items[] = { - // localization::video_quality_high[localization_language_index_] - // .c_str(), - // localization::video_quality_medium[localization_language_index_] - // .c_str(), - // localization::video_quality_low[localization_language_index_] - // .c_str()}; - - // ImGui::SetCursorPosY(62); - // ImGui::Text(localization::video_quality[localization_language_index_] - // .c_str()); - - // if (ConfigCenter::LANGUAGE::CHINESE == localization_language_) { - // ImGui::SetCursorPosX(VIDEO_QUALITY_SELECT_WINDOW_PADDING_CN); - // } else { - // ImGui::SetCursorPosX(VIDEO_QUALITY_SELECT_WINDOW_PADDING_EN); - // } - // ImGui::SetCursorPosY(60); - // ImGui::SetNextItemWidth(SETTINGS_SELECT_WINDOW_WIDTH); - - // ImGui::Combo("##video_quality", &video_quality_button_value_, - // video_quality_items, - // IM_ARRAYSIZE(video_quality_items)); - // } - - // ImGui::Separator(); - - // { - // const char *video_encode_format_items[] = { - // localization::av1[localization_language_index_].c_str(), - // localization::h264[localization_language_index_].c_str()}; - - // ImGui::SetCursorPosY(92); - // ImGui::Text( - // localization::video_encode_format[localization_language_index_] - // .c_str()); - - // if (ConfigCenter::LANGUAGE::CHINESE == localization_language_) { - // ImGui::SetCursorPosX(VIDEO_ENCODE_FORMAT_SELECT_WINDOW_PADDING_CN); - // } else { - // ImGui::SetCursorPosX(VIDEO_ENCODE_FORMAT_SELECT_WINDOW_PADDING_EN); - // } - // ImGui::SetCursorPosY(90); - // ImGui::SetNextItemWidth(SETTINGS_SELECT_WINDOW_WIDTH); - - // ImGui::Combo("##video_encode_format", - // &video_encode_format_button_value_, - // video_encode_format_items, - // IM_ARRAYSIZE(video_encode_format_items)); - // } - - // ImGui::Separator(); - - // { - // ImGui::SetCursorPosY(122); - // ImGui::Text(localization::enable_hardware_video_codec - // [localization_language_index_] - // .c_str()); - - // if (ConfigCenter::LANGUAGE::CHINESE == localization_language_) { - // ImGui::SetCursorPosX( - // ENABLE_HARDWARE_VIDEO_CODEC_CHECKBOX_PADDING_CN); - // } else { - // ImGui::SetCursorPosX( - // ENABLE_HARDWARE_VIDEO_CODEC_CHECKBOX_PADDING_EN); - // } - // ImGui::SetCursorPosY(120); - // ImGui::Checkbox("##enable_hardware_video_codec", - // &enable_hardware_video_codec_); - // } - - // if (ConfigCenter::LANGUAGE::CHINESE == localization_language_) { - // ImGui::SetCursorPosX(SETTINGS_OK_BUTTON_PADDING_CN); - // } else { - // ImGui::SetCursorPosX(SETTINGS_OK_BUTTON_PADDING_EN); - // } - // ImGui::SetCursorPosY(160.0f); - - // // OK - // if (ImGui::Button( - // localization::ok[localization_language_index_].c_str())) { - // settings_button_pressed_ = false; - - // // Language - // if (language_button_value_ == 0) { - // config_center_.SetLanguage(ConfigCenter::LANGUAGE::CHINESE); - // } else { - // config_center_.SetLanguage(ConfigCenter::LANGUAGE::ENGLISH); - // } - // language_button_value_last_ = language_button_value_; - // localization_language_ = - // (ConfigCenter::LANGUAGE)language_button_value_; - // localization_language_index_ = language_button_value_; - // LOG_INFO("Set localization language: {}", - // localization_language_index_ == 0 ? "zh" : "en"); - - // // Video quality - // if (video_quality_button_value_ == 0) { - // config_center_.SetVideoQuality(ConfigCenter::VIDEO_QUALITY::HIGH); - // } else if (video_quality_button_value_ == 1) { - // config_center_.SetVideoQuality(ConfigCenter::VIDEO_QUALITY::MEDIUM); - // } else { - // config_center_.SetVideoQuality(ConfigCenter::VIDEO_QUALITY::LOW); - // } - // video_quality_button_value_last_ = video_quality_button_value_; - - // // Video encode format - // if (video_encode_format_button_value_ == 0) { - // config_center_.SetVideoEncodeFormat( - // ConfigCenter::VIDEO_ENCODE_FORMAT::AV1); - // } else if (video_encode_format_button_value_ == 1) { - // config_center_.SetVideoEncodeFormat( - // ConfigCenter::VIDEO_ENCODE_FORMAT::H264); - // } - // video_encode_format_button_value_last_ = - // video_encode_format_button_value_; - - // // Hardware video codec - // if (enable_hardware_video_codec_) { - // config_center_.SetHardwareVideoCodec(true); - // } else { - // config_center_.SetHardwareVideoCodec(false); - // } - // enable_hardware_video_codec_last_ = enable_hardware_video_codec_; - - // SaveSettingsIntoCacheFile(); - // settings_window_pos_reset_ = true; - - // // Recreate peer instance - // LoadSettingsIntoCacheFile(); - - // // Recreate peer instance - // { - // DestroyPeer(peer_); - // CreateConnectionPeer(); - // LOG_INFO("Recreate peer instance successful"); - // } - // } - // ImGui::SameLine(); - // // Cancel - // if (ImGui::Button( - // localization::cancel[localization_language_index_].c_str())) - // { - // settings_button_pressed_ = false; - // if (language_button_value_ != language_button_value_last_) { - // language_button_value_ = language_button_value_last_; - // } - - // if (video_quality_button_value_ != - // video_quality_button_value_last_) { - // video_quality_button_value_ = video_quality_button_value_last_; - // } - - // if (video_encode_format_button_value_ != - // video_encode_format_button_value_last_) { - // video_encode_format_button_value_ = - // video_encode_format_button_value_last_; - // } - - // if (enable_hardware_video_codec_ != - // enable_hardware_video_codec_last_) { - // enable_hardware_video_codec_ = enable_hardware_video_codec_last_; - // } - - // settings_window_pos_reset_ = true; - // } - - // ImGui::End(); - // } - - ImGui::End(); - } - - { - ImGui::SetNextWindowPos(ImVec2(MENU_WINDOW_WIDTH_CN + 200, 30), - ImGuiCond_Always); - if (ConfigCenter::LANGUAGE::CHINESE == localization_language_) { - ImGui::SetNextWindowSize( - ImVec2(MENU_WINDOW_WIDTH_CN, MENU_WINDOW_HEIGHT_CN)); - } else { - ImGui::SetNextWindowSize( - ImVec2(MENU_WINDOW_WIDTH_EN, MENU_WINDOW_HEIGHT_EN)); - } - ImGui::Begin("test", nullptr, - ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse | - ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar); - - ImGui::SetWindowFontScale(0.5f); - ImGui::Text(u8"远程控制桌面"); - - ImGui::Spacing(); - ImGui::Separator(); - ImGui::Spacing(); - - { - ImGui::Text( - localization::remote_id[localization_language_index_].c_str()); - - ImGui::SameLine(); - ImGui::SetNextItemWidth(IPUT_WINDOW_WIDTH); - if (ConfigCenter::LANGUAGE::CHINESE == localization_language_) { - ImGui::SetCursorPosX(INPUT_WINDOW_PADDING_CN); - } else { - ImGui::SetCursorPosX(INPUT_WINDOW_PADDING_EN); - } - ImGui::SetWindowFontScale(1.0f); - ImGui::InputTextWithHint("##remote_id_", mac_addr_str_.c_str(), - remote_id_, IM_ARRAYSIZE(remote_id_), - ImGuiInputTextFlags_CharsUppercase | - ImGuiInputTextFlags_CharsNoBlank); - - ImGui::Spacing(); - ImGui::SetWindowFontScale(0.5f); - ImGui::Text( - localization::password[localization_language_index_].c_str()); - - ImGui::SameLine(); - ImGui::SetNextItemWidth(IPUT_WINDOW_WIDTH); - - if (ConfigCenter::LANGUAGE::CHINESE == localization_language_) { - ImGui::SetCursorPosX(INPUT_WINDOW_PADDING_CN); - } else { - ImGui::SetCursorPosX(INPUT_WINDOW_PADDING_EN); - } - ImGui::SetWindowFontScale(1.0f); - ImGui::InputTextWithHint( - "##client_pwd", - localization::max_password_len[localization_language_index_] - .c_str(), - client_password_, IM_ARRAYSIZE(client_password_), - ImGuiInputTextFlags_CharsNoBlank); - - ImGui::Spacing(); - ImGui::Separator(); - ImGui::Spacing(); - - if (ImGui::Button(connect_button_label_.c_str(), - ImVec2(MENU_WINDOW_WIDTH_CN - 16, 40)) || - rejoin_) { - int ret = -1; - if ("SignalConnected" == signal_status_str_) { - if (connect_button_label_ == - localization::connect[localization_language_index_] && - !connection_established_ && strlen(remote_id_)) { - if (remote_id_ == local_id_ && !peer_reserved_) { - peer_reserved_ = CreatePeer(¶ms_); - if (peer_reserved_) { - LOG_INFO("Create peer[reserved] instance successful"); - std::string local_id = "C-" + mac_addr_str_; - Init(peer_reserved_, local_id.c_str()); - LOG_INFO("Peer[reserved] init finish"); - } else { - LOG_INFO("Create peer[reserved] instance failed"); - } - } - ret = JoinConnection(peer_reserved_ ? peer_reserved_ : peer_, - remote_id_, client_password_); - if (0 == ret) { - if (!peer_reserved_) { - is_client_mode_ = true; - } - rejoin_ = false; - } else { - rejoin_ = true; - } - - } else if (connect_button_label_ == - localization::disconnect - [localization_language_index_] && - connection_established_) { - ret = LeaveConnection(peer_reserved_ ? peer_reserved_ : peer_); - - if (0 == ret) { - rejoin_ = false; - memset(audio_buffer_, 0, 960); - connection_established_ = false; - received_frame_ = false; - is_client_mode_ = false; - } - } - - if (0 == ret) { - connect_button_pressed_ = !connect_button_pressed_; - connect_button_label_ = - connect_button_pressed_ - ? localization::disconnect[localization_language_index_] - : localization::connect[localization_language_index_]; - } - } - } - } - ImGui::End(); - } - - SDL_Event event; - while (SDL_PollEvent(&event)) { - ImGui_ImplSDL2_ProcessEvent(&event); - if (event.type == SDL_QUIT) { - exit_ = true; - } else if (event.type == SDL_WINDOWEVENT && - event.window.event == SDL_WINDOWEVENT_RESIZED) { - int window_w_last = main_window_width_; - int window_h_last = main_window_height_; - - SDL_GetWindowSize(main_window_, &main_window_width_, - &main_window_height_); - - int w_change_ratio = abs(main_window_width_ - window_w_last) / 16; - int h_change_ratio = abs(main_window_height_ - window_h_last) / 9; - - if (w_change_ratio > h_change_ratio) { - main_window_height_ = main_window_width_ * 9 / 16; - } else { - main_window_width_ = main_window_height_ * 16 / 9; - } - - // SDL_SetWindowSize(main_window_, main_window_width_, - // main_window_height_); - } else if (event.type == SDL_WINDOWEVENT && - event.window.event == SDL_WINDOWEVENT_CLOSE && - event.window.windowID == SDL_GetWindowID(main_window_)) { - exit_ = true; - } else if (event.type == REFRESH_EVENT) { - sdl_rect_.x = 0; - sdl_rect_.y = 0; - sdl_rect_.w = main_window_width_; - sdl_rect_.h = main_window_height_; - - // SDL_UpdateTexture(sdl_texture_, NULL, dst_buffer_, 1280); - } else { - if (connection_established_) { - ProcessMouseKeyEven(event); - } - } - } - - // Rendering - ImGui::Render(); - SDL_RenderSetScale(sdl_renderer_, io.DisplayFramebufferScale.x, - io.DisplayFramebufferScale.y); - SDL_SetRenderDrawColor(sdl_renderer_, 255, 255, 255, 255); - SDL_RenderClear(sdl_renderer_); - ImGui_ImplSDLRenderer2_RenderDrawData(ImGui::GetDrawData()); - SDL_RenderPresent(sdl_renderer_); - - frame_count_++; - end_time_ = SDL_GetTicks(); - elapsed_time_ = end_time_ - start_time_; - if (elapsed_time_ >= 1000) { - fps_ = frame_count_ / (elapsed_time_ / 1000); - frame_count_ = 0; - window_title = "Remote Desk Client FPS [" + std::to_string(fps_) + - "] status [" + connection_status_str_ + "|" + - connection_status_str_ + "]"; - // For MacOS, UI frameworks can only be called from the main thread - SDL_SetWindowTitle(main_window_, window_title.c_str()); - start_time_ = end_time_; - } - } - - // Cleanup - if (is_create_connection_) { - LeaveConnection(peer_); - is_client_mode_ = false; - } - - if (peer_) { - DestroyPeer(peer_); - } - - if (peer_reserved_) { - DestroyPeer(peer_reserved_); - } - - SDL_CloseAudioDevice(output_dev_); - SDL_CloseAudioDevice(input_dev_); - - ImGui_ImplSDLRenderer2_Shutdown(); - ImGui_ImplSDL2_Shutdown(); - ImGui::DestroyContext(); - - SDL_DestroyRenderer(sdl_renderer_); - SDL_DestroyWindow(main_window_); - - SDL_CloseAudio(); - SDL_Quit(); +#include "render.h" + +int Render::MainWindow() { + ImGui::SetNextWindowPos(ImVec2(0, 0), ImGuiCond_Always); + ImGui::SetNextWindowSize(ImVec2(main_window_width_, main_window_height_), + ImGuiCond_Always); + ImGui::Begin("Render", nullptr, + ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar | + ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoScrollbar); + MenuWindow(); + LocalWindow(); + RemoteWindow(); + + ImGui::End(); return 0; } \ No newline at end of file diff --git a/src/multiple_windows/menu_window.cpp b/src/multiple_windows/menu_window.cpp new file mode 100644 index 0000000..48a944b --- /dev/null +++ b/src/multiple_windows/menu_window.cpp @@ -0,0 +1,31 @@ +#include "render.h" + +int Render::MenuWindow() { + ImGui::PushStyleColor(ImGuiCol_MenuBarBg, ImVec4(0, 0, 0, 0)); + static bool a, b, c, d, e; + ImGui::SetNextWindowPos(ImVec2(0, 0), ImGuiCond_Always); + ImGui::BeginChild("MenuWindow", + ImVec2(main_window_width_, menu_window_height_), + ImGuiChildFlags_Border); + + if (ImGui::BeginMenuBar()) { + if (ImGui::BeginMenu("Menu")) { + ImGui::SetWindowFontScale(0.5f); + ImGui::MenuItem("Auto-resizing window", NULL, &a); + ImGui::MenuItem("Constrained-resizing window", NULL, &b); + ImGui::MenuItem("Fullscreen window", NULL, &c); + ImGui::MenuItem("Long text display", NULL, &d); + ImGui::MenuItem("Manipulating window titles", NULL, &e); + ImGui::SetWindowFontScale(1.0f); + ImGui::EndMenu(); + } + ImGui::EndMenuBar(); + } + SettingWindow(); + + ImGui::SetWindowFontScale(1.0f); + ImGui::PopStyleColor(); + ImGui::EndChild(); + + return 0; +} \ No newline at end of file diff --git a/src/multiple_windows/remote_peer_window.cpp b/src/multiple_windows/remote_peer_window.cpp new file mode 100644 index 0000000..2e68a4e --- /dev/null +++ b/src/multiple_windows/remote_peer_window.cpp @@ -0,0 +1,105 @@ +#include "IconsFontAwesome6.h" +#include "layout_style.h" +#include "localization.h" +#include "log.h" +#include "render.h" + +int Render::RemoteWindow() { + // if (ConfigCenter::LANGUAGE::CHINESE == localization_language_) { + // ImGui::SetNextWindowSize( + // ImVec2(main_window_width_ - MENU_WINDOW_WIDTH_CN, + // main_window_height_ - menu_window_height_)); + // } else { + // ImGui::SetNextWindowSize( + // ImVec2(MENU_WINDOW_WIDTH_EN, MENU_WINDOW_HEIGHT_EN)); + // } + + ImGui::SetNextWindowPos(ImVec2(local_window_width_, menu_window_height_), + ImGuiCond_Always); + + ImGui::BeginChild( + "test", + ImVec2(main_window_width_ - local_window_width_, main_window_height_), + ImGuiChildFlags_Border, + ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse | + ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar); + + ImGui::SetWindowFontScale(0.5f); + ImGui::Text(u8"远程控制桌面"); + ImGui::SetWindowFontScale(1.0f); + + ImGui::Spacing(); + + ImGui::PushStyleVar(ImGuiStyleVar_ChildRounding, 10.0f); + ImGui::BeginChild(u8"窗口2", ImVec2(330, 180), ImGuiChildFlags_Border); + { + ImGui::SetWindowFontScale(0.5f); + + ImGui::Text(localization::remote_id[localization_language_index_].c_str()); + + ImGui::Spacing(); + ImGui::SetNextItemWidth(IPUT_WINDOW_WIDTH); + ImGui::SetWindowFontScale(1.0f); + ImGui::InputText( + "##remote_id_", remote_id_, IM_ARRAYSIZE(remote_id_), + ImGuiInputTextFlags_CharsUppercase | ImGuiInputTextFlags_CharsNoBlank); + + ImGui::SameLine(); + if (ImGui::Button(ICON_FA_ARROW_RIGHT_LONG, ImVec2(55, 35)) || rejoin_) { + int ret = -1; + if ("SignalConnected" == signal_status_str_) { + if (connect_button_label_ == + localization::connect[localization_language_index_] && + !connection_established_ && strlen(remote_id_)) { + if (remote_id_ == local_id_ && !peer_reserved_) { + peer_reserved_ = CreatePeer(¶ms_); + if (peer_reserved_) { + LOG_INFO("Create peer[reserved] instance successful"); + std::string local_id = "C-" + mac_addr_str_; + Init(peer_reserved_, local_id.c_str()); + LOG_INFO("Peer[reserved] init finish"); + } else { + LOG_INFO("Create peer[reserved] instance failed"); + } + } + ret = JoinConnection(peer_reserved_ ? peer_reserved_ : peer_, + remote_id_, client_password_); + if (0 == ret) { + if (!peer_reserved_) { + is_client_mode_ = true; + } + rejoin_ = false; + } else { + rejoin_ = true; + } + + } else if (connect_button_label_ == + localization::disconnect[localization_language_index_] && + connection_established_) { + ret = LeaveConnection(peer_reserved_ ? peer_reserved_ : peer_); + + if (0 == ret) { + rejoin_ = false; + memset(audio_buffer_, 0, 960); + connection_established_ = false; + received_frame_ = false; + is_client_mode_ = false; + } + } + + if (0 == ret) { + connect_button_pressed_ = !connect_button_pressed_; + connect_button_label_ = + connect_button_pressed_ + ? localization::disconnect[localization_language_index_] + : localization::connect[localization_language_index_]; + } + } + } + } + ImGui::EndChild(); + ImGui::PopStyleVar(); + ImGui::EndChild(); + + return 0; +} \ No newline at end of file diff --git a/src/multiple_windows/render.cpp b/src/multiple_windows/render.cpp new file mode 100644 index 0000000..753e670 --- /dev/null +++ b/src/multiple_windows/render.cpp @@ -0,0 +1,457 @@ +#include "render.h" + +#include +#include +#include + +#include "IconsFontAwesome6.h" +#include "device_controller_factory.h" +#include "layout_style.h" +#include "localization.h" +#include "log.h" +#include "platform.h" +#include "screen_capturer_factory.h" + +// Refresh Event +#define REFRESH_EVENT (SDL_USEREVENT + 1) +#define NV12_BUFFER_SIZE 1280 * 720 * 3 / 2 + +Render::Render() {} + +Render::~Render() {} + +int Render::SaveSettingsIntoCacheFile() { + cd_cache_file_ = fopen("cache.cd", "w+"); + if (!cd_cache_file_) { + return -1; + } + + fseek(cd_cache_file_, 0, SEEK_SET); + strncpy(cd_cache_.password, input_password_, sizeof(input_password_)); + memcpy(&cd_cache_.language, &language_button_value_, + sizeof(language_button_value_)); + memcpy(&cd_cache_.video_quality, &video_quality_button_value_, + sizeof(video_quality_button_value_)); + memcpy(&cd_cache_.video_encode_format, &video_encode_format_button_value_, + sizeof(video_encode_format_button_value_)); + memcpy(&cd_cache_.enable_hardware_video_codec, &enable_hardware_video_codec_, + sizeof(enable_hardware_video_codec_)); + fwrite(&cd_cache_, sizeof(cd_cache_), 1, cd_cache_file_); + fclose(cd_cache_file_); + + return 0; +} + +int Render::LoadSettingsIntoCacheFile() { + cd_cache_file_ = fopen("cache.cd", "r+"); + if (!cd_cache_file_) { + return -1; + } + + fseek(cd_cache_file_, 0, SEEK_SET); + fread(&cd_cache_, sizeof(cd_cache_), 1, cd_cache_file_); + fclose(cd_cache_file_); + strncpy(input_password_, cd_cache_.password, sizeof(cd_cache_.password)); + language_button_value_ = cd_cache_.language; + video_quality_button_value_ = cd_cache_.video_quality; + video_encode_format_button_value_ = cd_cache_.video_encode_format; + enable_hardware_video_codec_ = cd_cache_.enable_hardware_video_codec; + + return 0; +} + +int Render::StartScreenCapture() { + screen_capturer_ = (ScreenCapturer *)screen_capturer_factory_->Create(); + ScreenCapturer::RECORD_DESKTOP_RECT rect; + rect.left = 0; + rect.top = 0; + rect.right = screen_width_; + rect.bottom = screen_height_; + last_frame_time_ = std::chrono::high_resolution_clock::now(); + + int screen_capturer_init_ret = screen_capturer_->Init( + rect, 60, + [this](unsigned char *data, int size, int width, int height) -> void { + auto now_time = std::chrono::high_resolution_clock::now(); + std::chrono::duration duration = now_time - last_frame_time_; + auto tc = duration.count() * 1000; + + if (tc >= 0) { + SendData(peer_, DATA_TYPE::VIDEO, (const char *)data, + NV12_BUFFER_SIZE); + last_frame_time_ = now_time; + } + }); + + if (0 == screen_capturer_init_ret) { + screen_capturer_->Start(); + } else { + screen_capturer_->Destroy(); + delete screen_capturer_; + screen_capturer_ = nullptr; + } + + return 0; +} + +int Render::StopScreenCapture() { + if (screen_capturer_) { + LOG_INFO("Destroy screen capturer") + screen_capturer_->Destroy(); + delete screen_capturer_; + screen_capturer_ = nullptr; + } + + return 0; +} + +int Render::StartMouseControl() { + device_controller_factory_ = new DeviceControllerFactory(); + mouse_controller_ = (MouseController *)device_controller_factory_->Create( + DeviceControllerFactory::Device::Mouse); + int mouse_controller_init_ret = + mouse_controller_->Init(screen_width_, screen_height_); + if (0 != mouse_controller_init_ret) { + LOG_INFO("Destroy mouse controller") + mouse_controller_->Destroy(); + mouse_controller_ = nullptr; + } + + return 0; +} + +int Render::StopMouseControl() { + if (mouse_controller_) { + mouse_controller_->Destroy(); + delete mouse_controller_; + mouse_controller_ = nullptr; + } + return 0; +} + +int Render::CreateConnectionPeer() { + mac_addr_str_ = GetMac(); + + params_.use_cfg_file = false; + params_.signal_server_ip = "150.158.81.30"; + params_.signal_server_port = 9099; + params_.stun_server_ip = "150.158.81.30"; + params_.stun_server_port = 3478; + params_.turn_server_ip = "150.158.81.30"; + params_.turn_server_port = 3478; + params_.turn_server_username = "dijunkun"; + params_.turn_server_password = "dijunkunpw"; + params_.hardware_acceleration = config_center_.IsHardwareVideoCodec(); + params_.av1_encoding = config_center_.GetVideoEncodeFormat() == + ConfigCenter::VIDEO_ENCODE_FORMAT::AV1 + ? true + : false; + params_.on_receive_video_buffer = OnReceiveVideoBufferCb; + params_.on_receive_audio_buffer = OnReceiveAudioBufferCb; + params_.on_receive_data_buffer = OnReceiveDataBufferCb; + params_.on_signal_status = OnSignalStatusCb; + params_.on_connection_status = OnConnectionStatusCb; + params_.user_data = this; + + peer_ = CreatePeer(¶ms_); + if (peer_) { + LOG_INFO("Create peer instance successful"); + local_id_ = mac_addr_str_; + Init(peer_, local_id_.c_str()); + LOG_INFO("Peer init finish"); + } else { + LOG_INFO("Create peer instance failed"); + } + + return 0; +} + +int Render::Run() { + LoadSettingsIntoCacheFile(); + + localization_language_ = (ConfigCenter::LANGUAGE)language_button_value_; + localization_language_index_ = language_button_value_; + + // Setup SDL + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER | + SDL_INIT_GAMECONTROLLER) != 0) { + printf("Error: %s\n", SDL_GetError()); + return -1; + } + + // From 2.0.18: Enable native IME. +#ifdef SDL_HINT_IME_SHOW_UI + SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1"); +#endif + + // Create main window with SDL_Renderer graphics context + SDL_WindowFlags window_flags = + (SDL_WindowFlags)(SDL_WINDOW_ALLOW_HIGHDPI | SDL_WINDOW_RESIZABLE); + main_window_ = SDL_CreateWindow("Remote Desk", SDL_WINDOWPOS_CENTERED, + SDL_WINDOWPOS_CENTERED, main_window_width_, + main_window_height_, window_flags); + + SDL_DisplayMode DM; + SDL_GetCurrentDisplayMode(0, &DM); + screen_width_ = DM.w; + screen_height_ = DM.h; + + sdl_renderer_ = SDL_CreateRenderer( + main_window_, -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED); + if (sdl_renderer_ == nullptr) { + SDL_Log("Error creating SDL_Renderer!"); + return 0; + } + + pixformat_ = SDL_PIXELFORMAT_NV12; + + // sdl_texture_ = + // SDL_CreateTexture(sdl_renderer_, pixformat_, + // SDL_TEXTUREACCESS_STREAMING, + // texture_width_, texture_height_); + + // video_window_ = + // SDL_CreateWindow("Video", SDL_WINDOWPOS_CENTERED, + // SDL_WINDOWPOS_CENTERED, + // main_window_width_, main_window_height_, + // window_flags); + + // video_renderer_ = SDL_CreateRenderer( + // video_window_, -1, SDL_RENDERER_PRESENTVSYNC | + // SDL_RENDERER_ACCELERATED); + // if (video_renderer_ == nullptr) { + // SDL_Log("Error creating SDL_Renderer!"); + // return 0; + // } + + // video_texture_ = SDL_CreateTexture(video_renderer_, pixformat_, + // SDL_TEXTUREACCESS_STREAMING, + // texture_width_, texture_height_); + + // Setup Dear ImGui context + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO &io = ImGui::GetIO(); + + io.ConfigFlags |= + ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= + ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + + if (config_center_.GetLanguage() == ConfigCenter::LANGUAGE::CHINESE) { + // Load Fonts +#ifdef _WIN32 + std::string default_font_path = "c:/windows/fonts/simhei.ttf"; + std::ifstream font_path_f(default_font_path.c_str()); + std::string font_path = + font_path_f.good() ? "c:/windows/fonts/simhei.ttf" : ""; + if (!font_path.empty()) { + io.Fonts->AddFontFromFileTTF(font_path.c_str(), 30.0f, NULL, + io.Fonts->GetGlyphRangesChineseFull()); + } +#elif __APPLE__ + std::string default_font_path = "/System/Library/Fonts/PingFang.ttc"; + std::ifstream font_path_f(default_font_path.c_str()); + std::string font_path = + font_path_f.good() ? "/System/Library/Fonts/PingFang.ttc" : ""; + if (!font_path.empty()) { + io.Fonts->AddFontFromFileTTF(font_path.c_str(), 13.0f, NULL, + io.Fonts->GetGlyphRangesChineseFull()); + } +#elif __linux__ + io.Fonts->AddFontFromFileTTF("c:/windows/fonts/msyh.ttc", 13.0f, NULL, + io.Fonts->GetGlyphRangesChineseFull()); +#endif + } + + ImFontConfig config; + config.MergeMode = true; + config.GlyphMinAdvanceX = + 13.0f; // Use if you want to make the icon monospaced + static const ImWchar icon_ranges[] = {ICON_MIN_FA, ICON_MAX_FA, 0}; + io.Fonts->AddFontFromFileTTF("fonts/fa-solid-900.ttf", 30.0f, &config, + icon_ranges); + io.Fonts->Build(); + + // Setup Dear ImGui style + // ImGui::StyleColorsDark(); + ImGui::StyleColorsLight(); + + // Setup Platform/Renderer backends + ImGui_ImplSDL2_InitForSDLRenderer(main_window_, sdl_renderer_); + ImGui_ImplSDLRenderer2_Init(sdl_renderer_); + + CreateConnectionPeer(); + + { + nv12_buffer_ = new char[NV12_BUFFER_SIZE]; + + // Screen capture + screen_capturer_factory_ = new ScreenCapturerFactory(); + + // Mouse control + device_controller_factory_ = new DeviceControllerFactory(); + } + + // Main loop + while (!exit_) { + if (SignalStatus::SignalConnected == signal_status_ && + !is_create_connection_) { + is_create_connection_ = + CreateConnection(peer_, mac_addr_str_.c_str(), input_password_) + ? false + : true; + LOG_INFO("Connected with signal server, create p2p connection"); + } + + if (!inited_ || + localization_language_index_last_ != localization_language_index_) { + connect_button_label_ = + connect_button_pressed_ + ? localization::disconnect[localization_language_index_] + : localization::connect[localization_language_index_]; + fullscreen_button_label_ = + fullscreen_button_pressed_ + ? localization::exit_fullscreen[localization_language_index_] + : localization::fullscreen[localization_language_index_]; + + mouse_control_button_label_ = + mouse_control_button_pressed_ + ? localization::release_mouse[localization_language_index_] + : localization::control_mouse[localization_language_index_]; + + settings_button_label_ = + localization::settings[localization_language_index_]; + inited_ = true; + localization_language_index_last_ = localization_language_index_; + } + + if (start_screen_capture_ && !screen_capture_is_started_) { + StartScreenCapture(); + screen_capture_is_started_ = true; + } else if (!start_screen_capture_ && screen_capture_is_started_) { + StopScreenCapture(); + screen_capture_is_started_ = false; + } + + if (start_mouse_control_ && !mouse_control_is_started_) { + StartMouseControl(); + mouse_control_is_started_ = true; + } else if (!start_mouse_control_ && mouse_control_is_started_) { + StopMouseControl(); + mouse_control_is_started_ = false; + } + + // Start the Dear ImGui frame + ImGui_ImplSDLRenderer2_NewFrame(); + ImGui_ImplSDL2_NewFrame(); + ImGui::NewFrame(); + + MainWindow(); + + SDL_Event event; + while (SDL_PollEvent(&event)) { + ImGui_ImplSDL2_ProcessEvent(&event); + if (event.type == SDL_QUIT) { + exit_ = true; + } else if (event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) { + int window_w_last = main_window_width_; + int window_h_last = main_window_height_; + + SDL_GetWindowSize(main_window_, &main_window_width_, + &main_window_height_); + + // int w_change_ratio = abs(main_window_width_ - window_w_last) / 16; + // int h_change_ratio = abs(main_window_height_ - window_h_last) / 9; + + // if (w_change_ratio > h_change_ratio) { + // main_window_height_ = main_window_width_ * 9 / 16; + // } else { + // main_window_width_ = main_window_height_ * 16 / 9; + // } + + // SDL_SetWindowSize(main_window_, main_window_width_, + // main_window_height_); + } else if (event.type == SDL_WINDOWEVENT && + event.window.event == SDL_WINDOWEVENT_CLOSE && + event.window.windowID == SDL_GetWindowID(main_window_)) { + exit_ = true; + } else if (event.type == REFRESH_EVENT) { + sdl_rect_.x = 0; + sdl_rect_.y = 0; + sdl_rect_.w = main_window_width_; + sdl_rect_.h = main_window_height_; + + if (video_texture_) + SDL_UpdateTexture(video_texture_, NULL, dst_buffer_, 1280); + } else { + if (connection_established_) { + ProcessMouseKeyEven(event); + } + } + } + + // Rendering + ImGui::Render(); + SDL_RenderSetScale(sdl_renderer_, io.DisplayFramebufferScale.x, + io.DisplayFramebufferScale.y); + // SDL_SetRenderDrawColor(sdl_renderer_, 255, 255, 255, 255); + SDL_RenderClear(sdl_renderer_); + + if (video_renderer_) { + SDL_RenderCopy(video_renderer_, video_texture_, NULL, &sdl_rect_); + + if (!connection_established_ || !received_frame_) { + SDL_RenderClear(video_renderer_); + SDL_SetRenderDrawColor(video_renderer_, 255, 255, 255, 255); + } + SDL_RenderPresent(video_renderer_); + } + + ImGui_ImplSDLRenderer2_RenderDrawData(ImGui::GetDrawData()); + SDL_RenderPresent(sdl_renderer_); + + frame_count_++; + end_time_ = SDL_GetTicks(); + elapsed_time_ = end_time_ - start_time_; + if (elapsed_time_ >= 1000) { + fps_ = frame_count_ / (elapsed_time_ / 1000); + frame_count_ = 0; + window_title = "Remote Desk Client FPS [" + std::to_string(fps_) + + "] status [" + connection_status_str_ + "|" + + connection_status_str_ + "]"; + // For MacOS, UI frameworks can only be called from the main thread + SDL_SetWindowTitle(main_window_, window_title.c_str()); + start_time_ = end_time_; + } + } + + // Cleanup + if (is_create_connection_) { + LeaveConnection(peer_); + is_client_mode_ = false; + } + + if (peer_) { + DestroyPeer(peer_); + } + + if (peer_reserved_) { + DestroyPeer(peer_reserved_); + } + + SDL_CloseAudioDevice(output_dev_); + SDL_CloseAudioDevice(input_dev_); + + ImGui_ImplSDLRenderer2_Shutdown(); + ImGui_ImplSDL2_Shutdown(); + ImGui::DestroyContext(); + + SDL_DestroyRenderer(sdl_renderer_); + SDL_DestroyWindow(main_window_); + + SDL_CloseAudio(); + SDL_Quit(); + + return 0; +} \ No newline at end of file diff --git a/src/multiple_windows/main_window.h b/src/multiple_windows/render.h similarity index 93% rename from src/multiple_windows/main_window.h rename to src/multiple_windows/render.h index 9d35d93..03d9b57 100644 --- a/src/multiple_windows/main_window.h +++ b/src/multiple_windows/render.h @@ -21,14 +21,21 @@ #include "imgui_impl_sdlrenderer2.h" #include "screen_capturer_factory.h" -class MainWindow { +class Render { public: - MainWindow(); - ~MainWindow(); + Render(); + ~Render(); public: int Run(); + private: + int MainWindow(); + int MenuWindow(); + int LocalWindow(); + int RemoteWindow(); + int SettingWindow(); + public: static void OnReceiveVideoBufferCb(const char *data, size_t size, const char *user_id, size_t user_id_size, @@ -105,16 +112,23 @@ class MainWindow { int main_window_height_ = 720; int main_window_width_before_fullscreen_ = 1280; int main_window_height_before_fullscreen_ = 720; + int menu_window_height_ = 40; + int local_window_width_ = 350; int texture_width_ = 1280; int texture_height_ = 720; - SDL_Texture *sdl_texture_ = nullptr; - SDL_Renderer *sdl_renderer_ = nullptr; - SDL_Rect sdl_rect_; SDL_Window *main_window_; + SDL_Renderer *sdl_renderer_ = nullptr; + SDL_Texture *sdl_texture_ = nullptr; + SDL_Rect sdl_rect_; uint32_t pixformat_ = 0; + // video window + SDL_Window *video_window_; + SDL_Renderer *video_renderer_ = nullptr; + SDL_Texture *video_texture_ = nullptr; + bool inited_ = false; bool exit_ = false; bool connection_established_ = false; @@ -130,6 +144,7 @@ class MainWindow { bool control_mouse_ = false; bool show_password_ = true; bool regenerate_password_ = false; + bool video_window_created_ = false; int regenerate_password_frame_count_ = 0; int fps_ = 0; diff --git a/src/multiple_windows/render_callback_func.cpp b/src/multiple_windows/render_callback_func.cpp new file mode 100644 index 0000000..e19841f --- /dev/null +++ b/src/multiple_windows/render_callback_func.cpp @@ -0,0 +1,239 @@ +#include "device_controller.h" +#include "localization.h" +#include "render.h" + +// Refresh Event +#define REFRESH_EVENT (SDL_USEREVENT + 1) +#define NV12_BUFFER_SIZE 1280 * 720 * 3 / 2 + +#ifdef REMOTE_DESK_DEBUG +#else +#define MOUSE_CONTROL 1 +#endif + +int Render::ProcessMouseKeyEven(SDL_Event &ev) { + if (!control_mouse_) { + return 0; + } + + float ratio = (float)(1280.0 / main_window_width_); + + RemoteAction remote_action; + remote_action.m.x = (size_t)(ev.button.x * ratio); + remote_action.m.y = (size_t)(ev.button.y * ratio); + + if (SDL_KEYDOWN == ev.type) // SDL_KEYUP + { + // printf("SDLK_DOWN: %d\n", SDL_KeyCode(ev.key.keysym.sym)); + if (SDLK_DOWN == ev.key.keysym.sym) { + // printf("SDLK_DOWN \n"); + + } else if (SDLK_UP == ev.key.keysym.sym) { + // printf("SDLK_UP \n"); + + } else if (SDLK_LEFT == ev.key.keysym.sym) { + // printf("SDLK_LEFT \n"); + + } else if (SDLK_RIGHT == ev.key.keysym.sym) { + // printf("SDLK_RIGHT \n"); + } + } else if (SDL_MOUSEBUTTONDOWN == ev.type) { + remote_action.type = ControlType::mouse; + if (SDL_BUTTON_LEFT == ev.button.button) { + remote_action.m.flag = MouseFlag::left_down; + } else if (SDL_BUTTON_RIGHT == ev.button.button) { + remote_action.m.flag = MouseFlag::right_down; + } + if (subwindow_hovered_) { + remote_action.m.flag = MouseFlag::move; + } + SendData(peer_, DATA_TYPE::DATA, (const char *)&remote_action, + sizeof(remote_action)); + } else if (SDL_MOUSEBUTTONUP == ev.type) { + remote_action.type = ControlType::mouse; + if (SDL_BUTTON_LEFT == ev.button.button) { + remote_action.m.flag = MouseFlag::left_up; + } else if (SDL_BUTTON_RIGHT == ev.button.button) { + remote_action.m.flag = MouseFlag::right_up; + } + if (subwindow_hovered_) { + remote_action.m.flag = MouseFlag::move; + } + SendData(peer_, DATA_TYPE::DATA, (const char *)&remote_action, + sizeof(remote_action)); + } else if (SDL_MOUSEMOTION == ev.type) { + remote_action.type = ControlType::mouse; + remote_action.m.flag = MouseFlag::move; + SendData(peer_, DATA_TYPE::DATA, (const char *)&remote_action, + sizeof(remote_action)); + } else if (SDL_QUIT == ev.type) { + SDL_Event event; + event.type = SDL_QUIT; + SDL_PushEvent(&event); + printf("SDL_QUIT\n"); + return 0; + } + + return 0; +} + +void Render::SdlCaptureAudioIn(void *userdata, Uint8 *stream, int len) { + if (1) { + if ("Connected" == connection_status_str_) { + SendData(peer_, DATA_TYPE::AUDIO, (const char *)stream, len); + } + } else { + memcpy(audio_buffer_, stream, len); + audio_len_ = len; + SDL_Delay(10); + audio_buffer_fresh_ = true; + } +} + +void Render::SdlCaptureAudioOut(void *userdata, Uint8 *stream, int len) { + if (!audio_buffer_fresh_) { + return; + } + + SDL_memset(stream, 0, len); + + if (audio_len_ == 0) { + return; + } else { + } + + len = (len > audio_len_ ? audio_len_ : len); + SDL_MixAudioFormat(stream, audio_buffer_, AUDIO_S16LSB, len, + SDL_MIX_MAXVOLUME); + audio_buffer_fresh_ = false; +} + +void Render::OnReceiveVideoBufferCb(const char *data, size_t size, + const char *user_id, size_t user_id_size, + void *user_data) { + Render *render = (Render *)user_data; + if (render->connection_established_) { + memcpy(render->dst_buffer_, data, size); + SDL_Event event; + event.type = REFRESH_EVENT; + SDL_PushEvent(&event); + render->received_frame_ = true; + } +} + +void Render::OnReceiveAudioBufferCb(const char *data, size_t size, + const char *user_id, size_t user_id_size, + void *user_data) { + Render *render = (Render *)user_data; + render->audio_buffer_fresh_ = true; + SDL_QueueAudio(render->output_dev_, data, (uint32_t)size); +} + +void Render::OnReceiveDataBufferCb(const char *data, size_t size, + const char *user_id, size_t user_id_size, + void *user_data) { + Render *render = (Render *)user_data; + std::string user(user_id, user_id_size); + RemoteAction remote_action; + memcpy(&remote_action, data, sizeof(remote_action)); + +#if MOUSE_CONTROL + if (render->mouse_controller_) { + render->mouse_controller_->SendCommand(remote_action); + } +#endif +} + +void Render::OnSignalStatusCb(SignalStatus status, void *user_data) { + Render *render = (Render *)user_data; + render->signal_status_ = status; + if (SignalStatus::SignalConnecting == status) { + render->signal_status_str_ = "SignalConnecting"; + } else if (SignalStatus::SignalConnected == status) { + render->signal_status_str_ = "SignalConnected"; + } else if (SignalStatus::SignalFailed == status) { + render->signal_status_str_ = "SignalFailed"; + } else if (SignalStatus::SignalClosed == status) { + render->signal_status_str_ = "SignalClosed"; + } else if (SignalStatus::SignalReconnecting == status) { + render->signal_status_str_ = "SignalReconnecting"; + } +} + +void Render::OnConnectionStatusCb(ConnectionStatus status, void *user_data) { + Render *render = (Render *)user_data; + render->connection_status_ = status; + if (ConnectionStatus::Connecting == status) { + render->connection_status_str_ = "Connecting"; + } else if (ConnectionStatus::Connected == status) { + render->connection_status_str_ = "Connected"; + render->connection_established_ = true; + if (!render->is_client_mode_) { + render->start_screen_capture_ = true; + render->start_mouse_control_ = true; + } + + if (!render->video_window_created_) { + SDL_WindowFlags window_flags = + (SDL_WindowFlags)(SDL_WINDOW_ALLOW_HIGHDPI | SDL_WINDOW_RESIZABLE); + + render->sdl_texture_ = + SDL_CreateTexture(render->sdl_renderer_, render->pixformat_, + SDL_TEXTUREACCESS_STREAMING, render->texture_width_, + render->texture_height_); + + render->video_window_ = + SDL_CreateWindow("Video", SDL_WINDOWPOS_CENTERED, + SDL_WINDOWPOS_CENTERED, render->main_window_width_, + render->main_window_height_, window_flags); + + render->video_renderer_ = SDL_CreateRenderer( + render->video_window_, -1, + SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED); + if (render->video_renderer_ == nullptr) { + SDL_Log("Error creating SDL_Renderer!"); + } + + render->video_texture_ = + SDL_CreateTexture(render->video_renderer_, render->pixformat_, + SDL_TEXTUREACCESS_STREAMING, render->texture_width_, + render->texture_height_); + render->video_window_created_ = true; + } + + } else if (ConnectionStatus::Disconnected == status) { + render->connection_status_str_ = "Disconnected"; + } else if (ConnectionStatus::Failed == status) { + render->connection_status_str_ = "Failed"; + } else if (ConnectionStatus::Closed == status) { + render->connection_status_str_ = "Closed"; + render->start_screen_capture_ = false; + render->start_mouse_control_ = false; + render->connection_established_ = false; + render->control_mouse_ = false; + if (render->dst_buffer_) { + memset(render->dst_buffer_, 0, 1280 * 720 * 3); + SDL_UpdateTexture(render->sdl_texture_, NULL, render->dst_buffer_, 1280); + } + } else if (ConnectionStatus::IncorrectPassword == status) { + render->connection_status_str_ = "Incorrect password"; + if (render->connect_button_pressed_) { + render->connect_button_pressed_ = false; + render->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) { + render->connection_status_str_ = "No such transmission id"; + if (render->connect_button_pressed_) { + render->connect_button_pressed_ = false; + render->connection_established_ = false; + render->connect_button_label_ = + render->connect_button_pressed_ + ? localization::disconnect[render->localization_language_index_] + : localization::connect[render->localization_language_index_]; + } + } +} diff --git a/src/multiple_windows/setting_window.cpp b/src/multiple_windows/setting_window.cpp new file mode 100644 index 0000000..33c7b2f --- /dev/null +++ b/src/multiple_windows/setting_window.cpp @@ -0,0 +1,280 @@ +#include "IconsFontAwesome6.h" +#include "layout_style.h" +#include "localization.h" +#include "log.h" +#include "render.h" + +int Render::SettingWindow() { + ImGui::SetWindowFontScale(0.5f); + ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f); + // Mouse control + std::string mouse = ICON_FA_COMPUTER_MOUSE; + if (ImGui::Button(mouse.c_str(), ImVec2(25, 25))) { + if (mouse_control_button_label_ == + localization::control_mouse[localization_language_index_] && + connection_established_) { + mouse_control_button_pressed_ = true; + control_mouse_ = true; + mouse_control_button_label_ = + localization::release_mouse[localization_language_index_]; + } else { + control_mouse_ = false; + mouse_control_button_label_ = + localization::control_mouse[localization_language_index_]; + } + mouse_control_button_pressed_ = !mouse_control_button_pressed_; + } + + ImGui::SameLine(); + // Fullscreen + std::string fullscreen = ICON_FA_EXPAND; + if (ImGui::Button(fullscreen.c_str(), ImVec2(25, 25))) { + if (fullscreen_button_label_ == + localization::fullscreen[localization_language_index_]) { + main_window_width_before_fullscreen_ = main_window_width_; + main_window_height_before_fullscreen_ = main_window_height_; + SDL_SetWindowFullscreen(main_window_, SDL_WINDOW_FULLSCREEN_DESKTOP); + fullscreen_button_label_ = + localization::exit_fullscreen[localization_language_index_]; + } else { + SDL_SetWindowFullscreen(main_window_, SDL_FALSE); + SDL_SetWindowSize(main_window_, main_window_width_before_fullscreen_, + main_window_height_before_fullscreen_); + main_window_width_ = main_window_width_before_fullscreen_; + main_window_height_ = main_window_height_before_fullscreen_; + fullscreen_button_label_ = + localization::fullscreen[localization_language_index_]; + } + fullscreen_button_pressed_ = !fullscreen_button_pressed_; + } + + ImGui::SameLine(); + + std::string gear = ICON_FA_GEAR; + if (ImGui::Button(gear.c_str(), ImVec2(25, 25))) { + settings_button_pressed_ = !settings_button_pressed_; + settings_window_pos_reset_ = true; + } + + if (settings_button_pressed_) { + if (settings_window_pos_reset_) { + const ImGuiViewport *viewport = ImGui::GetMainViewport(); + if (ConfigCenter::LANGUAGE::CHINESE == localization_language_) { + ImGui::SetNextWindowPos( + ImVec2((viewport->WorkSize.x - viewport->WorkPos.x - + SETTINGS_WINDOW_WIDTH_CN) / + 2, + (viewport->WorkSize.y - viewport->WorkPos.y - + SETTINGS_WINDOW_HEIGHT_CN) / + 2)); + + ImGui::SetNextWindowSize( + ImVec2(SETTINGS_WINDOW_WIDTH_CN, SETTINGS_WINDOW_HEIGHT_CN)); + } else { + ImGui::SetNextWindowPos( + ImVec2((viewport->WorkSize.x - viewport->WorkPos.x - + SETTINGS_WINDOW_WIDTH_EN) / + 2, + (viewport->WorkSize.y - viewport->WorkPos.y - + SETTINGS_WINDOW_HEIGHT_EN) / + 2)); + + ImGui::SetNextWindowSize( + ImVec2(SETTINGS_WINDOW_WIDTH_EN, SETTINGS_WINDOW_HEIGHT_EN)); + } + + settings_window_pos_reset_ = false; + } + + ImGui::SetWindowFontScale(0.5f); + // Settings + ImGui::Begin(localization::settings[localization_language_index_].c_str(), + nullptr, + ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse | + ImGuiWindowFlags_NoSavedSettings); + ImGui::SetWindowFontScale(0.5f); + { + const char *language_items[] = { + localization::language_zh[localization_language_index_].c_str(), + localization::language_en[localization_language_index_].c_str()}; + + ImGui::SetCursorPosY(32); + ImGui::Text(localization::language[localization_language_index_].c_str()); + if (ConfigCenter::LANGUAGE::CHINESE == localization_language_) { + ImGui::SetCursorPosX(LANGUAGE_SELECT_WINDOW_PADDING_CN); + } else { + ImGui::SetCursorPosX(LANGUAGE_SELECT_WINDOW_PADDING_EN); + } + ImGui::SetCursorPosY(30); + ImGui::SetNextItemWidth(SETTINGS_SELECT_WINDOW_WIDTH); + + ImGui::Combo("##language", &language_button_value_, language_items, + IM_ARRAYSIZE(language_items)); + } + + ImGui::Separator(); + + { + const char *video_quality_items[] = { + localization::video_quality_high[localization_language_index_] + .c_str(), + localization::video_quality_medium[localization_language_index_] + .c_str(), + localization::video_quality_low[localization_language_index_] + .c_str()}; + + ImGui::SetCursorPosY(62); + ImGui::Text( + localization::video_quality[localization_language_index_].c_str()); + + if (ConfigCenter::LANGUAGE::CHINESE == localization_language_) { + ImGui::SetCursorPosX(VIDEO_QUALITY_SELECT_WINDOW_PADDING_CN); + } else { + ImGui::SetCursorPosX(VIDEO_QUALITY_SELECT_WINDOW_PADDING_EN); + } + ImGui::SetCursorPosY(60); + ImGui::SetNextItemWidth(SETTINGS_SELECT_WINDOW_WIDTH); + + ImGui::Combo("##video_quality", &video_quality_button_value_, + video_quality_items, IM_ARRAYSIZE(video_quality_items)); + } + + ImGui::Separator(); + + { + const char *video_encode_format_items[] = { + localization::av1[localization_language_index_].c_str(), + localization::h264[localization_language_index_].c_str()}; + + ImGui::SetCursorPosY(92); + ImGui::Text( + localization::video_encode_format[localization_language_index_] + .c_str()); + + if (ConfigCenter::LANGUAGE::CHINESE == localization_language_) { + ImGui::SetCursorPosX(VIDEO_ENCODE_FORMAT_SELECT_WINDOW_PADDING_CN); + } else { + ImGui::SetCursorPosX(VIDEO_ENCODE_FORMAT_SELECT_WINDOW_PADDING_EN); + } + ImGui::SetCursorPosY(90); + ImGui::SetNextItemWidth(SETTINGS_SELECT_WINDOW_WIDTH); + + ImGui::Combo("##video_encode_format", &video_encode_format_button_value_, + video_encode_format_items, + IM_ARRAYSIZE(video_encode_format_items)); + } + + ImGui::Separator(); + + { + ImGui::SetCursorPosY(122); + ImGui::Text(localization::enable_hardware_video_codec + [localization_language_index_] + .c_str()); + + if (ConfigCenter::LANGUAGE::CHINESE == localization_language_) { + ImGui::SetCursorPosX(ENABLE_HARDWARE_VIDEO_CODEC_CHECKBOX_PADDING_CN); + } else { + ImGui::SetCursorPosX(ENABLE_HARDWARE_VIDEO_CODEC_CHECKBOX_PADDING_EN); + } + ImGui::SetCursorPosY(120); + ImGui::Checkbox("##enable_hardware_video_codec", + &enable_hardware_video_codec_); + } + + if (ConfigCenter::LANGUAGE::CHINESE == localization_language_) { + ImGui::SetCursorPosX(SETTINGS_OK_BUTTON_PADDING_CN); + } else { + ImGui::SetCursorPosX(SETTINGS_OK_BUTTON_PADDING_EN); + } + ImGui::SetCursorPosY(160.0f); + + // OK + if (ImGui::Button(localization::ok[localization_language_index_].c_str())) { + settings_button_pressed_ = false; + + // Language + if (language_button_value_ == 0) { + config_center_.SetLanguage(ConfigCenter::LANGUAGE::CHINESE); + } else { + config_center_.SetLanguage(ConfigCenter::LANGUAGE::ENGLISH); + } + language_button_value_last_ = language_button_value_; + localization_language_ = (ConfigCenter::LANGUAGE)language_button_value_; + localization_language_index_ = language_button_value_; + LOG_INFO("Set localization language: {}", + localization_language_index_ == 0 ? "zh" : "en"); + + // Video quality + if (video_quality_button_value_ == 0) { + config_center_.SetVideoQuality(ConfigCenter::VIDEO_QUALITY::HIGH); + } else if (video_quality_button_value_ == 1) { + config_center_.SetVideoQuality(ConfigCenter::VIDEO_QUALITY::MEDIUM); + } else { + config_center_.SetVideoQuality(ConfigCenter::VIDEO_QUALITY::LOW); + } + video_quality_button_value_last_ = video_quality_button_value_; + + // Video encode format + if (video_encode_format_button_value_ == 0) { + config_center_.SetVideoEncodeFormat( + ConfigCenter::VIDEO_ENCODE_FORMAT::AV1); + } else if (video_encode_format_button_value_ == 1) { + config_center_.SetVideoEncodeFormat( + ConfigCenter::VIDEO_ENCODE_FORMAT::H264); + } + video_encode_format_button_value_last_ = + video_encode_format_button_value_; + + // Hardware video codec + if (enable_hardware_video_codec_) { + config_center_.SetHardwareVideoCodec(true); + } else { + config_center_.SetHardwareVideoCodec(false); + } + enable_hardware_video_codec_last_ = enable_hardware_video_codec_; + + SaveSettingsIntoCacheFile(); + settings_window_pos_reset_ = true; + + // Recreate peer instance + LoadSettingsIntoCacheFile(); + + // Recreate peer instance + { + DestroyPeer(peer_); + CreateConnectionPeer(); + LOG_INFO("Recreate peer instance successful"); + } + } + ImGui::SameLine(); + // Cancel + if (ImGui::Button( + localization::cancel[localization_language_index_].c_str())) { + settings_button_pressed_ = false; + if (language_button_value_ != language_button_value_last_) { + language_button_value_ = language_button_value_last_; + } + + if (video_quality_button_value_ != video_quality_button_value_last_) { + video_quality_button_value_ = video_quality_button_value_last_; + } + + if (video_encode_format_button_value_ != + video_encode_format_button_value_last_) { + video_encode_format_button_value_ = + video_encode_format_button_value_last_; + } + + if (enable_hardware_video_codec_ != enable_hardware_video_codec_last_) { + enable_hardware_video_codec_ = enable_hardware_video_codec_last_; + } + + settings_window_pos_reset_ = true; + } + + ImGui::End(); + } + + return 0; +} \ No newline at end of file diff --git a/src/single_window/main_window_callback_func.cpp b/src/single_window/main_window_callback_func.cpp deleted file mode 100644 index 3929154..0000000 --- a/src/single_window/main_window_callback_func.cpp +++ /dev/null @@ -1,216 +0,0 @@ -#include "device_controller.h" -#include "localization.h" -#include "main_window.h" - -// Refresh Event -#define REFRESH_EVENT (SDL_USEREVENT + 1) -#define NV12_BUFFER_SIZE 1280 * 720 * 3 / 2 - -#ifdef REMOTE_DESK_DEBUG -#else -#define MOUSE_CONTROL 1 -#endif - -int MainWindow::ProcessMouseKeyEven(SDL_Event &ev) { - if (!control_mouse_) { - return 0; - } - - float ratio = (float)(1280.0 / main_window_width_); - - RemoteAction remote_action; - remote_action.m.x = (size_t)(ev.button.x * ratio); - remote_action.m.y = (size_t)(ev.button.y * ratio); - - if (SDL_KEYDOWN == ev.type) // SDL_KEYUP - { - // printf("SDLK_DOWN: %d\n", SDL_KeyCode(ev.key.keysym.sym)); - if (SDLK_DOWN == ev.key.keysym.sym) { - // printf("SDLK_DOWN \n"); - - } else if (SDLK_UP == ev.key.keysym.sym) { - // printf("SDLK_UP \n"); - - } else if (SDLK_LEFT == ev.key.keysym.sym) { - // printf("SDLK_LEFT \n"); - - } else if (SDLK_RIGHT == ev.key.keysym.sym) { - // printf("SDLK_RIGHT \n"); - } - } else if (SDL_MOUSEBUTTONDOWN == ev.type) { - remote_action.type = ControlType::mouse; - if (SDL_BUTTON_LEFT == ev.button.button) { - remote_action.m.flag = MouseFlag::left_down; - } else if (SDL_BUTTON_RIGHT == ev.button.button) { - remote_action.m.flag = MouseFlag::right_down; - } - if (subwindow_hovered_) { - remote_action.m.flag = MouseFlag::move; - } - SendData(peer_, DATA_TYPE::DATA, (const char *)&remote_action, - sizeof(remote_action)); - } else if (SDL_MOUSEBUTTONUP == ev.type) { - remote_action.type = ControlType::mouse; - if (SDL_BUTTON_LEFT == ev.button.button) { - remote_action.m.flag = MouseFlag::left_up; - } else if (SDL_BUTTON_RIGHT == ev.button.button) { - remote_action.m.flag = MouseFlag::right_up; - } - if (subwindow_hovered_) { - remote_action.m.flag = MouseFlag::move; - } - SendData(peer_, DATA_TYPE::DATA, (const char *)&remote_action, - sizeof(remote_action)); - } else if (SDL_MOUSEMOTION == ev.type) { - remote_action.type = ControlType::mouse; - remote_action.m.flag = MouseFlag::move; - SendData(peer_, DATA_TYPE::DATA, (const char *)&remote_action, - sizeof(remote_action)); - } else if (SDL_QUIT == ev.type) { - SDL_Event event; - event.type = SDL_QUIT; - SDL_PushEvent(&event); - printf("SDL_QUIT\n"); - return 0; - } - - return 0; -} - -void MainWindow::SdlCaptureAudioIn(void *userdata, Uint8 *stream, int len) { - if (1) { - if ("Connected" == connection_status_str_) { - SendData(peer_, DATA_TYPE::AUDIO, (const char *)stream, len); - } - } else { - memcpy(audio_buffer_, stream, len); - audio_len_ = len; - SDL_Delay(10); - audio_buffer_fresh_ = true; - } -} - -void MainWindow::SdlCaptureAudioOut(void *userdata, Uint8 *stream, int len) { - if (!audio_buffer_fresh_) { - return; - } - - SDL_memset(stream, 0, len); - - if (audio_len_ == 0) { - return; - } else { - } - - len = (len > audio_len_ ? audio_len_ : len); - SDL_MixAudioFormat(stream, audio_buffer_, AUDIO_S16LSB, len, - SDL_MIX_MAXVOLUME); - audio_buffer_fresh_ = false; -} - -void MainWindow::OnReceiveVideoBufferCb(const char *data, size_t size, - const char *user_id, - size_t user_id_size, void *user_data) { - MainWindow *main_window = (MainWindow *)user_data; - if (main_window->connection_established_) { - memcpy(main_window->dst_buffer_, data, size); - SDL_Event event; - event.type = REFRESH_EVENT; - SDL_PushEvent(&event); - main_window->received_frame_ = true; - } -} - -void MainWindow::OnReceiveAudioBufferCb(const char *data, size_t size, - const char *user_id, - size_t user_id_size, void *user_data) { - MainWindow *main_window = (MainWindow *)user_data; - main_window->audio_buffer_fresh_ = true; - SDL_QueueAudio(main_window->output_dev_, data, (uint32_t)size); -} - -void MainWindow::OnReceiveDataBufferCb(const char *data, size_t size, - const char *user_id, size_t user_id_size, - void *user_data) { - MainWindow *main_window = (MainWindow *)user_data; - std::string user(user_id, user_id_size); - RemoteAction remote_action; - memcpy(&remote_action, data, sizeof(remote_action)); - -#if MOUSE_CONTROL - if (main_window->mouse_controller_) { - main_window->mouse_controller_->SendCommand(remote_action); - } -#endif -} - -void MainWindow::OnSignalStatusCb(SignalStatus status, void *user_data) { - MainWindow *main_window = (MainWindow *)user_data; - main_window->signal_status_ = status; - if (SignalStatus::SignalConnecting == status) { - main_window->signal_status_str_ = "SignalConnecting"; - } else if (SignalStatus::SignalConnected == status) { - main_window->signal_status_str_ = "SignalConnected"; - } else if (SignalStatus::SignalFailed == status) { - main_window->signal_status_str_ = "SignalFailed"; - } else if (SignalStatus::SignalClosed == status) { - main_window->signal_status_str_ = "SignalClosed"; - } else if (SignalStatus::SignalReconnecting == status) { - main_window->signal_status_str_ = "SignalReconnecting"; - } -} - -void MainWindow::OnConnectionStatusCb(ConnectionStatus status, - void *user_data) { - MainWindow *main_window = (MainWindow *)user_data; - main_window->connection_status_ = status; - if (ConnectionStatus::Connecting == status) { - main_window->connection_status_str_ = "Connecting"; - } else if (ConnectionStatus::Connected == status) { - main_window->connection_status_str_ = "Connected"; - main_window->connection_established_ = true; - if (!main_window->is_client_mode_) { - main_window->start_screen_capture_ = true; - main_window->start_mouse_control_ = true; - } - } else if (ConnectionStatus::Disconnected == status) { - main_window->connection_status_str_ = "Disconnected"; - } else if (ConnectionStatus::Failed == status) { - main_window->connection_status_str_ = "Failed"; - } else if (ConnectionStatus::Closed == status) { - main_window->connection_status_str_ = "Closed"; - main_window->start_screen_capture_ = false; - main_window->start_mouse_control_ = false; - main_window->connection_established_ = false; - main_window->control_mouse_ = false; - if (main_window->dst_buffer_) { - memset(main_window->dst_buffer_, 0, 1280 * 720 * 3); - SDL_UpdateTexture(main_window->sdl_texture_, NULL, - main_window->dst_buffer_, 1280); - } - } else if (ConnectionStatus::IncorrectPassword == status) { - main_window->connection_status_str_ = "Incorrect password"; - if (main_window->connect_button_pressed_) { - main_window->connect_button_pressed_ = false; - main_window->connection_established_ = false; - main_window->connect_button_label_ = - main_window->connect_button_pressed_ - ? localization::disconnect[main_window - ->localization_language_index_] - : localization::connect[main_window - ->localization_language_index_]; - } - } else if (ConnectionStatus::NoSuchTransmissionId == status) { - main_window->connection_status_str_ = "No such transmission id"; - if (main_window->connect_button_pressed_) { - main_window->connect_button_pressed_ = false; - main_window->connection_established_ = false; - main_window->connect_button_label_ = - main_window->connect_button_pressed_ - ? localization::disconnect[main_window - ->localization_language_index_] - : localization::connect[main_window - ->localization_language_index_]; - } - } -} diff --git a/src/single_window/main_window.cpp b/src/single_window/render.cpp similarity index 98% rename from src/single_window/main_window.cpp rename to src/single_window/render.cpp index ee60bdb..73c8a87 100644 --- a/src/single_window/main_window.cpp +++ b/src/single_window/render.cpp @@ -1,5 +1,3 @@ -#include "main_window.h" - #include #include #include @@ -9,17 +7,18 @@ #include "localization.h" #include "log.h" #include "platform.h" +#include "render.h" #include "screen_capturer_factory.h" // Refresh Event #define REFRESH_EVENT (SDL_USEREVENT + 1) #define NV12_BUFFER_SIZE 1280 * 720 * 3 / 2 -MainWindow::MainWindow() {} +Render::Render() {} -MainWindow::~MainWindow() {} +Render::~Render() {} -int MainWindow::SaveSettingsIntoCacheFile() { +int Render::SaveSettingsIntoCacheFile() { cd_cache_file_ = fopen("cache.cd", "w+"); if (!cd_cache_file_) { return -1; @@ -41,7 +40,7 @@ int MainWindow::SaveSettingsIntoCacheFile() { return 0; } -int MainWindow::LoadSettingsIntoCacheFile() { +int Render::LoadSettingsIntoCacheFile() { cd_cache_file_ = fopen("cache.cd", "r+"); if (!cd_cache_file_) { return -1; @@ -59,7 +58,7 @@ int MainWindow::LoadSettingsIntoCacheFile() { return 0; } -int MainWindow::StartScreenCapture() { +int Render::StartScreenCapture() { screen_capturer_ = (ScreenCapturer *)screen_capturer_factory_->Create(); ScreenCapturer::RECORD_DESKTOP_RECT rect; rect.left = 0; @@ -93,7 +92,7 @@ int MainWindow::StartScreenCapture() { return 0; } -int MainWindow::StopScreenCapture() { +int Render::StopScreenCapture() { if (screen_capturer_) { LOG_INFO("Destroy screen capturer") screen_capturer_->Destroy(); @@ -104,7 +103,7 @@ int MainWindow::StopScreenCapture() { return 0; } -int MainWindow::StartMouseControl() { +int Render::StartMouseControl() { device_controller_factory_ = new DeviceControllerFactory(); mouse_controller_ = (MouseController *)device_controller_factory_->Create( DeviceControllerFactory::Device::Mouse); @@ -119,7 +118,7 @@ int MainWindow::StartMouseControl() { return 0; } -int MainWindow::StopMouseControl() { +int Render::StopMouseControl() { if (mouse_controller_) { mouse_controller_->Destroy(); delete mouse_controller_; @@ -128,7 +127,7 @@ int MainWindow::StopMouseControl() { return 0; } -int MainWindow::CreateConnectionPeer() { +int Render::CreateConnectionPeer() { mac_addr_str_ = GetMac(); params_.use_cfg_file = false; @@ -165,7 +164,7 @@ int MainWindow::CreateConnectionPeer() { return 0; } -int MainWindow::Run() { +int Render::Run() { LoadSettingsIntoCacheFile(); localization_language_ = (ConfigCenter::LANGUAGE)language_button_value_; diff --git a/src/single_window/main_window.h b/src/single_window/render.h similarity index 98% rename from src/single_window/main_window.h rename to src/single_window/render.h index 7b69e54..d80562b 100644 --- a/src/single_window/main_window.h +++ b/src/single_window/render.h @@ -21,10 +21,10 @@ #include "imgui_impl_sdlrenderer2.h" #include "screen_capturer_factory.h" -class MainWindow { +class Render { public: - MainWindow(); - ~MainWindow(); + Render(); + ~Render(); public: int Run(); diff --git a/src/multiple_windows/main_window_callback_func.cpp b/src/single_window/render_callback_func.cpp similarity index 83% rename from src/multiple_windows/main_window_callback_func.cpp rename to src/single_window/render_callback_func.cpp index 3929154..d86018f 100644 --- a/src/multiple_windows/main_window_callback_func.cpp +++ b/src/single_window/render_callback_func.cpp @@ -1,6 +1,6 @@ #include "device_controller.h" #include "localization.h" -#include "main_window.h" +#include "render.h" // Refresh Event #define REFRESH_EVENT (SDL_USEREVENT + 1) @@ -11,7 +11,7 @@ #define MOUSE_CONTROL 1 #endif -int MainWindow::ProcessMouseKeyEven(SDL_Event &ev) { +int Render::ProcessMouseKeyEven(SDL_Event &ev) { if (!control_mouse_) { return 0; } @@ -77,7 +77,7 @@ int MainWindow::ProcessMouseKeyEven(SDL_Event &ev) { return 0; } -void MainWindow::SdlCaptureAudioIn(void *userdata, Uint8 *stream, int len) { +void Render::SdlCaptureAudioIn(void *userdata, Uint8 *stream, int len) { if (1) { if ("Connected" == connection_status_str_) { SendData(peer_, DATA_TYPE::AUDIO, (const char *)stream, len); @@ -90,7 +90,7 @@ void MainWindow::SdlCaptureAudioIn(void *userdata, Uint8 *stream, int len) { } } -void MainWindow::SdlCaptureAudioOut(void *userdata, Uint8 *stream, int len) { +void Render::SdlCaptureAudioOut(void *userdata, Uint8 *stream, int len) { if (!audio_buffer_fresh_) { return; } @@ -108,10 +108,10 @@ void MainWindow::SdlCaptureAudioOut(void *userdata, Uint8 *stream, int len) { audio_buffer_fresh_ = false; } -void MainWindow::OnReceiveVideoBufferCb(const char *data, size_t size, - const char *user_id, - size_t user_id_size, void *user_data) { - MainWindow *main_window = (MainWindow *)user_data; +void Render::OnReceiveVideoBufferCb(const char *data, size_t size, + const char *user_id, size_t user_id_size, + void *user_data) { + Render *main_window = (Render *)user_data; if (main_window->connection_established_) { memcpy(main_window->dst_buffer_, data, size); SDL_Event event; @@ -121,18 +121,18 @@ void MainWindow::OnReceiveVideoBufferCb(const char *data, size_t size, } } -void MainWindow::OnReceiveAudioBufferCb(const char *data, size_t size, - const char *user_id, - size_t user_id_size, void *user_data) { - MainWindow *main_window = (MainWindow *)user_data; +void Render::OnReceiveAudioBufferCb(const char *data, size_t size, + const char *user_id, size_t user_id_size, + void *user_data) { + Render *main_window = (Render *)user_data; main_window->audio_buffer_fresh_ = true; SDL_QueueAudio(main_window->output_dev_, data, (uint32_t)size); } -void MainWindow::OnReceiveDataBufferCb(const char *data, size_t size, - const char *user_id, size_t user_id_size, - void *user_data) { - MainWindow *main_window = (MainWindow *)user_data; +void Render::OnReceiveDataBufferCb(const char *data, size_t size, + const char *user_id, size_t user_id_size, + void *user_data) { + Render *main_window = (Render *)user_data; std::string user(user_id, user_id_size); RemoteAction remote_action; memcpy(&remote_action, data, sizeof(remote_action)); @@ -144,8 +144,8 @@ void MainWindow::OnReceiveDataBufferCb(const char *data, size_t size, #endif } -void MainWindow::OnSignalStatusCb(SignalStatus status, void *user_data) { - MainWindow *main_window = (MainWindow *)user_data; +void Render::OnSignalStatusCb(SignalStatus status, void *user_data) { + Render *main_window = (Render *)user_data; main_window->signal_status_ = status; if (SignalStatus::SignalConnecting == status) { main_window->signal_status_str_ = "SignalConnecting"; @@ -160,9 +160,8 @@ void MainWindow::OnSignalStatusCb(SignalStatus status, void *user_data) { } } -void MainWindow::OnConnectionStatusCb(ConnectionStatus status, - void *user_data) { - MainWindow *main_window = (MainWindow *)user_data; +void Render::OnConnectionStatusCb(ConnectionStatus status, void *user_data) { + Render *main_window = (Render *)user_data; main_window->connection_status_ = status; if (ConnectionStatus::Connecting == status) { main_window->connection_status_str_ = "Connecting";