feat: xTools is single application now

This commit is contained in:
x-tools-author 2025-08-07 15:35:37 +08:00
parent eee323bce2
commit 8fd33526ce
4 changed files with 86 additions and 24 deletions

View File

@ -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})

View File

@ -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)

View File

@ -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)

View File

@ -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 <QMessageBox>
#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;
}
}