diff --git a/remote_desk_client/remote_desk_client.cpp b/remote_desk_client/remote_desk_client.cpp index ebbf39d..3e56b6a 100644 --- a/remote_desk_client/remote_desk_client.cpp +++ b/remote_desk_client/remote_desk_client.cpp @@ -1,9 +1,11 @@ - - -#include +#ifdef _WIN32 +#include +#include +#endif #include #include +#include #include #include "x.h" @@ -18,6 +20,12 @@ unsigned char dst_buffer[pixel_w * pixel_h * 3 / 2]; SDL_Texture *sdlTexture = nullptr; SDL_Renderer *sdlRenderer = nullptr; SDL_Rect sdlRect; +SDL_Window *screen; + +uint32_t start_time, end_time, elapsed_time; +uint32_t frame_count = 0; +int fps = 0; +std::string window_title = "Remote Desk Client"; // Refresh Event #define REFRESH_EVENT (SDL_USEREVENT + 1) @@ -39,19 +47,114 @@ int refresh_video(void *opaque) { return 0; } +int GetVideoEvent(void *opaque) { + SDL_Event ev; + int quit = 0; + while (!quit) { + while (SDL_PollEvent(&ev)) { + if (ev.type == REFRESH_EVENT) { + sdlRect.x = 0; + sdlRect.y = 0; + sdlRect.w = screen_w; + sdlRect.h = screen_h; + + SDL_UpdateTexture(sdlTexture, NULL, dst_buffer, pixel_w); + SDL_RenderClear(sdlRenderer); + SDL_RenderCopy(sdlRenderer, sdlTexture, NULL, &sdlRect); + SDL_RenderPresent(sdlRenderer); + } else if (ev.type == SDL_WINDOWEVENT) { + // If Resize + SDL_GetWindowSize(screen, &screen_w, &screen_h); + printf("Resize windows: %dx%d\n", screen_w, screen_h); + } + } + } + + return 0; +} + +int getMouseKeyEven(void *opaque) { + SDL_Event ev; + int quit = 0; + while (!quit) { + while (SDL_PollEvent(&ev)) { + if (SDL_KEYDOWN == ev.type) // SDL_KEYUP + { + 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) { + if (SDL_BUTTON_LEFT == ev.button.button) { + int px = ev.button.x; + int py = ev.button.y; + printf("SDL_MOUSEBUTTONDOWN x, y %d %d ...............\n", px, py); + + } else if (SDL_BUTTON_RIGHT == ev.button.button) { + int px = ev.button.x; + int py = ev.button.y; + printf("SDL_BUTTON_RIGHT x, y %d %d ...............\n", px, py); + } + } else if (SDL_MOUSEMOTION == ev.type) { + int px = ev.motion.x; + int py = ev.motion.y; + + printf("SDL_MOUSEMOTION x, y %d %d ...............\n", px, py); + } else if (SDL_QUIT == ev.type) { + printf("SDL_QUIT ...............\n"); + return 0; + } + } + } + + return 0; +} + void GuestReceiveBuffer(const char *data, size_t size, const char *user_id, size_t user_id_size) { - std::cout << "Receive size: " << size << std::endl; memcpy(dst_buffer, data, size); + + SDL_Event event; + event.type = REFRESH_EVENT; + SDL_PushEvent(&event); +} + +std::string GetMac() { + IP_ADAPTER_INFO adapterInfo[16]; + DWORD bufferSize = sizeof(adapterInfo); + char mac[10]; + int len = 0; + + DWORD result = GetAdaptersInfo(adapterInfo, &bufferSize); + if (result == ERROR_SUCCESS) { + PIP_ADAPTER_INFO adapter = adapterInfo; + while (adapter) { + for (UINT i = 0; i < adapter->AddressLength; i++) { + len += sprintf(mac + len, "%.2X", adapter->Address[i]); + } + break; + } + } + + return mac; } int main() { + std::cout << "Mac: " << GetMac() << std::endl; Params params; params.cfg_path = "config.ini"; params.on_receive_buffer = GuestReceiveBuffer; std::string transmission_id = "000000"; - std::string user_id = "Client"; + std::string user_id = GetMac(); PeerPtr *peer = CreatePeer(¶ms); JoinConnection(peer, transmission_id.c_str(), user_id.c_str()); @@ -61,10 +164,12 @@ int main() { return -1; } - SDL_Window *screen; screen = SDL_CreateWindow("RTS Receiver", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, screen_w, screen_h, SDL_WINDOW_RESIZABLE); + + SDL_SetWindowTitle(screen, window_title.data()); + if (!screen) { printf("SDL: could not create window - exiting:%s\n", SDL_GetError()); return -1; @@ -78,7 +183,11 @@ int main() { SDL_TEXTUREACCESS_STREAMING, pixel_w, pixel_h); SDL_Thread *refresh_thread = SDL_CreateThread(refresh_video, NULL, NULL); + + // SDL_Thread *mouse_thread = SDL_CreateThread(getMouseKeyEven, NULL, NULL); + SDL_Event event; + start_time = SDL_GetTicks(); while (1) { // Wait SDL_WaitEvent(&event); @@ -92,6 +201,18 @@ int main() { SDL_RenderClear(sdlRenderer); SDL_RenderCopy(sdlRenderer, sdlTexture, NULL, &sdlRect); SDL_RenderPresent(sdlRenderer); + + 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) + "]"; + SDL_SetWindowTitle(screen, window_title.data()); + start_time = end_time; + } + } else if (event.type == SDL_WINDOWEVENT) { // If Resize SDL_GetWindowSize(screen, &screen_w, &screen_h); diff --git a/remote_desk_server/remote_desk_server.cpp b/remote_desk_server/remote_desk_server.cpp index 3751d39..7ce9724 100644 --- a/remote_desk_server/remote_desk_server.cpp +++ b/remote_desk_server/remote_desk_server.cpp @@ -1,5 +1,10 @@ #include "remote_desk_server.h" +#ifdef _WIN32 +#include +#include +#endif + #include extern "C" { @@ -52,6 +57,26 @@ void RemoteDeskServer::HostReceiveBuffer(const char *data, size_t size, std::cout << "Receive: [" << user << "] " << msg << std::endl; } +std::string GetMac() { + IP_ADAPTER_INFO adapterInfo[16]; + DWORD bufferSize = sizeof(adapterInfo); + char mac[10]; + int len = 0; + + DWORD result = GetAdaptersInfo(adapterInfo, &bufferSize); + if (result == ERROR_SUCCESS) { + PIP_ADAPTER_INFO adapter = adapterInfo; + while (adapter) { + for (UINT i = 0; i < adapter->AddressLength; i++) { + len += sprintf(mac + len, "%.2X", adapter->Address[i]); + } + break; + } + } + + return mac; +} + int RemoteDeskServer::Init() { Params params; params.cfg_path = "../../../../config/config.ini"; @@ -64,7 +89,7 @@ int RemoteDeskServer::Init() { }; std::string transmission_id = "000000"; - std::string user_id = "Server"; + std::string user_id = "Server-" + GetMac(); peer = CreatePeer(¶ms); CreateConnection(peer, transmission_id.c_str(), user_id.c_str()); diff --git a/xmake.lua b/xmake.lua index a545da5..238d4d5 100644 --- a/xmake.lua +++ b/xmake.lua @@ -5,16 +5,15 @@ set_license("GPL-3.0") add_rules("mode.release", "mode.debug") set_languages("c++17") -add_rules("mode.release", "mode.debug") - -add_requires("spdlog 1.11.0", "ffmpeg 5.1.2", {system = false}) +add_requires("spdlog 1.11.0", {system = false}) add_defines("UNICODE") if is_os("windows") then add_ldflags("/SUBSYSTEM:CONSOLE") add_links("Shell32", "windowsapp", "dwmapi", "User32", "kernel32") add_requires("vcpkg::sdl2 2.26.4") -elseif is_os("linux") then +elseif is_os("linux") then + add_requires("ffmpeg 5.1.2", {system = false}) add_links("pthread") set_config("cxxflags", "-fPIC") end @@ -41,7 +40,17 @@ target("remote_desk_server") add_deps("projectx", "screen_capture") add_files("remote_desk_server/*.cpp") add_includedirs("../../src/interface") - -- add_links("avformat", "swscale") + add_links("swscale", "avutil") + add_defines("WIN32_LEAN_AND_MEAN") + if is_os("windows") then + add_links("iphlpapi") + add_includedirs("../../thirdparty/ffmpeg/include") + if is_mode("debug") then + add_linkdirs("../../thirdparty/ffmpeg/lib/debug/win") + else + add_linkdirs("../../thirdparty/ffmpeg/lib/release/win") + end + end target("remote_desk_client") set_kind("binary") @@ -51,8 +60,10 @@ target("remote_desk_client") add_packages("vcpkg::sdl2") add_files("remote_desk_client/*.cpp") add_includedirs("../../src/interface") - add_links("SDL2-static", "SDL2main", "Shell32", "gdi32", "winmm", - "setupapi", "version", "WindowsApp", "Imm32", "avutil") + if is_os("windows") then + add_links("SDL2-static", "SDL2main", "gdi32", "winmm", + "setupapi", "version", "Imm32", "iphlpapi") + end -- target("remote_desk") -- set_kind("binary")