aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWladimir J. van der Laan <laanwj@gmail.com>2014-03-11 08:32:07 +0100
committerWladimir J. van der Laan <laanwj@gmail.com>2014-03-11 08:46:01 +0100
commitc52c4e5d14fb20a0abc6fdcf8601ae5a0626ddcf (patch)
treed88fb17b4d81bc9c91039e49c78b5d8307df17ce
parenta63f8b7b36e39722024a0ba061ca214f00a8f1bd (diff)
qt: Make it possible again to specify -testnet in config file
Changes for the datadir chooser have made it impossible to specify the network (testnet/regtest) in the configuration file for the GUI. Reorganize the initialization sequence to make this possible again. - Moves the "datadir" QSetting so that is no longer dependent on the network-specific application name (doing otherwise would create a chicken-and-egg problem). - Re-initialize translations after choosing network. There may be a different language configured in network-specific settings (slim chance, but handle it for sanity). Fixes point 1 of #3840.
-rw-r--r--src/qt/bitcoin.cpp64
-rw-r--r--src/qt/guiconstants.h5
-rw-r--r--src/qt/intro.cpp7
-rw-r--r--src/qt/intro.h2
4 files changed, 46 insertions, 32 deletions
diff --git a/src/qt/bitcoin.cpp b/src/qt/bitcoin.cpp
index 652d39a5ce..d8e21c4aa6 100644
--- a/src/qt/bitcoin.cpp
+++ b/src/qt/bitcoin.cpp
@@ -78,6 +78,12 @@ static void initTranslations(QTranslator &qtTranslatorBase, QTranslator &qtTrans
{
QSettings settings;
+ // Remove old translators
+ QApplication::removeTranslator(&qtTranslatorBase);
+ QApplication::removeTranslator(&qtTranslator);
+ QApplication::removeTranslator(&translatorBase);
+ QApplication::removeTranslator(&translator);
+
// Get desired locale (e.g. "de_DE")
// 1) System default language
QString lang_territory = QLocale::system().name();
@@ -439,21 +445,9 @@ void BitcoinApplication::handleRunawayException(const QString &message)
#ifndef BITCOIN_QT_TEST
int main(int argc, char *argv[])
{
- bool fSelParFromCLFailed = false;
/// 1. Parse command-line options. These take precedence over anything else.
// Command-line options take precedence:
ParseParameters(argc, argv);
- // Check for -testnet or -regtest parameter (TestNet() calls are only valid after this clause)
- if (!SelectParamsFromCommandLine()) {
- fSelParFromCLFailed = true;
- }
-#ifdef ENABLE_WALLET
- // Parse URIs on command line -- this can affect Params()
- if (!PaymentServer::ipcParseCommandLine(argc, argv))
- exit(0);
-#endif
-
- bool isaTestNet = Params().NetworkID() != CChainParams::MAIN;
// Do not refer to data directory yet, this can be overridden by Intro::pickDataDirectory
@@ -480,12 +474,9 @@ int main(int argc, char *argv[])
/// 3. Application identification
// must be set before OptionsModel is initialized or translations are loaded,
// as it is used to locate QSettings
- QApplication::setOrganizationName("Bitcoin");
- QApplication::setOrganizationDomain("bitcoin.org");
- if (isaTestNet) // Separate UI settings for testnets
- QApplication::setApplicationName("Bitcoin-Qt-testnet");
- else
- QApplication::setApplicationName("Bitcoin-Qt");
+ QApplication::setOrganizationName(QAPP_ORG_NAME);
+ QApplication::setOrganizationDomain(QAPP_ORG_DOMAIN);
+ QApplication::setApplicationName(QAPP_APP_NAME_DEFAULT);
/// 4. Initialization of translations, so that intro dialog is in user's language
// Now that QSettings are accessible, initialize translations
@@ -501,17 +492,13 @@ int main(int argc, char *argv[])
help.showOrPrint();
return 1;
}
- // Now that translations are initialized, check for earlier errors and show a translatable error message
- if (fSelParFromCLFailed) {
- QMessageBox::critical(0, QObject::tr("Bitcoin"), QObject::tr("Error: Invalid combination of -regtest and -testnet."));
- return 1;
- }
/// 5. Now that settings and translations are available, ask user for data directory
// User language is set up: pick a data directory
- Intro::pickDataDirectory(isaTestNet);
+ Intro::pickDataDirectory();
/// 6. Determine availability of data directory and parse bitcoin.conf
+ /// - Do not call GetDataDir(true) before this step finishes
if (!boost::filesystem::is_directory(GetDataDir(false)))
{
QMessageBox::critical(0, QObject::tr("Bitcoin"),
@@ -520,8 +507,33 @@ int main(int argc, char *argv[])
}
ReadConfigFile(mapArgs, mapMultiArgs);
+ /// 7. Determine network (and switch to network specific options)
+ // - Do not call Params() before this step
+ // - Do this after parsing the configuration file, as the network can be switched there
+ // - QSettings() will use the new application name after this, resulting in network-specific settings
+ // - Needs to be done before createOptionsModel
+
+ // Check for -testnet or -regtest parameter (Params() calls are only valid after this clause)
+ if (!SelectParamsFromCommandLine()) {
+ QMessageBox::critical(0, QObject::tr("Bitcoin"), QObject::tr("Error: Invalid combination of -regtest and -testnet."));
+ return 1;
+ }
+#ifdef ENABLE_WALLET
+ // Parse URIs on command line -- this can affect Params()
+ if (!PaymentServer::ipcParseCommandLine(argc, argv))
+ exit(0);
+#endif
+ bool isaTestNet = Params().NetworkID() != CChainParams::MAIN;
+ // Allow for separate UI settings for testnets
+ if (isaTestNet)
+ QApplication::setApplicationName(QAPP_APP_NAME_TESTNET);
+ else
+ QApplication::setApplicationName(QAPP_APP_NAME_DEFAULT);
+ // Re-initialize translations after changing application name (language in network-specific settings can be different)
+ initTranslations(qtTranslatorBase, qtTranslator, translatorBase, translator);
+
#ifdef ENABLE_WALLET
- /// 7. URI IPC sending
+ /// 8. URI IPC sending
// - Do this early as we don't want to bother initializing if we are just calling IPC
// - Do this *after* setting up the data directory, as the data directory hash is used in the name
// of the server.
@@ -535,7 +547,7 @@ int main(int argc, char *argv[])
app.createPaymentServer();
#endif
- /// 8. Main GUI initialization
+ /// 9. Main GUI initialization
// Install global event filter that makes sure that long tooltips can be word-wrapped
app.installEventFilter(new GUIUtil::ToolTipToRichTextFilter(TOOLTIP_WRAP_THRESHOLD, &app));
// Install qDebug() message handler to route to debug.log
diff --git a/src/qt/guiconstants.h b/src/qt/guiconstants.h
index 9f6588bc9e..5ae4bc833d 100644
--- a/src/qt/guiconstants.h
+++ b/src/qt/guiconstants.h
@@ -41,4 +41,9 @@ static const int MAX_PAYMENT_REQUEST_SIZE = 50000; // bytes
/* Number of frames in spinner animation */
#define SPINNER_FRAMES 35
+#define QAPP_ORG_NAME "Bitcoin"
+#define QAPP_ORG_DOMAIN "bitcoin.org"
+#define QAPP_APP_NAME_DEFAULT "Bitcoin-Qt"
+#define QAPP_APP_NAME_TESTNET "Bitcoin-Qt-testnet"
+
#endif // GUICONSTANTS_H
diff --git a/src/qt/intro.cpp b/src/qt/intro.cpp
index 42833a8a33..3bc19f8645 100644
--- a/src/qt/intro.cpp
+++ b/src/qt/intro.cpp
@@ -146,7 +146,7 @@ QString Intro::getDefaultDataDirectory()
return QString::fromStdString(GetDefaultDataDir().string());
}
-void Intro::pickDataDirectory(bool fIsTestnet)
+void Intro::pickDataDirectory()
{
namespace fs = boost::filesystem;
QSettings settings;
@@ -164,10 +164,7 @@ void Intro::pickDataDirectory(bool fIsTestnet)
/* If current default data directory does not exist, let the user choose one */
Intro intro;
intro.setDataDirectory(dataDir);
- if (!fIsTestnet)
- intro.setWindowIcon(QIcon(":icons/bitcoin"));
- else
- intro.setWindowIcon(QIcon(":icons/bitcoin_testnet"));
+ intro.setWindowIcon(QIcon(":icons/bitcoin"));
while(true)
{
diff --git a/src/qt/intro.h b/src/qt/intro.h
index 72693d5544..295a75562f 100644
--- a/src/qt/intro.h
+++ b/src/qt/intro.h
@@ -36,7 +36,7 @@ public:
* @note do NOT call global GetDataDir() before calling this function, this
* will cause the wrong path to be cached.
*/
- static void pickDataDirectory(bool fIsTestnet);
+ static void pickDataDirectory();
/**
* Determine default data directory for operating system.