2020-08-02 22:22:19 +00:00
/*
KWin - the KDE window manager
This file is part of the KDE project .
2016-06-02 15:53:44 +00:00
2020-08-02 22:22:19 +00:00
SPDX - FileCopyrightText : 2016 Martin Gräßlin < mgraesslin @ kde . org >
2016-06-02 15:53:44 +00:00
2020-08-02 22:22:19 +00:00
SPDX - License - Identifier : GPL - 2.0 - or - later
*/
2016-06-02 15:53:44 +00:00
# include "kwin_wayland_test.h"
2022-03-23 10:13:38 +00:00
2022-08-29 07:55:49 +00:00
# include "core/output.h"
2022-11-05 10:43:41 +00:00
# include "core/outputbackend.h"
2023-02-09 13:07:56 +00:00
# include "pointer_input.h"
2021-08-25 15:12:50 +00:00
# include "virtualdesktops.h"
2016-06-02 15:53:44 +00:00
# include "wayland_server.h"
2022-04-22 17:39:12 +00:00
# include "window.h"
2016-06-02 15:53:44 +00:00
# include "workspace.h"
# include <KWayland/Client/compositor.h>
2022-03-23 10:13:38 +00:00
# include <KWayland/Client/connection_thread.h>
2016-06-02 15:53:44 +00:00
# include <KWayland/Client/event_queue.h>
# include <KWayland/Client/plasmashell.h>
# include <KWayland/Client/registry.h>
# include <KWayland/Client/shm_pool.h>
# include <KWayland/Client/surface.h>
using namespace KWin ;
2016-09-15 12:17:48 +00:00
Q_DECLARE_METATYPE ( KWin : : Layer )
2016-06-02 15:53:44 +00:00
static const QString s_socketName = QStringLiteral ( " wayland_test_kwin_plasma_surface-0 " ) ;
class PlasmaSurfaceTest : public QObject
{
Q_OBJECT
private Q_SLOTS :
void initTestCase ( ) ;
void init ( ) ;
void cleanup ( ) ;
void testRoleOnAllDesktops_data ( ) ;
void testRoleOnAllDesktops ( ) ;
2016-06-17 06:32:15 +00:00
void testAcceptsFocus_data ( ) ;
void testAcceptsFocus ( ) ;
2016-06-02 15:53:44 +00:00
2016-09-15 19:03:40 +00:00
void testPanelWindowsCanCover_data ( ) ;
void testPanelWindowsCanCover ( ) ;
2016-08-30 11:04:10 +00:00
void testOSDPlacement ( ) ;
2017-10-12 18:33:30 +00:00
void testOSDPlacementManualPosition ( ) ;
2016-09-15 12:17:48 +00:00
void testPanelTypeHasStrut_data ( ) ;
void testPanelTypeHasStrut ( ) ;
2016-10-12 13:09:52 +00:00
void testPanelActivate_data ( ) ;
void testPanelActivate ( ) ;
2016-08-09 11:50:29 +00:00
2016-06-02 15:53:44 +00:00
private :
KWayland : : Client : : Compositor * m_compositor = nullptr ;
2022-04-14 12:27:50 +00:00
KWayland : : Client : : PlasmaShell * m_plasmaShell = nullptr ;
2016-06-02 15:53:44 +00:00
} ;
void PlasmaSurfaceTest : : initTestCase ( )
{
2022-04-22 17:39:12 +00:00
qRegisterMetaType < KWin : : Window * > ( ) ;
2020-07-07 09:32:29 +00:00
QSignalSpy applicationStartedSpy ( kwinApp ( ) , & Application : : started ) ;
2020-12-09 13:06:15 +00:00
QVERIFY ( waylandServer ( ) - > init ( s_socketName ) ) ;
2022-11-16 21:03:50 +00:00
QMetaObject : : invokeMethod ( kwinApp ( ) - > outputBackend ( ) , " setVirtualOutputs " , Qt : : DirectConnection , Q_ARG ( QVector < QRect > , QVector < QRect > ( ) < < QRect ( 0 , 0 , 1280 , 1024 ) ) ) ;
2022-09-16 08:42:55 +00:00
2016-06-02 15:53:44 +00:00
kwinApp ( ) - > start ( ) ;
2020-07-07 09:32:29 +00:00
QVERIFY ( applicationStartedSpy . wait ( ) ) ;
2016-06-02 15:53:44 +00:00
}
void PlasmaSurfaceTest : : init ( )
{
2016-12-03 13:31:14 +00:00
QVERIFY ( Test : : setupWaylandConnection ( Test : : AdditionalWaylandInterface : : PlasmaShell ) ) ;
2016-06-30 11:32:54 +00:00
m_compositor = Test : : waylandCompositor ( ) ;
m_plasmaShell = Test : : waylandPlasmaShell ( ) ;
2016-09-15 19:03:40 +00:00
2023-02-09 13:07:56 +00:00
KWin : : input ( ) - > pointer ( ) - > warp ( QPointF ( 640 , 512 ) ) ;
2016-06-02 15:53:44 +00:00
}
void PlasmaSurfaceTest : : cleanup ( )
{
2016-06-30 11:32:54 +00:00
Test : : destroyWaylandConnection ( ) ;
2016-06-02 15:53:44 +00:00
}
void PlasmaSurfaceTest : : testRoleOnAllDesktops_data ( )
{
2022-04-14 12:27:50 +00:00
QTest : : addColumn < KWayland : : Client : : PlasmaShellSurface : : Role > ( " role " ) ;
2016-06-02 15:53:44 +00:00
QTest : : addColumn < bool > ( " expectedOnAllDesktops " ) ;
2022-04-14 12:27:50 +00:00
QTest : : newRow ( " Desktop " ) < < KWayland : : Client : : PlasmaShellSurface : : Role : : Desktop < < true ;
QTest : : newRow ( " Panel " ) < < KWayland : : Client : : PlasmaShellSurface : : Role : : Panel < < true ;
QTest : : newRow ( " OSD " ) < < KWayland : : Client : : PlasmaShellSurface : : Role : : OnScreenDisplay < < true ;
QTest : : newRow ( " Normal " ) < < KWayland : : Client : : PlasmaShellSurface : : Role : : Normal < < false ;
QTest : : newRow ( " Notification " ) < < KWayland : : Client : : PlasmaShellSurface : : Role : : Notification < < true ;
QTest : : newRow ( " ToolTip " ) < < KWayland : : Client : : PlasmaShellSurface : : Role : : ToolTip < < true ;
QTest : : newRow ( " CriticalNotification " ) < < KWayland : : Client : : PlasmaShellSurface : : Role : : CriticalNotification < < true ;
2022-05-27 21:49:37 +00:00
QTest : : newRow ( " AppletPopup " ) < < KWayland : : Client : : PlasmaShellSurface : : Role : : AppletPopup < < true ;
2016-06-02 15:53:44 +00:00
}
void PlasmaSurfaceTest : : testRoleOnAllDesktops ( )
{
2019-08-30 21:36:58 +00:00
// this test verifies that a XdgShellClient is set on all desktops when the role changes
2022-08-01 21:29:02 +00:00
std : : unique_ptr < KWayland : : Client : : Surface > surface ( Test : : createSurface ( ) ) ;
QVERIFY ( surface ! = nullptr ) ;
std : : unique_ptr < Test : : XdgToplevel > shellSurface ( Test : : createXdgToplevelSurface ( surface . get ( ) ) ) ;
QVERIFY ( shellSurface ! = nullptr ) ;
std : : unique_ptr < KWayland : : Client : : PlasmaShellSurface > plasmaSurface ( m_plasmaShell - > createSurface ( surface . get ( ) ) ) ;
QVERIFY ( plasmaSurface ! = nullptr ) ;
2016-06-02 15:53:44 +00:00
// now render to map the window
2022-08-01 21:29:02 +00:00
Window * window = Test : : renderAndWaitForShown ( surface . get ( ) , QSize ( 100 , 50 ) , Qt : : blue ) ;
2022-04-23 19:51:16 +00:00
QVERIFY ( window ) ;
QCOMPARE ( workspace ( ) - > activeWindow ( ) , window ) ;
2016-06-02 15:53:44 +00:00
// currently the role is not yet set, so the window should not be on all desktops
2022-04-23 19:51:16 +00:00
QCOMPARE ( window - > isOnAllDesktops ( ) , false ) ;
2016-06-02 15:53:44 +00:00
// now let's try to change that
2023-02-24 15:28:56 +00:00
QSignalSpy onAllDesktopsSpy ( window , & Window : : desktopsChanged ) ;
2022-04-14 12:27:50 +00:00
QFETCH ( KWayland : : Client : : PlasmaShellSurface : : Role , role ) ;
2016-06-02 15:53:44 +00:00
plasmaSurface - > setRole ( role ) ;
QFETCH ( bool , expectedOnAllDesktops ) ;
QCOMPARE ( onAllDesktopsSpy . wait ( ) , expectedOnAllDesktops ) ;
2022-04-23 19:51:16 +00:00
QCOMPARE ( window - > isOnAllDesktops ( ) , expectedOnAllDesktops ) ;
2016-06-02 15:53:44 +00:00
// let's create a second window where we init a little bit different
// first creating the PlasmaSurface then the Shell Surface
2022-08-01 21:29:02 +00:00
std : : unique_ptr < KWayland : : Client : : Surface > surface2 ( Test : : createSurface ( ) ) ;
QVERIFY ( surface2 ! = nullptr ) ;
std : : unique_ptr < KWayland : : Client : : PlasmaShellSurface > plasmaSurface2 ( m_plasmaShell - > createSurface ( surface2 . get ( ) ) ) ;
QVERIFY ( plasmaSurface2 ! = nullptr ) ;
2016-06-02 15:53:44 +00:00
plasmaSurface2 - > setRole ( role ) ;
2022-08-01 21:29:02 +00:00
std : : unique_ptr < Test : : XdgToplevel > shellSurface2 ( Test : : createXdgToplevelSurface ( surface2 . get ( ) ) ) ;
QVERIFY ( shellSurface2 ! = nullptr ) ;
auto c2 = Test : : renderAndWaitForShown ( surface2 . get ( ) , QSize ( 100 , 50 ) , Qt : : blue ) ;
2017-02-07 18:18:18 +00:00
QVERIFY ( c2 ) ;
2022-04-23 19:51:16 +00:00
QVERIFY ( window ! = c2 ) ;
2017-02-07 18:18:18 +00:00
QCOMPARE ( c2 - > isOnAllDesktops ( ) , expectedOnAllDesktops ) ;
2016-06-02 15:53:44 +00:00
}
2016-06-17 06:32:15 +00:00
void PlasmaSurfaceTest : : testAcceptsFocus_data ( )
{
2022-04-14 12:27:50 +00:00
QTest : : addColumn < KWayland : : Client : : PlasmaShellSurface : : Role > ( " role " ) ;
2016-06-17 06:32:15 +00:00
QTest : : addColumn < bool > ( " wantsInput " ) ;
QTest : : addColumn < bool > ( " active " ) ;
2022-04-14 12:27:50 +00:00
QTest : : newRow ( " Desktop " ) < < KWayland : : Client : : PlasmaShellSurface : : Role : : Desktop < < true < < true ;
QTest : : newRow ( " Panel " ) < < KWayland : : Client : : PlasmaShellSurface : : Role : : Panel < < true < < false ;
QTest : : newRow ( " OSD " ) < < KWayland : : Client : : PlasmaShellSurface : : Role : : OnScreenDisplay < < false < < false ;
QTest : : newRow ( " Normal " ) < < KWayland : : Client : : PlasmaShellSurface : : Role : : Normal < < true < < true ;
QTest : : newRow ( " Notification " ) < < KWayland : : Client : : PlasmaShellSurface : : Role : : Notification < < false < < false ;
QTest : : newRow ( " ToolTip " ) < < KWayland : : Client : : PlasmaShellSurface : : Role : : ToolTip < < false < < false ;
QTest : : newRow ( " CriticalNotification " ) < < KWayland : : Client : : PlasmaShellSurface : : Role : : CriticalNotification < < false < < false ;
2022-05-27 21:49:37 +00:00
QTest : : newRow ( " AppletPopup " ) < < KWayland : : Client : : PlasmaShellSurface : : Role : : AppletPopup < < true < < true ;
2016-06-17 06:32:15 +00:00
}
void PlasmaSurfaceTest : : testAcceptsFocus ( )
{
// this test verifies that some surface roles don't get focus
2022-08-01 21:29:02 +00:00
std : : unique_ptr < KWayland : : Client : : Surface > surface ( Test : : createSurface ( ) ) ;
QVERIFY ( surface ! = nullptr ) ;
std : : unique_ptr < Test : : XdgToplevel > shellSurface ( Test : : createXdgToplevelSurface ( surface . get ( ) ) ) ;
QVERIFY ( shellSurface ! = nullptr ) ;
std : : unique_ptr < KWayland : : Client : : PlasmaShellSurface > plasmaSurface ( m_plasmaShell - > createSurface ( surface . get ( ) ) ) ;
QVERIFY ( plasmaSurface ! = nullptr ) ;
2022-04-14 12:27:50 +00:00
QFETCH ( KWayland : : Client : : PlasmaShellSurface : : Role , role ) ;
2016-06-17 06:32:15 +00:00
plasmaSurface - > setRole ( role ) ;
// now render to map the window
2022-08-01 21:29:02 +00:00
auto window = Test : : renderAndWaitForShown ( surface . get ( ) , QSize ( 100 , 50 ) , Qt : : blue ) ;
2016-06-17 06:32:15 +00:00
2022-04-23 19:51:16 +00:00
QVERIFY ( window ) ;
QTEST ( window - > wantsInput ( ) , " wantsInput " ) ;
QTEST ( window - > isActive ( ) , " active " ) ;
2016-06-17 06:32:15 +00:00
}
2016-08-30 11:04:10 +00:00
void PlasmaSurfaceTest : : testOSDPlacement ( )
{
2022-08-01 21:29:02 +00:00
std : : unique_ptr < KWayland : : Client : : Surface > surface ( Test : : createSurface ( ) ) ;
QVERIFY ( surface ! = nullptr ) ;
std : : unique_ptr < Test : : XdgToplevel > shellSurface ( Test : : createXdgToplevelSurface ( surface . get ( ) ) ) ;
QVERIFY ( shellSurface ! = nullptr ) ;
std : : unique_ptr < KWayland : : Client : : PlasmaShellSurface > plasmaSurface ( m_plasmaShell - > createSurface ( surface . get ( ) ) ) ;
QVERIFY ( plasmaSurface ! = nullptr ) ;
2022-04-14 12:27:50 +00:00
plasmaSurface - > setRole ( KWayland : : Client : : PlasmaShellSurface : : Role : : OnScreenDisplay ) ;
2016-08-30 11:04:10 +00:00
// now render and map the window
2022-08-01 21:29:02 +00:00
auto window = Test : : renderAndWaitForShown ( surface . get ( ) , QSize ( 100 , 50 ) , Qt : : blue ) ;
2016-08-30 11:04:10 +00:00
2022-04-23 19:51:16 +00:00
QVERIFY ( window ) ;
QCOMPARE ( window - > windowType ( ) , NET : : OnScreenDisplay ) ;
QVERIFY ( window - > isOnScreenDisplay ( ) ) ;
QCOMPARE ( window - > frameGeometry ( ) , QRect ( 1280 / 2 - 100 / 2 , 2 * 1024 / 3 - 50 / 2 , 100 , 50 ) ) ;
2016-08-30 11:04:10 +00:00
// change the screen size
const QVector < QRect > geometries { QRect ( 0 , 0 , 1280 , 1024 ) , QRect ( 1280 , 0 , 1280 , 1024 ) } ;
2022-11-05 10:43:41 +00:00
QMetaObject : : invokeMethod ( kwinApp ( ) - > outputBackend ( ) , " setVirtualOutputs " ,
2016-08-30 11:04:10 +00:00
Qt : : DirectConnection ,
Q_ARG ( QVector < QRect > , geometries ) ) ;
2022-07-11 10:41:15 +00:00
const auto outputs = workspace ( ) - > outputs ( ) ;
2021-08-31 07:03:05 +00:00
QCOMPARE ( outputs . count ( ) , 2 ) ;
QCOMPARE ( outputs [ 0 ] - > geometry ( ) , geometries [ 0 ] ) ;
QCOMPARE ( outputs [ 1 ] - > geometry ( ) , geometries [ 1 ] ) ;
2016-08-30 11:04:10 +00:00
2022-04-23 19:51:16 +00:00
QCOMPARE ( window - > frameGeometry ( ) , QRect ( 1280 / 2 - 100 / 2 , 2 * 1024 / 3 - 50 / 2 , 100 , 50 ) ) ;
2016-12-18 09:39:04 +00:00
// change size of window
2022-04-23 19:51:16 +00:00
QSignalSpy frameGeometryChangedSpy ( window , & Window : : frameGeometryChanged ) ;
2022-08-01 21:29:02 +00:00
Test : : render ( surface . get ( ) , QSize ( 200 , 100 ) , Qt : : red ) ;
2020-02-05 09:28:50 +00:00
QVERIFY ( frameGeometryChangedSpy . wait ( ) ) ;
2022-04-23 19:51:16 +00:00
QCOMPARE ( window - > frameGeometry ( ) , QRect ( 1280 / 2 - 200 / 2 , 2 * 1024 / 3 - 100 / 2 , 200 , 100 ) ) ;
2016-08-30 11:04:10 +00:00
}
2017-10-12 18:33:30 +00:00
void PlasmaSurfaceTest : : testOSDPlacementManualPosition ( )
{
2022-08-01 21:29:02 +00:00
std : : unique_ptr < KWayland : : Client : : Surface > surface ( Test : : createSurface ( ) ) ;
QVERIFY ( surface ! = nullptr ) ;
std : : unique_ptr < KWayland : : Client : : PlasmaShellSurface > plasmaSurface ( m_plasmaShell - > createSurface ( surface . get ( ) ) ) ;
QVERIFY ( plasmaSurface ! = nullptr ) ;
2022-04-14 12:27:50 +00:00
plasmaSurface - > setRole ( KWayland : : Client : : PlasmaShellSurface : : Role : : OnScreenDisplay ) ;
2017-10-12 18:33:30 +00:00
plasmaSurface - > setPosition ( QPoint ( 50 , 70 ) ) ;
2022-08-01 21:29:02 +00:00
std : : unique_ptr < Test : : XdgToplevel > shellSurface ( Test : : createXdgToplevelSurface ( surface . get ( ) ) ) ;
QVERIFY ( shellSurface ! = nullptr ) ;
2017-10-12 18:33:30 +00:00
// now render and map the window
2022-08-01 21:29:02 +00:00
auto window = Test : : renderAndWaitForShown ( surface . get ( ) , QSize ( 100 , 50 ) , Qt : : blue ) ;
2017-10-12 18:33:30 +00:00
2022-04-23 19:51:16 +00:00
QVERIFY ( window ) ;
QVERIFY ( ! window - > isPlaceable ( ) ) ;
QCOMPARE ( window - > windowType ( ) , NET : : OnScreenDisplay ) ;
QVERIFY ( window - > isOnScreenDisplay ( ) ) ;
QCOMPARE ( window - > frameGeometry ( ) , QRect ( 50 , 70 , 100 , 50 ) ) ;
2017-10-12 18:33:30 +00:00
}
2016-09-15 12:17:48 +00:00
void PlasmaSurfaceTest : : testPanelTypeHasStrut_data ( )
{
2022-04-14 12:27:50 +00:00
QTest : : addColumn < KWayland : : Client : : PlasmaShellSurface : : PanelBehavior > ( " panelBehavior " ) ;
2016-09-15 12:17:48 +00:00
QTest : : addColumn < bool > ( " expectedStrut " ) ;
2022-05-16 20:13:39 +00:00
QTest : : addColumn < QRectF > ( " expectedMaxArea " ) ;
2016-09-15 12:17:48 +00:00
QTest : : addColumn < KWin : : Layer > ( " expectedLayer " ) ;
2022-05-16 20:13:39 +00:00
QTest : : newRow ( " always visible - xdgWmBase " ) < < KWayland : : Client : : PlasmaShellSurface : : PanelBehavior : : AlwaysVisible < < true < < QRectF ( 0 , 50 , 1280 , 974 ) < < KWin : : DockLayer ;
QTest : : newRow ( " autohide - xdgWmBase " ) < < KWayland : : Client : : PlasmaShellSurface : : PanelBehavior : : AutoHide < < false < < QRectF ( 0 , 0 , 1280 , 1024 ) < < KWin : : AboveLayer ;
QTest : : newRow ( " windows can cover - xdgWmBase " ) < < KWayland : : Client : : PlasmaShellSurface : : PanelBehavior : : WindowsCanCover < < false < < QRectF ( 0 , 0 , 1280 , 1024 ) < < KWin : : NormalLayer ;
QTest : : newRow ( " windows go below - xdgWmBase " ) < < KWayland : : Client : : PlasmaShellSurface : : PanelBehavior : : WindowsGoBelow < < false < < QRectF ( 0 , 0 , 1280 , 1024 ) < < KWin : : AboveLayer ;
2016-09-15 12:17:48 +00:00
}
void PlasmaSurfaceTest : : testPanelTypeHasStrut ( )
{
2022-08-01 21:29:02 +00:00
std : : unique_ptr < KWayland : : Client : : Surface > surface ( Test : : createSurface ( ) ) ;
QVERIFY ( surface ! = nullptr ) ;
std : : unique_ptr < QObject > shellSurface ( Test : : createXdgToplevelSurface ( surface . get ( ) ) ) ;
QVERIFY ( shellSurface ! = nullptr ) ;
std : : unique_ptr < KWayland : : Client : : PlasmaShellSurface > plasmaSurface ( m_plasmaShell - > createSurface ( surface . get ( ) ) ) ;
QVERIFY ( plasmaSurface ! = nullptr ) ;
2022-04-14 12:27:50 +00:00
plasmaSurface - > setRole ( KWayland : : Client : : PlasmaShellSurface : : Role : : Panel ) ;
2016-09-15 12:17:48 +00:00
plasmaSurface - > setPosition ( QPoint ( 0 , 0 ) ) ;
2022-04-14 12:27:50 +00:00
QFETCH ( KWayland : : Client : : PlasmaShellSurface : : PanelBehavior , panelBehavior ) ;
2016-09-15 12:17:48 +00:00
plasmaSurface - > setPanelBehavior ( panelBehavior ) ;
// now render and map the window
2022-08-01 21:29:02 +00:00
auto window = Test : : renderAndWaitForShown ( surface . get ( ) , QSize ( 100 , 50 ) , Qt : : blue ) ;
2016-09-15 12:17:48 +00:00
2021-08-25 15:12:50 +00:00
// the panel is on the first output and the current desktop
2022-07-11 10:41:15 +00:00
Output * output = workspace ( ) - > outputs ( ) . constFirst ( ) ;
2021-08-25 15:12:50 +00:00
VirtualDesktop * desktop = VirtualDesktopManager : : self ( ) - > currentDesktop ( ) ;
2022-04-23 19:51:16 +00:00
QVERIFY ( window ) ;
QCOMPARE ( window - > windowType ( ) , NET : : Dock ) ;
QVERIFY ( window - > isDock ( ) ) ;
QCOMPARE ( window - > frameGeometry ( ) , QRect ( 0 , 0 , 100 , 50 ) ) ;
QTEST ( window - > hasStrut ( ) , " expectedStrut " ) ;
2021-08-25 15:12:50 +00:00
QTEST ( workspace ( ) - > clientArea ( MaximizeArea , output , desktop ) , " expectedMaxArea " ) ;
2022-04-23 19:51:16 +00:00
QTEST ( window - > layer ( ) , " expectedLayer " ) ;
2016-09-15 12:17:48 +00:00
}
2016-09-15 19:03:40 +00:00
void PlasmaSurfaceTest : : testPanelWindowsCanCover_data ( )
{
QTest : : addColumn < QRect > ( " panelGeometry " ) ;
QTest : : addColumn < QRect > ( " windowGeometry " ) ;
QTest : : addColumn < QPoint > ( " triggerPoint " ) ;
QTest : : newRow ( " top-full-edge " ) < < QRect ( 0 , 0 , 1280 , 30 ) < < QRect ( 0 , 0 , 200 , 300 ) < < QPoint ( 100 , 0 ) ;
QTest : : newRow ( " top-left-edge " ) < < QRect ( 0 , 0 , 1000 , 30 ) < < QRect ( 0 , 0 , 200 , 300 ) < < QPoint ( 100 , 0 ) ;
QTest : : newRow ( " top-right-edge " ) < < QRect ( 280 , 0 , 1000 , 30 ) < < QRect ( 1000 , 0 , 200 , 300 ) < < QPoint ( 1000 , 0 ) ;
QTest : : newRow ( " bottom-full-edge " ) < < QRect ( 0 , 994 , 1280 , 30 ) < < QRect ( 0 , 724 , 200 , 300 ) < < QPoint ( 100 , 1023 ) ;
QTest : : newRow ( " bottom-left-edge " ) < < QRect ( 0 , 994 , 1000 , 30 ) < < QRect ( 0 , 724 , 200 , 300 ) < < QPoint ( 100 , 1023 ) ;
QTest : : newRow ( " bottom-right-edge " ) < < QRect ( 280 , 994 , 1000 , 30 ) < < QRect ( 1000 , 724 , 200 , 300 ) < < QPoint ( 1000 , 1023 ) ;
QTest : : newRow ( " left-full-edge " ) < < QRect ( 0 , 0 , 30 , 1024 ) < < QRect ( 0 , 0 , 200 , 300 ) < < QPoint ( 0 , 100 ) ;
QTest : : newRow ( " left-top-edge " ) < < QRect ( 0 , 0 , 30 , 800 ) < < QRect ( 0 , 0 , 200 , 300 ) < < QPoint ( 0 , 100 ) ;
QTest : : newRow ( " left-bottom-edge " ) < < QRect ( 0 , 200 , 30 , 824 ) < < QRect ( 0 , 0 , 200 , 300 ) < < QPoint ( 0 , 250 ) ;
QTest : : newRow ( " right-full-edge " ) < < QRect ( 1250 , 0 , 30 , 1024 ) < < QRect ( 1080 , 0 , 200 , 300 ) < < QPoint ( 1279 , 100 ) ;
QTest : : newRow ( " right-top-edge " ) < < QRect ( 1250 , 0 , 30 , 800 ) < < QRect ( 1080 , 0 , 200 , 300 ) < < QPoint ( 1279 , 100 ) ;
QTest : : newRow ( " right-bottom-edge " ) < < QRect ( 1250 , 200 , 30 , 824 ) < < QRect ( 1080 , 0 , 200 , 300 ) < < QPoint ( 1279 , 250 ) ;
}
void PlasmaSurfaceTest : : testPanelWindowsCanCover ( )
{
// this test verifies the behavior of a panel with windows can cover
// triggering the screen edge should raise the panel.
2022-08-01 21:29:02 +00:00
std : : unique_ptr < KWayland : : Client : : Surface > surface ( Test : : createSurface ( ) ) ;
QVERIFY ( surface ! = nullptr ) ;
std : : unique_ptr < Test : : XdgToplevel > shellSurface ( Test : : createXdgToplevelSurface ( surface . get ( ) ) ) ;
QVERIFY ( shellSurface ! = nullptr ) ;
std : : unique_ptr < KWayland : : Client : : PlasmaShellSurface > plasmaSurface ( m_plasmaShell - > createSurface ( surface . get ( ) ) ) ;
QVERIFY ( plasmaSurface ! = nullptr ) ;
2022-04-14 12:27:50 +00:00
plasmaSurface - > setRole ( KWayland : : Client : : PlasmaShellSurface : : Role : : Panel ) ;
2016-09-15 19:03:40 +00:00
QFETCH ( QRect , panelGeometry ) ;
plasmaSurface - > setPosition ( panelGeometry . topLeft ( ) ) ;
2022-04-14 12:27:50 +00:00
plasmaSurface - > setPanelBehavior ( KWayland : : Client : : PlasmaShellSurface : : PanelBehavior : : WindowsCanCover ) ;
2016-09-15 19:03:40 +00:00
// now render and map the window
2022-08-01 21:29:02 +00:00
auto panel = Test : : renderAndWaitForShown ( surface . get ( ) , panelGeometry . size ( ) , Qt : : blue ) ;
2016-09-15 19:03:40 +00:00
2021-08-25 15:12:50 +00:00
// the panel is on the first output and the current desktop
2022-07-11 10:41:15 +00:00
Output * output = workspace ( ) - > outputs ( ) . constFirst ( ) ;
2021-08-25 15:12:50 +00:00
VirtualDesktop * desktop = VirtualDesktopManager : : self ( ) - > currentDesktop ( ) ;
2016-09-15 19:03:40 +00:00
QVERIFY ( panel ) ;
QCOMPARE ( panel - > windowType ( ) , NET : : Dock ) ;
QVERIFY ( panel - > isDock ( ) ) ;
2019-09-27 10:01:10 +00:00
QCOMPARE ( panel - > frameGeometry ( ) , panelGeometry ) ;
2016-09-15 19:03:40 +00:00
QCOMPARE ( panel - > hasStrut ( ) , false ) ;
2021-08-25 15:12:50 +00:00
QCOMPARE ( workspace ( ) - > clientArea ( MaximizeArea , output , desktop ) , QRect ( 0 , 0 , 1280 , 1024 ) ) ;
2016-09-15 19:03:40 +00:00
QCOMPARE ( panel - > layer ( ) , KWin : : NormalLayer ) ;
// create a Window
2022-08-01 21:29:02 +00:00
std : : unique_ptr < KWayland : : Client : : Surface > surface2 ( Test : : createSurface ( ) ) ;
QVERIFY ( surface2 ! = nullptr ) ;
std : : unique_ptr < Test : : XdgToplevel > shellSurface2 ( Test : : createXdgToplevelSurface ( surface2 . get ( ) ) ) ;
QVERIFY ( shellSurface2 ! = nullptr ) ;
2016-09-15 19:03:40 +00:00
QFETCH ( QRect , windowGeometry ) ;
2022-08-01 21:29:02 +00:00
auto window = Test : : renderAndWaitForShown ( surface2 . get ( ) , windowGeometry . size ( ) , Qt : : red ) ;
2016-09-15 19:03:40 +00:00
2022-04-23 19:51:16 +00:00
QVERIFY ( window ) ;
QCOMPARE ( window - > windowType ( ) , NET : : Normal ) ;
QVERIFY ( window - > isActive ( ) ) ;
QCOMPARE ( window - > layer ( ) , KWin : : NormalLayer ) ;
window - > move ( windowGeometry . topLeft ( ) ) ;
QCOMPARE ( window - > frameGeometry ( ) , windowGeometry ) ;
2016-09-15 19:03:40 +00:00
auto stackingOrder = workspace ( ) - > stackingOrder ( ) ;
QCOMPARE ( stackingOrder . count ( ) , 2 ) ;
QCOMPARE ( stackingOrder . first ( ) , panel ) ;
2022-04-23 19:51:16 +00:00
QCOMPARE ( stackingOrder . last ( ) , window ) ;
2016-09-15 19:03:40 +00:00
QSignalSpy stackingOrderChangedSpy ( workspace ( ) , & Workspace : : stackingOrderChanged ) ;
// trigger screenedge
QFETCH ( QPoint , triggerPoint ) ;
2023-02-09 13:07:56 +00:00
KWin : : input ( ) - > pointer ( ) - > warp ( triggerPoint ) ;
2020-09-24 01:53:38 +00:00
QVERIFY ( stackingOrderChangedSpy . wait ( ) ) ;
2016-09-15 19:03:40 +00:00
QCOMPARE ( stackingOrderChangedSpy . count ( ) , 1 ) ;
stackingOrder = workspace ( ) - > stackingOrder ( ) ;
QCOMPARE ( stackingOrder . count ( ) , 2 ) ;
2022-04-23 19:51:16 +00:00
QCOMPARE ( stackingOrder . first ( ) , window ) ;
2016-09-15 19:03:40 +00:00
QCOMPARE ( stackingOrder . last ( ) , panel ) ;
}
2016-10-12 13:09:52 +00:00
void PlasmaSurfaceTest : : testPanelActivate_data ( )
{
QTest : : addColumn < bool > ( " wantsFocus " ) ;
QTest : : addColumn < bool > ( " active " ) ;
QTest : : newRow ( " no focus " ) < < false < < false ;
QTest : : newRow ( " focus " ) < < true < < true ;
}
void PlasmaSurfaceTest : : testPanelActivate ( )
{
2022-08-01 21:29:02 +00:00
std : : unique_ptr < KWayland : : Client : : Surface > surface ( Test : : createSurface ( ) ) ;
QVERIFY ( surface ! = nullptr ) ;
std : : unique_ptr < Test : : XdgToplevel > shellSurface ( Test : : createXdgToplevelSurface ( surface . get ( ) ) ) ;
QVERIFY ( shellSurface ! = nullptr ) ;
std : : unique_ptr < KWayland : : Client : : PlasmaShellSurface > plasmaSurface ( m_plasmaShell - > createSurface ( surface . get ( ) ) ) ;
QVERIFY ( plasmaSurface ! = nullptr ) ;
2022-04-14 12:27:50 +00:00
plasmaSurface - > setRole ( KWayland : : Client : : PlasmaShellSurface : : Role : : Panel ) ;
2016-10-12 13:09:52 +00:00
QFETCH ( bool , wantsFocus ) ;
plasmaSurface - > setPanelTakesFocus ( wantsFocus ) ;
2022-08-01 21:29:02 +00:00
auto panel = Test : : renderAndWaitForShown ( surface . get ( ) , QSize ( 100 , 200 ) , Qt : : blue ) ;
2016-10-12 13:09:52 +00:00
QVERIFY ( panel ) ;
QCOMPARE ( panel - > windowType ( ) , NET : : Dock ) ;
QVERIFY ( panel - > isDock ( ) ) ;
QFETCH ( bool , active ) ;
QCOMPARE ( panel - > dockWantsInput ( ) , active ) ;
QCOMPARE ( panel - > isActive ( ) , active ) ;
}
2016-06-02 15:53:44 +00:00
WAYLANDTEST_MAIN ( PlasmaSurfaceTest )
# include "plasma_surface_test.moc"