diff options
Diffstat (limited to 'src/plugins/platforms')
12 files changed, 208 insertions, 146 deletions
diff --git a/src/plugins/platforms/cocoa/qcocoamessagedialog.mm b/src/plugins/platforms/cocoa/qcocoamessagedialog.mm index dab348beaa4..7a6f010ba8f 100644 --- a/src/plugins/platforms/cocoa/qcocoamessagedialog.mm +++ b/src/plugins/platforms/cocoa/qcocoamessagedialog.mm @@ -88,6 +88,11 @@ bool QCocoaMessageDialog::show(Qt::WindowFlags windowFlags, Qt::WindowModality w return false; } + // Tahoe has issues with window-modal alert buttons not responding to mouse + if (windowModality == Qt::WindowModal + && QOperatingSystemVersion::current() >= QOperatingSystemVersion::MacOSTahoe) + return false; + // And without options we don't know what to show if (!options()) return false; diff --git a/src/plugins/platforms/wasm/qwasmaccessibility.cpp b/src/plugins/platforms/wasm/qwasmaccessibility.cpp index 5807d157636..eb36f7351d0 100644 --- a/src/plugins/platforms/wasm/qwasmaccessibility.cpp +++ b/src/plugins/platforms/wasm/qwasmaccessibility.cpp @@ -322,6 +322,16 @@ void QWasmAccessibility::setProperty(emscripten::val element, const std::string element.set(property, val); } +void QWasmAccessibility::setNamedAttribute(QAccessibleInterface *iface, const std::string &attribute, QAccessible::Text text) +{ + const emscripten::val element = getHtmlElement(iface); + setAttribute(element, attribute, iface->text(text).toStdString()); +} +void QWasmAccessibility::setNamedProperty(QAccessibleInterface *iface, const std::string &property, QAccessible::Text text) +{ + const emscripten::val element = getHtmlElement(iface); + setProperty(element, property, iface->text(text).toStdString()); +} void QWasmAccessibility::addEventListener(QAccessibleInterface *iface, emscripten::val element, const char *eventType) { @@ -331,6 +341,17 @@ void QWasmAccessibility::addEventListener(QAccessibleInterface *iface, emscripte true); } +void QWasmAccessibility::sendEvent(QAccessibleInterface *iface, QAccessible::Event eventType) +{ + if (iface->object()) { + QAccessibleEvent event(iface->object(), eventType); + handleUpdateByInterfaceRole(&event); + } else { + QAccessibleEvent event(iface, eventType); + handleUpdateByInterfaceRole(&event); + } +} + emscripten::val QWasmAccessibility::createHtmlElement(QAccessibleInterface *iface) { // Get the html container element for the interface; this depends on which @@ -484,11 +505,11 @@ emscripten::val QWasmAccessibility::createHtmlElement(QAccessibleInterface *ifac m_elements[iface] = element; setHtmlElementGeometry(iface); - setHtmlElementTextName(iface); setHtmlElementDisabled(iface); setHtmlElementVisibility(iface, !iface->state().invisible); handleIdentifierUpdate(iface); handleDescriptionChanged(iface); + sendEvent(iface, QAccessible::NameChanged); linkToParent(iface); // Link in child elements @@ -624,28 +645,6 @@ void QWasmAccessibility::setHtmlElementGeometry(emscripten::val element, QRect g style.set("height", std::to_string(geometry.height()) + "px"); } -void QWasmAccessibility::setHtmlElementTextName(QAccessibleInterface *iface) -{ - const emscripten::val element = getHtmlElement(iface); - const QString name = iface->text(QAccessible::Name); - const QString value = iface->text(QAccessible::Value); - - // A <div> cannot contain aria-label - if (iface->role() == QAccessible::StaticText) - setProperty(element, "innerText", name.toStdString()); - else if (iface->role() == QAccessible::EditableText) - setProperty(element, "value", value.toStdString()); - else - setAttribute(element, "aria-label", name.toStdString()); -} - -void QWasmAccessibility::setHtmlElementTextNameLE(QAccessibleInterface *iface) -{ - const emscripten::val element = getHtmlElement(iface); - QString value = iface->text(QAccessible::Value); - setProperty(element, "value", value.toStdString()); -} - void QWasmAccessibility::setHtmlElementFocus(QAccessibleInterface *iface) { const auto element = getHtmlElement(iface); @@ -677,7 +676,8 @@ void QWasmAccessibility::handleStaticTextUpdate(QAccessibleEvent *event) { switch (event->type()) { case QAccessible::NameChanged: { - setHtmlElementTextName(event->accessibleInterface()); + // StaticText is a div + setNamedProperty(event->accessibleInterface(), "innerText", QAccessible::Name); } break; default: qCDebug(lcQpaAccessibility) << "TODO: implement handleStaticTextUpdate for event" << event->type(); @@ -698,7 +698,7 @@ void QWasmAccessibility::handleLineEditUpdate(QAccessibleEvent *event) setProperty(element, "type", "text"); } break; case QAccessible::NameChanged: { - setHtmlElementTextName(event->accessibleInterface()); + setNamedProperty(event->accessibleInterface(), "value", QAccessible::Value); } break; case QAccessible::ObjectShow: case QAccessible::Focus: { @@ -711,12 +711,12 @@ void QWasmAccessibility::handleLineEditUpdate(QAccessibleEvent *event) else setProperty(element, "type", "text"); } - setHtmlElementTextNameLE(iface); + setNamedProperty(event->accessibleInterface(), "value", QAccessible::Value); } break; case QAccessible::TextRemoved: case QAccessible::TextInserted: case QAccessible::TextCaretMoved: { - setHtmlElementTextNameLE(event->accessibleInterface()); + setNamedProperty(event->accessibleInterface(), "value", QAccessible::Value); } break; default: qCDebug(lcQpaAccessibility) << "TODO: implement handleLineEditUpdate for event" << event->type(); @@ -751,7 +751,15 @@ void QWasmAccessibility::handleEventFromHtmlElement(const emscripten::val event) void QWasmAccessibility::handleButtonUpdate(QAccessibleEvent *event) { - qCDebug(lcQpaAccessibility) << "TODO: implement handleButtonUpdate for event" << event->type(); + switch (event->type()) { + case QAccessible::Focus: + case QAccessible::NameChanged: { + setNamedAttribute(event->accessibleInterface(), "aria-label", QAccessible::Name); + } break; + default: + qCDebug(lcQpaAccessibility) << "TODO: implement handleCheckBoxUpdate for event" << event->type(); + break; + } } void QWasmAccessibility::handleCheckBoxUpdate(QAccessibleEvent *event) @@ -759,7 +767,7 @@ void QWasmAccessibility::handleCheckBoxUpdate(QAccessibleEvent *event) switch (event->type()) { case QAccessible::Focus: case QAccessible::NameChanged: { - setHtmlElementTextName(event->accessibleInterface()); + setNamedAttribute(event->accessibleInterface(), "aria-label", QAccessible::Name); } break; case QAccessible::StateChanged: { QAccessibleInterface *accessible = event->accessibleInterface(); @@ -778,7 +786,8 @@ void QWasmAccessibility::handleSwitchUpdate(QAccessibleEvent *event) switch (event->type()) { case QAccessible::Focus: case QAccessible::NameChanged: { - setHtmlElementTextName(event->accessibleInterface()); + /* A switch is like a button in this regard */ + setNamedAttribute(event->accessibleInterface(), "aria-label", QAccessible::Name); } break; case QAccessible::StateChanged: { QAccessibleInterface *accessible = event->accessibleInterface(); @@ -841,7 +850,7 @@ void QWasmAccessibility::handleDialogUpdate(QAccessibleEvent *event) { case QAccessible::Focus: case QAccessible::DialogStart: case QAccessible::StateChanged: { - setHtmlElementTextName(event->accessibleInterface()); + setNamedAttribute(event->accessibleInterface(), "aria-label", QAccessible::Name); } break; default: qCDebug(lcQpaAccessibility) << "TODO: implement handleLineEditUpdate for event" << event->type(); @@ -869,10 +878,10 @@ void QWasmAccessibility::populateAccessibilityTree(QAccessibleInterface *iface) linkToParent(iface); setHtmlElementVisibility(iface, !iface->state().invisible); setHtmlElementGeometry(iface); - setHtmlElementTextName(iface); setHtmlElementDisabled(iface); handleIdentifierUpdate(iface); handleDescriptionChanged(iface); + sendEvent(iface, QAccessible::NameChanged); } } for (int i = 0; i < iface->childCount(); ++i) @@ -884,7 +893,7 @@ void QWasmAccessibility::handleRadioButtonUpdate(QAccessibleEvent *event) switch (event->type()) { case QAccessible::Focus: case QAccessible::NameChanged: { - setHtmlElementTextName(event->accessibleInterface()); + setNamedAttribute(event->accessibleInterface(), "aria-label", QAccessible::Name); } break; case QAccessible::StateChanged: { QAccessibleInterface *accessible = event->accessibleInterface(); @@ -905,7 +914,7 @@ void QWasmAccessibility::handleSpinBoxUpdate(QAccessibleEvent *event) } break; case QAccessible::Focus: case QAccessible::NameChanged: { - setHtmlElementTextName(event->accessibleInterface()); + setNamedAttribute(event->accessibleInterface(), "aria-label", QAccessible::Name); } break; case QAccessible::ValueChanged: { QAccessibleInterface *accessible = event->accessibleInterface(); @@ -927,7 +936,7 @@ void QWasmAccessibility::handleSliderUpdate(QAccessibleEvent *event) } break; case QAccessible::Focus: case QAccessible::NameChanged: { - setHtmlElementTextName(event->accessibleInterface()); + setNamedAttribute(event->accessibleInterface(), "aria-label", QAccessible::Name); } break; case QAccessible::ValueChanged: { QAccessibleInterface *accessible = event->accessibleInterface(); @@ -946,7 +955,7 @@ void QWasmAccessibility::handleScrollBarUpdate(QAccessibleEvent *event) switch (event->type()) { case QAccessible::Focus: case QAccessible::NameChanged: { - setHtmlElementTextName(event->accessibleInterface()); + setNamedAttribute(event->accessibleInterface(), "aria-label", QAccessible::Name); } break; case QAccessible::ValueChanged: { QAccessibleInterface *accessible = event->accessibleInterface(); @@ -965,10 +974,10 @@ void QWasmAccessibility::handlePageTabUpdate(QAccessibleEvent *event) { switch (event->type()) { case QAccessible::NameChanged: { - setHtmlElementTextName(event->accessibleInterface()); + setNamedAttribute(event->accessibleInterface(), "aria-label", QAccessible::Name); } break; case QAccessible::Focus: { - setHtmlElementTextName(event->accessibleInterface()); + setNamedAttribute(event->accessibleInterface(), "aria-label", QAccessible::Name); } break; default: qDebug() << "TODO: implement handlePageTabUpdate for event" << event->type(); @@ -980,10 +989,10 @@ void QWasmAccessibility::handlePageTabListUpdate(QAccessibleEvent *event) { switch (event->type()) { case QAccessible::NameChanged: { - setHtmlElementTextName(event->accessibleInterface()); + setNamedAttribute(event->accessibleInterface(), "aria-label", QAccessible::Name); } break; case QAccessible::Focus: { - setHtmlElementTextName(event->accessibleInterface()); + setNamedAttribute(event->accessibleInterface(), "aria-label", QAccessible::Name); } break; default: qDebug() << "TODO: implement handlePageTabUpdate for event" << event->type(); @@ -1106,13 +1115,19 @@ void QWasmAccessibility::relinkParentForChildren(QAccessibleInterface *iface) void QWasmAccessibility::notifyAccessibilityUpdate(QAccessibleEvent *event) { + if (handleUpdateByEventType(event)) + handleUpdateByInterfaceRole(event); +} + +bool QWasmAccessibility::handleUpdateByEventType(QAccessibleEvent *event) +{ if (!m_accessibilityEnabled) - return; + return false; QAccessibleInterface *iface = event->accessibleInterface(); if (!iface) { - qWarning() << "notifyAccessibilityUpdate with null a11y interface" << event->type() << event->object(); - return; + qWarning() << "handleUpdateByEventType with null a11y interface" << event->type() << event->object(); + return false; } // Handle event types that creates/removes objects. @@ -1120,13 +1135,13 @@ void QWasmAccessibility::notifyAccessibilityUpdate(QAccessibleEvent *event) case QAccessible::ObjectCreated: // Do nothing, there are too many changes to the interface // before ObjectShow is called - return; + return false; case QAccessible::ObjectDestroyed: // The object might be under destruction, and the interface is not valid // but we can look at the pointer, removeObject(iface); - return; + return false; case QAccessible::ObjectShow: // We do not get ObjectCreated from widgets, we get ObjectShow createObject(iface); @@ -1142,7 +1157,7 @@ void QWasmAccessibility::notifyAccessibilityUpdate(QAccessibleEvent *event) }; if (getHtmlElement(iface).isUndefined()) - return; + return false; // Handle some common event types. See // https://doc.qt.io/qt-5/qaccessible.html#Event-enum @@ -1155,7 +1170,7 @@ void QWasmAccessibility::notifyAccessibilityUpdate(QAccessibleEvent *event) case QAccessible::DescriptionChanged: handleDescriptionChanged(iface); - return; + return false; case QAccessible::Focus: // We do not get all callbacks for the geometry @@ -1166,7 +1181,7 @@ void QWasmAccessibility::notifyAccessibilityUpdate(QAccessibleEvent *event) case QAccessible::IdentifierChanged: handleIdentifierUpdate(iface); - return; + return false; case QAccessible::ObjectShow: linkToParent(iface); @@ -1174,23 +1189,37 @@ void QWasmAccessibility::notifyAccessibilityUpdate(QAccessibleEvent *event) // Sync up properties on show; setHtmlElementGeometry(iface); - setHtmlElementTextName(iface); + sendEvent(iface, QAccessible::NameChanged); break; case QAccessible::ObjectHide: linkToParent(iface); setHtmlElementVisibility(iface, false); - return; + return false; case QAccessible::LocationChanged: setHtmlElementGeometry(iface); - return; + return false; // TODO: maybe handle more types here default: break; }; + return true; +} + +void QWasmAccessibility::handleUpdateByInterfaceRole(QAccessibleEvent *event) +{ + if (!m_accessibilityEnabled) + return; + + QAccessibleInterface *iface = event->accessibleInterface(); + if (!iface) { + qWarning() << "handleUpdateByInterfaceRole with null a11y interface" << event->type() << event->object(); + return; + } + // Switch on interface role, see // https://doc.qt.io/qt-5/qaccessibleinterface.html#role switch (iface->role()) { @@ -1198,7 +1227,7 @@ void QWasmAccessibility::notifyAccessibilityUpdate(QAccessibleEvent *event) handleStaticTextUpdate(event); break; case QAccessible::Button: - handleStaticTextUpdate(event); + handleButtonUpdate(event); break; case QAccessible::CheckBox: handleCheckBoxUpdate(event); diff --git a/src/plugins/platforms/wasm/qwasmaccessibility.h b/src/plugins/platforms/wasm/qwasmaccessibility.h index ddbfec918d6..f20c7db5ac3 100644 --- a/src/plugins/platforms/wasm/qwasmaccessibility.h +++ b/src/plugins/platforms/wasm/qwasmaccessibility.h @@ -73,8 +73,6 @@ private: void setHtmlElementVisibility(QAccessibleInterface *iface, bool visible); void setHtmlElementGeometry(QAccessibleInterface *iface); void setHtmlElementGeometry(emscripten::val element, QRect geometry); - void setHtmlElementTextName(QAccessibleInterface *iface); - void setHtmlElementTextNameLE(QAccessibleInterface *iface); void setHtmlElementFocus(QAccessibleInterface *iface); void setHtmlElementDisabled(QAccessibleInterface *iface); void setHtmlElementOrientation(emscripten::val element, QAccessibleInterface *iface); @@ -105,6 +103,9 @@ private: void relinkParentForChildren(QAccessibleInterface *iface); void notifyAccessibilityUpdate(QAccessibleEvent *event) override; + bool handleUpdateByEventType(QAccessibleEvent *event); + void handleUpdateByInterfaceRole(QAccessibleEvent *event); + void setRootObject(QObject *o) override; void initialize() override; void cleanup() override; @@ -117,7 +118,11 @@ private: void setProperty(emscripten::val element, const std::string &attr, const char *val); void setProperty(emscripten::val element, const std::string &attr, bool val); + void setNamedAttribute(QAccessibleInterface *iface, const std::string &attribute, QAccessible::Text text); + void setNamedProperty(QAccessibleInterface *iface, const std::string &property, QAccessible::Text text); + void addEventListener(QAccessibleInterface *, emscripten::val element, const char *eventType); + void sendEvent(QAccessibleInterface *iface, QAccessible::Event eventType); private: static QWasmAccessibility *s_instance; diff --git a/src/plugins/platforms/wayland/CMakeLists.txt b/src/plugins/platforms/wayland/CMakeLists.txt index 0ce9a4b091c..d9415f0a011 100644 --- a/src/plugins/platforms/wayland/CMakeLists.txt +++ b/src/plugins/platforms/wayland/CMakeLists.txt @@ -157,7 +157,7 @@ qt6_generate_wayland_protocol_client_sources(WaylandClient ${CMAKE_CURRENT_SOURCE_DIR}/../../../3rdparty/wayland/extensions/qt-windowmanager.xml ${CMAKE_CURRENT_SOURCE_DIR}/../../../3rdparty/wayland/extensions/hardware-integration.xml ${CMAKE_CURRENT_SOURCE_DIR}/../../../3rdparty/wayland/extensions/server-buffer-extension.xml - ${CMAKE_CURRENT_SOURCE_DIR}/../../../3rdparty/wayland/protocols/color-management/xx-color-management-v4.xml + ${CMAKE_CURRENT_SOURCE_DIR}/../../../3rdparty/wayland/protocols/color-management/color-management-v1.xml ${CMAKE_CURRENT_SOURCE_DIR}/../../../3rdparty/wayland/protocols/pointer-warp/pointer-warp-v1.xml ${CMAKE_CURRENT_SOURCE_DIR}/../../../3rdparty/wayland/protocols/session-management/xx-session-management-v1.xml ) diff --git a/src/plugins/platforms/wayland/global/qwaylandclientextension.cpp b/src/plugins/platforms/wayland/global/qwaylandclientextension.cpp index 92c746d3541..edbeb1f72ea 100644 --- a/src/plugins/platforms/wayland/global/qwaylandclientextension.cpp +++ b/src/plugins/platforms/wayland/global/qwaylandclientextension.cpp @@ -40,6 +40,11 @@ void QWaylandClientExtensionPrivate::globalRemoved(const RegistryGlobal &global) } } +/*! + \class QWaylandClientExtension + \internal +*/ + void QWaylandClientExtension::initialize() { Q_D(QWaylandClientExtension); diff --git a/src/plugins/platforms/wayland/qwaylandcolormanagement.cpp b/src/plugins/platforms/wayland/qwaylandcolormanagement.cpp index 2114e59328b..2a0c8a4c854 100644 --- a/src/plugins/platforms/wayland/qwaylandcolormanagement.cpp +++ b/src/plugins/platforms/wayland/qwaylandcolormanagement.cpp @@ -13,7 +13,7 @@ QT_BEGIN_NAMESPACE namespace QtWaylandClient { ColorManager::ColorManager(struct ::wl_registry *registry, uint32_t id, int version) - : QtWayland::xx_color_manager_v4(registry, id, version) + : QtWayland::wp_color_manager_v1(registry, id, version) { } @@ -22,7 +22,7 @@ ColorManager::~ColorManager() destroy(); } -void ColorManager::xx_color_manager_v4_supported_feature(uint32_t feature) +void ColorManager::wp_color_manager_v1_supported_feature(uint32_t feature) { switch (feature) { case feature_icc_v2_v4: @@ -49,14 +49,14 @@ void ColorManager::xx_color_manager_v4_supported_feature(uint32_t feature) } } -void ColorManager::xx_color_manager_v4_supported_primaries_named(uint32_t primaries) +void ColorManager::wp_color_manager_v1_supported_primaries_named(uint32_t primaries) { - mPrimaries.push_back(QtWayland::xx_color_manager_v4::primaries(primaries)); + mPrimaries.push_back(QtWayland::wp_color_manager_v1::primaries(primaries)); } -void ColorManager::xx_color_manager_v4_supported_tf_named(uint32_t transferFunction) +void ColorManager::wp_color_manager_v1_supported_tf_named(uint32_t transferFunction) { - mTransferFunctions.push_back(QtWayland::xx_color_manager_v4::transfer_function(transferFunction)); + mTransferFunctions.push_back(QtWayland::wp_color_manager_v1::transfer_function(transferFunction)); } ColorManager::Features ColorManager::supportedFeatures() const @@ -64,12 +64,12 @@ ColorManager::Features ColorManager::supportedFeatures() const return mFeatures; } -bool ColorManager::supportsNamedPrimary(QtWayland::xx_color_manager_v4::primaries primaries) const +bool ColorManager::supportsNamedPrimary(QtWayland::wp_color_manager_v1::primaries primaries) const { return mPrimaries.contains(primaries); } -bool ColorManager::supportsTransferFunction(QtWayland::xx_color_manager_v4::transfer_function transferFunction) const +bool ColorManager::supportsTransferFunction(QtWayland::wp_color_manager_v1::transfer_function transferFunction) const { return mTransferFunctions.contains(transferFunction); } @@ -92,8 +92,8 @@ std::unique_ptr<ImageDescription> ColorManager::createImageDescription(const QCo return nullptr; constexpr std::array tfMapping = { - std::make_pair(QColorSpace::TransferFunction::Linear, transfer_function_linear), - std::make_pair(QColorSpace::TransferFunction::SRgb, transfer_function_srgb), + std::make_pair(QColorSpace::TransferFunction::Linear, transfer_function_ext_linear), + std::make_pair(QColorSpace::TransferFunction::SRgb, transfer_function_gamma22), std::make_pair(QColorSpace::TransferFunction::St2084, transfer_function_st2084_pq), std::make_pair(QColorSpace::TransferFunction::Hlg, transfer_function_hlg), }; @@ -106,99 +106,105 @@ std::unique_ptr<ImageDescription> ColorManager::createImageDescription(const QCo transferFunction = transfer_function_gamma22; else if (qFuzzyCompare(colorspace.gamma(), 2.8f) && supportsTransferFunction(transfer_function_gamma28)) transferFunction = transfer_function_gamma28; - if (!transferFunction && !(mFeatures & Feature::PowerTransferFunction)) - return nullptr; - } else if (!transferFunction) { + if (!transferFunction && !(mFeatures & Feature::PowerTransferFunction)) { + if (qFuzzyCompare(colorspace.gamma(), 563.0f / 256.0f) && supportsTransferFunction(transfer_function_gamma22)) { + // If power tf is not supported, we can use Adobe RGB gamma approximation + transferFunction = transfer_function_gamma22; + } else { + return nullptr; + } + } + } else if (!transferFunction || !supportsTransferFunction(*transferFunction)) { return nullptr; } - auto creator = new_parametric_creator(); + auto creator = create_parametric_creator(); if (primary != primaryMapping.end()) { - xx_image_description_creator_params_v4_set_primaries_named(creator, primary->second); + wp_image_description_creator_params_v1_set_primaries_named(creator, primary->second); } else { const auto primaries = colorspace.primaryPoints(); - xx_image_description_creator_params_v4_set_primaries(creator, - std::round(10'000 * primaries.redPoint.x()), std::round(10'000 * primaries.redPoint.y()), - std::round(10'000 * primaries.greenPoint.x()), std::round(10'000 * primaries.greenPoint.y()), - std::round(10'000 * primaries.bluePoint.x()), std::round(10'000 * primaries.bluePoint.y()), - std::round(10'000 * primaries.whitePoint.x()), std::round(10'000 * primaries.whitePoint.y()) + wp_image_description_creator_params_v1_set_primaries(creator, + std::round(1'000'000 * primaries.redPoint.x()), std::round(1'000'000 * primaries.redPoint.y()), + std::round(1'000'000 * primaries.greenPoint.x()), std::round(1'000'000 * primaries.greenPoint.y()), + std::round(1'000'000 * primaries.bluePoint.x()), std::round(1'000'000 * primaries.bluePoint.y()), + std::round(1'000'000 * primaries.whitePoint.x()), std::round(1'000'000 * primaries.whitePoint.y()) ); } if (transferFunction) { - xx_image_description_creator_params_v4_set_tf_named(creator, *transferFunction); + wp_image_description_creator_params_v1_set_tf_named(creator, *transferFunction); } else { Q_ASSERT(colorspace.transferFunction() == QColorSpace::TransferFunction::Gamma); - xx_image_description_creator_params_v4_set_tf_power(creator, std::round(colorspace.gamma() * 10'000)); + wp_image_description_creator_params_v1_set_tf_power(creator, std::round(colorspace.gamma() * 10'000)); } - return std::make_unique<ImageDescription>(xx_image_description_creator_params_v4_create(creator)); + return std::make_unique<ImageDescription>(wp_image_description_creator_params_v1_create(creator)); } ImageDescriptionInfo::ImageDescriptionInfo(ImageDescription *descr) - : QtWayland::xx_image_description_info_v4(descr->get_information()) + : QtWayland::wp_image_description_info_v1(descr->get_information()) { } ImageDescriptionInfo::~ImageDescriptionInfo() { - xx_image_description_info_v4_destroy(object()); + wp_image_description_info_v1_destroy(object()); } -void ImageDescriptionInfo::xx_image_description_info_v4_done() +void ImageDescriptionInfo::wp_image_description_info_v1_done() { Q_EMIT done(); } -void ImageDescriptionInfo::xx_image_description_info_v4_icc_file(int32_t icc, uint32_t icc_size) +void ImageDescriptionInfo::wp_image_description_info_v1_icc_file(int32_t icc, uint32_t icc_size) { Q_UNUSED(icc_size) close(icc); } -void ImageDescriptionInfo::xx_image_description_info_v4_primaries(int32_t r_x, int32_t r_y, int32_t g_x, int32_t g_y, int32_t b_x, int32_t b_y, int32_t w_x, int32_t w_y) +void ImageDescriptionInfo::wp_image_description_info_v1_primaries(int32_t r_x, int32_t r_y, int32_t g_x, int32_t g_y, int32_t b_x, int32_t b_y, int32_t w_x, int32_t w_y) { - mContainerRed = QPointF(r_x, r_y) / 10'000.0; - mContainerGreen = QPointF(g_x, g_y) / 10'000.0; - mContainerBlue = QPointF(b_x, b_y) / 10'000.0; - mContainerWhite = QPointF(w_x, w_y) / 10'000.0; + mContainerRed = QPointF(r_x, r_y) / 1'000'000.0; + mContainerGreen = QPointF(g_x, g_y) / 1'000'000.0; + mContainerBlue = QPointF(b_x, b_y) / 1'000'000.0; + mContainerWhite = QPointF(w_x, w_y) / 1'000'000.0; } -void ImageDescriptionInfo::xx_image_description_info_v4_tf_named(uint32_t transferFunction) +void ImageDescriptionInfo::wp_image_description_info_v1_tf_named(uint32_t transferFunction) { mTransferFunction = transferFunction; } -void ImageDescriptionInfo::xx_image_description_info_v4_luminances(uint32_t min_lum, uint32_t max_lum, uint32_t reference_lum) +void ImageDescriptionInfo::wp_image_description_info_v1_luminances(uint32_t min_lum, uint32_t max_lum, uint32_t reference_lum) { mMinLuminance = min_lum / 10'000.0; mMaxLuminance = max_lum; mReferenceLuminance = reference_lum; } -void ImageDescriptionInfo::xx_image_description_info_v4_target_primaries(int32_t r_x, int32_t r_y, int32_t g_x, int32_t g_y, int32_t b_x, int32_t b_y, int32_t w_x, int32_t w_y) +void ImageDescriptionInfo::wp_image_description_info_v1_target_primaries(int32_t r_x, int32_t r_y, int32_t g_x, int32_t g_y, int32_t b_x, int32_t b_y, int32_t w_x, int32_t w_y) { - mTargetRed = QPointF(r_x, r_y) / 10'000.0; - mTargetGreen = QPointF(g_x, g_y) / 10'000.0; - mTargetBlue = QPointF(b_x, b_y) / 10'000.0; - mTargetWhite = QPointF(w_x, w_y) / 10'000.0; + mTargetRed = QPointF(r_x, r_y) / 1'000'000.0; + mTargetGreen = QPointF(g_x, g_y) / 1'000'000.0; + mTargetBlue = QPointF(b_x, b_y) / 1'000'000.0; + mTargetWhite = QPointF(w_x, w_y) / 1'000'000.0; } -void ImageDescriptionInfo::xx_image_description_info_v4_target_luminance(uint32_t min_lum, uint32_t max_lum) +void ImageDescriptionInfo::wp_image_description_info_v1_target_luminance(uint32_t min_lum, uint32_t max_lum) { mTargetMinLuminance = min_lum / 10'000.0; mTargetMaxLuminance = max_lum; } -ImageDescription::ImageDescription(::xx_image_description_v4 *descr) - : QtWayland::xx_image_description_v4(descr) +ImageDescription::ImageDescription(::wp_image_description_v1 *descr) + : QtWayland::wp_image_description_v1(descr) { } ImageDescription::~ImageDescription() { - xx_image_description_v4_destroy(object()); + wp_image_description_v1_destroy(object()); } -void ImageDescription::xx_image_description_v4_failed(uint32_t cause, const QString &msg) +void ImageDescription::wp_image_description_v1_failed(uint32_t cause, const QString &msg) { Q_UNUSED(cause); qCWarning(lcQpaWayland) << "image description failed!" << msg; @@ -206,25 +212,26 @@ void ImageDescription::xx_image_description_v4_failed(uint32_t cause, const QStr // maybe fall back to the previous or preferred image description } -void ImageDescription::xx_image_description_v4_ready(uint32_t identity) +void ImageDescription::wp_image_description_v1_ready(uint32_t identity) { Q_UNUSED(identity); Q_EMIT ready(); } -ColorManagementFeedback::ColorManagementFeedback(::xx_color_management_feedback_surface_v4 *obj) - : QtWayland::xx_color_management_feedback_surface_v4(obj) +ColorManagementFeedback::ColorManagementFeedback(::wp_color_management_surface_feedback_v1 *obj) + : QtWayland::wp_color_management_surface_feedback_v1(obj) , mPreferred(std::make_unique<ImageDescription>(get_preferred())) { } ColorManagementFeedback::~ColorManagementFeedback() { - xx_color_management_feedback_surface_v4_destroy(object()); + wp_color_management_surface_feedback_v1_destroy(object()); } -void ColorManagementFeedback::xx_color_management_feedback_surface_v4_preferred_changed() +void ColorManagementFeedback::wp_color_management_surface_feedback_v1_preferred_changed(uint32_t identity) { + Q_UNUSED(identity); mPreferred = std::make_unique<ImageDescription>(get_preferred()); mPendingPreferredInfo = std::make_unique<ImageDescriptionInfo>(mPreferred.get()); connect(mPendingPreferredInfo.get(), &ImageDescriptionInfo::done, this, &ColorManagementFeedback::preferredChanged); @@ -235,22 +242,22 @@ void ColorManagementFeedback::handlePreferredDone() mPreferredInfo = std::move(mPendingPreferredInfo); } -ColorManagementSurface::ColorManagementSurface(::xx_color_management_surface_v4 *obj) - : QtWayland::xx_color_management_surface_v4(obj) +ColorManagementSurface::ColorManagementSurface(::wp_color_management_surface_v1 *obj) + : QtWayland::wp_color_management_surface_v1(obj) { } ColorManagementSurface::~ColorManagementSurface() { - xx_color_management_surface_v4_destroy(object()); + wp_color_management_surface_v1_destroy(object()); } void ColorManagementSurface::setImageDescription(ImageDescription *descr) { if (descr) - xx_color_management_surface_v4_set_image_description(object(), descr->object(), QtWayland::xx_color_manager_v4::render_intent::render_intent_perceptual); + wp_color_management_surface_v1_set_image_description(object(), descr->object(), QtWayland::wp_color_manager_v1::render_intent::render_intent_perceptual); else - xx_color_management_surface_v4_unset_image_description(object()); + wp_color_management_surface_v1_unset_image_description(object()); } } diff --git a/src/plugins/platforms/wayland/qwaylandcolormanagement_p.h b/src/plugins/platforms/wayland/qwaylandcolormanagement_p.h index 8e44bd66b7b..04c3962ff8d 100644 --- a/src/plugins/platforms/wayland/qwaylandcolormanagement_p.h +++ b/src/plugins/platforms/wayland/qwaylandcolormanagement_p.h @@ -20,7 +20,7 @@ #include <QColorSpace> #include <QList> -#include "qwayland-xx-color-management-v4.h" +#include "qwayland-color-management-v1.h" QT_BEGIN_NAMESPACE @@ -28,7 +28,7 @@ namespace QtWaylandClient { class ImageDescription; -class ColorManager : public QObject, public QtWayland::xx_color_manager_v4 +class ColorManager : public QObject, public QtWayland::wp_color_manager_v1 { Q_OBJECT public: @@ -48,22 +48,22 @@ public: ~ColorManager() override; Features supportedFeatures() const; - bool supportsNamedPrimary(QtWayland::xx_color_manager_v4::primaries primaries) const; - bool supportsTransferFunction(QtWayland::xx_color_manager_v4::transfer_function transferFunction) const; + bool supportsNamedPrimary(QtWayland::wp_color_manager_v1::primaries primaries) const; + bool supportsTransferFunction(QtWayland::wp_color_manager_v1::transfer_function transferFunction) const; std::unique_ptr<ImageDescription> createImageDescription(const QColorSpace &colorspace); private: - void xx_color_manager_v4_supported_feature(uint32_t feature) override; - void xx_color_manager_v4_supported_primaries_named(uint32_t primaries) override; - void xx_color_manager_v4_supported_tf_named(uint32_t transferFunction) override; + void wp_color_manager_v1_supported_feature(uint32_t feature) override; + void wp_color_manager_v1_supported_primaries_named(uint32_t primaries) override; + void wp_color_manager_v1_supported_tf_named(uint32_t transferFunction) override; Features mFeatures; - QList<QtWayland::xx_color_manager_v4::primaries> mPrimaries; - QList<QtWayland::xx_color_manager_v4::transfer_function> mTransferFunctions; + QList<QtWayland::wp_color_manager_v1::primaries> mPrimaries; + QList<QtWayland::wp_color_manager_v1::transfer_function> mTransferFunctions; }; -class ImageDescriptionInfo : public QObject, public QtWayland::xx_image_description_info_v4 +class ImageDescriptionInfo : public QObject, public QtWayland::wp_image_description_info_v1 { Q_OBJECT public: @@ -88,34 +88,34 @@ public: double mTargetMaxLuminance; private: - void xx_image_description_info_v4_done() override; - void xx_image_description_info_v4_icc_file(int32_t icc, uint32_t icc_size) override; - void xx_image_description_info_v4_primaries(int32_t r_x, int32_t r_y, int32_t g_x, int32_t g_y, int32_t b_x, int32_t b_y, int32_t w_x, int32_t w_y) override; - void xx_image_description_info_v4_tf_named(uint32_t transferFunction) override; - void xx_image_description_info_v4_luminances(uint32_t min_lum, uint32_t max_lum, uint32_t reference_lum) override; - void xx_image_description_info_v4_target_primaries(int32_t r_x, int32_t r_y, int32_t g_x, int32_t g_y, int32_t b_x, int32_t b_y, int32_t w_x, int32_t w_y) override; - void xx_image_description_info_v4_target_luminance(uint32_t min_lum, uint32_t max_lum) override; + void wp_image_description_info_v1_done() override; + void wp_image_description_info_v1_icc_file(int32_t icc, uint32_t icc_size) override; + void wp_image_description_info_v1_primaries(int32_t r_x, int32_t r_y, int32_t g_x, int32_t g_y, int32_t b_x, int32_t b_y, int32_t w_x, int32_t w_y) override; + void wp_image_description_info_v1_tf_named(uint32_t transferFunction) override; + void wp_image_description_info_v1_luminances(uint32_t min_lum, uint32_t max_lum, uint32_t reference_lum) override; + void wp_image_description_info_v1_target_primaries(int32_t r_x, int32_t r_y, int32_t g_x, int32_t g_y, int32_t b_x, int32_t b_y, int32_t w_x, int32_t w_y) override; + void wp_image_description_info_v1_target_luminance(uint32_t min_lum, uint32_t max_lum) override; }; -class ImageDescription : public QObject, public QtWayland::xx_image_description_v4 +class ImageDescription : public QObject, public QtWayland::wp_image_description_v1 { Q_OBJECT public: - explicit ImageDescription(::xx_image_description_v4 *descr); + explicit ImageDescription(::wp_image_description_v1 *descr); ~ImageDescription(); Q_SIGNAL void ready(); private: - void xx_image_description_v4_failed(uint32_t cause, const QString &msg) override; - void xx_image_description_v4_ready(uint32_t identity) override; + void wp_image_description_v1_failed(uint32_t cause, const QString &msg) override; + void wp_image_description_v1_ready(uint32_t identity) override; }; -class ColorManagementFeedback : public QObject, public QtWayland::xx_color_management_feedback_surface_v4 +class ColorManagementFeedback : public QObject, public QtWayland::wp_color_management_surface_feedback_v1 { Q_OBJECT public: - explicit ColorManagementFeedback(::xx_color_management_feedback_surface_v4 *obj); + explicit ColorManagementFeedback(::wp_color_management_surface_feedback_v1 *obj); ~ColorManagementFeedback(); Q_SIGNAL void preferredChanged(); @@ -123,7 +123,7 @@ public: std::unique_ptr<ImageDescriptionInfo> mPreferredInfo; private: - void xx_color_management_feedback_surface_v4_preferred_changed() override; + void wp_color_management_surface_feedback_v1_preferred_changed(uint32_t identity) override; void handlePreferredDone(); std::unique_ptr<ImageDescription> mPreferred; @@ -131,11 +131,11 @@ private: }; -class ColorManagementSurface : public QObject, public QtWayland::xx_color_management_surface_v4 +class ColorManagementSurface : public QObject, public QtWayland::wp_color_management_surface_v1 { Q_OBJECT public: - explicit ColorManagementSurface(::xx_color_management_surface_v4 *obj); + explicit ColorManagementSurface(::wp_color_management_surface_v1 *obj); ~ColorManagementSurface(); void setImageDescription(ImageDescription *descr); diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.cpp b/src/plugins/platforms/wayland/qwaylanddisplay.cpp index 10bc2d5bfa2..1fc5e5c30a0 100644 --- a/src/plugins/platforms/wayland/qwaylanddisplay.cpp +++ b/src/plugins/platforms/wayland/qwaylanddisplay.cpp @@ -485,9 +485,13 @@ void QWaylandDisplay::reconnect() connect( this, &QWaylandDisplay::connected, this, - [&allPlatformWindows] { + [this, &allPlatformWindows] { for (auto &window : std::as_const(allPlatformWindows)) { - window->initializeWlSurface(); + window->initializeWlSurface(false); + } + forceRoundTrip(); // we need a roundtrip to receive the color space features the compositor supports + for (auto &window : std::as_const(allPlatformWindows)) { + window->initializeColorSpace(); } }, Qt::SingleShotConnection); @@ -797,10 +801,8 @@ void QWaylandDisplay::registry_global(uint32_t id, const QString &interface, uin inputDevice->setDataControlDevice(mGlobals.dataControlManager->createDevice(inputDevice)); } #endif - } else if (interface == QLatin1String(QtWayland::xx_color_manager_v4::interface()->name)) { + } else if (interface == QLatin1String(QtWayland::wp_color_manager_v1::interface()->name)) { mGlobals.colorManager = std::make_unique<ColorManager>(registry, id, 1); - // we need a roundtrip to receive the features the compositor supports - forceRoundTrip(); } else if (interface == QLatin1String(QtWayland::wp_pointer_warp_v1::interface()->name)) { mGlobals.pointerWarp.reset(new WithDestructor<QtWayland::wp_pointer_warp_v1, wp_pointer_warp_v1_destroy>( registry, id, 1)); diff --git a/src/plugins/platforms/wayland/qwaylandshmbackingstore.cpp b/src/plugins/platforms/wayland/qwaylandshmbackingstore.cpp index b853db21529..fa70b53cbd0 100644 --- a/src/plugins/platforms/wayland/qwaylandshmbackingstore.cpp +++ b/src/plugins/platforms/wayland/qwaylandshmbackingstore.cpp @@ -229,7 +229,7 @@ void QWaylandShmBackingStore::endPaint() // Inspired by QCALayerBackingStore. bool QWaylandShmBackingStore::scroll(const QRegion ®ion, int dx, int dy) { - if (Q_UNLIKELY(!mBackBuffer || !mFrontBuffer)) + if (Q_UNLIKELY(!mBackBuffer)) return false; const qreal devicePixelRatio = waylandWindow()->scale(); @@ -241,6 +241,8 @@ bool QWaylandShmBackingStore::scroll(const QRegion ®ion, int dx, int dy) return false; recreateBackBufferIfNeeded(); + if (!mFrontBuffer) + return false; const QPoint scrollDelta(dx, dy); const QMargins margins = windowDecorationMargins(); diff --git a/src/plugins/platforms/wayland/qwaylandwindow.cpp b/src/plugins/platforms/wayland/qwaylandwindow.cpp index be527b08f4d..0be22ff80e7 100644 --- a/src/plugins/platforms/wayland/qwaylandwindow.cpp +++ b/src/plugins/platforms/wayland/qwaylandwindow.cpp @@ -62,6 +62,7 @@ QWaylandWindow::QWaylandWindow(QWindow *window, QWaylandDisplay *display) mFrameCallbackTimeout = frameCallbackTimeout; } + mSurfaceFormat.setColorSpace(QColorSpace{}); initializeWlSurface(); mFlags = window->flags(); @@ -214,7 +215,7 @@ void QWaylandWindow::setPendingImageDescription() mColorManagementSurface->setImageDescription(mPendingImageDescription.get()); } -void QWaylandWindow::initializeWlSurface() +void QWaylandWindow::initializeWlSurface(bool colorSpace) { Q_ASSERT(!mSurface); { @@ -242,6 +243,13 @@ void QWaylandWindow::initializeWlSurface() mViewport.reset(new QWaylandViewport(display()->createViewport(this))); } + if (colorSpace) { + initializeColorSpace(); + } +} + +void QWaylandWindow::initializeColorSpace() +{ QColorSpace requestedColorSpace = window()->requestedFormat().colorSpace(); if (requestedColorSpace != QColorSpace{} && mDisplay->colorManager()) { // TODO try a similar (same primaries + supported transfer function) color space if this fails? diff --git a/src/plugins/platforms/wayland/qwaylandwindow_p.h b/src/plugins/platforms/wayland/qwaylandwindow_p.h index d6b24d0569f..9e1bd92af30 100644 --- a/src/plugins/platforms/wayland/qwaylandwindow_p.h +++ b/src/plugins/platforms/wayland/qwaylandwindow_p.h @@ -247,7 +247,9 @@ public: virtual void reinit(); void reset(); - void initializeWlSurface(); + void initializeWlSurface(bool colorSpace = true); + + void initializeColorSpace(); bool windowEvent(QEvent *event) override; diff --git a/src/plugins/platforms/windows/qwindowscontext.cpp b/src/plugins/platforms/windows/qwindowscontext.cpp index 1c3a3909bc2..15ab167c83f 100644 --- a/src/plugins/platforms/windows/qwindowscontext.cpp +++ b/src/plugins/platforms/windows/qwindowscontext.cpp @@ -179,9 +179,6 @@ QWindowsContextPrivate::QWindowsContextPrivate() QWindowsContext::QWindowsContext() : d(new QWindowsContextPrivate) { -#ifdef Q_CC_MSVC -# pragma warning( disable : 4996 ) -#endif m_instance = this; } |
