From 12e232ae627a966199d1e40fd6008fd522ef68c5 Mon Sep 17 00:00:00 2001 From: evoskuil Date: Thu, 29 Jan 2026 03:58:44 -0500 Subject: [PATCH 1/2] Capture windows shutdown signal. --- Makefile.am | 1 + builds/cmake/CMakeLists.txt | 1 + builds/msvc/vs2022/bs/bs.vcxproj | 1 + builds/msvc/vs2022/bs/bs.vcxproj.filters | 5 +- console/executor.cpp | 106 ++++++++++------ console/executor.hpp | 28 ++++- console/executor_runner.cpp | 9 +- console/executor_scans.cpp | 32 ++--- console/executor_test_reader.cpp | 30 ++--- console/executor_windows.cpp | 153 +++++++++++++++++++++++ console/localize.hpp | 2 + 11 files changed, 287 insertions(+), 81 deletions(-) create mode 100644 console/executor_windows.cpp diff --git a/Makefile.am b/Makefile.am index 83480f3f..54ef6e80 100644 --- a/Makefile.am +++ b/Makefile.am @@ -96,6 +96,7 @@ console_bs_SOURCES = \ console/executor_store.cpp \ console/executor_test_reader.cpp \ console/executor_test_writer.cpp \ + console/executor_windows.cpp \ console/localize.hpp \ console/main.cpp \ console/stack_trace.cpp \ diff --git a/builds/cmake/CMakeLists.txt b/builds/cmake/CMakeLists.txt index 878836d5..ef062c6b 100644 --- a/builds/cmake/CMakeLists.txt +++ b/builds/cmake/CMakeLists.txt @@ -334,6 +334,7 @@ if (with-console) "../../console/executor_store.cpp" "../../console/executor_test_reader.cpp" "../../console/executor_test_writer.cpp" + "../../console/executor_windows.cpp" "../../console/libbitcoin.ico" "../../console/localize.hpp" "../../console/main.cpp" diff --git a/builds/msvc/vs2022/bs/bs.vcxproj b/builds/msvc/vs2022/bs/bs.vcxproj index a1decddc..a33ff0aa 100644 --- a/builds/msvc/vs2022/bs/bs.vcxproj +++ b/builds/msvc/vs2022/bs/bs.vcxproj @@ -139,6 +139,7 @@ + diff --git a/builds/msvc/vs2022/bs/bs.vcxproj.filters b/builds/msvc/vs2022/bs/bs.vcxproj.filters index 8a10a8c0..ff4d012d 100644 --- a/builds/msvc/vs2022/bs/bs.vcxproj.filters +++ b/builds/msvc/vs2022/bs/bs.vcxproj.filters @@ -81,6 +81,9 @@ src + + src + src @@ -116,4 +119,4 @@ resource - \ No newline at end of file + diff --git a/console/executor.cpp b/console/executor.cpp index da034e98..7b27be3d 100644 --- a/console/executor.cpp +++ b/console/executor.cpp @@ -31,9 +31,11 @@ namespace server { using boost::format; using namespace std::placeholders; -std::atomic_bool executor::cancel_{}; +// static initializers. std::thread executor::stop_poller_{}; std::promise executor::stopping_{}; +std::atomic executor::initialized_{}; +std::atomic executor::signal_{ unsignalled }; executor::executor(parser& metadata, std::istream& input, std::ostream& output, std::ostream&) @@ -56,45 +58,35 @@ executor::executor(parser& metadata, std::istream& input, std::ostream& output, metadata.configured.log.verbose } { - initialize_stop(); -} + BC_ASSERT(!initialized_); + initialized_ = true; -// Stop signal. -// ---------------------------------------------------------------------------- + initialize_stop(); #if defined(HAVE_MSC) -BOOL WINAPI executor::win32_handler(DWORD signal) + create_hidden_window(); +#endif +} + +executor::~executor() { - ////if (auto* log = fopen("shutdown.log", "a")) - ////{ - //// fprintf(log, "Signal %lu at %llu\n", signal, GetTickCount64()); - //// fflush(log); - //// fclose(log); - ////} + initialized_ = false; - switch (signal) - { - case CTRL_C_EVENT: - case CTRL_BREAK_EVENT: - case CTRL_CLOSE_EVENT: - case CTRL_LOGOFF_EVENT: - case CTRL_SHUTDOWN_EVENT: - executor::handle_stop({}); - return TRUE; - default: - return FALSE; - } -} +#if defined(HAVE_MSC) + destroy_hidden_window(); #endif +} + +// Stop signal. +// ---------------------------------------------------------------------------- +// static -// Call only once. void executor::initialize_stop() { poll_for_stopping(); #if defined(HAVE_MSC) - // TODO: use RegisterServiceCtrlHandlerEx for service registration. - ::SetConsoleCtrlHandler(&executor::win32_handler, TRUE); + ::SetConsoleCtrlHandler(&executor::control_handler, TRUE); #else // Restart interrupted system calls. struct sigaction action @@ -123,17 +115,51 @@ void executor::initialize_stop() #endif } +// Handle the stop signal and invoke stop method (requries signal safe code). +void executor::handle_stop(int signal) +{ + stop(signal); +} + +// Manage race between console stop and server stop. +void executor::stop(int signal) +{ + ////if (auto* log = fopen("shutdown.log", "a")) + ////{ + //// fprintf(log, "stop %lu at %llu\n", signal, GetTickCount64()); + //// fflush(log); + //// fclose(log); + ////} + + // Implementation is limited to signal safe code. + static_assert(std::atomic::is_always_lock_free); + + // Capture first handled signal value. + auto unset = unsignalled; + signal_.compare_exchange_strong(unset, signal, std::memory_order_acq_rel); +} + +// Any thread can monitor this for stopping. +bool executor::canceled() +{ + return signal_.load(std::memory_order_acquire) != unsignalled; +} + +// Spinning must be used in signal handler, cannot wait on a promise. void executor::poll_for_stopping() { + using namespace std::this_thread; + stop_poller_ = std::thread([]() { - while (!cancel_.load(std::memory_order_acquire)) - std::this_thread::sleep_for(std::chrono::milliseconds(10)); + while (!canceled()) + sleep_for(std::chrono::milliseconds(10)); stopping_.set_value(true); }); } +// Blocks until stopping is signalled by poller. void executor::wait_for_stopping() { stopping_.get_future().wait(); @@ -141,16 +167,20 @@ void executor::wait_for_stopping() stop_poller_.join(); } -// Implementation is limited to signal safe code. -void executor::handle_stop(int) +// Suspend verbose logging and log the stop signal. +void executor::log_stopping() { - stop(); -} + const auto signal = signal_.load(); + if (signal == signal_none) + return; -// Manage the race between console stop and server stop. -void executor::stop() -{ - cancel_.store(true, std::memory_order_release); + // A high level of consolve logging can obscure and delay stop. + toggle_.at(network::levels::protocol) = false; + toggle_.at(network::levels::verbose) = false; + toggle_.at(network::levels::proxy) = false; + + logger(format(BS_NODE_INTERRUPTED) % signal); + logger(BS_NETWORK_STOPPING); } // Event handlers. diff --git a/console/executor.hpp b/console/executor.hpp index 3f739247..f0180b53 100644 --- a/console/executor.hpp +++ b/console/executor.hpp @@ -28,12 +28,10 @@ #include #include -// This class is just an ad-hoc user interface wrapper on the node. -// It will be factored and cleaned up for final release. - namespace libbitcoin { namespace server { +// This class is just an ad-hoc user interface wrapper on the node. class executor { public: @@ -43,21 +41,38 @@ class executor executor(parser& metadata, std::istream&, std::ostream& output, std::ostream& error); + // Clean up. + ~executor(); + // Called from main. bool dispatch(); private: + static constexpr int unsignalled{ -1 }; + static constexpr int signal_none{ -2 }; + // Executor (static). static void initialize_stop(); static void poll_for_stopping(); static void wait_for_stopping(); static void handle_stop(int code); - static void stop(); + static void stop(int signal=signal_none); + static bool canceled(); + #if defined(HAVE_MSC) - static BOOL WINAPI win32_handler(DWORD signal); + static BOOL WINAPI control_handler(DWORD signal); + static LRESULT CALLBACK window_proc(HWND handle, UINT message, + WPARAM wparam, LPARAM lparam); + + void create_hidden_window(); + void destroy_hidden_window(); + + HWND window_{}; + std::thread thread_{}; #endif // Executor. + void log_stopping(); void handle_started(const system::code& ec); void handle_subscribed(const system::code& ec, size_t key); void handle_running(const system::code& ec); @@ -155,8 +170,9 @@ class executor static const std::unordered_map fired_; // Shutdown. - static std::atomic_bool cancel_; static std::thread stop_poller_; + static std::atomic signal_; + static std::atomic initialized_; static std::promise stopping_; std::promise log_suspended_{}; diff --git a/console/executor_runner.cpp b/console/executor_runner.cpp index 7f6cca0d..09ff8251 100644 --- a/console/executor_runner.cpp +++ b/console/executor_runner.cpp @@ -36,7 +36,7 @@ void executor::stopper(const std::string& message) capture_.stop(); // Stop log, causing final message to be buffered by handler. - log_.stop(message, network::levels::application); + log_.stop(message,levels::application); // Suspend process termination until final message is buffered. log_suspended_.get_future().wait(); @@ -46,7 +46,7 @@ void executor::subscribe_connect() { node_->subscribe_connect ( - [&](const code&, const network::channel::ptr&) + [&](const code&, const channel::ptr&) { log_.write(levels::verbose) << "{in:" << node_->inbound_channel_count() << "}" @@ -162,13 +162,12 @@ bool executor::do_run() logger(BS_NETWORK_STARTING); node_->start(std::bind(&executor::handle_started, this, _1)); - // Wait on signal to stop node (). + // Wait on signal to stop node (, etc). wait_for_stopping(); - toggle_.at(levels::protocol) = false; - logger(BS_NETWORK_STOPPING); // Stop network (if not already stopped by self). // Blocks on join of server/node/network threadpool. + log_stopping(); node_->close(); // Sizes and records change, buckets don't. diff --git a/console/executor_scans.cpp b/console/executor_scans.cpp index 22149a92..edf634b1 100644 --- a/console/executor_scans.cpp +++ b/console/executor_scans.cpp @@ -45,7 +45,7 @@ void executor::scan_flags() const logger(BS_OPERATION_INTERRUPT); - for (size_t height{}; !cancel_ && height <= top; ++height) + for (size_t height{}; !canceled() && height <= top; ++height) { database::context ctx{}; const auto link = query_.to_candidate(height); @@ -65,7 +65,7 @@ void executor::scan_flags() const } } - if (cancel_) + if (canceled()) logger(BS_OPERATION_CANCELED); const auto span = duration_cast(logger::now() - start); @@ -86,7 +86,7 @@ void executor::scan_slabs() const // Tx (record) links are sequential and so iterable, however the terminal // condition assumes all tx entries fully written (ok for stopped node). // A running node cannot safely iterate over record links, but stopped can. - for (auto puts = query_.put_counts(link); to_bool(puts.first) && !cancel_; + for (auto puts = query_.put_counts(link); to_bool(puts.first) && !canceled(); puts = query_.put_counts(++link)) { inputs += puts.first; @@ -95,7 +95,7 @@ void executor::scan_slabs() const logger(format(BS_MEASURE_SLABS_ROW) % link % inputs % outputs); } - if (cancel_) + if (canceled()) logger(BS_OPERATION_CANCELED); const auto span = duration_cast(logger::now() - start); @@ -114,7 +114,7 @@ void executor::scan_buckets() const auto filled = zero; auto bucket = max_size_t; auto start = logger::now(); - while (!cancel_ && (++bucket < query_.header_buckets())) + while (!canceled() && (++bucket < query_.header_buckets())) { const auto top = query_.top_header(bucket); if (!top.is_terminal()) @@ -125,7 +125,7 @@ void executor::scan_buckets() const duration_cast(logger::now() - start).count()); } - if (cancel_) + if (canceled()) logger(BS_OPERATION_CANCELED); auto span = duration_cast(logger::now() - start); @@ -137,7 +137,7 @@ void executor::scan_buckets() const filled = zero; bucket = max_size_t; start = logger::now(); - while (!cancel_ && (++bucket < query_.tx_buckets())) + while (!canceled() && (++bucket < query_.tx_buckets())) { const auto top = query_.top_tx(bucket); if (!top.is_terminal()) @@ -148,7 +148,7 @@ void executor::scan_buckets() const duration_cast(logger::now() - start).count()); } - if (cancel_) + if (canceled()) logger(BS_OPERATION_CANCELED); span = duration_cast(logger::now() - start); @@ -160,7 +160,7 @@ void executor::scan_buckets() const filled = zero; bucket = max_size_t; start = logger::now(); - while (!cancel_ && (++bucket < query_.point_buckets())) + while (!canceled() && (++bucket < query_.point_buckets())) { const auto top = query_.top_point(bucket); if (!top.is_terminal()) @@ -171,7 +171,7 @@ void executor::scan_buckets() const duration_cast(logger::now() - start).count()); } - if (cancel_) + if (canceled()) logger(BS_OPERATION_CANCELED); span = duration_cast(logger::now() - start); @@ -219,7 +219,7 @@ void executor::scan_collisions() const const auto header_records = query_.header_records(); std_vector header(header_buckets, empty); std_vector txs(header_buckets, empty); - while (!cancel_ && (++index < header_records)) + while (!canceled() && (++index < header_records)) { const header_link link{ possible_narrow_cast(index) }; const auto key = query_.get_header_key(link.value); @@ -233,7 +233,7 @@ void executor::scan_collisions() const duration_cast(logger::now() - start).count()); } - if (cancel_) + if (canceled()) logger(BS_OPERATION_CANCELED); // ........................................................................ @@ -275,7 +275,7 @@ void executor::scan_collisions() const const auto tx_records = query_.tx_records(); std_vector tx(tx_buckets, empty); std_vector strong_tx(tx_buckets, empty); - while (!cancel_ && (++index < tx_records)) + while (!canceled() && (++index < tx_records)) { const tx_link link{ possible_narrow_cast(index) }; const auto key = query_.get_tx_key(link.value); @@ -288,7 +288,7 @@ void executor::scan_collisions() const duration_cast(logger::now() - start).count()); } - if (cancel_) + if (canceled()) logger(BS_OPERATION_CANCELED); // ........................................................................ @@ -352,7 +352,7 @@ void executor::scan_collisions() const size_t window{}; const auto top = query_.get_top_associated(); - for (index = zero; index <= top && !cancel_; ++index) + for (index = zero; index <= top && !canceled(); ++index) { ++coinbases; const auto link = query_.to_candidate(index); @@ -404,7 +404,7 @@ void executor::scan_collisions() const } } - if (cancel_) + if (canceled()) logger(BS_OPERATION_CANCELED); // ........................................................................ diff --git a/console/executor_test_reader.cpp b/console/executor_test_reader.cpp index e685368d..81e16dc2 100644 --- a/console/executor_test_reader.cpp +++ b/console/executor_test_reader.cpp @@ -36,7 +36,7 @@ void executor::read_test(const hash_digest&) const const auto concurrency = metadata_.configured.node.maximum_concurrency_(); size_t size{}; - for (auto height = zero; !cancel_ && height <= top; ++height) + for (auto height = zero; !canceled() && height <= top; ++height) { const auto link = query_.to_candidate(height); if (link.is_terminal()) @@ -89,7 +89,7 @@ void executor::read_test(const hash_digest&) const logger(format("Getting first [%1%] output address hashes.") % target_count); auto start = fine_clock::now(); - while (!cancel_ && keys.size() < target_count) + while (!canceled() && keys.size() < target_count) { const auto outputs = query_.get_outputs(tx++); if (is_null(outputs)) @@ -101,7 +101,7 @@ void executor::read_test(const hash_digest&) const for (const auto& put: *outputs) { keys.emplace(put->script().hash()); - if (cancel_ || keys.size() == target_count) + if (canceled() || keys.size() == target_count) break; } } @@ -138,7 +138,7 @@ void executor::read_test(const hash_digest&) const start = fine_clock::now(); for (auto& key: keys) { - if (cancel_) + if (canceled()) return; ////size_t found{}; @@ -151,7 +151,7 @@ void executor::read_test(const hash_digest&) const do { - if (cancel_) + if (canceled()) break; table::address::record address{}; @@ -276,7 +276,7 @@ void executor::read_test(const hash_digest&) const for (const auto& row: outs) { - if (cancel_) + if (canceled()) break; const auto output = !row.output ? "{error}" : @@ -322,7 +322,7 @@ void executor::read_test(const hash_digest&) const uint32_t block{ one }; logger("Find strong blocks."); - while (!cancel_ && (block < count) && query_.is_strong_block(block)) + while (!canceled() && (block < count) && query_.is_strong_block(block)) { ++block; } @@ -334,7 +334,7 @@ void executor::read_test(const hash_digest&) const uint32_t milestone{ 295'001 }; logger("Find milestone blocks."); - while (!cancel_ && (milestone < count) && query_.is_milestone(milestone)) + while (!canceled() && (milestone < count) && query_.is_milestone(milestone)) { ++milestone; } @@ -346,7 +346,7 @@ void executor::read_test(const hash_digest&) const logger("Find strong txs."); count = query_.tx_records(); - while (!cancel_ && (tx < count) && query_.is_strong_tx(tx)) + while (!canceled() && (tx < count) && query_.is_strong_tx(tx)) { ++tx; } @@ -366,7 +366,7 @@ void executor::read_test(const hash_digest&) const size_t total{}; logger("Get all coinbases."); - while (!cancel_ && (block <= top)) + while (!canceled() && (block <= top)) { const auto count = query_.get_tx_count(query_.to_candidate(block++)); if (is_zero(count)) @@ -422,7 +422,7 @@ void executor::read_test(const hash_digest&) const database::tx_link spender_link{}; const auto hash_spender = system::base16_hash("1ff970ec310c000595929bd290bbc8f4603ee18b2b4e3239dfb072aaca012b28"); - for (auto position = zero; !cancel_ && position < txs.size(); ++position) + for (auto position = zero; !canceled() && position < txs.size(); ++position) { const auto temp = txs.at(position); if (query_.get_tx_key(temp) == hash_spender) @@ -466,7 +466,7 @@ void executor::read_test(const hash_digest&) const database::tx_link spent_link{}; const auto hash_spent = system::base16_hash("85f65b57b88b74fd945a66a6ba392a5f3c8a7c0f78c8397228dece885d788841"); - for (auto position = zero; !cancel_ && position < txs.size(); ++position) + for (auto position = zero; !canceled() && position < txs.size(); ++position) { const auto temp = txs.at(position); if (query_.get_tx_key(temp) == hash_spent) @@ -640,7 +640,7 @@ void executor::read_test(const hash_digest&) const auto tx = 664'400'000_size; // Read all data except genesis (ie. for validation). - while (!cancel_ && (++tx < query_.tx_records())) + while (!canceled() && (++tx < query_.tx_records())) { const tx_link link{ system::possible_narrow_cast(tx) }; @@ -681,7 +681,7 @@ void executor::read_test(const hash_digest&) const duration_cast(fine_clock::now() - start).count()); } - if (cancel_) + if (canceled()) logger(BS_OPERATION_CANCELED); const auto span = duration_cast(fine_clock::now() - start); @@ -698,7 +698,7 @@ void executor::read_test(const hash_digest&) const std::getline(input_, line); const auto start = fine_clock::now(); - for (size_t height = 492'224; (height <= 492'224) && !cancel_; ++height) + for (size_t height = 492'224; (height <= 492'224) && !canceled(); ++height) { // 2s 0s const auto link = query_.to_header(hash492224); diff --git a/console/executor_windows.cpp b/console/executor_windows.cpp new file mode 100644 index 00000000..7aa4603c --- /dev/null +++ b/console/executor_windows.cpp @@ -0,0 +1,153 @@ +/** + * Copyright (c) 2011-2025 libbitcoin developers (see AUTHORS) + * + * This file is part of libbitcoin. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +#include "executor.hpp" + +namespace libbitcoin { +namespace server { + +#if defined(HAVE_MSC) + +// TODO: use RegisterServiceCtrlHandlerEx for service registration. + +using namespace system; + +constexpr auto window_name = L"HiddenShutdownWindow"; +constexpr auto window_text = L"Flushing tables..."; +constexpr auto window_title = L"Libbitcoin Server"; + +// static +BOOL WINAPI executor::control_handler(DWORD signal) +{ + switch (signal) + { + // Keyboard events. These prevent exit altogether when TRUE returned. + // handle_stop(signal) therefore shuts down gracefully/completely. + case CTRL_C_EVENT: + case CTRL_BREAK_EVENT: + + // A signal that the system sends to all processes attached to a + // console when the user closes the console (by clicking Close on the + // console window's window menu). Returning TRUE here does not + // materially delay exit, so aside from capture this is a noop. + case CTRL_CLOSE_EVENT: + executor::handle_stop(possible_narrow_sign_cast(signal)); + return TRUE; + + ////// Only services receive this (*any* user is logging off). + ////case CTRL_LOGOFF_EVENT: + ////// Only services receive this (all users already logged off). + ////case CTRL_SHUTDOWN_EVENT: + default: + return FALSE; + } +} + +// static +LRESULT CALLBACK executor::window_proc(HWND handle, UINT message, WPARAM wparam, + LPARAM lparam) +{ + switch (message) + { + // Reject session close until process completion, initiate stop, and + // provide reason text that the operating system may show to the user. + case WM_QUERYENDSESSION: + { + ::ShutdownBlockReasonCreate(handle, window_text); + stop(possible_narrow_sign_cast(message)); + return FALSE; + } + default: + { + return ::DefWindowProcW(handle, message, wparam, lparam); + } + } +} + +void executor::create_hidden_window() +{ + thread_ = std::thread([this]() + { + const WNDCLASSW window_class + { + .lpfnWndProc = &executor::window_proc, + .hInstance = ::GetModuleHandleW(NULL), + .lpszClassName = window_name + }; + + // fault + if (is_zero(::RegisterClassW(&window_class))) + return; + + // Window must be visible (?) to capture shutdown. + window_ = ::CreateWindowExW + ( + 0u, + window_name, + window_title, + WS_VISIBLE, + CW_USEDEFAULT, + CW_USEDEFAULT, + 400, + 300, + NULL, + NULL, + ::GetModuleHandleW(NULL), + NULL); + + // fault + if (is_null(window_)) + return; + + MSG message{}; + BOOL result{}; + while (!is_zero(result = ::GetMessageW(&message, NULL, 0, 0))) + { + // fault + if (is_negative(result)) + return; + + ::TranslateMessage(&message); + ::DispatchMessageW(&message); + } + }); +} + +void executor::destroy_hidden_window() +{ + if (!is_null(window_)) + ::PostMessageW(window_, WM_QUIT, 0, 0); + + if (thread_.joinable()) + thread_.join(); + + if (!is_null(window_)) + { + ::DestroyWindow(window_); + window_ = nullptr; + } + + const HWND handle = ::GetConsoleWindow(); + if (!is_null(handle)) + ::ShutdownBlockReasonDestroy(handle); +} + +#endif // HAVE_MSC + +} // namespace server +} // namespace libbitcoin diff --git a/console/localize.hpp b/console/localize.hpp index 914fc738..09f25a87 100644 --- a/console/localize.hpp +++ b/console/localize.hpp @@ -180,6 +180,8 @@ namespace server { "Node failed to start with error '%1%'." #define BS_NODE_UNAVAILABLE \ "Command not available until node started." +#define BS_NODE_INTERRUPTED \ + "Node was interrupted by signal (%1%)." #define BS_NODE_BACKUP_STARTED \ "Snapshot is started." From 3b964b118395faf7b92f4774306b570d7ed191bb Mon Sep 17 00:00:00 2001 From: evoskuil Date: Thu, 29 Jan 2026 16:37:07 -0500 Subject: [PATCH 2/2] Add icon to Windows build, guard focus stealing. --- builds/msvc/libbitcoin.ico | Bin 0 -> 115362 bytes builds/msvc/resource.h | Bin 814 -> 904 bytes builds/msvc/resource.rc | Bin 4372 -> 5140 bytes console/executor_windows.cpp | 34 +++++++++++++++++++--------------- console/libbitcoin.ico | Bin 370070 -> 0 bytes 5 files changed, 19 insertions(+), 15 deletions(-) create mode 100644 builds/msvc/libbitcoin.ico delete mode 100644 console/libbitcoin.ico diff --git a/builds/msvc/libbitcoin.ico b/builds/msvc/libbitcoin.ico new file mode 100644 index 0000000000000000000000000000000000000000..a15428a0e9c89cb2b49e5c8731695f064d1af2d4 GIT binary patch literal 115362 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 K=CFeX|NMU$*{4td literal 0 HcmV?d00001 diff --git a/builds/msvc/resource.h b/builds/msvc/resource.h index b13f4e281327eeff76f1eae3fbc1e245e813d7f1..44ace40a3c4ff990a9304bb878bbb4ee86a77c21 100644 GIT binary patch delta 68 zcmZ3-*1x~rMG5480i`SKoo@cs>adH?U9$D&3dIu`g! zku<{Y-C`qpKFZy%K5FOK-3j;`vr`E%;OtxWe8N}6VVAdn%EVrkL_w0l)T8&;H#uzG zA@Rg6h^m08F8Jw#t}|915?w7G$^FdZHgfim@s=1K!qtZVm0z{RXq(YKeZ$9T90_y{ zWH-U;&-NX%yU?975_r}rhRg<3hX{}@nx%LU~qk1?TM?FgThQ#wC? zitP=bDMam-PkH9Ow%RiLYX5@A#HGBl%Nk`FzhcFFQ?YCE)-@3wa(}AjCXL?gsL{6T z9Qb^E2hx;d!lN8fmT!vD7WZhsvPxDPX{hhm>+IJFpJ4Hn{fOhyk^$%&LQ@ClU4I6* z`IhAu;7r`vnK&+P2SpQH*VkyA9fSMYss-9B4JTS z^pEz29c+1f6qRY#PIE%eN3H?dE|-3?#&jO*;E_!IKh zZn0xdr8)I>m9JecJ$m3Anb}Gq^$AgzBZ$IN_MaTn{$9(1KKk&Eek#%o}>OgCbJ#WY+s#s2lsgc)Z3U7m` zR!y;uUY(^LidNYhcS~Q{DA4{?S?MEf8~InrpMul{u`@4tv&`D>eID4w$N9B(kBs!B zjuBlP$zyYXw`MEf?Sl0@B6~;^8WVOzHE0$q%Df>H2%kq(63TKR3kH2tZPPc+t7T8B z{d$ku#om!Km2ZkCru0r{ov(g$j}v;Pd@0Z9&fVl3a$r?)yJF8c?AwEGP6eVy5y>;SCx}<6i@kr{JN4NS<%h@OT zaHo{UO@I2Iah|k&B^qO}tZ$OLMOQXgHdbMsDple2sxL!eb!lP1x%Ojo&Gz5iqV_8i zv)ah|YzvjnOLydA&6<_BU+)oXvH!RKmgo-g^1mg~m;2?1tTxhcbG%PLv9MhHZ=|^I GlJqws*k*zN delta 635 zcmZ`%J4*vW5S}~pxZBIcn8Qdg=5dOM;3F!6orZ)E3oF4UYGXt}B0j)Ye}G{8Y!og0 z4;F%g3Kkaj*7*UJf`x^1k4<7B%g%f|JNxm?&RmRK*k_wTK@&95*d0?uru_ zEpaUCtj0;ws?sFc94K+P=%!CO>HNHvj+M{?)NovHW#J)|$#rB%LMFATO8dO)WJ3vC z9dABj1DFqIyI7J_j$doH)))4rVp^L+T^q%fHi>uk-&zU@JDo^ k#Mb?GJHOfNneJ%*sZxe&CHUugx}1)>!}Dep1I{q~0-E}PB>(^b diff --git a/console/executor_windows.cpp b/console/executor_windows.cpp index 7aa4603c..e61fd2d5 100644 --- a/console/executor_windows.cpp +++ b/console/executor_windows.cpp @@ -59,8 +59,8 @@ BOOL WINAPI executor::control_handler(DWORD signal) } // static -LRESULT CALLBACK executor::window_proc(HWND handle, UINT message, WPARAM wparam, - LPARAM lparam) +LRESULT CALLBACK executor::window_proc(HWND handle, UINT message, + WPARAM wparam, LPARAM lparam) { switch (message) { @@ -69,7 +69,7 @@ LRESULT CALLBACK executor::window_proc(HWND handle, UINT message, WPARAM wparam, case WM_QUERYENDSESSION: { ::ShutdownBlockReasonCreate(handle, window_text); - stop(possible_narrow_sign_cast(message)); + executor::handle_stop(possible_narrow_sign_cast(message)); return FALSE; } default: @@ -83,28 +83,32 @@ void executor::create_hidden_window() { thread_ = std::thread([this]() { - const WNDCLASSW window_class + const auto instance = ::GetModuleHandleW(NULL); + const WNDCLASSEXW window_class { + .cbSize = sizeof(WNDCLASSEXW), + .style = CS_HREDRAW | CS_VREDRAW, .lpfnWndProc = &executor::window_proc, - .hInstance = ::GetModuleHandleW(NULL), - .lpszClassName = window_name + .hInstance = instance, + .hIcon = ::LoadIconW(instance, MAKEINTRESOURCEW(101)), + .lpszClassName = window_name, + .hIconSm = ::LoadIconW(instance, MAKEINTRESOURCEW(101)) }; // fault - if (is_zero(::RegisterClassW(&window_class))) + if (is_zero(::RegisterClassExW(&window_class))) return; - // Window must be visible (?) to capture shutdown. + // Zero sizing results in title bar only. + // WS_EX_NOACTIVATE: prevents focus-stealing. + // WS_VISIBLE: required to capture WM_QUERYENDSESSION. window_ = ::CreateWindowExW ( - 0u, + WS_EX_NOACTIVATE, window_name, window_title, WS_VISIBLE, - CW_USEDEFAULT, - CW_USEDEFAULT, - 400, - 300, + 0, 0, 0, 0, NULL, NULL, ::GetModuleHandleW(NULL), @@ -139,10 +143,10 @@ void executor::destroy_hidden_window() if (!is_null(window_)) { ::DestroyWindow(window_); - window_ = nullptr; + window_ = NULL; } - const HWND handle = ::GetConsoleWindow(); + const auto handle = ::GetConsoleWindow(); if (!is_null(handle)) ::ShutdownBlockReasonDestroy(handle); } diff --git a/console/libbitcoin.ico b/console/libbitcoin.ico deleted file mode 100644 index 79464a847da0b8a53490800a0c3cfde685500e28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 370070 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 RU@c%RU@c%RFy&j|{|9kI0dfEU