// Copyright (C) 2017 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause #include "customextension.h" #include #include #include #include #include QT_BEGIN_NAMESPACE CustomExtension::CustomExtension() : QWaylandClientExtensionTemplate(/* Supported protocol version */ 1 ) { connect(this, &CustomExtension::activeChanged, this, &CustomExtension::handleExtensionActive); } static inline struct ::wl_surface *getWlSurface(QWindow *window) { void *surf = QGuiApplication::platformNativeInterface()->nativeResourceForWindow("surface", window); return static_cast(surf); } QWindow *CustomExtension::windowForSurface(struct ::wl_surface *surface) { for (QWindow *w : std::as_const(m_windows)) { if (getWlSurface(w) == surface) return w; } return nullptr; } bool CustomExtension::eventFilter(QObject *object, QEvent *event) { if (event->type() == QEvent::Expose) { QWindow *window = qobject_cast(object); Q_ASSERT(window); if (window->isExposed()) { window->removeEventFilter(this); QtWayland::qt_example_extension::register_surface(getWlSurface(window)); } } return false; } void CustomExtension::sendWindowRegistration(QWindow *window) { if (window->handle()) QtWayland::qt_example_extension::register_surface(getWlSurface(window)); else window->installEventFilter(this); // register when created } void CustomExtension::registerWindow(QWindow *window) { m_windows << window; if (isActive()) { m_activated = true; sendWindowRegistration(window); } } CustomExtensionObject *CustomExtension::createCustomObject(const QString &color, const QString &text) { auto *obj = create_local_object(color, text); return new CustomExtensionObject(obj, text); } //! [sendBounce] void CustomExtension::sendBounce(QWindow *window, uint ms) { QtWayland::qt_example_extension::bounce(getWlSurface(window), ms); } //! [sendBounce] void CustomExtension::sendSpin(QWindow *window, uint ms) { QtWayland::qt_example_extension::spin(getWlSurface(window), ms); } void CustomExtension::handleExtensionActive() { if (isActive() && !m_activated) { m_activated = true; for (QWindow *w : std::as_const(m_windows)) sendWindowRegistration(w); } } void CustomExtension::example_extension_close(wl_surface *surface) { QWindow *w = windowForSurface(surface); if (w) w->close(); } void CustomExtension::example_extension_set_font_size(wl_surface *surface, uint32_t pixel_size) { emit fontSize(windowForSurface(surface), pixel_size); } void CustomExtension::example_extension_set_window_decoration(uint32_t state) { bool shown = state; for (QWindow *w : std::as_const(m_windows)) { Qt::WindowFlags f = w->flags(); if (shown) f &= ~Qt::FramelessWindowHint; else f |= Qt::FramelessWindowHint; w->setFlags(f); } } CustomExtensionObject::CustomExtensionObject(struct ::qt_example_local_object *wl_object, const QString &text) : QWaylandClientExtensionTemplate(1) , QtWayland::qt_example_local_object(wl_object) , m_text(text) { } void CustomExtensionObject::example_local_object_clicked() { qDebug() << "Object clicked:" << m_text; emit clicked(); } void CustomExtensionObject::setText(const QString &text) { m_text = text; set_text(text); } QT_END_NAMESPACE