[test/xdgtest] Create/destroy popup on click
Summary: This allows a dev to move the window before creating the popup which is extremely useful in testing constraints. Also makes it very easy to mod this code into a grabbing popup for other tests. This patch also improve the painted surfaces to show the anchor rect around where we place the popup which is easier for visual debugging. No library code changes Test Plan: Ran the test KWin doesn't position the popup according to all constraints Soon will Reviewers: #kwin, zzag Reviewed By: #kwin, zzag Subscribers: zzag, kde-frameworks-devel Tags: #frameworks Differential Revision: https://phabricator.kde.org/D16294
This commit is contained in:
parent
4bbc085e0e
commit
1955e15afa
1 changed files with 55 additions and 12 deletions
|
@ -26,10 +26,13 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
|||
#include "../src/client/shm_pool.h"
|
||||
#include "../src/client/surface.h"
|
||||
#include "../src/client/xdgshell.h"
|
||||
#include "../src/client/pointer.h"
|
||||
#include "../src/client/seat.h"
|
||||
// Qt
|
||||
#include <QGuiApplication>
|
||||
#include <QImage>
|
||||
#include <QThread>
|
||||
#include <QPainter>
|
||||
|
||||
using namespace KWayland::Client;
|
||||
|
||||
|
@ -44,6 +47,7 @@ public:
|
|||
|
||||
private:
|
||||
void setupRegistry(Registry *registry);
|
||||
void createPopup();
|
||||
void render();
|
||||
void renderPopup();
|
||||
QThread *m_connectionThread;
|
||||
|
@ -119,28 +123,69 @@ void XdgTest::setupRegistry(Registry *registry)
|
|||
Q_ASSERT(m_xdgShellSurface);
|
||||
connect(m_xdgShellSurface, &XdgShellSurface::sizeChanged, this, &XdgTest::render);
|
||||
render();
|
||||
|
||||
//create popup
|
||||
m_popupSurface = m_compositor->createSurface(this);
|
||||
|
||||
XdgPositioner positioner(QSize(50,50), QRect(100,100, 20, 20));
|
||||
m_xdgShellPopup = m_xdgShell->createPopup(m_popupSurface, m_xdgShellSurface, positioner, this);
|
||||
renderPopup();
|
||||
}
|
||||
);
|
||||
connect(registry, &Registry::seatAnnounced, this,
|
||||
[this, registry](quint32 name) {
|
||||
Seat *s = registry->createSeat(name, 2, this);
|
||||
connect(s, &Seat::hasPointerChanged, this,
|
||||
[this, s](bool has) {
|
||||
if (!has) {
|
||||
return;
|
||||
}
|
||||
Pointer *p = s->createPointer(this);
|
||||
connect(p, &Pointer::buttonStateChanged, this,
|
||||
[this](quint32 serial, quint32 time, quint32 button, Pointer::ButtonState state) {
|
||||
Q_UNUSED(button)
|
||||
Q_UNUSED(serial)
|
||||
Q_UNUSED(time)
|
||||
if (state == Pointer::ButtonState::Released) {
|
||||
if (m_popupSurface) {
|
||||
m_popupSurface->deleteLater();
|
||||
m_popupSurface = nullptr;
|
||||
} else {
|
||||
createPopup();
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
registry->setEventQueue(m_eventQueue);
|
||||
registry->create(m_connectionThreadObject);
|
||||
registry->setup();
|
||||
}
|
||||
|
||||
void XdgTest::createPopup()
|
||||
{
|
||||
if (m_popupSurface) {
|
||||
m_popupSurface->deleteLater();
|
||||
}
|
||||
|
||||
m_popupSurface = m_compositor->createSurface(this);
|
||||
|
||||
XdgPositioner positioner(QSize(200,200), QRect(50, 50, 400, 400));
|
||||
positioner.setAnchorEdge(Qt::BottomEdge | Qt::RightEdge);
|
||||
positioner.setGravity(Qt::BottomEdge);
|
||||
positioner.setConstraints(XdgPositioner::Constraint::FlipX | XdgPositioner::Constraint::SlideY);
|
||||
m_xdgShellPopup = m_xdgShell->createPopup(m_popupSurface, m_xdgShellSurface, positioner, m_popupSurface);
|
||||
renderPopup();
|
||||
}
|
||||
|
||||
void XdgTest::render()
|
||||
{
|
||||
const QSize &size = m_xdgShellSurface->size().isValid() ? m_xdgShellSurface->size() : QSize(300, 200);
|
||||
const QSize &size = m_xdgShellSurface->size().isValid() ? m_xdgShellSurface->size() : QSize(500, 500);
|
||||
auto buffer = m_shm->getBuffer(size, size.width() * 4).toStrongRef();
|
||||
buffer->setUsed(true);
|
||||
QImage image(buffer->address(), size.width(), size.height(), QImage::Format_ARGB32_Premultiplied);
|
||||
image.fill(QColor(255, 255, 255, 128));
|
||||
image.fill(QColor(255, 255, 255, 255));
|
||||
//draw a red rectangle indicating the anchor of the top level
|
||||
QPainter painter(&image);
|
||||
painter.setBrush(Qt::red);
|
||||
painter.setPen(Qt::black);
|
||||
painter.drawRect(50, 50, 400, 400);
|
||||
|
||||
m_surface->attachBuffer(*buffer);
|
||||
m_surface->damage(QRect(QPoint(0, 0), size));
|
||||
|
@ -154,7 +199,7 @@ void XdgTest::renderPopup()
|
|||
auto buffer = m_shm->getBuffer(size, size.width() * 4).toStrongRef();
|
||||
buffer->setUsed(true);
|
||||
QImage image(buffer->address(), size.width(), size.height(), QImage::Format_ARGB32_Premultiplied);
|
||||
image.fill(QColor(255, 0, 0, 255));
|
||||
image.fill(QColor(0, 0, 255, 255));
|
||||
|
||||
m_popupSurface->attachBuffer(*buffer);
|
||||
m_popupSurface->damage(QRect(QPoint(0, 0), size));
|
||||
|
@ -162,8 +207,6 @@ void XdgTest::renderPopup()
|
|||
buffer->setUsed(false);
|
||||
}
|
||||
|
||||
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
QCoreApplication app(argc, argv);
|
||||
|
|
Loading…
Reference in a new issue