Inside Bitcoin
Opening the selected file…
Inside Bitcoin
Opening the selected file…
The code behind the network, with room to understand it.
Release published 2026-10-28 · Snapshot fetched 2026-11-01. Latest stable release at fetch time; development branches and Git history are excluded. Only the selected code window and visible folders load here.
1// Copyright (c) 2011-present The Bitcoin Core developers2// Distributed under the MIT software license, see the accompanying3// file COPYING or http://www.opensource.org/licenses/mit-license.php.5#include <bitcoin-build-config.h> // IWYU pragma: keep7#include <qt/splashscreen.h>9#include <clientversion.h>10#include <common/license_info.h>11#include <common/system.h>12#include <interfaces/handler.h>13#include <interfaces/node.h>14#include <interfaces/wallet.h>15#include <qt/guiutil.h>16#include <qt/networkstyle.h>17#include <qt/walletmodel.h>18#include <util/translation.h>20#include <functional>22#include <QApplication>23#include <QCloseEvent>24#include <QPainter>25#include <QRadialGradient>26#include <QScreen>29SplashScreen::SplashScreen(const NetworkStyle* networkStyle)30: QWidget()31{32// set reference point, paddings33int paddingRight = 50;34int paddingTop = 50;35int titleVersionVSpace = 17;36int titleCopyrightVSpace = 40;38float fontFactor = 1.0;39float devicePixelRatio = 1.0;40devicePixelRatio = static_cast<QGuiApplication*>(QCoreApplication::instance())->devicePixelRatio();42// define text to place43QString titleText = CLIENT_NAME;44QString versionText = QString("Version %1").arg(QString::fromStdString(FormatFullVersion()));45QString copyrightText = QString::fromUtf8(CopyrightHolders(strprintf("\xc2\xA9 %u-%u ", 2009, COPYRIGHT_YEAR)).c_str());46const QString& titleAddText = networkStyle->getTitleAddText();48QString font = QApplication::font().toString();50// create a bitmap according to device pixelratio51QSize splashSize(480*devicePixelRatio,320*devicePixelRatio);52pixmap = QPixmap(splashSize);54// change to HiDPI if it makes sense55pixmap.setDevicePixelRatio(devicePixelRatio);57QPainter pixPaint(&pixmap);58pixPaint.setPen(QColor(100,100,100));60// draw a slightly radial gradient61QRadialGradient gradient(QPoint(0,0), splashSize.width()/devicePixelRatio);62gradient.setColorAt(0, Qt::white);63gradient.setColorAt(1, QColor(247,247,247));64QRect rGradient(QPoint(0,0), splashSize);65pixPaint.fillRect(rGradient, gradient);67// draw the bitcoin icon, expected size of PNG: 1024x102468QRect rectIcon(QPoint(-150,-122), QSize(430,430));70const QSize requiredSize(1024,1024);71QPixmap icon(networkStyle->getAppIcon().pixmap(requiredSize));73pixPaint.drawPixmap(rectIcon, icon);75// check font size and drawing with76pixPaint.setFont(QFont(font, 33*fontFactor));77QFontMetrics fm = pixPaint.fontMetrics();78int titleTextWidth = GUIUtil::TextWidth(fm, titleText);79if (titleTextWidth > 176) {80fontFactor = fontFactor * 176 / titleTextWidth;81}83pixPaint.setFont(QFont(font, 33*fontFactor));84fm = pixPaint.fontMetrics();85titleTextWidth = GUIUtil::TextWidth(fm, titleText);86pixPaint.drawText(pixmap.width()/devicePixelRatio-titleTextWidth-paddingRight,paddingTop,titleText);88pixPaint.setFont(QFont(font, 15*fontFactor));90// if the version string is too long, reduce size91fm = pixPaint.fontMetrics();92int versionTextWidth = GUIUtil::TextWidth(fm, versionText);93if(versionTextWidth > titleTextWidth+paddingRight-10) {94pixPaint.setFont(QFont(font, 10*fontFactor));95titleVersionVSpace -= 5;96}97pixPaint.drawText(pixmap.width()/devicePixelRatio-titleTextWidth-paddingRight+2,paddingTop+titleVersionVSpace,versionText);99// draw copyright stuff100{101pixPaint.setFont(QFont(font, 10*fontFactor));102const int x = pixmap.width()/devicePixelRatio-titleTextWidth-paddingRight;103const int y = paddingTop+titleCopyrightVSpace;104QRect copyrightRect(x, y, pixmap.width() - x - paddingRight, pixmap.height() - y);105pixPaint.drawText(copyrightRect, Qt::AlignLeft | Qt::AlignTop | Qt::TextWordWrap, copyrightText);106}108// draw additional text if special network109if(!titleAddText.isEmpty()) {110QFont boldFont = QFont(font, 10*fontFactor);111boldFont.setWeight(QFont::Bold);112pixPaint.setFont(boldFont);113fm = pixPaint.fontMetrics();114int titleAddTextWidth = GUIUtil::TextWidth(fm, titleAddText);115pixPaint.drawText(pixmap.width()/devicePixelRatio-titleAddTextWidth-10,15,titleAddText);116}118pixPaint.end();120// Set window title121setWindowTitle(titleText + " " + titleAddText);123// Resize window and move to center of desktop, disallow resizing124QRect r(QPoint(), QSize(pixmap.size().width()/devicePixelRatio,pixmap.size().height()/devicePixelRatio));125resize(r.size());126setFixedSize(r.size());127move(QGuiApplication::primaryScreen()->geometry().center() - r.center());129installEventFilter(this);131GUIUtil::handleCloseWindowShortcut(this);132}134SplashScreen::~SplashScreen()135{136if (m_node) unsubscribeFromCoreSignals();137}139void SplashScreen::setNode(interfaces::Node& node)140{141assert(!m_node);142m_node = &node;143subscribeToCoreSignals();144if (m_shutdown) m_node->startShutdown();145}147void SplashScreen::shutdown()148{149m_shutdown = true;150if (m_node) m_node->startShutdown();151}153bool SplashScreen::eventFilter(QObject * obj, QEvent * ev) {154if (ev->type() == QEvent::KeyPress) {155QKeyEvent *keyEvent = static_cast<QKeyEvent *>(ev);156if (keyEvent->key() == Qt::Key_Q) {157shutdown();158}159}160return QObject::eventFilter(obj, ev);161}163static void InitMessage(SplashScreen *splash, const std::string &message)164{165bool invoked = QMetaObject::invokeMethod(splash, "showMessage",166Qt::QueuedConnection,167Q_ARG(QString, QString::fromStdString(message)),168Q_ARG(int, Qt::AlignBottom|Qt::AlignHCenter),169Q_ARG(QColor, QColor(55,55,55)));170assert(invoked);171}173static void ShowProgress(SplashScreen *splash, const std::string &title, int nProgress, bool resume_possible)174{175InitMessage(splash, title + std::string("\n") +176(resume_possible ? SplashScreen::tr("(press q to shutdown and continue later)").toStdString()177: SplashScreen::tr("press q to shutdown").toStdString()) +178strprintf("\n%d", nProgress) + "%");179}181void SplashScreen::subscribeToCoreSignals()182{183// Connect signals to client184m_handler_init_message = m_node->handleInitMessage([this](const std::string& message) {185InitMessage(this, message);186});187m_handler_show_progress = m_node->handleShowProgress([this](const std::string& title, int nProgress, bool resume_possible) {188ShowProgress(this, title, nProgress, resume_possible);189});190m_handler_init_wallet = m_node->handleInitWallet([this]() { handleLoadWallet(); });191}193void SplashScreen::handleLoadWallet()194{195#ifdef ENABLE_WALLET196if (!WalletModel::isWalletEnabled()) return;197m_handler_load_wallet = m_node->walletLoader().handleLoadWallet([this](std::unique_ptr<interfaces::Wallet> wallet) {198m_connected_wallet_handlers.emplace_back(wallet->handleShowProgress([this](const std::string& title, int nProgress) {199ShowProgress(this, title, nProgress, /*resume_possible=*/false);200}));201m_connected_wallets.emplace_back(std::move(wallet));202});203#endif204}206void SplashScreen::unsubscribeFromCoreSignals()207{208// Disconnect signals from client209m_handler_init_message->disconnect();210m_handler_show_progress->disconnect();211for (const auto& handler : m_connected_wallet_handlers) {212handler->disconnect();213}214m_connected_wallet_handlers.clear();215m_connected_wallets.clear();216}218void SplashScreen::showMessage(const QString &message, int alignment, const QColor &color)219{220curMessage = message;221curAlignment = alignment;222curColor = color;223update();224}226void SplashScreen::paintEvent(QPaintEvent *event)227{228QPainter painter(this);229painter.drawPixmap(0, 0, pixmap);230QRect r = rect().adjusted(5, 5, -5, -5);231painter.setPen(curColor);232painter.drawText(r, curAlignment, curMessage);233}235void SplashScreen::closeEvent(QCloseEvent *event)236{237shutdown(); // allows an "emergency" shutdown during startup238event->ignore();239}
Independent explanations by MyBitcoinExplorer. Not affiliated with or endorsed by Bitcoin Core. Guides are educational and do not replace the source or its tests.
Bitcoin Core source © its contributors, distributed under the MIT license. Original notices and bundled third-party licenses are retained in the source tree.