From 3d48bead115777fe98bfdd8396fedeb7b345bec9 Mon Sep 17 00:00:00 2001 From: wqking Date: Wed, 3 Mar 2021 15:42:51 +0800 Subject: [PATCH 1/3] Release mouse before showing message box --- src/qt/notificator.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/qt/notificator.cpp b/src/qt/notificator.cpp index 727d5c02c..07eb12027 100755 --- a/src/qt/notificator.cpp +++ b/src/qt/notificator.cpp @@ -258,6 +258,9 @@ void Notificator::notify(Class cls, const QString& title, const QString& text, c default: if (cls == Critical) { // Fall back to old fashioned pop-up dialog if critical and no other notification available +#ifdef Q_OS_WIN + ReleaseCapture(); +#endif QMessageBox::critical(parent, title, text, QMessageBox::Ok, QMessageBox::Ok); } break; From 8cfc7037cd7b98f60d6b5bf1579a2a766aa46d2f Mon Sep 17 00:00:00 2001 From: tohsnoom Date: Fri, 5 Mar 2021 11:38:57 -0600 Subject: [PATCH 2/3] Updated notificator from bitcoin upstream --- src/qt/notificator.cpp | 150 ++++++++++++++++++----------------------- src/qt/notificator.h | 45 +++++++------ 2 files changed, 90 insertions(+), 105 deletions(-) diff --git a/src/qt/notificator.cpp b/src/qt/notificator.cpp index 07eb12027..b097ef080 100755 --- a/src/qt/notificator.cpp +++ b/src/qt/notificator.cpp @@ -1,13 +1,11 @@ -// Copyright (c) 2011-2013 The Bitcoin developers -// Copyright (c) 2017 The PIVX developers -// Distributed under the MIT/X11 software license, see the accompanying +// Copyright (c) 2011-2020 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#include "notificator.h" +#include #include #include -#include #include #include #include @@ -16,16 +14,11 @@ #include #include #ifdef USE_DBUS -#include #include +#include #endif -// Include ApplicationServices.h after QtDbus to avoid redefinition of check(). -// This affects at least OSX 10.6. See /usr/include/AssertMacros.h for details. -// Note: This could also be worked around using: -// #define __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES 0 #ifdef Q_OS_MAC -#include "macnotificationhandler.h" -#include +#include #endif @@ -34,29 +27,31 @@ const int FREEDESKTOP_NOTIFICATION_ICON_SIZE = 128; #endif -Notificator::Notificator(const QString& programName, QSystemTrayIcon* trayicon, QWidget* parent) : QObject(parent), - parent(parent), - programName(programName), - mode(None), - trayIcon(trayicon) +Notificator::Notificator(const QString &_programName, QSystemTrayIcon *_trayIcon, QWidget *_parent) : + QObject(_parent), + parent(_parent), + programName(_programName), + mode(None), + trayIcon(_trayIcon) #ifdef USE_DBUS - , - interface(0) + ,interface(nullptr) #endif { - if (trayicon && trayicon->supportsMessages()) { + if(_trayIcon && _trayIcon->supportsMessages()) + { mode = QSystemTray; } #ifdef USE_DBUS interface = new QDBusInterface("org.freedesktop.Notifications", "/org/freedesktop/Notifications", "org.freedesktop.Notifications"); - if (interface->isValid()) { + if(interface->isValid()) + { mode = Freedesktop; } #endif #ifdef Q_OS_MAC // check if users OS has support for NSUserNotification - if (MacNotificationHandler::instance()->hasUserNotificationCenterSupport()) { + if( MacNotificationHandler::instance()->hasUserNotificationCenterSupport()) { mode = UserNotificationCenter; } #endif @@ -71,17 +66,17 @@ Notificator::~Notificator() #ifdef USE_DBUS -// Loosely based on http://www.qtcentre.org/archive/index.php/t-25879.html +// Loosely based on https://www.qtcentre.org/archive/index.php/t-25879.html class FreedesktopImage { public: FreedesktopImage() {} - FreedesktopImage(const QImage& img); + explicit FreedesktopImage(const QImage &img); static int metaType(); // Image to variant that can be marshalled over DBus - static QVariant toVariant(const QImage& img); + static QVariant toVariant(const QImage &img); private: int width, height, stride; @@ -90,8 +85,8 @@ class FreedesktopImage int bitsPerSample; QByteArray image; - friend QDBusArgument& operator<<(QDBusArgument& a, const FreedesktopImage& i); - friend const QDBusArgument& operator>>(const QDBusArgument& a, FreedesktopImage& i); + friend QDBusArgument &operator<<(QDBusArgument &a, const FreedesktopImage &i); + friend const QDBusArgument &operator>>(const QDBusArgument &a, FreedesktopImage &i); }; Q_DECLARE_METATYPE(FreedesktopImage); @@ -101,29 +96,31 @@ const int CHANNELS = 4; const int BYTES_PER_PIXEL = 4; const int BITS_PER_SAMPLE = 8; -FreedesktopImage::FreedesktopImage(const QImage& img) : width(img.width()), - height(img.height()), - stride(img.width() * BYTES_PER_PIXEL), - hasAlpha(true), - channels(CHANNELS), - bitsPerSample(BITS_PER_SAMPLE) +FreedesktopImage::FreedesktopImage(const QImage &img): + width(img.width()), + height(img.height()), + stride(img.width() * BYTES_PER_PIXEL), + hasAlpha(true), + channels(CHANNELS), + bitsPerSample(BITS_PER_SAMPLE) { // Convert 00xAARRGGBB to RGBA bytewise (endian-independent) format QImage tmp = img.convertToFormat(QImage::Format_ARGB32); - const uint32_t* data = reinterpret_cast(tmp.bits()); + const uint32_t *data = reinterpret_cast(tmp.bits()); unsigned int num_pixels = width * height; image.resize(num_pixels * BYTES_PER_PIXEL); - for (unsigned int ptr = 0; ptr < num_pixels; ++ptr) { - image[ptr * BYTES_PER_PIXEL + 0] = data[ptr] >> 16; // R - image[ptr * BYTES_PER_PIXEL + 1] = data[ptr] >> 8; // G - image[ptr * BYTES_PER_PIXEL + 2] = data[ptr]; // B - image[ptr * BYTES_PER_PIXEL + 3] = data[ptr] >> 24; // A + for(unsigned int ptr = 0; ptr < num_pixels; ++ptr) + { + image[ptr*BYTES_PER_PIXEL+0] = data[ptr] >> 16; // R + image[ptr*BYTES_PER_PIXEL+1] = data[ptr] >> 8; // G + image[ptr*BYTES_PER_PIXEL+2] = data[ptr]; // B + image[ptr*BYTES_PER_PIXEL+3] = data[ptr] >> 24; // A } } -QDBusArgument& operator<<(QDBusArgument& a, const FreedesktopImage& i) +QDBusArgument &operator<<(QDBusArgument &a, const FreedesktopImage &i) { a.beginStructure(); a << i.width << i.height << i.stride << i.hasAlpha << i.bitsPerSample << i.channels << i.image; @@ -131,7 +128,7 @@ QDBusArgument& operator<<(QDBusArgument& a, const FreedesktopImage& i) return a; } -const QDBusArgument& operator>>(const QDBusArgument& a, FreedesktopImage& i) +const QDBusArgument &operator>>(const QDBusArgument &a, FreedesktopImage &i) { a.beginStructure(); a >> i.width >> i.height >> i.stride >> i.hasAlpha >> i.bitsPerSample >> i.channels >> i.image; @@ -144,22 +141,22 @@ int FreedesktopImage::metaType() return qDBusRegisterMetaType(); } -QVariant FreedesktopImage::toVariant(const QImage& img) +QVariant FreedesktopImage::toVariant(const QImage &img) { FreedesktopImage fimg(img); return QVariant(FreedesktopImage::metaType(), &fimg); } -void Notificator::notifyDBus(Class cls, const QString& title, const QString& text, const QIcon& icon, int millisTimeout) +void Notificator::notifyDBus(Class cls, const QString &title, const QString &text, const QIcon &icon, int millisTimeout) { - Q_UNUSED(cls); - // Arguments for DBus call: + // https://developer.gnome.org/notification-spec/ + // Arguments for DBus "Notify" call: QList args; // Program Name: args.append(programName); - // Unique ID of this notification type: + // Replaces ID; A value of 0 means that this notification won't replace any existing notifications: args.append(0U); // Application Icon, empty string @@ -180,23 +177,20 @@ void Notificator::notifyDBus(Class cls, const QString& title, const QString& tex // If no icon specified, set icon based on class QIcon tmpicon; - if (icon.isNull()) { + if(icon.isNull()) + { QStyle::StandardPixmap sicon = QStyle::SP_MessageBoxQuestion; - switch (cls) { - case Information: - sicon = QStyle::SP_MessageBoxInformation; - break; - case Warning: - sicon = QStyle::SP_MessageBoxWarning; - break; - case Critical: - sicon = QStyle::SP_MessageBoxCritical; - break; - default: - break; + switch(cls) + { + case Information: sicon = QStyle::SP_MessageBoxInformation; break; + case Warning: sicon = QStyle::SP_MessageBoxWarning; break; + case Critical: sicon = QStyle::SP_MessageBoxCritical; break; + default: break; } tmpicon = QApplication::style()->standardIcon(sicon); - } else { + } + else + { tmpicon = icon; } hints["icon_data"] = FreedesktopImage::toVariant(tmpicon.pixmap(FREEDESKTOP_NOTIFICATION_ICON_SIZE).toImage()); @@ -210,57 +204,47 @@ void Notificator::notifyDBus(Class cls, const QString& title, const QString& tex } #endif -void Notificator::notifySystray(Class cls, const QString& title, const QString& text, const QIcon& icon, int millisTimeout) +void Notificator::notifySystray(Class cls, const QString &title, const QString &text, int millisTimeout) { - Q_UNUSED(icon); QSystemTrayIcon::MessageIcon sicon = QSystemTrayIcon::NoIcon; - switch (cls) // Set icon based on class + switch(cls) // Set icon based on class { - case Information: - sicon = QSystemTrayIcon::Information; - break; - case Warning: - sicon = QSystemTrayIcon::Warning; - break; - case Critical: - sicon = QSystemTrayIcon::Critical; - break; + case Information: sicon = QSystemTrayIcon::Information; break; + case Warning: sicon = QSystemTrayIcon::Warning; break; + case Critical: sicon = QSystemTrayIcon::Critical; break; } trayIcon->showMessage(title, text, sicon, millisTimeout); } -// Based on Qt's tray icon implementation #ifdef Q_OS_MAC -void Notificator::notifyMacUserNotificationCenter(Class cls, const QString& title, const QString& text, const QIcon& icon) +void Notificator::notifyMacUserNotificationCenter(const QString &title, const QString &text) { // icon is not supported by the user notification center yet. OSX will use the app icon. MacNotificationHandler::instance()->showNotification(title, text); } - #endif -void Notificator::notify(Class cls, const QString& title, const QString& text, const QIcon& icon, int millisTimeout) +void Notificator::notify(Class cls, const QString &title, const QString &text, const QIcon &icon, int millisTimeout) { - switch (mode) { + switch(mode) + { #ifdef USE_DBUS case Freedesktop: notifyDBus(cls, title, text, icon, millisTimeout); break; #endif case QSystemTray: - notifySystray(cls, title, text, icon, millisTimeout); + notifySystray(cls, title, text, millisTimeout); break; #ifdef Q_OS_MAC case UserNotificationCenter: - notifyMacUserNotificationCenter(cls, title, text, icon); + notifyMacUserNotificationCenter(title, text); break; #endif default: - if (cls == Critical) { + if(cls == Critical) + { // Fall back to old fashioned pop-up dialog if critical and no other notification available -#ifdef Q_OS_WIN - ReleaseCapture(); -#endif QMessageBox::critical(parent, title, text, QMessageBox::Ok, QMessageBox::Ok); } break; diff --git a/src/qt/notificator.h b/src/qt/notificator.h index db463b246..87c3e134e 100755 --- a/src/qt/notificator.h +++ b/src/qt/notificator.h @@ -1,13 +1,12 @@ -// Copyright (c) 2011-2013 The Bitcoin developers -// Copyright (c) 2017 The PIVX developers -// Distributed under the MIT/X11 software license, see the accompanying +// Copyright (c) 2011-2018 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #ifndef BITCOIN_QT_NOTIFICATOR_H #define BITCOIN_QT_NOTIFICATOR_H #if defined(HAVE_CONFIG_H) -#include "config/vitae-config.h" +#include #endif #include @@ -22,7 +21,7 @@ class QDBusInterface; QT_END_NAMESPACE /** Cross-platform desktop notification client. */ -class Notificator : public QObject +class Notificator: public QObject { Q_OBJECT @@ -30,17 +29,18 @@ class Notificator : public QObject /** Create a new notificator. @note Ownership of trayIcon is not transferred to this object. */ - Notificator(const QString& programName, QSystemTrayIcon* trayIcon, QWidget* parent); + Notificator(const QString &programName, QSystemTrayIcon *trayIcon, QWidget *parent); ~Notificator(); // Message class - enum Class { - Information, /**< Informational message */ - Warning, /**< Notify user of potential problem */ - Critical /**< An error occurred */ + enum Class + { + Information, /**< Informational message */ + Warning, /**< Notify user of potential problem */ + Critical /**< An error occurred */ }; -public slots: +public Q_SLOTS: /** Show notification message. @param[in] cls general message class @param[in] title title shown with message @@ -49,27 +49,28 @@ public slots: @param[in] millisTimeout notification timeout in milliseconds (defaults to 10 seconds) @note Platform implementations are free to ignore any of the provided fields except for \a text. */ - void notify(Class cls, const QString& title, const QString& text, const QIcon& icon = QIcon(), int millisTimeout = 10000); + void notify(Class cls, const QString &title, const QString &text, + const QIcon &icon = QIcon(), int millisTimeout = 10000); private: - QWidget* parent; + QWidget *parent; enum Mode { - None, /**< Ignore informational notifications, and show a modal pop-up dialog for Critical notifications. */ - Freedesktop, /**< Use DBus org.freedesktop.Notifications */ - QSystemTray, /**< Use QSystemTray::showMessage */ - UserNotificationCenter /**< Use the 10.8+ User Notification Center (Mac only) */ + None, /**< Ignore informational notifications, and show a modal pop-up dialog for Critical notifications. */ + Freedesktop, /**< Use DBus org.freedesktop.Notifications */ + QSystemTray, /**< Use QSystemTrayIcon::showMessage() */ + UserNotificationCenter /**< Use the 10.8+ User Notification Center (Mac only) */ }; QString programName; Mode mode; - QSystemTrayIcon* trayIcon; + QSystemTrayIcon *trayIcon; #ifdef USE_DBUS - QDBusInterface* interface; + QDBusInterface *interface; - void notifyDBus(Class cls, const QString& title, const QString& text, const QIcon& icon, int millisTimeout); + void notifyDBus(Class cls, const QString &title, const QString &text, const QIcon &icon, int millisTimeout); #endif - void notifySystray(Class cls, const QString& title, const QString& text, const QIcon& icon, int millisTimeout); + void notifySystray(Class cls, const QString &title, const QString &text, int millisTimeout); #ifdef Q_OS_MAC - void notifyMacUserNotificationCenter(Class cls, const QString& title, const QString& text, const QIcon& icon); + void notifyMacUserNotificationCenter(const QString &title, const QString &text); #endif }; From 60febbe081044ed82309ff66c6826adeb6d21387 Mon Sep 17 00:00:00 2001 From: tohsnoom Date: Fri, 5 Mar 2021 13:26:46 -0600 Subject: [PATCH 3/3] Restored minimum stake age consensus rule code --- src/kernel.cpp | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/kernel.cpp b/src/kernel.cpp index 4739b8e1e..992df343a 100755 --- a/src/kernel.cpp +++ b/src/kernel.cpp @@ -479,25 +479,24 @@ bool CheckProofOfStake(const CBlock& block, uint256& hashProofOfStake, std::uniq const CTransaction tx = block.vtx[1]; // Kernel (input 0) must match the stake hash target per coin age (nBits) - //const CTxIn& txin = tx.vin[0]; + const CTxIn& txin = tx.vin[0]; CBlockIndex* pindexPrev = mapBlockIndex[block.hashPrevBlock]; - CBlockIndex* pindexfrom = stake->GetIndexFrom(); - if (!pindexfrom) + CBlockIndex* pindexFrom = stake->GetIndexFrom(); + if (!pindexFrom) return error("%s : Failed to find the block index for stake origin", __func__); //unsigned int nBlockFromTime = pindexfrom->nTime; unsigned int nTxTime = block.nTime; //const int nBlockFromHeight = pindexfrom->nHeight; - /*if (!txin.IsZerocoinSpend() && nPreviousBlockHeight >= Params().Zerocoin_Block_Public_Spend_Enabled() - 1) { - //Equivalent for zVIT is checked above in ContextualCheckZerocoinStake() - if (nTxTime < nBlockFromTime) // Transaction timestamp nTxTime - return error("%s : nTime violation - nBlockFromTime=%d nTimeTx=%d", __func__, nBlockFromTime, nTxTime); - if (nBlockFromTime + Params().StakeMinAge(nPreviousBlockHeight + 1) > nTxTime) // Min age requirement - return error("%s : min age violation - nBlockFromTime=%d nStakeMinAge=%d nTimeTx=%d", - __func__, nBlockFromTime, Params().StakeMinAge(nPreviousBlockHeight + 1), nTxTime); + const int nHeightBlockFrom = pindexFrom->nHeight; + const uint32_t nTimeBlockFrom = pindexFrom->nTime; + + if (!txin.IsZerocoinSpend()) { + if(! Params().HasStakeMinAgeOrDepth(nPreviousBlockHeight + 1, block.nTime, nHeightBlockFrom, nTimeBlockFrom, getStakeModifierV2SporkValue())) + return error("%s : min age violation - height=%d - time=%d, nHeightBlockFrom=%d, nTimeBlockFrom=%d", + __func__, nPreviousBlockHeight + 1, block.nTime, nHeightBlockFrom, nTimeBlockFrom); } - */ if (!CheckStakeKernelHash(pindexPrev, block.nBits, stake.get(), nTxTime, hashProofOfStake, true)) return error("%s : INFO: check kernel failed on coinstake %s, hashProof=%s", __func__, @@ -528,5 +527,4 @@ bool CheckStakeModifierCheckpoints(int nHeight, unsigned int nStakeModifierCheck return nStakeModifierChecksum == mapStakeModifierCheckpoints[nHeight]; } return true; -} - +} \ No newline at end of file