| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
| |
Change-Id: I809b68b9499de665276636b5a2c14300401e0ae9
Reviewed-by: Vlad Zahorodnii <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The flushWindowSystemEvents() call in flushRequests() was added
in commit 84f1360289a to preserve event order when we had mixed
synchronous and asynchronous expose events. That issue has been
resolved in Qt 6.10 when we were able to make all expose calls synchronous, rendering this unneeded.
Reverts 6ff771b86f7b961a5ff63f148cf69ecb3415dd95
Pick-to: 6.10
Fixes: QTBUG-139425
Fixes: QTBUG-141938
Change-Id: Idcf3dbc54dc9c3e37cdc586f9f872338e63f4f0d
Reviewed-by: David Edmundson <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Following qtbase/1c8884fc277c5916a420a3c14de68547a391f9fc's making
syncqt error out when an installable header contains #pragma once, we
can now flip the coin and use #pragma once as a static assertion that
the given header is not going to be installed, making it easier to
understand which headers are "public", which ones are "private" and
which ones are "neither, since never installed".
Do this for the Wayland platform support files, like
91f9ba2993a2652bcb349ce639aff67b5bfc8938 did for XCB.
Since these headers are neither public nor private, also remove "We
mean it" comments, where they existed.
Had to exclude the QtWlShellIntegration headers, because, for some
unknown reason, we install headers from the plugins/ subdir.
Pick-to: 6.10
Change-Id: I92f336f79d23134e96cbac13088dbd352e2d3a84
Reviewed-by: David Redondo <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Harmless, because QT_END_NAMESPACE is also just '}', but
eyebrow-raising, so fix.
Amends:
- d8e37e4b03f9c786e1cb3dda80b050f05f974752
- 3bf9a581ee13cac988cdfadc7f22d472c1562214
- c2f156e27bf8865dc12108e1aba7cc78bd0dba38
- 6482bf50754e36a89e157ce94096be05b108db75
Pick-to: 6.10
Change-Id: Id59044023bfaf75ddc2bff024439f3d4a20d0936
Reviewed-by: David Redondo <[email protected]>
|
| |
|
|
|
|
|
|
|
|
| |
Harmless, but ... eyebrow-raising.
Amends 58e68f1981d0ba0a80e373dd5ca78a9260824c36.
Pick-to: 6.10
Change-Id: Id5754a772c1e3244a88294390c98604bfe07f0ad
Reviewed-by: David Redondo <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
This reverts commit 97c891edd1dd0fda8d90ddea6da4d499f373a069.
QTBUG-141475 is just a case using the client controlled enable/disable.
Current implemention still has issues. So, another patch will fix the
problem.
Reopens: QTBUG-141475
Pick-to: 6.10
Change-Id: I23e5a3a6afa8fc2e1dc88296a585e1c33e045243
Reviewed-by: David Redondo <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
QDoc warns about documented functions in undocumented classes; Fixes
qwaylandshellsurface.cpp:89: [QtWaylandClient] (qdoc) warning:
No output generated for function 'QtWaylandClient::
QWaylandShellSurface::commitSurfaceRole()' because
'QWaylandShellSurface' is undocumented
qwaylandwindow.cpp:920: [QtWaylandClient] (qdoc) warning: No output
generated for function 'QtWaylandClient::QWaylandWindow::
surfaceSize()' because 'QWaylandWindow' is undocumented
qwaylandwindow.cpp:941: [QtWaylandClient] (qdoc) warning: No output
generated for function 'QtWaylandClient::QWaylandWindow::
windowContentGeometry()' because 'QWaylandWindow' is
undocumented
qwaylandwindow.cpp:951: [QtWaylandClient] (qdoc) warning: No output
generated for function 'QtWaylandClient::QWaylandWindow::
mapFromWlSurface()' because 'QWaylandWindow' is undocumented
Task-number: QTBUG-141665
Change-Id: Ia0d6201783eaebcb356f4efd8d48eb42077e3b2a
Reviewed-by: David Edmundson <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
| |
The OffscreenSurface platform integration capability was added in change
637918. This patch was detached from that commit to simplify
backporting.
Task-number: QTBUG-131107
Change-Id: Ic0561fb5f36514275f90e34486b90478dee02022
Reviewed-by: Artem Dyomin <[email protected]>
Reviewed-by: David Redondo <[email protected]>
|
| |
|
|
|
|
|
|
|
|
| |
Replace xx-color-management-v4 with color-management-v1.
[ChangeLog][Third-Party Code] New protocol synced from wayland-protocols
Pick-to: 6.10
Change-Id: Ib8b6c4f491ff664a41e46ce25833cd7d956f19fd
Reviewed-by: David Edmundson <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
Fixes a crash when monitor is unplugged while scrolling.
recreateBackBufferIfNeeded() calls getBuffer() which may set
mFrontBuffer to nullptr.
Amends: 6f25f703fd37a900c139e14a33a4639502bfeae7
Task-number: QTBUG-139231
Change-Id: Ia5bedce2a3f6580c722f73446de81a26d40ea2f4
Reviewed-by: David Edmundson <[email protected]>
|
| |
|
|
|
|
| |
Task-number: QTBUG-140629
Change-Id: I358e07ac2a92128c8c99afdd300e737cc14e9f8d
Reviewed-by: Topi Reiniö <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
| |
Amends c57da9bb0a2d475b72024997657e250d171dcbaa (which is a5ed02659fc78a8f85bac314baf007bfaf30c6f3 in qtwayland)
setFocusObject should disable the current surface.
Fixes: QTBUG-141475
Pick-to: 6.10
Change-Id: Id5ff55829cad9b8c6c914331d86a1ac4f8fe55ae
Reviewed-by: Liang Qi <[email protected]>
|
| |
|
|
|
|
|
|
|
| |
The fix for QTBUG-115101 went in by now, and we can remove the
work-around that was added as temporary measure.
Task-number: QTBUG-115101
Change-Id: Idcd5d7d4bd3456083cc5419fc56c0e26ad8d52ee
Reviewed-by: David Redondo <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
That serial is not suitable for anything useful. It cannot be used for
interactive move/resize, setting a selection, or any other requests.
It is also not suitable for event ordering. Qt doesn't use these serials
itself, they are mostly useful for communicating back to the compositor.
The serials in wl_keyboard.leave events are already ignored. So it also
improves code consistency.
Change-Id: Ieb684c369ae665c4aeb08a6dc4be31206e0b6ed0
Reviewed-by: David Edmundson <[email protected]>
|
| |
|
|
|
|
|
|
|
| |
The file already includes <QtWaylandClient/private/qwaylandshmbackingstore_p.h>,
so the local include "qwaylandshmbackingstore_p.h" was redundant and has been
removed to avoid duplicate inclusion.
Change-Id: If3596e233ed90c2a04c736cb93056aa58dfd34e1
Reviewed-by: David Redondo <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
On Wayland applications do not know their own window positions, this
means that popups cannot stay on screen by themselves. When a window
tries to go offscreen the way the window is adjusted is
context-specific:
- The first menu will be kept on screen by moving the x position until
it all fits.
- A submenu is too close to the screen edge, the menu will open on the
opposite side of the parent menu to avoid obscuring it.
- A combo box drop downs will vertically flip to the other side of the
originating combobox.
The Wayland API requires the application to provide semantic hints about
the area in which the popup should be placed, along with hints about in
which direction we should try to place the popup and how to handle being
constrained.
At a QPA level we don't know the location of individual widgets so this
needs forwarding explicitly. Rather than exposing all possible
positioning information, it is inferred from the window type at a QPA
level, this required extending windowType to have more explicit values.
Ideally this needs to be application-facing API as there are third-party
comboboxes, but for now it is private with Qt's default controls opting
into it.
Task-number: QTBUG-99618
Task-number: QTBUG-124810
Fixes: QTBUG-135883
Change-Id: I49a2f18d1bfe1b755f259627722e076d58c13e8f
Reviewed-by: David Redondo <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
As discussed in the mailing list, Qt applications generally expect top
level windows to be decorated by the windowing system - unless
explicitly requested by the developer by marking a window as frameless.
Furthermore, Qt's client side decorations for Wayland were only really
intended as a fallback.
However until now the Wayland xdg-shell integration conveyed to the
compositor (if it supports decorations negotiations) that it didn't
care whose responsibility it was to draw window decorations. This did
not matter under KWin, which resolves such cases in favor of SSDs - but
does matter under other SSD-capable compositors like cosmic-comp (which
considers SSDs to be the fallback option).
This changes the xdg-shell integration code to be explicit about
requesting SSDs.
[ChangeLog][QtWaylandClient][Important Behavior Changes] The Wayland
XDG shell integration now requests server side decorations with
compositors supporting the zxdg_decoration_manager_v1 protocol.
Change-Id: Ia025b1f6ff17248a5710f981a0cecd90c47b6cd8
Reviewed-by: David Edmundson <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
In the path to handle subsurfaces that are painted as part of another
window, QWaylandShmBacking store may create temporary buffers for the
subsurface window.
This buffer has it's own lifespan managed by autodeletion from the
compositor not from the backing store. As it can outlive the
QWaylandShmBackingStore it should not share the same event queue as
having an object outlive the event queue can be problematic. As we
create a new buffer every time the custom event queue is not needed
here.
Amends: a0161a2b783c1cbea8f1faaa6fe9f14160515900
Pick-to: 6.10
Change-Id: I7815cf8c9fc539e739499a9e637b1e52cb9c92f3
Reviewed-by: Vlad Zahorodnii <[email protected]>
|
| |
|
|
|
|
|
|
|
| |
doneCurrent will unset m_currentWindow, we should cache the value for
future usage in the method to call endFrame.
Amends: d771acf96e8d48c4c48c4beb16caffbd8875b53c
Change-Id: Ia12e7a87808523f45f2e3d7e1f2208b3c590915d
Reviewed-by: David Redondo <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
When window decoration negotiation takes place such that it results in
the zxdg_toplevel_decoration_v1.configure event telling that the client
should do CSDs coming slightly before or together with the first
xdg_toplevel.configure event - the decorations are created during the
handling of the latter. But that processing relies on geometry data
from before creation of the decorations, which is stale.
Handle this by moving the call to QWaylandWindow::windowContentGeometry
to be after the call to handleWindowStatesChanged, since the latter can
cause changes to the gemoetry of the window.
Fixes: QTBUG-140847
Pick-to: 6.10
Change-Id: I5157f7d7f2fd4f45aaf7c8209cded565bd7cd21e
Reviewed-by: Ilya Fedin <[email protected]>
Reviewed-by: David Edmundson <[email protected]>
|
| |
|
|
|
|
|
| |
Task-number: QTBUG-115841
Change-Id: Ib623fa71a90b0f250dbbe6e3e004a955bac65c86
Reviewed-by: David Edmundson <[email protected]>
Reviewed-by: David Redondo <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
QWaylandSHMWindow needs to react to decorations being created to adjust
the surface format.
Rather than guessing when the decoration is created based on the window
flags changing, introduce an explicit hook on the main window class.
Ammends 12e55c95b23c766f9b968597fcf651173e78944c.
Fixes: QTBUG-136110
Pick-to: 6.10
Change-Id: If8009444801bc92ebdf8a8ecb1cf9fbadb549532
Reviewed-by: Eskil Abrahamsen Blomfeldt <[email protected]>
Reviewed-by: Liang Qi <[email protected]>
(cherry picked from commit 5a8637e4516bc48a0b3f4b5ec3b18618b92e7222)
Reviewed-by: Qt Cherry-pick Bot <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
We have to deliver the scroll end event in order with other scroll
events, so move scroll end event logic into flushScrollEvent().
Track the target scroll window on scroll begin and check whether we
have a target window to prevent a crash.
Also we can't clear the scroll delta when scroll end event arrives,
because the event compression relies on this value.
Use scoped pointer for frame event to simplify code and make sure it's
deleted in destructor.
Amends 095759818854e5a011aa8f859e566bbc6368ab76
Updates 789681872fb62450fc78d1a06472a40d970a8d57
Change-Id: Ifb149c8fde1286b60439be0dab16b1df65279ea8
Reviewed-by: David Edmundson <[email protected]>
|
| |
|
|
|
|
|
|
|
| |
Qt::WindowType::Desktop is no longer a valid window type in Qt6.
Remove its occurence in QWaylandWindow..
Task-number: QTBUG-140514
Change-Id: I2f1fa6672594fa2a18c616b3f3e5c2258b3217e9
Reviewed-by: David Redondo <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
As well as creating a pbuffer, we need to change our activation
handling. For offscreen surfaces we can use the default implementations
directly, this matches XCB's EGL implementation.
Whilst using an offscreen surface m_currentWindow is set to null
requiring us to change guards used there.
amends dbcc76b1326b7c6fded3eec5ae23ea08d53186e9
Change-Id: I3fd3d97f2aab75a0b34083f62af13d4b40d7fb12
Reviewed-by: Vlad Zahorodnii <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
We need to use device coordinates to copy
the correct region, not logical window size.
Also paint the subsurface with scaling and
not scale down.
Use the passed offset instead of window
position, sometimes they dont match.
Pick-to: 6.10
Change-Id: I2019dd093bdfb6eb225845606509820523f10034
Reviewed-by: David Redondo <[email protected]>
|
| |
|
|
|
|
|
|
| |
Using QEGLPbuffer.
Change-Id: I44c10c6caf2364cfa2cf99650383f8e90e476f12
Reviewed-by: David Edmundson <[email protected]>
Reviewed-by: Vlad Zahorodnii <[email protected]>
|
| |
|
|
|
|
|
|
|
| |
This implements wl_keyboard key repeat events.
[ChangeLog][Third-Party Code] Update wayland.xml to 1.24.0.
Change-Id: I21fc247bd95485e3c7189c47cb0cc999c431587f
Reviewed-by: David Edmundson <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
AutoMoc: src/plugins/platforms/wayland/qwaylandwindowmanagerintegration_p.h:
note: No relevant classes found. No output generated.
The class doesn't inherit from QObject, and so doesn't have any signals
or slots.
Amends 4a57ddd3ba0551a3b144cc53c4b48d9b454e96a0, which is only in 6.10
(this file was copied from qtwayland to qtbase?).
Pick-to: 6.10
Change-Id: I9f702807574072099a96f4057a91e624ddca9c70
Reviewed-by: David Redondo <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
If a GPU hangs or is reset, this flag ensures the application is
notified with a context loss event. This can then be queried by
platforms to make use of Qt's existing reset handling.
This is opt-in by applications based on the ResetNotification flag on
the requested format. If a robust context cannot be created, it falls
back to trying without this flag and the state is reflected in the
retrieved surfaceFormat matching the behavior of GLX.
Pick-to: 6.10
Change-Id: Idd53d275be8842f2d44bcd2b8c077c3ea19ca164
Reviewed-by: Laszlo Agocs <[email protected]>
|
| |
|
|
|
|
|
|
|
|
| |
This amends 7c0a96785fee4fea8ef1452166b1dde88957445c .
Pick-to: 6.10.0 6.10
Fixes: QTBUG-140172
Change-Id: I9bbf14507cfb9208fe9a8637e789d977c5d1a89e
Reviewed-by: David Edmundson <[email protected]>
Reviewed-by: Liang Qi <[email protected]>
|
| |
|
|
|
|
|
|
| |
It is necessary for the apps that want to manually parse the stream of events
from wl_keyborad.
Change-Id: I8229ae6e43640d0e7b9597f5f7b35cba59db0f64
Reviewed-by: David Edmundson <[email protected]>
|
| |
|
|
|
|
|
|
| |
Apparently the done() signal might never arrive, in which case the
tokenProvider would leak. Parent it to the surface to prevent this.
Change-Id: Icc03fc6b60deba9ae4d297fcec38318cb04768d7
Reviewed-by: David Edmundson <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
| |
Add QWaylandEventDispatcher class which holds current QEventLoop flags
and pass them to QWindowSystemInterface::flushWindowSystemEvents().
Amends dbe589453083037a6e4c0a23e6f342cfd9172877
Fixes: QTBUG-139425
Change-Id: I85489ae6f964362b6f388bff7cf735197869732a
Reviewed-by: David Edmundson <[email protected]>
|
| |
|
|
|
|
|
| |
It's the same as getProcAddress() in the QEGLPlatformContext class.
Change-Id: I7b66a953f77bde0bf188718e234ba362e055fe4d
Reviewed-by: David Redondo <[email protected]>
|
| |
|
|
|
|
|
|
|
|
| |
We no longer use this hybrid surface type approach for Qt Widget's
composition mode. Nowadays we use RHI to compose the widget texture
and the native textures, and the window surface type depends on the
RHI API in use, e.g. QSurface::MetalSurface, or QSurface::OpenGLSurface.
Change-Id: I85001100f681a1cf524b8b7dc50f680a9579b447
Reviewed-by: Laszlo Agocs <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
QWindowSystemInterface::handleDrop is dispatched to application code
syncronously, this could perform an operation that cancels the existing
drag.
Also renamed a variable that shadowed a variable in the same method.
Pick-to: 6.10
Fixes: QTBUG-139056
Change-Id: Ia4e016ca124edc9f2f551616f52e1caafdf2f07e
Reviewed-by: Błażej Szczygieł <[email protected]>
Reviewed-by: David Redondo <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
| |
QtGui sends leave event to window under cursor when modal window opens,
so we have to send enter event when modal closes and window has cursor
and gets unblocked.
Task-number: QTBUG-138883
Pick-to: 6.10
Change-Id: I7aeda1d534dbfeb9d480fba7413c942c0332ef5b
Reviewed-by: David Edmundson <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Don't copy the dirty region in "recreateBackBufferIfNeeded()" in
"beginPaint()". Mark this region as non-dirty in the back buffer
and paint. Finalize the back buffer (copy remaining dirty region)
before flushing. This allows to optimize scrolling, we no longer
have to do a redundant dirty area copy.
This matches the "QCALayerBackingStore" logic.
Task-number: QTBUG-139231
Change-Id: I6c19491fa8f093de9c9ce7624d8f9b65b0b722c5
Reviewed-by: Tor Arne Vestbø <[email protected]>
Reviewed-by: David Edmundson <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Replace private QThreadData::get2() API calls with public Qt APIs
to resolve undefined symbol references when building with UBSan.
The issue occurred because QThreadPrivate symbols are not exported
in non-developer builds, causing link failures with UBSan enabled.
This fix maintains the same thread safety validation while using
only public APIs:
Fixes: QTBUG-123404
Change-Id: Ie73ac47246302f133367f2cd7cab5d8f77f0cfcb
Reviewed-by: Anton Kudryavtsev <[email protected]>
Reviewed-by: David Edmundson <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
Undo most Qt::Tool and Qt::Popup overlap, and keep just basic logic of
dealing with transientsParents and positioning.
Amends 4eba0b5305a585e4454e1935bd93b8e1b3b71681
Pick-to: 6.10
Fixes: QTBUG-139250
Change-Id: I0ea4275740f41b54f0604fced86ec828919c3ae7
Reviewed-by: David Edmundson <[email protected]>
|
| |
|
|
|
|
|
|
| |
Pick-to: 6.10
Task-number: QTBUG-138882
Change-Id: Ibf62b158bac96e0b3cc7f09d3cda2f31748b5fb8
Reviewed-by: Tor Arne Vestbø <[email protected]>
Reviewed-by: David Edmundson <[email protected]>
|
| |
|
|
|
|
| |
Pick-to: 6.10
Change-Id: Ia0b971244b71185ced9e024ecaf6f8510f80b62e
Reviewed-by: David Edmundson <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
setMouseCursor was used exclusively for CSDs, we shouldn't be storing it
in the cursor management. Otherwise when the cursor is restored we
restored when we move out of decoration we restore the application set
cursor. We should just apply the cursor directly as it takes precedent.
In addition the handling of unsetting a cursor back to default was not
implemented. We need to unset the application stored cache and always
update the server state.
Updates 555bda173621e18ae15117677ed3f314cee4a6bb
Pick-to: 6.10
Fixes: QTBUG-138542
Change-Id: I6e701471f6b0500e6f301a0c8dcb917b4f4439b1
Reviewed-by: Błażej Szczygieł <[email protected]>
Reviewed-by: David Redondo <[email protected]>
|
| |
|
|
|
|
|
|
|
|
| |
With QT_QTESTLIB_RUNNING, the QWaylandWindow can commit the surface, but
it does not check whether the window is still exposed after sending a
syncrhonous expose event.
Pick-to: 6.10
Change-Id: I02ad9b9961912b760180f38ce3cc437ac9b589fa
Reviewed-by: David Edmundson <[email protected]>
|
| |
|
|
|
|
| |
Pick-to: 6.10
Change-Id: I99831d1d082355ab1272ff1ef30c55021aa3f4d7
Reviewed-by: David Edmundson <[email protected]>
|
| |
|
|
|
|
|
|
| |
Pick-to: 6.10
Task-number: QTBUG-135954
Change-Id: I34d6f07fe674472b000c5ba184f42a372858037d
Reviewed-by: David Edmundson <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
| |
The code is fine in itself, but it's introduced a flakey unit test.
This disables event compression until the other fixes are in.
Amends 095759818854e5a011aa8f859e566bbc6368ab76
Change-Id: If23ca76bc3cc4daf13dcb889bca9ce785afff593
Reviewed-by: Błażej Szczygieł <[email protected]>
Reviewed-by: Vlad Zahorodnii <[email protected]>
|
| |
|
|
|
|
|
| |
Otherwise we might get conflicts with our generated protocol definitions.
Change-Id: If58a3441341553474044631be1bd312afaceeb04
Reviewed-by: Vlad Zahorodnii <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The \generatelist command takes an optional argument
that affect how the members are listed, for example,
`classesbymodule` which creates an annotated list of
the classes in a named C++ module.
`groupsbymodule` is not recognized or documented. QDoc
falls back to generating a list of all members of a
group in this case. While the end result is correct,
this relies on an undocumented feature that is likely
to change and break.
Replace these instances with an explicit \annotatedlist
command that produces the same output.
Pick-to: 6.10
Task-number: QTBUG-138901
Change-Id: I5d83c0e54daa1888beebb77d8391ea607b8464ed
Reviewed-by: Paul Wicking <[email protected]>
|