| | |
| | | return true; |
| | | } |
| | | |
| | | bool AbstractWindowContext::setHitTestVisible(const QRect &rect, bool visible) { |
| | | Q_ASSERT(rect.isValid()); |
| | | if (!rect.isValid()) { |
| | | return false; |
| | | } |
| | | |
| | | if (visible) { |
| | | m_hitTestVisibleRects.append(rect); |
| | | } else { |
| | | m_hitTestVisibleRects.removeAll(rect); |
| | | } |
| | | hitTestVisibleShapeDirty = true; |
| | | return true; |
| | | } |
| | | |
| | | bool AbstractWindowContext::setSystemButton(WindowAgentBase::SystemButton button, |
| | | QObject *obj) { |
| | | Q_ASSERT(obj); |
| | |
| | | } |
| | | m_titleBar = item; |
| | | return true; |
| | | } |
| | | |
| | | QRegion AbstractWindowContext::hitTestShape() const { |
| | | if (hitTestVisibleShapeDirty) { |
| | | hitTestVisibleShape = {}; |
| | | for (const auto &rect : m_hitTestVisibleRects) { |
| | | hitTestVisibleShape += rect; |
| | | } |
| | | hitTestVisibleShapeDirty = false; |
| | | } |
| | | return hitTestVisibleShape; |
| | | } |
| | | |
| | | bool AbstractWindowContext::isInSystemButtons(const QPoint &pos, |
| | |
| | | } |
| | | } |
| | | |
| | | if (!m_hitTestVisibleRects.isEmpty() && hitTestShape().contains(pos)) { |
| | | return false; |
| | | } |
| | | return true; |
| | | } |
| | | |
| | |
| | | |
| | | inline bool isHitTestVisible(const QObject *obj) const; |
| | | bool setHitTestVisible(const QObject *obj, bool visible); |
| | | bool setHitTestVisible(const QRect &rect, bool visible); |
| | | |
| | | inline QObject *systemButton(WindowAgentBase::SystemButton button) const; |
| | | bool setSystemButton(WindowAgentBase::SystemButton button, QObject *obj); |
| | |
| | | inline QObject *titleBar() const; |
| | | bool setTitleBar(QObject *obj); |
| | | |
| | | QRegion hitTestShape() const; |
| | | bool isInSystemButtons(const QPoint &pos, WindowAgentBase::SystemButton *button) const; |
| | | bool isInTitleBarDraggableArea(const QPoint &pos) const; |
| | | |
| | |
| | | QWindow *m_windowHandle{}; |
| | | |
| | | QSet<const QObject *> m_hitTestVisibleItems; |
| | | QList<QRect> m_hitTestVisibleRects; |
| | | |
| | | QObject *m_titleBar{}; |
| | | std::array<QObject *, WindowAgentBase::NumSystemButton> m_systemButtons{}; |
| | | |
| | | // Cached shape |
| | | mutable bool hitTestVisibleShapeDirty{}; |
| | | mutable QRegion hitTestVisibleShape; |
| | | }; |
| | | |
| | | inline QObject *AbstractWindowContext::host() const { |
| | |
| | | const WindowPart currentWindowPart = lastHitTestResult; |
| | | if (message == WM_NCMOUSEMOVE) { |
| | | if (currentWindowPart != WindowPart::ChromeButton) { |
| | | m_delegate->resetQtGrabbedControl(); |
| | | m_delegate->resetQtGrabbedControl(m_host); |
| | | if (mouseLeaveBlocked) { |
| | | emulateClientAreaMessage(hWnd, message, wParam, lParam, |
| | | WM_NCMOUSELEAVE); |
| | |
| | | // window from client area, which means we will get previous window part as |
| | | // HTCLIENT if the mouse leaves window from client area and enters window |
| | | // from non-client area, but it has no bad effect. |
| | | m_delegate->resetQtGrabbedControl(); |
| | | m_delegate->resetQtGrabbedControl(m_host); |
| | | } |
| | | } |
| | | break; |
| | |
| | | friend class NativeEventDispatcher; |
| | | }; |
| | | |
| | | // Automatically install to QApplication at construction |
| | | // Automatically install to QCoreApplication at construction |
| | | class QWK_CORE_EXPORT AppNativeEventFilter : public NativeEventFilter { |
| | | public: |
| | | AppNativeEventFilter(); |
| | |
| | | return d->context->isHitTestVisible(item); |
| | | } |
| | | |
| | | void QuickWindowAgent::setHitTestVisible_item(const QQuickItem *item, bool visible) { |
| | | void QuickWindowAgent::setHitTestVisible(const QQuickItem *item, bool visible) { |
| | | Q_D(QuickWindowAgent); |
| | | d->context->setHitTestVisible(item, visible); |
| | | } |
| | | |
| | | void QuickWindowAgent::setHitTestVisible_rect(const QRect &rect, bool visible) { |
| | | Q_D(QuickWindowAgent); |
| | | d->context->setHitTestVisible(rect, visible); |
| | | } |
| | | |
| | | QuickWindowAgent::QuickWindowAgent(QuickWindowAgentPrivate &d, QObject *parent) |
| | |
| | | Q_INVOKABLE void setSystemButton(SystemButton button, QQuickItem *item); |
| | | |
| | | Q_INVOKABLE bool isHitTestVisible(const QQuickItem *item) const; |
| | | Q_INVOKABLE inline void setHitTestVisible(const QQuickItem *item, bool visible = true); |
| | | Q_INVOKABLE void setHitTestVisible_item(const QQuickItem *item, bool visible = true); |
| | | Q_INVOKABLE void setHitTestVisible_rect(const QRect &rect, bool visible = true); |
| | | Q_INVOKABLE void setHitTestVisible(const QQuickItem *item, bool visible = true); |
| | | |
| | | Q_SIGNALS: |
| | | void titleBarWidgetChanged(const QQuickItem *item); |
| | |
| | | protected: |
| | | QuickWindowAgent(QuickWindowAgentPrivate &d, QObject *parent = nullptr); |
| | | }; |
| | | |
| | | inline void QuickWindowAgent::setHitTestVisible(const QQuickItem *item, bool visible) { |
| | | setHitTestVisible_item(item, visible); |
| | | } |
| | | |
| | | } |
| | | |
| | |
| | | d->context->setHitTestVisible(w, visible); |
| | | } |
| | | |
| | | void WidgetWindowAgent::setHitTestVisible(const QRect &rect, bool visible) { |
| | | Q_D(WidgetWindowAgent); |
| | | d->context->setHitTestVisible(rect, visible); |
| | | } |
| | | |
| | | WidgetWindowAgent::WidgetWindowAgent(WidgetWindowAgentPrivate &d, QObject *parent) |
| | | : WindowAgentBase(d, parent) { |
| | | d.init(); |
| | |
| | | |
| | | bool isHitTestVisible(const QWidget *w) const; |
| | | void setHitTestVisible(const QWidget *w, bool visible = true); |
| | | void setHitTestVisible(const QRect &rect, bool visible = true); |
| | | |
| | | Q_SIGNALS: |
| | | void titleBarWidgetChanged(const QWidget *w); |