From c6fbc412be820c0447d27bcf350c47c322704b70 Mon Sep 17 00:00:00 2001 From: sniperbeamer Date: Fri, 13 Mar 2009 12:40:15 +0000 Subject: [PATCH] XDG compliant config location on Linux Better way to detect APPDATA path on Windows Optimize global include file git-svn-id: https://svn.code.sf.net/p/keepassx/code/trunk@282 b624d157-de02-0410-bad0-e51aec6abb33 --- src/Kdb3Database.cpp | 1 - src/keepassx.h | 6 ++-- src/lib/WaitAnimationWidget.cpp | 3 -- src/lib/tools.cpp | 29 +++++++++++++++++++ src/lib/tools.h | 15 ++++++++-- src/main.cpp | 51 ++++++++++++++++++++++++--------- 6 files changed, 81 insertions(+), 24 deletions(-) diff --git a/src/Kdb3Database.cpp b/src/Kdb3Database.cpp index 81d0b88..a81ff8b 100644 --- a/src/Kdb3Database.cpp +++ b/src/Kdb3Database.cpp @@ -21,7 +21,6 @@ #include "crypto/twoclass.h" #include -#include #define UNEXP_ERROR error=QString("Unexpected error in: %1, Line:%2").arg(__FILE__).arg(__LINE__); diff --git a/src/keepassx.h b/src/keepassx.h index 1fd2c41..9cad55c 100644 --- a/src/keepassx.h +++ b/src/keepassx.h @@ -20,7 +20,7 @@ #ifndef KEEPASSX_H_ #define KEEPASSX_H_ -// global defines +// global defines #define APP_DISPLAY_NAME "KeePassX" #define APP_CODE_NAME "keepassx" @@ -35,11 +35,8 @@ #ifdef __cplusplus #include -#include -#include #include -#include #include #include @@ -67,6 +64,7 @@ #include #include #include +#include #include #include #include diff --git a/src/lib/WaitAnimationWidget.cpp b/src/lib/WaitAnimationWidget.cpp index 98d8c4f..5b6223d 100644 --- a/src/lib/WaitAnimationWidget.cpp +++ b/src/lib/WaitAnimationWidget.cpp @@ -18,10 +18,8 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ - #include "WaitAnimationWidget.h" - WaitAnimationWidget::WaitAnimationWidget(QWidget* parent):QWidget(parent){ speed=60; setRefreshRate(25); @@ -94,4 +92,3 @@ void WaitAnimationWidget::resizeEvent(QResizeEvent* event){ CircPositions[i].setY((r-10)*sin(-2.0*3.14159265*(0.16666667*i))+r); } } - diff --git a/src/lib/tools.cpp b/src/lib/tools.cpp index 1380be8..bc24c06 100644 --- a/src/lib/tools.cpp +++ b/src/lib/tools.cpp @@ -363,3 +363,32 @@ QList getAllTranslations(){ qSort(translations.begin(), translations.end()); return translations; } + +// from src/corelib/qsettings.cpp: +#ifdef Q_OS_WIN +QString qtWindowsConfigPath(int type) +{ + QString result; + + QLibrary library(QLatin1String("shell32")); + QT_WA( { + typedef BOOL (WINAPI*GetSpecialFolderPath)(HWND, LPTSTR, int, BOOL); + GetSpecialFolderPath SHGetSpecialFolderPath = (GetSpecialFolderPath)library.resolve("SHGetSpecialFolderPathW"); + if (SHGetSpecialFolderPath) { + TCHAR path[MAX_PATH]; + SHGetSpecialFolderPath(0, path, type, FALSE); + result = QString::fromUtf16((ushort*)path); + } + } , { + typedef BOOL (WINAPI*GetSpecialFolderPath)(HWND, char*, int, BOOL); + GetSpecialFolderPath SHGetSpecialFolderPath = (GetSpecialFolderPath)library.resolve("SHGetSpecialFolderPathA"); + if (SHGetSpecialFolderPath) { + char path[MAX_PATH]; + SHGetSpecialFolderPath(0, path, type, FALSE); + result = QString::fromLocal8Bit(path); + } + } ); + + return result; +} +#endif // Q_OS_WIN diff --git a/src/lib/tools.h b/src/lib/tools.h index 175b24b..5af112d 100644 --- a/src/lib/tools.h +++ b/src/lib/tools.h @@ -19,8 +19,6 @@ #ifndef TOOLS_H #define TOOLS_H -#define CSTR(x)(x.toLocal8Bit().constData()) - class IEntryHandle; enum tKeyType {PASSWORD=0,KEYFILE=1,BOTH=2}; @@ -32,10 +30,15 @@ struct Translation { }; bool operator<(const Translation& t1, const Translation& t2); +inline const char* CSTR(const QString& str) { + return QTextCodec::codecForLocale()->fromUnicode(str).constData(); +} + const QIcon& getIcon(const QString& name); const QPixmap* getPixmap(const QString& name); void createBanner(QPixmap* Pixmap, const QPixmap* IconAlpha,const QString& Text,int Width); -void createBanner(QPixmap* Pixmap, const QPixmap* IconAlpha,const QString& Text,int Width, QColor Color1, QColor Color2, QColor TextColor); +void createBanner(QPixmap* Pixmap, const QPixmap* IconAlpha,const QString& Text,int Width, + QColor Color1, QColor Color2, QColor TextColor); void openBrowser(const QString& UrlString); void openBrowser(IEntryHandle* entry); void showErrMsg(const QString& msg,QWidget* parent=NULL); @@ -48,5 +51,11 @@ bool unlockPage(void* addr, int len); void installTranslator(); bool isTranslationActive(); QList getAllTranslations(); +#ifdef Q_OS_WIN + #ifndef CSIDL_APPDATA + #define CSIDL_APPDATA 0x001a // \Application Data + #endif + QString qtWindowsConfigPath(int type); +#endif #endif //TOOLS_H diff --git a/src/main.cpp b/src/main.cpp index 194ddf2..163be35 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -19,17 +19,18 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ +#include "main.h" +#include "mainwindow.h" +#if defined(Q_WS_X11) && defined(GLOBAL_AUTOTYPE) + #include "Application_X11.h" +#endif + #include "plugins/interfaces/IFileDialog.h" #include "plugins/interfaces/IKdeInit.h" #include "plugins/interfaces/IGnomeInit.h" - //#include -#include "mainwindow.h" -#include "main.h" -#if defined(Q_WS_X11) && defined(GLOBAL_AUTOTYPE) - #include "Application_X11.h" -#endif +#include using namespace std; @@ -48,6 +49,8 @@ IIconTheme* IconLoader=NULL; int main(int argc, char **argv) { + setlocale(LC_CTYPE, ""); + QT_REQUIRE_VERSION(argc, argv, "4.3.0"); #if defined(Q_WS_X11) && defined(GLOBAL_AUTOTYPE) @@ -59,22 +62,34 @@ int main(int argc, char **argv) AppDir = QApplication::applicationFilePath(); AppDir.truncate(AppDir.lastIndexOf("/")); #if defined(Q_WS_X11) - DataDir=AppDir+"/../share/keepassx"; + DataDir = AppDir+"/../share/keepassx"; if (!QFile::exists(DataDir) && QFile::exists(AppDir+"/share")) - DataDir=AppDir+"/share"; - HomeDir = QDir::homePath()+"/.keepassx"; + DataDir = AppDir+"/share"; + const char* env = getenv("XDG_CONFIG_HOME"); + if (!env) { + HomeDir = QDir::homePath() + "/.config"; + } + else { + QString qenv = QTextCodec::codecForLocale()->toUnicode(env); + if (qenv[0] == '/') + HomeDir = qenv; + else + HomeDir = QDir::homePath() + '/' + qenv; + } + HomeDir += "/keepassx"; #elif defined(Q_WS_MAC) HomeDir = QDir::homePath()+"/.keepassx"; - DataDir=AppDir+"/../Resources/keepassx"; + DataDir = AppDir+"/../Resources/keepassx"; #else //Q_WS_WIN - HomeDir = QString::fromLocal8Bit(qgetenv("APPDATA").constData()); + HomeDir = qtWindowsConfigPath(CSIDL_APPDATA); if(!HomeDir.isEmpty() && QFile::exists(HomeDir)) HomeDir = QDir::fromNativeSeparators(HomeDir)+"/KeePassX"; else HomeDir = QDir::homePath()+"/KeePassX"; - DataDir=AppDir+"/share"; + DataDir = AppDir+"/share"; #endif + DataDir = QDir::cleanPath(DataDir); CmdLineArgs args; if ( !args.parse(QApplication::arguments()) ){ @@ -95,11 +110,21 @@ int main(int argc, char **argv) if(!QDir().mkpath(HomeDir)) qWarning("Warning: Could not create directory '%s'", CSTR(HomeDir)); } - IniFilename=HomeDir+"/config"; + IniFilename=HomeDir+"/config.ini"; } else IniFilename=args.configLocation(); +#ifdef Q_WS_X11 + { + QString OldHomeDir = QDir::homePath()+"/.keepassx"; + if (args.configLocation().isEmpty() && QFile::exists(OldHomeDir+"/config") && !QFile::exists(HomeDir+"/config")) + QFile::rename(OldHomeDir+"/config", HomeDir+"/config.ini"); + } +#else + if (args.configLocation().isEmpty() && QFile::exists(HomeDir+"/config") && !QFile::exists(HomeDir+"/config.ini")) + QFile::rename(HomeDir+"/config", HomeDir+"/config.ini"); +#endif config = new KpxConfig(IniFilename); fileDlgHistory.load();