From bfaab4bc7f087cee86331a97569011418689223d Mon Sep 17 00:00:00 2001 From: Mubashshir Date: Sat, 7 Jun 2025 01:52:18 +0600 Subject: [PATCH] cr3qt: Implement xdg-basedirs spec Fixes #325 Signed-off-by: Mubashshir --- CMakeLists.txt | 6 ++++++ cr3qt/CMakeLists.txt | 9 +++++++++ cr3qt/src/mainwindow.cpp | 41 ++++++++++++++++++++++++++++++++++++++-- 3 files changed, 54 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 254b8cd6f..9e738e5b4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -147,10 +147,16 @@ if( ${GUI} STREQUAL QT5 ) FIND_PACKAGE( Qt5Core REQUIRED ) FIND_PACKAGE( Qt5Widgets REQUIRED ) FIND_PACKAGE( Qt5LinguistTools REQUIRED ) + FIND_PACKAGE( Qt5Xdg QUIET) include_directories(${Qt5Widgets_INCLUDE_DIRS}) add_definitions(${Qt5Widgets_DEFINITIONS}) include_directories(${Qt5Core_INCLUDE_DIRS}) add_definitions(${Qt5Core_DEFINITIONS}) + if(NOT Qt5Xdg_FOUND) + message("Qt5Xdg not found: xdg-basedirs-spec support disabled.\n") + else() + message("Qt5Xdg(${Qt5Xdg_VERSION}) found, xdg-basedirs-spec support enabled.\n") + endif(NOT Qt5Xdg_FOUND) endif( ${GUI} STREQUAL QT5 ) # thirdparty sources definitions diff --git a/cr3qt/CMakeLists.txt b/cr3qt/CMakeLists.txt index 9830ddcdd..231af574b 100644 --- a/cr3qt/CMakeLists.txt +++ b/cr3qt/CMakeLists.txt @@ -50,6 +50,10 @@ ELSE() ADD_DEFINITIONS(-DCR3_DATA_DIR="") ENDIF(MAC) +if(Qt5Xdg_FOUND) + ADD_DEFINITIONS(-DUSE_QT5_XDG=1) +ENDIF(Qt5Xdg_FOUND) + ADD_DEFINITIONS("${Qt5Core_EXECUTABLE_COMPILE_FLAGS}") #IF (WIN32) @@ -174,6 +178,11 @@ IF(MAC) ELSE() SET (EXTRA_LIBS ${STD_LIBS} ${QT_LIBRARIES} ${Qt5Core_LIBRARIES} ${Qt5Widgets_LIBRARIES} ) ENDIF(MAC) + +IF(Qt5Xdg_FOUND) + SET (EXTRA_LIBS ${EXTRA_LIBS} Qt5Xdg ) +ENDIF(Qt5Xdg_FOUND) + TARGET_LINK_LIBRARIES(cr3 crengine tinydict ${EXTRA_LIBS}) IF (MAC) diff --git a/cr3qt/src/mainwindow.cpp b/cr3qt/src/mainwindow.cpp index 8cb2ade1a..64c062901 100644 --- a/cr3qt/src/mainwindow.cpp +++ b/cr3qt/src/mainwindow.cpp @@ -33,6 +33,10 @@ #include #endif +#if USE_QT5_XDG +#include +#endif + #include #include #include @@ -97,20 +101,49 @@ MainWindow::MainWindow(QWidget *parent) addAction(ui->actionNextSentence); addAction(ui->actionPrevSentence); + +#if _LINUX +# ifdef USE_QT5_XDG + bool use_xdg_dir = ! QDir(QDir::homePath() + "/.cr3").exists(); + QString xdgCfgDir = QDir::toNativeSeparators(XdgDirs::configHome() + "/cr3/"); + QString xdgDataDir = QDir::toNativeSeparators(XdgDirs::dataHome() + "/cr3/"); + QString xdgCacheDir = QDir::toNativeSeparators(XdgDirs::cacheHome() + "/cr3/"); +# else + bool use_xdg_dir = false; + QString xdgCfgDir = ""; + QString xdgDataDir = ""; + QString xdgCacheDir = ""; +# endif +#endif + #ifdef _LINUX - QString homeDir = QDir::toNativeSeparators(QDir::homePath() + "/.cr3/"); + QString homeDir = use_xdg_dir ? xdgCfgDir : QDir::toNativeSeparators(QDir::homePath() + "/.cr3/"); #else QString homeDir = QDir::toNativeSeparators(QDir::homePath() + "/cr3/"); #endif + #ifdef _LINUX QString exeDir = QString(CR3_DATA_DIR); #else QString exeDir = QDir::toNativeSeparators(qApp->applicationDirPath() + "/"); //QDir::separator(); #endif + + +#ifdef _LINUX + QString cacheDir = use_xdg_dir ? xdgCacheDir : (homeDir + "cache"); + QString bookmarksDir = (use_xdg_dir? xdgDataDir:homeDir) + "bookmarks"; +#else QString cacheDir = homeDir + "cache"; QString bookmarksDir = homeDir + "bookmarks"; +#endif + QString histFile2 = exeDir + "cr3hist.bmk"; +#ifdef _LINUX + QString histFile = (use_xdg_dir? xdgDataDir:homeDir) + "cr3hist.bmk"; +#else QString histFile = homeDir + "cr3hist.bmk"; +#endif + QString iniFile2 = exeDir + "cr3.ini"; QString iniFile = homeDir + "cr3.ini"; QString cssFile = homeDir + "fb2.css"; @@ -119,8 +152,12 @@ MainWindow::MainWindow(QWidget *parent) //CRLog::info("Translations directory: %s", LCSTR(qt2cr(translations)) ); QString hyphDir = exeDir + "hyph" + QDir::separator(); ui->view->setHyphDir(hyphDir); - ui->view->setHyphDir(homeDir + "hyph" + QDir::separator(), false); +#ifdef _LINUX + ui->view->setHyphDir((use_xdg_dir?xdgDataDir:homeDir) + "hyph" + QDir::separator(), false); +#else + ui->view->setHyphDir(homeDir + "hyph" + QDir::separator(), false); +#endif ldomDocCache::init( qt2cr( cacheDir ), DOC_CACHE_SIZE ); ui->view->setPropsChangeCallback( this ); if (!ui->view->loadSettings( iniFile )) {