diff options
Diffstat (limited to 'compat')
| -rw-r--r-- | compat/check-visible.cpp | 67 | ||||
| -rw-r--r-- | compat/check-visible.hpp | 9 | 
2 files changed, 76 insertions, 0 deletions
| diff --git a/compat/check-visible.cpp b/compat/check-visible.cpp new file mode 100644 index 00000000..6030ad92 --- /dev/null +++ b/compat/check-visible.cpp @@ -0,0 +1,67 @@ +#include "check-visible.hpp" + +#if defined _WIN32 + +#include "timer.hpp" + +#include <QMutexLocker> + +#include <windows.h> + +static constexpr int visible_timeout = 5000; + +static Timer timer; +static QMutex mtx; +static bool visible = true; + +never_inline OTR_COMPAT_EXPORT +void set_is_visible(const QWidget& w, bool force) +{ +    QMutexLocker l(&mtx); + +    if (!force && timer.elapsed_ms() < visible_timeout) +        return; + +    timer.start(); + +    const HWND id = (HWND) w.winId(); +    const QPoint pt = w.mapToGlobal({ 0, 0 }); + +    const int W = w.width(), H = w.height(); + +    const QPoint points[] = +    { +        pt, +        pt + QPoint(W - 1, 0), +        pt + QPoint(0, H - 1), +        pt + QPoint(W - 1, H - 1), +        pt + QPoint(W / 2, H / 2), +    }; + +    for (const QPoint& pt : points) +        if (!!(visible = WindowFromPoint({ pt.x(), pt.y() }) == id)) +            break; +} + +never_inline OTR_COMPAT_EXPORT +bool check_is_visible() +{ +    QMutexLocker l(&mtx); + +    return visible; +} + +#else + +always_inline OTR_COMPAT_EXPORT +void set_is_visible(const QWidget&) +{ +} + +always_inline OTR_COMPAT_EXPORT +bool check_is_visible() +{ +    return true; +} + +#endif diff --git a/compat/check-visible.hpp b/compat/check-visible.hpp new file mode 100644 index 00000000..f5420a39 --- /dev/null +++ b/compat/check-visible.hpp @@ -0,0 +1,9 @@ +#pragma once + +#include "export.hpp" +#include "util.hpp" + +#include <QWidget> + +never_inline OTR_COMPAT_EXPORT void set_is_visible(QWidget const& w, bool force = false); +never_inline OTR_COMPAT_EXPORT bool check_is_visible(); | 
