diff --git a/CMakeLists.txt b/CMakeLists.txt index 37e235ca5..2bdb53e9f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -56,6 +56,7 @@ set(HEADERS src/core/config/usage.h src/core/Controller.h src/core/Miner.h + src/core/Taskbar.h src/net/interfaces/IJobResultListener.h src/net/JobResult.h src/net/JobResults.h @@ -104,6 +105,7 @@ set(SOURCES src/core/config/ConfigTransform.cpp src/core/Controller.cpp src/core/Miner.cpp + src/core/Taskbar.cpp src/net/JobResults.cpp src/net/Network.cpp src/net/strategies/DonateStrategy.cpp diff --git a/src/core/Miner.cpp b/src/core/Miner.cpp index 2b6c1dbee..8ffdc63b3 100644 --- a/src/core/Miner.cpp +++ b/src/core/Miner.cpp @@ -22,6 +22,7 @@ #include "core/Miner.h" +#include "core/Taskbar.h" #include "3rdparty/rapidjson/document.h" #include "backend/common/Hashrate.h" #include "backend/cpu/Cpu.h" @@ -348,6 +349,8 @@ public: String userJobId; Timer *timer = nullptr; uint64_t ticks = 0; + + Taskbar m_taskbar; }; @@ -475,6 +478,7 @@ void xmrig::Miner::execCommand(char command) void xmrig::Miner::pause() { d_ptr->active = false; + d_ptr->m_taskbar.setActive(false); Nonce::pause(true); Nonce::touch(); @@ -494,6 +498,7 @@ void xmrig::Miner::setEnabled(bool enabled) } d_ptr->enabled = enabled; + d_ptr->m_taskbar.setEnabled(enabled); if (enabled) { LOG_INFO("%s " GREEN_BOLD("resumed"), Tags::miner()); @@ -551,6 +556,7 @@ void xmrig::Miner::setJob(const Job &job, bool donate) mutex.unlock(); d_ptr->active = true; + d_ptr->m_taskbar.setActive(true); if (ready) { d_ptr->handleJobChange(); diff --git a/src/core/Taskbar.cpp b/src/core/Taskbar.cpp new file mode 100644 index 000000000..c0af8bfac --- /dev/null +++ b/src/core/Taskbar.cpp @@ -0,0 +1,126 @@ +/* XMRig + * Copyright (c) 2018-2021 SChernykh + * Copyright (c) 2016-2021 XMRig , + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "core/Taskbar.h" + +#ifdef _WIN32 + + +#include +#include + + +namespace xmrig { + + +struct TaskbarPrivate +{ + TaskbarPrivate() + { + HRESULT hr = CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + if (hr < 0) { + return; + } + + hr = CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&m_taskbar)); + if (hr < 0) { + return; + } + + hr = m_taskbar->HrInit(); + if (hr < 0) { + m_taskbar->Release(); + m_taskbar = nullptr; + return; + } + + m_consoleWnd = GetConsoleWindow(); + } + + ~TaskbarPrivate() + { + if (m_taskbar) { + m_taskbar->Release(); + } + CoUninitialize(); + } + + ITaskbarList3* m_taskbar = nullptr; + HWND m_consoleWnd = nullptr; +}; + + +Taskbar::Taskbar() : d_ptr(new TaskbarPrivate()) +{ +} + + +Taskbar::~Taskbar() +{ + delete d_ptr; +} + + +void Taskbar::setActive(bool active) +{ + m_active = active; + updateTaskbarColor(); +} + + +void Taskbar::setEnabled(bool enabled) +{ + m_enabled = enabled; + updateTaskbarColor(); +} + + +void Taskbar::updateTaskbarColor() +{ + if (d_ptr->m_taskbar) { + if (m_active) { + d_ptr->m_taskbar->SetProgressState(d_ptr->m_consoleWnd, m_enabled ? TBPF_NOPROGRESS : TBPF_PAUSED); + d_ptr->m_taskbar->SetProgressValue(d_ptr->m_consoleWnd, m_enabled ? 0 : 1, 1); + } + else { + d_ptr->m_taskbar->SetProgressState(d_ptr->m_consoleWnd, TBPF_ERROR); + d_ptr->m_taskbar->SetProgressValue(d_ptr->m_consoleWnd, 1, 1); + } + } +} + + +} // namespace xmrig + + +#else // _WIN32 + + +namespace xmrig { + + +Taskbar::Taskbar() {} +Taskbar::~Taskbar() {} +void Taskbar::setActive(bool) {} +void Taskbar::setEnabled(bool) {} + + +} // namespace xmrig + + +#endif // _WIN32 diff --git a/src/core/Taskbar.h b/src/core/Taskbar.h new file mode 100644 index 000000000..abb04fdea --- /dev/null +++ b/src/core/Taskbar.h @@ -0,0 +1,51 @@ +/* XMRig + * Copyright (c) 2018-2021 SChernykh + * Copyright (c) 2016-2021 XMRig , + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef XMRIG_TASKBAR_H +#define XMRIG_TASKBAR_H + + +namespace xmrig { + + +struct TaskbarPrivate; + + +class Taskbar +{ +public: + Taskbar(); + ~Taskbar(); + + void setActive(bool active); + void setEnabled(bool enabled); + +private: + bool m_active = false; + bool m_enabled = true; + + TaskbarPrivate* d_ptr = nullptr; + + void updateTaskbarColor(); +}; + + +} // namespace xmrig + + +#endif /* XMRIG_TASKBAR_H */