diff --git a/.gitignore b/.gitignore index 6ff6fdd109b6..22e46ade8c0e 100644 --- a/.gitignore +++ b/.gitignore @@ -132,3 +132,18 @@ paccoin-cli paccoind paccoin-qt make + +#Custom build +generate-mac-wallet.sh +kill_PAC.sh +paccoin-qt.config +paccoin-qt.creator +paccoin-qt.creator.user +paccoin-qt.files +paccoin-qt.includes +contrib/dash-qt.pro.user +src/qt/paccoin-qt.config +src/qt/paccoin-qt.file +src/qt/paccoin-qt.includes +src/qt/paccoin-qt.creator +src/qt/paccoin-qt.creator.user diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 000000000000..a36b90cc8f28 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,83 @@ +# This CMakeLists.txt is not meant to actually work! +# It only serves as a dummy project to make CLion work properly when it comes to symbol resolution and all the nice +# features dependent on that. Building must still be done on the command line using the automake build chain +# If you load this project in CLion and would like to run/debug executables, make sure to remove the "Build" entry from +# the run/debug configuration as otherwise CLion will try to build this project with cmake, failing horribly. +# You'll also have to manually change the executable in the configuration to the correct path of the already built executable + +cmake_minimum_required(VERSION 3.7) +project(paccoin) + +set(CMAKE_CXX_STANDARD 14) + +include_directories( + src + src/qt/forms + src/leveldb/include + src/univalue/include +) + +if(UNIX AND NOT APPLE) + set(DEPENDS_PREFIX depends/x86_64-pc-linux-gnu) +elseif(APPLE) + set(DEPENDS_PREFIX depends/x86_64-apple-darwin11) +elseif(WIN32) + set(DEPENDS_PREFIX depends/x86_64-w64-mingw32) +endif() + +message(STATUS "DEPENDS_PREFIX: ${DEPENDS_PREFIX}") + +if(DEFINED DEPENDS_PREFIX) + include_directories(${DEPENDS_PREFIX}/include) + include_directories(${DEPENDS_PREFIX}/include/QtWidgets) +endif() + +add_definitions( + -DENABLE_WALLET=1 +) + +file(GLOB SOURCE_FILES + src/bench/*.cpp + src/bench/*.h + src/compat/*.cpp + src/compat/*.h + src/consensus/*.h + src/consensus/*.cpp + src/crypto/*.c + src/crypto/*.h + src/crypto/*.cpp + src/leveldb/db/*.cc + src/leveldb/db/*.h + src/leveldb/include/*.h + src/policy/*.cpp + src/policy/*.h + src/primitives/*.cpp + src/primitives/*.h + src/qt/test/*.cpp + src/qt/test/*.h + src/qt/*.cpp + src/qt/*.h + src/script/*.cpp + src/script/*.h + src/secp256k1/include/*.h + src/test/*.cpp + src/test/*.h + src/univalue/include/*.h + src/univalue/lib/*.cpp + src/univalue/lib/*.h + src/wallet/test/*.cpp + src/wallet/*.cpp + src/wallet/*.h + src/zmq/*.cpp + src/zmq/*.h + src/*.cpp + src/*.h + src/evo/*.h + src/evo/*.cpp + src/llmq/*.h + src/llmq/*.cpp + src/rpc/*.cpp + src/rpc/*.h + ) + +add_executable(paccoin ${SOURCE_FILES}) diff --git a/Makefile.am b/Makefile.am index b0c2a26d6921..1df6b19d26a8 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,30 +1,50 @@ +# Copyright (c) 2013-2016 The Bitcoin Core developers +# Copyright (c) 2014-2018 The Paccoin Core developers +# Copyright (c) 2018-2019 The Paccoin Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + ACLOCAL_AMFLAGS = -I build-aux/m4 SUBDIRS = src +if ENABLE_MAN +SUBDIRS += doc/man +endif .PHONY: deploy FORCE GZIP_ENV="-9n" +export PYTHONPATH if BUILD_BITCOIN_LIBS pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libpaccoinconsensus.pc endif -BITCOIND_BIN=$(top_builddir)/src/paccoind$(EXEEXT) -BITCOIN_QT_BIN=$(top_builddir)/src/qt/paccoin-qt$(EXEEXT) -BITCOIN_CLI_BIN=$(top_builddir)/src/paccoin-cli$(EXEEXT) +BITCOIND_BIN=$(top_builddir)/src/$(BITCOIN_DAEMON_NAME)$(EXEEXT) +BITCOIN_QT_BIN=$(top_builddir)/src/qt/$(BITCOIN_GUI_NAME)$(EXEEXT) +BITCOIN_CLI_BIN=$(top_builddir)/src/$(BITCOIN_CLI_NAME)$(EXEEXT) BITCOIN_WIN_INSTALLER=$(PACKAGE)-$(PACKAGE_VERSION)-win$(WINDOWS_BITS)-setup$(EXEEXT) +empty := +space := $(empty) $(empty) + OSX_APP=Paccoin-Qt.app -OSX_DMG=Paccoin-Core.dmg +OSX_VOLNAME = $(subst $(space),-,$(PACKAGE_NAME)) +OSX_DMG = $(OSX_VOLNAME).dmg +OSX_BACKGROUND_SVG=background.svg OSX_BACKGROUND_IMAGE=background.tiff +OSX_BACKGROUND_IMAGE_DPIS=36 72 +OSX_DSSTORE_GEN=$(top_srcdir)/contrib/macdeploy/custom_dsstore.py OSX_DEPLOY_SCRIPT=$(top_srcdir)/contrib/macdeploy/macdeployqtplus OSX_FANCY_PLIST=$(top_srcdir)/contrib/macdeploy/fancy.plist -OSX_BASE_LPROJ_DIR=$(top_srcdir)/contrib/macdeploy/Base.lproj/InfoPlist.strings OSX_INSTALLER_ICONS=$(top_srcdir)/src/qt/res/icons/bitcoin.icns -OSX_PLIST=$(top_srcdir)/share/qt/Info.plist #not installed +OSX_PLIST=$(top_builddir)/share/qt/Info.plist #not installed OSX_QT_TRANSLATIONS = da,de,es,hu,ru,uk,zh_CN,zh_TW DIST_DOCS = $(wildcard doc/*.md) $(wildcard doc/release-notes/*.md) +DIST_CONTRIB = $(top_srcdir)/contrib/paccoin-cli.bash-completion \ + $(top_srcdir)/contrib/paccoin-tx.bash-completion \ + $(top_srcdir)/contrib/paccoind.bash-completion \ + $(top_srcdir)/contrib/init BIN_CHECKS=$(top_srcdir)/contrib/devtools/symbol-check.py \ $(top_srcdir)/contrib/devtools/security-check.py @@ -34,30 +54,20 @@ WINDOWS_PACKAGING = $(top_srcdir)/share/pixmaps/bitcoin.ico \ $(top_srcdir)/share/pixmaps/nsis-wizard.bmp \ $(top_srcdir)/doc/README_windows.txt -OSX_PACKAGING = $(OSX_DEPLOY_SCRIPT) $(OSX_FANCY_PLIST) $(OSX_INSTALLER_ICONS) $(OSX_BASE_LPROJ_DIR) \ - $(top_srcdir)/contrib/macdeploy/$(OSX_BACKGROUND_IMAGE) \ - $(top_srcdir)/contrib/macdeploy/DS_Store \ +OSX_PACKAGING = $(OSX_DEPLOY_SCRIPT) $(OSX_FANCY_PLIST) $(OSX_INSTALLER_ICONS) \ + $(top_srcdir)/contrib/macdeploy/$(OSX_BACKGROUND_SVG) \ + $(OSX_DSSTORE_GEN) \ $(top_srcdir)/contrib/macdeploy/detached-sig-apply.sh \ $(top_srcdir)/contrib/macdeploy/detached-sig-create.sh -COVERAGE_INFO = baseline_filtered_combined.info baseline.info block_test.info \ +COVERAGE_INFO = baseline_filtered_combined.info baseline.info \ leveldb_baseline.info test_paccoin_filtered.info total_coverage.info \ - baseline_filtered.info block_test_filtered.info rpc_test.info rpc_test_filtered.info \ + baseline_filtered.info rpc_test.info rpc_test_filtered.info \ leveldb_baseline_filtered.info test_paccoin_coverage.info test_paccoin.info dist-hook: - -$(MAKE) -C $(top_distdir)/src/leveldb clean - -$(MAKE) -C $(top_distdir)/src/secp256k1 distclean -$(GIT) archive --format=tar HEAD -- src/clientversion.cpp | $(AMTAR) -C $(top_distdir) -xf - -distcheck-hook: - $(MKDIR_P) $(top_distdir)/_build/src/leveldb - cp -rf $(top_srcdir)/src/leveldb/* $(top_distdir)/_build/src/leveldb/ - -$(MAKE) -C $(top_distdir)/_build/src/leveldb clean - -distcleancheck: - @: - $(BITCOIN_WIN_INSTALLER): all-recursive $(MKDIR_P) $(top_builddir)/release STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $(BITCOIND_BIN) $(top_builddir)/release @@ -67,9 +77,6 @@ $(BITCOIN_WIN_INSTALLER): all-recursive echo error: could not build $@ @echo built $@ -$(if $(findstring src/,$(MAKECMDGOALS)),$(MAKECMDGOALS), none): FORCE - $(MAKE) -C src $(patsubst src/%,%,$@) - $(OSX_APP)/Contents/PkgInfo: $(MKDIR_P) $(@D) @echo "APPL????" > $@ @@ -90,17 +97,27 @@ $(OSX_APP)/Contents/MacOS/Paccoin-Qt: $(BITCOIN_QT_BIN) $(MKDIR_P) $(@D) STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $< $@ -$(OSX_APP)/Contents/Resources/Base.lproj/InfoPlist.strings: $(OSX_BASE_LPROJ_DIR) +$(OSX_APP)/Contents/Resources/Base.lproj/InfoPlist.strings: $(MKDIR_P) $(@D) - $(INSTALL_DATA) $< $@ + echo '{ CFBundleDisplayName = "$(PACKAGE_NAME)"; CFBundleName = "$(PACKAGE_NAME)"; }' > $@ OSX_APP_BUILT=$(OSX_APP)/Contents/PkgInfo $(OSX_APP)/Contents/Resources/empty.lproj \ $(OSX_APP)/Contents/Resources/bitcoin.icns $(OSX_APP)/Contents/Info.plist \ $(OSX_APP)/Contents/MacOS/Paccoin-Qt $(OSX_APP)/Contents/Resources/Base.lproj/InfoPlist.strings +osx_volname: + echo $(OSX_VOLNAME) >$@ + if BUILD_DARWIN -$(OSX_DMG): $(OSX_APP_BUILT) $(OSX_PACKAGING) - $(OSX_DEPLOY_SCRIPT) $(OSX_APP) -add-qt-tr $(OSX_QT_TRANSLATIONS) -translations-dir=$(QT_TRANSLATION_DIR) -dmg -fancy $(OSX_FANCY_PLIST) -verbose 2 +$(OSX_DMG): $(OSX_APP_BUILT) $(OSX_PACKAGING) $(OSX_BACKGROUND_IMAGE) + $(PYTHON) $(OSX_DEPLOY_SCRIPT) $(OSX_APP) -add-qt-tr $(OSX_QT_TRANSLATIONS) -translations-dir=$(QT_TRANSLATION_DIR) -dmg -fancy $(OSX_FANCY_PLIST) -verbose 2 -volname $(OSX_VOLNAME) + +$(OSX_BACKGROUND_IMAGE).png: contrib/macdeploy/$(OSX_BACKGROUND_SVG) + sed 's/PACKAGE_NAME/$(PACKAGE_NAME)/' < "$<" | $(RSVG_CONVERT) -f png -d 36 -p 36 -o $@ +$(OSX_BACKGROUND_IMAGE)@2x.png: contrib/macdeploy/$(OSX_BACKGROUND_SVG) + sed 's/PACKAGE_NAME/$(PACKAGE_NAME)/' < "$<" | $(RSVG_CONVERT) -f png -d 72 -p 72 -o $@ +$(OSX_BACKGROUND_IMAGE): $(OSX_BACKGROUND_IMAGE).png $(OSX_BACKGROUND_IMAGE)@2x.png + tiffutil -cathidpicheck $^ -out $@ deploydir: $(OSX_DMG) else @@ -114,16 +131,20 @@ $(APP_DIST_DIR)/Applications: $(APP_DIST_EXTRAS): $(APP_DIST_DIR)/$(OSX_APP)/Contents/MacOS/Paccoin-Qt $(OSX_DMG): $(APP_DIST_EXTRAS) - $(GENISOIMAGE) -no-cache-inodes -D -l -probe -V "Paccoin-Core" -no-pad -r -dir-mode 0755 -apple -o $@ dist + $(GENISOIMAGE) -no-cache-inodes -D -l -probe -V "$(OSX_VOLNAME)" -no-pad -r -dir-mode 0755 -apple -o $@ dist -$(APP_DIST_DIR)/.background/$(OSX_BACKGROUND_IMAGE): contrib/macdeploy/$(OSX_BACKGROUND_IMAGE) +dpi%.$(OSX_BACKGROUND_IMAGE): contrib/macdeploy/$(OSX_BACKGROUND_SVG) + sed 's/PACKAGE_NAME/$(PACKAGE_NAME)/' < "$<" | $(RSVG_CONVERT) -f png -d $* -p $* | $(IMAGEMAGICK_CONVERT) - $@ +OSX_BACKGROUND_IMAGE_DPIFILES := $(foreach dpi,$(OSX_BACKGROUND_IMAGE_DPIS),dpi$(dpi).$(OSX_BACKGROUND_IMAGE)) +$(APP_DIST_DIR)/.background/$(OSX_BACKGROUND_IMAGE): $(OSX_BACKGROUND_IMAGE_DPIFILES) $(MKDIR_P) $(@D) - $(INSTALL) $< $@ -$(APP_DIST_DIR)/.DS_Store: contrib/macdeploy/DS_Store - $(INSTALL) $< $@ + $(TIFFCP) -c none $(OSX_BACKGROUND_IMAGE_DPIFILES) $@ + +$(APP_DIST_DIR)/.DS_Store: $(OSX_DSSTORE_GEN) + $(PYTHON) $< "$@" "$(OSX_VOLNAME)" $(APP_DIST_DIR)/$(OSX_APP)/Contents/MacOS/Paccoin-Qt: $(OSX_APP_BUILT) $(OSX_PACKAGING) - INSTALLNAMETOOL=$(INSTALLNAMETOOL) OTOOL=$(OTOOL) STRIP=$(STRIP) $(OSX_DEPLOY_SCRIPT) $(OSX_APP) -translations-dir=$(QT_TRANSLATION_DIR) -add-qt-tr $(OSX_QT_TRANSLATIONS) -verbose 2 + INSTALLNAMETOOL=$(INSTALLNAMETOOL) OTOOL=$(OTOOL) STRIP=$(STRIP) $(PYTHON) $(OSX_DEPLOY_SCRIPT) $(OSX_APP) -translations-dir=$(QT_TRANSLATION_DIR) -add-qt-tr $(OSX_QT_TRANSLATIONS) -verbose 2 deploydir: $(APP_DIST_EXTRAS) endif @@ -171,16 +192,6 @@ test_paccoin.info: baseline_filtered_combined.info test_paccoin_filtered.info: test_paccoin.info $(LCOV) -r $< "/usr/include/*" -o $@ -block_test.info: test_paccoin_filtered.info - $(MKDIR_P) qa/tmp - -@TIMEOUT=15 qa/pull-tester/run-bitcoind-for-test.sh $(JAVA) -jar $(JAVA_COMPARISON_TOOL) qa/tmp/compTool $(COMPARISON_TOOL_REORG_TESTS) - $(LCOV) -c -d $(abs_builddir)/src --t BitcoinJBlockTest -o $@ - $(LCOV) -z -d $(abs_builddir)/src - $(LCOV) -z -d $(abs_builddir)/src/leveldb - -block_test_filtered.info: block_test.info - $(LCOV) -r $< "/usr/include/*" -o $@ - rpc_test.info: test_paccoin_filtered.info -@TIMEOUT=15 python qa/pull-tester/rpc-tests.py $(EXTENDED_RPC_TESTS) $(LCOV) -c -d $(abs_builddir)/src --t rpc-tests -o $@ @@ -193,8 +204,8 @@ rpc_test_filtered.info: rpc_test.info test_paccoin_coverage.info: baseline_filtered_combined.info test_paccoin_filtered.info $(LCOV) -a baseline_filtered.info -a leveldb_baseline_filtered.info -a test_paccoin_filtered.info -o $@ -total_coverage.info: baseline_filtered_combined.info test_paccoin_filtered.info block_test_filtered.info rpc_test_filtered.info - $(LCOV) -a baseline_filtered.info -a leveldb_baseline_filtered.info -a test_paccoin_filtered.info -a block_test_filtered.info -a rpc_test_filtered.info -o $@ | $(GREP) "\%" | $(AWK) '{ print substr($$3,2,50) "/" $$5 }' > coverage_percent.txt +total_coverage.info: baseline_filtered_combined.info test_paccoin_filtered.info rpc_test_filtered.info + $(LCOV) -a baseline_filtered.info -a leveldb_baseline_filtered.info -a test_paccoin_filtered.info -a rpc_test_filtered.info -o $@ | $(GREP) "\%" | $(AWK) '{ print substr($$3,2,50) "/" $$5 }' > coverage_percent.txt test_paccoin.coverage/.dirstamp: test_paccoin_coverage.info $(GENHTML) -s $< -o $(@D) @@ -208,21 +219,19 @@ cov: test_paccoin.coverage/.dirstamp total.coverage/.dirstamp endif -# Paccoin: disable the test until upstream switches from convoluted comparison tool -# Ref https://github.com/bitcoin/bitcoin/issues/4545 -if USE_COMPARISON_TOOL -check-local: - ## $(MKDIR_P) qa/tmp - ## @qa/pull-tester/run-bitcoind-for-test.sh $(JAVA) -jar $(JAVA_COMPARISON_TOOL) qa/tmp/compTool $(COMPARISON_TOOL_REORG_TESTS) 2>&1 -endif - dist_noinst_SCRIPTS = autogen.sh -EXTRA_DIST = $(top_srcdir)/share/genbuild.sh qa/pull-tester/rpc-tests.py qa/rpc-tests $(DIST_DOCS) $(WINDOWS_PACKAGING) $(OSX_PACKAGING) $(BIN_CHECKS) +EXTRA_DIST = $(top_srcdir)/share/genbuild.sh qa/pull-tester/rpc-tests.py qa/rpc-tests $(DIST_CONTRIB) $(DIST_DOCS) $(WINDOWS_PACKAGING) $(OSX_PACKAGING) $(BIN_CHECKS) CLEANFILES = $(OSX_DMG) $(BITCOIN_WIN_INSTALLER) +# This file is problematic for out-of-tree builds if it exists. +DISTCLEANFILES = qa/pull-tester/tests_config.pyc + .INTERMEDIATE: $(COVERAGE_INFO) +DISTCHECK_CONFIGURE_FLAGS = --enable-man + clean-local: rm -rf coverage_percent.txt test_paccoin.coverage/ total.coverage/ qa/tmp/ cache/ $(OSX_APP) + rm -rf qa/pull-tester/__pycache__ diff --git a/autogen.sh b/autogen.sh index 3e26a183059c..27417daf7691 100755 --- a/autogen.sh +++ b/autogen.sh @@ -1,4 +1,8 @@ #!/bin/sh +# Copyright (c) 2013-2016 The Bitcoin Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + set -e srcdir="$(dirname $0)" cd "$srcdir" @@ -6,4 +10,6 @@ if [ -z ${LIBTOOLIZE} ] && GLIBTOOLIZE="`which glibtoolize 2>/dev/null`"; then LIBTOOLIZE="${GLIBTOOLIZE}" export LIBTOOLIZE fi +which autoreconf >/dev/null || \ + (echo "configuration failed, please install autoconf first" && exit 1) autoreconf --install --force --warnings=all diff --git a/build-aux/m4/ax_boost_base.m4 b/build-aux/m4/ax_boost_base.m4 index 3f24d5ddc617..650c94fa6475 100644 --- a/build-aux/m4/ax_boost_base.m4 +++ b/build-aux/m4/ax_boost_base.m4 @@ -33,7 +33,7 @@ # and this notice are preserved. This file is offered as-is, without any # warranty. -#serial 23 +#serial 27 AC_DEFUN([AX_BOOST_BASE], [ @@ -95,7 +95,7 @@ if test "x$want_boost" = "xyes"; then x86_64) libsubdirs="lib64 libx32 lib lib64" ;; - ppc64|s390x|sparc64|aarch64) + ppc64|s390x|sparc64|aarch64|ppc64le) libsubdirs="lib64 lib lib64" ;; esac @@ -170,7 +170,7 @@ if test "x$want_boost" = "xyes"; then AC_MSG_RESULT(yes) succeeded=yes found_system=yes - ],[: + ],[ ]) AC_LANG_POP([C++]) @@ -179,6 +179,10 @@ if test "x$want_boost" = "xyes"; then dnl if we found no boost with system layout we search for boost libraries dnl built and installed without the --layout=system option or for a staged(not installed) version if test "x$succeeded" != "xyes"; then + CPPFLAGS="$CPPFLAGS_SAVED" + LDFLAGS="$LDFLAGS_SAVED" + BOOST_CPPFLAGS= + BOOST_LDFLAGS= _version=0 if test "$ac_boost_path" != ""; then if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then @@ -191,6 +195,12 @@ if test "x$want_boost" = "xyes"; then VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` BOOST_CPPFLAGS="-I$ac_boost_path/include/boost-$VERSION_UNDERSCORE" done + dnl if nothing found search for layout used in Windows distributions + if test -z "$BOOST_CPPFLAGS"; then + if test -d "$ac_boost_path/boost" && test -r "$ac_boost_path/boost"; then + BOOST_CPPFLAGS="-I$ac_boost_path" + fi + fi fi else if test "$cross_compiling" != yes; then @@ -253,7 +263,7 @@ if test "x$want_boost" = "xyes"; then AC_MSG_RESULT(yes) succeeded=yes found_system=yes - ],[: + ],[ ]) AC_LANG_POP([C++]) fi diff --git a/build-aux/m4/ax_boost_program_options.m4 b/build-aux/m4/ax_boost_program_options.m4 index f591441854f5..2bdb5937162e 100644 --- a/build-aux/m4/ax_boost_program_options.m4 +++ b/build-aux/m4/ax_boost_program_options.m4 @@ -29,7 +29,7 @@ # and this notice are preserved. This file is offered as-is, without any # warranty. -#serial 22 +#serial 24 AC_DEFUN([AX_BOOST_PROGRAM_OPTIONS], [ @@ -63,9 +63,9 @@ AC_DEFUN([AX_BOOST_PROGRAM_OPTIONS], AC_CACHE_CHECK([whether the Boost::Program_Options library is available], ax_cv_boost_program_options, [AC_LANG_PUSH(C++) - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include ]], - [[boost::program_options::options_description generic("Generic options"); + [[boost::program_options::error err("Error message"); return 0;]])], ax_cv_boost_program_options=yes, ax_cv_boost_program_options=no) AC_LANG_POP([C++]) @@ -74,7 +74,6 @@ AC_DEFUN([AX_BOOST_PROGRAM_OPTIONS], AC_DEFINE(HAVE_BOOST_PROGRAM_OPTIONS,,[define if the Boost::PROGRAM_OPTIONS library is available]) BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'` if test "x$ax_boost_user_program_options_lib" = "x"; then - ax_lib= for libextension in `ls $BOOSTLIBDIR/libboost_program_options*.so* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^lib\(boost_program_options.*\)\.so.*$;\1;'` `ls $BOOSTLIBDIR/libboost_program_options*.dylib* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^lib\(boost_program_options.*\)\.dylib.*$;\1;'` `ls $BOOSTLIBDIR/libboost_program_options*.a* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^lib\(boost_program_options.*\)\.a.*$;\1;'` ; do ax_lib=${libextension} AC_CHECK_LIB($ax_lib, exit, diff --git a/build-aux/m4/ax_boost_system.m4 b/build-aux/m4/ax_boost_system.m4 index 9c78280fcae4..1c05450cbe1d 100644 --- a/build-aux/m4/ax_boost_system.m4 +++ b/build-aux/m4/ax_boost_system.m4 @@ -31,7 +31,7 @@ # and this notice are preserved. This file is offered as-is, without any # warranty. -#serial 17 +#serial 18 AC_DEFUN([AX_BOOST_SYSTEM], [ @@ -68,9 +68,10 @@ AC_DEFUN([AX_BOOST_SYSTEM], ax_cv_boost_system, [AC_LANG_PUSH([C++]) CXXFLAGS_SAVE=$CXXFLAGS + CXXFLAGS= AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include ]], - [[boost::system::system_category]])], + [[boost::system::error_category *a = 0;]])], ax_cv_boost_system=yes, ax_cv_boost_system=no) CXXFLAGS=$CXXFLAGS_SAVE AC_LANG_POP([C++]) diff --git a/build-aux/m4/ax_check_compile_flag.m4 b/build-aux/m4/ax_check_compile_flag.m4 index c3a8d695a1bc..ca3639715e72 100644 --- a/build-aux/m4/ax_check_compile_flag.m4 +++ b/build-aux/m4/ax_check_compile_flag.m4 @@ -4,7 +4,7 @@ # # SYNOPSIS # -# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS]) +# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) # # DESCRIPTION # @@ -19,6 +19,8 @@ # the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to # force the compiler to issue an error when a bad flag is given. # +# INPUT gives an alternative input source to AC_COMPILE_IFELSE. +# # NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this # macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG. # @@ -53,19 +55,19 @@ # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. -#serial 2 +#serial 4 AC_DEFUN([AX_CHECK_COMPILE_FLAG], -[AC_PREREQ(2.59)dnl for _AC_LANG_PREFIX +[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [ ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1" - AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], + AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], [AS_VAR_SET(CACHEVAR,[yes])], [AS_VAR_SET(CACHEVAR,[no])]) _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags]) -AS_IF([test x"AS_VAR_GET(CACHEVAR)" = xyes], +AS_VAR_IF(CACHEVAR,yes, [m4_default([$2], :)], [m4_default([$3], :)]) AS_VAR_POPDEF([CACHEVAR])dnl diff --git a/build-aux/m4/ax_check_link_flag.m4 b/build-aux/m4/ax_check_link_flag.m4 index e2d0d363e4c4..eb01a6ce135e 100644 --- a/build-aux/m4/ax_check_link_flag.m4 +++ b/build-aux/m4/ax_check_link_flag.m4 @@ -4,7 +4,7 @@ # # SYNOPSIS # -# AX_CHECK_LINK_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS]) +# AX_CHECK_LINK_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) # # DESCRIPTION # @@ -19,6 +19,8 @@ # EXTRA-FLAGS FLAG". This can for example be used to force the linker to # issue an error when a bad flag is given. # +# INPUT gives an alternative input source to AC_LINK_IFELSE. +# # NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this # macro in sync with AX_CHECK_{PREPROC,COMPILE}_FLAG. # @@ -53,18 +55,19 @@ # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. -#serial 2 +#serial 4 AC_DEFUN([AX_CHECK_LINK_FLAG], -[AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_ldflags_$4_$1])dnl +[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF +AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_ldflags_$4_$1])dnl AC_CACHE_CHECK([whether the linker accepts $1], CACHEVAR, [ ax_check_save_flags=$LDFLAGS LDFLAGS="$LDFLAGS $4 $1" - AC_LINK_IFELSE([AC_LANG_PROGRAM()], + AC_LINK_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], [AS_VAR_SET(CACHEVAR,[yes])], [AS_VAR_SET(CACHEVAR,[no])]) LDFLAGS=$ax_check_save_flags]) -AS_IF([test x"AS_VAR_GET(CACHEVAR)" = xyes], +AS_VAR_IF(CACHEVAR,yes, [m4_default([$2], :)], [m4_default([$3], :)]) AS_VAR_POPDEF([CACHEVAR])dnl diff --git a/build-aux/m4/ax_check_preproc_flag.m4 b/build-aux/m4/ax_check_preproc_flag.m4 index b1cfef6b86dd..ca1d5ee2b6d1 100644 --- a/build-aux/m4/ax_check_preproc_flag.m4 +++ b/build-aux/m4/ax_check_preproc_flag.m4 @@ -4,7 +4,7 @@ # # SYNOPSIS # -# AX_CHECK_PREPROC_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS]) +# AX_CHECK_PREPROC_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) # # DESCRIPTION # @@ -19,6 +19,8 @@ # "CPPFLAGS EXTRA-FLAGS FLAG". This can for example be used to force the # preprocessor to issue an error when a bad flag is given. # +# INPUT gives an alternative input source to AC_PREPROC_IFELSE. +# # NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this # macro in sync with AX_CHECK_{COMPILE,LINK}_FLAG. # @@ -53,19 +55,19 @@ # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. -#serial 2 +#serial 4 AC_DEFUN([AX_CHECK_PREPROC_FLAG], -[AC_PREREQ(2.59)dnl for _AC_LANG_PREFIX +[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]cppflags_$4_$1])dnl AC_CACHE_CHECK([whether _AC_LANG preprocessor accepts $1], CACHEVAR, [ ax_check_save_flags=$CPPFLAGS CPPFLAGS="$CPPFLAGS $4 $1" - AC_PREPROC_IFELSE([AC_LANG_PROGRAM()], + AC_PREPROC_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], [AS_VAR_SET(CACHEVAR,[yes])], [AS_VAR_SET(CACHEVAR,[no])]) CPPFLAGS=$ax_check_save_flags]) -AS_IF([test x"AS_VAR_GET(CACHEVAR)" = xyes], +AS_VAR_IF(CACHEVAR,yes, [m4_default([$2], :)], [m4_default([$3], :)]) AS_VAR_POPDEF([CACHEVAR])dnl diff --git a/build-aux/m4/ax_gcc_func_attribute.m4 b/build-aux/m4/ax_gcc_func_attribute.m4 index 275ca63a2c21..c788ca9bd435 100644 --- a/build-aux/m4/ax_gcc_func_attribute.m4 +++ b/build-aux/m4/ax_gcc_func_attribute.m4 @@ -31,6 +31,7 @@ # cold # const # constructor +# constructor_priority for constructor attribute with priority # deprecated # destructor # dllexport @@ -73,7 +74,7 @@ # and this notice are preserved. This file is offered as-is, without any # warranty. -#serial 2 +#serial 3 AC_DEFUN([AX_GCC_FUNC_ATTRIBUTE], [ AS_VAR_PUSHDEF([ac_var], [ax_cv_have_func_attribute_$1]) @@ -103,6 +104,9 @@ AC_DEFUN([AX_GCC_FUNC_ATTRIBUTE], [ [const], [ int foo( void ) __attribute__(($1)); ], + [constructor_priority], [ + int foo( void ) __attribute__((__constructor__(65535/2))); + ], [constructor], [ int foo( void ) __attribute__(($1)); ], @@ -180,6 +184,8 @@ AC_DEFUN([AX_GCC_FUNC_ATTRIBUTE], [ [visibility], [ int foo_def( void ) __attribute__(($1("default"))); int foo_hid( void ) __attribute__(($1("hidden"))); + int foo_int( void ) __attribute__(($1("internal"))); + int foo_pro( void ) __attribute__(($1("protected"))); ], [warning], [ int foo( void ) __attribute__(($1(""))); diff --git a/build-aux/m4/ax_pthread.m4 b/build-aux/m4/ax_pthread.m4 index d383ad5c6d6a..4c4051ea376f 100644 --- a/build-aux/m4/ax_pthread.m4 +++ b/build-aux/m4/ax_pthread.m4 @@ -19,10 +19,10 @@ # is necessary on AIX to use the special cc_r compiler alias.) # # NOTE: You are assumed to not only compile your program with these flags, -# but also link it with them as well. e.g. you should link with +# but also to link with them as well. For example, you might link with # $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS # -# If you are only building threads programs, you may wish to use these +# If you are only building threaded programs, you may wish to use these # variables in your default LIBS, CFLAGS, and CC: # # LIBS="$PTHREAD_LIBS $LIBS" @@ -30,8 +30,8 @@ # CC="$PTHREAD_CC" # # In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant -# has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name -# (e.g. PTHREAD_CREATE_UNDETACHED on AIX). +# has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to +# that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). # # Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the # PTHREAD_PRIO_INHERIT symbol is defined when compiling with @@ -82,35 +82,40 @@ # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. -#serial 21 +#serial 23 AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD]) AC_DEFUN([AX_PTHREAD], [ AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([AC_PROG_CC]) +AC_REQUIRE([AC_PROG_SED]) AC_LANG_PUSH([C]) ax_pthread_ok=no # We used to check for pthread.h first, but this fails if pthread.h -# requires special compiler flags (e.g. on True64 or Sequent). +# requires special compiler flags (e.g. on Tru64 or Sequent). # It gets checked for in the link test anyway. # First of all, check if the user has set any of the PTHREAD_LIBS, # etcetera environment variables, and if threads linking works using # them: -if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then - save_CFLAGS="$CFLAGS" +if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then + ax_pthread_save_CC="$CC" + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + AS_IF([test "x$PTHREAD_CC" != "x"], [CC="$PTHREAD_CC"]) CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" - AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) - AC_TRY_LINK_FUNC([pthread_join], [ax_pthread_ok=yes]) + AC_MSG_CHECKING([for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS]) + AC_LINK_IFELSE([AC_LANG_CALL([], [pthread_join])], [ax_pthread_ok=yes]) AC_MSG_RESULT([$ax_pthread_ok]) - if test x"$ax_pthread_ok" = xno; then + if test "x$ax_pthread_ok" = "xno"; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" fi - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" + CC="$ax_pthread_save_CC" + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" fi # We must check for the threads library under a number of different @@ -123,7 +128,7 @@ fi # which indicates that we try without any flags at all, and "pthread-config" # which is a program returning the flags for the Pth emulation library. -ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" +ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" # The ordering *is* (sometimes) important. Some notes on the # individual items follow: @@ -132,82 +137,225 @@ ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mt # none: in case threads are in libc; should be tried before -Kthread and # other compiler flags to prevent continual compiler warnings # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) -# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) -# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) -# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) -# -pthreads: Solaris/gcc -# -mthreads: Mingw32/gcc, Lynx/gcc +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64 +# (Note: HP C rejects this with "bad form for `-t' option") +# -pthreads: Solaris/gcc (Note: HP C also rejects) # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it -# doesn't hurt to check since this sometimes defines pthreads too; -# also defines -D_REENTRANT) -# ... -mt is also the pthreads flag for HP/aCC +# doesn't hurt to check since this sometimes defines pthreads and +# -D_REENTRANT too), HP C (must be checked before -lpthread, which +# is present but should not be used directly; and before -mthreads, +# because the compiler interprets this as "-mt" + "-hreads") +# -mthreads: Mingw32/gcc, Lynx/gcc # pthread: Linux, etcetera # --thread-safe: KAI C++ # pthread-config: use pthread-config program (for GNU Pth library) -case ${host_os} in +case $host_os in + + freebsd*) + + # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) + # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) + + ax_pthread_flags="-kthread lthread $ax_pthread_flags" + ;; + + hpux*) + + # From the cc(1) man page: "[-mt] Sets various -D flags to enable + # multi-threading and also sets -lpthread." + + ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags" + ;; + + openedition*) + + # IBM z/OS requires a feature-test macro to be defined in order to + # enable POSIX threads at all, so give the user a hint if this is + # not set. (We don't define these ourselves, as they can affect + # other portions of the system API in unpredictable ways.) + + AC_EGREP_CPP([AX_PTHREAD_ZOS_MISSING], + [ +# if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS) + AX_PTHREAD_ZOS_MISSING +# endif + ], + [AC_MSG_WARN([IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support.])]) + ;; + solaris*) # On Solaris (at least, for some versions), libc contains stubbed # (non-functional) versions of the pthreads routines, so link-based - # tests will erroneously succeed. (We need to link with -pthreads/-mt/ - # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather - # a function called by this macro, so we could check for that, but - # who knows whether they'll stub that too in a future libc.) So, - # we'll just look for -pthreads and -lpthread first: + # tests will erroneously succeed. (N.B.: The stubs are missing + # pthread_cleanup_push, or rather a function called by this macro, + # so we could check for that, but who knows whether they'll stub + # that too in a future libc.) So we'll check first for the + # standard Solaris way of linking pthreads (-mt -lpthread). + + ax_pthread_flags="-mt,pthread pthread $ax_pthread_flags" + ;; +esac + +# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC) - ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags" +AS_IF([test "x$GCC" = "xyes"], + [ax_pthread_flags="-pthread -pthreads $ax_pthread_flags"]) + +# The presence of a feature test macro requesting re-entrant function +# definitions is, on some systems, a strong hint that pthreads support is +# correctly enabled + +case $host_os in + darwin* | hpux* | linux* | osf* | solaris*) + ax_pthread_check_macro="_REENTRANT" ;; - darwin*) - ax_pthread_flags="-pthread $ax_pthread_flags" + aix*) + ax_pthread_check_macro="_THREAD_SAFE" + ;; + + *) + ax_pthread_check_macro="--" ;; esac +AS_IF([test "x$ax_pthread_check_macro" = "x--"], + [ax_pthread_check_cond=0], + [ax_pthread_check_cond="!defined($ax_pthread_check_macro)"]) + +# Are we compiling with Clang? + +AC_CACHE_CHECK([whether $CC is Clang], + [ax_cv_PTHREAD_CLANG], + [ax_cv_PTHREAD_CLANG=no + # Note that Autoconf sets GCC=yes for Clang as well as GCC + if test "x$GCC" = "xyes"; then + AC_EGREP_CPP([AX_PTHREAD_CC_IS_CLANG], + [/* Note: Clang 2.7 lacks __clang_[a-z]+__ */ +# if defined(__clang__) && defined(__llvm__) + AX_PTHREAD_CC_IS_CLANG +# endif + ], + [ax_cv_PTHREAD_CLANG=yes]) + fi + ]) +ax_pthread_clang="$ax_cv_PTHREAD_CLANG" + +ax_pthread_clang_warning=no + +# Clang needs special handling, because older versions handle the -pthread +# option in a rather... idiosyncratic way + +if test "x$ax_pthread_clang" = "xyes"; then + + # Clang takes -pthread; it has never supported any other flag + + # (Note 1: This will need to be revisited if a system that Clang + # supports has POSIX threads in a separate library. This tends not + # to be the way of modern systems, but it's conceivable.) + + # (Note 2: On some systems, notably Darwin, -pthread is not needed + # to get POSIX threads support; the API is always present and + # active. We could reasonably leave PTHREAD_CFLAGS empty. But + # -pthread does define _REENTRANT, and while the Darwin headers + # ignore this macro, third-party headers might not.) + + PTHREAD_CFLAGS="-pthread" + PTHREAD_LIBS= + + ax_pthread_ok=yes + + # However, older versions of Clang make a point of warning the user + # that, in an invocation where only linking and no compilation is + # taking place, the -pthread option has no effect ("argument unused + # during compilation"). They expect -pthread to be passed in only + # when source code is being compiled. + # + # Problem is, this is at odds with the way Automake and most other + # C build frameworks function, which is that the same flags used in + # compilation (CFLAGS) are also used in linking. Many systems + # supported by AX_PTHREAD require exactly this for POSIX threads + # support, and in fact it is often not straightforward to specify a + # flag that is used only in the compilation phase and not in + # linking. Such a scenario is extremely rare in practice. + # + # Even though use of the -pthread flag in linking would only print + # a warning, this can be a nuisance for well-run software projects + # that build with -Werror. So if the active version of Clang has + # this misfeature, we search for an option to squash it. + + AC_CACHE_CHECK([whether Clang needs flag to prevent "argument unused" warning when linking with -pthread], + [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG], + [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown + # Create an alternate version of $ac_link that compiles and + # links in two steps (.c -> .o, .o -> exe) instead of one + # (.c -> exe), because the warning occurs only in the second + # step + ax_pthread_save_ac_link="$ac_link" + ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g' + ax_pthread_link_step=`$as_echo "$ac_link" | sed "$ax_pthread_sed"` + ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)" + ax_pthread_save_CFLAGS="$CFLAGS" + for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do + AS_IF([test "x$ax_pthread_try" = "xunknown"], [break]) + CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS" + ac_link="$ax_pthread_save_ac_link" + AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])], + [ac_link="$ax_pthread_2step_ac_link" + AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])], + [break]) + ]) + done + ac_link="$ax_pthread_save_ac_link" + CFLAGS="$ax_pthread_save_CFLAGS" + AS_IF([test "x$ax_pthread_try" = "x"], [ax_pthread_try=no]) + ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" + ]) -# Clang doesn't consider unrecognized options an error unless we specify -# -Werror. We throw in some extra Clang-specific options to ensure that -# this doesn't happen for GCC, which also accepts -Werror. + case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in + no | unknown) ;; + *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;; + esac -AC_MSG_CHECKING([if compiler needs -Werror to reject unknown flags]) -save_CFLAGS="$CFLAGS" -ax_pthread_extra_flags="-Werror" -CFLAGS="$CFLAGS $ax_pthread_extra_flags -Wunknown-warning-option -Wsizeof-array-argument" -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([int foo(void);],[foo()])], - [AC_MSG_RESULT([yes])], - [ax_pthread_extra_flags= - AC_MSG_RESULT([no])]) -CFLAGS="$save_CFLAGS" +fi # $ax_pthread_clang = yes -if test x"$ax_pthread_ok" = xno; then -for flag in $ax_pthread_flags; do +if test "x$ax_pthread_ok" = "xno"; then +for ax_pthread_try_flag in $ax_pthread_flags; do - case $flag in + case $ax_pthread_try_flag in none) AC_MSG_CHECKING([whether pthreads work without any flags]) ;; + -mt,pthread) + AC_MSG_CHECKING([whether pthreads work with -mt -lpthread]) + PTHREAD_CFLAGS="-mt" + PTHREAD_LIBS="-lpthread" + ;; + -*) - AC_MSG_CHECKING([whether pthreads work with $flag]) - PTHREAD_CFLAGS="$flag" + AC_MSG_CHECKING([whether pthreads work with $ax_pthread_try_flag]) + PTHREAD_CFLAGS="$ax_pthread_try_flag" ;; pthread-config) AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no]) - if test x"$ax_pthread_config" = xno; then continue; fi + AS_IF([test "x$ax_pthread_config" = "xno"], [continue]) PTHREAD_CFLAGS="`pthread-config --cflags`" PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" ;; *) - AC_MSG_CHECKING([for the pthreads library -l$flag]) - PTHREAD_LIBS="-l$flag" + AC_MSG_CHECKING([for the pthreads library -l$ax_pthread_try_flag]) + PTHREAD_LIBS="-l$ax_pthread_try_flag" ;; esac - save_LIBS="$LIBS" - save_CFLAGS="$CFLAGS" + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS $ax_pthread_extra_flags" # Check for various functions. We must include pthread.h, # since some functions may be macros. (On the Sequent, we @@ -218,7 +366,11 @@ for flag in $ax_pthread_flags; do # pthread_cleanup_push because it is one of the few pthread # functions on Solaris that doesn't have a non-functional libc stub. # We try pthread_create on general principles. + AC_LINK_IFELSE([AC_LANG_PROGRAM([#include +# if $ax_pthread_check_cond +# error "$ax_pthread_check_macro must be defined" +# endif static void routine(void *a) { a = 0; } static void *start_routine(void *a) { return a; }], [pthread_t th; pthread_attr_t attr; @@ -227,16 +379,14 @@ for flag in $ax_pthread_flags; do pthread_attr_init(&attr); pthread_cleanup_push(routine, 0); pthread_cleanup_pop(0) /* ; */])], - [ax_pthread_ok=yes], - []) + [ax_pthread_ok=yes], + []) - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" AC_MSG_RESULT([$ax_pthread_ok]) - if test "x$ax_pthread_ok" = xyes; then - break; - fi + AS_IF([test "x$ax_pthread_ok" = "xyes"], [break]) PTHREAD_LIBS="" PTHREAD_CFLAGS="" @@ -244,71 +394,74 @@ done fi # Various other checks: -if test "x$ax_pthread_ok" = xyes; then - save_LIBS="$LIBS" - LIBS="$PTHREAD_LIBS $LIBS" - save_CFLAGS="$CFLAGS" +if test "x$ax_pthread_ok" = "xyes"; then + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. - AC_MSG_CHECKING([for joinable pthread attribute]) - attr_name=unknown - for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do - AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], - [int attr = $attr; return attr /* ; */])], - [attr_name=$attr; break], - []) - done - AC_MSG_RESULT([$attr_name]) - if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then - AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE], [$attr_name], - [Define to necessary symbol if this constant - uses a non-standard name on your system.]) - fi - - AC_MSG_CHECKING([if more special flags are required for pthreads]) - flag=no - case ${host_os} in - aix* | freebsd* | darwin*) flag="-D_THREAD_SAFE";; - osf* | hpux*) flag="-D_REENTRANT";; - solaris*) - if test "$GCC" = "yes"; then - flag="-D_REENTRANT" - else - # TODO: What about Clang on Solaris? - flag="-mt -D_REENTRANT" - fi - ;; - esac - AC_MSG_RESULT([$flag]) - if test "x$flag" != xno; then - PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" - fi + AC_CACHE_CHECK([for joinable pthread attribute], + [ax_cv_PTHREAD_JOINABLE_ATTR], + [ax_cv_PTHREAD_JOINABLE_ATTR=unknown + for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], + [int attr = $ax_pthread_attr; return attr /* ; */])], + [ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break], + []) + done + ]) + AS_IF([test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \ + test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \ + test "x$ax_pthread_joinable_attr_defined" != "xyes"], + [AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE], + [$ax_cv_PTHREAD_JOINABLE_ATTR], + [Define to necessary symbol if this constant + uses a non-standard name on your system.]) + ax_pthread_joinable_attr_defined=yes + ]) + + AC_CACHE_CHECK([whether more special flags are required for pthreads], + [ax_cv_PTHREAD_SPECIAL_FLAGS], + [ax_cv_PTHREAD_SPECIAL_FLAGS=no + case $host_os in + solaris*) + ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS" + ;; + esac + ]) + AS_IF([test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \ + test "x$ax_pthread_special_flags_added" != "xyes"], + [PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS" + ax_pthread_special_flags_added=yes]) AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT], - [ax_cv_PTHREAD_PRIO_INHERIT], [ - AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], - [[int i = PTHREAD_PRIO_INHERIT;]])], - [ax_cv_PTHREAD_PRIO_INHERIT=yes], - [ax_cv_PTHREAD_PRIO_INHERIT=no]) + [ax_cv_PTHREAD_PRIO_INHERIT], + [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[int i = PTHREAD_PRIO_INHERIT;]])], + [ax_cv_PTHREAD_PRIO_INHERIT=yes], + [ax_cv_PTHREAD_PRIO_INHERIT=no]) ]) - AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes"], - [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.])]) + AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \ + test "x$ax_pthread_prio_inherit_defined" != "xyes"], + [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.]) + ax_pthread_prio_inherit_defined=yes + ]) - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" # More AIX lossage: compile with *_r variant - if test "x$GCC" != xyes; then + if test "x$GCC" != "xyes"; then case $host_os in aix*) AS_CASE(["x/$CC"], - [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6], - [#handle absolute path differently from PATH based program lookup - AS_CASE(["x$CC"], - [x/*], - [AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])], - [AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])])]) + [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6], + [#handle absolute path differently from PATH based program lookup + AS_CASE(["x$CC"], + [x/*], + [AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])], + [AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])])]) ;; esac fi @@ -321,7 +474,7 @@ AC_SUBST([PTHREAD_CFLAGS]) AC_SUBST([PTHREAD_CC]) # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: -if test x"$ax_pthread_ok" = xyes; then +if test "x$ax_pthread_ok" = "xyes"; then ifelse([$1],,[AC_DEFINE([HAVE_PTHREAD],[1],[Define if you have POSIX threads libraries and header files.])],[$1]) : else diff --git a/build-aux/m4/bitcoin_find_bdb48.m4 b/build-aux/m4/bitcoin_find_bdb48.m4 index 46529c868eb6..980f1e8f19cd 100644 --- a/build-aux/m4/bitcoin_find_bdb48.m4 +++ b/build-aux/m4/bitcoin_find_bdb48.m4 @@ -1,66 +1,78 @@ +dnl Copyright (c) 2013-2015 The Bitcoin Core developers +dnl Distributed under the MIT software license, see the accompanying +dnl file COPYING or http://www.opensource.org/licenses/mit-license.php. + AC_DEFUN([BITCOIN_FIND_BDB48],[ - AC_MSG_CHECKING([for Berkeley DB C++ headers]) - BDB_CPPFLAGS= - BDB_LIBS= - bdbpath=X - bdb48path=X - bdbdirlist= - for _vn in 4.8 48 4 5 ''; do - for _pfx in b lib ''; do - bdbdirlist="$bdbdirlist ${_pfx}db${_vn}" + AC_ARG_VAR(BDB_CFLAGS, [C compiler flags for BerkeleyDB, bypasses autodetection]) + AC_ARG_VAR(BDB_LIBS, [Linker flags for BerkeleyDB, bypasses autodetection]) + + if test "x$BDB_CFLAGS" = "x"; then + AC_MSG_CHECKING([for Berkeley DB C++ headers]) + BDB_CPPFLAGS= + bdbpath=X + bdb48path=X + bdbdirlist= + for _vn in 4.8 48 4 5 ''; do + for _pfx in b lib ''; do + bdbdirlist="$bdbdirlist ${_pfx}db${_vn}" + done done - done - for searchpath in $bdbdirlist ''; do - test -n "${searchpath}" && searchpath="${searchpath}/" - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - #include <${searchpath}db_cxx.h> - ]],[[ - #if !((DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR >= 8) || DB_VERSION_MAJOR > 4) - #error "failed to find bdb 4.8+" - #endif - ]])],[ - if test "x$bdbpath" = "xX"; then - bdbpath="${searchpath}" - fi - ],[ - continue - ]) - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - #include <${searchpath}db_cxx.h> - ]],[[ - #if !(DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR == 8) - #error "failed to find bdb 4.8" - #endif - ]])],[ - bdb48path="${searchpath}" - break - ],[]) - done - if test "x$bdbpath" = "xX"; then - AC_MSG_RESULT([no]) - AC_MSG_ERROR([libdb_cxx headers missing, Paccoin Core requires this library for wallet functionality (--disable-wallet to disable wallet functionality)]) - elif test "x$bdb48path" = "xX"; then - BITCOIN_SUBDIR_TO_INCLUDE(BDB_CPPFLAGS,[${bdbpath}],db_cxx) - AC_ARG_WITH([incompatible-bdb],[AS_HELP_STRING([--with-incompatible-bdb], [allow using a bdb version other than 4.8])],[ - AC_MSG_WARN([Found Berkeley DB other than 4.8; wallets opened by this build will not be portable!]) - ],[ - AC_MSG_ERROR([Found Berkeley DB other than 4.8, required for portable wallets (--with-incompatible-bdb to ignore or --disable-wallet to disable wallet functionality)]) - ]) + for searchpath in $bdbdirlist ''; do + test -n "${searchpath}" && searchpath="${searchpath}/" + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include <${searchpath}db_cxx.h> + ]],[[ + #if !((DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR >= 8) || DB_VERSION_MAJOR > 4) + #error "failed to find bdb 4.8+" + #endif + ]])],[ + if test "x$bdbpath" = "xX"; then + bdbpath="${searchpath}" + fi + ],[ + continue + ]) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include <${searchpath}db_cxx.h> + ]],[[ + #if !(DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR == 8) + #error "failed to find bdb 4.8" + #endif + ]])],[ + bdb48path="${searchpath}" + break + ],[]) + done + if test "x$bdbpath" = "xX"; then + AC_MSG_RESULT([no]) + AC_MSG_ERROR([libdb_cxx headers missing, ]AC_PACKAGE_NAME[ requires this library for wallet functionality (--disable-wallet to disable wallet functionality)]) + elif test "x$bdb48path" = "xX"; then + BITCOIN_SUBDIR_TO_INCLUDE(BDB_CPPFLAGS,[${bdbpath}],db_cxx) + AC_ARG_WITH([incompatible-bdb],[AS_HELP_STRING([--with-incompatible-bdb], [allow using a bdb version other than 4.8])],[ + AC_MSG_WARN([Found Berkeley DB other than 4.8; wallets opened by this build will not be portable!]) + ],[ + AC_MSG_ERROR([Found Berkeley DB other than 4.8, required for portable wallets (--with-incompatible-bdb to ignore or --disable-wallet to disable wallet functionality)]) + ]) + else + BITCOIN_SUBDIR_TO_INCLUDE(BDB_CPPFLAGS,[${bdb48path}],db_cxx) + bdbpath="${bdb48path}" + fi else - BITCOIN_SUBDIR_TO_INCLUDE(BDB_CPPFLAGS,[${bdb48path}],db_cxx) - bdbpath="${bdb48path}" + BDB_CPPFLAGS=${BDB_CFLAGS} fi AC_SUBST(BDB_CPPFLAGS) - # TODO: Ideally this could find the library version and make sure it matches the headers being used - for searchlib in db_cxx-4.8 db_cxx; do - AC_CHECK_LIB([$searchlib],[main],[ - BDB_LIBS="-l${searchlib}" - break - ]) - done if test "x$BDB_LIBS" = "x"; then - AC_MSG_ERROR([libdb_cxx missing, Paccoin Core requires this library for wallet functionality (--disable-wallet to disable wallet functionality)]) + # TODO: Ideally this could find the library version and make sure it matches the headers being used + for searchlib in db_cxx-4.8 db_cxx; do + AC_CHECK_LIB([$searchlib],[main],[ + BDB_LIBS="-l${searchlib}" + break + ]) + done + if test "x$BDB_LIBS" = "x"; then + AC_MSG_ERROR([libdb_cxx missing, ]AC_PACKAGE_NAME[ requires this library for wallet functionality (--disable-wallet to disable wallet functionality)]) + fi fi AC_SUBST(BDB_LIBS) ]) diff --git a/build-aux/m4/bitcoin_qt.m4 b/build-aux/m4/bitcoin_qt.m4 index f15568a91be8..5abc58ce7e63 100644 --- a/build-aux/m4/bitcoin_qt.m4 +++ b/build-aux/m4/bitcoin_qt.m4 @@ -1,3 +1,7 @@ +dnl Copyright (c) 2013-2016 The Bitcoin Core developers +dnl Distributed under the MIT software license, see the accompanying +dnl file COPYING or http://www.opensource.org/licenses/mit-license.php. + dnl Helper for cases where a qt dependency is not met. dnl Output: If qt version is auto, set bitcoin_enable_qt to false. Else, exit. AC_DEFUN([BITCOIN_QT_FAIL],[ @@ -235,7 +239,7 @@ AC_DEFUN([BITCOIN_QT_CONFIGURE],[ dnl enable qt support - AC_MSG_CHECKING(whether to build Paccoin Core GUI) + AC_MSG_CHECKING(whether to build ]AC_PACKAGE_NAME[ GUI) BITCOIN_QT_CHECK([ bitcoin_enable_qt=yes bitcoin_enable_qt_test=yes @@ -346,8 +350,9 @@ AC_DEFUN([_BITCOIN_QT_FIND_STATIC_PLUGINS],[ QT_LIBS="$QT_LIBS -L$qt_plugin_path/accessible" fi fi - m4_ifdef([PKG_CHECK_MODULES],[ if test x$use_pkgconfig = xyes; then + : dnl + m4_ifdef([PKG_CHECK_MODULES],[ PKG_CHECK_MODULES([QTPLATFORM], [Qt5PlatformSupport], [QT_LIBS="$QTPLATFORM_LIBS $QT_LIBS"]) if test x$TARGET_OS = xlinux; then PKG_CHECK_MODULES([X11XCB], [x11-xcb], [QT_LIBS="$X11XCB_LIBS $QT_LIBS"]) @@ -357,8 +362,23 @@ AC_DEFUN([_BITCOIN_QT_FIND_STATIC_PLUGINS],[ elif test x$TARGET_OS = xdarwin; then PKG_CHECK_MODULES([QTPRINT], [Qt5PrintSupport], [QT_LIBS="$QTPRINT_LIBS $QT_LIBS"]) fi - fi ]) + else + if test x$TARGET_OS = xwindows; then + AC_CACHE_CHECK(for Qt >= 5.6, bitcoin_cv_need_platformsupport,[AC_COMPILE_IFELSE([AC_LANG_PROGRAM( + [[#include ]],[[ + #if QT_VERSION < 0x050600 + choke; + #endif + ]])], + [bitcoin_cv_need_platformsupport=yes], + [bitcoin_cv_need_platformsupport=no]) + ]) + if test x$bitcoin_cv_need_platformsupport = xyes; then + BITCOIN_QT_CHECK(AC_CHECK_LIB([${QT_LIB_PREFIX}PlatformSupport],[main],,BITCOIN_QT_FAIL(lib$QT_LIB_PREFIXPlatformSupport not found))) + fi + fi + fi else if test x$qt_plugin_path != x; then QT_LIBS="$QT_LIBS -L$qt_plugin_path/accessible" @@ -468,8 +488,8 @@ AC_DEFUN([_BITCOIN_QT_FIND_LIBS_WITHOUT_PKGCONFIG],[ ]) BITCOIN_QT_CHECK(AC_CHECK_LIB([z] ,[main],,AC_MSG_WARN([zlib not found. Assuming qt has it built-in]))) - BITCOIN_QT_CHECK(AC_CHECK_LIB([png] ,[main],,AC_MSG_WARN([libpng not found. Assuming qt has it built-in]))) - BITCOIN_QT_CHECK(AC_CHECK_LIB([jpeg] ,[main],,AC_MSG_WARN([libjpeg not found. Assuming qt has it built-in]))) + BITCOIN_QT_CHECK(AC_SEARCH_LIBS([png_error] ,[qtpng png],,AC_MSG_WARN([libpng not found. Assuming qt has it built-in]))) + BITCOIN_QT_CHECK(AC_SEARCH_LIBS([jpeg_create_decompress] ,[qtjpeg jpeg],,AC_MSG_WARN([libjpeg not found. Assuming qt has it built-in]))) BITCOIN_QT_CHECK(AC_SEARCH_LIBS([pcre16_exec], [qtpcre pcre16],,AC_MSG_WARN([libpcre16 not found. Assuming qt has it built-in]))) BITCOIN_QT_CHECK(AC_SEARCH_LIBS([hb_ot_tags_from_script] ,[qtharfbuzzng harfbuzz],,AC_MSG_WARN([libharfbuzz not found. Assuming qt has it built-in or support is disabled]))) BITCOIN_QT_CHECK(AC_CHECK_LIB([${QT_LIB_PREFIX}Core] ,[main],,BITCOIN_QT_FAIL(lib$QT_LIB_PREFIXCore not found))) diff --git a/build-aux/m4/bitcoin_subdir_to_include.m4 b/build-aux/m4/bitcoin_subdir_to_include.m4 index 66f106c7d47b..7841042ac877 100644 --- a/build-aux/m4/bitcoin_subdir_to_include.m4 +++ b/build-aux/m4/bitcoin_subdir_to_include.m4 @@ -1,3 +1,7 @@ +dnl Copyright (c) 2013-2014 The Bitcoin Core developers +dnl Distributed under the MIT software license, see the accompanying +dnl file COPYING or http://www.opensource.org/licenses/mit-license.php. + dnl BITCOIN_SUBDIR_TO_INCLUDE([CPPFLAGS-VARIABLE-NAME],[SUBDIRECTORY-NAME],[HEADER-FILE]) dnl SUBDIRECTORY-NAME must end with a path separator AC_DEFUN([BITCOIN_SUBDIR_TO_INCLUDE],[ diff --git a/build-aux/m4/l_atomic.m4 b/build-aux/m4/l_atomic.m4 new file mode 100644 index 000000000000..75c43f9a92d3 --- /dev/null +++ b/build-aux/m4/l_atomic.m4 @@ -0,0 +1,46 @@ +dnl Copyright (c) 2015 Tim Kosse +dnl Copying and distribution of this file, with or without modification, are +dnl permitted in any medium without royalty provided the copyright notice +dnl and this notice are preserved. This file is offered as-is, without any +dnl warranty. + +# Some versions of gcc/libstdc++ require linking with -latomic if +# using the C++ atomic library. +# +# Sourced from http://bugs.debian.org/797228 + +m4_define([_CHECK_ATOMIC_testbody], [[ + #include + #include + + int main() { + std::atomic a{}; + + int64_t v = 5; + int64_t r = a.fetch_add(v); + return static_cast(r); + } +]]) + +AC_DEFUN([CHECK_ATOMIC], [ + + AC_LANG_PUSH(C++) + + AC_MSG_CHECKING([whether std::atomic can be used without link library]) + + AC_LINK_IFELSE([AC_LANG_SOURCE([_CHECK_ATOMIC_testbody])],[ + AC_MSG_RESULT([yes]) + ],[ + AC_MSG_RESULT([no]) + LIBS="$LIBS -latomic" + AC_MSG_CHECKING([whether std::atomic needs -latomic]) + AC_LINK_IFELSE([AC_LANG_SOURCE([_CHECK_ATOMIC_testbody])],[ + AC_MSG_RESULT([yes]) + ],[ + AC_MSG_RESULT([no]) + AC_MSG_FAILURE([cannot figure out how to use std::atomic]) + ]) + ]) + + AC_LANG_POP +]) diff --git a/configure.ac b/configure.ac index e5c136200c3d..61505c9c75a6 100644 --- a/configure.ac +++ b/configure.ac @@ -6,12 +6,19 @@ define(_CLIENT_VERSION_REVISION, 6) define(_CLIENT_VERSION_BUILD, 0) define(_CLIENT_VERSION_IS_RELEASE, true) define(_COPYRIGHT_YEAR, 2019) -AC_INIT([Paccoin Core],[_CLIENT_VERSION_MAJOR._CLIENT_VERSION_MINOR._CLIENT_VERSION_REVISION],[https://github.com/PACCommunity/PAC/issues],[paccoincore]) +define(_COPYRIGHT_HOLDERS,[The %s developers]) +define(_COPYRIGHT_HOLDERS_SUBSTITUTION,[[Paccoin Core]]) +AC_INIT([Paccoin Core],[_CLIENT_VERSION_MAJOR._CLIENT_VERSION_MINOR._CLIENT_VERSION_REVISION],[https://github.com/PaccoinCommunity/PAC/issues],[Paccoin],[https://paccoin.net/]) AC_CONFIG_SRCDIR([src/validation.cpp]) AC_CONFIG_HEADERS([src/config/paccoin-config.h]) AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_MACRO_DIR([build-aux/m4]) +BITCOIN_DAEMON_NAME=paccoind +BITCOIN_GUI_NAME=paccoin-qt +BITCOIN_CLI_NAME=paccoin-cli +BITCOIN_TX_NAME=paccoin-tx + AC_CANONICAL_HOST AH_TOP([#ifndef PAC_CONFIG_H]) @@ -47,8 +54,10 @@ case $host in lt_cv_deplibs_check_method="pass_all" ;; esac -dnl Require C++11 compiler (no GNU extensions) -AX_CXX_COMPILE_STDCXX([11], [noext], [mandatory], [nodefault]) +dnl Require C++14 compiler (no GNU extensions) +AX_CXX_COMPILE_STDCXX([14], [noext], [mandatory], [nodefault]) +dnl Check if -latomic is required for +CHECK_ATOMIC dnl Unless the user specified OBJCXX, force it to be the same as CXX. This ensures dnl that we get the same -std flags for both. @@ -68,8 +77,8 @@ AC_PATH_TOOL(RANLIB, ranlib) AC_PATH_TOOL(STRIP, strip) AC_PATH_TOOL(GCOV, gcov) AC_PATH_PROG(LCOV, lcov) -AC_PATH_PROG(JAVA, java) -AC_PATH_PROG(PYTHON, python) +dnl Python 3.x is supported from 3.4 on (see https://github.com/bitcoin/bitcoin/issues/7893) +AC_PATH_PROGS([PYTHON], [python3.6 python3.5 python3.4 python3 python2.7 python2 python]) AC_PATH_PROG(GENHTML, genhtml) AC_PATH_PROG([GIT], [git]) AC_PATH_PROG(CCACHE,ccache) @@ -77,9 +86,9 @@ AC_PATH_PROG(XGETTEXT,xgettext) AC_PATH_PROG(HEXDUMP,hexdump) AC_PATH_TOOL(READELF, readelf) AC_PATH_TOOL(CPPFILT, c++filt) +AC_PATH_TOOL(OBJCOPY, objcopy) -dnl pkg-config check. -PKG_PROG_PKG_CONFIG +AC_ARG_VAR(PYTHONPATH, Augments the default search path for python module files) # Enable wallet AC_ARG_ENABLE([wallet], @@ -115,16 +124,6 @@ AC_ARG_ENABLE(bench, [use_bench=$enableval], [use_bench=yes]) -AC_ARG_WITH([comparison-tool], - AS_HELP_STRING([--with-comparison-tool],[path to java comparison tool (requires --enable-tests)]), - [use_comparison_tool=$withval], - [use_comparison_tool=no]) - -AC_ARG_ENABLE([comparison-tool-reorg-tests], - AS_HELP_STRING([--enable-comparison-tool-reorg-tests],[enable expensive reorg tests in the comparison tool (default no)]), - [use_comparison_tool_reorg_tests=$enableval], - [use_comparison_tool_reorg_tests=no]) - AC_ARG_ENABLE([extended-rpc-tests], AS_HELP_STRING([--enable-extended-rpc-tests],[enable expensive RPC tests when using lcov (default no)]), [use_extended_rpc_tests=$enableval], @@ -180,6 +179,12 @@ AC_ARG_ENABLE([zmq], AC_ARG_WITH([protoc-bindir],[AS_HELP_STRING([--with-protoc-bindir=BIN_DIR],[specify protoc bin path])], [protoc_bin_path=$withval], []) +AC_ARG_ENABLE(man, + [AS_HELP_STRING([--disable-man], + [do not install man pages (default is to install)])],, + enable_man=yes) +AM_CONDITIONAL(ENABLE_MAN, test "$enable_man" != no) + # Enable debug AC_ARG_ENABLE([debug], [AS_HELP_STRING([--enable-debug], @@ -187,6 +192,13 @@ AC_ARG_ENABLE([debug], [enable_debug=$enableval], [enable_debug=no]) +# Turn warnings into errors +AC_ARG_ENABLE([werror], + [AS_HELP_STRING([--enable-werror], + [Treat certain compiler warnings as errors (default is no)])], + [enable_werror=$enableval], + [enable_werror=no]) + AC_LANG_PUSH([C++]) AX_CHECK_COMPILE_FLAG([-Werror],[CXXFLAG_WERROR="-Werror"],[CXXFLAG_WERROR=""]) @@ -201,10 +213,19 @@ if test "x$enable_debug" = xyes; then fi fi +ERROR_CXXFLAGS= +if test "x$enable_werror" = "xyes"; then + if test "x$CXXFLAG_WERROR" = "x"; then + AC_MSG_ERROR("enable-werror set but -Werror is not usable") + fi + AX_CHECK_COMPILE_FLAG([-Werror=vla],[ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror=vla"],,[[$CXXFLAG_WERROR]]) +fi + if test "x$CXXFLAGS_overridden" = "xno"; then AX_CHECK_COMPILE_FLAG([-Wall],[CXXFLAGS="$CXXFLAGS -Wall"],,[[$CXXFLAG_WERROR]]) AX_CHECK_COMPILE_FLAG([-Wextra],[CXXFLAGS="$CXXFLAGS -Wextra"],,[[$CXXFLAG_WERROR]]) AX_CHECK_COMPILE_FLAG([-Wformat],[CXXFLAGS="$CXXFLAGS -Wformat"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wvla],[CXXFLAGS="$CXXFLAGS -Wvla"],,[[$CXXFLAG_WERROR]]) AX_CHECK_COMPILE_FLAG([-Wformat-security],[CXXFLAGS="$CXXFLAGS -Wformat-security"],,[[$CXXFLAG_WERROR]]) ## Some compilers (gcc) ignore unknown -Wno-* options, but warn about all @@ -315,6 +336,7 @@ case $host in fi fi + AC_PATH_PROGS([RSVG_CONVERT], [rsvg-convert rsvg],rsvg-convert) AC_CHECK_PROG([BREW],brew, brew) if test x$BREW = xbrew; then dnl These Homebrew packages may be keg-only, meaning that they won't be found @@ -348,6 +370,9 @@ case $host in AC_PATH_TOOL([INSTALLNAMETOOL], [install_name_tool], install_name_tool) AC_PATH_TOOL([OTOOL], [otool], otool) AC_PATH_PROGS([GENISOIMAGE], [genisoimage mkisofs],genisoimage) + AC_PATH_PROGS([RSVG_CONVERT], [rsvg-convert rsvg],rsvg-convert) + AC_PATH_PROGS([IMAGEMAGICK_CONVERT], [convert],convert) + AC_PATH_PROGS([TIFFCP], [tiffcp],tiffcp) dnl libtool will try to strip the static lib, which is a problem for dnl cross-builds because strip attempts to call a hard-coded ld, @@ -366,23 +391,27 @@ case $host in TARGET_OS=linux LEVELDB_TARGET_FLAGS="-DOS_LINUX" ;; + *freebsd*) + LEVELDB_TARGET_FLAGS="-DOS_FREEBSD" + ;; + *openbsd*) + LEVELDB_TARGET_FLAGS="-DOS_OPENBSD" + ;; *) OTHER_OS=`echo ${host_os} | awk '{print toupper($0)}'` + AC_MSG_WARN([Guessing LevelDB OS as OS_${OTHER_OS}, please check whether this is correct, if not add an entry to configure.ac.]) LEVELDB_TARGET_FLAGS="-DOS_${OTHER_OS}" ;; esac -if test x$use_comparison_tool != xno; then - AC_SUBST(JAVA_COMPARISON_TOOL, $use_comparison_tool) -fi - -if test x$use_comparison_tool_reorg_tests != xno; then - if test x$use_comparison_tool = x; then - AC_MSG_ERROR("comparison tool reorg tests but comparison tool was not specified") +if test x$use_pkgconfig = xyes; then + m4_ifndef([PKG_PROG_PKG_CONFIG], [AC_MSG_ERROR(PKG_PROG_PKG_CONFIG macro not found. Please install pkg-config and re-run autogen.sh.)]) + m4_ifdef([PKG_PROG_PKG_CONFIG], [ + PKG_PROG_PKG_CONFIG + if test x"$PKG_CONFIG" = "x"; then + AC_MSG_ERROR(pkg-config not found.) fi - AC_SUBST(COMPARISON_TOOL_REORG_TESTS, 1) -else - AC_SUBST(COMPARISON_TOOL_REORG_TESTS, 0) + ]) fi if test x$use_extended_rpc_tests != xno; then @@ -396,19 +425,15 @@ if test x$use_lcov = xyes; then if test x$GCOV = x; then AC_MSG_ERROR("lcov testing requested but gcov not found") fi - if test x$JAVA = x; then - AC_MSG_ERROR("lcov testing requested but java not found") - fi if test x$PYTHON = x; then AC_MSG_ERROR("lcov testing requested but python not found") fi if test x$GENHTML = x; then AC_MSG_ERROR("lcov testing requested but genhtml not found") fi - if test x$use_comparison_tool = x; then - AC_MSG_ERROR("lcov testing requested but comparison tool was not specified") - fi LCOV="$LCOV --gcov-tool=$GCOV" + AX_CHECK_LINK_FLAG([[--coverage]], [LDFLAGS="$LDFLAGS --coverage"], + [AC_MSG_ERROR("lcov testing requested but --coverage linker flag does not work")]) AX_CHECK_COMPILE_FLAG([--coverage],[CXXFLAGS="$CXXFLAGS --coverage"], [AC_MSG_ERROR("lcov testing requested but --coverage flag does not work")]) fi @@ -463,6 +488,8 @@ if test x$use_glibc_compat != xno; then [ fdelt_type="long int"]) AC_MSG_RESULT($fdelt_type) AC_DEFINE_UNQUOTED(FDELT_TYPE, $fdelt_type,[parameter and return value type for __fdelt_chk]) + AX_CHECK_LINK_FLAG([[-Wl,--wrap=__divmoddi4]], [COMPAT_LDFLAGS="$COMPAT_LDFLAGS -Wl,--wrap=__divmoddi4"]) + AX_CHECK_LINK_FLAG([[-Wl,--wrap=log2f]], [COMPAT_LDFLAGS="$COMPAT_LDFLAGS -Wl,--wrap=log2f"]) else AC_SEARCH_LIBS([clock_gettime],[rt]) fi @@ -485,6 +512,7 @@ if test x$use_hardening != xno; then AX_CHECK_LINK_FLAG([[-Wl,--dynamicbase]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--dynamicbase"]) AX_CHECK_LINK_FLAG([[-Wl,--nxcompat]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--nxcompat"]) + AX_CHECK_LINK_FLAG([[-Wl,--high-entropy-va]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--high-entropy-va"]) AX_CHECK_LINK_FLAG([[-Wl,-z,relro]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,relro"]) AX_CHECK_LINK_FLAG([[-Wl,-z,now]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,now"]) @@ -506,11 +534,12 @@ if test x$TARGET_OS = xdarwin; then fi AC_CHECK_HEADERS([endian.h sys/endian.h byteswap.h stdio.h stdlib.h unistd.h strings.h sys/types.h sys/stat.h sys/select.h sys/prctl.h]) -AC_SEARCH_LIBS([getaddrinfo_a], [anl], [AC_DEFINE(HAVE_GETADDRINFO_A, 1, [Define this symbol if you have getaddrinfo_a])]) -AC_SEARCH_LIBS([inet_pton], [nsl resolv], [AC_DEFINE(HAVE_INET_PTON, 1, [Define this symbol if you have inet_pton])]) AC_CHECK_DECLS([strnlen]) +# Check for daemon(3), unrelated to --with-daemon (although used by it) +AC_CHECK_DECLS([daemon]) + AC_CHECK_DECLS([le16toh, le32toh, le64toh, htole16, htole32, htole64, be16toh, be32toh, be64toh, htobe16, htobe32, htobe64],,, [#if HAVE_ENDIAN_H #include @@ -531,6 +560,14 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [ AC_MSG_RESULT(no)] ) +dnl Check for mallopt(M_ARENA_MAX) (to set glibc arenas) +AC_MSG_CHECKING(for mallopt M_ARENA_MAX) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[ mallopt(M_ARENA_MAX, 1); ]])], + [ AC_MSG_RESULT(yes); AC_DEFINE(HAVE_MALLOPT_ARENA_MAX, 1,[Define this symbol if you have mallopt with M_ARENA_MAX]) ], + [ AC_MSG_RESULT(no)] +) + AC_MSG_CHECKING([for visibility attribute]) AC_LINK_IFELSE([AC_LANG_SOURCE([ int foo_def( void ) __attribute__((visibility("default"))); @@ -553,18 +590,6 @@ if test x$use_reduce_exports = xyes; then [AC_MSG_ERROR([Cannot set default symbol visibility. Use --disable-reduce-exports.])]) fi -dnl This can go away when we require c++11 -TEMP_CXXFLAGS="$CXXFLAGS" -CXXFLAGS="$CXXFLAGS -std=c++0x" -AC_MSG_CHECKING(for c++11 atomics) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - #include - ]],[[]])], - [ AC_MSG_RESULT(yes); LEVELDB_ATOMIC_CPPFLAGS="-DLEVELDB_ATOMIC_PRESENT"; LEVELDB_ATOMIC_CXXFLAGS="-std=c++0x"], - [ AC_MSG_RESULT(no)] -) -CXXFLAGS="$TEMP_CXXFLAGS" - LEVELDB_CPPFLAGS= LIBLEVELDB= LIBMEMENV= @@ -592,7 +617,7 @@ BITCOIN_QT_INIT dnl sets $bitcoin_enable_qt, $bitcoin_enable_qt_test, $bitcoin_enable_qt_dbus BITCOIN_QT_CONFIGURE([$use_pkgconfig], [qt5]) -if test x$build_bitcoin_utils$build_bitcoind$bitcoin_enable_qt$use_tests = xnononono; then +if test x$build_bitcoin_utils$build_bitcoind$bitcoin_enable_qt$use_tests$use_bench = xnonononono; then use_boost=no else use_boost=yes @@ -600,8 +625,11 @@ fi if test x$use_boost = xyes; then +dnl Minimum required Boost version +define(MINIMUM_REQUIRED_BOOST, 1.47.0) + dnl Check for boost libs -AX_BOOST_BASE +AX_BOOST_BASE([MINIMUM_REQUIRED_BOOST]) AX_BOOST_SYSTEM AX_BOOST_FILESYSTEM AX_BOOST_PROGRAM_OPTIONS @@ -761,12 +789,7 @@ fi fi if test x$use_pkgconfig = xyes; then - - if test x"$PKG_CONFIG" = "x"; then - AC_MSG_ERROR(pkg-config not found.) - fi - - : #NOP + : dnl m4_ifdef( [PKG_CHECK_MODULES], [ @@ -823,6 +846,15 @@ else AC_DEFINE_UNQUOTED([ENABLE_ZMQ],[0],[Define to 1 to enable ZMQ functions]) fi + if test "x$use_zmq" = "xyes"; then + dnl Assume libzmq was built for static linking + case $host in + *mingw*) + ZMQ_CFLAGS="$ZMQ_CFLAGS -DZMQ_STATIC" + ;; + esac + fi + BITCOIN_QT_CHECK(AC_CHECK_LIB([protobuf] ,[main],[PROTOBUF_LIBS=-lprotobuf], BITCOIN_QT_FAIL(libprotobuf not found))) if test x$use_qr != xno; then BITCOIN_QT_CHECK([AC_CHECK_LIB([qrencode], [main],[QR_LIBS=-lqrencode], [have_qrencode=no])]) @@ -830,8 +862,21 @@ else fi fi +save_CXXFLAGS="${CXXFLAGS}" +CXXFLAGS="${CXXFLAGS} ${CRYPTO_CFLAGS} ${SSL_CFLAGS}" +AC_CHECK_DECLS([EVP_MD_CTX_new],,,[AC_INCLUDES_DEFAULT +#include +]) +CXXFLAGS="${save_CXXFLAGS}" + dnl univalue check +need_bundled_univalue=yes + +if test x$build_bitcoin_utils$build_bitcoind$bitcoin_enable_qt$use_tests$use_bench = xnonononono; then + need_bundled_univalue=no +else + if test x$system_univalue != xno ; then found_univalue=no if test x$use_pkgconfig = xyes; then @@ -853,6 +898,7 @@ if test x$system_univalue != xno ; then if test x$found_univalue = xyes ; then system_univalue=yes + need_bundled_univalue=no elif test x$system_univalue = xyes ; then AC_MSG_ERROR([univalue not found]) else @@ -860,22 +906,17 @@ if test x$system_univalue != xno ; then fi fi -if test x$system_univalue = xno ; then +if test x$need_bundled_univalue = xyes ; then UNIVALUE_CFLAGS='-I$(srcdir)/univalue/include' UNIVALUE_LIBS='univalue/libunivalue.la' fi -AM_CONDITIONAL([EMBEDDED_UNIVALUE],[test x$system_univalue = xno]) + +fi + +AM_CONDITIONAL([EMBEDDED_UNIVALUE],[test x$need_bundled_univalue = xyes]) AC_SUBST(UNIVALUE_CFLAGS) AC_SUBST(UNIVALUE_LIBS) -CXXFLAGS_TEMP="$CXXFLAGS" -LIBS_TEMP="$LIBS" -CXXFLAGS="$CXXFLAGS $SSL_CFLAGS $CRYPTO_CFLAGS" -LIBS="$LIBS $SSL_LIBS $CRYPTO_LIBS" -AC_CHECK_HEADER([openssl/ec.h],, AC_MSG_ERROR(OpenSSL ec header missing),) -CXXFLAGS="$CXXFLAGS_TEMP" -LIBS="$LIBS_TEMP" - BITCOIN_QT_PATH_PROGS([PROTOC], [protoc],$protoc_bin_path) AC_MSG_CHECKING([whether to build paccoind]) @@ -1010,8 +1051,8 @@ else AC_MSG_RESULT([no]) fi -if test x$build_bitcoin_utils$build_bitcoin_libs$build_bitcoind$bitcoin_enable_qt$use_tests = xnonononono; then - AC_MSG_ERROR([No targets! Please specify at least one of: --with-utils --with-libs --with-daemon --with-gui or --enable-tests]) +if test x$build_bitcoin_utils$build_bitcoin_libs$build_bitcoind$bitcoin_enable_qt$use_bench$use_tests = xnononononono; then + AC_MSG_ERROR([No targets! Please specify at least one of: --with-utils --with-libs --with-daemon --with-gui --enable-bench or --enable-tests]) fi AM_CONDITIONAL([TARGET_DARWIN], [test x$TARGET_OS = xdarwin]) @@ -1024,8 +1065,6 @@ AM_CONDITIONAL([ENABLE_QT_TESTS],[test x$BUILD_TEST_QT = xyes]) AM_CONDITIONAL([ENABLE_BENCH],[test x$use_bench = xyes]) AM_CONDITIONAL([USE_QRCODE], [test x$use_qr = xyes]) AM_CONDITIONAL([USE_LCOV],[test x$use_lcov = xyes]) -AM_CONDITIONAL([USE_COMPARISON_TOOL],[test x$use_comparison_tool != xno]) -AM_CONDITIONAL([USE_COMPARISON_TOOL_REORG_TESTS],[test x$use_comparison_tool_reorg_test != xno]) AM_CONDITIONAL([GLIBC_BACK_COMPAT],[test x$use_glibc_compat = xyes]) AM_CONDITIONAL([HARDEN],[test x$use_hardening = xyes]) @@ -1034,15 +1073,32 @@ AC_DEFINE(CLIENT_VERSION_MINOR, _CLIENT_VERSION_MINOR, [Minor version]) AC_DEFINE(CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION, [Build revision]) AC_DEFINE(CLIENT_VERSION_BUILD, _CLIENT_VERSION_BUILD, [Version Build]) AC_DEFINE(CLIENT_VERSION_IS_RELEASE, _CLIENT_VERSION_IS_RELEASE, [Version is release]) -AC_DEFINE(COPYRIGHT_YEAR, _COPYRIGHT_YEAR, [Version is release]) +AC_DEFINE(COPYRIGHT_YEAR, _COPYRIGHT_YEAR, [Copyright year]) +AC_DEFINE(COPYRIGHT_HOLDERS, "_COPYRIGHT_HOLDERS", [Copyright holder(s) before %s replacement]) +AC_DEFINE(COPYRIGHT_HOLDERS_SUBSTITUTION, "_COPYRIGHT_HOLDERS_SUBSTITUTION", [Replacement for %s in copyright holders string]) +define(_COPYRIGHT_HOLDERS_FINAL, [patsubst(_COPYRIGHT_HOLDERS, [%s], [_COPYRIGHT_HOLDERS_SUBSTITUTION])]) +AC_DEFINE(COPYRIGHT_HOLDERS_FINAL, "_COPYRIGHT_HOLDERS_FINAL", [Copyright holder(s)]) AC_SUBST(CLIENT_VERSION_MAJOR, _CLIENT_VERSION_MAJOR) AC_SUBST(CLIENT_VERSION_MINOR, _CLIENT_VERSION_MINOR) AC_SUBST(CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION) AC_SUBST(CLIENT_VERSION_BUILD, _CLIENT_VERSION_BUILD) AC_SUBST(CLIENT_VERSION_IS_RELEASE, _CLIENT_VERSION_IS_RELEASE) AC_SUBST(COPYRIGHT_YEAR, _COPYRIGHT_YEAR) +AC_SUBST(COPYRIGHT_HOLDERS, "_COPYRIGHT_HOLDERS") +AC_SUBST(COPYRIGHT_HOLDERS_SUBSTITUTION, "_COPYRIGHT_HOLDERS_SUBSTITUTION") +AC_SUBST(COPYRIGHT_HOLDERS_FINAL, "_COPYRIGHT_HOLDERS_FINAL") +AC_SUBST(BITCOIN_DAEMON_NAME) +AC_SUBST(BITCOIN_GUI_NAME) +AC_SUBST(BITCOIN_CLI_NAME) +AC_SUBST(BITCOIN_TX_NAME) AC_SUBST(RELDFLAGS) +AC_SUBST(DEBUG_CPPFLAGS) +AC_SUBST(WARN_CXXFLAGS) +AC_SUBST(NOWARN_CXXFLAGS) +AC_SUBST(DEBUG_CXXFLAGS) +AC_SUBST(COMPAT_LDFLAGS) +AC_SUBST(ERROR_CXXFLAGS) AC_SUBST(HARDENED_CXXFLAGS) AC_SUBST(HARDENED_CPPFLAGS) AC_SUBST(HARDENED_LDFLAGS) @@ -1056,11 +1112,17 @@ AC_SUBST(TESTDEFS) AC_SUBST(LEVELDB_TARGET_FLAGS) AC_SUBST(MINIUPNPC_CPPFLAGS) AC_SUBST(MINIUPNPC_LIBS) -AC_SUBST(LEVELDB_ATOMIC_CPPFLAGS) -AC_SUBST(LEVELDB_ATOMIC_CXXFLAGS) -AC_CONFIG_FILES([Makefile src/Makefile share/setup.nsi share/qt/Info.plist src/test/buildenv.py]) -AC_CONFIG_FILES([qa/pull-tester/run-bitcoind-for-test.sh],[chmod +x qa/pull-tester/run-bitcoind-for-test.sh]) +AC_SUBST(CRYPTO_LIBS) +AC_SUBST(SSL_LIBS) +AC_SUBST(EVENT_LIBS) +AC_SUBST(EVENT_PTHREADS_LIBS) +AC_SUBST(ZMQ_LIBS) +AC_SUBST(PROTOBUF_LIBS) +AC_SUBST(QR_LIBS) +AC_CONFIG_FILES([Makefile src/Makefile doc/man/Makefile share/setup.nsi share/qt/Info.plist src/test/buildenv.py]) AC_CONFIG_FILES([qa/pull-tester/tests_config.py],[chmod +x qa/pull-tester/tests_config.py]) +AC_CONFIG_FILES([contrib/devtools/split-debug.sh],[chmod +x contrib/devtools/split-debug.sh]) +AC_CONFIG_LINKS([qa/pull-tester/rpc-tests.py:qa/pull-tester/rpc-tests.py]) dnl boost's m4 checks do something really nasty: they export these vars. As a dnl result, they leak into secp256k1's configure and crazy things happen. @@ -1085,7 +1147,7 @@ PKGCONFIG_LIBDIR_TEMP="$PKG_CONFIG_LIBDIR" unset PKG_CONFIG_LIBDIR PKG_CONFIG_LIBDIR="$PKGCONFIG_LIBDIR_TEMP" -if test x$system_univalue = xno; then +if test x$need_bundled_univalue = xyes; then AC_CONFIG_SUBDIRS([src/univalue]) fi @@ -1112,3 +1174,29 @@ case ${OS} in mv qa/pull-tester/tests_config-2.py qa/pull-tester/tests_config.py ;; esac + +echo +echo "Options used to compile and link:" +echo " with wallet = $enable_wallet" +echo " with gui / qt = $bitcoin_enable_qt" +if test x$bitcoin_enable_qt != xno; then + echo " qt version = $bitcoin_qt_got_major_vers" + echo " with qr = $use_qr" +fi +echo " with zmq = $use_zmq" +echo " with test = $use_tests" +echo " with bench = $use_bench" +echo " with upnp = $use_upnp" +echo " debug enabled = $enable_debug" +echo " werror = $enable_werror" +echo +echo " target os = $TARGET_OS" +echo " build os = $BUILD_OS" +echo +echo " CC = $CC" +echo " CFLAGS = $CFLAGS" +echo " CPPFLAGS = $CPPFLAGS" +echo " CXX = $CXX" +echo " CXXFLAGS = $CXXFLAGS" +echo " LDFLAGS = $LDFLAGS" +echo diff --git a/contrib/dash-qt.pro b/contrib/dash-qt.pro index 8fd26b9c9dfe..7fcf5e8d8a95 100644 --- a/contrib/dash-qt.pro +++ b/contrib/dash-qt.pro @@ -17,7 +17,8 @@ FORMS += \ ../src/qt/forms/sendcoinsdialog.ui \ ../src/qt/forms/sendcoinsentry.ui \ ../src/qt/forms/signverifymessagedialog.ui \ - ../src/qt/forms/transactiondescdialog.ui + ../src/qt/forms/transactiondescdialog.ui \ + ../src/qt/forms/privatepage.ui RESOURCES += \ ../src/qt/paccoin.qrc diff --git a/contrib/devtools/split-debug.sh b/contrib/devtools/split-debug.sh new file mode 100755 index 000000000000..7f124ca9d909 --- /dev/null +++ b/contrib/devtools/split-debug.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +if [ $# -ne 3 ]; + then echo "usage: $0 " +fi + + --enable-deterministic-archives -p --only-keep-debug $1 $3 + --enable-deterministic-archives -p --strip-debug $1 $2 +/usr/bin/strip --enable-deterministic-archives -p -s $2 + --enable-deterministic-archives -p --add-gnu-debuglink=$3 $2 diff --git a/contrib/devtools/split-debug.sh.in b/contrib/devtools/split-debug.sh.in new file mode 100644 index 000000000000..deda49cc5410 --- /dev/null +++ b/contrib/devtools/split-debug.sh.in @@ -0,0 +1,10 @@ +#!/bin/sh + +if [ $# -ne 3 ]; + then echo "usage: $0 " +fi + +@OBJCOPY@ --enable-deterministic-archives -p --only-keep-debug $1 $3 +@OBJCOPY@ --enable-deterministic-archives -p --strip-debug $1 $2 +@STRIP@ --enable-deterministic-archives -p -s $2 +@OBJCOPY@ --enable-deterministic-archives -p --add-gnu-debuglink=$3 $2 diff --git a/contrib/devtools/symbol-check.py b/contrib/devtools/symbol-check.py index 4ad5136f79ee..edfc77616368 100755 --- a/contrib/devtools/symbol-check.py +++ b/contrib/devtools/symbol-check.py @@ -47,7 +47,7 @@ # Ignore symbols that are exported as part of every executable IGNORE_EXPORTS = { -'_edata', '_end', '_init', '__bss_start', '_fini', '_IO_stdin_used' +'_edata', '_end', '_init', '__bss_start', '_fini', '_IO_stdin_used', 'stdin', 'stdout', 'stderr' } READELF_CMD = os.getenv('READELF', '/usr/bin/readelf') CPPFILT_CMD = os.getenv('CPPFILT', '/usr/bin/c++filt') diff --git a/contrib/gitian-descriptors/README.md b/contrib/gitian-descriptors/README.md index b4f76ac3eb98..b89b60014e36 100644 --- a/contrib/gitian-descriptors/README.md +++ b/contrib/gitian-descriptors/README.md @@ -26,7 +26,7 @@ Once you've got the right hardware and software: # Create base images cd gitian-builder - bin/make-base-vm --suite trusty --arch amd64 + bin/make-base-vm --suite bionic --arch amd64 cd .. # Get inputs (see doc/release-process.md for exact inputs needed and where to get them) diff --git a/contrib/gitian-descriptors/gitian-linux.yml b/contrib/gitian-descriptors/gitian-linux.yml index 9983f29c208f..417f2f6da593 100755 --- a/contrib/gitian-descriptors/gitian-linux.yml +++ b/contrib/gitian-descriptors/gitian-linux.yml @@ -1,34 +1,46 @@ --- -name: "paccoin-linux-0.12" +name: "paccoin-linux-0.13" enable_cache: true suites: -- "trusty" +- "bionic" architectures: - "amd64" packages: - "curl" -- "g++-multilib" -- "git-core" +- "g++-aarch64-linux-gnu" +- "g++-7-aarch64-linux-gnu" +- "gcc-7-aarch64-linux-gnu" +- "binutils-aarch64-linux-gnu" +- "g++-arm-linux-gnueabihf" +- "g++-7-arm-linux-gnueabihf" +- "gcc-7-arm-linux-gnueabihf" +- "binutils-arm-linux-gnueabihf" +- "g++-7-multilib" +- "gcc-7-multilib" +- "binutils-gold" +- "git" - "pkg-config" - "autoconf" - "libtool" - "automake" +- "cmake" - "faketime" - "bsdmainutils" -- "binutils-gold" - "ca-certificates" - "python" -reference_datetime: "2017-01-01 00:00:00" +- "python3" +- "libxkbcommon0" remotes: - "url": "https://github.com/PACCommunity/PAC.git" "dir": "PAC" files: [] script: | + WRAP_DIR=$HOME/wrapped - HOSTS="i686-pc-linux-gnu x86_64-unknown-linux-gnu" - CONFIGFLAGS="--enable-glibc-back-compat --enable-reduce-exports --disable-bench --disable-gui-tests LDFLAGS=-static-libstdc++" + HOSTS="i686-pc-linux-gnu x86_64-linux-gnu arm-linux-gnueabihf aarch64-linux-gnu" + CONFIGFLAGS="--enable-glibc-back-compat --enable-reduce-exports --disable-bench --disable-gui-tests" FAKETIME_HOST_PROGS="" - FAKETIME_PROGS="date ar ranlib nm strip objcopy" + FAKETIME_PROGS="date ar ranlib nm" HOST_CFLAGS="-O2 -g" HOST_CXXFLAGS="-O2 -g" HOST_LDFLAGS=-static-libstdc++ @@ -41,51 +53,124 @@ script: | mkdir -p ${WRAP_DIR} if test -n "$GBUILD_CACHE_ENABLED"; then export SOURCES_PATH=${GBUILD_COMMON_CACHE} - export BASE_CACHE=${GBUILD_PACKAGE_CACHE} + export BASE_CACHE=${GBUILD_PACKAGE_CACHE}/depends mkdir -p ${BASE_CACHE} ${SOURCES_PATH} + + # Setup ccache to use correct cache directories and fix the compiler check of ccache + CONFIGFLAGS="${CONFIGFLAGS} --enable-ccache" + export CCACHE_DIR=${GBUILD_PACKAGE_CACHE}/ccache + # As we later wrap the gcc binaries, this is fast + export CCACHE_COMPILERCHECK="content" + if [ -f ${GBUILD_PACKAGE_CACHE}/ccache.tar ]; then + pushd ${GBUILD_PACKAGE_CACHE} + tar xf ccache.tar + rm ccache.tar + popd + fi + # instead of compressing ccache.tar, we let ccache handle it by itself + # Otherwise we end up uncompressing/compressing a lot of cache files which we actually never use + export CCACHE_COMPRESS=1 + else + CONFIGFLAGS="${CONFIGFLAGS} --disable-ccache" fi - # Create global faketime wrappers + # We include the GCC version in all wrappers so that ccache can detect compiler upgrades when hashing the wrappers + GCCVERSION=`gcc --version | head -1` + + function create_global_faketime_wrappers { for prog in ${FAKETIME_PROGS}; do echo '#!/bin/bash' > ${WRAP_DIR}/${prog} + echo "# GCCVERSION=${GCCVERSION}" >> ${WRAP_DIR}/${prog} echo "REAL=\`which -a ${prog} | grep -v ${WRAP_DIR}/${prog} | head -1\`" >> ${WRAP_DIR}/${prog} echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${prog} - echo "export FAKETIME=\"${REFERENCE_DATETIME}\"" >> ${WRAP_DIR}/${prog} + echo "export FAKETIME=\"$1\"" >> ${WRAP_DIR}/${prog} echo "\$REAL \$@" >> $WRAP_DIR/${prog} chmod +x ${WRAP_DIR}/${prog} + touch -d "${REFERENCE_DATETIME}" ${WRAP_DIR}/${prog} done + } - # Create per-host faketime wrappers + function create_per-host_faketime_wrappers { for i in $HOSTS; do for prog in ${FAKETIME_HOST_PROGS}; do echo '#!/bin/bash' > ${WRAP_DIR}/${i}-${prog} + echo "# GCCVERSION=${GCCVERSION}" >> ${WRAP_DIR}/${i}-${prog} echo "REAL=\`which -a ${i}-${prog} | grep -v ${WRAP_DIR}/${i}-${prog} | head -1\`" >> ${WRAP_DIR}/${i}-${prog} echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${i}-${prog} - echo "export FAKETIME=\"${REFERENCE_DATETIME}\"" >> ${WRAP_DIR}/${i}-${prog} + echo "export FAKETIME=\"$1\"" >> ${WRAP_DIR}/${i}-${prog} echo "\$REAL \$@" >> $WRAP_DIR/${i}-${prog} chmod +x ${WRAP_DIR}/${i}-${prog} + touch -d "${REFERENCE_DATETIME}" ${WRAP_DIR}/${i}-${prog} done done + } + + # Faketime for depends so intermediate results are comparable + export PATH_orig=${PATH} + create_global_faketime_wrappers "2000-01-01 12:00:00" + create_per-host_faketime_wrappers "2000-01-01 12:00:00" export PATH=${WRAP_DIR}:${PATH} + EXTRA_INCLUDES_BASE=$WRAP_DIR/extra_includes + mkdir -p $EXTRA_INCLUDES_BASE + + # x86 needs /usr/include/i386-linux-gnu/asm pointed to /usr/include/x86_64-linux-gnu/asm, + # but we can't write there. Instead, create a link here and force it to be included in the + # search paths by wrapping gcc/g++. + + mkdir -p $EXTRA_INCLUDES_BASE/i686-pc-linux-gnu + rm -f $WRAP_DIR/extra_includes/i686-pc-linux-gnu/asm + ln -s /usr/include/x86_64-linux-gnu/asm $EXTRA_INCLUDES_BASE/i686-pc-linux-gnu/asm + + for prog in gcc g++; do + rm -f ${WRAP_DIR}/${prog} + cat << EOF > ${WRAP_DIR}/${prog} + #!/bin/bash + # GCCVERSION=${GCCVERSION} + REAL="`which -a ${prog} | grep -v ${WRAP_DIR}/${prog} | head -1`" + for var in "\$@" + do + if [ "\$var" = "-m32" ]; then + export C_INCLUDE_PATH="$EXTRA_INCLUDES_BASE/i686-pc-linux-gnu" + export CPLUS_INCLUDE_PATH="$EXTRA_INCLUDES_BASE/i686-pc-linux-gnu" + break + fi + done + \$REAL \$@ + EOF + chmod +x ${WRAP_DIR}/${prog} + touch -d "${REFERENCE_DATETIME}" ${WRAP_DIR}/${prog} + done + cd PAC BASEPREFIX=`pwd`/depends # Build dependencies for each host for i in $HOSTS; do + EXTRA_INCLUDES="$EXTRA_INCLUDES_BASE/$i" + if [ -d "$EXTRA_INCLUDES" ]; then + export HOST_ID_SALT="$EXTRA_INCLUDES" + fi make ${MAKEOPTS} -C ${BASEPREFIX} HOST="${i}" + unset HOST_ID_SALT done + # Faketime for binaries + export PATH=${PATH_orig} + create_global_faketime_wrappers "${REFERENCE_DATETIME}" + create_per-host_faketime_wrappers "${REFERENCE_DATETIME}" + export PATH=${WRAP_DIR}:${PATH} + # Create the release tarball using (arbitrarily) the first host ./autogen.sh CONFIG_SITE=${BASEPREFIX}/`echo "${HOSTS}" | awk '{print $1;}'`/share/config.site ./configure --prefix=/ make dist - SOURCEDIST=`echo paccoincore-*.tar.gz` + SOURCEDIST=`echo Paccoin-*.tar.gz` DISTNAME=`echo ${SOURCEDIST} | sed 's/.tar.*//'` # Correct tar file order mkdir -p temp pushd temp tar xf ../$SOURCEDIST - find paccoincore-* | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ../$SOURCEDIST + find Paccoin-* | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ../$SOURCEDIST popd ORIGPATH="$PATH" @@ -98,17 +183,27 @@ script: | mkdir -p ${INSTALLPATH} tar --strip-components=1 -xf ../$SOURCEDIST - CONFIG_SITE=${BASEPREFIX}/${i}/share/config.site ./configure --prefix=/ --disable-ccache --disable-maintainer-mode --disable-dependency-tracking ${CONFIGFLAGS} CFLAGS="${HOST_CFLAGS}" CXXFLAGS="${HOST_CXXFLAGS}" LDFLAGS="${HOST_LDFLAGS}" + CONFIG_SITE=${BASEPREFIX}/${i}/share/config.site ./configure --prefix=/ --disable-maintainer-mode --disable-dependency-tracking ${CONFIGFLAGS} CFLAGS="${HOST_CFLAGS}" CXXFLAGS="${HOST_CXXFLAGS}" LDFLAGS="${HOST_LDFLAGS}" make ${MAKEOPTS} make ${MAKEOPTS} -C src check-security - make ${MAKEOPTS} -C src check-symbols + + #TODO: This is a quick hack that disables symbol checking for arm. + # Instead, we should investigate why these are popping up. + # For aarch64, we'll need to bump up the min GLIBC version, as the abi + # support wasn't introduced until 2.17. + case $i in + aarch64-*) : ;; + arm-*) : ;; + *) make ${MAKEOPTS} -C src check-symbols ;; + esac + make install DESTDIR=${INSTALLPATH} cd installed find . -name "lib*.la" -delete find . -name "lib*.a" -delete rm -rf ${DISTNAME}/lib/pkgconfig - find ${DISTNAME}/bin -type f -executable -exec objcopy --only-keep-debug {} {}.dbg \; -exec strip -s {} \; -exec objcopy --add-gnu-debuglink={}.dbg {} \; - find ${DISTNAME}/lib -type f -exec objcopy --only-keep-debug {} {}.dbg \; -exec strip -s {} \; -exec objcopy --add-gnu-debuglink={}.dbg {} \; + find ${DISTNAME}/bin -type f -executable -exec ../contrib/devtools/split-debug.sh {} {} {}.dbg \; + find ${DISTNAME}/lib -type f -exec ../contrib/devtools/split-debug.sh {} {} {}.dbg \; find ${DISTNAME} -not -name "*.dbg" | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-${i}.tar.gz find ${DISTNAME} -name "*.dbg" | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-${i}-debug.tar.gz cd ../../ @@ -116,8 +211,11 @@ script: | done mkdir -p $OUTDIR/src mv $SOURCEDIST $OUTDIR/src - mv ${OUTDIR}/${DISTNAME}-x86_64-*-debug.tar.gz ${OUTDIR}/${DISTNAME}-linux64-debug.tar.gz - mv ${OUTDIR}/${DISTNAME}-i686-*-debug.tar.gz ${OUTDIR}/${DISTNAME}-linux32-debug.tar.gz - mv ${OUTDIR}/${DISTNAME}-x86_64-*.tar.gz ${OUTDIR}/${DISTNAME}-linux64.tar.gz - mv ${OUTDIR}/${DISTNAME}-i686-*.tar.gz ${OUTDIR}/${DISTNAME}-linux32.tar.gz + # Compress ccache (otherwise the assert file will get too huge) + if [ "$CCACHE_DIR" != "" ]; then + pushd ${GBUILD_PACKAGE_CACHE} + tar cf ccache.tar ccache + rm -rf ccache + popd + fi diff --git a/contrib/gitian-descriptors/gitian-osx-signer.yml b/contrib/gitian-descriptors/gitian-osx-signer.yml index b8c24cdf5744..b6843b19ff66 100644 --- a/contrib/gitian-descriptors/gitian-osx-signer.yml +++ b/contrib/gitian-descriptors/gitian-osx-signer.yml @@ -1,17 +1,16 @@ --- name: "paccoin-dmg-signer" suites: -- "trusty" +- "bionic" architectures: - "amd64" packages: - "faketime" -reference_datetime: "2017-01-01 00:00:00" remotes: -- "url": "https://github.com/paccoinpay/paccoin-detached-sigs.git" +- "url": "https://github.com/PACCommunity/pac-detached-sigs.git" "dir": "signature" files: -- "paccoin-osx-unsigned.tar.gz" +- "Paccoin-osx-unsigned.tar.gz" script: | WRAP_DIR=$HOME/wrapped mkdir -p ${WRAP_DIR} @@ -28,10 +27,11 @@ script: | chmod +x ${WRAP_DIR}/${prog} done - UNSIGNED=paccoin-osx-unsigned.tar.gz - SIGNED=paccoin-osx-signed.dmg + UNSIGNED=Paccoin-osx-unsigned.tar.gz + SIGNED=Paccoin-osx-signed.dmg tar -xf ${UNSIGNED} + OSX_VOLNAME="$(cat osx_volname)" ./detached-sig-apply.sh ${UNSIGNED} signature/osx - ${WRAP_DIR}/genisoimage -no-cache-inodes -D -l -probe -V "Paccoin-Core" -no-pad -r -dir-mode 0755 -apple -o uncompressed.dmg signed-app + ${WRAP_DIR}/genisoimage -no-cache-inodes -D -l -probe -V "${OSX_VOLNAME}" -no-pad -r -dir-mode 0755 -apple -o uncompressed.dmg signed-app ${WRAP_DIR}/dmg dmg uncompressed.dmg ${OUTDIR}/${SIGNED} diff --git a/contrib/gitian-descriptors/gitian-osx.yml b/contrib/gitian-descriptors/gitian-osx.yml index 2b849e9f6785..9da1984b3ca5 100644 --- a/contrib/gitian-descriptors/gitian-osx.yml +++ b/contrib/gitian-descriptors/gitian-osx.yml @@ -1,32 +1,39 @@ --- -name: "paccoin-osx-0.12" +name: "paccoin-osx-0.13" enable_cache: true suites: -- "trusty" +- "bionic" architectures: - "amd64" -packages: +packages: +- "ca-certificates" - "curl" - "g++" -- "git-core" +- "git" - "pkg-config" - "autoconf" +- "librsvg2-bin" +- "libtiff-tools" - "libtool" - "automake" - "faketime" - "bsdmainutils" - "cmake" +- "imagemagick" - "libcap-dev" - "libz-dev" - "libbz2-dev" -- "ca-certificates" - "python" -reference_datetime: "2017-01-01 00:00:00" +- "python-dev" +- "python3" +- "python3-dev" +- "python3-setuptools" +- "fonts-tuffy" remotes: -- "url": "https://github.com/PACCommunity/PAC.git" +- "url": "https://github.com/CryptoMx/PAC.git" "dir": "PAC" files: -- "MacOSX10.9.sdk.tar.gz" +- "MacOSX10.11.sdk.tar.gz" script: | WRAP_DIR=$HOME/wrapped HOSTS="x86_64-apple-darwin11" @@ -42,58 +49,88 @@ script: | mkdir -p ${WRAP_DIR} if test -n "$GBUILD_CACHE_ENABLED"; then export SOURCES_PATH=${GBUILD_COMMON_CACHE} - export BASE_CACHE=${GBUILD_PACKAGE_CACHE} + export BASE_CACHE=${GBUILD_PACKAGE_CACHE}/depends mkdir -p ${BASE_CACHE} ${SOURCES_PATH} + + # Setup ccache to use correct cache directories + CONFIGFLAGS="${CONFIGFLAGS} --enable-ccache" + export CCACHE_DIR=${GBUILD_PACKAGE_CACHE}/ccache + if [ -f ${GBUILD_PACKAGE_CACHE}/ccache.tar ]; then + pushd ${GBUILD_PACKAGE_CACHE} + tar xf ccache.tar + rm ccache.tar + popd + fi + # instead of compressing ccache.tar, we let ccache handle it by itself + # Otherwise we end up uncompressing/compressing a lot of cache files which we actually never use + export CCACHE_COMPRESS=1 + else + CONFIGFLAGS="${CONFIGFLAGS} --disable-ccache" fi export ZERO_AR_DATE=1 - # Create global faketime wrappers + function create_global_faketime_wrappers { for prog in ${FAKETIME_PROGS}; do echo '#!/bin/bash' > ${WRAP_DIR}/${prog} echo "REAL=\`which -a ${prog} | grep -v ${WRAP_DIR}/${prog} | head -1\`" >> ${WRAP_DIR}/${prog} echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${prog} - echo "export FAKETIME=\"${REFERENCE_DATETIME}\"" >> ${WRAP_DIR}/${prog} + echo "export FAKETIME=\"$1\"" >> ${WRAP_DIR}/${prog} echo "\$REAL \$@" >> $WRAP_DIR/${prog} chmod +x ${WRAP_DIR}/${prog} + touch -d "${REFERENCE_DATETIME}" ${WRAP_DIR}/${prog} done + } - # Create per-host faketime wrappers + function create_per-host_faketime_wrappers { for i in $HOSTS; do for prog in ${FAKETIME_HOST_PROGS}; do echo '#!/bin/bash' > ${WRAP_DIR}/${i}-${prog} echo "REAL=\`which -a ${i}-${prog} | grep -v ${WRAP_DIR}/${i}-${prog} | head -1\`" >> ${WRAP_DIR}/${i}-${prog} echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${i}-${prog} - echo "export FAKETIME=\"${REFERENCE_DATETIME}\"" >> ${WRAP_DIR}/${i}-${prog} + echo "export FAKETIME=\"$1\"" >> ${WRAP_DIR}/${i}-${prog} echo "\$REAL \$@" >> $WRAP_DIR/${i}-${prog} chmod +x ${WRAP_DIR}/${i}-${prog} + touch -d "${REFERENCE_DATETIME}" ${WRAP_DIR}/${i}-${prog} done done + } + + # Faketime for depends so intermediate results are comparable + export PATH_orig=${PATH} + create_global_faketime_wrappers "2000-01-01 12:00:00" + create_per-host_faketime_wrappers "2000-01-01 12:00:00" export PATH=${WRAP_DIR}:${PATH} cd PAC BASEPREFIX=`pwd`/depends mkdir -p ${BASEPREFIX}/SDKs - tar -C ${BASEPREFIX}/SDKs -xf ${BUILD_DIR}/MacOSX10.9.sdk.tar.gz + tar -C ${BASEPREFIX}/SDKs -xf ${BUILD_DIR}/MacOSX10.11.sdk.tar.gz # Build dependencies for each host for i in $HOSTS; do make ${MAKEOPTS} -C ${BASEPREFIX} HOST="${i}" done + # Faketime for binaries + export PATH=${PATH_orig} + create_global_faketime_wrappers "${REFERENCE_DATETIME}" + create_per-host_faketime_wrappers "${REFERENCE_DATETIME}" + export PATH=${WRAP_DIR}:${PATH} + # Create the release tarball using (arbitrarily) the first host ./autogen.sh CONFIG_SITE=${BASEPREFIX}/`echo "${HOSTS}" | awk '{print $1;}'`/share/config.site ./configure --prefix=/ make dist - SOURCEDIST=`echo paccoincore-*.tar.gz` + SOURCEDIST=`echo Paccoin-*.tar.gz` DISTNAME=`echo ${SOURCEDIST} | sed 's/.tar.*//'` # Correct tar file order mkdir -p temp pushd temp tar xf ../$SOURCEDIST - find paccoincore-* | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ../$SOURCEDIST + find Paccoin-* | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ../$SOURCEDIST popd ORIGPATH="$PATH" @@ -106,12 +143,15 @@ script: | mkdir -p ${INSTALLPATH} tar --strip-components=1 -xf ../$SOURCEDIST - CONFIG_SITE=${BASEPREFIX}/${i}/share/config.site ./configure --prefix=/ --disable-ccache --disable-maintainer-mode --disable-dependency-tracking ${CONFIGFLAGS} + CONFIG_SITE=${BASEPREFIX}/${i}/share/config.site ./configure --prefix=/ --disable-maintainer-mode --disable-dependency-tracking ${CONFIGFLAGS} make ${MAKEOPTS} make install-strip DESTDIR=${INSTALLPATH} + make osx_volname make deploydir + OSX_VOLNAME="$(cat osx_volname)" mkdir -p unsigned-app-${i} + cp osx_volname unsigned-app-${i}/ cp contrib/macdeploy/detached-sig-apply.sh unsigned-app-${i} cp contrib/macdeploy/detached-sig-create.sh unsigned-app-${i} cp ${BASEPREFIX}/${i}/native/bin/dmg ${BASEPREFIX}/${i}/native/bin/genisoimage unsigned-app-${i} @@ -123,7 +163,7 @@ script: | popd make deploy - ${WRAP_DIR}/dmg dmg Paccoin-Core.dmg ${OUTDIR}/${DISTNAME}-osx-unsigned.dmg + ${WRAP_DIR}/dmg dmg "${OSX_VOLNAME}.dmg" ${OUTDIR}/${DISTNAME}-osx-unsigned.dmg cd installed find . -name "lib*.la" -delete @@ -135,3 +175,11 @@ script: | mkdir -p $OUTDIR/src mv $SOURCEDIST $OUTDIR/src mv ${OUTDIR}/${DISTNAME}-x86_64-*.tar.gz ${OUTDIR}/${DISTNAME}-osx64.tar.gz + + # Compress ccache (otherwise the assert file will get too huge) + if [ "$CCACHE_DIR" != "" ]; then + pushd ${GBUILD_PACKAGE_CACHE} + tar cf ccache.tar ccache + rm -rf ccache + popd + fi diff --git a/contrib/gitian-descriptors/gitian-win-signer.yml b/contrib/gitian-descriptors/gitian-win-signer.yml index 9a009d6aa0d5..f92f04405cb5 100644 --- a/contrib/gitian-descriptors/gitian-win-signer.yml +++ b/contrib/gitian-descriptors/gitian-win-signer.yml @@ -1,20 +1,19 @@ --- -name: "bitcoin-win-signer" +name: "paccoin-win-signer" suites: -- "trusty" +- "bionic" architectures: - "amd64" packages: - "libssl-dev" - "autoconf" -reference_datetime: "2017-01-01 00:00:00" remotes: -- "url": "https://github.com/paccoinpay/paccoin-detached-sigs.git" +- "url": "https://github.com/PACCommunity/pac-detached-sigs.git" "dir": "signature" files: - "osslsigncode-1.7.1.tar.gz" - "osslsigncode-Backports-to-1.7.1.patch" -- "bitcoin-win-unsigned.tar.gz" +- "Paccoin-win-unsigned.tar.gz" script: | BUILD_DIR=`pwd` SIGDIR=${BUILD_DIR}/signature/win @@ -24,7 +23,7 @@ script: | echo "a8c4e9cafba922f89de0df1f2152e7be286aba73f78505169bc351a7938dd911 osslsigncode-Backports-to-1.7.1.patch" | sha256sum -c mkdir -p ${UNSIGNED_DIR} - tar -C ${UNSIGNED_DIR} -xf bitcoin-win-unsigned.tar.gz + tar -C ${UNSIGNED_DIR} -xf Paccoin-win-unsigned.tar.gz tar xf osslsigncode-1.7.1.tar.gz cd osslsigncode-1.7.1 diff --git a/contrib/gitian-descriptors/gitian-win.yml b/contrib/gitian-descriptors/gitian-win.yml index 6ebe88076024..c98015c517d9 100755 --- a/contrib/gitian-descriptors/gitian-win.yml +++ b/contrib/gitian-descriptors/gitian-win.yml @@ -1,18 +1,19 @@ --- -name: "paccoin-win-0.12" +name: "paccoin-win-0.13" enable_cache: true suites: -- "trusty" +- "bionic" architectures: - "amd64" -packages: +packages: - "curl" - "g++" -- "git-core" +- "git" - "pkg-config" - "autoconf" - "libtool" - "automake" +- "cmake" - "faketime" - "bsdmainutils" - "mingw-w64" @@ -21,16 +22,17 @@ packages: - "zip" - "ca-certificates" - "python" -reference_datetime: "2017-01-01 00:00:00" +- "python3" +- "rename" remotes: -- "url": "https://github.com/PACCommunity/PAC.git" +- "url": "https://github.com/CryptoMx/PAC.git" "dir": "PAC" files: [] script: | WRAP_DIR=$HOME/wrapped - HOSTS="x86_64-w64-mingw32 i686-w64-mingw32" + HOSTS="i686-w64-mingw32 x86_64-w64-mingw32" CONFIGFLAGS="--enable-reduce-exports --disable-bench --disable-gui-tests" - FAKETIME_HOST_PROGS="g++ ar ranlib nm windres strip objcopy" + FAKETIME_HOST_PROGS="ar ranlib nm windres strip objcopy" FAKETIME_PROGS="date makensis zip" HOST_CFLAGS="-O2 -g" HOST_CXXFLAGS="-O2 -g" @@ -43,55 +45,93 @@ script: | mkdir -p ${WRAP_DIR} if test -n "$GBUILD_CACHE_ENABLED"; then export SOURCES_PATH=${GBUILD_COMMON_CACHE} - export BASE_CACHE=${GBUILD_PACKAGE_CACHE} + export BASE_CACHE=${GBUILD_PACKAGE_CACHE}/depends mkdir -p ${BASE_CACHE} ${SOURCES_PATH} + + # Setup ccache to use correct cache directories and fix the compiler check of ccache + CONFIGFLAGS="${CONFIGFLAGS} --enable-ccache" + export CCACHE_DIR=${GBUILD_PACKAGE_CACHE}/ccache + # As we later wrap the gcc binaries, this is fast + export CCACHE_COMPILERCHECK="content" + if [ -f ${GBUILD_PACKAGE_CACHE}/ccache.tar ]; then + pushd ${GBUILD_PACKAGE_CACHE} + tar xf ccache.tar + rm ccache.tar + popd + fi + # instead of compressing ccache.tar, we let ccache handle it by itself + # Otherwise we end up uncompressing/compressing a lot of cache files which we actually never use + export CCACHE_COMPRESS=1 + else + CONFIGFLAGS="${CONFIGFLAGS} --disable-ccache" fi - # Create global faketime wrappers + # We include the GCC version in all wrappers so that ccache can detect compiler upgrades when hashing the wrappers + GCCVERSION=`gcc --version | head -1` + + function create_global_faketime_wrappers { for prog in ${FAKETIME_PROGS}; do echo '#!/bin/bash' > ${WRAP_DIR}/${prog} + echo "# GCCVERSION=${GCCVERSION}" >> ${WRAP_DIR}/${prog} echo "REAL=\`which -a ${prog} | grep -v ${WRAP_DIR}/${prog} | head -1\`" >> ${WRAP_DIR}/${prog} echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${prog} - echo "export FAKETIME=\"${REFERENCE_DATETIME}\"" >> ${WRAP_DIR}/${prog} + echo "export FAKETIME=\"$1\"" >> ${WRAP_DIR}/${prog} echo "\$REAL \$@" >> $WRAP_DIR/${prog} chmod +x ${WRAP_DIR}/${prog} + touch -d "${REFERENCE_DATETIME}" ${WRAP_DIR}/${prog} done + } - # Create per-host faketime wrappers + function create_per-host_faketime_wrappers { for i in $HOSTS; do for prog in ${FAKETIME_HOST_PROGS}; do echo '#!/bin/bash' > ${WRAP_DIR}/${i}-${prog} + echo "# GCCVERSION=${GCCVERSION}" >> ${WRAP_DIR}/${i}-${prog} echo "REAL=\`which -a ${i}-${prog} | grep -v ${WRAP_DIR}/${i}-${prog} | head -1\`" >> ${WRAP_DIR}/${i}-${prog} echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${i}-${prog} - echo "export FAKETIME=\"${REFERENCE_DATETIME}\"" >> ${WRAP_DIR}/${i}-${prog} + echo "export FAKETIME=\"$1\"" >> ${WRAP_DIR}/${i}-${prog} echo "\$REAL \$@" >> $WRAP_DIR/${i}-${prog} chmod +x ${WRAP_DIR}/${i}-${prog} + touch -d "${REFERENCE_DATETIME}" ${WRAP_DIR}/${i}-${prog} done done + } - # Create per-host linker wrapper + function create_per-host_linker_wrapper { # This is only needed for trusty, as the mingw linker leaks a few bytes of # heap, causing non-determinism. See discussion in https://github.com/bitcoin/bitcoin/pull/6900 for i in $HOSTS; do mkdir -p ${WRAP_DIR}/${i} for prog in collect2; do echo '#!/bin/bash' > ${WRAP_DIR}/${i}/${prog} + echo "# GCCVERSION=${GCCVERSION}" >> ${WRAP_DIR}/${i}/${prog} REAL=$(${i}-gcc -print-prog-name=${prog}) echo "export MALLOC_PERTURB_=255" >> ${WRAP_DIR}/${i}/${prog} echo "${REAL} \$@" >> $WRAP_DIR/${i}/${prog} chmod +x ${WRAP_DIR}/${i}/${prog} + touch -d "${REFERENCE_DATETIME}" ${WRAP_DIR}/${i}/${prog} done for prog in gcc g++; do echo '#!/bin/bash' > ${WRAP_DIR}/${i}-${prog} - echo "REAL=\`which -a ${i}-${prog} | grep -v ${WRAP_DIR}/${i}-${prog} | head -1\`" >> ${WRAP_DIR}/${i}-${prog} + echo "# GCCVERSION=${GCCVERSION}" >> ${WRAP_DIR}/${i}-${prog} + echo "REAL=\`which -a ${i}-${prog}-posix | grep -v ${WRAP_DIR}/${i}-${prog} | head -1\`" >> ${WRAP_DIR}/${i}-${prog} + echo '# Add the gcc version to the wrapper so that ccache takes this into account (we use CCACHE_COMPILERCHECK=content)' >> ${WRAP_DIR}/${i}-${prog} + echo "# `${prog} --version | head -1`" >> ${WRAP_DIR}/${i}-${prog} echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${i}-${prog} - echo "export FAKETIME=\"${REFERENCE_DATETIME}\"" >> ${WRAP_DIR}/${i}-${prog} + echo "export FAKETIME=\"$1\"" >> ${WRAP_DIR}/${i}-${prog} echo "export COMPILER_PATH=${WRAP_DIR}/${i}" >> ${WRAP_DIR}/${i}-${prog} echo "\$REAL \$@" >> $WRAP_DIR/${i}-${prog} chmod +x ${WRAP_DIR}/${i}-${prog} + touch -d "${REFERENCE_DATETIME}" ${WRAP_DIR}/${i}-${prog} done done + } + # Faketime for depends so intermediate results are comparable + export PATH_orig=${PATH} + create_global_faketime_wrappers "2000-01-01 12:00:00" + create_per-host_faketime_wrappers "2000-01-01 12:00:00" + create_per-host_linker_wrapper "2000-01-01 12:00:00" export PATH=${WRAP_DIR}:${PATH} cd PAC @@ -101,18 +141,25 @@ script: | make ${MAKEOPTS} -C ${BASEPREFIX} HOST="${i}" done + # Faketime for binaries + export PATH=${PATH_orig} + create_global_faketime_wrappers "${REFERENCE_DATETIME}" + create_per-host_faketime_wrappers "${REFERENCE_DATETIME}" + create_per-host_linker_wrapper "${REFERENCE_DATETIME}" + export PATH=${WRAP_DIR}:${PATH} + # Create the release tarball using (arbitrarily) the first host ./autogen.sh CONFIG_SITE=${BASEPREFIX}/`echo "${HOSTS}" | awk '{print $1;}'`/share/config.site ./configure --prefix=/ make dist - SOURCEDIST=`echo paccoincore-*.tar.gz` + SOURCEDIST=`echo Paccoin-*.tar.gz` DISTNAME=`echo ${SOURCEDIST} | sed 's/.tar.*//'` # Correct tar file order mkdir -p temp pushd temp tar xf ../$SOURCEDIST - find paccoincore-* | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ../$SOURCEDIST + find Paccoin-* | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ../$SOURCEDIST mkdir -p $OUTDIR/src cp ../$SOURCEDIST $OUTDIR/src popd @@ -127,12 +174,12 @@ script: | mkdir -p ${INSTALLPATH} tar --strip-components=1 -xf ../$SOURCEDIST - CONFIG_SITE=${BASEPREFIX}/${i}/share/config.site ./configure --prefix=/ --disable-ccache --disable-maintainer-mode --disable-dependency-tracking ${CONFIGFLAGS} CFLAGS="${HOST_CFLAGS}" CXXFLAGS="${HOST_CXXFLAGS}" + CONFIG_SITE=${BASEPREFIX}/${i}/share/config.site ./configure --prefix=/ --disable-maintainer-mode --disable-dependency-tracking ${CONFIGFLAGS} CFLAGS="${HOST_CFLAGS}" CXXFLAGS="${HOST_CXXFLAGS}" make ${MAKEOPTS} make ${MAKEOPTS} -C src check-security make deploy make install DESTDIR=${INSTALLPATH} - cp -f paccoincore-*setup*.exe $OUTDIR/ + cp -f Paccoin-*setup*.exe $OUTDIR/ cd installed mv ${DISTNAME}/bin/*.dll ${DISTNAME}/lib/ find . -name "lib*.la" -delete @@ -152,3 +199,11 @@ script: | mv ${OUTDIR}/${DISTNAME}-i686-*-debug.zip ${OUTDIR}/${DISTNAME}-win32-debug.zip mv ${OUTDIR}/${DISTNAME}-x86_64-*.zip ${OUTDIR}/${DISTNAME}-win64.zip mv ${OUTDIR}/${DISTNAME}-i686-*.zip ${OUTDIR}/${DISTNAME}-win32.zip + + # Compress ccache (otherwise the assert file will get too huge) + if [ "$CCACHE_DIR" != "" ]; then + pushd ${GBUILD_PACKAGE_CACHE} + tar cf ccache.tar ccache + rm -rf ccache + popd + fi diff --git a/contrib/macdeploy/background.svg b/contrib/macdeploy/background.svg new file mode 100644 index 000000000000..9c330af45142 --- /dev/null +++ b/contrib/macdeploy/background.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + PACKAGE_NAME + + + + + diff --git a/contrib/macdeploy/custom_dsstore.py b/contrib/macdeploy/custom_dsstore.py new file mode 100755 index 000000000000..8b70cf7c684e --- /dev/null +++ b/contrib/macdeploy/custom_dsstore.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python3 +# Copyright (c) 2013-2015 The Bitcoin Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. +import biplist +from ds_store import DSStore +from mac_alias import Alias +import sys + +output_file = sys.argv[1] +package_name_ns = sys.argv[2] + +ds = DSStore.open(output_file, 'w+') +ds['.']['bwsp'] = { + 'ShowStatusBar': False, + 'WindowBounds': b'{{300, 280}, {500, 343}}', + 'ContainerShowSidebar': False, + 'SidebarWidth': 0, + 'ShowTabView': False, + 'PreviewPaneVisibility': False, + 'ShowToolbar': False, + 'ShowSidebar': False, + 'ShowPathbar': True +} + +icvp = { + 'gridOffsetX': 0.0, + 'textSize': 12.0, + 'viewOptionsVersion': 1, + 'backgroundImageAlias': b'\x00\x00\x00\x00\x02\x1e\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd1\x94\\\xb0H+\x00\x05\x00\x00\x00\x98\x0fbackground.tiff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\xd19\xb0\xf8\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\r\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b.background\x00\x00\x10\x00\x08\x00\x00\xd1\x94\\\xb0\x00\x00\x00\x11\x00\x08\x00\x00\xd19\xb0\xf8\x00\x00\x00\x01\x00\x04\x00\x00\x00\x98\x00\x0e\x00 \x00\x0f\x00b\x00a\x00c\x00k\x00g\x00r\x00o\x00u\x00n\x00d\x00.\x00t\x00i\x00f\x00f\x00\x0f\x00\x02\x00\x00\x00\x12\x00\x1c/.background/background.tiff\x00\x14\x01\x06\x00\x00\x00\x00\x01\x06\x00\x02\x00\x00\x0cMacintosh HD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\x97\xab\xc3H+\x00\x00\x01\x88[\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02u\xab\x8d\xd1\x94\\\xb0devrddsk\xff\xff\xff\xff\x00\x00\t \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07bitcoin\x00\x00\x10\x00\x08\x00\x00\xce\x97\xab\xc3\x00\x00\x00\x11\x00\x08\x00\x00\xd1\x94\\\xb0\x00\x00\x00\x01\x00\x14\x01\x88[\x88\x00\x16\xa9\t\x00\x08\xfaR\x00\x08\xfaQ\x00\x02d\x8e\x00\x0e\x00\x02\x00\x00\x00\x0f\x00\x1a\x00\x0c\x00M\x00a\x00c\x00i\x00n\x00t\x00o\x00s\x00h\x00 \x00H\x00D\x00\x13\x00\x01/\x00\x00\x15\x00\x02\x00\x14\xff\xff\x00\x00\xff\xff\x00\x00', + 'backgroundColorBlue': 1.0, + 'iconSize': 96.0, + 'backgroundColorGreen': 1.0, + 'arrangeBy': 'none', + 'showIconPreview': True, + 'gridSpacing': 100.0, + 'gridOffsetY': 0.0, + 'showItemInfo': False, + 'labelOnBottom': True, + 'backgroundType': 2, + 'backgroundColorRed': 1.0 +} +alias = Alias.from_bytes(icvp['backgroundImageAlias']) +alias.volume.name = package_name_ns +alias.volume.posix_path = '/Volumes/' + package_name_ns +alias.volume.disk_image_alias.target.filename = package_name_ns + '.temp.dmg' +alias.volume.disk_image_alias.target.carbon_path = 'Macintosh HD:Users:\x00dashcoreuser:\x00Documents:\x00dashcore:\x00dashcore:\x00' + package_name_ns + '.temp.dmg' +alias.volume.disk_image_alias.target.posix_path = 'Users/dashcoreuser/Documents/dashcore/dashcore/' + package_name_ns + '.temp.dmg' +alias.target.carbon_path = package_name_ns + ':.background:\x00background.tiff' +icvp['backgroundImageAlias'] = biplist.Data(alias.to_bytes()) +ds['.']['icvp'] = icvp + +ds['.']['vSrn'] = ('long', 1) + +ds['Applications']['Iloc'] = (370, 156) +ds['Dash-Qt.app']['Iloc'] = (128, 156) + +ds.flush() +ds.close() diff --git a/contrib/macdeploy/extract-osx-sdk.sh b/contrib/macdeploy/extract-osx-sdk.sh new file mode 100755 index 000000000000..ff9fbd58df07 --- /dev/null +++ b/contrib/macdeploy/extract-osx-sdk.sh @@ -0,0 +1,33 @@ +#!/bin/bash +# Copyright (c) 2016 The Bitcoin Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +set -e + +INPUTFILE="Xcode_7.3.1.dmg" +HFSFILENAME="5.hfs" +SDKDIR="Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk" + +7z x "${INPUTFILE}" "${HFSFILENAME}" +SDKNAME="$(basename "${SDKDIR}")" +SDKDIRINODE=$(ifind -n "${SDKDIR}" "${HFSFILENAME}") +fls "${HFSFILENAME}" -rpF ${SDKDIRINODE} | + while read type inode filename; do + inode="${inode::-1}" + if [ "${filename:0:14}" = "usr/share/man/" ]; then + continue + fi + filename="${SDKNAME}/$filename" + echo "Extracting $filename ..." + mkdir -p "$(dirname "$filename")" + if [ "$type" = "l/l" ]; then + ln -s "$(icat "${HFSFILENAME}" $inode)" "$filename" + else + icat "${HFSFILENAME}" $inode >"$filename" + fi +done +echo "Building ${SDKNAME}.tar.gz ..." +MTIME="$(istat "${HFSFILENAME}" "${SDKDIRINODE}" | perl -nle 'm/Content Modified:\s+(.*?)\s\(/ && print $1')" +find "${SDKNAME}" | sort | tar --no-recursion --mtime="${MTIME}" --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > "${SDKNAME}.tar.gz" +echo 'All done!' diff --git a/contrib/macdeploy/macdeployqtplus b/contrib/macdeploy/macdeployqtplus index 7873ce786acf..9b781fdf1b06 100755 --- a/contrib/macdeploy/macdeployqtplus +++ b/contrib/macdeploy/macdeployqtplus @@ -1,5 +1,4 @@ -#!/usr/bin/env python - +#!/usr/bin/env python3 # # Copyright (C) 2011 Patrick "p2k" Schneider # @@ -201,9 +200,9 @@ class DeploymentInfo(object): def getFrameworks(binaryPath, verbose): if verbose >= 3: - print "Inspecting with otool: " + binaryPath + print("Inspecting with otool: " + binaryPath) otoolbin=os.getenv("OTOOL", "otool") - otool = subprocess.Popen([otoolbin, "-L", binaryPath], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + otool = subprocess.Popen([otoolbin, "-L", binaryPath], stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) o_stdout, o_stderr = otool.communicate() if otool.returncode != 0: if verbose >= 1: @@ -222,8 +221,8 @@ def getFrameworks(binaryPath, verbose): info = FrameworkInfo.fromOtoolLibraryLine(line.strip()) if info is not None: if verbose >= 3: - print "Found framework:" - print info + print("Found framework:") + print(info) libraries.append(info) return libraries @@ -234,24 +233,24 @@ def runInstallNameTool(action, *args): def changeInstallName(oldName, newName, binaryPath, verbose): if verbose >= 3: - print "Using install_name_tool:" - print " in", binaryPath - print " change reference", oldName - print " to", newName + print("Using install_name_tool:") + print(" in", binaryPath) + print(" change reference", oldName) + print(" to", newName) runInstallNameTool("change", oldName, newName, binaryPath) def changeIdentification(id, binaryPath, verbose): if verbose >= 3: - print "Using install_name_tool:" - print " change identification in", binaryPath - print " to", id + print("Using install_name_tool:") + print(" change identification in", binaryPath) + print(" to", id) runInstallNameTool("id", id, binaryPath) def runStrip(binaryPath, verbose): stripbin=os.getenv("STRIP", "strip") if verbose >= 3: - print "Using strip:" - print " stripped", binaryPath + print("Using strip:") + print(" stripped", binaryPath) subprocess.check_call([stripbin, "-x", binaryPath]) def copyFramework(framework, path, verbose): @@ -274,8 +273,8 @@ def copyFramework(framework, path, verbose): shutil.copy2(fromPath, toPath) if verbose >= 3: - print "Copied:", fromPath - print " to:", toPath + print("Copied:", fromPath) + print(" to:", toPath) permissions = os.stat(toPath) if not permissions.st_mode & stat.S_IWRITE: @@ -288,14 +287,14 @@ def copyFramework(framework, path, verbose): if not os.path.exists(linkfrom): os.symlink(linkto, linkfrom) if verbose >= 2: - print "Linked:", linkfrom, "->", linkto + print("Linked:", linkfrom, "->", linkto) fromResourcesDir = framework.sourceResourcesDirectory if os.path.exists(fromResourcesDir): toResourcesDir = os.path.join(path, framework.destinationResourcesDirectory) shutil.copytree(fromResourcesDir, toResourcesDir, symlinks=True) if verbose >= 3: - print "Copied resources:", fromResourcesDir - print " to:", toResourcesDir + print("Copied resources:", fromResourcesDir) + print(" to:", toResourcesDir) fromContentsDir = framework.sourceVersionContentsDirectory if not os.path.exists(fromContentsDir): fromContentsDir = framework.sourceContentsDirectory @@ -304,16 +303,16 @@ def copyFramework(framework, path, verbose): shutil.copytree(fromContentsDir, toContentsDir, symlinks=True) contentslinkfrom = os.path.join(path, framework.destinationContentsDirectory) if verbose >= 3: - print "Copied Contents:", fromContentsDir - print " to:", toContentsDir + print("Copied Contents:", fromContentsDir) + print(" to:", toContentsDir) elif framework.frameworkName.startswith("libQtGui"): # Copy qt_menu.nib (applies to non-framework layout) qtMenuNibSourcePath = os.path.join(framework.frameworkDirectory, "Resources", "qt_menu.nib") qtMenuNibDestinationPath = os.path.join(path, "Contents", "Resources", "qt_menu.nib") if os.path.exists(qtMenuNibSourcePath) and not os.path.exists(qtMenuNibDestinationPath): shutil.copytree(qtMenuNibSourcePath, qtMenuNibDestinationPath, symlinks=True) if verbose >= 3: - print "Copied for libQtGui:", qtMenuNibSourcePath - print " to:", qtMenuNibDestinationPath + print("Copied for libQtGui:", qtMenuNibSourcePath) + print(" to:", qtMenuNibDestinationPath) return toPath @@ -326,7 +325,7 @@ def deployFrameworks(frameworks, bundlePath, binaryPath, strip, verbose, deploym deploymentInfo.deployedFrameworks.append(framework.frameworkName) if verbose >= 2: - print "Processing", framework.frameworkName, "..." + print("Processing", framework.frameworkName, "...") # Get the Qt path from one of the Qt frameworks if deploymentInfo.qtPath is None and framework.isQtFramework(): @@ -334,13 +333,13 @@ def deployFrameworks(frameworks, bundlePath, binaryPath, strip, verbose, deploym if framework.installName.startswith("@executable_path") or framework.installName.startswith(bundlePath): if verbose >= 2: - print framework.frameworkName, "already deployed, skipping." + print(framework.frameworkName, "already deployed, skipping.") continue # install_name_tool the new id into the binary changeInstallName(framework.installName, framework.deployedInstallName, binaryPath, verbose) - # Copy farmework to app bundle. + # Copy framework to app bundle. deployedBinaryPath = copyFramework(framework, bundlePath, verbose) # Skip the rest if already was deployed. if deployedBinaryPath is None: @@ -366,7 +365,7 @@ def deployFrameworks(frameworks, bundlePath, binaryPath, strip, verbose, deploym def deployFrameworksForAppBundle(applicationBundle, strip, verbose): frameworks = getFrameworks(applicationBundle.binaryPath, verbose) if len(frameworks) == 0 and verbose >= 1: - print "Warning: Could not find any external frameworks to deploy in %s." % (applicationBundle.path) + print("Warning: Could not find any external frameworks to deploy in %s." % (applicationBundle.path)) return DeploymentInfo() else: return deployFrameworks(frameworks, applicationBundle.path, applicationBundle.binaryPath, strip, verbose) @@ -444,7 +443,7 @@ def deployPlugins(appBundleInfo, deploymentInfo, strip, verbose): for pluginDirectory, pluginName in plugins: if verbose >= 2: - print "Processing plugin", os.path.join(pluginDirectory, pluginName), "..." + print("Processing plugin", os.path.join(pluginDirectory, pluginName), "...") sourcePath = os.path.join(deploymentInfo.pluginPath, pluginDirectory, pluginName) destinationDirectory = os.path.join(appBundleInfo.pluginPath, pluginDirectory) @@ -454,8 +453,8 @@ def deployPlugins(appBundleInfo, deploymentInfo, strip, verbose): destinationPath = os.path.join(destinationDirectory, pluginName) shutil.copy2(sourcePath, destinationPath) if verbose >= 3: - print "Copied:", sourcePath - print " to:", destinationPath + print("Copied:", sourcePath) + print(" to:", destinationPath) if strip: runStrip(destinationPath, verbose) @@ -492,9 +491,10 @@ ap.add_argument("-no-strip", dest="strip", action="store_false", default=True, h ap.add_argument("-sign", dest="sign", action="store_true", default=False, help="sign .app bundle with codesign tool") ap.add_argument("-dmg", nargs="?", const="", metavar="basename", help="create a .dmg disk image; if basename is not specified, a camel-cased version of the app name is used") ap.add_argument("-fancy", nargs=1, metavar="plist", default=[], help="make a fancy looking disk image using the given plist file with instructions; requires -dmg to work") -ap.add_argument("-add-qt-tr", nargs=1, metavar="languages", default=[], help="add Qt translation files to the bundle's ressources; the language list must be separated with commas, not with whitespace") +ap.add_argument("-add-qt-tr", nargs=1, metavar="languages", default=[], help="add Qt translation files to the bundle's resources; the language list must be separated with commas, not with whitespace") ap.add_argument("-translations-dir", nargs=1, metavar="path", default=None, help="Path to Qt's translation files") ap.add_argument("-add-resources", nargs="+", metavar="path", default=[], help="list of additional files or folders to be copied into the bundle's resources; must be the last argument") +ap.add_argument("-volname", nargs=1, metavar="volname", default=[], help="custom volume name for dmg") config = ap.parse_args() @@ -524,7 +524,7 @@ if config.translations_dir and config.translations_dir[0]: for p in config.add_resources: if verbose >= 3: - print "Checking for \"%s\"..." % p + print("Checking for \"%s\"..." % p) if not os.path.exists(p): if verbose >= 1: sys.stderr.write("Error: Could not find additional resource file \"%s\"\n" % (p)) @@ -534,7 +534,7 @@ for p in config.add_resources: if len(config.fancy) == 1: if verbose >= 3: - print "Fancy: Importing plistlib..." + print("Fancy: Importing plistlib...") try: import plistlib except ImportError: @@ -544,7 +544,7 @@ if len(config.fancy) == 1: p = config.fancy[0] if verbose >= 3: - print "Fancy: Loading \"%s\"..." % p + print("Fancy: Loading \"%s\"..." % p) if not os.path.exists(p): if verbose >= 1: sys.stderr.write("Error: Could not find fancy disk image plist at \"%s\"\n" % (p)) @@ -558,23 +558,23 @@ if len(config.fancy) == 1: sys.exit(1) try: - assert not fancy.has_key("window_bounds") or (isinstance(fancy["window_bounds"], list) and len(fancy["window_bounds"]) == 4) - assert not fancy.has_key("background_picture") or isinstance(fancy["background_picture"], str) - assert not fancy.has_key("icon_size") or isinstance(fancy["icon_size"], int) - assert not fancy.has_key("applications_symlink") or isinstance(fancy["applications_symlink"], bool) - if fancy.has_key("items_position"): + assert "window_bounds" not in fancy or (isinstance(fancy["window_bounds"], list) and len(fancy["window_bounds"]) == 4) + assert "background_picture" not in fancy or isinstance(fancy["background_picture"], str) + assert "icon_size" not in fancy or isinstance(fancy["icon_size"], int) + assert "applications_symlink" not in fancy or isinstance(fancy["applications_symlink"], bool) + if "items_position" in fancy: assert isinstance(fancy["items_position"], dict) - for key, value in fancy["items_position"].iteritems(): + for key, value in fancy["items_position"].items(): assert isinstance(value, list) and len(value) == 2 and isinstance(value[0], int) and isinstance(value[1], int) except: if verbose >= 1: sys.stderr.write("Error: Bad format of fancy disk image plist at \"%s\"\n" % (p)) sys.exit(1) - if fancy.has_key("background_picture"): + if "background_picture" in fancy: bp = fancy["background_picture"] if verbose >= 3: - print "Fancy: Resolving background picture \"%s\"..." % bp + print("Fancy: Resolving background picture \"%s\"..." % bp) if not os.path.exists(bp): bp = os.path.join(os.path.dirname(p), bp) if not os.path.exists(bp): @@ -590,18 +590,25 @@ else: if os.path.exists("dist"): if verbose >= 2: - print "+ Removing old dist folder +" + print("+ Removing old dist folder +") shutil.rmtree("dist") # ------------------------------------------------ +if len(config.volname) == 1: + volname = config.volname[0] +else: + volname = app_bundle_name + +# ------------------------------------------------ + target = os.path.join("dist", "Paccoin-Qt.app") if verbose >= 2: - print "+ Copying source bundle +" + print("+ Copying source bundle +") if verbose >= 3: - print app_bundle, "->", target + print(app_bundle, "->", target) os.mkdir("dist") shutil.copytree(app_bundle, target, symlinks=True) @@ -611,7 +618,7 @@ applicationBundle = ApplicationBundleInfo(target) # ------------------------------------------------ if verbose >= 2: - print "+ Deploying frameworks +" + print("+ Deploying frameworks +") try: deploymentInfo = deployFrameworksForAppBundle(applicationBundle, config.strip, verbose) @@ -630,7 +637,7 @@ except RuntimeError as e: if config.plugins: if verbose >= 2: - print "+ Deploying plugins +" + print("+ Deploying plugins +") try: deployPlugins(applicationBundle, deploymentInfo, config.strip, verbose) @@ -656,7 +663,7 @@ else: for lng_file in add_qt_tr: p = os.path.join(qt_tr_dir, lng_file) if verbose >= 3: - print "Checking for \"%s\"..." % p + print("Checking for \"%s\"..." % p) if not os.path.exists(p): if verbose >= 1: sys.stderr.write("Error: Could not find Qt translation file \"%s\"\n" % (lng_file)) @@ -665,31 +672,31 @@ else: # ------------------------------------------------ if verbose >= 2: - print "+ Installing qt.conf +" + print("+ Installing qt.conf +") f = open(os.path.join(applicationBundle.resourcesPath, "qt.conf"), "wb") -f.write(qt_conf) +f.write(qt_conf.encode()) f.close() # ------------------------------------------------ if len(add_qt_tr) > 0 and verbose >= 2: - print "+ Adding Qt translations +" + print("+ Adding Qt translations +") for lng_file in add_qt_tr: if verbose >= 3: - print os.path.join(qt_tr_dir, lng_file), "->", os.path.join(applicationBundle.resourcesPath, lng_file) + print(os.path.join(qt_tr_dir, lng_file), "->", os.path.join(applicationBundle.resourcesPath, lng_file)) shutil.copy2(os.path.join(qt_tr_dir, lng_file), os.path.join(applicationBundle.resourcesPath, lng_file)) # ------------------------------------------------ if len(config.add_resources) > 0 and verbose >= 2: - print "+ Adding additional resources +" + print("+ Adding additional resources +") for p in config.add_resources: t = os.path.join(applicationBundle.resourcesPath, os.path.basename(p)) if verbose >= 3: - print p, "->", t + print(p, "->", t) if os.path.isdir(p): shutil.copytree(p, t, symlinks=True) else: @@ -698,35 +705,19 @@ for p in config.add_resources: # ------------------------------------------------ if config.sign and 'CODESIGNARGS' not in os.environ: - print "You must set the CODESIGNARGS environment variable. Skipping signing." + print("You must set the CODESIGNARGS environment variable. Skipping signing.") elif config.sign: if verbose >= 1: - print "Code-signing app bundle %s"%(target,) + print("Code-signing app bundle %s"%(target,)) subprocess.check_call("codesign --force %s %s"%(os.environ['CODESIGNARGS'], target), shell=True) # ------------------------------------------------ if config.dmg is not None: - #Patch in check_output for Python 2.6 - if "check_output" not in dir( subprocess ): - def f(*popenargs, **kwargs): - if 'stdout' in kwargs: - raise ValueError('stdout argument not allowed, it will be overridden.') - process = subprocess.Popen(stdout=subprocess.PIPE, *popenargs, **kwargs) - output, unused_err = process.communicate() - retcode = process.poll() - if retcode: - cmd = kwargs.get("args") - if cmd is None: - cmd = popenargs[0] - raise CalledProcessError(retcode, cmd) - return output - subprocess.check_output = f - def runHDIUtil(verb, image_basename, **kwargs): hdiutil_args = ["hdiutil", verb, image_basename + ".dmg"] - if kwargs.has_key("capture_stdout"): + if "capture_stdout" in kwargs: del kwargs["capture_stdout"] run = subprocess.check_output else: @@ -736,18 +727,18 @@ if config.dmg is not None: hdiutil_args.append("-verbose") run = subprocess.check_call - for key, value in kwargs.iteritems(): + for key, value in kwargs.items(): hdiutil_args.append("-" + key) if not value is True: hdiutil_args.append(str(value)) - return run(hdiutil_args) + return run(hdiutil_args, universal_newlines=True) if verbose >= 2: if fancy is None: - print "+ Creating .dmg disk image +" + print("+ Creating .dmg disk image +") else: - print "+ Preparing .dmg disk image +" + print("+ Preparing .dmg disk image +") if config.dmg != "": dmg_name = config.dmg @@ -757,12 +748,12 @@ if config.dmg is not None: if fancy is None: try: - runHDIUtil("create", dmg_name, srcfolder="dist", format="UDBZ", volname="Paccoin-Core", ov=True) + runHDIUtil("create", dmg_name, srcfolder="dist", format="UDBZ", volname=volname, ov=True) except subprocess.CalledProcessError as e: sys.exit(e.returncode) else: if verbose >= 3: - print "Determining size of \"dist\"..." + print("Determining size of \"dist\"...") size = 0 for path, dirs, files in os.walk("dist"): for file in files: @@ -770,14 +761,14 @@ if config.dmg is not None: size += int(size * 0.15) if verbose >= 3: - print "Creating temp image for modification..." + print("Creating temp image for modification...") try: - runHDIUtil("create", dmg_name + ".temp", srcfolder="dist", format="UDRW", size=size, volname="Paccoin-Core", ov=True) + runHDIUtil("create", dmg_name + ".temp", srcfolder="dist", format="UDRW", size=size, volname=volname, ov=True) except subprocess.CalledProcessError as e: sys.exit(e.returncode) if verbose >= 3: - print "Attaching temp image..." + print("Attaching temp image...") try: output = runHDIUtil("attach", dmg_name + ".temp", readwrite=True, noverify=True, noautoopen=True, capture_stdout=True) except subprocess.CalledProcessError as e: @@ -788,13 +779,13 @@ if config.dmg is not None: disk_name = m.group(1) if verbose >= 2: - print "+ Applying fancy settings +" + print("+ Applying fancy settings +") - if fancy.has_key("background_picture"): + if "background_picture" in fancy: bg_path = os.path.join(disk_root, ".background", os.path.basename(fancy["background_picture"])) os.mkdir(os.path.dirname(bg_path)) if verbose >= 3: - print fancy["background_picture"], "->", bg_path + print(fancy["background_picture"], "->", bg_path) shutil.copy2(fancy["background_picture"], bg_path) else: bg_path = None @@ -831,21 +822,21 @@ if config.dmg is not None: itemscript = Template('set position of item "${item}" of container window to {${position}}') items_positions = [] - if fancy.has_key("items_position"): - for name, position in fancy["items_position"].iteritems(): + if "items_position" in fancy: + for name, position in fancy["items_position"].items(): params = { "item" : name, "position" : ",".join([str(p) for p in position]) } items_positions.append(itemscript.substitute(params)) params = { - "disk" : "Paccoin-Core", + "disk" : volname, "window_bounds" : "300,300,800,620", "icon_size" : "96", "background_commands" : "", "items_positions" : "\n ".join(items_positions) } - if fancy.has_key("window_bounds"): - params["window.bounds"] = ",".join([str(p) for p in fancy["window_bounds"]]) - if fancy.has_key("icon_size"): + if "window_bounds" in fancy: + params["window_bounds"] = ",".join([str(p) for p in fancy["window_bounds"]]) + if "icon_size" in fancy: params["icon_size"] = str(fancy["icon_size"]) if bg_path is not None: # Set background file, then call SetFile to make it invisible. @@ -859,13 +850,14 @@ if config.dmg is not None: print("Running AppleScript:") print(s) + time.sleep(2) # fixes '112:116: execution error: Finder got an error: Can’t get disk "Paccoin-Core". (-1728)' p = subprocess.Popen(['osascript', '-'], stdin=subprocess.PIPE) - p.communicate(input=s) + p.communicate(input=s.encode('utf-8')) if p.returncode: print("Error running osascript.") if verbose >= 2: - print "+ Finalizing .dmg disk image +" + print("+ Finalizing .dmg disk image +") time.sleep(5) try: @@ -878,6 +870,6 @@ if config.dmg is not None: # ------------------------------------------------ if verbose >= 2: - print "+ Done +" + print("+ Done +") sys.exit(0) diff --git a/contrib/dashd.bash-completion b/contrib/paccoin-cli.bash-completion similarity index 67% rename from contrib/dashd.bash-completion rename to contrib/paccoin-cli.bash-completion index a6098ba6023f..e001a3d30801 100644 --- a/contrib/dashd.bash-completion +++ b/contrib/paccoin-cli.bash-completion @@ -1,45 +1,52 @@ -# bash programmable completion for paccoind(1) and paccoin-cli(1) -# Copyright (c) 2012,2014 Christian von Roques +# bash programmable completion for paccoin-cli(1) +# Copyright (c) 2012-2016 The Bitcoin Core developers # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. -have paccoind && { - -# call $paccoind for RPC +# call $paccoin-cli for RPC _paccoin_rpc() { # determine already specified args necessary for RPC local rpcargs=() for i in ${COMP_LINE}; do case "$i" in - -conf=*|-proxy*|-rpc*) + -conf=*|-datadir=*|-regtest|-rpc*|-testnet) rpcargs=( "${rpcargs[@]}" "$i" ) ;; esac done - $paccoind "${rpcargs[@]}" "$@" + $paccoin_cli "${rpcargs[@]}" "$@" } -# Add paccoin accounts to COMPREPLY +# Add wallet accounts to COMPREPLY _paccoin_accounts() { local accounts - accounts=$(_paccoin_rpc listaccounts | awk '/".*"/ { a=$1; gsub(/"/, "", a); print a}') + accounts=$(_paccoin_rpc listaccounts | awk -F '"' '{ print $2 }') COMPREPLY=( "${COMPREPLY[@]}" $( compgen -W "$accounts" -- "$cur" ) ) } -_paccoind() { +_paccoin_cli() { local cur prev words=() cword - local paccoind + local paccoin_cli - # save and use original argument to invoke paccoind - # paccoind might not be in $PATH - paccoind="$1" + # save and use original argument to invoke paccoin-cli for -help, help and RPC + # as paccoin-cli might not be in $PATH + paccoin_cli="$1" COMPREPLY=() _get_comp_words_by_ref -n = cur prev words cword + if ((cword > 5)); then + case ${words[cword-5]} in + sendtoaddress) + COMPREPLY=( $( compgen -W "true false" -- "$cur" ) ) + return 0 + ;; + esac + fi + if ((cword > 4)); then case ${words[cword-4]} in - listtransactions) + importaddress|listtransactions|setban) COMPREPLY=( $( compgen -W "true false" -- "$cur" ) ) return 0 ;; @@ -56,7 +63,7 @@ _paccoind() { _paccoin_accounts return 0 ;; - getbalance|gettxout|importaddress|importprivkey|listreceivedbyaccount|listreceivedbyaddress|listsinceblock) + getbalance|gettxout|importaddress|importpubkey|importprivkey|listreceivedbyaccount|listreceivedbyaddress|listsinceblock) COMPREPLY=( $( compgen -W "true false" -- "$cur" ) ) return 0 ;; @@ -69,7 +76,11 @@ _paccoind() { COMPREPLY=( $( compgen -W "add remove onetry" -- "$cur" ) ) return 0 ;; - getblock|getrawtransaction|gettransaction|listaccounts|listreceivedbyaccount|listreceivedbyaddress|sendrawtransaction) + setban) + COMPREPLY=( $( compgen -W "add remove" -- "$cur" ) ) + return 0 + ;; + fundrawtransaction|getblock|getblockheader|getmempoolancestors|getmempooldescendants|getrawtransaction|gettransaction|listaccounts|listreceivedbyaccount|listreceivedbyaddress|sendrawtransaction) COMPREPLY=( $( compgen -W "true false" -- "$cur" ) ) return 0 ;; @@ -85,7 +96,7 @@ _paccoind() { _filedir return 0 ;; - getmempool|lockunspent|setgenerate) + getaddednodeinfo|getrawmempool|lockunspent|setgenerate) COMPREPLY=( $( compgen -W "true false" -- "$cur" ) ) return 0 ;; @@ -96,7 +107,7 @@ _paccoind() { esac case "$cur" in - -conf=*|-pid=*|-loadblock=*|-wallet=*) + -conf=*) cur="${cur#*=}" _filedir return 0 @@ -112,9 +123,9 @@ _paccoind() { *) local helpopts commands - # only parse --help if senseful + # only parse -help if senseful if [[ -z "$cur" || "$cur" =~ ^- ]]; then - helpopts=$($paccoind --help 2>&1 | awk '$1 ~ /^-/ { sub(/=.*/, "="); print $1 }' ) + helpopts=$($paccoin_cli -help 2>&1 | awk '$1 ~ /^-/ { sub(/=.*/, "="); print $1 }' ) fi # only parse help if senseful @@ -131,10 +142,8 @@ _paccoind() { return 0 ;; esac -} - -complete -F _paccoind paccoind paccoin-cli -} +} && +complete -F _paccoin_cli paccoin-cli # Local variables: # mode: shell-script diff --git a/contrib/paccoin-tx.bash-completion b/contrib/paccoin-tx.bash-completion new file mode 100644 index 000000000000..7612e2edc31c --- /dev/null +++ b/contrib/paccoin-tx.bash-completion @@ -0,0 +1,57 @@ +# bash programmable completion for paccoin-tx(1) +# Copyright (c) 2016 The Bitcoin Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +_paccoin_tx() { + local cur prev words=() cword + local paccoin_tx + + # save and use original argument to invoke paccoin-tx for -help + # it might not be in $PATH + paccoin_tx="$1" + + COMPREPLY=() + _get_comp_words_by_ref -n =: cur prev words cword + + case "$cur" in + load=*:*) + cur="${cur#load=*:}" + _filedir + return 0 + ;; + *=*) # prevent attempts to complete other arguments + return 0 + ;; + esac + + if [[ "$cword" == 1 || ( "$prev" != "-create" && "$prev" == -* ) ]]; then + # only options (or an uncompletable hex-string) allowed + # parse paccoin-tx -help for options + local helpopts + helpopts=$($paccoin_tx -help | sed -e '/^ -/ p' -e d ) + COMPREPLY=( $( compgen -W "$helpopts" -- "$cur" ) ) + else + # only commands are allowed + # parse -help for commands + local helpcmds + helpcmds=$($paccoin_tx -help | sed -e '1,/Commands:/d' -e 's/=.*/=/' -e '/^ [a-z]/ p' -e d ) + COMPREPLY=( $( compgen -W "$helpcmds" -- "$cur" ) ) + fi + + # Prevent space if an argument is desired + if [[ $COMPREPLY == *= ]]; then + compopt -o nospace + fi + + return 0 +} && +complete -F _paccoin_tx paccoin-tx + +# Local variables: +# mode: shell-script +# sh-basic-offset: 4 +# sh-indent-comment: t +# indent-tabs-mode: nil +# End: +# ex: ts=4 sw=4 et filetype=sh diff --git a/contrib/paccoind.bash-completion b/contrib/paccoind.bash-completion new file mode 100644 index 000000000000..5c668ffba11a --- /dev/null +++ b/contrib/paccoind.bash-completion @@ -0,0 +1,56 @@ +# bash programmable completion for paccoind(1) and paccoin-qt(1) +# Copyright (c) 2012-2016 The Bitcoin Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +_paccoind() { + local cur prev words=() cword + local paccoind + + # save and use original argument to invoke paccoind for -help + # it might not be in $PATH + paccoind="$1" + + COMPREPLY=() + _get_comp_words_by_ref -n = cur prev words cword + + case "$cur" in + -conf=*|-pid=*|-loadblock=*|-rootcertificates=*|-rpccookiefile=*|-wallet=*) + cur="${cur#*=}" + _filedir + return 0 + ;; + -datadir=*) + cur="${cur#*=}" + _filedir -d + return 0 + ;; + -*=*) # prevent nonsense completions + return 0 + ;; + *) + + # only parse -help if senseful + if [[ -z "$cur" || "$cur" =~ ^- ]]; then + local helpopts + helpopts=$($paccoind -help 2>&1 | awk '$1 ~ /^-/ { sub(/=.*/, "="); print $1 }' ) + COMPREPLY=( $( compgen -W "$helpopts" -- "$cur" ) ) + fi + + # Prevent space if an argument is desired + if [[ $COMPREPLY == *= ]]; then + compopt -o nospace + fi + return 0 + ;; + esac +} && +complete -F _paccoind paccoind paccoin-qt + +# Local variables: +# mode: shell-script +# sh-basic-offset: 4 +# sh-indent-comment: t +# indent-tabs-mode: nil +# End: +# ex: ts=4 sw=4 et filetype=sh diff --git a/depends/.gitignore b/depends/.gitignore index 1f163897b9ef..3cb4b9ac1555 100644 --- a/depends/.gitignore +++ b/depends/.gitignore @@ -7,3 +7,4 @@ x86_64* i686* mips* arm* +aarch64* diff --git a/depends/Makefile b/depends/Makefile index ef5a20e6c36a..dedb0674cf14 100644 --- a/depends/Makefile +++ b/depends/Makefile @@ -15,6 +15,8 @@ BASEDIR = $(CURDIR) HASH_LENGTH:=11 DOWNLOAD_CONNECT_TIMEOUT:=10 DOWNLOAD_RETRIES:=3 +HOST_ID_SALT ?= salt +BUILD_ID_SALT ?= salt host:=$(BUILD) ifneq ($(HOST),) @@ -73,13 +75,31 @@ include builders/$(build_os).mk include builders/default.mk include packages/packages.mk -qt_packages_$(NO_QT) = $(qt_packages) $(qt_$(host_os)_packages) -qt_native_packages_$(NO_QT) = $(qt_native_packages) +build_id_string:=$(BUILD_ID_SALT) +build_id_string+=$(shell $(build_CC) --version 2>/dev/null) +build_id_string+=$(shell $(build_AR) --version 2>/dev/null) +build_id_string+=$(shell $(build_CXX) --version 2>/dev/null) +build_id_string+=$(shell $(build_RANLIB) --version 2>/dev/null) +build_id_string+=$(shell $(build_STRIP) --version 2>/dev/null) + +$(host_arch)_$(host_os)_id_string:=$(HOST_ID_SALT) +$(host_arch)_$(host_os)_id_string+=$(shell $(host_CC) --version 2>/dev/null) +$(host_arch)_$(host_os)_id_string+=$(shell $(host_AR) --version 2>/dev/null) +$(host_arch)_$(host_os)_id_string+=$(shell $(host_CXX) --version 2>/dev/null) +$(host_arch)_$(host_os)_id_string+=$(shell $(host_RANLIB) --version 2>/dev/null) +$(host_arch)_$(host_os)_id_string+=$(shell $(host_STRIP) --version 2>/dev/null) + +qt_packages_$(NO_QT) = $(qt_packages) $(qt_$(host_os)_packages) $(qt_$(host_arch)_$(host_os)_packages) wallet_packages_$(NO_WALLET) = $(wallet_packages) upnp_packages_$(NO_UPNP) = $(upnp_packages) packages += $($(host_arch)_$(host_os)_packages) $($(host_os)_packages) $(qt_packages_) $(wallet_packages_) $(upnp_packages_) -native_packages += $($(host_arch)_$(host_os)_native_packages) $($(host_os)_native_packages) $(qt_native_packages_) +native_packages += $($(host_arch)_$(host_os)_native_packages) $($(host_os)_native_packages) + +ifneq ($(qt_packages_),) +native_packages += $(qt_native_packages) +endif + all_packages = $(packages) $(native_packages) meta_depends = Makefile funcs.mk builders/default.mk hosts/default.mk hosts/$(host_os).mk builders/$(build_os).mk @@ -90,7 +110,7 @@ include funcs.mk toolchain_path=$($($(host_arch)_$(host_os)_native_toolchain)_prefixbin) final_build_id_long+=$(shell $(build_SHA256SUM) config.site.in) -final_build_id+=$(shell echo -n $(final_build_id_long) | $(build_SHA256SUM) | cut -c-$(HASH_LENGTH)) +final_build_id+=$(shell echo -n "$(final_build_id_long)" | $(build_SHA256SUM) | cut -c-$(HASH_LENGTH)) $(host_prefix)/.stamp_$(final_build_id): $(native_packages) $(packages) $(AT)rm -rf $(@D) $(AT)mkdir -p $(@D) @@ -131,9 +151,9 @@ endef define check_or_remove_sources mkdir -p $($(package)_source_dir); cd $($(package)_source_dir); \ - $(build_SHA256SUM) -c $($(package)_fetched) >/dev/null 2>/dev/null || \ - ( if test -f $($(package)_all_sources); then echo "Checksum missing or mismatched for $(package) source. Forcing re-download."; fi; \ - rm -f $($(package)_all_sources) $($(1)_fetched)) + test -f $($(package)_fetched) && ( $(build_SHA256SUM) -c $($(package)_fetched) >/dev/null 2>/dev/null || \ + ( echo "Checksum missing or mismatched for $(package) source. Forcing re-download."; \ + rm -f $($(package)_all_sources) $($(1)_fetched))) || true endef check-packages: diff --git a/depends/README.md b/depends/README.md index 37b073e0287a..5209c29104d7 100644 --- a/depends/README.md +++ b/depends/README.md @@ -12,9 +12,9 @@ For example: make HOST=x86_64-w64-mingw32 -j4 -A prefix will be generated that's suitable for plugging into Paccoin's +A prefix will be generated that's suitable for plugging into Dash's configure. In the above example, a dir named x86_64-w64-mingw32 will be -created. To use it for Paccoin: +created. To use it for Dash: ./configure --prefix=`pwd`/depends/x86_64-w64-mingw32 @@ -23,7 +23,8 @@ Common `host-platform-triplets` for cross compilation are: - `i686-w64-mingw32` for Win32 - `x86_64-w64-mingw32` for Win64 - `x86_64-apple-darwin11` for MacOSX -- `arm-linux-gnueabihf` for Linux ARM +- `arm-linux-gnueabihf` for Linux ARM 32 bit +- `aarch64-linux-gnu` for Linux ARM 64 bit No other options are needed, the paths are automatically configured. @@ -38,9 +39,11 @@ The following can be set when running make: make FOO=bar NO_WALLET: Don't download/build/cache libs needed to enable the wallet NO_UPNP: Don't download/build/cache packages needed for enabling upnp DEBUG: disable some optimizations and enable more runtime checking + HOST_ID_SALT: Optional salt to use when generating host package ids + BUILD_ID_SALT: Optional salt to use when generating build package ids If some packages are not built, for example `make NO_WALLET=1`, the appropriate -options will be passed to Paccoin Core's configure. In this case, `--disable-wallet`. +options will be passed to Dash Core's configure. In this case, `--disable-wallet`. Additional targets: diff --git a/depends/builders/darwin.mk b/depends/builders/darwin.mk index cedbddc57847..d15d6feea6f4 100644 --- a/depends/builders/darwin.mk +++ b/depends/builders/darwin.mk @@ -7,11 +7,11 @@ build_darwin_OTOOL: = $(shell xcrun -f otool) build_darwin_NM: = $(shell xcrun -f nm) build_darwin_INSTALL_NAME_TOOL:=$(shell xcrun -f install_name_tool) build_darwin_SHA256SUM = shasum -a 256 -build_darwin_DOWNLOAD = curl --location --fail --connect-timeout $(DOWNLOAD_CONNECT_TIMEOUT) --retry $(DOWNLOAD_RETRIES) -L -o +build_darwin_DOWNLOAD = curl --location --fail --connect-timeout $(DOWNLOAD_CONNECT_TIMEOUT) --retry $(DOWNLOAD_RETRIES) -o #darwin host on darwin builder. overrides darwin host preferences. darwin_CC=$(shell xcrun -f clang) -mmacosx-version-min=$(OSX_MIN_VERSION) -darwin_CXX:=$(shell xcrun -f clang++) -mmacosx-version-min=$(OSX_MIN_VERSION) +darwin_CXX:=$(shell xcrun -f clang++) -mmacosx-version-min=$(OSX_MIN_VERSION) -stdlib=libc++ -fvisibility=hidden darwin_AR:=$(shell xcrun -f ar) darwin_RANLIB:=$(shell xcrun -f ranlib) darwin_STRIP:=$(shell xcrun -f strip) diff --git a/depends/builders/linux.mk b/depends/builders/linux.mk index d6a304e4b4b9..b03f42401047 100644 --- a/depends/builders/linux.mk +++ b/depends/builders/linux.mk @@ -1,2 +1,2 @@ build_linux_SHA256SUM = sha256sum -build_linux_DOWNLOAD = curl --location --fail --connect-timeout $(DOWNLOAD_CONNECT_TIMEOUT) --retry $(DOWNLOAD_RETRIES) -L -o +build_linux_DOWNLOAD = curl --location --fail --connect-timeout $(DOWNLOAD_CONNECT_TIMEOUT) --retry $(DOWNLOAD_RETRIES) -o diff --git a/depends/config.guess b/depends/config.guess index fba6e87a0f87..bbd48b60e88b 100755 --- a/depends/config.guess +++ b/depends/config.guess @@ -1,8 +1,8 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright 1992-2015 Free Software Foundation, Inc. +# Copyright 1992-2017 Free Software Foundation, Inc. -timestamp='2015-11-19' +timestamp='2017-01-01' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -27,7 +27,7 @@ timestamp='2015-11-19' # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess # # Please send patches to . @@ -50,7 +50,7 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright 1992-2015 Free Software Foundation, Inc. +Copyright 1992-2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -186,9 +186,12 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched - # to ELF recently, or will in the future. + # to ELF recently (or will in the future) and ABI. case "${UNAME_MACHINE_ARCH}" in - arm*|earm*|i386|m68k|ns32k|sh3*|sparc|vax) + earm*) + os=netbsdelf + ;; + arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ @@ -237,6 +240,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-libertybsd${UNAME_RELEASE} + exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; @@ -268,42 +275,42 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "EV4.5 (21064)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "LCA4 (21066/21068)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "EV5 (21164)") - UNAME_MACHINE="alphaev5" ;; + UNAME_MACHINE=alphaev5 ;; "EV5.6 (21164A)") - UNAME_MACHINE="alphaev56" ;; + UNAME_MACHINE=alphaev56 ;; "EV5.6 (21164PC)") - UNAME_MACHINE="alphapca56" ;; + UNAME_MACHINE=alphapca56 ;; "EV5.7 (21164PC)") - UNAME_MACHINE="alphapca57" ;; + UNAME_MACHINE=alphapca57 ;; "EV6 (21264)") - UNAME_MACHINE="alphaev6" ;; + UNAME_MACHINE=alphaev6 ;; "EV6.7 (21264A)") - UNAME_MACHINE="alphaev67" ;; + UNAME_MACHINE=alphaev67 ;; "EV6.8CB (21264C)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.8AL (21264B)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.8CX (21264D)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.9A (21264/EV69A)") - UNAME_MACHINE="alphaev69" ;; + UNAME_MACHINE=alphaev69 ;; "EV7 (21364)") - UNAME_MACHINE="alphaev7" ;; + UNAME_MACHINE=alphaev7 ;; "EV7.9 (21364A)") - UNAME_MACHINE="alphaev79" ;; + UNAME_MACHINE=alphaev79 ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. - echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 @@ -376,16 +383,16 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build - SUN_ARCH="i386" + SUN_ARCH=i386 # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then - SUN_ARCH="x86_64" + SUN_ARCH=x86_64 fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` @@ -410,7 +417,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` - test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + test "x${UNAME_RELEASE}" = x && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} @@ -635,13 +642,13 @@ EOF sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in - 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 - 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 + 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in - 32) HP_ARCH="hppa2.0n" ;; - 64) HP_ARCH="hppa2.0w" ;; - '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + 32) HP_ARCH=hppa2.0n ;; + 64) HP_ARCH=hppa2.0w ;; + '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 esac ;; esac fi @@ -680,11 +687,11 @@ EOF exit (0); } EOF - (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + (CCOPTS="" $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac - if [ ${HP_ARCH} = "hppa2.0w" ] + if [ ${HP_ARCH} = hppa2.0w ] then eval $set_cc_for_build @@ -697,12 +704,12 @@ EOF # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 - if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then - HP_ARCH="hppa2.0w" + HP_ARCH=hppa2.0w else - HP_ARCH="hppa64" + HP_ARCH=hppa64 fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} @@ -807,14 +814,14 @@ EOF echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) - FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) @@ -896,7 +903,7 @@ EOF exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland - echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix @@ -919,7 +926,7 @@ EOF EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 - if test "$?" = 0 ; then LIBC="gnulibc1" ; fi + if test "$?" = 0 ; then LIBC=gnulibc1 ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) @@ -993,6 +1000,9 @@ EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; + mips64el:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; openrisc*:Linux:*:*) echo or1k-unknown-linux-${LIBC} exit ;; @@ -1025,6 +1035,9 @@ EOF ppcle:Linux:*:*) echo powerpcle-unknown-linux-${LIBC} exit ;; + riscv32:Linux:*:* | riscv64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; @@ -1272,6 +1285,9 @@ EOF SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; + SX-ACE:SUPER-UX:*:*) + echo sxace-nec-superux${UNAME_RELEASE} + exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; @@ -1285,9 +1301,9 @@ EOF UNAME_PROCESSOR=powerpc fi if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in @@ -1309,7 +1325,7 @@ EOF exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` - if test "$UNAME_PROCESSOR" = "x86"; then + if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi @@ -1340,7 +1356,7 @@ EOF # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. - if test "$cputype" = "386"; then + if test "$cputype" = 386; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" @@ -1382,7 +1398,7 @@ EOF echo i386-pc-xenix exit ;; i*86:skyos:*:*) - echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE} | sed -e 's/ .*$//'` exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos @@ -1394,25 +1410,24 @@ EOF echo ${UNAME_MACHINE}-unknown-esx exit ;; amd64:Isilon\ OneFS:*:*) - echo x86_64-unknown-onefs + echo x86_64-unknown-onefs exit ;; esac cat >&2 < in order to provide the needed -information to handle your system. +If $0 has already been updated, send the following data and any +information you think might be pertinent to config-patches@gnu.org to +provide the necessary information to handle your system. config.guess timestamp = $timestamp diff --git a/depends/config.site.in b/depends/config.site.in index 9e8aee159bf7..3d7c9fd43c7a 100644 --- a/depends/config.site.in +++ b/depends/config.site.in @@ -19,9 +19,6 @@ fi if test -z $with_protoc_bindir; then with_protoc_bindir=$depends_prefix/native/bin fi -if test -z $with_comparison_tool; then - with_comparison_tool=$depends_prefix/native/share/BitcoindComparisonTool_jar/BitcoindComparisonTool.jar -fi if test -z $enable_wallet && test -n "@no_wallet@"; then @@ -66,8 +63,6 @@ LDFLAGS="-L$depends_prefix/lib $LDFLAGS" CC="@CC@" CXX="@CXX@" OBJC="${CC}" -OBJCXX="${CXX}" -CCACHE=$prefix/native/bin/ccache CCACHE=$depends_prefix/native/bin/ccache PYTHONPATH=$depends_prefix/native/lib/python/dist-packages:$PYTHONPATH diff --git a/depends/config.sub b/depends/config.sub index ea8747d30fff..7e792b4ae17b 100755 --- a/depends/config.sub +++ b/depends/config.sub @@ -1,8 +1,8 @@ #! /bin/sh # Configuration validation subroutine script. -# Copyright 1992-2015 Free Software Foundation, Inc. +# Copyright 1992-2017 Free Software Foundation, Inc. -timestamp='2015-11-22' +timestamp='2017-01-01' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -33,7 +33,7 @@ timestamp='2015-11-22' # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases @@ -67,7 +67,7 @@ Report bugs and patches to ." version="\ GNU config.sub ($timestamp) -Copyright 1992-2015 Free Software Foundation, Inc. +Copyright 1992-2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -117,7 +117,7 @@ case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ - kopensolaris*-gnu* | \ + kopensolaris*-gnu* | cloudabi*-eabi* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` @@ -301,6 +301,7 @@ case $basic_machine in | open8 | or1k | or1knd | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ + | pru \ | pyramid \ | riscv32 | riscv64 \ | rl78 | rx \ @@ -428,6 +429,7 @@ case $basic_machine in | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ + | pru-* \ | pyramid-* \ | riscv32-* | riscv64-* \ | rl78-* | romp-* | rs6000-* | rx-* \ @@ -520,7 +522,7 @@ case $basic_machine in basic_machine=i386-pc os=-aros ;; - asmjs) + asmjs) basic_machine=asmjs-unknown ;; aux) @@ -643,6 +645,14 @@ case $basic_machine in basic_machine=m68k-bull os=-sysv3 ;; + e500v[12]) + basic_machine=powerpc-unknown + os=$os"spe" + ;; + e500v[12]-*) + basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + os=$os"spe" + ;; ebmon29k) basic_machine=a29k-amd os=-ebmon @@ -1022,7 +1032,7 @@ case $basic_machine in ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; - ppcle | powerpclittle | ppc-le | powerpc-little) + ppcle | powerpclittle) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) @@ -1032,7 +1042,7 @@ case $basic_machine in ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; - ppc64le | powerpc64little | ppc64-le | powerpc64-little) + ppc64le | powerpc64little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) @@ -1382,14 +1392,14 @@ case $os in | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ - | -bitrig* | -openbsd* | -solidbsd* \ + | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ - | -chorusos* | -chorusrdb* | -cegcc* \ + | -chorusos* | -chorusrdb* | -cegcc* | -glidix* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ + | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ @@ -1399,7 +1409,7 @@ case $os in | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \ - | -onefs* | -tirtos*) + | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) @@ -1531,6 +1541,8 @@ case $os in ;; -nacl*) ;; + -ios) + ;; -none) ;; *) @@ -1626,6 +1638,9 @@ case $basic_machine in sparc-* | *-sun) os=-sunos4.1.1 ;; + pru-*) + os=-elf + ;; *-be) os=-beos ;; diff --git a/depends/funcs.mk b/depends/funcs.mk index 050a9b132137..15e404e42dcf 100644 --- a/depends/funcs.mk +++ b/depends/funcs.mk @@ -19,15 +19,19 @@ define int_get_all_dependencies $(sort $(foreach dep,$(2),$(2) $(call int_get_all_dependencies,$(1),$($(dep)_dependencies)))) endef -define fetch_file -(test -f $$($(1)_source_dir)/$(4) || \ - ( mkdir -p $$($(1)_download_dir) && echo Fetching $(1)... && \ - ( $(build_DOWNLOAD) "$$($(1)_download_dir)/$(4).temp" "$(2)/$(3)" || \ - $(build_DOWNLOAD) "$$($(1)_download_dir)/$(4).temp" "$(FALLBACK_DOWNLOAD_PATH)/$(3)" ) && \ +define fetch_file_inner + ( mkdir -p $$($(1)_download_dir) && echo Fetching $(3) from $(2) && \ + $(build_DOWNLOAD) "$$($(1)_download_dir)/$(4).temp" "$(2)/$(3)" && \ echo "$(5) $$($(1)_download_dir)/$(4).temp" > $$($(1)_download_dir)/.$(4).hash && \ $(build_SHA256SUM) -c $$($(1)_download_dir)/.$(4).hash && \ mv $$($(1)_download_dir)/$(4).temp $$($(1)_source_dir)/$(4) && \ - rm -rf $$($(1)_download_dir) )) + rm -rf $$($(1)_download_dir) ) +endef + +define fetch_file + ( test -f $$($(1)_source_dir)/$(4) || \ + ( $(call fetch_file_inner,$(1),$(2),$(3),$(4),$(5)) || \ + $(call fetch_file_inner,$(1),$(FALLBACK_DOWNLOAD_PATH),$(3),$(4),$(5)))) endef define int_get_build_recipe_hash @@ -39,7 +43,7 @@ define int_get_build_id $(eval $(1)_dependencies += $($(1)_$(host_arch)_$(host_os)_dependencies) $($(1)_$(host_os)_dependencies)) $(eval $(1)_all_dependencies:=$(call int_get_all_dependencies,$(1),$($($(1)_type)_native_toolchain) $($(1)_dependencies))) $(foreach dep,$($(1)_all_dependencies),$(eval $(1)_build_id_deps+=$(dep)-$($(dep)_version)-$($(dep)_recipe_hash))) -$(eval $(1)_build_id_long:=$(1)-$($(1)_version)-$($(1)_recipe_hash)-$(release_type) $($(1)_build_id_deps)) +$(eval $(1)_build_id_long:=$(1)-$($(1)_version)-$($(1)_recipe_hash)-$(release_type) $($(1)_build_id_deps) $($($(1)_type)_id_string)) $(eval $(1)_build_id:=$(shell echo -n "$($(1)_build_id_long)" | $(build_SHA256SUM) | cut -c-$(HASH_LENGTH))) final_build_id_long+=$($(package)_build_id_long) diff --git a/depends/hosts/darwin.mk b/depends/hosts/darwin.mk index dbe6d00795e0..44663342f08e 100644 --- a/depends/hosts/darwin.mk +++ b/depends/hosts/darwin.mk @@ -1,7 +1,7 @@ -OSX_MIN_VERSION=10.7 -OSX_SDK_VERSION=10.9 +OSX_MIN_VERSION=10.9 +OSX_SDK_VERSION=10.11 OSX_SDK=$(SDK_PATH)/MacOSX$(OSX_SDK_VERSION).sdk -LD64_VERSION=241.9 +LD64_VERSION=253.9 darwin_CC=clang -target $(host) -mmacosx-version-min=$(OSX_MIN_VERSION) --sysroot $(OSX_SDK) -mlinker-version=$(LD64_VERSION) darwin_CXX=clang++ -target $(host) -mmacosx-version-min=$(OSX_MIN_VERSION) --sysroot $(OSX_SDK) -mlinker-version=$(LD64_VERSION) -stdlib=libc++ diff --git a/depends/hosts/linux.mk b/depends/hosts/linux.mk index b13a0f1ad714..602206d63421 100644 --- a/depends/hosts/linux.mk +++ b/depends/hosts/linux.mk @@ -1,5 +1,5 @@ linux_CFLAGS=-pipe -linux_CXXFLAGS=$(linux_CFLAGS) +linux_CXXFLAGS=$(linux_CFLAGS) -static-libstdc++ linux_release_CFLAGS=-O2 linux_release_CXXFLAGS=$(linux_release_CFLAGS) diff --git a/depends/hosts/mingw32.mk b/depends/hosts/mingw32.mk index dbfb62fdcf98..83fc501a1990 100644 --- a/depends/hosts/mingw32.mk +++ b/depends/hosts/mingw32.mk @@ -1,5 +1,5 @@ mingw32_CFLAGS=-pipe -mingw32_CXXFLAGS=$(mingw32_CFLAGS) +mingw32_CXXFLAGS=$(mingw32_CFLAGS) -static-libstdc++ mingw32_release_CFLAGS=-O2 mingw32_release_CXXFLAGS=$(mingw32_release_CFLAGS) diff --git a/depends/packages/bdb.mk b/depends/packages/bdb.mk index 200d57314ea0..6c9876c2c7c7 100644 --- a/depends/packages/bdb.mk +++ b/depends/packages/bdb.mk @@ -14,7 +14,8 @@ endef define $(package)_preprocess_cmds sed -i.old 's/__atomic_compare_exchange/__atomic_compare_exchange_db/' dbinc/atomic.h && \ - sed -i.old 's/atomic_init/atomic_init_db/' dbinc/atomic.h mp/mp_region.c mp/mp_mvcc.c mp/mp_fget.c mutex/mut_method.c mutex/mut_tas.c + sed -i.old 's/atomic_init/atomic_init_db/' dbinc/atomic.h mp/mp_region.c mp/mp_mvcc.c mp/mp_fget.c mutex/mut_method.c mutex/mut_tas.c && \ + cp -f $(BASEDIR)/config.guess $(BASEDIR)/config.sub dist endef define $(package)_config_cmds diff --git a/depends/packages/chia_bls.mk b/depends/packages/chia_bls.mk new file mode 100644 index 000000000000..85eb21472e1c --- /dev/null +++ b/depends/packages/chia_bls.mk @@ -0,0 +1,50 @@ +package=chia_bls +$(package)_version=v20181101 +# It's actually from https://github.com/Chia-Network/bls-signatures, but we have so many patches atm that it's forked +$(package)_download_path=https://github.com/codablock/bls-signatures/archive +$(package)_file_name=$($(package)_version).tar.gz +$(package)_sha256_hash=b3ec74a77a7b6795f84b05e051a0824ef8d9e05b04b2993f01040f35689aa87c +$(package)_dependencies=gmp +#$(package)_patches=...TODO (when we switch back to https://github.com/Chia-Network/bls-signatures) + +#define $(package)_preprocess_cmds +# for i in $($(package)_patches); do patch -N -p1 < $($(package)_patch_dir)/$$$$i; done +#endef + +define $(package)_set_vars + $(package)_config_opts=-DCMAKE_INSTALL_PREFIX=$($(package)_staging_dir)/$(host_prefix) + $(package)_config_opts+= -DCMAKE_PREFIX_PATH=$(host_prefix) + $(package)_config_opts+= -DSTLIB=ON -DSHLIB=OFF -DSTBIN=ON + $(package)_config_opts_linux=-DOPSYS=LINUX -DCMAKE_SYSTEM_NAME=Linux + $(package)_config_opts_darwin=-DOPSYS=MACOSX -DCMAKE_SYSTEM_NAME=Darwin + $(package)_config_opts_mingw32=-DOPSYS=WINDOWS -DCMAKE_SYSTEM_NAME=Windows -DCMAKE_SHARED_LIBRARY_LINK_C_FLAGS="" -DCMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS="" + $(package)_config_opts_i686+= -DWSIZE=32 + $(package)_config_opts_x86_64+= -DWSIZE=64 + $(package)_config_opts_arm+= -DWSIZE=32 + $(package)_config_opts_debug=-DDEBUG=ON -DCMAKE_BUILD_TYPE=Debug + + ifneq ($(darwin_native_toolchain),) + $(package)_config_opts_darwin+= -DCMAKE_AR="$(host_prefix)/native/bin/$($(package)_ar)" + $(package)_config_opts_darwin+= -DCMAKE_RANLIB="$(host_prefix)/native/bin/$($(package)_ranlib)" + endif +endef + +define $(package)_config_cmds + export CC="$($(package)_cc)" && \ + export CXX="$($(package)_cxx)" && \ + export CFLAGS="$($(package)_cflags) $($(package)_cppflags)" && \ + export CXXFLAGS="$($(package)_cxxflags) $($(package)_cppflags)" && \ + export LDFLAGS="$($(package)_ldflags)" && \ + mkdir -p build && cd build && \ + cmake ../ $($(package)_config_opts) +endef + +define $(package)_build_cmds + cd build && \ + $(MAKE) $($(package)_build_opts) +endef + +define $(package)_stage_cmds + cd build && \ + $(MAKE) install +endef diff --git a/depends/packages/dbus.mk b/depends/packages/dbus.mk index 8ac9ab742bfe..90ddcb923f21 100644 --- a/depends/packages/dbus.mk +++ b/depends/packages/dbus.mk @@ -1,8 +1,8 @@ package=dbus -$(package)_version=1.8.6 +$(package)_version=1.10.14 $(package)_download_path=http://dbus.freedesktop.org/releases/dbus $(package)_file_name=$(package)-$($(package)_version).tar.gz -$(package)_sha256_hash=eded83ca007b719f32761e60fd8b9ffd0f5796a4caf455b01b5a5ef740ebd23f +$(package)_sha256_hash=23238f70353e38ce5ca183ebc9525c0d97ac00ef640ad29cf794782af6e6a083 $(package)_dependencies=expat define $(package)_set_vars diff --git a/depends/packages/expat.mk b/depends/packages/expat.mk index 1ac443537420..81a660e83a55 100644 --- a/depends/packages/expat.mk +++ b/depends/packages/expat.mk @@ -1,8 +1,8 @@ package=expat -$(package)_version=2.1.0 -$(package)_download_path=http://sourceforge.net/projects/expat/files/expat/$($(package)_version) -$(package)_file_name=$(package)-$($(package)_version).tar.gz -$(package)_sha256_hash=823705472f816df21c8f6aa026dd162b280806838bb55b3432b0fb1fcca7eb86 +$(package)_version=2.2.0 +$(package)_download_path=https://downloads.sourceforge.net/project/expat/expat/$($(package)_version) +$(package)_file_name=$(package)-$($(package)_version).tar.bz2 +$(package)_sha256_hash=d9e50ff2d19b3538bd2127902a89987474e1a4db8e43a66a4d1a712ab9a504ff define $(package)_set_vars $(package)_config_opts=--disable-static diff --git a/depends/packages/fontconfig.mk b/depends/packages/fontconfig.mk index 2cf553ed9657..12695db4b9f7 100644 --- a/depends/packages/fontconfig.mk +++ b/depends/packages/fontconfig.mk @@ -1,8 +1,8 @@ package=fontconfig -$(package)_version=2.11.1 +$(package)_version=2.12.1 $(package)_download_path=http://www.freedesktop.org/software/fontconfig/release/ $(package)_file_name=$(package)-$($(package)_version).tar.bz2 -$(package)_sha256_hash=dc62447533bca844463a3c3fd4083b57c90f18a70506e7a9f4936b5a1e516a99 +$(package)_sha256_hash=b449a3e10c47e1d1c7a6ec6e2016cca73d3bd68fbbd4f0ae5cc6b573f7d6c7f3 $(package)_dependencies=freetype expat define $(package)_set_vars @@ -13,7 +13,13 @@ define $(package)_config_cmds $($(package)_autoconf) endef +# 2.12.1 uses CHAR_WIDTH which is reserved and clashes with some glibc versions, but newer versions of fontconfig +# have broken makefiles which needlessly attempt to re-generate headers with gperf. +# Instead, change all uses of CHAR_WIDTH, and disable the rule that forces header re-generation. +# This can be removed once the upstream build is fixed. define $(package)_build_cmds + sed -i 's/CHAR_WIDTH/CHARWIDTH/g' fontconfig/fontconfig.h src/fcobjshash.gperf src/fcobjs.h src/fcobjshash.h && \ + sed -i 's/fcobjshash.h: fcobjshash.gperf/fcobjshash.h:/' src/Makefile && \ $(MAKE) endef diff --git a/depends/packages/freetype.mk b/depends/packages/freetype.mk index f7d6e0f9fc58..76b025c46318 100644 --- a/depends/packages/freetype.mk +++ b/depends/packages/freetype.mk @@ -1,8 +1,8 @@ package=freetype -$(package)_version=2.5.3 -$(package)_download_path=http://downloads.sourceforge.net/$(package) +$(package)_version=2.7.1 +$(package)_download_path=http://download.savannah.gnu.org/releases/$(package) $(package)_file_name=$(package)-$($(package)_version).tar.bz2 -$(package)_sha256_hash=c0848b29d52ef3ca27ad92e08351f023c5e24ce8cea7d8fe69fc96358e65f75e +$(package)_sha256_hash=3a3bb2c4e15ffb433f2032f50a5b5a92558206822e22bfe8cbe339af4aa82f88 define $(package)_set_vars $(package)_config_opts=--without-zlib --without-png --disable-static diff --git a/depends/packages/gmp.mk b/depends/packages/gmp.mk new file mode 100644 index 000000000000..0003b24a33da --- /dev/null +++ b/depends/packages/gmp.mk @@ -0,0 +1,22 @@ +package=gmp +$(package)_version=6.1.2 +$(package)_download_path=https://gmplib.org/download/gmp +$(package)_file_name=gmp-$($(package)_version).tar.bz2 +$(package)_sha256_hash=5275bb04f4863a13516b2f39392ac5e272f5e1bb8057b18aec1c9b79d73d8fb2 + +define $(package)_set_vars +$(package)_config_opts+=--enable-cxx --enable-fat --with-pic --disable-shared +endef + +define $(package)_config_cmds + $($(package)_autoconf) +endef + +define $(package)_build_cmds + $(MAKE) +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install +endef + diff --git a/depends/packages/miniupnpc.mk b/depends/packages/miniupnpc.mk index 3d5a6df974bf..1bb8cb5d2664 100644 --- a/depends/packages/miniupnpc.mk +++ b/depends/packages/miniupnpc.mk @@ -1,8 +1,8 @@ package=miniupnpc -$(package)_version=1.9.20151026 +$(package)_version=2.0.20170509 $(package)_download_path=http://miniupnp.free.fr/files $(package)_file_name=$(package)-$($(package)_version).tar.gz -$(package)_sha256_hash=f3cf9a5a31588a917d4d9237e5bc50f84d00c5aa48e27ed50d9b88dfa6a25d47 +$(package)_sha256_hash=d3c368627f5cdfb66d3ebd64ca39ba54d6ff14a61966dbecb8dd296b7039f16a define $(package)_set_vars $(package)_build_opts=CC="$($(package)_cc)" diff --git a/depends/packages/native_biplist.mk b/depends/packages/native_biplist.mk new file mode 100644 index 000000000000..373490aedcaa --- /dev/null +++ b/depends/packages/native_biplist.mk @@ -0,0 +1,20 @@ +package=native_biplist +$(package)_version=0.9 +$(package)_download_path=https://pypi.python.org/packages/source/b/biplist +$(package)_file_name=biplist-$($(package)_version).tar.gz +$(package)_sha256_hash=b57cadfd26e4754efdf89e9e37de87885f9b5c847b2615688ca04adfaf6ca604 +$(package)_install_libdir=$(build_prefix)/lib/python/dist-packages +$(package)_patches=sorted_list.patch + +define $(package)_preprocess_cmds + patch -p1 < $($(package)_patch_dir)/sorted_list.patch +endef + +define $(package)_build_cmds + python3 setup.py build +endef + +define $(package)_stage_cmds + mkdir -p $($(package)_install_libdir) && \ + python3 setup.py install --root=$($(package)_staging_dir) --prefix=$(build_prefix) --install-lib=$($(package)_install_libdir) +endef diff --git a/depends/packages/native_ccache.mk b/depends/packages/native_ccache.mk index 027174479ada..3be669dc47cb 100644 --- a/depends/packages/native_ccache.mk +++ b/depends/packages/native_ccache.mk @@ -1,8 +1,8 @@ package=native_ccache -$(package)_version=3.2.4 +$(package)_version=3.4.2 $(package)_download_path=https://samba.org/ftp/ccache $(package)_file_name=ccache-$($(package)_version).tar.bz2 -$(package)_sha256_hash=ffeb967edb549e67da0bd5f44f729a2022de9fdde65dfd80d2a7204d7f75332e +$(package)_sha256_hash=3aa5587793d4c790bd22999bfc678250c029307b3afb9d16f6f4a49c67b78fb3 define $(package)_set_vars $(package)_config_opts= diff --git a/depends/packages/native_cctools.mk b/depends/packages/native_cctools.mk index 1c1bcf199a0b..44d238cc4c2a 100644 --- a/depends/packages/native_cctools.mk +++ b/depends/packages/native_cctools.mk @@ -1,14 +1,14 @@ package=native_cctools -$(package)_version=ee31ae567931c426136c94aad457c7b51d844beb +$(package)_version=807d6fd1be5d2224872e381870c0a75387fe05e6 $(package)_download_path=https://github.com/theuni/cctools-port/archive $(package)_file_name=$($(package)_version).tar.gz -$(package)_sha256_hash=ef107e6ab1b3994cb22e14f4f5c59ea0c0b5a988e6b21d42ed9616b018bbcbf9 +$(package)_sha256_hash=a09c9ba4684670a0375e42d9d67e7f12c1f62581a27f28f7c825d6d7032ccc6a $(package)_build_subdir=cctools -$(package)_clang_version=3.3 +$(package)_clang_version=3.7.1 $(package)_clang_download_path=http://llvm.org/releases/$($(package)_clang_version) -$(package)_clang_download_file=clang+llvm-$($(package)_clang_version)-amd64-Ubuntu-12.04.2.tar.gz -$(package)_clang_file_name=clang-llvm-$($(package)_clang_version)-amd64-Ubuntu-12.04.2.tar.gz -$(package)_clang_sha256_hash=60d8f69f032d62ef61bf527857ebb933741ec3352d4d328c5516aa520662dab7 +$(package)_clang_download_file=clang+llvm-$($(package)_clang_version)-x86_64-linux-gnu-ubuntu-14.04.tar.xz +$(package)_clang_file_name=clang-llvm-$($(package)_clang_version)-x86_64-linux-gnu-ubuntu-14.04.tar.xz +$(package)_clang_sha256_hash=99b28a6b48e793705228a390471991386daa33a9717cd9ca007fcdde69608fd9 $(package)_extra_sources=$($(package)_clang_file_name) define $(package)_fetch_cmds @@ -17,8 +17,13 @@ $(call fetch_file,$(package),$($(package)_clang_download_path),$($(package)_clan endef define $(package)_extract_cmds + mkdir -p $($(package)_extract_dir) && \ + echo "$($(package)_sha256_hash) $($(package)_source)" > $($(package)_extract_dir)/.$($(package)_file_name).hash && \ + echo "$($(package)_clang_sha256_hash) $($(package)_source_dir)/$($(package)_clang_file_name)" >> $($(package)_extract_dir)/.$($(package)_file_name).hash && \ + $(build_SHA256SUM) -c $($(package)_extract_dir)/.$($(package)_file_name).hash && \ mkdir -p toolchain/bin toolchain/lib/clang/3.5/include && \ tar --strip-components=1 -C toolchain -xf $($(package)_source_dir)/$($(package)_clang_file_name) && \ + rm -f toolchain/lib/libc++abi.so* && \ echo "#!/bin/sh" > toolchain/bin/$(host)-dsymutil && \ echo "exit 0" >> toolchain/bin/$(host)-dsymutil && \ chmod +x toolchain/bin/$(host)-dsymutil && \ @@ -26,14 +31,15 @@ define $(package)_extract_cmds endef define $(package)_set_vars -$(package)_config_opts=--target=$(host) --disable-libuuid +$(package)_config_opts=--target=$(host) --disable-lto-support $(package)_ldflags+=-Wl,-rpath=\\$$$$$$$$\$$$$$$$$ORIGIN/../lib $(package)_cc=$($(package)_extract_dir)/toolchain/bin/clang $(package)_cxx=$($(package)_extract_dir)/toolchain/bin/clang++ endef define $(package)_preprocess_cmds - cd $($(package)_build_subdir); ./autogen.sh + cd $($(package)_build_subdir); ./autogen.sh && \ + sed -i.old "/define HAVE_PTHREADS/d" ld64/src/ld/InputFiles.h endef define $(package)_config_cmds @@ -49,10 +55,11 @@ define $(package)_stage_cmds cd $($(package)_extract_dir)/toolchain && \ mkdir -p $($(package)_staging_prefix_dir)/lib/clang/$($(package)_clang_version)/include && \ mkdir -p $($(package)_staging_prefix_dir)/bin $($(package)_staging_prefix_dir)/include && \ - cp -P bin/clang bin/clang++ $($(package)_staging_prefix_dir)/bin/ &&\ + cp bin/clang $($(package)_staging_prefix_dir)/bin/ &&\ + cp -P bin/clang++ $($(package)_staging_prefix_dir)/bin/ &&\ cp lib/libLTO.so $($(package)_staging_prefix_dir)/lib/ && \ cp -rf lib/clang/$($(package)_clang_version)/include/* $($(package)_staging_prefix_dir)/lib/clang/$($(package)_clang_version)/include/ && \ - cp bin/$(host)-dsymutil $($(package)_staging_prefix_dir)/bin && \ + cp bin/llvm-dsymutil $($(package)_staging_prefix_dir)/bin/$(host)-dsymutil && \ if `test -d include/c++/`; then cp -rf include/c++/ $($(package)_staging_prefix_dir)/include/; fi && \ if `test -d lib/c++/`; then cp -rf lib/c++/ $($(package)_staging_prefix_dir)/lib/; fi endef diff --git a/depends/packages/native_comparisontool.mk b/depends/packages/native_comparisontool.mk deleted file mode 100644 index e0ae0cec700e..000000000000 --- a/depends/packages/native_comparisontool.mk +++ /dev/null @@ -1,21 +0,0 @@ -package=native_comparisontool -$(package)_version=8c6666f -$(package)_download_path=https://github.com/theuni/bitcoind-comparisontool/raw/master -$(package)_file_name=pull-tests-$($(package)_version).jar -$(package)_sha256_hash=a865332b3827abcde684ab79f5f43c083b0b6a4c97ff5508c79f29fee24f11cd -$(package)_install_dirname=BitcoindComparisonTool_jar -$(package)_install_filename=BitcoindComparisonTool.jar - -define $(package)_extract_cmds -endef - -define $(package)_configure_cmds -endef - -define $(package)_build_cmds -endef - -define $(package)_stage_cmds - mkdir -p $($(package)_staging_prefix_dir)/share/$($(package)_install_dirname) && \ - cp $($(package)_source) $($(package)_staging_prefix_dir)/share/$($(package)_install_dirname)/$($(package)_install_filename) -endef diff --git a/depends/packages/native_ds_store.mk b/depends/packages/native_ds_store.mk new file mode 100644 index 000000000000..e2d035d480c9 --- /dev/null +++ b/depends/packages/native_ds_store.mk @@ -0,0 +1,17 @@ +package=native_ds_store +$(package)_version=1.1.0 +$(package)_download_path=https://bitbucket.org/al45tair/ds_store/get +$(package)_download_file=v$($(package)_version).tar.bz2 +$(package)_file_name=$(package)-$($(package)_version).tar.bz2 +$(package)_sha256_hash=921596764d71d1bbd3297a90ef6d286f718794d667e4f81d91d14053525d64c1 +$(package)_install_libdir=$(build_prefix)/lib/python/dist-packages +$(package)_dependencies=native_biplist + +define $(package)_build_cmds + python3 setup.py build +endef + +define $(package)_stage_cmds + mkdir -p $($(package)_install_libdir) && \ + python3 setup.py install --root=$($(package)_staging_dir) --prefix=$(build_prefix) --install-lib=$($(package)_install_libdir) +endef diff --git a/depends/packages/native_mac_alias.mk b/depends/packages/native_mac_alias.mk new file mode 100644 index 000000000000..9982a52a335c --- /dev/null +++ b/depends/packages/native_mac_alias.mk @@ -0,0 +1,21 @@ +package=native_mac_alias +$(package)_version=1.1.0 +$(package)_download_path=https://bitbucket.org/al45tair/mac_alias/get +$(package)_download_file=v$($(package)_version).tar.bz2 +$(package)_file_name=$(package)-$($(package)_version).tar.bz2 +$(package)_sha256_hash=87ad827e66790028361e43fc754f68ed041a9bdb214cca03c853f079b04fb120 +$(package)_install_libdir=$(build_prefix)/lib/python/dist-packages +$(package)_patches=python3.patch + +define $(package)_preprocess_cmds + patch -p1 < $($(package)_patch_dir)/python3.patch +endef + +define $(package)_build_cmds + python3 setup.py build +endef + +define $(package)_stage_cmds + mkdir -p $($(package)_install_libdir) && \ + python3 setup.py install --root=$($(package)_staging_dir) --prefix=$(build_prefix) --install-lib=$($(package)_install_libdir) +endef diff --git a/depends/packages/openssl.mk b/depends/packages/openssl.mk index fe6eb97dead0..5ee9f17a6323 100644 --- a/depends/packages/openssl.mk +++ b/depends/packages/openssl.mk @@ -6,9 +6,42 @@ $(package)_sha256_hash=8f9faeaebad088e772f4ef5e38252d472be4d878c6b3a2718c10a4fce define $(package)_set_vars $(package)_config_env=AR="$($(package)_ar)" RANLIB="$($(package)_ranlib)" CC="$($(package)_cc)" -$(package)_config_opts=--prefix=$(host_prefix) --openssldir=$(host_prefix)/etc/openssl no-zlib no-shared no-dso -$(package)_config_opts+=no-krb5 no-capieng no-dtls1 no-gost no-gmp no-heartbeats no-jpake no-md2 -$(package)_config_opts+=no-rc5 no-rdrand no-rfc3779 no-rsax no-sctp no-sha0 no-static_engine no-ssl2 no-ssl3 +$(package)_config_opts=--prefix=$(host_prefix) --openssldir=$(host_prefix)/etc/openssl +$(package)_config_opts+=no-camellia +$(package)_config_opts+=no-capieng +$(package)_config_opts+=no-cast +$(package)_config_opts+=no-comp +$(package)_config_opts+=no-dso +$(package)_config_opts+=no-dtls1 +$(package)_config_opts+=no-ec_nistp_64_gcc_128 +$(package)_config_opts+=no-gost +$(package)_config_opts+=no-gmp +$(package)_config_opts+=no-heartbeats +$(package)_config_opts+=no-idea +$(package)_config_opts+=no-jpake +$(package)_config_opts+=no-krb5 +$(package)_config_opts+=no-libunbound +$(package)_config_opts+=no-md2 +$(package)_config_opts+=no-mdc2 +$(package)_config_opts+=no-rc4 +$(package)_config_opts+=no-rc5 +$(package)_config_opts+=no-rdrand +$(package)_config_opts+=no-rfc3779 +$(package)_config_opts+=no-rsax +$(package)_config_opts+=no-sctp +$(package)_config_opts+=no-seed +$(package)_config_opts+=no-sha0 +$(package)_config_opts+=no-shared +$(package)_config_opts+=no-ssl-trace +$(package)_config_opts+=no-ssl2 +$(package)_config_opts+=no-ssl3 +$(package)_config_opts+=no-static_engine +$(package)_config_opts+=no-store +$(package)_config_opts+=no-unit-test +$(package)_config_opts+=no-weak-ssl-ciphers +$(package)_config_opts+=no-whirlpool +$(package)_config_opts+=no-zlib +$(package)_config_opts+=no-zlib-dynamic $(package)_config_opts+=$($(package)_cflags) $($(package)_cppflags) $(package)_config_opts_linux=-fPIC -Wa,--noexecstack $(package)_config_opts_x86_64_linux=linux-x86_64 diff --git a/depends/packages/packages.mk b/depends/packages/packages.mk index 02cc1884203a..5f3bf71a6299 100644 --- a/depends/packages/packages.mk +++ b/depends/packages/packages.mk @@ -1,20 +1,21 @@ -packages:=boost openssl libevent -darwin_packages:=zeromq -linux_packages:=zeromq -native_packages := native_ccache native_comparisontool +packages:=boost openssl libevent zeromq gmp +native_packages := native_ccache qt_native_packages = native_protobuf -qt_packages = qrencode protobuf +qt_packages = qrencode protobuf zlib + +qt_x86_64_linux_packages:=qt expat dbus libxcb xcb_proto libXau xproto freetype fontconfig libX11 xextproto libXext xtrans +qt_i686_linux_packages:=$(qt_x86_64_linux_packages) -qt_linux_packages= qt expat dbus libxcb xcb_proto libXau xproto freetype fontconfig libX11 xextproto libXext xtrans qt_darwin_packages=qt qt_mingw32_packages=qt - wallet_packages=bdb upnp_packages=miniupnpc +darwin_native_packages = native_biplist native_ds_store native_mac_alias + ifneq ($(build_os),darwin) -darwin_native_packages=native_cctools native_cdrkit native_libdmg-hfsplus +darwin_native_packages += native_cctools native_cdrkit native_libdmg-hfsplus endif diff --git a/depends/packages/qt.mk b/depends/packages/qt.mk index 84526d36fdfa..60374999573e 100644 --- a/depends/packages/qt.mk +++ b/depends/packages/qt.mk @@ -1,42 +1,65 @@ PACKAGE=qt -$(package)_version=5.5.0 -$(package)_download_path=http://download.qt.io/archive/qt/5.5/$($(package)_version)/submodules +$(package)_version=5.7.1 +$(package)_download_path=https://download.qt.io/archive/qt/5.7/$($(package)_version)/submodules $(package)_suffix=opensource-src-$($(package)_version).tar.gz $(package)_file_name=qtbase-$($(package)_suffix) -$(package)_sha256_hash=7e82b1318f88e56a2a9376e069aa608d4fd96b48cb0e1b880ae658b0a1af0561 -$(package)_dependencies=openssl -$(package)_linux_dependencies=freetype fontconfig dbus libxcb libX11 xproto libXext +$(package)_sha256_hash=95f83e532d23b3ddbde7973f380ecae1bac13230340557276f75f2e37984e410 +$(package)_dependencies=openssl zlib +$(package)_linux_dependencies=freetype fontconfig libxcb libX11 xproto libXext $(package)_build_subdir=qtbase $(package)_qt_libs=corelib network widgets gui plugins testlib -$(package)_patches=mac-qmake.conf fix-xcb-include-order.patch mingw-uuidof.patch pidlist_absolute.patch +$(package)_patches=mac-qmake.conf mingw-uuidof.patch pidlist_absolute.patch fix-xcb-include-order.patch +$(package)_patches+=fix_qt_configure.patch fix_qt_pkgconfig.patch fix-cocoahelpers-macos.patch qfixed-coretext.patch +# NOTE: fix_qt_configure.patch is only needed for Qt 5.7, newer versions don't have this issue. +# Remove it after bumping $(package)_version to 5.8+. $(package)_qttranslations_file_name=qttranslations-$($(package)_suffix) -$(package)_qttranslations_sha256_hash=c4bd6db6e426965c6f8824c54e81f68bbd61e2bae1bcadc328c6e81c45902a0d +$(package)_qttranslations_sha256_hash=3a15aebd523c6d89fb97b2d3df866c94149653a26d27a00aac9b6d3020bc5a1d $(package)_qttools_file_name=qttools-$($(package)_suffix) -$(package)_qttools_sha256_hash=d9e06bd19ecc86afba5e95d45a906d1bc1ad579aa70001e36143c1aaf695bdd6 +$(package)_qttools_sha256_hash=22d67de915cb8cd93e16fdd38fa006224ad9170bd217c2be1e53045a8dd02f0f + +#$(package)_qtwebsockets_file_name=qtwebsockets-$($(package)_suffix) +#$(package)_qtwebsockets_sha256_hash=d4159161f7d72e9364e05227e549e49b5fd70a8e95f4f46a45a5610e86faf0ba + +#$(package)_qtwebchannel_file_name=qtwebchannel-$($(package)_suffix) +#$(package)_qtwebchannel_sha256_hash=7aebd7d259fc4510b9519a158ea2959ef7843b94ad8b10678b9a7e9ffe388f42 $(package)_extra_sources = $($(package)_qttranslations_file_name) $(package)_extra_sources += $($(package)_qttools_file_name) +#$(package)_extra_sources += $($(package)_qtwebsockets_file_name) +#$(package)_extra_sources += $($(package)_qtwebchannel_file_name) define $(package)_set_vars $(package)_config_opts_release = -release -$(package)_config_opts_debug = -debug -$(package)_config_opts += -opensource -confirm-license +$(package)_config_opts_debug = -debug +$(package)_config_opts += -bindir $(build_prefix)/bin +$(package)_config_opts += -c++std c++11 +$(package)_config_opts += -confirm-license +$(package)_config_opts += -dbus-runtime +$(package)_config_opts += -hostprefix $(build_prefix) +$(package)_config_opts += -no-alsa $(package)_config_opts += -no-audio-backend +$(package)_config_opts += -no-cups +$(package)_config_opts += -no-egl +$(package)_config_opts += -no-eglfs +$(package)_config_opts += -no-feature-style-windowsmobile +$(package)_config_opts += -no-feature-style-windowsce +$(package)_config_opts += -no-freetype +$(package)_config_opts += -no-gif $(package)_config_opts += -no-glib +$(package)_config_opts += -no-gstreamer $(package)_config_opts += -no-icu -$(package)_config_opts += -no-cups $(package)_config_opts += -no-iconv -$(package)_config_opts += -no-gif -$(package)_config_opts += -no-freetype -$(package)_config_opts += -no-nis -$(package)_config_opts += -pch +$(package)_config_opts += -no-kms +$(package)_config_opts += -no-linuxfb +$(package)_config_opts += -no-libudev +$(package)_config_opts += -no-mitshm +$(package)_config_opts += -no-mtdev +$(package)_config_opts += -no-pulseaudio +$(package)_config_opts += -no-openvg +$(package)_config_opts += -no-reduce-relocations $(package)_config_opts += -no-qml-debug -$(package)_config_opts += -nomake examples -$(package)_config_opts += -nomake tests -$(package)_config_opts += -no-feature-style-windowsmobile -$(package)_config_opts += -no-feature-style-windowsce $(package)_config_opts += -no-sql-db2 $(package)_config_opts += -no-sql-ibase $(package)_config_opts += -no-sql-oci @@ -46,36 +69,27 @@ $(package)_config_opts += -no-sql-odbc $(package)_config_opts += -no-sql-psql $(package)_config_opts += -no-sql-sqlite $(package)_config_opts += -no-sql-sqlite2 -$(package)_config_opts += -prefix $(host_prefix) -$(package)_config_opts += -hostprefix $(build_prefix) -$(package)_config_opts += -bindir $(build_prefix)/bin -$(package)_config_opts += -c++11 +$(package)_config_opts += -no-use-gold-linker +$(package)_config_opts += -no-xinput2 +$(package)_config_opts += -no-xrender +$(package)_config_opts += -nomake examples +$(package)_config_opts += -nomake tests +$(package)_config_opts += -opensource $(package)_config_opts += -openssl-linked -$(package)_config_opts += -v -$(package)_config_opts += -static -$(package)_config_opts += -silent +$(package)_config_opts += -optimized-qmake +$(package)_config_opts += -pch $(package)_config_opts += -pkg-config +$(package)_config_opts += -prefix $(host_prefix) $(package)_config_opts += -qt-libpng $(package)_config_opts += -qt-libjpeg -$(package)_config_opts += -qt-zlib $(package)_config_opts += -qt-pcre -$(package)_config_opts += -no-pulseaudio -$(package)_config_opts += -no-openvg -$(package)_config_opts += -no-xrender -$(package)_config_opts += -no-alsa -$(package)_config_opts += -no-mtdev -$(package)_config_opts += -no-gstreamer -$(package)_config_opts += -no-mitshm -$(package)_config_opts += -no-kms -$(package)_config_opts += -no-reduce-relocations -$(package)_config_opts += -no-egl -$(package)_config_opts += -no-eglfs -$(package)_config_opts += -no-linuxfb -$(package)_config_opts += -no-xinput2 -$(package)_config_opts += -no-libudev -$(package)_config_opts += -no-use-gold-linker +$(package)_config_opts += -system-zlib $(package)_config_opts += -reduce-exports -$(package)_config_opts += -optimized-qmake +$(package)_config_opts += -static +$(package)_config_opts += -silent +$(package)_config_opts += -v +$(package)_config_opts += -no-feature-printer +$(package)_config_opts += -no-feature-printdialog ifneq ($(build_os),darwin) $(package)_config_opts_darwin = -xplatform macx-clang-linux @@ -108,8 +122,8 @@ endef define $(package)_extract_cmds mkdir -p $($(package)_extract_dir) && \ echo "$($(package)_sha256_hash) $($(package)_source)" > $($(package)_extract_dir)/.$($(package)_file_name).hash && \ - echo "$($(package)_qttranslations_sha256_hash) $($(package)_source_dir)/$($(package)_qttranslations_file_name)" > $($(package)_extract_dir)/.$($(package)_file_name).hash && \ - echo "$($(package)_qttools_sha256_hash) $($(package)_source_dir)/$($(package)_qttools_file_name)" > $($(package)_extract_dir)/.$($(package)_file_name).hash && \ + echo "$($(package)_qttranslations_sha256_hash) $($(package)_source_dir)/$($(package)_qttranslations_file_name)" >> $($(package)_extract_dir)/.$($(package)_file_name).hash && \ + echo "$($(package)_qttools_sha256_hash) $($(package)_source_dir)/$($(package)_qttools_file_name)" >> $($(package)_extract_dir)/.$($(package)_file_name).hash && \ $(build_SHA256SUM) -c $($(package)_extract_dir)/.$($(package)_file_name).hash && \ mkdir qtbase && \ tar --strip-components=1 -xf $($(package)_source) -C qtbase && \ @@ -119,32 +133,41 @@ define $(package)_extract_cmds tar --strip-components=1 -xf $($(package)_source_dir)/$($(package)_qttools_file_name) -C qttools endef + define $(package)_preprocess_cmds sed -i.old "s|updateqm.commands = \$$$$\$$$$LRELEASE|updateqm.commands = $($(package)_extract_dir)/qttools/bin/lrelease|" qttranslations/translations/translations.pro && \ + sed -i.old "/updateqm.depends =/d" qttranslations/translations/translations.pro && \ sed -i.old "s/src_plugins.depends = src_sql src_xml src_network/src_plugins.depends = src_xml src_network/" qtbase/src/src.pro && \ sed -i.old "s|X11/extensions/XIproto.h|X11/X.h|" qtbase/src/plugins/platforms/xcb/qxcbxsettings.cpp && \ sed -i.old 's/if \[ "$$$$XPLATFORM_MAC" = "yes" \]; then xspecvals=$$$$(macSDKify/if \[ "$$$$BUILD_ON_MAC" = "yes" \]; then xspecvals=$$$$(macSDKify/' qtbase/configure && \ + sed -i.old 's/CGEventCreateMouseEvent(0, kCGEventMouseMoved, pos, 0)/CGEventCreateMouseEvent(0, kCGEventMouseMoved, pos, kCGMouseButtonLeft)/' qtbase/src/plugins/platforms/cocoa/qcocoacursor.mm && \ mkdir -p qtbase/mkspecs/macx-clang-linux &&\ cp -f qtbase/mkspecs/macx-clang/Info.plist.lib qtbase/mkspecs/macx-clang-linux/ &&\ cp -f qtbase/mkspecs/macx-clang/Info.plist.app qtbase/mkspecs/macx-clang-linux/ &&\ cp -f qtbase/mkspecs/macx-clang/qplatformdefs.h qtbase/mkspecs/macx-clang-linux/ &&\ cp -f $($(package)_patch_dir)/mac-qmake.conf qtbase/mkspecs/macx-clang-linux/qmake.conf && \ - patch -p1 < $($(package)_patch_dir)/fix-xcb-include-order.patch && \ patch -p1 < $($(package)_patch_dir)/mingw-uuidof.patch && \ patch -p1 < $($(package)_patch_dir)/pidlist_absolute.patch && \ - echo "QMAKE_CFLAGS += $($(package)_cflags) $($(package)_cppflags)" >> qtbase/mkspecs/common/gcc-base.conf && \ - echo "QMAKE_CXXFLAGS += $($(package)_cxxflags) $($(package)_cppflags)" >> qtbase/mkspecs/common/gcc-base.conf && \ - echo "QMAKE_LFLAGS += $($(package)_ldflags)" >> qtbase/mkspecs/common/gcc-base.conf && \ - sed -i.old "s|QMAKE_CFLAGS = |QMAKE_CFLAGS = $($(package)_cflags) $($(package)_cppflags) |" qtbase/mkspecs/win32-g++/qmake.conf && \ - sed -i.old "s|QMAKE_LFLAGS = |QMAKE_LFLAGS = $($(package)_ldflags) |" qtbase/mkspecs/win32-g++/qmake.conf && \ - sed -i.old "s|QMAKE_CXXFLAGS = |QMAKE_CXXFLAGS = $($(package)_cxxflags) $($(package)_cppflags) |" qtbase/mkspecs/win32-g++/qmake.conf + patch -p1 < $($(package)_patch_dir)/fix-xcb-include-order.patch && \ + patch -p1 < $($(package)_patch_dir)/fix_qt_configure.patch && \ + patch -p1 < $($(package)_patch_dir)/fix_qt_pkgconfig.patch && \ + patch -p1 < $($(package)_patch_dir)/fix-cocoahelpers-macos.patch && \ + patch -p1 < $($(package)_patch_dir)/qfixed-coretext.patch && \ + echo "!host_build: QMAKE_CFLAGS += $($(package)_cflags) $($(package)_cppflags)" >> qtbase/mkspecs/common/gcc-base.conf && \ + echo "!host_build: QMAKE_CXXFLAGS += $($(package)_cxxflags) $($(package)_cppflags)" >> qtbase/mkspecs/common/gcc-base.conf && \ + echo "!host_build: QMAKE_LFLAGS += $($(package)_ldflags)" >> qtbase/mkspecs/common/gcc-base.conf && \ + sed -i.old "s|QMAKE_CFLAGS = |!host_build: QMAKE_CFLAGS = $($(package)_cflags) $($(package)_cppflags) |" qtbase/mkspecs/win32-g++/qmake.conf && \ + sed -i.old "s|QMAKE_LFLAGS = |!host_build: QMAKE_LFLAGS = $($(package)_ldflags) |" qtbase/mkspecs/win32-g++/qmake.conf && \ + sed -i.old "s|QMAKE_CXXFLAGS = |!host_build: QMAKE_CXXFLAGS = $($(package)_cxxflags) $($(package)_cppflags) |" qtbase/mkspecs/win32-g++/qmake.conf + endef define $(package)_config_cmds - export PKG_CONFIG_SYSROOT_DIR=/ && \ export PKG_CONFIG_LIBDIR=$(host_prefix)/lib/pkgconfig && \ export PKG_CONFIG_PATH=$(host_prefix)/share/pkgconfig && \ ./configure $($(package)_config_opts) && \ + echo "host_build: QT_CONFIG ~= s/system-zlib/zlib" >> mkspecs/qconfig.pri && \ + echo "CONFIG += force_bootstrap" >> mkspecs/qconfig.pri && \ $(MAKE) sub-src-clean && \ cd ../qttranslations && ../qtbase/bin/qmake qttranslations.pro -o Makefile && \ cd translations && ../../qtbase/bin/qmake translations.pro -o Makefile && cd ../.. &&\ diff --git a/depends/packages/qt46.mk b/depends/packages/qt46.mk deleted file mode 100644 index 8fb30a5c4471..000000000000 --- a/depends/packages/qt46.mk +++ /dev/null @@ -1,66 +0,0 @@ -PACKAGE=qt46 -$(package)_version=4.6.4 -$(package)_download_path=http://download.qt-project.org/archive/qt/4.6/ -$(package)_file_name=qt-everywhere-opensource-src-$($(package)_version).tar.gz -$(package)_sha256_hash=9ad4d46c721b53a429ed5a2eecfd3c239a9ab566562f183f99d3125f1a234250 -$(package)_dependencies=openssl freetype dbus libX11 xproto libXext libICE libSM -$(package)_patches=stlfix.patch - -define $(package)_set_vars -$(package)_config_opts = -prefix $(host_prefix) -headerdir $(host_prefix)/include/qt4 -bindir $(build_prefix)/bin -$(package)_config_opts += -release -no-separate-debug-info -opensource -confirm-license -$(package)_config_opts += -stl -qt-zlib - -$(package)_config_opts += -nomake examples -nomake tests -nomake tools -nomake translations -nomake demos -nomake docs -$(package)_config_opts += -no-audio-backend -no-glib -no-nis -no-cups -no-iconv -no-gif -no-pch -$(package)_config_opts += -no-xkb -no-xrender -no-xrandr -no-xfixes -no-xcursor -no-xinerama -no-xsync -no-xinput -no-mitshm -no-xshape -$(package)_config_opts += -no-libtiff -no-fontconfig -openssl-linked -$(package)_config_opts += -no-sql-db2 -no-sql-ibase -no-sql-oci -no-sql-tds -no-sql-mysql -$(package)_config_opts += -no-sql-odbc -no-sql-psql -no-sql-sqlite -no-sql-sqlite2 -$(package)_config_opts += -no-xmlpatterns -no-multimedia -no-phonon -no-scripttools -no-declarative -$(package)_config_opts += -no-phonon-backend -no-webkit -no-javascript-jit -no-script -$(package)_config_opts += -no-svg -no-libjpeg -no-libtiff -no-libpng -no-libmng -no-qt3support -no-opengl - -$(package)_config_opts_x86_64_linux += -platform linux-g++-64 -$(package)_config_opts_i686_linux = -platform linux-g++-32 -$(package)_build_env = QT_RCC_TEST=1 -endef - -define $(package)_preprocess_cmds - sed -i.old "s|/include /usr/include||" config.tests/unix/freetype/freetype.pri && \ - sed -i.old "s|src_plugins.depends = src_gui src_sql src_svg|src_plugins.depends = src_gui src_sql|" src/src.pro && \ - sed -i.old "s|\.lower(|\.toLower(|g" src/network/ssl/qsslsocket_openssl.cpp && \ - sed -i.old "s|Key_BackSpace|Key_Backspace|" src/gui/itemviews/qabstractitemview.cpp && \ - sed -i.old "s|/usr/X11R6/lib64|$(host_prefix)/lib|" mkspecs/*/*.conf && \ - sed -i.old "s|/usr/X11R6/lib|$(host_prefix)/lib|" mkspecs/*/*.conf && \ - sed -i.old "s|/usr/X11R6/include|$(host_prefix)/include|" mkspecs/*/*.conf && \ - sed -i.old "s|QMAKE_LFLAGS_SHLIB\t+= -shared|QMAKE_LFLAGS_SHLIB\t+= -shared -Wl,--exclude-libs,ALL|" mkspecs/common/g++.conf && \ - sed -i.old "/SSLv2_client_method/d" src/network/ssl/qsslsocket_openssl.cpp src/network/ssl/qsslsocket_openssl_symbols.cpp && \ - sed -i.old "/SSLv2_server_method/d" src/network/ssl/qsslsocket_openssl.cpp src/network/ssl/qsslsocket_openssl_symbols.cpp && \ - patch -p1 < $($(package)_patch_dir)/stlfix.patch -endef - -define $(package)_config_cmds - export PKG_CONFIG_SYSROOT_DIR=/ && \ - export PKG_CONFIG_LIBDIR=$(host_prefix)/lib/pkgconfig && \ - export PKG_CONFIG_PATH=$(host_prefix)/share/pkgconfig && \ - export CPATH=$(host_prefix)/include && \ - OPENSSL_LIBS='-L$(host_prefix)/lib -lssl -lcrypto' ./configure $($(package)_config_opts) && \ - cd tools/linguist/lrelease; ../../../bin/qmake -o Makefile lrelease.pro -endef - -define $(package)_build_cmds - export CPATH=$(host_prefix)/include && \ - $(MAKE) -C src && \ - $(MAKE) -C tools/linguist/lrelease -endef - -define $(package)_stage_cmds - $(MAKE) -C src INSTALL_ROOT=$($(package)_staging_dir) install && \ - $(MAKE) -C tools/linguist/lrelease INSTALL_ROOT=$($(package)_staging_dir) install -endef - -define $(package)_postprocess_cmds - rm -rf mkspecs/ lib/cmake/ lib/*.prl lib/*.la && \ - find native/bin -type f -exec mv {} {}-qt4 \; -endef diff --git a/depends/packages/zeromq.mk b/depends/packages/zeromq.mk index b3f18db05696..01146c26f69b 100644 --- a/depends/packages/zeromq.mk +++ b/depends/packages/zeromq.mk @@ -1,25 +1,32 @@ package=zeromq -$(package)_version=4.0.7 -$(package)_download_path=http://download.zeromq.org +$(package)_version=4.1.5 +$(package)_download_path=https://github.com/zeromq/zeromq4-1/releases/download/v$($(package)_version)/ $(package)_file_name=$(package)-$($(package)_version).tar.gz -$(package)_sha256_hash=e00b2967e074990d0538361cc79084a0a92892df2c6e7585da34e4c61ee47b03 +$(package)_sha256_hash=04aac57f081ffa3a2ee5ed04887be9e205df3a7ddade0027460b8042432bdbcf +$(package)_patches=9114d3957725acd34aa8b8d011585812f3369411.patch 9e6745c12e0b100cd38acecc16ce7db02905e27c.patch define $(package)_set_vars - $(package)_config_opts=--without-documentation --disable-shared + $(package)_config_opts=--without-documentation --disable-shared --without-libsodium --disable-curve $(package)_config_opts_linux=--with-pic $(package)_cxxflags=-std=c++11 endef +define $(package)_preprocess_cmds + patch -p1 < $($(package)_patch_dir)/9114d3957725acd34aa8b8d011585812f3369411.patch && \ + patch -p1 < $($(package)_patch_dir)/9e6745c12e0b100cd38acecc16ce7db02905e27c.patch && \ + ./autogen.sh +endef + define $(package)_config_cmds $($(package)_autoconf) endef define $(package)_build_cmds - $(MAKE) -C src + $(MAKE) libzmq.la endef define $(package)_stage_cmds - $(MAKE) -C src DESTDIR=$($(package)_staging_dir) install + $(MAKE) DESTDIR=$($(package)_staging_dir) install-libLTLIBRARIES install-includeHEADERS install-pkgconfigDATA endef define $(package)_postprocess_cmds diff --git a/depends/packages/zlib.mk b/depends/packages/zlib.mk new file mode 100644 index 000000000000..589490800f8b --- /dev/null +++ b/depends/packages/zlib.mk @@ -0,0 +1,27 @@ +package=zlib +$(package)_version=1.2.11 +$(package)_download_path=http://www.zlib.net +$(package)_file_name=$(package)-$($(package)_version).tar.gz +$(package)_sha256_hash=c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1 + +define $(package)_set_vars +$(package)_build_opts= CC="$($(package)_cc)" +$(package)_build_opts+=CFLAGS="$($(package)_cflags) $($(package)_cppflags) -fPIC" +$(package)_build_opts+=RANLIB="$($(package)_ranlib)" +$(package)_build_opts+=AR="$($(package)_ar)" +$(package)_build_opts_darwin+=AR="$($(package)_libtool)" +$(package)_build_opts_darwin+=ARFLAGS="-o" +endef + +define $(package)_config_cmds + ./configure --static --prefix=$(host_prefix) +endef + +define $(package)_build_cmds + $(MAKE) $($(package)_build_opts) libz.a +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install $($(package)_build_opts) +endef + diff --git a/depends/patches/boost/darwin_boost_atomic-1.patch b/depends/patches/boost/darwin_boost_atomic-1.patch deleted file mode 100644 index 97f59cb7e4ee..000000000000 --- a/depends/patches/boost/darwin_boost_atomic-1.patch +++ /dev/null @@ -1,35 +0,0 @@ -diff --git a/include/boost/atomic/detail/cas128strong.hpp b/include/boost/atomic/detail/cas128strong.hpp -index 906c13e..dcb4d7d 100644 ---- a/include/boost/atomic/detail/cas128strong.hpp -+++ b/include/boost/atomic/detail/cas128strong.hpp -@@ -196,15 +196,17 @@ class base_atomic - - public: - BOOST_DEFAULTED_FUNCTION(base_atomic(void), {}) -- explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(0) -+ explicit base_atomic(value_type const& v) BOOST_NOEXCEPT - { -+ memset(&v_, 0, sizeof(v_)); - memcpy(&v_, &v, sizeof(value_type)); - } - - void - store(value_type const& value, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT - { -- storage_type value_s = 0; -+ storage_type value_s; -+ memset(&value_s, 0, sizeof(value_s)); - memcpy(&value_s, &value, sizeof(value_type)); - platform_fence_before_store(order); - platform_store128(value_s, &v_); -@@ -247,7 +249,9 @@ class base_atomic - memory_order success_order, - memory_order failure_order) volatile BOOST_NOEXCEPT - { -- storage_type expected_s = 0, desired_s = 0; -+ storage_type expected_s, desired_s; -+ memset(&expected_s, 0, sizeof(expected_s)); -+ memset(&desired_s, 0, sizeof(desired_s)); - memcpy(&expected_s, &expected, sizeof(value_type)); - memcpy(&desired_s, &desired, sizeof(value_type)); - diff --git a/depends/patches/boost/darwin_boost_atomic-2.patch b/depends/patches/boost/darwin_boost_atomic-2.patch deleted file mode 100644 index ca50765200ec..000000000000 --- a/depends/patches/boost/darwin_boost_atomic-2.patch +++ /dev/null @@ -1,55 +0,0 @@ -diff --git a/include/boost/atomic/detail/gcc-atomic.hpp b/include/boost/atomic/detail/gcc-atomic.hpp -index a130590..4af99a1 100644 ---- a/include/boost/atomic/detail/gcc-atomic.hpp -+++ b/include/boost/atomic/detail/gcc-atomic.hpp -@@ -958,14 +958,16 @@ class base_atomic - - public: - BOOST_DEFAULTED_FUNCTION(base_atomic(void), {}) -- explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(0) -+ explicit base_atomic(value_type const& v) BOOST_NOEXCEPT - { -+ memset(&v_, 0, sizeof(v_)); - memcpy(&v_, &v, sizeof(value_type)); - } - - void store(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT - { -- storage_type tmp = 0; -+ storage_type tmp; -+ memset(&tmp, 0, sizeof(tmp)); - memcpy(&tmp, &v, sizeof(value_type)); - __atomic_store_n(&v_, tmp, atomics::detail::convert_memory_order_to_gcc(order)); - } -@@ -980,7 +982,8 @@ class base_atomic - - value_type exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT - { -- storage_type tmp = 0; -+ storage_type tmp; -+ memset(&tmp, 0, sizeof(tmp)); - memcpy(&tmp, &v, sizeof(value_type)); - tmp = __atomic_exchange_n(&v_, tmp, atomics::detail::convert_memory_order_to_gcc(order)); - value_type res; -@@ -994,7 +997,9 @@ class base_atomic - memory_order success_order, - memory_order failure_order) volatile BOOST_NOEXCEPT - { -- storage_type expected_s = 0, desired_s = 0; -+ storage_type expected_s, desired_s; -+ memset(&expected_s, 0, sizeof(expected_s)); -+ memset(&desired_s, 0, sizeof(desired_s)); - memcpy(&expected_s, &expected, sizeof(value_type)); - memcpy(&desired_s, &desired, sizeof(value_type)); - const bool success = __atomic_compare_exchange_n(&v_, &expected_s, desired_s, false, -@@ -1010,7 +1015,9 @@ class base_atomic - memory_order success_order, - memory_order failure_order) volatile BOOST_NOEXCEPT - { -- storage_type expected_s = 0, desired_s = 0; -+ storage_type expected_s, desired_s; -+ memset(&expected_s, 0, sizeof(expected_s)); -+ memset(&desired_s, 0, sizeof(desired_s)); - memcpy(&expected_s, &expected, sizeof(value_type)); - memcpy(&desired_s, &desired, sizeof(value_type)); - const bool success = __atomic_compare_exchange_n(&v_, &expected_s, desired_s, true, diff --git a/depends/patches/boost/gcc_5_no_cxx11.patch b/depends/patches/boost/gcc_5_no_cxx11.patch deleted file mode 100644 index 04514c593a10..000000000000 --- a/depends/patches/boost/gcc_5_no_cxx11.patch +++ /dev/null @@ -1,37 +0,0 @@ -From eec808554936ae068b23df07ab54d4dc6302a695 Mon Sep 17 00:00:00 2001 -From: jzmaddock -Date: Sat, 23 Aug 2014 09:38:02 +0100 -Subject: [PATCH] Fix BOOST_NO_CXX11_VARIADIC_TEMPLATES definition - the - feature was introduced in GCC 4.4. - ---- - include/boost/config/compiler/gcc.hpp | 9 +-------- - 1 file changed, 1 insertion(+), 8 deletions(-) - -diff --git a/include/boost/config/compiler/gcc.hpp b/include/boost/config/compiler/gcc.hpp -index f37159d..97d8a18 100644 ---- a/include/boost/config/compiler/gcc.hpp -+++ b/include/boost/config/compiler/gcc.hpp -@@ -154,14 +154,6 @@ - # define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS - # define BOOST_NO_CXX11_RVALUE_REFERENCES - # define BOOST_NO_CXX11_STATIC_ASSERT -- --// Variadic templates compiler: --// http://www.generic-programming.org/~dgregor/cpp/variadic-templates.html --# if defined(__VARIADIC_TEMPLATES) || (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4) && defined(__GXX_EXPERIMENTAL_CXX0X__)) --# define BOOST_HAS_VARIADIC_TMPL --# else --# define BOOST_NO_CXX11_VARIADIC_TEMPLATES --# endif - #endif - - // C++0x features in 4.4.n and later -@@ -176,6 +168,7 @@ - # define BOOST_NO_CXX11_DELETED_FUNCTIONS - # define BOOST_NO_CXX11_TRAILING_RESULT_TYPES - # define BOOST_NO_CXX11_INLINE_NAMESPACES -+# define BOOST_NO_CXX11_VARIADIC_TEMPLATES - #endif - - #if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 5) diff --git a/depends/patches/native_biplist/sorted_list.patch b/depends/patches/native_biplist/sorted_list.patch new file mode 100644 index 000000000000..89abdb1b71ff --- /dev/null +++ b/depends/patches/native_biplist/sorted_list.patch @@ -0,0 +1,29 @@ +--- a/biplist/__init__.py 2014-10-26 19:03:11.000000000 +0000 ++++ b/biplist/__init__.py 2016-07-19 19:30:17.663521999 +0000 +@@ -541,7 +541,7 @@ + return HashableWrapper(n) + elif isinstance(root, dict): + n = {} +- for key, value in iteritems(root): ++ for key, value in sorted(iteritems(root)): + n[self.wrapRoot(key)] = self.wrapRoot(value) + return HashableWrapper(n) + elif isinstance(root, list): +@@ -616,7 +616,7 @@ + elif isinstance(obj, dict): + size = proc_size(len(obj)) + self.incrementByteCount('dictBytes', incr=1+size) +- for key, value in iteritems(obj): ++ for key, value in sorted(iteritems(obj)): + check_key(key) + self.computeOffsets(key, asReference=True) + self.computeOffsets(value, asReference=True) +@@ -714,7 +714,7 @@ + keys = [] + values = [] + objectsToWrite = [] +- for key, value in iteritems(obj): ++ for key, value in sorted(iteritems(obj)): + keys.append(key) + values.append(value) + for key in keys: diff --git a/depends/patches/native_mac_alias/python3.patch b/depends/patches/native_mac_alias/python3.patch new file mode 100644 index 000000000000..1a32340be5b1 --- /dev/null +++ b/depends/patches/native_mac_alias/python3.patch @@ -0,0 +1,72 @@ +diff -dur a/mac_alias/alias.py b/mac_alias/alias.py +--- a/mac_alias/alias.py 2015-10-19 12:12:48.000000000 +0200 ++++ b/mac_alias/alias.py 2016-04-03 12:13:12.037159417 +0200 +@@ -243,10 +243,10 @@ + alias = Alias() + alias.appinfo = appinfo + +- alias.volume = VolumeInfo (volname.replace('/',':'), ++ alias.volume = VolumeInfo (volname.decode().replace('/',':'), + voldate, fstype, disktype, + volattrs, volfsid) +- alias.target = TargetInfo (kind, filename.replace('/',':'), ++ alias.target = TargetInfo (kind, filename.decode().replace('/',':'), + folder_cnid, cnid, + crdate, creator_code, type_code) + alias.target.levels_from = levels_from +@@ -261,9 +261,9 @@ + b.read(1) + + if tag == TAG_CARBON_FOLDER_NAME: +- alias.target.folder_name = value.replace('/',':') ++ alias.target.folder_name = value.decode().replace('/',':') + elif tag == TAG_CNID_PATH: +- alias.target.cnid_path = struct.unpack(b'>%uI' % (length // 4), ++ alias.target.cnid_path = struct.unpack('>%uI' % (length // 4), + value) + elif tag == TAG_CARBON_PATH: + alias.target.carbon_path = value +@@ -298,9 +298,9 @@ + alias.target.creation_date \ + = mac_epoch + datetime.timedelta(seconds=seconds) + elif tag == TAG_POSIX_PATH: +- alias.target.posix_path = value ++ alias.target.posix_path = value.decode() + elif tag == TAG_POSIX_PATH_TO_MOUNTPOINT: +- alias.volume.posix_path = value ++ alias.volume.posix_path = value.decode() + elif tag == TAG_RECURSIVE_ALIAS_OF_DISK_IMAGE: + alias.volume.disk_image_alias = Alias.from_bytes(value) + elif tag == TAG_USER_HOME_LENGTH_PREFIX: +@@ -422,13 +422,13 @@ + # (so doing so is ridiculous, and nothing could rely on it). + b.write(struct.pack(b'>h28pI2shI64pII4s4shhI2s10s', + self.target.kind, +- carbon_volname, voldate, ++ carbon_volname, int(voldate), + self.volume.fs_type, + self.volume.disk_type, + self.target.folder_cnid, + carbon_filename, + self.target.cnid, +- crdate, ++ int(crdate), + self.target.creator_code, + self.target.type_code, + self.target.levels_from, +@@ -449,12 +449,12 @@ + + b.write(struct.pack(b'>hhQhhQ', + TAG_HIGH_RES_VOLUME_CREATION_DATE, +- 8, long(voldate * 65536), ++ 8, int(voldate * 65536), + TAG_HIGH_RES_CREATION_DATE, +- 8, long(crdate * 65536))) ++ 8, int(crdate * 65536))) + + if self.target.cnid_path: +- cnid_path = struct.pack(b'>%uI' % len(self.target.cnid_path), ++ cnid_path = struct.pack('>%uI' % len(self.target.cnid_path), + *self.target.cnid_path) + b.write(struct.pack(b'>hh', TAG_CNID_PATH, + len(cnid_path))) diff --git a/depends/patches/qt/fix-cocoahelpers-macos.patch b/depends/patches/qt/fix-cocoahelpers-macos.patch new file mode 100644 index 000000000000..1b43a9eff8fe --- /dev/null +++ b/depends/patches/qt/fix-cocoahelpers-macos.patch @@ -0,0 +1,70 @@ +From 0707260a4f8e64dfadf1df5f935e74cabb7c7d27 Mon Sep 17 00:00:00 2001 +From: Jake Petroules +Date: Sun, 1 Oct 2017 21:48:17 -0700 +Subject: [PATCH] Fix build error with macOS 10.13 SDK +MIME-Version: 1.0 +Content-Type: text/plain; charset=utf8 +Content-Transfer-Encoding: 8bit + +Several of these variables/macros are no longer defined. We didn't +validate the preconditions on iOS, tvOS, or watchOS, so no +need to bother validating them on macOS either. Nor did we check the +OSStatus result on any platform anyways. + +Task-number: QTBUG-63401 +Change-Id: Ife64dff767cf6d3f4b839fc53ec486181c176bf3 +(cherry-picked from 861544583511d4e6f7745d2339b26ff1cd44132b) +Reviewed-by: Timur Pocheptsov +Reviewed-by: Tor Arne Vestbø +--- + src/plugins/platforms/cocoa/qcocoahelpers.h | 2 +- + src/plugins/platforms/cocoa/qcocoahelpers.mm | 13 +------------ + 2 files changed, 2 insertions(+), 13 deletions(-) + +diff --git old/qtbase/src/plugins/platforms/cocoa/qcocoahelpers.h new/qtbase/src/plugins/platforms/cocoa/qcocoahelpers.h +index bbb3793..74371d5 100644 +--- old/qtbase/src/plugins/platforms/cocoa/qcocoahelpers.h ++++ new/qtbase/src/plugins/platforms/cocoa/qcocoahelpers.h +@@ -80,7 +80,7 @@ QColor qt_mac_toQColor(CGColorRef color); + // Creates a mutable shape, it's the caller's responsibility to release. + HIMutableShapeRef qt_mac_QRegionToHIMutableShape(const QRegion ®ion); + +-OSStatus qt_mac_drawCGImage(CGContextRef inContext, const CGRect *inBounds, CGImageRef inImage); ++void qt_mac_drawCGImage(CGContextRef inContext, const CGRect *inBounds, CGImageRef inImage); + + NSDragOperation qt_mac_mapDropAction(Qt::DropAction action); + NSDragOperation qt_mac_mapDropActions(Qt::DropActions actions); +diff --git old/qtbase/src/plugins/platforms/cocoa/qcocoahelpers.mm new/qtbase/src/plugins/platforms/cocoa/qcocoahelpers.mm +index cd73148..3f8429e 100644 +--- old/qtbase/src/plugins/platforms/cocoa/qcocoahelpers.mm ++++ new/qtbase/src/plugins/platforms/cocoa/qcocoahelpers.mm +@@ -544,15 +544,8 @@ NSRect qt_mac_flipRect(const QRect &rect) + return NSMakeRect(rect.x(), flippedY, rect.width(), rect.height()); + } + +-OSStatus qt_mac_drawCGImage(CGContextRef inContext, const CGRect *inBounds, CGImageRef inImage) ++void qt_mac_drawCGImage(CGContextRef inContext, const CGRect *inBounds, CGImageRef inImage) + { +- // Verbatim copy if HIViewDrawCGImage (as shown on Carbon-Dev) +- OSStatus err = noErr; +- +- require_action(inContext != NULL, InvalidContext, err = paramErr); +- require_action(inBounds != NULL, InvalidBounds, err = paramErr); +- require_action(inImage != NULL, InvalidImage, err = paramErr); +- + CGContextSaveGState( inContext ); + CGContextTranslateCTM (inContext, 0, inBounds->origin.y + CGRectGetMaxY(*inBounds)); + CGContextScaleCTM(inContext, 1, -1); +@@ -560,10 +553,6 @@ OSStatus qt_mac_drawCGImage(CGContextRef inContext, const CGRect *inBounds, CGIm + CGContextDrawImage(inContext, *inBounds, inImage); + + CGContextRestoreGState(inContext); +-InvalidImage: +-InvalidBounds: +-InvalidContext: +- return err; + } + + Qt::MouseButton cocoaButton2QtButton(NSInteger buttonNum) +-- +2.7.4 diff --git a/depends/patches/qt/fix-xcb-include-order.patch b/depends/patches/qt/fix-xcb-include-order.patch index ae469ea94bff..ec2bc17d9bd9 100644 --- a/depends/patches/qt/fix-xcb-include-order.patch +++ b/depends/patches/qt/fix-xcb-include-order.patch @@ -1,45 +1,49 @@ ---- old/qtbase/src/plugins/platforms/xcb/xcb_qpa_lib.pro 2015-03-17 02:06:42.705930685 +0000 -+++ new/qtbase/src/plugins/platforms/xcb/xcb_qpa_lib.pro 2015-03-17 02:08:41.281926351 +0000 -@@ -94,8 +94,6 @@ - +--- old/qtbase/src/plugins/platforms/xcb/xcb_qpa_lib.pro 2015-03-17 ++++ new/qtbase/src/plugins/platforms/xcb/xcb_qpa_lib.pro 2015-03-17 +@@ -76,8 +76,6 @@ + DEFINES += $$QMAKE_DEFINES_XCB LIBS += $$QMAKE_LIBS_XCB -QMAKE_CXXFLAGS += $$QMAKE_CFLAGS_XCB -QMAKE_CFLAGS += $$QMAKE_CFLAGS_XCB - + CONFIG += qpa/genericunixfontdatabase - -@@ -104,7 +102,8 @@ + +@@ -89,7 +87,8 @@ contains(QT_CONFIG, xcb-qt) { DEFINES += XCB_USE_RENDER XCB_DIR = ../../../3rdparty/xcb - INCLUDEPATH += $$XCB_DIR/include $$XCB_DIR/sysinclude + QMAKE_CFLAGS += -I$$XCB_DIR/include -I$$XCB_DIR/sysinclude $$QMAKE_CFLAGS_XCB + QMAKE_CXXFLAGS += -I$$XCB_DIR/include -I$$XCB_DIR/sysinclude $$QMAKE_CFLAGS_XCB - LIBS += -lxcb -L$$OUT_PWD/xcb-static -lxcb-static + LIBS += -lxcb -L$$MODULE_BASE_OUTDIR/lib -lxcb-static$$qtPlatformTargetSuffix() } else { - LIBS += -lxcb -lxcb-image -lxcb-icccm -lxcb-sync -lxcb-xfixes -lxcb-shm -lxcb-randr -lxcb-shape -lxcb-keysyms ---- old/qtbase/src/plugins/platforms/xcb/xcb-static/xcb-static.pro 2015-03-17 02:07:04.641929383 +0000 -+++ new/qtbase/src/plugins/platforms/xcb/xcb-static/xcb-static.pro 2015-03-17 02:10:15.485922059 +0000 -@@ -8,7 +8,8 @@ - + LIBS += -lxcb -lxcb-image -lxcb-icccm -lxcb-sync -lxcb-xfixes -lxcb-shm -lxcb-randr -lxcb-shape -lxcb-keysyms -lxcb-xinerama +--- old/qtbase/src/plugins/platforms/xcb/xcb-static/xcb-static.pro ++++ new/qtbase/src/plugins/platforms/xcb/xcb-static/xcb-static.pro +@@ -9,7 +9,8 @@ + XCB_DIR = ../../../../3rdparty/xcb - + -INCLUDEPATH += $$XCB_DIR/include $$XCB_DIR/include/xcb $$XCB_DIR/sysinclude +QMAKE_CFLAGS += -I$$XCB_DIR/include -I$$XCB_DIR/include/xcb -I$$XCB_DIR/sysinclude +QMAKE_CXXFLAGS += -I$$XCB_DIR/include -I$$XCB_DIR/include/xcb -I$$XCB_DIR/sysinclude - + QMAKE_CXXFLAGS += $$QMAKE_CFLAGS_XCB QMAKE_CFLAGS += $$QMAKE_CFLAGS_XCB ---- old/qtbase/src/plugins/platforms/xcb/xcb-plugin.pro 2015-07-24 16:02:59.530038830 -0400 -+++ new/qtbase/src/plugins/platforms/xcb/xcb-plugin.pro 2015-07-24 16:01:22.106037459 -0400 -@@ -11,3 +11,9 @@ +--- old/qtbase/src/plugins/platforms/xcb/xcb-plugin.pro ++++ new/qtbase/src/plugins/platforms/xcb/xcb-plugin.pro +@@ -6,6 +6,13 @@ qxcbmain.cpp OTHER_FILES += xcb.json README - + +contains(QT_CONFIG, xcb-qt) { + DEFINES += XCB_USE_RENDER + XCB_DIR = ../../../3rdparty/xcb + QMAKE_CFLAGS += -I$$XCB_DIR/include -I$$XCB_DIR/sysinclude $$QMAKE_CFLAGS_XCB + QMAKE_CXXFLAGS += -I$$XCB_DIR/include -I$$XCB_DIR/sysinclude $$QMAKE_CFLAGS_XCB +} ++ + PLUGIN_TYPE = platforms + PLUGIN_CLASS_NAME = QXcbIntegrationPlugin + !equals(TARGET, $$QT_DEFAULT_QPA_PLUGIN): PLUGIN_EXTENDS = - diff --git a/depends/patches/qt/fix_qt_configure.patch b/depends/patches/qt/fix_qt_configure.patch new file mode 100644 index 000000000000..3466a6c24d79 --- /dev/null +++ b/depends/patches/qt/fix_qt_configure.patch @@ -0,0 +1,11 @@ +--- old/qtbase/configure ++++ new/qtbase/configure +@@ -2846,7 +2846,7 @@ + # with the system. We use 'xcrun' to check the clang version that's part of + # the Xcode installation. + XCRUN=`/usr/bin/xcrun -sdk macosx clang -v 2>&1` +- CLANGVERSION=`echo "$XCRUN" | sed -n 's/.*version \([0-9]\).*/\1/p'` ++ CLANGVERSION=`echo "$XCRUN" | sed -n 's/.*version \([0-9]*\).*/\1/p'` + expr "$CLANGVERSION" : '[0-9]' > /dev/null || { echo "Unable to determine CLANG version from output of xcrun: $XCRUN" ; exit 2 ; } + if [ "$CLANGVERSION" -ge 3 ]; then + PLATFORM=macx-clang diff --git a/depends/patches/qt/fix_qt_pkgconfig.patch b/depends/patches/qt/fix_qt_pkgconfig.patch new file mode 100644 index 000000000000..34302a9f2d2e --- /dev/null +++ b/depends/patches/qt/fix_qt_pkgconfig.patch @@ -0,0 +1,11 @@ +--- old/qtbase/mkspecs/features/qt_module.prf ++++ new/qtbase/mkspecs/features/qt_module.prf +@@ -245,7 +245,7 @@ + load(qt_targets) + + # this builds on top of qt_common +-!internal_module:!lib_bundle:if(unix|mingw) { ++unix|mingw { + CONFIG += create_pc + QMAKE_PKGCONFIG_DESTDIR = pkgconfig + host_build: \ diff --git a/depends/patches/qt/mac-qmake.conf b/depends/patches/qt/mac-qmake.conf index a6d0070cca64..ca70d30b15e9 100644 --- a/depends/patches/qt/mac-qmake.conf +++ b/depends/patches/qt/mac-qmake.conf @@ -1,6 +1,5 @@ MAKEFILE_GENERATOR = UNIX CONFIG += app_bundle incremental global_init_link_order lib_version_first plugin_no_soname absolute_library_soname -DEFINES += QT_NO_PRINTER QT_NO_PRINTDIALOG QMAKE_INCREMENTAL_STYLE = sublib include(../common/macx.conf) include(../common/gcc-base-mac.conf) @@ -11,14 +10,14 @@ QMAKE_XCODE_VERSION=4.3 QMAKE_XCODE_DEVELOPER_PATH=/Developer QMAKE_MACOSX_DEPLOYMENT_TARGET = $${MAC_MIN_VERSION} QMAKE_MAC_SDK=macosx -QMAKE_MAC_SDK.macosx.path = $${MAC_SDK_PATH} +QMAKE_MAC_SDK.macosx.Path = $${MAC_SDK_PATH} QMAKE_MAC_SDK.macosx.platform_name = macosx -QMAKE_MAC_SDK.macosx.version = $${MAC_SDK_VERSION} -QMAKE_MAC_SDK.macosx.platform_path = /phony -QMAKE_CFLAGS += -target $${MAC_TARGET} -QMAKE_OBJECTIVE_CFLAGS += $$QMAKE_CFLAGS -QMAKE_CXXFLAGS += $$QMAKE_CFLAGS -QMAKE_LFLAGS += -target $${MAC_TARGET} -mlinker-version=$${MAC_LD64_VERSION} +QMAKE_MAC_SDK.macosx.SDKVersion = $${MAC_SDK_VERSION} +QMAKE_MAC_SDK.macosx.PlatformPath = /phony +!host_build: QMAKE_CFLAGS += -target $${MAC_TARGET} +!host_build: QMAKE_OBJECTIVE_CFLAGS += $$QMAKE_CFLAGS +!host_build: QMAKE_CXXFLAGS += $$QMAKE_CFLAGS +!host_build: QMAKE_LFLAGS += -target $${MAC_TARGET} -mlinker-version=$${MAC_LD64_VERSION} QMAKE_AR = $${CROSS_COMPILE}ar cq QMAKE_RANLIB=$${CROSS_COMPILE}ranlib QMAKE_LIBTOOL=$${CROSS_COMPILE}libtool diff --git a/depends/patches/qt/mingw-uuidof.patch b/depends/patches/qt/mingw-uuidof.patch index 975366e61229..fb21923c8c36 100644 --- a/depends/patches/qt/mingw-uuidof.patch +++ b/depends/patches/qt/mingw-uuidof.patch @@ -1,6 +1,6 @@ ---- old/qtbase/src/plugins/platforms/windows/qwindowscontext.cpp 2015-06-20 17:40:20.956781548 -0400 -+++ new/qtbase/src/plugins/platforms/windows/qwindowscontext.cpp 2015-06-20 17:29:32.052772416 -0400 -@@ -69,7 +69,7 @@ +--- old/qtbase/src/plugins/platforms/windows/qwindowscontext.cpp ++++ new/qtbase/src/plugins/platforms/windows/qwindowscontext.cpp +@@ -77,7 +77,7 @@ #include #include #include @@ -9,8 +9,8 @@ # include #endif -@@ -762,7 +762,7 @@ - HWND_MESSAGE, NULL, (HINSTANCE)GetModuleHandle(0), NULL); +@@ -814,7 +814,7 @@ + HWND_MESSAGE, NULL, static_cast(GetModuleHandle(0)), NULL); } -#ifndef Q_OS_WINCE @@ -18,16 +18,16 @@ // Re-engineered from the inline function _com_error::ErrorMessage(). // We cannot use it directly since it uses swprintf_s(), which is not // present in the MSVCRT.DLL found on Windows XP (QTBUG-35617). -@@ -781,7 +781,7 @@ - return QStringLiteral("IDispatch error #") + QString::number(wCode); - return QStringLiteral("Unknown error 0x0") + QString::number(comError.Error(), 16); +@@ -833,7 +833,7 @@ + return QString::asprintf("IDispatch error #%u", uint(wCode)); + return QString::asprintf("Unknown error 0x0%x", uint(comError.Error())); } -#endif // !Q_OS_WINCE +#endif // !defined(Q_OS_WINCE) && (!defined(USE___UUIDOF) || (defined(USE___UUIDOF) && USE___UUIDOF == 1)) /*! \brief Common COM error strings. -@@ -846,12 +846,12 @@ +@@ -901,12 +901,12 @@ default: break; } diff --git a/depends/patches/qt/pidlist_absolute.patch b/depends/patches/qt/pidlist_absolute.patch index 0b49c050dcc1..c79282417905 100644 --- a/depends/patches/qt/pidlist_absolute.patch +++ b/depends/patches/qt/pidlist_absolute.patch @@ -1,7 +1,7 @@ diff -dur old/qtbase/src/plugins/platforms/windows/qwindowscontext.h new/qtbase/src/plugins/platforms/windows/qwindowscontext.h ---- old/qtbase/src/plugins/platforms/windows/qwindowscontext.h 2015-06-29 22:04:40.000000000 +0200 -+++ new/qtbase/src/plugins/platforms/windows/qwindowscontext.h 2015-11-01 12:55:59.751234846 +0100 -@@ -124,10 +124,18 @@ +--- old/qtbase/src/plugins/platforms/windows/qwindowscontext.h ++++ new/qtbase/src/plugins/platforms/windows/qwindowscontext.h +@@ -136,10 +136,18 @@ inline void init(); typedef HRESULT (WINAPI *SHCreateItemFromParsingName)(PCWSTR, IBindCtx *, const GUID&, void **); @@ -21,9 +21,9 @@ diff -dur old/qtbase/src/plugins/platforms/windows/qwindowscontext.h new/qtbase/ SHCreateItemFromParsingName sHCreateItemFromParsingName; SHGetKnownFolderIDList sHGetKnownFolderIDList; diff -dur old/qtbase/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp new/qtbase/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp ---- old/qtbase/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp 2015-06-29 22:04:40.000000000 +0200 -+++ new/qtbase/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp 2015-11-01 13:41:09.503149772 +0100 -@@ -1008,7 +1008,11 @@ +--- old/qtbase/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp ++++ new/qtbase/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp +@@ -1016,7 +1016,11 @@ qWarning() << __FUNCTION__ << ": Invalid CLSID: " << url.path(); return Q_NULLPTR; } diff --git a/depends/patches/qt/qfixed-coretext.patch b/depends/patches/qt/qfixed-coretext.patch new file mode 100644 index 000000000000..c5ad7d063237 --- /dev/null +++ b/depends/patches/qt/qfixed-coretext.patch @@ -0,0 +1,34 @@ +From dbdd5f0ffbce52c8b789ed09f1aa3f1da6c02e23 Mon Sep 17 00:00:00 2001 +From: Gabriel de Dietrich +Date: Fri, 30 Mar 2018 11:58:16 -0700 +Subject: [PATCH] QCoreTextFontEngine: Fix build with Xcode 9.3 + +Apple LLVM version 9.1.0 (clang-902.0.39.1) + +Error message: + +.../qfontengine_coretext.mm:827:20: error: qualified reference to + 'QFixed' is a constructor name rather than a type in this context + return QFixed::QFixed(int(CTFontGetUnitsPerEm(ctfont))); + +Change-Id: Iebe26b3b087a16b10664208fc8851cbddb47f043 +Reviewed-by: Konstantin Ritt +--- + src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git old/qtbase/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm new/qtbase/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm +index 25ff69d877d..98b753eff96 100644 +--- old/qtbase/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm ++++ new/qtbase/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm +@@ -824,7 +824,7 @@ void QCoreTextFontEngine::getUnscaledGlyph(glyph_t glyph, QPainterPath *path, gl + + QFixed QCoreTextFontEngine::emSquareSize() const + { +- return QFixed::QFixed(int(CTFontGetUnitsPerEm(ctfont))); ++ return QFixed(int(CTFontGetUnitsPerEm(ctfont))); + } + + QFontEngine *QCoreTextFontEngine::cloneWithSize(qreal pixelSize) const +-- +2.16.3 diff --git a/depends/patches/qt46/stlfix.patch b/depends/patches/qt46/stlfix.patch deleted file mode 100644 index f8f6fb04b0b7..000000000000 --- a/depends/patches/qt46/stlfix.patch +++ /dev/null @@ -1,10 +0,0 @@ ---- old/config.tests/unix/stl/stltest.cpp 2011-06-23 03:45:23.000000000 -0400 -+++ new/config.tests/unix/stl/stltest.cpp 2014-08-28 00:54:04.154837604 -0400 -@@ -49,6 +49,7 @@ - #include - #include - #include -+#include - - // something mean to see if the compiler and C++ standard lib are good enough - template diff --git a/depends/patches/zeromq/9114d3957725acd34aa8b8d011585812f3369411.patch b/depends/patches/zeromq/9114d3957725acd34aa8b8d011585812f3369411.patch new file mode 100644 index 000000000000..f704b3d94fda --- /dev/null +++ b/depends/patches/zeromq/9114d3957725acd34aa8b8d011585812f3369411.patch @@ -0,0 +1,22 @@ +From 9114d3957725acd34aa8b8d011585812f3369411 Mon Sep 17 00:00:00 2001 +From: Jeroen Ooms +Date: Tue, 20 Oct 2015 13:10:38 +0200 +Subject: [PATCH] enable static libraries on mingw + +--- + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/configure.ac b/configure.ac +index 393505b..e92131a 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -265,7 +265,7 @@ case "${host_os}" in + libzmq_dso_visibility="no" + + if test "x$enable_static" = "xyes"; then +- AC_MSG_ERROR([Building static libraries is not supported under MinGW32]) ++ CPPFLAGS="-DZMQ_STATIC" + fi + + # Set FD_SETSIZE to 1024 \ No newline at end of file diff --git a/depends/patches/zeromq/9e6745c12e0b100cd38acecc16ce7db02905e27c.patch b/depends/patches/zeromq/9e6745c12e0b100cd38acecc16ce7db02905e27c.patch new file mode 100644 index 000000000000..9aff2c179a19 --- /dev/null +++ b/depends/patches/zeromq/9e6745c12e0b100cd38acecc16ce7db02905e27c.patch @@ -0,0 +1,22 @@ +From 9e6745c12e0b100cd38acecc16ce7db02905e27c Mon Sep 17 00:00:00 2001 +From: David Millard +Date: Tue, 10 May 2016 13:53:53 -0700 +Subject: [PATCH] Fix autotools for static MinGW builds + +--- + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/configure.ac b/configure.ac +index 5a0fa14..def6ea7 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -259,7 +259,7 @@ case "${host_os}" in + libzmq_dso_visibility="no" + + if test "x$enable_static" = "xyes"; then +- CPPFLAGS="-DZMQ_STATIC" ++ CPPFLAGS="-DZMQ_STATIC $CPPFLAGS" + fi + + # Set FD_SETSIZE to 1024 \ No newline at end of file diff --git a/doc/man/Makefile.am b/doc/man/Makefile.am new file mode 100644 index 000000000000..61cdf2935059 --- /dev/null +++ b/doc/man/Makefile.am @@ -0,0 +1,13 @@ +dist_man1_MANS= + +if BUILD_BITCOIND + dist_man1_MANS+=paccoind.1 +endif + +if ENABLE_QT + dist_man1_MANS+=paccoin-qt.1 +endif + +if BUILD_BITCOIN_UTILS + dist_man1_MANS+=paccoin-cli.1 paccoin-tx.1 +endif diff --git a/doc/man/paccoin-cli.1 b/doc/man/paccoin-cli.1 new file mode 100644 index 000000000000..0be59195308c --- /dev/null +++ b/doc/man/paccoin-cli.1 @@ -0,0 +1,92 @@ +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.8. +.TH PACCOIN-CLI "1" "November 2018" "paccoin-cli v0.13.0.0" "User Commands" +.SH NAME +paccoin-cli \- manual page for paccoin-cli v0.13.0.0 +.SH DESCRIPTION +Paccoin Core RPC client version v0.13.0.0 +.SS "Usage:" +.TP +paccoin\-cli [options] [params] +Send command to Paccoin Core +.IP +paccoin\-cli [options] \fB\-named\fR [name=value] ... Send command to Paccoin Core (with named arguments) +paccoin\-cli [options] help List commands +paccoin\-cli [options] help Get help for a command +.SH OPTIONS +.HP +\-? +.IP +This help message +.HP +\fB\-conf=\fR +.IP +Specify configuration file (default: paccoin.conf) +.HP +\fB\-datadir=\fR +.IP +Specify data directory +.PP +Chain selection options: +.HP +\fB\-testnet\fR +.IP +Use the test chain +.HP +\fB\-devnet=\fR +.IP +Use devnet chain with provided name +.HP +\fB\-regtest\fR +.IP +Enter regression test mode, which uses a special chain in which blocks +can be solved instantly. This is intended for regression testing +tools and app development. +.HP +\fB\-named\fR +.IP +Pass named instead of positional arguments (default: false) +.HP +\fB\-rpcconnect=\fR +.IP +Send commands to node running on (default: 127.0.0.1) +.HP +\fB\-rpcport=\fR +.IP +Connect to JSON\-RPC on (default: 9998 or testnet: 19998) +.HP +\fB\-rpcwait\fR +.IP +Wait for RPC server to start +.HP +\fB\-rpcuser=\fR +.IP +Username for JSON\-RPC connections +.HP +\fB\-rpcpassword=\fR +.IP +Password for JSON\-RPC connections +.HP +\fB\-rpcclienttimeout=\fR +.IP +Timeout during HTTP requests (default: 900) +.HP +\fB\-stdin\fR +.IP +Read extra arguments from standard input, one per line until EOF/Ctrl\-D +(recommended for sensitive information such as passphrases) +.SH COPYRIGHT +Copyright (C) 2018-2019 The Paccoin Core developers +Copyright (C) 2014-2018 The Dash Core developers +Copyright (C) 2009-2018 The Bitcoin Core developers + +Please contribute if you find Paccoin Core useful. Visit for +further information about the software. +The source code is available from . + +This is experimental software. +Distributed under the MIT software license, see the accompanying file COPYING +or + +This product includes software developed by the OpenSSL Project for use in the +OpenSSL Toolkit and cryptographic software written by +Eric Young and UPnP software written by Thomas Bernard. diff --git a/doc/man/paccoin-qt.1 b/doc/man/paccoin-qt.1 new file mode 100644 index 000000000000..b51f86b508ec --- /dev/null +++ b/doc/man/paccoin-qt.1 @@ -0,0 +1,715 @@ +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.8. +.TH PACCOIN-QT "1" "November 2018" "paccoin-qt v0.13.0.0" "User Commands" +.SH NAME +paccoin-qt \- manual page for paccoin-qt v0.13.0.0 +.SH DESCRIPTION +Paccoin Core version v0.13.0.0 (64\-bit) +Usage: +.IP +paccoin\-qt [command\-line options] +.SH OPTIONS +.HP +\-? +.IP +Print this help message and exit +.HP +\fB\-version\fR +.IP +Print version and exit +.HP +\fB\-alerts\fR +.IP +Receive and display P2P network alerts (default: 1) +.HP +\fB\-alertnotify=\fR +.IP +Execute command when a relevant alert is received or we see a really +long fork (%s in cmd is replaced by message) +.HP +\fB\-blocknotify=\fR +.IP +Execute command when the best block changes (%s in cmd is replaced by +block hash) +.HP +\fB\-assumevalid=\fR +.IP +If this block is in the chain assume that it and its ancestors are valid +and potentially skip their script verification (0 to verify all, +default: +0000000000000024e26c7df7e46d673724d223cf4ca2b2adc21297cc095600f4, +testnet: +000000000118fa2f031efedf874adbe7fe6b023cdf9478e8e2400c2d505df30d) +.HP +\fB\-conf=\fR +.IP +Specify configuration file (default: paccoin.conf) +.HP +\fB\-datadir=\fR +.IP +Specify data directory +.HP +\fB\-dbcache=\fR +.IP +Set database cache size in megabytes (4 to 16384, default: 300) +.HP +\fB\-loadblock=\fR +.IP +Imports blocks from external blk000??.dat file on startup +.HP +\fB\-maxorphantx=\fR +.IP +Keep at most unconnectable transactions in memory (default: 100) +.HP +\fB\-maxmempool=\fR +.IP +Keep the transaction memory pool below megabytes (default: 300) +.HP +\fB\-mempoolexpiry=\fR +.IP +Do not keep transactions in the mempool longer than hours (default: +336) +.HP +\fB\-blockreconstructionextratxn=\fR +.IP +Extra transactions to keep in memory for compact block reconstructions +(default: 100) +.HP +\fB\-par=\fR +.IP +Set the number of script verification threads (\fB\-2\fR to 16, 0 = auto, <0 = +leave that many cores free, default: 0) +.HP +\fB\-pid=\fR +.IP +Specify pid file (default: paccoind.pid) +.HP +\fB\-prune=\fR +.IP +Reduce storage requirements by enabling pruning (deleting) of old +blocks. This allows the pruneblockchain RPC to be called to +delete specific blocks, and enables automatic pruning of old +blocks if a target size in MiB is provided. This mode is +incompatible with \fB\-txindex\fR and \fB\-rescan\fR. Warning: Reverting this +setting requires re\-downloading the entire blockchain. (default: +0 = disable pruning blocks, 1 = allow manual pruning via RPC, +>945 = automatically prune block files to stay under the +specified target size in MiB) +.HP +\fB\-reindex\-chainstate\fR +.IP +Rebuild chain state from the currently indexed blocks +.HP +\fB\-reindex\fR +.IP +Rebuild chain state and block index from the blk*.dat files on disk +.HP +\fB\-sysperms\fR +.IP +Create new files with system default permissions, instead of umask 077 +(only effective with disabled wallet functionality) +.HP +\fB\-txindex\fR +.IP +Maintain a full transaction index, used by the getrawtransaction rpc +call (default: 1) +.HP +\fB\-addressindex\fR +.IP +Maintain a full address index, used to query for the balance, txids and +unspent outputs for addresses (default: 0) +.HP +\fB\-timestampindex\fR +.IP +Maintain a timestamp index for block hashes, used to query blocks hashes +by a range of timestamps (default: 0) +.HP +\fB\-spentindex\fR +.IP +Maintain a full spent index, used to query the spending txid and input +index for an outpoint (default: 0) +.PP +Connection options: +.HP +\fB\-addnode=\fR +.IP +Add a node to connect to and attempt to keep the connection open +.HP +\fB\-allowprivatenet\fR +.IP +Allow RFC1918 addresses to be relayed and connected to (default: 0) +.HP +\fB\-banscore=\fR +.IP +Threshold for disconnecting misbehaving peers (default: 100) +.HP +\fB\-bantime=\fR +.IP +Number of seconds to keep misbehaving peers from reconnecting (default: +86400) +.HP +\fB\-bind=\fR +.IP +Bind to given address and always listen on it. Use [host]:port notation +for IPv6 +.HP +\fB\-connect=\fR +.IP +Connect only to the specified node(s); \fB\-noconnect\fR or \fB\-connect\fR=\fI\,0\/\fR alone to +disable automatic connections +.HP +\fB\-discover\fR +.IP +Discover own IP addresses (default: 1 when listening and no \fB\-externalip\fR +or \fB\-proxy\fR) +.HP +\fB\-dns\fR +.IP +Allow DNS lookups for \fB\-addnode\fR, \fB\-seednode\fR and \fB\-connect\fR (default: 1) +.HP +\fB\-dnsseed\fR +.IP +Query for peer addresses via DNS lookup, if low on addresses (default: 1 +unless \fB\-connect\fR/\-noconnect) +.HP +\fB\-externalip=\fR +.IP +Specify your own public address +.HP +\fB\-forcednsseed\fR +.IP +Always query for peer addresses via DNS lookup (default: 0) +.HP +\fB\-listen\fR +.IP +Accept connections from outside (default: 1 if no \fB\-proxy\fR or +\fB\-connect\fR/\-noconnect) +.HP +\fB\-listenonion\fR +.IP +Automatically create Tor hidden service (default: 1) +.HP +\fB\-maxconnections=\fR +.IP +Maintain at most connections to peers (temporary service connections +excluded) (default: 125) +.HP +\fB\-maxreceivebuffer=\fR +.IP +Maximum per\-connection receive buffer, *1000 bytes (default: 5000) +.HP +\fB\-maxsendbuffer=\fR +.IP +Maximum per\-connection send buffer, *1000 bytes (default: 1000) +.HP +\fB\-maxtimeadjustment\fR +.IP +Maximum allowed median peer time offset adjustment. Local perspective of +time may be influenced by peers forward or backward by this +amount. (default: 4200 seconds) +.HP +\fB\-onion=\fR +.IP +Use separate SOCKS5 proxy to reach peers via Tor hidden services +(default: \fB\-proxy\fR) +.HP +\fB\-onlynet=\fR +.IP +Only connect to nodes in network (ipv4, ipv6 or onion) +.HP +\fB\-permitbaremultisig\fR +.IP +Relay non\-P2SH multisig (default: 1) +.HP +\fB\-peerbloomfilters\fR +.IP +Support filtering of blocks and transaction with bloom filters (default: +1) +.HP +\fB\-port=\fR +.IP +Listen for connections on (default: 9999 or testnet: 19999) +.HP +\fB\-proxy=\fR +.IP +Connect through SOCKS5 proxy +.HP +\fB\-proxyrandomize\fR +.IP +Randomize credentials for every proxy connection. This enables Tor +stream isolation (default: 1) +.HP +\fB\-seednode=\fR +.IP +Connect to a node to retrieve peer addresses, and disconnect +.HP +\fB\-timeout=\fR +.IP +Specify connection timeout in milliseconds (minimum: 1, default: 5000) +.HP +\fB\-torcontrol=\fR: +.IP +Tor control port to use if onion listening enabled (default: +127.0.0.1:9051) +.HP +\fB\-torpassword=\fR +.IP +Tor control port password (default: empty) +.HP +\fB\-upnp\fR +.IP +Use UPnP to map the listening port (default: 0) +.HP +\fB\-whitebind=\fR +.IP +Bind to given address and whitelist peers connecting to it. Use +[host]:port notation for IPv6 +.HP +\fB\-whitelist=\fR +.IP +Whitelist peers connecting from the given IP address (e.g. 1.2.3.4) or +CIDR notated network (e.g. 1.2.3.0/24). Can be specified multiple +times. Whitelisted peers cannot be DoS banned and their +transactions are always relayed, even if they are already in the +mempool, useful e.g. for a gateway +.HP +\fB\-whitelistrelay\fR +.IP +Accept relayed transactions received from whitelisted peers even when +not relaying transactions (default: 1) +.HP +\fB\-whitelistforcerelay\fR +.IP +Force relay of transactions from whitelisted peers even if they violate +local relay policy (default: 1) +.HP +\fB\-maxuploadtarget=\fR +.IP +Tries to keep outbound traffic under the given target (in MiB per 24h), +0 = no limit (default: 0) +.PP +Wallet options: +.HP +\fB\-disablewallet\fR +.IP +Do not load the wallet and disable wallet RPC calls +.HP +\fB\-keypool=\fR +.IP +Set key pool size to (default: 1000) +.HP +\fB\-fallbackfee=\fR +.IP +A fee rate (in PAC/kB) that will be used when fee estimation has +insufficient data (default: 0.00001) +.HP +\fB\-mintxfee=\fR +.IP +Fees (in PAC/kB) smaller than this are considered zero fee for +transaction creation (default: 0.00001) +.HP +\fB\-paytxfee=\fR +.IP +Fee (in PAC/kB) to add to transactions you send (default: 0.00) +.HP +\fB\-rescan\fR +.IP +Rescan the block chain for missing wallet transactions on startup +.HP +\fB\-salvagewallet\fR +.IP +Attempt to recover private keys from a corrupt wallet on startup +.HP +\fB\-spendzeroconfchange\fR +.IP +Spend unconfirmed change when sending transactions (default: 1) +.HP +\fB\-txconfirmtarget=\fR +.IP +If paytxfee is not set, include enough fee so transactions begin +confirmation on average within n blocks (default: 6) +.HP +\fB\-usehd\fR +.IP +Use hierarchical deterministic key generation (HD) after BIP39/BIP44. +Only has effect during wallet creation/first start (default: 0) +.HP +\fB\-mnemonic\fR +.IP +User defined mnemonic for HD wallet (bip39). Only has effect during +wallet creation/first start (default: randomly generated) +.HP +\fB\-mnemonicpassphrase\fR +.IP +User defined mnemonic passphrase for HD wallet (BIP39). Only has effect +during wallet creation/first start (default: empty string) +.HP +\fB\-hdseed\fR +.IP +User defined seed for HD wallet (should be in hex). Only has effect +during wallet creation/first start (default: randomly generated) +.HP +\fB\-upgradewallet\fR +.IP +Upgrade wallet to latest format on startup +.HP +\fB\-wallet=\fR +.IP +Specify wallet file (within data directory) (default: wallet.dat) +.HP +\fB\-walletbroadcast\fR +.IP +Make the wallet broadcast transactions (default: 1) +.HP +\fB\-walletnotify=\fR +.IP +Execute command when a wallet transaction changes (%s in cmd is replaced +by TxID) +.HP +\fB\-zapwallettxes=\fR +.IP +Delete all wallet transactions and only recover those parts of the +blockchain through \fB\-rescan\fR on startup (1 = keep tx meta data e.g. +account owner and payment request information, 2 = drop tx meta +data) +.HP +\fB\-createwalletbackups=\fR +.IP +Number of automatic wallet backups (default: 10) +.HP +\fB\-walletbackupsdir=\fR +.IP +Specify full path to directory for automatic wallet backups (must exist) +.HP +\fB\-keepass\fR +.IP +Use KeePass 2 integration using KeePassHttp plugin (default: 0) +.HP +\fB\-keepassport=\fR +.IP +Connect to KeePassHttp on port (default: 19455) +.HP +\fB\-keepasskey=\fR +.IP +KeePassHttp key for AES encrypted communication with KeePass +.HP +\fB\-keepassid=\fR +.IP +KeePassHttp id for the established association +.HP +\fB\-keepassname=\fR +.IP +Name to construct url for KeePass entry that stores the wallet +passphrase +.HP +\fB\-windowtitle=\fR +.IP +Wallet window title +.PP +ZeroMQ notification options: +.HP +\fB\-zmqpubhashblock=\fR
+.IP +Enable publish hash block in
+.HP +\fB\-zmqpubhashtx=\fR
+.IP +Enable publish hash transaction in
+.HP +\fB\-zmqpubhashtxlock=\fR
+.IP +Enable publish hash transaction (locked via InstantSend) in
+.HP +\fB\-zmqpubhashgovernancevote=\fR
+.IP +Enable publish hash of governance votes in
+.HP +\fB\-zmqpubhashgovernanceobject=\fR
+.IP +Enable publish hash of governance objects (like proposals) in
+.HP +\fB\-zmqpubhashinstantsenddoublespend=\fR
+.IP +Enable publish transaction hashes of attempted InstantSend double spend +in
+.HP +\fB\-zmqpubrawblock=\fR
+.IP +Enable publish raw block in
+.HP +\fB\-zmqpubrawtx=\fR
+.IP +Enable publish raw transaction in
+.HP +\fB\-zmqpubrawtxlock=\fR
+.IP +Enable publish raw transaction (locked via InstantSend) in
+.HP +\fB\-zmqpubrawinstantsenddoublespend=\fR
+.IP +Enable publish raw transactions of attempted InstantSend double spend in +
+.PP +Debugging/Testing options: +.HP +\fB\-uacomment=\fR +.IP +Append comment to the user agent string +.HP +\fB\-debug=\fR +.IP +Output debugging information (default: 0, supplying is +optional). If is not supplied or if = 1, +output all debugging information. can be: addrman, +alert, bench, cmpctblock, coindb, db, http, leveldb, libevent, +lock, mempool, mempoolrej, net, proxy, prune, rand, reindex, rpc, +selectcoins, tor, zmq, paccoin (or specifically: gobject, +instantsend, keepass, masternode, mnpayments, mnsync, +privatesend, spork), qt. +.HP +\fB\-help\-debug\fR +.IP +Show all debugging options (usage: \fB\-\-help\fR \fB\-help\-debug\fR) +.HP +\fB\-logips\fR +.IP +Include IP addresses in debug output (default: 0) +.HP +\fB\-logtimestamps\fR +.IP +Prepend debug output with timestamp (default: 1) +.HP +\fB\-minrelaytxfee=\fR +.IP +Fees (in PAC/kB) smaller than this are considered zero fee for +relaying, mining and transaction creation (default: 0.00001) +.HP +\fB\-maxtxfee=\fR +.IP +Maximum total fees (in PAC) to use in a single wallet transaction or +raw transaction; setting this too low may abort large +transactions (default: 0.10) +.HP +\fB\-printtoconsole\fR +.IP +Send trace/debug info to console instead of debug.log file +.HP +\fB\-printtodebuglog\fR +.IP +Send trace/debug info to debug.log file (default: 1) +.HP +\fB\-shrinkdebugfile\fR +.IP +Shrink debug.log file on client startup (default: 1 when no \fB\-debug\fR) +.PP +Chain selection options: +.HP +\fB\-testnet\fR +.IP +Use the test chain +.HP +\fB\-devnet=\fR +.IP +Use devnet chain with provided name +.HP +\fB\-litemode=\fR +.IP +Disable all Paccoin specific functionality (Masternodes, PrivateSend, +InstantSend, Governance) (0\-1, default: 0) +.HP +\fB\-sporkaddr=\fR +.IP +Override spork address. Only useful for regtest and devnet. Using this +on mainnet or testnet will ban you. +.HP +\fB\-minsporkkeys=\fR +.IP +Overrides minimum spork signers to change spork value. Only useful for +regtest and devnet. Using this on mainnet or testnet will ban +you. +.PP +Masternode options: +.HP +\fB\-masternode=\fR +.IP +Enable the client to act as a masternode (0\-1, default: 0) +.HP +\fB\-mnconf=\fR +.IP +Specify masternode configuration file (default: masternode.conf) +.HP +\fB\-mnconflock=\fR +.IP +Lock masternodes from masternode configuration file (default: 1) +.HP +\fB\-masternodeprivkey=\fR +.IP +Set the masternode private key +.PP +PrivateSend options: +.HP +\fB\-enableprivatesend=\fR +.IP +Enable use of automated PrivateSend for funds stored in this wallet +(0\-1, default: 0) +.HP +\fB\-privatesendmultisession=\fR +.IP +Enable multiple PrivateSend mixing sessions per block, experimental +(0\-1, default: 0) +.HP +\fB\-privatesendsessions=\fR +.IP +Use N separate masternodes in parallel to mix funds (1\-10, default: 4) +.HP +\fB\-privatesendrounds=\fR +.IP +Use N separate masternodes for each denominated input to mix funds +(2\-16, default: 4) +.HP +\fB\-privatesendamount=\fR +.IP +Keep N PAC anonymized (2\-21000000, default: 1000) +.HP +\fB\-liquidityprovider=\fR +.IP +Provide liquidity to PrivateSend by infrequently mixing coins on a +continual basis (0\-100, default: 0, 1=very frequent, high fees, +100=very infrequent, low fees) +.PP +InstantSend options: +.HP +\fB\-enableinstantsend=\fR +.IP +Enable InstantSend, show confirmations for locked transactions (0\-1, +default: 1) +.HP +\fB\-instantsendnotify=\fR +.IP +Execute command when a wallet InstantSend transaction is successfully +locked (%s in cmd is replaced by TxID) +.PP +Node relay options: +.HP +\fB\-bytespersigop\fR +.IP +Minimum bytes per sigop in transactions we relay and mine (default: 20) +.HP +\fB\-datacarrier\fR +.IP +Relay and mine data carrier transactions (default: 1) +.HP +\fB\-datacarriersize\fR +.IP +Maximum size of data in data carrier transactions we relay and mine +(default: 83) +.PP +Block creation options: +.HP +\fB\-blockmaxsize=\fR +.IP +Set maximum block size in bytes (default: 2000000) +.HP +\fB\-blockprioritysize=\fR +.IP +Set maximum size of high\-priority/low\-fee transactions in bytes +(default: 10000) +.HP +\fB\-blockmintxfee=\fR +.IP +Set lowest fee rate (in PAC/kB) for transactions to be included in +block creation. (default: 0.00001) +.PP +RPC server options: +.HP +\fB\-server\fR +.IP +Accept command line and JSON\-RPC commands +.HP +\fB\-rest\fR +.IP +Accept public REST requests (default: 0) +.HP +\fB\-rpcbind=\fR +.IP +Bind to given address to listen for JSON\-RPC connections. Use +[host]:port notation for IPv6. This option can be specified +multiple times (default: bind to all interfaces) +.HP +\fB\-rpccookiefile=\fR +.IP +Location of the auth cookie (default: data dir) +.HP +\fB\-rpcuser=\fR +.IP +Username for JSON\-RPC connections +.HP +\fB\-rpcpassword=\fR +.IP +Password for JSON\-RPC connections +.HP +\fB\-rpcauth=\fR +.IP +Username and hashed password for JSON\-RPC connections. The field + comes in the format: :$. A +canonical python script is included in share/rpcuser. The client +then connects normally using the +rpcuser=/rpcpassword= pair of arguments. This +option can be specified multiple times +.HP +\fB\-rpcport=\fR +.IP +Listen for JSON\-RPC connections on (default: 9998 or testnet: +19998) +.HP +\fB\-rpcallowip=\fR +.IP +Allow JSON\-RPC connections from specified source. Valid for are a +single IP (e.g. 1.2.3.4), a network/netmask (e.g. +1.2.3.4/255.255.255.0) or a network/CIDR (e.g. 1.2.3.4/24). This +option can be specified multiple times +.HP +\fB\-rpcthreads=\fR +.IP +Set the number of threads to service RPC calls (default: 4) +.PP +UI Options: +.HP +\fB\-choosedatadir\fR +.IP +Choose data directory on startup (default: 0) +.HP +\fB\-lang=\fR +.IP +Set language, for example "de_DE" (default: system locale) +.HP +\fB\-min\fR +.IP +Start minimized +.HP +\fB\-rootcertificates=\fR +.IP +Set SSL root certificates for payment request (default: \fB\-system\-\fR) +.HP +\fB\-splash\fR +.IP +Show splash screen on startup (default: 1) +.HP +\fB\-resetguisettings\fR +.IP +Reset all settings changed in the GUI +.SH COPYRIGHT +Copyright (C) 2018-2019 The Paccoin Core developers +Copyright (C) 2014-2018 The Dash Core developers +Copyright (C) 2009-2018 The Bitcoin Core developers + +Please contribute if you find Paccoin Core useful. Visit for +further information about the software. +The source code is available from . + +This is experimental software. +Distributed under the MIT software license, see the accompanying file COPYING +or + +This product includes software developed by the OpenSSL Project for use in the +OpenSSL Toolkit and cryptographic software written by +Eric Young and UPnP software written by Thomas Bernard. diff --git a/doc/man/paccoin-tx.1 b/doc/man/paccoin-tx.1 new file mode 100644 index 000000000000..1ad1e78a9bc0 --- /dev/null +++ b/doc/man/paccoin-tx.1 @@ -0,0 +1,125 @@ +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.8. +.TH PACCOIN-TX "1" "November 2018" "paccoin-tx v0.13.0.0" "User Commands" +.SH NAME +paccoin-tx \- manual page for paccoin-tx v0.13.0.0 +.SH DESCRIPTION +Paccoin Core paccoin\-tx utility version v0.13.0.0 +.SS "Usage:" +.TP +paccoin\-tx [options] [commands] +Update hex\-encoded paccoin transaction +.TP +paccoin\-tx [options] \fB\-create\fR [commands] +Create hex\-encoded paccoin transaction +.SH OPTIONS +.HP +\-? +.IP +This help message +.HP +\fB\-create\fR +.IP +Create new, empty TX. +.HP +\fB\-json\fR +.IP +Select JSON output +.HP +\fB\-txid\fR +.IP +Output only the hex\-encoded transaction id of the resultant transaction. +.PP +Chain selection options: +.HP +\fB\-testnet\fR +.IP +Use the test chain +.HP +\fB\-devnet=\fR +.IP +Use devnet chain with provided name +.HP +\fB\-regtest\fR +.IP +Enter regression test mode, which uses a special chain in which blocks +can be solved instantly. This is intended for regression testing +tools and app development. +.PP +Commands: +.IP +delin=N +.IP +Delete input N from TX +.IP +delout=N +.IP +Delete output N from TX +.IP +in=TXID:VOUT(:SEQUENCE_NUMBER) +.IP +Add input to TX +.IP +locktime=N +.IP +Set TX lock time to N +.IP +nversion=N +.IP +Set TX version to N +.IP +outaddr=VALUE:ADDRESS +.IP +Add address\-based output to TX +.IP +outpubkey=VALUE:PUBKEY[:FLAGS] +.IP +Add pay\-to\-pubkey output to TX. Optionally add the "S" flag to wrap the +output in a pay\-to\-script\-hash. +.IP +outdata=[VALUE:]DATA +.IP +Add data\-based output to TX +.IP +outscript=VALUE:SCRIPT[:FLAGS] +.IP +Add raw script output to TX. Optionally add the "S" flag to wrap the +output in a pay\-to\-script\-hash. +.IP +outmultisig=VALUE:REQUIRED:PUBKEYS:PUBKEY1:PUBKEY2:....[:FLAGS] +.IP +Add Pay To n\-of\-m Multi\-sig output to TX. n = REQUIRED, m = PUBKEYS. +Optionally add the "S" flag to wrap the output in a +pay\-to\-script\-hash. +.IP +sign=SIGHASH\-FLAGS +.IP +Add zero or more signatures to transaction. This command requires JSON +registers:prevtxs=JSON object, privatekeys=JSON object. See +signrawtransaction docs for format of sighash flags, JSON +objects. +.PP +Register Commands: +.IP +load=NAME:FILENAME +.IP +Load JSON file FILENAME into register NAME +.IP +set=NAME:JSON\-STRING +.IP +Set register NAME to given JSON\-STRING +.SH COPYRIGHT +Copyright (C) 2018-2019 The Paccoin Core developers +Copyright (C) 2014-2018 The Dash Core developers +Copyright (C) 2009-2018 The Bitcoin Core developers + +Please contribute if you find Paccoin Core useful. Visit for +further information about the software. +The source code is available from . + +This is experimental software. +Distributed under the MIT software license, see the accompanying file COPYING +or + +This product includes software developed by the OpenSSL Project for use in the +OpenSSL Toolkit and cryptographic software written by +Eric Young and UPnP software written by Thomas Bernard. diff --git a/doc/man/paccoind.1 b/doc/man/paccoind.1 new file mode 100644 index 000000000000..f63e83436d3d --- /dev/null +++ b/doc/man/paccoind.1 @@ -0,0 +1,690 @@ +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.8. +.TH PACD "1" "November 2018" "paccoind v0.13.0.0" "User Commands" +.SH NAME +paccoind \- manual page for paccoind v0.13.0.0 +.SH DESCRIPTION +Paccoin Core Daemon version v0.13.0.0 +.SS "Usage:" +.TP +paccoind [options] +Start Paccoin Core Daemon +.SH OPTIONS +.HP +\-? +.IP +Print this help message and exit +.HP +\fB\-version\fR +.IP +Print version and exit +.HP +\fB\-alerts\fR +.IP +Receive and display P2P network alerts (default: 1) +.HP +\fB\-alertnotify=\fR +.IP +Execute command when a relevant alert is received or we see a really +long fork (%s in cmd is replaced by message) +.HP +\fB\-blocknotify=\fR +.IP +Execute command when the best block changes (%s in cmd is replaced by +block hash) +.HP +\fB\-assumevalid=\fR +.IP +If this block is in the chain assume that it and its ancestors are valid +and potentially skip their script verification (0 to verify all, +default: +0000000000000024e26c7df7e46d673724d223cf4ca2b2adc21297cc095600f4, +testnet: +000000000118fa2f031efedf874adbe7fe6b023cdf9478e8e2400c2d505df30d) +.HP +\fB\-conf=\fR +.IP +Specify configuration file (default: paccoin.conf) +.HP +\fB\-daemon\fR +.IP +Run in the background as a daemon and accept commands +.HP +\fB\-datadir=\fR +.IP +Specify data directory +.HP +\fB\-dbcache=\fR +.IP +Set database cache size in megabytes (4 to 16384, default: 300) +.HP +\fB\-loadblock=\fR +.IP +Imports blocks from external blk000??.dat file on startup +.HP +\fB\-maxorphantx=\fR +.IP +Keep at most unconnectable transactions in memory (default: 100) +.HP +\fB\-maxmempool=\fR +.IP +Keep the transaction memory pool below megabytes (default: 300) +.HP +\fB\-mempoolexpiry=\fR +.IP +Do not keep transactions in the mempool longer than hours (default: +336) +.HP +\fB\-blockreconstructionextratxn=\fR +.IP +Extra transactions to keep in memory for compact block reconstructions +(default: 100) +.HP +\fB\-par=\fR +.IP +Set the number of script verification threads (\fB\-2\fR to 16, 0 = auto, <0 = +leave that many cores free, default: 0) +.HP +\fB\-pid=\fR +.IP +Specify pid file (default: paccoind.pid) +.HP +\fB\-prune=\fR +.IP +Reduce storage requirements by enabling pruning (deleting) of old +blocks. This allows the pruneblockchain RPC to be called to +delete specific blocks, and enables automatic pruning of old +blocks if a target size in MiB is provided. This mode is +incompatible with \fB\-txindex\fR and \fB\-rescan\fR. Warning: Reverting this +setting requires re\-downloading the entire blockchain. (default: +0 = disable pruning blocks, 1 = allow manual pruning via RPC, +>945 = automatically prune block files to stay under the +specified target size in MiB) +.HP +\fB\-reindex\-chainstate\fR +.IP +Rebuild chain state from the currently indexed blocks +.HP +\fB\-reindex\fR +.IP +Rebuild chain state and block index from the blk*.dat files on disk +.HP +\fB\-sysperms\fR +.IP +Create new files with system default permissions, instead of umask 077 +(only effective with disabled wallet functionality) +.HP +\fB\-txindex\fR +.IP +Maintain a full transaction index, used by the getrawtransaction rpc +call (default: 1) +.HP +\fB\-addressindex\fR +.IP +Maintain a full address index, used to query for the balance, txids and +unspent outputs for addresses (default: 0) +.HP +\fB\-timestampindex\fR +.IP +Maintain a timestamp index for block hashes, used to query blocks hashes +by a range of timestamps (default: 0) +.HP +\fB\-spentindex\fR +.IP +Maintain a full spent index, used to query the spending txid and input +index for an outpoint (default: 0) +.PP +Connection options: +.HP +\fB\-addnode=\fR +.IP +Add a node to connect to and attempt to keep the connection open +.HP +\fB\-allowprivatenet\fR +.IP +Allow RFC1918 addresses to be relayed and connected to (default: 0) +.HP +\fB\-banscore=\fR +.IP +Threshold for disconnecting misbehaving peers (default: 100) +.HP +\fB\-bantime=\fR +.IP +Number of seconds to keep misbehaving peers from reconnecting (default: +86400) +.HP +\fB\-bind=\fR +.IP +Bind to given address and always listen on it. Use [host]:port notation +for IPv6 +.HP +\fB\-connect=\fR +.IP +Connect only to the specified node(s); \fB\-noconnect\fR or \fB\-connect\fR=\fI\,0\/\fR alone to +disable automatic connections +.HP +\fB\-discover\fR +.IP +Discover own IP addresses (default: 1 when listening and no \fB\-externalip\fR +or \fB\-proxy\fR) +.HP +\fB\-dns\fR +.IP +Allow DNS lookups for \fB\-addnode\fR, \fB\-seednode\fR and \fB\-connect\fR (default: 1) +.HP +\fB\-dnsseed\fR +.IP +Query for peer addresses via DNS lookup, if low on addresses (default: 1 +unless \fB\-connect\fR/\-noconnect) +.HP +\fB\-externalip=\fR +.IP +Specify your own public address +.HP +\fB\-forcednsseed\fR +.IP +Always query for peer addresses via DNS lookup (default: 0) +.HP +\fB\-listen\fR +.IP +Accept connections from outside (default: 1 if no \fB\-proxy\fR or +\fB\-connect\fR/\-noconnect) +.HP +\fB\-listenonion\fR +.IP +Automatically create Tor hidden service (default: 1) +.HP +\fB\-maxconnections=\fR +.IP +Maintain at most connections to peers (temporary service connections +excluded) (default: 125) +.HP +\fB\-maxreceivebuffer=\fR +.IP +Maximum per\-connection receive buffer, *1000 bytes (default: 5000) +.HP +\fB\-maxsendbuffer=\fR +.IP +Maximum per\-connection send buffer, *1000 bytes (default: 1000) +.HP +\fB\-maxtimeadjustment\fR +.IP +Maximum allowed median peer time offset adjustment. Local perspective of +time may be influenced by peers forward or backward by this +amount. (default: 4200 seconds) +.HP +\fB\-onion=\fR +.IP +Use separate SOCKS5 proxy to reach peers via Tor hidden services +(default: \fB\-proxy\fR) +.HP +\fB\-onlynet=\fR +.IP +Only connect to nodes in network (ipv4, ipv6 or onion) +.HP +\fB\-permitbaremultisig\fR +.IP +Relay non\-P2SH multisig (default: 1) +.HP +\fB\-peerbloomfilters\fR +.IP +Support filtering of blocks and transaction with bloom filters (default: +1) +.HP +\fB\-port=\fR +.IP +Listen for connections on (default: 9999 or testnet: 19999) +.HP +\fB\-proxy=\fR +.IP +Connect through SOCKS5 proxy +.HP +\fB\-proxyrandomize\fR +.IP +Randomize credentials for every proxy connection. This enables Tor +stream isolation (default: 1) +.HP +\fB\-seednode=\fR +.IP +Connect to a node to retrieve peer addresses, and disconnect +.HP +\fB\-timeout=\fR +.IP +Specify connection timeout in milliseconds (minimum: 1, default: 5000) +.HP +\fB\-torcontrol=\fR: +.IP +Tor control port to use if onion listening enabled (default: +127.0.0.1:9051) +.HP +\fB\-torpassword=\fR +.IP +Tor control port password (default: empty) +.HP +\fB\-upnp\fR +.IP +Use UPnP to map the listening port (default: 0) +.HP +\fB\-whitebind=\fR +.IP +Bind to given address and whitelist peers connecting to it. Use +[host]:port notation for IPv6 +.HP +\fB\-whitelist=\fR +.IP +Whitelist peers connecting from the given IP address (e.g. 1.2.3.4) or +CIDR notated network (e.g. 1.2.3.0/24). Can be specified multiple +times. Whitelisted peers cannot be DoS banned and their +transactions are always relayed, even if they are already in the +mempool, useful e.g. for a gateway +.HP +\fB\-whitelistrelay\fR +.IP +Accept relayed transactions received from whitelisted peers even when +not relaying transactions (default: 1) +.HP +\fB\-whitelistforcerelay\fR +.IP +Force relay of transactions from whitelisted peers even if they violate +local relay policy (default: 1) +.HP +\fB\-maxuploadtarget=\fR +.IP +Tries to keep outbound traffic under the given target (in MiB per 24h), +0 = no limit (default: 0) +.PP +Wallet options: +.HP +\fB\-disablewallet\fR +.IP +Do not load the wallet and disable wallet RPC calls +.HP +\fB\-keypool=\fR +.IP +Set key pool size to (default: 1000) +.HP +\fB\-fallbackfee=\fR +.IP +A fee rate (in PAC/kB) that will be used when fee estimation has +insufficient data (default: 0.00001) +.HP +\fB\-mintxfee=\fR +.IP +Fees (in PAC/kB) smaller than this are considered zero fee for +transaction creation (default: 0.00001) +.HP +\fB\-paytxfee=\fR +.IP +Fee (in PAC/kB) to add to transactions you send (default: 0.00) +.HP +\fB\-rescan\fR +.IP +Rescan the block chain for missing wallet transactions on startup +.HP +\fB\-salvagewallet\fR +.IP +Attempt to recover private keys from a corrupt wallet on startup +.HP +\fB\-spendzeroconfchange\fR +.IP +Spend unconfirmed change when sending transactions (default: 1) +.HP +\fB\-txconfirmtarget=\fR +.IP +If paytxfee is not set, include enough fee so transactions begin +confirmation on average within n blocks (default: 6) +.HP +\fB\-usehd\fR +.IP +Use hierarchical deterministic key generation (HD) after BIP39/BIP44. +Only has effect during wallet creation/first start (default: 0) +.HP +\fB\-mnemonic\fR +.IP +User defined mnemonic for HD wallet (bip39). Only has effect during +wallet creation/first start (default: randomly generated) +.HP +\fB\-mnemonicpassphrase\fR +.IP +User defined mnemonic passphrase for HD wallet (BIP39). Only has effect +during wallet creation/first start (default: empty string) +.HP +\fB\-hdseed\fR +.IP +User defined seed for HD wallet (should be in hex). Only has effect +during wallet creation/first start (default: randomly generated) +.HP +\fB\-upgradewallet\fR +.IP +Upgrade wallet to latest format on startup +.HP +\fB\-wallet=\fR +.IP +Specify wallet file (within data directory) (default: wallet.dat) +.HP +\fB\-walletbroadcast\fR +.IP +Make the wallet broadcast transactions (default: 1) +.HP +\fB\-walletnotify=\fR +.IP +Execute command when a wallet transaction changes (%s in cmd is replaced +by TxID) +.HP +\fB\-zapwallettxes=\fR +.IP +Delete all wallet transactions and only recover those parts of the +blockchain through \fB\-rescan\fR on startup (1 = keep tx meta data e.g. +account owner and payment request information, 2 = drop tx meta +data) +.HP +\fB\-createwalletbackups=\fR +.IP +Number of automatic wallet backups (default: 10) +.HP +\fB\-walletbackupsdir=\fR +.IP +Specify full path to directory for automatic wallet backups (must exist) +.HP +\fB\-keepass\fR +.IP +Use KeePass 2 integration using KeePassHttp plugin (default: 0) +.HP +\fB\-keepassport=\fR +.IP +Connect to KeePassHttp on port (default: 19455) +.HP +\fB\-keepasskey=\fR +.IP +KeePassHttp key for AES encrypted communication with KeePass +.HP +\fB\-keepassid=\fR +.IP +KeePassHttp id for the established association +.HP +\fB\-keepassname=\fR +.IP +Name to construct url for KeePass entry that stores the wallet +passphrase +.PP +ZeroMQ notification options: +.HP +\fB\-zmqpubhashblock=\fR
+.IP +Enable publish hash block in
+.HP +\fB\-zmqpubhashtx=\fR
+.IP +Enable publish hash transaction in
+.HP +\fB\-zmqpubhashtxlock=\fR
+.IP +Enable publish hash transaction (locked via InstantSend) in
+.HP +\fB\-zmqpubhashgovernancevote=\fR
+.IP +Enable publish hash of governance votes in
+.HP +\fB\-zmqpubhashgovernanceobject=\fR
+.IP +Enable publish hash of governance objects (like proposals) in
+.HP +\fB\-zmqpubhashinstantsenddoublespend=\fR
+.IP +Enable publish transaction hashes of attempted InstantSend double spend +in
+.HP +\fB\-zmqpubrawblock=\fR
+.IP +Enable publish raw block in
+.HP +\fB\-zmqpubrawtx=\fR
+.IP +Enable publish raw transaction in
+.HP +\fB\-zmqpubrawtxlock=\fR
+.IP +Enable publish raw transaction (locked via InstantSend) in
+.HP +\fB\-zmqpubrawinstantsenddoublespend=\fR
+.IP +Enable publish raw transactions of attempted InstantSend double spend in +
+.PP +Debugging/Testing options: +.HP +\fB\-uacomment=\fR +.IP +Append comment to the user agent string +.HP +\fB\-debug=\fR +.IP +Output debugging information (default: 0, supplying is +optional). If is not supplied or if = 1, +output all debugging information. can be: addrman, +alert, bench, cmpctblock, coindb, db, http, leveldb, libevent, +lock, mempool, mempoolrej, net, proxy, prune, rand, reindex, rpc, +selectcoins, tor, zmq, paccoin (or specifically: gobject, +instantsend, keepass, masternode, mnpayments, mnsync, +privatesend, spork). +.HP +\fB\-help\-debug\fR +.IP +Show all debugging options (usage: \fB\-\-help\fR \fB\-help\-debug\fR) +.HP +\fB\-logips\fR +.IP +Include IP addresses in debug output (default: 0) +.HP +\fB\-logtimestamps\fR +.IP +Prepend debug output with timestamp (default: 1) +.HP +\fB\-minrelaytxfee=\fR +.IP +Fees (in PAC/kB) smaller than this are considered zero fee for +relaying, mining and transaction creation (default: 0.00001) +.HP +\fB\-maxtxfee=\fR +.IP +Maximum total fees (in PAC) to use in a single wallet transaction or +raw transaction; setting this too low may abort large +transactions (default: 0.10) +.HP +\fB\-printtoconsole\fR +.IP +Send trace/debug info to console instead of debug.log file +.HP +\fB\-printtodebuglog\fR +.IP +Send trace/debug info to debug.log file (default: 1) +.HP +\fB\-shrinkdebugfile\fR +.IP +Shrink debug.log file on client startup (default: 1 when no \fB\-debug\fR) +.PP +Chain selection options: +.HP +\fB\-testnet\fR +.IP +Use the test chain +.HP +\fB\-devnet=\fR +.IP +Use devnet chain with provided name +.HP +\fB\-litemode=\fR +.IP +Disable all Paccoin specific functionality (Masternodes, PrivateSend, +InstantSend, Governance) (0\-1, default: 0) +.HP +\fB\-sporkaddr=\fR +.IP +Override spork address. Only useful for regtest and devnet. Using this +on mainnet or testnet will ban you. +.HP +\fB\-minsporkkeys=\fR +.IP +Overrides minimum spork signers to change spork value. Only useful for +regtest and devnet. Using this on mainnet or testnet will ban +you. +.PP +Masternode options: +.HP +\fB\-masternode=\fR +.IP +Enable the client to act as a masternode (0\-1, default: 0) +.HP +\fB\-mnconf=\fR +.IP +Specify masternode configuration file (default: masternode.conf) +.HP +\fB\-mnconflock=\fR +.IP +Lock masternodes from masternode configuration file (default: 1) +.HP +\fB\-masternodeprivkey=\fR +.IP +Set the masternode private key +.PP +PrivateSend options: +.HP +\fB\-enableprivatesend=\fR +.IP +Enable use of automated PrivateSend for funds stored in this wallet +(0\-1, default: 0) +.HP +\fB\-privatesendmultisession=\fR +.IP +Enable multiple PrivateSend mixing sessions per block, experimental +(0\-1, default: 0) +.HP +\fB\-privatesendsessions=\fR +.IP +Use N separate masternodes in parallel to mix funds (1\-10, default: 4) +.HP +\fB\-privatesendrounds=\fR +.IP +Use N separate masternodes for each denominated input to mix funds +(2\-16, default: 4) +.HP +\fB\-privatesendamount=\fR +.IP +Keep N PAC anonymized (2\-21000000, default: 1000) +.HP +\fB\-liquidityprovider=\fR +.IP +Provide liquidity to PrivateSend by infrequently mixing coins on a +continual basis (0\-100, default: 0, 1=very frequent, high fees, +100=very infrequent, low fees) +.PP +InstantSend options: +.HP +\fB\-enableinstantsend=\fR +.IP +Enable InstantSend, show confirmations for locked transactions (0\-1, +default: 1) +.HP +\fB\-instantsendnotify=\fR +.IP +Execute command when a wallet InstantSend transaction is successfully +locked (%s in cmd is replaced by TxID) +.PP +Node relay options: +.HP +\fB\-bytespersigop\fR +.IP +Minimum bytes per sigop in transactions we relay and mine (default: 20) +.HP +\fB\-datacarrier\fR +.IP +Relay and mine data carrier transactions (default: 1) +.HP +\fB\-datacarriersize\fR +.IP +Maximum size of data in data carrier transactions we relay and mine +(default: 83) +.PP +Block creation options: +.HP +\fB\-blockmaxsize=\fR +.IP +Set maximum block size in bytes (default: 2000000) +.HP +\fB\-blockprioritysize=\fR +.IP +Set maximum size of high\-priority/low\-fee transactions in bytes +(default: 10000) +.HP +\fB\-blockmintxfee=\fR +.IP +Set lowest fee rate (in PAC/kB) for transactions to be included in +block creation. (default: 0.00001) +.PP +RPC server options: +.HP +\fB\-server\fR +.IP +Accept command line and JSON\-RPC commands +.HP +\fB\-rest\fR +.IP +Accept public REST requests (default: 0) +.HP +\fB\-rpcbind=\fR +.IP +Bind to given address to listen for JSON\-RPC connections. Use +[host]:port notation for IPv6. This option can be specified +multiple times (default: bind to all interfaces) +.HP +\fB\-rpccookiefile=\fR +.IP +Location of the auth cookie (default: data dir) +.HP +\fB\-rpcuser=\fR +.IP +Username for JSON\-RPC connections +.HP +\fB\-rpcpassword=\fR +.IP +Password for JSON\-RPC connections +.HP +\fB\-rpcauth=\fR +.IP +Username and hashed password for JSON\-RPC connections. The field + comes in the format: :$. A +canonical python script is included in share/rpcuser. The client +then connects normally using the +rpcuser=/rpcpassword= pair of arguments. This +option can be specified multiple times +.HP +\fB\-rpcport=\fR +.IP +Listen for JSON\-RPC connections on (default: 9998 or testnet: +19998) +.HP +\fB\-rpcallowip=\fR +.IP +Allow JSON\-RPC connections from specified source. Valid for are a +single IP (e.g. 1.2.3.4), a network/netmask (e.g. +1.2.3.4/255.255.255.0) or a network/CIDR (e.g. 1.2.3.4/24). This +option can be specified multiple times +.HP +\fB\-rpcthreads=\fR +.IP +Set the number of threads to service RPC calls (default: 4) +.SH COPYRIGHT +Copyright (C) 2018-2019 The Paccoin Core developers +Copyright (C) 2014-2018 The Dash Core developers +Copyright (C) 2009-2018 The Bitcoin Core developers + +Please contribute if you find Paccoin Core useful. Visit for +further information about the software. +The source code is available from . + +This is experimental software. +Distributed under the MIT software license, see the accompanying file COPYING +or + +This product includes software developed by the OpenSSL Project for use in the +OpenSSL Toolkit and cryptographic software written by +Eric Young and UPnP software written by Thomas Bernard. diff --git a/killPAC.sh b/killPAC.sh new file mode 100755 index 000000000000..8dd50eb64f27 --- /dev/null +++ b/killPAC.sh @@ -0,0 +1,9 @@ +#!/bin/bash +PID=`ps -eaf | grep Paccoin-Qt | grep -v grep | awk '{print $2}'` +if [[ "" != "$PID" ]]; then + echo "killing $PID" + kill -9 $PID +else + echo "No Paccoin-Qt process running. QT will not kill any process" false +fi + diff --git a/share/setup.nsi.in b/share/setup.nsi.in index afccb684c3e8..dfe767d28f4c 100644 --- a/share/setup.nsi.in +++ b/share/setup.nsi.in @@ -48,7 +48,7 @@ Var StartMenuGroup !insertmacro MUI_LANGUAGE English # Installer attributes -OutFile @abs_top_srcdir@/paccoincore-${VERSION}-win@WINDOWS_BITS@-setup.exe +OutFile @abs_top_srcdir@/Paccoin-${VERSION}-win@WINDOWS_BITS@-setup.exe !if "@WINDOWS_BITS@" == "64" InstallDir $PROGRAMFILES64\PaccoinCore !else diff --git a/src/Makefile.am b/src/Makefile.am index 46d554bc0223..9cac13cbf638 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -403,6 +403,7 @@ libbitcoin_util_a_SOURCES = \ if GLIBC_BACK_COMPAT libbitcoin_util_a_SOURCES += compat/glibc_compat.cpp +AM_LDFLAGS += $(COMPAT_LDFLAGS) endif # cli: shared between paccoin-cli and paccoin-qt diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index 8bb365e99f6e..9e4b9ed18b17 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -39,7 +39,8 @@ QT_FORMS_UI = \ qt/forms/sendcoinsdialog.ui \ qt/forms/sendcoinsentry.ui \ qt/forms/signverifymessagedialog.ui \ - qt/forms/transactiondescdialog.ui + qt/forms/transactiondescdialog.ui \ + qt/forms/privatepage.ui QT_MOC_CPP = \ qt/moc_addressbookpage.cpp \ @@ -70,6 +71,7 @@ QT_MOC_CPP = \ qt/moc_peertablemodel.cpp \ qt/moc_paymentserver.cpp \ qt/moc_columnalignedlayout.cpp \ + qt/moc_privatepage.cpp \ qt/moc_proposalfilterproxy.cpp \ qt/moc_proposaltablemodel.cpp \ qt/moc_proposallist.cpp \ @@ -92,7 +94,7 @@ QT_MOC_CPP = \ qt/moc_utilitydialog.cpp \ qt/moc_walletframe.cpp \ qt/moc_walletmodel.cpp \ - qt/moc_walletview.cpp + qt/moc_walletview.cpp BITCOIN_MM = \ qt/macdockiconhandler.mm \ @@ -147,6 +149,7 @@ BITCOIN_QT_H = \ qt/peertablemodel.h \ qt/platformstyle.h \ qt/columnalignedlayout.h \ + qt/privatepage.h \ qt/proposalfilterproxy.h \ qt/proposallist.h \ qt/proposalrecord.h \ @@ -174,11 +177,22 @@ BITCOIN_QT_H = \ qt/walletmodel.h \ qt/walletmodeltransaction.h \ qt/walletview.h \ - qt/winshutdownmonitor.h + qt/winshutdownmonitor.h + +RES_FONTS = \ + qt/res/fonts/VolteRounded-Regular.otf \ + qt/res/fonts/VolteRounded-Bold.otf \ + qt/res/fonts/VolteRounded-Light.otf \ + qt/res/fonts/VolteRounded-Medium.otf \ + qt/res/fonts/VolteRounded-Semibold.otf \ + qt/res/fonts/Gotham-Medium.ttf \ + qt/res/fonts/Gotham-Bold.otf + RES_ICONS = \ qt/res/icons/bitcoin.ico \ qt/res/icons/bitcoin.png \ + qt/res/icons/bitcoin-32.png \ qt/res/icons/chevron.png \ qt/res/icons/warning.png \ qt/res/icons/drkblue/add.png \ @@ -400,7 +414,64 @@ RES_ICONS = \ qt/res/icons/trad/fontsmaller.png \ qt/res/icons/trad/transaction_abandoned.png \ qt/res/icons/trad/network_disabled.png \ - qt/res/icons/trad/proposal.png + qt/res/icons/trad/proposal.png \ + qt/res/icons/pac/address-book.png \ + qt/res/icons/pac/quit.png \ + qt/res/icons/pac/send.png \ + qt/res/icons/pac/connect0_16.png \ + qt/res/icons/pac/connect1_16.png \ + qt/res/icons/pac/connect2_16.png \ + qt/res/icons/pac/connect3_16.png \ + qt/res/icons/pac/connect4_16.png \ + qt/res/icons/pac/transaction0.png \ + qt/res/icons/pac/transaction2.png \ + qt/res/icons/pac/transaction_conflicted.png \ + qt/res/icons/pac/clock1.png \ + qt/res/icons/pac/clock2.png \ + qt/res/icons/pac/clock3.png \ + qt/res/icons/pac/clock4.png \ + qt/res/icons/pac/clock5.png \ + qt/res/icons/pac/eye.png \ + qt/res/icons/pac/eye_minus.png \ + qt/res/icons/pac/eye_plus.png \ + qt/res/icons/pac/configure.png \ + qt/res/icons/pac/receive.png \ + qt/res/icons/pac/proposal.png \ + qt/res/icons/pac/editpaste.png \ + qt/res/icons/pac/editcopy.png \ + qt/res/icons/pac/add.png \ + qt/res/icons/pac/edit.png \ + qt/res/icons/pac/history.png \ + qt/res/icons/pac/masternodes.png \ + qt/res/icons/pac/overview.png \ + qt/res/icons/pac/export.png \ + qt/res/icons/pac/synced.png \ + qt/res/icons/pac/remove.png \ + qt/res/icons/pac/tx_mined.png \ + qt/res/icons/pac/tx_input.png \ + qt/res/icons/pac/tx_output.png \ + qt/res/icons/pac/tx_inout.png \ + qt/res/icons/pac/lock_closed.png \ + qt/res/icons/pac/lock_open.png \ + qt/res/icons/pac/key.png \ + qt/res/icons/pac/filesave.png \ + qt/res/icons/pac/debugwindow.png \ + qt/res/icons/pac/drkblue_editpaste.png \ + qt/res/icons/pac/drkblue_address-book.png \ + qt/res/icons/pac/drkblue_editcopy.png \ + qt/res/icons/pac/drkblue_remove.png \ + qt/res/icons/pac/browse.png \ + qt/res/icons/pac/about.png \ + qt/res/icons/pac/about_qt.png \ + qt/res/icons/pac/verify.png \ + qt/res/icons/pac/hd_enabled.png \ + qt/res/icons/pac/hd_disabled.png \ + qt/res/icons/pac/fontbigger.png \ + qt/res/icons/pac/fontsmaller.png \ + qt/res/icons/pac/transaction_abandoned.png \ + qt/res/icons/pac/network_disabled.png \ + qt/res/icons/pac/info.png \ + qt/res/icons/pac/private.png BITCOIN_QT_CPP = \ qt/bantablemodel.cpp \ @@ -453,6 +524,7 @@ BITCOIN_QT_CPP += \ qt/receivecoinsdialog.cpp \ qt/receiverequestdialog.cpp \ qt/recentrequeststablemodel.cpp \ + qt/privatepage.cpp \ qt/sendcoinsdialog.cpp \ qt/sendcoinsentry.cpp \ qt/signverifymessagedialog.cpp \ @@ -465,7 +537,7 @@ BITCOIN_QT_CPP += \ qt/walletframe.cpp \ qt/walletmodel.cpp \ qt/walletmodeltransaction.cpp \ - qt/walletview.cpp + qt/walletview.cpp endif RES_IMAGES = \ @@ -518,14 +590,39 @@ RES_IMAGES = \ qt/res/images/trad/drkblue_leftArrow_small.png \ qt/res/images/trad/drkblue_rightArrow_small.png \ qt/res/images/trad/drkblue_qtreeview_selected.png \ - qt/res/images/trad/drkblue_walletFrame_bg.png + qt/res/images/trad/drkblue_walletFrame_bg.png \ + qt/res/images/pac/about.png \ + qt/res/images/pac/paccoin_logo_horizontal.png \ + qt/res/images/pac/unchecked.png \ + qt/res/images/pac/checked.png \ + qt/res/images/pac/drkblue_downArrow.png \ + qt/res/images/pac/drkblue_downArrow_small.png \ + qt/res/images/pac/drkblue_upArrow_small.png \ + qt/res/images/pac/drkblue_leftArrow_small.png \ + qt/res/images/pac/drkblue_rightArrow_small.png \ + qt/res/images/pac/drkblue_qtreeview_selected.png \ + qt/res/images/pac/drkblue_walletFrame_bg.png \ + qt/res/images/pac/splash.png \ + qt/res/images/pac/splash_testnet.png \ + qt/res/images/pac/hover_profile.png \ + qt/res/images/pac/profile_bkg.png \ + qt/res/images/pac/header_bkg.png \ + qt/res/images/pac/checked_b.png \ + qt/res/images/pac/unchecked_b.png \ + qt/res/images/pac/checked_b_dis.png \ + qt/res/images/pac/unchecked_b_dis.png \ + qt/res/images/pac/checked_dis.png \ + qt/res/images/pac/unchecked_dis.png + RES_CSS = \ qt/res/css/drkblue.css \ qt/res/css/crownium.css \ qt/res/css/light.css \ qt/res/css/light-hires.css \ - qt/res/css/trad.css + qt/res/css/trad.css \ + qt/res/css/pac.css + RES_MOVIES = $(wildcard qt/res/movies/spinner-*.png) @@ -539,7 +636,7 @@ qt_libbitcoinqt_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BITCOIN_QT_INC qt_libbitcoinqt_a_CXXFLAGS = $(AM_CXXFLAGS) $(QT_PIE_FLAGS) qt_libbitcoinqt_a_SOURCES = $(BITCOIN_QT_CPP) $(BITCOIN_QT_H) $(QT_FORMS_UI) \ - $(QT_QRC) $(QT_QRC_LOCALE) $(QT_TS) $(PROTOBUF_PROTO) $(RES_ICONS) $(RES_IMAGES) $(RES_CSS) $(RES_MOVIES) + $(QT_QRC) $(QT_QRC_LOCALE) $(QT_TS) $(PROTOBUF_PROTO) $(RES_ICONS) $(RES_FONTS) $(RES_IMAGES) $(RES_CSS) $(RES_MOVIES) nodist_qt_libbitcoinqt_a_SOURCES = $(QT_MOC_CPP) $(QT_MOC) $(PROTOBUF_CC) \ $(PROTOBUF_H) $(QT_QRC_CPP) $(QT_QRC_LOCALE_CPP) @@ -601,7 +698,7 @@ $(QT_QRC_LOCALE_CPP): $(QT_QRC_LOCALE) $(QT_QM) $(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(RCC) $(RCCFLAGS) -name paccoin_locale $(@D)/$( $@ -$(QT_QRC_CPP): $(QT_QRC) $(QT_FORMS_H) $(RES_ICONS) $(RES_IMAGES) $(RES_CSS) $(RES_MOVIES) $(PROTOBUF_H) +$(QT_QRC_CPP): $(QT_QRC) $(QT_FORMS_H) $(RES_ICONS) $(RES_FONTS) $(RES_IMAGES) $(RES_CSS) $(RES_MOVIES) $(PROTOBUF_H) @test -f $(RCC) $(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(RCC) $(RCCFLAGS) -name paccoin $< | \ $(SED) -e '/^\*\*.*Created:/d' -e '/^\*\*.*by:/d' > $@ diff --git a/src/compat/glibc_compat.cpp b/src/compat/glibc_compat.cpp index 155ff8a0511f..e797e59d9c9d 100644 --- a/src/compat/glibc_compat.cpp +++ b/src/compat/glibc_compat.cpp @@ -7,6 +7,7 @@ #endif #include +#include #if defined(HAVE_SYS_SELECT_H) #include @@ -27,3 +28,47 @@ extern "C" FDELT_TYPE __fdelt_warn(FDELT_TYPE a) return a / __NFDBITS; } extern "C" FDELT_TYPE __fdelt_chk(FDELT_TYPE) __attribute__((weak, alias("__fdelt_warn"))); + +#if defined(__i386__) || defined(__arm__) + +extern "C" int64_t __udivmoddi4(uint64_t u, uint64_t v, uint64_t* rp); + +extern "C" int64_t __wrap___divmoddi4(int64_t u, int64_t v, int64_t* rp) +{ + int32_t c1 = 0, c2 = 0; + int64_t uu = u, vv = v; + int64_t w; + int64_t r; + + if (uu < 0) { + c1 = ~c1, c2 = ~c2, uu = -uu; + } + if (vv < 0) { + c1 = ~c1, vv = -vv; + } + + w = __udivmoddi4(uu, vv, (uint64_t*)&r); + if (c1) + w = -w; + if (c2) + r = -r; + + *rp = r; + return w; +} +#endif + +extern "C" float log2f_old(float x); +#ifdef __i386__ +__asm(".symver log2f_old,log2f@GLIBC_2.1"); +#elif defined(__amd64__) +__asm(".symver log2f_old,log2f@GLIBC_2.2.5"); +#elif defined(__arm__) +__asm(".symver log2f_old,log2f@GLIBC_2.4"); +#elif defined(__aarch64__) +__asm(".symver log2f_old,log2f@GLIBC_2.17"); +#endif +extern "C" float __wrap_log2f(float x) +{ + return log2f_old(x); +} diff --git a/src/init.cpp b/src/init.cpp index 2f7ad882c3ec..787aaa271fac 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -1457,7 +1457,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) else { struct in_addr inaddr_any; inaddr_any.s_addr = INADDR_ANY; - fBound |= Bind(connman, CService(in6addr_any, GetListenPort()), BF_NONE); + fBound |= Bind(connman, CService((in6_addr)IN6ADDR_ANY_INIT, GetListenPort()), BF_NONE); fBound |= Bind(connman, CService(inaddr_any, GetListenPort()), !fBound ? BF_REPORT_ERROR : BF_NONE); } if (!fBound) diff --git a/src/qt/addressbookpage.cpp b/src/qt/addressbookpage.cpp index b9c203515662..4a4768ec992b 100644 --- a/src/qt/addressbookpage.cpp +++ b/src/qt/addressbookpage.cpp @@ -31,6 +31,14 @@ AddressBookPage::AddressBookPage(const PlatformStyle *platformStyle, Mode mode, { QString theme = GUIUtil::getThemeName(); ui->setupUi(this); + + // set the typography correctly + QFont selectedFont = GUIUtil::getCustomSelectedFont(); + QList widgets = this->findChildren(); + for (int i = 0; i < widgets.length(); i++){ + widgets.at(i)->setFont(selectedFont); + } + if (!platformStyle->getImagesOnButtons()) { ui->newAddress->setIcon(QIcon()); ui->copyAddress->setIcon(QIcon()); @@ -42,7 +50,8 @@ AddressBookPage::AddressBookPage(const PlatformStyle *platformStyle, Mode mode, ui->deleteAddress->setIcon(QIcon(":/icons/" + theme + "/remove")); ui->exportButton->setIcon(QIcon(":/icons/" + theme + "/export")); } - + ui->tableView->setShowGrid(false); + ui->tableView->setAlternatingRowColors(false); switch(mode) { case ForSelection: @@ -135,6 +144,7 @@ void AddressBookPage::setModel(AddressTableModel *model) ui->tableView->setModel(proxyModel); ui->tableView->sortByColumn(0, Qt::AscendingOrder); + // Set column widths #if QT_VERSION < 0x050000 ui->tableView->horizontalHeader()->setResizeMode(AddressTableModel::Label, QHeaderView::Stretch); diff --git a/src/qt/askpassphrasedialog.cpp b/src/qt/askpassphrasedialog.cpp index 4866ffbeab71..6bc858022460 100644 --- a/src/qt/askpassphrasedialog.cpp +++ b/src/qt/askpassphrasedialog.cpp @@ -6,6 +6,7 @@ #include "askpassphrasedialog.h" #include "ui_askpassphrasedialog.h" +#include "guiutil.h" #include "guiconstants.h" #include "walletmodel.h" @@ -24,6 +25,13 @@ AskPassphraseDialog::AskPassphraseDialog(Mode mode, QWidget *parent) : { ui->setupUi(this); + // set the typography correctly + QFont selectedFont = GUIUtil::getCustomSelectedFont(); + QList widgets = this->findChildren(); + for (int i = 0; i < widgets.length(); i++){ + widgets.at(i)->setFont(selectedFont); + } + ui->passEdit1->setMinimumSize(ui->passEdit1->sizeHint()); ui->passEdit2->setMinimumSize(ui->passEdit2->sizeHint()); ui->passEdit3->setMinimumSize(ui->passEdit3->sizeHint()); diff --git a/src/qt/bitcoinamountfield.cpp b/src/qt/bitcoinamountfield.cpp index 78c19ff4fe43..28c87e35a638 100644 --- a/src/qt/bitcoinamountfield.cpp +++ b/src/qt/bitcoinamountfield.cpp @@ -27,8 +27,8 @@ class AmountSpinBox: public QAbstractSpinBox currentUnit(BitcoinUnits::PAC), singleStep(100000) // satoshis { - setAlignment(Qt::AlignRight); - + setAlignment(Qt::AlignHCenter); + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); connect(lineEdit(), SIGNAL(textEdited(QString)), this, SIGNAL(valueChanged())); } @@ -49,7 +49,7 @@ class AmountSpinBox: public QAbstractSpinBox if(valid) { input = BitcoinUnits::format(currentUnit, val, false, BitcoinUnits::separatorAlways); - lineEdit()->setText(input); + lineEdit()->setText(input.replace( ",", " " )); } } @@ -60,7 +60,7 @@ class AmountSpinBox: public QAbstractSpinBox void setValue(const CAmount& value) { - lineEdit()->setText(BitcoinUnits::format(currentUnit, value, false, BitcoinUnits::separatorAlways)); + lineEdit()->setText((BitcoinUnits::format(currentUnit, value, false, BitcoinUnits::separatorAlways)).replace( ",", " " )); Q_EMIT valueChanged(); } @@ -99,7 +99,7 @@ class AmountSpinBox: public QAbstractSpinBox const QFontMetrics fm(fontMetrics()); int h = lineEdit()->minimumSizeHint().height(); - int w = fm.width(BitcoinUnits::format(BitcoinUnits::PAC, BitcoinUnits::maxMoney(), false, BitcoinUnits::separatorAlways)); + int w = fm.width((BitcoinUnits::format(BitcoinUnits::PAC, BitcoinUnits::maxMoney(), false, BitcoinUnits::separatorAlways)).replace( ",", " " )); w += 2; // cursor blinking space QStyleOptionSpinBox opt; @@ -197,7 +197,6 @@ BitcoinAmountField::BitcoinAmountField(QWidget *parent) : amount = new AmountSpinBox(this); amount->setLocale(QLocale::c()); amount->installEventFilter(this); - amount->setMaximumWidth(170); QHBoxLayout *layout = new QHBoxLayout(this); layout->addWidget(amount); diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index de0c9f0cede7..214bf2b7a199 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -15,9 +15,11 @@ #include "openuridialog.h" #include "optionsdialog.h" #include "optionsmodel.h" +#include "overviewpage.h" #include "platformstyle.h" #include "rpcconsole.h" #include "utilitydialog.h" +#include "util.h" #ifdef ENABLE_WALLET #include "walletframe.h" @@ -39,6 +41,7 @@ #include #include +#include #include #include #include @@ -54,7 +57,19 @@ #include #include #include +#include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #if QT_VERSION < 0x050000 #include @@ -75,6 +90,20 @@ const std::string BitcoinGUI::DEFAULT_UIPLATFORM = const QString BitcoinGUI::DEFAULT_WALLET = "~Default"; +/** For the style on the comboBox */ +class MyProxyStyle : public QProxyStyle +{ +public: + int styleHint( StyleHint hint, const QStyleOption* + option = 0, const QWidget* widget = 0, QStyleHintReturn* returnData = + 0 ) const + { + if( SH_ComboBox_Popup == hint ) + return 0;//disable combo-box popup top & bottom areas + return QProxyStyle::styleHint( hint, option, widget, returnData ); + } +}; + BitcoinGUI::BitcoinGUI(const PlatformStyle *platformStyle, const NetworkStyle *networkStyle, QWidget *parent) : QMainWindow(parent), clientModel(0), @@ -91,6 +120,7 @@ BitcoinGUI::BitcoinGUI(const PlatformStyle *platformStyle, const NetworkStyle *n overviewAction(0), historyAction(0), masternodeAction(0), + privateAction(0), proposalAction(0), quitAction(0), sendCoinsAction(0), @@ -123,11 +153,22 @@ BitcoinGUI::BitcoinGUI(const PlatformStyle *platformStyle, const NetworkStyle *n spinnerFrame(0), platformStyle(platformStyle) { + /* Setting the default Pac Theme */ + QSettings settings; + settings.setValue("theme", "pac"); + QString currentFont = GUIUtil::getFontName(); + std::cout << "CurrentFont: " << currentFont.toStdString() << std::endl; + /* Open CSS when configured */ - this->setStyleSheet(GUIUtil::loadStyleSheet()); + GUIUtil::setGUITextColor(); + /* Add the custom Fonts to the wallet */ + QFontDatabase::addApplicationFont(":/fonts/VolteRounded-Medium"); + QFontDatabase::addApplicationFont(":/fonts/Gotham-Bold"); + QFontDatabase::addApplicationFont(":/fonts/Gotham-Medium"); - GUIUtil::restoreWindowGeometry("nWindow", QSize(850, 550), this); + this->setStyleSheet(GUIUtil::loadStyleSheet()); + GUIUtil::restoreWindowGeometry("nWindow", QSize(800, 550), this); QString windowTitle = tr("$PAC Core") + " - "; #ifdef ENABLE_WALLET /* if compiled with wallet support, -disablewallet can still disable the wallet */ @@ -161,6 +202,16 @@ BitcoinGUI::BitcoinGUI(const PlatformStyle *platformStyle, const NetworkStyle *n rpcConsole = new RPCConsole(platformStyle, 0); helpMessageDialog = new HelpMessageDialog(this, HelpMessageDialog::cmdline); #ifdef ENABLE_WALLET + managerCurrency = new QNetworkAccessManager(); + QObject::connect(managerCurrency, SIGNAL(finished(QNetworkReply*)), this, SLOT(managerCurrencyFinished(QNetworkReply*))); + requestCurrency.setUrl(QUrl("http://explorer.pachub.io/api/currency/USD")); + managerCurrency->get(requestCurrency); + + managerNews = new QNetworkAccessManager(); + QObject::connect(managerNews, SIGNAL(finished(QNetworkReply*)), this, SLOT(managerNewsFinished(QNetworkReply*))); + requestNews.setUrl(QUrl("http://144.202.121.149:8080/")); + managerNews->get(requestNews); + if(enableWallet) { /** Create wallet frame*/ @@ -192,6 +243,8 @@ BitcoinGUI::BitcoinGUI(const PlatformStyle *platformStyle, const NetworkStyle *n // Create status bar statusBar(); + //statusBar()->setObjectName("statusProgressBar"); + statusBar()->setFixedHeight(33); // Disable size grip because it looks ugly and nobody needs it statusBar()->setSizeGripEnabled(false); @@ -233,11 +286,11 @@ BitcoinGUI::BitcoinGUI(const PlatformStyle *platformStyle, const NetworkStyle *n // Override style sheet for progress bar for styles that have a segmented progress bar, // as they make the text unreadable (workaround for issue #1071) // See https://qt-project.org/doc/qt-4.8/gallery.html - QString curStyle = QApplication::style()->metaObject()->className(); + /*QString curStyle = QApplication::style()->metaObject()->className(); if(curStyle == "QWindowsStyle" || curStyle == "QWindowsXPStyle") { progressBar->setStyleSheet("QProgressBar { background-color: #F8F8F8; border: 1px solid grey; border-radius: 7px; padding: 1px; text-align: center; } QProgressBar::chunk { background: QLinearGradient(x1: 0, y1: 0, x2: 1, y2: 0, stop: 0 #00CCFF, stop: 1 #33CCFF); border-radius: 7px; margin: 0px; }"); - } + }*/ statusBar()->addWidget(progressBarLabel); statusBar()->addWidget(progressBar); @@ -256,13 +309,25 @@ BitcoinGUI::BitcoinGUI(const PlatformStyle *platformStyle, const NetworkStyle *n connect(labelConnectionsIcon, SIGNAL(clicked(QPoint)), this, SLOT(showPeers())); modalOverlay = new ModalOverlay(this->centralWidget()); + #ifdef ENABLE_WALLET if(enableWallet) { connect(walletFrame, SIGNAL(requestedSyncWarningInfo()), this, SLOT(showModalOverlay())); connect(labelBlocksIcon, SIGNAL(clicked(QPoint)), this, SLOT(showModalOverlay())); connect(progressBar, SIGNAL(clicked(QPoint)), this, SLOT(showModalOverlay())); + connect(this,SIGNAL(transmit_to_walletframe()), walletFrame, SLOT(receive_from_bitcoingui())); } #endif + QFont defaultFont(settings.value("FontType").toString(),14, QFont::Normal, false); + defaultFont.setBold(false); + defaultFont.setPixelSize(14); + QApplication::setFont(defaultFont); + + // set Background Image of window so it can keep aspect ratio > + backgroundImage = QPixmap(":/images/pac/drkblue_walletFrame_bg"); + backgroundImage = backgroundImage.scaled(this->size(), Qt::KeepAspectRatioByExpanding); + palette.setBrush(QPalette::Window, backgroundImage); + this->setPalette(palette); } BitcoinGUI::~BitcoinGUI() @@ -281,6 +346,7 @@ BitcoinGUI::~BitcoinGUI() delete rpcConsole; } + void BitcoinGUI::createActions() { QActionGroup *tabGroup = new QActionGroup(this); @@ -337,6 +403,19 @@ void BitcoinGUI::createActions() historyAction->setShortcut(QKeySequence(Qt::ALT + Qt::Key_4)); #endif tabGroup->addAction(historyAction); + + privateAction = new QAction(QIcon(":/icons/" + theme + "/private"), tr("&Private"), this); + privateAction->setStatusTip(tr("Browse private section")); + privateAction->setToolTip(privateAction->statusTip()); + privateAction->setCheckable(true); +#ifdef Q_OS_MAC + privateAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_7)); +#else + privateAction->setShortcut(QKeySequence(Qt::ALT + Qt::Key_7)); +#endif + tabGroup->addAction(privateAction); + + #ifdef ENABLE_WALLET QSettings settings; @@ -346,9 +425,9 @@ void BitcoinGUI::createActions() masternodeAction->setToolTip(masternodeAction->statusTip()); masternodeAction->setCheckable(true); #ifdef Q_OS_MAC - masternodeAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_5)); + masternodeAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_6)); #else - masternodeAction->setShortcut(QKeySequence(Qt::ALT + Qt::Key_5)); + masternodeAction->setShortcut(QKeySequence(Qt::ALT + Qt::Key_6)); #endif tabGroup->addAction(masternodeAction); connect(masternodeAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized())); @@ -360,9 +439,9 @@ void BitcoinGUI::createActions() proposalAction->setToolTip(proposalAction->statusTip()); proposalAction->setCheckable(true); #ifdef Q_OS_MAC - proposalAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_6)); + proposalAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_5)); #else - proposalAction->setShortcut(QKeySequence(Qt::ALT + Qt::Key_6)); + proposalAction->setShortcut(QKeySequence(Qt::ALT + Qt::Key_5)); #endif tabGroup->addAction(proposalAction); @@ -380,8 +459,11 @@ void BitcoinGUI::createActions() connect(receiveCoinsMenuAction, SIGNAL(triggered()), this, SLOT(gotoReceiveCoinsPage())); connect(historyAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized())); connect(historyAction, SIGNAL(triggered()), this, SLOT(gotoHistoryPage())); + connect(privateAction, SIGNAL(triggered()), this, SLOT(gotoPrivatePage())); + connect(privateAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized())); connect(proposalAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized())); connect(proposalAction, SIGNAL(triggered()), this, SLOT(gotoProposalPage())); + #endif // ENABLE_WALLET quitAction = new QAction(QIcon(":/icons/" + theme + "/quit"), tr("E&xit"), this); @@ -482,6 +564,9 @@ void BitcoinGUI::createActions() // prevents an open debug window from becoming stuck/unusable on client shutdown connect(quitAction, SIGNAL(triggered()), rpcConsole, SLOT(hide())); + // Setting the new style for the comboBox + qApp->setStyle( new MyProxyStyle ); + #ifdef ENABLE_WALLET if(walletFrame) { @@ -504,6 +589,17 @@ void BitcoinGUI::createActions() new QShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_P), this, SLOT(showPeers())); new QShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_R), this, SLOT(showRepair())); } +// We override the virtual resizeEvent of the QWidget to adjust background image to the new window size +void BitcoinGUI::resizeEvent(QResizeEvent *event) +{ + QWidget::resizeEvent(event); + + // set Background Image of window so it can keep aspect ratio > + backgroundImage = QPixmap(":/images/pac/drkblue_walletFrame_bg"); + backgroundImage = backgroundImage.scaled(event->size(), Qt::KeepAspectRatioByExpanding); + palette.setBrush(QPalette::Window, backgroundImage); + this->setPalette(palette); +} void BitcoinGUI::createMenuBar() { @@ -568,44 +664,175 @@ void BitcoinGUI::createToolBars() #ifdef ENABLE_WALLET if(walletFrame) { - QLabel* mainIcon = new QLabel(); - mainIcon->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); - mainIcon->setPixmap(QPixmap(":icons/bitcoin")); - mainIcon->setAlignment(Qt::AlignCenter); + QWidget* spacer = new QWidget(); + spacer->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + spacer->setFixedWidth(120); + spacer->setFixedHeight(10); + + QWidget* spacerBottomIcon = new QWidget(); + spacerBottomIcon->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + spacerBottomIcon->setFixedWidth(120); + spacerBottomIcon->setFixedHeight(5); + + QWidget* mainIcon = new QWidget(); + mainIcon->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + mainIcon->setObjectName("toolbarIcon"); + mainIcon->setFixedWidth(105);//the size we are looking is 90px but since it's css margin it's shrinking it we add +15px here + mainIcon->setFixedHeight(105);//same for this QToolBar *toolbar = new QToolBar(tr("Tabs toolbar")); - toolbar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); + toolbar->setObjectName("toolBar"); + toolbar->setContextMenuPolicy(Qt::PreventContextMenu); + + toolbar->setToolButtonStyle(Qt::ToolButtonIconOnly); addToolBar(Qt::LeftToolBarArea, toolbar); + toolbar->setFixedWidth(120); + toolbar->addWidget(spacer); toolbar->addWidget(mainIcon); + toolbar->addWidget(spacerBottomIcon); toolbar->setOrientation(Qt::Vertical); toolbar->addAction(overviewAction); toolbar->addAction(sendCoinsAction); toolbar->addAction(receiveCoinsAction); toolbar->addAction(historyAction); + toolbar->addAction(proposalAction); QSettings settings; if (settings.value("fShowMasternodesTab").toBool()) { toolbar->addAction(masternodeAction); } - toolbar->addAction(proposalAction); + toolbar->addAction(privateAction); toolbar->setMovable(false); // remove unused icon in upper left corner overviewAction->setChecked(true); /** Create additional container for toolbar and walletFrame and make it the central widget. This is a workaround mostly for toolbar styling on Mac OS but should work fine for every other OSes too. */ + createHeaderBar(); + QSpacerItem *HeaderSpacer = new QSpacerItem(1,27, QSizePolicy::Fixed, QSizePolicy::Fixed); + + QVBoxLayout *verticalLayout = new QVBoxLayout; + verticalLayout->addSpacerItem(HeaderSpacer); + verticalLayout->addWidget(headerFrame); + verticalLayout->addWidget(walletFrame); + verticalLayout->setSpacing(0); + verticalLayout->setContentsMargins(QMargins()); + + QWidget* container = new QWidget(); + container->setLayout(verticalLayout); QHBoxLayout *layout = new QHBoxLayout; - layout->addWidget(toolbar); - layout->addWidget(walletFrame); + layout->addWidget(container); layout->setSpacing(0); layout->setContentsMargins(QMargins()); QWidget *containerWidget = new QWidget(); + containerWidget->setObjectName("containerWidget"); // Label ID as CSS-reference containerWidget->setLayout(layout); setCentralWidget(containerWidget); } #endif // ENABLE_WALLET } +void BitcoinGUI::createHeaderBar() +{ + /** Creating the profile image widget */ + headerFrame = new QFrame; + QHBoxLayout *headerFrameLayout = new QHBoxLayout(this); + messageLabel = new QLabel(this); + QFrame *frameImg = new QFrame; + QHBoxLayout *profileImgLayout = new QHBoxLayout(this); + btnImg = new QPushButton; + btnRefresh = new QToolButton; + btnCopyNews = new QToolButton; + QSpacerItem *item = new QSpacerItem(15,1, QSizePolicy::Fixed, QSizePolicy::Expanding); + QSpacerItem *messageLeftSpacer = new QSpacerItem(30,1, QSizePolicy::Fixed, QSizePolicy::Fixed); + + headerFrame->setFixedHeight(100); + headerFrame->setObjectName("headerFrameLayout"); + headerFrame->setStyleSheet("#headerFrameLayout { background: transparent !important; border-image: url(:/images/pac/header_bkg) 0 0 0 0 stretch stretch; margin-left: 40px;}"); + + messageLabel->setText(""); + messageLabel->setAlignment(Qt::AlignCenter); + messageLabel->setStyleSheet("QLabel { color:white; font-size:24px;}"); + messageLabel->setWordWrap(true); + + frameImg->setFrameStyle(QFrame::StyledPanel); + frameImg->setFrameShadow(QFrame::Raised); + frameImg->setStyleSheet("QFrame { border-image: url(:/images/pac/profile_bkg) 0 0 0 0 stretch stretch;" + " margin-right:-1px !important }"); + frameImg->setFixedWidth(115); + frameImg->setFixedHeight(95); + + btnImg->setObjectName("btnChangeImage"); + btnImg->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + btnImg->setFixedHeight(80); + btnImg->setFixedWidth(80); + btnImg->setToolTip("Press to change or remove the image."); + setProfileImage(); + + btnRefresh->setProperty("class","QuickButton"); + btnRefresh->setToolTip("Refresh news and PAC-USD value."); + btnRefresh->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + btnRefresh->setFixedHeight(20); + btnRefresh->setFixedWidth(20); + btnRefresh->setIcon(QIcon(":/movies/spinner-000")); + + btnCopyNews->setProperty("class","QuickButton"); + btnCopyNews->setToolTip("Copy news."); + btnCopyNews->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + btnCopyNews->setFixedHeight(24); + btnCopyNews->setFixedWidth(24); + btnCopyNews->setIcon(QIcon(":/icons/pac/editcopy")); + + profileImgLayout->setContentsMargins(0,0,0,0); + profileImgLayout->addWidget(btnImg); + profileImgLayout->addSpacerItem(item); + frameImg->setLayout(profileImgLayout); + + /* inserting everything inside the header*/ + + headerFrameLayout->setContentsMargins(0,0,0,0); + headerFrameLayout->setContentsMargins(0,0,0,0); + headerFrameLayout->addSpacerItem(messageLeftSpacer); + headerFrameLayout->addWidget(messageLabel); + headerFrameLayout->addWidget(btnRefresh); + headerFrameLayout->addWidget(btnCopyNews); + headerFrameLayout->addWidget(frameImg); + headerFrame->setLayout(headerFrameLayout); + QSettings settings; + QString strImgValue = settings.value("profilePicture").toString(); + if(strImgValue == "" || strImgValue == NULL){ + strImgValue = ":/icons/bitcoin"; + } + + // Adding the connections for the buttons of the image, copy the news and refresh news/pacValue + connect(btnImg, SIGNAL (released()),this, SLOT (selectProfileImageFile())); + connect(btnCopyNews, SIGNAL(clicked()), this, SLOT(copyNews())); + connect(btnRefresh, SIGNAL(clicked()), this, SLOT(refreshNewsPacValue())); +} +void BitcoinGUI::setProfileImage(){ + /** initializing profile image */ + QSettings settings; + QString strImgValue = settings.value("profilePicture").toString(); + + if(strImgValue == "" || strImgValue == NULL){ + strImgValue = ":/icons/bitcoin"; + } + + QPixmap target(80, 80); + target.fill(Qt::transparent); + QPixmap pixmap = QPixmap::fromImage( QImage(strImgValue).scaled(80,80,Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation).convertToFormat(QImage::Format_ARGB32)); + QPainter painter(&target); + painter.setRenderHint(QPainter::Antialiasing); + painter.setRenderHint(QPainter::Antialiasing, true); + QPainterPath p; + p.addEllipse(QRect(0,0,80,80)); + painter.setClipPath(p); + painter.drawPixmap(0, 0,pixmap); + QIcon ButtonIcon(target); + btnImg->setIcon(ButtonIcon); + btnImg->setIconSize(QSize(78,78)); + +} void BitcoinGUI::setClientModel(ClientModel *clientModel) { this->clientModel = clientModel; @@ -728,6 +955,7 @@ void BitcoinGUI::setWalletActionsEnabled(bool enabled) receiveCoinsAction->setEnabled(enabled); receiveCoinsMenuAction->setEnabled(enabled); historyAction->setEnabled(enabled); + privateAction->setEnabled(enabled); proposalAction->setEnabled(enabled); QSettings settings; if (settings.value("fShowMasternodesTab").toBool() && masternodeAction) { @@ -898,6 +1126,10 @@ void BitcoinGUI::gotoHistoryPage() historyAction->setChecked(true); if (walletFrame) walletFrame->gotoHistoryPage(); } +void BitcoinGUI::gotoPrivatePage(){ + privateAction->setChecked(true); + if (walletFrame) walletFrame->gotoPrivatePage(); +} void BitcoinGUI::gotoMasternodePage() { @@ -1369,6 +1601,47 @@ void BitcoinGUI::setEncryptionStatus(int status) } #endif // ENABLE_WALLET +/** Select a new image for the top bar */ +void BitcoinGUI::selectProfileImageFile(){ + QMessageBox msgBox; + msgBox.setText("Would you like to change the current profile image or remove it and restore the original Pac logo?"); + QPushButton *changeImage = msgBox.addButton(tr("Change Profile Image"), QMessageBox::ActionRole); + QPushButton *removeRestoreImage = msgBox.addButton(tr("Remove and Restore"), QMessageBox::ActionRole); + QPushButton *abortButton = msgBox.addButton(QMessageBox::Cancel); + msgBox.exec(); + + QSettings settings; + if (msgBox.clickedButton() == changeImage)// change image + { + //there is a bug with qt which won't let load .png files: output error will be: libpng error: Read Error + QString imgPath = QFileDialog::getOpenFileName(this, QObject::tr("Choose Profile Picture"),"/",QObject::tr("Images (*.xpm *.jpg)")); + if(!imgPath.isEmpty() && !imgPath.isNull()){ + // when the user click on ok button inside the file picker + // Copy the image to the Pac Folder: + boost::filesystem::path directoryToCopy = GetDefaultDataDir(); + std::string imgFinalPath = directoryToCopy.string() + "/profileImg";//concatenate every substring to create the final path std string + + std::ifstream ifs(imgPath.toStdString(), std::ios::binary);//copy img file + std::ofstream ofs(imgFinalPath, std::ios::binary);//paste img file + ofs << ifs.rdbuf(); + imgPath = QString::fromUtf8(imgFinalPath.c_str());//parse from std string to QString + + // saves the path as setting and then refresh the profile image button + settings.setValue("profilePicture", imgPath); + } + } + else if (msgBox.clickedButton() == removeRestoreImage)// remove and restore pac logo + { + settings.setValue("profilePicture", ":/icons/bitcoin"); + } + else if (msgBox.clickedButton() == abortButton){ + settings.sync(); + return; + } + settings.sync(); + setProfileImage(); +} + void BitcoinGUI::showNormalIfMinimized(bool fToggleHidden) { if(!clientModel) @@ -1446,6 +1719,25 @@ void BitcoinGUI::showModalOverlay() modalOverlay->toggleVisibility(); } +/** Copy the new into the clipboard */ +void BitcoinGUI::copyNews(){ + QClipboard *clip = QApplication::clipboard(); + QString input = messageLabel->text(); + clip->setText(input); + QToolTip::showText(btnCopyNews->mapToGlobal(QPoint(10,10)), "Copied news to clipboard!",btnCopyNews); +} + +/** Button on the top bar to refresh news and pac value */ +void BitcoinGUI::refreshNewsPacValue(){ + //Refresh news + requestNews.setUrl(QUrl("http://144.202.121.149:8080/")); + managerNews->get(requestNews); + + //Refresh PAC value + requestCurrency.setUrl(QUrl("http://explorer.pachub.io/api/currency/USD")); + managerCurrency->get(requestCurrency); +} + static bool ThreadSafeMessageBox(BitcoinGUI *gui, const std::string& message, const std::string& caption, unsigned int style) { bool modal = (style & CClientUIInterface::MODAL); @@ -1491,6 +1783,39 @@ void BitcoinGUI::handleRestart(QStringList args) Q_EMIT requestedRestart(args); } +/** Manager that waits for the response of the value of PAC */ +void BitcoinGUI::managerCurrencyFinished(QNetworkReply *replyC) { + if (replyC->error()) { + QSettings settings; + settings.setValue("PACvalue","0"); + settings.sync(); + Q_EMIT transmit_to_walletframe(); + return; + } + QString answer = replyC->readAll(); + + // The value is in JSON the value is just cropped from the string + QSettings settings; + QStringList list1 = answer.split('"'); + QString s = list1[6]; + s = s.mid(1, s.length()-2); + // Value saved on settings + settings.setValue("PACvalue",s); + settings.sync(); + // Call to update the windows where the PAC value is shown + Q_EMIT transmit_to_walletframe(); +} + +/** Manager that waits for the response of the news */ +void BitcoinGUI::managerNewsFinished(QNetworkReply *replyN) { + if (replyN->error()) { + messageLabel->setText("News not loading."); + return; + } + QString answer = replyN->readAll(); + messageLabel->setText(answer); +} + UnitDisplayStatusBarControl::UnitDisplayStatusBarControl(const PlatformStyle *platformStyle) : optionsModel(0), menu(0) @@ -1506,7 +1831,7 @@ UnitDisplayStatusBarControl::UnitDisplayStatusBarControl(const PlatformStyle *pl } setMinimumSize(max_width, 0); setAlignment(Qt::AlignRight | Qt::AlignVCenter); - setStyleSheet(QString("QLabel { color : %1 }").arg(platformStyle->SingleColor().name())); + setStyleSheet(QString("QLabel { color : #fff }").arg(platformStyle->SingleColor().name())); } /** So that it responds to button clicks */ diff --git a/src/qt/bitcoingui.h b/src/qt/bitcoingui.h index 36d42753d688..01361415bea2 100644 --- a/src/qt/bitcoingui.h +++ b/src/qt/bitcoingui.h @@ -17,7 +17,12 @@ #include #include #include +#include #include +#include +#include +#include +#include class ClientModel; class NetworkStyle; @@ -98,6 +103,7 @@ class BitcoinGUI : public QMainWindow QAction *overviewAction; QAction *historyAction; QAction *masternodeAction; + QAction *privateAction; QAction *proposalAction; QAction *quitAction; QAction *sendCoinsAction; @@ -137,12 +143,30 @@ class BitcoinGUI : public QMainWindow HelpMessageDialog *helpMessageDialog; ModalOverlay *modalOverlay; + QFrame *headerFrame; + QPushButton *btnImg; + QToolButton *btnRefresh; + QToolButton *btnCopyNews; + QLabel *messageLabel; + + QNetworkAccessManager *managerCurrency; + QNetworkRequest requestCurrency; + QNetworkAccessManager *managerNews; + QNetworkRequest requestNews; + + QPixmap backgroundImage; + QPalette palette; + + /** override events */ + virtual void resizeEvent(QResizeEvent *event); + /** Keep track of previous number of blocks, to detect progress */ int prevBlocks; int spinnerFrame; const PlatformStyle *platformStyle; + void setProfileImage(); /** Create the main UI actions. */ void createActions(); /** Create the menu bar and sub-menus. */ @@ -153,7 +177,8 @@ class BitcoinGUI : public QMainWindow void createTrayIcon(const NetworkStyle *networkStyle); /** Create system tray menu (or setup the dock menu) */ void createIconMenu(QMenu *pmenu); - + /** Create the top header bar where the message and profile picture will be located*/ + void createHeaderBar(); /** Enable or disable all wallet-related actions */ void setWalletActionsEnabled(bool enabled); @@ -173,6 +198,9 @@ class BitcoinGUI : public QMainWindow /** Restart handling */ void requestedRestart(QStringList args); + /** Refresh PAC value to the walletframe */ + void transmit_to_walletframe(); + public Q_SLOTS: /** Set number of connections shown in the UI */ void setNumConnections(int count); @@ -219,6 +247,8 @@ private Q_SLOTS: void gotoOverviewPage(); /** Switch to history (transactions) page */ void gotoHistoryPage(); + /** Switch to private (section) page */ + void gotoPrivatePage(); /** Switch to masternode page */ void gotoMasternodePage(); /** Switch to proposal page */ @@ -233,9 +263,21 @@ private Q_SLOTS: /** Show Sign/Verify Message dialog and switch to verify message tab */ void gotoVerifyMessageTab(QString addr = ""); + /** API PAC_USD request */ + void managerCurrencyFinished(QNetworkReply *replyC); + /** API News request */ + void managerNewsFinished(QNetworkReply *replyN); + /** Copy the text of the news */ + void copyNews(); + /** Refresh the news and the PAC value */ + void refreshNewsPacValue(); + + /** Show open dialog */ void openClicked(); #endif // ENABLE_WALLET + /** It will open a file picker to choose the image file*/ + void selectProfileImageFile(); /** Show configuration dialog */ void optionsClicked(); /** Show about dialog */ diff --git a/src/qt/bitcoinunits.cpp b/src/qt/bitcoinunits.cpp index dda3725067de..e2db420403a2 100644 --- a/src/qt/bitcoinunits.cpp +++ b/src/qt/bitcoinunits.cpp @@ -9,6 +9,9 @@ #include #include +#include +#include +#include BitcoinUnits::BitcoinUnits(QObject *parent): QAbstractListModel(parent), @@ -144,10 +147,19 @@ QString BitcoinUnits::format(int unit, const CAmount& nIn, bool fPlus, Separator else if (fPlus && n > 0) quotient_str.insert(0, '+'); + //a substring is created in order to replace spaces with commas for easier reading. + QString _str; + _str = quotient_str.simplified(); + _str.replace( " ", "," ); + if (num_decimals <= 0) - return quotient_str; + return _str; - return quotient_str + QString(".") + remainder_str; + //then it adds the dot and the cents: + /*if(remainder_str.toInt()==0){ + return _str + QString(".00"); + }*/ + return _str + QString(".") + remainder_str; } @@ -268,3 +280,14 @@ CAmount BitcoinUnits::maxMoney() { return MAX_MONEY; } + +QString BitcoinUnits::pacToUsd(CAmount balance) +{ + QSettings settings; + qint64 bal = (qint64)balance; + qint64 tbal = (bal > 0 ? bal : -bal); + double dbal = tbal; + double dval = (settings.value("PACvalue").toString()).toDouble(); + QString s_n_abs = QString::number((dbal/100000000)*dval); + return s_n_abs; +} \ No newline at end of file diff --git a/src/qt/bitcoinunits.h b/src/qt/bitcoinunits.h index 40011ea34180..fef5ff2c3720 100644 --- a/src/qt/bitcoinunits.h +++ b/src/qt/bitcoinunits.h @@ -102,6 +102,8 @@ class BitcoinUnits: public QAbstractListModel static QString getAmountColumnTitle(int unit); ///@} + static QString pacToUsd(CAmount balance); + //! @name AbstractListModel implementation //! List model for unit drop-down selection box. ///@{ diff --git a/src/qt/coincontroldialog.cpp b/src/qt/coincontroldialog.cpp index aae7d2ab4a63..34dea5de7964 100644 --- a/src/qt/coincontroldialog.cpp +++ b/src/qt/coincontroldialog.cpp @@ -46,10 +46,16 @@ CoinControlDialog::CoinControlDialog(const PlatformStyle *platformStyle, QWidget platformStyle(platformStyle) { ui->setupUi(this); - /* Open CSS when configured */ this->setStyleSheet(GUIUtil::loadStyleSheet()); + // set the typography correctly + QFont selectedFont = GUIUtil::getCustomSelectedFont(); + QList widgets = this->findChildren(); + for (int i = 0; i < widgets.length(); i++){ + widgets.at(i)->setFont(selectedFont); + } + // context menu actions QAction *copyAddressAction = new QAction(tr("Copy address"), this); QAction *copyLabelAction = new QAction(tr("Copy label"), this); @@ -131,11 +137,11 @@ CoinControlDialog::CoinControlDialog(const PlatformStyle *platformStyle, QWidget ui->treeWidget->headerItem()->setText(COLUMN_CHECKBOX, QString()); ui->treeWidget->setColumnWidth(COLUMN_CHECKBOX, 84); - ui->treeWidget->setColumnWidth(COLUMN_AMOUNT, 100); + ui->treeWidget->setColumnWidth(COLUMN_AMOUNT, 120); ui->treeWidget->setColumnWidth(COLUMN_LABEL, 170); - ui->treeWidget->setColumnWidth(COLUMN_ADDRESS, 190); + ui->treeWidget->setColumnWidth(COLUMN_ADDRESS, 240); ui->treeWidget->setColumnWidth(COLUMN_PRIVATESEND_ROUNDS, 88); - ui->treeWidget->setColumnWidth(COLUMN_DATE, 80); + ui->treeWidget->setColumnWidth(COLUMN_DATE, 90); ui->treeWidget->setColumnWidth(COLUMN_CONFIRMATIONS, 100); ui->treeWidget->setColumnHidden(COLUMN_TXHASH, true); // store transaction hash in this column, but don't show it ui->treeWidget->setColumnHidden(COLUMN_VOUT_INDEX, true); // store vout index in this column, but don't show it @@ -700,7 +706,7 @@ void CoinControlDialog::updateView() ui->treeWidget->clear(); ui->treeWidget->setEnabled(false); // performance, otherwise updateLabels would be called for every checked checkbox - ui->treeWidget->setAlternatingRowColors(!treeMode); + ui->treeWidget->setAlternatingRowColors(false); QFlags flgCheckbox = Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsUserCheckable; QFlags flgTristate = Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsUserCheckable | Qt::ItemIsTristate; diff --git a/src/qt/darksendconfig.cpp b/src/qt/darksendconfig.cpp index 1ec1f51d9ddb..65755da7cda2 100644 --- a/src/qt/darksendconfig.cpp +++ b/src/qt/darksendconfig.cpp @@ -1,6 +1,7 @@ #include "darksendconfig.h" #include "ui_darksendconfig.h" +#include "guiutil.h" #include "bitcoinunits.h" #include "guiconstants.h" #include "optionsmodel.h" @@ -19,6 +20,13 @@ DarksendConfig::DarksendConfig(QWidget *parent) : { ui->setupUi(this); + // set the typography correctly + QFont selectedFont = GUIUtil::getCustomSelectedFont(); + QList widgets = this->findChildren(); + for (int i = 0; i < widgets.length(); i++){ + widgets.at(i)->setFont(selectedFont); + } + connect(ui->buttonBasic, SIGNAL(clicked()), this, SLOT(clickBasic())); connect(ui->buttonHigh, SIGNAL(clicked()), this, SLOT(clickHigh())); connect(ui->buttonMax, SIGNAL(clicked()), this, SLOT(clickMax())); diff --git a/src/qt/forms/coincontroldialog.ui b/src/qt/forms/coincontroldialog.ui index f890e8212a3c..21a808ec510d 100644 --- a/src/qt/forms/coincontroldialog.ui +++ b/src/qt/forms/coincontroldialog.ui @@ -358,7 +358,7 @@ - + 0 0 @@ -371,7 +371,7 @@ - + 0 0 @@ -386,6 +386,12 @@ + + + 0 + 0 + + (1 locked) diff --git a/src/qt/forms/editaddressdialog.ui b/src/qt/forms/editaddressdialog.ui index c1aea3633892..2be9121258dc 100644 --- a/src/qt/forms/editaddressdialog.ui +++ b/src/qt/forms/editaddressdialog.ui @@ -21,9 +21,20 @@ + + + 13 + + + + Qt::LeftToRight + &Label + + Qt::AlignCenter + labelEdit @@ -31,16 +42,35 @@ + + + Volte Rounded + + The label associated with this address list entry + + LineEditSmall + + + + 13 + + + + Qt::LeftToRight + &Address + + Qt::AlignCenter + addressEdit @@ -48,9 +78,17 @@ + + + Volte Rounded + + The address associated with this address list entry. This can only be modified for sending addresses. + + LineEditSmall + diff --git a/src/qt/forms/helpmessagedialog.ui b/src/qt/forms/helpmessagedialog.ui index 437eb5101848..1a0ce78a129e 100755 --- a/src/qt/forms/helpmessagedialog.ui +++ b/src/qt/forms/helpmessagedialog.ui @@ -76,7 +76,7 @@ false - :/images/drkblue/about + :/images/pac/about false @@ -113,8 +113,8 @@ 0 0 - 630 - 201 + 642 + 214 diff --git a/src/qt/forms/masternodelist.ui b/src/qt/forms/masternodelist.ui index e4e10d233678..c12547b3189a 100644 --- a/src/qt/forms/masternodelist.ui +++ b/src/qt/forms/masternodelist.ui @@ -31,6 +31,19 @@ 0 + + + + color: #7B7B7B; + + + <html><head/><body><p>Note: Status of your masternodes in local wallet can potentially be slightly incorrect. Always wait for wallet to sync additional data and then<br/>double check from another node if your masternode should be running but you still do not see &quot;ENABLED&quot; in &quot;Status&quot; field.</p></body></html> + + + true + + + @@ -47,7 +60,7 @@ - 0 + 1 @@ -64,13 +77,6 @@ 0 - - - - Note: Status of your masternodes in local wallet can potentially be slightly incorrect.<br />Always wait for wallet to sync additional data and then double check from another node<br />if your masternode should be running but you still do not see "ENABLED" in "Status" field. - - - @@ -260,6 +266,9 @@ Filter masternode list + + LineEdit + diff --git a/src/qt/forms/modaloverlay.ui b/src/qt/forms/modaloverlay.ui index 6de1abcac63d..16a62ddffb7c 100644 --- a/src/qt/forms/modaloverlay.ui +++ b/src/qt/forms/modaloverlay.ui @@ -7,7 +7,7 @@ 0 0 640 - 382 + 398 @@ -78,16 +78,38 @@ 0 + + + + border-image: + + + false + + + 0 + 0 + + + + + 0 + 55 + + + + border:0px; + - + :/icons/warning :/icons/warning:/icons/warning @@ -349,6 +371,12 @@ Hide + + false + + + false + @@ -386,6 +414,8 @@ 1 - + + + diff --git a/src/qt/forms/optionsdialog.ui b/src/qt/forms/optionsdialog.ui index c75538c59284..b1d9c26961ed 100644 --- a/src/qt/forms/optionsdialog.ui +++ b/src/qt/forms/optionsdialog.ui @@ -6,10 +6,22 @@ 0 0 - 576 - 457 + 600 + 469 + + + 600 + 0 + + + + + 600 + 16777215 + + Options @@ -18,9 +30,9 @@ - + - 0 + 4 @@ -53,7 +65,11 @@ - + + + SpinBoxSmall + + @@ -100,6 +116,9 @@ (0 = auto, <0 = leave that many cores free) + + SpinBoxSmall + @@ -229,6 +248,9 @@ 4 + + SpinBoxSmall + @@ -271,6 +293,9 @@ 20000 + + SpinBoxSmall + @@ -357,6 +382,9 @@ IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1) + + LineEditSmall + @@ -389,6 +417,9 @@ Port of the proxy (e.g. 9050) + + LineEditSmall + @@ -544,6 +575,9 @@ IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1) + + LineEditSmall + @@ -576,6 +610,9 @@ Port of the proxy (e.g. 9050) + + LineEditSmall + @@ -766,8 +803,25 @@ Third party URLs (e.g. a block explorer) that appear in the transactions tab as context menu items.<br/>%s in the URL is replaced by transaction hash. Multiple URLs are separated by vertical bar |. + + LineEditSmall + + + + + + + + + + + Font Type: + + + + @@ -840,6 +894,9 @@ Reset all client options to default. + + + &Reset Options @@ -865,10 +922,16 @@ - 200 + 150 0 + + + 200 + 16777215 + + 75 @@ -891,9 +954,12 @@ Qt::Horizontal + + QSizePolicy::Fixed + - 40 + 20 48 diff --git a/src/qt/forms/overviewpage.ui b/src/qt/forms/overviewpage.ui index 6e35fb8fce9a..56d3715b7401 100644 --- a/src/qt/forms/overviewpage.ui +++ b/src/qt/forms/overviewpage.ui @@ -7,7 +7,7 @@ 0 0 960 - 527 + 466 @@ -19,7 +19,24 @@ Form + + QFrame{ + margin:10px; +} + + + 2 + + + 2 + + + 2 + + + 2 + @@ -40,586 +57,749 @@ - + + + 3 + + + QLayout::SetDefaultConstraint + - + + + + 0 + 0 + + + + + 450 + 0 + + + + + QFrame::StyledPanel QFrame::Raised + + container + + + 9 + + + 9 + + + 10 + + + 10 + - - - - - Balances - - - - - - - The displayed information may be out of date. Your wallet automatically synchronizes with the $PAC network after a connection is established, but this process has not completed yet. - - - QLabel { color: transparent; } - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - + + + + 0 + 0 + + + + + 16777215 + 1 + + + + The displayed information may be out of date. Your wallet automatically synchronizes with the $PAC network after a connection is established, but this process has not completed yet. + + + QLabel { color: transparent; } + + + + + - - - 12 - - - - - - 75 - true - - - - IBeamCursor - - - Unconfirmed transactions to watch-only addresses - - - 0.000 000 00 BTC - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse - - - - - - - - 75 - true - - - - IBeamCursor - - - Total of transactions that have yet to be confirmed, and do not yet count toward the spendable balance - - - 0.000 000 00 BTC - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse - - - - - - - - 75 - true - - - - IBeamCursor - - - Mined balance in watch-only addresses that has not yet matured - - - 0.000 000 00 BTC - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse - - - - - - - Qt::Horizontal - - - - - + + + 0 0 - - - 140 - 0 - - - - Qt::Horizontal - - - - - - - Total: - - - - - - 75 - true - - - - IBeamCursor - - - Mined balance that has not yet matured - - - 0.000 000 00 BTC - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Immature: - - - - - - - - 75 - true - - - - IBeamCursor - - - Your current total balance - - - 0.000 000 00 BTC - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse - - - - - - - - 75 - true + 18 + 50 + false - - IBeamCursor - - - Current total balance in watch-only addresses - - 0.000 000 00 BTC + Available Balance - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignCenter - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + titleLabel - - - - Watch-only: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 - + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 40 + 20 + + + + + + + + 0 + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 60 + 16777215 + + + + margin:0px; + + + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + labelPacIcon + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 10 + 20 + + + + + + + + + 75 + true + + + + IBeamCursor + + + Your current spendable balance + + + margin:0px; + + + 0.000 000 00 BTC + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + + pacCoinsLabel + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 40 + 20 + + + + + - - - - Available: - - + + + + + + $ 0.00 USD + + + Qt::AlignCenter + + + usdLabel + + + + + + + + 75 + true + + + + IBeamCursor + + + Your current balance in watch-only addresses + + + 0.000 000 00 BTC + + + Qt::AlignCenter + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + + + - - + + - 75 - true + 18 + 50 + false + false + false + true - - IBeamCursor + + 1 - - Your current spendable balance + + 0 - 0.000 000 00 BTC - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse - - - - - - - - 75 - true - + Pending - - IBeamCursor - - - Your current balance in watch-only addresses - - - 0.000 000 00 BTC + + false - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignCenter - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + -4 - - - - - - Pending: + + titleLabel - - - - Spendable: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + 0 + + + + + + 0 + 0 + + + + + 60 + 16777215 + + + + margin:0px; + + + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + labelPacIcon + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 10 + 20 + + + + + + + + + 75 + true + + + + IBeamCursor + + + Total of transactions that have yet to be confirmed, and do not yet count toward the spendable balance + + + margin:0p; + + + 0.000 000 00 BTC + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + + pacCoinsLabel + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 40 + 20 + + + + + - - - - - - - - - Qt::LeftToRight - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - - - 75 - true - - - - PrivatePAC - - + + + + + $ 0.00 USD + + + Qt::AlignCenter + + + usdLabel + + + + + + + + 75 + true + + + + IBeamCursor + + + Unconfirmed transactions to watch-only addresses + + + 0.000 000 00 BTC + + + Qt::AlignCenter + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + + + - - - The displayed information may be out of date. Your wallet automatically synchronizes with the Paccoin network after a connection is established, but this process has not completed yet. - - - QLabel { color: transparent; } - - - (out of sync) - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - + + + + + + 18 + + + + Immature + + + Qt::AlignCenter + + + titleLabel + + + + + + + + 75 + true + + + + IBeamCursor + + + Mined balance in watch-only addresses that has not yet matured + + + 0.000 000 00 BTC + + + Qt::AlignCenter + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + + + + + + + 75 + true + + + + IBeamCursor + + + Mined balance that has not yet matured + + + 0.000 000 00 BTC + + + Qt::AlignCenter + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + + pacCoinsLabel + + + + - + - Qt::Horizontal + Qt::Vertical + + + QSizePolicy::Expanding - 40 - 20 + 20 + 40 - - - - - - QFormLayout::AllNonFixedFieldsGrow - - - 11 - - - 12 - - - - - Status: - - - - - - - Enabled/Disabled - - - - - - - Completion: - - - - - - - - 154 - 16777215 - - - - 0 - - - - - - - PrivateSend Balance: - - - - - + + - 75 - true + 18 - 0 $PAC - - - - - - - Amount and Rounds: - - - - - - - 0 $PAC / 0 Rounds - - - - - - - Submitted Denom: - - - - - - - The denominations you submitted to the Masternode.<br>To mix, other users must submit the exact same denominations. - - - n/a - - - - - - - - - - - (Last Message) + Total Balance - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + Qt::AlignCenter - - true + + titleLabel - - - - 0 - 0 - - - - Start/Stop Mixing - - + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + 0 + 0 + + + + margin:0px; + + + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + labelPacIcon + + + + + + + + 75 + true + + + + IBeamCursor + + + Your current total balance + + + margin:0px; + + + 0.000 000 00 BTC + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + + pacCoinsLabel + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 40 + 20 + + + + + - + - - - - 0 - 0 - + + + Qt::Horizontal - - Try to manually submit a PrivateSend request. + + QSizePolicy::Fixed + + + 50 + 20 + + + + + + - Try Mix + $ 0.00 USD + + + Qt::AlignCenter + + + usdLabel - - - - 0 - 0 - + + + + 75 + true + - - Reset the current status of PrivateSend (can interrupt PrivateSend if it's in the process of Mixing, which can cost you money!) + + IBeamCursor - - false + + Current total balance in watch-only addresses - Reset + 0.000 000 00 BTC + + + Qt::AlignCenter + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse - + - + 0 0 - - Information about PrivateSend and Mixing + + + 30 + 30 + + + + border-image: url(":/icons/pac/info"); - Info + + + + QuickButton @@ -630,32 +810,53 @@ - - - - Qt::Vertical - - - - 20 - 40 - - - - - + + + + QFrame::StyledPanel QFrame::Raised + + container + + + + + + 0 + 0 + + + + + 16777215 + 1 + + + + The displayed information may be out of date. Your wallet automatically synchronizes with the Paccoin network after a connection is established, but this process has not completed yet. + + + QLabel { color: transparent; } + + + (out of sync) + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + @@ -663,43 +864,20 @@ 18 - 75 - true + 50 + false RECENT TRANSACTIONS - - - - - - The displayed information may be out of date. Your wallet automatically synchronizes with the Paccoin network after a connection is established, but this process has not completed yet. - - - QLabel { color: transparent; } - - - (out of sync) - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - - Qt::Horizontal + Qt::AlignCenter - - - 40 - 20 - + + titleLabel - + @@ -728,19 +906,6 @@ - - - - Qt::Vertical - - - - 20 - 40 - - - - diff --git a/src/qt/forms/privatepage.ui b/src/qt/forms/privatepage.ui new file mode 100644 index 000000000000..22f571568465 --- /dev/null +++ b/src/qt/forms/privatepage.ui @@ -0,0 +1,573 @@ + + + PrivatePage + + + + 0 + 0 + 960 + 551 + + + + + 960 + 0 + + + + Form + + + + + + + 0 + + + + + false + + + QLabel { background-color: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop:0 #F0D0A0, stop:1 #F8D488); color:#000000; } + + + true + + + 3 + + + Qt::TextSelectableByMouse + + + + + + + + + Qt::Horizontal + + + QSizePolicy::MinimumExpanding + + + + 10 + 20 + + + + + + + + 25 + + + 25 + + + + + + 800 + 0 + + + + + 1000 + 16777215 + + + + Qt::LeftToRight + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 20 + 0 + + + + + + + + + 0 + 0 + + + + (Last Message) + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + true + + + + + + + The displayed information may be out of date. Your wallet automatically synchronizes with the Paccoin network after a connection is established, but this process has not completed yet. + + + QLabel { color: transparent; } + + + (out of sync) + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 30 + 30 + + + + + 30 + 30 + + + + Information about PrivateSend and Mixing + + + border-image: url(":/icons/pac/info"); + + + + + + QuickButton + + + + + + + + + + 18 + 50 + false + + + + PRIVATE + + + Qt::AlignCenter + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + PrivateSend Balance: + + + Qt::AlignCenter + + + + + + + + 75 + true + + + + 0 $PAC + + + Qt::AlignCenter + + + + + + + Qt::Vertical + + + QSizePolicy::Preferred + + + + 20 + 40 + + + + + + + + Amount and Rounds: + + + Qt::AlignCenter + + + + + + + 0 $PAC / 0 Rounds + + + Qt::AlignCenter + + + + + + + Qt::Vertical + + + QSizePolicy::Preferred + + + + 20 + 40 + + + + + + + + Status: + + + Qt::AlignCenter + + + + + + + Enabled/Disabled + + + Qt::AlignCenter + + + + + + + + + Completion: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 154 + 16777215 + + + + 0 + + + Qt::AlignCenter + + + + + + + + + + + Submitted Denom: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + The denominations you submitted to the Masternode.<br>To mix, other users must submit the exact same denominations. + + + n/a + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 100 + 20 + + + + + + + + + + + 0 + 0 + + + + + 330 + 16777215 + + + + Start/Stop Mixing + + + accentButton + + + + + + + + + + 0 + 0 + + + + + 160 + 16777215 + + + + Try to manually submit a PrivateSend request. + + + Try Mix + + + + + + + + 0 + 0 + + + + + 160 + 16777215 + + + + Reset the current status of PrivateSend (can interrupt PrivateSend if it's in the process of Mixing, which can cost you money!) + + + false + + + Reset + + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 100 + 20 + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 10 + 20 + + + + + + + + + + + diff --git a/src/qt/forms/receivecoinsdialog.ui b/src/qt/forms/receivecoinsdialog.ui index cc8a2caafbd9..ee3f561fbdb0 100644 --- a/src/qt/forms/receivecoinsdialog.ui +++ b/src/qt/forms/receivecoinsdialog.ui @@ -6,307 +6,897 @@ 0 0 - 1440 - 414 + 982 + 553 - - - - - - 0 - 0 - - - - QFrame::StyledPanel - - - QFrame::Sunken - - - - - - - - Reuse one of the previously used receiving addresses.<br>Reusing addresses has security and privacy issues.<br>Do not use this unless re-generating a payment request made before. - - - R&euse an existing receiving address (not recommended) - - - - - - - - - - - - - - An optional message to attach to the payment request, which will be displayed when the request is opened. Note: The message will not be sent with the payment over the Paccoin network. - - - &Message: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - reqMessage - - - - - - - An optional label to associate with the new receiving address. - - - - - - - An optional message to attach to the payment request, which will be displayed when the request is opened.<br>Note: The message will not be sent with the payment over the Paccoin network. - - - - - - - Use this form to request payments. All fields are <b>optional</b>. - - - - - - - An optional label to associate with the new receiving address. - - - &Label: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - reqLabel - - - - - - - An optional amount to request. Leave this empty or zero to not request a specific amount. - - - &Amount: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - reqAmount - - - - - - - - 80 - 0 - - - - An optional amount to request. Leave this empty or zero to not request a specific amount. - - - - - - - - - - 150 - 0 - - - - &Request payment - - - - - - - - 0 - 0 - - - - Clear all fields of the form. - - - Clear - - - false - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - - - - - - Request InstantPAC - - - true - - - - - - - - - - - - Qt::Vertical - - - - 20 - 10 - - - - + + + 0 + 0 + + + + QFrame{ + border:none; +} + + + container + + - + - + 0 0 - - QFrame::StyledPanel - - - QFrame::Raised - - + - - - - 75 - true - + + + + 0 + 0 + - - Requested payments history + + + 16777215 + 16777215 + + + + 50 + + + 17 + + + 50 + + + 20 + + + + + + 0 + 250 + + + + + 16777215 + 450 + + + + + + + + + + 0 + 0 + + + + An optional label to associate with the new receiving address. + + + &Label: + + + Qt::AlignCenter + + + titleLabel + + + + + + + + 0 + 0 + + + + + 300 + 16777215 + + + + An optional amount to request. Leave this empty or zero to not request a specific amount. + + + &Amount: + + + Qt::AlignCenter + + + titleLabel + + + + + + + + + + + + 0 + 0 + + + + + 200 + 0 + + + + + 16777215 + 16777215 + + + + An optional label to associate with the new receiving address. + + + Qt::AlignCenter + + + LineEdit + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 300 + 16777215 + + + + An optional amount to request. Leave this empty or zero to not request a specific amount. + + + + + + LineEdit + + + + + + + + + + 0 + 0 + + + + An optional message to attach to the payment request, which will be displayed when the request is opened. Note: The message will not be sent with the payment over the Paccoin network. + + + &Message: + + + Qt::AlignCenter + + + titleLabel + + + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + An optional message to attach to the payment request, which will be displayed when the request is opened.<br>Note: The message will not be sent with the payment over the Paccoin network. + + + LineEdit + + + + + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + Reuse one of the previously used receiving addresses.<br>Reusing addresses has security and privacy issues.<br>Do not use this unless re-generating a payment request made before. + + + R&euse an existing receiving address (not recommended) + + + + + + + + 0 + 0 + + + + + 150 + 0 + + + + + 16777215 + 16777215 + + + + Request InstantPAC + + + true + + + + + + + + + + + + + + + 0 + 0 + + + + + 13 + 75 + true + + + + Requested payments history + + + + + + + false + + + Show the selected request (does the same as double clicking an entry) + + + + + + Show + + + false + + + linkButton + + + + + + + false + + + Remove the selected entries from the list + + + + + + Remove + + + false + + + linkButton + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 0 + 0 + + + + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + Qt::CustomContextMenu + + + + + + false + + + true + + + + - + + + + 0 + 0 + + 0 0 - - Qt::CustomContextMenu - - - false - - - true + + + 450 + 16777215 + + + + 2 + + + 5 + + + 27 + + + 20 + + + 15 + + + + + + 0 + 0 + + + + + 0 + 0 + + + + AVAILABLE BALANCE + + + Qt::AlignCenter + + + titleLabel + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + + 30 + 30 + + + + + + + + + + + + 0 + 0 + + + + 123,456.00 + + + pacCoinsLabel + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + 0 + 0 + + + + $ 0.00 USD + + + Qt::AlignCenter + + + usdLabel + + + + + + + Qt::Vertical + + + QSizePolicy::Preferred + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + + 400 + 400 + + + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 0 + 10 + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 35 + 20 + + + + + + + + true + + + + 0 + 0 + + + + + 0 + 0 + + + + + 300 + 16777215 + + + + + 11 + + + + false + + + Last PAC Address generated + + + 2 + + + Last PAC Address + + + + + + Qt::ImhNone + + + + + + + + + false + + + Qt::AlignCenter + + + true + + + PAC Address + + + false + + + LineEditMedium + + + + + + + + 0 + 0 + + + + + 30 + 30 + + + + Copy Last PAC Address Generated + + + + + + + :/icons/pac/editcopy:/icons/pac/editcopy + + + + 24 + 24 + + + + false + + + false + + + false + + + QToolButton::InstantPopup + + + Qt::ToolButtonIconOnly + + + true + + + Qt::NoArrow + + + QuickButton + + + + + + + + + Qt::Vertical + + + QSizePolicy::Preferred + + + + 0 + 10 + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 45 + 10 + + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + Request a Payment and generates the Address and QRCode + + + &Request payment + + + accentButton + + + + + + + + + 9 + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 160 + 20 + + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + Clear all fields of the form. + + + Qt::LeftToRight + + + Clear + + + false + + + + + + - - - - - - false - - - Show the selected request (does the same as double clicking an entry) - - - Show - - - false - - - - - - - false - - - Remove the selected entries from the list - - - Remove - - - false - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - @@ -321,13 +911,6 @@ - reqLabel - reqAmount - reqMessage - reuseAddress - receiveButton - clearButton - recentRequestsView showRequestButton removeRequestButton diff --git a/src/qt/forms/sendcoinsdialog.ui b/src/qt/forms/sendcoinsdialog.ui index 4ec296db1b35..c44528297bf5 100644 --- a/src/qt/forms/sendcoinsdialog.ui +++ b/src/qt/forms/sendcoinsdialog.ui @@ -6,162 +6,62 @@ 0 0 - 850 + 1028 584 Send Coins - + + + + + + + 8 - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - QFrame::StyledPanel + + + 0 - - QFrame::Sunken - - - - 0 - - - 0 - - - 0 - - - 0 - - - 6 - - - - - 0 - + + + + + 0 + 0 + + + + + 1500 + 16777215 + + + + container + + - 10 + 50 - 10 + 25 + + + 50 + + + 30 - - - 15 - - - - - - 0 - 0 - - - - - 75 - true - - - - font-weight:bold; - - - Coin Control Features - - - - - - - - - 8 - - - 10 - - - - - - - - Inputs... - - - false - - - - - - - automatically selected - - - 5 - - - - - - - - 75 - true - - - - color:red;font-weight:bold; - - - Insufficient funds! - - - 5 - - - - - - - Qt::Horizontal - - - - 40 - 1 - - - - - - - - + - + 0 0 @@ -172,10 +72,22 @@ 0 - - + + + 16777215 + 220 + + + + QFrame::StyledPanel + + + QFrame::Sunken - + + + 0 + 0 @@ -186,1166 +98,2267 @@ 0 - 0 + 6 - + - 20 - - 0 - + + 10 + + 10 - - - 10 + + + + 0 + 0 + - - 14 + + + 75 + true + - - 10 + + - - 4 + + Coin Control Features - - 6 + + titleLabel - - - - - 75 - true - - - - Quantity: - - - 0 - - - - - - - IBeamCursor - - - Qt::ActionsContextMenu - - - 0 - - - 0 - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse - - - - - - - - 75 - true - - - - Bytes: - - - - - - - IBeamCursor - - - Qt::ActionsContextMenu - - - 0 - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse - - - - + - - - 10 + + + Qt::Vertical - - 14 + + QSizePolicy::Fixed - - 6 + + + 5 + 10 + - - 4 + + + + + + 5 - - 6 + + 5 - - - - - 75 - true - + + + + Qt::Horizontal - - Amount: + + QSizePolicy::Fixed - - 0 + + + 15 + 20 + - + - - - - IBeamCursor - - - Qt::ActionsContextMenu + + + + - 0.00 PAC + Inputs... - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + false + + + SmallButton - - + + - 75 - true + 12 - Dust: + automatically selected + + + 5 - - - - IBeamCursor - - - Qt::ActionsContextMenu - - - no + + + + Qt::Horizontal - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + + 40 + 20 + - + - - - - - - 10 - - - 14 - - - 6 - - - 4 - - - 6 - - - + + + 12 75 true + + color:red;font-weight:bold; + - Fee: + Insufficient funds! - 0 + 5 - - - - IBeamCursor + + + + + 0 + 0 + - - Qt::ActionsContextMenu + + + 0 + 0 + - 0.00 PAC + - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + 3 - - - 10 - - - 14 - - - 6 - - - 4 + + + 8 - - 6 + + 10 - - - - - 75 - true - + + + + Qt::Horizontal - - After Fee: + + QSizePolicy::Fixed - - 0 + + + 15 + 20 + - + - - - - IBeamCursor - - - Qt::ActionsContextMenu - - - 0.00 PAC + + + + + 0 + 0 + - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + + 176 + 0 + - - - - - 75 - true + 12 + + If this is activated, but the change address is empty or invalid, change will be sent to a newly generated address. + - Change: + Custom change address - - - - IBeamCursor + + + + false - - Qt::ActionsContextMenu + + + 0 + 0 + - - 0.00 PAC + + + 0 + 0 + + + + + 400 + 16777215 + + + + - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + LineEditSmall + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 15 + 20 + + + + - - - - - - - - - 12 - - - QLayout::SetDefaultConstraint - - - 5 - - - 5 - - - - - If this is activated, but the change address is empty or invalid, change will be sent to a newly generated address. - - - Custom change address - - - + + + + + 16777215 + 50 + + + + + + + Qt::ScrollBarAsNeeded + + + true + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + 0 + 0 + 419 + 126 + + + + background: transparent !important; + + + + + + + 0 + 0 + + + + + + + + + + + + + 0 + 0 + + + + + 70 + 0 + + + + + 13 + 75 + true + false + + + + Amount: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 0 + + + + + + + + 0 + 0 + + + + + 200 + 0 + + + + + 12 + + + + IBeamCursor + + + Qt::ActionsContextMenu + + + 0.00 PAC + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + 15 + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + + + + + + + 0 + 0 + + + + + 70 + 0 + + + + + 13 + 75 + true + false + + + + Dust: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 12 + + + + IBeamCursor + + + Qt::ActionsContextMenu + + + no + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + 4 + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 70 + 0 + + + + + 13 + 75 + true + false + + + + After Fee: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 0 + + + + + + + + 0 + 0 + + + + + 200 + 0 + + + + + 12 + + + + IBeamCursor + + + Qt::ActionsContextMenu + + + 0.00 PAC + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + 15 + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + + + + + + + 0 + 0 + + + + + 70 + 0 + + + + + 13 + 75 + true + false + + + + Bytes: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 12 + + + + IBeamCursor + + + Qt::ActionsContextMenu + + + 0 + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + 4 + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + + + + + + + + + + + 0 + 0 + + + + + 70 + 0 + + + + + 13 + 75 + true + false + + + + Fee: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 0 + + + + + + + + 0 + 0 + + + + + 200 + 0 + + + + + 16777215 + 16777215 + + + + + 12 + + + + IBeamCursor + + + Qt::ActionsContextMenu + + + 0.00 PAC + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + 15 + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + + + + + + + 0 + 0 + + + + + 70 + 0 + + + + + 13 + 75 + true + false + + + + Quantity: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 0 + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 12 + + + + IBeamCursor + + + Qt::ActionsContextMenu + + + 0 + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + 0 + + + 4 + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + + + + + + + + + + + 0 + 0 + + + + + 70 + 0 + + + + + 13 + 75 + true + false + + + + Change: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 200 + 0 + + + + + 12 + + + + IBeamCursor + + + Qt::ActionsContextMenu + + + 0.00 PAC + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + 15 + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + + + + + + + + + + + + + + + + + + + + true + + + + + 0 + 0 + 446 + 180 + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 6 + + + + + + + 1 + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 150 + + + + + + + + + + - - - false + + + 3 - - - 0 - 0 - + + + + + 0 + 0 + + + + + 150 + 0 + + + + Private PAC + + + + + + PrivatePAC + + + false + + + false + + + + + + + true + + + + 0 + 0 + + + + + 130 + 0 + + + + Instant PAC + + + InstantPAC + + + + + + + + + + + + + Qt::Vertical - + + QSizePolicy::Preferred + + + + 20 + 5 + + + - - - - 0 - 0 - + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + + + + + + 0 + 0 + + + + Convert currency + + + Qt::AlignCenter + + + titleLabel + + + + + + + USD + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + Qt::Vertical - + + QSizePolicy::Preferred + + - 0 - 0 + 20 + 5 - - + + + + + + Insert in dollars to convert to $PAC - - 3 + + LineEdit - - - - - - Qt::Vertical - - - - 800 - 1 - - - - - - - - - - - - - true - - - - - 0 - 0 - 824 - 72 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - 6 - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - QFrame::StyledPanel - - - QFrame::Sunken - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - 0 - - - 10 - - - 0 - - - - - 0 - - - - 0 + + + Qt::Vertical + + + QSizePolicy::Preferred + + + + 20 + 5 + + + + + - + - Qt::Vertical + Qt::Horizontal - QSizePolicy::Fixed + QSizePolicy::Expanding - 1 - 4 + 40 + 20 - - - 10 - + + + + + + 0 + 0 + + + + + 30 + 0 + + + + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + - + - + 0 0 + 22 75 true - - font-weight:bold; - - Transaction Fee: + 0.0 + + + Qt::AlignCenter + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse - + + + + 0 + 0 + + + + + 20 + 20 + + + + Copy PACs + + + border-image: url(:/icons/pac/editcopy); + - - - - - - Choose... + + QuickButton - + - Qt::Vertical + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 30 + 20 + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding - 1 - 1 + 40 + 20 - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - collapse fee-settings - - - Hide - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - 10 - - - 4 - - - 10 - - - 4 + + + + + + + + 0 + 0 + + + + + 460 + 0 + + + + + 510 + 16777215 + + + + container + + + + 25 + + + 25 + + + 9 + + + 30 + + + + + + + 10 + + + + + + 0 + 0 + + + + + 75 + true + + + + font-weight:bold; + + + Transaction Fee: + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + + + + + + + + + + 0 + 0 + + + + + 0 + 30 + + + + $ 0.0 USD + + + Qt::AlignCenter + + + usdLabel + + + + + + + 0 + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + + 30 + 30 + + + + + + + + + + Qt::AlignCenter + + + labelPacIcon + + + + + + + + 0 + 0 + + + + + 0 + 50 + + + + + + + 123,456.00 + + + pacCoinsLabel + + + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 40 + 20 + + + + + + + + + + 0 + + + + + Qt::Horizontal + + + QSizePolicy::MinimumExpanding + + + + 15 + 20 + + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 170 + 16777215 + + + + Send to multiple recipients at once + + + Add &Recipient + + + false + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 10 + 20 + + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 170 + 16777215 + + + + Clear all fields of the form. + + + Clear &All + + + false + + + + + + + Qt::Horizontal + + + QSizePolicy::MinimumExpanding + + + + 15 + 20 + + + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::MinimumExpanding + + + + 15 + 20 + + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + Confirm the send action + + + S&end + + + false + + + true + + + accentButton + + + + + + + Qt::Horizontal + + + QSizePolicy::MinimumExpanding + + + + 15 + 20 + + + + + + + + + + #scrollArea_2{ padding: 5px;} + + + Qt::ScrollBarAsNeeded + + + true + + + + + 0 + 0 + 408 + 461 + - - - - 6 - - - - - - - If the custom fee is set to 1000 duffs and the transaction is only 250 bytes, then "per kilobyte" only pays 250 duffs in fee,<br />while "at least" pays 1000 duffs. For transactions bigger than a kilobyte both pay by kilobyte. - - - per kilobyte - - - true - - - groupCustomFee - - - - - - - If the custom fee is set to 1000 duffs and the transaction is only 250 bytes, then "per kilobyte" only pays 250 duffs in fee,<br />while "total at least" pays 1000 duffs. For transactions bigger than a kilobyte both pay by kilobyte. - - - total at least - - - groupCustomFee - - - - - - - - - - Qt::Horizontal - - - - 1 - 1 - - - - - - - - - - - - Paying only the minimum fee is just fine as long as there is less transaction volume than space in the blocks.<br />But be aware that this can end up in a never confirming transaction once there is more demand for paccoin transactions than the network can process. - - - - - - - - - - true - - - Paying only the minimum fee is just fine as long as there is less transaction volume than space in the blocks.<br />But be aware that this can end up in a never confirming transaction once there is more demand for paccoin transactions than the network can process. - - - (read the tooltip) - - - 5 - - - - - - - Qt::Horizontal - - - - 1 - 1 - - - - - - - - - - - - - - Recommended: - - - true - - - groupFee - - - - - - - Qt::Vertical + + + + + + 0 + 0 + + + + + 400 + 16777215 + + + + QFrame::StyledPanel + + + QFrame::Sunken + + + + 0 - - - 1 - 1 - + + 0 - - - - - - - - - - Custom: + + 0 - - groupFee - - - - - - - Qt::Vertical + + 0 - - - 1 - 1 - + + 0 - - - - - - - - 6 - - - 2 - - - - - - + + + 0 - - 2 + + 0 - - - - - - - - - - - - - (Smart fee not initialized yet. This usually takes a few blocks...) - - - 2 + + 0 - - - - - - Qt::Horizontal - - - - 1 - 1 - - - - - - - - - - - - - Confirmation time: - - - 2 - + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 0 + + + 4 + + + 5 + + + 10 + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 10 + 20 + + + + + + + + true + + + Paying only the minimum fee is just fine as long as there is less transaction volume than space in the blocks.<br />But be aware that this can end up in a never confirming transaction once there is more demand for paccoin transactions than the network can process. + + + (read the tooltip) + + + 5 + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 15 + 20 + + + + + + + + 6 + + + + + Custom: + + + groupFee + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 10 + 20 + + + + + + + + + 0 + 0 + + + + If the custom fee is set to 1000 duffs and the transaction is only 250 bytes, then "per kilobyte" only pays 250 duffs in fee,<br />while "at least" pays 1000 duffs. For transactions bigger than a kilobyte both pay by kilobyte. + + + per kilobyte + + + true + + + groupCustomFee + + + + + + + + 0 + 0 + + + + If the custom fee is set to 1000 duffs and the transaction is only 250 bytes, then "per kilobyte" only pays 250 duffs in fee,<br />while "total at least" pays 1000 duffs. For transactions bigger than a kilobyte both pay by kilobyte. + + + total at least + + + groupCustomFee + + + + + + + + + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 10 + 20 + + + + + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + Paying only the minimum fee is just fine as long as there is less transaction volume than space in the blocks.<br />But be aware that this can end up in a never confirming transaction once there is more demand for paccoin transactions than the network can process. + + + + + + + + + + + + + + 6 + + + 2 + + + + + + + Recommended: + + + true + + + groupFee + + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 10 + 20 + + + + + + + + 0 + + + + + + + + + + 2 + + + + + + + + + + + + + + + + 1 + + + (Smart fee not initialized yet. This usually takes a few blocks...) + + + true + + + 2 + + + + + + + Confirmation time: + + + 2 + + + + + + + false + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + false + + + + + + 0 + + + 24 + + + 1 + + + 10 + + + 10 + + + Qt::Horizontal + + + false + + + false + + + QSlider::NoTicks + + + 0 + + + + + + + + + normal + + + + + + + fast + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + + Qt::Vertical + + + + 1 + 1 + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 15 + 20 + + + + + + + + + + 8 + + + 4 + + + + + Send as zero-fee transaction if possible + + + + + + + + + (confirmation may take longer) + + + 5 + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + - - - - Qt::Vertical - - - - 1 - 1 - - - - - - - - - - 30 - - - - - 0 - - - 24 - - - 1 - - - 0 - - - Qt::Horizontal - - - false - - - false - - - QSlider::NoTicks - - - - - - - - - normal - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - fast - - - - - - - - - - Qt::Vertical - - - - 1 - 1 - - - - - - - - - - - - 8 - - - 4 - - - - - Send as zero-fee transaction if possible - - - - - - - (confirmation may take longer) - - - 5 - - - - - - - Qt::Horizontal - - - - 1 - 1 - - - - - - - - - - Qt::Vertical - - - - 1 - 1 - - - - - - - - - - - Qt::Vertical - - - - 800 - 1 - - - + + + + + + + + + + 0 + + + + + + 80 + 18 + + + + collapse fee-settings + + + Hide + + + linkButton + + + + + + + + 0 + 0 + + + + + 80 + 18 + + + + Choose... + + + linkButton + + + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 15 + + + + + + + + + 0 + 0 + + + + + 100 + 15 + + + + AVAILABLE BALANCE + + + Qt::AlignCenter + + + titleLabel + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 0 + 5 + + + + + - - - - - - - - - - - 150 - 0 - - - - Confirm the send action - - - S&end - - - false - - - true - - - - - - - - 0 - 0 - - - - Clear all fields of the form. - - - Clear &All - - - false - - - - - - - Send to multiple recipients at once - - - Add &Recipient - - - false - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - 3 - - - - - - 95 - 0 - - - - PrivatePAC - - - false - - - - - - - true - - - - 85 - 0 - - - - InstantPAC - - - - - - - Balance: - - - - - - - - 0 - 0 - - - - IBeamCursor - - - 123.456 PAC - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse - - - - - @@ -1363,12 +2376,10 @@ 1 - - - + - + diff --git a/src/qt/forms/sendcoinsentry.ui b/src/qt/forms/sendcoinsentry.ui index 394206befb97..c6be99319087 100644 --- a/src/qt/forms/sendcoinsentry.ui +++ b/src/qt/forms/sendcoinsentry.ui @@ -7,7 +7,7 @@ 0 0 729 - 126 + 219 @@ -16,10 +16,21 @@ false + + #SendCoins, #SendCoins{ + background:transparent; +} + + + 0 + This is a normal payment. + + + QFrame::NoFrame @@ -36,20 +47,61 @@ 8 - - - - Pay &To: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - payTo - - + + + + + + + 0 + 0 + + + + &Label: + + + Qt::AlignCenter + + + addAsLabel + + + titleLabel + + + + + + + + 0 + 0 + + + + + 300 + 16777215 + + + + A&mount: + + + Qt::AlignCenter + + + payAmount + + + titleLabel + + + + - + 0 @@ -59,6 +111,45 @@ The Paccoin address to send the payment to + + LineEdit + + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 100 + 20 + + + + + + + + Pay &To: + + + Qt::AlignCenter + + + payTo + + + titleLabel + @@ -78,6 +169,9 @@ Alt+A + + QuickButton + @@ -97,6 +191,9 @@ Alt+P + + QuickButton + @@ -113,71 +210,70 @@ 22 + + QuickButton + - - - - &Label: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - addAsLabel - - - - - - - Enter a label for this address to add it to the list of used addresses - - - - - + + - A&mount: + Message: - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignCenter - - payAmount + + titleLabel - - + + + + + + Enter a label for this address to add it to the list of used addresses + + + LineEdit + + + - + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 25 + 20 + + + - - - The fee will be deducted from the amount being sent. The recipient will receive a lower amount of Paccoin than you enter in the amount field. If multiple recipients are selected, the fee is split equally. + + + + 300 + 16777215 + - - S&ubtract fee from amount + + LineEdit_PacCoins - - - - Message: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - + A message that was attached to the paccoin: URI which will be stored with the transaction for your reference. Note: This message will not be sent over the Paccoin network. @@ -187,12 +283,22 @@ - - - - Qt::Horizontal - - + + + + + + The fee will be deducted from the amount being sent. The recipient will receive a lower amount of Paccoin than you enter in the amount field. If multiple recipients are selected, the fee is split equally. + + + margin: 5px 0 0 0; + + + S&ubtract fee from amount + + + + @@ -1225,32 +1331,25 @@ - - QValidatedLineEdit - QLineEdit -
qvalidatedlineedit.h
-
BitcoinAmountField QLineEdit
bitcoinamountfield.h
1
+ + QValidatedLineEdit + QLineEdit +
qvalidatedlineedit.h
+
payTo - addressBookButton - pasteButton - deleteButton - addAsLabel - payAmount payAmount_is deleteButton_is payAmount_s deleteButton_s - - - + diff --git a/src/qt/forms/signverifymessagedialog.ui b/src/qt/forms/signverifymessagedialog.ui index 68c15d4d39ae..796a22341f83 100644 --- a/src/qt/forms/signverifymessagedialog.ui +++ b/src/qt/forms/signverifymessagedialog.ui @@ -50,6 +50,9 @@ The Paccoin address to sign the message with + + LineEditSmall +
@@ -118,6 +121,9 @@ true + + LineEditSmall + @@ -240,6 +246,9 @@ The Paccoin address the message was signed with + + LineEditSmall + @@ -264,7 +273,11 @@ - + + + LineEditSmall + + @@ -351,8 +364,6 @@
qvalidatedlineedit.h
- - - + diff --git a/src/qt/guiconstants.h b/src/qt/guiconstants.h index ca635ace6c63..908ccbd4af58 100644 --- a/src/qt/guiconstants.h +++ b/src/qt/guiconstants.h @@ -1,7 +1,9 @@ // Copyright (c) 2011-2015 The Bitcoin Core developers // Copyright (c) 2014-2017 The Dash Core developers +// Copyright (c) 2014-2019 The PACCommunity developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. +#include #ifndef BITCOIN_QT_GUICONSTANTS_H #define BITCOIN_QT_GUICONSTANTS_H @@ -18,22 +20,28 @@ static const int STATUSBAR_ICONSIZE = 16; static const bool DEFAULT_SPLASHSCREEN = true; /* Invalid field background style */ -#define STYLE_INVALID "background:#FF8080" +#define STYLE_INVALID "background:#ff4d4d" /* Transaction list -- unconfirmed transaction */ #define COLOR_UNCONFIRMED QColor(128, 128, 128) /* Transaction list -- negative amount */ -#define COLOR_NEGATIVE QColor(255, 0, 0) +#define COLOR_NEGATIVE QColor(223,31,56) /* Transaction list -- bare address (without label) */ #define COLOR_BAREADDRESS QColor(140, 140, 140) -/* Transaction list -- TX status decoration - open until date */ +/* Transaction list c TX status decoration - open until date */ #define COLOR_TX_STATUS_OPENUNTILDATE QColor(64, 64, 255) /* Transaction list -- TX status decoration - offline */ #define COLOR_TX_STATUS_OFFLINE QColor(192, 192, 192) /* Transaction list -- TX status decoration - danger, tx needs attention */ #define COLOR_TX_STATUS_DANGER QColor(200, 100, 100) +/* Transaction list -- TX status decoration - positive tansactions color */ +#define COLOR_POSITIVE QColor(46,222,95) /* Transaction list -- TX status decoration - default color */ -#define COLOR_BLACK QColor(0, 0, 0) +#define COLOR_BLACK QColor(20,20,20) +#define COLOR_WHITE QColor(255,255,255) +/* Color of the general text */ +static QColor COLOR_TEXT = QColor(128,128,128); + /* Tooltips longer than this (in characters) are converted into rich text, so that they can be word-wrapped. diff --git a/src/qt/guiutil.cpp b/src/qt/guiutil.cpp index 325366ab9602..3b70b9fcaca8 100644 --- a/src/qt/guiutil.cpp +++ b/src/qt/guiutil.cpp @@ -17,6 +17,9 @@ #include "script/script.h" #include "script/standard.h" #include "util.h" +#include "guiconstants.h" +#include +#include #ifdef WIN32 #ifdef _WIN32_WINNT @@ -88,6 +91,14 @@ QString dateTimeStr(const QDateTime &date) { return date.date().toString(Qt::SystemLocaleShortDate) + QString(" ") + date.toString("hh:mm"); } +QString timeStr(const QDateTime &date) +{ + return date.toString("hh:mm"); +} +QString dateStr(const QDateTime &date) +{ + return date.date().toString(Qt::SystemLocaleShortDate); +} QString dateTimeStr(qint64 nTime) { @@ -113,11 +124,13 @@ void setupAddressWidget(QValidatedLineEdit *widget, QWidget *parent) { parent->setFocusProxy(widget); - widget->setFont(fixedPitchFont()); + QString fontType = GUIUtil::getFontName(); + widget->setFont(QFont(fontType,14, QFont::Medium, false)); + //widget->setFont(fixedPitchFont()); #if QT_VERSION >= 0x040700 // We don't want translators to use own addresses in translations // and this is the only place, where this address is supplied. - widget->setPlaceholderText(QObject::tr("Enter a $PAC address (e.g. %1)").arg("XwnLY9Tf7Zsef8gMGL2fhWA9ZmMjt4KPwg")); + widget->setPlaceholderText(QObject::tr("Enter a $PAC address (e.g. %1)").arg("P96Vyav6w6rRJCwsDG49R3WgN2pTuie4dv")); #endif widget->setValidator(new BitcoinAddressEntryValidator(parent)); widget->setCheckValidator(new BitcoinAddressCheckValidator(parent)); @@ -898,6 +911,15 @@ void restoreWindowGeometry(const QString& strSetting, const QSize& defaultSize, } } +QFont getCustomSelectedFont() +{ + QString fontType = getFontName(); + std::cout << "font name: " << fontType.toStdString() << std::endl; + QFont font = QFont(fontType,14, QFont::Normal, false); + font.setPixelSize(14); + return font; +} + // Return name of current UI-theme or default theme if no theme was found QString getThemeName() { @@ -907,7 +929,26 @@ QString getThemeName() if(!theme.isEmpty()){ return theme; } - return QString("light"); + return QString("pac"); +} +void setGUITextColor(){ + QString theme = getThemeName(); + if( theme.toStdString().compare("pac") == 0 ) + COLOR_TEXT = QColor(255,255,255); + else + COLOR_TEXT = QColor(20,20,20); +} + +// Return name of current UI-theme or default theme if no theme was found +QString getFontName() +{ + QSettings settings; + QString FontType = settings.value("FontType", "").toString(); + + if(!FontType.isEmpty()){ + return FontType; + } + return QString("Volte Rounded"); } // Open CSS when configured @@ -919,18 +960,18 @@ QString loadStyleSheet() QString theme = settings.value("theme", "").toString(); if(!theme.isEmpty()){ - cssName = QString(":/css/") + theme; + cssName = QString(":/css/" + theme); } else { - cssName = QString(":/css/light"); - settings.setValue("theme", "light"); + cssName = QString(":/css/pac"); + settings.setValue("theme", "pac"); } QFile qFile(cssName); if (qFile.open(QFile::ReadOnly)) { styleSheet = QLatin1String(qFile.readAll()); } - + setGUITextColor(); return styleSheet; } diff --git a/src/qt/guiutil.h b/src/qt/guiutil.h index 1c600c1b2355..a84283e4c1fa 100644 --- a/src/qt/guiutil.h +++ b/src/qt/guiutil.h @@ -15,6 +15,7 @@ #include #include #include +#include #include @@ -36,6 +37,8 @@ namespace GUIUtil { // Create human-readable string from date QString dateTimeStr(const QDateTime &datetime); + QString timeStr(const QDateTime &datetime); + QString dateStr(const QDateTime &datetime); QString dateTimeStr(qint64 nTime); // Return a monospace font @@ -194,11 +197,19 @@ namespace GUIUtil /** Restore window size and position */ void restoreWindowGeometry(const QString& strSetting, const QSize &defaultSizeIn, QWidget *parent); + /** Returns the current color for the body text according to the theme*/ + void setGUITextColor(); + /** Load global CSS theme */ QString loadStyleSheet(); + /** returns the QFont previously selected by the user in settings */ + QFont getCustomSelectedFont(); + /** Return name of current CSS theme */ QString getThemeName(); + + QString getFontName(); /* Convert QString to OS specific boost path through UTF-8 */ boost::filesystem::path qstringToBoostPath(const QString &path); diff --git a/src/qt/locale/paccoin_de.ts b/src/qt/locale/paccoin_de.ts index 1938999e87a0..de71ecff7829 100644 --- a/src/qt/locale/paccoin_de.ts +++ b/src/qt/locale/paccoin_de.ts @@ -1549,7 +1549,7 @@ https://www.transifex.com/projects/p/$PAC/ &Reset Options - Konfiguration &zurücksetzen + &Zurücksetzen &OK @@ -2806,7 +2806,7 @@ https://www.transifex.com/projects/p/$PAC/ Add &Recipient - Empfänger &hinzufügen + &Hinzufügen Balance: diff --git a/src/qt/locale/paccoin_en.ts b/src/qt/locale/paccoin_en.ts index 41459004052f..738023058c22 100644 --- a/src/qt/locale/paccoin_en.ts +++ b/src/qt/locale/paccoin_en.ts @@ -1149,7 +1149,7 @@ &Label - &Label + Label @@ -3210,7 +3210,7 @@ https://www.transifex.com/projects/p/$PAC/ &Message: - &Message: + Message: @@ -3231,7 +3231,7 @@ https://www.transifex.com/projects/p/$PAC/ &Label: - &Label: + Label: @@ -3242,7 +3242,7 @@ https://www.transifex.com/projects/p/$PAC/ &Amount: - &Amount: + Amount: @@ -3857,7 +3857,7 @@ https://www.transifex.com/projects/p/$PAC/ &Label: - &Label: + Label: diff --git a/src/qt/locale/paccoin_es.ts b/src/qt/locale/paccoin_es.ts index fa79a5c39b98..b153447d5053 100644 --- a/src/qt/locale/paccoin_es.ts +++ b/src/qt/locale/paccoin_es.ts @@ -1301,7 +1301,7 @@ https://www.transifex.com/projects/p/$PAC/ &Reset Options - &Restablecer opciones + &Restablecer &OK @@ -2040,7 +2040,7 @@ https://www.transifex.com/projects/p/$PAC/ &Message: - &Mensaje: + Mensaje: An optional label to associate with the new receiving address. @@ -2056,7 +2056,7 @@ https://www.transifex.com/projects/p/$PAC/ &Label: - &Etiqueta: + Etiqueta: An optional amount to request. Leave this empty or zero to not request a specific amount. @@ -2064,11 +2064,11 @@ https://www.transifex.com/projects/p/$PAC/ &Amount: - &Cuantía: + Cuantía: &Request payment - &Solicitar pago + Solicitar pago Clear all fields of the form. diff --git a/src/qt/masternodelist.cpp b/src/qt/masternodelist.cpp index db679a032293..a68af0a22b3d 100644 --- a/src/qt/masternodelist.cpp +++ b/src/qt/masternodelist.cpp @@ -5,6 +5,7 @@ #include "clientmodel.h" #include "init.h" #include "guiutil.h" +#include "guiconstants.h" #include "masternode-sync.h" #include "masternodeconfig.h" #include "masternodeman.h" @@ -13,6 +14,7 @@ #include "walletmodel.h" #include +#include #include int GetOffsetFromUtc() @@ -35,6 +37,12 @@ MasternodeList::MasternodeList(const PlatformStyle *platformStyle, QWidget *pare ui->setupUi(this); ui->startButton->setEnabled(false); + // set the typography correctly + QFont selectedFont = GUIUtil::getCustomSelectedFont(); + QList widgets = this->findChildren(); + for (int i = 0; i < widgets.length(); i++){ + widgets.at(i)->setFont(selectedFont); + } int columnAliasWidth = 100; int columnAddressWidth = 200; @@ -56,6 +64,12 @@ MasternodeList::MasternodeList(const PlatformStyle *platformStyle, QWidget *pare ui->tableWidgetMasternodes->setColumnWidth(3, columnActiveWidth); ui->tableWidgetMasternodes->setColumnWidth(4, columnLastSeenWidth); + ui->tableWidgetMasternodes->setAlternatingRowColors(false); + ui->tableWidgetMasternodes->setShowGrid(false); + + ui->tableWidgetMyMasternodes->setAlternatingRowColors(false); + ui->tableWidgetMyMasternodes->setShowGrid(false); + ui->tableWidgetMyMasternodes->setContextMenuPolicy(Qt::CustomContextMenu); QAction *startAliasAction = new QAction(tr("Start alias"), this); @@ -69,6 +83,11 @@ MasternodeList::MasternodeList(const PlatformStyle *platformStyle, QWidget *pare connect(timer, SIGNAL(timeout()), this, SLOT(updateMyNodeList())); timer->start(1000); + /*QLabel *lblMasternodes = new QLabel; + lblMasternodes->setText("MASTERNODES"); + lblMasternodes->setAlignment(Qt::AlignBottom | Qt::AlignLeft); + lblMasternodes->setParent(this);*/ + fFilterUpdated = false; nTimeFilterUpdated = GetTime(); updateNodeList(); @@ -276,6 +295,9 @@ void MasternodeList::updateNodeList() std::map mapMasternodes = mnodeman.GetFullMasternodeMap(); int offsetFromUtc = GetOffsetFromUtc(); + QBrush notEnabled; + notEnabled.setColor(COLOR_NEGATIVE); + for(auto& mnpair : mapMasternodes) { CMasternode mn = mnpair.second; @@ -303,6 +325,8 @@ void MasternodeList::updateNodeList() ui->tableWidgetMasternodes->setItem(0, 0, addressItem); ui->tableWidgetMasternodes->setItem(0, 1, protocolItem); ui->tableWidgetMasternodes->setItem(0, 2, statusItem); + if(statusItem->text()!="ENABLED") + ui->tableWidgetMasternodes->item(0,2)->setForeground(notEnabled); ui->tableWidgetMasternodes->setItem(0, 3, activeSecondsItem); ui->tableWidgetMasternodes->setItem(0, 4, lastSeenItem); ui->tableWidgetMasternodes->setItem(0, 5, pubkeyItem); diff --git a/src/qt/optionsdialog.cpp b/src/qt/optionsdialog.cpp index f965a79cea50..40bcecdb9ecd 100644 --- a/src/qt/optionsdialog.cpp +++ b/src/qt/optionsdialog.cpp @@ -25,12 +25,14 @@ #include +#include #include #include #include #include #include #include +#include #ifdef ENABLE_WALLET extern CWallet* pwalletMain; @@ -74,12 +76,12 @@ OptionsDialog::OptionsDialog(QWidget *parent, bool enableWallet) : /* Window elements init */ #ifdef Q_OS_MAC /* remove Window tab on Mac */ - ui->tabWidget->removeTab(ui->tabWidget->indexOf(ui->tabWindow)); + ui->tabWidget_OptionsDialog->removeTab(ui->tabWidget_OptionsDialog->indexOf(ui->tabWindow)); #endif /* remove Wallet tab in case of -disablewallet */ if (!enableWallet) { - ui->tabWidget->removeTab(ui->tabWidget->indexOf(ui->tabWallet)); + ui->tabWidget_OptionsDialog->removeTab(ui->tabWidget_OptionsDialog->indexOf(ui->tabWallet)); } /* Display elements init */ @@ -92,13 +94,22 @@ OptionsDialog::OptionsDialog(QWidget *parent, bool enableWallet) : } /* Theme selector */ - ui->theme->addItem(QString("(default)"), QVariant("light")); - //ui->theme->addItem(QString("PAC-light"), QVariant("light")); - //ui->theme->addItem(QString("PAC-light-hires"), QVariant("light-hires")); - //ui->theme->addItem(QString("PAC-blue"), QVariant("drkblue")); - //ui->theme->addItem(QString("PAC-Crownium"), QVariant("crownium")); - //ui->theme->addItem(QString("PAC-traditional"), QVariant("trad")); - + ui->theme->addItem(QString("pac theme"), QVariant("pac")); + ui->theme->setCurrentIndex(1); + + /* typography selector */ + //ui->cboFontType->addItem(QString("PAC Default Font"), QVariant("Volte Rounded")); + ui->cboFontType->addItem(QString("Volte Rounded"), QVariant("Volte Rounded")); + ui->cboFontType->addItem(QString("Gotham Medium"), QVariant("Gotham Medium")); + ui->cboFontType->addItem(QString("Gotham Bold"), QVariant("Gotham Bold")); + + /* Gets and loads in the combo box the whole list of fonts available on your OS */ + QFontDatabase database; + for(int i = 0; i < database.families().count(); i++){ + ui->cboFontType->addItem(QString(database.families().at(i)), QVariant(database.families().at(i))); + } + ui->cboFontType->setCurrentIndex(1); + /* Language selector */ QDir translations(":translations"); ui->lang->addItem(QString("(") + tr("default") + QString(")"), QVariant("")); @@ -192,6 +203,8 @@ void OptionsDialog::setModel(OptionsModel *model) connect(ui->theme, SIGNAL(valueChanged()), this, SLOT(showRestartWarning())); connect(ui->lang, SIGNAL(valueChanged()), this, SLOT(showRestartWarning())); connect(ui->thirdPartyTxUrls, SIGNAL(textChanged(const QString &)), this, SLOT(showRestartWarning())); + connect(ui->cboFontType, SIGNAL(valueChanged()), this, SLOT(showRestartWarning())); + } void OptionsDialog::setMapper() @@ -236,6 +249,8 @@ void OptionsDialog::setMapper() mapper->addMapping(ui->lang, OptionsModel::Language); mapper->addMapping(ui->unit, OptionsModel::DisplayUnit); mapper->addMapping(ui->thirdPartyTxUrls, OptionsModel::ThirdPartyTxUrls); + mapper->addMapping(ui->cboFontType, OptionsModel::FontType); + } diff --git a/src/qt/optionsmodel.cpp b/src/qt/optionsmodel.cpp index 2262a115ae24..8ae537188dd3 100644 --- a/src/qt/optionsmodel.cpp +++ b/src/qt/optionsmodel.cpp @@ -83,6 +83,9 @@ void OptionsModel::Init(bool resetSettings) if (!settings.contains("theme")) settings.setValue("theme", ""); + if (!settings.contains("FontType")) + settings.setValue("FontType", "Volte Rounded"); + #ifdef ENABLE_WALLET if (!settings.contains("fCoinControlFeatures")) settings.setValue("fCoinControlFeatures", false); @@ -290,6 +293,8 @@ QVariant OptionsModel::data(const QModelIndex & index, int role) const return settings.value("theme"); case Language: return settings.value("language"); + case FontType: + return settings.value("FontType"); #ifdef ENABLE_WALLET case CoinControlFeatures: return fCoinControlFeatures; @@ -469,7 +474,13 @@ bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, in settings.setValue("theme", value); setRestartRequired(true); } - break; + break; + case FontType: + if (settings.value("FontType") != value) { + settings.setValue("FontType", value); + setRestartRequired(true); + } + break; case Language: if (settings.value("language") != value) { settings.setValue("language", value); diff --git a/src/qt/optionsmodel.h b/src/qt/optionsmodel.h index 88839639dd9d..c40a9cb16bed 100644 --- a/src/qt/optionsmodel.h +++ b/src/qt/optionsmodel.h @@ -43,6 +43,7 @@ class OptionsModel : public QAbstractListModel Digits, // QString Theme, // QString Language, // QString + FontType, // QString CoinControlFeatures, // bool ThreadsScriptVerif, // int DatabaseCache, // int diff --git a/src/qt/overviewpage.cpp b/src/qt/overviewpage.cpp index b80dc0102f96..0702a10badc1 100644 --- a/src/qt/overviewpage.cpp +++ b/src/qt/overviewpage.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2011-2015 The Bitcoin Core developers +// Copyright (c) 2011-2015 The Bitcoin Core developers // Copyright (c) 2014-2017 The Dash Core developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. @@ -17,6 +17,7 @@ #include "transactiontablemodel.h" #include "utilitydialog.h" #include "walletmodel.h" +#include "walletview.h" #include "instantx.h" #include "darksendconfig.h" @@ -26,7 +27,14 @@ #include #include #include -#include +#include + +#include + +#include +#include + +using namespace std; #define ICON_OFFSET 16 #define DECORATION_SIZE 54 @@ -49,6 +57,20 @@ class TxViewDelegate : public QAbstractItemDelegate { painter->save(); + // set the typography correctly + QString fontType = GUIUtil::getFontName(); + QFont font; + font = QFont(fontType,13,QFont::Medium, false); + font.setBold(false); + + QList widgets = this->findChildren(); + for (int i = 0; i < widgets.length(); i++){ + widgets.at(i)->setFont(font); + } + + QFont defaultFont = painter->font(); + painter->setFont(font); + QIcon icon = qvariant_cast(index.data(TransactionTableModel::RawDecorationRole)); QRect mainRect = option.rect; mainRect.moveLeft(ICON_OFFSET); @@ -57,7 +79,7 @@ class TxViewDelegate : public QAbstractItemDelegate int ypad = 6; int halfheight = (mainRect.height() - 2*ypad)/2; QRect amountRect(mainRect.left() + xspace, mainRect.top()+ypad, mainRect.width() - xspace - ICON_OFFSET, halfheight); - QRect addressRect(mainRect.left() + xspace, mainRect.top()+ypad+halfheight, mainRect.width() - xspace, halfheight); + QRect addressRect(mainRect.left() + xspace, mainRect.top()+ypad+halfheight, mainRect.width() - xspace - ICON_OFFSET, halfheight); icon = platformStyle->SingleColorIcon(icon); icon.paint(painter, decorationRect); @@ -66,16 +88,16 @@ class TxViewDelegate : public QAbstractItemDelegate qint64 amount = index.data(TransactionTableModel::AmountRole).toLongLong(); bool confirmed = index.data(TransactionTableModel::ConfirmedRole).toBool(); QVariant value = index.data(Qt::ForegroundRole); - QColor foreground = option.palette.color(QPalette::Text); + QColor foreground = option.palette.color(QPalette::BrightText); if(value.canConvert()) { QBrush brush = qvariant_cast(value); foreground = brush.color(); } - painter->setPen(foreground); + painter->setPen(COLOR_TEXT); QRect boundingRect; - painter->drawText(addressRect, Qt::AlignLeft|Qt::AlignVCenter, address, &boundingRect); + painter->drawText(addressRect, Qt::AlignRight|Qt::AlignVCenter, address, &boundingRect); if (index.data(TransactionTableModel::WatchonlyRole).toBool()) { @@ -94,7 +116,8 @@ class TxViewDelegate : public QAbstractItemDelegate } else { - foreground = option.palette.color(QPalette::Text); + foreground = COLOR_POSITIVE; + //foreground = option.palette.color(QPalette::Text); } painter->setPen(foreground); QString amountText = BitcoinUnits::floorWithUnit(unit, amount, true, BitcoinUnits::separatorAlways); @@ -102,11 +125,12 @@ class TxViewDelegate : public QAbstractItemDelegate { amountText = QString("[") + amountText + QString("]"); } + painter->setFont(font); painter->drawText(amountRect, Qt::AlignRight|Qt::AlignVCenter, amountText); - - painter->setPen(option.palette.color(QPalette::Text)); - painter->drawText(amountRect, Qt::AlignLeft|Qt::AlignVCenter, GUIUtil::dateTimeStr(date)); - + painter->setPen(COLOR_TEXT); + painter->setFont(font); + painter->drawText(amountRect, Qt::AlignLeft|Qt::AlignVCenter, GUIUtil::dateStr(date)); + painter->drawText(addressRect, Qt::AlignLeft|Qt::AlignVCenter, GUIUtil::timeStr(date)); painter->restore(); } @@ -132,12 +156,18 @@ OverviewPage::OverviewPage(const PlatformStyle *platformStyle, QWidget *parent) currentWatchOnlyBalance(-1), currentWatchUnconfBalance(-1), currentWatchImmatureBalance(-1), - txdelegate(new TxViewDelegate(platformStyle, this)), - timer(nullptr) + txdelegate(new TxViewDelegate(platformStyle, this)) { ui->setupUi(this); QString theme = GUIUtil::getThemeName(); + // set the typography correctly + QFont selectedFont = GUIUtil::getCustomSelectedFont(); + QList widgets = this->findChildren(); + for (int i = 0; i < widgets.length(); i++){ + widgets.at(i)->setFont(selectedFont); + } + // Recent transactions ui->listTransactions->setItemDelegate(txdelegate); ui->listTransactions->setIconSize(QSize(DECORATION_SIZE, DECORATION_SIZE)); @@ -148,39 +178,11 @@ OverviewPage::OverviewPage(const PlatformStyle *platformStyle, QWidget *parent) // init "out of sync" warning labels ui->labelWalletStatus->setText("(" + tr("out of sync") + ")"); - ui->labelPrivateSendSyncStatus->setText("(" + tr("out of sync") + ")"); ui->labelTransactionsStatus->setText("(" + tr("out of sync") + ")"); - // hide PS frame (helps to preserve saved size) - // we'll setup and make it visible in updateAdvancedPSUI() later if we are not in litemode - ui->framePrivateSend->setVisible(false); - // start with displaying the "out of sync" warnings showOutOfSyncWarning(true); - - // that's it for litemode - if(fLiteMode) return; - - // Disable any PS UI for masternode or when autobackup is disabled or failed for whatever reason - if(fMasterNode || nWalletBackups <= 0){ - DisablePrivateSendCompletely(); - if (nWalletBackups <= 0) { - ui->labelPrivateSendEnabled->setToolTip(tr("Automatic backups are disabled, no mixing available!")); - } - } else { - if(!privateSendClient.fEnablePrivateSend){ - ui->togglePrivateSend->setText(tr("Start Mixing")); - } else { - ui->togglePrivateSend->setText(tr("Stop Mixing")); - } - // Disable privateSendClient builtin support for automatic backups while we are in GUI, - // we'll handle automatic backups and user warnings in privateSendStatus() - privateSendClient.fCreateAutoBackups = false; - - timer = new QTimer(this); - connect(timer, SIGNAL(timeout()), this, SLOT(privateSendStatus())); - timer->start(1000); - } + ui->listTransactions->setFont(selectedFont); } void OverviewPage::handleTransactionClicked(const QModelIndex &index) @@ -196,7 +198,6 @@ void OverviewPage::handleOutOfSyncWarningClicks() OverviewPage::~OverviewPage() { - if(timer) disconnect(timer, SIGNAL(timeout()), this, SLOT(privateSendStatus())); delete ui; } @@ -205,14 +206,19 @@ void OverviewPage::setBalance(const CAmount& balance, const CAmount& unconfirmed currentBalance = balance; currentUnconfirmedBalance = unconfirmedBalance; currentImmatureBalance = immatureBalance; - currentAnonymizedBalance = anonymizedBalance; currentWatchOnlyBalance = watchOnlyBalance; currentWatchUnconfBalance = watchUnconfBalance; currentWatchImmatureBalance = watchImmatureBalance; + + // Not used + currentAnonymizedBalance = anonymizedBalance; + + ui->iconLabelAvailable->setPixmap(QPixmap(":icons/bitcoin-32")); + ui->iconLabelPending->setPixmap(QPixmap(":icons/bitcoin-32")); + ui->iconLabelTotal->setPixmap(QPixmap(":icons/bitcoin-32")); ui->labelBalance->setText(BitcoinUnits::floorHtmlWithUnit(nDisplayUnit, balance, false, BitcoinUnits::separatorAlways)); ui->labelUnconfirmed->setText(BitcoinUnits::floorHtmlWithUnit(nDisplayUnit, unconfirmedBalance, false, BitcoinUnits::separatorAlways)); ui->labelImmature->setText(BitcoinUnits::floorHtmlWithUnit(nDisplayUnit, immatureBalance, false, BitcoinUnits::separatorAlways)); - ui->labelAnonymized->setText(BitcoinUnits::floorHtmlWithUnit(nDisplayUnit, anonymizedBalance, false, BitcoinUnits::separatorAlways)); ui->labelTotal->setText(BitcoinUnits::floorHtmlWithUnit(nDisplayUnit, balance + unconfirmedBalance + immatureBalance, false, BitcoinUnits::separatorAlways)); ui->labelWatchAvailable->setText(BitcoinUnits::floorHtmlWithUnit(nDisplayUnit, watchOnlyBalance, false, BitcoinUnits::separatorAlways)); ui->labelWatchPending->setText(BitcoinUnits::floorHtmlWithUnit(nDisplayUnit, watchUnconfBalance, false, BitcoinUnits::separatorAlways)); @@ -229,22 +235,22 @@ void OverviewPage::setBalance(const CAmount& balance, const CAmount& unconfirmed ui->labelImmatureText->setVisible(showImmature || showWatchOnlyImmature); ui->labelWatchImmature->setVisible(showWatchOnlyImmature); // show watch-only immature balance - updatePrivateSendProgress(); - static int cachedTxLocks = 0; if(cachedTxLocks != nCompleteTXLocks){ cachedTxLocks = nCompleteTXLocks; ui->listTransactions->update(); } + + // Set the balance in USD on the UI + ui->labelBalanceUSD->setText("$ " + BitcoinUnits::pacToUsd(balance) + " USD"); + ui->labelUnconfirmedUSD->setText("$ " + BitcoinUnits::pacToUsd(unconfirmedBalance) + " USD"); + ui->labelTotalUSD->setText("$ " + BitcoinUnits::pacToUsd(balance + unconfirmedBalance + immatureBalance) + " USD"); } // show/hide watch-only labels void OverviewPage::updateWatchOnlyLabels(bool showWatchOnly) { - ui->labelSpendable->setVisible(showWatchOnly); // show spendable label (only when watch-only is active) - ui->labelWatchonly->setVisible(showWatchOnly); // show watch-only label - ui->lineWatchBalance->setVisible(showWatchOnly); // show watch-only balance separator line ui->labelWatchAvailable->setVisible(showWatchOnly); // show watch-only available balance ui->labelWatchPending->setVisible(showWatchOnly); // show watch-only pending balance ui->labelWatchTotal->setVisible(showWatchOnly); // show watch-only total balance @@ -284,16 +290,10 @@ void OverviewPage::setWalletModel(WalletModel *model) connect(model, SIGNAL(balanceChanged(CAmount,CAmount,CAmount,CAmount,CAmount,CAmount,CAmount)), this, SLOT(setBalance(CAmount,CAmount,CAmount,CAmount,CAmount,CAmount,CAmount))); connect(model->getOptionsModel(), SIGNAL(displayUnitChanged(int)), this, SLOT(updateDisplayUnit())); - connect(model->getOptionsModel(), SIGNAL(privateSendRoundsChanged()), this, SLOT(updatePrivateSendProgress())); - connect(model->getOptionsModel(), SIGNAL(privateSentAmountChanged()), this, SLOT(updatePrivateSendProgress())); connect(model->getOptionsModel(), SIGNAL(advancedPSUIChanged(bool)), this, SLOT(updateAdvancedPSUI(bool))); // explicitly update PS frame and transaction list to reflect actual settings updateAdvancedPSUI(model->getOptionsModel()->getShowAdvancedPSUI()); - connect(ui->privateSendAuto, SIGNAL(clicked()), this, SLOT(privateSendAuto())); - connect(ui->privateSendReset, SIGNAL(clicked()), this, SLOT(privateSendReset())); - connect(ui->privateSendInfo, SIGNAL(clicked()), this, SLOT(privateSendInfo())); - connect(ui->togglePrivateSend, SIGNAL(clicked()), this, SLOT(togglePrivateSend())); updateWatchOnlyLabels(model->haveWatchOnly()); connect(model, SIGNAL(notifyWatchonlyChanged(bool)), this, SLOT(updateWatchOnlyLabels(bool))); } @@ -324,328 +324,13 @@ void OverviewPage::updateAlerts(const QString &warnings) void OverviewPage::showOutOfSyncWarning(bool fShow) { ui->labelWalletStatus->setVisible(fShow); - ui->labelPrivateSendSyncStatus->setVisible(fShow); ui->labelTransactionsStatus->setVisible(fShow); } -void OverviewPage::updatePrivateSendProgress() -{ - if(!masternodeSync.IsBlockchainSynced() || ShutdownRequested()) return; - - if(!pwalletMain) return; - - QString strAmountAndRounds; - QString strPrivateSendAmount = BitcoinUnits::formatHtmlWithUnit(nDisplayUnit, privateSendClient.nPrivateSendAmount * COIN, false, BitcoinUnits::separatorAlways); - - if(currentBalance == 0) - { - ui->privateSendProgress->setValue(0); - ui->privateSendProgress->setToolTip(tr("No inputs detected")); - - // when balance is zero just show info from settings - strPrivateSendAmount = strPrivateSendAmount.remove(strPrivateSendAmount.indexOf("."), BitcoinUnits::decimals(nDisplayUnit) + 1); - strAmountAndRounds = strPrivateSendAmount + " / " + tr("%n Rounds", "", privateSendClient.nPrivateSendRounds); - - ui->labelAmountRounds->setToolTip(tr("No inputs detected")); - ui->labelAmountRounds->setText(strAmountAndRounds); - return; - } - - CAmount nAnonymizableBalance = pwalletMain->GetAnonymizableBalance(false, false); - - CAmount nMaxToAnonymize = nAnonymizableBalance + currentAnonymizedBalance; - - // If it's more than the anon threshold, limit to that. - if(nMaxToAnonymize > privateSendClient.nPrivateSendAmount*COIN) nMaxToAnonymize = privateSendClient.nPrivateSendAmount*COIN; - - if(nMaxToAnonymize == 0) return; - - if(nMaxToAnonymize >= privateSendClient.nPrivateSendAmount * COIN) { - ui->labelAmountRounds->setToolTip(tr("Found enough compatible inputs to anonymize %1") - .arg(strPrivateSendAmount)); - strPrivateSendAmount = strPrivateSendAmount.remove(strPrivateSendAmount.indexOf("."), BitcoinUnits::decimals(nDisplayUnit) + 1); - strAmountAndRounds = strPrivateSendAmount + " / " + tr("%n Rounds", "", privateSendClient.nPrivateSendRounds); - } else { - QString strMaxToAnonymize = BitcoinUnits::formatHtmlWithUnit(nDisplayUnit, nMaxToAnonymize, false, BitcoinUnits::separatorAlways); - ui->labelAmountRounds->setToolTip(tr("Not enough compatible inputs to anonymize %1,
" - "will anonymize %2 instead") - .arg(strPrivateSendAmount) - .arg(strMaxToAnonymize)); - strMaxToAnonymize = strMaxToAnonymize.remove(strMaxToAnonymize.indexOf("."), BitcoinUnits::decimals(nDisplayUnit) + 1); - strAmountAndRounds = "" + - QString(BitcoinUnits::factor(nDisplayUnit) == 1 ? "" : "~") + strMaxToAnonymize + - " / " + tr("%n Rounds", "", privateSendClient.nPrivateSendRounds) + ""; - } - ui->labelAmountRounds->setText(strAmountAndRounds); - - if (!fShowAdvancedPSUI) return; - - CAmount nDenominatedConfirmedBalance; - CAmount nDenominatedUnconfirmedBalance; - CAmount nNormalizedAnonymizedBalance; - float nAverageAnonymizedRounds; - - nDenominatedConfirmedBalance = pwalletMain->GetDenominatedBalance(); - nDenominatedUnconfirmedBalance = pwalletMain->GetDenominatedBalance(true); - nNormalizedAnonymizedBalance = pwalletMain->GetNormalizedAnonymizedBalance(); - nAverageAnonymizedRounds = pwalletMain->GetAverageAnonymizedRounds(); - - // calculate parts of the progress, each of them shouldn't be higher than 1 - // progress of denominating - float denomPart = 0; - // mixing progress of denominated balance - float anonNormPart = 0; - // completeness of full amount anonymization - float anonFullPart = 0; - - CAmount denominatedBalance = nDenominatedConfirmedBalance + nDenominatedUnconfirmedBalance; - denomPart = (float)denominatedBalance / nMaxToAnonymize; - denomPart = denomPart > 1 ? 1 : denomPart; - denomPart *= 100; - - anonNormPart = (float)nNormalizedAnonymizedBalance / nMaxToAnonymize; - anonNormPart = anonNormPart > 1 ? 1 : anonNormPart; - anonNormPart *= 100; - - anonFullPart = (float)currentAnonymizedBalance / nMaxToAnonymize; - anonFullPart = anonFullPart > 1 ? 1 : anonFullPart; - anonFullPart *= 100; - - // apply some weights to them ... - float denomWeight = 1; - float anonNormWeight = privateSendClient.nPrivateSendRounds; - float anonFullWeight = 2; - float fullWeight = denomWeight + anonNormWeight + anonFullWeight; - // ... and calculate the whole progress - float denomPartCalc = ceilf((denomPart * denomWeight / fullWeight) * 100) / 100; - float anonNormPartCalc = ceilf((anonNormPart * anonNormWeight / fullWeight) * 100) / 100; - float anonFullPartCalc = ceilf((anonFullPart * anonFullWeight / fullWeight) * 100) / 100; - float progress = denomPartCalc + anonNormPartCalc + anonFullPartCalc; - if(progress >= 100) progress = 100; - - ui->privateSendProgress->setValue(progress); - - QString strToolPip = ("" + tr("Overall progress") + ": %1%
" + - tr("Denominated") + ": %2%
" + - tr("Mixed") + ": %3%
" + - tr("Anonymized") + ": %4%
" + - tr("Denominated inputs have %5 of %n rounds on average", "", privateSendClient.nPrivateSendRounds)) - .arg(progress).arg(denomPart).arg(anonNormPart).arg(anonFullPart) - .arg(nAverageAnonymizedRounds); - ui->privateSendProgress->setToolTip(strToolPip); -} - void OverviewPage::updateAdvancedPSUI(bool fShowAdvancedPSUI) { this->fShowAdvancedPSUI = fShowAdvancedPSUI; int nNumItems = (fLiteMode || !fShowAdvancedPSUI) ? NUM_ITEMS : NUM_ITEMS_ADV; SetupTransactionList(nNumItems); - - if (fLiteMode) return; - - ui->framePrivateSend->setVisible(true); - ui->labelCompletitionText->setVisible(fShowAdvancedPSUI); - ui->privateSendProgress->setVisible(fShowAdvancedPSUI); - ui->labelSubmittedDenomText->setVisible(fShowAdvancedPSUI); - ui->labelSubmittedDenom->setVisible(fShowAdvancedPSUI); - ui->privateSendAuto->setVisible(fShowAdvancedPSUI); - ui->privateSendReset->setVisible(fShowAdvancedPSUI); - ui->privateSendInfo->setVisible(true); - ui->labelPrivateSendLastMessage->setVisible(fShowAdvancedPSUI); -} - -void OverviewPage::privateSendStatus() -{ - if(!masternodeSync.IsBlockchainSynced() || ShutdownRequested()) return; - - static int64_t nLastDSProgressBlockTime = 0; - int nBestHeight = clientModel->getNumBlocks(); - - // We are processing more then 1 block per second, we'll just leave - if(((nBestHeight - privateSendClient.nCachedNumBlocks) / (GetTimeMillis() - nLastDSProgressBlockTime + 1) > 1)) return; - nLastDSProgressBlockTime = GetTimeMillis(); - - QString strKeysLeftText(tr("keys left: %1").arg(pwalletMain->nKeysLeftSinceAutoBackup)); - if(pwalletMain->nKeysLeftSinceAutoBackup < PRIVATESEND_KEYS_THRESHOLD_WARNING) { - strKeysLeftText = "" + strKeysLeftText + ""; - } - ui->labelPrivateSendEnabled->setToolTip(strKeysLeftText); - - if (!privateSendClient.fEnablePrivateSend) { - if (nBestHeight != privateSendClient.nCachedNumBlocks) { - privateSendClient.nCachedNumBlocks = nBestHeight; - updatePrivateSendProgress(); - } - - ui->labelPrivateSendLastMessage->setText(""); - ui->togglePrivateSend->setText(tr("Start Mixing")); - - QString strEnabled = tr("Disabled"); - // Show how many keys left in advanced PS UI mode only - if (fShowAdvancedPSUI) strEnabled += ", " + strKeysLeftText; - ui->labelPrivateSendEnabled->setText(strEnabled); - - return; - } - - // Warn user that wallet is running out of keys - // NOTE: we do NOT warn user and do NOT create autobackups if mixing is not running - if (nWalletBackups > 0 && pwalletMain->nKeysLeftSinceAutoBackup < PRIVATESEND_KEYS_THRESHOLD_WARNING) { - QSettings settings; - if(settings.value("fLowKeysWarning").toBool()) { - QString strWarn = tr("Very low number of keys left since last automatic backup!") + "

" + - tr("We are about to create a new automatic backup for you, however " - " you should always make sure you have backups " - "saved in some safe place!") + "

" + - tr("Note: You turn this message off in options."); - ui->labelPrivateSendEnabled->setToolTip(strWarn); - LogPrintf("OverviewPage::privatePACStatus -- Very low number of keys left since last automatic backup, warning user and trying to create new backup...\n"); - QMessageBox::warning(this, tr("PrivatePAC"), strWarn, QMessageBox::Ok, QMessageBox::Ok); - } else { - LogPrintf("OverviewPage::privatePACStatus -- Very low number of keys left since last automatic backup, skipping warning and trying to create new backup...\n"); - } - - std::string strBackupWarning; - std::string strBackupError; - if(!AutoBackupWallet(pwalletMain, "", strBackupWarning, strBackupError)) { - if (!strBackupWarning.empty()) { - // It's still more or less safe to continue but warn user anyway - LogPrintf("OverviewPage::privatePACStatus -- WARNING! Something went wrong on automatic backup: %s\n", strBackupWarning); - - QMessageBox::warning(this, tr("PrivatePAC"), - tr("WARNING! Something went wrong on automatic backup") + ":

" + strBackupWarning.c_str(), - QMessageBox::Ok, QMessageBox::Ok); - } - if (!strBackupError.empty()) { - // Things are really broken, warn user and stop mixing immediately - LogPrintf("OverviewPage::privatePACStatus -- ERROR! Failed to create automatic backup: %s\n", strBackupError); - - QMessageBox::warning(this, tr("PrivatePAC"), - tr("ERROR! Failed to create automatic backup") + ":

" + strBackupError.c_str() + "
" + - tr("Mixing is disabled, please close your wallet and fix the issue!"), - QMessageBox::Ok, QMessageBox::Ok); - } - } - } - - QString strEnabled = privateSendClient.fEnablePrivateSend ? tr("Enabled") : tr("Disabled"); - // Show how many keys left in advanced PS UI mode only - if(fShowAdvancedPSUI) strEnabled += ", " + strKeysLeftText; - ui->labelPrivateSendEnabled->setText(strEnabled); - - if(nWalletBackups == -1) { - // Automatic backup failed, nothing else we can do until user fixes the issue manually - DisablePrivateSendCompletely(); - - QString strError = tr("ERROR! Failed to create automatic backup") + ", " + - tr("see debug.log for details.") + "

" + - tr("Mixing is disabled, please close your wallet and fix the issue!"); - ui->labelPrivateSendEnabled->setToolTip(strError); - - return; - } else if(nWalletBackups == -2) { - // We were able to create automatic backup but keypool was not replenished because wallet is locked. - QString strWarning = tr("WARNING! Failed to replenish keypool, please unlock your wallet to do so."); - ui->labelPrivateSendEnabled->setToolTip(strWarning); - } - - // check darksend status and unlock if needed - if(nBestHeight != privateSendClient.nCachedNumBlocks) { - // Balance and number of transactions might have changed - privateSendClient.nCachedNumBlocks = nBestHeight; - updatePrivateSendProgress(); - } - - QString strStatus = QString(privateSendClient.GetStatus().c_str()); - - QString s = tr("Last PrivatePAC message:\n") + strStatus; - - if(s != ui->labelPrivateSendLastMessage->text()) - LogPrintf("OverviewPage::privatePACStatus -- Last PrivatePAC message: %s\n", strStatus.toStdString()); - - ui->labelPrivateSendLastMessage->setText(s); - - if(privateSendClient.nSessionDenom == 0){ - ui->labelSubmittedDenom->setText(tr("N/A")); - } else { - QString strDenom(CPrivateSend::GetDenominationsToString(privateSendClient.nSessionDenom).c_str()); - ui->labelSubmittedDenom->setText(strDenom); - } - -} - -void OverviewPage::privateSendAuto(){ - privateSendClient.DoAutomaticDenominating(*g_connman); -} - -void OverviewPage::privateSendReset(){ - privateSendClient.ResetPool(); - - QMessageBox::warning(this, tr("PrivatePAC"), - tr("PrivatePAC was successfully reset."), - QMessageBox::Ok, QMessageBox::Ok); -} - -void OverviewPage::privateSendInfo(){ - HelpMessageDialog dlg(this, HelpMessageDialog::pshelp); - dlg.exec(); -} - -void OverviewPage::togglePrivateSend(){ - QSettings settings; - // Popup some information on first mixing - QString hasMixed = settings.value("hasMixed").toString(); - if(hasMixed.isEmpty()){ - QMessageBox::information(this, tr("PrivatePAC"), - tr("If you don't want to see internal PrivatePAC fees/transactions select \"Most Common\" as Type on the \"Transactions\" tab."), - QMessageBox::Ok, QMessageBox::Ok); - settings.setValue("hasMixed", "hasMixed"); - } - if(!privateSendClient.fEnablePrivateSend){ - const CAmount nMinAmount = CPrivateSend::GetSmallestDenomination() + CPrivateSend::GetMaxCollateralAmount(); - if(currentBalance < nMinAmount){ - QString strMinAmount(BitcoinUnits::formatWithUnit(nDisplayUnit, nMinAmount)); - QMessageBox::warning(this, tr("PrivatePAC"), - tr("PrivatePAC requires at least %1 to use.").arg(strMinAmount), - QMessageBox::Ok, QMessageBox::Ok); - return; - } - - // if wallet is locked, ask for a passphrase - if (walletModel->getEncryptionStatus() == WalletModel::Locked) - { - WalletModel::UnlockContext ctx(walletModel->requestUnlock(true)); - if(!ctx.isValid()) - { - //unlock was cancelled - privateSendClient.nCachedNumBlocks = std::numeric_limits::max(); - QMessageBox::warning(this, tr("PrivatePAC"), - tr("Wallet is locked and user declined to unlock. Disabling PrivatePAC."), - QMessageBox::Ok, QMessageBox::Ok); - LogPrint("privatesend", "OverviewPage::togglePrivatePAC -- Wallet is locked and user declined to unlock. Disabling PrivatePAC.\n"); - return; - } - } - - } - - privateSendClient.fEnablePrivateSend = !privateSendClient.fEnablePrivateSend; - privateSendClient.nCachedNumBlocks = std::numeric_limits::max(); - - if(!privateSendClient.fEnablePrivateSend){ - ui->togglePrivateSend->setText(tr("Start Mixing")); - privateSendClient.UnlockCoins(); - } else { - ui->togglePrivateSend->setText(tr("Stop Mixing")); - - /* show darksend configuration if client has defaults set */ - - if(privateSendClient.nPrivateSendAmount == 0){ - DarksendConfig dlg(this); - dlg.setModel(walletModel); - dlg.exec(); - } - - } } void OverviewPage::SetupTransactionList(int nNumItems) { @@ -666,13 +351,17 @@ void OverviewPage::SetupTransactionList(int nNumItems) { } } -void OverviewPage::DisablePrivateSendCompletely() { - ui->togglePrivateSend->setText("(" + tr("Disabled") + ")"); - ui->privateSendAuto->setText("(" + tr("Disabled") + ")"); - ui->privateSendReset->setText("(" + tr("Disabled") + ")"); - ui->framePrivateSend->setEnabled(false); - if (nWalletBackups <= 0) { - ui->labelPrivateSendEnabled->setText("(" + tr("Disabled") + ")"); - } - privateSendClient.fEnablePrivateSend = false; +/** Opens a window with info about PAC */ +void OverviewPage::on_overviewInfo_clicked() +{ + HelpMessageDialog dlg(this, HelpMessageDialog::ovhelp); + dlg.exec(); +} + +/** Receive the signal to update the USD value when the USD-PAC value is updated */ +void OverviewPage::receive_from_walletview() +{ + ui->labelBalanceUSD->setText("$ " + BitcoinUnits::pacToUsd(currentBalance) + " USD"); + ui->labelUnconfirmedUSD->setText("$ " + BitcoinUnits::pacToUsd(currentUnconfirmedBalance) + " USD"); + ui->labelTotalUSD->setText("$ " + BitcoinUnits::pacToUsd(currentBalance + currentUnconfirmedBalance + currentImmatureBalance) + " USD"); } diff --git a/src/qt/overviewpage.h b/src/qt/overviewpage.h index a788de688f94..af57366071c0 100644 --- a/src/qt/overviewpage.h +++ b/src/qt/overviewpage.h @@ -6,6 +6,7 @@ #define BITCOIN_QT_OVERVIEWPAGE_H #include "amount.h" +#include "walletview.h" #include #include @@ -36,9 +37,9 @@ class OverviewPage : public QWidget void setClientModel(ClientModel *clientModel); void setWalletModel(WalletModel *walletModel); void showOutOfSyncWarning(bool fShow); + //void updatePacUsd(); public Q_SLOTS: - void privateSendStatus(); void setBalance(const CAmount& balance, const CAmount& unconfirmedBalance, const CAmount& immatureBalance, const CAmount& anonymizedBalance, const CAmount& watchOnlyBalance, const CAmount& watchUnconfBalance, const CAmount& watchImmatureBalance); @@ -60,25 +61,20 @@ public Q_SLOTS: CAmount currentWatchImmatureBalance; int nDisplayUnit; bool fShowAdvancedPSUI; - TxViewDelegate *txdelegate; std::unique_ptr filter; void SetupTransactionList(int nNumItems); - void DisablePrivateSendCompletely(); private Q_SLOTS: - void togglePrivateSend(); - void privateSendAuto(); - void privateSendReset(); - void privateSendInfo(); void updateDisplayUnit(); - void updatePrivateSendProgress(); void updateAdvancedPSUI(bool fShowAdvancedPSUI); void handleTransactionClicked(const QModelIndex &index); void updateAlerts(const QString &warnings); void updateWatchOnlyLabels(bool showWatchOnly); void handleOutOfSyncWarningClicks(); + void on_overviewInfo_clicked(); + void receive_from_walletview(); }; #endif // BITCOIN_QT_OVERVIEWPAGE_H diff --git a/src/qt/paccoin.qrc b/src/qt/paccoin.qrc index 08951f3a1454..ec18bdcc6ea5 100644 --- a/src/qt/paccoin.qrc +++ b/src/qt/paccoin.qrc @@ -1,8 +1,18 @@ - + res/icons/bitcoin.png res/icons/chevron.png res/icons/warning.png + res/icons/bitcoin-32.png + + + res/fonts/VolteRounded-Regular.otf + res/fonts/VolteRounded-Bold.otf + res/fonts/VolteRounded-Light.otf + res/fonts/VolteRounded-Medium.otf + res/fonts/VolteRounded-Semibold.otf + res/fonts/Gotham-Medium.ttf + res/fonts/Gotham-Bold.otf res/icons/drkblue/address-book.png @@ -175,6 +185,65 @@ res/icons/light/transaction_abandoned.png res/icons/light/network_disabled.png + + res/icons/pac/address-book.png + res/icons/pac/quit.png + res/icons/pac/send.png + res/icons/pac/connect0_16.png + res/icons/pac/connect1_16.png + res/icons/pac/connect2_16.png + res/icons/pac/connect3_16.png + res/icons/pac/connect4_16.png + res/icons/pac/transaction0.png + res/icons/pac/transaction2.png + res/icons/pac/transaction_conflicted.png + res/icons/pac/clock1.png + res/icons/pac/clock2.png + res/icons/pac/clock3.png + res/icons/pac/clock4.png + res/icons/pac/clock5.png + res/icons/pac/eye.png + res/icons/pac/eye_minus.png + res/icons/pac/eye_plus.png + res/icons/pac/configure.png + res/icons/pac/receive.png + res/icons/pac/proposal.png + res/icons/pac/editpaste.png + res/icons/pac/editcopy.png + res/icons/pac/add.png + res/icons/pac/edit.png + res/icons/pac/history.png + res/icons/pac/masternodes.png + res/icons/pac/overview.png + res/icons/pac/export.png + res/icons/pac/synced.png + res/icons/pac/remove.png + res/icons/pac/tx_mined.png + res/icons/pac/tx_input.png + res/icons/pac/tx_output.png + res/icons/pac/tx_inout.png + res/icons/pac/lock_closed.png + res/icons/pac/lock_open.png + res/icons/pac/key.png + res/icons/pac/filesave.png + res/icons/pac/debugwindow.png + res/icons/pac/drkblue_editpaste.png + res/icons/pac/drkblue_address-book.png + res/icons/pac/drkblue_editcopy.png + res/icons/pac/drkblue_remove.png + res/icons/pac/browse.png + res/icons/pac/about.png + res/icons/pac/about_qt.png + res/icons/pac/verify.png + res/icons/pac/hd_enabled.png + res/icons/pac/hd_disabled.png + res/icons/pac/fontbigger.png + res/icons/pac/fontsmaller.png + res/icons/pac/transaction_abandoned.png + res/icons/pac/network_disabled.png + res/icons/pac/info.png + res/icons/pac/private.png + res/icons/trad/address-book.png res/icons/trad/quit.png @@ -236,6 +305,7 @@ res/css/drkblue.css res/css/crownium.css res/css/light.css + res/css/pac.css res/css/light-hires.css res/css/trad.css @@ -284,6 +354,30 @@ res/images/light/splash.png res/images/light/splash_testnet.png + + res/images/pac/about.png + res/images/pac/paccoin_logo_horizontal.png + res/images/pac/unchecked.png + res/images/pac/checked.png + res/images/pac/drkblue_downArrow.png + res/images/pac/drkblue_downArrow_small.png + res/images/pac/drkblue_upArrow_small.png + res/images/pac/drkblue_leftArrow_small.png + res/images/pac/drkblue_rightArrow_small.png + res/images/pac/drkblue_qtreeview_selected.png + res/images/pac/drkblue_walletFrame_bg.png + res/images/pac/splash.png + res/images/pac/splash_testnet.png + res/images/pac/hover_profile.png + res/images/pac/profile_bkg.png + res/images/pac/header_bkg.png + res/images/pac/checked_b.png + res/images/pac/unchecked_b.png + res/images/pac/checked_b_dis.png + res/images/pac/unchecked_b_dis.png + res/images/pac/checked_dis.png + res/images/pac/unchecked_dis.png + res/images/trad/about.png res/images/trad/paccoin_logo_horizontal.png diff --git a/src/qt/platformstyle.cpp b/src/qt/platformstyle.cpp index 16b79c939908..1ebf5cffc068 100644 --- a/src/qt/platformstyle.cpp +++ b/src/qt/platformstyle.cpp @@ -23,9 +23,9 @@ static const struct { const bool useExtraSpacing; } platform_styles[] = { {"macosx", false, false, true}, - {"windows", true, false, false}, + {"windows", false, false, true}, /* Other: linux, unix, ... */ - {"other", true, false, false} + {"other", false, false, true} }; static const unsigned platform_styles_count = sizeof(platform_styles)/sizeof(*platform_styles); diff --git a/src/qt/privatepage.cpp b/src/qt/privatepage.cpp new file mode 100644 index 000000000000..d2319ccd0d3a --- /dev/null +++ b/src/qt/privatepage.cpp @@ -0,0 +1,524 @@ +// Copyright (c) 2011-2015 The Bitcoin Core developers +// Copyright (c) 2014-2017 The Dash Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include "privatepage.h" +#include "ui_privatepage.h" + +#include "bitcoinunits.h" +#include "clientmodel.h" +#include "guiconstants.h" +#include "guiutil.h" +#include "init.h" +#include "optionsmodel.h" +#include "platformstyle.h" +#include "transactiontablemodel.h" +#include "utilitydialog.h" +#include "walletmodel.h" + +#include "instantx.h" +#include "darksendconfig.h" +#include "masternode-sync.h" +#include "privatesend-client.h" + +#include +#include +#include +#include +#include + +#include +#include + +using namespace std; + +#define ICON_OFFSET 16 +#define DECORATION_SIZE 54 +#define NUM_ITEMS 5 +#define NUM_ITEMS_ADV 7 + +PrivatePage::PrivatePage(const PlatformStyle *platformStyle, QWidget *parent) : + QWidget(parent), + timer(nullptr), + ui(new Ui::PrivatePage), + clientModel(0), + walletModel(0), + currentBalance(-1), + currentUnconfirmedBalance(-1), + currentImmatureBalance(-1), + currentWatchOnlyBalance(-1), + currentWatchUnconfBalance(-1), + currentWatchImmatureBalance(-1) +{ + ui->setupUi(this); + QString theme = GUIUtil::getThemeName(); + // set the typography correctly + QFont selectedFont = GUIUtil::getCustomSelectedFont(); + QList widgets = this->findChildren(); + for (int i = 0; i < widgets.length(); i++){ + widgets.at(i)->setFont(selectedFont); + } + + // init "out of sync" warning labels + ui->labelPrivateSendSyncStatus->setText("(" + tr("out of sync") + ")"); + + // hide PS frame (helps to preserve saved size) + // we'll setup and make it visible in updateAdvancedPSUI() later if we are not in litemode + ui->framePrivateSend->setVisible(false); + + // start with displaying the "out of sync" warnings + showOutOfSyncWarning(true); + + // that's it for litemode + if(fLiteMode) return; + + // Disable any PS UI for masternode or when autobackup is disabled or failed for whatever reason + if(fMasterNode || nWalletBackups <= 0){ + DisablePrivateSendCompletely(); + if (nWalletBackups <= 0) { + ui->labelPrivateSendEnabled->setToolTip(tr("Automatic backups are disabled, no mixing available!")); + } + } else { + if(!privateSendClient.fEnablePrivateSend){ + ui->togglePrivateSend->setText(tr("Start Mixing")); + } else { + ui->togglePrivateSend->setText(tr("Stop Mixing")); + } + // Disable privateSendClient builtin support for automatic backups while we are in GUI, + // we'll handle automatic backups and user warnings in privateSendStatus() + privateSendClient.fCreateAutoBackups = false; + + timer = new QTimer(this); + connect(timer, SIGNAL(timeout()), this, SLOT(privateSendStatus())); + timer->start(1000); + } + + QGraphicsDropShadowEffect *cardShadow = new QGraphicsDropShadowEffect; + cardShadow->setBlurRadius(12.0); + cardShadow->setColor(QColor(0, 0, 0, 160)); + cardShadow->setOffset(2.0); + ui->togglePrivateSend->setGraphicsEffect(cardShadow); +} + +void PrivatePage::handleOutOfSyncWarningClicks() +{ + Q_EMIT outOfSyncWarningClicked(); +} + +PrivatePage::~PrivatePage() +{ + if(timer) disconnect(timer, SIGNAL(timeout()), this, SLOT(privateSendStatus())); + delete ui; +} + +void PrivatePage::setBalance(const CAmount& balance, const CAmount& unconfirmedBalance, const CAmount& immatureBalance, const CAmount& anonymizedBalance, const CAmount& watchOnlyBalance, const CAmount& watchUnconfBalance, const CAmount& watchImmatureBalance) +{ + currentBalance = balance; + currentAnonymizedBalance = anonymizedBalance; + + // Not used + currentUnconfirmedBalance = unconfirmedBalance; + currentImmatureBalance = immatureBalance; + currentWatchOnlyBalance = watchOnlyBalance; + currentWatchUnconfBalance = watchUnconfBalance; + currentWatchImmatureBalance = watchImmatureBalance; + + ui->labelAnonymized->setText(BitcoinUnits::floorHtmlWithUnit(nDisplayUnit, anonymizedBalance, false, BitcoinUnits::separatorAlways)); + + // for symmetry reasons also show immature label when the watch-only one is shown + + static int cachedTxLocks = 0; + + if(cachedTxLocks != nCompleteTXLocks){ + cachedTxLocks = nCompleteTXLocks; + } +} + +void PrivatePage::setClientModel(ClientModel *model) +{ + this->clientModel = model; + if(model) + { + // Show warning if this is a prerelease version + connect(model, SIGNAL(alertsChanged(QString)), this, SLOT(updateAlerts(QString))); + updateAlerts(model->getStatusBarWarnings()); + } +} + +void PrivatePage::setModel(WalletModel *model) +{ + this->walletModel = model; + if(model && model->getOptionsModel()) + { + // update the display unit, to not use the default ("PAC") + updateDisplayUnit(); + // Keep up to date with wallet + setBalance(model->getBalance(), model->getUnconfirmedBalance(), model->getImmatureBalance(), model->getAnonymizedBalance(), + model->getWatchBalance(), model->getWatchUnconfirmedBalance(), model->getWatchImmatureBalance()); + connect(model, SIGNAL(balanceChanged(CAmount,CAmount,CAmount,CAmount,CAmount,CAmount,CAmount)), this, SLOT(setBalance(CAmount,CAmount,CAmount,CAmount,CAmount,CAmount,CAmount))); + + connect(model->getOptionsModel(), SIGNAL(displayUnitChanged(int)), this, SLOT(updateDisplayUnit())); + connect(model->getOptionsModel(), SIGNAL(privateSendRoundsChanged()), this, SLOT(updatePrivateSendProgress())); + connect(model->getOptionsModel(), SIGNAL(privateSentAmountChanged()), this, SLOT(updatePrivateSendProgress())); + connect(model->getOptionsModel(), SIGNAL(advancedPSUIChanged(bool)), this, SLOT(updateAdvancedPSUI(bool))); + // explicitly update PS frame and transaction list to reflect actual settings + updateAdvancedPSUI(model->getOptionsModel()->getShowAdvancedPSUI()); + + connect(ui->privateSendAuto, SIGNAL(clicked()), this, SLOT(privateSendAuto())); + connect(ui->privateSendReset, SIGNAL(clicked()), this, SLOT(privateSendReset())); + connect(ui->privateSendInfo, SIGNAL(clicked()), this, SLOT(privateSendInfo())); + connect(ui->togglePrivateSend, SIGNAL(clicked()), this, SLOT(togglePrivateSend())); + } +} + +void PrivatePage::updateDisplayUnit() +{ + if(walletModel && walletModel->getOptionsModel()) + { + nDisplayUnit = walletModel->getOptionsModel()->getDisplayUnit(); + if(currentBalance != -1) + setBalance(currentBalance, currentUnconfirmedBalance, currentImmatureBalance, currentAnonymizedBalance, + currentWatchOnlyBalance, currentWatchUnconfBalance, currentWatchImmatureBalance); + } +} + +void PrivatePage::updateAlerts(const QString &warnings) +{ + this->ui->labelAlerts->setVisible(!warnings.isEmpty()); + this->ui->labelAlerts->setText(warnings); +} + +void PrivatePage::showOutOfSyncWarning(bool fShow) +{ + ui->labelPrivateSendSyncStatus->setVisible(fShow); +} + +void PrivatePage::updatePrivateSendProgress() +{ + if(!masternodeSync.IsBlockchainSynced() || ShutdownRequested()) return; + + if(!pwalletMain) return; + + QString strAmountAndRounds; + QString strPrivateSendAmount = BitcoinUnits::formatHtmlWithUnit(nDisplayUnit, privateSendClient.nPrivateSendAmount * COIN, false, BitcoinUnits::separatorAlways); + + if(currentBalance == 0) + { + ui->privateSendProgress->setValue(0); + ui->privateSendProgress->setToolTip(tr("No inputs detected")); + + // when balance is zero just show info from settings + strPrivateSendAmount = strPrivateSendAmount.remove(strPrivateSendAmount.indexOf("."), BitcoinUnits::decimals(nDisplayUnit) + 1); + strAmountAndRounds = strPrivateSendAmount + " / " + tr("%n Rounds", "", privateSendClient.nPrivateSendRounds); + + ui->labelAmountRounds->setToolTip(tr("No inputs detected")); + ui->labelAmountRounds->setText(strAmountAndRounds); + return; + } + + CAmount nAnonymizableBalance = pwalletMain->GetAnonymizableBalance(false, false); + + CAmount nMaxToAnonymize = nAnonymizableBalance + currentAnonymizedBalance; + + // If it's more than the anon threshold, limit to that. + if(nMaxToAnonymize > privateSendClient.nPrivateSendAmount*COIN) nMaxToAnonymize = privateSendClient.nPrivateSendAmount*COIN; + + if(nMaxToAnonymize == 0) return; + + if(nMaxToAnonymize >= privateSendClient.nPrivateSendAmount * COIN) { + ui->labelAmountRounds->setToolTip(tr("Found enough compatible inputs to anonymize %1") + .arg(strPrivateSendAmount)); + strPrivateSendAmount = strPrivateSendAmount.remove(strPrivateSendAmount.indexOf("."), BitcoinUnits::decimals(nDisplayUnit) + 1); + strAmountAndRounds = strPrivateSendAmount + " / " + tr("%n Rounds", "", privateSendClient.nPrivateSendRounds); + } else { + QString strMaxToAnonymize = BitcoinUnits::formatHtmlWithUnit(nDisplayUnit, nMaxToAnonymize, false, BitcoinUnits::separatorAlways); + ui->labelAmountRounds->setToolTip(tr("Not enough compatible inputs to anonymize %1,
" + "will anonymize %2 instead") + .arg(strPrivateSendAmount) + .arg(strMaxToAnonymize)); + strMaxToAnonymize = strMaxToAnonymize.remove(strMaxToAnonymize.indexOf("."), BitcoinUnits::decimals(nDisplayUnit) + 1); + strAmountAndRounds = "" + + QString(BitcoinUnits::factor(nDisplayUnit) == 1 ? "" : "~") + strMaxToAnonymize + + " / " + tr("%n Rounds", "", privateSendClient.nPrivateSendRounds) + ""; + } + ui->labelAmountRounds->setText(strAmountAndRounds); + + if (!fShowAdvancedPSUI) return; + + CAmount nDenominatedConfirmedBalance; + CAmount nDenominatedUnconfirmedBalance; + CAmount nNormalizedAnonymizedBalance; + float nAverageAnonymizedRounds; + + nDenominatedConfirmedBalance = pwalletMain->GetDenominatedBalance(); + nDenominatedUnconfirmedBalance = pwalletMain->GetDenominatedBalance(true); + nNormalizedAnonymizedBalance = pwalletMain->GetNormalizedAnonymizedBalance(); + nAverageAnonymizedRounds = pwalletMain->GetAverageAnonymizedRounds(); + + // calculate parts of the progress, each of them shouldn't be higher than 1 + // progress of denominating + float denomPart = 0; + // mixing progress of denominated balance + float anonNormPart = 0; + // completeness of full amount anonymization + float anonFullPart = 0; + + CAmount denominatedBalance = nDenominatedConfirmedBalance + nDenominatedUnconfirmedBalance; + denomPart = (float)denominatedBalance / nMaxToAnonymize; + denomPart = denomPart > 1 ? 1 : denomPart; + denomPart *= 100; + + anonNormPart = (float)nNormalizedAnonymizedBalance / nMaxToAnonymize; + anonNormPart = anonNormPart > 1 ? 1 : anonNormPart; + anonNormPart *= 100; + + anonFullPart = (float)currentAnonymizedBalance / nMaxToAnonymize; + anonFullPart = anonFullPart > 1 ? 1 : anonFullPart; + anonFullPart *= 100; + + // apply some weights to them ... + float denomWeight = 1; + float anonNormWeight = privateSendClient.nPrivateSendRounds; + float anonFullWeight = 2; + float fullWeight = denomWeight + anonNormWeight + anonFullWeight; + // ... and calculate the whole progress + float denomPartCalc = ceilf((denomPart * denomWeight / fullWeight) * 100) / 100; + float anonNormPartCalc = ceilf((anonNormPart * anonNormWeight / fullWeight) * 100) / 100; + float anonFullPartCalc = ceilf((anonFullPart * anonFullWeight / fullWeight) * 100) / 100; + float progress = denomPartCalc + anonNormPartCalc + anonFullPartCalc; + if(progress >= 100) progress = 100; + + ui->privateSendProgress->setValue(progress); + + QString strToolPip = ("" + tr("Overall progress") + ": %1%
" + + tr("Denominated") + ": %2%
" + + tr("Mixed") + ": %3%
" + + tr("Anonymized") + ": %4%
" + + tr("Denominated inputs have %5 of %n rounds on average", "", privateSendClient.nPrivateSendRounds)) + .arg(progress).arg(denomPart).arg(anonNormPart).arg(anonFullPart) + .arg(nAverageAnonymizedRounds); + ui->privateSendProgress->setToolTip(strToolPip); +} + +void PrivatePage::updateAdvancedPSUI(bool fShowAdvancedPSUI) { + this->fShowAdvancedPSUI = fShowAdvancedPSUI; + + if (fLiteMode) return; + + ui->framePrivateSend->setVisible(true); + ui->labelCompletitionText->setVisible(fShowAdvancedPSUI); + ui->privateSendProgress->setVisible(fShowAdvancedPSUI); + ui->labelSubmittedDenomText->setVisible(fShowAdvancedPSUI); + ui->labelSubmittedDenom->setVisible(fShowAdvancedPSUI); + ui->privateSendAuto->setVisible(fShowAdvancedPSUI); + ui->privateSendReset->setVisible(fShowAdvancedPSUI); + ui->privateSendInfo->setVisible(true); + ui->labelPrivateSendLastMessage->setVisible(fShowAdvancedPSUI); +} + +void PrivatePage::privateSendStatus() +{ + if(!masternodeSync.IsBlockchainSynced() || ShutdownRequested()) return; + + static int64_t nLastDSProgressBlockTime = 0; + int nBestHeight = clientModel->getNumBlocks(); + + // We are processing more then 1 block per second, we'll just leave + if(((nBestHeight - privateSendClient.nCachedNumBlocks) / (GetTimeMillis() - nLastDSProgressBlockTime + 1) > 1)) return; + nLastDSProgressBlockTime = GetTimeMillis(); + + QString strKeysLeftText(tr("keys left: %1").arg(pwalletMain->nKeysLeftSinceAutoBackup)); + if(pwalletMain->nKeysLeftSinceAutoBackup < PRIVATESEND_KEYS_THRESHOLD_WARNING) { + strKeysLeftText = "" + strKeysLeftText + ""; + } + ui->labelPrivateSendEnabled->setToolTip(strKeysLeftText); + + if (!privateSendClient.fEnablePrivateSend) { + if (nBestHeight != privateSendClient.nCachedNumBlocks) { + privateSendClient.nCachedNumBlocks = nBestHeight; + updatePrivateSendProgress(); + } + + ui->labelPrivateSendLastMessage->setText(""); + ui->togglePrivateSend->setText(tr("Start Mixing")); + + QString strEnabled = tr("Disabled"); + // Show how many keys left in advanced PS UI mode only + if (fShowAdvancedPSUI) strEnabled += ", " + strKeysLeftText; + ui->labelPrivateSendEnabled->setText(strEnabled); + + return; + } + + // Warn user that wallet is running out of keys + // NOTE: we do NOT warn user and do NOT create autobackups if mixing is not running + if (nWalletBackups > 0 && pwalletMain->nKeysLeftSinceAutoBackup < PRIVATESEND_KEYS_THRESHOLD_WARNING) { + QSettings settings; + if(settings.value("fLowKeysWarning").toBool()) { + QString strWarn = tr("Very low number of keys left since last automatic backup!") + "

" + + tr("We are about to create a new automatic backup for you, however " + " you should always make sure you have backups " + "saved in some safe place!") + "

" + + tr("Note: You turn this message off in options."); + ui->labelPrivateSendEnabled->setToolTip(strWarn); + LogPrintf("PrivatePage::privatePACStatus -- Very low number of keys left since last automatic backup, warning user and trying to create new backup...\n"); + QMessageBox::warning(this, tr("PrivatePAC"), strWarn, QMessageBox::Ok, QMessageBox::Ok); + } else { + LogPrintf("PrivatePage::privatePACStatus -- Very low number of keys left since last automatic backup, skipping warning and trying to create new backup...\n"); + } + + std::string strBackupWarning; + std::string strBackupError; + if(!AutoBackupWallet(pwalletMain, "", strBackupWarning, strBackupError)) { + if (!strBackupWarning.empty()) { + // It's still more or less safe to continue but warn user anyway + LogPrintf("PrivatePage::privatePACStatus -- WARNING! Something went wrong on automatic backup: %s\n", strBackupWarning); + + QMessageBox::warning(this, tr("PrivatePAC"), + tr("WARNING! Something went wrong on automatic backup") + ":

" + strBackupWarning.c_str(), + QMessageBox::Ok, QMessageBox::Ok); + } + if (!strBackupError.empty()) { + // Things are really broken, warn user and stop mixing immediately + LogPrintf("PrivatePage::privatePACStatus -- ERROR! Failed to create automatic backup: %s\n", strBackupError); + + QMessageBox::warning(this, tr("PrivatePAC"), + tr("ERROR! Failed to create automatic backup") + ":

" + strBackupError.c_str() + "
" + + tr("Mixing is disabled, please close your wallet and fix the issue!"), + QMessageBox::Ok, QMessageBox::Ok); + } + } + } + + QString strEnabled = privateSendClient.fEnablePrivateSend ? tr("Enabled") : tr("Disabled"); + // Show how many keys left in advanced PS UI mode only + if(fShowAdvancedPSUI) strEnabled += ", " + strKeysLeftText; + ui->labelPrivateSendEnabled->setText(strEnabled); + + if(nWalletBackups == -1) { + // Automatic backup failed, nothing else we can do until user fixes the issue manually + DisablePrivateSendCompletely(); + + QString strError = tr("ERROR! Failed to create automatic backup") + ", " + + tr("see debug.log for details.") + "

" + + tr("Mixing is disabled, please close your wallet and fix the issue!"); + ui->labelPrivateSendEnabled->setToolTip(strError); + + return; + } else if(nWalletBackups == -2) { + // We were able to create automatic backup but keypool was not replenished because wallet is locked. + QString strWarning = tr("WARNING! Failed to replenish keypool, please unlock your wallet to do so."); + ui->labelPrivateSendEnabled->setToolTip(strWarning); + } + + // check darksend status and unlock if needed + if(nBestHeight != privateSendClient.nCachedNumBlocks) { + // Balance and number of transactions might have changed + privateSendClient.nCachedNumBlocks = nBestHeight; + updatePrivateSendProgress(); + } + + QString strStatus = QString(privateSendClient.GetStatus().c_str()); + + QString s = tr("Last PrivatePAC message:\n") + strStatus; + + if(s != ui->labelPrivateSendLastMessage->text()) + LogPrintf("PrivatePage::privatePACStatus -- Last PrivatePAC message: %s\n", strStatus.toStdString()); + + ui->labelPrivateSendLastMessage->setText(s); + + if(privateSendClient.nSessionDenom == 0){ + ui->labelSubmittedDenom->setText(tr("N/A")); + } else { + QString strDenom(CPrivateSend::GetDenominationsToString(privateSendClient.nSessionDenom).c_str()); + ui->labelSubmittedDenom->setText(strDenom); + } + +} + +void PrivatePage::privateSendAuto(){ + privateSendClient.DoAutomaticDenominating(*g_connman); +} + +void PrivatePage::privateSendReset(){ + privateSendClient.ResetPool(); + + QMessageBox::warning(this, tr("PrivatePAC"), + tr("PrivatePAC was successfully reset."), + QMessageBox::Ok, QMessageBox::Ok); +} + +void PrivatePage::privateSendInfo(){ + HelpMessageDialog dlg(this, HelpMessageDialog::pshelp); + dlg.exec(); +} + +void PrivatePage::togglePrivateSend(){ + QSettings settings; + // Popup some information on first mixing + QString hasMixed = settings.value("hasMixed").toString(); + if(hasMixed.isEmpty()){ + QMessageBox::information(this, tr("PrivatePAC"), + tr("If you don't want to see internal PrivatePAC fees/transactions select \"Most Common\" as Type on the \"Transactions\" tab."), + QMessageBox::Ok, QMessageBox::Ok); + settings.setValue("hasMixed", "hasMixed"); + } + if(!privateSendClient.fEnablePrivateSend){ + const CAmount nMinAmount = CPrivateSend::GetSmallestDenomination() + CPrivateSend::GetMaxCollateralAmount(); + if(currentBalance < nMinAmount){ + QString strMinAmount(BitcoinUnits::formatWithUnit(nDisplayUnit, nMinAmount)); + QMessageBox::warning(this, tr("PrivatePAC"), + tr("PrivatePAC requires at least %1 to use.").arg(strMinAmount), + QMessageBox::Ok, QMessageBox::Ok); + return; + } + + // if wallet is locked, ask for a passphrase + if (walletModel->getEncryptionStatus() == WalletModel::Locked) + { + WalletModel::UnlockContext ctx(walletModel->requestUnlock(true)); + if(!ctx.isValid()) + { + //unlock was cancelled + privateSendClient.nCachedNumBlocks = std::numeric_limits::max(); + QMessageBox::warning(this, tr("PrivatePAC"), + tr("Wallet is locked and user declined to unlock. Disabling PrivatePAC."), + QMessageBox::Ok, QMessageBox::Ok); + LogPrint("privatesend", "PrivatePage::togglePrivatePAC -- Wallet is locked and user declined to unlock. Disabling PrivatePAC.\n"); + return; + } + } + + } + + privateSendClient.fEnablePrivateSend = !privateSendClient.fEnablePrivateSend; + privateSendClient.nCachedNumBlocks = std::numeric_limits::max(); + + if(!privateSendClient.fEnablePrivateSend){ + ui->togglePrivateSend->setText(tr("Start Mixing")); + privateSendClient.UnlockCoins(); + } else { + ui->togglePrivateSend->setText(tr("Stop Mixing")); + + /* show darksend configuration if client has defaults set */ + + if(privateSendClient.nPrivateSendAmount == 0){ + DarksendConfig dlg(this); + dlg.setModel(walletModel); + dlg.exec(); + } + + } +} + +void PrivatePage::DisablePrivateSendCompletely() { + ui->togglePrivateSend->setText("(" + tr("Disabled") + ")"); + ui->privateSendAuto->setText("(" + tr("Disabled") + ")"); + ui->privateSendReset->setText("(" + tr("Disabled") + ")"); + ui->framePrivateSend->setEnabled(false); + if (nWalletBackups <= 0) { + ui->labelPrivateSendEnabled->setText("(" + tr("Disabled") + ")"); + } + privateSendClient.fEnablePrivateSend = false; +} diff --git a/src/qt/privatepage.h b/src/qt/privatepage.h new file mode 100644 index 000000000000..f478c80ddd44 --- /dev/null +++ b/src/qt/privatepage.h @@ -0,0 +1,79 @@ +// Copyright (c) 2011-2015 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_PRIVATEPAGE_H +#define BITCOIN_QT_PRIVATEPAGE_H + +#include "amount.h" + +#include +#include + +class ClientModel; +class TransactionFilterProxy; +class TxViewDelegate; +class PlatformStyle; +class WalletModel; + +namespace Ui { + class PrivatePage; +} + +QT_BEGIN_NAMESPACE +class QModelIndex; +QT_END_NAMESPACE + +/** Overview ("home") page widget */ +class PrivatePage : public QWidget +{ + Q_OBJECT + +public: + explicit PrivatePage(const PlatformStyle *platformStyle, QWidget *parent = 0); + ~PrivatePage(); + + void setClientModel(ClientModel *clientModel); + void setModel(WalletModel *walletModel); + void showOutOfSyncWarning(bool fShow); + +public Q_SLOTS: + void privateSendStatus(); + void setBalance(const CAmount& balance, const CAmount& unconfirmedBalance, const CAmount& immatureBalance, const CAmount& anonymizedBalance, + const CAmount& watchOnlyBalance, const CAmount& watchUnconfBalance, const CAmount& watchImmatureBalance); + +Q_SIGNALS: + void outOfSyncWarningClicked(); + +private: + QTimer *timer; + Ui::PrivatePage *ui; + ClientModel *clientModel; + WalletModel *walletModel; + CAmount currentBalance; + CAmount currentAnonymizedBalance; + CAmount currentUnconfirmedBalance; + CAmount currentImmatureBalance; + CAmount currentWatchOnlyBalance; + CAmount currentWatchUnconfBalance; + CAmount currentWatchImmatureBalance; + int nDisplayUnit; + bool fShowAdvancedPSUI; + + TxViewDelegate *txdelegate; + + void DisablePrivateSendCompletely(); + +private Q_SLOTS: + void togglePrivateSend(); + void privateSendAuto(); + void privateSendReset(); + void privateSendInfo(); + void updateDisplayUnit(); + void updatePrivateSendProgress(); + void updateAdvancedPSUI(bool fShowAdvancedPSUI); + void updateAlerts(const QString &warnings); + void handleOutOfSyncWarningClicks(); +}; + +#endif // BITCOIN_QT_PRIVATEPAGE_H diff --git a/src/qt/proposallist.cpp b/src/qt/proposallist.cpp index fc8de0232bf9..07bb80e75c11 100644 --- a/src/qt/proposallist.cpp +++ b/src/qt/proposallist.cpp @@ -48,25 +48,26 @@ ProposalList::ProposalList(const PlatformStyle *platformStyle, QWidget *parent) setContentsMargins(0,0,0,0); hlayout = new ColumnAlignedLayout(); - hlayout->setContentsMargins(0,0,0,0); + hlayout->setContentsMargins(0,0,0,8); hlayout->setSpacing(0); proposalWidget = new QLineEdit(this); + proposalWidget->setObjectName("proposalWidget"); #if QT_VERSION >= 0x040700 proposalWidget->setPlaceholderText(tr("Enter proposal name")); #endif - proposalWidget->setObjectName("proposalWidget"); hlayout->addWidget(proposalWidget); amountWidget = new QLineEdit(this); + amountWidget->setObjectName("amountWidget"); #if QT_VERSION >= 0x040700 amountWidget->setPlaceholderText(tr("Min amount")); #endif amountWidget->setValidator(new QDoubleValidator(0, 1e20, 8, this)); - amountWidget->setObjectName("amountWidget"); hlayout->addWidget(amountWidget); startDateWidget = new QComboBox(this); + startDateWidget->setObjectName("startDateWidget"); startDateWidget->addItem(tr("All"), All); startDateWidget->addItem(tr("Today"), Today); startDateWidget->addItem(tr("This week"), ThisWeek); @@ -78,6 +79,7 @@ ProposalList::ProposalList(const PlatformStyle *platformStyle, QWidget *parent) hlayout->addWidget(startDateWidget); endDateWidget = new QComboBox(this); + endDateWidget->setObjectName("endDateWidget"); endDateWidget->addItem(tr("All"), All); endDateWidget->addItem(tr("Today"), Today); endDateWidget->addItem(tr("This week"), ThisWeek); @@ -89,36 +91,36 @@ ProposalList::ProposalList(const PlatformStyle *platformStyle, QWidget *parent) hlayout->addWidget(endDateWidget); yesVotesWidget = new QLineEdit(this); + yesVotesWidget->setObjectName("yesVotesWidget"); #if QT_VERSION >= 0x040700 yesVotesWidget->setPlaceholderText(tr("Min yes votes")); #endif yesVotesWidget->setValidator(new QIntValidator(0, INT_MAX, this)); - yesVotesWidget->setObjectName("yesVotesWidget"); hlayout->addWidget(yesVotesWidget); noVotesWidget = new QLineEdit(this); + noVotesWidget->setObjectName("noVotesWidget"); #if QT_VERSION >= 0x040700 noVotesWidget->setPlaceholderText(tr("Min no votes")); #endif noVotesWidget->setValidator(new QIntValidator(0, INT_MAX, this)); - noVotesWidget->setObjectName("noVotesWidget"); hlayout->addWidget(noVotesWidget); absoluteYesVotesWidget = new QLineEdit(this); + absoluteYesVotesWidget->setObjectName("absoluteYesVotesWidget"); #if QT_VERSION >= 0x040700 absoluteYesVotesWidget->setPlaceholderText(tr("Min abs. yes votes")); #endif absoluteYesVotesWidget->setValidator(new QIntValidator(INT_MIN, INT_MAX, this)); - absoluteYesVotesWidget->setObjectName("absoluteYesVotesWidget"); hlayout->addWidget(absoluteYesVotesWidget); percentageWidget = new QLineEdit(this); + percentageWidget->setObjectName("percentageWidget"); #if QT_VERSION >= 0x040700 percentageWidget->setPlaceholderText(tr("Min percentage")); #endif percentageWidget->setValidator(new QIntValidator(-100, 100, this)); - percentageWidget->setObjectName("percentageWidget"); hlayout->addWidget(percentageWidget); QVBoxLayout *vlayout = new QVBoxLayout(this); @@ -137,7 +139,8 @@ ProposalList::ProposalList(const PlatformStyle *platformStyle, QWidget *parent) connect(view->horizontalHeader(), SIGNAL(sectionResized(int,int,int)), SLOT(invalidateAlignedLayout())); connect(view->horizontalScrollBar(), SIGNAL(valueChanged(int)), SLOT(invalidateAlignedLayout())); - view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); + view->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); + view->setTabKeyNavigation(false); view->setContextMenuPolicy(Qt::CustomContextMenu); @@ -213,7 +216,8 @@ ProposalList::ProposalList(const PlatformStyle *platformStyle, QWidget *parent) proposalList->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); proposalList->setModel(proposalProxyModel); - proposalList->setAlternatingRowColors(true); + proposalList->setAlternatingRowColors(false); + proposalList->setShowGrid(false); proposalList->setSelectionBehavior(QAbstractItemView::SelectRows); proposalList->setSortingEnabled(true); proposalList->sortByColumn(ProposalTableModel::StartDate, Qt::DescendingOrder); @@ -242,6 +246,13 @@ ProposalList::ProposalList(const PlatformStyle *platformStyle, QWidget *parent) timer->start(1000); setLayout(vlayout); + + // set the typography correctly + QFont selectedFont = GUIUtil::getCustomSelectedFont(); + QList widgets = this->findChildren(); + for (int i = 0; i < widgets.length(); i++){ + widgets.at(i)->setFont(selectedFont); + } } void ProposalList::invalidateAlignedLayout() { @@ -621,5 +632,5 @@ void ProposalList::endDateRangeChanged() void ProposalList::resizeEvent(QResizeEvent* event) { QWidget::resizeEvent(event); - columnResizingFixer->stretchColumnWidth(ProposalTableModel::Proposal); + columnResizingFixer->stretchColumnWidth(ProposalTableModel::Percentage); } diff --git a/src/qt/proposallist.h b/src/qt/proposallist.h index 3e166012e7cf..9b0c5b1df731 100644 --- a/src/qt/proposallist.h +++ b/src/qt/proposallist.h @@ -50,15 +50,15 @@ class ProposalList : public QWidget }; enum ColumnWidths { - PROPOSAL_COLUMN_WIDTH = 380, + PROPOSAL_COLUMN_WIDTH = 360, START_DATE_COLUMN_WIDTH = 110, END_DATE_COLUMN_WIDTH = 110, YES_VOTES_COLUMN_WIDTH = 60, NO_VOTES_COLUMN_WIDTH = 60, - ABSOLUTE_YES_COLUMN_WIDTH = 60, + ABSOLUTE_YES_COLUMN_WIDTH = 40, AMOUNT_COLUMN_WIDTH = 100, PERCENTAGE_COLUMN_WIDTH = 80, - MINIMUM_COLUMN_WIDTH = 23 + MINIMUM_COLUMN_WIDTH = 46 }; private: diff --git a/src/qt/proposaltablemodel.cpp b/src/qt/proposaltablemodel.cpp index a70a59b307b3..c3af21507d62 100644 --- a/src/qt/proposaltablemodel.cpp +++ b/src/qt/proposaltablemodel.cpp @@ -165,7 +165,7 @@ QVariant ProposalTableModel::data(const QModelIndex &index, int role) const } } - return COLOR_BAREADDRESS; + return COLOR_WHITE; break; case ProposalRole: return rec->name; diff --git a/src/qt/qwebchannel.js b/src/qt/qwebchannel.js new file mode 100644 index 000000000000..0691e0296293 --- /dev/null +++ b/src/qt/qwebchannel.js @@ -0,0 +1,396 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2014 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Milian Wolff +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtWebChannel module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +"use strict"; + +var QWebChannelMessageTypes = { + signal: 1, + propertyUpdate: 2, + init: 3, + idle: 4, + debug: 5, + invokeMethod: 6, + connectToSignal: 7, + disconnectFromSignal: 8, + setProperty: 9, + response: 10, +}; + +var QWebChannel = function(transport, initCallback) +{ + if (typeof transport !== "object" || typeof transport.send !== "function") { + console.error("The QWebChannel expects a transport object with a send function and onmessage callback property." + + " Given is: transport: " + typeof(transport) + ", transport.send: " + typeof(transport.send)); + return; + } + + var channel = this; + this.transport = transport; + + this.send = function(data) + { + if (typeof(data) !== "string") { + data = JSON.stringify(data); + } + channel.transport.send(data); + } + + this.transport.onmessage = function(message) + { + var data = message.data; + if (typeof data === "string") { + data = JSON.parse(data); + } + switch (data.type) { + case QWebChannelMessageTypes.signal: + channel.handleSignal(data); + break; + case QWebChannelMessageTypes.response: + channel.handleResponse(data); + break; + case QWebChannelMessageTypes.propertyUpdate: + channel.handlePropertyUpdate(data); + break; + case QWebChannelMessageTypes.init: + channel.handleInit(data); + break; + default: + console.error("invalid message received:", message.data); + break; + } + } + + this.execCallbacks = {}; + this.execId = 0; + this.exec = function(data, callback) + { + if (!callback) { + // if no callback is given, send directly + channel.send(data); + return; + } + if (channel.execId === Number.MAX_VALUE) { + // wrap + channel.execId = Number.MIN_VALUE; + } + if (data.hasOwnProperty("id")) { + console.error("Cannot exec message with property id: " + JSON.stringify(data)); + return; + } + data.id = channel.execId++; + channel.execCallbacks[data.id] = callback; + channel.send(data); + }; + + this.objects = {}; + + this.handleSignal = function(message) + { + var object = channel.objects[message.object]; + if (object) { + object.signalEmitted(message.signal, message.args); + } else { + console.warn("Unhandled signal: " + message.object + "::" + message.signal); + } + } + + this.handleResponse = function(message) + { + if (!message.hasOwnProperty("id")) { + console.error("Invalid response message received: ", JSON.stringify(message)); + return; + } + channel.execCallbacks[message.id](message.data); + delete channel.execCallbacks[message.id]; + } + + this.handlePropertyUpdate = function(message) + { + for (var i in message.data) { + var data = message.data[i]; + var object = channel.objects[data.object]; + if (object) { + object.propertyUpdate(data.signals, data.properties); + } else { + console.warn("Unhandled property update: " + data.object + "::" + data.signal); + } + } + channel.exec({type: QWebChannelMessageTypes.idle}); + } + + // prevent multiple initialization which might happen with multiple webchannel clients. + this.initialized = false; + this.handleInit = function(message) + { + if (channel.initialized) { + return; + } + channel.initialized = true; + for (var objectName in message.data) { + var data = message.data[objectName]; + var object = new QObject(objectName, data, channel); + } + if (initCallback) { + initCallback(channel); + } + channel.exec({type: QWebChannelMessageTypes.idle}); + } + + this.debug = function(message) + { + channel.send({type: QWebChannelMessageTypes.debug, data: message}); + }; + + channel.exec({type: QWebChannelMessageTypes.init}); +}; + +function QObject(name, data, webChannel) +{ + this.__id__ = name; + webChannel.objects[name] = this; + + // List of callbacks that get invoked upon signal emission + this.__objectSignals__ = {}; + + // Cache of all properties, updated when a notify signal is emitted + this.__propertyCache__ = {}; + + var object = this; + + // ---------------------------------------------------------------------- + + function unwrapQObject( response ) + { + if (!response + || !response["__QObject*__"] + || response["id"] === undefined + || response["data"] === undefined) { + return response; + } + var objectId = response.id; + if (webChannel.objects[objectId]) + return webChannel.objects[objectId]; + + var qObject = new QObject( objectId, response.data, webChannel ); + qObject.destroyed.connect(function() { + if (webChannel.objects[objectId] === qObject) { + delete webChannel.objects[objectId]; + // reset the now deleted QObject to an empty {} object + // just assigning {} though would not have the desired effect, but the + // below also ensures all external references will see the empty map + // NOTE: this detour is necessary to workaround QTBUG-40021 + var propertyNames = []; + for (var propertyName in qObject) { + propertyNames.push(propertyName); + } + for (var idx in propertyNames) { + delete qObject[propertyNames[idx]]; + } + } + }); + return qObject; + } + + function addSignal(signalData, isPropertyNotifySignal) + { + var signalName = signalData[0]; + var signalIndex = signalData[1]; + object[signalName] = { + connect: function(callback) { + if (typeof(callback) !== "function") { + console.error("Bad callback given to connect to signal " + signalName); + return; + } + + object.__objectSignals__[signalIndex] = object.__objectSignals__[signalIndex] || []; + object.__objectSignals__[signalIndex].push(callback); + + if (!isPropertyNotifySignal) { + // only required for "pure" signals, handled separately for properties in propertyUpdate + webChannel.exec({ + type: QWebChannelMessageTypes.connectToSignal, + object: object.__id__, + signal: signalIndex + }); + } + }, + disconnect: function(callback) { + if (typeof(callback) !== "function") { + console.error("Bad callback given to disconnect from signal " + signalName); + return; + } + object.__objectSignals__[signalIndex] = object.__objectSignals__[signalIndex] || []; + var idx = object.__objectSignals__[signalIndex].indexOf(callback); + if (idx === -1) { + console.error("Cannot find connection of signal " + signalName + " to " + callback.name); + return; + } + object.__objectSignals__[signalIndex].splice(idx, 1); + if (!isPropertyNotifySignal && object.__objectSignals__[signalIndex].length === 0) { + // only required for "pure" signals, handled separately for properties in propertyUpdate + webChannel.exec({ + type: QWebChannelMessageTypes.disconnectFromSignal, + object: object.__id__, + signal: signalIndex + }); + } + } + }; + } + + /** + * Invokes all callbacks for the given signalname. Also works for property notify callbacks. + */ + function invokeSignalCallbacks(signalName, signalArgs) + { + var connections = object.__objectSignals__[signalName]; + if (connections) { + connections.forEach(function(callback) { + callback.apply(callback, signalArgs); + }); + } + } + + this.propertyUpdate = function(signals, propertyMap) + { + // update property cache + for (var propertyIndex in propertyMap) { + var propertyValue = propertyMap[propertyIndex]; + object.__propertyCache__[propertyIndex] = propertyValue; + } + + for (var signalName in signals) { + // Invoke all callbacks, as signalEmitted() does not. This ensures the + // property cache is updated before the callbacks are invoked. + invokeSignalCallbacks(signalName, signals[signalName]); + } + } + + this.signalEmitted = function(signalName, signalArgs) + { + invokeSignalCallbacks(signalName, signalArgs); + } + + function addMethod(methodData) + { + var methodName = methodData[0]; + var methodIdx = methodData[1]; + object[methodName] = function() { + var args = []; + var callback; + for (var i = 0; i < arguments.length; ++i) { + if (typeof arguments[i] === "function") + callback = arguments[i]; + else + args.push(arguments[i]); + } + + webChannel.exec({ + "type": QWebChannelMessageTypes.invokeMethod, + "object": object.__id__, + "method": methodIdx, + "args": args + }, function(response) { + if (response !== undefined) { + var result = unwrapQObject(response); + if (callback) { + (callback)(result); + } + } + }); + }; + } + + function bindGetterSetter(propertyInfo) + { + var propertyIndex = propertyInfo[0]; + var propertyName = propertyInfo[1]; + var notifySignalData = propertyInfo[2]; + // initialize property cache with current value + object.__propertyCache__[propertyIndex] = propertyInfo[3]; + + if (notifySignalData) { + if (notifySignalData[0] === 1) { + // signal name is optimized away, reconstruct the actual name + notifySignalData[0] = propertyName + "Changed"; + } + addSignal(notifySignalData, true); + } + + Object.defineProperty(object, propertyName, { + get: function () { + var propertyValue = object.__propertyCache__[propertyIndex]; + if (propertyValue === undefined) { + // This shouldn't happen + console.warn("Undefined value in property cache for property \"" + propertyName + "\" in object " + object.__id__); + } + + return propertyValue; + }, + set: function(value) { + if (value === undefined) { + console.warn("Property setter for " + propertyName + " called with undefined value!"); + return; + } + object.__propertyCache__[propertyIndex] = value; + webChannel.exec({ + "type": QWebChannelMessageTypes.setProperty, + "object": object.__id__, + "property": propertyIndex, + "value": value + }); + } + }); + + } + + // ---------------------------------------------------------------------- + + data.methods.forEach(addMethod); + + data.properties.forEach(bindGetterSetter); + + data.signals.forEach(function(signal) { addSignal(signal, false); }); + + for (var name in data.enums) { + object[name] = data.enums[name]; + } +} + +//required for use with nodejs +if (typeof module === 'object') { + module.exports = { + QWebChannel: QWebChannel + }; +} diff --git a/src/qt/receivecoinsdialog.cpp b/src/qt/receivecoinsdialog.cpp index 21c57c376ffa..0c901b5e577f 100644 --- a/src/qt/receivecoinsdialog.cpp +++ b/src/qt/receivecoinsdialog.cpp @@ -14,6 +14,8 @@ #include "receiverequestdialog.h" #include "recentrequeststablemodel.h" #include "walletmodel.h" +#include "receiverequestdialog.h" +#include "guiconstants.h" #include #include @@ -22,27 +24,77 @@ #include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#if QT_VERSION < 0x050000 +#include +#endif + +#if defined(HAVE_CONFIG_H) +#include "config/paccoin-config.h" /* for USE_QRCODE */ +#endif + +#ifdef USE_QRCODE +#include +#endif + ReceiveCoinsDialog::ReceiveCoinsDialog(const PlatformStyle *platformStyle, QWidget *parent) : QDialog(parent), ui(new Ui::ReceiveCoinsDialog), columnResizingFixer(0), model(0), + currentBalance(-1), platformStyle(platformStyle) { ui->setupUi(this); QString theme = GUIUtil::getThemeName(); - + //Initializing the qrcodelabel size: + QRCodeLabelSize = 160; + wasQRCodeGeneratedAlready = false; + + // set the typography correctly + QFont selectedFont = GUIUtil::getCustomSelectedFont(); + QList widgets = this->findChildren(); + for (int i = 0; i < widgets.length(); i++){ + widgets.at(i)->setFont(selectedFont); + } + + ui->lineEditCurrentAddress->hide(); + ui->btnCopyLastAddress->hide(); + + lblQRCode = new QRImageWidget; + lblQRCode->setAlignment(Qt::AlignCenter); + lblQRCode->setContentsMargins(0,0,0,0); + lblQRCode->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); + + ui->qrLayoutContainer->setAlignment(Qt::AlignCenter); + ui->qrLayoutContainer->setContentsMargins(0,0,0,0); + ui->qrLayoutContainer->addWidget(lblQRCode); + if (!platformStyle->getImagesOnButtons()) { - ui->clearButton->setIcon(QIcon()); - ui->receiveButton->setIcon(QIcon()); - ui->showRequestButton->setIcon(QIcon()); - ui->removeRequestButton->setIcon(QIcon()); - } else { - ui->clearButton->setIcon(QIcon(":/icons/" + theme + "/remove")); - ui->receiveButton->setIcon(QIcon(":/icons/" + theme + "/receiving_addresses")); - ui->showRequestButton->setIcon(QIcon(":/icons/" + theme + "/edit")); - ui->removeRequestButton->setIcon(QIcon(":/icons/" + theme + "/remove")); + ui->clearButton->setIcon(QIcon()); + ui->receiveButton->setIcon(QIcon()); + ui->showRequestButton->setIcon(QIcon()); + ui->removeRequestButton->setIcon(QIcon()); + } else { + ui->clearButton->setIcon(QIcon(":/icons/" + theme + "/remove")); + ui->receiveButton->setIcon(QIcon(":/icons/" + theme + "/receiving_addresses")); + ui->showRequestButton->setIcon(QIcon(":/icons/" + theme + "/edit")); + ui->removeRequestButton->setIcon(QIcon(":/icons/" + theme + "/remove")); } + ui->iconLabelAvailableBalance->setPixmap(QPixmap(":icons/bitcoin-32")); // context menu actions QAction *copyURIAction = new QAction(tr("Copy URI"), this); @@ -64,8 +116,16 @@ ReceiveCoinsDialog::ReceiveCoinsDialog(const PlatformStyle *platformStyle, QWidg connect(copyMessageAction, SIGNAL(triggered()), this, SLOT(copyMessage())); connect(copyAmountAction, SIGNAL(triggered()), this, SLOT(copyAmount())); + connect(ui->btnCopyLastAddress, SIGNAL(clicked()), this, SLOT(copyAddress())); + connect(ui->clearButton, SIGNAL(clicked()), this, SLOT(clear())); } +void ReceiveCoinsDialog::copyAddress(){ + QClipboard *clip = QApplication::clipboard(); + QString input = ui->lineEditCurrentAddress->text(); + clip->setText(input); + QToolTip::showText(ui->btnCopyLastAddress->mapToGlobal(QPoint(10,10)), "Copied Address to Clipboard!",ui->btnCopyLastAddress); +} void ReceiveCoinsDialog::setModel(WalletModel *model) { @@ -75,14 +135,22 @@ void ReceiveCoinsDialog::setModel(WalletModel *model) { model->getRecentRequestsTableModel()->sort(RecentRequestsTableModel::Date, Qt::DescendingOrder); connect(model->getOptionsModel(), SIGNAL(displayUnitChanged(int)), this, SLOT(updateDisplayUnit())); + + setBalance(model->getBalance(), model->getUnconfirmedBalance(), model->getImmatureBalance(), model->getAnonymizedBalance(), + model->getWatchBalance(), model->getWatchUnconfirmedBalance(), model->getWatchImmatureBalance()); + connect(model, SIGNAL(balanceChanged(CAmount,CAmount,CAmount,CAmount,CAmount,CAmount,CAmount)), this, SLOT(setBalance(CAmount,CAmount,CAmount,CAmount,CAmount,CAmount,CAmount))); + connect(model->getOptionsModel(), SIGNAL(displayUnitChanged(int)), this, SLOT(updateDisplayUnit())); + updateDisplayUnit(); QTableView* tableView = ui->recentRequestsView; tableView->verticalHeader()->hide(); tableView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + tableView->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); tableView->setModel(model->getRecentRequestsTableModel()); - tableView->setAlternatingRowColors(true); + tableView->setAlternatingRowColors(false); + tableView->setShowGrid(false); tableView->setSelectionBehavior(QAbstractItemView::SelectRows); tableView->setSelectionMode(QAbstractItemView::ContiguousSelection); tableView->setColumnWidth(RecentRequestsTableModel::Date, DATE_COLUMN_WIDTH); @@ -100,7 +168,48 @@ ReceiveCoinsDialog::~ReceiveCoinsDialog() { delete ui; } +void ReceiveCoinsDialog::generateRequestCoins() +{ + if(!model || !model->getOptionsModel() || !model->getAddressTableModel() || !model->getRecentRequestsTableModel()) + return; + QString address; + QString label = ui->reqLabel->text(); + if(ui->reuseAddress->isChecked()) + { + /* Choose existing receiving address */ + AddressBookPage dlg(platformStyle, AddressBookPage::ForSelection, AddressBookPage::ReceivingTab, this); + dlg.setModel(model->getAddressTableModel()); + if(dlg.exec()) + { + address = dlg.getReturnValue(); + if(label.isEmpty()) /* If no label provided, use the previously used label */ + { + label = model->getAddressTableModel()->labelForAddress(address); + } + } else { + return; + } + } else { + /* Generate new receiving address */ + address = model->getAddressTableModel()->addRow(AddressTableModel::Receive, label, ""); + } + SendCoinsRecipient info(address, label, ui->reqAmount->value(), ui->reqMessage->text()); + info.fUseInstantSend = ui->checkUseInstantSend->isChecked(); + clear(); + /* Store request for later reference */ + model->getRecentRequestsTableModel()->addNewRequest(info); + uri = GUIUtil::formatBitcoinURI(info); + + ui->lineEditCurrentAddress->setText(info.address); + ui->lineEditCurrentAddress->show(); + ui->btnCopyLastAddress->show(); +#ifdef USE_QRCODE + QSettings settings; + int height = settings.value("WindowHeight").toInt(); + createQRCodeImage(height); +#endif +} void ReceiveCoinsDialog::clear() { ui->reqAmount->clear(); @@ -126,46 +235,37 @@ void ReceiveCoinsDialog::updateDisplayUnit() { ui->reqAmount->setDisplayUnit(model->getOptionsModel()->getDisplayUnit()); } + setBalance(model->getBalance(), model->getUnconfirmedBalance(), model->getImmatureBalance(), model->getAnonymizedBalance(), + model->getWatchBalance(), model->getWatchUnconfirmedBalance(), model->getWatchImmatureBalance()); + } void ReceiveCoinsDialog::on_receiveButton_clicked() { - if(!model || !model->getOptionsModel() || !model->getAddressTableModel() || !model->getRecentRequestsTableModel()) - return; - - QString address; - QString label = ui->reqLabel->text(); - if(ui->reuseAddress->isChecked()) - { - /* Choose existing receiving address */ - AddressBookPage dlg(platformStyle, AddressBookPage::ForSelection, AddressBookPage::ReceivingTab, this); - dlg.setModel(model->getAddressTableModel()); - if(dlg.exec()) - { - address = dlg.getReturnValue(); - if(label.isEmpty()) /* If no label provided, use the previously used label */ - { - label = model->getAddressTableModel()->labelForAddress(address); - } - } else { - return; - } - } else { - /* Generate new receiving address */ - address = model->getAddressTableModel()->addRow(AddressTableModel::Receive, label, ""); - } - SendCoinsRecipient info(address, label, - ui->reqAmount->value(), ui->reqMessage->text()); - info.fUseInstantSend = ui->checkUseInstantSend->isChecked(); - ReceiveRequestDialog *dialog = new ReceiveRequestDialog(this); - dialog->setAttribute(Qt::WA_DeleteOnClose); - dialog->setModel(model->getOptionsModel()); - dialog->setInfo(info); - dialog->show(); - clear(); - - /* Store request for later reference */ - model->getRecentRequestsTableModel()->addNewRequest(info); + generateRequestCoins(); + + // animation added in order to make the user noticing the qrcode and address changing (UX element) + QGraphicsOpacityEffect *eff1 = new QGraphicsOpacityEffect(this); + QGraphicsOpacityEffect *eff2 = new QGraphicsOpacityEffect(this); + + lblQRCode->setGraphicsEffect(eff1); + ui->lineEditCurrentAddress->setGraphicsEffect(eff2); + + QPropertyAnimation *a1 = new QPropertyAnimation(eff1,"opacity"); + QPropertyAnimation *a2 = new QPropertyAnimation(eff2,"opacity"); + a1->setDuration(250); + a1->setStartValue(0); + a1->setEndValue(1); + a1->setEasingCurve(QEasingCurve::InBack); + + a2->setDuration(250); + a2->setStartValue(0); + a2->setEndValue(1); + a2->setEasingCurve(QEasingCurve::InBack); + + a1->start(QPropertyAnimation::DeleteWhenStopped); + a2->start(QPropertyAnimation::DeleteWhenStopped); + ui->recentRequestsView->selectRow(0); } void ReceiveCoinsDialog::on_recentRequestsView_doubleClicked(const QModelIndex &index) @@ -209,12 +309,87 @@ void ReceiveCoinsDialog::on_removeRequestButton_clicked() model->getRecentRequestsTableModel()->removeRows(firstIndex.row(), selection.length(), firstIndex.parent()); } +void ReceiveCoinsDialog::createQRCodeImage(int height) +{ + lblQRCode->setText(""); + if(!uri.isEmpty()) + { + // limit URI length + if (uri.length() > MAX_URI_LENGTH) + { + lblQRCode->setText(tr("Resulting URI too long, try to reduce the text for label / message.")); + } + else { + QRcode *code = QRcode_encodeString(uri.toUtf8().constData(), 0, QR_ECLEVEL_L, QR_MODE_8, 1); + if (!code) + { + lblQRCode->setText(tr("Error encoding URI into QR Code.")); + return; + } + QImage myImage = QImage(code->width + 8, code->width + 8, QImage::Format_RGB32); + myImage.fill(0xffffff); + unsigned char *p = code->data; + for (int y = 0; y < code->width; y++) + { + for (int x = 0; x < code->width; x++) + { + myImage.setPixel(x + 4, y + 4, ((*p & 1) ? 0x0 : 0xffffff)); + p++; + } + } + // Small QRCode + if(height < 500) + { + QRCodeLabelSize = 100; + } + // Medium QRCode + else if(height > 520 && height < 800) + { + QRCodeLabelSize = 160; + } + // Big QRCode + else if(height > 800) + { + QRCodeLabelSize = 240; + } + + QRcode_free(code); + int QRCodeSize = QRCodeLabelSize - 20; + + QPixmap target(QRCodeLabelSize, QRCodeLabelSize); + target.fill(Qt::transparent); + + QPixmap pixmap = QPixmap::fromImage(myImage).scaled(QRCodeSize, QRCodeSize,Qt::KeepAspectRatioByExpanding); + QPainter painter(&target); + painter.setRenderHint(QPainter::Antialiasing, true); + + QPainterPath painterPath; + painterPath.addEllipse(QRect(0,0,QRCodeLabelSize,QRCodeLabelSize)); + + painter.setClipPath(painterPath); + painter.fillPath(painterPath, Qt::white); + painter.drawPixmap(10,10,pixmap); + lblQRCode->setPixmap(target); + wasQRCodeGeneratedAlready = true; + } + } +} + + // We override the virtual resizeEvent of the QWidget to adjust tables column // sizes as the tables width is proportional to the dialogs width. void ReceiveCoinsDialog::resizeEvent(QResizeEvent *event) { QWidget::resizeEvent(event); columnResizingFixer->stretchColumnWidth(RecentRequestsTableModel::Message); + QSettings settings; + settings.setValue("WindowHeight",event->size().height()); + // It will only resize after the first creation of the qrcode. + if(wasQRCodeGeneratedAlready) + { + createQRCodeImage(event->size().height()); + } + } void ReceiveCoinsDialog::keyPressEvent(QKeyEvent *event) @@ -294,3 +469,26 @@ void ReceiveCoinsDialog::copyAmount() { copyColumnToClipboard(RecentRequestsTableModel::Amount); } + +void ReceiveCoinsDialog::setBalance(const CAmount& balance, const CAmount& unconfirmedBalance, const CAmount& immatureBalance, const CAmount& anonymizedBalance, + const CAmount& watchBalance, const CAmount& watchUnconfirmedBalance, const CAmount& watchImmatureBalance) +{ + currentBalance = balance; + Q_UNUSED(unconfirmedBalance); + Q_UNUSED(immatureBalance); + Q_UNUSED(anonymizedBalance); + Q_UNUSED(watchBalance); + Q_UNUSED(watchUnconfirmedBalance); + Q_UNUSED(watchImmatureBalance); + + // Sets the value of PACs + ui->labelBalance->setText(BitcoinUnits::floorHtmlWithUnit(model->getOptionsModel()->getDisplayUnit(), balance, false, BitcoinUnits::separatorAlways)); + // Sets the value in USD + ui->labelAvailableUSD->setText("$ " + BitcoinUnits::pacToUsd(balance) + " USD"); +} + +/** Receive the signal to update the USD value when the USD-PAC value is updated */ +void ReceiveCoinsDialog::receive_from_walletview() +{ + ui->labelAvailableUSD->setText("$ " + BitcoinUnits::pacToUsd(currentBalance) + " USD"); +} diff --git a/src/qt/receivecoinsdialog.h b/src/qt/receivecoinsdialog.h index 0fef8c47b933..6d91da7a0246 100644 --- a/src/qt/receivecoinsdialog.h +++ b/src/qt/receivecoinsdialog.h @@ -6,6 +6,7 @@ #define BITCOIN_QT_RECEIVECOINSDIALOG_H #include "guiutil.h" +#include "receiverequestdialog.h" #include #include @@ -14,6 +15,8 @@ #include #include #include +#include +#include class OptionsModel; class PlatformStyle; @@ -46,9 +49,11 @@ class ReceiveCoinsDialog : public QDialog void setModel(WalletModel *model); public Q_SLOTS: + void copyAddress(); void clear(); void reject(); void accept(); + void setBalance(const CAmount& balance, const CAmount& unconfirmedBalance, const CAmount& immatureBalance, const CAmount& anonymizedBalance, const CAmount& watchBalance, const CAmount& watchUnconfirmedBalance, const CAmount& watchImmatureBalance); protected: virtual void keyPressEvent(QKeyEvent *event); @@ -58,11 +63,18 @@ public Q_SLOTS: GUIUtil::TableViewLastColumnResizingFixer *columnResizingFixer; WalletModel *model; QMenu *contextMenu; + CAmount currentBalance; const PlatformStyle *platformStyle; QModelIndex selectedRow(); void copyColumnToClipboard(int column); virtual void resizeEvent(QResizeEvent *event); + void generateRequestCoins(); + void createQRCodeImage(int height); + QRImageWidget *lblQRCode; + int QRCodeLabelSize; + bool wasQRCodeGeneratedAlready; + QString uri; private Q_SLOTS: void on_receiveButton_clicked(); @@ -76,6 +88,7 @@ private Q_SLOTS: void copyLabel(); void copyMessage(); void copyAmount(); + void receive_from_walletview(); }; #endif // BITCOIN_QT_RECEIVECOINSDIALOG_H diff --git a/src/qt/receiverequestdialog.cpp b/src/qt/receiverequestdialog.cpp index 670126f31082..2e7cd6980361 100644 --- a/src/qt/receiverequestdialog.cpp +++ b/src/qt/receiverequestdialog.cpp @@ -141,7 +141,7 @@ void ReceiveRequestDialog::update() html += ""; html += ""+tr("Payment information")+"
"; html += ""+tr("URI")+": "; - html += "" + GUIUtil::HtmlEscape(uri) + "
"; + html += "" + GUIUtil::HtmlEscape(uri) + "
"; html += ""+tr("Address")+": " + GUIUtil::HtmlEscape(info.address) + "
"; if(info.amount) html += ""+tr("Amount")+": " + BitcoinUnits::formatHtmlWithUnit(model->getDisplayUnit(), info.amount) + "
"; @@ -150,6 +150,8 @@ void ReceiveRequestDialog::update() if(!info.message.isEmpty()) html += ""+tr("Message")+": " + GUIUtil::HtmlEscape(info.message) + "
"; html += ""+tr("InstantPAC")+": " + (info.fUseInstantSend ? tr("Yes") : tr("No")) + "
"; + ui->outUri->setObjectName("outuri"); + ui->outUri->setStyleSheet("#outuri {background-color: #1a1a1a; color: #fff;}"); ui->outUri->setText(html); #ifdef USE_QRCODE diff --git a/src/qt/res/css/pac.css b/src/qt/res/css/pac.css new file mode 100644 index 000000000000..b9bfae4d9978 --- /dev/null +++ b/src/qt/res/css/pac.css @@ -0,0 +1,765 @@ + +/* + * Global GUI styles + */ + +/* custom Qslider */ +QSlider::handle:horizontal { + background: #D4CA03; + border: 2px solid #D4CA03; + width: 10px; + margin: -3px 0px; /* handle is placed by default on the contents rect of the groove. Expand outside the groove */ + border-radius: 6px; +} +QSlider::groove:horizontal { + border: 1px solid transparent; + height: 7px; /* the groove expands to the size of the slider by default. by giving it a height, it has a fixed size */ + margin: 2px 0; + border-radius: 4px; +} +QSlider::add-page, QSlider::sub-page { + border-radius: 4px; + border: 1px solid transparent; + height: 7px; /* the groove expands to the size of the slider by default. by giving it a height, it has a fixed size */ + margin: 2px 0; +} +QSlider:add-page:disabled, QSlider:sub-page:disabled { + background: #ccc; +} +QSlider::add-page { + background: rgba(100,100,100,0.5); +} +QSlider::sub-page { + background: #555; +} +QSlider::handle:disabled{ + background: #999; + border: 1px solid #999; +} +/* Global labels a Box with a title */ +QLabel, QGroupBox::title{ + color: white !important; + font-weight:normal; +} +/* General window */ +/*QMainWindow{ +}*/ +/* Global message box */ +QMessageBox { + background-color:rgb(26,26,26); +} +/* Global tooltip */ +QToolTip { + color: #0A0A0A; + background-color: #ffffff; + border: none; +} +/* Global dialogs*/ +QDialog{ + background-color:rgb(26,26,26); + color:white; +} +/* Global ComboBox */ +QComboBox{ + background-color: rgb(17,17,17); + border:0px; + height: 26px; + padding: 3px 5px 3px 5px; + color:#fff; + min-height: 24px !important; +} +QComboBox::down-arrow { + border-image: url(':/images/pac/drkblue_downArrow') 0 0 0 0 stretch stretch; +} +QComboBox::drop-down { + width:25px; + border:3px red; +} +QComboBox QListView { + color: #FFF; + background-color: rgb(20, 20, 20); + border:0px; + height:100px; + border-radius: 5px; + padding-right:1px; + padding-left:1px; +} +QComboBox QAbstractItemView::item { + color: rgb(255, 255, 255) !important; + selection-background-color: #494949; + height: 35px !important; + min-width: 100px !important; +} +/* Global TabBar styles */ +QTabWidget::pane { + background-color: transparent; + border: 0px !important; + border-radius:15px; +} +/* Style the tab using the tab sub-control. Note that it reads QTabBar _not_ QTabWidget */ +QTabBar{ + margin-left: 20px; +} +QTabBar::tab { + background:#1D1D1D; + border: 0px solid transparent; + border-bottom-color: transparent; /* same as the pane color */ + padding: 1px; + width: 180px; + color:#FFFFFF; +} +QTabBar::tab:selected, QTabBar::tab:hover, #tabWidget_OptionsDialog > QTabBar::tab:selected, #tabWidget_OptionsDialog > QTabBar::tab:hover { + background-color: #202020 !important; +} +QTabBar::tab:selected { + border-color: transparent !important; + border-bottom-color: transparent !important; +} +/* Global Progress Bar styles */ +QProgressBar { + border: 2px solid rgb(50,50,50); + background-color: white; + border-bottom-right-radius: 9px; + border-bottom-left-radius: 9px; + border-top-left-radius: 9px; + border-top-right-radius: 9px; + max-height: 16px !important; +} +QProgressBar::chunk { + background-color:#F4EA13; + border-radius: 8px; + max-height: 16px !important; +} +QStatusBar{ + background-color: rgb(10,10,10) !important; +} +/* Global with classes */ +[class="container"]{ + background-color: rgba(0,0,0,0.5); + border: 0px !important; +} +[class="LineEdit"], [class="LineEdit_PacCoins"], [class="LineEditSmall"]{ + border: 0px; + outline:0; + padding:3px; + background-color: rgba(67,67,67,0.5); + color: #fff; +} +[class="LineEdit"], [class="LineEdit_PacCoins"]{ + height: 40px !important; + font-size: 15px; + border-radius: 20px; +} +[class="LineEditMedium"]{ + height: 28px !important; + font-size: 13px; + border-radius: 14px; + text-align: center; +} +[class="LineEditSmall"]{ + height: 18px !important; + font-size: 13px; + border-radius: 9px; +} +[class="LineEdit"]:focus, [class="LineEditSmall"]:focus, [class="LineEditMedium"]:focus { + font-size:12px; +} +[class="LineEdit"]:disabled, [class="LineEditSmall"]:disabled, [class="LineEditMedium"]:disabled { + background-color:#474747; + color: #878787; +} +[class="QuickButton"]{ + background-color: transparent; + border: none; + border-radius: 10px; +} +[class="QuickButton"]:hover{ + background-color: rgba(128,128,128,0.2); +} +[class="QuickButton"]:pressed{ + background-color: rgba(250,250,250,0.5); +} + +[class="SpinBoxSmall"]{ + border-radius: 10px !important; + font-size: 12px !important; + min-width: 40px !important; + min-height:20px !important; +} +/* labels */ +QLabel[class="titleLabel"]{ + text-transform:uppercase; + color: #FFF; + font-size:18px; +} +QLabel[class="pacCoinsLabel"]{ + margin: 0px; + color: #F4EA13; + font-size: 32px; + font-weight: medium; +} +QLabel[class="usdLabel"]{ + color: #FFF; + font-size: 23px; + font-weight: normal; +} +QLabel[class="labelPacIcon"]{ + margin: 0px; +} +/*textarea*/ +QPlainTextEdit { + background: rgb(255, 0, 0); + color: rgb(20, 20, 20); + font-size: 15px; +} +/* ScrollBar */ +QScrollBar:vertical, QScrollBar:horizontal { + background-color: #191919; + width: 16px; + margin: 16px 2px 16px 2px; + border: 1px solid rgb(50,50,50); + border-radius: 4px; +} +QScrollBar::handle:vertical, QScrollBar::handle:horizontal { + background-color: #787878; + border: 1px solid rgb(50,50,50); + min-height: 8px; + border-radius: 4px; +} +QScrollBar::handle:vertical:hover, QScrollBar::handle:horizontal:hover { + background-color: rgb(243,232,56); + border: 1px solid rgb(243,232,56); + border-radius: 4px; + min-height: 8px; +} +QScrollBar::sub-line:vertical, QScrollBar::sub-line:horizontal{ + margin: 3px 0px 3px 0px; + border-image: url(:/images/pac/drkblue_upArrow_small); + height: 10px; + width: 10px; + subcontrol-position: top; + subcontrol-origin: margin; +} +QScrollBar::add-line:vertical, QScrollBar::add-line:horizontal { + margin: 3px 0px 3px 0px; + border-image: url(:/images/pac/drkblue_downArrow_small); + height: 10px; + width: 10px; + subcontrol-position: bottom; + subcontrol-origin: margin; +} +QScrollBar::sub-line:vertical:hover, QScrollBar::sub-line:vertical:on , QScrollBar::sub-line:horizontal:hover, QScrollBar::sub-line:horizontal:on{ + border-image: url(:/images/pac/drkblue_upArrow_small); + height: 10px; + width: 10px; + subcontrol-position: top; + subcontrol-origin: margin; +} +QScrollBar::add-line:vertical:hover, QScrollBar::add-line:vertical:on, QScrollBar::add-line:horizontal:hover, QScrollBar::add-line:horizontal:on{ + border-image: url(:/images/pac/drkblue_downArrow_small); + height: 10px; + width: 10px; + subcontrol-position: bottom; + subcontrol-origin: margin; +} +QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical, QScrollBar::up-arrow:horizontal, QScrollBar::down-arrow:horizontal { + background: none; +} +QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical, QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal{ + background: none; +} +/* Global spinbox */ +QAbstractSpinBox { + border-radius: 20px; + font-size: 15px; + min-height:40px; + background-color: rgba(67,67,67,0.5); + text-align: center; + border:0px; + color:#fff; + padding: 3px 5px 3px 5px; +} +QAbstractSpinBox:disabled{ + background-color: rgb(61,61,61); + color: #efefef; +} +QAbstractSpinBox::up-button { + subcontrol-origin: border; + subcontrol-position: top right; + width:21px; + background-color: transparent; + border:0px; + padding-right:4px; + padding-left:5px; + padding-top:2px; +} +QAbstractSpinBox::up-arrow { + image: url(':/images/pac/drkblue_upArrow_small') 0 0 0 0 stretch stretch; +} +QAbstractSpinBox::down-button { + subcontrol-origin: border; + subcontrol-position: bottom right; + width:21px; + background-color: transparent; + border:0px; + padding-right:4px; + padding-left:5px; + padding-bottom:2px; +} +QAbstractSpinBox::down-arrow { + image: url(':/images/pac/drkblue_downArrow_small') 0.5 0.5 0.5 0.5 stretch stretch; +} +/* Global tables */ +QHeaderView { /* Top of the table Header */ + background-color: rgb(17,17,17); +} +QHeaderView::section { /* Top of the table Header Sections */ + background-color: rgb(17,17,17); + color:#fff; + min-height:20px; + height:35px; + font-weight:bold; + font-size:11px; + outline:0; + border:0px solid #fff; + border-right: 1px solid qlineargradient(x1: 0, y1: 0, x2: 0, y2: 0.5, stop: 0 transparent, stop: 1 rgb(71, 71, 71)); + padding-left:5px; + padding-right:5px; + padding-top:2px; + padding-bottom:2px; +} +QHeaderView::down-arrow{ + image: url(':/images/pac/drkblue_downArrow') 0 0 0 0 stretch stretch; + width: 13px; + height: 13px; + margin-right: 5px; +} +QHeaderView::up-arrow{ + image: url(':/images/pac/drkblue_upArrow_small') 0 0 0 0 stretch stretch; + width: 13px; + height: 13px; + margin-right: 5px; +} +QScrollArea { + background: transparent; + border:2px solid transparent; +} +QTableView { /* Table - has to be selected as a class otherwise it throws off QCalendarWidget */ + background-color: rgba(0,0,0,0.5); + border:none; +} +QTableView::item { /* Table Item */ + font-size:12px; +} +QTableView#recentRequestsView, QTableView#MasternodeList, QTableView#transactionsTable, QTableView#tableView{ /* Text color not for proposals */ + color: white; +} +QTableView::item:selected { /* Table Item Selected */ + background-color: rgb(70, 70, 70); +} +QTableWidget{ + background-color: rgba(0,0,0,0.5); + color: white; +} +/* ToolBar Menu */ +QToolBar { + background-color: #000000; + border: 0px; + padding: 0px; + margin: 0px; +} +QToolBar > QToolButton { + background-color:transparent; + border: 0px; + height: 63px !important; + width: 120px; + color: #fff; +} +QToolBar > QToolButton:checked { + background-color: rgba(67,67,67,0.5); +} +#toolbarIcon{ + background: none; + margin: 15px 0px 0px 15px; + border-image: url(:/icons/bitcoin); +} +/* Global Button styles*/ +QPushButton { + background: transparent; + border: 1px solid #F4EA13; + color: #F4EA13; + border-radius: 18px; + height: 35px; + width: 180px; + font-weight: medium; + font-size: 16px; +} +QPushButton:hover, QPushButton:focus{ + background: rgb(243,232,56) !important; + border: 1px solid rgb(243,232,56); + color: rgb(5,5,5); +} +QPushButton:disabled { + background: transparent !important; + border: 1px solid rgba(243,232,56,0.6); + color:rgb(100,100,100) !important; +} +QPushButton:pressed { + background: rgba(243,232,56, 0.3) !important; + border: 0px !important; + color: rgb(243,232,56) !important; +} +/* Style of buttons with classes */ + +[class="SmallButton"]{ + border-radius: 8px; + height: 20px; + width: 80px; + font-weight: normal; + font-size: 12px; +} +[class="linkButton"]{ + background-color: transparent !important; + border: none !important; + color: #F4EA13; + font-size: 11px; + text-decoration: underline; +} +[class="linkButton"]:hover, [class="linkButton"]:focus, #removeRequestButton:hover, #removeRequestButton:focus { + color:rgb(180,180,180); + background-color: transparent !important; + border: 0px !important; +} +[class="linkButton"]:disabled, #removeRequestButton:disabled { + background-color: transparent !important; + color:rgb(100,100,100) !important; + text-decoration: underline; + border: none !important; +} +[class="linkButton"]:pressed, #removeRequestButton:pressed { + background: transparent !important; + border: 0px !important; + color: rgb(255,255,255) !important; +} +[class="accentButton"]{ + text-transform:uppercase; + border: none; + background: #F4EA13; + color: rgb(5,5,5); + border-radius: 35px; + height: 70px !important; + width: 360px; + font-style: normal; + font-size: 22px; + font-weight:medium; +} +QCheckBox, QRadioButton { + color: #FFF; + width: 9px; + height: 9px; + spacing: 10px; +} +/* Global checbox */ +QCheckBox::indicator:unchecked, QCheckBox::indicator:unchecked:hover, QCheckBox::indicator:unchecked:pressed, QCheckBox::indicator:indeterminate:hover{ + image:url(':/images/pac/unchecked_b'); +} +QCheckBox::indicator:checked, QCheckBox::indicator:checked:hover, QCheckBox::indicator:checked:pressed, QCheckBox::indicator:indeterminate:pressed { + image:url(':/images/pac/checked_b'); +} +QCheckBox::indicator:checked:disabled{ + image:url(':/images/pac/checked_b_dis'); +} +QCheckBox::indicator:unchecked:disabled{ + image:url(':/images/pac/unchecked_b_dis'); +} +/* Global radio button */ +QRadioButton::indicator:unchecked, QRadioButton::indicator:unchecked:hover, QRadioButton::indicator:checked:pressed, QRadioButton::indicator:indeterminate:hover { + image:url(':/images/pac/unchecked'); +} +QRadioButton::indicator:unchecked:pressed, QRadioButton::indicator:checked, QRadioButton::indicator:checked:hover , QRadioButton::indicator:indeterminate:pressed { + image:url(':/images/pac/checked'); +} +QRadioButton::indicator:checked:disabled{ + image:url(':/images/pac/checked_dis'); +} +QRadioButton::indicator:unchecked:disabled{ + image:url(':/images/pac/unchecked_dis'); +} +/* ComboBox dropdown Menus for the selector of PAC units inside BitcoinAmountField inputs */ +BitcoinAmountField QComboBox { + border-radius: 20px; + background-color: rgba(67,67,67,0.5); + font-size: 15px; + text-align: center; + border:0px; + padding: 3px 5px 3px 5px; + min-height:40px; + color:#fff; +} +BitcoinAmountField QComboBox:disabled{ + background-color: rgb(61,61,61); + color: #efefef; +} +BitcoinAmountField QComboBox:checked{ + background-color: rgba(219, 219, 219,0.5); +} +BitcoinAmountField QComboBox:editable{ + background-color: rgba(219, 219, 219,0.5); + color:#616161; + border:0px; +} +BitcoinAmountField QComboBox::drop-down { + width:25px; + border:0px; +} +BitcoinAmountField QComboBox::down-arrow { + border-image: url(':/images/pac/drkblue_downArrow') 0 0 0 0 stretch stretch; +} +BitcoinAmountField QComboBox QListView{ + color: #FFF; + background-color: rgb(20, 20, 20); + border:1px solid transparent; + border-radius: 5px; + padding-right:1px; + padding-left:1px; +} +BitcoinAmountField QComboBox QAbstractItemView::item { + margin:4px; +} +BitcoinAmountField QComboBox::item { + color:#fff !important; +} +BitcoinAmountField QComboBox::item:alternate{ + background: rgb(20,20,20); +} +BitcoinAmountField QComboBox::item:selected{ + border:0px solid transparent; + background-color: rgb(40, 40, 40); +} +BitcoinAmountField QComboBox::indicator { + background-color:transparent; + selection-background-color:transparent; + color:transparent; + selection-color:transparent; +} + + +/* + * Styles by section + */ + +/* Modal Overlay */ +#bgWidget{ + background:#171717; +} + +/* + * News/profile bar style + */ +#btnChangeImage{ + height:80px; + width:80px; + border-radius: 40px; +} +#btnChangeImage:hover { + height:80px; + width:80px; + border-radius: 40px; + border: 1px solid rgb(255,255,255) !important; +} +#btnChangeImage:pressed { + height:80px; + width:80px; + border-radius: 40px; + background: white !important; +} + +/* + * Overview Page +*/ + + +/* + * SendCoins Page +*/ +#lineEditCoinControlChange{ + background-color: rgba(67,67,67,0.5); + color: #fff; +} +#SendCoinsDialog{ + background:transparent; +} +#frameCoinControl, #scrollArea, #scrollAreaWidgetContents, #scrollAreaCoinControl{ + border: 0px !important; +} +#frameCoinControl{ + background: rgba(150,150,150,0.1); + border-radius: 8px !important; +} +#frameFee{ + border: 0px; +} +#scrollArea, #scrollAreaWidgetContents, #scrollAreaWidgetContents_3, #scrollAreaCoinControl{ + background-color:rgba(0,0,0,0) !important; +} +#verticalWidget{ + margin-left: 25px !important; +} + +/* + * ReceiveCoins Page + */ +#ReceiveCoinsDialog{ + margin: 12px 42px 18px 42px; +} +#removeRequestButton{ + color: #FF1D1D; +} +#recentRequestsView QHeaderView::section{ + text-transform:uppercase; + height:20px !important; + border-bottom: 1px solid #707070 !important; + border-right: 0px solid transparent !important; + background: transparent !important; + color: #8E8E8E !important; +} + +/* + * Transactions Page + */ +QLineEdit#addressWidget, QLineEdit#tAmountWidget, QComboBox#dateWidget, QComboBox#typeWidget, QCombobox#watchOnlyWidget { /* Over the table */ + background-color: rgb(17,17,17); + color:#fff; + border:0px; + min-height: 24px !important; +} + +/* + * Private Page + */ +#framePrivateSend{ + background-color: rgba(0,0,0,0.5); + border: 0px !important; +} +#labelPrivateSendHeader{ + font-size: 27px; + font-family:"Gotham", sans-serif; + font-weight:bold; + color:#FFF; +} +#labelAnonymized{ + font-size: 38px; + color: #FDF002; + font-weight:bold; +} +#labelAnonymizedText, #labelAmountAndRoundsText, #labelPrivateSendEnabledText{ + text-transform:uppercase; + font-size: 14px; + font-family:"Gotham Medium", sans-serif; + color:#FFF; +} +#labelAmountRounds, #labelPrivateSendEnabled { + font-size: 20px; + color: #FDF002; + font-weight:bold; +} +#privateSendInfo, #privateSendInfo:hover, #privateSendInfo:focus, #privateSendInfo:disabled, #privateSendInfo:pressed, #overviewInfo, #overviewInfo:hover, #overviewInfo:focus, #overviewInfo:disabled, #overviewInfo:pressed{ + background: transparent; + border: 0px; +} + +/* + * Proposal Page + */ +QLineEdit#proposalWidget, QLineEdit#amountWidget, QLineEdit#yesVotesWidget, QLineEdit#noVotesWidget, QLineEdit#absoluteYesVotesWidget, QLineEdit#percentageWidget{ /* Over the table */ + background-color: rgb(17,17,17); + color:#fff; + border:0px; + min-height: 30px !important; +} +QComboBox#startDateWidget, QComboBox#endDateWidget{ + background-color: rgb(17,17,17); + border:0px; + padding: 3px 5px 3px 5px; + color:#fff; + min-height: 24px !important; +} +#startDateWidget::down-arrow, #endDateWidget::down-arrow { + border-image: url(':/images/pac/drkblue_downArrow') 0 0 0 0 stretch stretch; +} +#startDateWidget::drop-down, #endDateWidget::drop-down { + width:25px; + border:3px red; +} +QComboBox#startDateWidget QListView, QComboBox#endDateWidget QListView{ + background-color: rgb(17,17,17); + border:0px; + border-radius: 5px; + padding-right:1px; + padding-left:1px; +} + +/* + * Masternodes Page +*/ +MasternodeList > QTabBar::tab{ + min-width:180px; +} +#filterLineEdit{ + background-color: #0B0B0B; + border-radius: 12px; + height: 24px; +} +#tabWidget>QTabBar::tab { + background-color: #1D1D1D !important; + min-height: 25px; +} +#tabWidget>QTabBar::tab:selected{ + background-color: #383737 !important; + border: 1px solid black !important; +} + +/* + * OptionsDialog +*/ +#tabWidget_OptionsDialog QTabBar::tab { + background: rgb(50,50,50); + width:100px; +} +#tabWidget_OptionsDialog::pane { + background-color: rgba(50,50,50,0.35); +} +#OptionsDialog > #resetButton{ + width:210px !important; +} + +/* + * Sign verify message + */ +#messageIn_SM, #messageIn_VM{ + background: rgb(10, 10, 10); +} + +/* + * Coin contro dialog + */ +#frame{ + border: 0px; +} +#treeWidget{ + border: 0px; + background-color: rgb(17,17,17); + color:#fff; +} + +/* The class on the QT is not working, this is "LineEditSmall" */ +#addressIn_SM, #signatureOut_SM{ + border: 0px; + outline:0; + padding:3px; + background-color: rgb(10, 10, 10); + color: #fff; + height: 20px !important; + font-size: 13px; + border-radius: 10px; +} diff --git a/src/qt/res/fonts/Gotham-Bold.otf b/src/qt/res/fonts/Gotham-Bold.otf new file mode 100644 index 000000000000..59ae7c2a231b Binary files /dev/null and b/src/qt/res/fonts/Gotham-Bold.otf differ diff --git a/src/qt/res/fonts/Gotham-Medium.ttf b/src/qt/res/fonts/Gotham-Medium.ttf new file mode 100644 index 000000000000..fd8221143819 Binary files /dev/null and b/src/qt/res/fonts/Gotham-Medium.ttf differ diff --git a/src/qt/res/fonts/VolteRounded-Bold.otf b/src/qt/res/fonts/VolteRounded-Bold.otf new file mode 100755 index 000000000000..195b0d84b611 Binary files /dev/null and b/src/qt/res/fonts/VolteRounded-Bold.otf differ diff --git a/src/qt/res/fonts/VolteRounded-Light.otf b/src/qt/res/fonts/VolteRounded-Light.otf new file mode 100755 index 000000000000..f7498c72ffac Binary files /dev/null and b/src/qt/res/fonts/VolteRounded-Light.otf differ diff --git a/src/qt/res/fonts/VolteRounded-Medium.otf b/src/qt/res/fonts/VolteRounded-Medium.otf new file mode 100755 index 000000000000..10e239cc610b Binary files /dev/null and b/src/qt/res/fonts/VolteRounded-Medium.otf differ diff --git a/src/qt/res/fonts/VolteRounded-Regular.otf b/src/qt/res/fonts/VolteRounded-Regular.otf new file mode 100644 index 000000000000..90a7b683ea0d Binary files /dev/null and b/src/qt/res/fonts/VolteRounded-Regular.otf differ diff --git a/src/qt/res/fonts/VolteRounded-Semibold.otf b/src/qt/res/fonts/VolteRounded-Semibold.otf new file mode 100755 index 000000000000..5782cd9dea3a Binary files /dev/null and b/src/qt/res/fonts/VolteRounded-Semibold.otf differ diff --git a/src/qt/res/icons/bitcoin-32.png b/src/qt/res/icons/bitcoin-32.png new file mode 100644 index 000000000000..25d57cb6ee9c Binary files /dev/null and b/src/qt/res/icons/bitcoin-32.png differ diff --git a/src/qt/res/icons/pac/about.png b/src/qt/res/icons/pac/about.png new file mode 100644 index 000000000000..fa1c99f02ac1 Binary files /dev/null and b/src/qt/res/icons/pac/about.png differ diff --git a/src/qt/res/icons/pac/about_qt.png b/src/qt/res/icons/pac/about_qt.png new file mode 100644 index 000000000000..c95be013b77e Binary files /dev/null and b/src/qt/res/icons/pac/about_qt.png differ diff --git a/src/qt/res/icons/pac/add.png b/src/qt/res/icons/pac/add.png new file mode 100644 index 000000000000..746f580671f6 Binary files /dev/null and b/src/qt/res/icons/pac/add.png differ diff --git a/src/qt/res/icons/pac/address-book.png b/src/qt/res/icons/pac/address-book.png new file mode 100755 index 000000000000..c593b5e14806 Binary files /dev/null and b/src/qt/res/icons/pac/address-book.png differ diff --git a/src/qt/res/icons/pac/browse.png b/src/qt/res/icons/pac/browse.png new file mode 100644 index 000000000000..0032637f28a8 Binary files /dev/null and b/src/qt/res/icons/pac/browse.png differ diff --git a/src/qt/res/icons/pac/clock1.png b/src/qt/res/icons/pac/clock1.png new file mode 100644 index 000000000000..3e9342582333 Binary files /dev/null and b/src/qt/res/icons/pac/clock1.png differ diff --git a/src/qt/res/icons/pac/clock2.png b/src/qt/res/icons/pac/clock2.png new file mode 100644 index 000000000000..3ea9ca856ebc Binary files /dev/null and b/src/qt/res/icons/pac/clock2.png differ diff --git a/src/qt/res/icons/pac/clock3.png b/src/qt/res/icons/pac/clock3.png new file mode 100644 index 000000000000..7ba498769403 Binary files /dev/null and b/src/qt/res/icons/pac/clock3.png differ diff --git a/src/qt/res/icons/pac/clock4.png b/src/qt/res/icons/pac/clock4.png new file mode 100644 index 000000000000..0efd3ef12f91 Binary files /dev/null and b/src/qt/res/icons/pac/clock4.png differ diff --git a/src/qt/res/icons/pac/clock5.png b/src/qt/res/icons/pac/clock5.png new file mode 100644 index 000000000000..31218dd51bd9 Binary files /dev/null and b/src/qt/res/icons/pac/clock5.png differ diff --git a/src/qt/res/icons/pac/configure.png b/src/qt/res/icons/pac/configure.png new file mode 100644 index 000000000000..abbbbc27cf40 Binary files /dev/null and b/src/qt/res/icons/pac/configure.png differ diff --git a/src/qt/res/icons/pac/connect0_16.png b/src/qt/res/icons/pac/connect0_16.png new file mode 100644 index 000000000000..c18e0f408e8d Binary files /dev/null and b/src/qt/res/icons/pac/connect0_16.png differ diff --git a/src/qt/res/icons/pac/connect1_16.png b/src/qt/res/icons/pac/connect1_16.png new file mode 100755 index 000000000000..c5fc690f395e Binary files /dev/null and b/src/qt/res/icons/pac/connect1_16.png differ diff --git a/src/qt/res/icons/pac/connect2_16.png b/src/qt/res/icons/pac/connect2_16.png new file mode 100755 index 000000000000..97362201f4b4 Binary files /dev/null and b/src/qt/res/icons/pac/connect2_16.png differ diff --git a/src/qt/res/icons/pac/connect3_16.png b/src/qt/res/icons/pac/connect3_16.png new file mode 100755 index 000000000000..99dcd17b3a88 Binary files /dev/null and b/src/qt/res/icons/pac/connect3_16.png differ diff --git a/src/qt/res/icons/pac/connect4_16.png b/src/qt/res/icons/pac/connect4_16.png new file mode 100755 index 000000000000..07a0f82cb561 Binary files /dev/null and b/src/qt/res/icons/pac/connect4_16.png differ diff --git a/src/qt/res/icons/pac/debugwindow.png b/src/qt/res/icons/pac/debugwindow.png new file mode 100644 index 000000000000..0a59796fe61c Binary files /dev/null and b/src/qt/res/icons/pac/debugwindow.png differ diff --git a/src/qt/res/icons/pac/drkblue_address-book.png b/src/qt/res/icons/pac/drkblue_address-book.png new file mode 100644 index 000000000000..1af1f60f1a60 Binary files /dev/null and b/src/qt/res/icons/pac/drkblue_address-book.png differ diff --git a/src/qt/res/icons/pac/drkblue_editcopy.png b/src/qt/res/icons/pac/drkblue_editcopy.png new file mode 100644 index 000000000000..d2201f85992b Binary files /dev/null and b/src/qt/res/icons/pac/drkblue_editcopy.png differ diff --git a/src/qt/res/icons/pac/drkblue_editpaste.png b/src/qt/res/icons/pac/drkblue_editpaste.png new file mode 100644 index 000000000000..317c2ed8219a Binary files /dev/null and b/src/qt/res/icons/pac/drkblue_editpaste.png differ diff --git a/src/qt/res/icons/pac/drkblue_remove.png b/src/qt/res/icons/pac/drkblue_remove.png new file mode 100644 index 000000000000..99fd9660e529 Binary files /dev/null and b/src/qt/res/icons/pac/drkblue_remove.png differ diff --git a/src/qt/res/icons/pac/edit.png b/src/qt/res/icons/pac/edit.png new file mode 100644 index 000000000000..3be65327d58e Binary files /dev/null and b/src/qt/res/icons/pac/edit.png differ diff --git a/src/qt/res/icons/pac/editcopy.png b/src/qt/res/icons/pac/editcopy.png new file mode 100755 index 000000000000..c9c1b5ea7bd1 Binary files /dev/null and b/src/qt/res/icons/pac/editcopy.png differ diff --git a/src/qt/res/icons/pac/editpaste.png b/src/qt/res/icons/pac/editpaste.png new file mode 100644 index 000000000000..17d9036954ef Binary files /dev/null and b/src/qt/res/icons/pac/editpaste.png differ diff --git a/src/qt/res/icons/pac/export.png b/src/qt/res/icons/pac/export.png new file mode 100644 index 000000000000..6346da2c767a Binary files /dev/null and b/src/qt/res/icons/pac/export.png differ diff --git a/src/qt/res/icons/pac/eye.png b/src/qt/res/icons/pac/eye.png new file mode 100644 index 000000000000..b833c638a5cf Binary files /dev/null and b/src/qt/res/icons/pac/eye.png differ diff --git a/src/qt/res/icons/pac/eye_minus.png b/src/qt/res/icons/pac/eye_minus.png new file mode 100644 index 000000000000..649d9e411596 Binary files /dev/null and b/src/qt/res/icons/pac/eye_minus.png differ diff --git a/src/qt/res/icons/pac/eye_plus.png b/src/qt/res/icons/pac/eye_plus.png new file mode 100644 index 000000000000..7e7ca0e2db96 Binary files /dev/null and b/src/qt/res/icons/pac/eye_plus.png differ diff --git a/src/qt/res/icons/pac/filesave.png b/src/qt/res/icons/pac/filesave.png new file mode 100644 index 000000000000..0032637f28a8 Binary files /dev/null and b/src/qt/res/icons/pac/filesave.png differ diff --git a/src/qt/res/icons/pac/fontbigger.png b/src/qt/res/icons/pac/fontbigger.png new file mode 100644 index 000000000000..642938261b7d Binary files /dev/null and b/src/qt/res/icons/pac/fontbigger.png differ diff --git a/src/qt/res/icons/pac/fontsmaller.png b/src/qt/res/icons/pac/fontsmaller.png new file mode 100644 index 000000000000..0f74b7f08c1f Binary files /dev/null and b/src/qt/res/icons/pac/fontsmaller.png differ diff --git a/src/qt/res/icons/pac/hd_disabled.png b/src/qt/res/icons/pac/hd_disabled.png new file mode 100644 index 000000000000..b6fce2eaca5a Binary files /dev/null and b/src/qt/res/icons/pac/hd_disabled.png differ diff --git a/src/qt/res/icons/pac/hd_enabled.png b/src/qt/res/icons/pac/hd_enabled.png new file mode 100644 index 000000000000..c65c8ddc8a57 Binary files /dev/null and b/src/qt/res/icons/pac/hd_enabled.png differ diff --git a/src/qt/res/icons/pac/history.png b/src/qt/res/icons/pac/history.png new file mode 100755 index 000000000000..007cdc34ff5e Binary files /dev/null and b/src/qt/res/icons/pac/history.png differ diff --git a/src/qt/res/icons/pac/info.png b/src/qt/res/icons/pac/info.png new file mode 100755 index 000000000000..e2288885cf05 Binary files /dev/null and b/src/qt/res/icons/pac/info.png differ diff --git a/src/qt/res/icons/pac/key.png b/src/qt/res/icons/pac/key.png new file mode 100644 index 000000000000..734f5e43380a Binary files /dev/null and b/src/qt/res/icons/pac/key.png differ diff --git a/src/qt/res/icons/pac/lock_closed.png b/src/qt/res/icons/pac/lock_closed.png new file mode 100755 index 000000000000..d3abf86c002b Binary files /dev/null and b/src/qt/res/icons/pac/lock_closed.png differ diff --git a/src/qt/res/icons/pac/lock_open.png b/src/qt/res/icons/pac/lock_open.png new file mode 100644 index 000000000000..6711c2050a44 Binary files /dev/null and b/src/qt/res/icons/pac/lock_open.png differ diff --git a/src/qt/res/icons/pac/masternodes.png b/src/qt/res/icons/pac/masternodes.png new file mode 100755 index 000000000000..3fbb59753d5c Binary files /dev/null and b/src/qt/res/icons/pac/masternodes.png differ diff --git a/src/qt/res/icons/pac/network_disabled.png b/src/qt/res/icons/pac/network_disabled.png new file mode 100644 index 000000000000..05217e5a8030 Binary files /dev/null and b/src/qt/res/icons/pac/network_disabled.png differ diff --git a/src/qt/res/icons/pac/notsynced.png b/src/qt/res/icons/pac/notsynced.png new file mode 100644 index 000000000000..e3326cfec79d Binary files /dev/null and b/src/qt/res/icons/pac/notsynced.png differ diff --git a/src/qt/res/icons/pac/overview.png b/src/qt/res/icons/pac/overview.png new file mode 100644 index 000000000000..612179789d9d Binary files /dev/null and b/src/qt/res/icons/pac/overview.png differ diff --git a/src/qt/res/icons/pac/private.png b/src/qt/res/icons/pac/private.png new file mode 100755 index 000000000000..e99afddbeee4 Binary files /dev/null and b/src/qt/res/icons/pac/private.png differ diff --git a/src/qt/res/icons/pac/proposal.png b/src/qt/res/icons/pac/proposal.png new file mode 100755 index 000000000000..3cfce8b12c8b Binary files /dev/null and b/src/qt/res/icons/pac/proposal.png differ diff --git a/src/qt/res/icons/pac/quit.png b/src/qt/res/icons/pac/quit.png new file mode 100644 index 000000000000..55cb44bb4e83 Binary files /dev/null and b/src/qt/res/icons/pac/quit.png differ diff --git a/src/qt/res/icons/pac/receive.png b/src/qt/res/icons/pac/receive.png new file mode 100755 index 000000000000..420820177475 Binary files /dev/null and b/src/qt/res/icons/pac/receive.png differ diff --git a/src/qt/res/icons/pac/remove.png b/src/qt/res/icons/pac/remove.png new file mode 100644 index 000000000000..57528e9a9864 Binary files /dev/null and b/src/qt/res/icons/pac/remove.png differ diff --git a/src/qt/res/icons/pac/send.png b/src/qt/res/icons/pac/send.png new file mode 100755 index 000000000000..8db3aee7494f Binary files /dev/null and b/src/qt/res/icons/pac/send.png differ diff --git a/src/qt/res/icons/pac/synced.png b/src/qt/res/icons/pac/synced.png new file mode 100755 index 000000000000..d6d05f961a92 Binary files /dev/null and b/src/qt/res/icons/pac/synced.png differ diff --git a/src/qt/res/icons/pac/toolbar.png b/src/qt/res/icons/pac/toolbar.png new file mode 100644 index 000000000000..003eb2a4da37 Binary files /dev/null and b/src/qt/res/icons/pac/toolbar.png differ diff --git a/src/qt/res/icons/pac/toolbar_testnet.png b/src/qt/res/icons/pac/toolbar_testnet.png new file mode 100644 index 000000000000..003eb2a4da37 Binary files /dev/null and b/src/qt/res/icons/pac/toolbar_testnet.png differ diff --git a/src/qt/res/icons/pac/transaction0.png b/src/qt/res/icons/pac/transaction0.png new file mode 100644 index 000000000000..4c7a02dfacca Binary files /dev/null and b/src/qt/res/icons/pac/transaction0.png differ diff --git a/src/qt/res/icons/pac/transaction2.png b/src/qt/res/icons/pac/transaction2.png new file mode 100644 index 000000000000..c95cd8283fd9 Binary files /dev/null and b/src/qt/res/icons/pac/transaction2.png differ diff --git a/src/qt/res/icons/pac/transaction_abandoned.png b/src/qt/res/icons/pac/transaction_abandoned.png new file mode 100755 index 000000000000..07d561ac4cda Binary files /dev/null and b/src/qt/res/icons/pac/transaction_abandoned.png differ diff --git a/src/qt/res/icons/pac/transaction_conflicted.png b/src/qt/res/icons/pac/transaction_conflicted.png new file mode 100644 index 000000000000..5481ac114b2a Binary files /dev/null and b/src/qt/res/icons/pac/transaction_conflicted.png differ diff --git a/src/qt/res/icons/pac/tx_inout.png b/src/qt/res/icons/pac/tx_inout.png new file mode 100644 index 000000000000..c93f8ac55ab4 Binary files /dev/null and b/src/qt/res/icons/pac/tx_inout.png differ diff --git a/src/qt/res/icons/pac/tx_input.png b/src/qt/res/icons/pac/tx_input.png new file mode 100755 index 000000000000..87c27a3d5c17 Binary files /dev/null and b/src/qt/res/icons/pac/tx_input.png differ diff --git a/src/qt/res/icons/pac/tx_mined.png b/src/qt/res/icons/pac/tx_mined.png new file mode 100644 index 000000000000..eb69891486b8 Binary files /dev/null and b/src/qt/res/icons/pac/tx_mined.png differ diff --git a/src/qt/res/icons/pac/tx_output.png b/src/qt/res/icons/pac/tx_output.png new file mode 100755 index 000000000000..54fb9fcc8b9b Binary files /dev/null and b/src/qt/res/icons/pac/tx_output.png differ diff --git a/src/qt/res/icons/pac/verify.png b/src/qt/res/icons/pac/verify.png new file mode 100644 index 000000000000..52610e3c2591 Binary files /dev/null and b/src/qt/res/icons/pac/verify.png differ diff --git a/src/qt/res/icons/warning.png b/src/qt/res/icons/warning.png index a4f95d56cdf8..94d63cf17229 100644 Binary files a/src/qt/res/icons/warning.png and b/src/qt/res/icons/warning.png differ diff --git a/src/qt/res/images/pac/about.png b/src/qt/res/images/pac/about.png new file mode 100755 index 000000000000..b39532892128 Binary files /dev/null and b/src/qt/res/images/pac/about.png differ diff --git a/src/qt/res/images/pac/checked.png b/src/qt/res/images/pac/checked.png new file mode 100644 index 000000000000..2fbe8b6260b8 Binary files /dev/null and b/src/qt/res/images/pac/checked.png differ diff --git a/src/qt/res/images/pac/checked_b.png b/src/qt/res/images/pac/checked_b.png new file mode 100644 index 000000000000..ea00a7a95809 Binary files /dev/null and b/src/qt/res/images/pac/checked_b.png differ diff --git a/src/qt/res/images/pac/checked_b_dis.png b/src/qt/res/images/pac/checked_b_dis.png new file mode 100644 index 000000000000..ffef8637bc45 Binary files /dev/null and b/src/qt/res/images/pac/checked_b_dis.png differ diff --git a/src/qt/res/images/pac/checked_dis.png b/src/qt/res/images/pac/checked_dis.png new file mode 100644 index 000000000000..09957dd4ea4b Binary files /dev/null and b/src/qt/res/images/pac/checked_dis.png differ diff --git a/src/qt/res/images/pac/drkblue_downArrow.png b/src/qt/res/images/pac/drkblue_downArrow.png new file mode 100644 index 000000000000..3135d585792f Binary files /dev/null and b/src/qt/res/images/pac/drkblue_downArrow.png differ diff --git a/src/qt/res/images/pac/drkblue_downArrow_small.png b/src/qt/res/images/pac/drkblue_downArrow_small.png new file mode 100644 index 000000000000..ff9e17b19722 Binary files /dev/null and b/src/qt/res/images/pac/drkblue_downArrow_small.png differ diff --git a/src/qt/res/images/pac/drkblue_leftArrow_small.png b/src/qt/res/images/pac/drkblue_leftArrow_small.png new file mode 100644 index 000000000000..10d6ed5a7ec3 Binary files /dev/null and b/src/qt/res/images/pac/drkblue_leftArrow_small.png differ diff --git a/src/qt/res/images/pac/drkblue_qtreeview_selected.png b/src/qt/res/images/pac/drkblue_qtreeview_selected.png new file mode 100644 index 000000000000..2656a1efa43e Binary files /dev/null and b/src/qt/res/images/pac/drkblue_qtreeview_selected.png differ diff --git a/src/qt/res/images/pac/drkblue_rightArrow_small.png b/src/qt/res/images/pac/drkblue_rightArrow_small.png new file mode 100644 index 000000000000..a22e5de91148 Binary files /dev/null and b/src/qt/res/images/pac/drkblue_rightArrow_small.png differ diff --git a/src/qt/res/images/pac/drkblue_upArrow_small.png b/src/qt/res/images/pac/drkblue_upArrow_small.png new file mode 100644 index 000000000000..1fa99310358e Binary files /dev/null and b/src/qt/res/images/pac/drkblue_upArrow_small.png differ diff --git a/src/qt/res/images/pac/drkblue_walletFrame_bg.png b/src/qt/res/images/pac/drkblue_walletFrame_bg.png new file mode 100644 index 000000000000..47d2dc8088f9 Binary files /dev/null and b/src/qt/res/images/pac/drkblue_walletFrame_bg.png differ diff --git a/src/qt/res/images/pac/header_bkg.png b/src/qt/res/images/pac/header_bkg.png new file mode 100644 index 000000000000..88afc4e34379 Binary files /dev/null and b/src/qt/res/images/pac/header_bkg.png differ diff --git a/src/qt/res/images/pac/hover_profile.png b/src/qt/res/images/pac/hover_profile.png new file mode 100755 index 000000000000..5181dc29d26d Binary files /dev/null and b/src/qt/res/images/pac/hover_profile.png differ diff --git a/src/qt/res/images/pac/paccoin_logo_horizontal.png b/src/qt/res/images/pac/paccoin_logo_horizontal.png new file mode 100644 index 000000000000..f0bc1fd464f5 Binary files /dev/null and b/src/qt/res/images/pac/paccoin_logo_horizontal.png differ diff --git a/src/qt/res/images/pac/profile_bkg.png b/src/qt/res/images/pac/profile_bkg.png new file mode 100644 index 000000000000..3d35d986fc83 Binary files /dev/null and b/src/qt/res/images/pac/profile_bkg.png differ diff --git a/src/qt/res/images/pac/splash.png b/src/qt/res/images/pac/splash.png new file mode 100755 index 000000000000..7058b5b3db9a Binary files /dev/null and b/src/qt/res/images/pac/splash.png differ diff --git a/src/qt/res/images/pac/splash_testnet.png b/src/qt/res/images/pac/splash_testnet.png new file mode 100755 index 000000000000..7058b5b3db9a Binary files /dev/null and b/src/qt/res/images/pac/splash_testnet.png differ diff --git a/src/qt/res/images/pac/unchecked.png b/src/qt/res/images/pac/unchecked.png new file mode 100644 index 000000000000..7e367cef0146 Binary files /dev/null and b/src/qt/res/images/pac/unchecked.png differ diff --git a/src/qt/res/images/pac/unchecked_b.png b/src/qt/res/images/pac/unchecked_b.png new file mode 100644 index 000000000000..24f6678c9f78 Binary files /dev/null and b/src/qt/res/images/pac/unchecked_b.png differ diff --git a/src/qt/res/images/pac/unchecked_b_dis.png b/src/qt/res/images/pac/unchecked_b_dis.png new file mode 100644 index 000000000000..20f5fdc3ad97 Binary files /dev/null and b/src/qt/res/images/pac/unchecked_b_dis.png differ diff --git a/src/qt/res/images/pac/unchecked_dis.png b/src/qt/res/images/pac/unchecked_dis.png new file mode 100644 index 000000000000..76c8904893ef Binary files /dev/null and b/src/qt/res/images/pac/unchecked_dis.png differ diff --git a/src/qt/res/movies/spinner-000.png b/src/qt/res/movies/spinner-000.png index 0dc48d0d8c56..e09965cd8785 100644 Binary files a/src/qt/res/movies/spinner-000.png and b/src/qt/res/movies/spinner-000.png differ diff --git a/src/qt/res/movies/spinner-001.png b/src/qt/res/movies/spinner-001.png index d167f20541f8..da17f0a336ce 100644 Binary files a/src/qt/res/movies/spinner-001.png and b/src/qt/res/movies/spinner-001.png differ diff --git a/src/qt/res/movies/spinner-002.png b/src/qt/res/movies/spinner-002.png index 4a1f1f8e5660..e7f96b6f9a70 100644 Binary files a/src/qt/res/movies/spinner-002.png and b/src/qt/res/movies/spinner-002.png differ diff --git a/src/qt/res/movies/spinner-003.png b/src/qt/res/movies/spinner-003.png index fb1c2cd4adc8..6fea7bbb72e2 100644 Binary files a/src/qt/res/movies/spinner-003.png and b/src/qt/res/movies/spinner-003.png differ diff --git a/src/qt/res/movies/spinner-004.png b/src/qt/res/movies/spinner-004.png index 4df2132344fb..b6ab20a3c205 100644 Binary files a/src/qt/res/movies/spinner-004.png and b/src/qt/res/movies/spinner-004.png differ diff --git a/src/qt/res/movies/spinner-005.png b/src/qt/res/movies/spinner-005.png index 5d6f41e0dc04..b330cedcdd12 100644 Binary files a/src/qt/res/movies/spinner-005.png and b/src/qt/res/movies/spinner-005.png differ diff --git a/src/qt/res/movies/spinner-006.png b/src/qt/res/movies/spinner-006.png index c1f7d18899b4..92193f9f32e5 100644 Binary files a/src/qt/res/movies/spinner-006.png and b/src/qt/res/movies/spinner-006.png differ diff --git a/src/qt/res/movies/spinner-007.png b/src/qt/res/movies/spinner-007.png index 1e794b262622..ccb1ba6a50fb 100644 Binary files a/src/qt/res/movies/spinner-007.png and b/src/qt/res/movies/spinner-007.png differ diff --git a/src/qt/res/movies/spinner-008.png b/src/qt/res/movies/spinner-008.png index df12ea87197b..19119483ea77 100644 Binary files a/src/qt/res/movies/spinner-008.png and b/src/qt/res/movies/spinner-008.png differ diff --git a/src/qt/res/movies/spinner-009.png b/src/qt/res/movies/spinner-009.png index 18fc3a7d16d2..fa099852624d 100644 Binary files a/src/qt/res/movies/spinner-009.png and b/src/qt/res/movies/spinner-009.png differ diff --git a/src/qt/res/movies/spinner-010.png b/src/qt/res/movies/spinner-010.png index a79c845fe828..a6e9122ea2bb 100644 Binary files a/src/qt/res/movies/spinner-010.png and b/src/qt/res/movies/spinner-010.png differ diff --git a/src/qt/res/movies/spinner-011.png b/src/qt/res/movies/spinner-011.png index 57baf66895fd..ebc3d8f6136f 100644 Binary files a/src/qt/res/movies/spinner-011.png and b/src/qt/res/movies/spinner-011.png differ diff --git a/src/qt/res/movies/spinner-012.png b/src/qt/res/movies/spinner-012.png index 9deae7853a77..42d011f664fc 100644 Binary files a/src/qt/res/movies/spinner-012.png and b/src/qt/res/movies/spinner-012.png differ diff --git a/src/qt/res/movies/spinner-013.png b/src/qt/res/movies/spinner-013.png index 0659d48decf3..df3af8378e78 100644 Binary files a/src/qt/res/movies/spinner-013.png and b/src/qt/res/movies/spinner-013.png differ diff --git a/src/qt/res/movies/spinner-014.png b/src/qt/res/movies/spinner-014.png index bc1ef51bdedb..ee658fd14dba 100644 Binary files a/src/qt/res/movies/spinner-014.png and b/src/qt/res/movies/spinner-014.png differ diff --git a/src/qt/res/movies/spinner-015.png b/src/qt/res/movies/spinner-015.png index 24b57b62c2cd..a3f5ca0c45f6 100644 Binary files a/src/qt/res/movies/spinner-015.png and b/src/qt/res/movies/spinner-015.png differ diff --git a/src/qt/res/movies/spinner-016.png b/src/qt/res/movies/spinner-016.png index d622872651aa..50f2556c5c2d 100644 Binary files a/src/qt/res/movies/spinner-016.png and b/src/qt/res/movies/spinner-016.png differ diff --git a/src/qt/res/movies/spinner-017.png b/src/qt/res/movies/spinner-017.png index f48f688db204..59cf9c81f80e 100644 Binary files a/src/qt/res/movies/spinner-017.png and b/src/qt/res/movies/spinner-017.png differ diff --git a/src/qt/res/movies/spinner-018.png b/src/qt/res/movies/spinner-018.png index a2c8f38b1d82..e09965cd8785 100644 Binary files a/src/qt/res/movies/spinner-018.png and b/src/qt/res/movies/spinner-018.png differ diff --git a/src/qt/res/movies/spinner-019.png b/src/qt/res/movies/spinner-019.png index 9d7cc35d8283..da17f0a336ce 100644 Binary files a/src/qt/res/movies/spinner-019.png and b/src/qt/res/movies/spinner-019.png differ diff --git a/src/qt/res/movies/spinner-020.png b/src/qt/res/movies/spinner-020.png index 1a07acc45402..e7f96b6f9a70 100644 Binary files a/src/qt/res/movies/spinner-020.png and b/src/qt/res/movies/spinner-020.png differ diff --git a/src/qt/res/movies/spinner-021.png b/src/qt/res/movies/spinner-021.png index 9cea8f25433a..6fea7bbb72e2 100644 Binary files a/src/qt/res/movies/spinner-021.png and b/src/qt/res/movies/spinner-021.png differ diff --git a/src/qt/res/movies/spinner-022.png b/src/qt/res/movies/spinner-022.png index 60250f6dea8d..b6ab20a3c205 100644 Binary files a/src/qt/res/movies/spinner-022.png and b/src/qt/res/movies/spinner-022.png differ diff --git a/src/qt/res/movies/spinner-023.png b/src/qt/res/movies/spinner-023.png index fc290a0cf245..b330cedcdd12 100644 Binary files a/src/qt/res/movies/spinner-023.png and b/src/qt/res/movies/spinner-023.png differ diff --git a/src/qt/res/movies/spinner-024.png b/src/qt/res/movies/spinner-024.png index c5dcf1eae90f..92193f9f32e5 100644 Binary files a/src/qt/res/movies/spinner-024.png and b/src/qt/res/movies/spinner-024.png differ diff --git a/src/qt/res/movies/spinner-025.png b/src/qt/res/movies/spinner-025.png index 7f3577a4de2c..ccb1ba6a50fb 100644 Binary files a/src/qt/res/movies/spinner-025.png and b/src/qt/res/movies/spinner-025.png differ diff --git a/src/qt/res/movies/spinner-026.png b/src/qt/res/movies/spinner-026.png index 1663ddf44c07..19119483ea77 100644 Binary files a/src/qt/res/movies/spinner-026.png and b/src/qt/res/movies/spinner-026.png differ diff --git a/src/qt/res/movies/spinner-027.png b/src/qt/res/movies/spinner-027.png index d0e6da450384..fa099852624d 100644 Binary files a/src/qt/res/movies/spinner-027.png and b/src/qt/res/movies/spinner-027.png differ diff --git a/src/qt/res/movies/spinner-028.png b/src/qt/res/movies/spinner-028.png index 2a7aba50e2cf..a6e9122ea2bb 100644 Binary files a/src/qt/res/movies/spinner-028.png and b/src/qt/res/movies/spinner-028.png differ diff --git a/src/qt/res/movies/spinner-029.png b/src/qt/res/movies/spinner-029.png index c8ca15c1e1c2..ebc3d8f6136f 100644 Binary files a/src/qt/res/movies/spinner-029.png and b/src/qt/res/movies/spinner-029.png differ diff --git a/src/qt/res/movies/spinner-030.png b/src/qt/res/movies/spinner-030.png index c847c99a93e5..42d011f664fc 100644 Binary files a/src/qt/res/movies/spinner-030.png and b/src/qt/res/movies/spinner-030.png differ diff --git a/src/qt/res/movies/spinner-031.png b/src/qt/res/movies/spinner-031.png index 403443144ebe..df3af8378e78 100644 Binary files a/src/qt/res/movies/spinner-031.png and b/src/qt/res/movies/spinner-031.png differ diff --git a/src/qt/res/movies/spinner-032.png b/src/qt/res/movies/spinner-032.png index f9db080567c3..ee658fd14dba 100644 Binary files a/src/qt/res/movies/spinner-032.png and b/src/qt/res/movies/spinner-032.png differ diff --git a/src/qt/res/movies/spinner-033.png b/src/qt/res/movies/spinner-033.png index 43f57719e7fc..a3f5ca0c45f6 100644 Binary files a/src/qt/res/movies/spinner-033.png and b/src/qt/res/movies/spinner-033.png differ diff --git a/src/qt/res/movies/spinner-034.png b/src/qt/res/movies/spinner-034.png index c26656ff17a5..50f2556c5c2d 100644 Binary files a/src/qt/res/movies/spinner-034.png and b/src/qt/res/movies/spinner-034.png differ diff --git a/src/qt/res/movies/spinner-035.png b/src/qt/res/movies/spinner-035.png index e471f950a3e7..59cf9c81f80e 100644 Binary files a/src/qt/res/movies/spinner-035.png and b/src/qt/res/movies/spinner-035.png differ diff --git a/src/qt/sendcoinsdialog.cpp b/src/qt/sendcoinsdialog.cpp index 2c51400e7b96..c7ef95297826 100644 --- a/src/qt/sendcoinsdialog.cpp +++ b/src/qt/sendcoinsdialog.cpp @@ -29,6 +29,8 @@ #include #include #include +#include +#include SendCoinsDialog::SendCoinsDialog(const PlatformStyle *platformStyle, QWidget *parent) : QDialog(parent), @@ -42,6 +44,13 @@ SendCoinsDialog::SendCoinsDialog(const PlatformStyle *platformStyle, QWidget *pa ui->setupUi(this); QString theme = GUIUtil::getThemeName(); + // set the typography correctly + QFont selectedFont = GUIUtil::getCustomSelectedFont(); + QList widgets = this->findChildren(); + for (int i = 0; i < widgets.length(); i++){ + widgets.at(i)->setFont(selectedFont); + } + if (!platformStyle->getImagesOnButtons()) { ui->addButton->setIcon(QIcon()); ui->clearButton->setIcon(QIcon()); @@ -52,7 +61,12 @@ SendCoinsDialog::SendCoinsDialog(const PlatformStyle *platformStyle, QWidget *pa ui->sendButton->setIcon(QIcon(":/icons/" + theme + "/send")); } + + ui->iconLabelConvertedCurrency->setPixmap(QPixmap(":icons/bitcoin-32")); + ui->iconLabelAvailableBalance->setPixmap(QPixmap(":icons/bitcoin-32")); + GUIUtil::setupAddressWidget(ui->lineEditCoinControlChange, this); + colorCount = 0; addEntry(); @@ -438,6 +452,7 @@ void SendCoinsDialog::clear() { ui->entries->takeAt(0)->widget()->deleteLater(); } + colorCount = 0; addEntry(); updateTabsAndLabels(); @@ -455,7 +470,12 @@ void SendCoinsDialog::accept() SendCoinsEntry *SendCoinsDialog::addEntry() { + colorCount++; SendCoinsEntry *entry = new SendCoinsEntry(platformStyle, this); + + if(colorCount!=1){ + entry->setStyleSheet("#SendCoinsEntry { border-top: 3px solid #474747; }"); + } entry->setModel(model); ui->entries->addWidget(entry); connect(entry, SIGNAL(removeEntry(SendCoinsEntry*)), this, SLOT(removeEntry(SendCoinsEntry*))); @@ -492,6 +512,7 @@ void SendCoinsDialog::removeEntry(SendCoinsEntry* entry) entry->deleteLater(); updateTabsAndLabels(); + colorCount--; } QWidget *SendCoinsDialog::setupTabChain(QWidget *prev) @@ -582,8 +603,10 @@ void SendCoinsDialog::setBalance(const CAmount& balance, const CAmount& unconfir } else { bal = balance; } - - ui->labelBalance->setText(BitcoinUnits::formatWithUnit(model->getOptionsModel()->getDisplayUnit(), bal)); + // Sets the value of PACs + ui->labelBalance->setText(BitcoinUnits::floorHtmlWithUnit(model->getOptionsModel()->getDisplayUnit(), bal, false, BitcoinUnits::separatorAlways)); + // Sets the value in USD + ui->labelAvailableUSD->setText("$ " + BitcoinUnits::pacToUsd(bal) + " USD"); } } @@ -727,11 +750,25 @@ void SendCoinsDialog::updateFeeMinimizedLabel() if(!model || !model->getOptionsModel()) return; - if (ui->radioSmartFee->isChecked()) - ui->labelFeeMinimized->setText(ui->labelSmartFee->text()); - else { - ui->labelFeeMinimized->setText(BitcoinUnits::formatWithUnit(model->getOptionsModel()->getDisplayUnit(), ui->customFee->value()) + - ((ui->radioCustomPerKilobyte->isChecked()) ? "/kB" : "")); + if (ui->radioSmartFee->isChecked()){ + QString feeMinimized = ui->labelSmartFee->text(); + QStringList list1 = feeMinimized.split('.'); + QStringList list2 = list1[1].split(' '); + if(list2[0].toInt()==0){ + ui->labelFeeMinimized->setText(list1[0] + ".00" + list2[1]); + }else{ + ui->labelFeeMinimized->setText(feeMinimized); + } + }else { + QString feeMinimized = BitcoinUnits::formatWithUnit(model->getOptionsModel()->getDisplayUnit(), ui->customFee->value()) + ((ui->radioCustomPerKilobyte->isChecked()) ? "/kB" : ""); + QStringList list1 = feeMinimized.split('.'); + QStringList list2 = list1[1].split(' '); + if(list2[0].toInt()==0){ + ui->labelFeeMinimized->setText(list1[0] + ".00" + list2[1]); + }else{ + ui->labelFeeMinimized->setText(feeMinimized); + } + } } @@ -935,13 +972,53 @@ void SendCoinsDialog::coinControlUpdateLabels() // show coin control stats ui->labelCoinControlAutomaticallySelected->hide(); - ui->widgetCoinControl->show(); + ui->scrollAreaCoinControl->show(); } else { // hide coin control stats ui->labelCoinControlAutomaticallySelected->show(); - ui->widgetCoinControl->hide(); + ui->scrollAreaCoinControl->hide(); ui->labelCoinControlInsuffFunds->hide(); } } + +void SendCoinsDialog::on_lineConvertCurrency_textChanged(const QString &arg1) +{ + bool ok; + double dbal; + dbal = arg1.toDouble(&ok); + if(ok){ + QSettings settings; + double dval = (settings.value("PACvalue").toString()).toDouble(); + QString sconv = QString::number(dbal/dval, 'g', 17); + + QStringList list1 = sconv.split('.'); + int q_size = list1[0].size(); + for (int i = 3; i < q_size; i += 3) + list1[0].insert(q_size - i, ','); + if(list1.length() == 1){ + ui->labelConvertionUSD->setText(list1[0]); + }else{ + ui->labelConvertionUSD->setText(list1[0] + '.' + list1[1].left(8)); + } + }else{ + ui->labelConvertionUSD->setText("0.0"); + } +} + +/** Receive the signal to update the USD value when the USD-PAC value is updated */ +void SendCoinsDialog::receive_from_walletview() +{ + ui->labelAvailableUSD->setText("$ " + BitcoinUnits::pacToUsd(model->getBalance()) + " USD"); +} + +/** Copy the value of the convertion of USD to PAC to the clipboard */ +void SendCoinsDialog::on_copyPacs_clicked() +{ + QClipboard *clip = QApplication::clipboard(); + QString input = ui->labelConvertionUSD->text(); + input.replace( ",", " " ); + clip->setText(input); + QToolTip::showText(ui->copyPacs->mapToGlobal(QPoint(10,10)), "Copied PACs to clipboard!",ui->copyPacs); +} diff --git a/src/qt/sendcoinsdialog.h b/src/qt/sendcoinsdialog.h index 1d690aef1108..3de0da2e8673 100644 --- a/src/qt/sendcoinsdialog.h +++ b/src/qt/sendcoinsdialog.h @@ -61,11 +61,14 @@ public Q_SLOTS: Ui::SendCoinsDialog *ui; ClientModel *clientModel; WalletModel *model; + int colorCount; bool fNewRecipientAllowed; void send(QList recipients, QString strFee, QString strFunds); bool fFeeMinimized; const PlatformStyle *platformStyle; + uint64_t *bal; + // Process WalletModel::SendCoinsReturn and generate a pair consisting // of a message and message flags for use in Q_EMIT message(). // Additional parameter msgArg can be used via .arg(msgArg). @@ -97,6 +100,11 @@ private Q_SLOTS: void updateMinFeeLabel(); void updateSmartFeeLabel(); void updateGlobalFeeVariables(); + void receive_from_walletview(); + + void on_lineConvertCurrency_textChanged(const QString &arg1); + + void on_copyPacs_clicked(); Q_SIGNALS: // Fired when a message should be reported to the user diff --git a/src/qt/sendcoinsentry.cpp b/src/qt/sendcoinsentry.cpp index b13ffe00e347..31dcd8602d5f 100644 --- a/src/qt/sendcoinsentry.cpp +++ b/src/qt/sendcoinsentry.cpp @@ -34,6 +34,13 @@ SendCoinsEntry::SendCoinsEntry(const PlatformStyle *platformStyle, QWidget *pare QString theme = GUIUtil::getThemeName(); + // set the typography correctly + QFont selectedFont = GUIUtil::getCustomSelectedFont(); + QList widgets = this->findChildren(); + for (int i = 0; i < widgets.length(); i++){ + widgets.at(i)->setFont(selectedFont); + } + // These icons are needed on Mac also! ui->addressBookButton->setIcon(QIcon(":/icons/" + theme + "/address-book")); ui->pasteButton->setIcon(QIcon(":/icons/" + theme + "/editpaste")); diff --git a/src/qt/transactiontablemodel.cpp b/src/qt/transactiontablemodel.cpp index d4c3364fd9b1..468f27c09548 100644 --- a/src/qt/transactiontablemodel.cpp +++ b/src/qt/transactiontablemodel.cpp @@ -243,6 +243,7 @@ TransactionTableModel::TransactionTableModel(const PlatformStyle *platformStyle, fProcessingQueuedTransactions(false), platformStyle(platformStyle) { + theme = GUIUtil::getThemeName(); columns << QString() << QString() << tr("Date") << tr("Type") << tr("Address / Label") << BitcoinUnits::getAmountColumnTitle(walletModel->getOptionsModel()->getDisplayUnit()); priv->refreshWallet(); @@ -401,7 +402,6 @@ QString TransactionTableModel::formatTxType(const TransactionRecord *wtx) const QVariant TransactionTableModel::txAddressDecoration(const TransactionRecord *wtx) const { - QString theme = GUIUtil::getThemeName(); switch(wtx->type) { case TransactionRecord::Generated: @@ -486,7 +486,6 @@ QString TransactionTableModel::formatTxAmount(const TransactionRecord *wtx, bool QVariant TransactionTableModel::txStatusDecoration(const TransactionRecord *wtx) const { - QString theme = GUIUtil::getThemeName(); switch(wtx->status.status) { case TransactionStatus::OpenUntilBlock: @@ -520,13 +519,12 @@ QVariant TransactionTableModel::txStatusDecoration(const TransactionRecord *wtx) case TransactionStatus::NotAccepted: return QIcon(":/icons/" + theme + "/transaction_0"); default: - return COLOR_BLACK; + return COLOR_TEXT; } } QVariant TransactionTableModel::txWatchonlyDecoration(const TransactionRecord *wtx) const { - QString theme = GUIUtil::getThemeName(); if (wtx->involvesWatchAddress) return QIcon(":/icons/" + theme + "/eye"); else diff --git a/src/qt/transactiontablemodel.h b/src/qt/transactiontablemodel.h index 6932646e1e50..5196aad5daa8 100644 --- a/src/qt/transactiontablemodel.h +++ b/src/qt/transactiontablemodel.h @@ -92,6 +92,8 @@ class TransactionTableModel : public QAbstractTableModel void subscribeToCoreSignals(); void unsubscribeFromCoreSignals(); + QString theme; + QString lookupAddress(const std::string &address, bool tooltip) const; QVariant addressColor(const TransactionRecord *wtx) const; QString formatTxStatus(const TransactionRecord *wtx) const; diff --git a/src/qt/transactionview.cpp b/src/qt/transactionview.cpp index 61a4d4c97c44..036297f7a711 100644 --- a/src/qt/transactionview.cpp +++ b/src/qt/transactionview.cpp @@ -47,24 +47,25 @@ TransactionView::TransactionView(const PlatformStyle *platformStyle, QWidget *pa // Build filter row setContentsMargins(0,0,0,0); + QHBoxLayout *hlayout = new QHBoxLayout(); - hlayout->setContentsMargins(0,0,0,0); + hlayout->setContentsMargins(0,0,0,8); if (platformStyle->getUseExtraSpacing()) { hlayout->setSpacing(0); - hlayout->addSpacing(6); } else { hlayout->setSpacing(1); - hlayout->addSpacing(5); } QString theme = GUIUtil::getThemeName(); watchOnlyWidget = new QComboBox(this); - watchOnlyWidget->setFixedWidth(24); + watchOnlyWidget->setObjectName("watchOnlyWidget"); + watchOnlyWidget->setFixedWidth(34); watchOnlyWidget->addItem("", TransactionFilterProxy::WatchOnlyFilter_All); watchOnlyWidget->addItem(QIcon(":/icons/" + theme + "/eye_plus"), "", TransactionFilterProxy::WatchOnlyFilter_Yes); watchOnlyWidget->addItem(QIcon(":/icons/" + theme + "/eye_minus"), "", TransactionFilterProxy::WatchOnlyFilter_No); hlayout->addWidget(watchOnlyWidget); dateWidget = new QComboBox(this); + dateWidget->setObjectName("dateWidget"); if (platformStyle->getUseExtraSpacing()) { dateWidget->setFixedWidth(120); } else { @@ -81,6 +82,7 @@ TransactionView::TransactionView(const PlatformStyle *platformStyle, QWidget *pa hlayout->addWidget(dateWidget); typeWidget = new QComboBox(this); + typeWidget->setObjectName("typeWidget"); if (platformStyle->getUseExtraSpacing()) { typeWidget->setFixedWidth(TYPE_COLUMN_WIDTH); } else { @@ -122,7 +124,7 @@ TransactionView::TransactionView(const PlatformStyle *platformStyle, QWidget *pa amountWidget->setFixedWidth(125); } amountWidget->setValidator(new QDoubleValidator(0, 1e20, 8, this)); - amountWidget->setObjectName("amountWidget"); + amountWidget->setObjectName("tAmountWidget"); hlayout->addWidget(amountWidget); QVBoxLayout *vlayout = new QVBoxLayout(this); @@ -130,6 +132,7 @@ TransactionView::TransactionView(const PlatformStyle *platformStyle, QWidget *pa vlayout->setSpacing(0); QTableView *view = new QTableView(this); + view->setObjectName("transactionsTable"); vlayout->addLayout(hlayout); vlayout->addWidget(createDateRangeWidget()); vlayout->addWidget(view); @@ -137,12 +140,13 @@ TransactionView::TransactionView(const PlatformStyle *platformStyle, QWidget *pa int width = view->verticalScrollBar()->sizeHint().width(); // Cover scroll bar width with spacing if (platformStyle->getUseExtraSpacing()) { - hlayout->addSpacing(width+2); + hlayout->addSpacing(width-20); } else { hlayout->addSpacing(width); } // Always show scroll bar - view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); + view->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); + view->setTabKeyNavigation(false); view->setContextMenuPolicy(Qt::CustomContextMenu); @@ -175,6 +179,14 @@ TransactionView::TransactionView(const PlatformStyle *platformStyle, QWidget *pa mapperThirdPartyTxUrls = new QSignalMapper(this); + + // set the typography correctly + QFont selectedFont = GUIUtil::getCustomSelectedFont(); + QList widgets = this->findChildren(); + for (int i = 0; i < widgets.length(); i++){ + widgets.at(i)->setFont(selectedFont); + } + // Connect actions connect(mapperThirdPartyTxUrls, SIGNAL(mapped(QString)), this, SLOT(openThirdPartyTxUrl(QString))); @@ -215,7 +227,8 @@ void TransactionView::setModel(WalletModel *model) transactionView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); transactionView->setModel(transactionProxyModel); - transactionView->setAlternatingRowColors(true); + transactionView->setAlternatingRowColors(false); + transactionView->setShowGrid(false); transactionView->setSelectionBehavior(QAbstractItemView::SelectRows); transactionView->setSelectionMode(QAbstractItemView::ExtendedSelection); transactionView->setSortingEnabled(true); diff --git a/src/qt/utilitydialog.cpp b/src/qt/utilitydialog.cpp index 2fbc1ab94d77..639f513021a4 100644 --- a/src/qt/utilitydialog.cpp +++ b/src/qt/utilitydialog.cpp @@ -55,7 +55,7 @@ HelpMessageDialog::HelpMessageDialog(QWidget *parent, HelpMode helpMode) : // Make URLs clickable QRegExp uri("<(.*)>", Qt::CaseSensitive, QRegExp::RegExp2); uri.setMinimal(true); // use non-greedy matching - licenseInfoHTML.replace(uri, "\\1"); + licenseInfoHTML.replace(uri, "\\1"); // Replace newlines with HTML breaks licenseInfoHTML.replace("\n\n", "

"); @@ -158,8 +158,29 @@ This means those 1000 addresses last for about 100 mixing events. When 900 of th It can only do this, however, if you have automatic backups enabled.
\ Consequently, users who have backups disabled will also have PrivatePAC disabled.
\ ")); -//For more info see https://paccoinpay.atlassian.net/wiki/display/DOC/PrivateSend \ +//For more info see https://paccoinpay.atlassian.net/wiki/display/DOC/PrivateSend \ // ")); + ui->aboutMessage->setWordWrap(true); + ui->helpMessage->setVisible(false); + ui->aboutLogo->setVisible(false); + } else if (helpMode == ovhelp) { + setWindowTitle(tr("OverviewPAC information")); + + ui->aboutMessage->setTextFormat(Qt::RichText); + ui->scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); + ui->aboutMessage->setText(tr("\ +

PAC Overview

\ +PAC is a digital currency that enables anonymous, instant payments to anyone, anywhere in the world. \ +PAC uses peer-to-peer technology to operate with no central authority: managing transactions and issuing money are carried out collectively by the network. \ +PAC is the name of the open source software which enables the use of this currency.

\ +On the left side of this window you can watch your balance, the available balance is the balance you can spend and do use of while the pending balance \ +first need to be confirmed by the network, this means that it is yours but first to avoid security issues it is need to be confirmed, and at the bottom is the total \ +(the sum of the available and pending).

\ +On the right side you can see all of your transactions, the coins you send, receive or get rewarded, if you click on one of them it will redirect you to \ +see all of the information of the transaction.
\ +For more information see https://wallets.paccoin.net/.

\ +IMPORTANT: the convertion PAC to USD can have some fluctuation since the value is obtained from an external API (http://explorer.pachub.io/api/currency/USD) and the value is obtained when opening the wallet.")); + ui->aboutMessage->setWordWrap(true); ui->helpMessage->setVisible(false); ui->aboutLogo->setVisible(false); @@ -202,6 +223,7 @@ void HelpMessageDialog::on_okButton_accepted() ShutdownWindow::ShutdownWindow(QWidget *parent, Qt::WindowFlags f): QWidget(parent, f) { + setStyleSheet("background: rgb(50,50,50); color:white;"); QVBoxLayout *layout = new QVBoxLayout(); layout->addWidget(new QLabel( tr("$PAC Core is shutting down...") + "

" + diff --git a/src/qt/utilitydialog.h b/src/qt/utilitydialog.h index c3493ac28bb8..b2e7aca74ddb 100644 --- a/src/qt/utilitydialog.h +++ b/src/qt/utilitydialog.h @@ -24,7 +24,8 @@ class HelpMessageDialog : public QDialog enum HelpMode { about, cmdline, - pshelp + pshelp, + ovhelp }; explicit HelpMessageDialog(QWidget *parent, HelpMode helpMode); diff --git a/src/qt/walletframe.cpp b/src/qt/walletframe.cpp index 8b17fe26e8d2..5bb86f152280 100644 --- a/src/qt/walletframe.cpp +++ b/src/qt/walletframe.cpp @@ -59,6 +59,9 @@ bool WalletFrame::addWallet(const QString& name, WalletModel *walletModel) connect(walletView, SIGNAL(outOfSyncWarningClicked()), this, SLOT(outOfSyncWarningClicked())); + // Update the value of PAC on the different windows + connect(this,SIGNAL(transmit_to_walletview()), walletView, SLOT(receive_from_walletframe())); + return true; } @@ -122,6 +125,12 @@ void WalletFrame::gotoHistoryPage() i.value()->gotoHistoryPage(); } +void WalletFrame::gotoPrivatePage() +{ + QMap::const_iterator i; + for (i = mapWalletViews.constBegin(); i != mapWalletViews.constEnd(); ++i) + i.value()->gotoPrivatePage(); +} void WalletFrame::gotoMasternodePage() { QMap::const_iterator i; @@ -222,3 +231,9 @@ void WalletFrame::outOfSyncWarningClicked() { Q_EMIT requestedSyncWarningInfo(); } + +/** Signal to update the value of the PAC */ +void WalletFrame::receive_from_bitcoingui() +{ + Q_EMIT transmit_to_walletview(); +} \ No newline at end of file diff --git a/src/qt/walletframe.h b/src/qt/walletframe.h index 1a4e96b2491e..f022fe564778 100644 --- a/src/qt/walletframe.h +++ b/src/qt/walletframe.h @@ -41,6 +41,7 @@ class WalletFrame : public QFrame Q_SIGNALS: /** Notify that the user has requested more information about the out-of-sync warning */ void requestedSyncWarningInfo(); + void transmit_to_walletview(); private: QStackedWidget *walletStack; @@ -59,6 +60,8 @@ public Q_SLOTS: void gotoOverviewPage(); /** Switch to history (transactions) page */ void gotoHistoryPage(); + /** Switch to private section page */ + void gotoPrivatePage(); /** Switch to masternode page */ void gotoMasternodePage(); /** Switch to proposal page */ @@ -90,6 +93,8 @@ public Q_SLOTS: void usedReceivingAddresses(); /** Pass on signal over requested out-of-sync-warning information */ void outOfSyncWarningClicked(); + /** Receive the signal to refresh the PAC value */ + void receive_from_bitcoingui(); }; #endif // BITCOIN_QT_WALLETFRAME_H diff --git a/src/qt/walletview.cpp b/src/qt/walletview.cpp index 49ee9fd79461..223f14d0dab1 100644 --- a/src/qt/walletview.cpp +++ b/src/qt/walletview.cpp @@ -18,8 +18,11 @@ #include "signverifymessagedialog.h" #include "transactiontablemodel.h" #include "transactionview.h" +#include "walletframe.h" #include "walletmodel.h" +#include "privatepage.h" + #include "ui_interface.h" #include @@ -76,6 +79,11 @@ WalletView::WalletView(const PlatformStyle *platformStyle, QWidget *parent): usedSendingAddressesPage = new AddressBookPage(platformStyle, AddressBookPage::ForEditing, AddressBookPage::SendingTab, this); usedReceivingAddressesPage = new AddressBookPage(platformStyle, AddressBookPage::ForEditing, AddressBookPage::ReceivingTab, this); + overviewPage->setContentsMargins(30,0,30,10); + transactionsPage->setContentsMargins(30,0,30,10); + receiveCoinsPage->setContentsMargins(30,0,30,10); + sendCoinsPage->setContentsMargins(30,0,30,10); + addWidget(overviewPage); addWidget(transactionsPage); addWidget(receiveCoinsPage); @@ -84,11 +92,16 @@ WalletView::WalletView(const PlatformStyle *platformStyle, QWidget *parent): QSettings settings; if (settings.value("fShowMasternodesTab").toBool()) { masternodeListPage = new MasternodeList(platformStyle); + masternodeListPage->setContentsMargins(30,0,30,10); addWidget(masternodeListPage); } proposalList = new ProposalList(platformStyle); + privatePage = new PrivatePage(platformStyle); + proposalList->setContentsMargins(30,0,30,10); + privatePage->setContentsMargins(30,0,30,10); addWidget(proposalList); + addWidget(privatePage); // Clicking on a transaction on the overview pre-selects the transaction on the transaction history page connect(overviewPage, SIGNAL(transactionClicked(QModelIndex)), transactionView, SLOT(focusTransaction(QModelIndex))); @@ -108,6 +121,13 @@ WalletView::WalletView(const PlatformStyle *platformStyle, QWidget *parent): // Pass through messages from transactionView connect(transactionView, SIGNAL(message(QString,QString,unsigned int)), this, SIGNAL(message(QString,QString,unsigned int))); + + // Refresh the value of PAC on the overview + connect(this,SIGNAL(transmit_to_overview()), overviewPage, SLOT(receive_from_walletview())); + // Refresh the value of PAC on the sendview + connect(this,SIGNAL(transmit_to_sendview()), sendCoinsPage, SLOT(receive_from_walletview())); + // Refresh the value of PAC on the receiveview + connect(this,SIGNAL(transmit_to_receiveview()), receiveCoinsPage, SLOT(receive_from_walletview())); } WalletView::~WalletView() @@ -142,6 +162,7 @@ void WalletView::setClientModel(ClientModel *clientModel) overviewPage->setClientModel(clientModel); sendCoinsPage->setClientModel(clientModel); QSettings settings; + privatePage->setClientModel(clientModel); if (settings.value("fShowMasternodesTab").toBool()) { masternodeListPage->setClientModel(clientModel); } @@ -160,6 +181,7 @@ void WalletView::setWalletModel(WalletModel *walletModel) } receiveCoinsPage->setModel(walletModel); sendCoinsPage->setModel(walletModel); + privatePage->setModel(walletModel); usedReceivingAddressesPage->setModel(walletModel->getAddressTableModel()); usedSendingAddressesPage->setModel(walletModel->getAddressTableModel()); @@ -217,6 +239,11 @@ void WalletView::gotoProposalPage() setCurrentWidget(proposalList); } +void WalletView::gotoPrivatePage() +{ + setCurrentWidget(privatePage); +} + void WalletView::gotoHistoryPage() { setCurrentWidget(transactionsPage); @@ -394,3 +421,11 @@ void WalletView::trxAmount(QString amount) { transactionSum->setText(amount); } + +/** Signal to update the value of PAC on the different windows */ +void WalletView::receive_from_walletframe() +{ + Q_EMIT transmit_to_overview(); + Q_EMIT transmit_to_sendview(); + Q_EMIT transmit_to_receiveview(); +} diff --git a/src/qt/walletview.h b/src/qt/walletview.h index e3fa368b9906..cbabd5f7ee1f 100644 --- a/src/qt/walletview.h +++ b/src/qt/walletview.h @@ -8,6 +8,7 @@ #include "amount.h" #include "masternodelist.h" #include "proposallist.h" +#include "walletframe.h" #include @@ -21,6 +22,7 @@ class SendCoinsRecipient; class TransactionView; class WalletModel; class AddressBookPage; +class PrivatePage; QT_BEGIN_NAMESPACE class QLabel; @@ -71,6 +73,7 @@ class WalletView : public QStackedWidget TransactionView *transactionView; ProposalList *proposalList; + PrivatePage *privatePage; QProgressDialog *progressDialog; QLabel *transactionSum; @@ -89,12 +92,16 @@ public Q_SLOTS: void gotoReceiveCoinsPage(); /** Switch to send coins page */ void gotoSendCoinsPage(QString addr = ""); - + /** Switch to private page */ + void gotoPrivatePage(); /** Show Sign/Verify Message dialog and switch to sign message tab */ void gotoSignMessageTab(QString addr = ""); /** Show Sign/Verify Message dialog and switch to verify message tab */ void gotoVerifyMessageTab(QString addr = ""); + /** Gets the value of the PAC from walletframe */ + void receive_from_walletframe(); + /** Show incoming transaction notification for new transactions. The new items are those between start and end inclusive, under the given parent item. @@ -141,6 +148,12 @@ public Q_SLOTS: void incomingTransaction(const QString& date, int unit, const CAmount& amount, const QString& type, const QString& address, const QString& label); /** Notify that the out of sync warning icon has been pressed */ void outOfSyncWarningClicked(); + /** Refresh the value on the overview */ + void transmit_to_overview(); + /** Refresh the value on the sendview */ + void transmit_to_sendview(); + /** Refresh the value on the receiveview */ + void transmit_to_receiveview(); }; #endif // BITCOIN_QT_WALLETVIEW_H