summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/platforms')
-rw-r--r--src/plugins/platforms/cocoa/qcocoamessagedialog.mm5
-rw-r--r--src/plugins/platforms/wasm/qwasmaccessibility.cpp133
-rw-r--r--src/plugins/platforms/wasm/qwasmaccessibility.h9
-rw-r--r--src/plugins/platforms/wayland/CMakeLists.txt2
-rw-r--r--src/plugins/platforms/wayland/global/qwaylandclientextension.cpp5
-rw-r--r--src/plugins/platforms/wayland/qwaylandcolormanagement.cpp115
-rw-r--r--src/plugins/platforms/wayland/qwaylandcolormanagement_p.h52
-rw-r--r--src/plugins/platforms/wayland/qwaylanddisplay.cpp12
-rw-r--r--src/plugins/platforms/wayland/qwaylandshmbackingstore.cpp4
-rw-r--r--src/plugins/platforms/wayland/qwaylandwindow.cpp10
-rw-r--r--src/plugins/platforms/wayland/qwaylandwindow_p.h4
-rw-r--r--src/plugins/platforms/windows/qwindowscontext.cpp3
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 &region, 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 &region, 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;
}