5 #if defined(HAVE_CONFIG_H)
40 #include <validation.h>
42 #include <boost/signals2/connection.hpp>
45 #include <QApplication>
47 #include <QLibraryInfo>
49 #include <QMessageBox>
53 #include <QTranslator>
55 #if defined(QT_STATICPLUGIN)
57 #if defined(QT_QPA_PLATFORM_XCB)
58 Q_IMPORT_PLUGIN(QXcbIntegrationPlugin);
59 #elif defined(QT_QPA_PLATFORM_WINDOWS)
60 Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin);
61 #elif defined(QT_QPA_PLATFORM_COCOA)
62 Q_IMPORT_PLUGIN(QCocoaIntegrationPlugin);
67 Q_DECLARE_METATYPE(
bool*)
75 qRegisterMetaType<bool*>();
76 qRegisterMetaType<SynchronizationState>();
78 qRegisterMetaType<WalletModel*>();
82 qRegisterMetaType<CAmount>(
"CAmount");
83 qRegisterMetaType<size_t>(
"size_t");
85 qRegisterMetaType<std::function<void()>>(
"std::function<void()>");
86 qRegisterMetaType<QMessageBox::Icon>(
"QMessageBox::Icon");
87 qRegisterMetaType<interfaces::BlockAndHeaderTipInfo>(
"interfaces::BlockAndHeaderTipInfo");
95 QString lang_territory = QLocale::system().name();
97 QString lang_territory_qsettings = settings.value(
"language",
"").toString();
98 if(!lang_territory_qsettings.isEmpty())
99 lang_territory = lang_territory_qsettings;
101 lang_territory = QString::fromStdString(
gArgs.
GetArg(
"-lang", lang_territory.toStdString()));
102 return lang_territory;
106 static void initTranslations(QTranslator &qtTranslatorBase, QTranslator &qtTranslator, QTranslator &translatorBase, QTranslator &translator)
109 QApplication::removeTranslator(&qtTranslatorBase);
110 QApplication::removeTranslator(&qtTranslator);
111 QApplication::removeTranslator(&translatorBase);
112 QApplication::removeTranslator(&translator);
119 QString lang = lang_territory;
120 lang.truncate(lang_territory.lastIndexOf(
'_'));
127 if (qtTranslatorBase.load(
"qt_" + lang, QLibraryInfo::location(QLibraryInfo::TranslationsPath)))
128 QApplication::installTranslator(&qtTranslatorBase);
131 if (qtTranslator.load(
"qt_" + lang_territory, QLibraryInfo::location(QLibraryInfo::TranslationsPath)))
132 QApplication::installTranslator(&qtTranslator);
135 if (translatorBase.load(lang,
":/translations/"))
136 QApplication::installTranslator(&translatorBase);
139 if (translator.load(lang_territory,
":/translations/"))
140 QApplication::installTranslator(&translator);
147 if (type == QtDebugMsg) {
150 LogPrintf(
"GUI: %s\n", msg.toStdString());
170 qDebug() << __func__ <<
": Running initialization in thread";
174 }
catch (
const std::exception& e) {
185 qDebug() << __func__ <<
": Running Shutdown in thread";
187 qDebug() << __func__ <<
": Shutdown finished";
189 }
catch (
const std::exception& e) {
202 optionsModel(nullptr),
203 clientModel(nullptr),
205 pollShutdownTimer(nullptr),
207 platformStyle(nullptr)
211 setQuitOnLastWindowClosed(
false);
219 std::string platformName;
231 qDebug() << __func__ <<
": Stopping thread";
234 qDebug() << __func__ <<
": Stopped thread";
244 void BitcoinApplication::createPaymentServer()
303 connect(
coreThread, &QThread::finished, executor, &QObject::deleteLater);
327 qDebug() << __func__ <<
": Requesting initialize";
339 qDebug() << __func__ <<
": Requesting shutdown";
362 qDebug() << __func__ <<
": Initialization result: " << success;
364 returnValue = success ? EXIT_SUCCESS : EXIT_FAILURE;
374 window->setWalletController(m_wallet_controller);
398 connect(paymentServer, &
PaymentServer::message, [
this](
const QString& title,
const QString& message,
unsigned int style) {
418 QMessageBox::critical(
nullptr,
"Runaway exception", BitcoinGUI::tr(
"A fatal error occurred. %1 can no longer continue safely and will quit.").arg(
PACKAGE_NAME) + QString(
"<br><br>") + message);
419 ::exit(EXIT_FAILURE);
443 util::WinCmdLineArgs winArgs;
444 std::tie(argc, argv) = winArgs.get();
460 Q_INIT_RESOURCE(bitcoin);
461 Q_INIT_RESOURCE(bitcoin_locale);
464 QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
465 #if QT_VERSION >= 0x050600
466 QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
481 QString::fromStdString(
"Error parsing command line arguments: %1.").arg(QString::fromStdString(
error)));
497 QTranslator qtTranslatorBase, qtTranslator, translatorBase, translator;
498 initTranslations(qtTranslatorBase, qtTranslator, translatorBase, translator);
513 bool did_show_intro =
false;
523 QObject::tr(
"Error: Specified data directory \"%1\" does not exist.").arg(QString::fromStdString(
gArgs.
GetArg(
"-datadir",
""))));
529 QObject::tr(
"Error: Cannot parse configuration file: %1.").arg(QString::fromStdString(
error)));
542 }
catch(std::exception &e) {
544 QMessageBox::critical(
nullptr,
PACKAGE_NAME, QObject::tr(
"Error: %1").arg(e.what()));
553 QMessageBox::critical(
nullptr,
PACKAGE_NAME, QObject::tr(
"Error initializing settings: %1").arg(QString::fromStdString(
error)));
558 assert(!networkStyle.isNull());
560 QApplication::setApplicationName(networkStyle->getAppName());
562 initTranslations(qtTranslatorBase, qtTranslator, translatorBase, translator);
577 app.createPaymentServer();
584 #if defined(Q_OS_WIN)
586 qApp->installNativeEventFilter(
new WinShutdownMonitor());
596 if (did_show_intro) {
606 int rv = EXIT_SUCCESS;
615 #if defined(Q_OS_WIN)
616 WinShutdownMonitor::registerShutdownBlockReason(QObject::tr(
"%1 didn't yet exit safely...").arg(
PACKAGE_NAME), (HWND)app.
getMainWinId());
626 }
catch (
const std::exception& e) {
int64_t CAmount
Amount in satoshis (Can be negative)
static void RegisterMetaTypes()
static QString GetLangTerritory()
int GuiMain(int argc, char *argv[])
static void SetupUIArgs(ArgsManager &argsman)
static const char * qt_argv
static void initTranslations(QTranslator &qtTranslatorBase, QTranslator &qtTranslator, QTranslator &translatorBase, QTranslator &translator)
Set up translations.
void DebugMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)
void SelectParams(const std::string &network)
Sets the params returned by Params() to those for the given chain name.
const CChainParams & Params()
Return the currently selected parameters.
bool InitSettings(std::string &error)
Read and update settings file with saved settings.
NODISCARD bool ParseParameters(int argc, const char *const argv[], std::string &error)
bool IsArgSet(const std::string &strArg) const
Return true if the given argument has been manually set.
std::string GetArg(const std::string &strArg, const std::string &strDefault) const
Return string argument or default value.
bool SoftSetBoolArg(const std::string &strArg, bool fValue)
Set a boolean argument if it doesn't already have a value.
NODISCARD bool ReadConfigFiles(std::string &error, bool ignore_invalid_keys=false)
bool GetBoolArg(const std::string &strArg, bool fDefault) const
Return boolean argument or default value.
void AddArg(const std::string &name, const std::string &help, unsigned int flags, const OptionsCategory &cat)
Add argument.
std::string GetChainName() const
Returns the appropriate chain name from the program arguments.
Main Bitcoin application object.
void requestedInitialize()
ClientModel * clientModel
void createSplashScreen(const NetworkStyle *networkStyle)
Create splash screen.
void requestShutdown()
Request core shutdown.
void windowShown(BitcoinGUI *window)
void initializeResult(bool success, interfaces::BlockAndHeaderTipInfo tip_info)
void setNode(interfaces::Node &node)
QTimer * pollShutdownTimer
void InitializePruneSetting(bool prune)
Initialize prune setting.
interfaces::Node * m_node
const PlatformStyle * platformStyle
bool baseInitialize()
Basic initialization, before starting initialization/shutdown thread. Return true on success.
int getReturnValue() const
Get process return value.
void createWindow(const NetworkStyle *networkStyle)
Create main window.
void parameterSetup()
parameter interaction/setup based on rules
void handleRunawayException(const QString &message)
Handle runaway exceptions. Shows a message box with the problem and quits the program.
OptionsModel * optionsModel
void createOptionsModel(bool resetSettings)
Create options model.
void setupPlatformStyle()
Setup platform style.
std::unique_ptr< QWidget > shutdownWindow
void requestInitialize()
Request core initialization.
WId getMainWinId() const
Get window identifier of QMainWindow (BitcoinGUI)
interfaces::Node & node() const
Class encapsulating Bitcoin Core startup and shutdown.
void initializeResult(bool success, interfaces::BlockAndHeaderTipInfo tip_info)
BitcoinCore(interfaces::Node &node)
interfaces::Node & m_node
void runawayException(const QString &message)
void handleRunawayException(const std::exception *e)
Pass fatal exception message to UI thread.
static const std::string DEFAULT_UIPLATFORM
void setClientModel(ClientModel *clientModel=nullptr, interfaces::BlockAndHeaderTipInfo *tip_info=nullptr)
Set the client model.
void receivedURI(const QString &uri)
Signal raised when a URI was entered or dragged to the GUI.
void unsubscribeFromCoreSignals()
Disconnect core signals from GUI client.
bool hasTrayIcon() const
Get the tray icon status.
void detectShutdown()
called by a timer to check if ShutdownRequested() has been set
void message(const QString &title, QString message, unsigned int style, bool *ret=nullptr, const QString &detailed_message=QString())
Notify the user of an event from the core network or transaction handling code.
Model for Bitcoin network client.
OptionsModel * getOptionsModel()
Qt event filter that intercepts QEvent::FocusOut events for QLabel objects, and resets their ‘textInt...
Qt event filter that intercepts ToolTipChange events, and replaces the tooltip with a rich text repre...
"Help message" dialog box
static bool showIfNeeded(bool &did_show_intro, bool &prune)
Determine data directory.
static const NetworkStyle * instantiate(const std::string &networkId)
Get style associated with provided network id, or 0 if not known.
Interface from Qt to configuration data structure for Bitcoin client.
void SetPruneTargetGB(int prune_target_gb, bool force=false)
bool getMinimizeToTray() const
void setNode(interfaces::Node &node)
static bool ipcSendCommandLine()
void message(const QString &title, const QString &message, unsigned int style)
static void ipcParseCommandLine(int argc, char *argv[])
void receivedPaymentRequest(SendCoinsRecipient)
void handleURIOrFile(const QString &s)
static QWidget * showShutdownWindow(QMainWindow *window)
Class for the splashscreen with information of the running client.
void finish()
Hide the splash screen window and schedule the splash screen object for deletion.
void handleLoadWallet()
Handle wallet load notifications.
void setNode(interfaces::Node &node)
Controller between interfaces::Node, WalletModel instances and the GUI.
static bool isWalletEnabled()
Top-level interface for a bitcoin node (bitcoind process).
virtual bool baseInitialize()=0
Initialize app dependencies.
virtual bilingual_str getWarnings()=0
Get warnings.
virtual void appShutdown()=0
Stop node.
virtual void startShutdown()=0
Start shutdown.
virtual bool appInitMain(interfaces::BlockAndHeaderTipInfo *tip_info=nullptr)=0
Start node.
static constexpr int DEFAULT_PRUNE_TARGET_GB
static const int TOOLTIP_WRAP_THRESHOLD
static const bool DEFAULT_SPLASHSCREEN
#define QAPP_APP_NAME_DEFAULT
void InitLogging(const ArgsManager &args)
Initialize global loggers.
void SetupServerArgs(NodeContext &node)
Register all arguments with the ArgsManager.
void InitParameterInteraction(ArgsManager &args)
Parameter interaction: change current parameters depending on various rules.
static const bool DEFAULT_CHOOSE_DATADIR
static void LogPrintf(const char *fmt, const Args &... args)
#define LogPrint(category,...)
void LogQtInfo()
Writes to debug.log short info about the used Qt and the host system.
std::unique_ptr< Node > MakeNode(NodeContext *context)
Return implementation of Node interface.
void ThreadSetInternalName(std::string &&)
Set the internal (in-memory) name of the current thread only.
void ThreadRename(std::string &&)
Rename a thread both in terms of an internal (in-memory) name as well as its system thread name.
bool noui_ThreadSafeQuestion(const bilingual_str &, const std::string &message, const std::string &caption, unsigned int style)
Non-GUI handler, which logs and prints questions.
void noui_InitMessage(const std::string &message)
Non-GUI handler, which only logs a message.
bool noui_ThreadSafeMessageBox(const bilingual_str &message, const std::string &caption, unsigned int style)
Non-GUI handler, which logs and prints messages.
NodeContext struct containing references to chain state and connection state.
Block and header tip information.
bool HelpRequested(const ArgsManager &args)
bool CheckDataDirOption()
void PrintExceptionContinue(const std::exception *pex, const char *pszThread)
bool error(const char *fmt, const Args &... args)
bilingual_str Untranslated(std::string original)
Mark a bilingual_str as untranslated.
CClientUIInterface uiInterface
bool InitError(const bilingual_str &str)
Show error message.
SynchronizationState
Current sync state passed to tip changed callbacks.