diff --git a/flutter/windows/runner/main.cpp b/flutter/windows/runner/main.cpp index a32464559..4073213e5 100644 --- a/flutter/windows/runner/main.cpp +++ b/flutter/windows/runner/main.cpp @@ -1,17 +1,41 @@ #include #include #include +#include #include "flutter_window.h" #include "utils.h" #include +typedef bool (*FUNC_RUSTDESK_CORE_MAIN)(void); + auto bdw = bitsdojo_window_configure(BDW_CUSTOM_FRAME | BDW_HIDE_ON_STARTUP); int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, - _In_ wchar_t *command_line, _In_ int show_command) { + _In_ wchar_t *command_line, _In_ int show_command) +{ + HINSTANCE hInstance = LoadLibraryA("librustdesk.dll"); + if (!hInstance) + { + std::cout << "Failed to load librustdesk.dll" << std::endl; + return EXIT_FAILURE; + } + FUNC_RUSTDESK_CORE_MAIN rustdesk_core_main = + (FUNC_RUSTDESK_CORE_MAIN)GetProcAddress(hInstance, "rustdesk_core_main"); + if (!rustdesk_core_main) + { + std::cout << "Failed to get rustdesk_core_main" << std::endl; + return EXIT_FAILURE; + } + if (!rustdesk_core_main()) + { + std::cout << "Rustdesk core returns false, exiting without launching Flutter app" << std::endl; + return EXIT_SUCCESS; + } + // Attach to console when present (e.g., 'flutter run') or create a // new console when running with a debugger. - if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { + if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) + { CreateAndAttachConsole(); } @@ -29,13 +53,15 @@ int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, FlutterWindow window(project); Win32Window::Point origin(10, 10); Win32Window::Size size(1280, 720); - if (!window.CreateAndShow(L"flutter_hbb", origin, size)) { + if (!window.CreateAndShow(L"flutter_hbb", origin, size)) + { return EXIT_FAILURE; } window.SetQuitOnClose(true); ::MSG msg; - while (::GetMessage(&msg, nullptr, 0, 0)) { + while (::GetMessage(&msg, nullptr, 0, 0)) + { ::TranslateMessage(&msg); ::DispatchMessage(&msg); } diff --git a/src/core_main.rs b/src/core_main.rs new file mode 100644 index 000000000..c50bb0835 --- /dev/null +++ b/src/core_main.rs @@ -0,0 +1,13 @@ +/// Main entry of the RustDesk Core. +/// Return true if the app should continue running with UI(possibly Flutter), false if the app should exit. +pub fn core_main() -> bool { + let args = std::env::args().collect::>(); + // TODO: implement core_main() + if args.len() > 1 { + if args[1] == "--cm" { + // For test purpose only, this should stop any new window from popping up when a new connection is established. + return false; + } + } + true +} diff --git a/src/flutter_ffi.rs b/src/flutter_ffi.rs index d21ac7996..a1b9b1e7b 100644 --- a/src/flutter_ffi.rs +++ b/src/flutter_ffi.rs @@ -52,6 +52,13 @@ fn initialize(app_dir: &str) { } } +/// FFI for rustdesk core's main entry. +/// Return true if the app should continue running with UI(possibly Flutter), false if the app should exit. +#[no_mangle] +pub extern "C" fn rustdesk_core_main() -> bool { + crate::core_main::core_main() +} + pub fn start_event_stream(s: StreamSink) -> ResultType<()> { let _ = flutter::EVENT_STREAM.write().unwrap().insert(s); Ok(()) diff --git a/src/lib.rs b/src/lib.rs index 7452bdb42..1dda032e1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -28,6 +28,11 @@ pub mod flutter; #[cfg(any(target_os = "android", target_os = "ios", feature = "flutter"))] pub mod flutter_ffi; use common::*; +#[cfg(all( + not(any(target_os = "android", target_os = "ios")), + feature = "flutter" +))] +pub mod core_main; #[cfg(feature = "cli")] pub mod cli; #[cfg(all(windows, feature = "hbbs"))]