From 8281186a6d9dad20e8345d85a1732e2974636555 Mon Sep 17 00:00:00 2001 From: akallabeth Date: Tue, 7 May 2024 17:29:12 +0200 Subject: [PATCH] [client,sdl] create a copy for SDL3 * Copy SDL2 client to SDL3 as the new version is not API compatible * Move existing SDL2 client to SDL2 directory * Move fonts from SDL client to resources folder in top level directory --- client/CMakeLists.txt | 20 +- client/{SDL => SDL2}/CMakeLists.txt | 14 +- client/{SDL => SDL2}/aad/CMakeLists.txt | 8 +- client/{SDL => SDL2}/aad/dummy.cpp | 0 client/{SDL => SDL2}/aad/qt/webview_impl.cpp | 0 client/{SDL => SDL2}/aad/sdl_config.hpp.in | 0 client/{SDL => SDL2}/aad/sdl_webview.cpp | 0 client/{SDL => SDL2}/aad/sdl_webview.hpp | 0 client/{SDL => SDL2}/aad/webview_impl.hpp | 0 client/{SDL => SDL2}/aad/wrapper/README | 0 client/{SDL => SDL2}/aad/wrapper/webview.h | 248 +- .../aad/wrapper/webview_impl.cpp | 0 client/SDL2/dialogs/CMakeLists.txt | 75 + .../{SDL => SDL2}/dialogs/res/CMakeLists.txt | 12 +- .../dialogs/res/convert_res_to_c.cpp | 0 .../dialogs/res/sdl_resource_file.cpp | 0 .../dialogs/res/sdl_resource_file.hpp | 0 .../dialogs/res/sdl_resource_manager.cpp | 0 .../dialogs/res/sdl_resource_manager.hpp | 0 client/{SDL => SDL2}/dialogs/sdl_button.cpp | 0 client/{SDL => SDL2}/dialogs/sdl_button.hpp | 0 client/{SDL => SDL2}/dialogs/sdl_buttons.cpp | 0 client/{SDL => SDL2}/dialogs/sdl_buttons.hpp | 0 .../dialogs/sdl_connection_dialog.cpp | 0 .../dialogs/sdl_connection_dialog.hpp | 0 client/{SDL => SDL2}/dialogs/sdl_dialogs.cpp | 0 client/{SDL => SDL2}/dialogs/sdl_dialogs.hpp | 0 client/{SDL => SDL2}/dialogs/sdl_input.cpp | 0 client/{SDL => SDL2}/dialogs/sdl_input.hpp | 0 .../dialogs/sdl_input_widgets.cpp | 0 .../dialogs/sdl_input_widgets.hpp | 0 client/{SDL => SDL2}/dialogs/sdl_select.cpp | 0 client/{SDL => SDL2}/dialogs/sdl_select.hpp | 0 .../{SDL => SDL2}/dialogs/sdl_selectlist.cpp | 0 .../{SDL => SDL2}/dialogs/sdl_selectlist.hpp | 0 client/{SDL => SDL2}/dialogs/sdl_widget.cpp | 0 client/{SDL => SDL2}/dialogs/sdl_widget.hpp | 0 .../{SDL => SDL2}/dialogs/test/CMakeLists.txt | 0 .../dialogs/test/TestSDLDialogs.cpp | 0 client/{SDL => SDL2}/man/CMakeLists.txt | 0 .../man/sdl-freerdp-config.1.xml.in | 0 .../man/sdl-freerdp-envvar.1.xml.in | 0 .../man/sdl-freerdp-examples.1.xml.in | 0 client/{SDL => SDL2}/man/sdl-freerdp.1.xml.in | 0 client/{SDL => SDL2}/sdl_channels.cpp | 0 client/{SDL => SDL2}/sdl_channels.hpp | 0 client/{SDL => SDL2}/sdl_disp.cpp | 0 client/{SDL => SDL2}/sdl_disp.hpp | 0 client/{SDL => SDL2}/sdl_freerdp.cpp | 0 client/{SDL => SDL2}/sdl_freerdp.hpp | 0 client/{SDL => SDL2}/sdl_kbd.cpp | 0 client/{SDL => SDL2}/sdl_kbd.hpp | 0 client/{SDL => SDL2}/sdl_monitor.cpp | 0 client/{SDL => SDL2}/sdl_monitor.hpp | 0 client/{SDL => SDL2}/sdl_pointer.cpp | 0 client/{SDL => SDL2}/sdl_pointer.hpp | 0 client/{SDL => SDL2}/sdl_prefs.cpp | 0 client/{SDL => SDL2}/sdl_prefs.hpp | 0 client/{SDL => SDL2}/sdl_touch.cpp | 0 client/{SDL => SDL2}/sdl_touch.hpp | 0 client/{SDL => SDL2}/sdl_types.hpp | 0 client/{SDL => SDL2}/sdl_utils.cpp | 0 client/{SDL => SDL2}/sdl_utils.hpp | 0 client/{SDL => SDL2}/sdl_window.cpp | 0 client/{SDL => SDL2}/sdl_window.hpp | 0 client/{SDL => SDL2}/test/CMakeLists.txt | 4 +- client/{SDL => SDL2}/test/TestSDLPrefs.cpp | 0 client/{SDL => SDL2}/test/sdl-freerdp.json | 0 client/SDL3/CMakeLists.txt | 125 + client/SDL3/aad/CMakeLists.txt | 75 + client/SDL3/aad/dummy.cpp | 0 client/SDL3/aad/qt/webview_impl.cpp | 105 + client/SDL3/aad/sdl_config.hpp.in | 3 + client/SDL3/aad/sdl_webview.cpp | 129 + client/SDL3/aad/sdl_webview.hpp | 38 + client/SDL3/aad/webview_impl.hpp | 24 + client/SDL3/aad/wrapper/README | 1 + client/SDL3/aad/wrapper/webview.h | 2797 +++++++++++++++++ client/SDL3/aad/wrapper/webview_impl.cpp | 82 + client/{SDL => SDL3}/dialogs/CMakeLists.txt | 6 +- client/{SDL => SDL3}/dialogs/font/OFL.txt | 0 ...OpenSans-Italic-VariableFont_wdth,wght.ttf | Bin .../font/OpenSans-VariableFont_wdth,wght.ttf | Bin client/{SDL => SDL3}/dialogs/font/README.txt | 0 client/SDL3/dialogs/res/CMakeLists.txt | 89 + client/SDL3/dialogs/res/convert_res_to_c.cpp | 190 ++ client/SDL3/dialogs/res/sdl_resource_file.cpp | 25 + client/SDL3/dialogs/res/sdl_resource_file.hpp | 33 + .../SDL3/dialogs/res/sdl_resource_manager.cpp | 78 + .../SDL3/dialogs/res/sdl_resource_manager.hpp | 46 + client/SDL3/dialogs/sdl_button.cpp | 71 + client/SDL3/dialogs/sdl_button.hpp | 26 + client/SDL3/dialogs/sdl_buttons.cpp | 105 + client/SDL3/dialogs/sdl_buttons.hpp | 37 + client/SDL3/dialogs/sdl_connection_dialog.cpp | 541 ++++ client/SDL3/dialogs/sdl_connection_dialog.hpp | 129 + client/SDL3/dialogs/sdl_dialogs.cpp | 621 ++++ client/SDL3/dialogs/sdl_dialogs.hpp | 53 + client/SDL3/dialogs/sdl_input.cpp | 177 ++ client/SDL3/dialogs/sdl_input.hpp | 73 + client/SDL3/dialogs/sdl_input_widgets.cpp | 300 ++ client/SDL3/dialogs/sdl_input_widgets.hpp | 44 + client/SDL3/dialogs/sdl_select.cpp | 74 + client/SDL3/dialogs/sdl_select.hpp | 46 + client/SDL3/dialogs/sdl_selectlist.cpp | 208 ++ client/SDL3/dialogs/sdl_selectlist.hpp | 42 + client/SDL3/dialogs/sdl_widget.cpp | 280 ++ client/SDL3/dialogs/sdl_widget.hpp | 88 + client/SDL3/dialogs/test/CMakeLists.txt | 30 + client/SDL3/dialogs/test/TestSDLDialogs.cpp | 99 + client/SDL3/man/CMakeLists.txt | 8 + client/SDL3/man/sdl3-freerdp-config.1.xml.in | 81 + client/SDL3/man/sdl3-freerdp-envvar.1.xml.in | 15 + .../SDL3/man/sdl3-freerdp-examples.1.xml.in | 95 + client/SDL3/man/sdl3-freerdp.1.xml.in | 64 + client/SDL3/sdl_channels.cpp | 83 + client/SDL3/sdl_channels.hpp | 29 + client/SDL3/sdl_disp.cpp | 476 +++ client/SDL3/sdl_disp.hpp | 82 + client/SDL3/sdl_freerdp.cpp | 1706 ++++++++++ client/SDL3/sdl_freerdp.hpp | 88 + client/SDL3/sdl_kbd.cpp | 630 ++++ client/SDL3/sdl_kbd.hpp | 69 + client/SDL3/sdl_monitor.cpp | 340 ++ client/SDL3/sdl_monitor.hpp | 28 + client/SDL3/sdl_pointer.cpp | 197 ++ client/SDL3/sdl_pointer.hpp | 27 + client/SDL3/sdl_prefs.cpp | 139 + client/SDL3/sdl_prefs.hpp | 54 + client/SDL3/sdl_touch.cpp | 285 ++ client/SDL3/sdl_touch.hpp | 36 + client/SDL3/sdl_types.hpp | 46 + client/SDL3/sdl_utils.cpp | 341 ++ client/SDL3/sdl_utils.hpp | 102 + client/SDL3/sdl_window.cpp | 203 ++ client/SDL3/sdl_window.hpp | 62 + client/SDL3/test/CMakeLists.txt | 36 + client/SDL3/test/TestSDLPrefs.cpp | 121 + client/SDL3/test/sdl-freerdp.json | 10 + resources/font/OFL.txt | 93 + ...OpenSans-Italic-VariableFont_wdth,wght.ttf | Bin 0 -> 580356 bytes .../font/OpenSans-VariableFont_wdth,wght.ttf | Bin 0 -> 529700 bytes resources/font/README.txt | 100 + 143 files changed, 12776 insertions(+), 141 deletions(-) rename client/{SDL => SDL2}/CMakeLists.txt (94%) rename client/{SDL => SDL2}/aad/CMakeLists.txt (89%) rename client/{SDL => SDL2}/aad/dummy.cpp (100%) rename client/{SDL => SDL2}/aad/qt/webview_impl.cpp (100%) rename client/{SDL => SDL2}/aad/sdl_config.hpp.in (100%) rename client/{SDL => SDL2}/aad/sdl_webview.cpp (100%) rename client/{SDL => SDL2}/aad/sdl_webview.hpp (100%) rename client/{SDL => SDL2}/aad/webview_impl.hpp (100%) rename client/{SDL => SDL2}/aad/wrapper/README (100%) rename client/{SDL => SDL2}/aad/wrapper/webview.h (93%) rename client/{SDL => SDL2}/aad/wrapper/webview_impl.cpp (100%) create mode 100644 client/SDL2/dialogs/CMakeLists.txt rename client/{SDL => SDL2}/dialogs/res/CMakeLists.txt (85%) rename client/{SDL => SDL2}/dialogs/res/convert_res_to_c.cpp (100%) rename client/{SDL => SDL2}/dialogs/res/sdl_resource_file.cpp (100%) rename client/{SDL => SDL2}/dialogs/res/sdl_resource_file.hpp (100%) rename client/{SDL => SDL2}/dialogs/res/sdl_resource_manager.cpp (100%) rename client/{SDL => SDL2}/dialogs/res/sdl_resource_manager.hpp (100%) rename client/{SDL => SDL2}/dialogs/sdl_button.cpp (100%) rename client/{SDL => SDL2}/dialogs/sdl_button.hpp (100%) rename client/{SDL => SDL2}/dialogs/sdl_buttons.cpp (100%) rename client/{SDL => SDL2}/dialogs/sdl_buttons.hpp (100%) rename client/{SDL => SDL2}/dialogs/sdl_connection_dialog.cpp (100%) rename client/{SDL => SDL2}/dialogs/sdl_connection_dialog.hpp (100%) rename client/{SDL => SDL2}/dialogs/sdl_dialogs.cpp (100%) rename client/{SDL => SDL2}/dialogs/sdl_dialogs.hpp (100%) rename client/{SDL => SDL2}/dialogs/sdl_input.cpp (100%) rename client/{SDL => SDL2}/dialogs/sdl_input.hpp (100%) rename client/{SDL => SDL2}/dialogs/sdl_input_widgets.cpp (100%) rename client/{SDL => SDL2}/dialogs/sdl_input_widgets.hpp (100%) rename client/{SDL => SDL2}/dialogs/sdl_select.cpp (100%) rename client/{SDL => SDL2}/dialogs/sdl_select.hpp (100%) rename client/{SDL => SDL2}/dialogs/sdl_selectlist.cpp (100%) rename client/{SDL => SDL2}/dialogs/sdl_selectlist.hpp (100%) rename client/{SDL => SDL2}/dialogs/sdl_widget.cpp (100%) rename client/{SDL => SDL2}/dialogs/sdl_widget.hpp (100%) rename client/{SDL => SDL2}/dialogs/test/CMakeLists.txt (100%) rename client/{SDL => SDL2}/dialogs/test/TestSDLDialogs.cpp (100%) rename client/{SDL => SDL2}/man/CMakeLists.txt (100%) rename client/{SDL => SDL2}/man/sdl-freerdp-config.1.xml.in (100%) rename client/{SDL => SDL2}/man/sdl-freerdp-envvar.1.xml.in (100%) rename client/{SDL => SDL2}/man/sdl-freerdp-examples.1.xml.in (100%) rename client/{SDL => SDL2}/man/sdl-freerdp.1.xml.in (100%) rename client/{SDL => SDL2}/sdl_channels.cpp (100%) rename client/{SDL => SDL2}/sdl_channels.hpp (100%) rename client/{SDL => SDL2}/sdl_disp.cpp (100%) rename client/{SDL => SDL2}/sdl_disp.hpp (100%) rename client/{SDL => SDL2}/sdl_freerdp.cpp (100%) rename client/{SDL => SDL2}/sdl_freerdp.hpp (100%) rename client/{SDL => SDL2}/sdl_kbd.cpp (100%) rename client/{SDL => SDL2}/sdl_kbd.hpp (100%) rename client/{SDL => SDL2}/sdl_monitor.cpp (100%) rename client/{SDL => SDL2}/sdl_monitor.hpp (100%) rename client/{SDL => SDL2}/sdl_pointer.cpp (100%) rename client/{SDL => SDL2}/sdl_pointer.hpp (100%) rename client/{SDL => SDL2}/sdl_prefs.cpp (100%) rename client/{SDL => SDL2}/sdl_prefs.hpp (100%) rename client/{SDL => SDL2}/sdl_touch.cpp (100%) rename client/{SDL => SDL2}/sdl_touch.hpp (100%) rename client/{SDL => SDL2}/sdl_types.hpp (100%) rename client/{SDL => SDL2}/sdl_utils.cpp (100%) rename client/{SDL => SDL2}/sdl_utils.hpp (100%) rename client/{SDL => SDL2}/sdl_window.cpp (100%) rename client/{SDL => SDL2}/sdl_window.hpp (100%) rename client/{SDL => SDL2}/test/CMakeLists.txt (93%) rename client/{SDL => SDL2}/test/TestSDLPrefs.cpp (100%) rename client/{SDL => SDL2}/test/sdl-freerdp.json (100%) create mode 100644 client/SDL3/CMakeLists.txt create mode 100644 client/SDL3/aad/CMakeLists.txt create mode 100644 client/SDL3/aad/dummy.cpp create mode 100644 client/SDL3/aad/qt/webview_impl.cpp create mode 100644 client/SDL3/aad/sdl_config.hpp.in create mode 100644 client/SDL3/aad/sdl_webview.cpp create mode 100644 client/SDL3/aad/sdl_webview.hpp create mode 100644 client/SDL3/aad/webview_impl.hpp create mode 100644 client/SDL3/aad/wrapper/README create mode 100644 client/SDL3/aad/wrapper/webview.h create mode 100644 client/SDL3/aad/wrapper/webview_impl.cpp rename client/{SDL => SDL3}/dialogs/CMakeLists.txt (93%) rename client/{SDL => SDL3}/dialogs/font/OFL.txt (100%) rename client/{SDL => SDL3}/dialogs/font/OpenSans-Italic-VariableFont_wdth,wght.ttf (100%) rename client/{SDL => SDL3}/dialogs/font/OpenSans-VariableFont_wdth,wght.ttf (100%) rename client/{SDL => SDL3}/dialogs/font/README.txt (100%) create mode 100644 client/SDL3/dialogs/res/CMakeLists.txt create mode 100644 client/SDL3/dialogs/res/convert_res_to_c.cpp create mode 100644 client/SDL3/dialogs/res/sdl_resource_file.cpp create mode 100644 client/SDL3/dialogs/res/sdl_resource_file.hpp create mode 100644 client/SDL3/dialogs/res/sdl_resource_manager.cpp create mode 100644 client/SDL3/dialogs/res/sdl_resource_manager.hpp create mode 100644 client/SDL3/dialogs/sdl_button.cpp create mode 100644 client/SDL3/dialogs/sdl_button.hpp create mode 100644 client/SDL3/dialogs/sdl_buttons.cpp create mode 100644 client/SDL3/dialogs/sdl_buttons.hpp create mode 100644 client/SDL3/dialogs/sdl_connection_dialog.cpp create mode 100644 client/SDL3/dialogs/sdl_connection_dialog.hpp create mode 100644 client/SDL3/dialogs/sdl_dialogs.cpp create mode 100644 client/SDL3/dialogs/sdl_dialogs.hpp create mode 100644 client/SDL3/dialogs/sdl_input.cpp create mode 100644 client/SDL3/dialogs/sdl_input.hpp create mode 100644 client/SDL3/dialogs/sdl_input_widgets.cpp create mode 100644 client/SDL3/dialogs/sdl_input_widgets.hpp create mode 100644 client/SDL3/dialogs/sdl_select.cpp create mode 100644 client/SDL3/dialogs/sdl_select.hpp create mode 100644 client/SDL3/dialogs/sdl_selectlist.cpp create mode 100644 client/SDL3/dialogs/sdl_selectlist.hpp create mode 100644 client/SDL3/dialogs/sdl_widget.cpp create mode 100644 client/SDL3/dialogs/sdl_widget.hpp create mode 100644 client/SDL3/dialogs/test/CMakeLists.txt create mode 100644 client/SDL3/dialogs/test/TestSDLDialogs.cpp create mode 100644 client/SDL3/man/CMakeLists.txt create mode 100644 client/SDL3/man/sdl3-freerdp-config.1.xml.in create mode 100644 client/SDL3/man/sdl3-freerdp-envvar.1.xml.in create mode 100644 client/SDL3/man/sdl3-freerdp-examples.1.xml.in create mode 100644 client/SDL3/man/sdl3-freerdp.1.xml.in create mode 100644 client/SDL3/sdl_channels.cpp create mode 100644 client/SDL3/sdl_channels.hpp create mode 100644 client/SDL3/sdl_disp.cpp create mode 100644 client/SDL3/sdl_disp.hpp create mode 100644 client/SDL3/sdl_freerdp.cpp create mode 100644 client/SDL3/sdl_freerdp.hpp create mode 100644 client/SDL3/sdl_kbd.cpp create mode 100644 client/SDL3/sdl_kbd.hpp create mode 100644 client/SDL3/sdl_monitor.cpp create mode 100644 client/SDL3/sdl_monitor.hpp create mode 100644 client/SDL3/sdl_pointer.cpp create mode 100644 client/SDL3/sdl_pointer.hpp create mode 100644 client/SDL3/sdl_prefs.cpp create mode 100644 client/SDL3/sdl_prefs.hpp create mode 100644 client/SDL3/sdl_touch.cpp create mode 100644 client/SDL3/sdl_touch.hpp create mode 100644 client/SDL3/sdl_types.hpp create mode 100644 client/SDL3/sdl_utils.cpp create mode 100644 client/SDL3/sdl_utils.hpp create mode 100644 client/SDL3/sdl_window.cpp create mode 100644 client/SDL3/sdl_window.hpp create mode 100644 client/SDL3/test/CMakeLists.txt create mode 100644 client/SDL3/test/TestSDLPrefs.cpp create mode 100644 client/SDL3/test/sdl-freerdp.json create mode 100644 resources/font/OFL.txt create mode 100644 resources/font/OpenSans-Italic-VariableFont_wdth,wght.ttf create mode 100644 resources/font/OpenSans-VariableFont_wdth,wght.ttf create mode 100644 resources/font/README.txt diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 1a8f34712..6891cee58 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -17,6 +17,8 @@ # Clients +include(CMakeDependentOption) + if(WITH_CLIENT_COMMON) add_subdirectory(common) endif() @@ -30,12 +32,24 @@ if(FREERDP_VENDOR AND WITH_CLIENT) endif() endif() - if(WITH_CLIENT_SDL) + cmake_dependent_option(WITH_CLIENT_SDL2 "[experimental] build experimental SDL2 client" ON WITH_CLIENT_SDL OFF) + cmake_dependent_option(WITH_CLIENT_SDL3 "[experimental] build experimental SDL3 client" OFF WITH_CLIENT_SDL OFF) + + if (WITH_CLIENT_SDL2) find_package(SDL2) if (SDL2_FOUND) - add_subdirectory(SDL) + add_subdirectory(SDL2) else() - message(WARNING "SDL2 requested but not found, continuing build without SDL client") + message(WARNING "SDL2 requested but not found, continuing build without SDL2 client") + endif() + endif() + + if (WITH_CLIENT_SDL3) + find_package(SDL3) + if (SDL3_FOUND) + add_subdirectory(SDL3) + else() + message(WARNING "SDL3 requested but not found, continuing build without SDL3 client") endif() endif() diff --git a/client/SDL/CMakeLists.txt b/client/SDL2/CMakeLists.txt similarity index 94% rename from client/SDL/CMakeLists.txt rename to client/SDL2/CMakeLists.txt index c17ccd73e..490844702 100644 --- a/client/SDL/CMakeLists.txt +++ b/client/SDL2/CMakeLists.txt @@ -88,21 +88,21 @@ set(SRCS sdl_window.cpp ) -add_library(sdl_prefs STATIC +add_library(sdl2-prefs STATIC sdl_prefs.hpp sdl_prefs.cpp ) add_subdirectory(aad) -set(LIBS +list(APPEND LIBS winpr freerdp freerdp-client Threads::Threads - sdl_client_res - dialogs - aad-view - sdl_prefs + sdl2_client_res + sdl2-dialogs + sdl2-aad-view + sdl2-prefs ) if (NOT WITH_SDL_LINK_SHARED) @@ -114,7 +114,7 @@ endif() AddTargetWithResourceFile(${PROJECT_NAME} "${WIN32_GUI_FLAG}" "${PROJECT_VERSION}" SRCS) target_link_libraries(${PROJECT_NAME} PRIVATE ${LIBS}) -target_link_libraries(sdl_prefs winpr) +target_link_libraries(sdl2-prefs winpr) set_property(TARGET ${PROJECT_NAME} PROPERTY FOLDER "Client/SDL") install(TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT client) diff --git a/client/SDL/aad/CMakeLists.txt b/client/SDL2/aad/CMakeLists.txt similarity index 89% rename from client/SDL/aad/CMakeLists.txt rename to client/SDL2/aad/CMakeLists.txt index 228654262..1dcc978a1 100644 --- a/client/SDL/aad/CMakeLists.txt +++ b/client/SDL2/aad/CMakeLists.txt @@ -59,16 +59,16 @@ endif() configure_file(sdl_config.hpp.in sdl_config.hpp @ONLY) -add_library(aad-view STATIC +add_library(sdl2-aad-view STATIC ${SRCS} ) -target_include_directories(aad-view PUBLIC ${CMAKE_CURRENT_BINARY_DIR}) -target_link_libraries(aad-view +target_include_directories(sdl2-aad-view PUBLIC ${CMAKE_CURRENT_BINARY_DIR}) +target_link_libraries(sdl2-aad-view PRIVATE ${LIBS} ) target_compile_definitions( - aad-view + sdl2-aad-view PUBLIC ${DEFINITIONS} ) diff --git a/client/SDL/aad/dummy.cpp b/client/SDL2/aad/dummy.cpp similarity index 100% rename from client/SDL/aad/dummy.cpp rename to client/SDL2/aad/dummy.cpp diff --git a/client/SDL/aad/qt/webview_impl.cpp b/client/SDL2/aad/qt/webview_impl.cpp similarity index 100% rename from client/SDL/aad/qt/webview_impl.cpp rename to client/SDL2/aad/qt/webview_impl.cpp diff --git a/client/SDL/aad/sdl_config.hpp.in b/client/SDL2/aad/sdl_config.hpp.in similarity index 100% rename from client/SDL/aad/sdl_config.hpp.in rename to client/SDL2/aad/sdl_config.hpp.in diff --git a/client/SDL/aad/sdl_webview.cpp b/client/SDL2/aad/sdl_webview.cpp similarity index 100% rename from client/SDL/aad/sdl_webview.cpp rename to client/SDL2/aad/sdl_webview.cpp diff --git a/client/SDL/aad/sdl_webview.hpp b/client/SDL2/aad/sdl_webview.hpp similarity index 100% rename from client/SDL/aad/sdl_webview.hpp rename to client/SDL2/aad/sdl_webview.hpp diff --git a/client/SDL/aad/webview_impl.hpp b/client/SDL2/aad/webview_impl.hpp similarity index 100% rename from client/SDL/aad/webview_impl.hpp rename to client/SDL2/aad/webview_impl.hpp diff --git a/client/SDL/aad/wrapper/README b/client/SDL2/aad/wrapper/README similarity index 100% rename from client/SDL/aad/wrapper/README rename to client/SDL2/aad/wrapper/README diff --git a/client/SDL/aad/wrapper/webview.h b/client/SDL2/aad/wrapper/webview.h similarity index 93% rename from client/SDL/aad/wrapper/webview.h rename to client/SDL2/aad/wrapper/webview.h index 4919265b6..91cabf61e 100644 --- a/client/SDL/aad/wrapper/webview.h +++ b/client/SDL2/aad/wrapper/webview.h @@ -601,9 +601,8 @@ namespace webview m_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); } g_signal_connect(G_OBJECT(m_window), "destroy", - G_CALLBACK(+[](GtkWidget*, gpointer arg) { - static_cast(arg)->terminate(); - }), + G_CALLBACK(+[](GtkWidget*, gpointer arg) + { static_cast(arg)->terminate(); }), this); // Initialize webview widget m_webview = webkit_web_view_new(); @@ -611,12 +610,13 @@ namespace webview webkit_web_view_get_user_content_manager(WEBKIT_WEB_VIEW(m_webview)); g_signal_connect(manager, "script-message-received::external", G_CALLBACK(+[](WebKitUserContentManager*, - WebKitJavascriptResult* r, gpointer arg) { - auto* w = static_cast(arg); - char* s = get_string_from_js_result(r); - w->on_message(s); - g_free(s); - }), + WebKitJavascriptResult* r, gpointer arg) + { + auto* w = static_cast(arg); + char* s = get_string_from_js_result(r); + w->on_message(s); + g_free(s); + }), this); webkit_user_content_manager_register_script_message_handler(manager, "external"); init("window.external={invoke:function(s){window.webkit.messageHandlers." @@ -1039,11 +1039,13 @@ namespace webview if (!m_parent_window) { class_addMethod(cls, "applicationDidFinishLaunching:"_sel, - (IMP)(+[](id self, SEL, id notification) { - auto app = objc::msg_send(notification, "object"_sel); - auto w = get_associated_webview(self); - w->on_application_did_finish_launching(self, app); - }), + (IMP)(+[](id self, SEL, id notification) + { + auto app = + objc::msg_send(notification, "object"_sel); + auto w = get_associated_webview(self); + w->on_application_did_finish_launching(self, app); + }), "v@:@"); } objc_registerClassPair(cls); @@ -1054,13 +1056,15 @@ namespace webview auto cls = objc_allocateClassPair((Class) "NSResponder"_cls, "WebkitScriptMessageHandler", 0); class_addProtocol(cls, objc_getProtocol("WKScriptMessageHandler")); - class_addMethod(cls, "userContentController:didReceiveScriptMessage:"_sel, - (IMP)(+[](id self, SEL, id, id msg) { - auto w = get_associated_webview(self); - w->on_message(objc::msg_send( - objc::msg_send(msg, "body"_sel), "UTF8String"_sel)); - }), - "v@:@@"); + class_addMethod( + cls, "userContentController:didReceiveScriptMessage:"_sel, + (IMP)(+[](id self, SEL, id, id msg) + { + auto w = get_associated_webview(self); + w->on_message(objc::msg_send( + objc::msg_send(msg, "body"_sel), "UTF8String"_sel)); + }), + "v@:@@"); objc_registerClassPair(cls); auto instance = objc::msg_send((id)cls, "new"_sel); objc_setAssociatedObject(instance, "webview", (id)this, OBJC_ASSOCIATION_ASSIGN); @@ -1073,38 +1077,41 @@ namespace webview class_addMethod( cls, "webView:runOpenPanelWithParameters:initiatedByFrame:completionHandler:"_sel, - (IMP)(+[](id, SEL, id, id parameters, id, id completion_handler) { - auto allows_multiple_selection = - objc::msg_send(parameters, "allowsMultipleSelection"_sel); - auto allows_directories = - objc::msg_send(parameters, "allowsDirectories"_sel); + (IMP)(+[](id, SEL, id, id parameters, id, id completion_handler) + { + auto allows_multiple_selection = + objc::msg_send(parameters, "allowsMultipleSelection"_sel); + auto allows_directories = + objc::msg_send(parameters, "allowsDirectories"_sel); - // Show a panel for selecting files. - auto panel = objc::msg_send("NSOpenPanel"_cls, "openPanel"_sel); - objc::msg_send(panel, "setCanChooseFiles:"_sel, YES); - objc::msg_send(panel, "setCanChooseDirectories:"_sel, - allows_directories); - objc::msg_send(panel, "setAllowsMultipleSelection:"_sel, - allows_multiple_selection); - auto modal_response = - objc::msg_send(panel, "runModal"_sel); + // Show a panel for selecting files. + auto panel = objc::msg_send("NSOpenPanel"_cls, "openPanel"_sel); + objc::msg_send(panel, "setCanChooseFiles:"_sel, YES); + objc::msg_send(panel, "setCanChooseDirectories:"_sel, + allows_directories); + objc::msg_send(panel, "setAllowsMultipleSelection:"_sel, + allows_multiple_selection); + auto modal_response = + objc::msg_send(panel, "runModal"_sel); - // Get the URLs for the selected files. If the modal was canceled - // then we pass null to the completion handler to signify - // cancellation. - id urls = modal_response == NSModalResponseOK - ? objc::msg_send(panel, "URLs"_sel) - : nullptr; + // Get the URLs for the selected files. If the modal was canceled + // then we pass null to the completion handler to signify + // cancellation. + id urls = modal_response == NSModalResponseOK + ? objc::msg_send(panel, "URLs"_sel) + : nullptr; - // Invoke the completion handler block. - auto sig = objc::msg_send("NSMethodSignature"_cls, - "signatureWithObjCTypes:"_sel, "v@?@"); - auto invocation = objc::msg_send( - "NSInvocation"_cls, "invocationWithMethodSignature:"_sel, sig); - objc::msg_send(invocation, "setTarget:"_sel, completion_handler); - objc::msg_send(invocation, "setArgument:atIndex:"_sel, &urls, 1); - objc::msg_send(invocation, "invoke"_sel); - }), + // Invoke the completion handler block. + auto sig = objc::msg_send("NSMethodSignature"_cls, + "signatureWithObjCTypes:"_sel, "v@?@"); + auto invocation = objc::msg_send( + "NSInvocation"_cls, "invocationWithMethodSignature:"_sel, sig); + objc::msg_send(invocation, "setTarget:"_sel, + completion_handler); + objc::msg_send(invocation, "setArgument:atIndex:"_sel, &urls, + 1); + objc::msg_send(invocation, "invoke"_sel); + }), "v@:@@@@"); objc_registerClassPair(cls); return objc::msg_send((id)cls, "new"_sel); @@ -1115,13 +1122,14 @@ namespace webview objc_allocateClassPair((Class) "NSObject"_cls, "WebkitNavigationDelegate", 0); class_addProtocol(cls, objc_getProtocol("WKNavigationDelegate")); class_addMethod(cls, "webView:didFinishNavigation:"_sel, - (IMP)(+[](id delegate, SEL sel, id webview, id navigation) { - auto w = get_associated_webview(delegate); - auto url = objc::msg_send(webview, "URL"_sel); - auto nstr = objc::msg_send(url, "absoluteString"_sel); - auto str = objc::msg_send(nstr, "UTF8String"_sel); - w->m_navigateCallback(str, w->m_navigateCallbackArg); - }), + (IMP)(+[](id delegate, SEL sel, id webview, id navigation) + { + auto w = get_associated_webview(delegate); + auto url = objc::msg_send(webview, "URL"_sel); + auto nstr = objc::msg_send(url, "absoluteString"_sel); + auto str = objc::msg_send(nstr, "UTF8String"_sel); + w->m_navigateCallback(str, w->m_navigateCallbackArg); + }), "v@:@"); objc_registerClassPair(cls); auto instance = objc::msg_send((id)cls, "new"_sel); @@ -1360,7 +1368,8 @@ namespace webview template std::array parse_version(const std::basic_string& version) noexcept { - auto parse_component = [](auto sb, auto se) -> unsigned int { + auto parse_component = [](auto sb, auto se) -> unsigned int + { try { auto n = std::stol(std::basic_string(sb, se)); @@ -2256,42 +2265,44 @@ namespace webview wc.lpszClassName = L"webview"; wc.hIcon = icon; wc.lpfnWndProc = - (WNDPROC)(+[](HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) -> LRESULT { - auto w = (win32_edge_engine*)GetWindowLongPtr(hwnd, GWLP_USERDATA); - switch (msg) - { - case WM_SIZE: - w->resize(hwnd); - break; - case WM_CLOSE: - DestroyWindow(hwnd); - break; - case WM_DESTROY: - w->terminate(); - break; - case WM_GETMINMAXINFO: - { - auto lpmmi = (LPMINMAXINFO)lp; - if (w == nullptr) - { - return 0; - } - if (w->m_maxsz.x > 0 && w->m_maxsz.y > 0) - { - lpmmi->ptMaxSize = w->m_maxsz; - lpmmi->ptMaxTrackSize = w->m_maxsz; - } - if (w->m_minsz.x > 0 && w->m_minsz.y > 0) - { - lpmmi->ptMinTrackSize = w->m_minsz; - } - } - break; - default: - return DefWindowProcW(hwnd, msg, wp, lp); - } - return 0; - }); + (WNDPROC)(+[](HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) -> LRESULT + { + auto w = + (win32_edge_engine*)GetWindowLongPtr(hwnd, GWLP_USERDATA); + switch (msg) + { + case WM_SIZE: + w->resize(hwnd); + break; + case WM_CLOSE: + DestroyWindow(hwnd); + break; + case WM_DESTROY: + w->terminate(); + break; + case WM_GETMINMAXINFO: + { + auto lpmmi = (LPMINMAXINFO)lp; + if (w == nullptr) + { + return 0; + } + if (w->m_maxsz.x > 0 && w->m_maxsz.y > 0) + { + lpmmi->ptMaxSize = w->m_maxsz; + lpmmi->ptMaxTrackSize = w->m_maxsz; + } + if (w->m_minsz.x > 0 && w->m_minsz.y > 0) + { + lpmmi->ptMinTrackSize = w->m_minsz; + } + } + break; + default: + return DefWindowProcW(hwnd, msg, wp, lp); + } + return 0; + }); RegisterClassExW(&wc); m_window = CreateWindowW(L"webview", L"", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, nullptr, nullptr, hInstance, @@ -2469,7 +2480,9 @@ namespace webview PathCombineW(userDataFolder, dataPath, currentExeName); m_com_handler = new webview2_com_handler( - wnd, cb, [&](ICoreWebView2Controller* controller, ICoreWebView2* webview) { + wnd, cb, + [&](ICoreWebView2Controller* controller, ICoreWebView2* webview) + { if (!controller || !webview) { flag.clear(); @@ -2482,10 +2495,12 @@ namespace webview flag.clear(); }); - m_com_handler->set_attempt_handler([&] { - return m_webview2_loader.create_environment_with_options( - nullptr, userDataFolder, nullptr, m_com_handler); - }); + m_com_handler->set_attempt_handler( + [&] + { + return m_webview2_loader.create_environment_with_options( + nullptr, userDataFolder, nullptr, m_com_handler); + }); m_com_handler->try_create_environment(); MSG msg = {}; @@ -2602,8 +2617,8 @@ namespace webview // Synchronous bind void bind(const std::string& name, sync_binding_t fn) { - auto wrapper = [this, fn](const std::string& seq, const std::string& req, - void* /*arg*/) { resolve(seq, 0, fn(req)); }; + auto wrapper = [this, fn](const std::string& seq, const std::string& req, void* /*arg*/) + { resolve(seq, 0, fn(req)); }; bind(name, wrapper, nullptr); } @@ -2651,18 +2666,20 @@ namespace webview void resolve(const std::string& seq, int status, const std::string& result) { - dispatch([seq, status, result, this]() { - if (status == 0) - { - eval("window._rpc[" + seq + "].resolve(" + result + "); delete window._rpc[" + - seq + "]"); - } - else - { - eval("window._rpc[" + seq + "].reject(" + result + "); delete window._rpc[" + - seq + "]"); - } - }); + dispatch( + [seq, status, result, this]() + { + if (status == 0) + { + eval("window._rpc[" + seq + "].resolve(" + result + + "); delete window._rpc[" + seq + "]"); + } + else + { + eval("window._rpc[" + seq + "].reject(" + result + + "); delete window._rpc[" + seq + "]"); + } + }); } private: @@ -2755,9 +2772,8 @@ WEBVIEW_API void webview_bind(webview_t w, const char* name, { static_cast(w)->bind( name, - [=](const std::string& seq, const std::string& req, void* arg) { - fn(seq.c_str(), req.c_str(), arg); - }, + [=](const std::string& seq, const std::string& req, void* arg) + { fn(seq.c_str(), req.c_str(), arg); }, arg); } diff --git a/client/SDL/aad/wrapper/webview_impl.cpp b/client/SDL2/aad/wrapper/webview_impl.cpp similarity index 100% rename from client/SDL/aad/wrapper/webview_impl.cpp rename to client/SDL2/aad/wrapper/webview_impl.cpp diff --git a/client/SDL2/dialogs/CMakeLists.txt b/client/SDL2/dialogs/CMakeLists.txt new file mode 100644 index 000000000..da04f3472 --- /dev/null +++ b/client/SDL2/dialogs/CMakeLists.txt @@ -0,0 +1,75 @@ +set(SRCS + sdl_button.hpp + sdl_button.cpp + sdl_buttons.hpp + sdl_buttons.cpp + sdl_dialogs.cpp + sdl_dialogs.hpp + sdl_widget.hpp + sdl_widget.cpp + sdl_input.hpp + sdl_input.cpp + sdl_input_widgets.cpp + sdl_input_widgets.hpp + sdl_select.hpp + sdl_select.cpp + sdl_selectlist.hpp + sdl_selectlist.cpp + sdl_connection_dialog.cpp + sdl_connection_dialog.hpp +) + +list(APPEND LIBS + sdl2_client_res + winpr +) + +if (NOT WITH_SDL_LINK_SHARED) + list(APPEND LIBS ${SDL2_STATIC_LIBRARIES}) +else() + list(APPEND LIBS ${SDL2_LIBRARIES}) +endif() + +macro(find_sdl_component name) + find_package(${name}) + if (NOT ${name}_FOUND) + find_package(PkgConfig REQUIRED) + pkg_check_modules(${name} REQUIRED ${name}) + + if (BUILD_SHARED_LIBS) + list(APPEND LIBS ${${name}_LIBRARIES}) + link_directories(${${name}_LIBRARY_DIRS}) + include_directories(${${name}_INCLUDE_DIRS}) + else() + list(APPEND LIBS ${${name}_STATIC_LIBRARIES}) + link_directories(${${name}_STATIC_LIBRARY_DIRS}) + include_directories(${${name}_STATIC_INCLUDE_DIRS}) + endif() + else() + if (WITH_SDL_LINK_SHARED) + list(APPEND LIBS ${name}::${name}) + else() + list(APPEND LIBS ${name}::${name}-static) + endif() + endif() +endmacro() + +find_sdl_component(SDL2_ttf) + +option(WITH_SDL_IMAGE_DIALOGS "Build with SDL_image support (recommended)" OFF) +if (WITH_SDL_IMAGE_DIALOGS) + find_sdl_component(SDL2_image) + add_definitions(-DWITH_SDL_IMAGE_DIALOGS) +endif() + +add_subdirectory(res) + +add_library(sdl2-dialogs STATIC + ${SRCS} +) + +target_link_libraries(sdl2-dialogs PRIVATE ${LIBS}) + +if(BUILD_TESTING) +# add_subdirectory(test) +endif() diff --git a/client/SDL/dialogs/res/CMakeLists.txt b/client/SDL2/dialogs/res/CMakeLists.txt similarity index 85% rename from client/SDL/dialogs/res/CMakeLists.txt rename to client/SDL2/dialogs/res/CMakeLists.txt index 5591e4af6..33ca0e1cd 100644 --- a/client/SDL/dialogs/res/CMakeLists.txt +++ b/client/SDL2/dialogs/res/CMakeLists.txt @@ -1,5 +1,5 @@ -add_executable(freerdp-res2bin +add_executable(sdl2-res2bin convert_res_to_c.cpp ) @@ -16,7 +16,7 @@ set(RES_SVG_FILES ) set(RES_FONT_FILES - ${CMAKE_SOURCE_DIR}/client/SDL/dialogs/font/OpenSans-VariableFont_wdth,wght.ttf + ${CMAKE_SOURCE_DIR}/resources/font/OpenSans-VariableFont_wdth,wght.ttf ) macro(convert_to_bin FILE FILE_TYPE) @@ -33,9 +33,9 @@ macro(convert_to_bin FILE FILE_TYPE) add_custom_command( OUTPUT ${FILE_BYPRODUCTS} COMMAND ${CMAKE_COMMAND} -E make_directory ${FILE_BIN_DIR} - COMMAND $ ${FILE} ${FILE_TYPE} ${TARGET_NAME} ${FILE_BIN_DIR} + COMMAND $ ${FILE} ${FILE_TYPE} ${TARGET_NAME} ${FILE_BIN_DIR} COMMENT "create image resources" - DEPENDS freerdp-res2bin + DEPENDS sdl2-res2bin DEPENDS ${FILE} ) endmacro() @@ -81,9 +81,9 @@ else() ) endif() -add_library(sdl_client_res OBJECT +add_library(sdl2_client_res OBJECT ${RES_FILES} ${SRCS} ${FACTORY_SRCS} ) -set_property(TARGET sdl_client_res PROPERTY POSITION_INDEPENDENT_CODE ON) +set_property(TARGET sdl2_client_res PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/SDL/dialogs/res/convert_res_to_c.cpp b/client/SDL2/dialogs/res/convert_res_to_c.cpp similarity index 100% rename from client/SDL/dialogs/res/convert_res_to_c.cpp rename to client/SDL2/dialogs/res/convert_res_to_c.cpp diff --git a/client/SDL/dialogs/res/sdl_resource_file.cpp b/client/SDL2/dialogs/res/sdl_resource_file.cpp similarity index 100% rename from client/SDL/dialogs/res/sdl_resource_file.cpp rename to client/SDL2/dialogs/res/sdl_resource_file.cpp diff --git a/client/SDL/dialogs/res/sdl_resource_file.hpp b/client/SDL2/dialogs/res/sdl_resource_file.hpp similarity index 100% rename from client/SDL/dialogs/res/sdl_resource_file.hpp rename to client/SDL2/dialogs/res/sdl_resource_file.hpp diff --git a/client/SDL/dialogs/res/sdl_resource_manager.cpp b/client/SDL2/dialogs/res/sdl_resource_manager.cpp similarity index 100% rename from client/SDL/dialogs/res/sdl_resource_manager.cpp rename to client/SDL2/dialogs/res/sdl_resource_manager.cpp diff --git a/client/SDL/dialogs/res/sdl_resource_manager.hpp b/client/SDL2/dialogs/res/sdl_resource_manager.hpp similarity index 100% rename from client/SDL/dialogs/res/sdl_resource_manager.hpp rename to client/SDL2/dialogs/res/sdl_resource_manager.hpp diff --git a/client/SDL/dialogs/sdl_button.cpp b/client/SDL2/dialogs/sdl_button.cpp similarity index 100% rename from client/SDL/dialogs/sdl_button.cpp rename to client/SDL2/dialogs/sdl_button.cpp diff --git a/client/SDL/dialogs/sdl_button.hpp b/client/SDL2/dialogs/sdl_button.hpp similarity index 100% rename from client/SDL/dialogs/sdl_button.hpp rename to client/SDL2/dialogs/sdl_button.hpp diff --git a/client/SDL/dialogs/sdl_buttons.cpp b/client/SDL2/dialogs/sdl_buttons.cpp similarity index 100% rename from client/SDL/dialogs/sdl_buttons.cpp rename to client/SDL2/dialogs/sdl_buttons.cpp diff --git a/client/SDL/dialogs/sdl_buttons.hpp b/client/SDL2/dialogs/sdl_buttons.hpp similarity index 100% rename from client/SDL/dialogs/sdl_buttons.hpp rename to client/SDL2/dialogs/sdl_buttons.hpp diff --git a/client/SDL/dialogs/sdl_connection_dialog.cpp b/client/SDL2/dialogs/sdl_connection_dialog.cpp similarity index 100% rename from client/SDL/dialogs/sdl_connection_dialog.cpp rename to client/SDL2/dialogs/sdl_connection_dialog.cpp diff --git a/client/SDL/dialogs/sdl_connection_dialog.hpp b/client/SDL2/dialogs/sdl_connection_dialog.hpp similarity index 100% rename from client/SDL/dialogs/sdl_connection_dialog.hpp rename to client/SDL2/dialogs/sdl_connection_dialog.hpp diff --git a/client/SDL/dialogs/sdl_dialogs.cpp b/client/SDL2/dialogs/sdl_dialogs.cpp similarity index 100% rename from client/SDL/dialogs/sdl_dialogs.cpp rename to client/SDL2/dialogs/sdl_dialogs.cpp diff --git a/client/SDL/dialogs/sdl_dialogs.hpp b/client/SDL2/dialogs/sdl_dialogs.hpp similarity index 100% rename from client/SDL/dialogs/sdl_dialogs.hpp rename to client/SDL2/dialogs/sdl_dialogs.hpp diff --git a/client/SDL/dialogs/sdl_input.cpp b/client/SDL2/dialogs/sdl_input.cpp similarity index 100% rename from client/SDL/dialogs/sdl_input.cpp rename to client/SDL2/dialogs/sdl_input.cpp diff --git a/client/SDL/dialogs/sdl_input.hpp b/client/SDL2/dialogs/sdl_input.hpp similarity index 100% rename from client/SDL/dialogs/sdl_input.hpp rename to client/SDL2/dialogs/sdl_input.hpp diff --git a/client/SDL/dialogs/sdl_input_widgets.cpp b/client/SDL2/dialogs/sdl_input_widgets.cpp similarity index 100% rename from client/SDL/dialogs/sdl_input_widgets.cpp rename to client/SDL2/dialogs/sdl_input_widgets.cpp diff --git a/client/SDL/dialogs/sdl_input_widgets.hpp b/client/SDL2/dialogs/sdl_input_widgets.hpp similarity index 100% rename from client/SDL/dialogs/sdl_input_widgets.hpp rename to client/SDL2/dialogs/sdl_input_widgets.hpp diff --git a/client/SDL/dialogs/sdl_select.cpp b/client/SDL2/dialogs/sdl_select.cpp similarity index 100% rename from client/SDL/dialogs/sdl_select.cpp rename to client/SDL2/dialogs/sdl_select.cpp diff --git a/client/SDL/dialogs/sdl_select.hpp b/client/SDL2/dialogs/sdl_select.hpp similarity index 100% rename from client/SDL/dialogs/sdl_select.hpp rename to client/SDL2/dialogs/sdl_select.hpp diff --git a/client/SDL/dialogs/sdl_selectlist.cpp b/client/SDL2/dialogs/sdl_selectlist.cpp similarity index 100% rename from client/SDL/dialogs/sdl_selectlist.cpp rename to client/SDL2/dialogs/sdl_selectlist.cpp diff --git a/client/SDL/dialogs/sdl_selectlist.hpp b/client/SDL2/dialogs/sdl_selectlist.hpp similarity index 100% rename from client/SDL/dialogs/sdl_selectlist.hpp rename to client/SDL2/dialogs/sdl_selectlist.hpp diff --git a/client/SDL/dialogs/sdl_widget.cpp b/client/SDL2/dialogs/sdl_widget.cpp similarity index 100% rename from client/SDL/dialogs/sdl_widget.cpp rename to client/SDL2/dialogs/sdl_widget.cpp diff --git a/client/SDL/dialogs/sdl_widget.hpp b/client/SDL2/dialogs/sdl_widget.hpp similarity index 100% rename from client/SDL/dialogs/sdl_widget.hpp rename to client/SDL2/dialogs/sdl_widget.hpp diff --git a/client/SDL/dialogs/test/CMakeLists.txt b/client/SDL2/dialogs/test/CMakeLists.txt similarity index 100% rename from client/SDL/dialogs/test/CMakeLists.txt rename to client/SDL2/dialogs/test/CMakeLists.txt diff --git a/client/SDL/dialogs/test/TestSDLDialogs.cpp b/client/SDL2/dialogs/test/TestSDLDialogs.cpp similarity index 100% rename from client/SDL/dialogs/test/TestSDLDialogs.cpp rename to client/SDL2/dialogs/test/TestSDLDialogs.cpp diff --git a/client/SDL/man/CMakeLists.txt b/client/SDL2/man/CMakeLists.txt similarity index 100% rename from client/SDL/man/CMakeLists.txt rename to client/SDL2/man/CMakeLists.txt diff --git a/client/SDL/man/sdl-freerdp-config.1.xml.in b/client/SDL2/man/sdl-freerdp-config.1.xml.in similarity index 100% rename from client/SDL/man/sdl-freerdp-config.1.xml.in rename to client/SDL2/man/sdl-freerdp-config.1.xml.in diff --git a/client/SDL/man/sdl-freerdp-envvar.1.xml.in b/client/SDL2/man/sdl-freerdp-envvar.1.xml.in similarity index 100% rename from client/SDL/man/sdl-freerdp-envvar.1.xml.in rename to client/SDL2/man/sdl-freerdp-envvar.1.xml.in diff --git a/client/SDL/man/sdl-freerdp-examples.1.xml.in b/client/SDL2/man/sdl-freerdp-examples.1.xml.in similarity index 100% rename from client/SDL/man/sdl-freerdp-examples.1.xml.in rename to client/SDL2/man/sdl-freerdp-examples.1.xml.in diff --git a/client/SDL/man/sdl-freerdp.1.xml.in b/client/SDL2/man/sdl-freerdp.1.xml.in similarity index 100% rename from client/SDL/man/sdl-freerdp.1.xml.in rename to client/SDL2/man/sdl-freerdp.1.xml.in diff --git a/client/SDL/sdl_channels.cpp b/client/SDL2/sdl_channels.cpp similarity index 100% rename from client/SDL/sdl_channels.cpp rename to client/SDL2/sdl_channels.cpp diff --git a/client/SDL/sdl_channels.hpp b/client/SDL2/sdl_channels.hpp similarity index 100% rename from client/SDL/sdl_channels.hpp rename to client/SDL2/sdl_channels.hpp diff --git a/client/SDL/sdl_disp.cpp b/client/SDL2/sdl_disp.cpp similarity index 100% rename from client/SDL/sdl_disp.cpp rename to client/SDL2/sdl_disp.cpp diff --git a/client/SDL/sdl_disp.hpp b/client/SDL2/sdl_disp.hpp similarity index 100% rename from client/SDL/sdl_disp.hpp rename to client/SDL2/sdl_disp.hpp diff --git a/client/SDL/sdl_freerdp.cpp b/client/SDL2/sdl_freerdp.cpp similarity index 100% rename from client/SDL/sdl_freerdp.cpp rename to client/SDL2/sdl_freerdp.cpp diff --git a/client/SDL/sdl_freerdp.hpp b/client/SDL2/sdl_freerdp.hpp similarity index 100% rename from client/SDL/sdl_freerdp.hpp rename to client/SDL2/sdl_freerdp.hpp diff --git a/client/SDL/sdl_kbd.cpp b/client/SDL2/sdl_kbd.cpp similarity index 100% rename from client/SDL/sdl_kbd.cpp rename to client/SDL2/sdl_kbd.cpp diff --git a/client/SDL/sdl_kbd.hpp b/client/SDL2/sdl_kbd.hpp similarity index 100% rename from client/SDL/sdl_kbd.hpp rename to client/SDL2/sdl_kbd.hpp diff --git a/client/SDL/sdl_monitor.cpp b/client/SDL2/sdl_monitor.cpp similarity index 100% rename from client/SDL/sdl_monitor.cpp rename to client/SDL2/sdl_monitor.cpp diff --git a/client/SDL/sdl_monitor.hpp b/client/SDL2/sdl_monitor.hpp similarity index 100% rename from client/SDL/sdl_monitor.hpp rename to client/SDL2/sdl_monitor.hpp diff --git a/client/SDL/sdl_pointer.cpp b/client/SDL2/sdl_pointer.cpp similarity index 100% rename from client/SDL/sdl_pointer.cpp rename to client/SDL2/sdl_pointer.cpp diff --git a/client/SDL/sdl_pointer.hpp b/client/SDL2/sdl_pointer.hpp similarity index 100% rename from client/SDL/sdl_pointer.hpp rename to client/SDL2/sdl_pointer.hpp diff --git a/client/SDL/sdl_prefs.cpp b/client/SDL2/sdl_prefs.cpp similarity index 100% rename from client/SDL/sdl_prefs.cpp rename to client/SDL2/sdl_prefs.cpp diff --git a/client/SDL/sdl_prefs.hpp b/client/SDL2/sdl_prefs.hpp similarity index 100% rename from client/SDL/sdl_prefs.hpp rename to client/SDL2/sdl_prefs.hpp diff --git a/client/SDL/sdl_touch.cpp b/client/SDL2/sdl_touch.cpp similarity index 100% rename from client/SDL/sdl_touch.cpp rename to client/SDL2/sdl_touch.cpp diff --git a/client/SDL/sdl_touch.hpp b/client/SDL2/sdl_touch.hpp similarity index 100% rename from client/SDL/sdl_touch.hpp rename to client/SDL2/sdl_touch.hpp diff --git a/client/SDL/sdl_types.hpp b/client/SDL2/sdl_types.hpp similarity index 100% rename from client/SDL/sdl_types.hpp rename to client/SDL2/sdl_types.hpp diff --git a/client/SDL/sdl_utils.cpp b/client/SDL2/sdl_utils.cpp similarity index 100% rename from client/SDL/sdl_utils.cpp rename to client/SDL2/sdl_utils.cpp diff --git a/client/SDL/sdl_utils.hpp b/client/SDL2/sdl_utils.hpp similarity index 100% rename from client/SDL/sdl_utils.hpp rename to client/SDL2/sdl_utils.hpp diff --git a/client/SDL/sdl_window.cpp b/client/SDL2/sdl_window.cpp similarity index 100% rename from client/SDL/sdl_window.cpp rename to client/SDL2/sdl_window.cpp diff --git a/client/SDL/sdl_window.hpp b/client/SDL2/sdl_window.hpp similarity index 100% rename from client/SDL/sdl_window.hpp rename to client/SDL2/sdl_window.hpp diff --git a/client/SDL/test/CMakeLists.txt b/client/SDL2/test/CMakeLists.txt similarity index 93% rename from client/SDL/test/CMakeLists.txt rename to client/SDL2/test/CMakeLists.txt index cc336833f..9c7037542 100644 --- a/client/SDL/test/CMakeLists.txt +++ b/client/SDL2/test/CMakeLists.txt @@ -1,4 +1,4 @@ -set(MODULE_NAME "TestSDL") +set(MODULE_NAME "TestSDL2") set(MODULE_PREFIX "TEST_SDL") set(${MODULE_PREFIX}_DRIVER ${MODULE_NAME}.cpp) @@ -11,7 +11,7 @@ create_test_sourcelist(${MODULE_PREFIX}_SRCS add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) -set(${MODULE_PREFIX}_LIBS freerdp winpr sdl_prefs) +set(${MODULE_PREFIX}_LIBS freerdp winpr sdl2-prefs) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) diff --git a/client/SDL/test/TestSDLPrefs.cpp b/client/SDL2/test/TestSDLPrefs.cpp similarity index 100% rename from client/SDL/test/TestSDLPrefs.cpp rename to client/SDL2/test/TestSDLPrefs.cpp diff --git a/client/SDL/test/sdl-freerdp.json b/client/SDL2/test/sdl-freerdp.json similarity index 100% rename from client/SDL/test/sdl-freerdp.json rename to client/SDL2/test/sdl-freerdp.json diff --git a/client/SDL3/CMakeLists.txt b/client/SDL3/CMakeLists.txt new file mode 100644 index 000000000..006ed6a98 --- /dev/null +++ b/client/SDL3/CMakeLists.txt @@ -0,0 +1,125 @@ +# FreeRDP: A Remote Desktop Protocol Implementation +# FreeRDP SDL Client +# +# Copyright 2022 Armin Novak +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +cmake_minimum_required(VERSION 3.13) + +if(POLICY CMP0091) + cmake_policy(SET CMP0091 NEW) +endif() +if (NOT FREERDP_DEFAULT_PROJECT_VERSION) + set(FREERDP_DEFAULT_PROJECT_VERSION "1.0.0.0") +endif() + +project(sdl3-freerdp + LANGUAGES CXX + VERSION ${FREERDP_DEFAULT_PROJECT_VERSION} +) + +message("project ${PROJECT_NAME} is using version ${PROJECT_VERSION}") + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS ON) + +list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/) +include(CommonConfigOptions) + +include(ConfigureFreeRDP) + +option(WITH_DEBUG_SDL_EVENTS "[dangerous, not for release builds!] Debug SDL events" ${DEFAULT_DEBUG_OPTION}) +option(WITH_DEBUG_SDL_KBD_EVENTS "[dangerous, not for release builds!] Debug SDL keyboard events" ${DEFAULT_DEBUG_OPTION}) +option(WITH_WIN_CONSOLE "Build ${PROJECT_NAME} with console support" ON) +option(WITH_SDL_LINK_SHARED "link SDL dynamic or static" ON) + +if(WITH_WIN_CONSOLE) + set(WIN32_GUI_FLAG "TRUE") +else() + set(WIN32_GUI_FLAG "WIN32") +endif() + + +if (WITH_DEBUG_SDL_EVENTS) + add_definitions(-DWITH_DEBUG_SDL_EVENTS) +endif() +if (WITH_DEBUG_SDL_KBD_EVENTS) + add_definitions(-DWITH_DEBUG_SDL_KBD_EVENTS) +endif() + +find_package(SDL2 REQUIRED COMPONENTS) +include_directories(${SDL2_INCLUDE_DIR}) +include_directories(${SDL2_INCLUDE_DIRS}) + +find_package(Threads REQUIRED) + +add_subdirectory(dialogs) +set(SRCS + sdl_types.hpp + sdl_utils.cpp + sdl_utils.hpp + sdl_kbd.cpp + sdl_kbd.hpp + sdl_touch.cpp + sdl_touch.hpp + sdl_pointer.cpp + sdl_pointer.hpp + sdl_disp.cpp + sdl_disp.hpp + sdl_monitor.cpp + sdl_monitor.hpp + sdl_freerdp.hpp + sdl_freerdp.cpp + sdl_channels.hpp + sdl_channels.cpp + sdl_window.hpp + sdl_window.cpp +) + +add_library(sdl3-prefs STATIC + sdl_prefs.hpp + sdl_prefs.cpp +) + +add_subdirectory(aad) +list(APPEND LIBS + winpr + freerdp + freerdp-client + Threads::Threads + sdl3_client_res + sdl3-dialogs + sdl3-aad-view + sdl3-prefs + ) + +if (NOT WITH_SDL_LINK_SHARED) + list(APPEND LIBS ${SDL2_STATIC_LIBRARIES}) +else() + list(APPEND LIBS ${SDL2_LIBRARIES}) +endif() + +AddTargetWithResourceFile(${PROJECT_NAME} "${WIN32_GUI_FLAG}" "${PROJECT_VERSION}" SRCS) + +target_link_libraries(${PROJECT_NAME} PRIVATE ${LIBS}) +target_link_libraries(sdl3-prefs winpr) +set_property(TARGET ${PROJECT_NAME} PROPERTY FOLDER "Client/SDL") +install(TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT client) + +add_subdirectory(man) + +if(BUILD_TESTING) + add_subdirectory(test) +endif() diff --git a/client/SDL3/aad/CMakeLists.txt b/client/SDL3/aad/CMakeLists.txt new file mode 100644 index 000000000..09ce3d39a --- /dev/null +++ b/client/SDL3/aad/CMakeLists.txt @@ -0,0 +1,75 @@ +set(WITH_WEBVIEW_DEFAULT OFF) +if (UNIX AND NOT APPLE) + set(WITH_WEBVIEW_DEFAULT ON) +endif() + +option(WITH_WEBVIEW "Build with WebView support for AAD login popup browser" ${WITH_WEBVIEW_DEFAULT}) +if (WITH_WEBVIEW) + option(WITH_WEBVIEW_QT "Build with QtWebEngine support for AAD login broweser popup" OFF) + + set(SRCS + sdl_webview.hpp + webview_impl.hpp + sdl_webview.cpp + ) + set(LIBS + winpr + ) + + if (WITH_WEBVIEW_QT) + find_package(Qt5 COMPONENTS WebEngineWidgets REQUIRED) + + list(APPEND SRCS + qt/webview_impl.cpp + ) + + list(APPEND LIBS + Qt5::WebEngineWidgets + ) + else() + list(APPEND SRCS + wrapper/webview.h + wrapper/webview_impl.cpp + ) + + if (WIN32) + find_package(unofficial-webview2 CONFIG REQUIRED) + list(APPEND LIBS + unofficial::webview2::webview2 + ) + elseif(APPLE) + find_library(WEBKIT Webkit REQUIRED) + list(APPEND LIBS + ${WEBKIT} + ) + else() + find_package(PkgConfig REQUIRED) + pkg_check_modules(WEBVIEW_GTK webkit2gtk-4.0 REQUIRED) + include_directories(${WEBVIEW_GTK_INCLUDE_DIRS}) + list(APPEND LIBS + ${WEBVIEW_GTK_LIBRARIES} + ) + endif() + endif() +else() + set(SRCS + dummy.cpp + ) +endif() + +configure_file(sdl_config.hpp.in sdl_config.hpp @ONLY) + +add_library(sdl3-aad-view STATIC + ${SRCS} +) +target_include_directories(sdl3-aad-view PUBLIC ${CMAKE_CURRENT_BINARY_DIR}) +target_link_libraries(sdl3-aad-view + PRIVATE + ${LIBS} +) +target_compile_definitions( + sdl3-aad-view + PUBLIC + ${DEFINITIONS} +) + diff --git a/client/SDL3/aad/dummy.cpp b/client/SDL3/aad/dummy.cpp new file mode 100644 index 000000000..e69de29bb diff --git a/client/SDL3/aad/qt/webview_impl.cpp b/client/SDL3/aad/qt/webview_impl.cpp new file mode 100644 index 000000000..e70cc46ab --- /dev/null +++ b/client/SDL3/aad/qt/webview_impl.cpp @@ -0,0 +1,105 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Popup browser for AAD authentication + * + * Copyright 2023 Isaac Klein + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "../webview_impl.hpp" + +#define TAG CLIENT_TAG("sdl.webview") + +class SchemeHandler : public QWebEngineUrlSchemeHandler +{ + public: + explicit SchemeHandler(QObject* parent = nullptr) : QWebEngineUrlSchemeHandler(parent) + { + } + + void requestStarted(QWebEngineUrlRequestJob* request) override + { + QUrl url = request->requestUrl(); + + int rc = -1; + for (auto& param : url.query().split('&')) + { + QStringList pair = param.split('='); + + if (pair.size() != 2 || pair[0] != QLatin1String("code")) + continue; + + auto qc = pair[1]; + m_code = qc.toStdString(); + rc = 0; + break; + } + qApp->exit(rc); + } + + [[nodiscard]] std::string code() const + { + return m_code; + } + + private: + std::string m_code{}; +}; + +bool webview_impl_run(const std::string& title, const std::string& url, std::string& code) +{ + int argc = 1; + const auto vendor = QString::fromUtf8(FREERDP_VENDOR_STRING); + const auto product = QString::fromUtf8(FREERDP_PRODUCT_STRING); + QWebEngineUrlScheme::registerScheme(QWebEngineUrlScheme("ms-appx-web")); + + std::string wtitle = title; + char* argv[] = { wtitle.data() }; + QCoreApplication::setOrganizationName(vendor); + QCoreApplication::setApplicationName(product); + QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); + QApplication app(argc, argv); + + SchemeHandler handler; + QWebEngineProfile::defaultProfile()->installUrlSchemeHandler("ms-appx-web", &handler); + + QWebEngineView webview; + webview.load(QUrl(QString::fromStdString(url))); + webview.show(); + + if (app.exec() != 0) + return false; + + auto val = handler.code(); + if (val.empty()) + return false; + code = val; + + return !code.empty(); +} diff --git a/client/SDL3/aad/sdl_config.hpp.in b/client/SDL3/aad/sdl_config.hpp.in new file mode 100644 index 000000000..34d075180 --- /dev/null +++ b/client/SDL3/aad/sdl_config.hpp.in @@ -0,0 +1,3 @@ +#pragma once + +#cmakedefine WITH_WEBVIEW diff --git a/client/SDL3/aad/sdl_webview.cpp b/client/SDL3/aad/sdl_webview.cpp new file mode 100644 index 000000000..b4df75b8f --- /dev/null +++ b/client/SDL3/aad/sdl_webview.cpp @@ -0,0 +1,129 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Popup browser for AAD authentication + * + * Copyright 2023 Isaac Klein + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include + +#include "sdl_webview.hpp" +#include "webview_impl.hpp" + +#define TAG CLIENT_TAG("SDL.webview") + +static BOOL sdl_webview_get_rdsaad_access_token(freerdp* instance, const char* scope, + const char* req_cnf, char** token) +{ + WINPR_ASSERT(instance); + WINPR_ASSERT(scope); + WINPR_ASSERT(req_cnf); + WINPR_ASSERT(token); + + WINPR_UNUSED(instance); + + std::string client_id = "5177bc73-fd99-4c77-a90c-76844c9b6999"; + std::string redirect_uri = + "ms-appx-web%3a%2f%2fMicrosoft.AAD.BrokerPlugin%2f5177bc73-fd99-4c77-a90c-76844c9b6999"; + + *token = nullptr; + + auto url = + "https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=" + client_id + + "&response_type=code&scope=" + scope + "&redirect_uri=" + redirect_uri; + + const std::string title = "FreeRDP WebView - AAD access token"; + std::string code; + auto rc = webview_impl_run(title, url, code); + if (!rc || code.empty()) + return FALSE; + + auto token_request = "grant_type=authorization_code&code=" + code + "&client_id=" + client_id + + "&scope=" + scope + "&redirect_uri=" + redirect_uri + + "&req_cnf=" + req_cnf; + return client_common_get_access_token(instance, token_request.c_str(), token); +} + +static BOOL sdl_webview_get_avd_access_token(freerdp* instance, char** token) +{ + WINPR_ASSERT(token); + + std::string client_id = "a85cf173-4192-42f8-81fa-777a763e6e2c"; + std::string redirect_uri = + "ms-appx-web%3a%2f%2fMicrosoft.AAD.BrokerPlugin%2fa85cf173-4192-42f8-81fa-777a763e6e2c"; + std::string scope = "https%3A%2F%2Fwww.wvd.microsoft.com%2F.default"; + + *token = nullptr; + + auto url = + "https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=" + client_id + + "&response_type=code&scope=" + scope + "&redirect_uri=" + redirect_uri; + const std::string title = "FreeRDP WebView - AVD access token"; + std::string code; + auto rc = webview_impl_run(title, url, code); + if (!rc || code.empty()) + return FALSE; + + auto token_request = "grant_type=authorization_code&code=" + code + "&client_id=" + client_id + + "&scope=" + scope + "&redirect_uri=" + redirect_uri; + return client_common_get_access_token(instance, token_request.c_str(), token); +} + +BOOL sdl_webview_get_access_token(freerdp* instance, AccessTokenType tokenType, char** token, + size_t count, ...) +{ + WINPR_ASSERT(instance); + WINPR_ASSERT(token); + switch (tokenType) + { + case ACCESS_TOKEN_TYPE_AAD: + { + if (count < 2) + { + WLog_ERR(TAG, + "ACCESS_TOKEN_TYPE_AAD expected 2 additional arguments, but got %" PRIuz + ", aborting", + count); + return FALSE; + } + else if (count > 2) + WLog_WARN(TAG, + "ACCESS_TOKEN_TYPE_AAD expected 2 additional arguments, but got %" PRIuz + ", ignoring", + count); + va_list ap; + va_start(ap, count); + const char* scope = va_arg(ap, const char*); + const char* req_cnf = va_arg(ap, const char*); + const BOOL rc = sdl_webview_get_rdsaad_access_token(instance, scope, req_cnf, token); + va_end(ap); + return rc; + } + case ACCESS_TOKEN_TYPE_AVD: + if (count != 0) + WLog_WARN(TAG, + "ACCESS_TOKEN_TYPE_AVD expected 0 additional arguments, but got %" PRIuz + ", ignoring", + count); + return sdl_webview_get_avd_access_token(instance, token); + default: + WLog_ERR(TAG, "Unexpected value for AccessTokenType [%" PRIuz "], aborting", tokenType); + return FALSE; + } +} diff --git a/client/SDL3/aad/sdl_webview.hpp b/client/SDL3/aad/sdl_webview.hpp new file mode 100644 index 000000000..49461d69a --- /dev/null +++ b/client/SDL3/aad/sdl_webview.hpp @@ -0,0 +1,38 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Popup browser for AAD authentication + * + * Copyright 2023 Isaac Klein + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include + +#include + +#if defined(WITH_WEBVIEW) +#ifdef __cplusplus +extern "C" +{ +#endif + + BOOL sdl_webview_get_access_token(freerdp* instance, AccessTokenType tokenType, char** token, + size_t count, ...); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/client/SDL3/aad/webview_impl.hpp b/client/SDL3/aad/webview_impl.hpp new file mode 100644 index 000000000..25bca3c0a --- /dev/null +++ b/client/SDL3/aad/webview_impl.hpp @@ -0,0 +1,24 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Popup browser for AAD authentication + * + * Copyright 2023 Isaac Klein + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include + +bool webview_impl_run(const std::string& title, const std::string& url, std::string& code); diff --git a/client/SDL3/aad/wrapper/README b/client/SDL3/aad/wrapper/README new file mode 100644 index 000000000..da906bac6 --- /dev/null +++ b/client/SDL3/aad/wrapper/README @@ -0,0 +1 @@ +upstream at https://github.com/webview/webview/ diff --git a/client/SDL3/aad/wrapper/webview.h b/client/SDL3/aad/wrapper/webview.h new file mode 100644 index 000000000..91cabf61e --- /dev/null +++ b/client/SDL3/aad/wrapper/webview.h @@ -0,0 +1,2797 @@ +/* + * MIT License + * + * Copyright (c) 2017 Serge Zaitsev + * Copyright (c) 2022 Steffen André Langnes + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#ifndef WEBVIEW_H +#define WEBVIEW_H + +#ifndef WEBVIEW_API +#define WEBVIEW_API extern +#endif + +#ifndef WEBVIEW_VERSION_MAJOR +// The current library major version. +#define WEBVIEW_VERSION_MAJOR 0 +#endif + +#ifndef WEBVIEW_VERSION_MINOR +// The current library minor version. +#define WEBVIEW_VERSION_MINOR 10 +#endif + +#ifndef WEBVIEW_VERSION_PATCH +// The current library patch version. +#define WEBVIEW_VERSION_PATCH 0 +#endif + +#ifndef WEBVIEW_VERSION_PRE_RELEASE +// SemVer 2.0.0 pre-release labels prefixed with "-". +#define WEBVIEW_VERSION_PRE_RELEASE "" +#endif + +#ifndef WEBVIEW_VERSION_BUILD_METADATA +// SemVer 2.0.0 build metadata prefixed with "+". +#define WEBVIEW_VERSION_BUILD_METADATA "" +#endif + +// Utility macro for stringifying a macro argument. +#define WEBVIEW_STRINGIFY(x) #x + +// Utility macro for stringifying the result of a macro argument expansion. +#define WEBVIEW_EXPAND_AND_STRINGIFY(x) WEBVIEW_STRINGIFY(x) + +// SemVer 2.0.0 version number in MAJOR.MINOR.PATCH format. +#define WEBVIEW_VERSION_NUMBER \ + WEBVIEW_EXPAND_AND_STRINGIFY(WEBVIEW_VERSION_MAJOR) \ + "." WEBVIEW_EXPAND_AND_STRINGIFY(WEBVIEW_VERSION_MINOR) "." WEBVIEW_EXPAND_AND_STRINGIFY( \ + WEBVIEW_VERSION_PATCH) + +// Holds the elements of a MAJOR.MINOR.PATCH version number. +typedef struct +{ + // Major version. + unsigned int major; + // Minor version. + unsigned int minor; + // Patch version. + unsigned int patch; +} webview_version_t; + +// Holds the library's version information. +typedef struct +{ + // The elements of the version number. + webview_version_t version; + // SemVer 2.0.0 version number in MAJOR.MINOR.PATCH format. + char version_number[32]; + // SemVer 2.0.0 pre-release labels prefixed with "-" if specified, otherwise + // an empty string. + char pre_release[48]; + // SemVer 2.0.0 build metadata prefixed with "+", otherwise an empty string. + char build_metadata[48]; +} webview_version_info_t; + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef void* webview_t; + + // Creates a new webview instance. If debug is non-zero - developer tools will + // be enabled (if the platform supports them). Window parameter can be a + // pointer to the native window handle. If it's non-null - then child WebView + // is embedded into the given parent window. Otherwise a new window is created. + // Depending on the platform, a GtkWindow, NSWindow or HWND pointer can be + // passed here. Returns null on failure. Creation can fail for various reasons + // such as when required runtime dependencies are missing or when window creation + // fails. + WEBVIEW_API webview_t webview_create(int debug, void* window); + + // Destroys a webview and closes the native window. + WEBVIEW_API void webview_destroy(webview_t w); + + // Runs the main loop until it's terminated. After this function exits - you + // must destroy the webview. + WEBVIEW_API void webview_run(webview_t w); + + // Stops the main loop. It is safe to call this function from another other + // background thread. + WEBVIEW_API void webview_terminate(webview_t w); + + // Posts a function to be executed on the main thread. You normally do not need + // to call this function, unless you want to tweak the native window. + WEBVIEW_API void webview_dispatch(webview_t w, void (*fn)(webview_t w, void* arg), void* arg); + + // Returns a native window handle pointer. When using GTK backend the pointer + // is GtkWindow pointer, when using Cocoa backend the pointer is NSWindow + // pointer, when using Win32 backend the pointer is HWND pointer. + WEBVIEW_API void* webview_get_window(webview_t w); + + // Updates the title of the native window. Must be called from the UI thread. + WEBVIEW_API void webview_set_title(webview_t w, const char* title); + +// Window size hints +#define WEBVIEW_HINT_NONE 0 // Width and height are default size +#define WEBVIEW_HINT_MIN 1 // Width and height are minimum bounds +#define WEBVIEW_HINT_MAX 2 // Width and height are maximum bounds +#define WEBVIEW_HINT_FIXED 3 // Window size can not be changed by a user + // Updates native window size. See WEBVIEW_HINT constants. + WEBVIEW_API void webview_set_size(webview_t w, int width, int height, int hints); + + // Navigates webview to the given URL. URL may be a properly encoded data URI. + // Examples: + // webview_navigate(w, "https://github.com/webview/webview"); + // webview_navigate(w, "data:text/html,%3Ch1%3EHello%3C%2Fh1%3E"); + // webview_navigate(w, "data:text/html;base64,PGgxPkhlbGxvPC9oMT4="); + WEBVIEW_API void webview_navigate(webview_t w, const char* url); + + // Set webview HTML directly. + // Example: webview_set_html(w, "

Hello

"); + WEBVIEW_API void webview_set_html(webview_t w, const char* html); + + // Injects JavaScript code at the initialization of the new page. Every time + // the webview will open a the new page - this initialization code will be + // executed. It is guaranteed that code is executed before window.onload. + WEBVIEW_API void webview_init(webview_t w, const char* js); + + // Evaluates arbitrary JavaScript code. Evaluation happens asynchronously, also + // the result of the expression is ignored. Use RPC bindings if you want to + // receive notifications about the results of the evaluation. + WEBVIEW_API void webview_eval(webview_t w, const char* js); + + // Binds a native C callback so that it will appear under the given name as a + // global JavaScript function. Internally it uses webview_init(). Callback + // receives a request string and a user-provided argument pointer. Request + // string is a JSON array of all the arguments passed to the JavaScript + // function. + WEBVIEW_API void webview_bind(webview_t w, const char* name, + void (*fn)(const char* seq, const char* req, void* arg), + void* arg); + + // Removes a native C callback that was previously set by webview_bind. + WEBVIEW_API void webview_unbind(webview_t w, const char* name); + + // Allows to return a value from the native binding. Original request pointer + // must be provided to help internal RPC engine match requests with responses. + // If status is zero - result is expected to be a valid JSON result value. + // If status is not zero - result is an error JSON object. + WEBVIEW_API void webview_return(webview_t w, const char* seq, int status, const char* result); + + // Get the library's version information. + // @since 0.10 + WEBVIEW_API const webview_version_info_t* webview_version(); + +#ifdef __cplusplus +} + +#ifndef WEBVIEW_HEADER + +#if !defined(WEBVIEW_GTK) && !defined(WEBVIEW_COCOA) && !defined(WEBVIEW_EDGE) +#if defined(__APPLE__) +#define WEBVIEW_COCOA +#elif defined(__unix__) +#define WEBVIEW_GTK +#elif defined(_WIN32) +#define WEBVIEW_EDGE +#else +#error "please, specify webview backend" +#endif +#endif + +#ifndef WEBVIEW_DEPRECATED +#if __cplusplus >= 201402L +#define WEBVIEW_DEPRECATED(reason) [[deprecated(reason)]] +#elif defined(_MSC_VER) +#define WEBVIEW_DEPRECATED(reason) __declspec(deprecated(reason)) +#else +#define WEBVIEW_DEPRECATED(reason) __attribute__((deprecated(reason))) +#endif +#endif + +#ifndef WEBVIEW_DEPRECATED_PRIVATE +#define WEBVIEW_DEPRECATED_PRIVATE WEBVIEW_DEPRECATED("Private API should not be used") +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace webview +{ + + using dispatch_fn_t = std::function; + + namespace detail + { + + // The library's version information. + constexpr const webview_version_info_t library_version_info{ + { WEBVIEW_VERSION_MAJOR, WEBVIEW_VERSION_MINOR, WEBVIEW_VERSION_PATCH }, + WEBVIEW_VERSION_NUMBER, + WEBVIEW_VERSION_PRE_RELEASE, + WEBVIEW_VERSION_BUILD_METADATA + }; + + inline int json_parse_c(const char* s, size_t sz, const char* key, size_t keysz, + const char** value, size_t* valuesz) + { + enum + { + JSON_STATE_VALUE, + JSON_STATE_LITERAL, + JSON_STATE_STRING, + JSON_STATE_ESCAPE, + JSON_STATE_UTF8 + } state = JSON_STATE_VALUE; + const char* k = nullptr; + int index = 1; + int depth = 0; + int utf8_bytes = 0; + + *value = nullptr; + *valuesz = 0; + + if (key == nullptr) + { + index = static_cast(keysz); + if (index < 0) + { + return -1; + } + keysz = 0; + } + + for (; sz > 0; s++, sz--) + { + enum + { + JSON_ACTION_NONE, + JSON_ACTION_START, + JSON_ACTION_END, + JSON_ACTION_START_STRUCT, + JSON_ACTION_END_STRUCT + } action = JSON_ACTION_NONE; + auto c = static_cast(*s); + switch (state) + { + case JSON_STATE_VALUE: + if (c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == ',' || c == ':') + { + continue; + } + else if (c == '"') + { + action = JSON_ACTION_START; + state = JSON_STATE_STRING; + } + else if (c == '{' || c == '[') + { + action = JSON_ACTION_START_STRUCT; + } + else if (c == '}' || c == ']') + { + action = JSON_ACTION_END_STRUCT; + } + else if (c == 't' || c == 'f' || c == 'n' || c == '-' || + (c >= '0' && c <= '9')) + { + action = JSON_ACTION_START; + state = JSON_STATE_LITERAL; + } + else + { + return -1; + } + break; + case JSON_STATE_LITERAL: + if (c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == ',' || + c == ']' || c == '}' || c == ':') + { + state = JSON_STATE_VALUE; + s--; + sz++; + action = JSON_ACTION_END; + } + else if (c < 32 || c > 126) + { + return -1; + } // fallthrough + case JSON_STATE_STRING: + if (c < 32 || (c > 126 && c < 192)) + { + return -1; + } + else if (c == '"') + { + action = JSON_ACTION_END; + state = JSON_STATE_VALUE; + } + else if (c == '\\') + { + state = JSON_STATE_ESCAPE; + } + else if (c >= 192 && c < 224) + { + utf8_bytes = 1; + state = JSON_STATE_UTF8; + } + else if (c >= 224 && c < 240) + { + utf8_bytes = 2; + state = JSON_STATE_UTF8; + } + else if (c >= 240 && c < 247) + { + utf8_bytes = 3; + state = JSON_STATE_UTF8; + } + else if (c >= 128 && c < 192) + { + return -1; + } + break; + case JSON_STATE_ESCAPE: + if (c == '"' || c == '\\' || c == '/' || c == 'b' || c == 'f' || c == 'n' || + c == 'r' || c == 't' || c == 'u') + { + state = JSON_STATE_STRING; + } + else + { + return -1; + } + break; + case JSON_STATE_UTF8: + if (c < 128 || c > 191) + { + return -1; + } + utf8_bytes--; + if (utf8_bytes == 0) + { + state = JSON_STATE_STRING; + } + break; + default: + return -1; + } + + if (action == JSON_ACTION_END_STRUCT) + { + depth--; + } + + if (depth == 1) + { + if (action == JSON_ACTION_START || action == JSON_ACTION_START_STRUCT) + { + if (index == 0) + { + *value = s; + } + else if (keysz > 0 && index == 1) + { + k = s; + } + else + { + index--; + } + } + else if (action == JSON_ACTION_END || action == JSON_ACTION_END_STRUCT) + { + if (*value != nullptr && index == 0) + { + *valuesz = (size_t)(s + 1 - *value); + return 0; + } + else if (keysz > 0 && k != nullptr) + { + if (keysz == (size_t)(s - k - 1) && memcmp(key, k + 1, keysz) == 0) + { + index = 0; + } + else + { + index = 2; + } + k = nullptr; + } + } + } + + if (action == JSON_ACTION_START_STRUCT) + { + depth++; + } + } + return -1; + } + + inline std::string json_escape(const std::string& s) + { + // TODO: implement + return '"' + s + '"'; + } + + inline int json_unescape(const char* s, size_t n, char* out) + { + int r = 0; + if (*s++ != '"') + { + return -1; + } + while (n > 2) + { + char c = *s; + if (c == '\\') + { + s++; + n--; + switch (*s) + { + case 'b': + c = '\b'; + break; + case 'f': + c = '\f'; + break; + case 'n': + c = '\n'; + break; + case 'r': + c = '\r'; + break; + case 't': + c = '\t'; + break; + case '\\': + c = '\\'; + break; + case '/': + c = '/'; + break; + case '\"': + c = '\"'; + break; + default: // TODO: support unicode decoding + return -1; + } + } + if (out != nullptr) + { + *out++ = c; + } + s++; + n--; + r++; + } + if (*s != '"') + { + return -1; + } + if (out != nullptr) + { + *out = '\0'; + } + return r; + } + + inline std::string json_parse(const std::string& s, const std::string& key, const int index) + { + const char* value = nullptr; + size_t value_sz = 0; + if (key.empty()) + { + json_parse_c(s.c_str(), s.length(), nullptr, index, &value, &value_sz); + } + else + { + json_parse_c(s.c_str(), s.length(), key.c_str(), key.length(), &value, &value_sz); + } + if (value != nullptr) + { + if (value[0] != '"') + { + return { value, value_sz }; + } + int n = json_unescape(value, value_sz, nullptr); + if (n > 0) + { + char* decoded = new char[n + 1]; + json_unescape(value, value_sz, decoded); + std::string result(decoded, n); + delete[] decoded; + return result; + } + } + return ""; + } + + } // namespace detail + + WEBVIEW_DEPRECATED_PRIVATE + inline int json_parse_c(const char* s, size_t sz, const char* key, size_t keysz, + const char** value, size_t* valuesz) + { + return detail::json_parse_c(s, sz, key, keysz, value, valuesz); + } + + WEBVIEW_DEPRECATED_PRIVATE + inline std::string json_escape(const std::string& s) + { + return detail::json_escape(s); + } + + WEBVIEW_DEPRECATED_PRIVATE + inline int json_unescape(const char* s, size_t n, char* out) + { + return detail::json_unescape(s, n, out); + } + + WEBVIEW_DEPRECATED_PRIVATE + inline std::string json_parse(const std::string& s, const std::string& key, const int index) + { + return detail::json_parse(s, key, index); + } + +} // namespace webview + +#if defined(WEBVIEW_GTK) +// +// ==================================================================== +// +// This implementation uses webkit2gtk backend. It requires gtk+3.0 and +// webkit2gtk-4.0 libraries. Proper compiler flags can be retrieved via: +// +// pkg-config --cflags --libs gtk+-3.0 webkit2gtk-4.0 +// +// ==================================================================== +// +#include +#include +#include + +namespace webview +{ + namespace detail + { + + class gtk_webkit_engine + { + public: + gtk_webkit_engine(bool debug, void* window) : m_window(static_cast(window)) + { + if (gtk_init_check(nullptr, nullptr) == FALSE) + { + return; + } + m_window = static_cast(window); + if (m_window == nullptr) + { + m_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + } + g_signal_connect(G_OBJECT(m_window), "destroy", + G_CALLBACK(+[](GtkWidget*, gpointer arg) + { static_cast(arg)->terminate(); }), + this); + // Initialize webview widget + m_webview = webkit_web_view_new(); + WebKitUserContentManager* manager = + webkit_web_view_get_user_content_manager(WEBKIT_WEB_VIEW(m_webview)); + g_signal_connect(manager, "script-message-received::external", + G_CALLBACK(+[](WebKitUserContentManager*, + WebKitJavascriptResult* r, gpointer arg) + { + auto* w = static_cast(arg); + char* s = get_string_from_js_result(r); + w->on_message(s); + g_free(s); + }), + this); + webkit_user_content_manager_register_script_message_handler(manager, "external"); + init("window.external={invoke:function(s){window.webkit.messageHandlers." + "external.postMessage(s);}}"); + + gtk_container_add(GTK_CONTAINER(m_window), GTK_WIDGET(m_webview)); + gtk_widget_grab_focus(GTK_WIDGET(m_webview)); + + WebKitSettings* settings = webkit_web_view_get_settings(WEBKIT_WEB_VIEW(m_webview)); + webkit_settings_set_javascript_can_access_clipboard(settings, true); + if (debug) + { + webkit_settings_set_enable_write_console_messages_to_stdout(settings, true); + webkit_settings_set_enable_developer_extras(settings, true); + } + + gtk_widget_show_all(m_window); + } + virtual ~gtk_webkit_engine() = default; + void* window() + { + return (void*)m_window; + } + void run() + { + gtk_main(); + } + void terminate() + { + gtk_main_quit(); + } + void dispatch(std::function f) + { + g_idle_add_full(G_PRIORITY_HIGH_IDLE, (GSourceFunc)([](void* f) -> int { + (*static_cast(f))(); + return G_SOURCE_REMOVE; + }), + new std::function(f), + [](void* f) { delete static_cast(f); }); + } + + void set_title(const std::string& title) + { + gtk_window_set_title(GTK_WINDOW(m_window), title.c_str()); + } + + void set_size(int width, int height, int hints) + { + gtk_window_set_resizable(GTK_WINDOW(m_window), hints != WEBVIEW_HINT_FIXED); + if (hints == WEBVIEW_HINT_NONE) + { + gtk_window_resize(GTK_WINDOW(m_window), width, height); + } + else if (hints == WEBVIEW_HINT_FIXED) + { + gtk_widget_set_size_request(m_window, width, height); + } + else + { + GdkGeometry g; + g.min_width = g.max_width = width; + g.min_height = g.max_height = height; + GdkWindowHints h = + (hints == WEBVIEW_HINT_MIN ? GDK_HINT_MIN_SIZE : GDK_HINT_MAX_SIZE); + // This defines either MIN_SIZE, or MAX_SIZE, but not both: + gtk_window_set_geometry_hints(GTK_WINDOW(m_window), nullptr, &g, h); + } + } + + void navigate(const std::string& url) + { + webkit_web_view_load_uri(WEBKIT_WEB_VIEW(m_webview), url.c_str()); + } + + void add_navigate_listener(std::function callback, + void* arg) + { + g_signal_connect(WEBKIT_WEB_VIEW(m_webview), "load-changed", + G_CALLBACK(on_load_changed), this); + navigateCallbackArg = arg; + navigateCallback = std::move(callback); + } + + void add_scheme_handler(const std::string& scheme, + std::function callback, + void* arg) + { + auto view = WEBKIT_WEB_VIEW(m_webview); + auto context = webkit_web_view_get_context(view); + + scheme_handlers.insert({ scheme, { .arg = arg, .fkt = callback } }); + webkit_web_context_register_uri_scheme(context, scheme.c_str(), scheme_handler, + static_cast(this), nullptr); + } + + void set_html(const std::string& html) + { + webkit_web_view_load_html(WEBKIT_WEB_VIEW(m_webview), html.c_str(), nullptr); + } + + void init(const std::string& js) + { + WebKitUserContentManager* manager = + webkit_web_view_get_user_content_manager(WEBKIT_WEB_VIEW(m_webview)); + webkit_user_content_manager_add_script( + manager, webkit_user_script_new( + js.c_str(), WEBKIT_USER_CONTENT_INJECT_TOP_FRAME, + WEBKIT_USER_SCRIPT_INJECT_AT_DOCUMENT_START, nullptr, nullptr)); + } + + void eval(const std::string& js) + { + webkit_web_view_run_javascript(WEBKIT_WEB_VIEW(m_webview), js.c_str(), nullptr, + nullptr, nullptr); + } + + private: + virtual void on_message(const std::string& msg) = 0; + + struct handler_t + { + void* arg; + std::function fkt; + }; + + std::map scheme_handlers; + + void scheme_handler_call(const std::string& scheme, const std::string& url) + { + auto handler = scheme_handlers.find(scheme); + if (handler != scheme_handlers.end()) + { + const auto& arg = handler->second; + arg.fkt(url, arg.arg); + } + } + + static void scheme_handler(WebKitURISchemeRequest* request, gpointer user_data) + { + auto _this = static_cast(user_data); + + auto scheme = webkit_uri_scheme_request_get_scheme(request); + auto uri = webkit_uri_scheme_request_get_uri(request); + _this->scheme_handler_call(scheme, uri); + } + + static char* get_string_from_js_result(WebKitJavascriptResult* r) + { + char* s = nullptr; +#if WEBKIT_MAJOR_VERSION >= 2 && WEBKIT_MINOR_VERSION >= 22 + JSCValue* value = webkit_javascript_result_get_js_value(r); + s = jsc_value_to_string(value); +#else + JSGlobalContextRef ctx = webkit_javascript_result_get_global_context(r); + JSValueRef value = webkit_javascript_result_get_value(r); + JSStringRef js = JSValueToStringCopy(ctx, value, nullptr); + size_t n = JSStringGetMaximumUTF8CStringSize(js); + s = g_new(char, n); + JSStringGetUTF8CString(js, s, n); + JSStringRelease(js); +#endif + return s; + } + + GtkWidget* m_window; + GtkWidget* m_webview; + + void* navigateCallbackArg = nullptr; + std::function navigateCallback = nullptr; + + static void on_load_changed(WebKitWebView* web_view, WebKitLoadEvent load_event, + gpointer arg) + { + if (load_event == WEBKIT_LOAD_FINISHED) + { + auto inst = static_cast(arg); + inst->navigateCallback(webkit_web_view_get_uri(web_view), + inst->navigateCallbackArg); + } + } + }; + + } // namespace detail + + using browser_engine = detail::gtk_webkit_engine; + +} // namespace webview + +#elif defined(WEBVIEW_COCOA) + +// +// ==================================================================== +// +// This implementation uses Cocoa WKWebView backend on macOS. It is +// written using ObjC runtime and uses WKWebView class as a browser runtime. +// You should pass "-framework Webkit" flag to the compiler. +// +// ==================================================================== +// + +#include +#include +#include + +namespace webview +{ + namespace detail + { + namespace objc + { + + // A convenient template function for unconditionally casting the specified + // C-like function into a function that can be called with the given return + // type and arguments. Caller takes full responsibility for ensuring that + // the function call is valid. It is assumed that the function will not + // throw exceptions. + template + Result invoke(Callable callable, Args... args) noexcept + { + return reinterpret_cast(callable)(args...); + } + + // Calls objc_msgSend. + template Result msg_send(Args... args) noexcept + { + return invoke(objc_msgSend, args...); + } + + } // namespace objc + + enum NSBackingStoreType : NSUInteger + { + NSBackingStoreBuffered = 2 + }; + + enum NSWindowStyleMask : NSUInteger + { + NSWindowStyleMaskTitled = 1, + NSWindowStyleMaskClosable = 2, + NSWindowStyleMaskMiniaturizable = 4, + NSWindowStyleMaskResizable = 8 + }; + + enum NSApplicationActivationPolicy : NSInteger + { + NSApplicationActivationPolicyRegular = 0 + }; + + enum WKUserScriptInjectionTime : NSInteger + { + WKUserScriptInjectionTimeAtDocumentStart = 0 + }; + + enum NSModalResponse : NSInteger + { + NSModalResponseOK = 1 + }; + + // Convenient conversion of string literals. + inline id operator"" _cls(const char* s, std::size_t) + { + return (id)objc_getClass(s); + } + inline SEL operator"" _sel(const char* s, std::size_t) + { + return sel_registerName(s); + } + inline id operator"" _str(const char* s, std::size_t) + { + return objc::msg_send("NSString"_cls, "stringWithUTF8String:"_sel, s); + } + + class cocoa_wkwebview_engine + { + public: + cocoa_wkwebview_engine(bool debug, void* window) + : m_debug{ debug }, m_parent_window{ window } + { + auto app = get_shared_application(); + auto delegate = create_app_delegate(); + objc_setAssociatedObject(delegate, "webview", (id)this, OBJC_ASSOCIATION_ASSIGN); + objc::msg_send(app, "setDelegate:"_sel, delegate); + + // See comments related to application lifecycle in create_app_delegate(). + if (window) + { + on_application_did_finish_launching(delegate, app); + } + else + { + // Start the main run loop so that the app delegate gets the + // NSApplicationDidFinishLaunchingNotification notification after the run + // loop has started in order to perform further initialization. + // We need to return from this constructor so this run loop is only + // temporary. + objc::msg_send(app, "run"_sel); + } + } + virtual ~cocoa_wkwebview_engine() = default; + void* window() + { + return (void*)m_window; + } + void terminate() + { + auto app = get_shared_application(); + objc::msg_send(app, "terminate:"_sel, nullptr); + } + void run() + { + auto app = get_shared_application(); + objc::msg_send(app, "run"_sel); + } + void dispatch(std::function f) + { + dispatch_async_f(dispatch_get_main_queue(), new dispatch_fn_t(f), + (dispatch_function_t)([](void* arg) { + auto f = static_cast(arg); + (*f)(); + delete f; + })); + } + void set_title(const std::string& title) + { + objc::msg_send( + m_window, "setTitle:"_sel, + objc::msg_send("NSString"_cls, "stringWithUTF8String:"_sel, title.c_str())); + } + void set_size(int width, int height, int hints) + { + auto style = static_cast(NSWindowStyleMaskTitled | + NSWindowStyleMaskClosable | + NSWindowStyleMaskMiniaturizable); + if (hints != WEBVIEW_HINT_FIXED) + { + style = static_cast(style | NSWindowStyleMaskResizable); + } + objc::msg_send(m_window, "setStyleMask:"_sel, style); + + if (hints == WEBVIEW_HINT_MIN) + { + objc::msg_send(m_window, "setContentMinSize:"_sel, + CGSizeMake(width, height)); + } + else if (hints == WEBVIEW_HINT_MAX) + { + objc::msg_send(m_window, "setContentMaxSize:"_sel, + CGSizeMake(width, height)); + } + else + { + objc::msg_send(m_window, "setFrame:display:animate:"_sel, + CGRectMake(0, 0, width, height), YES, NO); + } + objc::msg_send(m_window, "center"_sel); + } + void navigate(const std::string& url) + { + auto nsurl = objc::msg_send( + "NSURL"_cls, "URLWithString:"_sel, + objc::msg_send("NSString"_cls, "stringWithUTF8String:"_sel, url.c_str())); + + objc::msg_send( + m_webview, "loadRequest:"_sel, + objc::msg_send("NSURLRequest"_cls, "requestWithURL:"_sel, nsurl)); + } + + void add_navigate_listener(std::function callback, + void* arg) + { + m_navigateCallback = callback; + m_navigateCallbackArg = arg; + } + + void set_html(const std::string& html) + { + objc::msg_send( + m_webview, "loadHTMLString:baseURL:"_sel, + objc::msg_send("NSString"_cls, "stringWithUTF8String:"_sel, html.c_str()), + nullptr); + } + void init(const std::string& js) + { + // Equivalent Obj-C: + // [m_manager addUserScript:[[WKUserScript alloc] initWithSource:[NSString + // stringWithUTF8String:js.c_str()] + // injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:YES]] + objc::msg_send( + m_manager, "addUserScript:"_sel, + objc::msg_send( + objc::msg_send("WKUserScript"_cls, "alloc"_sel), + "initWithSource:injectionTime:forMainFrameOnly:"_sel, + objc::msg_send("NSString"_cls, "stringWithUTF8String:"_sel, js.c_str()), + WKUserScriptInjectionTimeAtDocumentStart, YES)); + } + void eval(const std::string& js) + { + objc::msg_send( + m_webview, "evaluateJavaScript:completionHandler:"_sel, + objc::msg_send("NSString"_cls, "stringWithUTF8String:"_sel, js.c_str()), + nullptr); + } + + private: + virtual void on_message(const std::string& msg) = 0; + id create_app_delegate() + { + // Note: Avoid registering the class name "AppDelegate" as it is the + // default name in projects created with Xcode, and using the same name + // causes objc_registerClassPair to crash. + auto cls = + objc_allocateClassPair((Class) "NSResponder"_cls, "WebviewAppDelegate", 0); + class_addProtocol(cls, objc_getProtocol("NSTouchBarProvider")); + class_addMethod(cls, "applicationShouldTerminateAfterLastWindowClosed:"_sel, + (IMP)(+[](id, SEL, id) -> BOOL { return 1; }), "c@:@"); + // If the library was not initialized with an existing window then the user + // is likely managing the application lifecycle and we would not get the + // "applicationDidFinishLaunching:" message and therefore do not need to + // add this method. + if (!m_parent_window) + { + class_addMethod(cls, "applicationDidFinishLaunching:"_sel, + (IMP)(+[](id self, SEL, id notification) + { + auto app = + objc::msg_send(notification, "object"_sel); + auto w = get_associated_webview(self); + w->on_application_did_finish_launching(self, app); + }), + "v@:@"); + } + objc_registerClassPair(cls); + return objc::msg_send((id)cls, "new"_sel); + } + id create_script_message_handler() + { + auto cls = objc_allocateClassPair((Class) "NSResponder"_cls, + "WebkitScriptMessageHandler", 0); + class_addProtocol(cls, objc_getProtocol("WKScriptMessageHandler")); + class_addMethod( + cls, "userContentController:didReceiveScriptMessage:"_sel, + (IMP)(+[](id self, SEL, id, id msg) + { + auto w = get_associated_webview(self); + w->on_message(objc::msg_send( + objc::msg_send(msg, "body"_sel), "UTF8String"_sel)); + }), + "v@:@@"); + objc_registerClassPair(cls); + auto instance = objc::msg_send((id)cls, "new"_sel); + objc_setAssociatedObject(instance, "webview", (id)this, OBJC_ASSOCIATION_ASSIGN); + return instance; + } + static id create_webkit_ui_delegate() + { + auto cls = objc_allocateClassPair((Class) "NSObject"_cls, "WebkitUIDelegate", 0); + class_addProtocol(cls, objc_getProtocol("WKUIDelegate")); + class_addMethod( + cls, + "webView:runOpenPanelWithParameters:initiatedByFrame:completionHandler:"_sel, + (IMP)(+[](id, SEL, id, id parameters, id, id completion_handler) + { + auto allows_multiple_selection = + objc::msg_send(parameters, "allowsMultipleSelection"_sel); + auto allows_directories = + objc::msg_send(parameters, "allowsDirectories"_sel); + + // Show a panel for selecting files. + auto panel = objc::msg_send("NSOpenPanel"_cls, "openPanel"_sel); + objc::msg_send(panel, "setCanChooseFiles:"_sel, YES); + objc::msg_send(panel, "setCanChooseDirectories:"_sel, + allows_directories); + objc::msg_send(panel, "setAllowsMultipleSelection:"_sel, + allows_multiple_selection); + auto modal_response = + objc::msg_send(panel, "runModal"_sel); + + // Get the URLs for the selected files. If the modal was canceled + // then we pass null to the completion handler to signify + // cancellation. + id urls = modal_response == NSModalResponseOK + ? objc::msg_send(panel, "URLs"_sel) + : nullptr; + + // Invoke the completion handler block. + auto sig = objc::msg_send("NSMethodSignature"_cls, + "signatureWithObjCTypes:"_sel, "v@?@"); + auto invocation = objc::msg_send( + "NSInvocation"_cls, "invocationWithMethodSignature:"_sel, sig); + objc::msg_send(invocation, "setTarget:"_sel, + completion_handler); + objc::msg_send(invocation, "setArgument:atIndex:"_sel, &urls, + 1); + objc::msg_send(invocation, "invoke"_sel); + }), + "v@:@@@@"); + objc_registerClassPair(cls); + return objc::msg_send((id)cls, "new"_sel); + } + id create_webkit_navigation_delegate() + { + auto cls = + objc_allocateClassPair((Class) "NSObject"_cls, "WebkitNavigationDelegate", 0); + class_addProtocol(cls, objc_getProtocol("WKNavigationDelegate")); + class_addMethod(cls, "webView:didFinishNavigation:"_sel, + (IMP)(+[](id delegate, SEL sel, id webview, id navigation) + { + auto w = get_associated_webview(delegate); + auto url = objc::msg_send(webview, "URL"_sel); + auto nstr = objc::msg_send(url, "absoluteString"_sel); + auto str = objc::msg_send(nstr, "UTF8String"_sel); + w->m_navigateCallback(str, w->m_navigateCallbackArg); + }), + "v@:@"); + objc_registerClassPair(cls); + auto instance = objc::msg_send((id)cls, "new"_sel); + objc_setAssociatedObject(instance, "webview", (id)this, OBJC_ASSOCIATION_ASSIGN); + return instance; + } + static id get_shared_application() + { + return objc::msg_send("NSApplication"_cls, "sharedApplication"_sel); + } + static cocoa_wkwebview_engine* get_associated_webview(id object) + { + auto w = (cocoa_wkwebview_engine*)objc_getAssociatedObject(object, "webview"); + assert(w); + return w; + } + static id get_main_bundle() noexcept + { + return objc::msg_send("NSBundle"_cls, "mainBundle"_sel); + } + static bool is_app_bundled() noexcept + { + auto bundle = get_main_bundle(); + if (!bundle) + { + return false; + } + auto bundle_path = objc::msg_send(bundle, "bundlePath"_sel); + auto bundled = objc::msg_send(bundle_path, "hasSuffix:"_sel, ".app"_str); + return !!bundled; + } + void on_application_did_finish_launching(id /*delegate*/, id app) + { + // See comments related to application lifecycle in create_app_delegate(). + if (!m_parent_window) + { + // Stop the main run loop so that we can return + // from the constructor. + objc::msg_send(app, "stop:"_sel, nullptr); + } + + // Activate the app if it is not bundled. + // Bundled apps launched from Finder are activated automatically but + // otherwise not. Activating the app even when it has been launched from + // Finder does not seem to be harmful but calling this function is rarely + // needed as proper activation is normally taken care of for us. + // Bundled apps have a default activation policy of + // NSApplicationActivationPolicyRegular while non-bundled apps have a + // default activation policy of NSApplicationActivationPolicyProhibited. + if (!is_app_bundled()) + { + // "setActivationPolicy:" must be invoked before + // "activateIgnoringOtherApps:" for activation to work. + objc::msg_send(app, "setActivationPolicy:"_sel, + NSApplicationActivationPolicyRegular); + // Activate the app regardless of other active apps. + // This can be obtrusive so we only do it when necessary. + objc::msg_send(app, "activateIgnoringOtherApps:"_sel, YES); + } + + // Main window + if (!m_parent_window) + { + m_window = objc::msg_send("NSWindow"_cls, "alloc"_sel); + auto style = NSWindowStyleMaskTitled; + m_window = objc::msg_send( + m_window, "initWithContentRect:styleMask:backing:defer:"_sel, + CGRectMake(0, 0, 0, 0), style, NSBackingStoreBuffered, NO); + } + else + { + m_window = (id)m_parent_window; + } + + // Webview + auto config = objc::msg_send("WKWebViewConfiguration"_cls, "new"_sel); + m_manager = objc::msg_send(config, "userContentController"_sel); + m_webview = objc::msg_send("WKWebView"_cls, "alloc"_sel); + + if (m_debug) + { + // Equivalent Obj-C: + // [[config preferences] setValue:@YES forKey:@"developerExtrasEnabled"]; + objc::msg_send( + objc::msg_send(config, "preferences"_sel), "setValue:forKey:"_sel, + objc::msg_send("NSNumber"_cls, "numberWithBool:"_sel, YES), + "developerExtrasEnabled"_str); + } + + // Equivalent Obj-C: + // [[config preferences] setValue:@YES forKey:@"fullScreenEnabled"]; + objc::msg_send(objc::msg_send(config, "preferences"_sel), + "setValue:forKey:"_sel, + objc::msg_send("NSNumber"_cls, "numberWithBool:"_sel, YES), + "fullScreenEnabled"_str); + + // Equivalent Obj-C: + // [[config preferences] setValue:@YES forKey:@"javaScriptCanAccessClipboard"]; + objc::msg_send(objc::msg_send(config, "preferences"_sel), + "setValue:forKey:"_sel, + objc::msg_send("NSNumber"_cls, "numberWithBool:"_sel, YES), + "javaScriptCanAccessClipboard"_str); + + // Equivalent Obj-C: + // [[config preferences] setValue:@YES forKey:@"DOMPasteAllowed"]; + objc::msg_send(objc::msg_send(config, "preferences"_sel), + "setValue:forKey:"_sel, + objc::msg_send("NSNumber"_cls, "numberWithBool:"_sel, YES), + "DOMPasteAllowed"_str); + + auto ui_delegate = create_webkit_ui_delegate(); + objc::msg_send(m_webview, "initWithFrame:configuration:"_sel, + CGRectMake(0, 0, 0, 0), config); + objc::msg_send(m_webview, "setUIDelegate:"_sel, ui_delegate); + + auto navigation_delegate = create_webkit_navigation_delegate(); + objc::msg_send(m_webview, "setNavigationDelegate:"_sel, navigation_delegate); + auto script_message_handler = create_script_message_handler(); + objc::msg_send(m_manager, "addScriptMessageHandler:name:"_sel, + script_message_handler, "external"_str); + + init(R""( + window.external = { + invoke: function(s) { + window.webkit.messageHandlers.external.postMessage(s); + }, + }; + )""); + objc::msg_send(m_window, "setContentView:"_sel, m_webview); + objc::msg_send(m_window, "makeKeyAndOrderFront:"_sel, nullptr); + } + bool m_debug; + void* m_parent_window; + id m_window; + id m_webview; + id m_manager; + void* m_navigateCallbackArg = nullptr; + std::function m_navigateCallback = 0; + }; + + } // namespace detail + + using browser_engine = detail::cocoa_wkwebview_engine; + +} // namespace webview + +#elif defined(WEBVIEW_EDGE) + +// +// ==================================================================== +// +// This implementation uses Win32 API to create a native window. It +// uses Edge/Chromium webview2 backend as a browser engine. +// +// ==================================================================== +// + +#define WIN32_LEAN_AND_MEAN +#include +#include +#include +#include + +#include "WebView2.h" + +#ifdef _MSC_VER +#pragma comment(lib, "advapi32.lib") +#pragma comment(lib, "ole32.lib") +#pragma comment(lib, "shell32.lib") +#pragma comment(lib, "shlwapi.lib") +#pragma comment(lib, "user32.lib") +#pragma comment(lib, "version.lib") +#endif + +namespace webview +{ + namespace detail + { + + using msg_cb_t = std::function; + + // Converts a narrow (UTF-8-encoded) string into a wide (UTF-16-encoded) string. + inline std::wstring widen_string(const std::string& input) + { + if (input.empty()) + { + return std::wstring(); + } + UINT cp = CP_UTF8; + DWORD flags = MB_ERR_INVALID_CHARS; + auto input_c = input.c_str(); + auto input_length = static_cast(input.size()); + auto required_length = + MultiByteToWideChar(cp, flags, input_c, input_length, nullptr, 0); + if (required_length > 0) + { + std::wstring output(static_cast(required_length), L'\0'); + if (MultiByteToWideChar(cp, flags, input_c, input_length, &output[0], + required_length) > 0) + { + return output; + } + } + // Failed to convert string from UTF-8 to UTF-16 + return std::wstring(); + } + + // Converts a wide (UTF-16-encoded) string into a narrow (UTF-8-encoded) string. + inline std::string narrow_string(const std::wstring& input) + { + if (input.empty()) + { + return std::string(); + } + UINT cp = CP_UTF8; + DWORD flags = WC_ERR_INVALID_CHARS; + auto input_c = input.c_str(); + auto input_length = static_cast(input.size()); + auto required_length = + WideCharToMultiByte(cp, flags, input_c, input_length, nullptr, 0, nullptr, nullptr); + if (required_length > 0) + { + std::string output(static_cast(required_length), '\0'); + if (WideCharToMultiByte(cp, flags, input_c, input_length, &output[0], + required_length, nullptr, nullptr) > 0) + { + return output; + } + } + // Failed to convert string from UTF-16 to UTF-8 + return std::string(); + } + + // Parses a version string with 1-4 integral components, e.g. "1.2.3.4". + // Missing or invalid components default to 0, and excess components are ignored. + template + std::array parse_version(const std::basic_string& version) noexcept + { + auto parse_component = [](auto sb, auto se) -> unsigned int + { + try + { + auto n = std::stol(std::basic_string(sb, se)); + return n < 0 ? 0 : n; + } + catch (std::exception&) + { + return 0; + } + }; + auto end = version.end(); + auto sb = version.begin(); // subrange begin + auto se = sb; // subrange end + unsigned int ci = 0; // component index + std::array components{}; + while (sb != end && se != end && ci < components.size()) + { + if (*se == static_cast('.')) + { + components[ci++] = parse_component(sb, se); + sb = ++se; + continue; + } + ++se; + } + if (sb < se && ci < components.size()) + { + components[ci] = parse_component(sb, se); + } + return components; + } + + template + auto parse_version(const T (&version)[Length]) noexcept + { + return parse_version(std::basic_string(version, Length)); + } + + std::wstring get_file_version_string(const std::wstring& file_path) noexcept + { + DWORD dummy_handle; // Unused + DWORD info_buffer_length = GetFileVersionInfoSizeW(file_path.c_str(), &dummy_handle); + if (info_buffer_length == 0) + { + return std::wstring(); + } + std::vector info_buffer; + info_buffer.reserve(info_buffer_length); + if (!GetFileVersionInfoW(file_path.c_str(), 0, info_buffer_length, info_buffer.data())) + { + return std::wstring(); + } + auto sub_block = L"\\StringFileInfo\\040904B0\\ProductVersion"; + LPWSTR version = nullptr; + unsigned int version_length = 0; + if (!VerQueryValueW(info_buffer.data(), sub_block, reinterpret_cast(&version), + &version_length)) + { + return std::wstring(); + } + if (!version || version_length == 0) + { + return std::wstring(); + } + return std::wstring(version, version_length); + } + + // A wrapper around COM library initialization. Calls CoInitializeEx in the + // constructor and CoUninitialize in the destructor. + class com_init_wrapper + { + public: + com_init_wrapper(DWORD dwCoInit) + { + // We can safely continue as long as COM was either successfully + // initialized or already initialized. + // RPC_E_CHANGED_MODE means that CoInitializeEx was already called with + // a different concurrency model. + switch (CoInitializeEx(nullptr, dwCoInit)) + { + case S_OK: + case S_FALSE: + m_initialized = true; + break; + } + } + + ~com_init_wrapper() + { + if (m_initialized) + { + CoUninitialize(); + m_initialized = false; + } + } + + com_init_wrapper(const com_init_wrapper& other) = delete; + com_init_wrapper& operator=(const com_init_wrapper& other) = delete; + com_init_wrapper(com_init_wrapper&& other) = delete; + com_init_wrapper& operator=(com_init_wrapper&& other) = delete; + + bool is_initialized() const + { + return m_initialized; + } + + private: + bool m_initialized = false; + }; + + // Holds a symbol name and associated type for code clarity. + template class library_symbol + { + public: + using type = T; + + constexpr explicit library_symbol(const char* name) : m_name(name) + { + } + constexpr const char* get_name() const + { + return m_name; + } + + private: + const char* m_name; + }; + + // Loads a native shared library and allows one to get addresses for those + // symbols. + class native_library + { + public: + explicit native_library(const wchar_t* name) : m_handle(LoadLibraryW(name)) + { + } + + ~native_library() + { + if (m_handle) + { + FreeLibrary(m_handle); + m_handle = nullptr; + } + } + + native_library(const native_library& other) = delete; + native_library& operator=(const native_library& other) = delete; + native_library(native_library&& other) = default; + native_library& operator=(native_library&& other) = default; + + // Returns true if the library is currently loaded; otherwise false. + operator bool() const + { + return is_loaded(); + } + + // Get the address for the specified symbol or nullptr if not found. + template typename Symbol::type get(const Symbol& symbol) const + { + if (is_loaded()) + { + return reinterpret_cast( + GetProcAddress(m_handle, symbol.get_name())); + } + return nullptr; + } + + // Returns true if the library is currently loaded; otherwise false. + bool is_loaded() const + { + return !!m_handle; + } + + void detach() + { + m_handle = nullptr; + } + + private: + HMODULE m_handle = nullptr; + }; + + struct user32_symbols + { + using DPI_AWARENESS_CONTEXT = HANDLE; + using SetProcessDpiAwarenessContext_t = BOOL(WINAPI*)(DPI_AWARENESS_CONTEXT); + using SetProcessDPIAware_t = BOOL(WINAPI*)(); + + static constexpr auto SetProcessDpiAwarenessContext = + library_symbol("SetProcessDpiAwarenessContext"); + static constexpr auto SetProcessDPIAware = + library_symbol("SetProcessDPIAware"); + }; + + struct shcore_symbols + { + typedef enum + { + PROCESS_PER_MONITOR_DPI_AWARE = 2 + } PROCESS_DPI_AWARENESS; + using SetProcessDpiAwareness_t = HRESULT(WINAPI*)(PROCESS_DPI_AWARENESS); + + static constexpr auto SetProcessDpiAwareness = + library_symbol("SetProcessDpiAwareness"); + }; + + class reg_key + { + public: + explicit reg_key(HKEY root_key, const wchar_t* sub_key, DWORD options, + REGSAM sam_desired) + { + HKEY handle; + auto status = RegOpenKeyExW(root_key, sub_key, options, sam_desired, &handle); + if (status == ERROR_SUCCESS) + { + m_handle = handle; + } + } + + explicit reg_key(HKEY root_key, const std::wstring& sub_key, DWORD options, + REGSAM sam_desired) + : reg_key(root_key, sub_key.c_str(), options, sam_desired) + { + } + + virtual ~reg_key() + { + if (m_handle) + { + RegCloseKey(m_handle); + m_handle = nullptr; + } + } + + reg_key(const reg_key& other) = delete; + reg_key& operator=(const reg_key& other) = delete; + reg_key(reg_key&& other) = delete; + reg_key& operator=(reg_key&& other) = delete; + + bool is_open() const + { + return !!m_handle; + } + bool get_handle() const + { + return m_handle; + } + + std::wstring query_string(const wchar_t* name) const + { + DWORD buf_length = 0; + // Get the size of the data in bytes. + auto status = + RegQueryValueExW(m_handle, name, nullptr, nullptr, nullptr, &buf_length); + if (status != ERROR_SUCCESS && status != ERROR_MORE_DATA) + { + return std::wstring(); + } + // Read the data. + std::wstring result(buf_length / sizeof(wchar_t), 0); + auto buf = reinterpret_cast(&result[0]); + status = RegQueryValueExW(m_handle, name, nullptr, nullptr, buf, &buf_length); + if (status != ERROR_SUCCESS) + { + return std::wstring(); + } + // Remove trailing null-characters. + for (std::size_t length = result.size(); length > 0; --length) + { + if (result[length - 1] != 0) + { + result.resize(length); + break; + } + } + return result; + } + + private: + HKEY m_handle = nullptr; + }; + + inline bool enable_dpi_awareness() + { + auto user32 = native_library(L"user32.dll"); + if (auto fn = user32.get(user32_symbols::SetProcessDpiAwarenessContext)) + { + if (fn(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE)) + { + return true; + } + return GetLastError() == ERROR_ACCESS_DENIED; + } + if (auto shcore = native_library(L"shcore.dll")) + { + if (auto fn = shcore.get(shcore_symbols::SetProcessDpiAwareness)) + { + auto result = fn(shcore_symbols::PROCESS_PER_MONITOR_DPI_AWARE); + return result == S_OK || result == E_ACCESSDENIED; + } + } + if (auto fn = user32.get(user32_symbols::SetProcessDPIAware)) + { + return !!fn(); + } + return true; + } + +// Enable built-in WebView2Loader implementation by default. +#ifndef WEBVIEW_MSWEBVIEW2_BUILTIN_IMPL +#define WEBVIEW_MSWEBVIEW2_BUILTIN_IMPL 1 +#endif + +// Link WebView2Loader.dll explicitly by default only if the built-in +// implementation is enabled. +#ifndef WEBVIEW_MSWEBVIEW2_EXPLICIT_LINK +#define WEBVIEW_MSWEBVIEW2_EXPLICIT_LINK WEBVIEW_MSWEBVIEW2_BUILTIN_IMPL +#endif + +// Explicit linking of WebView2Loader.dll should be used along with +// the built-in implementation. +#if WEBVIEW_MSWEBVIEW2_BUILTIN_IMPL == 1 && WEBVIEW_MSWEBVIEW2_EXPLICIT_LINK != 1 +#undef WEBVIEW_MSWEBVIEW2_EXPLICIT_LINK +#error Please set WEBVIEW_MSWEBVIEW2_EXPLICIT_LINK=1. +#endif + +#if WEBVIEW_MSWEBVIEW2_BUILTIN_IMPL == 1 + // Gets the last component of a Windows native file path. + // For example, if the path is "C:\a\b" then the result is "b". + template + std::basic_string get_last_native_path_component(const std::basic_string& path) + { + if (auto pos = path.find_last_of(static_cast('\\')); + pos != std::basic_string::npos) + { + return path.substr(pos + 1); + } + return std::basic_string(); + } +#endif /* WEBVIEW_MSWEBVIEW2_BUILTIN_IMPL */ + + template struct cast_info_t + { + using type = T; + IID iid; + }; + + namespace mswebview2 + { + static constexpr IID IID_ICoreWebView2CreateCoreWebView2ControllerCompletedHandler{ + 0x6C4819F3, 0xC9B7, 0x4260, 0x81, 0x27, 0xC9, 0xF5, 0xBD, 0xE7, 0xF6, 0x8C + }; + static constexpr IID IID_ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler{ + 0x4E8A3389, 0xC9D8, 0x4BD2, 0xB6, 0xB5, 0x12, 0x4F, 0xEE, 0x6C, 0xC1, 0x4D + }; + static constexpr IID IID_ICoreWebView2PermissionRequestedEventHandler{ + 0x15E1C6A3, 0xC72A, 0x4DF3, 0x91, 0xD7, 0xD0, 0x97, 0xFB, 0xEC, 0x6B, 0xFD + }; + static constexpr IID IID_ICoreWebView2WebMessageReceivedEventHandler{ + 0x57213F19, 0x00E6, 0x49FA, 0x8E, 0x07, 0x89, 0x8E, 0xA0, 0x1E, 0xCB, 0xD2 + }; + +#if WEBVIEW_MSWEBVIEW2_BUILTIN_IMPL == 1 + enum class webview2_runtime_type + { + installed = 0, + embedded = 1 + }; + + namespace webview2_symbols + { + using CreateWebViewEnvironmentWithOptionsInternal_t = HRESULT(STDMETHODCALLTYPE*)( + bool, webview2_runtime_type, PCWSTR, IUnknown*, + ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler*); + using DllCanUnloadNow_t = HRESULT(STDMETHODCALLTYPE*)(); + + static constexpr auto CreateWebViewEnvironmentWithOptionsInternal = + library_symbol( + "CreateWebViewEnvironmentWithOptionsInternal"); + static constexpr auto DllCanUnloadNow = + library_symbol("DllCanUnloadNow"); + } // namespace webview2_symbols +#endif /* WEBVIEW_MSWEBVIEW2_BUILTIN_IMPL */ + +#if WEBVIEW_MSWEBVIEW2_EXPLICIT_LINK == 1 + namespace webview2_symbols + { + using CreateCoreWebView2EnvironmentWithOptions_t = HRESULT(STDMETHODCALLTYPE*)( + PCWSTR, PCWSTR, ICoreWebView2EnvironmentOptions*, + ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler*); + using GetAvailableCoreWebView2BrowserVersionString_t = + HRESULT(STDMETHODCALLTYPE*)(PCWSTR, LPWSTR*); + + static constexpr auto CreateCoreWebView2EnvironmentWithOptions = + library_symbol( + "CreateCoreWebView2EnvironmentWithOptions"); + static constexpr auto GetAvailableCoreWebView2BrowserVersionString = + library_symbol( + "GetAvailableCoreWebView2BrowserVersionString"); + } // namespace webview2_symbols +#endif /* WEBVIEW_MSWEBVIEW2_EXPLICIT_LINK */ + + class loader + { + public: + HRESULT create_environment_with_options( + PCWSTR browser_dir, PCWSTR user_data_dir, + ICoreWebView2EnvironmentOptions* env_options, + ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler* created_handler) + const + { +#if WEBVIEW_MSWEBVIEW2_EXPLICIT_LINK == 1 + if (m_lib.is_loaded()) + { + if (auto fn = m_lib.get( + webview2_symbols::CreateCoreWebView2EnvironmentWithOptions)) + { + return fn(browser_dir, user_data_dir, env_options, created_handler); + } + } +#if WEBVIEW_MSWEBVIEW2_BUILTIN_IMPL == 1 + return create_environment_with_options_impl(browser_dir, user_data_dir, + env_options, created_handler); +#else + return S_FALSE; +#endif +#else + return ::CreateCoreWebView2EnvironmentWithOptions(browser_dir, user_data_dir, + env_options, created_handler); +#endif /* WEBVIEW_MSWEBVIEW2_EXPLICIT_LINK */ + } + + HRESULT + get_available_browser_version_string(PCWSTR browser_dir, LPWSTR* version) const + { +#if WEBVIEW_MSWEBVIEW2_EXPLICIT_LINK == 1 + if (m_lib.is_loaded()) + { + if (auto fn = m_lib.get( + webview2_symbols::GetAvailableCoreWebView2BrowserVersionString)) + { + return fn(browser_dir, version); + } + } +#if WEBVIEW_MSWEBVIEW2_BUILTIN_IMPL == 1 + return get_available_browser_version_string_impl(browser_dir, version); +#else + return S_FALSE; +#endif +#else + return ::GetAvailableCoreWebView2BrowserVersionString(browser_dir, version); +#endif /* WEBVIEW_MSWEBVIEW2_EXPLICIT_LINK */ + } + + private: +#if WEBVIEW_MSWEBVIEW2_BUILTIN_IMPL == 1 + struct client_info_t + { + bool found = false; + std::wstring dll_path; + std::wstring version; + webview2_runtime_type runtime_type; + }; + + HRESULT create_environment_with_options_impl( + PCWSTR browser_dir, PCWSTR user_data_dir, + ICoreWebView2EnvironmentOptions* env_options, + ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler* created_handler) + const + { + auto found_client = find_available_client(browser_dir); + if (!found_client.found) + { + return -1; + } + auto client_dll = native_library(found_client.dll_path.c_str()); + if (auto fn = client_dll.get( + webview2_symbols::CreateWebViewEnvironmentWithOptionsInternal)) + { + return fn(true, found_client.runtime_type, user_data_dir, env_options, + created_handler); + } + if (auto fn = client_dll.get(webview2_symbols::DllCanUnloadNow)) + { + if (!fn()) + { + client_dll.detach(); + } + } + return ERROR_SUCCESS; + } + + HRESULT + get_available_browser_version_string_impl(PCWSTR browser_dir, LPWSTR* version) const + { + if (!version) + { + return -1; + } + auto found_client = find_available_client(browser_dir); + if (!found_client.found) + { + return -1; + } + auto info_length_bytes = + found_client.version.size() * sizeof(found_client.version[0]); + auto info = static_cast(CoTaskMemAlloc(info_length_bytes)); + if (!info) + { + return -1; + } + CopyMemory(info, found_client.version.c_str(), info_length_bytes); + *version = info; + return 0; + } + + client_info_t find_available_client(PCWSTR browser_dir) const + { + if (browser_dir) + { + return find_embedded_client(api_version, browser_dir); + } + auto found_client = + find_installed_client(api_version, true, default_release_channel_guid); + if (!found_client.found) + { + found_client = + find_installed_client(api_version, false, default_release_channel_guid); + } + return found_client; + } + + std::wstring make_client_dll_path(const std::wstring& dir) const + { + auto dll_path = dir; + if (!dll_path.empty()) + { + auto last_char = dir[dir.size() - 1]; + if (last_char != L'\\' && last_char != L'/') + { + dll_path += L'\\'; + } + } + dll_path += L"EBWebView\\"; +#if defined(_M_X64) || defined(__x86_64__) + dll_path += L"x64"; +#elif defined(_M_IX86) || defined(__i386__) + dll_path += L"x86"; +#elif defined(_M_ARM64) || defined(__aarch64__) + dll_path += L"arm64"; +#else +#error WebView2 integration for this platform is not yet supported. +#endif + dll_path += L"\\EmbeddedBrowserWebView.dll"; + return dll_path; + } + + client_info_t find_installed_client(unsigned int min_api_version, bool system, + const std::wstring& release_channel) const + { + std::wstring sub_key = client_state_reg_sub_key; + sub_key += release_channel; + auto root_key = system ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; + reg_key key(root_key, sub_key, 0, KEY_READ | KEY_WOW64_32KEY); + if (!key.is_open()) + { + return {}; + } + auto ebwebview_value = key.query_string(L"EBWebView"); + + auto client_version_string = get_last_native_path_component(ebwebview_value); + auto client_version = parse_version(client_version_string); + if (client_version[2] < min_api_version) + { + // Our API version is greater than the runtime API version. + return {}; + } + + auto client_dll_path = make_client_dll_path(ebwebview_value); + return { true, client_dll_path, client_version_string, + webview2_runtime_type::installed }; + } + + client_info_t find_embedded_client(unsigned int min_api_version, + const std::wstring& dir) const + { + auto client_dll_path = make_client_dll_path(dir); + + auto client_version_string = get_file_version_string(client_dll_path); + auto client_version = parse_version(client_version_string); + if (client_version[2] < min_api_version) + { + // Our API version is greater than the runtime API version. + return {}; + } + + return { true, client_dll_path, client_version_string, + webview2_runtime_type::embedded }; + } + + // The minimum WebView2 API version we need regardless of the SDK release + // actually used. The number comes from the SDK release version, + // e.g. 1.0.1150.38. To be safe the SDK should have a number that is greater + // than or equal to this number. The Edge browser webview client must + // have a number greater than or equal to this number. + static constexpr unsigned int api_version = 1150; + + static constexpr auto client_state_reg_sub_key = + L"SOFTWARE\\Microsoft\\EdgeUpdate\\ClientState\\"; + + // GUID for the stable release channel. + static constexpr auto stable_release_guid = + L"{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}"; + + static constexpr auto default_release_channel_guid = stable_release_guid; +#endif /* WEBVIEW_MSWEBVIEW2_BUILTIN_IMPL */ + +#if WEBVIEW_MSWEBVIEW2_EXPLICIT_LINK == 1 + native_library m_lib{ L"WebView2Loader.dll" }; +#endif + }; + + namespace cast_info + { + static constexpr auto controller_completed = + cast_info_t{ + IID_ICoreWebView2CreateCoreWebView2ControllerCompletedHandler + }; + + static constexpr auto environment_completed = + cast_info_t{ + IID_ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler + }; + + static constexpr auto message_received = + cast_info_t{ + IID_ICoreWebView2WebMessageReceivedEventHandler + }; + + static constexpr auto permission_requested = + cast_info_t{ + IID_ICoreWebView2PermissionRequestedEventHandler + }; + } // namespace cast_info + } // namespace mswebview2 + + class webview2_com_handler + : public ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler, + public ICoreWebView2CreateCoreWebView2ControllerCompletedHandler, + public ICoreWebView2WebMessageReceivedEventHandler, + public ICoreWebView2PermissionRequestedEventHandler, + public ICoreWebView2NavigationCompletedEventHandler + { + using webview2_com_handler_cb_t = + std::function; + + public: + webview2_com_handler(HWND hwnd, msg_cb_t msgCb, webview2_com_handler_cb_t cb) + : m_window(hwnd), m_msgCb(msgCb), m_cb(cb) + { + } + + virtual ~webview2_com_handler() = default; + webview2_com_handler(const webview2_com_handler& other) = delete; + webview2_com_handler& operator=(const webview2_com_handler& other) = delete; + webview2_com_handler(webview2_com_handler&& other) = delete; + webview2_com_handler& operator=(webview2_com_handler&& other) = delete; + + ULONG STDMETHODCALLTYPE AddRef() + { + return ++m_ref_count; + } + ULONG STDMETHODCALLTYPE Release() + { + if (m_ref_count > 1) + { + return --m_ref_count; + } + delete this; + return 0; + } + HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, LPVOID* ppv) + { + using namespace mswebview2::cast_info; + + if (!ppv) + { + return E_POINTER; + } + + // All of the COM interfaces we implement should be added here regardless + // of whether they are required. + // This is just to be on the safe side in case the WebView2 Runtime ever + // requests a pointer to an interface we implement. + // The WebView2 Runtime must at the very least be able to get a pointer to + // ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler when we use + // our custom WebView2 loader implementation, and observations have shown + // that it is the only interface requested in this case. None have been + // observed to be requested when using the official WebView2 loader. + + if (cast_if_equal_iid(riid, controller_completed, ppv) || + cast_if_equal_iid(riid, environment_completed, ppv) || + cast_if_equal_iid(riid, message_received, ppv) || + cast_if_equal_iid(riid, permission_requested, ppv)) + { + return S_OK; + } + + return E_NOINTERFACE; + } + HRESULT STDMETHODCALLTYPE Invoke(HRESULT res, ICoreWebView2Environment* env) + { + if (SUCCEEDED(res)) + { + res = env->CreateCoreWebView2Controller(m_window, this); + if (SUCCEEDED(res)) + { + return S_OK; + } + } + try_create_environment(); + return S_OK; + } + HRESULT STDMETHODCALLTYPE Invoke(HRESULT res, ICoreWebView2Controller* controller) + { + if (FAILED(res)) + { + // See try_create_environment() regarding + // HRESULT_FROM_WIN32(ERROR_INVALID_STATE). + // The result is E_ABORT if the parent window has been destroyed already. + switch (res) + { + case HRESULT_FROM_WIN32(ERROR_INVALID_STATE): + case E_ABORT: + return S_OK; + } + try_create_environment(); + return S_OK; + } + + ICoreWebView2* webview; + ::EventRegistrationToken token; + controller->get_CoreWebView2(&webview); + webview->add_WebMessageReceived(this, &token); + webview->add_PermissionRequested(this, &token); + webview->add_NavigationCompleted(this, &token); + + m_cb(controller, webview); + return S_OK; + } + HRESULT STDMETHODCALLTYPE Invoke(ICoreWebView2* sender, + ICoreWebView2WebMessageReceivedEventArgs* args) + { + LPWSTR message; + args->TryGetWebMessageAsString(&message); + m_msgCb(narrow_string(message)); + sender->PostWebMessageAsString(message); + + CoTaskMemFree(message); + return S_OK; + } + HRESULT STDMETHODCALLTYPE Invoke(ICoreWebView2* sender, + ICoreWebView2PermissionRequestedEventArgs* args) + { + COREWEBVIEW2_PERMISSION_KIND kind; + args->get_PermissionKind(&kind); + if (kind == COREWEBVIEW2_PERMISSION_KIND_CLIPBOARD_READ) + { + args->put_State(COREWEBVIEW2_PERMISSION_STATE_ALLOW); + } + return S_OK; + } + HRESULT STDMETHODCALLTYPE Invoke(ICoreWebView2* sender, + ICoreWebView2NavigationCompletedEventArgs* args) + { + PWSTR uri = nullptr; + auto hr = sender->get_Source(&uri); + if (SUCCEEDED(hr)) + { + auto curi = std::wstring_convert >().to_bytes(uri); + if (navigateCallback) + navigateCallback(curi, navigateCallbackArg); + } + CoTaskMemFree(uri); + return hr; + } + + // Checks whether the specified IID equals the IID of the specified type and + // if so casts the "this" pointer to T and returns it. Returns nullptr on + // mismatching IIDs. + // If ppv is specified then the pointer will also be assigned to *ppv. + template + T* cast_if_equal_iid(REFIID riid, const cast_info_t& info, + LPVOID* ppv = nullptr) noexcept + { + T* ptr = nullptr; + if (IsEqualIID(riid, info.iid)) + { + ptr = static_cast(this); + ptr->AddRef(); + } + if (ppv) + { + *ppv = ptr; + } + return ptr; + } + + // Set the function that will perform the initiating logic for creating + // the WebView2 environment. + void set_attempt_handler(std::function attempt_handler) noexcept + { + m_attempt_handler = attempt_handler; + } + + // Retry creating a WebView2 environment. + // The initiating logic for creating the environment is defined by the + // caller of set_attempt_handler(). + void try_create_environment() noexcept + { + // WebView creation fails with HRESULT_FROM_WIN32(ERROR_INVALID_STATE) if + // a running instance using the same user data folder exists, and the + // Environment objects have different EnvironmentOptions. + // Source: + // https://docs.microsoft.com/en-us/microsoft-edge/webview2/reference/win32/icorewebview2environment?view=webview2-1.0.1150.38 + if (m_attempts < m_max_attempts) + { + ++m_attempts; + auto res = m_attempt_handler(); + if (SUCCEEDED(res)) + { + return; + } + // Not entirely sure if this error code only applies to + // CreateCoreWebView2Controller so we check here as well. + if (res == HRESULT_FROM_WIN32(ERROR_INVALID_STATE)) + { + return; + } + try_create_environment(); + return; + } + // Give up. + m_cb(nullptr, nullptr); + } + + void STDMETHODCALLTYPE add_navigate_listener( + std::function callback, void* arg) + { + navigateCallback = std::move(callback); + navigateCallbackArg = arg; + } + + private: + HWND m_window; + msg_cb_t m_msgCb; + webview2_com_handler_cb_t m_cb; + std::atomic m_ref_count{ 1 }; + std::function m_attempt_handler; + unsigned int m_max_attempts = 5; + unsigned int m_attempts = 0; + void* navigateCallbackArg = nullptr; + std::function navigateCallback = 0; + }; + + class win32_edge_engine + { + public: + win32_edge_engine(bool debug, void* window) + { + if (!is_webview2_available()) + { + return; + } + if (!m_com_init.is_initialized()) + { + return; + } + enable_dpi_awareness(); + if (window == nullptr) + { + HINSTANCE hInstance = GetModuleHandle(nullptr); + HICON icon = (HICON)LoadImage(hInstance, IDI_APPLICATION, IMAGE_ICON, + GetSystemMetrics(SM_CXICON), + GetSystemMetrics(SM_CYICON), LR_DEFAULTCOLOR); + + WNDCLASSEXW wc; + ZeroMemory(&wc, sizeof(WNDCLASSEX)); + wc.cbSize = sizeof(WNDCLASSEX); + wc.hInstance = hInstance; + wc.lpszClassName = L"webview"; + wc.hIcon = icon; + wc.lpfnWndProc = + (WNDPROC)(+[](HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) -> LRESULT + { + auto w = + (win32_edge_engine*)GetWindowLongPtr(hwnd, GWLP_USERDATA); + switch (msg) + { + case WM_SIZE: + w->resize(hwnd); + break; + case WM_CLOSE: + DestroyWindow(hwnd); + break; + case WM_DESTROY: + w->terminate(); + break; + case WM_GETMINMAXINFO: + { + auto lpmmi = (LPMINMAXINFO)lp; + if (w == nullptr) + { + return 0; + } + if (w->m_maxsz.x > 0 && w->m_maxsz.y > 0) + { + lpmmi->ptMaxSize = w->m_maxsz; + lpmmi->ptMaxTrackSize = w->m_maxsz; + } + if (w->m_minsz.x > 0 && w->m_minsz.y > 0) + { + lpmmi->ptMinTrackSize = w->m_minsz; + } + } + break; + default: + return DefWindowProcW(hwnd, msg, wp, lp); + } + return 0; + }); + RegisterClassExW(&wc); + m_window = CreateWindowW(L"webview", L"", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, + CW_USEDEFAULT, 640, 480, nullptr, nullptr, hInstance, + nullptr); + if (m_window == nullptr) + { + return; + } + SetWindowLongPtr(m_window, GWLP_USERDATA, (LONG_PTR)this); + } + else + { + m_window = *(static_cast(window)); + } + + ShowWindow(m_window, SW_SHOW); + UpdateWindow(m_window); + SetFocus(m_window); + + auto cb = std::bind(&win32_edge_engine::on_message, this, std::placeholders::_1); + + embed(m_window, debug, cb); + resize(m_window); + m_controller->MoveFocus(COREWEBVIEW2_MOVE_FOCUS_REASON_PROGRAMMATIC); + } + + virtual ~win32_edge_engine() + { + if (m_com_handler) + { + m_com_handler->Release(); + m_com_handler = nullptr; + } + if (m_webview) + { + m_webview->Release(); + m_webview = nullptr; + } + if (m_controller) + { + m_controller->Release(); + m_controller = nullptr; + } + } + + win32_edge_engine(const win32_edge_engine& other) = delete; + win32_edge_engine& operator=(const win32_edge_engine& other) = delete; + win32_edge_engine(win32_edge_engine&& other) = delete; + win32_edge_engine& operator=(win32_edge_engine&& other) = delete; + + void run() + { + MSG msg; + BOOL res; + while ((res = GetMessage(&msg, nullptr, 0, 0)) != -1) + { + if (msg.hwnd) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + continue; + } + if (msg.message == WM_APP) + { + auto f = (dispatch_fn_t*)(msg.lParam); + (*f)(); + delete f; + } + else if (msg.message == WM_QUIT) + { + return; + } + } + } + void* window() + { + return (void*)m_window; + } + void terminate() + { + PostQuitMessage(0); + } + void dispatch(dispatch_fn_t f) + { + PostThreadMessage(m_main_thread, WM_APP, 0, (LPARAM) new dispatch_fn_t(f)); + } + + void set_title(const std::string& title) + { + SetWindowTextW(m_window, widen_string(title).c_str()); + } + + void set_size(int width, int height, int hints) + { + auto style = GetWindowLong(m_window, GWL_STYLE); + if (hints == WEBVIEW_HINT_FIXED) + { + style &= ~(WS_THICKFRAME | WS_MAXIMIZEBOX); + } + else + { + style |= (WS_THICKFRAME | WS_MAXIMIZEBOX); + } + SetWindowLong(m_window, GWL_STYLE, style); + + if (hints == WEBVIEW_HINT_MAX) + { + m_maxsz.x = width; + m_maxsz.y = height; + } + else if (hints == WEBVIEW_HINT_MIN) + { + m_minsz.x = width; + m_minsz.y = height; + } + else + { + RECT r; + r.left = r.top = 0; + r.right = width; + r.bottom = height; + AdjustWindowRect(&r, WS_OVERLAPPEDWINDOW, 0); + SetWindowPos(m_window, nullptr, r.left, r.top, r.right - r.left, + r.bottom - r.top, + SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE | SWP_FRAMECHANGED); + resize(m_window); + } + } + + void navigate(const std::string& url) + { + auto wurl = widen_string(url); + m_webview->Navigate(wurl.c_str()); + } + + void init(const std::string& js) + { + auto wjs = widen_string(js); + m_webview->AddScriptToExecuteOnDocumentCreated(wjs.c_str(), nullptr); + } + + void eval(const std::string& js) + { + auto wjs = widen_string(js); + m_webview->ExecuteScript(wjs.c_str(), nullptr); + } + + void add_navigate_listener(std::function callback, + void* arg) + { + m_com_handler->add_navigate_listener(callback, arg); + } + + void set_html(const std::string& html) + { + m_webview->NavigateToString(widen_string(html).c_str()); + } + + private: + bool embed(HWND wnd, bool debug, msg_cb_t cb) + { + std::atomic_flag flag = ATOMIC_FLAG_INIT; + flag.test_and_set(); + + wchar_t currentExePath[MAX_PATH]; + GetModuleFileNameW(nullptr, currentExePath, MAX_PATH); + wchar_t* currentExeName = PathFindFileNameW(currentExePath); + + wchar_t dataPath[MAX_PATH]; + if (!SUCCEEDED(SHGetFolderPathW(nullptr, CSIDL_APPDATA, nullptr, 0, dataPath))) + { + return false; + } + wchar_t userDataFolder[MAX_PATH]; + PathCombineW(userDataFolder, dataPath, currentExeName); + + m_com_handler = new webview2_com_handler( + wnd, cb, + [&](ICoreWebView2Controller* controller, ICoreWebView2* webview) + { + if (!controller || !webview) + { + flag.clear(); + return; + } + controller->AddRef(); + webview->AddRef(); + m_controller = controller; + m_webview = webview; + flag.clear(); + }); + + m_com_handler->set_attempt_handler( + [&] + { + return m_webview2_loader.create_environment_with_options( + nullptr, userDataFolder, nullptr, m_com_handler); + }); + m_com_handler->try_create_environment(); + + MSG msg = {}; + while (flag.test_and_set() && GetMessage(&msg, nullptr, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + if (!m_controller || !m_webview) + { + return false; + } + ICoreWebView2Settings* settings = nullptr; + auto res = m_webview->get_Settings(&settings); + if (res != S_OK) + { + return false; + } + res = settings->put_AreDevToolsEnabled(debug ? TRUE : FALSE); + if (res != S_OK) + { + return false; + } + init("window.external={invoke:s=>window.chrome.webview.postMessage(s)}"); + return true; + } + + void resize(HWND wnd) + { + if (m_controller == nullptr) + { + return; + } + RECT bounds; + GetClientRect(wnd, &bounds); + m_controller->put_Bounds(bounds); + } + + bool is_webview2_available() const noexcept + { + LPWSTR version_info = nullptr; + auto res = + m_webview2_loader.get_available_browser_version_string(nullptr, &version_info); + // The result will be equal to HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) + // if the WebView2 runtime is not installed. + auto ok = SUCCEEDED(res) && version_info; + if (version_info) + { + CoTaskMemFree(version_info); + } + return ok; + } + + virtual void on_message(const std::string& msg) = 0; + + // The app is expected to call CoInitializeEx before + // CreateCoreWebView2EnvironmentWithOptions. + // Source: + // https://docs.microsoft.com/en-us/microsoft-edge/webview2/reference/win32/webview2-idl#createcorewebview2environmentwithoptions + com_init_wrapper m_com_init{ COINIT_APARTMENTTHREADED }; + HWND m_window = nullptr; + POINT m_minsz = POINT{ 0, 0 }; + POINT m_maxsz = POINT{ 0, 0 }; + DWORD m_main_thread = GetCurrentThreadId(); + ICoreWebView2* m_webview = nullptr; + ICoreWebView2Controller* m_controller = nullptr; + webview2_com_handler* m_com_handler = nullptr; + mswebview2::loader m_webview2_loader; + }; + + } // namespace detail + + using browser_engine = detail::win32_edge_engine; + +} // namespace webview + +#endif /* WEBVIEW_GTK, WEBVIEW_COCOA, WEBVIEW_EDGE */ + +namespace webview +{ + + class webview : public browser_engine + { + public: + webview(bool debug = false, void* wnd = nullptr) : browser_engine(debug, wnd) + { + } + + void navigate(const std::string& url) + { + if (url.empty()) + { + browser_engine::navigate("about:blank"); + return; + } + browser_engine::navigate(url); + } + + using binding_t = std::function; + class binding_ctx_t + { + public: + binding_ctx_t(binding_t callback, void* arg) : callback(callback), arg(arg) + { + } + // This function is called upon execution of the bound JS function + binding_t callback; + // This user-supplied argument is passed to the callback + void* arg; + }; + + using sync_binding_t = std::function; + + // Synchronous bind + void bind(const std::string& name, sync_binding_t fn) + { + auto wrapper = [this, fn](const std::string& seq, const std::string& req, void* /*arg*/) + { resolve(seq, 0, fn(req)); }; + bind(name, wrapper, nullptr); + } + + // Asynchronous bind + void bind(const std::string& name, binding_t fn, void* arg) + { + if (bindings.count(name) > 0) + { + return; + } + bindings.emplace(name, binding_ctx_t(fn, arg)); + auto js = "(function() { var name = '" + name + "';" + R""( + var RPC = window._rpc = (window._rpc || {nextSeq: 1}); + window[name] = function() { + var seq = RPC.nextSeq++; + var promise = new Promise(function(resolve, reject) { + RPC[seq] = { + resolve: resolve, + reject: reject, + }; + }); + window.external.invoke(JSON.stringify({ + id: seq, + method: name, + params: Array.prototype.slice.call(arguments), + })); + return promise; + } + })())""; + init(js); + eval(js); + } + + void unbind(const std::string& name) + { + auto found = bindings.find(name); + if (found != bindings.end()) + { + auto js = "delete window['" + name + "'];"; + init(js); + eval(js); + bindings.erase(found); + } + } + + void resolve(const std::string& seq, int status, const std::string& result) + { + dispatch( + [seq, status, result, this]() + { + if (status == 0) + { + eval("window._rpc[" + seq + "].resolve(" + result + + "); delete window._rpc[" + seq + "]"); + } + else + { + eval("window._rpc[" + seq + "].reject(" + result + + "); delete window._rpc[" + seq + "]"); + } + }); + } + + private: + void on_message(const std::string& msg) override + { + auto seq = detail::json_parse(msg, "id", 0); + auto name = detail::json_parse(msg, "method", 0); + auto args = detail::json_parse(msg, "params", 0); + auto found = bindings.find(name); + if (found == bindings.end()) + { + return; + } + const auto& context = found->second; + context.callback(seq, args, context.arg); + } + + std::map bindings; + }; +} // namespace webview + +WEBVIEW_API webview_t webview_create(int debug, void* wnd) +{ + auto w = new webview::webview(debug, wnd); + if (!w->window()) + { + delete w; + return nullptr; + } + return w; +} + +WEBVIEW_API void webview_destroy(webview_t w) +{ + delete static_cast(w); +} + +WEBVIEW_API void webview_run(webview_t w) +{ + static_cast(w)->run(); +} + +WEBVIEW_API void webview_terminate(webview_t w) +{ + static_cast(w)->terminate(); +} + +WEBVIEW_API void webview_dispatch(webview_t w, void (*fn)(webview_t, void*), void* arg) +{ + static_cast(w)->dispatch([=]() { fn(w, arg); }); +} + +WEBVIEW_API void* webview_get_window(webview_t w) +{ + return static_cast(w)->window(); +} + +WEBVIEW_API void webview_set_title(webview_t w, const char* title) +{ + static_cast(w)->set_title(title); +} + +WEBVIEW_API void webview_set_size(webview_t w, int width, int height, int hints) +{ + static_cast(w)->set_size(width, height, hints); +} + +WEBVIEW_API void webview_navigate(webview_t w, const char* url) +{ + static_cast(w)->navigate(url); +} + +WEBVIEW_API void webview_set_html(webview_t w, const char* html) +{ + static_cast(w)->set_html(html); +} + +WEBVIEW_API void webview_init(webview_t w, const char* js) +{ + static_cast(w)->init(js); +} + +WEBVIEW_API void webview_eval(webview_t w, const char* js) +{ + static_cast(w)->eval(js); +} + +WEBVIEW_API void webview_bind(webview_t w, const char* name, + void (*fn)(const char* seq, const char* req, void* arg), void* arg) +{ + static_cast(w)->bind( + name, + [=](const std::string& seq, const std::string& req, void* arg) + { fn(seq.c_str(), req.c_str(), arg); }, + arg); +} + +WEBVIEW_API void webview_unbind(webview_t w, const char* name) +{ + static_cast(w)->unbind(name); +} + +WEBVIEW_API void webview_return(webview_t w, const char* seq, int status, const char* result) +{ + static_cast(w)->resolve(seq, status, result); +} + +WEBVIEW_API const webview_version_info_t* webview_version() +{ + return &webview::detail::library_version_info; +} + +#endif /* WEBVIEW_HEADER */ +#endif /* __cplusplus */ +#endif /* WEBVIEW_H */ diff --git a/client/SDL3/aad/wrapper/webview_impl.cpp b/client/SDL3/aad/wrapper/webview_impl.cpp new file mode 100644 index 000000000..5f4d3d597 --- /dev/null +++ b/client/SDL3/aad/wrapper/webview_impl.cpp @@ -0,0 +1,82 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Popup browser for AAD authentication + * + * Copyright 2023 Isaac Klein + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "webview.h" + +#include +#include +#include +#include +#include +#include +#include "../webview_impl.hpp" + +static std::vector split(const std::string& input, const std::string& regex) +{ + // passing -1 as the submatch index parameter performs splitting + std::regex re(regex); + std::sregex_token_iterator first{ input.begin(), input.end(), re, -1 }; + std::sregex_token_iterator last; + return { first, last }; +} + +static std::map urlsplit(const std::string& url) +{ + auto pos = url.find("?"); + if (pos == std::string::npos) + return {}; + auto surl = url.substr(pos); + auto args = split(surl, "&"); + + std::map argmap; + for (const auto& arg : args) + { + auto kv = split(arg, "="); + if (kv.size() == 2) + argmap.insert({ kv[0], kv[1] }); + } + return argmap; +} + +static void fkt(const std::string& url, void* arg) +{ + auto args = urlsplit(url); + auto val = args.find("code"); + if (val == args.end()) + return; + + assert(arg); + auto rcode = static_cast(arg); + *rcode = val->second; +} + +bool webview_impl_run(const std::string& title, const std::string& url, std::string& code) +{ + webview::webview w(false, nullptr); + + w.set_title(title); + w.set_size(640, 480, WEBVIEW_HINT_NONE); + + std::string scheme; + w.add_scheme_handler("ms-appx-web", fkt, &scheme); + w.add_navigate_listener(fkt, &code); + w.navigate(url); + w.run(); + return !code.empty(); +} diff --git a/client/SDL/dialogs/CMakeLists.txt b/client/SDL3/dialogs/CMakeLists.txt similarity index 93% rename from client/SDL/dialogs/CMakeLists.txt rename to client/SDL3/dialogs/CMakeLists.txt index 4cf2a1682..2989b6373 100644 --- a/client/SDL/dialogs/CMakeLists.txt +++ b/client/SDL3/dialogs/CMakeLists.txt @@ -20,7 +20,7 @@ set(SRCS ) list(APPEND LIBS - sdl_client_res + sdl3_client_res winpr ) @@ -64,11 +64,11 @@ endif() add_subdirectory(res) -add_library(dialogs STATIC +add_library(sdl3-dialogs STATIC ${SRCS} ) -target_link_libraries(dialogs PRIVATE ${LIBS}) +target_link_libraries(sdl3-dialogs PRIVATE ${LIBS}) if(BUILD_TESTING) # add_subdirectory(test) diff --git a/client/SDL/dialogs/font/OFL.txt b/client/SDL3/dialogs/font/OFL.txt similarity index 100% rename from client/SDL/dialogs/font/OFL.txt rename to client/SDL3/dialogs/font/OFL.txt diff --git a/client/SDL/dialogs/font/OpenSans-Italic-VariableFont_wdth,wght.ttf b/client/SDL3/dialogs/font/OpenSans-Italic-VariableFont_wdth,wght.ttf similarity index 100% rename from client/SDL/dialogs/font/OpenSans-Italic-VariableFont_wdth,wght.ttf rename to client/SDL3/dialogs/font/OpenSans-Italic-VariableFont_wdth,wght.ttf diff --git a/client/SDL/dialogs/font/OpenSans-VariableFont_wdth,wght.ttf b/client/SDL3/dialogs/font/OpenSans-VariableFont_wdth,wght.ttf similarity index 100% rename from client/SDL/dialogs/font/OpenSans-VariableFont_wdth,wght.ttf rename to client/SDL3/dialogs/font/OpenSans-VariableFont_wdth,wght.ttf diff --git a/client/SDL/dialogs/font/README.txt b/client/SDL3/dialogs/font/README.txt similarity index 100% rename from client/SDL/dialogs/font/README.txt rename to client/SDL3/dialogs/font/README.txt diff --git a/client/SDL3/dialogs/res/CMakeLists.txt b/client/SDL3/dialogs/res/CMakeLists.txt new file mode 100644 index 000000000..39b18a497 --- /dev/null +++ b/client/SDL3/dialogs/res/CMakeLists.txt @@ -0,0 +1,89 @@ + +add_executable(sdl3-res2bin + convert_res_to_c.cpp +) + +set(SRCS + sdl_resource_manager.cpp + sdl_resource_manager.hpp +) + +set(RES_SVG_FILES + ${CMAKE_SOURCE_DIR}/resources/FreeRDP_Icon.svg + ${CMAKE_SOURCE_DIR}/resources/icon_info.svg + ${CMAKE_SOURCE_DIR}/resources/icon_warning.svg + ${CMAKE_SOURCE_DIR}/resources/icon_error.svg +) + +set(RES_FONT_FILES + ${CMAKE_SOURCE_DIR}/resources/font/OpenSans-VariableFont_wdth,wght.ttf +) + +macro(convert_to_bin FILE FILE_TYPE) + get_filename_component(FILE_NAME ${FILE} NAME) + string(REGEX REPLACE "[^a-zA-Z0-9]" "_" TARGET_NAME ${FILE_NAME}) + + set(FILE_BIN_DIR ${CMAKE_CURRENT_BINARY_DIR}/bin) + set(FILE_BYPRODUCTS ${FILE_BIN_DIR}/${TARGET_NAME}.hpp ${FILE_BIN_DIR}/${TARGET_NAME}.cpp) + + list(APPEND FACTORY_SRCS + ${FILE_BYPRODUCTS} + ) + + add_custom_command( + OUTPUT ${FILE_BYPRODUCTS} + COMMAND ${CMAKE_COMMAND} -E make_directory ${FILE_BIN_DIR} + COMMAND $ ${FILE} ${FILE_TYPE} ${TARGET_NAME} ${FILE_BIN_DIR} + COMMENT "create image resources" + DEPENDS sdl3-res2bin + DEPENDS ${FILE} + ) +endmacro() + +option(SDL_USE_COMPILED_RESOURCES "Compile in images/fonts" ON) + +if (SDL_USE_COMPILED_RESOURCES) + list(APPEND SRCS + sdl_resource_file.cpp + sdl_resource_file.hpp + ) + + include_directories(${CMAKE_CURRENT_SOURCE_DIR}) + + if (WITH_SDL_IMAGE_DIALOGS) + foreach(FILE ${RES_SVG_FILES}) + convert_to_bin("${FILE}" "images") + endforeach() + endif() + + foreach(FILE ${RES_FONT_FILES}) + convert_to_bin("${FILE}" "fonts") + endforeach() + add_definitions(-DSDL_USE_COMPILED_RESOURCES) +else() + set(SDL_RESOURCE_ROOT ${CMAKE_INSTALL_FULL_DATAROOTDIR}/FreeRDP) + if (WITH_BINARY_VERSIONING) + string(APPEND SDL_RESOURCE_ROOT "${PROJECT_VERSION_MAJOR}") + endif() + + add_definitions(-DSDL_RESOURCE_ROOT="${SDL_RESOURCE_ROOT}") + + if (WITH_SDL_IMAGE_DIALOGS) + install( + FILES ${RES_SVG_FILES} + DESTINATION ${SDL_RESOURCE_ROOT}/images + ) + endif() + + install( + FILES ${RES_FONT_FILES} + DESTINATION ${SDL_RESOURCE_ROOT}/fonts + ) +endif() + +add_library(sdl3_client_res OBJECT + ${RES_FILES} + ${SRCS} + ${FACTORY_SRCS} +) +set_property(TARGET sdl3_client_res PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/SDL3/dialogs/res/convert_res_to_c.cpp b/client/SDL3/dialogs/res/convert_res_to_c.cpp new file mode 100644 index 000000000..8ef828adf --- /dev/null +++ b/client/SDL3/dialogs/res/convert_res_to_c.cpp @@ -0,0 +1,190 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * + * Copyright 2023 Armin Novak + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include +#if __has_include() +#include +namespace fs = std::filesystem; +#elif __has_include() +#include +namespace fs = std::experimental::filesystem; +#else +#error Could not find system header "" or "" +#endif + +static void usage(const char* prg) +{ + std::cerr << prg << " " << std::endl; +} + +static int write_comment_header(std::ostream& out, const fs::path& prg, const std::string& fname) +{ + out << "/* AUTOGENERATED file, do not edit" << std::endl + << " *" << std::endl + << " * generated by '" << prg.filename() << "'" << std::endl + << " *" << std::endl + << " * contains the converted file '" << fname << "'" << std::endl + << " */" << std::endl + << std::endl; + return 0; +} + +static int write_cpp_header(std::ostream& out, const fs::path& prg, const fs::path& file, + const std::string& name, const std::string& type) +{ + auto fname = file.filename().string(); + auto rc = write_comment_header(out, prg, fname); + if (rc != 0) + return rc; + + out << "#include " << std::endl + << "#include \"" << name << ".hpp\"" << std::endl + << std::endl + << "std::string " << name << "::name() {" << std::endl + << "return \"" << fname << "\";" << std::endl + << "}" << std::endl + << "std::string " << name << "::type() {" << std::endl + << "return \"" << type << "\";" << std::endl + << "}" << std::endl + << std::endl + << "const SDLResourceFile " << name << "::_initializer(type(), name(), init());" + << std::endl + << std::endl + << "std::vector " << name << "::init() {" << std::endl + << "static const unsigned char data[] = {" << std::endl; + + return 0; +} + +static int readwrite(std::ofstream& out, std::ifstream& ifs) +{ + size_t pos = 0; + char c = 0; + + std::ios backup(nullptr); + backup.copyfmt(out); + + while (ifs.read(&c, 1) && ifs.good()) + { + unsigned val = c & 0xff; + out << "0x" << std::hex << std::setfill('0') << std::setw(2) << val; + if (ifs.peek() != EOF) + out << ","; + if ((pos++ % 16) == 15) + out << std::endl; + } + + out.copyfmt(backup); + + return 0; +} + +static int write_cpp_trailer(std::ostream& out) +{ + out << std::endl; + out << "};" << std::endl; + out << std::endl; + out << "return std::vector(data, data + sizeof(data));" << std::endl; + out << "}" << std::endl; + return 0; +} + +static int write_hpp_header(const fs::path& prg, const fs::path& file, const std::string& name, + const std::string& fname) +{ + std::ofstream out(file, std::ios::out); + if (!out.is_open()) + { + std::cerr << "Failed to open output file '" << file << "'" << std::endl; + return -1; + } + auto rc = write_comment_header(out, prg, fname); + if (rc != 0) + return rc; + + out << "#pragma once" << std::endl + << std::endl + << "#include " << std::endl + << "#include " << std::endl + << "#include \"sdl_resource_file.hpp\"" << std::endl + << std::endl + << "class " << name << " {" << std::endl + << "public:" << std::endl + << name << "() = delete;" << std::endl + << std::endl + << "static std::string name();" << std::endl + << "static std::string type();" << std::endl + << std::endl + << "private:" << std::endl + << "static std::vector init();" << std::endl + << "static const SDLResourceFile _initializer;" << std::endl + << std::endl + << "};" << std::endl; + return 0; +} + +int main(int argc, char* argv[]) +{ + fs::path prg(argv[0]); + if (argc != 5) + { + usage(argv[0]); + return -1; + } + + fs::path file(argv[1]); + std::string etype = argv[2]; + std::string cname = argv[3]; + fs::path dst(argv[4]); + fs::path hdr(argv[4]); + + dst /= cname + ".cpp"; + hdr /= cname + ".hpp"; + + std::ofstream out; + out.open(dst); + if (!out.is_open()) + { + std::cerr << "Failed to open output file '" << dst << "'" << std::endl; + return -2; + } + + std::ifstream ifs(file, std::ios::in | std::ios::binary); + if (!ifs.is_open()) + { + std::cerr << "Failed to open input file '" << file << "'" << std::endl; + return -3; + } + + auto rc = write_cpp_header(out, prg, file, cname, etype); + if (rc != 0) + return -1; + + rc = readwrite(out, ifs); + if (rc != 0) + return rc; + + rc = write_cpp_trailer(out); + if (rc != 0) + return rc; + return write_hpp_header(prg, hdr, cname, file.filename().string()); +} diff --git a/client/SDL3/dialogs/res/sdl_resource_file.cpp b/client/SDL3/dialogs/res/sdl_resource_file.cpp new file mode 100644 index 000000000..c48612d92 --- /dev/null +++ b/client/SDL3/dialogs/res/sdl_resource_file.cpp @@ -0,0 +1,25 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * + * Copyright 2023 Armin Novak + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "sdl_resource_file.hpp" +#include "sdl_resource_manager.hpp" + +SDLResourceFile::SDLResourceFile(const std::string& type, const std::string& id, + const std::vector& data) +{ + SDLResourceManager::insert(type, id, data); +} diff --git a/client/SDL3/dialogs/res/sdl_resource_file.hpp b/client/SDL3/dialogs/res/sdl_resource_file.hpp new file mode 100644 index 000000000..5846921d1 --- /dev/null +++ b/client/SDL3/dialogs/res/sdl_resource_file.hpp @@ -0,0 +1,33 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * + * Copyright 2023 Armin Novak + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#pragma once + +#include +#include + +class SDLResourceFile +{ + public: + SDLResourceFile(const std::string& type, const std::string& id, + const std::vector& data); + virtual ~SDLResourceFile() = default; + + private: + SDLResourceFile(const SDLResourceFile& other) = delete; + SDLResourceFile(const SDLResourceFile&& other) = delete; +}; diff --git a/client/SDL3/dialogs/res/sdl_resource_manager.cpp b/client/SDL3/dialogs/res/sdl_resource_manager.cpp new file mode 100644 index 000000000..0f0682a8f --- /dev/null +++ b/client/SDL3/dialogs/res/sdl_resource_manager.cpp @@ -0,0 +1,78 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * + * Copyright 2023 Armin Novak + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "sdl_resource_manager.hpp" +#include +#if __has_include() +#include +namespace fs = std::filesystem; +#elif __has_include() +#include +namespace fs = std::experimental::filesystem; +#else +#error Could not find system header "" or "" +#endif + +SDL_RWops* SDLResourceManager::get(const std::string& type, const std::string& id) +{ + std::string uuid = type + "/" + id; + +#if defined(SDL_USE_COMPILED_RESOURCES) + auto val = resources().find(uuid); + if (val == resources().end()) + return nullptr; + + const auto& v = val->second; + return SDL_RWFromConstMem(v.data(), v.size()); +#else + fs::path path(SDL_RESOURCE_ROOT); + path /= type; + path /= id; + + if (!fs::exists(path)) + { + std::cerr << "sdl-freerdp expects resource '" << uuid << "' at location " + << fs::absolute(path) << std::endl; + std::cerr << "file not found, application will fail" << std::endl; + } + return SDL_RWFromFile(path.u8string().c_str(), "rb"); +#endif +} + +const std::string SDLResourceManager::typeFonts() +{ + return "fonts"; +} + +const std::string SDLResourceManager::typeImages() +{ + return "images"; +} + +void SDLResourceManager::insert(const std::string& type, const std::string& id, + const std::vector& data) +{ + std::string uuid = type + "/" + id; + resources().emplace(uuid, data); +} + +std::map>& SDLResourceManager::resources() +{ + + static std::map> resources = {}; + return resources; +} diff --git a/client/SDL3/dialogs/res/sdl_resource_manager.hpp b/client/SDL3/dialogs/res/sdl_resource_manager.hpp new file mode 100644 index 000000000..b4f463c21 --- /dev/null +++ b/client/SDL3/dialogs/res/sdl_resource_manager.hpp @@ -0,0 +1,46 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * + * Copyright 2023 Armin Novak + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#pragma once + +#include +#include +#include +#include + +class SDLResourceManager +{ + friend class SDLResourceFile; + + public: + static SDL_RWops* get(const std::string& type, const std::string& id); + + static const std::string typeFonts(); + static const std::string typeImages(); + + protected: + static void insert(const std::string& type, const std::string& id, + const std::vector& data); + + private: + SDLResourceManager() = delete; + SDLResourceManager(const SDLResourceManager& other) = delete; + SDLResourceManager(const SDLResourceManager&& other) = delete; + ~SDLResourceManager() = delete; + + static std::map>& resources(); +}; diff --git a/client/SDL3/dialogs/sdl_button.cpp b/client/SDL3/dialogs/sdl_button.cpp new file mode 100644 index 000000000..cfa210718 --- /dev/null +++ b/client/SDL3/dialogs/sdl_button.cpp @@ -0,0 +1,71 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * SDL Client Channels + * + * Copyright 2023 Armin Novak + * Copyright 2023 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include "sdl_button.hpp" + +static const SDL_Color buttonbackgroundcolor = { 0x69, 0x66, 0x63, 0xff }; +static const SDL_Color buttonhighlightcolor = { 0xcd, 0xca, 0x35, 0x60 }; +static const SDL_Color buttonmouseovercolor = { 0x66, 0xff, 0x66, 0x60 }; +static const SDL_Color buttonfontcolor = { 0xd1, 0xcf, 0xcd, 0xff }; + +SdlButton::SdlButton(SDL_Renderer* renderer, const std::string& label, int id, const SDL_Rect& rect) + : SdlWidget(renderer, rect, false), _name(label), _id(id) +{ + assert(renderer); + + update_text(renderer, _name, buttonfontcolor, buttonbackgroundcolor); +} + +SdlButton::SdlButton(SdlButton&& other) noexcept + : SdlWidget(std::move(other)), _name(std::move(other._name)), _id(std::move(other._id)) +{ +} + +bool SdlButton::highlight(SDL_Renderer* renderer) +{ + assert(renderer); + + std::vector colors = { buttonbackgroundcolor, buttonhighlightcolor }; + if (!fill(renderer, colors)) + return false; + return update_text(renderer, _name, buttonfontcolor); +} + +bool SdlButton::mouseover(SDL_Renderer* renderer) +{ + std::vector colors = { buttonbackgroundcolor, buttonmouseovercolor }; + if (!fill(renderer, colors)) + return false; + return update_text(renderer, _name, buttonfontcolor); +} + +bool SdlButton::update(SDL_Renderer* renderer) +{ + assert(renderer); + + return update_text(renderer, _name, buttonfontcolor, buttonbackgroundcolor); +} + +int SdlButton::id() const +{ + return _id; +} diff --git a/client/SDL3/dialogs/sdl_button.hpp b/client/SDL3/dialogs/sdl_button.hpp new file mode 100644 index 000000000..350e7db6a --- /dev/null +++ b/client/SDL3/dialogs/sdl_button.hpp @@ -0,0 +1,26 @@ +#pragma once + +#include + +#include "sdl_widget.hpp" + +class SdlButton : public SdlWidget +{ + public: + SdlButton(SDL_Renderer* renderer, const std::string& label, int id, const SDL_Rect& rect); + SdlButton(SdlButton&& other) noexcept; + ~SdlButton() override = default; + + bool highlight(SDL_Renderer* renderer); + bool mouseover(SDL_Renderer* renderer); + bool update(SDL_Renderer* renderer); + + [[nodiscard]] int id() const; + + private: + SdlButton(const SdlButton& other) = delete; + + private: + std::string _name; + int _id; +}; diff --git a/client/SDL3/dialogs/sdl_buttons.cpp b/client/SDL3/dialogs/sdl_buttons.cpp new file mode 100644 index 000000000..8190cbe6d --- /dev/null +++ b/client/SDL3/dialogs/sdl_buttons.cpp @@ -0,0 +1,105 @@ +#include +#include + +#include "sdl_buttons.hpp" + +static const Uint32 hpadding = 10; + +bool SdlButtonList::populate(SDL_Renderer* renderer, const std::vector& labels, + const std::vector& ids, Sint32 total_width, Sint32 offsetY, + Sint32 width, Sint32 height) +{ + assert(renderer); + assert(width >= 0); + assert(height >= 0); + assert(labels.size() == ids.size()); + + _list.clear(); + size_t button_width = ids.size() * (width + hpadding) + hpadding; + size_t offsetX = total_width - std::min(total_width, button_width); + for (size_t x = 0; x < ids.size(); x++) + { + const size_t curOffsetX = offsetX + x * (static_cast(width) + hpadding); + const SDL_Rect rect = { static_cast(curOffsetX), offsetY, width, height }; + _list.emplace_back(renderer, labels[x], ids[x], rect); + } + return true; +} + +SdlButton* SdlButtonList::get_selected(const SDL_MouseButtonEvent& button) +{ + const Sint32 x = button.x; + const Sint32 y = button.y; + + return get_selected(x, y); +} + +SdlButton* SdlButtonList::get_selected(Sint32 x, Sint32 y) +{ + for (auto& btn : _list) + { + auto r = btn.rect(); + if ((x >= r.x) && (x <= r.x + r.w) && (y >= r.y) && (y <= r.y + r.h)) + return &btn; + } + return nullptr; +} + +bool SdlButtonList::set_highlight_next(bool reset) +{ + if (reset) + _highlighted = nullptr; + else + { + auto next = _highlight_index++; + _highlight_index %= _list.size(); + auto& element = _list[next]; + _highlighted = &element; + } + return true; +} + +bool SdlButtonList::set_highlight(size_t index) +{ + if (index >= _list.size()) + { + _highlighted = nullptr; + return false; + } + auto& element = _list[index]; + _highlighted = &element; + _highlight_index = ++index % _list.size(); + return true; +} + +bool SdlButtonList::set_mouseover(Sint32 x, Sint32 y) +{ + _mouseover = get_selected(x, y); + return _mouseover != nullptr; +} + +void SdlButtonList::clear() +{ + _list.clear(); + _mouseover = nullptr; + _highlighted = nullptr; + _highlight_index = 0; +} + +bool SdlButtonList::update(SDL_Renderer* renderer) +{ + assert(renderer); + + for (auto& btn : _list) + { + if (!btn.update(renderer)) + return false; + } + + if (_highlighted) + _highlighted->highlight(renderer); + + if (_mouseover) + _mouseover->mouseover(renderer); + return true; +} diff --git a/client/SDL3/dialogs/sdl_buttons.hpp b/client/SDL3/dialogs/sdl_buttons.hpp new file mode 100644 index 000000000..7f8290352 --- /dev/null +++ b/client/SDL3/dialogs/sdl_buttons.hpp @@ -0,0 +1,37 @@ +#pragma once + +#include +#include + +#include "sdl_button.hpp" + +class SdlButtonList +{ + public: + SdlButtonList() = default; + virtual ~SdlButtonList() = default; + + bool populate(SDL_Renderer* renderer, const std::vector& labels, + const std::vector& ids, Sint32 total_width, Sint32 offsetY, Sint32 width, + Sint32 heigth); + + bool update(SDL_Renderer* renderer); + SdlButton* get_selected(const SDL_MouseButtonEvent& button); + SdlButton* get_selected(Sint32 x, Sint32 y); + + bool set_highlight_next(bool reset = false); + bool set_highlight(size_t index); + bool set_mouseover(Sint32 x, Sint32 y); + + void clear(); + + private: + SdlButtonList(const SdlButtonList& other) = delete; + SdlButtonList(SdlButtonList&& other) = delete; + + private: + std::vector _list; + SdlButton* _highlighted = nullptr; + size_t _highlight_index = 0; + SdlButton* _mouseover = nullptr; +}; diff --git a/client/SDL3/dialogs/sdl_connection_dialog.cpp b/client/SDL3/dialogs/sdl_connection_dialog.cpp new file mode 100644 index 000000000..fa638591d --- /dev/null +++ b/client/SDL3/dialogs/sdl_connection_dialog.cpp @@ -0,0 +1,541 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * SDL Client helper dialogs + * + * Copyright 2023 Armin Novak + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include +#include + +#include "sdl_connection_dialog.hpp" +#include "../sdl_utils.hpp" +#include "../sdl_freerdp.hpp" +#include "res/sdl_resource_manager.hpp" + +static const SDL_Color backgroundcolor = { 0x38, 0x36, 0x35, 0xff }; +static const SDL_Color textcolor = { 0xd1, 0xcf, 0xcd, 0xff }; +static const SDL_Color infocolor = { 0x43, 0xe0, 0x0f, 0x60 }; +static const SDL_Color warncolor = { 0xcd, 0xca, 0x35, 0x60 }; +static const SDL_Color errorcolor = { 0xf7, 0x22, 0x30, 0x60 }; + +static const Uint32 vpadding = 5; +static const Uint32 hpadding = 5; + +SDLConnectionDialog::SDLConnectionDialog(rdpContext* context) + : _context(context), _window(nullptr), _renderer(nullptr) +{ + SDL_Init(SDL_INIT_TIMER | SDL_INIT_VIDEO); + hide(); +} + +SDLConnectionDialog::~SDLConnectionDialog() +{ + resetTimer(); + destroyWindow(); + SDL_Quit(); +} + +bool SDLConnectionDialog::visible() const +{ + if (!_window || !_renderer) + return false; + + auto flags = SDL_GetWindowFlags(_window); + return (flags & (SDL_WINDOW_HIDDEN | SDL_WINDOW_MINIMIZED)) == 0; +} + +bool SDLConnectionDialog::setTitle(const char* fmt, ...) +{ + std::lock_guard lock(_mux); + va_list ap; + va_start(ap, fmt); + _title = print(fmt, ap); + va_end(ap); + + return show(MSG_NONE); +} + +bool SDLConnectionDialog::showInfo(const char* fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + auto rc = show(MSG_INFO, fmt, ap); + va_end(ap); + return rc; +} + +bool SDLConnectionDialog::showWarn(const char* fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + auto rc = show(MSG_WARN, fmt, ap); + va_end(ap); + return rc; +} + +bool SDLConnectionDialog::showError(const char* fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + auto rc = show(MSG_ERROR, fmt, ap); + va_end(ap); + return setTimer(); +} + +bool SDLConnectionDialog::show() +{ + std::lock_guard lock(_mux); + return show(_type_active); +} + +bool SDLConnectionDialog::hide() +{ + std::lock_guard lock(_mux); + return show(MSG_DISCARD); +} + +bool SDLConnectionDialog::running() const +{ + std::lock_guard lock(_mux); + return _running; +} + +bool SDLConnectionDialog::update() +{ + std::lock_guard lock(_mux); + switch (_type) + { + case MSG_INFO: + case MSG_WARN: + case MSG_ERROR: + _type_active = _type; + createWindow(); + break; + case MSG_DISCARD: + resetTimer(); + destroyWindow(); + break; + default: + if (_window) + { + SDL_SetWindowTitle(_window, _title.c_str()); + } + break; + } + _type = MSG_NONE; + return true; +} + +bool SDLConnectionDialog::setModal() +{ + if (_window) + { + auto sdl = get_context(_context); + if (sdl->windows.empty()) + return true; + + auto parent = sdl->windows.begin()->second.window(); + SDL_SetWindowModalFor(_window, parent); + SDL_RaiseWindow(_window); + } + return true; +} + +bool SDLConnectionDialog::clearWindow(SDL_Renderer* renderer) +{ + assert(renderer); + + const int drc = SDL_SetRenderDrawColor(renderer, backgroundcolor.r, backgroundcolor.g, + backgroundcolor.b, backgroundcolor.a); + if (widget_log_error(drc, "SDL_SetRenderDrawColor")) + return false; + + const int rcls = SDL_RenderClear(renderer); + return !widget_log_error(rcls, "SDL_RenderClear"); +} + +bool SDLConnectionDialog::update(SDL_Renderer* renderer) +{ + std::lock_guard lock(_mux); + if (!renderer) + return false; + + if (!clearWindow(renderer)) + return false; + + for (auto& btn : _list) + { + if (!btn.widget.update_text(renderer, _msg, btn.fgcolor, btn.bgcolor)) + return false; + } + + if (!_buttons.update(renderer)) + return false; + + SDL_RenderPresent(renderer); + return true; +} + +bool SDLConnectionDialog::wait(bool ignoreRdpContext) +{ + while (running()) + { + if (!ignoreRdpContext) + { + if (freerdp_shall_disconnect_context(_context)) + return false; + } + std::this_thread::yield(); + } + return true; +} + +bool SDLConnectionDialog::handle(const SDL_Event& event) +{ + Uint32 windowID = 0; + if (_window) + { + windowID = SDL_GetWindowID(_window); + } + + switch (event.type) + { + case SDL_USEREVENT_RETRY_DIALOG: + return update(); + case SDL_QUIT: + resetTimer(); + destroyWindow(); + return false; + case SDL_KEYDOWN: + case SDL_KEYUP: + if (visible()) + { + auto& ev = reinterpret_cast(event); + update(_renderer); + switch (event.key.keysym.sym) + { + case SDLK_RETURN: + case SDLK_RETURN2: + case SDLK_ESCAPE: + case SDLK_KP_ENTER: + if (event.type == SDL_KEYUP) + { + freerdp_abort_event(_context); + sdl_push_quit(); + } + break; + case SDLK_TAB: + _buttons.set_highlight_next(); + break; + default: + break; + } + + return windowID == ev.windowID; + } + return false; + case SDL_MOUSEMOTION: + if (visible()) + { + auto& ev = reinterpret_cast(event); + + _buttons.set_mouseover(event.button.x, event.button.y); + update(_renderer); + return windowID == ev.windowID; + } + return false; + case SDL_MOUSEBUTTONDOWN: + case SDL_MOUSEBUTTONUP: + if (visible()) + { + auto& ev = reinterpret_cast(event); + update(_renderer); + + auto button = _buttons.get_selected(event.button); + if (button) + { + if (event.type == SDL_MOUSEBUTTONUP) + { + freerdp_abort_event(_context); + sdl_push_quit(); + } + } + + return windowID == ev.windowID; + } + return false; + case SDL_MOUSEWHEEL: + if (visible()) + { + auto& ev = reinterpret_cast(event); + update(_renderer); + return windowID == ev.windowID; + } + return false; + case SDL_FINGERUP: + case SDL_FINGERDOWN: + if (visible()) + { + auto& ev = reinterpret_cast(event); + update(_renderer); +#if SDL_VERSION_ATLEAST(2, 0, 18) + return windowID == ev.windowID; +#else + return false; +#endif + } + return false; + case SDL_WINDOWEVENT: + { + auto& ev = reinterpret_cast(event); + switch (ev.event) + { + case SDL_WINDOWEVENT_CLOSE: + if (windowID == ev.windowID) + { + freerdp_abort_event(_context); + sdl_push_quit(); + } + break; + default: + update(_renderer); + setModal(); + break; + } + + return windowID == ev.windowID; + } + default: + return false; + } +} + +bool SDLConnectionDialog::createWindow() +{ + destroyWindow(); + + const size_t widget_height = 50; + const size_t widget_width = 600; + const size_t total_height = 300; + + _window = SDL_CreateWindow( + _title.c_str(), SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, widget_width, + total_height, SDL_WINDOW_ALLOW_HIGHDPI | SDL_WINDOW_MOUSE_FOCUS | SDL_WINDOW_INPUT_FOCUS); + if (_window == nullptr) + { + widget_log_error(-1, "SDL_CreateWindow"); + return false; + } + setModal(); + + _renderer = SDL_CreateRenderer(_window, -1, SDL_RENDERER_ACCELERATED); + if (_renderer == nullptr) + { + widget_log_error(-1, "SDL_CreateRenderer"); + return false; + } + + SDL_Color res_bgcolor; + switch (_type_active) + { + case MSG_INFO: + res_bgcolor = infocolor; + break; + case MSG_WARN: + res_bgcolor = warncolor; + break; + case MSG_ERROR: + res_bgcolor = errorcolor; + break; + case MSG_DISCARD: + default: + res_bgcolor = backgroundcolor; + break; + } + +#if defined(WITH_SDL_IMAGE_DIALOGS) + std::string res_name; + switch (_type_active) + { + case MSG_INFO: + res_name = "icon_info.svg"; + break; + case MSG_WARN: + res_name = "icon_warning.svg"; + break; + case MSG_ERROR: + res_name = "icon_error.svg"; + break; + case MSG_DISCARD: + default: + res_name = ""; + break; + } + + int height = (total_height - 3ul * vpadding) / 2ul; + SDL_Rect iconRect{ hpadding, vpadding, widget_width / 4ul - 2ul * hpadding, height }; + widget_cfg_t icon{ textcolor, + res_bgcolor, + { _renderer, iconRect, + SDLResourceManager::get(SDLResourceManager::typeImages(), res_name) } }; + _list.emplace_back(std::move(icon)); + + iconRect.y += height; + + widget_cfg_t logo{ textcolor, + backgroundcolor, + { _renderer, iconRect, + SDLResourceManager::get(SDLResourceManager::typeImages(), + "FreeRDP_Icon.svg") } }; + _list.emplace_back(std::move(logo)); + + SDL_Rect rect = { widget_width / 4ul, vpadding, widget_width * 3ul / 4ul, + total_height - 3ul * vpadding - widget_height }; +#else + SDL_Rect rect = { hpadding, vpadding, widget_width - 2ul * hpadding, + total_height - 2ul * vpadding }; +#endif + + widget_cfg_t w{ textcolor, backgroundcolor, { _renderer, rect, false } }; + w.widget.set_wrap(true, widget_width); + _list.emplace_back(std::move(w)); + rect.y += widget_height + vpadding; + + const std::vector buttonids = { 1 }; + const std::vector buttonlabels = { "cancel" }; + _buttons.populate(_renderer, buttonlabels, buttonids, widget_width, + total_height - widget_height - vpadding, + static_cast(widget_width / 2), static_cast(widget_height)); + _buttons.set_highlight(0); + + SDL_ShowWindow(_window); + SDL_RaiseWindow(_window); + + return true; +} + +void SDLConnectionDialog::destroyWindow() +{ + _buttons.clear(); + _list.clear(); + SDL_DestroyRenderer(_renderer); + SDL_DestroyWindow(_window); + _renderer = nullptr; + _window = nullptr; +} + +bool SDLConnectionDialog::show(MsgType type, const char* fmt, va_list ap) +{ + std::lock_guard lock(_mux); + _msg = print(fmt, ap); + return show(type); +} + +bool SDLConnectionDialog::show(MsgType type) +{ + _type = type; + return sdl_push_user_event(SDL_USEREVENT_RETRY_DIALOG); +} + +std::string SDLConnectionDialog::print(const char* fmt, va_list ap) +{ + int size = -1; + std::string res; + + do + { + res.resize(128); + if (size > 0) + res.resize(size); + + va_list copy; + va_copy(copy, ap); + size = vsnprintf(res.data(), res.size(), fmt, copy); + va_end(copy); + + } while ((size > 0) && (size > res.size())); + + return res; +} + +bool SDLConnectionDialog::setTimer(Uint32 timeoutMS) +{ + std::lock_guard lock(_mux); + resetTimer(); + + _timer = SDL_AddTimer(timeoutMS, &SDLConnectionDialog::timeout, this); + _running = true; + return true; +} + +void SDLConnectionDialog::resetTimer() +{ + if (_running) + SDL_RemoveTimer(_timer); + _running = false; +} + +Uint32 SDLConnectionDialog::timeout(Uint32 intervalMS, void* pvthis) +{ + auto ths = static_cast(pvthis); + ths->hide(); + ths->_running = false; + return 0; +} + +SDLConnectionDialogHider::SDLConnectionDialogHider(freerdp* instance) + : SDLConnectionDialogHider(get(instance)) +{ +} + +SDLConnectionDialogHider::SDLConnectionDialogHider(rdpContext* context) + : SDLConnectionDialogHider(get(context)) +{ +} + +SDLConnectionDialogHider::SDLConnectionDialogHider(SDLConnectionDialog* dialog) : _dialog(dialog) +{ + if (_dialog) + { + _visible = _dialog->visible(); + if (_visible) + { + _dialog->hide(); + } + } +} + +SDLConnectionDialogHider::~SDLConnectionDialogHider() +{ + if (_dialog && _visible) + { + _dialog->show(); + } +} + +SDLConnectionDialog* SDLConnectionDialogHider::get(freerdp* instance) +{ + if (!instance) + return nullptr; + return get(instance->context); +} + +SDLConnectionDialog* SDLConnectionDialogHider::get(rdpContext* context) +{ + auto sdl = get_context(context); + if (!sdl) + return nullptr; + return sdl->connection_dialog.get(); +} diff --git a/client/SDL3/dialogs/sdl_connection_dialog.hpp b/client/SDL3/dialogs/sdl_connection_dialog.hpp new file mode 100644 index 000000000..57e5596b8 --- /dev/null +++ b/client/SDL3/dialogs/sdl_connection_dialog.hpp @@ -0,0 +1,129 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * SDL Client helper dialogs + * + * Copyright 2023 Armin Novak + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include +#include +#include +#include + +#include + +#include + +#include "sdl_widget.hpp" +#include "sdl_buttons.hpp" + +class SDLConnectionDialog +{ + public: + explicit SDLConnectionDialog(rdpContext* context); + SDLConnectionDialog(const SDLConnectionDialog& other) = delete; + SDLConnectionDialog(const SDLConnectionDialog&& other) = delete; + virtual ~SDLConnectionDialog(); + + bool visible() const; + + bool setTitle(const char* fmt, ...); + bool showInfo(const char* fmt, ...); + bool showWarn(const char* fmt, ...); + bool showError(const char* fmt, ...); + + bool show(); + bool hide(); + + bool running() const; + bool wait(bool ignoreRdpContextQuit = false); + + bool handle(const SDL_Event& event); + + private: + enum MsgType + { + MSG_NONE, + MSG_INFO, + MSG_WARN, + MSG_ERROR, + MSG_DISCARD + }; + + private: + bool createWindow(); + void destroyWindow(); + + bool update(); + + bool setModal(); + + bool clearWindow(SDL_Renderer* renderer); + + bool update(SDL_Renderer* renderer); + + bool show(MsgType type, const char* fmt, va_list ap); + bool show(MsgType type); + + std::string print(const char* fmt, va_list ap); + bool setTimer(Uint32 timeoutMS = 15000); + void resetTimer(); + + private: + static Uint32 timeout(Uint32 intervalMS, void* _this); + + private: + struct widget_cfg_t + { + SDL_Color fgcolor = {}; + SDL_Color bgcolor = {}; + SdlWidget widget; + }; + + private: + rdpContext* _context = nullptr; + SDL_Window* _window = nullptr; + SDL_Renderer* _renderer = nullptr; + mutable std::mutex _mux; + std::string _title; + std::string _msg; + MsgType _type = MSG_NONE; + MsgType _type_active = MSG_NONE; + SDL_TimerID _timer = -1; + bool _running = false; + std::vector _list; + SdlButtonList _buttons; +}; + +class SDLConnectionDialogHider +{ + public: + explicit SDLConnectionDialogHider(freerdp* instance); + explicit SDLConnectionDialogHider(rdpContext* context); + + explicit SDLConnectionDialogHider(SDLConnectionDialog* dialog); + + ~SDLConnectionDialogHider(); + + private: + SDLConnectionDialog* get(freerdp* instance); + SDLConnectionDialog* get(rdpContext* context); + + private: + SDLConnectionDialog* _dialog = nullptr; + bool _visible = false; +}; diff --git a/client/SDL3/dialogs/sdl_dialogs.cpp b/client/SDL3/dialogs/sdl_dialogs.cpp new file mode 100644 index 000000000..32f845763 --- /dev/null +++ b/client/SDL3/dialogs/sdl_dialogs.cpp @@ -0,0 +1,621 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * SDL Client helper dialogs + * + * Copyright 2023 Armin Novak + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include + +#include +#include + +#include + +#include "../sdl_freerdp.hpp" +#include "sdl_dialogs.hpp" +#include "sdl_input.hpp" +#include "sdl_input_widgets.hpp" +#include "sdl_select.hpp" +#include "sdl_selectlist.hpp" + +#define TAG CLIENT_TAG("SDL.dialogs") + +enum +{ + SHOW_DIALOG_ACCEPT_REJECT = 1, + SHOW_DIALOG_TIMED_ACCEPT = 2 +}; + +static const char* type_str_for_flags(UINT32 flags) +{ + const char* type = "RDP-Server"; + + if (flags & VERIFY_CERT_FLAG_GATEWAY) + type = "RDP-Gateway"; + + if (flags & VERIFY_CERT_FLAG_REDIRECT) + type = "RDP-Redirect"; + return type; +} + +static BOOL sdl_wait_for_result(rdpContext* context, Uint32 type, SDL_Event* result) +{ + const SDL_Event empty = { 0 }; + + WINPR_ASSERT(context); + WINPR_ASSERT(result); + + while (!freerdp_shall_disconnect_context(context)) + { + *result = empty; + const int rc = SDL_PeepEvents(result, 1, SDL_GETEVENT, type, type); + if (rc > 0) + return TRUE; + Sleep(1); + } + return FALSE; +} + +static int sdl_show_dialog(rdpContext* context, const char* title, const char* message, + Sint32 flags) +{ + SDL_Event event = { 0 }; + + if (!sdl_push_user_event(SDL_USEREVENT_SHOW_DIALOG, title, message, flags)) + return 0; + + if (!sdl_wait_for_result(context, SDL_USEREVENT_SHOW_RESULT, &event)) + return 0; + + return event.user.code; +} + +BOOL sdl_authenticate_ex(freerdp* instance, char** username, char** password, char** domain, + rdp_auth_reason reason) +{ + SDL_Event event = { 0 }; + BOOL res = FALSE; + + SDLConnectionDialogHider hider(instance); + + const char* target = freerdp_settings_get_server_name(instance->context->settings); + switch (reason) + { + case AUTH_NLA: + break; + + case AUTH_TLS: + case AUTH_RDP: + case AUTH_SMARTCARD_PIN: /* in this case password is pin code */ + if ((*username) && (*password)) + return TRUE; + break; + case GW_AUTH_HTTP: + case GW_AUTH_RDG: + case GW_AUTH_RPC: + target = + freerdp_settings_get_string(instance->context->settings, FreeRDP_GatewayHostname); + break; + default: + break; + } + + char* title = nullptr; + size_t titlesize = 0; + winpr_asprintf(&title, &titlesize, "Credentials required for %s", target); + + char* u = nullptr; + char* d = nullptr; + char* p = nullptr; + + assert(username); + assert(domain); + assert(password); + + u = *username; + d = *domain; + p = *password; + + if (!sdl_push_user_event(SDL_USEREVENT_AUTH_DIALOG, title, u, d, p, reason)) + goto fail; + + if (!sdl_wait_for_result(instance->context, SDL_USEREVENT_AUTH_RESULT, &event)) + goto fail; + else + { + auto arg = reinterpret_cast(event.padding); + + res = arg->result > 0 ? TRUE : FALSE; + + free(*username); + free(*domain); + free(*password); + *username = arg->user; + *domain = arg->domain; + *password = arg->password; + } + +fail: + free(title); + return res; +} + +BOOL sdl_choose_smartcard(freerdp* instance, SmartcardCertInfo** cert_list, DWORD count, + DWORD* choice, BOOL gateway) +{ + BOOL res = FALSE; + + WINPR_ASSERT(instance); + WINPR_ASSERT(cert_list); + WINPR_ASSERT(choice); + + SDLConnectionDialogHider hider(instance); + std::vector strlist; + std::vector list; + for (DWORD i = 0; i < count; i++) + { + const SmartcardCertInfo* cert = cert_list[i]; + char* reader = ConvertWCharToUtf8Alloc(cert->reader, nullptr); + char* container_name = ConvertWCharToUtf8Alloc(cert->containerName, nullptr); + + char* msg = nullptr; + size_t len = 0; + + winpr_asprintf(&msg, &len, + "%s\n\tReader: %s\n\tUser: %s@%s\n\tSubject: %s\n\tIssuer: %s\n\tUPN: %s", + container_name, reader, cert->userHint, cert->domainHint, cert->subject, + cert->issuer, cert->upn); + + strlist.emplace_back(msg); + free(msg); + free(reader); + free(container_name); + + auto& m = strlist.back(); + list.push_back(m.c_str()); + } + + SDL_Event event = { 0 }; + const char* title = "Select a logon smartcard certificate"; + if (gateway) + title = "Select a gateway logon smartcard certificate"; + if (!sdl_push_user_event(SDL_USEREVENT_SCARD_DIALOG, title, list.data(), count)) + goto fail; + + if (!sdl_wait_for_result(instance->context, SDL_USEREVENT_SCARD_RESULT, &event)) + goto fail; + + res = (event.user.code >= 0) ? TRUE : FALSE; + *choice = static_cast(event.user.code); + +fail: + return res; +} + +SSIZE_T sdl_retry_dialog(freerdp* instance, const char* what, size_t current, void* userarg) +{ + WINPR_ASSERT(instance); + WINPR_ASSERT(instance->context); + WINPR_ASSERT(what); + + auto sdl = get_context(instance->context); + std::lock_guard lock(sdl->critical); + WINPR_ASSERT(sdl->connection_dialog); + + sdl->connection_dialog->setTitle("Retry connection to %s", + freerdp_settings_get_server_name(instance->context->settings)); + + if ((strcmp(what, "arm-transport") != 0) && (strcmp(what, "connection") != 0)) + { + sdl->connection_dialog->showError("Unknown module %s, aborting", what); + return -1; + } + + if (current == 0) + { + if (strcmp(what, "arm-transport") == 0) + sdl->connection_dialog->showWarn("[%s] Starting your VM. It may take up to 5 minutes", + what); + } + + auto settings = instance->context->settings; + const BOOL enabled = freerdp_settings_get_bool(settings, FreeRDP_AutoReconnectionEnabled); + + if (!enabled) + { + sdl->connection_dialog->showError( + "Automatic reconnection disabled, terminating. Try to connect again later"); + return -1; + } + + const size_t max = freerdp_settings_get_uint32(settings, FreeRDP_AutoReconnectMaxRetries); + const size_t delay = freerdp_settings_get_uint32(settings, FreeRDP_TcpConnectTimeout); + if (current >= max) + { + sdl->connection_dialog->showError( + "[%s] retries exceeded. Your VM failed to start. Try again later or contact your " + "tech support for help if this keeps happening.", + what); + return -1; + } + + sdl->connection_dialog->showInfo("[%s] retry %" PRIuz "/%" PRIuz ", delaying %" PRIuz + "ms before next attempt", + what, current, max, delay); + return delay; +} + +BOOL sdl_present_gateway_message(freerdp* instance, UINT32 type, BOOL isDisplayMandatory, + BOOL isConsentMandatory, size_t length, const WCHAR* wmessage) +{ + if (!isDisplayMandatory) + return TRUE; + + char* title = nullptr; + size_t len = 0; + winpr_asprintf(&title, &len, "[gateway]"); + + Sint32 flags = 0; + if (isConsentMandatory) + flags = SHOW_DIALOG_ACCEPT_REJECT; + else if (isDisplayMandatory) + flags = SHOW_DIALOG_TIMED_ACCEPT; + char* message = ConvertWCharNToUtf8Alloc(wmessage, length, nullptr); + + SDLConnectionDialogHider hider(instance); + const int rc = sdl_show_dialog(instance->context, title, message, flags); + free(title); + free(message); + return rc > 0 ? TRUE : FALSE; +} + +int sdl_logon_error_info(freerdp* instance, UINT32 data, UINT32 type) +{ + int rc = -1; + const char* str_data = freerdp_get_logon_error_info_data(data); + const char* str_type = freerdp_get_logon_error_info_type(type); + + if (!instance || !instance->context) + return -1; + + /* ignore LOGON_MSG_SESSION_CONTINUE message */ + if (type == LOGON_MSG_SESSION_CONTINUE) + return 0; + + SDLConnectionDialogHider hider(instance); + + char* title = nullptr; + size_t tlen = 0; + winpr_asprintf(&title, &tlen, "[%s] info", + freerdp_settings_get_server_name(instance->context->settings)); + + char* message = nullptr; + size_t mlen = 0; + winpr_asprintf(&message, &mlen, "Logon Error Info %s [%s]", str_data, str_type); + + rc = sdl_show_dialog(instance->context, title, message, SHOW_DIALOG_ACCEPT_REJECT); + free(title); + free(message); + return rc; +} + +static DWORD sdl_show_ceritifcate_dialog(rdpContext* context, const char* title, + const char* message) +{ + SDLConnectionDialogHider hider(context); + if (!sdl_push_user_event(SDL_USEREVENT_CERT_DIALOG, title, message)) + return 0; + + SDL_Event event = { 0 }; + if (!sdl_wait_for_result(context, SDL_USEREVENT_CERT_RESULT, &event)) + return 0; + return static_cast(event.user.code); +} + +DWORD sdl_verify_changed_certificate_ex(freerdp* instance, const char* host, UINT16 port, + const char* common_name, const char* subject, + const char* issuer, const char* new_fingerprint, + const char* old_subject, const char* old_issuer, + const char* old_fingerprint, DWORD flags) +{ + const char* type = type_str_for_flags(flags); + + WINPR_ASSERT(instance); + WINPR_ASSERT(instance->context); + WINPR_ASSERT(instance->context->settings); + + SDLConnectionDialogHider hider(instance); + /* Newer versions of FreeRDP allow exposing the whole PEM by setting + * FreeRDP_CertificateCallbackPreferPEM to TRUE + */ + char* new_fp_str = nullptr; + size_t len = 0; + if (flags & VERIFY_CERT_FLAG_FP_IS_PEM) + { + winpr_asprintf(&new_fp_str, &len, + "----------- Certificate --------------\n" + "%s\n" + "--------------------------------------\n", + new_fingerprint); + } + else + winpr_asprintf(&new_fp_str, &len, "Thumbprint: %s\n", new_fingerprint); + + /* Newer versions of FreeRDP allow exposing the whole PEM by setting + * FreeRDP_CertificateCallbackPreferPEM to TRUE + */ + char* old_fp_str = nullptr; + size_t olen = 0; + if (flags & VERIFY_CERT_FLAG_FP_IS_PEM) + { + winpr_asprintf(&old_fp_str, &olen, + "----------- Certificate --------------\n" + "%s\n" + "--------------------------------------\n", + old_fingerprint); + } + else + winpr_asprintf(&old_fp_str, &olen, "Thumbprint: %s\n", old_fingerprint); + + const char* collission_str = ""; + if (flags & VERIFY_CERT_FLAG_MATCH_LEGACY_SHA1) + { + collission_str = + "A matching entry with legacy SHA1 was found in local known_hosts2 store.\n" + "If you just upgraded from a FreeRDP version before 2.0 this is expected.\n" + "The hashing algorithm has been upgraded from SHA1 to SHA256.\n" + "All manually accepted certificates must be reconfirmed!\n" + "\n"; + } + + char* title = nullptr; + size_t tlen = 0; + winpr_asprintf(&title, &tlen, "Certificate for %s:%" PRIu16 " (%s) has changed", host, port, + type); + + char* message = nullptr; + size_t mlen = 0; + winpr_asprintf(&message, &mlen, + "New Certificate details:\n" + "Common Name: %s\n" + "Subject: %s\n" + "Issuer: %s\n" + "%s\n" + "Old Certificate details:\n" + "Subject: %s\n" + "Issuer: %s\n" + "%s\n" + "%s\n" + "The above X.509 certificate does not match the certificate used for previous " + "connections.\n" + "This may indicate that the certificate has been tampered with.\n" + "Please contact the administrator of the RDP server and clarify.\n", + common_name, subject, issuer, new_fp_str, old_subject, old_issuer, old_fp_str, + collission_str); + + const DWORD rc = sdl_show_ceritifcate_dialog(instance->context, title, message); + free(title); + free(message); + free(new_fp_str); + free(old_fp_str); + + return rc; +} + +DWORD sdl_verify_certificate_ex(freerdp* instance, const char* host, UINT16 port, + const char* common_name, const char* subject, const char* issuer, + const char* fingerprint, DWORD flags) +{ + const char* type = type_str_for_flags(flags); + + /* Newer versions of FreeRDP allow exposing the whole PEM by setting + * FreeRDP_CertificateCallbackPreferPEM to TRUE + */ + char* fp_str = nullptr; + size_t len = 0; + if (flags & VERIFY_CERT_FLAG_FP_IS_PEM) + { + winpr_asprintf(&fp_str, &len, + "----------- Certificate --------------\n" + "%s\n" + "--------------------------------------\n", + fingerprint); + } + else + winpr_asprintf(&fp_str, &len, "Thumbprint: %s\n", fingerprint); + + char* title = nullptr; + size_t tlen = 0; + winpr_asprintf(&title, &tlen, "New certificate for %s:%" PRIu16 " (%s)", host, port, type); + + char* message = nullptr; + size_t mlen = 0; + winpr_asprintf( + &message, &mlen, + "Common Name: %s\n" + "Subject: %s\n" + "Issuer: %s\n" + "%s\n" + "The above X.509 certificate could not be verified, possibly because you do not have\n" + "the CA certificate in your certificate store, or the certificate has expired.\n" + "Please look at the OpenSSL documentation on how to add a private CA to the store.\n", + common_name, subject, issuer, fp_str); + + SDLConnectionDialogHider hider(instance); + const DWORD rc = sdl_show_ceritifcate_dialog(instance->context, title, message); + free(fp_str); + free(title); + free(message); + return rc; +} + +BOOL sdl_cert_dialog_show(const char* title, const char* message) +{ + int buttonid = -1; + enum + { + BUTTONID_CERT_ACCEPT_PERMANENT = 23, + BUTTONID_CERT_ACCEPT_TEMPORARY = 24, + BUTTONID_CERT_DENY = 25 + }; + const SDL_MessageBoxButtonData buttons[] = { + { 0, BUTTONID_CERT_ACCEPT_PERMANENT, "permanent" }, + { SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT, BUTTONID_CERT_ACCEPT_TEMPORARY, "temporary" }, + { SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT, BUTTONID_CERT_DENY, "cancel" } + }; + + const SDL_MessageBoxData data = { SDL_MESSAGEBOX_WARNING, nullptr, title, message, + ARRAYSIZE(buttons), buttons, nullptr }; + const int rc = SDL_ShowMessageBox(&data, &buttonid); + + Sint32 value = -1; + if (rc < 0) + value = 0; + else + { + switch (buttonid) + { + case BUTTONID_CERT_ACCEPT_PERMANENT: + value = 1; + break; + case BUTTONID_CERT_ACCEPT_TEMPORARY: + value = 2; + break; + default: + value = 0; + break; + } + } + + return sdl_push_user_event(SDL_USEREVENT_CERT_RESULT, value); +} + +BOOL sdl_message_dialog_show(const char* title, const char* message, Sint32 flags) +{ + int buttonid = -1; + enum + { + BUTTONID_SHOW_ACCEPT = 24, + BUTTONID_SHOW_DENY = 25 + }; + const SDL_MessageBoxButtonData buttons[] = { + { SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT, BUTTONID_SHOW_ACCEPT, "accept" }, + { SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT, BUTTONID_SHOW_DENY, "cancel" } + }; + + const int button_cnt = (flags & SHOW_DIALOG_ACCEPT_REJECT) ? 2 : 1; + const SDL_MessageBoxData data = { + SDL_MESSAGEBOX_WARNING, nullptr, title, message, button_cnt, buttons, nullptr + }; + const int rc = SDL_ShowMessageBox(&data, &buttonid); + + Sint32 value = -1; + if (rc < 0) + value = 0; + else + { + switch (buttonid) + { + case BUTTONID_SHOW_ACCEPT: + value = 1; + break; + default: + value = 0; + break; + } + } + + return sdl_push_user_event(SDL_USEREVENT_SHOW_RESULT, value); +} + +BOOL sdl_auth_dialog_show(const SDL_UserAuthArg* args) +{ + const std::vector auth = { "Username: ", "Domain: ", + "Password: " }; + const std::vector authPin = { "Device: ", "PIN: " }; + const std::vector gw = { "GatewayUsername: ", "GatewayDomain: ", + "GatewayPassword: " }; + std::vector prompt; + Sint32 rc = -1; + + switch (args->result) + { + case AUTH_SMARTCARD_PIN: + prompt = authPin; + break; + case AUTH_TLS: + case AUTH_RDP: + case AUTH_NLA: + prompt = auth; + break; + case GW_AUTH_HTTP: + case GW_AUTH_RDG: + case GW_AUTH_RPC: + prompt = gw; + break; + default: + break; + } + + std::vector result; + + if (!prompt.empty()) + { + std::vector initial{ args->user ? args->user : "Smartcard", "" }; + std::vector flags = { SdlInputWidget::SDL_INPUT_READONLY, + SdlInputWidget::SDL_INPUT_MASK }; + if (args->result != AUTH_SMARTCARD_PIN) + { + initial = { args->user ? args->user : "", args->domain ? args->domain : "", + args->password ? args->password : "" }; + flags = { 0, 0, SdlInputWidget::SDL_INPUT_MASK }; + } + SdlInputWidgetList ilist(args->title, prompt, initial, flags); + rc = ilist.run(result); + } + + if ((result.size() < prompt.size())) + rc = -1; + + char* user = nullptr; + char* domain = nullptr; + char* pwd = nullptr; + if (rc > 0) + { + user = _strdup(result[0].c_str()); + if (args->result == AUTH_SMARTCARD_PIN) + pwd = _strdup(result[1].c_str()); + else + { + domain = _strdup(result[1].c_str()); + pwd = _strdup(result[2].c_str()); + } + } + return sdl_push_user_event(SDL_USEREVENT_AUTH_RESULT, user, domain, pwd, rc); +} + +BOOL sdl_scard_dialog_show(const char* title, Sint32 count, const char** list) +{ + std::vector vlist; + vlist.reserve(count); + for (Sint32 x = 0; x < count; x++) + vlist.emplace_back(list[x]); + SdlSelectList slist(title, vlist); + Sint32 value = slist.run(); + return sdl_push_user_event(SDL_USEREVENT_SCARD_RESULT, value); +} diff --git a/client/SDL3/dialogs/sdl_dialogs.hpp b/client/SDL3/dialogs/sdl_dialogs.hpp new file mode 100644 index 000000000..ae9bbe6a0 --- /dev/null +++ b/client/SDL3/dialogs/sdl_dialogs.hpp @@ -0,0 +1,53 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * SDL Client helper dialogs + * + * Copyright 2023 Armin Novak + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include +#include + +#include "../sdl_types.hpp" +#include "../sdl_utils.hpp" + +BOOL sdl_authenticate_ex(freerdp* instance, char** username, char** password, char** domain, + rdp_auth_reason reason); +BOOL sdl_choose_smartcard(freerdp* instance, SmartcardCertInfo** cert_list, DWORD count, + DWORD* choice, BOOL gateway); + +SSIZE_T sdl_retry_dialog(freerdp* instance, const char* what, size_t current, void* userarg); + +DWORD sdl_verify_certificate_ex(freerdp* instance, const char* host, UINT16 port, + const char* common_name, const char* subject, const char* issuer, + const char* fingerprint, DWORD flags); + +DWORD sdl_verify_changed_certificate_ex(freerdp* instance, const char* host, UINT16 port, + const char* common_name, const char* subject, + const char* issuer, const char* new_fingerprint, + const char* old_subject, const char* old_issuer, + const char* old_fingerprint, DWORD flags); + +int sdl_logon_error_info(freerdp* instance, UINT32 data, UINT32 type); + +BOOL sdl_present_gateway_message(freerdp* instance, UINT32 type, BOOL isDisplayMandatory, + BOOL isConsentMandatory, size_t length, const WCHAR* message); + +BOOL sdl_message_dialog_show(const char* title, const char* message, Sint32 flags); +BOOL sdl_cert_dialog_show(const char* title, const char* message); +BOOL sdl_scard_dialog_show(const char* title, Sint32 count, const char** list); +BOOL sdl_auth_dialog_show(const SDL_UserAuthArg* args); diff --git a/client/SDL3/dialogs/sdl_input.cpp b/client/SDL3/dialogs/sdl_input.cpp new file mode 100644 index 000000000..6e7bf12f6 --- /dev/null +++ b/client/SDL3/dialogs/sdl_input.cpp @@ -0,0 +1,177 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * SDL Client helper dialogs + * + * Copyright 2023 Armin Novak + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "sdl_input.hpp" + +#include + +#include + +#include +#include + +#include "sdl_widget.hpp" +#include "sdl_button.hpp" +#include "sdl_buttons.hpp" + +static const SDL_Color inputbackgroundcolor = { 0x56, 0x56, 0x56, 0xff }; +static const SDL_Color inputhighlightcolor = { 0x80, 0, 0, 0x60 }; +static const SDL_Color inputmouseovercolor = { 0, 0x80, 0, 0x60 }; +static const SDL_Color inputfontcolor = { 0xd1, 0xcf, 0xcd, 0xff }; +static const SDL_Color labelbackgroundcolor = { 0x56, 0x56, 0x56, 0xff }; +static const SDL_Color labelfontcolor = { 0xd1, 0xcf, 0xcd, 0xff }; +static const Uint32 vpadding = 5; +static const Uint32 hpadding = 10; + +SdlInputWidget::SdlInputWidget(SDL_Renderer* renderer, const std::string& label, + const std::string& initial, Uint32 flags, size_t offset, + size_t width, size_t height) + : _flags(flags), _text(initial), _text_label(label), + _label(renderer, + { 0, static_cast(offset * (height + vpadding)), static_cast(width), + static_cast(height) }, + false), + _input(renderer, + { static_cast(width + hpadding), static_cast(offset * (height + vpadding)), + static_cast(width), static_cast(height) }, + true), + _highlight(false), _mouseover(false) +{ +} + +SdlInputWidget::SdlInputWidget(SdlInputWidget&& other) noexcept + : _flags(std::move(other._flags)), _text(std::move(other._text)), + _text_label(std::move(other._text_label)), _label(std::move(other._label)), + _input(std::move(other._input)), _highlight(other._highlight), _mouseover(other._mouseover) +{ +} + +bool SdlInputWidget::fill_label(SDL_Renderer* renderer, SDL_Color color) +{ + if (!_label.fill(renderer, color)) + return false; + return _label.update_text(renderer, _text_label, labelfontcolor); +} + +bool SdlInputWidget::update_label(SDL_Renderer* renderer) +{ + return _label.update_text(renderer, _text_label, labelfontcolor, labelbackgroundcolor); +} + +bool SdlInputWidget::set_mouseover(SDL_Renderer* renderer, bool mouseOver) +{ + if (readonly()) + return true; + _mouseover = mouseOver; + return update_input(renderer); +} + +bool SdlInputWidget::set_highlight(SDL_Renderer* renderer, bool highlight) +{ + if (readonly()) + return true; + _highlight = highlight; + return update_input(renderer); +} + +bool SdlInputWidget::update_input(SDL_Renderer* renderer) +{ + std::vector colors = { inputbackgroundcolor }; + if (_highlight) + colors.push_back(inputhighlightcolor); + if (_mouseover) + colors.push_back(inputmouseovercolor); + + if (!_input.fill(renderer, colors)) + return false; + return update_input(renderer, inputfontcolor); +} + +bool SdlInputWidget::resize_input(size_t size) +{ + _text.resize(size); + + return true; +} + +bool SdlInputWidget::set_str(SDL_Renderer* renderer, const std::string& text) +{ + if (readonly()) + return true; + _text = text; + if (!resize_input(_text.size())) + return false; + return update_input(renderer); +} + +bool SdlInputWidget::remove_str(SDL_Renderer* renderer, size_t count) +{ + if (readonly()) + return true; + + assert(renderer); + if (_text.empty()) + return true; + + if (!resize_input(_text.size() - count)) + return false; + return update_input(renderer); +} + +bool SdlInputWidget::append_str(SDL_Renderer* renderer, const std::string& str) +{ + assert(renderer); + if (readonly()) + return true; + + _text.append(str); + if (!resize_input(_text.size())) + return false; + return update_input(renderer); +} + +const SDL_Rect& SdlInputWidget::input_rect() const +{ + return _input.rect(); +} + +std::string SdlInputWidget::value() const +{ + return _text; +} + +bool SdlInputWidget::readonly() const +{ + return (_flags & SDL_INPUT_READONLY) != 0; +} + +bool SdlInputWidget::update_input(SDL_Renderer* renderer, SDL_Color fgcolor) +{ + std::string text = _text; + if (!text.empty()) + { + if (_flags & SDL_INPUT_MASK) + { + for (char& x : text) + x = '*'; + } + } + + return _input.update_text(renderer, text, fgcolor); +} diff --git a/client/SDL3/dialogs/sdl_input.hpp b/client/SDL3/dialogs/sdl_input.hpp new file mode 100644 index 000000000..11492d1db --- /dev/null +++ b/client/SDL3/dialogs/sdl_input.hpp @@ -0,0 +1,73 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * SDL Client helper dialogs + * + * Copyright 2023 Armin Novak + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include +#include + +#include +#include "sdl_widget.hpp" + +class SdlInputWidget +{ + public: + enum + { + SDL_INPUT_MASK = 1, + SDL_INPUT_READONLY = 2 + }; + + public: + SdlInputWidget(SDL_Renderer* renderer, const std::string& label, const std::string& initial, + Uint32 flags, size_t offset, size_t width, size_t height); + SdlInputWidget(SdlInputWidget&& other) noexcept; + + bool fill_label(SDL_Renderer* renderer, SDL_Color color); + bool update_label(SDL_Renderer* renderer); + + bool set_mouseover(SDL_Renderer* renderer, bool mouseOver); + bool set_highlight(SDL_Renderer* renderer, bool hightlight); + bool update_input(SDL_Renderer* renderer); + bool resize_input(size_t size); + + bool set_str(SDL_Renderer* renderer, const std::string& text); + bool remove_str(SDL_Renderer* renderer, size_t count); + bool append_str(SDL_Renderer* renderer, const std::string& text); + + [[nodiscard]] const SDL_Rect& input_rect() const; + [[nodiscard]] std::string value() const; + + [[nodiscard]] bool readonly() const; + + protected: + bool update_input(SDL_Renderer* renderer, SDL_Color fgclor); + + private: + SdlInputWidget(const SdlInputWidget& other) = delete; + + private: + Uint32 _flags; + std::string _text; + std::string _text_label; + SdlWidget _label; + SdlWidget _input; + bool _highlight; + bool _mouseover; +}; diff --git a/client/SDL3/dialogs/sdl_input_widgets.cpp b/client/SDL3/dialogs/sdl_input_widgets.cpp new file mode 100644 index 000000000..99e5270b8 --- /dev/null +++ b/client/SDL3/dialogs/sdl_input_widgets.cpp @@ -0,0 +1,300 @@ +#include +#include + +#include "sdl_input_widgets.hpp" + +static const Uint32 vpadding = 5; + +SdlInputWidgetList::SdlInputWidgetList(const std::string& title, + const std::vector& labels, + const std::vector& initial, + const std::vector& flags) + : _window(nullptr), _renderer(nullptr) +{ + assert(labels.size() == initial.size()); + assert(labels.size() == flags.size()); + const std::vector buttonids = { INPUT_BUTTON_ACCEPT, INPUT_BUTTON_CANCEL }; + const std::vector buttonlabels = { "accept", "cancel" }; + + const size_t widget_width = 300; + const size_t widget_heigth = 50; + + const size_t total_width = widget_width + widget_width; + const size_t input_height = labels.size() * (widget_heigth + vpadding) + vpadding; + const size_t total_height = input_height + widget_heigth; + _window = SDL_CreateWindow( + title.c_str(), SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, total_width, total_height, + SDL_WINDOW_ALLOW_HIGHDPI | SDL_WINDOW_MOUSE_FOCUS | SDL_WINDOW_INPUT_FOCUS); + if (_window == nullptr) + { + widget_log_error(-1, "SDL_CreateWindow"); + } + else + { + + _renderer = SDL_CreateRenderer(_window, -1, SDL_RENDERER_ACCELERATED); + if (_renderer == nullptr) + { + widget_log_error(-1, "SDL_CreateRenderer"); + } + else + { + for (size_t x = 0; x < labels.size(); x++) + _list.emplace_back(_renderer, labels[x], initial[x], flags[x], x, widget_width, + widget_heigth); + + _buttons.populate(_renderer, buttonlabels, buttonids, total_width, + static_cast(input_height), static_cast(widget_width), + static_cast(widget_heigth)); + _buttons.set_highlight(0); + } + } +} + +ssize_t SdlInputWidgetList::next(ssize_t current) +{ + size_t iteration = 0; + auto val = static_cast(current); + + do + { + if (iteration >= _list.size()) + return -1; + + if (iteration == 0) + { + if (current < 0) + val = 0; + else + val++; + } + else + val++; + iteration++; + val %= _list.size(); + } while (!valid(static_cast(val))); + return static_cast(val); +} + +bool SdlInputWidgetList::valid(ssize_t current) const +{ + if (current < 0) + return false; + auto s = static_cast(current); + if (s >= _list.size()) + return false; + return !_list[s].readonly(); +} + +SdlInputWidget* SdlInputWidgetList::get(ssize_t index) +{ + if (index < 0) + return nullptr; + auto s = static_cast(index); + if (s >= _list.size()) + return nullptr; + return &_list[s]; +} + +SdlInputWidgetList::~SdlInputWidgetList() +{ + _list.clear(); + _buttons.clear(); + SDL_DestroyRenderer(_renderer); + SDL_DestroyWindow(_window); +} + +bool SdlInputWidgetList::update(SDL_Renderer* renderer) +{ + for (auto& btn : _list) + { + if (!btn.update_label(renderer)) + return false; + if (!btn.update_input(renderer)) + return false; + } + + return _buttons.update(renderer); +} + +ssize_t SdlInputWidgetList::get_index(const SDL_MouseButtonEvent& button) +{ + const Sint32 x = button.x; + const Sint32 y = button.y; + for (size_t i = 0; i < _list.size(); i++) + { + auto& cur = _list[i]; + auto r = cur.input_rect(); + + if ((x >= r.x) && (x <= r.x + r.w) && (y >= r.y) && (y <= r.y + r.h)) + return i; + } + return -1; +} + +int SdlInputWidgetList::run(std::vector& result) +{ + int res = -1; + ssize_t LastActiveTextInput = -1; + ssize_t CurrentActiveTextInput = next(-1); + + if (!_window || !_renderer) + return -2; + + try + { + bool running = true; + std::vector pressed; + while (running) + { + if (!clear_window(_renderer)) + throw; + + if (!update(_renderer)) + throw; + + if (!_buttons.update(_renderer)) + throw; + + SDL_Event event = {}; + SDL_WaitEvent(&event); + switch (event.type) + { + case SDL_KEYUP: + { + auto it = std::remove(pressed.begin(), pressed.end(), event.key.keysym.sym); + pressed.erase(it, pressed.end()); + + switch (event.key.keysym.sym) + { + case SDLK_BACKSPACE: + { + auto cur = get(CurrentActiveTextInput); + if (cur) + { + if (!cur->remove_str(_renderer, 1)) + throw; + } + } + break; + case SDLK_TAB: + CurrentActiveTextInput = next(CurrentActiveTextInput); + break; + case SDLK_RETURN: + case SDLK_RETURN2: + case SDLK_KP_ENTER: + running = false; + res = INPUT_BUTTON_ACCEPT; + break; + case SDLK_ESCAPE: + running = false; + res = INPUT_BUTTON_CANCEL; + break; + case SDLK_v: + if (pressed.size() == 2) + { + if ((pressed[0] == SDLK_LCTRL) || (pressed[0] == SDLK_RCTRL)) + { + auto cur = get(CurrentActiveTextInput); + if (cur) + { + auto text = SDL_GetClipboardText(); + cur->set_str(_renderer, text); + } + } + } + break; + default: + break; + } + } + break; + case SDL_KEYDOWN: + pressed.push_back(event.key.keysym.sym); + break; + case SDL_TEXTINPUT: + { + auto cur = get(CurrentActiveTextInput); + if (cur) + { + if (!cur->append_str(_renderer, event.text.text)) + throw; + } + } + break; + case SDL_MOUSEMOTION: + { + auto TextInputIndex = get_index(event.button); + for (auto& cur : _list) + { + if (!cur.set_mouseover(_renderer, false)) + throw; + } + if (TextInputIndex >= 0) + { + auto& cur = _list[static_cast(TextInputIndex)]; + if (!cur.set_mouseover(_renderer, true)) + throw; + } + + _buttons.set_mouseover(event.button.x, event.button.y); + } + break; + case SDL_MOUSEBUTTONDOWN: + { + auto val = get_index(event.button); + if (valid(val)) + CurrentActiveTextInput = val; + + auto button = _buttons.get_selected(event.button); + if (button) + { + running = false; + if (button->id() == INPUT_BUTTON_CANCEL) + res = INPUT_BUTTON_CANCEL; + else + res = INPUT_BUTTON_ACCEPT; + } + } + break; + case SDL_QUIT: + res = INPUT_BUTTON_CANCEL; + running = false; + break; + default: + break; + } + + if (LastActiveTextInput != CurrentActiveTextInput) + { + if (CurrentActiveTextInput < 0) + SDL_StopTextInput(); + else + SDL_StartTextInput(); + LastActiveTextInput = CurrentActiveTextInput; + } + + for (auto& cur : _list) + { + if (!cur.set_highlight(_renderer, false)) + throw; + } + auto cur = get(CurrentActiveTextInput); + if (cur) + { + if (!cur->set_highlight(_renderer, true)) + throw; + } + + SDL_RenderPresent(_renderer); + } + + for (auto& cur : _list) + result.push_back(cur.value()); + } + catch (...) + { + } + + return res; +} diff --git a/client/SDL3/dialogs/sdl_input_widgets.hpp b/client/SDL3/dialogs/sdl_input_widgets.hpp new file mode 100644 index 000000000..83568bab8 --- /dev/null +++ b/client/SDL3/dialogs/sdl_input_widgets.hpp @@ -0,0 +1,44 @@ +#pragma once + +#include +#include +#include + +#include "sdl_input.hpp" +#include "sdl_buttons.hpp" + +class SdlInputWidgetList +{ + public: + SdlInputWidgetList(const std::string& title, const std::vector& labels, + const std::vector& initial, const std::vector& flags); + virtual ~SdlInputWidgetList(); + + int run(std::vector& result); + + protected: + bool update(SDL_Renderer* renderer); + ssize_t get_index(const SDL_MouseButtonEvent& button); + + private: + SdlInputWidgetList(const SdlInputWidgetList& other) = delete; + SdlInputWidgetList(SdlInputWidgetList&& other) = delete; + + private: + enum + { + INPUT_BUTTON_ACCEPT = 1, + INPUT_BUTTON_CANCEL = -2 + }; + + private: + ssize_t next(ssize_t current); + [[nodiscard]] bool valid(ssize_t current) const; + SdlInputWidget* get(ssize_t index); + + private: + SDL_Window* _window; + SDL_Renderer* _renderer; + std::vector _list; + SdlButtonList _buttons; +}; diff --git a/client/SDL3/dialogs/sdl_select.cpp b/client/SDL3/dialogs/sdl_select.cpp new file mode 100644 index 000000000..f0e03273e --- /dev/null +++ b/client/SDL3/dialogs/sdl_select.cpp @@ -0,0 +1,74 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * SDL Client helper dialogs + * + * Copyright 2023 Armin Novak + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include + +#include +#include + +#include "sdl_select.hpp" +#include "sdl_widget.hpp" +#include "sdl_button.hpp" +#include "sdl_buttons.hpp" +#include "sdl_input_widgets.hpp" + +static const SDL_Color labelmouseovercolor = { 0, 0x80, 0, 0x60 }; +static const SDL_Color labelbackgroundcolor = { 0x69, 0x66, 0x63, 0xff }; +static const SDL_Color labelhighlightcolor = { 0xcd, 0xca, 0x35, 0x60 }; +static const SDL_Color labelfontcolor = { 0xd1, 0xcf, 0xcd, 0xff }; + +SdlSelectWidget::SdlSelectWidget(SDL_Renderer* renderer, const std::string& label, + const SDL_Rect& rect) + : SdlWidget(renderer, rect, true), _text(label), _mouseover(false), _highlight(false) +{ + update_text(renderer); +} + +SdlSelectWidget::SdlSelectWidget(SdlSelectWidget&& other) noexcept + : SdlWidget(std::move(other)), _text(std::move(other._text)), _mouseover(other._mouseover), + _highlight(other._highlight) +{ +} + +bool SdlSelectWidget::set_mouseover(SDL_Renderer* renderer, bool mouseOver) +{ + _mouseover = mouseOver; + return update_text(renderer); +} + +bool SdlSelectWidget::set_highlight(SDL_Renderer* renderer, bool highlight) +{ + _highlight = highlight; + return update_text(renderer); +} + +bool SdlSelectWidget::update_text(SDL_Renderer* renderer) +{ + assert(renderer); + std::vector colors = { labelbackgroundcolor }; + if (_highlight) + colors.push_back(labelhighlightcolor); + if (_mouseover) + colors.push_back(labelmouseovercolor); + if (!fill(renderer, colors)) + return false; + return SdlWidget::update_text(renderer, _text, labelfontcolor); +} diff --git a/client/SDL3/dialogs/sdl_select.hpp b/client/SDL3/dialogs/sdl_select.hpp new file mode 100644 index 000000000..af67b741e --- /dev/null +++ b/client/SDL3/dialogs/sdl_select.hpp @@ -0,0 +1,46 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * SDL Client helper dialogs + * + * Copyright 2023 Armin Novak + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include +#include + +#include +#include "sdl_widget.hpp" + +class SdlSelectWidget : public SdlWidget +{ + public: + SdlSelectWidget(SDL_Renderer* renderer, const std::string& label, const SDL_Rect& rect); + SdlSelectWidget(SdlSelectWidget&& other) noexcept; + ~SdlSelectWidget() override = default; + + bool set_mouseover(SDL_Renderer* renderer, bool mouseOver); + bool set_highlight(SDL_Renderer* renderer, bool highlight); + bool update_text(SDL_Renderer* renderer); + + private: + SdlSelectWidget(const SdlSelectWidget& other) = delete; + + private: + std::string _text; + bool _mouseover; + bool _highlight; +}; diff --git a/client/SDL3/dialogs/sdl_selectlist.cpp b/client/SDL3/dialogs/sdl_selectlist.cpp new file mode 100644 index 000000000..20437cc77 --- /dev/null +++ b/client/SDL3/dialogs/sdl_selectlist.cpp @@ -0,0 +1,208 @@ +#include "sdl_selectlist.hpp" + +static const Uint32 vpadding = 5; + +SdlSelectList::SdlSelectList(const std::string& title, const std::vector& labels) + : _window(nullptr), _renderer(nullptr) +{ + const size_t widget_height = 50; + const size_t widget_width = 600; + + const size_t total_height = labels.size() * (widget_height + vpadding) + vpadding; + _window = SDL_CreateWindow(title.c_str(), SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, + widget_width, total_height + widget_height, + SDL_WINDOW_ALLOW_HIGHDPI | SDL_WINDOW_MOUSE_FOCUS | + SDL_WINDOW_INPUT_FOCUS); + if (_window == nullptr) + { + widget_log_error(-1, "SDL_CreateWindow"); + } + else + { + _renderer = SDL_CreateRenderer(_window, -1, SDL_RENDERER_ACCELERATED); + if (_renderer == nullptr) + { + widget_log_error(-1, "SDL_CreateRenderer"); + } + else + { + SDL_Rect rect = { 0, 0, widget_width, widget_height }; + for (auto& label : labels) + { + _list.emplace_back(_renderer, label, rect); + rect.y += widget_height + vpadding; + } + + const std::vector buttonids = { INPUT_BUTTON_ACCEPT, INPUT_BUTTON_CANCEL }; + const std::vector buttonlabels = { "accept", "cancel" }; + _buttons.populate( + _renderer, buttonlabels, buttonids, widget_width, static_cast(total_height), + static_cast(widget_width / 2), static_cast(widget_height)); + _buttons.set_highlight(0); + } + } +} + +SdlSelectList::~SdlSelectList() +{ + _list.clear(); + _buttons.clear(); + SDL_DestroyRenderer(_renderer); + SDL_DestroyWindow(_window); +} + +int SdlSelectList::run() +{ + int res = -2; + ssize_t CurrentActiveTextInput = 0; + bool running = true; + + if (!_window || !_renderer) + return -2; + try + { + while (running) + { + if (!clear_window(_renderer)) + throw; + + if (!update_text()) + throw; + + if (!_buttons.update(_renderer)) + throw; + + SDL_Event event = { 0 }; + SDL_WaitEvent(&event); + switch (event.type) + { + case SDL_KEYDOWN: + switch (event.key.keysym.sym) + { + case SDLK_UP: + case SDLK_BACKSPACE: + if (CurrentActiveTextInput > 0) + CurrentActiveTextInput--; + else + CurrentActiveTextInput = _list.size() - 1; + break; + case SDLK_DOWN: + case SDLK_TAB: + if (CurrentActiveTextInput < 0) + CurrentActiveTextInput = 0; + else + CurrentActiveTextInput++; + CurrentActiveTextInput = CurrentActiveTextInput % _list.size(); + break; + case SDLK_RETURN: + case SDLK_RETURN2: + case SDLK_KP_ENTER: + running = false; + res = CurrentActiveTextInput; + break; + case SDLK_ESCAPE: + running = false; + res = INPUT_BUTTON_CANCEL; + break; + default: + break; + } + break; + case SDL_MOUSEMOTION: + { + ssize_t TextInputIndex = get_index(event.button); + reset_mouseover(); + if (TextInputIndex >= 0) + { + auto& cur = _list[TextInputIndex]; + if (!cur.set_mouseover(_renderer, true)) + throw; + } + + _buttons.set_mouseover(event.button.x, event.button.y); + } + break; + case SDL_MOUSEBUTTONDOWN: + { + auto button = _buttons.get_selected(event.button); + if (button) + { + running = false; + if (button->id() == INPUT_BUTTON_CANCEL) + res = INPUT_BUTTON_CANCEL; + else + res = CurrentActiveTextInput; + } + else + { + CurrentActiveTextInput = get_index(event.button); + } + } + break; + case SDL_QUIT: + res = INPUT_BUTTON_CANCEL; + running = false; + break; + default: + break; + } + + reset_highlight(); + if (CurrentActiveTextInput >= 0) + { + auto& cur = _list[CurrentActiveTextInput]; + if (!cur.set_highlight(_renderer, true)) + throw; + } + + SDL_RenderPresent(_renderer); + } + } + catch (...) + { + return -1; + } + return res; +} + +ssize_t SdlSelectList::get_index(const SDL_MouseButtonEvent& button) +{ + const Sint32 x = button.x; + const Sint32 y = button.y; + for (size_t i = 0; i < _list.size(); i++) + { + auto& cur = _list[i]; + auto r = cur.rect(); + + if ((x >= r.x) && (x <= r.x + r.w) && (y >= r.y) && (y <= r.y + r.h)) + return i; + } + return -1; +} + +bool SdlSelectList::update_text() +{ + for (auto& cur : _list) + { + if (!cur.update_text(_renderer)) + return false; + } + + return true; +} + +void SdlSelectList::reset_mouseover() +{ + for (auto& cur : _list) + { + cur.set_mouseover(_renderer, false); + } +} + +void SdlSelectList::reset_highlight() +{ + for (auto& cur : _list) + { + cur.set_highlight(_renderer, false); + } +} diff --git a/client/SDL3/dialogs/sdl_selectlist.hpp b/client/SDL3/dialogs/sdl_selectlist.hpp new file mode 100644 index 000000000..3da0e1497 --- /dev/null +++ b/client/SDL3/dialogs/sdl_selectlist.hpp @@ -0,0 +1,42 @@ +#pragma once + +#include +#include + +#include + +#include "sdl_select.hpp" +#include "sdl_button.hpp" +#include "sdl_buttons.hpp" + +class SdlSelectList +{ + public: + SdlSelectList(const std::string& title, const std::vector& labels); + virtual ~SdlSelectList(); + + int run(); + + private: + SdlSelectList(const SdlSelectList& other) = delete; + SdlSelectList(SdlSelectList&& other) = delete; + + private: + enum + { + INPUT_BUTTON_ACCEPT = 0, + INPUT_BUTTON_CANCEL = -2 + }; + + private: + ssize_t get_index(const SDL_MouseButtonEvent& button); + bool update_text(); + void reset_mouseover(); + void reset_highlight(); + + private: + SDL_Window* _window; + SDL_Renderer* _renderer; + std::vector _list; + SdlButtonList _buttons; +}; diff --git a/client/SDL3/dialogs/sdl_widget.cpp b/client/SDL3/dialogs/sdl_widget.cpp new file mode 100644 index 000000000..6e11b5a9a --- /dev/null +++ b/client/SDL3/dialogs/sdl_widget.cpp @@ -0,0 +1,280 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * SDL Client helper dialogs + * + * Copyright 2023 Armin Novak + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include + +#include +#include + +#include "sdl_widget.hpp" +#include "../sdl_utils.hpp" + +#include "res/sdl_resource_manager.hpp" + +#include + +#if defined(WITH_SDL_IMAGE_DIALOGS) +#include +#endif + +#define TAG CLIENT_TAG("SDL.widget") + +static const SDL_Color backgroundcolor = { 0x38, 0x36, 0x35, 0xff }; + +static const Uint32 hpadding = 10; + +SdlWidget::SdlWidget(SDL_Renderer* renderer, const SDL_Rect& rect, bool input) + : _rect(rect), _input(input) +{ + assert(renderer); + + auto ops = SDLResourceManager::get(SDLResourceManager::typeFonts(), + "OpenSans-VariableFont_wdth,wght.ttf"); + if (!ops) + widget_log_error(-1, "SDLResourceManager::get"); + else + { + _font = TTF_OpenFontRW(ops, 1, 64); + if (!_font) + widget_log_error(-1, "TTF_OpenFontRW"); + } +} + +#if defined(WITH_SDL_IMAGE_DIALOGS) +SdlWidget::SdlWidget(SDL_Renderer* renderer, const SDL_Rect& rect, SDL_RWops* ops) : _rect(rect) +{ + if (ops) + { + _image = IMG_LoadTexture_RW(renderer, ops, 1); + if (!_image) + widget_log_error(-1, "IMG_LoadTextureTyped_RW"); + } +} +#endif + +SdlWidget::SdlWidget(SdlWidget&& other) noexcept + : _font(std::move(other._font)), _image(other._image), _rect(std::move(other._rect)), + _input(other._input), _wrap(other._wrap), _text_width(other._text_width) +{ + other._font = nullptr; + other._image = nullptr; +} + +SDL_Texture* SdlWidget::render_text(SDL_Renderer* renderer, const std::string& text, + SDL_Color fgcolor, SDL_Rect& src, SDL_Rect& dst) +{ + auto surface = TTF_RenderUTF8_Blended(_font, text.c_str(), fgcolor); + if (!surface) + { + widget_log_error(-1, "TTF_RenderText_Blended"); + return nullptr; + } + + auto texture = SDL_CreateTextureFromSurface(renderer, surface); + SDL_FreeSurface(surface); + if (!texture) + { + widget_log_error(-1, "SDL_CreateTextureFromSurface"); + return nullptr; + } + + TTF_SizeUTF8(_font, text.c_str(), &src.w, &src.h); + + /* Do some magic: + * - Add padding before and after text + * - if text is too long only show the last elements + * - if text is too short only update used space + */ + dst = _rect; + dst.x += hpadding; + dst.w -= 2 * hpadding; + const float scale = static_cast(dst.h) / static_cast(src.h); + const float sws = static_cast(src.w) * scale; + const float dws = static_cast(dst.w) / scale; + if (static_cast(dst.w) > sws) + dst.w = static_cast(sws); + if (static_cast(src.w) > dws) + { + src.x = src.w - static_cast(dws); + src.w = static_cast(dws); + } + return texture; +} + +SDL_Texture* SdlWidget::render_text_wrapped(SDL_Renderer* renderer, const std::string& text, + SDL_Color fgcolor, SDL_Rect& src, SDL_Rect& dst) +{ + Sint32 w = 0; + Sint32 h = 0; + TTF_SizeUTF8(_font, " ", &w, &h); + auto surface = TTF_RenderUTF8_Blended_Wrapped(_font, text.c_str(), fgcolor, _text_width); + if (!surface) + { + widget_log_error(-1, "TTF_RenderText_Blended"); + return nullptr; + } + + src.w = surface->w; + src.h = surface->h; + + auto texture = SDL_CreateTextureFromSurface(renderer, surface); + SDL_FreeSurface(surface); + if (!texture) + { + widget_log_error(-1, "SDL_CreateTextureFromSurface"); + return nullptr; + } + + /* Do some magic: + * - Add padding before and after text + * - if text is too long only show the last elements + * - if text is too short only update used space + */ + dst = _rect; + dst.x += hpadding; + dst.w -= 2 * hpadding; + const float scale = static_cast(src.h) / static_cast(src.w); + auto dh = src.h * scale; + if (dh < dst.h) + dst.h = dh; + + return texture; +} + +SdlWidget::~SdlWidget() +{ + TTF_CloseFont(_font); + if (_image) + SDL_DestroyTexture(_image); +} + +bool SdlWidget::error_ex(Uint32 res, const char* what, const char* file, size_t line, + const char* fkt) +{ + static wLog* log = nullptr; + if (!log) + log = WLog_Get(TAG); + return sdl_log_error_ex(res, log, what, file, line, fkt); +} + +static bool draw_rect(SDL_Renderer* renderer, const SDL_Rect* rect, SDL_Color color) +{ + const int drc = SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, color.a); + if (widget_log_error(drc, "SDL_SetRenderDrawColor")) + return false; + + const int rc = SDL_RenderFillRect(renderer, rect); + return !widget_log_error(rc, "SDL_RenderFillRect"); +} + +bool SdlWidget::fill(SDL_Renderer* renderer, SDL_Color color) +{ + std::vector colors = { color }; + return fill(renderer, colors); +} + +bool SdlWidget::fill(SDL_Renderer* renderer, const std::vector& colors) +{ + assert(renderer); + SDL_BlendMode mode = SDL_BLENDMODE_INVALID; + SDL_GetRenderDrawBlendMode(renderer, &mode); + SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_NONE); + for (auto color : colors) + { + draw_rect(renderer, &_rect, color); + SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_ADD); + } + SDL_SetRenderDrawBlendMode(renderer, mode); + return true; +} + +bool SdlWidget::update_text(SDL_Renderer* renderer, const std::string& text, SDL_Color fgcolor, + SDL_Color bgcolor) +{ + assert(renderer); + + if (!fill(renderer, bgcolor)) + return false; + return update_text(renderer, text, fgcolor); +} + +bool SdlWidget::wrap() const +{ + return _wrap; +} + +bool SdlWidget::set_wrap(bool wrap, size_t width) +{ + _wrap = wrap; + _text_width = width; + return _wrap; +} + +const SDL_Rect& SdlWidget::rect() const +{ + return _rect; +} + +bool SdlWidget::update_text(SDL_Renderer* renderer, const std::string& text, SDL_Color fgcolor) +{ + + if (text.empty()) + return true; + + SDL_Rect src{}; + SDL_Rect dst{}; + + SDL_Texture* texture = nullptr; + if (_image) + { + texture = _image; + dst = _rect; + auto rc = SDL_QueryTexture(_image, nullptr, nullptr, &src.w, &src.h); + if (rc < 0) + widget_log_error(rc, "SDL_QueryTexture"); + } + else if (_wrap) + texture = render_text_wrapped(renderer, text, fgcolor, src, dst); + else + texture = render_text(renderer, text, fgcolor, src, dst); + if (!texture) + return false; + + const int rc = SDL_RenderCopy(renderer, texture, &src, &dst); + if (!_image) + SDL_DestroyTexture(texture); + if (rc < 0) + return !widget_log_error(rc, "SDL_RenderCopy"); + return true; +} + +bool clear_window(SDL_Renderer* renderer) +{ + assert(renderer); + + const int drc = SDL_SetRenderDrawColor(renderer, backgroundcolor.r, backgroundcolor.g, + backgroundcolor.b, backgroundcolor.a); + if (widget_log_error(drc, "SDL_SetRenderDrawColor")) + return false; + + const int rcls = SDL_RenderClear(renderer); + return !widget_log_error(rcls, "SDL_RenderClear"); +} diff --git a/client/SDL3/dialogs/sdl_widget.hpp b/client/SDL3/dialogs/sdl_widget.hpp new file mode 100644 index 000000000..ebc7dbd49 --- /dev/null +++ b/client/SDL3/dialogs/sdl_widget.hpp @@ -0,0 +1,88 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * SDL Client helper dialogs + * + * Copyright 2023 Armin Novak + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include + +#include +#include +#include + +#if defined(_MSC_VER) +#include +typedef SSIZE_T ssize_t; +#endif + +#if !defined(HAS_NOEXCEPT) +#if defined(__clang__) +#if __has_feature(cxx_noexcept) +#define HAS_NOEXCEPT +#endif +#elif defined(__GXX_EXPERIMENTAL_CXX0X__) && __GNUC__ * 10 + __GNUC_MINOR__ >= 46 || \ + defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 190023026 +#define HAS_NOEXCEPT +#endif +#endif + +#ifndef HAS_NOEXCEPT +#define noexcept +#endif + +class SdlWidget +{ + public: + SdlWidget(SDL_Renderer* renderer, const SDL_Rect& rect, bool input); + SdlWidget(SDL_Renderer* renderer, const SDL_Rect& rect, SDL_RWops* ops); + SdlWidget(SdlWidget&& other) noexcept; + virtual ~SdlWidget(); + + bool fill(SDL_Renderer* renderer, SDL_Color color); + bool fill(SDL_Renderer* renderer, const std::vector& colors); + bool update_text(SDL_Renderer* renderer, const std::string& text, SDL_Color fgcolor); + bool update_text(SDL_Renderer* renderer, const std::string& text, SDL_Color fgcolor, + SDL_Color bgcolor); + + bool wrap() const; + bool set_wrap(bool wrap = true, size_t width = 0); + const SDL_Rect& rect() const; + + public: +#define widget_log_error(res, what) SdlWidget::error_ex(res, what, __FILE__, __LINE__, __func__) + static bool error_ex(Uint32 res, const char* what, const char* file, size_t line, + const char* fkt); + + private: + SdlWidget(const SdlWidget& other) = delete; + + SDL_Texture* render_text(SDL_Renderer* renderer, const std::string& text, SDL_Color fgcolor, + SDL_Rect& src, SDL_Rect& dst); + SDL_Texture* render_text_wrapped(SDL_Renderer* renderer, const std::string& text, + SDL_Color fgcolor, SDL_Rect& src, SDL_Rect& dst); + + private: + TTF_Font* _font = nullptr; + SDL_Texture* _image = nullptr; + SDL_Rect _rect; + bool _input = false; + bool _wrap = false; + size_t _text_width = 0; +}; + +bool clear_window(SDL_Renderer* renderer); diff --git a/client/SDL3/dialogs/test/CMakeLists.txt b/client/SDL3/dialogs/test/CMakeLists.txt new file mode 100644 index 000000000..c1003d4c1 --- /dev/null +++ b/client/SDL3/dialogs/test/CMakeLists.txt @@ -0,0 +1,30 @@ +set(MODULE_NAME "TestSDL") +set(MODULE_PREFIX "TEST_SDL") + +set(DRIVER ${MODULE_NAME}.cpp) + +set(TEST_SRCS + TestSDLDialogs.cpp +) + +create_test_sourcelist(SRCS + ${DRIVER} + ${TEST_SRCS}) + +add_library(${MODULE_NAME} ${SRCS}) + +list(APPEND LIBS + dialogs +) + +target_link_libraries(${MODULE_NAME} ${LIBS}) + +set_target_properties(${MODULE_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${TESTING_OUTPUT_DIRECTORY}") + +foreach(test ${TESTS}) + get_filename_component(TestName ${test} NAME_WE) + add_test(${TestName} ${TESTING_OUTPUT_DIRECTORY}/${MODULE_NAME} ${TestName}) +endforeach() + +set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "FreeRDP/Client/Test") + diff --git a/client/SDL3/dialogs/test/TestSDLDialogs.cpp b/client/SDL3/dialogs/test/TestSDLDialogs.cpp new file mode 100644 index 000000000..558fb4c6e --- /dev/null +++ b/client/SDL3/dialogs/test/TestSDLDialogs.cpp @@ -0,0 +1,99 @@ +#include "../sdl_selectlist.hpp" +#include "../sdl_input_widgets.hpp" + +#include +#include + +BOOL sdl_log_error_ex(Uint32 res, wLog* log, const char* what, const char* file, size_t line, + const char* fkt) +{ + return FALSE; +} + +static bool test_input_dialog() +{ + const auto title = "sometitle"; + std::vector labels; + std::vector initial; + std::vector flags; + for (size_t x = 0; x < 12; x++) + { + labels.push_back("label" + std::to_string(x)); + initial.push_back(std::to_string(x)); + + Uint32 flag = 0; + if ((x % 2) != 0) + flag |= SdlInputWidget::SDL_INPUT_MASK; + if ((x % 3) == 0) + flag |= SdlInputWidget::SDL_INPUT_READONLY; + + flags.push_back(flag); + } + SdlInputWidgetList list{ title, labels, initial, flags }; + std::vector result; + auto rc = list.run(result); + if (rc < 0) + { + return false; + } + if (result.size() != labels.size()) + { + return false; + } + return true; +} + +static bool test_select_dialog() +{ + const auto title = "sometitle"; + std::vector labels; + for (size_t x = 0; x < 12; x++) + { + labels.push_back("label" + std::to_string(x)); + } + SdlSelectList list{ title, labels }; + auto rc = list.run(); + if (rc < 0) + { + return false; + } + if (static_cast(rc) >= labels.size()) + return false; + + return true; +} + +extern "C" +{ + FREERDP_API int TestSDLDialogs(int argc, char* argv[]); +} + +int TestSDLDialogs(int argc, char* argv[]) +{ + int rc = 0; + + (void)argc; + (void)argv; + +#if 0 + SDL_Init(SDL_INIT_VIDEO); + try + { +#if 1 + if (!test_input_dialog()) + throw -1; +#endif +#if 1 + if (!test_select_dialog()) + throw -2; +#endif + } + catch (int e) + { + rc = e; + } + SDL_Quit(); + +#endif + return rc; +} diff --git a/client/SDL3/man/CMakeLists.txt b/client/SDL3/man/CMakeLists.txt new file mode 100644 index 000000000..2a1516d60 --- /dev/null +++ b/client/SDL3/man/CMakeLists.txt @@ -0,0 +1,8 @@ +set(DEPS + sdl3-freerdp-channels.1.xml + sdl3-freerdp-config.1.xml + sdl3-freerdp-examples.1.xml + sdl3-freerdp-envvar.1.xml + ) + +generate_and_install_freerdp_man_from_xml(${PROJECT_NAME} "1" "${FREERDP_API_VERSION}" "${DEPS}") diff --git a/client/SDL3/man/sdl3-freerdp-config.1.xml.in b/client/SDL3/man/sdl3-freerdp-config.1.xml.in new file mode 100644 index 000000000..3bace734f --- /dev/null +++ b/client/SDL3/man/sdl3-freerdp-config.1.xml.in @@ -0,0 +1,81 @@ + + Configuration file + + + + Format and Location: + + The configuration file is stored per user. + The XDG_CONFIG_HOME environment variable can be used to override the base directory. + This defaults to ~/.config + The location relative to XDG_CONFIG_HOME is $XDG_CONFIG_HOME/@VENDOR@/@PRODUCT@/@PROJECT_NAME@.json + The configuration is stored in JSON format + + + + Supported options: + + + SDL_KeyModMask + + + + Defines the key combination required for SDL client shortcuts. + Default KMOD_RSHIFT + An array of SDL_Keymod strings as defined at https://wiki.libsdl.org/SDL2/SDL_Keymod + + + + + + SDL_Fullscreen + + + + Toggles client fullscreen state. + Default SDL_SCANCODE_RETURN. + A string as defined at https://wiki.libsdl.org/SDL2/SDLScancodeLookup + + + + + + SDL_Resizeable + + + + Toggles local window resizeable state. + Default SDL_SCANCODE_R. + A string as defined at https://wiki.libsdl.org/SDL2/SDLScancodeLookup + + + + + + SDL_Grab + + + + Toggles keyboard and mouse grab state. + Default SDL_SCANCODE_G. + A string as defined at https://wiki.libsdl.org/SDL2/SDLScancodeLookup + + + + + + SDL_Disconnect + + + + Disconnects from the RDP session. + Default SDL_SCANCODE_D. + A string as defined at https://wiki.libsdl.org/SDL2/SDLScancodeLookup + + + + + + + + diff --git a/client/SDL3/man/sdl3-freerdp-envvar.1.xml.in b/client/SDL3/man/sdl3-freerdp-envvar.1.xml.in new file mode 100644 index 000000000..ab6c8c558 --- /dev/null +++ b/client/SDL3/man/sdl3-freerdp-envvar.1.xml.in @@ -0,0 +1,15 @@ + + Environment variables + + + + wlog environment variable + + sdl-freerdp uses wLog as its log facility, you can refer to the + corresponding man page (wlog(7)) for more informations. Arguments passed + via the /log-level or /log-filters + have precedence over the environment variables. + + + + diff --git a/client/SDL3/man/sdl3-freerdp-examples.1.xml.in b/client/SDL3/man/sdl3-freerdp-examples.1.xml.in new file mode 100644 index 000000000..7b0f87384 --- /dev/null +++ b/client/SDL3/man/sdl3-freerdp-examples.1.xml.in @@ -0,0 +1,95 @@ + + Examples + + + sdl-freerdp connection.rdp /p:Pwd123! /f + + Connect in fullscreen mode using a stored configuration connection.rdp and the password Pwd123! + + + + sdl-freerdp /u:USER /size:50%h /v:rdp.contoso.com + + Connect to host rdp.contoso.com with user USER and a size of 50 percent of the height. If width (w) is set instead of height (h) like /size:50%w. 50 percent of the width is used. + + + + sdl-freerdp /u:CONTOSO\\JohnDoe /p:Pwd123! /v:rdp.contoso.com + + Connect to host rdp.contoso.com with user CONTOSO\\JohnDoe and password Pwd123! + + + + sdl-freerdp /u:JohnDoe /p:Pwd123! /w:1366 /h:768 /v:192.168.1.100:4489 + + Connect to host 192.168.1.100 on port 4489 with user JohnDoe, password Pwd123!. The screen width is set to 1366 and the height to 768 + + + + sdl-freerdp /u:JohnDoe /p:Pwd123! /vmconnect:C824F53E-95D2-46C6-9A18-23A5BB403532 /v:192.168.1.100 + + Establish a connection to host 192.168.1.100 with user JohnDoe, password Pwd123! and connect to Hyper-V console (use port 2179, disable negotiation) with VMID C824F53E-95D2-46C6-9A18-23A5BB403532 + + + + +clipboard + + Activate clipboard redirection + + + + /drive:home,/home/user + + Activate drive redirection of /home/user as home drive + + + + /smartcard:<device> + + Activate smartcard redirection for device device + + + + /printer:<device>,<driver> + + Activate printer redirection for printer device using driver driver + + + + /serial:<device> + + Activate serial port redirection for port device + + + + /parallel:<device> + + Activate parallel port redirection for port device + + + + /sound:sys:alsa + + Activate audio output redirection using device sys:alsa + + + + /microphone:sys:alsa + + Activate audio input redirection using device sys:alsa + + + + /multimedia:sys:alsa + + Activate multimedia redirection using device sys:alsa + + + + /usb:id,dev:054c:0268 + + Activate USB device redirection for the device identified by 054c:0268 + + + + diff --git a/client/SDL3/man/sdl3-freerdp.1.xml.in b/client/SDL3/man/sdl3-freerdp.1.xml.in new file mode 100644 index 000000000..ba5b6cbf8 --- /dev/null +++ b/client/SDL3/man/sdl3-freerdp.1.xml.in @@ -0,0 +1,64 @@ + + + + + + ] +> + + + + @MAN_TODAY@ + + The FreeRDP Team + + + + @MANPAGE_NAME@ + 1 + freerdp + @MANPAGE_NAME@ + + + @MANPAGE_NAME@ + FreeRDP SDL client + + + + @MAN_TODAY@ + + + @MANPAGE_NAME@ [file] [options] [/v:server[:port]] + + + + + @MAN_TODAY@ + + DESCRIPTION + + @MANPAGE_NAME@ is an SDL Remote Desktop Protocol (RDP) + client which is part of the FreeRDP project. An RDP server is built-in + to many editions of Windows. Alternative servers included ogon, gnome-remote-desktop, + xrdp and VRDP (VirtualBox). + + + + &syntax; + + &config; + + &envvar; + + &examples; + + + LINKS + + http://www.freerdp.com/ + + + diff --git a/client/SDL3/sdl_channels.cpp b/client/SDL3/sdl_channels.cpp new file mode 100644 index 000000000..958c5e7f7 --- /dev/null +++ b/client/SDL3/sdl_channels.cpp @@ -0,0 +1,83 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * SDL Client Channels + * + * Copyright 2022 Armin Novak + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include + +#include +#include +#include + +#include "sdl_channels.hpp" +#include "sdl_freerdp.hpp" +#include "sdl_disp.hpp" + +void sdl_OnChannelConnectedEventHandler(void* context, const ChannelConnectedEventArgs* e) +{ + auto sdl = get_context(context); + + WINPR_ASSERT(sdl); + WINPR_ASSERT(e); + + if (strcmp(e->name, RAIL_SVC_CHANNEL_NAME) == 0) + { + } + else if (strcmp(e->name, CLIPRDR_SVC_CHANNEL_NAME) == 0) + { + auto clip = reinterpret_cast(e->pInterface); + WINPR_ASSERT(clip); + clip->custom = context; + } + else if (strcmp(e->name, DISP_DVC_CHANNEL_NAME) == 0) + { + auto disp = reinterpret_cast(e->pInterface); + WINPR_ASSERT(disp); + sdl->disp.init(disp); + } + else + freerdp_client_OnChannelConnectedEventHandler(context, e); +} + +void sdl_OnChannelDisconnectedEventHandler(void* context, const ChannelDisconnectedEventArgs* e) +{ + auto sdl = get_context(context); + + WINPR_ASSERT(sdl); + WINPR_ASSERT(e); + + // TODO: Set resizeable depending on disp channel and /dynamic-resolution + if (strcmp(e->name, RAIL_SVC_CHANNEL_NAME) == 0) + { + } + else if (strcmp(e->name, CLIPRDR_SVC_CHANNEL_NAME) == 0) + { + auto clip = reinterpret_cast(e->pInterface); + WINPR_ASSERT(clip); + clip->custom = nullptr; + } + else if (strcmp(e->name, DISP_DVC_CHANNEL_NAME) == 0) + { + auto disp = reinterpret_cast(e->pInterface); + WINPR_ASSERT(disp); + sdl->disp.uninit(disp); + } + else + freerdp_client_OnChannelDisconnectedEventHandler(context, e); +} diff --git a/client/SDL3/sdl_channels.hpp b/client/SDL3/sdl_channels.hpp new file mode 100644 index 000000000..a5c9f7d34 --- /dev/null +++ b/client/SDL3/sdl_channels.hpp @@ -0,0 +1,29 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * SDL Client Channels + * + * Copyright 2022 Armin Novak + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include +#include + +int sdl_on_channel_connected(freerdp* instance, const char* name, void* pInterface); +int sdl_on_channel_disconnected(freerdp* instance, const char* name, void* pInterface); + +void sdl_OnChannelConnectedEventHandler(void* context, const ChannelConnectedEventArgs* e); +void sdl_OnChannelDisconnectedEventHandler(void* context, const ChannelDisconnectedEventArgs* e); diff --git a/client/SDL3/sdl_disp.cpp b/client/SDL3/sdl_disp.cpp new file mode 100644 index 000000000..34863baec --- /dev/null +++ b/client/SDL3/sdl_disp.cpp @@ -0,0 +1,476 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * SDL Display Control Channel + * + * Copyright 2023 Armin Novak + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include + +#include + +#include + +#include "sdl_disp.hpp" +#include "sdl_kbd.hpp" +#include "sdl_utils.hpp" +#include "sdl_freerdp.hpp" + +#include +#define TAG CLIENT_TAG("sdl.disp") + +#define RESIZE_MIN_DELAY 200 /* minimum delay in ms between two resizes */ +#define MAX_RETRIES 5 + +BOOL sdlDispContext::settings_changed() +{ + auto settings = _sdl->context()->settings; + WINPR_ASSERT(settings); + + if (_lastSentWidth != _targetWidth) + return TRUE; + + if (_lastSentHeight != _targetHeight) + return TRUE; + + if (_lastSentDesktopOrientation != + freerdp_settings_get_uint16(settings, FreeRDP_DesktopOrientation)) + return TRUE; + + if (_lastSentDesktopScaleFactor != + freerdp_settings_get_uint32(settings, FreeRDP_DesktopScaleFactor)) + return TRUE; + + if (_lastSentDeviceScaleFactor != + freerdp_settings_get_uint32(settings, FreeRDP_DeviceScaleFactor)) + return TRUE; + /* TODO + if (_fullscreen != _sdl->fullscreen) + return TRUE; + */ + return FALSE; +} + +BOOL sdlDispContext::update_last_sent() +{ + WINPR_ASSERT(_sdl); + + auto settings = _sdl->context()->settings; + WINPR_ASSERT(settings); + + _lastSentWidth = _targetWidth; + _lastSentHeight = _targetHeight; + _lastSentDesktopOrientation = freerdp_settings_get_uint16(settings, FreeRDP_DesktopOrientation); + _lastSentDesktopScaleFactor = freerdp_settings_get_uint32(settings, FreeRDP_DesktopScaleFactor); + _lastSentDeviceScaleFactor = freerdp_settings_get_uint32(settings, FreeRDP_DeviceScaleFactor); + // TODO _fullscreen = _sdl->fullscreen; + return TRUE; +} + +BOOL sdlDispContext::sendResize() +{ + DISPLAY_CONTROL_MONITOR_LAYOUT layout = {}; + auto settings = _sdl->context()->settings; + + if (!settings) + return FALSE; + + if (!_activated || !_disp) + return TRUE; + + if (GetTickCount64() - _lastSentDate < RESIZE_MIN_DELAY) + return TRUE; + + _lastSentDate = GetTickCount64(); + + if (!settings_changed()) + return TRUE; + + const UINT32 mcount = freerdp_settings_get_uint32(settings, FreeRDP_MonitorCount); + if (_sdl->fullscreen && (mcount > 0)) + { + auto monitors = static_cast( + freerdp_settings_get_pointer(settings, FreeRDP_MonitorDefArray)); + if (sendLayout(monitors, mcount) != CHANNEL_RC_OK) + return FALSE; + } + else + { + _waitingResize = TRUE; + layout.Flags = DISPLAY_CONTROL_MONITOR_PRIMARY; + layout.Top = layout.Left = 0; + layout.Width = _targetWidth; + layout.Height = _targetHeight; + layout.Orientation = freerdp_settings_get_uint16(settings, FreeRDP_DesktopOrientation); + layout.DesktopScaleFactor = + freerdp_settings_get_uint32(settings, FreeRDP_DesktopScaleFactor); + layout.DeviceScaleFactor = freerdp_settings_get_uint32(settings, FreeRDP_DeviceScaleFactor); + layout.PhysicalWidth = _targetWidth; + layout.PhysicalHeight = _targetHeight; + + if (IFCALLRESULT(CHANNEL_RC_OK, _disp->SendMonitorLayout, _disp, 1, &layout) != + CHANNEL_RC_OK) + return FALSE; + } + return update_last_sent(); +} + +BOOL sdlDispContext::set_window_resizable() +{ + _sdl->update_resizeable(TRUE); + return TRUE; +} + +static BOOL sdl_disp_check_context(void* context, SdlContext** ppsdl, sdlDispContext** ppsdlDisp, + rdpSettings** ppSettings) +{ + if (!context) + return FALSE; + + auto sdl = get_context(context); + if (!sdl) + return FALSE; + + if (!sdl->context()->settings) + return FALSE; + + *ppsdl = sdl; + *ppsdlDisp = &sdl->disp; + *ppSettings = sdl->context()->settings; + return TRUE; +} + +void sdlDispContext::OnActivated(void* context, const ActivatedEventArgs* e) +{ + SdlContext* sdl = nullptr; + sdlDispContext* sdlDisp = nullptr; + rdpSettings* settings = nullptr; + + if (!sdl_disp_check_context(context, &sdl, &sdlDisp, &settings)) + return; + + sdlDisp->_waitingResize = FALSE; + + if (sdlDisp->_activated && !freerdp_settings_get_bool(settings, FreeRDP_Fullscreen)) + { + sdlDisp->set_window_resizable(); + + if (e->firstActivation) + return; + + sdlDisp->addTimer(); + } +} + +void sdlDispContext::OnGraphicsReset(void* context, const GraphicsResetEventArgs* e) +{ + SdlContext* sdl = nullptr; + sdlDispContext* sdlDisp = nullptr; + rdpSettings* settings = nullptr; + + WINPR_UNUSED(e); + if (!sdl_disp_check_context(context, &sdl, &sdlDisp, &settings)) + return; + + sdlDisp->_waitingResize = FALSE; + + if (sdlDisp->_activated && !freerdp_settings_get_bool(settings, FreeRDP_Fullscreen)) + { + sdlDisp->set_window_resizable(); + sdlDisp->addTimer(); + } +} + +Uint32 sdlDispContext::OnTimer(Uint32 interval, void* param) +{ + auto ctx = static_cast(param); + if (!ctx) + return 0; + + SdlContext* sdl = ctx->_sdl; + if (!sdl) + return 0; + + sdlDispContext* sdlDisp = nullptr; + rdpSettings* settings = nullptr; + + if (!sdl_disp_check_context(sdl->context(), &sdl, &sdlDisp, &settings)) + return 0; + + WLog_Print(sdl->log, WLOG_TRACE, "checking for display changes..."); + if (!sdlDisp->_activated || freerdp_settings_get_bool(settings, FreeRDP_Fullscreen)) + return 0; + else + { + auto rc = sdlDisp->sendResize(); + if (!rc) + WLog_Print(sdl->log, WLOG_TRACE, "sent new display layout, result %d", rc); + } + if (sdlDisp->_timer_retries++ >= MAX_RETRIES) + { + WLog_Print(sdl->log, WLOG_TRACE, "deactivate timer, retries exceeded"); + return 0; + } + + WLog_Print(sdl->log, WLOG_TRACE, "fire timer one more time"); + return interval; +} + +UINT sdlDispContext::sendLayout(const rdpMonitor* monitors, size_t nmonitors) +{ + UINT ret = CHANNEL_RC_OK; + + WINPR_ASSERT(monitors); + WINPR_ASSERT(nmonitors > 0); + + auto settings = _sdl->context()->settings; + WINPR_ASSERT(settings); + + std::vector layouts; + layouts.resize(nmonitors); + + for (size_t i = 0; i < nmonitors; i++) + { + auto monitor = &monitors[i]; + auto layout = &layouts[i]; + + layout->Flags = (monitor->is_primary ? DISPLAY_CONTROL_MONITOR_PRIMARY : 0); + layout->Left = monitor->x; + layout->Top = monitor->y; + layout->Width = monitor->width; + layout->Height = monitor->height; + layout->Orientation = ORIENTATION_LANDSCAPE; + layout->PhysicalWidth = monitor->attributes.physicalWidth; + layout->PhysicalHeight = monitor->attributes.physicalHeight; + + switch (monitor->attributes.orientation) + { + case 90: + layout->Orientation = ORIENTATION_PORTRAIT; + break; + + case 180: + layout->Orientation = ORIENTATION_LANDSCAPE_FLIPPED; + break; + + case 270: + layout->Orientation = ORIENTATION_PORTRAIT_FLIPPED; + break; + + case 0: + default: + /* MS-RDPEDISP - 2.2.2.2.1: + * Orientation (4 bytes): A 32-bit unsigned integer that specifies the + * orientation of the monitor in degrees. Valid values are 0, 90, 180 + * or 270 + * + * So we default to ORIENTATION_LANDSCAPE + */ + layout->Orientation = ORIENTATION_LANDSCAPE; + break; + } + + layout->DesktopScaleFactor = + freerdp_settings_get_uint32(settings, FreeRDP_DesktopScaleFactor); + layout->DeviceScaleFactor = + freerdp_settings_get_uint32(settings, FreeRDP_DeviceScaleFactor); + } + + WINPR_ASSERT(_disp); + ret = IFCALLRESULT(CHANNEL_RC_OK, _disp->SendMonitorLayout, _disp, layouts.size(), + layouts.data()); + return ret; +} + +BOOL sdlDispContext::addTimer() +{ + if (SDL_WasInit(SDL_INIT_TIMER) == 0) + return FALSE; + + SDL_RemoveTimer(_timer); + WLog_Print(_sdl->log, WLOG_TRACE, "adding new display check timer"); + + _timer_retries = 0; + sendResize(); + _timer = SDL_AddTimer(1000, sdlDispContext::OnTimer, this); + return TRUE; +} + +#if SDL_VERSION_ATLEAST(2, 0, 10) +BOOL sdlDispContext::handle_display_event(const SDL_DisplayEvent* ev) +{ + WINPR_ASSERT(ev); + + switch (ev->event) + { +#if SDL_VERSION_ATLEAST(2, 0, 14) + case SDL_DISPLAYEVENT_CONNECTED: + SDL_Log("A new display with id %d was connected", ev->display); + return TRUE; + case SDL_DISPLAYEVENT_DISCONNECTED: + SDL_Log("The display with id %d was disconnected", ev->display); + return TRUE; +#endif + case SDL_DISPLAYEVENT_ORIENTATION: + SDL_Log("The orientation of display with id %d was changed", ev->display); + return TRUE; + default: + return TRUE; + } +} +#endif + +BOOL sdlDispContext::handle_window_event(const SDL_WindowEvent* ev) +{ + WINPR_ASSERT(ev); + + auto bordered = freerdp_settings_get_bool(_sdl->context()->settings, FreeRDP_Decorations) + ? SDL_TRUE + : SDL_FALSE; + + auto it = _sdl->windows.find(ev->windowID); + if (it != _sdl->windows.end()) + it->second.setBordered(bordered); + + switch (ev->event) + { + case SDL_WINDOWEVENT_HIDDEN: + case SDL_WINDOWEVENT_MINIMIZED: + gdi_send_suppress_output(_sdl->context()->gdi, TRUE); + + return TRUE; + + case SDL_WINDOWEVENT_EXPOSED: + case SDL_WINDOWEVENT_SHOWN: + case SDL_WINDOWEVENT_MAXIMIZED: + case SDL_WINDOWEVENT_RESTORED: + gdi_send_suppress_output(_sdl->context()->gdi, FALSE); + return TRUE; + + case SDL_WINDOWEVENT_RESIZED: + case SDL_WINDOWEVENT_SIZE_CHANGED: + _targetWidth = ev->data1; + _targetHeight = ev->data2; + return addTimer(); + + case SDL_WINDOWEVENT_LEAVE: + WINPR_ASSERT(_sdl); + _sdl->input.keyboard_grab(ev->windowID, SDL_FALSE); + return TRUE; + case SDL_WINDOWEVENT_ENTER: + WINPR_ASSERT(_sdl); + _sdl->input.keyboard_grab(ev->windowID, SDL_TRUE); + return _sdl->input.keyboard_focus_in(); + case SDL_WINDOWEVENT_FOCUS_GAINED: + case SDL_WINDOWEVENT_TAKE_FOCUS: + return _sdl->input.keyboard_focus_in(); + + default: + return TRUE; + } +} + +UINT sdlDispContext::DisplayControlCaps(DispClientContext* disp, UINT32 maxNumMonitors, + UINT32 maxMonitorAreaFactorA, UINT32 maxMonitorAreaFactorB) +{ + /* we're called only if dynamic resolution update is activated */ + WINPR_ASSERT(disp); + + auto sdlDisp = reinterpret_cast(disp->custom); + return sdlDisp->DisplayControlCaps(maxNumMonitors, maxMonitorAreaFactorA, + maxMonitorAreaFactorB); +} + +UINT sdlDispContext::DisplayControlCaps(UINT32 maxNumMonitors, UINT32 maxMonitorAreaFactorA, + UINT32 maxMonitorAreaFactorB) +{ + auto settings = _sdl->context()->settings; + WINPR_ASSERT(settings); + + WLog_DBG(TAG, + "DisplayControlCapsPdu: MaxNumMonitors: %" PRIu32 " MaxMonitorAreaFactorA: %" PRIu32 + " MaxMonitorAreaFactorB: %" PRIu32 "", + maxNumMonitors, maxMonitorAreaFactorA, maxMonitorAreaFactorB); + _activated = TRUE; + + if (freerdp_settings_get_bool(settings, FreeRDP_Fullscreen)) + return CHANNEL_RC_OK; + + WLog_DBG(TAG, "DisplayControlCapsPdu: setting the window as resizable"); + return set_window_resizable() ? CHANNEL_RC_OK : CHANNEL_RC_NO_MEMORY; +} + +BOOL sdlDispContext::init(DispClientContext* disp) +{ + if (!disp) + return FALSE; + + auto settings = _sdl->context()->settings; + + if (!settings) + return FALSE; + + _disp = disp; + disp->custom = this; + + if (freerdp_settings_get_bool(settings, FreeRDP_DynamicResolutionUpdate)) + { + disp->DisplayControlCaps = sdlDispContext::DisplayControlCaps; + } + + _sdl->update_resizeable(TRUE); + return TRUE; +} + +BOOL sdlDispContext::uninit(DispClientContext* disp) +{ + if (!disp) + return FALSE; + + _disp = nullptr; + _sdl->update_resizeable(FALSE); + return TRUE; +} + +sdlDispContext::sdlDispContext(SdlContext* sdl) : _sdl(sdl), _timer(0) +{ + SDL_Init(SDL_INIT_TIMER | SDL_INIT_VIDEO); + + WINPR_ASSERT(_sdl); + WINPR_ASSERT(_sdl->context()->settings); + WINPR_ASSERT(_sdl->context()->pubSub); + + auto settings = _sdl->context()->settings; + auto pubSub = _sdl->context()->pubSub; + + _lastSentWidth = _targetWidth = freerdp_settings_get_uint32(settings, FreeRDP_DesktopWidth); + _lastSentHeight = _targetHeight = freerdp_settings_get_uint32(settings, FreeRDP_DesktopHeight); + PubSub_SubscribeActivated(pubSub, sdlDispContext::OnActivated); + PubSub_SubscribeGraphicsReset(pubSub, sdlDispContext::OnGraphicsReset); + addTimer(); +} + +sdlDispContext::~sdlDispContext() +{ + wPubSub* pubSub = _sdl->context()->pubSub; + WINPR_ASSERT(pubSub); + + PubSub_UnsubscribeActivated(pubSub, sdlDispContext::OnActivated); + PubSub_UnsubscribeGraphicsReset(pubSub, sdlDispContext::OnGraphicsReset); + SDL_RemoveTimer(_timer); + SDL_Quit(); +} diff --git a/client/SDL3/sdl_disp.hpp b/client/SDL3/sdl_disp.hpp new file mode 100644 index 000000000..fbe636224 --- /dev/null +++ b/client/SDL3/sdl_disp.hpp @@ -0,0 +1,82 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * SDL Display Control Channel + * + * Copyright 2023 Armin Novak + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#pragma once + +#include +#include +#include + +#include "sdl_types.hpp" + +#include + +class sdlDispContext +{ + + public: + explicit sdlDispContext(SdlContext* sdl); + ~sdlDispContext(); + + BOOL init(DispClientContext* disp); + BOOL uninit(DispClientContext* disp); + +#if SDL_VERSION_ATLEAST(2, 0, 10) + BOOL handle_display_event(const SDL_DisplayEvent* ev); +#endif + + BOOL handle_window_event(const SDL_WindowEvent* ev); + + private: + UINT DisplayControlCaps(UINT32 maxNumMonitors, UINT32 maxMonitorAreaFactorA, + UINT32 maxMonitorAreaFactorB); + BOOL set_window_resizable(); + + BOOL sendResize(); + BOOL settings_changed(); + BOOL update_last_sent(); + UINT sendLayout(const rdpMonitor* monitors, size_t nmonitors); + + BOOL addTimer(); + + private: + static UINT DisplayControlCaps(DispClientContext* disp, UINT32 maxNumMonitors, + UINT32 maxMonitorAreaFactorA, UINT32 maxMonitorAreaFactorB); + static void OnActivated(void* context, const ActivatedEventArgs* e); + static void OnGraphicsReset(void* context, const GraphicsResetEventArgs* e); + static Uint32 SDLCALL OnTimer(Uint32 interval, void* param); + + private: + SdlContext* _sdl = nullptr; + DispClientContext* _disp = nullptr; + int _eventBase = -1; + int _errorBase = -1; + int _lastSentWidth = -1; + int _lastSentHeight = -1; + UINT64 _lastSentDate = 0; + int _targetWidth = -1; + int _targetHeight = -1; + BOOL _activated = FALSE; + BOOL _waitingResize = FALSE; + BOOL _fullscreen = FALSE; + UINT16 _lastSentDesktopOrientation = 0; + UINT32 _lastSentDesktopScaleFactor = 0; + UINT32 _lastSentDeviceScaleFactor = 0; + SDL_TimerID _timer = 0; + unsigned _timer_retries = 0; +}; diff --git a/client/SDL3/sdl_freerdp.cpp b/client/SDL3/sdl_freerdp.cpp new file mode 100644 index 000000000..d4cdf27f1 --- /dev/null +++ b/client/SDL3/sdl_freerdp.cpp @@ -0,0 +1,1706 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * FreeRDP SDL UI + * + * Copyright 2022 Armin Novak + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include + +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "sdl_channels.hpp" +#include "sdl_freerdp.hpp" +#include "sdl_utils.hpp" +#include "sdl_disp.hpp" +#include "sdl_monitor.hpp" +#include "sdl_kbd.hpp" +#include "sdl_touch.hpp" +#include "sdl_pointer.hpp" +#include "sdl_prefs.hpp" +#include "dialogs/sdl_dialogs.hpp" + +#include "aad/sdl_webview.hpp" + +#define SDL_TAG CLIENT_TAG("SDL") + +enum SDL_EXIT_CODE +{ + /* section 0-15: protocol-independent codes */ + SDL_EXIT_SUCCESS = 0, + SDL_EXIT_DISCONNECT = 1, + SDL_EXIT_LOGOFF = 2, + SDL_EXIT_IDLE_TIMEOUT = 3, + SDL_EXIT_LOGON_TIMEOUT = 4, + SDL_EXIT_CONN_REPLACED = 5, + SDL_EXIT_OUT_OF_MEMORY = 6, + SDL_EXIT_CONN_DENIED = 7, + SDL_EXIT_CONN_DENIED_FIPS = 8, + SDL_EXIT_USER_PRIVILEGES = 9, + SDL_EXIT_FRESH_CREDENTIALS_REQUIRED = 10, + SDL_EXIT_DISCONNECT_BY_USER = 11, + + /* section 16-31: license error set */ + SDL_EXIT_LICENSE_INTERNAL = 16, + SDL_EXIT_LICENSE_NO_LICENSE_SERVER = 17, + SDL_EXIT_LICENSE_NO_LICENSE = 18, + SDL_EXIT_LICENSE_BAD_CLIENT_MSG = 19, + SDL_EXIT_LICENSE_HWID_DOESNT_MATCH = 20, + SDL_EXIT_LICENSE_BAD_CLIENT = 21, + SDL_EXIT_LICENSE_CANT_FINISH_PROTOCOL = 22, + SDL_EXIT_LICENSE_CLIENT_ENDED_PROTOCOL = 23, + SDL_EXIT_LICENSE_BAD_CLIENT_ENCRYPTION = 24, + SDL_EXIT_LICENSE_CANT_UPGRADE = 25, + SDL_EXIT_LICENSE_NO_REMOTE_CONNECTIONS = 26, + + /* section 32-127: RDP protocol error set */ + SDL_EXIT_RDP = 32, + + /* section 128-254: xfreerdp specific exit codes */ + SDL_EXIT_PARSE_ARGUMENTS = 128, + SDL_EXIT_MEMORY = 129, + SDL_EXIT_PROTOCOL = 130, + SDL_EXIT_CONN_FAILED = 131, + SDL_EXIT_AUTH_FAILURE = 132, + SDL_EXIT_NEGO_FAILURE = 133, + SDL_EXIT_LOGON_FAILURE = 134, + SDL_EXIT_ACCOUNT_LOCKED_OUT = 135, + SDL_EXIT_PRE_CONNECT_FAILED = 136, + SDL_EXIT_CONNECT_UNDEFINED = 137, + SDL_EXIT_POST_CONNECT_FAILED = 138, + SDL_EXIT_DNS_ERROR = 139, + SDL_EXIT_DNS_NAME_NOT_FOUND = 140, + SDL_EXIT_CONNECT_FAILED = 141, + SDL_EXIT_MCS_CONNECT_INITIAL_ERROR = 142, + SDL_EXIT_TLS_CONNECT_FAILED = 143, + SDL_EXIT_INSUFFICIENT_PRIVILEGES = 144, + SDL_EXIT_CONNECT_CANCELLED = 145, + + SDL_EXIT_CONNECT_TRANSPORT_FAILED = 147, + SDL_EXIT_CONNECT_PASSWORD_EXPIRED = 148, + SDL_EXIT_CONNECT_PASSWORD_MUST_CHANGE = 149, + SDL_EXIT_CONNECT_KDC_UNREACHABLE = 150, + SDL_EXIT_CONNECT_ACCOUNT_DISABLED = 151, + SDL_EXIT_CONNECT_PASSWORD_CERTAINLY_EXPIRED = 152, + SDL_EXIT_CONNECT_CLIENT_REVOKED = 153, + SDL_EXIT_CONNECT_WRONG_PASSWORD = 154, + SDL_EXIT_CONNECT_ACCESS_DENIED = 155, + SDL_EXIT_CONNECT_ACCOUNT_RESTRICTION = 156, + SDL_EXIT_CONNECT_ACCOUNT_EXPIRED = 157, + SDL_EXIT_CONNECT_LOGON_TYPE_NOT_GRANTED = 158, + SDL_EXIT_CONNECT_NO_OR_MISSING_CREDENTIALS = 159, + + SDL_EXIT_UNKNOWN = 255, +}; + +struct sdl_exit_code_map_t +{ + DWORD error; + int code; + const char* code_tag; +}; + +#define ENTRY(x, y) \ + { \ + x, y, #y \ + } +static const struct sdl_exit_code_map_t sdl_exit_code_map[] = { + ENTRY(FREERDP_ERROR_SUCCESS, SDL_EXIT_SUCCESS), ENTRY(FREERDP_ERROR_NONE, SDL_EXIT_DISCONNECT), + ENTRY(FREERDP_ERROR_NONE, SDL_EXIT_LOGOFF), ENTRY(FREERDP_ERROR_NONE, SDL_EXIT_IDLE_TIMEOUT), + ENTRY(FREERDP_ERROR_NONE, SDL_EXIT_LOGON_TIMEOUT), + ENTRY(FREERDP_ERROR_NONE, SDL_EXIT_CONN_REPLACED), + ENTRY(FREERDP_ERROR_NONE, SDL_EXIT_OUT_OF_MEMORY), + ENTRY(FREERDP_ERROR_NONE, SDL_EXIT_CONN_DENIED), + ENTRY(FREERDP_ERROR_NONE, SDL_EXIT_CONN_DENIED_FIPS), + ENTRY(FREERDP_ERROR_NONE, SDL_EXIT_USER_PRIVILEGES), + ENTRY(FREERDP_ERROR_NONE, SDL_EXIT_FRESH_CREDENTIALS_REQUIRED), + ENTRY(ERRINFO_LOGOFF_BY_USER, SDL_EXIT_DISCONNECT_BY_USER), + ENTRY(FREERDP_ERROR_NONE, SDL_EXIT_UNKNOWN), + + /* section 16-31: license error set */ + ENTRY(FREERDP_ERROR_NONE, SDL_EXIT_LICENSE_INTERNAL), + ENTRY(FREERDP_ERROR_NONE, SDL_EXIT_LICENSE_NO_LICENSE_SERVER), + ENTRY(FREERDP_ERROR_NONE, SDL_EXIT_LICENSE_NO_LICENSE), + ENTRY(FREERDP_ERROR_NONE, SDL_EXIT_LICENSE_BAD_CLIENT_MSG), + ENTRY(FREERDP_ERROR_NONE, SDL_EXIT_LICENSE_HWID_DOESNT_MATCH), + ENTRY(FREERDP_ERROR_NONE, SDL_EXIT_LICENSE_BAD_CLIENT), + ENTRY(FREERDP_ERROR_NONE, SDL_EXIT_LICENSE_CANT_FINISH_PROTOCOL), + ENTRY(FREERDP_ERROR_NONE, SDL_EXIT_LICENSE_CLIENT_ENDED_PROTOCOL), + ENTRY(FREERDP_ERROR_NONE, SDL_EXIT_LICENSE_BAD_CLIENT_ENCRYPTION), + ENTRY(FREERDP_ERROR_NONE, SDL_EXIT_LICENSE_CANT_UPGRADE), + ENTRY(FREERDP_ERROR_NONE, SDL_EXIT_LICENSE_NO_REMOTE_CONNECTIONS), + ENTRY(FREERDP_ERROR_NONE, SDL_EXIT_LICENSE_CANT_UPGRADE), + + /* section 32-127: RDP protocol error set */ + ENTRY(FREERDP_ERROR_NONE, SDL_EXIT_RDP), + + /* section 128-254: xfreerdp specific exit codes */ + ENTRY(FREERDP_ERROR_NONE, SDL_EXIT_PARSE_ARGUMENTS), ENTRY(FREERDP_ERROR_NONE, SDL_EXIT_MEMORY), + ENTRY(FREERDP_ERROR_NONE, SDL_EXIT_PROTOCOL), ENTRY(FREERDP_ERROR_NONE, SDL_EXIT_CONN_FAILED), + + ENTRY(FREERDP_ERROR_AUTHENTICATION_FAILED, SDL_EXIT_AUTH_FAILURE), + ENTRY(FREERDP_ERROR_SECURITY_NEGO_CONNECT_FAILED, SDL_EXIT_NEGO_FAILURE), + ENTRY(FREERDP_ERROR_CONNECT_LOGON_FAILURE, SDL_EXIT_LOGON_FAILURE), + ENTRY(FREERDP_ERROR_CONNECT_ACCOUNT_LOCKED_OUT, SDL_EXIT_ACCOUNT_LOCKED_OUT), + ENTRY(FREERDP_ERROR_PRE_CONNECT_FAILED, SDL_EXIT_PRE_CONNECT_FAILED), + ENTRY(FREERDP_ERROR_CONNECT_UNDEFINED, SDL_EXIT_CONNECT_UNDEFINED), + ENTRY(FREERDP_ERROR_POST_CONNECT_FAILED, SDL_EXIT_POST_CONNECT_FAILED), + ENTRY(FREERDP_ERROR_DNS_ERROR, SDL_EXIT_DNS_ERROR), + ENTRY(FREERDP_ERROR_DNS_NAME_NOT_FOUND, SDL_EXIT_DNS_NAME_NOT_FOUND), + ENTRY(FREERDP_ERROR_CONNECT_FAILED, SDL_EXIT_CONNECT_FAILED), + ENTRY(FREERDP_ERROR_MCS_CONNECT_INITIAL_ERROR, SDL_EXIT_MCS_CONNECT_INITIAL_ERROR), + ENTRY(FREERDP_ERROR_TLS_CONNECT_FAILED, SDL_EXIT_TLS_CONNECT_FAILED), + ENTRY(FREERDP_ERROR_INSUFFICIENT_PRIVILEGES, SDL_EXIT_INSUFFICIENT_PRIVILEGES), + ENTRY(FREERDP_ERROR_CONNECT_CANCELLED, SDL_EXIT_CONNECT_CANCELLED), + ENTRY(FREERDP_ERROR_CONNECT_TRANSPORT_FAILED, SDL_EXIT_CONNECT_TRANSPORT_FAILED), + ENTRY(FREERDP_ERROR_CONNECT_PASSWORD_EXPIRED, SDL_EXIT_CONNECT_PASSWORD_EXPIRED), + ENTRY(FREERDP_ERROR_CONNECT_PASSWORD_MUST_CHANGE, SDL_EXIT_CONNECT_PASSWORD_MUST_CHANGE), + ENTRY(FREERDP_ERROR_CONNECT_KDC_UNREACHABLE, SDL_EXIT_CONNECT_KDC_UNREACHABLE), + ENTRY(FREERDP_ERROR_CONNECT_ACCOUNT_DISABLED, SDL_EXIT_CONNECT_ACCOUNT_DISABLED), + ENTRY(FREERDP_ERROR_CONNECT_PASSWORD_CERTAINLY_EXPIRED, + SDL_EXIT_CONNECT_PASSWORD_CERTAINLY_EXPIRED), + ENTRY(FREERDP_ERROR_CONNECT_CLIENT_REVOKED, SDL_EXIT_CONNECT_CLIENT_REVOKED), + ENTRY(FREERDP_ERROR_CONNECT_WRONG_PASSWORD, SDL_EXIT_CONNECT_WRONG_PASSWORD), + ENTRY(FREERDP_ERROR_CONNECT_ACCESS_DENIED, SDL_EXIT_CONNECT_ACCESS_DENIED), + ENTRY(FREERDP_ERROR_CONNECT_ACCOUNT_RESTRICTION, SDL_EXIT_CONNECT_ACCOUNT_RESTRICTION), + ENTRY(FREERDP_ERROR_CONNECT_ACCOUNT_EXPIRED, SDL_EXIT_CONNECT_ACCOUNT_EXPIRED), + ENTRY(FREERDP_ERROR_CONNECT_LOGON_TYPE_NOT_GRANTED, SDL_EXIT_CONNECT_LOGON_TYPE_NOT_GRANTED), + ENTRY(FREERDP_ERROR_CONNECT_NO_OR_MISSING_CREDENTIALS, + SDL_EXIT_CONNECT_NO_OR_MISSING_CREDENTIALS) +}; + +static const struct sdl_exit_code_map_t* sdl_map_entry_by_code(int exit_code) +{ + for (size_t x = 0; x < ARRAYSIZE(sdl_exit_code_map); x++) + { + const struct sdl_exit_code_map_t* cur = &sdl_exit_code_map[x]; + if (cur->code == exit_code) + return cur; + } + return nullptr; +} + +static const struct sdl_exit_code_map_t* sdl_map_entry_by_error(DWORD error) +{ + for (size_t x = 0; x < ARRAYSIZE(sdl_exit_code_map); x++) + { + const struct sdl_exit_code_map_t* cur = &sdl_exit_code_map[x]; + if (cur->error == error) + return cur; + } + return nullptr; +} + +static int sdl_map_error_to_exit_code(DWORD error) +{ + const struct sdl_exit_code_map_t* entry = sdl_map_entry_by_error(error); + if (entry) + return entry->code; + + return SDL_EXIT_CONN_FAILED; +} + +static const char* sdl_map_error_to_code_tag(DWORD error) +{ + const struct sdl_exit_code_map_t* entry = sdl_map_entry_by_error(error); + if (entry) + return entry->code_tag; + return nullptr; +} + +static const char* sdl_map_to_code_tag(int code) +{ + const struct sdl_exit_code_map_t* entry = sdl_map_entry_by_code(code); + if (entry) + return entry->code_tag; + return nullptr; +} + +static int error_info_to_error(freerdp* instance, DWORD* pcode, char** msg, size_t* len) +{ + const DWORD code = freerdp_error_info(instance); + const char* name = freerdp_get_error_info_name(code); + const char* str = freerdp_get_error_info_string(code); + const int exit_code = sdl_map_error_to_exit_code(code); + + winpr_asprintf(msg, len, "Terminate with %s due to ERROR_INFO %s [0x%08" PRIx32 "]: %s", + sdl_map_error_to_code_tag(exit_code), name, code, str); + WLog_DBG(SDL_TAG, "%s", *msg); + if (pcode) + *pcode = code; + return exit_code; +} + +/* This function is called whenever a new frame starts. + * It can be used to reset invalidated areas. */ +static BOOL sdl_begin_paint(rdpContext* context) +{ + rdpGdi* gdi = nullptr; + auto sdl = get_context(context); + + WINPR_ASSERT(sdl); + + HANDLE handles[] = { sdl->update_complete.handle(), freerdp_abort_event(context) }; + const DWORD status = WaitForMultipleObjects(ARRAYSIZE(handles), handles, FALSE, INFINITE); + switch (status) + { + case WAIT_OBJECT_0: + break; + default: + return FALSE; + } + sdl->update_complete.clear(); + + gdi = context->gdi; + WINPR_ASSERT(gdi); + WINPR_ASSERT(gdi->primary); + WINPR_ASSERT(gdi->primary->hdc); + WINPR_ASSERT(gdi->primary->hdc->hwnd); + WINPR_ASSERT(gdi->primary->hdc->hwnd->invalid); + gdi->primary->hdc->hwnd->invalid->null = TRUE; + gdi->primary->hdc->hwnd->ninvalid = 0; + + return TRUE; +} + +static BOOL sdl_redraw(SdlContext* sdl) +{ + WINPR_ASSERT(sdl); + + auto gdi = sdl->context()->gdi; + return gdi_send_suppress_output(gdi, FALSE); +} + +class SdlEventUpdateTriggerGuard +{ + private: + SdlContext* _sdl; + + public: + explicit SdlEventUpdateTriggerGuard(SdlContext* sdl) : _sdl(sdl) + { + } + ~SdlEventUpdateTriggerGuard() + { + _sdl->update_complete.set(); + } +}; + +static bool sdl_draw_to_window_rect(SdlContext* sdl, SdlWindow& window, SDL_Surface* surface, + SDL_Point offset, const SDL_Rect& srcRect) +{ + SDL_Rect dstRect = { offset.x + srcRect.x, offset.y + srcRect.y, srcRect.w, srcRect.h }; + return window.blit(surface, srcRect, dstRect); +} + +static bool sdl_draw_to_window_rect(SdlContext* sdl, SdlWindow& window, SDL_Surface* surface, + SDL_Point offset, const std::vector& rects = {}) +{ + if (rects.empty()) + { + return sdl_draw_to_window_rect(sdl, window, surface, offset, + { 0, 0, surface->w, surface->h }); + } + for (auto& srcRect : rects) + { + if (!sdl_draw_to_window_rect(sdl, window, surface, offset, srcRect)) + return false; + } + return true; +} + +static bool sdl_draw_to_window_scaled_rect(SdlContext* sdl, SdlWindow& window, SDL_Surface* surface, + const SDL_Rect& srcRect) +{ + SDL_Rect dstRect = srcRect; + sdl_scale_coordinates(sdl, window.id(), &dstRect.x, &dstRect.y, FALSE, TRUE); + sdl_scale_coordinates(sdl, window.id(), &dstRect.w, &dstRect.h, FALSE, TRUE); + return window.blit(surface, srcRect, dstRect); +} + +static BOOL sdl_draw_to_window_scaled_rect(SdlContext* sdl, SdlWindow& window, SDL_Surface* surface, + const std::vector& rects = {}) +{ + if (rects.empty()) + { + return sdl_draw_to_window_scaled_rect(sdl, window, surface, + { 0, 0, surface->w, surface->h }); + } + for (const auto& srcRect : rects) + { + if (!sdl_draw_to_window_scaled_rect(sdl, window, surface, srcRect)) + return FALSE; + } + return TRUE; +} + +static BOOL sdl_draw_to_window(SdlContext* sdl, SdlWindow& window, + const std::vector& rects = {}) +{ + WINPR_ASSERT(sdl); + + auto context = sdl->context(); + auto gdi = context->gdi; + + auto size = window.rect(); + + if (!freerdp_settings_get_bool(context->settings, FreeRDP_SmartSizing)) + { + if (gdi->width < size.w) + { + window.setOffsetX((size.w - gdi->width) / 2); + } + if (gdi->height < size.h) + { + window.setOffsetY((size.h - gdi->height) / 2); + } + + auto surface = sdl->primary.get(); + if (!sdl_draw_to_window_rect(sdl, window, surface, { window.offsetX(), window.offsetY() }, + rects)) + return FALSE; + } + else + { + if (!sdl_draw_to_window_scaled_rect(sdl, window, sdl->primary.get(), rects)) + return FALSE; + } + window.updateSurface(); + return TRUE; +} + +static BOOL sdl_draw_to_window(SdlContext* sdl, std::map& windows, + const std::vector& rects = {}) +{ + for (auto& window : windows) + { + if (!sdl_draw_to_window(sdl, window.second, rects)) + return FALSE; + } + + return TRUE; +} + +static BOOL sdl_end_paint_process(rdpContext* context) +{ + rdpGdi* gdi = nullptr; + auto sdl = get_context(context); + + WINPR_ASSERT(context); + + SdlEventUpdateTriggerGuard guard(sdl); + + gdi = context->gdi; + WINPR_ASSERT(gdi); + WINPR_ASSERT(gdi->primary); + WINPR_ASSERT(gdi->primary->hdc); + WINPR_ASSERT(gdi->primary->hdc->hwnd); + WINPR_ASSERT(gdi->primary->hdc->hwnd->invalid); + if (gdi->suppressOutput || gdi->primary->hdc->hwnd->invalid->null) + return TRUE; + + const INT32 ninvalid = gdi->primary->hdc->hwnd->ninvalid; + const GDI_RGN* cinvalid = gdi->primary->hdc->hwnd->cinvalid; + + if (ninvalid < 1) + return TRUE; + + std::vector rects; + for (INT32 x = 0; x < ninvalid; x++) + { + auto& rgn = cinvalid[x]; + rects.push_back({ rgn.x, rgn.y, rgn.w, rgn.h }); + } + + return sdl_draw_to_window(sdl, sdl->windows, rects); +} + +/* This function is called when the library completed composing a new + * frame. Read out the changed areas and blit them to your output device. + * The image buffer will have the format specified by gdi_init + */ +static BOOL sdl_end_paint(rdpContext* context) +{ + auto sdl = get_context(context); + WINPR_ASSERT(sdl); + + std::lock_guard lock(sdl->critical); + const BOOL rc = sdl_push_user_event(SDL_USEREVENT_UPDATE, context); + + return rc; +} + +static void sdl_destroy_primary(SdlContext* sdl) +{ + if (!sdl) + return; + sdl->primary.reset(); + sdl->primary_format.reset(); +} + +/* Create a SDL surface from the GDI buffer */ +static BOOL sdl_create_primary(SdlContext* sdl) +{ + rdpGdi* gdi = nullptr; + + WINPR_ASSERT(sdl); + + gdi = sdl->context()->gdi; + WINPR_ASSERT(gdi); + + sdl_destroy_primary(sdl); + sdl->primary = SDLSurfacePtr( + SDL_CreateRGBSurfaceWithFormatFrom(gdi->primary_buffer, static_cast(gdi->width), + static_cast(gdi->height), + static_cast(FreeRDPGetBitsPerPixel(gdi->dstFormat)), + static_cast(gdi->stride), sdl->sdl_pixel_format), + SDL_FreeSurface); + sdl->primary_format = SDLPixelFormatPtr(SDL_AllocFormat(sdl->sdl_pixel_format), SDL_FreeFormat); + + if (!sdl->primary || !sdl->primary_format) + return FALSE; + + SDL_SetSurfaceBlendMode(sdl->primary.get(), SDL_BLENDMODE_NONE); + SDL_FillRect(sdl->primary.get(), nullptr, + SDL_MapRGBA(sdl->primary_format.get(), 0, 0, 0, 0xff)); + + return TRUE; +} + +static BOOL sdl_desktop_resize(rdpContext* context) +{ + rdpGdi* gdi = nullptr; + rdpSettings* settings = nullptr; + auto sdl = get_context(context); + + WINPR_ASSERT(sdl); + WINPR_ASSERT(context); + + settings = context->settings; + WINPR_ASSERT(settings); + + std::lock_guard lock(sdl->critical); + gdi = context->gdi; + if (!gdi_resize(gdi, freerdp_settings_get_uint32(settings, FreeRDP_DesktopWidth), + freerdp_settings_get_uint32(settings, FreeRDP_DesktopHeight))) + return FALSE; + return sdl_create_primary(sdl); +} + +/* This function is called to output a System BEEP */ +static BOOL sdl_play_sound(rdpContext* context, const PLAY_SOUND_UPDATE* play_sound) +{ + /* TODO: Implement */ + WINPR_UNUSED(context); + WINPR_UNUSED(play_sound); + return TRUE; +} + +static BOOL sdl_wait_for_init(SdlContext* sdl) +{ + WINPR_ASSERT(sdl); + sdl->initialize.set(); + + HANDLE handles[] = { sdl->initialized.handle(), freerdp_abort_event(sdl->context()) }; + + const DWORD rc = WaitForMultipleObjects(ARRAYSIZE(handles), handles, FALSE, INFINITE); + switch (rc) + { + case WAIT_OBJECT_0: + return TRUE; + default: + return FALSE; + } +} + +/* Called before a connection is established. + * Set all configuration options to support and load channels here. */ +static BOOL sdl_pre_connect(freerdp* instance) +{ + WINPR_ASSERT(instance); + WINPR_ASSERT(instance->context); + + auto sdl = get_context(instance->context); + + auto settings = instance->context->settings; + WINPR_ASSERT(settings); + + /* Optional OS identifier sent to server */ + if (!freerdp_settings_set_uint32(settings, FreeRDP_OsMajorType, OSMAJORTYPE_UNIX)) + return FALSE; + if (!freerdp_settings_set_uint32(settings, FreeRDP_OsMinorType, OSMINORTYPE_NATIVE_SDL)) + return FALSE; + /* OrderSupport is initialized at this point. + * Only override it if you plan to implement custom order + * callbacks or deactiveate certain features. */ + /* Register the channel listeners. + * They are required to set up / tear down channels if they are loaded. */ + PubSub_SubscribeChannelConnected(instance->context->pubSub, sdl_OnChannelConnectedEventHandler); + PubSub_SubscribeChannelDisconnected(instance->context->pubSub, + sdl_OnChannelDisconnectedEventHandler); + + if (!freerdp_settings_get_bool(settings, FreeRDP_AuthenticationOnly)) + { + UINT32 maxWidth = 0; + UINT32 maxHeight = 0; + + if (!sdl_wait_for_init(sdl)) + return FALSE; + + std::lock_guard lock(sdl->critical); + if (!freerdp_settings_get_bool(settings, FreeRDP_UseCommonStdioCallbacks)) + sdl->connection_dialog = std::make_unique(instance->context); + if (sdl->connection_dialog) + { + sdl->connection_dialog->setTitle("Connecting to '%s'", + freerdp_settings_get_server_name(settings)); + sdl->connection_dialog->showInfo( + "The connection is being established\n\nPlease wait..."); + } + if (!sdl_detect_monitors(sdl, &maxWidth, &maxHeight)) + return FALSE; + + if ((maxWidth != 0) && (maxHeight != 0) && + !freerdp_settings_get_bool(settings, FreeRDP_SmartSizing)) + { + WLog_Print(sdl->log, WLOG_INFO, "Update size to %ux%u", maxWidth, maxHeight); + if (!freerdp_settings_set_uint32(settings, FreeRDP_DesktopWidth, maxWidth)) + return FALSE; + if (!freerdp_settings_set_uint32(settings, FreeRDP_DesktopHeight, maxHeight)) + return FALSE; + } + } + else + { + /* Check +auth-only has a username and password. */ + if (!freerdp_settings_get_string(settings, FreeRDP_Password)) + { + WLog_Print(sdl->log, WLOG_INFO, "auth-only, but no password set. Please provide one."); + return FALSE; + } + + if (!freerdp_settings_set_bool(settings, FreeRDP_DeactivateClientDecoding, TRUE)) + return FALSE; + + WLog_Print(sdl->log, WLOG_INFO, "Authentication only. Don't connect SDL."); + } + + /* TODO: Any code your client requires */ + return TRUE; +} + +static const char* sdl_window_get_title(rdpSettings* settings) +{ + const char* windowTitle = nullptr; + UINT32 port = 0; + BOOL addPort = 0; + const char* name = nullptr; + const char* prefix = "FreeRDP:"; + + if (!settings) + return nullptr; + + windowTitle = freerdp_settings_get_string(settings, FreeRDP_WindowTitle); + if (windowTitle) + return windowTitle; + + name = freerdp_settings_get_server_name(settings); + port = freerdp_settings_get_uint32(settings, FreeRDP_ServerPort); + + addPort = (port != 3389); + + char buffer[MAX_PATH + 64] = { 0 }; + + if (!addPort) + sprintf_s(buffer, sizeof(buffer), "%s %s", prefix, name); + else + sprintf_s(buffer, sizeof(buffer), "%s %s:%" PRIu32, prefix, name, port); + + if (!freerdp_settings_set_string(settings, FreeRDP_WindowTitle, buffer)) + return nullptr; + return freerdp_settings_get_string(settings, FreeRDP_WindowTitle); +} + +static void sdl_term_handler(int signum, const char* signame, void* context) +{ + sdl_push_quit(); +} + +static void sdl_cleanup_sdl(SdlContext* sdl) +{ + if (!sdl) + return; + + std::lock_guard lock(sdl->critical); + sdl->windows.clear(); + sdl->connection_dialog.reset(); + + sdl_destroy_primary(sdl); + + freerdp_del_signal_cleanup_handler(sdl->context(), sdl_term_handler); + TTF_Quit(); + SDL_Quit(); +} + +static BOOL sdl_create_windows(SdlContext* sdl) +{ + WINPR_ASSERT(sdl); + + auto settings = sdl->context()->settings; + auto title = sdl_window_get_title(settings); + BOOL rc = FALSE; + + UINT32 windowCount = freerdp_settings_get_uint32(settings, FreeRDP_MonitorCount); + + for (UINT32 x = 0; x < windowCount; x++) + { + auto monitor = static_cast( + freerdp_settings_get_pointer_array_writable(settings, FreeRDP_MonitorDefArray, x)); + + Uint32 w = monitor->width; + Uint32 h = monitor->height; + if (!(freerdp_settings_get_bool(settings, FreeRDP_UseMultimon) || + freerdp_settings_get_bool(settings, FreeRDP_Fullscreen))) + { + w = freerdp_settings_get_uint32(settings, FreeRDP_DesktopWidth); + h = freerdp_settings_get_uint32(settings, FreeRDP_DesktopHeight); + } + + Uint32 flags = SDL_WINDOW_SHOWN; + Uint32 startupX = SDL_WINDOWPOS_CENTERED_DISPLAY(x); + Uint32 startupY = SDL_WINDOWPOS_CENTERED_DISPLAY(x); + + if (monitor->attributes.desktopScaleFactor > 100) + { +#if SDL_VERSION_ATLEAST(2, 0, 1) + flags |= SDL_WINDOW_ALLOW_HIGHDPI; +#endif + } + + if (freerdp_settings_get_bool(settings, FreeRDP_Fullscreen) && + !freerdp_settings_get_bool(settings, FreeRDP_UseMultimon)) + { + flags |= SDL_WINDOW_FULLSCREEN; + } + + if (freerdp_settings_get_bool(settings, FreeRDP_UseMultimon)) + { + flags |= SDL_WINDOW_BORDERLESS; + } + + if (!freerdp_settings_get_bool(settings, FreeRDP_Decorations)) + flags |= SDL_WINDOW_BORDERLESS; + + SdlWindow window{ title, + static_cast(startupX), + static_cast(startupY), + static_cast(w), + static_cast(h), + flags }; + if (!window.window()) + goto fail; + + if (freerdp_settings_get_bool(settings, FreeRDP_UseMultimon)) + { + auto r = window.rect(); + window.setOffsetX(0 - r.x); + window.setOffsetY(0 - r.y); + } + + sdl->windows.insert({ window.id(), std::move(window) }); + } + + rc = TRUE; +fail: + + sdl->windows_created.set(); + return rc; +} + +static BOOL sdl_wait_create_windows(SdlContext* sdl) +{ + std::lock_guard lock(sdl->critical); + sdl->windows_created.clear(); + if (!sdl_push_user_event(SDL_USEREVENT_CREATE_WINDOWS, sdl)) + return FALSE; + + HANDLE handles[] = { sdl->initialized.handle(), freerdp_abort_event(sdl->context()) }; + + const DWORD rc = WaitForMultipleObjects(ARRAYSIZE(handles), handles, FALSE, INFINITE); + switch (rc) + { + case WAIT_OBJECT_0: + return TRUE; + default: + return FALSE; + } +} + +static bool shall_abort(SdlContext* sdl) +{ + std::lock_guard lock(sdl->critical); + if (freerdp_shall_disconnect_context(sdl->context())) + { + if (!sdl->connection_dialog) + return true; + return !sdl->connection_dialog->running(); + } + return false; +} + +static int sdl_run(SdlContext* sdl) +{ + int rc = -1; + WINPR_ASSERT(sdl); + + HANDLE handles[] = { sdl->initialize.handle(), freerdp_abort_event(sdl->context()) }; + const DWORD status = WaitForMultipleObjects(ARRAYSIZE(handles), handles, FALSE, INFINITE); + switch (status) + { + case WAIT_OBJECT_0: + break; + default: + return -1; + } + + SDL_Init(SDL_INIT_VIDEO); + TTF_Init(); +#if SDL_VERSION_ATLEAST(2, 0, 16) + SDL_SetHint(SDL_HINT_ALLOW_ALT_TAB_WHILE_GRABBED, "0"); +#endif +#if SDL_VERSION_ATLEAST(2, 0, 8) + SDL_SetHint(SDL_HINT_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR, "0"); +#endif + + freerdp_add_signal_cleanup_handler(sdl->context(), sdl_term_handler); + + sdl->initialized.set(); + + while (!shall_abort(sdl)) + { + SDL_Event windowEvent = { 0 }; + while (!shall_abort(sdl) && SDL_WaitEventTimeout(nullptr, 1000)) + { + /* Only poll standard SDL events and SDL_USEREVENTS meant to create dialogs. + * do not process the dialog return value events here. + */ + const int prc = SDL_PeepEvents(&windowEvent, 1, SDL_GETEVENT, SDL_FIRSTEVENT, + SDL_USEREVENT_RETRY_DIALOG); + if (prc < 0) + { + if (sdl_log_error(prc, sdl->log, "SDL_PeepEvents")) + continue; + } + +#if defined(WITH_DEBUG_SDL_EVENTS) + SDL_Log("got event %s [0x%08" PRIx32 "]", sdl_event_type_str(windowEvent.type), + windowEvent.type); +#endif + std::lock_guard lock(sdl->critical); + /* The session might have been disconnected while we were waiting for a new SDL event. + * In that case ignore the SDL event and terminate. */ + if (freerdp_shall_disconnect_context(sdl->context())) + continue; + + if (sdl->connection_dialog) + { + if (sdl->connection_dialog->handle(windowEvent)) + { + continue; + } + } + + switch (windowEvent.type) + { + case SDL_QUIT: + freerdp_abort_connect_context(sdl->context()); + break; + case SDL_KEYDOWN: + case SDL_KEYUP: + { + const SDL_KeyboardEvent* ev = &windowEvent.key; + sdl->input.keyboard_handle_event(ev); + } + break; + case SDL_KEYMAPCHANGED: + { + } + break; // TODO: Switch keyboard layout + case SDL_MOUSEMOTION: + { + const SDL_MouseMotionEvent* ev = &windowEvent.motion; + sdl_handle_mouse_motion(sdl, ev); + } + break; + case SDL_MOUSEBUTTONDOWN: + case SDL_MOUSEBUTTONUP: + { + const SDL_MouseButtonEvent* ev = &windowEvent.button; + sdl_handle_mouse_button(sdl, ev); + } + break; + case SDL_MOUSEWHEEL: + { + const SDL_MouseWheelEvent* ev = &windowEvent.wheel; + sdl_handle_mouse_wheel(sdl, ev); + } + break; + case SDL_FINGERDOWN: + { + const SDL_TouchFingerEvent* ev = &windowEvent.tfinger; + sdl_handle_touch_down(sdl, ev); + } + break; + case SDL_FINGERUP: + { + const SDL_TouchFingerEvent* ev = &windowEvent.tfinger; + sdl_handle_touch_up(sdl, ev); + } + break; + case SDL_FINGERMOTION: + { + const SDL_TouchFingerEvent* ev = &windowEvent.tfinger; + sdl_handle_touch_motion(sdl, ev); + } + break; +#if SDL_VERSION_ATLEAST(2, 0, 10) + case SDL_DISPLAYEVENT: + { + const SDL_DisplayEvent* ev = &windowEvent.display; + sdl->disp.handle_display_event(ev); + } + break; +#endif + case SDL_WINDOWEVENT: + { + const SDL_WindowEvent* ev = &windowEvent.window; + sdl->disp.handle_window_event(ev); + + switch (ev->event) + { + case SDL_WINDOWEVENT_RESIZED: + case SDL_WINDOWEVENT_SIZE_CHANGED: + { + auto window = sdl->windows.find(ev->windowID); + if (window != sdl->windows.end()) + { + window->second.fill(); + window->second.updateSurface(); + } + } + break; + case SDL_WINDOWEVENT_MOVED: + { + auto window = sdl->windows.find(ev->windowID); + if (window != sdl->windows.end()) + { + auto r = window->second.rect(); + auto id = window->second.id(); + WLog_DBG(SDL_TAG, "%lu: %dx%d-%dx%d", id, r.x, r.y, r.w, r.h); + } + } + break; + default: + break; + } + } + break; + + case SDL_RENDER_TARGETS_RESET: + sdl_redraw(sdl); + break; + case SDL_RENDER_DEVICE_RESET: + sdl_redraw(sdl); + break; + case SDL_APP_WILLENTERFOREGROUND: + sdl_redraw(sdl); + break; + case SDL_USEREVENT_CERT_DIALOG: + { + auto title = static_cast(windowEvent.user.data1); + auto msg = static_cast(windowEvent.user.data2); + sdl_cert_dialog_show(title, msg); + } + break; + case SDL_USEREVENT_SHOW_DIALOG: + { + auto title = static_cast(windowEvent.user.data1); + auto msg = static_cast(windowEvent.user.data2); + sdl_message_dialog_show(title, msg, windowEvent.user.code); + } + break; + case SDL_USEREVENT_SCARD_DIALOG: + { + auto title = static_cast(windowEvent.user.data1); + auto msg = static_cast(windowEvent.user.data2); + sdl_scard_dialog_show(title, windowEvent.user.code, msg); + } + break; + case SDL_USEREVENT_AUTH_DIALOG: + sdl_auth_dialog_show( + reinterpret_cast(windowEvent.padding)); + break; + case SDL_USEREVENT_UPDATE: + { + auto context = static_cast(windowEvent.user.data1); + sdl_end_paint_process(context); + } + break; + case SDL_USEREVENT_CREATE_WINDOWS: + { + auto ctx = static_cast(windowEvent.user.data1); + sdl_create_windows(ctx); + } + break; + case SDL_USEREVENT_WINDOW_RESIZEABLE: + { + auto window = static_cast(windowEvent.user.data1); + const SDL_bool use = windowEvent.user.code != 0 ? SDL_TRUE : SDL_FALSE; + if (window) + window->resizeable(use); + } + break; + case SDL_USEREVENT_WINDOW_FULLSCREEN: + { + auto window = static_cast(windowEvent.user.data1); + const SDL_bool enter = windowEvent.user.code != 0 ? SDL_TRUE : SDL_FALSE; + if (window) + window->fullscreen(enter); + } + break; + case SDL_USEREVENT_POINTER_NULL: + SDL_ShowCursor(SDL_DISABLE); + break; + case SDL_USEREVENT_POINTER_DEFAULT: + { + SDL_Cursor* def = SDL_GetDefaultCursor(); + SDL_SetCursor(def); + SDL_ShowCursor(SDL_ENABLE); + } + break; + case SDL_USEREVENT_POINTER_POSITION: + { + const auto x = + static_cast(reinterpret_cast(windowEvent.user.data1)); + const auto y = + static_cast(reinterpret_cast(windowEvent.user.data2)); + + SDL_Window* window = SDL_GetMouseFocus(); + if (window) + { + const Uint32 id = SDL_GetWindowID(window); + + INT32 sx = x; + INT32 sy = y; + if (sdl_scale_coordinates(sdl, id, &sx, &sy, FALSE, FALSE)) + SDL_WarpMouseInWindow(window, sx, sy); + } + } + break; + case SDL_USEREVENT_POINTER_SET: + sdl_Pointer_Set_Process(&windowEvent.user); + break; + case SDL_USEREVENT_QUIT: + default: + break; + } + } + } + + rc = 1; + + sdl_cleanup_sdl(sdl); + return rc; +} + +/* Called after a RDP connection was successfully established. + * Settings might have changed during negociation of client / server feature + * support. + * + * Set up local framebuffers and paing callbacks. + * If required, register pointer callbacks to change the local mouse cursor + * when hovering over the RDP window + */ +static BOOL sdl_post_connect(freerdp* instance) +{ + WINPR_ASSERT(instance); + + auto context = instance->context; + WINPR_ASSERT(context); + + auto sdl = get_context(context); + + // Retry was successful, discard dialog + { + std::lock_guard lock(sdl->critical); + if (sdl->connection_dialog) + sdl->connection_dialog->hide(); + } + + if (freerdp_settings_get_bool(context->settings, FreeRDP_AuthenticationOnly)) + { + /* Check +auth-only has a username and password. */ + if (!freerdp_settings_get_string(context->settings, FreeRDP_Password)) + { + WLog_Print(sdl->log, WLOG_INFO, "auth-only, but no password set. Please provide one."); + return FALSE; + } + + WLog_Print(sdl->log, WLOG_INFO, "Authentication only. Don't connect to X."); + return TRUE; + } + + if (!sdl_wait_create_windows(sdl)) + return FALSE; + + sdl->sdl_pixel_format = SDL_PIXELFORMAT_BGRA32; + if (!gdi_init(instance, PIXEL_FORMAT_BGRA32)) + return FALSE; + + if (!sdl_create_primary(sdl)) + return FALSE; + + if (!sdl_register_pointer(instance->context->graphics)) + return FALSE; + + WINPR_ASSERT(context->update); + + context->update->BeginPaint = sdl_begin_paint; + context->update->EndPaint = sdl_end_paint; + context->update->PlaySound = sdl_play_sound; + context->update->DesktopResize = sdl_desktop_resize; + context->update->SetKeyboardIndicators = sdlInput::keyboard_set_indicators; + context->update->SetKeyboardImeStatus = sdlInput::keyboard_set_ime_status; + + sdl->update_resizeable(FALSE); + sdl->update_fullscreen(freerdp_settings_get_bool(context->settings, FreeRDP_Fullscreen) || + freerdp_settings_get_bool(context->settings, FreeRDP_UseMultimon)); + return TRUE; +} + +/* This function is called whether a session ends by failure or success. + * Clean up everything allocated by pre_connect and post_connect. + */ +static void sdl_post_disconnect(freerdp* instance) +{ + if (!instance) + return; + + if (!instance->context) + return; + + PubSub_UnsubscribeChannelConnected(instance->context->pubSub, + sdl_OnChannelConnectedEventHandler); + PubSub_UnsubscribeChannelDisconnected(instance->context->pubSub, + sdl_OnChannelDisconnectedEventHandler); + gdi_free(instance); +} + +static void sdl_post_final_disconnect(freerdp* instance) +{ + if (!instance) + return; + + if (!instance->context) + return; + + auto context = get_context(instance->context); +} + +/* RDP main loop. + * Connects RDP, loops while running and handles event and dispatch, cleans up + * after the connection ends. */ +static DWORD WINAPI sdl_client_thread_proc(SdlContext* sdl) +{ + DWORD nCount = 0; + DWORD status = 0; + int exit_code = SDL_EXIT_SUCCESS; + char* error_msg = nullptr; + size_t error_msg_len = 0; + + HANDLE handles[MAXIMUM_WAIT_OBJECTS] = {}; + + WINPR_ASSERT(sdl); + + auto instance = sdl->context()->instance; + WINPR_ASSERT(instance); + + BOOL rc = freerdp_connect(instance); + + rdpContext* context = sdl->context(); + rdpSettings* settings = context->settings; + WINPR_ASSERT(settings); + + if (!rc) + { + UINT32 error = freerdp_get_last_error(context); + exit_code = sdl_map_error_to_exit_code(error); + } + + if (freerdp_settings_get_bool(settings, FreeRDP_AuthenticationOnly)) + { + DWORD code = freerdp_get_last_error(context); + freerdp_abort_connect_context(context); + WLog_Print(sdl->log, WLOG_ERROR, "Authentication only, %s [0x%08" PRIx32 "] %s", + freerdp_get_last_error_name(code), code, freerdp_get_last_error_string(code)); + goto terminate; + } + + if (!rc) + { + DWORD code = freerdp_error_info(instance); + if (exit_code == SDL_EXIT_SUCCESS) + exit_code = error_info_to_error(instance, &code, &error_msg, &error_msg_len); + + auto last = freerdp_get_last_error(context); + if (!error_msg) + { + winpr_asprintf(&error_msg, &error_msg_len, "%s [0x%08" PRIx32 "]\n%s", + freerdp_get_last_error_name(last), last, + freerdp_get_last_error_string(last)); + } + + if (last == FREERDP_ERROR_AUTHENTICATION_FAILED) + exit_code = SDL_EXIT_AUTH_FAILURE; + else if (code == ERRINFO_SUCCESS) + exit_code = SDL_EXIT_CONN_FAILED; + + goto terminate; + } + + while (!freerdp_shall_disconnect_context(context)) + { + /* + * win8 and server 2k12 seem to have some timing issue/race condition + * when a initial sync request is send to sync the keyboard indicators + * sending the sync event twice fixed this problem + */ + if (freerdp_focus_required(instance)) + { + auto ctx = get_context(context); + WINPR_ASSERT(ctx); + if (!ctx->input.keyboard_focus_in()) + break; + if (!ctx->input.keyboard_focus_in()) + break; + } + + nCount = freerdp_get_event_handles(context, handles, ARRAYSIZE(handles)); + + if (nCount == 0) + { + WLog_Print(sdl->log, WLOG_ERROR, "freerdp_get_event_handles failed"); + break; + } + + status = WaitForMultipleObjects(nCount, handles, FALSE, 100); + + if (status == WAIT_FAILED) + { + if (client_auto_reconnect(instance)) + continue; + else + { + /* + * Indicate an unsuccessful connection attempt if reconnect + * did not succeed and no other error was specified. + */ + if (freerdp_error_info(instance) == 0) + exit_code = SDL_EXIT_CONN_FAILED; + } + + if (freerdp_get_last_error(context) == FREERDP_ERROR_SUCCESS) + WLog_Print(sdl->log, WLOG_ERROR, "WaitForMultipleObjects failed with %" PRIu32 "", + status); + break; + } + + if (!freerdp_check_event_handles(context)) + { + if (freerdp_get_last_error(context) == FREERDP_ERROR_SUCCESS) + WLog_Print(sdl->log, WLOG_ERROR, "Failed to check FreeRDP event handles"); + + break; + } + } + + if (exit_code == SDL_EXIT_SUCCESS) + { + DWORD code = 0; + exit_code = error_info_to_error(instance, &code, &error_msg, &error_msg_len); + + if ((code == ERRINFO_LOGOFF_BY_USER) && + (freerdp_get_disconnect_ultimatum(context) == Disconnect_Ultimatum_user_requested)) + { + const char* msg = "Error info says user did not initiate but disconnect ultimatum says " + "they did; treat this as a user logoff"; + free(error_msg); + error_msg = nullptr; + error_msg_len = 0; + winpr_asprintf(&error_msg, &error_msg_len, "%s", msg); + + /* This situation might be limited to Windows XP. */ + WLog_Print(sdl->log, WLOG_INFO, "%s", msg); + exit_code = SDL_EXIT_LOGOFF; + } + } + + freerdp_disconnect(instance); + +terminate: + if (freerdp_settings_get_bool(settings, FreeRDP_AuthenticationOnly)) + WLog_Print(sdl->log, WLOG_INFO, "Authentication only, exit status %s [%" PRId32 "]", + sdl_map_to_code_tag(exit_code), exit_code); + else + { + switch (exit_code) + { + case SDL_EXIT_SUCCESS: + case SDL_EXIT_DISCONNECT: + case SDL_EXIT_LOGOFF: + case SDL_EXIT_DISCONNECT_BY_USER: + break; + default: + { + std::lock_guard lock(sdl->critical); + if (sdl->connection_dialog && error_msg) + sdl->connection_dialog->showError(error_msg); + } + break; + } + } + free(error_msg); + sdl->exit_code = exit_code; + sdl_push_user_event(SDL_USEREVENT_QUIT); +#if SDL_VERSION_ATLEAST(2, 0, 16) + SDL_TLSCleanup(); +#endif + return 0; +} + +/* Optional global initializer. + * Here we just register a signal handler to print out stack traces + * if available. */ +static BOOL sdl_client_global_init(void) +{ +#if defined(_WIN32) + WSADATA wsaData = { 0 }; + const DWORD wVersionRequested = MAKEWORD(1, 1); + const int rc = WSAStartup(wVersionRequested, &wsaData); + if (rc != 0) + { + WLog_ERR(SDL_TAG, "WSAStartup failed with %s [%d]", gai_strerrorA(rc), rc); + return FALSE; + } +#endif + + if (freerdp_handle_signals() != 0) + return FALSE; + + return TRUE; +} + +/* Optional global tear down */ +static void sdl_client_global_uninit(void) +{ +#if defined(_WIN32) + WSACleanup(); +#endif +} + +static BOOL sdl_client_new(freerdp* instance, rdpContext* context) +{ + auto sdl = reinterpret_cast(context); + + if (!instance || !context) + return FALSE; + + sdl->sdl = new SdlContext(context); + if (!sdl->sdl) + return FALSE; + + instance->PreConnect = sdl_pre_connect; + instance->PostConnect = sdl_post_connect; + instance->PostDisconnect = sdl_post_disconnect; + instance->PostFinalDisconnect = sdl_post_final_disconnect; + instance->AuthenticateEx = sdl_authenticate_ex; + instance->VerifyCertificateEx = sdl_verify_certificate_ex; + instance->VerifyChangedCertificateEx = sdl_verify_changed_certificate_ex; + instance->LogonErrorInfo = sdl_logon_error_info; + instance->PresentGatewayMessage = sdl_present_gateway_message; + instance->ChooseSmartcard = sdl_choose_smartcard; + instance->RetryDialog = sdl_retry_dialog; + +#ifdef WITH_WEBVIEW + instance->GetAccessToken = sdl_webview_get_access_token; +#else + instance->GetAccessToken = client_cli_get_access_token; +#endif + /* TODO: Client display set up */ + + return TRUE; +} + +static void sdl_client_free(freerdp* instance, rdpContext* context) +{ + auto sdl = reinterpret_cast(context); + + if (!context) + return; + + delete sdl->sdl; +} + +static int sdl_client_start(rdpContext* context) +{ + auto sdl = get_context(context); + WINPR_ASSERT(sdl); + + sdl->thread = std::thread(sdl_client_thread_proc, sdl); + return 0; +} + +static int sdl_client_stop(rdpContext* context) +{ + auto sdl = get_context(context); + WINPR_ASSERT(sdl); + + /* We do not want to use freerdp_abort_connect_context here. + * It would change the exit code and we do not want that. */ + HANDLE event = freerdp_abort_event(context); + if (!SetEvent(event)) + return -1; + + sdl->thread.join(); + return 0; +} + +static int RdpClientEntry(RDP_CLIENT_ENTRY_POINTS* pEntryPoints) +{ + WINPR_ASSERT(pEntryPoints); + + ZeroMemory(pEntryPoints, sizeof(RDP_CLIENT_ENTRY_POINTS)); + pEntryPoints->Version = RDP_CLIENT_INTERFACE_VERSION; + pEntryPoints->Size = sizeof(RDP_CLIENT_ENTRY_POINTS_V1); + pEntryPoints->GlobalInit = sdl_client_global_init; + pEntryPoints->GlobalUninit = sdl_client_global_uninit; + pEntryPoints->ContextSize = sizeof(sdl_rdp_context); + pEntryPoints->ClientNew = sdl_client_new; + pEntryPoints->ClientFree = sdl_client_free; + pEntryPoints->ClientStart = sdl_client_start; + pEntryPoints->ClientStop = sdl_client_stop; + return 0; +} + +static void context_free(sdl_rdp_context* sdl) +{ + if (sdl) + freerdp_client_context_free(&sdl->common.context); +} + +static const char* category2str(int category) +{ + switch (category) + { + case SDL_LOG_CATEGORY_APPLICATION: + return "SDL_LOG_CATEGORY_APPLICATION"; + case SDL_LOG_CATEGORY_ERROR: + return "SDL_LOG_CATEGORY_ERROR"; + case SDL_LOG_CATEGORY_ASSERT: + return "SDL_LOG_CATEGORY_ASSERT"; + case SDL_LOG_CATEGORY_SYSTEM: + return "SDL_LOG_CATEGORY_SYSTEM"; + case SDL_LOG_CATEGORY_AUDIO: + return "SDL_LOG_CATEGORY_AUDIO"; + case SDL_LOG_CATEGORY_VIDEO: + return "SDL_LOG_CATEGORY_VIDEO"; + case SDL_LOG_CATEGORY_RENDER: + return "SDL_LOG_CATEGORY_RENDER"; + case SDL_LOG_CATEGORY_INPUT: + return "SDL_LOG_CATEGORY_INPUT"; + case SDL_LOG_CATEGORY_TEST: + return "SDL_LOG_CATEGORY_TEST"; + case SDL_LOG_CATEGORY_RESERVED1: + return "SDL_LOG_CATEGORY_RESERVED1"; + case SDL_LOG_CATEGORY_RESERVED2: + return "SDL_LOG_CATEGORY_RESERVED2"; + case SDL_LOG_CATEGORY_RESERVED3: + return "SDL_LOG_CATEGORY_RESERVED3"; + case SDL_LOG_CATEGORY_RESERVED4: + return "SDL_LOG_CATEGORY_RESERVED4"; + case SDL_LOG_CATEGORY_RESERVED5: + return "SDL_LOG_CATEGORY_RESERVED5"; + case SDL_LOG_CATEGORY_RESERVED6: + return "SDL_LOG_CATEGORY_RESERVED6"; + case SDL_LOG_CATEGORY_RESERVED7: + return "SDL_LOG_CATEGORY_RESERVED7"; + case SDL_LOG_CATEGORY_RESERVED8: + return "SDL_LOG_CATEGORY_RESERVED8"; + case SDL_LOG_CATEGORY_RESERVED9: + return "SDL_LOG_CATEGORY_RESERVED9"; + case SDL_LOG_CATEGORY_RESERVED10: + return "SDL_LOG_CATEGORY_RESERVED10"; + case SDL_LOG_CATEGORY_CUSTOM: + default: + return "SDL_LOG_CATEGORY_CUSTOM"; + } +} + +static SDL_LogPriority wloglevel2dl(DWORD level) +{ + switch (level) + { + case WLOG_TRACE: + return SDL_LOG_PRIORITY_VERBOSE; + case WLOG_DEBUG: + return SDL_LOG_PRIORITY_DEBUG; + case WLOG_INFO: + return SDL_LOG_PRIORITY_INFO; + case WLOG_WARN: + return SDL_LOG_PRIORITY_WARN; + case WLOG_ERROR: + return SDL_LOG_PRIORITY_ERROR; + case WLOG_FATAL: + return SDL_LOG_PRIORITY_CRITICAL; + case WLOG_OFF: + default: + return SDL_LOG_PRIORITY_VERBOSE; + } +} + +static DWORD sdlpriority2wlog(SDL_LogPriority priority) +{ + DWORD level = WLOG_OFF; + switch (priority) + { + case SDL_LOG_PRIORITY_VERBOSE: + level = WLOG_TRACE; + break; + case SDL_LOG_PRIORITY_DEBUG: + level = WLOG_DEBUG; + break; + case SDL_LOG_PRIORITY_INFO: + level = WLOG_INFO; + break; + case SDL_LOG_PRIORITY_WARN: + level = WLOG_WARN; + break; + case SDL_LOG_PRIORITY_ERROR: + level = WLOG_ERROR; + break; + case SDL_LOG_PRIORITY_CRITICAL: + level = WLOG_FATAL; + break; + default: + break; + } + + return level; +} + +static void SDLCALL winpr_LogOutputFunction(void* userdata, int category, SDL_LogPriority priority, + const char* message) +{ + auto sdl = static_cast(userdata); + WINPR_ASSERT(sdl); + + const DWORD level = sdlpriority2wlog(priority); + auto log = sdl->log; + if (!WLog_IsLevelActive(log, level)) + return; + + WLog_PrintMessage(log, WLOG_MESSAGE_TEXT, level, __LINE__, __FILE__, __func__, "[%s] %s", + category2str(category), message); +} + +static void print_config_file_help() +{ +#if defined(WITH_WINPR_JSON) + std::cout << "CONFIGURATION FILE" << std::endl; + std::cout << std::endl; + std::cout << " The SDL client supports some user defined configuration options." << std::endl; + std::cout << " Settings are stored in JSON format" << std::endl; + std::cout << " The location is a per user file. Location for current user is " + << SdlPref::instance()->get_pref_file() << std::endl; + std::cout + << " The XDG_CONFIG_HOME environment variable can be used to override the base directory." + << std::endl; + std::cout << std::endl; + std::cout << " The following configuration options are supported:" << std::endl; + std::cout << std::endl; + std::cout << " SDL_KeyModMask" << std::endl; + std::cout << " Defines the key combination required for SDL client shortcuts." + << std::endl; + std::cout << " Default KMOD_RSHIFT" << std::endl; + std::cout << " An array of SDL_Keymod strings as defined at " + "https://wiki.libsdl.org/SDL2/SDL_Keymod" + << std::endl; + std::cout << std::endl; + std::cout << " SDL_Fullscreen" << std::endl; + std::cout << " Toggles client fullscreen state." << std::endl; + std::cout << " Default SDL_SCANCODE_RETURN." << std::endl; + std::cout << " A string as " + "defined at https://wiki.libsdl.org/SDL2/SDLScancodeLookup" + << std::endl; + std::cout << std::endl; + std::cout << " SDL_Resizeable" << std::endl; + std::cout << " Toggles local window resizeable state." << std::endl; + std::cout << " Default SDL_SCANCODE_R." << std::endl; + std::cout << " A string as " + "defined at https://wiki.libsdl.org/SDL2/SDLScancodeLookup" + << std::endl; + std::cout << std::endl; + std::cout << " SDL_Grab" << std::endl; + std::cout << " Toggles keyboard and mouse grab state." << std::endl; + std::cout << " Default SDL_SCANCODE_G." << std::endl; + std::cout << " A string as " + "defined at https://wiki.libsdl.org/SDL2/SDLScancodeLookup" + << std::endl; + std::cout << std::endl; + std::cout << " SDL_Disconnect" << std::endl; + std::cout << " Disconnects from the RDP session." << std::endl; + std::cout << " Default SDL_SCANCODE_D." << std::endl; + std::cout << " A string as defined at https://wiki.libsdl.org/SDL2/SDLScancodeLookup" + << std::endl; +#endif +} + +int main(int argc, char* argv[]) +{ + int rc = -1; + int status = 0; + RDP_CLIENT_ENTRY_POINTS clientEntryPoints = {}; + + freerdp_client_warn_experimental(argc, argv); + + RdpClientEntry(&clientEntryPoints); + std::unique_ptr sdl_rdp( + reinterpret_cast(freerdp_client_context_new(&clientEntryPoints)), + context_free); + + if (!sdl_rdp) + return -1; + auto sdl = sdl_rdp->sdl; + + auto settings = sdl->context()->settings; + WINPR_ASSERT(settings); + + status = freerdp_client_settings_parse_command_line(settings, argc, argv, FALSE); + if (status) + { + rc = freerdp_client_settings_command_line_status_print(settings, status, argc, argv); + print_config_file_help(); + if (freerdp_settings_get_bool(settings, FreeRDP_ListMonitors)) + sdl_list_monitors(sdl); + return rc; + } + + SDL_LogSetOutputFunction(winpr_LogOutputFunction, sdl); + auto level = WLog_GetLogLevel(sdl->log); + SDL_LogSetAllPriority(wloglevel2dl(level)); + + auto context = sdl->context(); + WINPR_ASSERT(context); + + if (!stream_dump_register_handlers(context, CONNECTION_STATE_MCS_CREATE_REQUEST, FALSE)) + return -1; + + if (freerdp_client_start(context) != 0) + return -1; + + rc = sdl_run(sdl); + + if (freerdp_client_stop(context) != 0) + return -1; + + rc = sdl->exit_code; + + return rc; +} + +BOOL SdlContext::update_fullscreen(BOOL enter) +{ + std::lock_guard lock(critical); + for (const auto& window : windows) + { + if (!sdl_push_user_event(SDL_USEREVENT_WINDOW_FULLSCREEN, &window.second, enter)) + return FALSE; + } + fullscreen = enter; + return TRUE; +} + +BOOL SdlContext::update_resizeable(BOOL enable) +{ + std::lock_guard lock(critical); + + const auto settings = context()->settings; + const BOOL dyn = freerdp_settings_get_bool(settings, FreeRDP_DynamicResolutionUpdate); + const BOOL smart = freerdp_settings_get_bool(settings, FreeRDP_SmartSizing); + BOOL use = (dyn && enable) || smart; + + for (const auto& window : windows) + { + if (!sdl_push_user_event(SDL_USEREVENT_WINDOW_RESIZEABLE, &window.second, use)) + return FALSE; + } + resizeable = use; + + return TRUE; +} + +SdlContext::SdlContext(rdpContext* context) + : _context(context), log(WLog_Get(SDL_TAG)), update_complete(true), disp(this), input(this), + primary(nullptr, SDL_FreeSurface), primary_format(nullptr, SDL_FreeFormat) +{ +} + +rdpContext* SdlContext::context() const +{ + return _context; +} + +rdpClientContext* SdlContext::common() const +{ + return reinterpret_cast(_context); +} diff --git a/client/SDL3/sdl_freerdp.hpp b/client/SDL3/sdl_freerdp.hpp new file mode 100644 index 000000000..79ed89069 --- /dev/null +++ b/client/SDL3/sdl_freerdp.hpp @@ -0,0 +1,88 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * SDL Client + * + * Copyright 2022 Armin Novak + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +#include "sdl_types.hpp" +#include "sdl_disp.hpp" +#include "sdl_kbd.hpp" +#include "sdl_utils.hpp" +#include "sdl_window.hpp" +#include "dialogs/sdl_connection_dialog.hpp" + +using SDLSurfacePtr = std::unique_ptr; +using SDLPixelFormatPtr = std::unique_ptr; + +class SdlContext +{ + public: + explicit SdlContext(rdpContext* context); + + private: + rdpContext* _context; + + public: + wLog* log; + + /* SDL */ + bool fullscreen = false; + bool resizeable = false; + bool grab_mouse = false; + bool grab_kbd = false; + + std::map windows; + + CriticalSection critical; + std::thread thread; + WinPREvent initialize; + WinPREvent initialized; + WinPREvent update_complete; + WinPREvent windows_created; + int exit_code = -1; + + sdlDispContext disp; + sdlInput input; + + SDLSurfacePtr primary; + SDLPixelFormatPtr primary_format; + + Uint32 sdl_pixel_format = 0; + + std::unique_ptr connection_dialog; + + public: + BOOL update_resizeable(BOOL enable); + BOOL update_fullscreen(BOOL enter); + + [[nodiscard]] rdpContext* context() const; + [[nodiscard]] rdpClientContext* common() const; +}; diff --git a/client/SDL3/sdl_kbd.cpp b/client/SDL3/sdl_kbd.cpp new file mode 100644 index 000000000..cd285b968 --- /dev/null +++ b/client/SDL3/sdl_kbd.cpp @@ -0,0 +1,630 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * FreeRDP SDL keyboard helper + * + * Copyright 2022 Armin Novak + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "sdl_kbd.hpp" +#include "sdl_disp.hpp" +#include "sdl_freerdp.hpp" +#include "sdl_utils.hpp" +#include "sdl_prefs.hpp" + +#include + +#include + +#include +#define TAG CLIENT_TAG("SDL.kbd") + +typedef struct +{ + Uint32 sdl; + const char* sdl_name; + UINT32 rdp; + const char* rdp_name; +} scancode_entry_t; + +#define STR(x) #x +#define ENTRY(x, y) \ + { \ + x, STR(x), y, #y \ + } +static const scancode_entry_t map[] = { + ENTRY(SDL_SCANCODE_UNKNOWN, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_A, RDP_SCANCODE_KEY_A), + ENTRY(SDL_SCANCODE_B, RDP_SCANCODE_KEY_B), + ENTRY(SDL_SCANCODE_C, RDP_SCANCODE_KEY_C), + ENTRY(SDL_SCANCODE_D, RDP_SCANCODE_KEY_D), + ENTRY(SDL_SCANCODE_E, RDP_SCANCODE_KEY_E), + ENTRY(SDL_SCANCODE_F, RDP_SCANCODE_KEY_F), + ENTRY(SDL_SCANCODE_G, RDP_SCANCODE_KEY_G), + ENTRY(SDL_SCANCODE_H, RDP_SCANCODE_KEY_H), + ENTRY(SDL_SCANCODE_I, RDP_SCANCODE_KEY_I), + ENTRY(SDL_SCANCODE_J, RDP_SCANCODE_KEY_J), + ENTRY(SDL_SCANCODE_K, RDP_SCANCODE_KEY_K), + ENTRY(SDL_SCANCODE_L, RDP_SCANCODE_KEY_L), + ENTRY(SDL_SCANCODE_M, RDP_SCANCODE_KEY_M), + ENTRY(SDL_SCANCODE_N, RDP_SCANCODE_KEY_N), + ENTRY(SDL_SCANCODE_O, RDP_SCANCODE_KEY_O), + ENTRY(SDL_SCANCODE_P, RDP_SCANCODE_KEY_P), + ENTRY(SDL_SCANCODE_Q, RDP_SCANCODE_KEY_Q), + ENTRY(SDL_SCANCODE_R, RDP_SCANCODE_KEY_R), + ENTRY(SDL_SCANCODE_S, RDP_SCANCODE_KEY_S), + ENTRY(SDL_SCANCODE_T, RDP_SCANCODE_KEY_T), + ENTRY(SDL_SCANCODE_U, RDP_SCANCODE_KEY_U), + ENTRY(SDL_SCANCODE_V, RDP_SCANCODE_KEY_V), + ENTRY(SDL_SCANCODE_W, RDP_SCANCODE_KEY_W), + ENTRY(SDL_SCANCODE_X, RDP_SCANCODE_KEY_X), + ENTRY(SDL_SCANCODE_Y, RDP_SCANCODE_KEY_Y), + ENTRY(SDL_SCANCODE_Z, RDP_SCANCODE_KEY_Z), + ENTRY(SDL_SCANCODE_1, RDP_SCANCODE_KEY_1), + ENTRY(SDL_SCANCODE_2, RDP_SCANCODE_KEY_2), + ENTRY(SDL_SCANCODE_3, RDP_SCANCODE_KEY_3), + ENTRY(SDL_SCANCODE_4, RDP_SCANCODE_KEY_4), + ENTRY(SDL_SCANCODE_5, RDP_SCANCODE_KEY_5), + ENTRY(SDL_SCANCODE_6, RDP_SCANCODE_KEY_6), + ENTRY(SDL_SCANCODE_7, RDP_SCANCODE_KEY_7), + ENTRY(SDL_SCANCODE_8, RDP_SCANCODE_KEY_8), + ENTRY(SDL_SCANCODE_9, RDP_SCANCODE_KEY_9), + ENTRY(SDL_SCANCODE_0, RDP_SCANCODE_KEY_0), + ENTRY(SDL_SCANCODE_RETURN, RDP_SCANCODE_RETURN), + ENTRY(SDL_SCANCODE_ESCAPE, RDP_SCANCODE_ESCAPE), + ENTRY(SDL_SCANCODE_BACKSPACE, RDP_SCANCODE_BACKSPACE), + ENTRY(SDL_SCANCODE_TAB, RDP_SCANCODE_TAB), + ENTRY(SDL_SCANCODE_SPACE, RDP_SCANCODE_SPACE), + ENTRY(SDL_SCANCODE_MINUS, RDP_SCANCODE_OEM_MINUS), + ENTRY(SDL_SCANCODE_CAPSLOCK, RDP_SCANCODE_CAPSLOCK), + ENTRY(SDL_SCANCODE_F1, RDP_SCANCODE_F1), + ENTRY(SDL_SCANCODE_F2, RDP_SCANCODE_F2), + ENTRY(SDL_SCANCODE_F3, RDP_SCANCODE_F3), + ENTRY(SDL_SCANCODE_F4, RDP_SCANCODE_F4), + ENTRY(SDL_SCANCODE_F5, RDP_SCANCODE_F5), + ENTRY(SDL_SCANCODE_F6, RDP_SCANCODE_F6), + ENTRY(SDL_SCANCODE_F7, RDP_SCANCODE_F7), + ENTRY(SDL_SCANCODE_F8, RDP_SCANCODE_F8), + ENTRY(SDL_SCANCODE_F9, RDP_SCANCODE_F9), + ENTRY(SDL_SCANCODE_F10, RDP_SCANCODE_F10), + ENTRY(SDL_SCANCODE_F11, RDP_SCANCODE_F11), + ENTRY(SDL_SCANCODE_F12, RDP_SCANCODE_F12), + ENTRY(SDL_SCANCODE_F13, RDP_SCANCODE_F13), + ENTRY(SDL_SCANCODE_F14, RDP_SCANCODE_F14), + ENTRY(SDL_SCANCODE_F15, RDP_SCANCODE_F15), + ENTRY(SDL_SCANCODE_F16, RDP_SCANCODE_F16), + ENTRY(SDL_SCANCODE_F17, RDP_SCANCODE_F17), + ENTRY(SDL_SCANCODE_F18, RDP_SCANCODE_F18), + ENTRY(SDL_SCANCODE_F19, RDP_SCANCODE_F19), + ENTRY(SDL_SCANCODE_F20, RDP_SCANCODE_F20), + ENTRY(SDL_SCANCODE_F21, RDP_SCANCODE_F21), + ENTRY(SDL_SCANCODE_F22, RDP_SCANCODE_F22), + ENTRY(SDL_SCANCODE_F23, RDP_SCANCODE_F23), + ENTRY(SDL_SCANCODE_F24, RDP_SCANCODE_F24), + ENTRY(SDL_SCANCODE_NUMLOCKCLEAR, RDP_SCANCODE_NUMLOCK), + ENTRY(SDL_SCANCODE_KP_DIVIDE, RDP_SCANCODE_DIVIDE), + ENTRY(SDL_SCANCODE_KP_MULTIPLY, RDP_SCANCODE_MULTIPLY), + ENTRY(SDL_SCANCODE_KP_MINUS, RDP_SCANCODE_SUBTRACT), + ENTRY(SDL_SCANCODE_KP_PLUS, RDP_SCANCODE_ADD), + ENTRY(SDL_SCANCODE_KP_ENTER, RDP_SCANCODE_RETURN_KP), + ENTRY(SDL_SCANCODE_KP_1, RDP_SCANCODE_NUMPAD1), + ENTRY(SDL_SCANCODE_KP_2, RDP_SCANCODE_NUMPAD2), + ENTRY(SDL_SCANCODE_KP_3, RDP_SCANCODE_NUMPAD3), + ENTRY(SDL_SCANCODE_KP_4, RDP_SCANCODE_NUMPAD4), + ENTRY(SDL_SCANCODE_KP_5, RDP_SCANCODE_NUMPAD5), + ENTRY(SDL_SCANCODE_KP_6, RDP_SCANCODE_NUMPAD6), + ENTRY(SDL_SCANCODE_KP_7, RDP_SCANCODE_NUMPAD7), + ENTRY(SDL_SCANCODE_KP_8, RDP_SCANCODE_NUMPAD8), + ENTRY(SDL_SCANCODE_KP_9, RDP_SCANCODE_NUMPAD9), + ENTRY(SDL_SCANCODE_KP_0, RDP_SCANCODE_NUMPAD0), + ENTRY(SDL_SCANCODE_KP_PERIOD, RDP_SCANCODE_OEM_PERIOD), + ENTRY(SDL_SCANCODE_LCTRL, RDP_SCANCODE_LCONTROL), + ENTRY(SDL_SCANCODE_LSHIFT, RDP_SCANCODE_LSHIFT), + ENTRY(SDL_SCANCODE_LALT, RDP_SCANCODE_LMENU), + ENTRY(SDL_SCANCODE_LGUI, RDP_SCANCODE_LWIN), + ENTRY(SDL_SCANCODE_RCTRL, RDP_SCANCODE_RCONTROL), + ENTRY(SDL_SCANCODE_RSHIFT, RDP_SCANCODE_RSHIFT), + ENTRY(SDL_SCANCODE_RALT, RDP_SCANCODE_RMENU), + ENTRY(SDL_SCANCODE_RGUI, RDP_SCANCODE_RWIN), + ENTRY(SDL_SCANCODE_MODE, RDP_SCANCODE_APPS), + ENTRY(SDL_SCANCODE_MUTE, RDP_SCANCODE_VOLUME_MUTE), + ENTRY(SDL_SCANCODE_VOLUMEUP, RDP_SCANCODE_VOLUME_UP), + ENTRY(SDL_SCANCODE_VOLUMEDOWN, RDP_SCANCODE_VOLUME_DOWN), + ENTRY(SDL_SCANCODE_GRAVE, RDP_SCANCODE_OEM_3), + ENTRY(SDL_SCANCODE_COMMA, RDP_SCANCODE_OEM_COMMA), + ENTRY(SDL_SCANCODE_PERIOD, RDP_SCANCODE_OEM_PERIOD), + ENTRY(SDL_SCANCODE_SLASH, RDP_SCANCODE_OEM_2), + ENTRY(SDL_SCANCODE_BACKSLASH, RDP_SCANCODE_OEM_5), + ENTRY(SDL_SCANCODE_SCROLLLOCK, RDP_SCANCODE_SCROLLLOCK), + ENTRY(SDL_SCANCODE_INSERT, RDP_SCANCODE_INSERT), + ENTRY(SDL_SCANCODE_PRINTSCREEN, RDP_SCANCODE_PRINTSCREEN), + ENTRY(SDL_SCANCODE_HOME, RDP_SCANCODE_HOME), + ENTRY(SDL_SCANCODE_DELETE, RDP_SCANCODE_DELETE), + ENTRY(SDL_SCANCODE_RIGHT, RDP_SCANCODE_RIGHT), + ENTRY(SDL_SCANCODE_LEFT, RDP_SCANCODE_LEFT), + ENTRY(SDL_SCANCODE_DOWN, RDP_SCANCODE_DOWN), + ENTRY(SDL_SCANCODE_UP, RDP_SCANCODE_UP), + ENTRY(SDL_SCANCODE_SEMICOLON, RDP_SCANCODE_OEM_1), + ENTRY(SDL_SCANCODE_PAUSE, RDP_SCANCODE_PAUSE), + ENTRY(SDL_SCANCODE_PAGEUP, RDP_SCANCODE_PRIOR), + ENTRY(SDL_SCANCODE_END, RDP_SCANCODE_END), + ENTRY(SDL_SCANCODE_PAGEDOWN, RDP_SCANCODE_NEXT), + ENTRY(SDL_SCANCODE_AUDIONEXT, RDP_SCANCODE_MEDIA_NEXT_TRACK), + ENTRY(SDL_SCANCODE_AUDIOPREV, RDP_SCANCODE_MEDIA_PREV_TRACK), + ENTRY(SDL_SCANCODE_AUDIOSTOP, RDP_SCANCODE_MEDIA_STOP), + ENTRY(SDL_SCANCODE_AUDIOPLAY, RDP_SCANCODE_MEDIA_PLAY_PAUSE), + ENTRY(SDL_SCANCODE_AUDIOMUTE, RDP_SCANCODE_VOLUME_MUTE), + ENTRY(SDL_SCANCODE_MEDIASELECT, RDP_SCANCODE_LAUNCH_MEDIA_SELECT), + ENTRY(SDL_SCANCODE_MAIL, RDP_SCANCODE_LAUNCH_MAIL), + ENTRY(SDL_SCANCODE_APP1, RDP_SCANCODE_LAUNCH_APP1), + ENTRY(SDL_SCANCODE_APP2, RDP_SCANCODE_LAUNCH_APP2), + ENTRY(SDL_SCANCODE_SYSREQ, RDP_SCANCODE_SYSREQ), + ENTRY(SDL_SCANCODE_WWW, RDP_SCANCODE_BROWSER_HOME), + ENTRY(SDL_SCANCODE_LEFTBRACKET, RDP_SCANCODE_OEM_4), + ENTRY(SDL_SCANCODE_RIGHTBRACKET, RDP_SCANCODE_OEM_6), + ENTRY(SDL_SCANCODE_APOSTROPHE, RDP_SCANCODE_OEM_7), + ENTRY(SDL_SCANCODE_NONUSBACKSLASH, RDP_SCANCODE_OEM_102), + ENTRY(SDL_SCANCODE_SLEEP, RDP_SCANCODE_SLEEP), + ENTRY(SDL_SCANCODE_EQUALS, RDP_SCANCODE_OEM_PLUS), + ENTRY(SDL_SCANCODE_KP_COMMA, RDP_SCANCODE_DECIMAL), + ENTRY(SDL_SCANCODE_FIND, RDP_SCANCODE_BROWSER_SEARCH), + ENTRY(SDL_SCANCODE_RETURN2, RDP_SCANCODE_RETURN_KP), + ENTRY(SDL_SCANCODE_AC_SEARCH, RDP_SCANCODE_BROWSER_SEARCH), + ENTRY(SDL_SCANCODE_AC_HOME, RDP_SCANCODE_BROWSER_HOME), + ENTRY(SDL_SCANCODE_AC_BACK, RDP_SCANCODE_BROWSER_BACK), + ENTRY(SDL_SCANCODE_AC_FORWARD, RDP_SCANCODE_BROWSER_FORWARD), + ENTRY(SDL_SCANCODE_AC_STOP, RDP_SCANCODE_BROWSER_STOP), + +#if 1 // TODO: unmapped + ENTRY(SDL_SCANCODE_NONUSHASH, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_APPLICATION, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_POWER, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_EQUALS, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_EXECUTE, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_HELP, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_MENU, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_SELECT, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_STOP, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_AGAIN, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_UNDO, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_CUT, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_COPY, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_PASTE, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_EQUALSAS400, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_INTERNATIONAL1, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_INTERNATIONAL2, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_INTERNATIONAL3, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_INTERNATIONAL4, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_INTERNATIONAL5, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_INTERNATIONAL6, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_INTERNATIONAL7, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_INTERNATIONAL8, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_INTERNATIONAL9, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_LANG1, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_LANG2, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_LANG3, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_LANG4, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_LANG5, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_LANG6, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_LANG7, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_LANG8, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_LANG9, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_ALTERASE, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_CANCEL, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_CLEAR, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_PRIOR, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_SEPARATOR, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_OUT, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_OPER, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_CLEARAGAIN, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_CRSEL, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_EXSEL, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_00, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_000, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_THOUSANDSSEPARATOR, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_DECIMALSEPARATOR, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_CURRENCYUNIT, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_CURRENCYSUBUNIT, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_LEFTPAREN, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_RIGHTPAREN, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_LEFTBRACE, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_RIGHTBRACE, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_TAB, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_BACKSPACE, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_A, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_B, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_C, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_D, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_E, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_F, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_XOR, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_POWER, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_PERCENT, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_LESS, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_GREATER, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_AMPERSAND, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_DBLAMPERSAND, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_VERTICALBAR, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_DBLVERTICALBAR, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_COLON, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_HASH, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_SPACE, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_AT, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_EXCLAM, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_MEMSTORE, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_MEMRECALL, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_MEMCLEAR, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_MEMADD, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_MEMSUBTRACT, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_MEMMULTIPLY, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_MEMDIVIDE, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_PLUSMINUS, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_CLEAR, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_CLEARENTRY, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_BINARY, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_OCTAL, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_DECIMAL, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KP_HEXADECIMAL, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_CALCULATOR, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_COMPUTER, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_AC_REFRESH, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_AC_BOOKMARKS, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_BRIGHTNESSDOWN, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_BRIGHTNESSUP, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_DISPLAYSWITCH, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KBDILLUMTOGGLE, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KBDILLUMDOWN, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_KBDILLUMUP, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_EJECT, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_AUDIOREWIND, RDP_SCANCODE_UNKNOWN), + ENTRY(SDL_SCANCODE_AUDIOFASTFORWARD, RDP_SCANCODE_UNKNOWN) +#endif +}; + +static UINT32 sdl_get_kbd_flags(void) +{ + UINT32 flags = 0; + + SDL_Keymod mod = SDL_GetModState(); + if ((mod & KMOD_NUM) != 0) + flags |= KBD_SYNC_NUM_LOCK; + if ((mod & KMOD_CAPS) != 0) + flags |= KBD_SYNC_CAPS_LOCK; +#if SDL_VERSION_ATLEAST(2, 0, 18) + if ((mod & KMOD_SCROLL) != 0) + flags |= KBD_SYNC_SCROLL_LOCK; +#endif + + // TODO: KBD_SYNC_KANA_LOCK + + return flags; +} + +BOOL sdlInput::keyboard_sync_state() +{ + const UINT32 syncFlags = sdl_get_kbd_flags(); + return freerdp_input_send_synchronize_event(_sdl->context()->input, syncFlags); +} + +BOOL sdlInput::keyboard_focus_in() +{ + auto input = _sdl->context()->input; + WINPR_ASSERT(input); + + auto syncFlags = sdl_get_kbd_flags(); + freerdp_input_send_focus_in_event(input, syncFlags); + + /* finish with a mouse pointer position like mstsc.exe if required */ +#if 0 + if (xfc->remote_app) + return; + + if (XQueryPointer(xfc->display, xfc->window->handle, &w, &w, &d, &d, &x, &y, &state)) + { + if ((x >= 0) && (x < xfc->window->width) && (y >= 0) && (y < xfc->window->height)) + { + xf_event_adjust_coordinates(xfc, &x, &y); + freerdp_client_send_button_event(&xfc->common, FALSE, PTR_FLAGS_MOVE, x, y); + } + } +#endif + return TRUE; +} + +/* This function is called to update the keyboard indicator LED */ +BOOL sdlInput::keyboard_set_indicators(rdpContext* context, UINT16 led_flags) +{ + WINPR_UNUSED(context); + + int state = KMOD_NONE; + + if ((led_flags & KBD_SYNC_NUM_LOCK) != 0) + state |= KMOD_NUM; + if ((led_flags & KBD_SYNC_CAPS_LOCK) != 0) + state |= KMOD_CAPS; +#if SDL_VERSION_ATLEAST(2, 0, 18) + if ((led_flags & KBD_SYNC_SCROLL_LOCK) != 0) + state |= KMOD_SCROLL; +#endif + + // TODO: KBD_SYNC_KANA_LOCK + + SDL_SetModState(static_cast(state)); + + return TRUE; +} + +/* This function is called to set the IME state */ +BOOL sdlInput::keyboard_set_ime_status(rdpContext* context, UINT16 imeId, UINT32 imeState, + UINT32 imeConvMode) +{ + if (!context) + return FALSE; + + WLog_WARN(TAG, + "KeyboardSetImeStatus(unitId=%04" PRIx16 ", imeState=%08" PRIx32 + ", imeConvMode=%08" PRIx32 ") ignored", + imeId, imeState, imeConvMode); + return TRUE; +} + +uint32_t sdlInput::prefToMask() +{ + const std::map mapping = { + { "KMOD_LSHIFT", KMOD_LSHIFT }, + { "KMOD_RSHIFT", KMOD_RSHIFT }, + { "KMOD_LCTRL", KMOD_LCTRL }, + { "KMOD_RCTRL", KMOD_RCTRL }, + { "KMOD_LALT", KMOD_LALT }, + { "KMOD_RALT", KMOD_RALT }, + { "KMOD_LGUI", KMOD_LGUI }, + { "KMOD_RGUI", KMOD_RGUI }, + { "KMOD_NUM", KMOD_NUM }, + { "KMOD_CAPS", KMOD_CAPS }, + { "KMOD_MODE", KMOD_MODE }, +#if SDL_VERSION_ATLEAST(2, 0, 18) + { "KMOD_SCROLL", KMOD_SCROLL }, +#endif + { "KMOD_CTRL", KMOD_CTRL }, + { "KMOD_SHIFT", KMOD_SHIFT }, + { "KMOD_ALT", KMOD_ALT }, + { "KMOD_GUI", KMOD_GUI } + }; + uint32_t mod = KMOD_NONE; + for (const auto& val : SdlPref::instance()->get_array("SDL_KeyModMask", { "KMOD_RSHIFT" })) + { + auto it = mapping.find(val); + if (it != mapping.end()) + { + mod |= it->second; + } + } + return mod; +} + +static const char* sdl_scancode_name(Uint32 scancode) +{ + for (const auto& cur : map) + { + if (cur.sdl == scancode) + return cur.sdl_name; + } + + return "SDL_SCANCODE_UNKNOWN"; +} + +static Uint32 sdl_scancode_val(const char* scancodeName) +{ + for (const auto& cur : map) + { + if (strcmp(cur.sdl_name, scancodeName) == 0) + return cur.sdl; + } + + return SDL_SCANCODE_UNKNOWN; +} + +static const char* sdl_rdp_scancode_name(UINT32 scancode) +{ + for (const auto& cur : map) + { + if (cur.rdp == scancode) + return cur.rdp_name; + } + + return "RDP_SCANCODE_UNKNOWN"; +} + +static UINT32 sdl_rdp_scancode_val(const char* scancodeName) +{ + for (const auto& cur : map) + { + if (strcmp(cur.rdp_name, scancodeName) == 0) + return cur.rdp; + } + + return RDP_SCANCODE_UNKNOWN; +} + +static UINT32 sdl_scancode_to_rdp(Uint32 scancode) +{ + UINT32 rdp = RDP_SCANCODE_UNKNOWN; + + for (const auto& cur : map) + { + if (cur.sdl == scancode) + { + rdp = cur.rdp; + break; + } + } + +#if defined(WITH_DEBUG_SDL_KBD_EVENTS) + auto code = static_cast(scancode); + WLog_DBG(TAG, "got %s [%s] -> [%s]", SDL_GetScancodeName(code), sdl_scancode_name(scancode), + sdl_rdp_scancode_name(rdp)); +#endif + return rdp; +} + +uint32_t sdlInput::prefKeyValue(const std::string& key, uint32_t fallback) +{ + auto item = SdlPref::instance()->get_string(key); + if (item.empty()) + return fallback; + auto val = sdl_scancode_val(item.c_str()); + if (val == SDL_SCANCODE_UNKNOWN) + return fallback; + return val; +} + +std::list sdlInput::tokenize(const std::string& data, const std::string& delimiter) +{ + size_t lastpos = 0; + size_t pos = 0; + std::list list; + while ((pos = data.find(delimiter, lastpos)) != std::string::npos) + { + auto token = data.substr(lastpos, pos); + lastpos = pos + 1; + list.push_back(token); + } + auto token = data.substr(lastpos); + list.push_back(token); + return list; +} + +bool sdlInput::extract(const std::string& token, uint32_t& key, uint32_t& value) +{ + int rc = sscanf(token.c_str(), "%" PRIu32 "=%" PRIu32, &key, &value); + if (rc != 2) + rc = sscanf(token.c_str(), "%" PRIx32 "=%" PRIx32 "", &key, &value); + if (rc != 2) + rc = sscanf(token.c_str(), "%" PRIu32 "=%" PRIx32, &key, &value); + if (rc != 2) + rc = sscanf(token.c_str(), "%" PRIx32 "=%" PRIu32, &key, &value); + return (rc == 2); +} + +uint32_t sdlInput::remapScancode(uint32_t scancode) +{ + if (!_remapInitialized.exchange(true)) + remapInitialize(); + auto it = _remapList.find(scancode); + if (it != _remapList.end()) + return it->second; + return scancode; +} + +void sdlInput::remapInitialize() +{ + WINPR_ASSERT(_sdl); + + auto context = _sdl->context(); + WINPR_ASSERT(context); + auto KeyboardRemappingList = + freerdp_settings_get_string(context->settings, FreeRDP_KeyboardRemappingList); + if (!KeyboardRemappingList) + return; + + auto list = tokenize(KeyboardRemappingList); + for (auto& token : list) + { + uint32_t key = 0; + uint32_t value = 0; + if (!extract(token, key, value)) + continue; + _remapList.emplace(key, value); + } +} + +BOOL sdlInput::keyboard_handle_event(const SDL_KeyboardEvent* ev) +{ + WINPR_ASSERT(ev); + const UINT32 rdp_scancode = sdl_scancode_to_rdp(ev->keysym.scancode); + const SDL_Keymod mods = SDL_GetModState(); + const auto mask = prefToMask(); + const auto valFullscreen = prefKeyValue("SDL_Fullscreen", SDL_SCANCODE_RETURN); + const auto valResizeable = prefKeyValue("SDL_Resizeable", SDL_SCANCODE_R); + const auto valGrab = prefKeyValue("SDL_Grab", SDL_SCANCODE_G); + const auto valDisconnect = prefKeyValue("SDL_Disconnect", SDL_SCANCODE_D); + + if ((mods & mask) == mask) + { + if (ev->type == SDL_KEYDOWN) + { + if (ev->keysym.scancode == valFullscreen) + { + _sdl->update_fullscreen(!_sdl->fullscreen); + return TRUE; + } + if (ev->keysym.scancode == valResizeable) + { + _sdl->update_resizeable(!_sdl->resizeable); + return TRUE; + } + + if (ev->keysym.scancode == valGrab) + { + keyboard_grab(ev->windowID, _sdl->grab_kbd ? SDL_FALSE : SDL_TRUE); + return TRUE; + } + if (ev->keysym.scancode == valDisconnect) + { + freerdp_abort_connect_context(_sdl->context()); + return TRUE; + } + } + } + + auto scancode = remapScancode(rdp_scancode); + return freerdp_input_send_keyboard_event_ex(_sdl->context()->input, ev->type == SDL_KEYDOWN, + ev->repeat, scancode); +} + +BOOL sdlInput::keyboard_grab(Uint32 windowID, SDL_bool enable) +{ + auto it = _sdl->windows.find(windowID); + if (it == _sdl->windows.end()) + return FALSE; + _sdl->grab_kbd = enable; + return it->second.grabKeyboard(enable); +} + +BOOL sdlInput::mouse_focus(Uint32 windowID) +{ + if (_lastWindowID != windowID) + { + _lastWindowID = windowID; + auto it = _sdl->windows.find(windowID); + if (it == _sdl->windows.end()) + return FALSE; + + it->second.raise(); + } + return TRUE; +} + +BOOL sdlInput::mouse_grab(Uint32 windowID, SDL_bool enable) +{ + auto it = _sdl->windows.find(windowID); + if (it == _sdl->windows.end()) + return FALSE; + _sdl->grab_mouse = enable; + return it->second.grabMouse(enable); +} + +sdlInput::sdlInput(SdlContext* sdl) : _sdl(sdl), _lastWindowID(UINT32_MAX) +{ +} diff --git a/client/SDL3/sdl_kbd.hpp b/client/SDL3/sdl_kbd.hpp new file mode 100644 index 000000000..c75da4d0c --- /dev/null +++ b/client/SDL3/sdl_kbd.hpp @@ -0,0 +1,69 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * SDL Client keyboard helper + * + * Copyright 2022 Armin Novak + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include +#include +#include +#include + +#include +#include +#include + +#include "sdl_types.hpp" + +class sdlInput +{ + public: + explicit sdlInput(SdlContext* sdl); + ~sdlInput() = default; + + BOOL keyboard_sync_state(); + BOOL keyboard_focus_in(); + + BOOL keyboard_handle_event(const SDL_KeyboardEvent* ev); + + BOOL keyboard_grab(Uint32 windowID, SDL_bool enable); + BOOL mouse_focus(Uint32 windowID); + BOOL mouse_grab(Uint32 windowID, SDL_bool enable); + + public: + static BOOL keyboard_set_indicators(rdpContext* context, UINT16 led_flags); + static BOOL keyboard_set_ime_status(rdpContext* context, UINT16 imeId, UINT32 imeState, + UINT32 imeConvMode); + + static uint32_t prefToMask(); + static uint32_t prefKeyValue(const std::string& key, uint32_t fallback = SDL_SCANCODE_UNKNOWN); + + private: + static std::list tokenize(const std::string& data, + const std::string& delimiter = ","); + static bool extract(const std::string& token, uint32_t& key, uint32_t& value); + + uint32_t remapScancode(uint32_t scancode); + void remapInitialize(); + + private: + SdlContext* _sdl; + Uint32 _lastWindowID; + std::map _remapList; + std::atomic _remapInitialized = false; +}; diff --git a/client/SDL3/sdl_monitor.cpp b/client/SDL3/sdl_monitor.cpp new file mode 100644 index 000000000..c8570289b --- /dev/null +++ b/client/SDL3/sdl_monitor.cpp @@ -0,0 +1,340 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * X11 Monitor Handling + * + * Copyright 2011 Marc-Andre Moreau + * Copyright 2017 David Fort + * Copyright 2018 Kai Harms + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include +#include +#include + +#include + +#include +#include + +#include + +#define TAG CLIENT_TAG("sdl") + +#include "sdl_monitor.hpp" +#include "sdl_freerdp.hpp" + +typedef struct +{ + RECTANGLE_16 area; + RECTANGLE_16 workarea; + BOOL primary; +} MONITOR_INFO; + +typedef struct +{ + int nmonitors; + RECTANGLE_16 area; + RECTANGLE_16 workarea; + MONITOR_INFO* monitors; +} VIRTUAL_SCREEN; + +/* See MSDN Section on Multiple Display Monitors: http://msdn.microsoft.com/en-us/library/dd145071 + */ + +int sdl_list_monitors(SdlContext* sdl) +{ + SDL_Init(SDL_INIT_VIDEO); + const int nmonitors = SDL_GetNumVideoDisplays(); + + printf("listing %d monitors:\n", nmonitors); + for (int i = 0; i < nmonitors; i++) + { + SDL_Rect rect = {}; + const int brc = SDL_GetDisplayBounds(i, &rect); + const char* name = SDL_GetDisplayName(i); + + if (brc != 0) + continue; + printf(" %s [%d] [%s] %dx%d\t+%d+%d\n", (i == 0) ? "*" : " ", i, name, rect.w, rect.h, + rect.x, rect.y); + } + + SDL_Quit(); + return 0; +} + +static BOOL sdl_is_monitor_id_active(SdlContext* sdl, UINT32 id) +{ + const rdpSettings* settings = nullptr; + + WINPR_ASSERT(sdl); + + settings = sdl->context()->settings; + WINPR_ASSERT(settings); + + const UINT32 NumMonitorIds = freerdp_settings_get_uint32(settings, FreeRDP_NumMonitorIds); + if (!NumMonitorIds) + return TRUE; + + for (UINT32 index = 0; index < NumMonitorIds; index++) + { + auto cur = static_cast( + freerdp_settings_get_pointer_array(settings, FreeRDP_MonitorIds, index)); + if (cur && (*cur == id)) + return TRUE; + } + + return FALSE; +} + +static BOOL sdl_apply_max_size(SdlContext* sdl, UINT32* pMaxWidth, UINT32* pMaxHeight) +{ + WINPR_ASSERT(sdl); + WINPR_ASSERT(pMaxWidth); + WINPR_ASSERT(pMaxHeight); + + auto settings = sdl->context()->settings; + WINPR_ASSERT(settings); + + *pMaxWidth = 0; + *pMaxHeight = 0; + + for (size_t x = 0; x < freerdp_settings_get_uint32(settings, FreeRDP_MonitorCount); x++) + { + auto monitor = static_cast( + freerdp_settings_get_pointer_array(settings, FreeRDP_MonitorDefArray, x)); + + if (freerdp_settings_get_bool(settings, FreeRDP_Fullscreen)) + { + *pMaxWidth = monitor->width; + *pMaxHeight = monitor->height; + } + else if (freerdp_settings_get_bool(settings, FreeRDP_Workarea)) + { + SDL_Rect rect = {}; + SDL_GetDisplayUsableBounds(monitor->orig_screen, &rect); + *pMaxWidth = rect.w; + *pMaxHeight = rect.h; + } + else if (freerdp_settings_get_uint32(settings, FreeRDP_PercentScreen) > 0) + { + SDL_Rect rect = {}; + SDL_GetDisplayUsableBounds(monitor->orig_screen, &rect); + + *pMaxWidth = rect.w; + *pMaxHeight = rect.h; + + if (freerdp_settings_get_bool(settings, FreeRDP_PercentScreenUseWidth)) + *pMaxWidth = + (rect.w * freerdp_settings_get_uint32(settings, FreeRDP_PercentScreen)) / 100; + + if (freerdp_settings_get_bool(settings, FreeRDP_PercentScreenUseHeight)) + *pMaxHeight = + (rect.h * freerdp_settings_get_uint32(settings, FreeRDP_PercentScreen)) / 100; + } + else if (freerdp_settings_get_uint32(settings, FreeRDP_DesktopWidth) && + freerdp_settings_get_uint32(settings, FreeRDP_DesktopHeight)) + { + *pMaxWidth = freerdp_settings_get_uint32(settings, FreeRDP_DesktopWidth); + *pMaxHeight = freerdp_settings_get_uint32(settings, FreeRDP_DesktopHeight); + } + } + return TRUE; +} + +#if SDL_VERSION_ATLEAST(2, 0, 10) +static UINT32 sdl_orientaion_to_rdp(SDL_DisplayOrientation orientation) +{ + switch (orientation) + { + case SDL_ORIENTATION_LANDSCAPE: + return ORIENTATION_LANDSCAPE; + case SDL_ORIENTATION_LANDSCAPE_FLIPPED: + return ORIENTATION_LANDSCAPE_FLIPPED; + case SDL_ORIENTATION_PORTRAIT_FLIPPED: + return ORIENTATION_PORTRAIT_FLIPPED; + case SDL_ORIENTATION_PORTRAIT: + default: + return ORIENTATION_PORTRAIT; + } +} +#endif + +static BOOL sdl_apply_display_properties(SdlContext* sdl) +{ + WINPR_ASSERT(sdl); + + rdpSettings* settings = sdl->context()->settings; + WINPR_ASSERT(settings); + + const UINT32 numIds = freerdp_settings_get_uint32(settings, FreeRDP_NumMonitorIds); + if (!freerdp_settings_set_pointer_len(settings, FreeRDP_MonitorDefArray, nullptr, numIds)) + return FALSE; + if (!freerdp_settings_set_uint32(settings, FreeRDP_MonitorCount, numIds)) + return FALSE; + + for (UINT32 x = 0; x < numIds; x++) + { + auto id = static_cast( + freerdp_settings_get_pointer_array(settings, FreeRDP_MonitorIds, x)); + WINPR_ASSERT(id); + + float ddpi = 1.0f; + float hdpi = 1.0f; + float vdpi = 1.0f; + SDL_Rect rect = {}; + + if (SDL_GetDisplayBounds(*id, &rect) < 0) + return FALSE; + + if (SDL_GetDisplayDPI(*id, &ddpi, &hdpi, &vdpi) < 0) + return FALSE; + + WINPR_ASSERT(rect.w > 0); + WINPR_ASSERT(rect.h > 0); + WINPR_ASSERT(ddpi > 0); + WINPR_ASSERT(hdpi > 0); + WINPR_ASSERT(vdpi > 0); + + bool highDpi = hdpi > 100; + + if (highDpi) + { + // HighDPI is problematic with SDL: We can only get native resolution by creating a + // window. Work around this by checking the supported resolutions (and keep maximum) + // Also scale the DPI + const SDL_Rect scaleRect = rect; + for (int i = 0; i < SDL_GetNumDisplayModes(*id); i++) + { + SDL_DisplayMode mode = {}; + SDL_GetDisplayMode(x, i, &mode); + + if (mode.w > rect.w) + { + rect.w = mode.w; + rect.h = mode.h; + } + else if (mode.w == rect.w) + { + if (mode.h > rect.h) + { + rect.w = mode.w; + rect.h = mode.h; + } + } + } + + const float dw = 1.0f * rect.w / scaleRect.w; + const float dh = 1.0f * rect.h / scaleRect.h; + hdpi /= dw; + vdpi /= dh; + } + +#if SDL_VERSION_ATLEAST(2, 0, 10) + const SDL_DisplayOrientation orientation = SDL_GetDisplayOrientation(*id); + const UINT32 rdp_orientation = sdl_orientaion_to_rdp(orientation); +#else + const UINT32 rdp_orientation = ORIENTATION_LANDSCAPE; +#endif + + auto monitor = static_cast( + freerdp_settings_get_pointer_array_writable(settings, FreeRDP_MonitorDefArray, x)); + WINPR_ASSERT(monitor); + + /* windows uses 96 dpi as 'default' and the scale factors are in percent. */ + const auto factor = ddpi / 96.0f * 100.0f; + monitor->orig_screen = x; + monitor->x = rect.x; + monitor->y = rect.y; + monitor->width = rect.w; + monitor->height = rect.h; + monitor->is_primary = x == 0; + monitor->attributes.desktopScaleFactor = factor; + monitor->attributes.deviceScaleFactor = 100; + monitor->attributes.orientation = rdp_orientation; + monitor->attributes.physicalWidth = rect.w / hdpi; + monitor->attributes.physicalHeight = rect.h / vdpi; + } + return TRUE; +} + +static BOOL sdl_detect_single_window(SdlContext* sdl, UINT32* pMaxWidth, UINT32* pMaxHeight) +{ + WINPR_ASSERT(sdl); + WINPR_ASSERT(pMaxWidth); + WINPR_ASSERT(pMaxHeight); + + rdpSettings* settings = sdl->context()->settings; + WINPR_ASSERT(settings); + + if ((!freerdp_settings_get_bool(settings, FreeRDP_UseMultimon) && + !freerdp_settings_get_bool(settings, FreeRDP_SpanMonitors)) || + (freerdp_settings_get_bool(settings, FreeRDP_Workarea) && + !freerdp_settings_get_bool(settings, FreeRDP_RemoteApplicationMode))) + { + /* If no monitors were specified on the command-line then set the current monitor as active + */ + if (freerdp_settings_get_uint32(settings, FreeRDP_NumMonitorIds) == 0) + { + const size_t id = + (sdl->windows.size() > 0) ? sdl->windows.begin()->second.displayIndex() : 0; + if (!freerdp_settings_set_pointer_len(settings, FreeRDP_MonitorIds, &id, 1)) + return FALSE; + } + else + { + + /* Always sets number of monitors from command-line to just 1. + * If the monitor is invalid then we will default back to current monitor + * later as a fallback. So, there is no need to validate command-line entry here. + */ + if (!freerdp_settings_set_uint32(settings, FreeRDP_NumMonitorIds, 1)) + return FALSE; + } + + // TODO: Fill monitor struct + if (!sdl_apply_display_properties(sdl)) + return FALSE; + return sdl_apply_max_size(sdl, pMaxWidth, pMaxHeight); + } + return TRUE; +} + +BOOL sdl_detect_monitors(SdlContext* sdl, UINT32* pMaxWidth, UINT32* pMaxHeight) +{ + WINPR_ASSERT(sdl); + WINPR_ASSERT(pMaxWidth); + WINPR_ASSERT(pMaxHeight); + + rdpSettings* settings = sdl->context()->settings; + WINPR_ASSERT(settings); + + const int numDisplays = SDL_GetNumVideoDisplays(); + if (!freerdp_settings_set_pointer_len(settings, FreeRDP_MonitorIds, nullptr, numDisplays)) + return FALSE; + + for (size_t x = 0; x < numDisplays; x++) + { + if (!freerdp_settings_set_pointer_array(settings, FreeRDP_MonitorIds, x, &x)) + return FALSE; + } + + if (!sdl_apply_display_properties(sdl)) + return FALSE; + + return sdl_detect_single_window(sdl, pMaxWidth, pMaxHeight); +} diff --git a/client/SDL3/sdl_monitor.hpp b/client/SDL3/sdl_monitor.hpp new file mode 100644 index 000000000..64f9f5688 --- /dev/null +++ b/client/SDL3/sdl_monitor.hpp @@ -0,0 +1,28 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * SDL Monitor Handling + * + * Copyright 2023 Armin Novak + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include +#include + +#include "sdl_types.hpp" + +int sdl_list_monitors(SdlContext* sdl); +BOOL sdl_detect_monitors(SdlContext* sdl, UINT32* pWidth, UINT32* pHeight); diff --git a/client/SDL3/sdl_pointer.cpp b/client/SDL3/sdl_pointer.cpp new file mode 100644 index 000000000..ad8a4f316 --- /dev/null +++ b/client/SDL3/sdl_pointer.cpp @@ -0,0 +1,197 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Wayland Mouse Pointer + * + * Copyright 2023 Armin Novak + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include + +#include "sdl_pointer.hpp" +#include "sdl_freerdp.hpp" +#include "sdl_touch.hpp" +#include "sdl_utils.hpp" + +#include + +#define TAG CLIENT_TAG("SDL.pointer") + +typedef struct +{ + rdpPointer pointer; + SDL_Cursor* cursor; + SDL_Surface* image; + size_t size; + void* data; +} sdlPointer; + +static BOOL sdl_Pointer_New(rdpContext* context, rdpPointer* pointer) +{ + auto ptr = reinterpret_cast(pointer); + + WINPR_ASSERT(context); + if (!ptr) + return FALSE; + + rdpGdi* gdi = context->gdi; + WINPR_ASSERT(gdi); + + ptr->size = 4ull * pointer->width * pointer->height; + ptr->data = winpr_aligned_malloc(ptr->size, 16); + + if (!ptr->data) + return FALSE; + + auto data = static_cast(ptr->data); + if (!freerdp_image_copy_from_pointer_data( + data, gdi->dstFormat, 0, 0, 0, pointer->width, pointer->height, pointer->xorMaskData, + pointer->lengthXorMask, pointer->andMaskData, pointer->lengthAndMask, pointer->xorBpp, + &context->gdi->palette)) + { + winpr_aligned_free(ptr->data); + return FALSE; + } + + return TRUE; +} + +static void sdl_Pointer_Clear(sdlPointer* ptr) +{ + WINPR_ASSERT(ptr); + SDL_FreeCursor(ptr->cursor); + SDL_FreeSurface(ptr->image); + ptr->cursor = nullptr; + ptr->image = nullptr; +} + +static void sdl_Pointer_Free(rdpContext* context, rdpPointer* pointer) +{ + auto ptr = reinterpret_cast(pointer); + WINPR_UNUSED(context); + + if (ptr) + { + sdl_Pointer_Clear(ptr); + winpr_aligned_free(ptr->data); + ptr->data = nullptr; + } +} + +static BOOL sdl_Pointer_SetDefault(rdpContext* context) +{ + WINPR_UNUSED(context); + + return sdl_push_user_event(SDL_USEREVENT_POINTER_DEFAULT); +} + +static BOOL sdl_Pointer_Set(rdpContext* context, rdpPointer* pointer) +{ + auto sdl = get_context(context); + + return sdl_push_user_event(SDL_USEREVENT_POINTER_SET, pointer, sdl); +} + +BOOL sdl_Pointer_Set_Process(SDL_UserEvent* uptr) +{ + INT32 w = 0; + INT32 h = 0; + INT32 x = 0; + INT32 y = 0; + INT32 sw = 0; + INT32 sh = 0; + + WINPR_ASSERT(uptr); + + auto sdl = static_cast(uptr->data2); + WINPR_ASSERT(sdl); + + auto context = sdl->context(); + auto ptr = static_cast(uptr->data1); + WINPR_ASSERT(ptr); + + rdpPointer* pointer = &ptr->pointer; + + rdpGdi* gdi = context->gdi; + WINPR_ASSERT(gdi); + + x = static_cast(pointer->xPos); + y = static_cast(pointer->yPos); + sw = w = static_cast(pointer->width); + sh = h = static_cast(pointer->height); + + SDL_Window* window = SDL_GetMouseFocus(); + if (!window) + return sdl_Pointer_SetDefault(context); + + const Uint32 id = SDL_GetWindowID(window); + + if (!sdl_scale_coordinates(sdl, id, &x, &y, FALSE, FALSE) || + !sdl_scale_coordinates(sdl, id, &sw, &sh, FALSE, FALSE)) + return FALSE; + + sdl_Pointer_Clear(ptr); + + const DWORD bpp = FreeRDPGetBitsPerPixel(gdi->dstFormat); + ptr->image = + SDL_CreateRGBSurfaceWithFormat(0, sw, sh, static_cast(bpp), sdl->sdl_pixel_format); + if (!ptr->image) + return FALSE; + + SDL_LockSurface(ptr->image); + auto pixels = static_cast(ptr->image->pixels); + auto data = static_cast(ptr->data); + const BOOL rc = freerdp_image_scale( + pixels, gdi->dstFormat, static_cast(ptr->image->pitch), 0, 0, + static_cast(ptr->image->w), static_cast(ptr->image->h), data, + gdi->dstFormat, 0, 0, 0, static_cast(w), static_cast(h)); + SDL_UnlockSurface(ptr->image); + if (!rc) + return FALSE; + + ptr->cursor = SDL_CreateColorCursor(ptr->image, x, y); + if (!ptr->cursor) + return FALSE; + + SDL_SetCursor(ptr->cursor); + SDL_ShowCursor(SDL_ENABLE); + return TRUE; +} + +static BOOL sdl_Pointer_SetNull(rdpContext* context) +{ + WINPR_UNUSED(context); + + return sdl_push_user_event(SDL_USEREVENT_POINTER_NULL); +} + +static BOOL sdl_Pointer_SetPosition(rdpContext* context, UINT32 x, UINT32 y) +{ + auto sdl = get_context(context); + WINPR_ASSERT(sdl); + + return sdl_push_user_event(SDL_USEREVENT_POINTER_POSITION, x, y); +} + +BOOL sdl_register_pointer(rdpGraphics* graphics) +{ + const rdpPointer pointer = { sizeof(sdlPointer), sdl_Pointer_New, + sdl_Pointer_Free, sdl_Pointer_Set, + sdl_Pointer_SetNull, sdl_Pointer_SetDefault, + sdl_Pointer_SetPosition, 0 }; + graphics_register_pointer(graphics, &pointer); + return TRUE; +} diff --git a/client/SDL3/sdl_pointer.hpp b/client/SDL3/sdl_pointer.hpp new file mode 100644 index 000000000..006e96294 --- /dev/null +++ b/client/SDL3/sdl_pointer.hpp @@ -0,0 +1,27 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * SDL Mouse Pointer + * + * Copyright 2023 Armin Novak + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include +#include + +BOOL sdl_register_pointer(rdpGraphics* graphics); + +BOOL sdl_Pointer_Set_Process(SDL_UserEvent* uptr); diff --git a/client/SDL3/sdl_prefs.cpp b/client/SDL3/sdl_prefs.cpp new file mode 100644 index 000000000..f73393906 --- /dev/null +++ b/client/SDL3/sdl_prefs.cpp @@ -0,0 +1,139 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * SDL Prefs + * + * Copyright 2022 Armin Novak + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if __has_include() +#include +namespace fs = std::filesystem; +#elif __has_include() +#include +namespace fs = std::experimental::filesystem; +#else +#error Could not find system header "" or "" +#endif + +#include "sdl_prefs.hpp" + +#include +#include +#include +#include + +SdlPref::WINPR_JSONPtr SdlPref::get() +{ + auto config = get_pref_file(); + + std::ifstream ifs(config); + std::string content((std::istreambuf_iterator(ifs)), (std::istreambuf_iterator())); + return { WINPR_JSON_ParseWithLength(content.c_str(), content.size()), WINPR_JSON_Delete }; +} + +WINPR_JSON* SdlPref::get_item(const std::string& key) +{ + if (!_config) + return nullptr; + return WINPR_JSON_GetObjectItem(_config.get(), key.c_str()); +} + +std::string SdlPref::item_to_str(WINPR_JSON* item, const std::string& fallback) +{ + if (!item || !WINPR_JSON_IsString(item)) + return fallback; + auto str = WINPR_JSON_GetStringValue(item); + if (!str) + return {}; + return str; +} + +std::string SdlPref::get_string(const std::string& key, const std::string& fallback) +{ + auto item = get_item(key); + return item_to_str(item, fallback); +} + +bool SdlPref::get_bool(const std::string& key, bool fallback) +{ + auto item = get_item(key); + if (!item || !WINPR_JSON_IsBool(item)) + return fallback; + return WINPR_JSON_IsTrue(item); +} + +int64_t SdlPref::get_int(const std::string& key, int64_t fallback) +{ + auto item = get_item(key); + if (!item || !WINPR_JSON_IsNumber(item)) + return fallback; + auto val = WINPR_JSON_GetNumberValue(item); + return static_cast(val); +} + +std::vector SdlPref::get_array(const std::string& key, + const std::vector& fallback) +{ + auto item = get_item(key); + if (!item || !WINPR_JSON_IsArray(item)) + return fallback; + + std::vector values; + for (int x = 0; x < WINPR_JSON_GetArraySize(item); x++) + { + auto cur = WINPR_JSON_GetArrayItem(item, x); + values.push_back(item_to_str(cur)); + } + + return values; +} + +SdlPref::SdlPref(const std::string& file) : _name(file), _config(get()) +{ +} + +std::string SdlPref::get_pref_dir() +{ + using CStringPtr = std::unique_ptr; + CStringPtr path(GetKnownPath(KNOWN_PATH_XDG_CONFIG_HOME), free); + if (!path) + return {}; + + fs::path config{ path.get() }; + config /= FREERDP_VENDOR; + config /= FREERDP_PRODUCT; + return config.string(); +} + +std::string SdlPref::get_default_file() +{ + fs::path config{ SdlPref::get_pref_dir() }; + config /= "sdl-freerdp.json"; + return config.string(); +} + +std::shared_ptr SdlPref::instance(const std::string& name) +{ + static std::shared_ptr _instance; + if (!_instance || (_instance->get_pref_file() != name)) + _instance.reset(new SdlPref(name)); + return _instance; +} + +std::string SdlPref::get_pref_file() +{ + return _name; +} diff --git a/client/SDL3/sdl_prefs.hpp b/client/SDL3/sdl_prefs.hpp new file mode 100644 index 000000000..225d5a1f7 --- /dev/null +++ b/client/SDL3/sdl_prefs.hpp @@ -0,0 +1,54 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * SDL Prefs + * + * Copyright 2022 Armin Novak + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include +#include +#include +#include + +class SdlPref +{ + public: + static std::shared_ptr instance(const std::string& name = SdlPref::get_default_file()); + + std::string get_pref_file(); + + std::string get_string(const std::string& key, const std::string& fallback = ""); + int64_t get_int(const std::string& key, int64_t fallback = 0); + bool get_bool(const std::string& key, bool fallback = false); + std::vector get_array(const std::string& key, + const std::vector& fallback = {}); + + private: + using WINPR_JSONPtr = std::unique_ptr; + + std::string _name; + WINPR_JSONPtr _config; + + SdlPref(const std::string& file); + + WINPR_JSON* get_item(const std::string& key); + WINPR_JSONPtr get(); + + static std::string get_pref_dir(); + static std::string get_default_file(); + static std::string item_to_str(WINPR_JSON* item, const std::string& fallback = ""); +}; diff --git a/client/SDL3/sdl_touch.cpp b/client/SDL3/sdl_touch.cpp new file mode 100644 index 000000000..81fcbfb0c --- /dev/null +++ b/client/SDL3/sdl_touch.cpp @@ -0,0 +1,285 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * FreeRDP SDL touch/mouse input + * + * Copyright 2022 Armin Novak + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include "sdl_touch.hpp" +#include "sdl_freerdp.hpp" + +#include +#include + +#include +#include + +#include + +#define TAG CLIENT_TAG("SDL.touch") + +BOOL sdl_scale_coordinates(SdlContext* sdl, Uint32 windowId, INT32* px, INT32* py, + BOOL fromLocalToRDP, BOOL applyOffset) +{ + rdpGdi* gdi = nullptr; + double sx = 1.0; + double sy = 1.0; + + if (!sdl || !px || !py || !sdl->context()->gdi) + return FALSE; + + WINPR_ASSERT(sdl->context()->gdi); + WINPR_ASSERT(sdl->context()->settings); + + gdi = sdl->context()->gdi; + + // TODO: Make this multimonitor ready! + // TODO: Need to find the primary monitor, get the scale + // TODO: Need to find the destination monitor, get the scale + // TODO: All intermediate monitors, get the scale + + int offset_x = 0; + int offset_y = 0; + for (const auto& it : sdl->windows) + { + auto& window = it.second; + const auto id = window.id(); + if (id != windowId) + { + continue; + } + + auto size = window.rect(); + + sx = size.w / static_cast(gdi->width); + sy = size.h / static_cast(gdi->height); + offset_x = window.offsetX(); + offset_y = window.offsetY(); + break; + } + + if (freerdp_settings_get_bool(sdl->context()->settings, FreeRDP_SmartSizing)) + { + if (!fromLocalToRDP) + { + *px = static_cast(*px * sx); + *py = static_cast(*py * sy); + } + else + { + *px = static_cast(*px / sx); + *py = static_cast(*py / sy); + } + } + else if (applyOffset) + { + *px -= offset_x; + *py -= offset_y; + } + + return TRUE; +} + +static BOOL sdl_get_touch_scaled(SdlContext* sdl, const SDL_TouchFingerEvent* ev, INT32* px, + INT32* py, BOOL local) +{ + Uint32 windowID = 0; + + WINPR_ASSERT(sdl); + WINPR_ASSERT(ev); + WINPR_ASSERT(px); + WINPR_ASSERT(py); + +#if SDL_VERSION_ATLEAST(2, 0, 12) + SDL_Window* window = SDL_GetWindowFromID(ev->windowID); +#else + SDL_Window* window = SDL_GetMouseFocus(); +#endif + + if (!window) + return FALSE; + + windowID = SDL_GetWindowID(window); + SDL_Surface* surface = SDL_GetWindowSurface(window); + if (!surface) + return FALSE; + + // TODO: Add the offset of the surface in the global coordinates + *px = static_cast(ev->x * static_cast(surface->w)); + *py = static_cast(ev->y * static_cast(surface->h)); + return sdl_scale_coordinates(sdl, windowID, px, py, local, TRUE); +} + +static BOOL send_mouse_wheel(SdlContext* sdl, UINT16 flags, INT32 avalue) +{ + WINPR_ASSERT(sdl); + if (avalue < 0) + { + flags |= PTR_FLAGS_WHEEL_NEGATIVE; + avalue = -avalue; + } + + while (avalue > 0) + { + const UINT16 cval = (avalue > 0xFF) ? 0xFF : static_cast(avalue); + UINT16 cflags = flags | cval; + /* Convert negative values to 9bit twos complement */ + if (flags & PTR_FLAGS_WHEEL_NEGATIVE) + cflags = (flags & 0xFF00) | (0x100 - cval); + if (!freerdp_client_send_wheel_event(sdl->common(), cflags)) + return FALSE; + + avalue -= cval; + } + return TRUE; +} + +static UINT32 sdl_scale_pressure(const float pressure) +{ + const float val = pressure * 0x400; /* [MS-RDPEI] 2.2.3.3.1.1 RDPINPUT_TOUCH_CONTACT */ + if (val < 0.0f) + return 0; + if (val > 0x400) + return 0x400; + return static_cast(val); +} + +BOOL sdl_handle_touch_up(SdlContext* sdl, const SDL_TouchFingerEvent* ev) +{ + WINPR_ASSERT(sdl); + WINPR_ASSERT(ev); + + INT32 x = 0; + INT32 y = 0; + if (!sdl_get_touch_scaled(sdl, ev, &x, &y, TRUE)) + return FALSE; + return freerdp_client_handle_touch(sdl->common(), FREERDP_TOUCH_UP | FREERDP_TOUCH_HAS_PRESSURE, + static_cast(ev->fingerId), + sdl_scale_pressure(ev->pressure), x, y); +} + +BOOL sdl_handle_touch_down(SdlContext* sdl, const SDL_TouchFingerEvent* ev) +{ + WINPR_ASSERT(sdl); + WINPR_ASSERT(ev); + + INT32 x = 0; + INT32 y = 0; + if (!sdl_get_touch_scaled(sdl, ev, &x, &y, TRUE)) + return FALSE; + return freerdp_client_handle_touch( + sdl->common(), FREERDP_TOUCH_DOWN | FREERDP_TOUCH_HAS_PRESSURE, + static_cast(ev->fingerId), sdl_scale_pressure(ev->pressure), x, y); +} + +BOOL sdl_handle_touch_motion(SdlContext* sdl, const SDL_TouchFingerEvent* ev) +{ + WINPR_ASSERT(sdl); + WINPR_ASSERT(ev); + + INT32 x = 0; + INT32 y = 0; + if (!sdl_get_touch_scaled(sdl, ev, &x, &y, TRUE)) + return FALSE; + return freerdp_client_handle_touch( + sdl->common(), FREERDP_TOUCH_MOTION | FREERDP_TOUCH_HAS_PRESSURE, + static_cast(ev->fingerId), sdl_scale_pressure(ev->pressure), x, y); +} + +BOOL sdl_handle_mouse_motion(SdlContext* sdl, const SDL_MouseMotionEvent* ev) +{ + WINPR_ASSERT(sdl); + WINPR_ASSERT(ev); + + sdl->input.mouse_focus(ev->windowID); + const BOOL relative = freerdp_client_use_relative_mouse_events(sdl->common()); + INT32 x = relative ? ev->xrel : ev->x; + INT32 y = relative ? ev->yrel : ev->y; + sdl_scale_coordinates(sdl, ev->windowID, &x, &y, TRUE, TRUE); + return freerdp_client_send_button_event(sdl->common(), relative, PTR_FLAGS_MOVE, x, y); +} + +BOOL sdl_handle_mouse_wheel(SdlContext* sdl, const SDL_MouseWheelEvent* ev) +{ + WINPR_ASSERT(sdl); + WINPR_ASSERT(ev); + + const BOOL flipped = (ev->direction == SDL_MOUSEWHEEL_FLIPPED); + const INT32 x = ev->x * (flipped ? -1 : 1) * 0x78; + const INT32 y = ev->y * (flipped ? -1 : 1) * 0x78; + UINT16 flags = 0; + + if (y != 0) + { + flags |= PTR_FLAGS_WHEEL; + send_mouse_wheel(sdl, flags, y); + } + + if (x != 0) + { + flags |= PTR_FLAGS_HWHEEL; + send_mouse_wheel(sdl, flags, x); + } + return TRUE; +} + +BOOL sdl_handle_mouse_button(SdlContext* sdl, const SDL_MouseButtonEvent* ev) +{ + UINT16 flags = 0; + UINT16 xflags = 0; + + WINPR_ASSERT(sdl); + WINPR_ASSERT(ev); + + if (ev->state == SDL_PRESSED) + { + flags |= PTR_FLAGS_DOWN; + xflags |= PTR_XFLAGS_DOWN; + } + + switch (ev->button) + { + case 1: + flags |= PTR_FLAGS_BUTTON1; + break; + case 2: + flags |= PTR_FLAGS_BUTTON3; + break; + case 3: + flags |= PTR_FLAGS_BUTTON2; + break; + case 4: + xflags |= PTR_XFLAGS_BUTTON1; + break; + case 5: + xflags |= PTR_XFLAGS_BUTTON2; + break; + default: + break; + } + + const BOOL relative = freerdp_client_use_relative_mouse_events(sdl->common()); + INT32 x = relative ? 0 : ev->x; + INT32 y = relative ? 0 : ev->y; + sdl_scale_coordinates(sdl, ev->windowID, &x, &y, TRUE, TRUE); + if ((flags & (~PTR_FLAGS_DOWN)) != 0) + return freerdp_client_send_button_event(sdl->common(), relative, flags, x, y); + else if ((xflags & (~PTR_XFLAGS_DOWN)) != 0) + return freerdp_client_send_extended_button_event(sdl->common(), relative, xflags, x, y); + else + return FALSE; +} diff --git a/client/SDL3/sdl_touch.hpp b/client/SDL3/sdl_touch.hpp new file mode 100644 index 000000000..395fddb48 --- /dev/null +++ b/client/SDL3/sdl_touch.hpp @@ -0,0 +1,36 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * FreeRDP SDL touch/mouse input + * + * Copyright 2022 Armin Novak + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include + +#include +#include "sdl_types.hpp" + +BOOL sdl_scale_coordinates(SdlContext* sdl, Uint32 windowId, INT32* px, INT32* py, + BOOL fromLocalToRDP, BOOL applyOffset); + +BOOL sdl_handle_mouse_motion(SdlContext* sdl, const SDL_MouseMotionEvent* ev); +BOOL sdl_handle_mouse_wheel(SdlContext* sdl, const SDL_MouseWheelEvent* ev); +BOOL sdl_handle_mouse_button(SdlContext* sdl, const SDL_MouseButtonEvent* ev); + +BOOL sdl_handle_touch_down(SdlContext* sdl, const SDL_TouchFingerEvent* ev); +BOOL sdl_handle_touch_up(SdlContext* sdl, const SDL_TouchFingerEvent* ev); +BOOL sdl_handle_touch_motion(SdlContext* sdl, const SDL_TouchFingerEvent* ev); diff --git a/client/SDL3/sdl_types.hpp b/client/SDL3/sdl_types.hpp new file mode 100644 index 000000000..831472c35 --- /dev/null +++ b/client/SDL3/sdl_types.hpp @@ -0,0 +1,46 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * SDL Client + * + * Copyright 2022 Armin Novak + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include + +class SdlContext; + +typedef struct +{ + rdpClientContext common; + SdlContext* sdl; +} sdl_rdp_context; + +static inline SdlContext* get_context(void* ctx) +{ + if (!ctx) + return nullptr; + auto sdl = static_cast(ctx); + return sdl->sdl; +} + +static inline SdlContext* get_context(rdpContext* ctx) +{ + if (!ctx) + return nullptr; + auto sdl = reinterpret_cast(ctx); + return sdl->sdl; +} diff --git a/client/SDL3/sdl_utils.cpp b/client/SDL3/sdl_utils.cpp new file mode 100644 index 000000000..d02837ef3 --- /dev/null +++ b/client/SDL3/sdl_utils.cpp @@ -0,0 +1,341 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * SDL Client + * + * Copyright 2022 Armin Novak + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include "sdl_utils.hpp" + +#include "sdl_freerdp.hpp" + +#include + +#include + +const char* sdl_event_type_str(Uint32 type) +{ +#define STR(x) #x +#define EV_CASE_STR(x) \ + case x: \ + return STR(x) + + switch (type) + { + EV_CASE_STR(SDL_FIRSTEVENT); + EV_CASE_STR(SDL_QUIT); + EV_CASE_STR(SDL_APP_TERMINATING); + EV_CASE_STR(SDL_APP_LOWMEMORY); + EV_CASE_STR(SDL_APP_WILLENTERBACKGROUND); + EV_CASE_STR(SDL_APP_DIDENTERBACKGROUND); + EV_CASE_STR(SDL_APP_WILLENTERFOREGROUND); + EV_CASE_STR(SDL_APP_DIDENTERFOREGROUND); +#if SDL_VERSION_ATLEAST(2, 0, 10) + EV_CASE_STR(SDL_DISPLAYEVENT); +#endif + EV_CASE_STR(SDL_WINDOWEVENT); + EV_CASE_STR(SDL_SYSWMEVENT); + EV_CASE_STR(SDL_KEYDOWN); + EV_CASE_STR(SDL_KEYUP); + EV_CASE_STR(SDL_TEXTEDITING); + EV_CASE_STR(SDL_TEXTINPUT); + EV_CASE_STR(SDL_KEYMAPCHANGED); + EV_CASE_STR(SDL_MOUSEMOTION); + EV_CASE_STR(SDL_MOUSEBUTTONDOWN); + EV_CASE_STR(SDL_MOUSEBUTTONUP); + EV_CASE_STR(SDL_MOUSEWHEEL); + EV_CASE_STR(SDL_JOYAXISMOTION); + EV_CASE_STR(SDL_JOYBALLMOTION); + EV_CASE_STR(SDL_JOYHATMOTION); + EV_CASE_STR(SDL_JOYBUTTONDOWN); + EV_CASE_STR(SDL_JOYBUTTONUP); + EV_CASE_STR(SDL_JOYDEVICEADDED); + EV_CASE_STR(SDL_JOYDEVICEREMOVED); + EV_CASE_STR(SDL_CONTROLLERAXISMOTION); + EV_CASE_STR(SDL_CONTROLLERBUTTONDOWN); + EV_CASE_STR(SDL_CONTROLLERBUTTONUP); + EV_CASE_STR(SDL_CONTROLLERDEVICEADDED); + EV_CASE_STR(SDL_CONTROLLERDEVICEREMOVED); + EV_CASE_STR(SDL_CONTROLLERDEVICEREMAPPED); +#if SDL_VERSION_ATLEAST(2, 0, 14) + EV_CASE_STR(SDL_LOCALECHANGED); + EV_CASE_STR(SDL_CONTROLLERTOUCHPADDOWN); + EV_CASE_STR(SDL_CONTROLLERTOUCHPADMOTION); + EV_CASE_STR(SDL_CONTROLLERTOUCHPADUP); + EV_CASE_STR(SDL_CONTROLLERSENSORUPDATE); +#endif + EV_CASE_STR(SDL_FINGERDOWN); + EV_CASE_STR(SDL_FINGERUP); + EV_CASE_STR(SDL_FINGERMOTION); + EV_CASE_STR(SDL_DOLLARGESTURE); + EV_CASE_STR(SDL_DOLLARRECORD); + EV_CASE_STR(SDL_MULTIGESTURE); + EV_CASE_STR(SDL_CLIPBOARDUPDATE); + EV_CASE_STR(SDL_DROPFILE); + EV_CASE_STR(SDL_DROPTEXT); + EV_CASE_STR(SDL_DROPBEGIN); + EV_CASE_STR(SDL_DROPCOMPLETE); + EV_CASE_STR(SDL_AUDIODEVICEADDED); + EV_CASE_STR(SDL_AUDIODEVICEREMOVED); +#if SDL_VERSION_ATLEAST(2, 0, 9) + EV_CASE_STR(SDL_SENSORUPDATE); +#endif + EV_CASE_STR(SDL_RENDER_TARGETS_RESET); + EV_CASE_STR(SDL_RENDER_DEVICE_RESET); + EV_CASE_STR(SDL_USEREVENT); + + EV_CASE_STR(SDL_USEREVENT_CERT_DIALOG); + EV_CASE_STR(SDL_USEREVENT_CERT_RESULT); + EV_CASE_STR(SDL_USEREVENT_SHOW_DIALOG); + EV_CASE_STR(SDL_USEREVENT_SHOW_RESULT); + EV_CASE_STR(SDL_USEREVENT_AUTH_DIALOG); + EV_CASE_STR(SDL_USEREVENT_AUTH_RESULT); + EV_CASE_STR(SDL_USEREVENT_SCARD_DIALOG); + EV_CASE_STR(SDL_USEREVENT_RETRY_DIALOG); + EV_CASE_STR(SDL_USEREVENT_SCARD_RESULT); + EV_CASE_STR(SDL_USEREVENT_UPDATE); + EV_CASE_STR(SDL_USEREVENT_CREATE_WINDOWS); + EV_CASE_STR(SDL_USEREVENT_WINDOW_RESIZEABLE); + EV_CASE_STR(SDL_USEREVENT_WINDOW_FULLSCREEN); + EV_CASE_STR(SDL_USEREVENT_POINTER_NULL); + EV_CASE_STR(SDL_USEREVENT_POINTER_DEFAULT); + EV_CASE_STR(SDL_USEREVENT_POINTER_POSITION); + EV_CASE_STR(SDL_USEREVENT_POINTER_SET); + EV_CASE_STR(SDL_USEREVENT_QUIT); + + EV_CASE_STR(SDL_LASTEVENT); + default: + return "SDL_UNKNOWNEVENT"; + } +#undef EV_CASE_STR +#undef STR +} + +const char* sdl_error_string(Uint32 res) +{ + if (res == 0) + return nullptr; + + return SDL_GetError(); +} + +BOOL sdl_log_error_ex(Uint32 res, wLog* log, const char* what, const char* file, size_t line, + const char* fkt) +{ + const char* msg = sdl_error_string(res); + + WINPR_UNUSED(file); + + if (!msg) + return FALSE; + + WLog_Print(log, WLOG_ERROR, "[%s:%" PRIuz "][%s]: %s", fkt, line, what, msg); + return TRUE; +} + +BOOL sdl_push_user_event(Uint32 type, ...) +{ + SDL_Event ev = {}; + SDL_UserEvent* event = &ev.user; + + va_list ap; + va_start(ap, type); + event->type = type; + switch (type) + { + case SDL_USEREVENT_AUTH_RESULT: + { + auto arg = reinterpret_cast(ev.padding); + arg->user = va_arg(ap, char*); + arg->domain = va_arg(ap, char*); + arg->password = va_arg(ap, char*); + arg->result = va_arg(ap, Sint32); + } + break; + case SDL_USEREVENT_AUTH_DIALOG: + { + auto arg = reinterpret_cast(ev.padding); + + arg->title = va_arg(ap, char*); + arg->user = va_arg(ap, char*); + arg->domain = va_arg(ap, char*); + arg->password = va_arg(ap, char*); + arg->result = va_arg(ap, Sint32); + } + break; + case SDL_USEREVENT_SCARD_DIALOG: + { + event->data1 = va_arg(ap, char*); + event->data2 = va_arg(ap, char**); + event->code = va_arg(ap, Sint32); + } + break; + case SDL_USEREVENT_RETRY_DIALOG: + break; + case SDL_USEREVENT_SCARD_RESULT: + case SDL_USEREVENT_SHOW_RESULT: + case SDL_USEREVENT_CERT_RESULT: + event->code = va_arg(ap, Sint32); + break; + + case SDL_USEREVENT_SHOW_DIALOG: + event->data1 = va_arg(ap, char*); + event->data2 = va_arg(ap, char*); + event->code = va_arg(ap, Sint32); + break; + case SDL_USEREVENT_CERT_DIALOG: + event->data1 = va_arg(ap, char*); + event->data2 = va_arg(ap, char*); + break; + case SDL_USEREVENT_UPDATE: + event->data1 = va_arg(ap, void*); + break; + case SDL_USEREVENT_POINTER_POSITION: + event->data1 = reinterpret_cast(static_cast(va_arg(ap, UINT32))); + event->data2 = reinterpret_cast(static_cast(va_arg(ap, UINT32))); + break; + case SDL_USEREVENT_POINTER_SET: + event->data1 = va_arg(ap, void*); + event->data2 = va_arg(ap, void*); + break; + case SDL_USEREVENT_CREATE_WINDOWS: + event->data1 = reinterpret_cast(va_arg(ap, void*)); + break; + case SDL_USEREVENT_WINDOW_FULLSCREEN: + case SDL_USEREVENT_WINDOW_RESIZEABLE: + event->data1 = va_arg(ap, void*); + event->code = va_arg(ap, int); + break; + case SDL_USEREVENT_QUIT: + case SDL_USEREVENT_POINTER_NULL: + case SDL_USEREVENT_POINTER_DEFAULT: + break; + default: + va_end(ap); + return FALSE; + } + va_end(ap); + return SDL_PushEvent(&ev) == 1; +} + +CriticalSection::CriticalSection() +{ + InitializeCriticalSection(&_section); +} + +CriticalSection::~CriticalSection() +{ + DeleteCriticalSection(&_section); +} + +void CriticalSection::lock() +{ + EnterCriticalSection(&_section); +} + +void CriticalSection::unlock() +{ + LeaveCriticalSection(&_section); +} + +WinPREvent::WinPREvent(bool initial) + : _handle(CreateEventA(nullptr, TRUE, initial ? TRUE : FALSE, nullptr)) +{ +} + +WinPREvent::~WinPREvent() +{ + CloseHandle(_handle); +} + +void WinPREvent::set() +{ + SetEvent(_handle); +} + +void WinPREvent::clear() +{ + ResetEvent(_handle); +} + +bool WinPREvent::isSet() const +{ + return WaitForSingleObject(_handle, 0) == WAIT_OBJECT_0; +} + +HANDLE WinPREvent::handle() const +{ + return _handle; +} + +bool sdl_push_quit() +{ + SDL_Event ev = { 0 }; + ev.type = SDL_QUIT; + SDL_PushEvent(&ev); + return true; +} + +std::string sdl_window_event_str(Uint8 ev) +{ + switch (ev) + { + case SDL_WINDOWEVENT_NONE: + return "SDL_WINDOWEVENT_NONE"; + case SDL_WINDOWEVENT_SHOWN: + return "SDL_WINDOWEVENT_SHOWN"; + case SDL_WINDOWEVENT_HIDDEN: + return "SDL_WINDOWEVENT_HIDDEN"; + case SDL_WINDOWEVENT_EXPOSED: + return "SDL_WINDOWEVENT_EXPOSED"; + case SDL_WINDOWEVENT_MOVED: + return "SDL_WINDOWEVENT_MOVED"; + case SDL_WINDOWEVENT_RESIZED: + return "SDL_WINDOWEVENT_RESIZED"; + case SDL_WINDOWEVENT_SIZE_CHANGED: + return "SDL_WINDOWEVENT_SIZE_CHANGED"; + case SDL_WINDOWEVENT_MINIMIZED: + return "SDL_WINDOWEVENT_MINIMIZED"; + case SDL_WINDOWEVENT_MAXIMIZED: + return "SDL_WINDOWEVENT_MAXIMIZED"; + case SDL_WINDOWEVENT_RESTORED: + return "SDL_WINDOWEVENT_RESTORED"; + case SDL_WINDOWEVENT_ENTER: + return "SDL_WINDOWEVENT_ENTER"; + case SDL_WINDOWEVENT_LEAVE: + return "SDL_WINDOWEVENT_LEAVE"; + case SDL_WINDOWEVENT_FOCUS_GAINED: + return "SDL_WINDOWEVENT_FOCUS_GAINED"; + case SDL_WINDOWEVENT_FOCUS_LOST: + return "SDL_WINDOWEVENT_FOCUS_LOST"; + case SDL_WINDOWEVENT_CLOSE: + return "SDL_WINDOWEVENT_CLOSE"; +#if SDL_VERSION_ATLEAST(2, 0, 5) + case SDL_WINDOWEVENT_TAKE_FOCUS: + return "SDL_WINDOWEVENT_TAKE_FOCUS"; + case SDL_WINDOWEVENT_HIT_TEST: + return "SDL_WINDOWEVENT_HIT_TEST"; +#endif +#if SDL_VERSION_ATLEAST(2, 0, 18) + case SDL_WINDOWEVENT_ICCPROF_CHANGED: + return "SDL_WINDOWEVENT_ICCPROF_CHANGED"; + case SDL_WINDOWEVENT_DISPLAY_CHANGED: + return "SDL_WINDOWEVENT_DISPLAY_CHANGED"; +#endif + default: + return "SDL_WINDOWEVENT_UNKNOWN"; + } +} diff --git a/client/SDL3/sdl_utils.hpp b/client/SDL3/sdl_utils.hpp new file mode 100644 index 000000000..8ff40af19 --- /dev/null +++ b/client/SDL3/sdl_utils.hpp @@ -0,0 +1,102 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * SDL Client + * + * Copyright 2022 Armin Novak + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include +#include + +#include +#include +#include + +class CriticalSection +{ + public: + CriticalSection(); + ~CriticalSection(); + + void lock(); + void unlock(); + + private: + CRITICAL_SECTION _section; +}; + +class WinPREvent +{ + public: + explicit WinPREvent(bool initial = false); + ~WinPREvent(); + + void set(); + void clear(); + [[nodiscard]] bool isSet() const; + + [[nodiscard]] HANDLE handle() const; + + private: + HANDLE _handle; +}; + +enum +{ + SDL_USEREVENT_UPDATE = SDL_USEREVENT + 1, + SDL_USEREVENT_CREATE_WINDOWS, + SDL_USEREVENT_WINDOW_RESIZEABLE, + SDL_USEREVENT_WINDOW_FULLSCREEN, + SDL_USEREVENT_POINTER_NULL, + SDL_USEREVENT_POINTER_DEFAULT, + SDL_USEREVENT_POINTER_POSITION, + SDL_USEREVENT_POINTER_SET, + SDL_USEREVENT_QUIT, + SDL_USEREVENT_CERT_DIALOG, + SDL_USEREVENT_SHOW_DIALOG, + SDL_USEREVENT_AUTH_DIALOG, + SDL_USEREVENT_SCARD_DIALOG, + SDL_USEREVENT_RETRY_DIALOG, + + SDL_USEREVENT_CERT_RESULT, + SDL_USEREVENT_SHOW_RESULT, + SDL_USEREVENT_AUTH_RESULT, + SDL_USEREVENT_SCARD_RESULT +}; + +typedef struct +{ + Uint32 type; + Uint32 timestamp; + char* title; + char* user; + char* domain; + char* password; + Sint32 result; +} SDL_UserAuthArg; + +BOOL sdl_push_user_event(Uint32 type, ...); + +bool sdl_push_quit(); + +std::string sdl_window_event_str(Uint8 ev); +const char* sdl_event_type_str(Uint32 type); +const char* sdl_error_string(Uint32 res); + +#define sdl_log_error(res, log, what) sdl_log_error_ex(res, log, what, __FILE__, __LINE__, __func__) +BOOL sdl_log_error_ex(Uint32 res, wLog* log, const char* what, const char* file, size_t line, + const char* fkt); diff --git a/client/SDL3/sdl_window.cpp b/client/SDL3/sdl_window.cpp new file mode 100644 index 000000000..1706d33a7 --- /dev/null +++ b/client/SDL3/sdl_window.cpp @@ -0,0 +1,203 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * SDL Client + * + * Copyright 2023 Armin Novak + * Copyright 2023 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "sdl_window.hpp" +#include "sdl_utils.hpp" + +SdlWindow::SdlWindow(const std::string& title, Sint32 startupX, Sint32 startupY, Sint32 width, + Sint32 height, Uint32 flags) + : _window(SDL_CreateWindow(title.c_str(), startupX, startupY, width, height, flags)), + _offset_x(0), _offset_y(0) +{ +} + +SdlWindow::SdlWindow(SdlWindow&& other) + : _window(other._window), _offset_x(other._offset_x), _offset_y(other._offset_y) +{ + other._window = nullptr; +} + +SdlWindow::~SdlWindow() +{ + SDL_DestroyWindow(_window); +} + +Uint32 SdlWindow::id() const +{ + if (!_window) + return 0; + return SDL_GetWindowID(_window); +} + +int SdlWindow::displayIndex() const +{ + if (!_window) + return 0; + return SDL_GetWindowDisplayIndex(_window); +} + +SDL_Rect SdlWindow::rect() const +{ + SDL_Rect rect = {}; + if (_window) + { + SDL_GetWindowPosition(_window, &rect.x, &rect.y); + SDL_GetWindowSize(_window, &rect.w, &rect.h); + } + return rect; +} + +SDL_Window* SdlWindow::window() const +{ + return _window; +} + +Sint32 SdlWindow::offsetX() const +{ + return _offset_x; +} + +void SdlWindow::setOffsetX(Sint32 x) +{ + _offset_x = x; +} + +void SdlWindow::setOffsetY(Sint32 y) +{ + _offset_y = y; +} + +Sint32 SdlWindow::offsetY() const +{ + return _offset_y; +} + +bool SdlWindow::grabKeyboard(bool enable) +{ + if (!_window) + return false; +#if SDL_VERSION_ATLEAST(2, 0, 16) + SDL_SetWindowKeyboardGrab(_window, enable ? SDL_TRUE : SDL_FALSE); + return true; +#else + SDL_LogError(SDL_LOG_CATEGORY_INPUT, "Keyboard grabbing not supported by SDL2 < 2.0.16"); + return false; +#endif +} + +bool SdlWindow::grabMouse(bool enable) +{ + if (!_window) + return false; +#if SDL_VERSION_ATLEAST(2, 0, 16) + SDL_SetWindowMouseGrab(_window, enable ? SDL_TRUE : SDL_FALSE); +#else + SDL_SetWindowGrab(_window, enable ? SDL_TRUE : SDL_FALSE); +#endif + return true; +} + +void SdlWindow::setBordered(bool bordered) +{ + if (_window) + SDL_SetWindowBordered(_window, bordered ? SDL_TRUE : SDL_FALSE); +} + +void SdlWindow::raise() +{ + SDL_RaiseWindow(_window); +} + +void SdlWindow::resizeable(bool use) +{ + SDL_SetWindowResizable(_window, use ? SDL_TRUE : SDL_FALSE); +} + +void SdlWindow::fullscreen(bool enter) +{ + auto curFlags = SDL_GetWindowFlags(_window); + + if (enter) + { + if (!(curFlags & SDL_WINDOW_BORDERLESS)) + { + auto idx = SDL_GetWindowDisplayIndex(_window); + SDL_DisplayMode mode = {}; + SDL_GetCurrentDisplayMode(idx, &mode); + + SDL_RestoreWindow(_window); // Maximize so we can see the caption and + // bits + SDL_SetWindowBordered(_window, SDL_FALSE); + SDL_SetWindowPosition(_window, 0, 0); +#if SDL_VERSION_ATLEAST(2, 0, 16) + SDL_SetWindowAlwaysOnTop(_window, SDL_TRUE); +#endif + SDL_RaiseWindow(_window); + SDL_SetWindowSize(_window, mode.w, mode.h); + } + } + else + { + if (curFlags & SDL_WINDOW_BORDERLESS) + { + + SDL_SetWindowBordered(_window, SDL_TRUE); +#if SDL_VERSION_ATLEAST(2, 0, 16) + SDL_SetWindowAlwaysOnTop(_window, SDL_FALSE); +#endif + SDL_RaiseWindow(_window); + SDL_MinimizeWindow(_window); // Maximize so we can see the caption and bits + SDL_MaximizeWindow(_window); // Maximize so we can see the caption and bits + } + } +} + +bool SdlWindow::fill(Uint8 r, Uint8 g, Uint8 b, Uint8 a) +{ + auto surface = SDL_GetWindowSurface(_window); + if (!surface) + return false; + SDL_Rect rect = { 0, 0, surface->w, surface->h }; + auto color = SDL_MapRGBA(surface->format, r, g, b, a); + + SDL_FillRect(surface, &rect, color); + return true; +} + +bool SdlWindow::blit(SDL_Surface* surface, const SDL_Rect& srcRect, SDL_Rect& dstRect) +{ + auto screen = SDL_GetWindowSurface(_window); + if (!screen || !surface) + return false; + if (!SDL_SetClipRect(surface, &srcRect)) + return true; + if (!SDL_SetClipRect(screen, &dstRect)) + return true; + auto rc = SDL_BlitScaled(surface, &srcRect, screen, &dstRect); + if (rc != 0) + { + SDL_LogError(SDL_LOG_CATEGORY_RENDER, "SDL_BlitScaled: %s [%d]", sdl_error_string(rc), rc); + } + return rc == 0; +} + +void SdlWindow::updateSurface() +{ + SDL_UpdateWindowSurface(_window); +} diff --git a/client/SDL3/sdl_window.hpp b/client/SDL3/sdl_window.hpp new file mode 100644 index 000000000..4f84e1ba4 --- /dev/null +++ b/client/SDL3/sdl_window.hpp @@ -0,0 +1,62 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * SDL Client + * + * Copyright 2023 Armin Novak + * Copyright 2023 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#pragma once + +#include +#include + +class SdlWindow +{ + public: + SdlWindow(const std::string& title, Sint32 startupX, Sint32 startupY, Sint32 width, + Sint32 height, Uint32 flags); + SdlWindow(SdlWindow&& other); + ~SdlWindow(); + + [[nodiscard]] Uint32 id() const; + [[nodiscard]] int displayIndex() const; + [[nodiscard]] SDL_Rect rect() const; + [[nodiscard]] SDL_Window* window() const; + + [[nodiscard]] Sint32 offsetX() const; + void setOffsetX(Sint32 x); + + void setOffsetY(Sint32 y); + [[nodiscard]] Sint32 offsetY() const; + + bool grabKeyboard(bool enable); + bool grabMouse(bool enable); + void setBordered(bool bordered); + void raise(); + void resizeable(bool use); + void fullscreen(bool use); + + bool fill(Uint8 r = 0x00, Uint8 g = 0x00, Uint8 b = 0x00, Uint8 a = 0xff); + bool blit(SDL_Surface* surface, const SDL_Rect& src, SDL_Rect& dst); + void updateSurface(); + + private: + SDL_Window* _window = nullptr; + Sint32 _offset_x = 0; + Sint32 _offset_y = 0; + + private: + SdlWindow(const SdlWindow& other) = delete; +}; diff --git a/client/SDL3/test/CMakeLists.txt b/client/SDL3/test/CMakeLists.txt new file mode 100644 index 000000000..34836b196 --- /dev/null +++ b/client/SDL3/test/CMakeLists.txt @@ -0,0 +1,36 @@ +set(MODULE_NAME "TestSDL3") +set(MODULE_PREFIX "TEST_SDL") + +set(${MODULE_PREFIX}_DRIVER ${MODULE_NAME}.cpp) + +set(${MODULE_PREFIX}_TESTS TestSDLPrefs.cpp) + +create_test_sourcelist(${MODULE_PREFIX}_SRCS + ${${MODULE_PREFIX}_DRIVER} + ${${MODULE_PREFIX}_TESTS}) + +add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) + +set(${MODULE_PREFIX}_LIBS freerdp winpr sdl3-prefs) + +target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) + +set_target_properties(${MODULE_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${TESTING_OUTPUT_DIRECTORY}") + +set(TEST_SRC_AREA "${CMAKE_CURRENT_SOURCE_DIR}") +set(TEST_BIN_AREA "${CMAKE_CURRENT_BINARY_DIR}") + +if (WIN32) + string(REPLACE "\\" "\\\\" TEST_SRC_AREA "${TEST_SRC_AREA}") + string(REPLACE "\\" "\\\\" TEST_BIN_AREA "${TEST_BIN_AREA}") +endif() + +add_compile_definitions(TEST_SRC_AREA="${TEST_SRC_AREA}") +add_compile_definitions(TEST_BIN_AREA="${TEST_BIN_AREA}") + +foreach(test ${${MODULE_PREFIX}_TESTS}) + get_filename_component(TestName ${test} NAME_WE) + add_test(${TestName} ${TESTING_OUTPUT_DIRECTORY}/${MODULE_NAME} ${TestName}) +endforeach() + +set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "FreeRDP/Client/Test") diff --git a/client/SDL3/test/TestSDLPrefs.cpp b/client/SDL3/test/TestSDLPrefs.cpp new file mode 100644 index 000000000..db4a75302 --- /dev/null +++ b/client/SDL3/test/TestSDLPrefs.cpp @@ -0,0 +1,121 @@ +#include "../sdl_prefs.hpp" + +#include +#include + +#include +#include + +#if __has_include() +#include +namespace fs = std::filesystem; +#elif __has_include() +#include +namespace fs = std::experimental::filesystem; +#else +#error Could not find system header "" or "" +#endif + +static std::shared_ptr instance() +{ +#if !defined(TEST_SRC_AREA) +#error "Please define TEST_SRC_AREA to the source directory of this test case" +#endif + fs::path src(TEST_SRC_AREA); + src /= "sdl-freerdp.json"; + if (!fs::exists(src)) + { + std::cerr << "[ERROR] test configuration file '" << src << "' does not exist" << std::endl; + return nullptr; + } + + return SdlPref::instance(src.string()); +} + +int TestSDLPrefs(int argc, char* argv[]) +{ + WINPR_UNUSED(argc); + WINPR_UNUSED(argv); + +#if defined(WITH_WINPR_JSON) + printf("implementation: json\n"); +#else + printf("implementation: fallback\n"); +#endif + +#if defined(WITH_WINPR_JSON) + printf("config: %s\n", instance()->get_pref_file().c_str()); +#endif + + auto string_value = instance()->get_string("string_key", "cba"); +#if defined(WITH_WINPR_JSON) + if (string_value != "abc") + return -1; +#else + if (string_value != "cba") + return -1; +#endif + + auto string_value_nonexistent = instance()->get_string("string_key_nonexistent", "cba"); + if (string_value_nonexistent != "cba") + return -1; + + auto int_value = instance()->get_int("int_key", 321); +#if defined(WITH_WINPR_JSON) + if (int_value != 123) + return -1; +#else + if (int_value != 321) + return -1; +#endif + + auto int_value_nonexistent = instance()->get_int("int_key_nonexistent", 321); + if (int_value_nonexistent != 321) + return -1; + + auto bool_value = instance()->get_bool("bool_key", false); +#if defined(WITH_WINPR_JSON) + if (!bool_value) + return -1; +#else + if (bool_value) + return -1; +#endif + + auto bool_value_nonexistent = instance()->get_bool("bool_key_nonexistent", false); + if (bool_value_nonexistent) + return -1; + + auto array_value = instance()->get_array("array_key", { "c", "b", "a" }); + if (array_value.size() != 3) + return -1; +#if defined(WITH_WINPR_JSON) + if (array_value[0] != "a") + return -1; + if (array_value[1] != "b") + return -1; + if (array_value[2] != "c") + return -1; +#else + if (array_value[0] != "c") + return -1; + if (array_value[1] != "b") + return -1; + if (array_value[2] != "a") + return -1; +#endif + + auto array_value_nonexistent = + instance()->get_array("array_key_nonexistent", { "c", "b", "a" }); + if (array_value_nonexistent.size() != 3) + return -1; + + if (array_value_nonexistent[0] != "c") + return -1; + if (array_value_nonexistent[1] != "b") + return -1; + if (array_value_nonexistent[2] != "a") + return -1; + + return 0; +} diff --git a/client/SDL3/test/sdl-freerdp.json b/client/SDL3/test/sdl-freerdp.json new file mode 100644 index 000000000..17facb32e --- /dev/null +++ b/client/SDL3/test/sdl-freerdp.json @@ -0,0 +1,10 @@ +{ + "string_key": "abc", + "int_key": 123, + "bool_key": true, + "array_key": [ + "a", + "b", + "c" + ] +} \ No newline at end of file diff --git a/resources/font/OFL.txt b/resources/font/OFL.txt new file mode 100644 index 000000000..9b448d401 --- /dev/null +++ b/resources/font/OFL.txt @@ -0,0 +1,93 @@ +Copyright 2020 The Open Sans Project Authors (https://github.com/googlefonts/opensans) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/resources/font/OpenSans-Italic-VariableFont_wdth,wght.ttf b/resources/font/OpenSans-Italic-VariableFont_wdth,wght.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5bda9cccfb60fd5cd58eaba63404eda444292034 GIT binary patch literal 580356 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≷hD*(U!_CQjqAt6f=S`{S(h>IivR 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≦2SHtWbsHhEb?j`H7OP^Xg5*@Blmww`R3k{ACG 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

Cw50Gs}zwhk&6^rgCEr@EW+11!;dGnx3;#C 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 literal 0 HcmV?d00001 diff --git a/resources/font/OpenSans-VariableFont_wdth,wght.ttf b/resources/font/OpenSans-VariableFont_wdth,wght.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e4142bfd726d0e70cd7a604fe0994f75e72baa5f GIT binary patch literal 529700 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

rvz~j83Vy4ebr~YHi^!v856FN`8>jpW0 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 bKFvkwk=sBL{PR1+0 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

jtvyPs5Hr53!@4LhR^c*wG`fqtI;6 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

    <(o4Vknv1~ne6jQ3<)R}eP86NJe7U^7 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%0ALg1v3Oc*2_AXTZe%VguA+F}_ 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 G^?v|E^(CMH literal 0 HcmV?d00001 diff --git a/resources/font/README.txt b/resources/font/README.txt new file mode 100644 index 000000000..2548322ce --- /dev/null +++ b/resources/font/README.txt @@ -0,0 +1,100 @@ +Open Sans Variable Font +======================= + +This download contains Open Sans as both variable fonts and static fonts. + +Open Sans is a variable font with these axes: + wdth + wght + +This means all the styles are contained in these files: + OpenSans-VariableFont_wdth,wght.ttf + OpenSans-Italic-VariableFont_wdth,wght.ttf + +If your app fully supports variable fonts, you can now pick intermediate styles +that aren’t available as static fonts. Not all apps support variable fonts, and +in those cases you can use the static font files for Open Sans: + static/OpenSans_Condensed-Light.ttf + static/OpenSans_Condensed-Regular.ttf + static/OpenSans_Condensed-Medium.ttf + static/OpenSans_Condensed-SemiBold.ttf + static/OpenSans_Condensed-Bold.ttf + static/OpenSans_Condensed-ExtraBold.ttf + static/OpenSans_SemiCondensed-Light.ttf + static/OpenSans_SemiCondensed-Regular.ttf + static/OpenSans_SemiCondensed-Medium.ttf + static/OpenSans_SemiCondensed-SemiBold.ttf + static/OpenSans_SemiCondensed-Bold.ttf + static/OpenSans_SemiCondensed-ExtraBold.ttf + static/OpenSans-Light.ttf + static/OpenSans-Regular.ttf + static/OpenSans-Medium.ttf + static/OpenSans-SemiBold.ttf + static/OpenSans-Bold.ttf + static/OpenSans-ExtraBold.ttf + static/OpenSans_Condensed-LightItalic.ttf + static/OpenSans_Condensed-Italic.ttf + static/OpenSans_Condensed-MediumItalic.ttf + static/OpenSans_Condensed-SemiBoldItalic.ttf + static/OpenSans_Condensed-BoldItalic.ttf + static/OpenSans_Condensed-ExtraBoldItalic.ttf + static/OpenSans_SemiCondensed-LightItalic.ttf + static/OpenSans_SemiCondensed-Italic.ttf + static/OpenSans_SemiCondensed-MediumItalic.ttf + static/OpenSans_SemiCondensed-SemiBoldItalic.ttf + static/OpenSans_SemiCondensed-BoldItalic.ttf + static/OpenSans_SemiCondensed-ExtraBoldItalic.ttf + static/OpenSans-LightItalic.ttf + static/OpenSans-Italic.ttf + static/OpenSans-MediumItalic.ttf + static/OpenSans-SemiBoldItalic.ttf + static/OpenSans-BoldItalic.ttf + static/OpenSans-ExtraBoldItalic.ttf + +Get started +----------- + +1. Install the font files you want to use + +2. Use your app's font picker to view the font family and all the +available styles + +Learn more about variable fonts +------------------------------- + + https://developers.google.com/web/fundamentals/design-and-ux/typography/variable-fonts + https://variablefonts.typenetwork.com + https://medium.com/variable-fonts + +In desktop apps + + https://theblog.adobe.com/can-variable-fonts-illustrator-cc + https://helpx.adobe.com/nz/photoshop/using/fonts.html#variable_fonts + +Online + + https://developers.google.com/fonts/docs/getting_started + https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide + https://developer.microsoft.com/en-us/microsoft-edge/testdrive/demos/variable-fonts + +Installing fonts + + MacOS: https://support.apple.com/en-us/HT201749 + Linux: https://www.google.com/search?q=how+to+install+a+font+on+gnu%2Blinux + Windows: https://support.microsoft.com/en-us/help/314960/how-to-install-or-remove-a-font-in-windows + +Android Apps + + https://developers.google.com/fonts/docs/android + https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts + +License +------- +Please read the full license text (OFL.txt) to understand the permissions, +restrictions and requirements for usage, redistribution, and modification. + +You can use them in your products & projects – print or digital, +commercial or otherwise. + +This isn't legal advice, please consider consulting a lawyer and see the full +license for all details.

rEs}>0Ge{~ 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