2016-06-02 15:53:44 +00:00
/********************************************************************
KWin - the KDE window manager
This file is part of the KDE project .
Copyright ( C ) 2016 Martin Gräßlin < mgraesslin @ kde . org >
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 2 of the License , or
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program . If not , see < http : //www.gnu.org/licenses/>.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# include "kwin_wayland_test.h"
# include "platform.h"
# include "shell_client.h"
2016-08-30 11:04:10 +00:00
# include "screens.h"
2016-06-02 15:53:44 +00:00
# include "wayland_server.h"
# include "workspace.h"
# include <KWayland/Client/connection_thread.h>
# include <KWayland/Client/compositor.h>
# 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/shell.h>
# include <KWayland/Client/surface.h>
using namespace KWin ;
using namespace KWayland : : Client ;
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-08-09 11:50:29 +00:00
void testDesktopIsOpaque ( ) ;
2016-08-30 11:04:10 +00:00
void testOSDPlacement ( ) ;
2016-09-15 12:17:48 +00:00
void testPanelTypeHasStrut_data ( ) ;
void testPanelTypeHasStrut ( ) ;
2016-08-09 11:50:29 +00:00
2016-06-02 15:53:44 +00:00
private :
ConnectionThread * m_connection = nullptr ;
KWayland : : Client : : Compositor * m_compositor = nullptr ;
Shell * m_shell = nullptr ;
PlasmaShell * m_plasmaShell = nullptr ;
} ;
void PlasmaSurfaceTest : : initTestCase ( )
{
qRegisterMetaType < KWin : : ShellClient * > ( ) ;
QSignalSpy workspaceCreatedSpy ( kwinApp ( ) , & Application : : workspaceCreated ) ;
QVERIFY ( workspaceCreatedSpy . isValid ( ) ) ;
kwinApp ( ) - > platform ( ) - > setInitialWindowSize ( QSize ( 1280 , 1024 ) ) ;
2016-07-04 07:09:03 +00:00
QVERIFY ( waylandServer ( ) - > init ( s_socketName . toLocal8Bit ( ) ) ) ;
2016-06-02 15:53:44 +00:00
kwinApp ( ) - > start ( ) ;
QVERIFY ( workspaceCreatedSpy . wait ( ) ) ;
}
void PlasmaSurfaceTest : : init ( )
{
2016-06-30 11:32:54 +00:00
QVERIFY ( Test : : setupWaylandConnection ( s_socketName , Test : : AdditionalWaylandInterface : : PlasmaShell ) ) ;
m_compositor = Test : : waylandCompositor ( ) ;
m_shell = Test : : waylandShell ( ) ;
m_plasmaShell = Test : : waylandPlasmaShell ( ) ;
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 ( )
{
QTest : : addColumn < PlasmaShellSurface : : Role > ( " role " ) ;
QTest : : addColumn < bool > ( " expectedOnAllDesktops " ) ;
QTest : : newRow ( " Desktop " ) < < PlasmaShellSurface : : Role : : Desktop < < true ;
QTest : : newRow ( " Panel " ) < < PlasmaShellSurface : : Role : : Panel < < true ;
QTest : : newRow ( " OSD " ) < < PlasmaShellSurface : : Role : : OnScreenDisplay < < true ;
QTest : : newRow ( " Normal " ) < < PlasmaShellSurface : : Role : : Normal < < false ;
2016-06-17 07:46:16 +00:00
QTest : : newRow ( " Notification " ) < < PlasmaShellSurface : : Role : : Notification < < true ;
2016-06-28 11:25:15 +00:00
QTest : : newRow ( " ToolTip " ) < < PlasmaShellSurface : : Role : : ToolTip < < true ;
2016-06-02 15:53:44 +00:00
}
void PlasmaSurfaceTest : : testRoleOnAllDesktops ( )
{
// this test verifies that a ShellClient is set on all desktops when the role changes
2016-06-30 11:32:54 +00:00
QScopedPointer < Surface > surface ( Test : : createSurface ( ) ) ;
2016-06-02 15:53:44 +00:00
QVERIFY ( ! surface . isNull ( ) ) ;
2016-06-30 11:32:54 +00:00
QScopedPointer < ShellSurface > shellSurface ( Test : : createShellSurface ( surface . data ( ) ) ) ;
2016-06-02 15:53:44 +00:00
QVERIFY ( ! shellSurface . isNull ( ) ) ;
QScopedPointer < PlasmaShellSurface > plasmaSurface ( m_plasmaShell - > createSurface ( surface . data ( ) ) ) ;
QVERIFY ( ! plasmaSurface . isNull ( ) ) ;
// now render to map the window
2016-07-01 07:54:44 +00:00
AbstractClient * c = Test : : renderAndWaitForShown ( surface . data ( ) , QSize ( 100 , 50 ) , Qt : : blue ) ;
2016-06-02 15:53:44 +00:00
QVERIFY ( c ) ;
2016-07-01 07:54:44 +00:00
QCOMPARE ( workspace ( ) - > activeClient ( ) , c ) ;
2016-06-02 15:53:44 +00:00
// currently the role is not yet set, so the window should not be on all desktops
QCOMPARE ( c - > isOnAllDesktops ( ) , false ) ;
// now let's try to change that
QSignalSpy onAllDesktopsSpy ( c , & AbstractClient : : desktopChanged ) ;
QVERIFY ( onAllDesktopsSpy . isValid ( ) ) ;
QFETCH ( PlasmaShellSurface : : Role , role ) ;
plasmaSurface - > setRole ( role ) ;
QFETCH ( bool , expectedOnAllDesktops ) ;
QCOMPARE ( onAllDesktopsSpy . wait ( ) , expectedOnAllDesktops ) ;
QCOMPARE ( c - > isOnAllDesktops ( ) , expectedOnAllDesktops ) ;
// let's create a second window where we init a little bit different
// first creating the PlasmaSurface then the Shell Surface
2016-06-30 11:32:54 +00:00
QScopedPointer < Surface > surface2 ( Test : : createSurface ( ) ) ;
2016-06-02 15:53:44 +00:00
QVERIFY ( ! surface2 . isNull ( ) ) ;
QScopedPointer < PlasmaShellSurface > plasmaSurface2 ( m_plasmaShell - > createSurface ( surface2 . data ( ) ) ) ;
QVERIFY ( ! plasmaSurface2 . isNull ( ) ) ;
plasmaSurface2 - > setRole ( role ) ;
2016-06-30 11:32:54 +00:00
QScopedPointer < ShellSurface > shellSurface2 ( Test : : createShellSurface ( surface2 . data ( ) ) ) ;
2016-06-02 15:53:44 +00:00
QVERIFY ( ! shellSurface2 . isNull ( ) ) ;
2016-06-30 11:32:54 +00:00
Test : : render ( surface2 . data ( ) , QSize ( 100 , 50 ) , Qt : : blue ) ;
2016-07-01 07:54:44 +00:00
QVERIFY ( Test : : waitForWaylandWindowShown ( ) ) ;
2016-06-02 15:53:44 +00:00
QVERIFY ( workspace ( ) - > activeClient ( ) ! = c ) ;
c = workspace ( ) - > activeClient ( ) ;
QEXPECT_FAIL ( " Desktop " , " PS before WS not supported " , Continue ) ;
QEXPECT_FAIL ( " Panel " , " PS before WS not supported " , Continue ) ;
QEXPECT_FAIL ( " OSD " , " PS before WS not supported " , Continue ) ;
2016-06-17 07:46:16 +00:00
QEXPECT_FAIL ( " Notification " , " PS before WS not supported " , Continue ) ;
2016-06-28 11:25:15 +00:00
QEXPECT_FAIL ( " ToolTip " , " PS before WS not supported " , Continue ) ;
2016-06-02 15:53:44 +00:00
QCOMPARE ( c - > isOnAllDesktops ( ) , expectedOnAllDesktops ) ;
}
2016-06-17 06:32:15 +00:00
void PlasmaSurfaceTest : : testAcceptsFocus_data ( )
{
QTest : : addColumn < PlasmaShellSurface : : Role > ( " role " ) ;
QTest : : addColumn < bool > ( " wantsInput " ) ;
QTest : : addColumn < bool > ( " active " ) ;
QTest : : newRow ( " Desktop " ) < < PlasmaShellSurface : : Role : : Desktop < < true < < true ;
QTest : : newRow ( " Panel " ) < < PlasmaShellSurface : : Role : : Panel < < true < < false ;
QTest : : newRow ( " OSD " ) < < PlasmaShellSurface : : Role : : OnScreenDisplay < < false < < false ;
QTest : : newRow ( " Normal " ) < < PlasmaShellSurface : : Role : : Normal < < true < < true ;
2016-06-17 07:46:16 +00:00
QTest : : newRow ( " Notification " ) < < PlasmaShellSurface : : Role : : Notification < < false < < false ;
2016-06-28 11:25:15 +00:00
QTest : : newRow ( " ToolTip " ) < < PlasmaShellSurface : : Role : : ToolTip < < false < < false ;
2016-06-17 06:32:15 +00:00
}
void PlasmaSurfaceTest : : testAcceptsFocus ( )
{
// this test verifies that some surface roles don't get focus
2016-06-30 11:32:54 +00:00
QScopedPointer < Surface > surface ( Test : : createSurface ( ) ) ;
2016-06-17 06:32:15 +00:00
QVERIFY ( ! surface . isNull ( ) ) ;
2016-06-30 11:32:54 +00:00
QScopedPointer < ShellSurface > shellSurface ( Test : : createShellSurface ( surface . data ( ) ) ) ;
2016-06-17 06:32:15 +00:00
QVERIFY ( ! shellSurface . isNull ( ) ) ;
QScopedPointer < PlasmaShellSurface > plasmaSurface ( m_plasmaShell - > createSurface ( surface . data ( ) ) ) ;
QVERIFY ( ! plasmaSurface . isNull ( ) ) ;
QFETCH ( PlasmaShellSurface : : Role , role ) ;
plasmaSurface - > setRole ( role ) ;
// now render to map the window
2016-07-01 07:54:44 +00:00
auto c = Test : : renderAndWaitForShown ( surface . data ( ) , QSize ( 100 , 50 ) , Qt : : blue ) ;
2016-06-17 06:32:15 +00:00
QVERIFY ( c ) ;
QTEST ( c - > wantsInput ( ) , " wantsInput " ) ;
QTEST ( c - > isActive ( ) , " active " ) ;
}
2016-08-09 11:50:29 +00:00
void PlasmaSurfaceTest : : testDesktopIsOpaque ( )
{
QScopedPointer < Surface > surface ( Test : : createSurface ( ) ) ;
QVERIFY ( ! surface . isNull ( ) ) ;
QScopedPointer < ShellSurface > shellSurface ( Test : : createShellSurface ( surface . data ( ) ) ) ;
QVERIFY ( ! shellSurface . isNull ( ) ) ;
QScopedPointer < PlasmaShellSurface > plasmaSurface ( m_plasmaShell - > createSurface ( surface . data ( ) ) ) ;
QVERIFY ( ! plasmaSurface . isNull ( ) ) ;
plasmaSurface - > setRole ( PlasmaShellSurface : : Role : : Desktop ) ;
// now render to map the window
auto c = Test : : renderAndWaitForShown ( surface . data ( ) , QSize ( 100 , 50 ) , Qt : : blue ) ;
QVERIFY ( c ) ;
QCOMPARE ( c - > windowType ( ) , NET : : Desktop ) ;
QVERIFY ( c - > isDesktop ( ) ) ;
QVERIFY ( ! c - > hasAlpha ( ) ) ;
QCOMPARE ( c - > depth ( ) , 24 ) ;
}
2016-08-30 11:04:10 +00:00
void PlasmaSurfaceTest : : testOSDPlacement ( )
{
QScopedPointer < Surface > surface ( Test : : createSurface ( ) ) ;
QVERIFY ( ! surface . isNull ( ) ) ;
QScopedPointer < ShellSurface > shellSurface ( Test : : createShellSurface ( surface . data ( ) ) ) ;
QVERIFY ( ! shellSurface . isNull ( ) ) ;
QScopedPointer < PlasmaShellSurface > plasmaSurface ( m_plasmaShell - > createSurface ( surface . data ( ) ) ) ;
QVERIFY ( ! plasmaSurface . isNull ( ) ) ;
plasmaSurface - > setRole ( PlasmaShellSurface : : Role : : OnScreenDisplay ) ;
// now render and map the window
auto c = Test : : renderAndWaitForShown ( surface . data ( ) , QSize ( 100 , 50 ) , Qt : : blue ) ;
QVERIFY ( c ) ;
QCOMPARE ( c - > windowType ( ) , NET : : OnScreenDisplay ) ;
QVERIFY ( c - > isOnScreenDisplay ( ) ) ;
QCOMPARE ( c - > geometry ( ) , QRect ( 590 , 649 , 100 , 50 ) ) ;
// change the screen size
QSignalSpy screensChangedSpy ( screens ( ) , & Screens : : changed ) ;
QVERIFY ( screensChangedSpy . isValid ( ) ) ;
const QVector < QRect > geometries { QRect ( 0 , 0 , 1280 , 1024 ) , QRect ( 1280 , 0 , 1280 , 1024 ) } ;
QMetaObject : : invokeMethod ( kwinApp ( ) - > platform ( ) , " outputGeometriesChanged " ,
Qt : : DirectConnection ,
Q_ARG ( QVector < QRect > , geometries ) ) ;
QVERIFY ( screensChangedSpy . wait ( ) ) ;
QCOMPARE ( screensChangedSpy . count ( ) , 1 ) ;
QCOMPARE ( screens ( ) - > count ( ) , 2 ) ;
QCOMPARE ( screens ( ) - > geometry ( 0 ) , geometries . at ( 0 ) ) ;
QCOMPARE ( screens ( ) - > geometry ( 1 ) , geometries . at ( 1 ) ) ;
QCOMPARE ( c - > geometry ( ) , QRect ( 590 , 649 , 100 , 50 ) ) ;
}
2016-09-15 12:17:48 +00:00
void PlasmaSurfaceTest : : testPanelTypeHasStrut_data ( )
{
QTest : : addColumn < Test : : ShellSurfaceType > ( " type " ) ;
QTest : : addColumn < PlasmaShellSurface : : PanelBehavior > ( " panelBehavior " ) ;
QTest : : addColumn < bool > ( " expectedStrut " ) ;
QTest : : addColumn < QRect > ( " expectedMaxArea " ) ;
QTest : : addColumn < KWin : : Layer > ( " expectedLayer " ) ;
QTest : : newRow ( " always visible - wlShell " ) < < Test : : ShellSurfaceType : : WlShell < < PlasmaShellSurface : : PanelBehavior : : AlwaysVisible < < true < < QRect ( 0 , 50 , 1280 , 974 ) < < KWin : : DockLayer ;
QTest : : newRow ( " always visible - xdgShellV5 " ) < < Test : : ShellSurfaceType : : XdgShellV5 < < PlasmaShellSurface : : PanelBehavior : : AlwaysVisible < < true < < QRect ( 0 , 50 , 1280 , 974 ) < < KWin : : DockLayer ;
QTest : : newRow ( " autohide - wlShell " ) < < Test : : ShellSurfaceType : : WlShell < < PlasmaShellSurface : : PanelBehavior : : AutoHide < < false < < QRect ( 0 , 0 , 1280 , 1024 ) < < KWin : : AboveLayer ;
QTest : : newRow ( " autohide - xdgShellV5 " ) < < Test : : ShellSurfaceType : : XdgShellV5 < < PlasmaShellSurface : : PanelBehavior : : AutoHide < < false < < QRect ( 0 , 0 , 1280 , 1024 ) < < KWin : : AboveLayer ;
QTest : : newRow ( " windows can cover - wlShell " ) < < Test : : ShellSurfaceType : : WlShell < < PlasmaShellSurface : : PanelBehavior : : WindowsCanCover < < false < < QRect ( 0 , 0 , 1280 , 1024 ) < < KWin : : NormalLayer ;
QTest : : newRow ( " windows can cover - xdgShellV5 " ) < < Test : : ShellSurfaceType : : XdgShellV5 < < PlasmaShellSurface : : PanelBehavior : : WindowsCanCover < < false < < QRect ( 0 , 0 , 1280 , 1024 ) < < KWin : : NormalLayer ;
QTest : : newRow ( " windows go below - wlShell " ) < < Test : : ShellSurfaceType : : WlShell < < PlasmaShellSurface : : PanelBehavior : : WindowsGoBelow < < false < < QRect ( 0 , 0 , 1280 , 1024 ) < < KWin : : DockLayer ;
QTest : : newRow ( " windows go below - xdgShellV5 " ) < < Test : : ShellSurfaceType : : XdgShellV5 < < PlasmaShellSurface : : PanelBehavior : : WindowsGoBelow < < false < < QRect ( 0 , 0 , 1280 , 1024 ) < < KWin : : DockLayer ;
}
void PlasmaSurfaceTest : : testPanelTypeHasStrut ( )
{
QScopedPointer < Surface > surface ( Test : : createSurface ( ) ) ;
QVERIFY ( ! surface . isNull ( ) ) ;
QFETCH ( Test : : ShellSurfaceType , type ) ;
QScopedPointer < QObject > shellSurface ( Test : : createShellSurface ( type , surface . data ( ) ) ) ;
QVERIFY ( ! shellSurface . isNull ( ) ) ;
QScopedPointer < PlasmaShellSurface > plasmaSurface ( m_plasmaShell - > createSurface ( surface . data ( ) ) ) ;
QVERIFY ( ! plasmaSurface . isNull ( ) ) ;
plasmaSurface - > setRole ( PlasmaShellSurface : : Role : : Panel ) ;
plasmaSurface - > setPosition ( QPoint ( 0 , 0 ) ) ;
QFETCH ( PlasmaShellSurface : : PanelBehavior , panelBehavior ) ;
plasmaSurface - > setPanelBehavior ( panelBehavior ) ;
// now render and map the window
auto c = Test : : renderAndWaitForShown ( surface . data ( ) , QSize ( 100 , 50 ) , Qt : : blue ) ;
QVERIFY ( c ) ;
QCOMPARE ( c - > windowType ( ) , NET : : Dock ) ;
QVERIFY ( c - > isDock ( ) ) ;
QCOMPARE ( c - > geometry ( ) , QRect ( 0 , 0 , 100 , 50 ) ) ;
QTEST ( c - > hasStrut ( ) , " expectedStrut " ) ;
QTEST ( workspace ( ) - > clientArea ( MaximizeArea , 0 , 0 ) , " expectedMaxArea " ) ;
QTEST ( c - > layer ( ) , " expectedLayer " ) ;
}
2016-06-02 15:53:44 +00:00
WAYLANDTEST_MAIN ( PlasmaSurfaceTest )
# include "plasma_surface_test.moc"