7 Commits

5 changed files with 81 additions and 19 deletions

View File

@@ -5,8 +5,8 @@
#include <cmath> #include <cmath>
#include <QCloseEvent>
#include <QGroupBox> #include <QGroupBox>
#include <QSlider>
#include <QtDebug> #include <QtDebug>
#include <QtGlobal> #include <QtGlobal>
@@ -20,10 +20,10 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent)
qDebug(ltr("Creating main window")); qDebug(ltr("Creating main window"));
m_ui.setupUi(this); m_ui.setupUi(this);
auto slider = m_ui.centralWidget->findChild<QGroupBox*>("groupBox")->findChild<QSlider*>("horizontalSlider"); m_manualBrightnessSlider = m_ui.centralWidget->findChild<QGroupBox*>("groupBox")->findChild<QSlider*>("horizontalSlider");
if(slider) { if(m_manualBrightnessSlider) {
connect(slider, &QSlider::valueChanged, [this](int value) { connect(m_manualBrightnessSlider, &QSlider::valueChanged, [this](int value) {
const auto mappedBrightness = utils::map(value, 0, 100, 0.f, 1.f); const auto mappedBrightness = utils::map(value, 0, 100, 0.f, 1.f);
const auto newBrightness = std::clamp(mappedBrightness, 0.f, 1.f); const auto newBrightness = std::clamp(mappedBrightness, 0.f, 1.f);
qDebug(ltr("Overriding brightness with %1").arg(newBrightness)); qDebug(ltr("Overriding brightness with %1").arg(newBrightness));
@@ -52,7 +52,7 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent)
m_visibility = !m_visibility; m_visibility = !m_visibility;
}); });
m_trayIconMenu->addSeparator(); m_trayIconMenu->addSeparator();
m_trayIconMenu->addAction(tr("Quit"), this, &QWidget::close); m_trayIconMenu->addAction(tr("Quit"), this, &QCoreApplication::quit);
qDebug(ltr("Tray icon context menu initialized")); qDebug(ltr("Tray icon context menu initialized"));
@@ -60,13 +60,19 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent)
m_trayIcon->setIcon(*m_errorIcon); m_trayIcon->setIcon(*m_errorIcon);
m_trayIcon->setContextMenu(m_trayIconMenu); m_trayIcon->setContextMenu(m_trayIconMenu);
m_trayIcon->show(); m_trayIcon->show();
m_trayIcon->setToolTip(tr("AdaptiveBrightness"));
connect(m_trayIcon, &QSystemTrayIcon::activated, this, &MainWindow::trayIconClicked);
qDebug(ltr("Tray icon initialized")); qDebug(ltr("Tray icon initialized"));
} }
m_timer = new QTimer(this); m_timerThread = new QThread(this);
connect(m_timer, &QTimer::timeout, this, &MainWindow::updateState); m_timer = new QTimer(nullptr);
m_timer->start(1000); m_timer->setInterval(1000);
m_timer->moveToThread(m_timerThread);
m_timerThread->connect(m_timer, &QTimer::timeout, this, &MainWindow::updateState, Qt::DirectConnection);
m_timer->connect(m_timerThread, SIGNAL(started()), SLOT(start()));
m_timerThread->start();
qDebug(ltr("Tray icon update timer started")); qDebug(ltr("Tray icon update timer started"));
@@ -77,6 +83,17 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent)
MainWindow::~MainWindow() MainWindow::~MainWindow()
{ {
qDebug(ltr("Destroying main window")); qDebug(ltr("Destroying main window"));
m_timerThread->quit();
if(!m_timerThread->wait()) {
qCritical(ltr("Timer thread did not terminate cleanly"));
}
}
void MainWindow::closeEvent(QCloseEvent* event)
{
m_showHideAction->activate(QAction::Trigger);
event->ignore();
} }
void MainWindow::loadIcons() void MainWindow::loadIcons()
@@ -179,4 +196,19 @@ void MainWindow::updateState()
else if(m_trayIcon) { else if(m_trayIcon) {
m_trayIcon->setIcon(*m_errorIcon); m_trayIcon->setIcon(*m_errorIcon);
} }
if(m_trayIcon) {
m_trayIcon->setToolTip(tr("AdaptiveBrightness - %1%").arg(m_brightness * 100, 0, 'f', 0));
}
if(m_manualBrightnessSlider) {
m_manualBrightnessSlider->setValue(utils::map(m_brightness, 0.f, 1.f, 0, 100));
}
}
void MainWindow::trayIconClicked(QSystemTrayIcon::ActivationReason reason)
{
if(reason == QSystemTrayIcon::ActivationReason::Trigger) {
m_showHideAction->trigger();
}
} }

View File

@@ -8,7 +8,9 @@
#include <QIcon> #include <QIcon>
#include <QMainWindow> #include <QMainWindow>
#include <QMenu> #include <QMenu>
#include <QSlider>
#include <QSystemTrayIcon> #include <QSystemTrayIcon>
#include <QThread>
#include <QTimer> #include <QTimer>
#include "monitor.hpp" #include "monitor.hpp"
@@ -24,10 +26,14 @@ class MainWindow : public QMainWindow {
~MainWindow(); ~MainWindow();
private: private:
void closeEvent(QCloseEvent* event) override;
void loadIcons(); void loadIcons();
void updateState(); void updateState();
void trayIconClicked(QSystemTrayIcon::ActivationReason reason);
Ui::AdaptiveBrightnessClass m_ui; Ui::AdaptiveBrightnessClass m_ui;
std::array<std::unique_ptr<QIcon>, 9> m_noSensorStateIcons; std::array<std::unique_ptr<QIcon>, 9> m_noSensorStateIcons;
@@ -39,8 +45,11 @@ class MainWindow : public QMainWindow {
QMenu* m_trayIconMenu = nullptr; QMenu* m_trayIconMenu = nullptr;
QSystemTrayIcon* m_trayIcon = nullptr; QSystemTrayIcon* m_trayIcon = nullptr;
QThread* m_timerThread = nullptr;
QTimer* m_timer = nullptr; QTimer* m_timer = nullptr;
QSlider* m_manualBrightnessSlider = nullptr;
float m_brightness = 0.5f; float m_brightness = 0.5f;
std::vector<Sensor> m_sensors; std::vector<Sensor> m_sensors;

View File

@@ -19,6 +19,8 @@ extern BOOL enumMonitorsCallback(HMONITOR, HDC, LPRECT, LPARAM);
class Monitor { class Monitor {
public: public:
Monitor() = delete; Monitor() = delete;
Monitor(const Monitor&) = delete;
Monitor(Monitor&& other) noexcept;
~Monitor(); ~Monitor();
bool setBrightness(float percentage); bool setBrightness(float percentage);
@@ -36,8 +38,8 @@ class Monitor {
friend BOOL detail::enumMonitorsCallback(HMONITOR, HDC, LPRECT, LPARAM); friend BOOL detail::enumMonitorsCallback(HMONITOR, HDC, LPRECT, LPARAM);
const HMONITOR m_hMonitor; HMONITOR m_hMonitor;
const PhysicalMonitor m_physicalMonitor; PhysicalMonitor m_physicalMonitor;
std::optional<std::pair<DWORD, DWORD>> m_brightnessRange; std::optional<std::pair<DWORD, DWORD>> m_brightnessRange;
bool m_errorOccurred = false; bool m_errorOccurred = false;

View File

@@ -28,14 +28,14 @@ static BOOL enumMonitorsCallback(HMONITOR hMonitor, [[maybe_unused]] HDC hDC, [[
} }
for(const auto& physicalMonitor: physicalMonitors) { for(const auto& physicalMonitor: physicalMonitors) {
const auto monitor = Monitor(hMonitor, physicalMonitor); auto monitor = Monitor(hMonitor, physicalMonitor);
if(monitor.hasBrightnessCapability()) { if(monitor.hasBrightnessCapability()) {
qInfo(ltr("Found brightness capable monitor '%1' with handle '0x%2' and physical handle '0x%3'") qInfo(ltr("Found brightness capable monitor '%1' with handle '0x%2' and physical handle '0x%3'")
.arg(monitor.m_physicalMonitor.name) .arg(monitor.m_physicalMonitor.name)
.arg(reinterpret_cast<qulonglong>(monitor.m_hMonitor), 0, 16) .arg(reinterpret_cast<qulonglong>(monitor.m_hMonitor), 0, 16)
.arg(reinterpret_cast<qulonglong>(monitor.m_physicalMonitor.handle), 0, 16)); .arg(reinterpret_cast<qulonglong>(monitor.m_physicalMonitor.handle), 0, 16));
monitors.push_back(monitor); monitors.push_back(std::move(monitor));
} }
} }

View File

@@ -15,14 +15,15 @@
#include "log_tr.hpp" #include "log_tr.hpp"
#include "utils.hpp" #include "utils.hpp"
Monitor::Monitor(HMONITOR hMonitor, PHYSICAL_MONITOR physicalMonitor) Monitor::Monitor(Monitor&& other) noexcept
: m_hMonitor(hMonitor) : m_hMonitor(other.m_hMonitor)
, m_physicalMonitor(physicalMonitor.hPhysicalMonitor, physicalMonitor.szPhysicalMonitorDescription) , m_physicalMonitor(other.m_physicalMonitor)
, m_brightnessRange(other.m_brightnessRange)
, m_errorOccurred(other.m_errorOccurred)
{ {
qDebug(ltr("Creating monitor '%1' with handle '0x%2' and physical handle '0x%3'") other.m_hMonitor = 0;
.arg(m_physicalMonitor.name) other.m_physicalMonitor.name.clear();
.arg(reinterpret_cast<qulonglong>(m_hMonitor), 0, 16) other.m_physicalMonitor.handle = 0;
.arg(reinterpret_cast<qulonglong>(m_physicalMonitor.handle), 0, 16));
} }
Monitor::~Monitor() Monitor::~Monitor()
@@ -31,6 +32,14 @@ Monitor::~Monitor()
.arg(m_physicalMonitor.name) .arg(m_physicalMonitor.name)
.arg(reinterpret_cast<qulonglong>(m_hMonitor), 0, 16) .arg(reinterpret_cast<qulonglong>(m_hMonitor), 0, 16)
.arg(reinterpret_cast<qulonglong>(m_physicalMonitor.handle), 0, 16)); .arg(reinterpret_cast<qulonglong>(m_physicalMonitor.handle), 0, 16));
if(m_physicalMonitor.handle && !DestroyPhysicalMonitor(m_physicalMonitor.handle)) {
qCritical(ltr("Error occurred while destroying monitor '%1' with handle '0x%2' and physical handle '0x%3', error: %4")
.arg(m_physicalMonitor.name)
.arg(reinterpret_cast<qulonglong>(m_hMonitor), 0, 16)
.arg(reinterpret_cast<qulonglong>(m_physicalMonitor.handle), 0, 16)
.arg(getLastErrorString()));
}
} }
bool Monitor::setBrightness(float percentage) bool Monitor::setBrightness(float percentage)
@@ -107,6 +116,16 @@ Monitor::operator bool() const
return !m_errorOccurred; return !m_errorOccurred;
} }
Monitor::Monitor(HMONITOR hMonitor, PHYSICAL_MONITOR physicalMonitor)
: m_hMonitor(hMonitor)
, m_physicalMonitor(physicalMonitor.hPhysicalMonitor, physicalMonitor.szPhysicalMonitorDescription)
{
qDebug(ltr("Creating monitor '%1' with handle '0x%2' and physical handle '0x%3'")
.arg(m_physicalMonitor.name)
.arg(reinterpret_cast<qulonglong>(m_hMonitor), 0, 16)
.arg(reinterpret_cast<qulonglong>(m_physicalMonitor.handle), 0, 16));
}
bool Monitor::hasBrightnessCapability() const bool Monitor::hasBrightnessCapability() const
{ {
qDebug(ltr("Getting capabilities of monitor '%1' with handle '0x%2' and physical handle '0x%3'") qDebug(ltr("Getting capabilities of monitor '%1' with handle '0x%2' and physical handle '0x%3'")