KWin
Loading...
Searching...
No Matches
dont_crash_useractions_menu.cpp
Go to the documentation of this file.
1/*
2 KWin - the KDE window manager
3 This file is part of the KDE project.
4
5 SPDX-FileCopyrightText: 2017 Martin Flöser <mgraesslin@kde.org>
6
7 SPDX-License-Identifier: GPL-2.0-or-later
8*/
9#include "kwin_wayland_test.h"
10
11#include "core/output.h"
12#include "pointer_input.h"
13#include "useractions.h"
14#include "wayland_server.h"
15#include "window.h"
16#include "workspace.h"
17
18#include <KWayland/Client/compositor.h>
19#include <KWayland/Client/keyboard.h>
20#include <KWayland/Client/pointer.h>
21#include <KWayland/Client/seat.h>
22#include <KWayland/Client/shm_pool.h>
23#include <KWayland/Client/surface.h>
24#include <KWayland/Client/touch.h>
25
26#include <linux/input.h>
27
28using namespace KWin;
29
30static const QString s_socketName = QStringLiteral("wayland_test_kwin_dont_crash_useractions_menu-0");
31
32class TestDontCrashUseractionsMenu : public QObject
33{
34 Q_OBJECT
35private Q_SLOTS:
36 void initTestCase();
37 void init();
38 void cleanup();
39
40 void testShowHideShowUseractionsMenu();
41};
42
43void TestDontCrashUseractionsMenu::initTestCase()
44{
45 qRegisterMetaType<KWin::Window *>();
46 QSignalSpy applicationStartedSpy(kwinApp(), &Application::started);
47 QVERIFY(waylandServer()->init(s_socketName));
49 QRect(0, 0, 1280, 1024),
50 QRect(1280, 0, 1280, 1024),
51 });
52
53 // force style to breeze as that's the one which triggered the crash
54 QVERIFY(kwinApp()->setStyle(QStringLiteral("breeze")));
55
56 kwinApp()->start();
57 QVERIFY(applicationStartedSpy.wait());
58 const auto outputs = workspace()->outputs();
59 QCOMPARE(outputs.count(), 2);
60 QCOMPARE(outputs[0]->geometry(), QRect(0, 0, 1280, 1024));
61 QCOMPARE(outputs[1]->geometry(), QRect(1280, 0, 1280, 1024));
62}
63
64void TestDontCrashUseractionsMenu::init()
65{
67
68 workspace()->setActiveOutput(QPoint(640, 512));
69 KWin::input()->pointer()->warp(QPoint(640, 512));
70}
71
72void TestDontCrashUseractionsMenu::cleanup()
73{
75}
76
77void TestDontCrashUseractionsMenu::testShowHideShowUseractionsMenu()
78{
79 // this test creates the condition of BUG 382063
80 std::unique_ptr<KWayland::Client::Surface> surface1(Test::createSurface());
81 std::unique_ptr<Test::XdgToplevel> shellSurface1(Test::createXdgToplevelSurface(surface1.get()));
82 auto window = Test::renderAndWaitForShown(surface1.get(), QSize(100, 50), Qt::blue);
83 QVERIFY(window);
84
85 workspace()->showWindowMenu(QRect(), window);
86 auto userActionsMenu = workspace()->userActionsMenu();
87 QTRY_VERIFY(userActionsMenu->isShown());
88 QVERIFY(userActionsMenu->hasWindow());
89
90 Test::keyboardKeyPressed(KEY_ESC, 0);
91 Test::keyboardKeyReleased(KEY_ESC, 1);
92 QTRY_VERIFY(!userActionsMenu->isShown());
93 QVERIFY(!userActionsMenu->hasWindow());
94
95 // and show again, this triggers BUG 382063
96 workspace()->showWindowMenu(QRect(), window);
97 QTRY_VERIFY(userActionsMenu->isShown());
98 QVERIFY(userActionsMenu->hasWindow());
99}
100
102#include "dont_crash_useractions_menu.moc"
PointerInputRedirection * pointer() const
Definition input.h:220
void warp(const QPointF &pos)
void showWindowMenu(const QRect &pos, Window *cl)
UserActionsMenu * userActionsMenu() const
Definition workspace.h:310
QList< Output * > outputs() const
Definition workspace.h:762
void setActiveOutput(Output *output)
#define WAYLANDTEST_MAIN(TestObject)
Window * renderAndWaitForShown(KWayland::Client::Surface *surface, const QSize &size, const QColor &color, const QImage::Format &format=QImage::Format_ARGB32, int timeout=5000)
void keyboardKeyReleased(quint32 key, quint32 time)
void destroyWaylandConnection()
void setOutputConfig(const QList< QRect > &geometries)
void keyboardKeyPressed(quint32 key, quint32 time)
bool setupWaylandConnection(AdditionalWaylandInterfaces flags=AdditionalWaylandInterfaces())
QList< KWayland::Client::Output * > outputs
std::unique_ptr< KWayland::Client::Surface > createSurface()
XdgToplevel * createXdgToplevelSurface(KWayland::Client::Surface *surface, QObject *parent=nullptr)
WaylandServer * waylandServer()
Workspace * workspace()
Definition workspace.h:830
InputRedirection * input()
Definition input.h:549