diff options
Diffstat (limited to 'compat/check-visible.cpp')
| -rw-r--r-- | compat/check-visible.cpp | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/compat/check-visible.cpp b/compat/check-visible.cpp new file mode 100644 index 00000000..621d941a --- /dev/null +++ b/compat/check-visible.cpp @@ -0,0 +1,98 @@ +#include "check-visible.hpp" + +#include <QMutex> +#include <QWidget> +#include <QDebug> + +static QMutex lock; +static bool visible = true; + +#if defined _WIN32 + +#include "timer.hpp" +#include "macros.h" + +static Timer timer; + +constexpr int visible_timeout = 1000; +constexpr int invisible_timeout = 250; + +#include <windows.h> + +void set_is_visible(const QWidget& w, bool force) +{ + QMutexLocker l(&lock); + + if (w.isHidden() || w.windowState() & Qt::WindowMinimized) + { + visible = false; + return; + } + + { + int ndisplays = GetSystemMetrics(SM_CMONITORS); + if (ndisplays > 1) + { + visible = true; + return; + } + } + + HWND hwnd = (HWND)w.winId(); + + if (!force && timer.elapsed_ms() < (visible ? visible_timeout : invisible_timeout)) + return; + + timer.start(); + + if (RECT r; GetWindowRect(hwnd, &r)) + { + const int x = r.left, y = r.top; + const int w = r.right - x, h = r.bottom - y; + + const POINT xs[] { + { x + w - 1, y + 1 }, + { x + 1, y + h - 1 }, + { x + w - 1, y + h - 1 }, + { x + 1, y + 1 }, + { x + w/2, y + h/2 }, + }; + + visible = false; + + for (const POINT& pt : xs) + if (WindowFromPoint(pt) == hwnd) + { + + visible = true; + break; + } + } + else + { + eval_once(qDebug() << "check-visible: GetWindowRect failed"); + visible = true; + } +} + +#else + +void set_is_visible(const QWidget& w, bool) +{ + QMutexLocker l(&lock); + visible = !(w.isHidden() || w.windowState() & Qt::WindowMinimized); +} + +#endif + +bool check_is_visible() +{ + QMutexLocker l(&lock); + return visible; +} + +void force_is_visible(bool value) +{ + QMutexLocker l(&lock); + visible = value; +} |
