diff --git a/CMakeLists.txt b/CMakeLists.txt index a2d563a9..0cdee5f4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -89,7 +89,7 @@ list(APPEND X_LIBS Qt${QT_VERSION_MAJOR}::Widgets) # -------------------------------------------------------------------------------------------------- # Binaries set(X_BINS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/bin/${CMAKE_SYSTEM_NAME}/${CMAKE_BUILD_TYPE}) - +set(X_3RD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/3rd) # Libraries set(tmp ${CMAKE_CURRENT_SOURCE_DIR}/libs/${QT_VERSION}/${CMAKE_BUILD_TYPE}) set(X_LIBS_DIR ${tmp}/${CMAKE_CXX_COMPILER_ID}/${CMAKE_CXX_COMPILER_VERSION}) diff --git a/cmake/x_3rd.cmake b/cmake/x_3rd.cmake index 9f2ff913..1dac615c 100644 --- a/cmake/x_3rd.cmake +++ b/cmake/x_3rd.cmake @@ -1,3 +1,40 @@ +function(x_auto_import_package package_zip_name package_name) + # Extract the package name from the path + if(NOT EXISTS ${X_3RD_DIR}/${package_zip_name}) + execute_process(COMMAND ${CMAKE_COMMAND} -E tar xzf ${package_zip_name}.zip + WORKING_DIRECTORY ${X_3RD_DIR}) + endif() + + x_auto_import_package_dir(${package_zip_name} ${package_name} ${ARGN}) +endfunction() + +function(x_auto_import_package_dir package_dir_name package_name) + # Add module... + set(package_dst_dir ${X_LIBS_DIR}/${package_dir_name}) + if(EXISTS ${package_dst_dir}/include) + set(CMAKE_PREFIX_PATH ${package_dst_dir} ${CMAKE_PREFIX_PATH}) + find_package(${package_name} REQUIRED) + message(STATUS "[PUMA]Found ${package_dir_name}: ${package_dst_dir}") + else() + add_subdirectory(${X_3RD_DIR}/${package_dir_name}) + + if(NOT ANDROID AND NOT IOS) + add_custom_command( + OUTPUT ${package_dst_dir}/install.stamp + COMMAND ${CMAKE_COMMAND} -E touch ${package_dst_dir}/install.stamp + COMMAND ${CMAKE_COMMAND} --install . --prefix ${package_dst_dir} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/3rd/${package_dir_name} + COMMENT "Installing ${package_dir_name} to ${package_dst_dir}") + add_custom_target( + ${package_dir_name}_auto_install ALL + DEPENDS ${package_dst_dir}/install.stamp + SOURCES ${CMAKE_SOURCE_DIR}/cmake/s-track_3rd.cmake) + add_dependencies(${package_dir_name}_auto_install ${package_name} ${ARGN}) + set_property(TARGET ${package_dir_name}_auto_install PROPERTY FOLDER "3rd") + endif() + endif() +endfunction() + include(${CMAKE_SOURCE_DIR}/cmake/x_3rd_lua.cmake) include(${CMAKE_SOURCE_DIR}/cmake/x_3rd_glog.cmake) include(${CMAKE_SOURCE_DIR}/cmake/x_3rd_zint.cmake) diff --git a/cmake/x_3rd_singleapplication.cmake b/cmake/x_3rd_singleapplication.cmake index d0bf919d..e13a1687 100644 --- a/cmake/x_3rd_singleapplication.cmake +++ b/cmake/x_3rd_singleapplication.cmake @@ -5,6 +5,16 @@ set(package_name "SingleApplication-${package_version}") set(tmp "https://codeload.github.com/itay-grudev/SingleApplication/zip/refs/tags") set(package_url "${tmp}/v${package_version}") +if(ANDROID OR IOS) + message(STATUS "[SingleApplication]SingleApplication is not supported on Android or iOS.") + return() +endif() + +if(QT_VERSION VERSION_LESS "6.8.0") + message(STATUS "[SingleApplication]SingleApplication requires Qt 6.8 or higher.") + return() +endif() + # Download the package if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/3rd/${package_name}.zip") file( @@ -12,7 +22,7 @@ if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/3rd/${package_name}.zip") SHOW_PROGRESS STATUS download_status) if(NOT download_status EQUAL 0) - message(WARNING "Failed to download SingleApplication.") + message(WARNING "[SingleApplication]Failed to download SingleApplication.") return() endif() endif() @@ -23,26 +33,18 @@ if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/3rd/${package_name}") "${CMAKE_CURRENT_SOURCE_DIR}/3rd") endif() -# Unsupported yet... -return() - -set(lib_dir "${X_LIBS_DIR}/${package_name}") -if(EXISTS "${lib_dir}/include") - set(CMAKE_PREFIX_PATH "${lib_dir}" ${CMAKE_PREFIX_PATH}) - find_package(SingleApplication REQUIRED) +if(MSVC) + set(sapp_lib_file ${X_LIBS_DIR}/${package_name}/lib/SingleApplication.lib) else() - add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/3rd/${package_name}") - set_property(TARGET SingleApplication PROPERTY FOLDER "3rd") - - add_custom_command( - OUTPUT "${X_LIBS_DIR}/${package_name}/install.stamp" - COMMAND ${CMAKE_COMMAND} --install . --prefix "${X_LIBS_DIR}/${package_name}" - COMMAND ${CMAKE_COMMAND} -E touch "${X_LIBS_DIR}/${package_name}/install.stamp" - WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/3rd/${package_name}" - COMMENT "Installing SingleApplication to ${X_LIBS_DIR}/${package_name}") - add_custom_target(SingleApplication_auto_install ALL - DEPENDS "${X_LIBS_DIR}/${package_name}/install.stamp") - add_dependencies(SingleApplication_auto_install SingleApplication) - set_property(TARGET SingleApplication_auto_install PROPERTY FOLDER "3rd") - message(STATUS "SingleApplication installed to ${X_LIBS_DIR}/${package_name}") + set(sapp_lib_file ${X_LIBS_DIR}/${package_name}/lib/SingleApplication.a) endif() + +get_filename_component(sapp_lib_dir ${sapp_lib_file} DIRECTORY) +set(QAPPLICATION_CLASS QApplication) +add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/3rd/${package_name}") +set_property(TARGET SingleApplication PROPERTY FOLDER "3rd") +set_target_properties(SingleApplication PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${sapp_lib_dir}) + +list(APPEND X_LIBS SingleApplication) +add_compile_definitions(X_ENABLE_SINGLEAPPLICATION) +set(X_ENABLE_SINGLEAPPLICATION ON) diff --git a/src/main.cpp b/src/main.cpp index 4953a571..3b1b7256 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -6,9 +6,15 @@ * xTools is licensed according to the terms in the file LICENCE(GPL V3) in the root of the source * code directory. **************************************************************************************************/ +#include + #include "application.h" #include "mainwindow.h" +#if defined(X_ENABLE_SINGLEAPPLICATION) +#include "singleapplication.h" +#endif + int main(int argc, char *argv[]) { Application::setOrganizationName("xTools"); @@ -16,6 +22,14 @@ int main(int argc, char *argv[]) Application::installLog(argv[0]); Application::setupHdpi(); Application app(argc, argv); + +#if defined(X_ENABLE_SINGLEAPPLICATION) + SingleApplication sApp(argc, argv); + if (sApp.isSecondary()) { + return 0; + } +#endif + app.setupLanguage(); app.showSplashScreenMessage(QObject::tr("Application is booting...")); app.setupAppStyle(); @@ -29,7 +43,16 @@ int main(int argc, char *argv[]) window.load(); window.moveToCenter(); +#if defined(X_ENABLE_SINGLEAPPLICATION) + QObject::connect(&sApp, &SingleApplication::instanceStarted, &window, [&window]() { + window.show(); + window.raise(); + window.activateWindow(); + QApplication::beep(); + }); +#endif + int ret = app.exec(); Application::uninstallLog(); return ret; -} +} \ No newline at end of file