From 47b52fd6dfcf54ff83509ad53c5dffe5872dd99d Mon Sep 17 00:00:00 2001 From: Almamu Date: Sun, 6 Apr 2025 02:50:47 +0200 Subject: [PATCH] chore: re-organized web wallpaper support to use custom scheme and better handle multiprocessing --- CMakeLists.txt | 16 + CMakeModules/cef_macros.cmake | 387 ------------ CMakeModules/cef_variables.cmake | 582 ------------------ main.cpp | 29 +- .../Application/CApplicationContext.cpp | 26 +- .../Application/CApplicationContext.h | 8 + .../Application/CWallpaperApplication.cpp | 25 +- .../Application/CWallpaperApplication.h | 8 +- src/WallpaperEngine/Assets/CDirectory.cpp | 2 + src/WallpaperEngine/Core/CObject.cpp | 6 +- src/WallpaperEngine/Core/CObject.h | 12 +- src/WallpaperEngine/Core/CProject.cpp | 20 +- src/WallpaperEngine/Core/CProject.h | 12 +- src/WallpaperEngine/Core/CWallpaper.h | 1 + src/WallpaperEngine/Core/Objects/CImage.cpp | 4 +- src/WallpaperEngine/Core/Objects/CImage.h | 6 +- .../Core/Objects/CParticle.cpp | 4 +- src/WallpaperEngine/Core/Objects/CParticle.h | 4 +- src/WallpaperEngine/Core/Objects/CSound.cpp | 4 +- src/WallpaperEngine/Core/Objects/CSound.h | 8 +- .../Core/Wallpapers/CScene.cpp | 1 + src/WallpaperEngine/Core/Wallpapers/CScene.h | 6 +- .../Core/Wallpapers/CVideo.cpp | 1 + src/WallpaperEngine/Core/Wallpapers/CVideo.h | 2 +- src/WallpaperEngine/Core/Wallpapers/CWeb.cpp | 1 + src/WallpaperEngine/Core/Wallpapers/CWeb.h | 4 +- src/WallpaperEngine/Render/CCamera.cpp | 4 +- src/WallpaperEngine/Render/CCamera.h | 10 +- src/WallpaperEngine/Render/CObject.cpp | 5 +- src/WallpaperEngine/Render/CObject.h | 10 +- src/WallpaperEngine/Render/CWallpaper.cpp | 14 +- src/WallpaperEngine/Render/CWallpaper.h | 9 +- src/WallpaperEngine/Render/Objects/CImage.cpp | 2 +- src/WallpaperEngine/Render/Objects/CImage.h | 2 +- src/WallpaperEngine/Render/Objects/CSound.cpp | 2 +- src/WallpaperEngine/Render/Objects/CSound.h | 6 +- .../Render/Wallpapers/CScene.cpp | 7 +- .../Render/Wallpapers/CScene.h | 8 +- .../Render/Wallpapers/CVideo.cpp | 7 +- .../Render/Wallpapers/CVideo.h | 8 +- .../Render/Wallpapers/CWeb.cpp | 53 +- src/WallpaperEngine/Render/Wallpapers/CWeb.h | 78 +-- .../WebBrowser/CEF/CBrowserApp.cpp | 64 ++ .../WebBrowser/CEF/CBrowserApp.h | 30 + .../WebBrowser/CEF/CBrowserClient.cpp | 12 + .../WebBrowser/CEF/CBrowserClient.h | 21 + .../WebBrowser/CEF/CRenderHandler.cpp | 31 + .../WebBrowser/CEF/CRenderHandler.h | 42 ++ .../WebBrowser/CEF/CSubprocessApp.cpp | 30 + .../WebBrowser/CEF/CSubprocessApp.h | 28 + .../WebBrowser/CEF/CWPSchemeHandler.cpp | 95 +++ .../WebBrowser/CEF/CWPSchemeHandler.h | 48 ++ .../CEF/CWPSchemeHandlerFactory.cpp | 19 + .../WebBrowser/CEF/CWPSchemeHandlerFactory.h | 26 + .../WebBrowser/CWebBrowserContext.cpp | 97 +-- .../WebBrowser/CWebBrowserContext.h | 23 +- 56 files changed, 771 insertions(+), 1199 deletions(-) delete mode 100644 CMakeModules/cef_macros.cmake delete mode 100644 CMakeModules/cef_variables.cmake create mode 100644 src/WallpaperEngine/WebBrowser/CEF/CBrowserApp.cpp create mode 100644 src/WallpaperEngine/WebBrowser/CEF/CBrowserApp.h create mode 100644 src/WallpaperEngine/WebBrowser/CEF/CBrowserClient.cpp create mode 100644 src/WallpaperEngine/WebBrowser/CEF/CBrowserClient.h create mode 100644 src/WallpaperEngine/WebBrowser/CEF/CRenderHandler.cpp create mode 100644 src/WallpaperEngine/WebBrowser/CEF/CRenderHandler.h create mode 100644 src/WallpaperEngine/WebBrowser/CEF/CSubprocessApp.cpp create mode 100644 src/WallpaperEngine/WebBrowser/CEF/CSubprocessApp.h create mode 100644 src/WallpaperEngine/WebBrowser/CEF/CWPSchemeHandler.cpp create mode 100644 src/WallpaperEngine/WebBrowser/CEF/CWPSchemeHandler.h create mode 100644 src/WallpaperEngine/WebBrowser/CEF/CWPSchemeHandlerFactory.cpp create mode 100644 src/WallpaperEngine/WebBrowser/CEF/CWPSchemeHandlerFactory.h diff --git a/CMakeLists.txt b/CMakeLists.txt index fe237fd..ecd1501 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -113,6 +113,7 @@ add_subdirectory(src/External/SPIRV-Cross-WallpaperEngine spirv-cross) include_directories( src/External/glslang-WallpaperEngine src/External/SPIRV-Cross-WallpaperEngine + src/External/MimeTypes ${MPV_INCLUDE_DIR} ${GLEW_INCLUDE_DIR} ${LZ4_INCLUDE_DIR} @@ -214,6 +215,9 @@ add_executable( src/External/Android/fft.cpp src/External/Android/fft.h + src/External/MimeTypes/MimeTypes.cpp + src/External/MimeTypes/MimeTypes.h + src/Steam/FileSystem/FileSystem.h src/Steam/FileSystem/FileSystem.cpp @@ -345,6 +349,18 @@ add_executable( src/WallpaperEngine/Render/Objects/Effects/CMaterial.h src/WallpaperEngine/Render/Objects/Effects/CMaterial.cpp + src/WallpaperEngine/WebBrowser/CEF/CRenderHandler.cpp + src/WallpaperEngine/WebBrowser/CEF/CRenderHandler.h + src/WallpaperEngine/WebBrowser/CEF/CBrowserClient.cpp + src/WallpaperEngine/WebBrowser/CEF/CBrowserClient.h + src/WallpaperEngine/WebBrowser/CEF/CBrowserApp.cpp + src/WallpaperEngine/WebBrowser/CEF/CBrowserApp.h + src/WallpaperEngine/WebBrowser/CEF/CSubprocessApp.cpp + src/WallpaperEngine/WebBrowser/CEF/CSubprocessApp.h + src/WallpaperEngine/WebBrowser/CEF/CWPSchemeHandlerFactory.cpp + src/WallpaperEngine/WebBrowser/CEF/CWPSchemeHandlerFactory.h + src/WallpaperEngine/WebBrowser/CEF/CWPSchemeHandler.cpp + src/WallpaperEngine/WebBrowser/CEF/CWPSchemeHandler.h src/WallpaperEngine/WebBrowser/CWebBrowserContext.cpp src/WallpaperEngine/WebBrowser/CWebBrowserContext.h diff --git a/CMakeModules/cef_macros.cmake b/CMakeModules/cef_macros.cmake deleted file mode 100644 index f357d06..0000000 --- a/CMakeModules/cef_macros.cmake +++ /dev/null @@ -1,387 +0,0 @@ -# Copyright (c) 2016 The Chromium Embedded Framework Authors. All rights -# reserved. Use of this source code is governed by a BSD-style license that -# can be found in the LICENSE file. - -# Must be loaded via FindCEF.cmake. -if(NOT DEFINED _CEF_ROOT_EXPLICIT) - message(FATAL_ERROR "Use find_package(CEF) to load this file.") -endif() - - -# -# Shared macros. -# - -# Print the current CEF configuration. -macro(PRINT_CEF_CONFIG) - message(STATUS "*** CEF CONFIGURATION SETTINGS ***") - message(STATUS "Generator: ${CMAKE_GENERATOR}") - message(STATUS "Platform: ${CMAKE_SYSTEM_NAME}") - message(STATUS "Project architecture: ${PROJECT_ARCH}") - - if(GEN_NINJA OR GEN_MAKEFILES) - message(STATUS "Build type: ${CMAKE_BUILD_TYPE}") - endif() - - message(STATUS "Binary distribution root: ${_CEF_ROOT}") - - if(OS_MAC) - message(STATUS "Base SDK: ${CMAKE_OSX_SYSROOT}") - message(STATUS "Target SDK: ${CEF_TARGET_SDK}") - endif() - - if(OS_WINDOWS) - message(STATUS "Visual Studio ATL support: ${USE_ATL}") - endif() - - message(STATUS "CEF sandbox: ${USE_SANDBOX}") - - set(_libraries ${CEF_STANDARD_LIBS}) - if(OS_WINDOWS AND USE_SANDBOX) - list(APPEND _libraries ${CEF_SANDBOX_STANDARD_LIBS}) - endif() - message(STATUS "Standard libraries: ${_libraries}") - - message(STATUS "Compile defines: ${CEF_COMPILER_DEFINES}") - message(STATUS "Compile defines (Debug): ${CEF_COMPILER_DEFINES_DEBUG}") - message(STATUS "Compile defines (Release): ${CEF_COMPILER_DEFINES_RELEASE}") - message(STATUS "C compile flags: ${CEF_COMPILER_FLAGS} ${CEF_C_COMPILER_FLAGS}") - message(STATUS "C compile flags (Debug): ${CEF_COMPILER_FLAGS_DEBUG} ${CEF_C_COMPILER_FLAGS_DEBUG}") - message(STATUS "C compile flags (Release): ${CEF_COMPILER_FLAGS_RELEASE} ${CEF_C_COMPILER_FLAGS_RELEASE}") - message(STATUS "C++ compile flags: ${CEF_COMPILER_FLAGS} ${CEF_CXX_COMPILER_FLAGS}") - message(STATUS "C++ compile flags (Debug): ${CEF_COMPILER_FLAGS_DEBUG} ${CEF_CXX_COMPILER_FLAGS_DEBUG}") - message(STATUS "C++ compile flags (Release): ${CEF_COMPILER_FLAGS_RELEASE} ${CEF_CXX_COMPILER_FLAGS_RELEASE}") - message(STATUS "Exe link flags: ${CEF_LINKER_FLAGS} ${CEF_EXE_LINKER_FLAGS}") - message(STATUS "Exe link flags (Debug): ${CEF_LINKER_FLAGS_DEBUG} ${CEF_EXE_LINKER_FLAGS_DEBUG}") - message(STATUS "Exe link flags (Release): ${CEF_LINKER_FLAGS_RELEASE} ${CEF_EXE_LINKER_FLAGS_RELEASE}") - message(STATUS "Shared link flags: ${CEF_LINKER_FLAGS} ${CEF_SHARED_LINKER_FLAGS}") - message(STATUS "Shared link flags (Debug): ${CEF_LINKER_FLAGS_DEBUG} ${CEF_SHARED_LINKER_FLAGS_DEBUG}") - message(STATUS "Shared link flags (Release): ${CEF_LINKER_FLAGS_RELEASE} ${CEF_SHARED_LINKER_FLAGS_RELEASE}") - - if(OS_LINUX OR OS_WINDOWS) - message(STATUS "CEF Binary files: ${CEF_BINARY_FILES}") - message(STATUS "CEF Resource files: ${CEF_RESOURCE_FILES}") - endif() -endmacro() - -# Append platform specific sources to a list of sources. -macro(APPEND_PLATFORM_SOURCES name_of_list) - if(OS_LINUX AND ${name_of_list}_LINUX) - list(APPEND ${name_of_list} ${${name_of_list}_LINUX}) - endif() - if(OS_POSIX AND ${name_of_list}_POSIX) - list(APPEND ${name_of_list} ${${name_of_list}_POSIX}) - endif() - if(OS_WINDOWS AND ${name_of_list}_WINDOWS) - list(APPEND ${name_of_list} ${${name_of_list}_WINDOWS}) - endif() - if(OS_MAC AND ${name_of_list}_MAC) - list(APPEND ${name_of_list} ${${name_of_list}_MAC}) - endif() -endmacro() - -# Determine the target output directory based on platform and generator. -macro(SET_CEF_TARGET_OUT_DIR) - if(GEN_NINJA OR GEN_MAKEFILES) - # By default Ninja and Make builds don't create a subdirectory named after - # the configuration. - set(CEF_TARGET_OUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE}") - - # Output binaries (executables, libraries) to the correct directory. - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CEF_TARGET_OUT_DIR}) - set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CEF_TARGET_OUT_DIR}) - else() - set(CEF_TARGET_OUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/$") - endif() -endmacro() - -# Copy a list of files from one directory to another. Relative file paths are maintained. -macro(COPY_FILES target file_list source_dir target_dir) - foreach(FILENAME ${file_list}) - set(source_file ${source_dir}/${FILENAME}) - - # Remove the target file path component. - get_filename_component(target_name ${FILENAME} NAME) - set(target_file ${target_dir}/${target_name}) - - COPY_SINGLE_FILE(${target} ${source_file} ${target_file}) - endforeach() -endmacro() - -# Copy a list of files from one directory to another. Relative file paths are maintained. -macro(COPY_RESOURCES target file_list prefix_list source_dir target_dir) - foreach(FILENAME ${file_list}) - set(source_file ${source_dir}/${FILENAME}) - - # Remove one or more prefixes from the source paths. - set(TARGET_FILENAME "${FILENAME}") - foreach(PREFIX ${prefix_list}) - string(REGEX REPLACE "^.*${PREFIX}" "" TARGET_FILENAME ${TARGET_FILENAME}) - endforeach() - set(target_file ${target_dir}/${TARGET_FILENAME}) - - COPY_SINGLE_FILE(${target} ${source_file} ${target_file}) - endforeach() -endmacro() - -macro(COPY_SINGLE_FILE target source_file target_file) - string(FIND ${source_file} "$" _pos) - if(NOT ${_pos} EQUAL -1) - # Must test with an actual configuration directory. - string(REPLACE "$" "Release" existing_source_file ${source_file}) - if(NOT EXISTS ${existing_source_file}) - string(REPLACE "$" "Debug" existing_source_file ${source_file}) - endif() - else() - set(existing_source_file ${source_file}) - endif() - - if(IS_DIRECTORY ${existing_source_file}) - add_custom_command( - TARGET ${target} - POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_directory "${source_file}" "${target_file}" - VERBATIM - ) - else() - add_custom_command( - TARGET ${target} - POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_if_different "${source_file}" "${target_file}" - VERBATIM - ) - endif() -endmacro() - - -# -# Linux macros. -# - -if(OS_LINUX) - -# Use pkg-config to find Linux libraries and update compiler/linker variables. -macro(FIND_LINUX_LIBRARIES libraries) - # Read pkg-config info into variables. - execute_process(COMMAND pkg-config --cflags ${libraries} OUTPUT_VARIABLE FLL_CFLAGS) - execute_process(COMMAND pkg-config --libs-only-L --libs-only-other ${libraries} OUTPUT_VARIABLE FLL_LDFLAGS) - execute_process(COMMAND pkg-config --libs-only-l ${libraries} OUTPUT_VARIABLE FLL_LIBS) - - # Strip leading and trailing whitepspace. - STRING(STRIP "${FLL_CFLAGS}" FLL_CFLAGS) - STRING(STRIP "${FLL_LDFLAGS}" FLL_LDFLAGS) - STRING(STRIP "${FLL_LIBS}" FLL_LIBS) - - # Convert to a list. - separate_arguments(FLL_CFLAGS) - separate_arguments(FLL_LDFLAGS) - separate_arguments(FLL_LIBS) - - # Update build variables. - list(APPEND CEF_C_COMPILER_FLAGS ${FLL_CFLAGS}) - list(APPEND CEF_CXX_COMPILER_FLAGS ${FLL_CFLAGS}) - list(APPEND CEF_EXE_LINKER_FLAGS ${FLL_LDFLAGS}) - list(APPEND CEF_SHARED_LINKER_FLAGS ${FLL_LDFLAGS}) - list(APPEND CEF_STANDARD_LIBS ${FLL_LIBS}) -endmacro() - -# Set SUID permissions on the specified executable. -macro(SET_LINUX_SUID_PERMISSIONS target executable) - add_custom_command( - TARGET ${target} - POST_BUILD - COMMAND ${CMAKE_COMMAND} -E echo "" - COMMAND ${CMAKE_COMMAND} -E echo "*** Run the following command manually to set SUID permissions ***" - COMMAND ${CMAKE_COMMAND} -E echo "EXE=\"${executable}\" && sudo -- chown root:root $EXE && sudo -- chmod 4755 $EXE" - COMMAND ${CMAKE_COMMAND} -E echo "" - VERBATIM - ) -endmacro() - -endif(OS_LINUX) - - -# -# Mac OS X macros. -# - -if(OS_MAC) - -# Manually process and copy over resource files. -macro(COPY_MAC_RESOURCES resource_list prefix_list target source_dir app_path) - foreach(FILENAME ${resource_list}) - # Remove one or more prefixes from the source paths. - set(TARGET_FILENAME "${FILENAME}") - foreach(PREFIX ${prefix_list}) - string(REGEX REPLACE "^.*${PREFIX}" "" TARGET_FILENAME ${TARGET_FILENAME}) - endforeach() - - # Determine the absolute source and target paths. - set(TARGET_PATH "${app_path}/Contents/Resources/${TARGET_FILENAME}") - if(IS_ABSOLUTE ${FILENAME}) - set(SOURCE_PATH ${FILENAME}) - else() - set(SOURCE_PATH "${source_dir}/${FILENAME}") - endif() - - if(${FILENAME} MATCHES ".xib$") - # Change the target file extension. - string(REGEX REPLACE ".xib$" ".nib" TARGET_PATH ${TARGET_PATH}) - - get_filename_component(TARGET_DIRECTORY ${TARGET_PATH} PATH) - add_custom_command( - TARGET ${target} - POST_BUILD - # Create the target directory. - COMMAND ${CMAKE_COMMAND} -E make_directory "${TARGET_DIRECTORY}" - # Compile the XIB file to a NIB. - COMMAND /usr/bin/ibtool --output-format binary1 --compile "${TARGET_PATH}" "${SOURCE_PATH}" - VERBATIM - ) - elseif(NOT ${TARGET_FILENAME} STREQUAL "Info.plist") - # Copy the file as-is. - add_custom_command( - TARGET ${target} - POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy "${SOURCE_PATH}" "${TARGET_PATH}" - VERBATIM - ) - endif() - endforeach() -endmacro() - -endif(OS_MAC) - - -# -# Windows macros. -# - -if(OS_WINDOWS) - -# Add custom manifest files to an executable target. -macro(ADD_WINDOWS_MANIFEST manifest_path target extension) - add_custom_command( - TARGET ${target} - POST_BUILD - COMMAND "mt.exe" -nologo - -manifest \"${manifest_path}/${target}.${extension}.manifest\" \"${manifest_path}/compatibility.manifest\" - -outputresource:"${CEF_TARGET_OUT_DIR}/${target}.${extension}"\;\#1 - COMMENT "Adding manifest..." - ) -endmacro() - -endif(OS_WINDOWS) - - -# -# Target configuration macros. -# - -# Add a logical target that can be used to link the specified libraries into an -# executable target. -macro(ADD_LOGICAL_TARGET target debug_lib release_lib) - add_library(${target} ${CEF_LIBTYPE} IMPORTED) - set_target_properties(${target} PROPERTIES - IMPORTED_LOCATION "${release_lib}" - IMPORTED_LOCATION_DEBUG "${debug_lib}" - IMPORTED_LOCATION_RELEASE "${release_lib}" - ) -endmacro() - -# Set common target properties. Use SET_LIBRARY_TARGET_PROPERTIES() or -# SET_EXECUTABLE_TARGET_PROPERTIES() instead of calling this macro directly. -macro(SET_COMMON_TARGET_PROPERTIES target) - # Compile flags. - target_compile_options(${target} PRIVATE ${CEF_COMPILER_FLAGS} ${CEF_CXX_COMPILER_FLAGS}) - target_compile_options(${target} PRIVATE $<$:${CEF_COMPILER_FLAGS_DEBUG} ${CEF_CXX_COMPILER_FLAGS_DEBUG}>) - target_compile_options(${target} PRIVATE $<$:${CEF_COMPILER_FLAGS_RELEASE} ${CEF_CXX_COMPILER_FLAGS_RELEASE}>) - - # Compile definitions. - target_compile_definitions(${target} PRIVATE ${CEF_COMPILER_DEFINES}) - target_compile_definitions(${target} PRIVATE $<$:${CEF_COMPILER_DEFINES_DEBUG}>) - target_compile_definitions(${target} PRIVATE $<$:${CEF_COMPILER_DEFINES_RELEASE}>) - - # Include directories. - target_include_directories(${target} PRIVATE ${CEF_INCLUDE_PATH}) - - # Linker flags. - if(CEF_LINKER_FLAGS) - string(REPLACE ";" " " _flags_str "${CEF_LINKER_FLAGS}") - set_property(TARGET ${target} PROPERTY LINK_FLAGS ${_flags_str}) - endif() - if(CEF_LINKER_FLAGS_DEBUG) - string(REPLACE ";" " " _flags_str "${CEF_LINKER_FLAGS_DEBUG}") - set_property(TARGET ${target} PROPERTY LINK_FLAGS_DEBUG ${_flags_str}) - endif() - if(CEF_LINKER_FLAGS_RELEASE) - string(REPLACE ";" " " _flags_str "${CEF_LINKER_FLAGS_RELEASE}") - set_property(TARGET ${target} PROPERTY LINK_FLAGS_RELEASE ${_flags_str}) - endif() - - if(OS_MAC) - # Set Xcode target properties. - set_target_properties(${target} PROPERTIES - XCODE_ATTRIBUTE_ALWAYS_SEARCH_USER_PATHS NO - XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD "gnu++11" # -std=gnu++11 - XCODE_ATTRIBUTE_CLANG_LINK_OBJC_RUNTIME NO # -fno-objc-link-runtime - XCODE_ATTRIBUTE_CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS YES # -Wobjc-missing-property-synthesis - XCODE_ATTRIBUTE_COPY_PHASE_STRIP NO - XCODE_ATTRIBUTE_DEAD_CODE_STRIPPING[variant=Release] YES # -Wl,-dead_strip - XCODE_ATTRIBUTE_GCC_C_LANGUAGE_STANDARD "c99" # -std=c99 - XCODE_ATTRIBUTE_GCC_CW_ASM_SYNTAX NO # No -fasm-blocks - XCODE_ATTRIBUTE_GCC_DYNAMIC_NO_PIC NO - XCODE_ATTRIBUTE_GCC_ENABLE_CPP_EXCEPTIONS NO # -fno-exceptions - XCODE_ATTRIBUTE_GCC_ENABLE_CPP_RTTI NO # -fno-rtti - XCODE_ATTRIBUTE_GCC_ENABLE_PASCAL_STRINGS NO # No -mpascal-strings - XCODE_ATTRIBUTE_GCC_INLINES_ARE_PRIVATE_EXTERN YES # -fvisibility-inlines-hidden - XCODE_ATTRIBUTE_GCC_OBJC_CALL_CXX_CDTORS YES # -fobjc-call-cxx-cdtors - XCODE_ATTRIBUTE_GCC_SYMBOLS_PRIVATE_EXTERN YES # -fvisibility=hidden - XCODE_ATTRIBUTE_GCC_THREADSAFE_STATICS NO # -fno-threadsafe-statics - XCODE_ATTRIBUTE_GCC_TREAT_WARNINGS_AS_ERRORS YES # -Werror - XCODE_ATTRIBUTE_GCC_VERSION "com.apple.compilers.llvm.clang.1_0" - XCODE_ATTRIBUTE_GCC_WARN_ABOUT_MISSING_NEWLINE YES # -Wnewline-eof - XCODE_ATTRIBUTE_USE_HEADERMAP NO - OSX_ARCHITECTURES_DEBUG "${CMAKE_OSX_ARCHITECTURES}" - OSX_ARCHITECTURES_RELEASE "${CMAKE_OSX_ARCHITECTURES}" - ) - endif() -endmacro() - -# Set library-specific properties. -macro(SET_LIBRARY_TARGET_PROPERTIES target) - SET_COMMON_TARGET_PROPERTIES(${target}) - - # Shared library linker flags. - if(CEF_SHARED_LINKER_FLAGS) - string(REPLACE ";" " " _flags_str "${CEF_SHARED_LINKER_FLAGS}") - set_property(TARGET ${target} PROPERTY LINK_FLAGS ${_flags_str}) - endif() - if(CEF_SHARED_LINKER_FLAGS_DEBUG) - string(REPLACE ";" " " _flags_str "${CEF_SHARED_LINKER_FLAGS_DEBUG}") - set_property(TARGET ${target} PROPERTY LINK_FLAGS_DEBUG ${_flags_str}) - endif() - if(CEF_SHARED_LINKER_FLAGS_RELEASE) - string(REPLACE ";" " " _flags_str "${CEF_SHARED_LINKER_FLAGS_RELEASE}") - set_property(TARGET ${target} PROPERTY LINK_FLAGS_RELEASE ${_flags_str}) - endif() -endmacro() - -# Set executable-specific properties. -macro(SET_EXECUTABLE_TARGET_PROPERTIES target) - SET_COMMON_TARGET_PROPERTIES(${target}) - - # Executable linker flags. - if(CEF_EXE_LINKER_FLAGS) - string(REPLACE ";" " " _flags_str "${CEF_EXE_LINKER_FLAGS}") - set_property(TARGET ${target} PROPERTY LINK_FLAGS ${_flags_str}) - endif() - if(CEF_EXE_LINKER_FLAGS_DEBUG) - string(REPLACE ";" " " _flags_str "${CEF_EXE_LINKER_FLAGS_DEBUG}") - set_property(TARGET ${target} PROPERTY LINK_FLAGS_DEBUG ${_flags_str}) - endif() - if(CEF_EXE_LINKER_FLAGS_RELEASE) - string(REPLACE ";" " " _flags_str "${CEF_EXE_LINKER_FLAGS_RELEASE}") - set_property(TARGET ${target} PROPERTY LINK_FLAGS_RELEASE ${_flags_str}) - endif() -endmacro() diff --git a/CMakeModules/cef_variables.cmake b/CMakeModules/cef_variables.cmake deleted file mode 100644 index a3d78fb..0000000 --- a/CMakeModules/cef_variables.cmake +++ /dev/null @@ -1,582 +0,0 @@ -# Copyright (c) 2016 The Chromium Embedded Framework Authors. All rights -# reserved. Use of this source code is governed by a BSD-style license that -# can be found in the LICENSE file. - -# Must be loaded via FindCEF.cmake. -if(NOT DEFINED _CEF_ROOT_EXPLICIT) - message(FATAL_ERROR "Use find_package(CEF) to load this file.") -endif() - - -# -# Shared configuration. -# - -# Determine the platform. -if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin") - set(OS_MAC 1) - set(OS_MACOSX 1) # For backwards compatibility. - set(OS_POSIX 1) -elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") - set(OS_LINUX 1) - set(OS_POSIX 1) -elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") - set(OS_WINDOWS 1) -endif() - -# Determine the project architecture. -if(NOT DEFINED PROJECT_ARCH) - if(("${CMAKE_HOST_SYSTEM_PROCESSOR}" STREQUAL "arm64") OR - ("${CMAKE_CXX_COMPILER_ARCHITECTURE_ID}" STREQUAL "ARM64")) - set(PROJECT_ARCH "arm64") - elseif(CMAKE_SIZEOF_VOID_P MATCHES 8) - set(PROJECT_ARCH "x86_64") - else() - set(PROJECT_ARCH "x86") - endif() -endif() - -if(${CMAKE_GENERATOR} STREQUAL "Ninja") - set(GEN_NINJA 1) -elseif(${CMAKE_GENERATOR} STREQUAL "Unix Makefiles") - set(GEN_MAKEFILES 1) -endif() - -# Determine the build type. -if(NOT CMAKE_BUILD_TYPE AND (GEN_NINJA OR GEN_MAKEFILES)) - # CMAKE_BUILD_TYPE should be specified when using Ninja or Unix Makefiles. - set(CMAKE_BUILD_TYPE Release) - message(WARNING "No CMAKE_BUILD_TYPE value selected, using ${CMAKE_BUILD_TYPE}") -endif() - - -# Path to the include directory. -set(CEF_INCLUDE_PATH "${_CEF_ROOT}") - -# Path to the libcef_dll_wrapper target. -set(CEF_LIBCEF_DLL_WRAPPER_PATH "${_CEF_ROOT}/libcef_dll") - - -# Shared compiler/linker flags. -list(APPEND CEF_COMPILER_DEFINES - # Allow C++ programs to use stdint.h macros specified in the C99 standard that aren't - # in the C++ standard (e.g. UINT8_MAX, INT64_MIN, etc) - __STDC_CONSTANT_MACROS __STDC_FORMAT_MACROS - ) - - -# Configure use of the sandbox. -option(USE_SANDBOX "Enable or disable use of the sandbox." ON) - - -# -# Linux configuration. -# - -if(OS_LINUX) - # Platform-specific compiler/linker flags. - set(CEF_LIBTYPE SHARED) - list(APPEND CEF_COMPILER_FLAGS - -fno-strict-aliasing # Avoid assumptions regarding non-aliasing of objects of different types - -fPIC # Generate position-independent code for shared libraries - -fstack-protector # Protect some vulnerable functions from stack-smashing (security feature) - -funwind-tables # Support stack unwinding for backtrace() - -fvisibility=hidden # Give hidden visibility to declarations that are not explicitly marked as visible - --param=ssp-buffer-size=4 # Set the minimum buffer size protected by SSP (security feature, related to stack-protector) - -pipe # Use pipes rather than temporary files for communication between build stages - -pthread # Use the pthread library - # -Wall # Enable all warnings - # -Werror # Treat warnings as errors - # -Wno-missing-field-initializers # Don't warn about missing field initializers - # -Wno-unused-parameter # Don't warn about unused parameters - # -Wno-error=comment # Don't warn about code in comments - # -Wno-comment # Don't warn about code in comments - # -Wno-deprecated-declarations # Don't warn about using deprecated methods - ) - list(APPEND CEF_C_COMPILER_FLAGS - -std=c99 # Use the C99 language standard - ) - list(APPEND CEF_CXX_COMPILER_FLAGS - # -fno-exceptions # Disable exceptions - # -fno-rtti # Disable real-time type information - -fno-threadsafe-statics # Don't generate thread-safe statics - -fvisibility-inlines-hidden # Give hidden visibility to inlined class member functions - -std=c++17 # Use the C++17 language standard - -Wsign-compare # Warn about mixed signed/unsigned type comparisons - ) - list(APPEND CEF_COMPILER_FLAGS_DEBUG - -O0 # Disable optimizations - -g # Generate debug information - ) - list(APPEND CEF_COMPILER_FLAGS_RELEASE - -O2 # Optimize for maximum speed - -fdata-sections # Enable linker optimizations to improve locality of reference for data sections - -ffunction-sections # Enable linker optimizations to improve locality of reference for function sections - -fno-ident # Ignore the #ident directive - -U_FORTIFY_SOURCE # Undefine _FORTIFY_SOURCE in case it was previously defined - -D_FORTIFY_SOURCE=2 # Add memory and string function protection (security feature, related to stack-protector) - ) - list(APPEND CEF_LINKER_FLAGS - -fPIC # Generate position-independent code for shared libraries - -pthread # Use the pthread library - -Wl,--disable-new-dtags # Don't generate new-style dynamic tags in ELF - -Wl,--fatal-warnings # Treat warnings as errors - -Wl,-rpath,. # Set rpath so that libraries can be placed next to the executable - -Wl,-z,noexecstack # Mark the stack as non-executable (security feature) - -Wl,-z,now # Resolve symbols on program start instead of on first use (security feature) - -Wl,-z,relro # Mark relocation sections as read-only (security feature) - ) - list(APPEND CEF_LINKER_FLAGS_RELEASE - -Wl,-O1 # Enable linker optimizations - -Wl,--as-needed # Only link libraries that export symbols used by the binary - -Wl,--gc-sections # Remove unused code resulting from -fdata-sections and -function-sections - ) - list(APPEND CEF_COMPILER_DEFINES - _FILE_OFFSET_BITS=64 # Allow the Large File Support (LFS) interface to replace the old interface - ) - list(APPEND CEF_COMPILER_DEFINES_RELEASE - NDEBUG # Not a debug build - ) - - include(CheckCCompilerFlag) - include(CheckCXXCompilerFlag) - - CHECK_CXX_COMPILER_FLAG(-Wno-undefined-var-template COMPILER_SUPPORTS_NO_UNDEFINED_VAR_TEMPLATE) - if(COMPILER_SUPPORTS_NO_UNDEFINED_VAR_TEMPLATE) - list(APPEND CEF_CXX_COMPILER_FLAGS - -Wno-undefined-var-template # Don't warn about potentially uninstantiated static members - ) - endif() - - CHECK_C_COMPILER_FLAG(-Wno-unused-local-typedefs COMPILER_SUPPORTS_NO_UNUSED_LOCAL_TYPEDEFS) - if(COMPILER_SUPPORTS_NO_UNUSED_LOCAL_TYPEDEFS) - list(APPEND CEF_C_COMPILER_FLAGS - -Wno-unused-local-typedefs # Don't warn about unused local typedefs - ) - endif() - - CHECK_CXX_COMPILER_FLAG(-Wno-literal-suffix COMPILER_SUPPORTS_NO_LITERAL_SUFFIX) - if(COMPILER_SUPPORTS_NO_LITERAL_SUFFIX) - list(APPEND CEF_CXX_COMPILER_FLAGS - -Wno-literal-suffix # Don't warn about invalid suffixes on literals - ) - endif() - - CHECK_CXX_COMPILER_FLAG(-Wno-narrowing COMPILER_SUPPORTS_NO_NARROWING) - if(COMPILER_SUPPORTS_NO_NARROWING) - list(APPEND CEF_CXX_COMPILER_FLAGS - -Wno-narrowing # Don't warn about type narrowing - ) - endif() - - if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") - list(APPEND CEF_CXX_COMPILER_FLAGS - -Wno-attributes # The cfi-icall attribute is not supported by the GNU C++ compiler - ) - endif() - - if(PROJECT_ARCH STREQUAL "x86_64") - # 64-bit architecture. - list(APPEND CEF_COMPILER_FLAGS - -m64 - -march=x86-64 - ) - list(APPEND CEF_LINKER_FLAGS - -m64 - ) - elseif(PROJECT_ARCH STREQUAL "x86") - # 32-bit architecture. - list(APPEND CEF_COMPILER_FLAGS - -msse2 - -mfpmath=sse - -mmmx - -m32 - ) - list(APPEND CEF_LINKER_FLAGS - -m32 - ) - endif() - - # Standard libraries. - set(CEF_STANDARD_LIBS - X11 - ) - - # CEF directory paths. - set(CEF_RESOURCE_DIR "${_CEF_ROOT}/Resources") - set(CEF_BINARY_DIR "${_CEF_ROOT}/${CMAKE_BUILD_TYPE}") - set(CEF_BINARY_DIR_DEBUG "${_CEF_ROOT}/Debug") - set(CEF_BINARY_DIR_RELEASE "${_CEF_ROOT}/Release") - - # CEF library paths. - set(CEF_LIB_DEBUG "${CEF_BINARY_DIR_DEBUG}/libcef.so") - set(CEF_LIB_RELEASE "${CEF_BINARY_DIR_RELEASE}/libcef.so") - - # List of CEF binary files. - set(CEF_BINARY_FILES - chrome-sandbox - libcef.so - libEGL.so - libGLESv2.so - libvk_swiftshader.so - # libvulkan.so.1 - snapshot_blob.bin - v8_context_snapshot.bin - vk_swiftshader_icd.json - ) - - # List of CEF resource files. - set(CEF_RESOURCE_FILES - chrome_100_percent.pak - chrome_200_percent.pak - resources.pak - icudtl.dat - locales - ) - - if(USE_SANDBOX) - list(APPEND CEF_COMPILER_DEFINES - CEF_USE_SANDBOX # Used by apps to test if the sandbox is enabled - ) - endif() -endif() - - -# -# Mac OS X configuration. -# - -if(OS_MAC) - # Platform-specific compiler/linker flags. - # See also Xcode target properties in cef_macros.cmake. - set(CEF_LIBTYPE SHARED) - list(APPEND CEF_COMPILER_FLAGS - -fno-strict-aliasing # Avoid assumptions regarding non-aliasing of objects of different types - -fstack-protector # Protect some vulnerable functions from stack-smashing (security feature) - -funwind-tables # Support stack unwinding for backtrace() - -fvisibility=hidden # Give hidden visibility to declarations that are not explicitly marked as visible - -Wall # Enable all warnings - -Werror # Treat warnings as errors - -Wextra # Enable additional warnings - -Wendif-labels # Warn whenever an #else or an #endif is followed by text - -Wnewline-eof # Warn about no newline at end of file - -Wno-missing-field-initializers # Don't warn about missing field initializers - -Wno-unused-parameter # Don't warn about unused parameters - ) - list(APPEND CEF_C_COMPILER_FLAGS - -std=c99 # Use the C99 language standard - ) - list(APPEND CEF_CXX_COMPILER_FLAGS - # -fno-exceptions # Disable exceptions - # -fno-rtti # Disable real-time type information - -fno-threadsafe-statics # Don't generate thread-safe statics - -fobjc-call-cxx-cdtors # Call the constructor/destructor of C++ instance variables in ObjC objects - -fvisibility-inlines-hidden # Give hidden visibility to inlined class member functions - -std=c++17 # Use the C++17 language standard - -Wno-narrowing # Don't warn about type narrowing - -Wsign-compare # Warn about mixed signed/unsigned type comparisons - ) - list(APPEND CEF_COMPILER_FLAGS_DEBUG - -O0 # Disable optimizations - -g # Generate debug information - ) - list(APPEND CEF_COMPILER_FLAGS_RELEASE - -O3 # Optimize for maximum speed plus a few extras - ) - list(APPEND CEF_LINKER_FLAGS - -Wl,-search_paths_first # Search for static or shared library versions in the same pass - -Wl,-ObjC # Support creation of ObjC static libraries - -Wl,-pie # Generate position-independent code suitable for executables only - ) - list(APPEND CEF_LINKER_FLAGS_RELEASE - -Wl,-dead_strip # Strip dead code - ) - - include(CheckCXXCompilerFlag) - - CHECK_CXX_COMPILER_FLAG(-Wno-undefined-var-template COMPILER_SUPPORTS_NO_UNDEFINED_VAR_TEMPLATE) - if(COMPILER_SUPPORTS_NO_UNDEFINED_VAR_TEMPLATE) - list(APPEND CEF_CXX_COMPILER_FLAGS - -Wno-undefined-var-template # Don't warn about potentially uninstantiated static members - ) - endif() - - # Standard libraries. - set(CEF_STANDARD_LIBS - -lpthread - "-framework Cocoa" - "-framework AppKit" - ) - - # Find the newest available base SDK. - execute_process(COMMAND xcode-select --print-path OUTPUT_VARIABLE XCODE_PATH OUTPUT_STRIP_TRAILING_WHITESPACE) - foreach(OS_VERSION 10.15 10.14 10.13) - set(SDK "${XCODE_PATH}/Platforms/MacOSX.platform/Developer/SDKs/MacOSX${OS_VERSION}.sdk") - if(NOT "${CMAKE_OSX_SYSROOT}" AND EXISTS "${SDK}" AND IS_DIRECTORY "${SDK}") - set(CMAKE_OSX_SYSROOT ${SDK}) - endif() - endforeach() - - # Target SDK. - set(CEF_TARGET_SDK "10.13") - list(APPEND CEF_COMPILER_FLAGS - -mmacosx-version-min=${CEF_TARGET_SDK} - ) - set(CMAKE_OSX_DEPLOYMENT_TARGET ${CEF_TARGET_SDK}) - - # Target architecture. - if(PROJECT_ARCH STREQUAL "x86_64") - set(CMAKE_OSX_ARCHITECTURES "x86_64") - elseif(PROJECT_ARCH STREQUAL "arm64") - set(CMAKE_OSX_ARCHITECTURES "arm64") - else() - set(CMAKE_OSX_ARCHITECTURES "i386") - endif() - - # Prevent Xcode 11 from doing automatic codesigning. - set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "") - - # CEF directory paths. - set(CEF_BINARY_DIR "${_CEF_ROOT}/$") - set(CEF_BINARY_DIR_DEBUG "${_CEF_ROOT}/Debug") - set(CEF_BINARY_DIR_RELEASE "${_CEF_ROOT}/Release") - - if(USE_SANDBOX) - list(APPEND CEF_COMPILER_DEFINES - CEF_USE_SANDBOX # Used by apps to test if the sandbox is enabled - ) - - list(APPEND CEF_STANDARD_LIBS - -lsandbox - ) - - # CEF sandbox library paths. - set(CEF_SANDBOX_LIB_DEBUG "${CEF_BINARY_DIR_DEBUG}/cef_sandbox.a") - set(CEF_SANDBOX_LIB_RELEASE "${CEF_BINARY_DIR_RELEASE}/cef_sandbox.a") - endif() - - # CEF Helper app suffixes. - # Format is "::". - set(CEF_HELPER_APP_SUFFIXES - "::" - " (Alerts):_alerts:.alerts" - " (GPU):_gpu:.gpu" - " (Plugin):_plugin:.plugin" - " (Renderer):_renderer:.renderer" - ) -endif() - - -# -# Windows configuration. -# - -if(OS_WINDOWS) - if (GEN_NINJA) - # When using the Ninja generator clear the CMake defaults to avoid excessive - # console warnings (see issue #2120). - set(CMAKE_CXX_FLAGS "") - set(CMAKE_CXX_FLAGS_DEBUG "") - set(CMAKE_CXX_FLAGS_RELEASE "") - endif() - - if(USE_SANDBOX) - # Check if the current MSVC version is compatible with the cef_sandbox.lib - # static library. We require VS2015 or newer. - if(MSVC_VERSION LESS 1900) - message(WARNING "CEF sandbox is not compatible with the current MSVC version (${MSVC_VERSION})") - set(USE_SANDBOX OFF) - endif() - endif() - - # Consumers who run into LNK4099 warnings can pass /Z7 instead (see issue #385). - set(CEF_DEBUG_INFO_FLAG "/Zi" CACHE STRING "Optional flag specifying specific /Z flag to use") - - # Consumers using different runtime types may want to pass different flags - set(CEF_RUNTIME_LIBRARY_FLAG "/MT" CACHE STRING "Optional flag specifying which runtime to use") - if (CEF_RUNTIME_LIBRARY_FLAG) - list(APPEND CEF_COMPILER_FLAGS_DEBUG ${CEF_RUNTIME_LIBRARY_FLAG}d) - list(APPEND CEF_COMPILER_FLAGS_RELEASE ${CEF_RUNTIME_LIBRARY_FLAG}) - endif() - - # Platform-specific compiler/linker flags. - set(CEF_LIBTYPE STATIC) - list(APPEND CEF_COMPILER_FLAGS - /MP # Multiprocess compilation - /Gy # Enable function-level linking - /GR- # Disable run-time type information - /W4 # Warning level 4 - /WX # Treat warnings as errors - /wd4100 # Ignore "unreferenced formal parameter" warning - /wd4127 # Ignore "conditional expression is constant" warning - /wd4244 # Ignore "conversion possible loss of data" warning - /wd4324 # Ignore "structure was padded due to alignment specifier" warning - /wd4481 # Ignore "nonstandard extension used: override" warning - /wd4512 # Ignore "assignment operator could not be generated" warning - /wd4701 # Ignore "potentially uninitialized local variable" warning - /wd4702 # Ignore "unreachable code" warning - /wd4996 # Ignore "function or variable may be unsafe" warning - ${CEF_DEBUG_INFO_FLAG} - ) - list(APPEND CEF_COMPILER_FLAGS_DEBUG - /RTC1 # Disable optimizations - /Od # Enable basic run-time checks - ) - list(APPEND CEF_COMPILER_FLAGS_RELEASE - /O2 # Optimize for maximum speed - /Ob2 # Inline any suitable function - /GF # Enable string pooling - ) - list(APPEND CEF_CXX_COMPILER_FLAGS - /std:c++17 # Use the C++17 language standard - ) - list(APPEND CEF_LINKER_FLAGS_DEBUG - /DEBUG # Generate debug information - ) - list(APPEND CEF_EXE_LINKER_FLAGS - /MANIFEST:NO # No default manifest (see ADD_WINDOWS_MANIFEST macro usage) - /LARGEADDRESSAWARE # Allow 32-bit processes to access 3GB of RAM - ) - list(APPEND CEF_COMPILER_DEFINES - WIN32 _WIN32 _WINDOWS # Windows platform - UNICODE _UNICODE # Unicode build - # Targeting Windows 10. We can't say `=_WIN32_WINNT_WIN10` here because - # some files do `#if WINVER < 0x0600` without including windows.h before, - # and then _WIN32_WINNT_WIN10 isn't yet known to be 0x0A00. - WINVER=0x0A00 - _WIN32_WINNT=0x0A00 - NTDDI_VERSION=NTDDI_WIN10_FE - NOMINMAX # Use the standard's templated min/max - WIN32_LEAN_AND_MEAN # Exclude less common API declarations - _HAS_EXCEPTIONS=0 # Disable exceptions - ) - list(APPEND CEF_COMPILER_DEFINES_RELEASE - NDEBUG _NDEBUG # Not a debug build - ) - - if(PROJECT_ARCH STREQUAL "x86") - # Set the initial stack size to 0.5MiB, instead of the 1.5MiB minimum - # needed by CEF's main thread. This saves significant memory on threads - # (like those in the Windows thread pool, and others) whose stack size we - # can only control through this setting. The main thread (in 32-bit builds - # only) uses fibers to switch to a 4MiB stack at runtime via - # CefRunWinMainWithPreferredStackSize(). - list(APPEND CEF_EXE_LINKER_FLAGS - /STACK:0x80000 - ) - else() - # Increase the initial stack size to 8MiB from the default 1MiB. - list(APPEND CEF_EXE_LINKER_FLAGS - /STACK:0x800000 - ) - endif() - - # Standard libraries. - set(CEF_STANDARD_LIBS - comctl32.lib - gdi32.lib - rpcrt4.lib - shlwapi.lib - ws2_32.lib - ) - - # CEF directory paths. - set(CEF_RESOURCE_DIR "${_CEF_ROOT}/Resources") - set(CEF_BINARY_DIR "${_CEF_ROOT}/$") - set(CEF_BINARY_DIR_DEBUG "${_CEF_ROOT}/Debug") - set(CEF_BINARY_DIR_RELEASE "${_CEF_ROOT}/Release") - - # CEF library paths. - set(CEF_LIB_DEBUG "${CEF_BINARY_DIR_DEBUG}/libcef.lib") - set(CEF_LIB_RELEASE "${CEF_BINARY_DIR_RELEASE}/libcef.lib") - - # List of CEF binary files. - set(CEF_BINARY_FILES - chrome_elf.dll - d3dcompiler_47.dll - libcef.dll - libEGL.dll - libGLESv2.dll - snapshot_blob.bin - v8_context_snapshot.bin - vk_swiftshader.dll - vk_swiftshader_icd.json - vulkan-1.dll - ) - - # List of CEF resource files. - set(CEF_RESOURCE_FILES - chrome_100_percent.pak - chrome_200_percent.pak - resources.pak - icudtl.dat - locales - ) - - if(USE_SANDBOX) - list(APPEND CEF_COMPILER_DEFINES - PSAPI_VERSION=1 # Required by cef_sandbox.lib - CEF_USE_SANDBOX # Used by apps to test if the sandbox is enabled - ) - list(APPEND CEF_COMPILER_DEFINES_DEBUG - _HAS_ITERATOR_DEBUGGING=0 # Disable iterator debugging - ) - - # Libraries required by cef_sandbox.lib. - set(CEF_SANDBOX_STANDARD_LIBS - Advapi32.lib - dbghelp.lib - Delayimp.lib - ntdll.lib - OleAut32.lib - PowrProf.lib - Propsys.lib - psapi.lib - SetupAPI.lib - Shell32.lib - Shcore.lib - Userenv.lib - version.lib - wbemuuid.lib - WindowsApp.lib - winmm.lib - ) - - # CEF sandbox library paths. - set(CEF_SANDBOX_LIB_DEBUG "${CEF_BINARY_DIR_DEBUG}/cef_sandbox.lib") - set(CEF_SANDBOX_LIB_RELEASE "${CEF_BINARY_DIR_RELEASE}/cef_sandbox.lib") - endif() - - # Configure use of ATL. - option(USE_ATL "Enable or disable use of ATL." ON) - if(USE_ATL) - # Locate the atlmfc directory if it exists. It may be at any depth inside - # the VC directory. The cl.exe path returned by CMAKE_CXX_COMPILER may also - # be at different depths depending on the toolchain version - # (e.g. "VC/bin/cl.exe", "VC/bin/amd64_x86/cl.exe", - # "VC/Tools/MSVC/14.10.25017/bin/HostX86/x86/cl.exe", etc). - set(HAS_ATLMFC 0) - get_filename_component(VC_DIR ${CMAKE_CXX_COMPILER} DIRECTORY) - get_filename_component(VC_DIR_NAME ${VC_DIR} NAME) - while(NOT ${VC_DIR_NAME} STREQUAL "VC") - get_filename_component(VC_DIR ${VC_DIR} DIRECTORY) - if(IS_DIRECTORY "${VC_DIR}/atlmfc") - set(HAS_ATLMFC 1) - break() - endif() - get_filename_component(VC_DIR_NAME ${VC_DIR} NAME) - endwhile() - - # Determine if the Visual Studio install supports ATL. - if(NOT HAS_ATLMFC) - message(WARNING "ATL is not supported by your VC installation.") - set(USE_ATL OFF) - endif() - endif() - - if(USE_ATL) - list(APPEND CEF_COMPILER_DEFINES - CEF_USE_ATL # Used by apps to test if ATL support is enabled - ) - endif() -endif() diff --git a/main.cpp b/main.cpp index e6ef900..ca62b8a 100644 --- a/main.cpp +++ b/main.cpp @@ -8,30 +8,45 @@ WallpaperEngine::Application::CWallpaperApplication* app; -void signalhandler(int sig) -{ +void signalhandler(int sig) { if (app == nullptr) return; app->signal (sig); } -void initLogging () -{ +void initLogging () { sLog.addOutput (new std::ostream (std::cout.rdbuf ())); sLog.addError (new std::ostream (std::cerr.rdbuf ())); } int main (int argc, char* argv[]) { - initLogging (); - WallpaperEngine::WebBrowser::CWebBrowserContext webBrowserContext(argc, argv); + // if type parameter is specified, this is a subprocess, so no logging should be enabled from our side + bool enableLogging = true; + std::string typeZygote = "--type=zygote"; + std::string typeUtility = "--type=utility"; + + for (int i = 1; i < argc; i ++) { + if (strncmp (typeZygote.c_str(), argv[i], typeZygote.size()) == 0) { + enableLogging = false; + break; + } else if (strncmp (typeUtility.c_str(), argv[i], typeUtility.size()) == 0) { + enableLogging = false; + break; + } + } + + if (enableLogging) { + initLogging (); + } + WallpaperEngine::Application::CApplicationContext appContext (argc, argv); // halt if the list-properties option was specified if (appContext.settings.general.onlyListProperties) return 0; - app = new WallpaperEngine::Application::CWallpaperApplication (appContext, webBrowserContext); + app = new WallpaperEngine::Application::CWallpaperApplication (appContext); // attach signals to gracefully stop std::signal (SIGINT, signalhandler); diff --git a/src/WallpaperEngine/Application/CApplicationContext.cpp b/src/WallpaperEngine/Application/CApplicationContext.cpp index 4f4d919..c30e56b 100644 --- a/src/WallpaperEngine/Application/CApplicationContext.cpp +++ b/src/WallpaperEngine/Application/CApplicationContext.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #define WORKSHOP_APP_ID 431960 #define APP_DIRECTORY "wallpaper_engine" @@ -55,7 +56,9 @@ std::string stringPathFixes (const std::string& s) { return std::move (str); } -CApplicationContext::CApplicationContext (int argc, char* argv []) { +CApplicationContext::CApplicationContext (int argc, char* argv []) : + m_argc (argc), + m_argv (argv) { // setup structs with sane default values for now this->settings = { .general = @@ -90,6 +93,19 @@ CApplicationContext::CApplicationContext (int argc, char* argv []) { }, }; + // use std::out on this in case logging is disabled, this way it's easy to look at what is running + std::stringbuf buffer; + std::ostream bufferStream (&buffer); + + bufferStream << "Running with: "; + + for (int i = 0; i < argc; i ++) { + bufferStream << argv [i]; + bufferStream << " "; + } + + std::cout << buffer.str() << std::endl; + int c; std::string lastScreen; @@ -248,6 +264,14 @@ CApplicationContext::CApplicationContext (int argc, char* argv []) { this->state.audio.volume = this->settings.audio.volume; } +int CApplicationContext::getArgc () const { + return this->m_argc; +} + +char** CApplicationContext::getArgv () const { + return this->m_argv; +} + std::filesystem::path CApplicationContext::translateBackground (const std::string& bgIdOrPath) { if (bgIdOrPath.find ('/') == std::string::npos) return Steam::FileSystem::workshopDirectory (WORKSHOP_APP_ID, bgIdOrPath); diff --git a/src/WallpaperEngine/Application/CApplicationContext.h b/src/WallpaperEngine/Application/CApplicationContext.h index 3f824b0..a4027bc 100644 --- a/src/WallpaperEngine/Application/CApplicationContext.h +++ b/src/WallpaperEngine/Application/CApplicationContext.h @@ -104,7 +104,15 @@ class CApplicationContext { CApplicationState state; + [[nodiscard]] int getArgc() const; + [[nodiscard]] char** getArgv() const; + private: + /** Program argument count on startup */ + int m_argc; + /** Program arguments on startup */ + char** m_argv; + /** * Validates the assets folder and ensures a valid one is present */ diff --git a/src/WallpaperEngine/Application/CWallpaperApplication.cpp b/src/WallpaperEngine/Application/CWallpaperApplication.cpp index bea7103..a5f7a05 100644 --- a/src/WallpaperEngine/Application/CWallpaperApplication.cpp +++ b/src/WallpaperEngine/Application/CWallpaperApplication.cpp @@ -16,6 +16,7 @@ #endif /* ENABLE_WAYLAND */ #ifdef ENABLE_X11 +#include "WallpaperEngine/Core/Wallpapers/CWeb.h" #include "WallpaperEngine/Render/Drivers/Detectors/CX11FullScreenDetector.h" #endif /* ENABLE_X11 */ @@ -30,10 +31,9 @@ float g_TimeLast; float g_Daytime; namespace WallpaperEngine::Application { -CWallpaperApplication::CWallpaperApplication (CApplicationContext& context, - WallpaperEngine::WebBrowser::CWebBrowserContext& browserContext) : +CWallpaperApplication::CWallpaperApplication (CApplicationContext& context) : m_context (context), - m_browserContext (browserContext), + m_browserContext (nullptr), m_audioContext (nullptr), m_audioDriver (nullptr), m_audioRecorder (nullptr), @@ -43,6 +43,7 @@ CWallpaperApplication::CWallpaperApplication (CApplicationContext& context, m_fullScreenDetector (nullptr) { this->loadBackgrounds (); this->setupProperties (); + this->setupBrowser(); } CWallpaperApplication::~CWallpaperApplication () { @@ -51,6 +52,7 @@ CWallpaperApplication::~CWallpaperApplication () { delete m_audioContext; delete m_audioDriver; delete m_inputContext; + delete m_browserContext; } void CWallpaperApplication::setupContainer (CCombinedContainer& container, const std::string& bg) const { @@ -201,10 +203,23 @@ void CWallpaperApplication::setupPropertiesForProject (const Core::CProject* pro } void CWallpaperApplication::setupProperties () { - for (const auto& [backgrounc, info] : this->m_backgrounds) + for (const auto& [background, info] : this->m_backgrounds) this->setupPropertiesForProject (info); } +void CWallpaperApplication::setupBrowser () { + bool anyWebProject = std::any_of (this->m_backgrounds.begin (), this->m_backgrounds.end (), [](std::pair pair) -> bool { + return pair.second->getWallpaper()->is (); + }); + + // do not perform any initialization if no web background is present + if (!anyWebProject) { + return; + } + + this->m_browserContext = new WebBrowser::CWebBrowserContext (*this); +} + void CWallpaperApplication::takeScreenshot (const std::filesystem::path& filename) const { // this should be getting called at the end of the frame, so the right thing should be bound already const int width = this->m_renderContext->getOutput ().getFullWidth (); @@ -384,7 +399,7 @@ void CWallpaperApplication::show () { for (const auto& [background, info] : this->m_backgrounds) { m_renderContext->setWallpaper (background, WallpaperEngine::Render::CWallpaper::fromWallpaper ( - info->getWallpaper (), *m_renderContext, *m_audioContext, m_browserContext, + info->getWallpaper (), *m_renderContext, *m_audioContext, *m_browserContext, this->m_context.settings.general.screenScalings [background])); } diff --git a/src/WallpaperEngine/Application/CWallpaperApplication.h b/src/WallpaperEngine/Application/CWallpaperApplication.h index 94a02fc..913879b 100644 --- a/src/WallpaperEngine/Application/CWallpaperApplication.h +++ b/src/WallpaperEngine/Application/CWallpaperApplication.h @@ -42,7 +42,7 @@ namespace WallpaperEngine::Application { */ class CWallpaperApplication { public: - explicit CWallpaperApplication (CApplicationContext& context, WallpaperEngine::WebBrowser::CWebBrowserContext& browserContext); + explicit CWallpaperApplication (CApplicationContext& context); ~CWallpaperApplication (); /** @@ -101,6 +101,10 @@ class CWallpaperApplication { * @param project */ void setupPropertiesForProject (const Core::CProject* project); + /** + * Prepares CEF browser to be used + */ + void setupBrowser (); /** * Takes an screenshot of the background and saves it to the specified path * @@ -120,6 +124,6 @@ class CWallpaperApplication { WallpaperEngine::Render::CRenderContext* m_renderContext; WallpaperEngine::Render::Drivers::CVideoDriver* m_videoDriver; WallpaperEngine::Render::Drivers::Detectors::CFullScreenDetector* m_fullScreenDetector; - WallpaperEngine::WebBrowser::CWebBrowserContext& m_browserContext; + WallpaperEngine::WebBrowser::CWebBrowserContext* m_browserContext; }; } // namespace WallpaperEngine::Application diff --git a/src/WallpaperEngine/Assets/CDirectory.cpp b/src/WallpaperEngine/Assets/CDirectory.cpp index 004195f..4464f33 100644 --- a/src/WallpaperEngine/Assets/CDirectory.cpp +++ b/src/WallpaperEngine/Assets/CDirectory.cpp @@ -36,6 +36,8 @@ const uint8_t* CDirectory::readFile (const std::string& filename, uint32_t* leng return it->second.address; } + // TODO: PREVENT ESCAPING THE BASE PATH ON INITIALIZATION + FILE* fp = fopen (final.c_str (), "rb"); if (fp == nullptr) diff --git a/src/WallpaperEngine/Core/CObject.cpp b/src/WallpaperEngine/Core/CObject.cpp index 817ca74..8252447 100644 --- a/src/WallpaperEngine/Core/CObject.cpp +++ b/src/WallpaperEngine/Core/CObject.cpp @@ -15,7 +15,7 @@ using namespace WallpaperEngine::Core; using namespace WallpaperEngine::Assets; using namespace WallpaperEngine::Core::UserSettings; -CObject::CObject (CScene* scene, CUserSettingBoolean* visible, int id, std::string name, std::string type, +CObject::CObject (Wallpapers::CScene* scene, CUserSettingBoolean* visible, int id, std::string name, std::string type, CUserSettingVector3* origin, CUserSettingVector3* scale, const glm::vec3& angles) : m_scene (scene), m_visible (visible), @@ -26,7 +26,7 @@ CObject::CObject (CScene* scene, CUserSettingBoolean* visible, int id, std::stri m_scale (scale), m_angles (angles) {} -CObject* CObject::fromJSON (json data, CScene* scene, CContainer* container) { +CObject* CObject::fromJSON (json data, Wallpapers::CScene* scene, CContainer* container) { std::string json = data.dump (); auto id_it = jsonFindRequired (data, "id", "Objects must have id"); @@ -117,7 +117,7 @@ bool CObject::isVisible () const { return this->m_visible->processValue (this->getScene ()->getProject ().getProperties ()); } -CScene* CObject::getScene () const { +Wallpapers::CScene* CObject::getScene () const { return this->m_scene; } diff --git a/src/WallpaperEngine/Core/CObject.h b/src/WallpaperEngine/Core/CObject.h index 4269cf3..e99bc31 100644 --- a/src/WallpaperEngine/Core/CObject.h +++ b/src/WallpaperEngine/Core/CObject.h @@ -8,7 +8,7 @@ #include "WallpaperEngine/Core/UserSettings/CUserSettingFloat.h" #include "WallpaperEngine/Core/UserSettings/CUserSettingVector3.h" -namespace WallpaperEngine::Core { +namespace WallpaperEngine::Core::Wallpapers { class CScene; } @@ -26,10 +26,10 @@ using namespace WallpaperEngine::Assets; using namespace WallpaperEngine::Core::UserSettings; class CObject { - friend class CScene; + friend class Wallpapers::CScene; public: - static CObject* fromJSON (json data, CScene* scene, CContainer* container); + static CObject* fromJSON (json data, Wallpapers::CScene* scene, CContainer* container); template const T* as () const { assert (is ()); @@ -55,10 +55,10 @@ class CObject { [[nodiscard]] const std::string& getName () const; [[nodiscard]] bool isVisible () const; - [[nodiscard]] CScene* getScene () const; + [[nodiscard]] Wallpapers::CScene* getScene () const; protected: - CObject (CScene* scene, CUserSettingBoolean* visible, int id, std::string name, std::string type, + CObject (Wallpapers::CScene* scene, CUserSettingBoolean* visible, int id, std::string name, std::string type, CUserSettingVector3* origin, CUserSettingVector3* scale, const glm::vec3& angles); void insertEffect (Objects::CEffect* effect); @@ -77,6 +77,6 @@ class CObject { std::vector m_effects; std::vector m_dependencies; - CScene* m_scene; + Wallpapers::CScene* m_scene; }; } // namespace WallpaperEngine::Core diff --git a/src/WallpaperEngine/Core/CProject.cpp b/src/WallpaperEngine/Core/CProject.cpp index 712c34b..c85230d 100644 --- a/src/WallpaperEngine/Core/CProject.cpp +++ b/src/WallpaperEngine/Core/CProject.cpp @@ -1,25 +1,35 @@ #include "common.h" #include +#include + #include "CProject.h" #include "WallpaperEngine/Core/Wallpapers/CScene.h" #include "WallpaperEngine/Core/Wallpapers/CVideo.h" #include "WallpaperEngine/Core/Wallpapers/CWeb.h" using namespace WallpaperEngine::Core; +using namespace WallpaperEngine::Core::Wallpapers; using namespace WallpaperEngine::Assets; -CProject::CProject (std::string title, std::string type, CContainer* container) : +static int backgroundId = -1; + +CProject::CProject (std::string title, std::string type, std::string workshopid, CContainer* container) : m_title (std::move (title)), m_type (std::move (type)), m_wallpaper (nullptr), - m_container (container) {} + m_container (container), + m_workshopid(std::move(workshopid)) +{} CProject* CProject::fromFile (const std::string& filename, CContainer* container) { json content = json::parse (container->readFileAsString (filename)); std::string dependency = jsonFindDefault (content, "dependency", "No dependency"); if (dependency == "No dependency") { + // workshopid is not required, but we have to use it for some identification stuff, + // so using a static, decreasing number should be enough + std::string workshopid = jsonFindDefault (content, "workshopid", std::to_string (backgroundId--)); std::string title = *jsonFindRequired (content, "title", "Project title missing"); std::string type = *jsonFindRequired (content, "type", "Project type missing"); std::string file = *jsonFindRequired (content, "file", "Project's main file missing"); @@ -28,7 +38,7 @@ CProject* CProject::fromFile (const std::string& filename, CContainer* container std::transform (type.begin (), type.end (), type.begin (), tolower); - CProject* project = new CProject (title, type, container); + CProject* project = new CProject (title, type, workshopid, container); if (type == "scene") wallpaper = CScene::fromFile (file, *project, container); @@ -78,6 +88,10 @@ const std::vector& CProject::getProperties () const { return this->m_properties; } +const std::string& CProject::getWorkshopId () const { + return this->m_workshopid; +} + CContainer* CProject::getContainer () { return this->m_container; } diff --git a/src/WallpaperEngine/Core/CProject.h b/src/WallpaperEngine/Core/CProject.h index 7f48677..3bb7aa7 100644 --- a/src/WallpaperEngine/Core/CProject.h +++ b/src/WallpaperEngine/Core/CProject.h @@ -16,16 +16,17 @@ class CProject { public: static CProject* fromFile (const std::string& filename, CContainer* container); - CWallpaper* getWallpaper () const; + [[nodiscard]] CWallpaper* getWallpaper () const; - const std::string& getTitle () const; - const std::string& getType () const; - const std::vector& getProperties () const; + [[nodiscard]] const std::string& getTitle () const; + [[nodiscard]] const std::string& getType () const; + [[nodiscard]] const std::vector& getProperties () const; + [[nodiscard]] const std::string& getWorkshopId () const; CContainer* getContainer (); protected: - CProject (std::string title, std::string type, CContainer* container); + CProject (std::string title, std::string type, std::string workshopid, CContainer* container); void setWallpaper (CWallpaper* wallpaper); void insertProperty (Projects::CProperty* property); @@ -33,6 +34,7 @@ class CProject { private: std::vector m_properties; + std::string m_workshopid; std::string m_title; std::string m_type; CWallpaper* m_wallpaper; diff --git a/src/WallpaperEngine/Core/CWallpaper.h b/src/WallpaperEngine/Core/CWallpaper.h index 5b81a00..780e2c9 100644 --- a/src/WallpaperEngine/Core/CWallpaper.h +++ b/src/WallpaperEngine/Core/CWallpaper.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include "CProject.h" diff --git a/src/WallpaperEngine/Core/Objects/CImage.cpp b/src/WallpaperEngine/Core/Objects/CImage.cpp index 01e10c3..fe96ce3 100644 --- a/src/WallpaperEngine/Core/Objects/CImage.cpp +++ b/src/WallpaperEngine/Core/Objects/CImage.cpp @@ -10,7 +10,7 @@ using namespace WallpaperEngine::Core::Objects; using namespace WallpaperEngine::Core::UserSettings; -CImage::CImage (CScene* scene, Images::CMaterial* material, CUserSettingBoolean* visible, int id, std::string name, +CImage::CImage (Wallpapers::CScene* scene, Images::CMaterial* material, CUserSettingBoolean* visible, int id, std::string name, CUserSettingVector3* origin, CUserSettingVector3* scale, const glm::vec3& angles, const glm::vec2& size, std::string alignment, CUserSettingVector3* color, CUserSettingFloat* alpha, float brightness, uint32_t colorBlendMode, const glm::vec2& parallaxDepth, bool fullscreen, bool passthrough, @@ -28,7 +28,7 @@ CImage::CImage (CScene* scene, Images::CMaterial* material, CUserSettingBoolean* m_passthrough (passthrough), m_autosize (autosize) {} -WallpaperEngine::Core::CObject* CImage::fromJSON (CScene* scene, json data, CContainer* container, +WallpaperEngine::Core::CObject* CImage::fromJSON (Wallpapers::CScene* scene, json data, CContainer* container, CUserSettingBoolean* visible, int id, std::string name, CUserSettingVector3* origin, CUserSettingVector3* scale, const glm::vec3& angles) { diff --git a/src/WallpaperEngine/Core/Objects/CImage.h b/src/WallpaperEngine/Core/Objects/CImage.h index d8e1145..eb6f8f1 100644 --- a/src/WallpaperEngine/Core/Objects/CImage.h +++ b/src/WallpaperEngine/Core/Objects/CImage.h @@ -11,7 +11,7 @@ #include "WallpaperEngine/Core/UserSettings/CUserSettingFloat.h" #include "WallpaperEngine/Core/UserSettings/CUserSettingVector3.h" -namespace WallpaperEngine::Core { +namespace WallpaperEngine::Core::Wallpapers { class CScene; } @@ -27,7 +27,7 @@ class CImage : public CObject { friend class CObject; public: - static CObject* fromJSON (CScene* scene, json data, CContainer* container, CUserSettingBoolean* visible, + static CObject* fromJSON (Wallpapers::CScene* scene, json data, CContainer* container, CUserSettingBoolean* visible, int id, std::string name, CUserSettingVector3* origin, CUserSettingVector3* scale, const glm::vec3& angles); @@ -77,7 +77,7 @@ class CImage : public CObject { [[nodiscard]] bool isAutosize () const; protected: - CImage (CScene* scene, Images::CMaterial* material, CUserSettingBoolean* visible, int id, std::string name, + CImage (Wallpapers::CScene* scene, Images::CMaterial* material, CUserSettingBoolean* visible, int id, std::string name, CUserSettingVector3* origin, CUserSettingVector3* scale, const glm::vec3& angles, const glm::vec2& size, std::string alignment, CUserSettingVector3* color, CUserSettingFloat* alpha, float brightness, uint32_t colorBlendMode, const glm::vec2& parallaxDepth, bool fullscreen, bool passthrough, bool autosize); diff --git a/src/WallpaperEngine/Core/Objects/CParticle.cpp b/src/WallpaperEngine/Core/Objects/CParticle.cpp index 725f0b5..85f8b8e 100644 --- a/src/WallpaperEngine/Core/Objects/CParticle.cpp +++ b/src/WallpaperEngine/Core/Objects/CParticle.cpp @@ -4,7 +4,7 @@ using namespace WallpaperEngine::Core::Objects; -CParticle* CParticle::fromFile (CScene* scene, const std::string& filename, CContainer* container, +CParticle* CParticle::fromFile (Wallpapers::CScene* scene, const std::string& filename, CContainer* container, CUserSettingBoolean* visible, int id, std::string name, CUserSettingVector3* origin, CUserSettingVector3* scale) { json data = json::parse (container->readFileAsString (filename)); @@ -28,7 +28,7 @@ CParticle* CParticle::fromFile (CScene* scene, const std::string& filename, CCon return particle; } -CParticle::CParticle (CScene* scene, uint32_t starttime, uint32_t maxcount, CUserSettingBoolean* visible, int id, +CParticle::CParticle (Wallpapers::CScene* scene, uint32_t starttime, uint32_t maxcount, CUserSettingBoolean* visible, int id, std::string name, CUserSettingVector3* origin, CUserSettingVector3* scale) : CObject (scene, visible, id, std::move (name), Type, origin, scale, glm::vec3 ()), m_starttime (starttime), diff --git a/src/WallpaperEngine/Core/Objects/CParticle.h b/src/WallpaperEngine/Core/Objects/CParticle.h index 9d288a2..557ca2d 100644 --- a/src/WallpaperEngine/Core/Objects/CParticle.h +++ b/src/WallpaperEngine/Core/Objects/CParticle.h @@ -17,7 +17,7 @@ class CParticle : public CObject { friend class CObject; public: - static CParticle* fromFile (CScene* scene, const std::string& filename, CContainer* container, + static CParticle* fromFile (Wallpapers::CScene* scene, const std::string& filename, CContainer* container, CUserSettingBoolean* visible, int id, std::string name, CUserSettingVector3* origin, CUserSettingVector3* scale); @@ -35,7 +35,7 @@ class CParticle : public CObject { [[nodiscard]] const std::vector& getInitializers () const; protected: - CParticle (CScene* scene, uint32_t starttime, uint32_t maxcount, CUserSettingBoolean* visible, int id, + CParticle (Wallpapers::CScene* scene, uint32_t starttime, uint32_t maxcount, CUserSettingBoolean* visible, int id, std::string name, CUserSettingVector3* origin, CUserSettingVector3* scale); /** diff --git a/src/WallpaperEngine/Core/Objects/CSound.cpp b/src/WallpaperEngine/Core/Objects/CSound.cpp index e6e9238..d46f6e8 100644 --- a/src/WallpaperEngine/Core/Objects/CSound.cpp +++ b/src/WallpaperEngine/Core/Objects/CSound.cpp @@ -4,12 +4,12 @@ using namespace WallpaperEngine::Core::Objects; -CSound::CSound (CScene* scene, CUserSettingBoolean* visible, int id, std::string name, CUserSettingVector3* origin, +CSound::CSound (Wallpapers::CScene* scene, CUserSettingBoolean* visible, int id, std::string name, CUserSettingVector3* origin, CUserSettingVector3* scale, const glm::vec3& angles, bool repeat) : CObject (scene, visible, id, std::move (name), Type, origin, scale, angles), m_repeat (repeat) {} -WallpaperEngine::Core::CObject* CSound::fromJSON (CScene* scene, json data, CUserSettingBoolean* visible, int id, +WallpaperEngine::Core::CObject* CSound::fromJSON (Wallpapers::CScene* scene, json data, CUserSettingBoolean* visible, int id, const std::string& name, CUserSettingVector3* origin, CUserSettingVector3* scale, const glm::vec3& angles) { bool repeat = false; diff --git a/src/WallpaperEngine/Core/Objects/CSound.h b/src/WallpaperEngine/Core/Objects/CSound.h index 783af9f..7028ae5 100644 --- a/src/WallpaperEngine/Core/Objects/CSound.h +++ b/src/WallpaperEngine/Core/Objects/CSound.h @@ -4,6 +4,10 @@ #include "WallpaperEngine/Core/Core.h" #include "WallpaperEngine/Core/UserSettings/CUserSettingBoolean.h" +namespace WallpaperEngine::Core::Wallpapers { +class CScene; +} + namespace WallpaperEngine::Core::Objects { using json = nlohmann::json; using namespace WallpaperEngine::Core::UserSettings; @@ -15,7 +19,7 @@ class CSound : public CObject { friend class CObject; public: - static CObject* fromJSON (CScene* scene, json data, CUserSettingBoolean* visible, int id, + static CObject* fromJSON (Wallpapers::CScene* scene, json data, CUserSettingBoolean* visible, int id, const std::string& name, CUserSettingVector3* origin, CUserSettingVector3* scale, const glm::vec3& angles); @@ -29,7 +33,7 @@ class CSound : public CObject { [[nodiscard]] bool isRepeat () const; protected: - CSound (CScene* scene, CUserSettingBoolean* visible, int id, std::string name, CUserSettingVector3* origin, + CSound (Wallpapers::CScene* scene, CUserSettingBoolean* visible, int id, std::string name, CUserSettingVector3* origin, CUserSettingVector3* scale, const glm::vec3& angles, bool repeat); /** diff --git a/src/WallpaperEngine/Core/Wallpapers/CScene.cpp b/src/WallpaperEngine/Core/Wallpapers/CScene.cpp index 5dd35c9..4ab6259 100644 --- a/src/WallpaperEngine/Core/Wallpapers/CScene.cpp +++ b/src/WallpaperEngine/Core/Wallpapers/CScene.cpp @@ -6,6 +6,7 @@ #include "WallpaperEngine/Core/UserSettings/CUserSettingVector3.h" using namespace WallpaperEngine::Core; +using namespace WallpaperEngine::Core::Wallpapers; CScene::CScene (CProject& project, CContainer* container, Scenes::CCamera* camera, glm::vec3 ambientColor, CUserSettingBoolean* bloom, CUserSettingFloat* bloomStrength, CUserSettingFloat* bloomThreshold, diff --git a/src/WallpaperEngine/Core/Wallpapers/CScene.h b/src/WallpaperEngine/Core/Wallpapers/CScene.h index 3062596..86ffbef 100644 --- a/src/WallpaperEngine/Core/Wallpapers/CScene.h +++ b/src/WallpaperEngine/Core/Wallpapers/CScene.h @@ -9,9 +9,11 @@ #include "WallpaperEngine/Core/Scenes/CProjection.h" namespace WallpaperEngine::Core { -using json = nlohmann::json; - class CObject; +} + +namespace WallpaperEngine::Core::Wallpapers { +using json = nlohmann::json; class CScene : public CWallpaper { public: diff --git a/src/WallpaperEngine/Core/Wallpapers/CVideo.cpp b/src/WallpaperEngine/Core/Wallpapers/CVideo.cpp index 385f0b3..81df2a9 100644 --- a/src/WallpaperEngine/Core/Wallpapers/CVideo.cpp +++ b/src/WallpaperEngine/Core/Wallpapers/CVideo.cpp @@ -3,6 +3,7 @@ #include using namespace WallpaperEngine::Core; +using namespace WallpaperEngine::Core::Wallpapers; CVideo::CVideo (std::string filename, CProject& project) : CWallpaper (Type, project), diff --git a/src/WallpaperEngine/Core/Wallpapers/CVideo.h b/src/WallpaperEngine/Core/Wallpapers/CVideo.h index a2ace06..c8d4711 100644 --- a/src/WallpaperEngine/Core/Wallpapers/CVideo.h +++ b/src/WallpaperEngine/Core/Wallpapers/CVideo.h @@ -10,7 +10,7 @@ extern "C" { #include } -namespace WallpaperEngine::Core { +namespace WallpaperEngine::Core::Wallpapers { class CVideo : public CWallpaper { public: explicit CVideo (std::string filename, CProject& project); diff --git a/src/WallpaperEngine/Core/Wallpapers/CWeb.cpp b/src/WallpaperEngine/Core/Wallpapers/CWeb.cpp index be38213..aedb3d1 100644 --- a/src/WallpaperEngine/Core/Wallpapers/CWeb.cpp +++ b/src/WallpaperEngine/Core/Wallpapers/CWeb.cpp @@ -4,6 +4,7 @@ #include using namespace WallpaperEngine::Core; +using namespace WallpaperEngine::Core::Wallpapers; const std::string& CWeb::getFilename () { return this->m_filename; diff --git a/src/WallpaperEngine/Core/Wallpapers/CWeb.h b/src/WallpaperEngine/Core/Wallpapers/CWeb.h index ffeda01..ded9dd3 100644 --- a/src/WallpaperEngine/Core/Wallpapers/CWeb.h +++ b/src/WallpaperEngine/Core/Wallpapers/CWeb.h @@ -16,7 +16,7 @@ extern "C" #include } -namespace WallpaperEngine::Core +namespace WallpaperEngine::Core::Wallpapers { class CWeb : public CWallpaper { @@ -24,7 +24,7 @@ namespace WallpaperEngine::Core explicit CWeb (std::string filename, CProject& project); const std::string& getFilename (); - + protected: friend class CWallpaper; diff --git a/src/WallpaperEngine/Render/CCamera.cpp b/src/WallpaperEngine/Render/CCamera.cpp index 783cf25..875559f 100644 --- a/src/WallpaperEngine/Render/CCamera.cpp +++ b/src/WallpaperEngine/Render/CCamera.cpp @@ -6,7 +6,7 @@ using namespace WallpaperEngine; using namespace WallpaperEngine::Render; -CCamera::CCamera (CScene* scene, const Core::Scenes::CCamera* camera) : +CCamera::CCamera (Wallpapers::CScene* scene, const Core::Scenes::CCamera* camera) : m_camera (camera), m_scene (scene), m_isOrthogonal (false), @@ -43,7 +43,7 @@ bool CCamera::isOrthogonal () const { return this->m_isOrthogonal; } -CScene* CCamera::getScene () const { +Wallpapers::CScene* CCamera::getScene () const { return this->m_scene; } diff --git a/src/WallpaperEngine/Render/CCamera.h b/src/WallpaperEngine/Render/CCamera.h index c23cc31..fd5a4fa 100644 --- a/src/WallpaperEngine/Render/CCamera.h +++ b/src/WallpaperEngine/Render/CCamera.h @@ -7,12 +7,14 @@ #include "WallpaperEngine/Core/Scenes/CCamera.h" -namespace WallpaperEngine::Render { +namespace WallpaperEngine::Render::Wallpapers { class CScene; +} +namespace WallpaperEngine::Render { class CCamera { public: - CCamera (CScene* scene, const Core::Scenes::CCamera* camera); + CCamera (Wallpapers::CScene* scene, const Core::Scenes::CCamera* camera); ~CCamera (); void setOrthogonalProjection (float width, float height); @@ -22,7 +24,7 @@ class CCamera { const glm::vec3& getUp () const; const glm::mat4& getProjection () const; const glm::mat4& getLookAt () const; - CScene* getScene () const; + Wallpapers::CScene* getScene () const; bool isOrthogonal () const; private: @@ -30,6 +32,6 @@ class CCamera { glm::mat4 m_projection; glm::mat4 m_lookat; const Core::Scenes::CCamera* m_camera; - CScene* m_scene; + Wallpapers::CScene* m_scene; }; } // namespace WallpaperEngine::Render diff --git a/src/WallpaperEngine/Render/CObject.cpp b/src/WallpaperEngine/Render/CObject.cpp index ca05c35..763347f 100644 --- a/src/WallpaperEngine/Render/CObject.cpp +++ b/src/WallpaperEngine/Render/CObject.cpp @@ -4,14 +4,15 @@ using namespace WallpaperEngine; using namespace WallpaperEngine::Render; +using namespace WallpaperEngine::Render::Wallpapers; -CObject::CObject (CScene* scene, std::string type, Core::CObject* object) : +CObject::CObject (Wallpapers::CScene* scene, std::string type, Core::CObject* object) : Helpers::CContextAware (scene), m_scene (scene), m_object (object), m_type (std::move (type)) {} -CScene* CObject::getScene () const { +Wallpapers::CScene* CObject::getScene () const { return this->m_scene; } diff --git a/src/WallpaperEngine/Render/CObject.h b/src/WallpaperEngine/Render/CObject.h index 556db13..03f448e 100644 --- a/src/WallpaperEngine/Render/CObject.h +++ b/src/WallpaperEngine/Render/CObject.h @@ -7,9 +7,11 @@ #include "WallpaperEngine/Render/Wallpapers/CScene.h" -namespace WallpaperEngine::Render { +namespace WallpaperEngine::Render::Wallpapers { class CScene; +} +namespace WallpaperEngine::Render { class CObject : public Helpers::CContextAware { public: template const T* as () const { @@ -28,18 +30,18 @@ class CObject : public Helpers::CContextAware { virtual void render () = 0; - [[nodiscard]] CScene* getScene () const; + [[nodiscard]] Wallpapers::CScene* getScene () const; [[nodiscard]] CContainer* getContainer () const; [[nodiscard]] int getId () const; protected: - CObject (CScene* scene, std::string type, Core::CObject* object); + CObject (Wallpapers::CScene* scene, std::string type, Core::CObject* object); ~CObject () override = default; private: std::string m_type; - CScene* m_scene; + Wallpapers::CScene* m_scene; Core::CObject* m_object; }; } // namespace WallpaperEngine::Render \ No newline at end of file diff --git a/src/WallpaperEngine/Render/CWallpaper.cpp b/src/WallpaperEngine/Render/CWallpaper.cpp index 801bf41..25c79b3 100644 --- a/src/WallpaperEngine/Render/CWallpaper.cpp +++ b/src/WallpaperEngine/Render/CWallpaper.cpp @@ -282,14 +282,14 @@ CFBO* CWallpaper::getFBO () const { } CWallpaper* CWallpaper::fromWallpaper (Core::CWallpaper* wallpaper, CRenderContext& context, - CAudioContext& audioContext, CWebBrowserContext& browserContext, + CAudioContext& audioContext, WebBrowser::CWebBrowserContext& browserContext, const CWallpaperState::TextureUVsScaling& scalingMode) { - if (wallpaper->is ()) - return new WallpaperEngine::Render::CScene (wallpaper->as (), context, audioContext, scalingMode); - if (wallpaper->is ()) - return new WallpaperEngine::Render::CVideo (wallpaper->as (), context, audioContext, scalingMode); - else if (wallpaper->is ()) - return new WallpaperEngine::Render::CWeb (wallpaper->as (), context, audioContext, browserContext, + if (wallpaper->is ()) + return new WallpaperEngine::Render::Wallpapers::CScene (wallpaper->as (), context, audioContext, scalingMode); + if (wallpaper->is ()) + return new WallpaperEngine::Render::Wallpapers::CVideo (wallpaper->as (), context, audioContext, scalingMode); + else if (wallpaper->is ()) + return new WallpaperEngine::Render::Wallpapers::CWeb (wallpaper->as (), context, audioContext, browserContext, scalingMode); else sLog.exception ("Unsupported wallpaper type"); diff --git a/src/WallpaperEngine/Render/CWallpaper.h b/src/WallpaperEngine/Render/CWallpaper.h index 57e6736..ef588ab 100644 --- a/src/WallpaperEngine/Render/CWallpaper.h +++ b/src/WallpaperEngine/Render/CWallpaper.h @@ -14,13 +14,14 @@ #include "WallpaperEngine/Render/CRenderContext.h" #include "WallpaperEngine/Render/Helpers/CContextAware.h" -#include "WallpaperEngine/WebBrowser/CWebBrowserContext.h" - #include "CWallpaperState.h" using namespace WallpaperEngine::Assets; using namespace WallpaperEngine::Audio; -using namespace WallpaperEngine::WebBrowser; + +namespace WallpaperEngine::WebBrowser { +class CWebBrowserContext; +} namespace WallpaperEngine::Render { namespace Helpers { @@ -146,7 +147,7 @@ class CWallpaper : public Helpers::CContextAware { * @return */ static CWallpaper* fromWallpaper (Core::CWallpaper* wallpaper, CRenderContext& context, CAudioContext& audioContext, - CWebBrowserContext& browserContext, + WebBrowser::CWebBrowserContext& browserContext, const CWallpaperState::TextureUVsScaling& scalingMode); protected: diff --git a/src/WallpaperEngine/Render/Objects/CImage.cpp b/src/WallpaperEngine/Render/Objects/CImage.cpp index ee10d4e..94f4439 100644 --- a/src/WallpaperEngine/Render/Objects/CImage.cpp +++ b/src/WallpaperEngine/Render/Objects/CImage.cpp @@ -4,7 +4,7 @@ using namespace WallpaperEngine; using namespace WallpaperEngine::Render::Objects; -CImage::CImage (CScene* scene, Core::Objects::CImage* image) : +CImage::CImage (Wallpapers::CScene* scene, Core::Objects::CImage* image) : Render::CObject (scene, Type, image), m_image (image), m_animationTime (0.0), diff --git a/src/WallpaperEngine/Render/Objects/CImage.h b/src/WallpaperEngine/Render/Objects/CImage.h index 8ca5ae7..f412448 100644 --- a/src/WallpaperEngine/Render/Objects/CImage.h +++ b/src/WallpaperEngine/Render/Objects/CImage.h @@ -29,7 +29,7 @@ class CImage final : public CObject { friend CObject; public: - CImage (CScene* scene, Core::Objects::CImage* image); + CImage (Wallpapers::CScene* scene, Core::Objects::CImage* image); void setup (); void render () override; diff --git a/src/WallpaperEngine/Render/Objects/CSound.cpp b/src/WallpaperEngine/Render/Objects/CSound.cpp index 4321f51..1fe662e 100644 --- a/src/WallpaperEngine/Render/Objects/CSound.cpp +++ b/src/WallpaperEngine/Render/Objects/CSound.cpp @@ -4,7 +4,7 @@ using namespace WallpaperEngine::Render::Objects; -CSound::CSound (CScene* scene, Core::Objects::CSound* sound) : CObject (scene, Type, sound), m_sound (sound) { +CSound::CSound (Wallpapers::CScene* scene, Core::Objects::CSound* sound) : CObject (scene, Type, sound), m_sound (sound) { if (this->getContext ().getApp ().getContext ().settings.audio.enabled) this->load (); } diff --git a/src/WallpaperEngine/Render/Objects/CSound.h b/src/WallpaperEngine/Render/Objects/CSound.h index 96d31c2..53770fc 100644 --- a/src/WallpaperEngine/Render/Objects/CSound.h +++ b/src/WallpaperEngine/Render/Objects/CSound.h @@ -7,10 +7,14 @@ using namespace WallpaperEngine; +namespace WallpaperEngine::Render::Wallpapers { +class CScene; +} + namespace WallpaperEngine::Render::Objects { class CSound final : public CObject { public: - CSound (CScene* scene, Core::Objects::CSound* sound); + CSound (Wallpapers::CScene* scene, Core::Objects::CSound* sound); ~CSound () override; void render () override; diff --git a/src/WallpaperEngine/Render/Wallpapers/CScene.cpp b/src/WallpaperEngine/Render/Wallpapers/CScene.cpp index 3c2cc7f..799dcee 100644 --- a/src/WallpaperEngine/Render/Wallpapers/CScene.cpp +++ b/src/WallpaperEngine/Render/Wallpapers/CScene.cpp @@ -15,8 +15,9 @@ extern float g_TimeLast; using namespace WallpaperEngine; using namespace WallpaperEngine::Render; +using namespace WallpaperEngine::Render::Wallpapers; -CScene::CScene (Core::CScene* scene, CRenderContext& context, CAudioContext& audioContext, +CScene::CScene (Core::Wallpapers::CScene* scene, CRenderContext& context, CAudioContext& audioContext, const CWallpaperState::TextureUVsScaling& scalingMode) : CWallpaper (scene, Type, context, audioContext, scalingMode), m_mousePosition (), @@ -241,8 +242,8 @@ void CScene::updateMouse (glm::ivec4 viewport) { // screen-space positions have to be transposed to what the screen will actually show } -Core::CScene* CScene::getScene () const { - return this->getWallpaperData ()->as (); +Core::Wallpapers::CScene* CScene::getScene () const { + return this->getWallpaperData ()->as (); } int CScene::getWidth () const { diff --git a/src/WallpaperEngine/Render/Wallpapers/CScene.h b/src/WallpaperEngine/Render/Wallpapers/CScene.h index 1ec53d0..9f2562b 100644 --- a/src/WallpaperEngine/Render/Wallpapers/CScene.h +++ b/src/WallpaperEngine/Render/Wallpapers/CScene.h @@ -9,15 +9,17 @@ namespace WallpaperEngine::Render { class CCamera; class CObject; +} +namespace WallpaperEngine::Render::Wallpapers { class CScene final : public CWallpaper { public: - CScene (Core::CScene* scene, CRenderContext& context, CAudioContext& audioContext, + CScene (Core::Wallpapers::CScene* scene, CRenderContext& context, CAudioContext& audioContext, const CWallpaperState::TextureUVsScaling& scalingMode); CCamera* getCamera () const; - Core::CScene* getScene () const; + Core::Wallpapers::CScene* getScene () const; int getWidth () const override; int getHeight () const override; @@ -48,4 +50,4 @@ class CScene final : public CWallpaper { CFBO* _rt_8FrameBuffer; CFBO* _rt_Bloom; }; -} // namespace WallpaperEngine::Render +} // namespace WallpaperEngine::Render::Wallpaper diff --git a/src/WallpaperEngine/Render/Wallpapers/CVideo.cpp b/src/WallpaperEngine/Render/Wallpapers/CVideo.cpp index 9e72f64..9705847 100644 --- a/src/WallpaperEngine/Render/Wallpapers/CVideo.cpp +++ b/src/WallpaperEngine/Render/Wallpapers/CVideo.cpp @@ -5,12 +5,13 @@ using namespace WallpaperEngine; using namespace WallpaperEngine::Render; +using namespace WallpaperEngine::Render::Wallpapers; void* get_proc_address (void* ctx, const char* name) { return static_cast (ctx)->getContext ().getDriver ().getProcAddress (name); } -CVideo::CVideo (Core::CVideo* video, CRenderContext& context, CAudioContext& audioContext, +CVideo::CVideo (Core::Wallpapers::CVideo* video, CRenderContext& context, CAudioContext& audioContext, const CWallpaperState::TextureUVsScaling& scalingMode) : CWallpaper (video, Type, context, audioContext, scalingMode), m_width (16), @@ -118,8 +119,8 @@ void CVideo::renderFrame (glm::ivec4 viewport) { mpv_render_context_render (this->m_mpvGl, params); } -Core::CVideo* CVideo::getVideo () { - return this->getWallpaperData ()->as (); +Core::Wallpapers::CVideo* CVideo::getVideo () { + return this->getWallpaperData ()->as (); } void CVideo::setPause (bool newState) { diff --git a/src/WallpaperEngine/Render/Wallpapers/CVideo.h b/src/WallpaperEngine/Render/Wallpapers/CVideo.h index a6c9830..71334dc 100644 --- a/src/WallpaperEngine/Render/Wallpapers/CVideo.h +++ b/src/WallpaperEngine/Render/Wallpapers/CVideo.h @@ -7,13 +7,13 @@ #include #include -namespace WallpaperEngine::Render { +namespace WallpaperEngine::Render::Wallpapers { class CVideo final : public CWallpaper { public: - CVideo (Core::CVideo* video, CRenderContext& context, CAudioContext& audioContext, + CVideo (Core::Wallpapers::CVideo* video, CRenderContext& context, CAudioContext& audioContext, const CWallpaperState::TextureUVsScaling& scalingMode); - Core::CVideo* getVideo (); + Core::Wallpapers::CVideo* getVideo (); [[nodiscard]] int getWidth () const override; [[nodiscard]] int getHeight () const override; @@ -36,4 +36,4 @@ class CVideo final : public CWallpaper { int64_t m_width; int64_t m_height; }; -} // namespace WallpaperEngine::Render +} // namespace WallpaperEngine::Render::Wallpapers diff --git a/src/WallpaperEngine/Render/Wallpapers/CWeb.cpp b/src/WallpaperEngine/Render/Wallpapers/CWeb.cpp index a7c751d..9f831ad 100644 --- a/src/WallpaperEngine/Render/Wallpapers/CWeb.cpp +++ b/src/WallpaperEngine/Render/Wallpapers/CWeb.cpp @@ -2,11 +2,15 @@ // https://github.com/if1live/cef-gl-example // https://github.com/andmcgregor/cefgui #include "CWeb.h" +#include "WallpaperEngine/WebBrowser/CEF/CWPSchemeHandlerFactory.h" using namespace WallpaperEngine::Render; -using namespace WallpaperEngine::WebBrowser; +using namespace WallpaperEngine::Render::Wallpapers; -CWeb::CWeb (Core::CWeb* web, CRenderContext& context, CAudioContext& audioContext, CWebBrowserContext& browserContext, +using namespace WallpaperEngine::WebBrowser; +using namespace WallpaperEngine::WebBrowser::CEF; + +CWeb::CWeb (Core::Wallpapers::CWeb* web, CRenderContext& context, CAudioContext& audioContext, CWebBrowserContext& browserContext, const CWallpaperState::TextureUVsScaling& scalingMode) : CWallpaper (web, Type, context, audioContext, scalingMode), m_width (16), @@ -18,26 +22,26 @@ CWeb::CWeb (Core::CWeb* web, CRenderContext& context, CAudioContext& audioContex m_mousePosition(), m_mousePositionLast(), m_client () { - this->m_browserContext.markAsUsed (); // setup framebuffers this->setupFramebuffers (); CefWindowInfo window_info; window_info.SetAsWindowless (0); - this->m_render_handler = new RenderHandler (this); + this->m_renderHandler = new WebBrowser::CEF::CRenderHandler (this); CefBrowserSettings browserSettings; // Documentaion says that 60 fps is maximum value browserSettings.windowless_frame_rate = std::max (60, context.getApp ().getContext ().settings.render.maximumFPS); - m_client = new BrowserClient (m_render_handler); - std::filesystem::path htmlpath = - this->getWeb ()->getProject ().getContainer ()->resolveRealFile (this->getWeb ()->getFilename ()); - // To open local file in browser URL must be "file:///path/to/file.html" - const std::string htmlURL = std::string ("file:///") + htmlpath.c_str (); - m_browser = - CefBrowserHost::CreateBrowserSync (window_info, m_client.get (), htmlURL, browserSettings, nullptr, nullptr); + this->m_client = new WebBrowser::CEF::CBrowserClient (m_renderHandler); + // use the custom scheme for the wallpaper's files + const std::string htmlURL = + CWPSchemeHandlerFactory::generateSchemeName(this->getWeb ()->getProject ().getWorkshopId ()) + + "://" + + this->getWeb()->getFilename (); + this->m_browser = + CefBrowserHost::CreateBrowserSync (window_info, this->m_client, htmlURL, browserSettings, nullptr, nullptr); } void CWeb::setSize (int width, int height) { @@ -54,7 +58,7 @@ void CWeb::setSize (int width, int height) { nullptr); // Notify cef that it was resized(maybe it's not even needed) - m_browser->GetHost ()->WasResized (); + this->m_browser->GetHost ()->WasResized (); } void CWeb::renderFrame (glm::ivec4 viewport) { @@ -94,15 +98,15 @@ void CWeb::updateMouse (glm::ivec4 viewport) { evt.x = std::clamp (int (position.x - viewport.x), 0, viewport.z); evt.y = std::clamp (int (position.y - viewport.y), 0, viewport.w); // Send mouse position to cef - m_browser->GetHost ()->SendMouseMoveEvent (evt, false); + this->m_browser->GetHost ()->SendMouseMoveEvent (evt, false); // TODO: ANY OTHER MOUSE EVENTS TO SEND? if (leftClick != this->m_leftClick) { - m_browser->GetHost ()->SendMouseClickEvent (evt, CefBrowserHost::MouseButtonType::MBT_LEFT, leftClick == WallpaperEngine::Input::MouseClickStatus::Released, 1); + this->m_browser->GetHost ()->SendMouseClickEvent (evt, CefBrowserHost::MouseButtonType::MBT_LEFT, leftClick == WallpaperEngine::Input::MouseClickStatus::Released, 1); } if (rightClick != this->m_rightClick) { - m_browser->GetHost ()->SendMouseClickEvent (evt, CefBrowserHost::MouseButtonType::MBT_RIGHT, rightClick == WallpaperEngine::Input::MouseClickStatus::Released, 1); + this->m_browser->GetHost ()->SendMouseClickEvent (evt, CefBrowserHost::MouseButtonType::MBT_RIGHT, rightClick == WallpaperEngine::Input::MouseClickStatus::Released, 1); } this->m_leftClick = leftClick; @@ -111,24 +115,9 @@ void CWeb::updateMouse (glm::ivec4 viewport) { CWeb::~CWeb () { CefDoMessageLoopWork (); - m_browser->GetHost ()->CloseBrowser (true); -} + this->m_browser->GetHost ()->CloseBrowser (true); -CWeb::RenderHandler::RenderHandler (CWeb* webdata) : m_webdata (webdata) {} - -// Required by CEF -void CWeb::RenderHandler::GetViewRect (CefRefPtr browser, CefRect& rect) { - rect = CefRect (0, 0, this->m_webdata->getWidth (), this->m_webdata->getHeight ()); -} - -// Will be executed in CEF message loop -void CWeb::RenderHandler::OnPaint (CefRefPtr browser, PaintElementType type, const RectList& dirtyRects, - const void* buffer, int width, int height) { - // sLog.debug("BrowserView::RenderHandler::OnPaint"); - glActiveTexture (GL_TEXTURE0); - glBindTexture (GL_TEXTURE_2D, this->texture ()); - glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, (unsigned char*) buffer); - glBindTexture (GL_TEXTURE_2D, 0); + delete this->m_renderHandler; } const std::string CWeb::Type = "web"; \ No newline at end of file diff --git a/src/WallpaperEngine/Render/Wallpapers/CWeb.h b/src/WallpaperEngine/Render/Wallpapers/CWeb.h index 858beb1..3609426 100644 --- a/src/WallpaperEngine/Render/Wallpapers/CWeb.h +++ b/src/WallpaperEngine/Render/Wallpapers/CWeb.h @@ -13,14 +13,19 @@ #include "WallpaperEngine/Audio/CAudioStream.h" #include "WallpaperEngine/Core/Wallpapers/CWeb.h" #include "WallpaperEngine/Render/CWallpaper.h" +#include "WallpaperEngine/WebBrowser/CEF/CBrowserClient.h" +#include "WallpaperEngine/WebBrowser/CEF/CRenderHandler.h" #include "common.h" -namespace WallpaperEngine::Render -{ +namespace WallpaperEngine::WebBrowser::CEF { +class CRenderHandler; +} + +namespace WallpaperEngine::Render::Wallpapers { class CWeb : public CWallpaper { public: - CWeb (Core::CWeb* scene, CRenderContext& context, CAudioContext& audioContext, WallpaperEngine::WebBrowser::CWebBrowserContext& browserContext, const CWallpaperState::TextureUVsScaling& scalingMode); + CWeb (Core::Wallpapers::CWeb* scene, CRenderContext& context, CAudioContext& audioContext, WallpaperEngine::WebBrowser::CWebBrowserContext& browserContext, const CWallpaperState::TextureUVsScaling& scalingMode); ~CWeb() override; [[nodiscard]] int getWidth () const override { return this->m_width; } @@ -31,9 +36,9 @@ namespace WallpaperEngine::Render protected: void renderFrame (glm::ivec4 viewport) override; void updateMouse (glm::ivec4 viewport); - Core::CWeb* getWeb () + Core::Wallpapers::CWeb* getWeb () { - return this->getWallpaperData ()->as (); + return this->getWallpaperData ()->as (); } friend class CWallpaper; @@ -41,70 +46,11 @@ namespace WallpaperEngine::Render static const std::string Type; private: - // ************************************************************************* - //! \brief Private implementation to handle CEF events to draw the web page. - // ************************************************************************* - class RenderHandler: public CefRenderHandler - { - public: - explicit RenderHandler(CWeb* webdata); - - //! \brief - ~RenderHandler() override = default; - - //! \brief CefRenderHandler interface - void GetViewRect(CefRefPtr browser, CefRect &rect) override; - - //! \brief CefRenderHandler interface - //! Update the OpenGL texture. - void OnPaint(CefRefPtr browser, PaintElementType type, - const RectList &dirtyRects, const void *buffer, - int width, int height) override; - - //! \brief CefBase interface - IMPLEMENT_REFCOUNTING(RenderHandler); - - private: - CWeb* m_webdata; - - int getWidth () const { - return this->m_webdata->getWidth(); - }; - int getHeight () const { - return this->m_webdata->getHeight(); - }; - //! \brief Return the OpenGL texture handle - GLuint texture() const - { - return this->m_webdata->getWallpaperFramebuffer(); - } - }; - - // ************************************************************************* - //! \brief Provide access to browser-instance-specific callbacks. A single - //! CefClient instance can be shared among any number of browsers. - // ************************************************************************* - class BrowserClient: public CefClient - { - public: - explicit BrowserClient(CefRefPtr ptr) - : m_renderHandler(std::move(ptr)) - {} - - CefRefPtr GetRenderHandler() override - { - return m_renderHandler; - } - - CefRefPtr m_renderHandler; - - IMPLEMENT_REFCOUNTING(BrowserClient); - }; WallpaperEngine::WebBrowser::CWebBrowserContext& m_browserContext; CefRefPtr m_browser; - CefRefPtr m_client; - RenderHandler* m_render_handler = nullptr; + CefRefPtr m_client; + WallpaperEngine::WebBrowser::CEF::CRenderHandler* m_renderHandler = nullptr; int m_width; int m_height; diff --git a/src/WallpaperEngine/WebBrowser/CEF/CBrowserApp.cpp b/src/WallpaperEngine/WebBrowser/CEF/CBrowserApp.cpp new file mode 100644 index 0000000..2cda375 --- /dev/null +++ b/src/WallpaperEngine/WebBrowser/CEF/CBrowserApp.cpp @@ -0,0 +1,64 @@ +#include "CBrowserApp.h" +#include "WallpaperEngine/Logging/CLog.h" + +using namespace WallpaperEngine::WebBrowser::CEF; + +CBrowserApp::CBrowserApp (WallpaperEngine::Application::CWallpaperApplication& application) : + CSubprocessApp (application) { +} + +CefRefPtr CBrowserApp::GetBrowserProcessHandler () { + return this; +} + +void CBrowserApp::OnContextInitialized () { + // register all the needed schemes, "wp" + the background id is going to be our scheme + for (const auto& [workshopId, factory] : this->getHandlerFactories ()) { + CefRegisterSchemeHandlerFactory ( + CWPSchemeHandlerFactory::generateSchemeName (workshopId), + (const char*) nullptr, + factory + ); + } +} + +void CBrowserApp::OnBeforeCommandLineProcessing (const CefString& process_type, CefRefPtr command_line) { + // TODO: ACTIVATE THIS IF WE EVER SUPPORT MACOS OFFICIALLY + /* +if (process_type.empty()) { +#if defined(OS_MACOSX) + // Disable the macOS keychain prompt. Cookies will not be encrypted. + command_line->AppendSwitch("use-mock-keychain"); +#endif +}*/ + // TODO: ADD FLAGS + /*"--disable-features", + "IsolateOrigins,HardwareMediaKeyHandling,WebContentsOcclusion,RendererCodeIntegrityEnabled,site-per-process", + "--disable-gpu-shader-disk-cache", + "--disable-site-isolation-trials", + "--disable-web-security", + "--remote-allow-origins", + "*", + //"--force-device-scale-factor", + //"1", // this can also be 2 + //"--high-dpi-support", + //"1", + "--autoplay-policy", + "no-user-gesture-required", + "--disable-background-timer-throttling", + "--disable-backgrounding-occluded-windows", + "--disable-background-media-suspend", + "--disable-renderer-backgrounding", + "--disable-test-root-certs", + "--disable-bundled-ppapi-flash", + "--disable-breakpad", + "--disable-field-trial-config", + "--no-experiments"*/ +} + +void CBrowserApp::OnBeforeChildProcessLaunch(CefRefPtr command_line) { + // add back any parameters we had before so the new process can load up everything needed + for (int i = 1; i < this->getApplication ().getContext ().getArgc (); i ++) { + command_line->AppendArgument (this->getApplication ().getContext ().getArgv () [i]); + } +} \ No newline at end of file diff --git a/src/WallpaperEngine/WebBrowser/CEF/CBrowserApp.h b/src/WallpaperEngine/WebBrowser/CEF/CBrowserApp.h new file mode 100644 index 0000000..fee39c2 --- /dev/null +++ b/src/WallpaperEngine/WebBrowser/CEF/CBrowserApp.h @@ -0,0 +1,30 @@ +#pragma once + +#include "CSubprocessApp.h" +#include "CWPSchemeHandlerFactory.h" +#include "WallpaperEngine/WebBrowser/CWebBrowserContext.h" +#include "include/cef_app.h" + +namespace WallpaperEngine::Application { +class CWallpaperApplication; +} + +namespace WallpaperEngine::WebBrowser::CEF { +/** + * Provides custom protocol to contain everything under it + */ +class CBrowserApp : public CSubprocessApp, public CefBrowserProcessHandler { + public: + explicit CBrowserApp (WallpaperEngine::Application::CWallpaperApplication& application); + + [[nodiscard]] CefRefPtr GetBrowserProcessHandler () override; + + void OnContextInitialized () override; + void OnBeforeCommandLineProcessing (const CefString& process_type, CefRefPtr command_line) override; + void OnBeforeChildProcessLaunch(CefRefPtr command_line) override; + + private: + IMPLEMENT_REFCOUNTING (CBrowserApp); + DISALLOW_COPY_AND_ASSIGN (CBrowserApp); +}; +} // namespace WallpaperEngine::WebBrowser::CEF \ No newline at end of file diff --git a/src/WallpaperEngine/WebBrowser/CEF/CBrowserClient.cpp b/src/WallpaperEngine/WebBrowser/CEF/CBrowserClient.cpp new file mode 100644 index 0000000..694eabd --- /dev/null +++ b/src/WallpaperEngine/WebBrowser/CEF/CBrowserClient.cpp @@ -0,0 +1,12 @@ +#include "CBrowserClient.h" + +using namespace WallpaperEngine::WebBrowser::CEF; + +CBrowserClient::CBrowserClient(CefRefPtr ptr) + : m_renderHandler(std::move(ptr)) +{} + +CefRefPtr CBrowserClient::GetRenderHandler() +{ + return m_renderHandler; +} \ No newline at end of file diff --git a/src/WallpaperEngine/WebBrowser/CEF/CBrowserClient.h b/src/WallpaperEngine/WebBrowser/CEF/CBrowserClient.h new file mode 100644 index 0000000..e16c002 --- /dev/null +++ b/src/WallpaperEngine/WebBrowser/CEF/CBrowserClient.h @@ -0,0 +1,21 @@ +#pragma once + +#include "include/cef_client.h" + +namespace WallpaperEngine::WebBrowser::CEF { +// ************************************************************************* +//! \brief Provide access to browser-instance-specific callbacks. A single +//! CefClient instance can be shared among any number of browsers. +// ************************************************************************* +class CBrowserClient: public CefClient +{ + public: + explicit CBrowserClient(CefRefPtr ptr); + + [[nodiscard]] CefRefPtr GetRenderHandler() override; + + CefRefPtr m_renderHandler; + + IMPLEMENT_REFCOUNTING(CBrowserClient); +}; +} // namespace WallpaperEngine::WebBrowser::CEF \ No newline at end of file diff --git a/src/WallpaperEngine/WebBrowser/CEF/CRenderHandler.cpp b/src/WallpaperEngine/WebBrowser/CEF/CRenderHandler.cpp new file mode 100644 index 0000000..1674f6c --- /dev/null +++ b/src/WallpaperEngine/WebBrowser/CEF/CRenderHandler.cpp @@ -0,0 +1,31 @@ +#include "CRenderHandler.h" + +using namespace WallpaperEngine::WebBrowser::CEF; + +CRenderHandler::CRenderHandler (WallpaperEngine::Render::Wallpapers::CWeb* webdata) : m_webdata (webdata) {} + +// Required by CEF +void CRenderHandler::GetViewRect (CefRefPtr browser, CefRect& rect) { + rect = CefRect (0, 0, this->m_webdata->getWidth (), this->m_webdata->getHeight ()); +} + +// Will be executed in CEF message loop +void CRenderHandler::OnPaint (CefRefPtr browser, PaintElementType type, const RectList& dirtyRects, + const void* buffer, int width, int height) { + glActiveTexture (GL_TEXTURE0); + glBindTexture (GL_TEXTURE_2D, this->texture ()); + glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, (unsigned char*) buffer); + glBindTexture (GL_TEXTURE_2D, 0); +} + +int CRenderHandler::getWidth() const { + return this->m_webdata->getWidth (); +} + +int CRenderHandler::getHeight() const { + return this->m_webdata->getHeight (); +} + +GLuint CRenderHandler::texture () const { + return this->m_webdata->getWallpaperFramebuffer(); +} \ No newline at end of file diff --git a/src/WallpaperEngine/WebBrowser/CEF/CRenderHandler.h b/src/WallpaperEngine/WebBrowser/CEF/CRenderHandler.h new file mode 100644 index 0000000..084defd --- /dev/null +++ b/src/WallpaperEngine/WebBrowser/CEF/CRenderHandler.h @@ -0,0 +1,42 @@ +#pragma once + +#include "WallpaperEngine/Render/Wallpapers/CWeb.h" +#include "include/cef_browser.h" +#include "common.h" + +namespace WallpaperEngine::Render::Wallpapers { +class CWeb; +} + +namespace WallpaperEngine::WebBrowser::CEF { +// ************************************************************************* +//! \brief Private implementation to handle CEF events to draw the web page. +// ************************************************************************* +class CRenderHandler : public CefRenderHandler { + public: + explicit CRenderHandler (WallpaperEngine::Render::Wallpapers::CWeb* webdata); + + //! \brief + ~CRenderHandler () override = default; + + //! \brief CefRenderHandler interface + void GetViewRect (CefRefPtr browser, CefRect& rect) override; + + //! \brief CefRenderHandler interface + //! Update the OpenGL texture. + void OnPaint (CefRefPtr browser, PaintElementType type, const RectList& dirtyRects, const void* buffer, + int width, int height) override; + + //! \brief CefBase interface + IMPLEMENT_REFCOUNTING (CRenderHandler); + + private: + WallpaperEngine::Render::Wallpapers::CWeb* m_webdata; + + [[nodiscard]] int getWidth () const; + [[nodiscard]] int getHeight () const; + + //! \brief Return the OpenGL texture handle + [[nodiscard]] GLuint texture () const; +}; +} // namespace WallpaperEngine::WebBrowser::CEF \ No newline at end of file diff --git a/src/WallpaperEngine/WebBrowser/CEF/CSubprocessApp.cpp b/src/WallpaperEngine/WebBrowser/CEF/CSubprocessApp.cpp new file mode 100644 index 0000000..e226ad5 --- /dev/null +++ b/src/WallpaperEngine/WebBrowser/CEF/CSubprocessApp.cpp @@ -0,0 +1,30 @@ +#include "CSubprocessApp.h" +#include "CWPSchemeHandlerFactory.h" + +using namespace WallpaperEngine::WebBrowser::CEF; + +CSubprocessApp::CSubprocessApp (WallpaperEngine::Application::CWallpaperApplication& application) : + m_application (application), + m_handlerFactories () { + for (const auto& [_, info] : this->m_application.getBackgrounds()) { + this->m_handlerFactories [info->getWorkshopId ()] = new CWPSchemeHandlerFactory (info); + } +} + +void CSubprocessApp::OnRegisterCustomSchemes (CefRawPtr registrar) { + // register all the needed schemes, "wp" + the background id is going to be our scheme + for (const auto& [workshopId, _] : this->m_handlerFactories) { + registrar->AddCustomScheme ( + CWPSchemeHandlerFactory::generateSchemeName (workshopId), + CEF_SCHEME_OPTION_LOCAL | CEF_SCHEME_OPTION_SECURE | CEF_SCHEME_OPTION_FETCH_ENABLED + ); + } +} + +const WallpaperEngine::Application::CWallpaperApplication& CSubprocessApp::getApplication () const { + return this->m_application; +} + +const std::map& CSubprocessApp::getHandlerFactories () const { + return this->m_handlerFactories; +} \ No newline at end of file diff --git a/src/WallpaperEngine/WebBrowser/CEF/CSubprocessApp.h b/src/WallpaperEngine/WebBrowser/CEF/CSubprocessApp.h new file mode 100644 index 0000000..6bfc0fa --- /dev/null +++ b/src/WallpaperEngine/WebBrowser/CEF/CSubprocessApp.h @@ -0,0 +1,28 @@ +#pragma once + +#include "CWPSchemeHandlerFactory.h" +#include "WallpaperEngine/WebBrowser/CWebBrowserContext.h" +#include "include/cef_app.h" + +namespace WallpaperEngine::Application { +class CWallpaperApplication; +} + +namespace WallpaperEngine::WebBrowser::CEF { +class CSubprocessApp : public CefApp { + public: + explicit CSubprocessApp (WallpaperEngine::Application::CWallpaperApplication& application); + + void OnRegisterCustomSchemes (CefRawPtr registrar) override; + + protected: + const WallpaperEngine::Application::CWallpaperApplication& getApplication () const; + const std::map& getHandlerFactories () const; + + private: + std::map m_handlerFactories; + WallpaperEngine::Application::CWallpaperApplication& m_application; + IMPLEMENT_REFCOUNTING (CSubprocessApp); + DISALLOW_COPY_AND_ASSIGN (CSubprocessApp); +}; +} \ No newline at end of file diff --git a/src/WallpaperEngine/WebBrowser/CEF/CWPSchemeHandler.cpp b/src/WallpaperEngine/WebBrowser/CEF/CWPSchemeHandler.cpp new file mode 100644 index 0000000..47b5469 --- /dev/null +++ b/src/WallpaperEngine/WebBrowser/CEF/CWPSchemeHandler.cpp @@ -0,0 +1,95 @@ +#include "CWPSchemeHandler.h" +#include "WallpaperEngine/Assets/CAssetLoadException.h" +#include + +#include "MimeTypes.h" +#include "include/cef_parser.h" + +using namespace WallpaperEngine::Assets; +using namespace WallpaperEngine::WebBrowser::CEF; + +CWPSchemeHandler::CWPSchemeHandler(const Core::CProject* project) : + m_project (project), + m_contents (nullptr), + m_filesize (0), + m_mimeType (), + m_offset (0) { + this->m_container = this->m_project->getWallpaper ()->getProject ().getContainer (); +} + +bool CWPSchemeHandler::ProcessRequest(CefRefPtr request, + CefRefPtr callback) { + CEF_REQUIRE_IO_THREAD(); + + // free previous file so we can properly build the right chain of responses + delete this->m_contents; + + std::cout << "ProcessRequest for " << request->GetURL ().c_str () << std::endl; + // url contains the full path, we need to get rid of the protocol + // otherwise files won't be found + CefURLParts parts; + + // url parsing is a must + if (!CefParseURL (request->GetURL (), parts)) { + return false; + } + + std::string path = CefString(&parts.path); + + // remove leading slashes from the path + path = path.substr (2); + + try { + // try to read the file on the current container, if the file doesn't exists + // an exception will be thrown + this->m_mimeType = MimeTypes::getType (path.c_str ()); + this->m_contents = this->m_container->readFile (path, &this->m_filesize); + callback->Continue (); + } catch (CAssetLoadException&) { + // not found in this container, next try + return false; + } + + return true; +} + + +void CWPSchemeHandler::GetResponseHeaders(CefRefPtr response, + int64_t& response_length, + CefString& redirectUrl) { + CEF_REQUIRE_IO_THREAD(); + + if (!this->m_contents) { + response->SetStatus (404); + return; + } + + response->SetMimeType (this->m_mimeType); + response->SetStatus (200); + + response_length = this->m_filesize; +} + +void CWPSchemeHandler::Cancel () { + CEF_REQUIRE_IO_THREAD(); +} + +bool CWPSchemeHandler::ReadResponse(void* data_out, + int bytes_to_read, + int& bytes_read, + CefRefPtr callback) { + CEF_REQUIRE_IO_THREAD(); + + bytes_read = 0; + + if (this->m_offset < this->m_filesize) { + int bytes_to_transfer = std::min (bytes_to_read, static_cast (this->m_filesize - this->m_offset)); + + memcpy (data_out, &this->m_contents [this->m_offset], bytes_to_transfer); + + bytes_read = bytes_to_transfer; + return true; + } + + return false; +} \ No newline at end of file diff --git a/src/WallpaperEngine/WebBrowser/CEF/CWPSchemeHandler.h b/src/WallpaperEngine/WebBrowser/CEF/CWPSchemeHandler.h new file mode 100644 index 0000000..13a2cb0 --- /dev/null +++ b/src/WallpaperEngine/WebBrowser/CEF/CWPSchemeHandler.h @@ -0,0 +1,48 @@ +#pragma once + +#include + +#include "WallpaperEngine/Core/CProject.h" +#include "include/cef_resource_handler.h" +#include "include/wrapper/cef_helpers.h" + +namespace WallpaperEngine::Assets { +class CContainer; +} + +namespace WallpaperEngine::WebBrowser::CEF { +/** + * wp{id}:// actual handler called by cef to access files + */ +class CWPSchemeHandler : public CefResourceHandler { + public: + explicit CWPSchemeHandler(const Core::CProject* project); + + bool ProcessRequest(CefRefPtr request, + CefRefPtr callback) override; + + void GetResponseHeaders(CefRefPtr response, + int64_t& response_length, + CefString& redirectUrl) override; + + void Cancel() override; + + bool ReadResponse(void* data_out, + int bytes_to_read, + int& bytes_read, + CefRefPtr callback) override; + + private: + const Core::CProject* m_project; + + const Assets::CContainer* m_container; + const uint8_t* m_contents; + uint32_t m_filesize; + std::string m_mimeType; + uint32_t m_offset; + + + IMPLEMENT_REFCOUNTING(CWPSchemeHandler); + DISALLOW_COPY_AND_ASSIGN(CWPSchemeHandler); +}; +}; \ No newline at end of file diff --git a/src/WallpaperEngine/WebBrowser/CEF/CWPSchemeHandlerFactory.cpp b/src/WallpaperEngine/WebBrowser/CEF/CWPSchemeHandlerFactory.cpp new file mode 100644 index 0000000..78cafa9 --- /dev/null +++ b/src/WallpaperEngine/WebBrowser/CEF/CWPSchemeHandlerFactory.cpp @@ -0,0 +1,19 @@ +#include "CWPSchemeHandlerFactory.h" +#include "CWPSchemeHandler.h" +#include "WallpaperEngine/WebBrowser/CWebBrowserContext.h" +#include "include/wrapper/cef_helpers.h" + +using namespace WallpaperEngine::WebBrowser::CEF; + +CWPSchemeHandlerFactory::CWPSchemeHandlerFactory (const Core::CProject* project) : m_project (project) {} + +CefRefPtr CWPSchemeHandlerFactory::Create ( + CefRefPtr browser, CefRefPtr frame, + const CefString& scheme_name, CefRefPtr request) { + CEF_REQUIRE_IO_THREAD (); + return new CWPSchemeHandler(this->m_project); +} + +std::string CWPSchemeHandlerFactory::generateSchemeName (const std::string& workshopId) { + return std::string(WPENGINE_SCHEME) + workshopId; +} \ No newline at end of file diff --git a/src/WallpaperEngine/WebBrowser/CEF/CWPSchemeHandlerFactory.h b/src/WallpaperEngine/WebBrowser/CEF/CWPSchemeHandlerFactory.h new file mode 100644 index 0000000..2715bee --- /dev/null +++ b/src/WallpaperEngine/WebBrowser/CEF/CWPSchemeHandlerFactory.h @@ -0,0 +1,26 @@ +#pragma once + +#include +#include "WallpaperEngine/Core/CProject.h" +#include "include/cef_scheme.h" + +namespace WallpaperEngine::WebBrowser::CEF { +/** + * Simple factory that creates a scheme handler for wp when requested by Cef + */ +class CWPSchemeHandlerFactory : public CefSchemeHandlerFactory { + public: + explicit CWPSchemeHandlerFactory (const Core::CProject* project); + + CefRefPtr Create ( + CefRefPtr browser, CefRefPtr frame, + const CefString& scheme_name, CefRefPtr request) override; + + static std::string generateSchemeName (const std::string& workshopId); + private: + const Core::CProject* m_project; + + IMPLEMENT_REFCOUNTING (CWPSchemeHandlerFactory); + DISALLOW_COPY_AND_ASSIGN (CWPSchemeHandlerFactory); +}; +} // namespace WallpaperEngine::WebBrowser::CEF \ No newline at end of file diff --git a/src/WallpaperEngine/WebBrowser/CWebBrowserContext.cpp b/src/WallpaperEngine/WebBrowser/CWebBrowserContext.cpp index 61df7be..58cfcfc 100644 --- a/src/WallpaperEngine/WebBrowser/CWebBrowserContext.cpp +++ b/src/WallpaperEngine/WebBrowser/CWebBrowserContext.cpp @@ -1,31 +1,76 @@ #include "CWebBrowserContext.h" +#include "CEF/CBrowserApp.h" #include "WallpaperEngine/Logging/CLog.h" +#include "WallpaperEngine/WebBrowser/CEF/CSubprocessApp.h" #include "include/cef_app.h" -#include "include/cef_client.h" #include "include/cef_render_handler.h" +#include +#include using namespace WallpaperEngine::WebBrowser; -CWebBrowserContext::CWebBrowserContext (int argc, char** argv) : m_stopped (false) { - // clone original argc/argv as they'll be modified by cef - char** argv2 = new char*[argc]; +// TODO: THIS IS USED TO GENERATE A RANDOM FOLDER FOR THE CHROME PROFILE, MAYBE A DIFFERENT APPROACH WOULD BE BETTER? +namespace uuid { +static std::random_device rd; +static std::mt19937 gen(rd()); +static std::uniform_int_distribution<> dis(0, 15); +static std::uniform_int_distribution<> dis2(8, 11); - for (int i = 0; i < argc; i++) { - argv2 [i] = new char [strlen (argv [i]) + 1]; - strcpy (argv2 [i], argv [i]); +std::string generate_uuid_v4() { + std::stringstream ss; + int i; + ss << std::hex; + for (i = 0; i < 8; i++) { + ss << dis(gen); + } + ss << "-"; + for (i = 0; i < 4; i++) { + ss << dis(gen); + } + ss << "-4"; + for (i = 0; i < 3; i++) { + ss << dis(gen); + } + ss << "-"; + ss << dis2(gen); + for (i = 0; i < 3; i++) { + ss << dis(gen); + } + ss << "-"; + for (i = 0; i < 12; i++) { + ss << dis(gen); + }; + return ss.str(); +} +} + +CWebBrowserContext::CWebBrowserContext (WallpaperEngine::Application::CWallpaperApplication& wallpaperApplication) : + m_wallpaperApplication (wallpaperApplication), + m_browserApplication (nullptr) { + CefMainArgs main_args (this->m_wallpaperApplication.getContext ().getArgc (), this->m_wallpaperApplication.getContext ().getArgv ()); + + // only care about app if the process is the main process + // we should maybe use a better lib for handling command line arguments instead + // or using C's version on some places and CefCommandLine on others + // TODO: ANOTHER THING TO TAKE CARE OF BEFORE MERGING + CefRefPtr commandLine = CefCommandLine::CreateCommandLine(); + + commandLine->InitFromArgv (main_args.argc, main_args.argv); + + if (!commandLine->HasSwitch("type")) { + this->m_browserApplication = new CEF::CBrowserApp(wallpaperApplication); + } else { + this->m_browserApplication = new CEF::CSubprocessApp(wallpaperApplication); } - CefMainArgs args (argc, argv2); - + // this blocks for anything not-main-thread int exit_code = CefExecuteProcess ( - args, nullptr, nullptr); // Spawned processes will terminate here(see CefIninitilize below). Maybe implementing - // settings.browser_subprocess_path will allow it to work not in main function. + main_args, this->m_browserApplication, nullptr); + + // this is needed to kill subprocesses after they're done if (exit_code >= 0) { // Sub proccess has endend, so exit exit (exit_code); - } else if (exit_code == -1) { - // If called for the browser process (identified by no "type" command-line value) - // it will return immediately with a value of -1 } // Configurate Chromium @@ -35,13 +80,14 @@ CWebBrowserContext::CWebBrowserContext (int argc, char** argv) : m_stopped (fals // CefString(&settings.framework_dir_path) = "OffScreenCEF/godot/"; // CefString(&settings.cache_path) = "OffScreenCEF/godot/"; // CefString(&settings.browser_subprocess_path) = "path/to/client" + CefString(&settings.root_cache_path) = std::filesystem::temp_directory_path() / uuid::generate_uuid_v4(); settings.windowless_rendering_enabled = true; #if defined(CEF_NO_SANDBOX) settings.no_sandbox = true; #endif // spawns two new processess - bool result = CefInitialize (args, settings, nullptr, nullptr); + bool result = CefInitialize (main_args, settings, this->m_browserApplication, nullptr); if (!result) { sLog.exception ("CefInitialize: failed"); @@ -49,25 +95,6 @@ CWebBrowserContext::CWebBrowserContext (int argc, char** argv) : m_stopped (fals } CWebBrowserContext::~CWebBrowserContext () { - this->stop (); -} - -void CWebBrowserContext::markAsUsed () { - this->m_inUse = true; -} - -bool CWebBrowserContext::isUsed () { - return this->m_inUse; -} - -void CWebBrowserContext::stop () { - if (this->m_stopped) { - return; - } - sLog.out ("Shutting down CEF"); - - this->m_stopped = true; - CefShutdown (); -} \ No newline at end of file +} diff --git a/src/WallpaperEngine/WebBrowser/CWebBrowserContext.h b/src/WallpaperEngine/WebBrowser/CWebBrowserContext.h index d689ff1..6bde92a 100644 --- a/src/WallpaperEngine/WebBrowser/CWebBrowserContext.h +++ b/src/WallpaperEngine/WebBrowser/CWebBrowserContext.h @@ -1,17 +1,26 @@ #pragma once +#include "WallpaperEngine/Application/CApplicationContext.h" +#include "WallpaperEngine/Application/CWallpaperApplication.h" +#include "include/cef_app.h" +#include "include/cef_browser_process_handler.h" +#include "include/wrapper/cef_helpers.h" + +#define WPENGINE_SCHEME "wp" + +namespace WallpaperEngine::WebBrowser::CEF { +class CBrowserApp; +} + namespace WallpaperEngine::WebBrowser { class CWebBrowserContext { public: - CWebBrowserContext (int argc, char** argv); + explicit CWebBrowserContext (WallpaperEngine::Application::CWallpaperApplication& wallpaperApplication); ~CWebBrowserContext(); - void markAsUsed(); - bool isUsed(); - void stop(); - private: - bool m_stopped; - bool m_inUse; + CefRefPtr m_browserApplication; + CefRefPtr m_commandLine; + WallpaperEngine::Application::CWallpaperApplication& m_wallpaperApplication; }; } // namespace WallpaperEngine::WebBrowser