9#ifndef KWIN_WAYLAND_TEST_H
10#define KWIN_WAYLAND_TEST_H
20#include <KWayland/Client/surface.h>
23#include "qwayland-cursor-shape-v1.h"
24#include "qwayland-fake-input.h"
25#include "qwayland-fractional-scale-v1.h"
26#include "qwayland-idle-inhibit-unstable-v1.h"
27#include "qwayland-input-method-unstable-v1.h"
28#include "qwayland-kde-output-device-v2.h"
29#include "qwayland-kde-output-management-v2.h"
30#include "qwayland-kde-screen-edge-v1.h"
31#include "qwayland-security-context-v1.h"
32#include "qwayland-text-input-unstable-v3.h"
33#include "qwayland-wlr-layer-shell-unstable-v1.h"
34#include "qwayland-xdg-decoration-unstable-v1.h"
35#include "qwayland-xdg-shell.h"
36#include "qwayland-zkde-screencast-unstable-v1.h"
43class ConnectionThread;
47class PlasmaWindowManagement;
49class PointerConstraints;
56class TextInputManager;
62class zwp_input_panel_surface_v1;
63class zwp_text_input_v3;
64class zwp_text_input_manager_v3;
90 m_inputMethodServerToStart = inputMethodServer;
102 void continueStartupWithScene();
103 void finalizeStartup();
105 void createVirtualInputDevices();
106 void destroyVirtualInputDevices();
108 std::unique_ptr<Xwl::Xwayland> m_xwayland;
109 QString m_inputMethodServerToStart;
111 std::unique_ptr<Test::VirtualInputDevice> m_virtualPointer;
112 std::unique_ptr<Test::VirtualInputDevice> m_virtualKeyboard;
113 std::unique_ptr<Test::VirtualInputDevice> m_virtualTouch;
120class MockInputMethod;
131class TextInputV3 :
public QObject,
public QtWayland::zwp_text_input_v3
131class TextInputV3 :
public QObject,
public QtWayland::zwp_text_input_v3 {
…};
188class XdgSurface :
public QObject,
public QtWayland::xdg_surface
196 KWayland::Client::Surface *
surface()
const;
205 KWayland::Client::Surface *m_surface;
188class XdgSurface :
public QObject,
public QtWayland::xdg_surface {
…};
223 Q_DECLARE_FLAGS(States,
State)
239 std::unique_ptr<XdgSurface> m_xdgSurface;
256class XdgPopup :
public QObject,
public QtWayland::xdg_popup
275 std::unique_ptr<XdgSurface> m_xdgSurface;
256class XdgPopup :
public QObject,
public QtWayland::xdg_popup {
…};
362 int m_refreshRate = 60000;
364 bool m_preferred =
false;
375 QByteArray
edid()
const;
378 QString
name()
const;
379 QString
model()
const;
399 int32_t physical_width,
400 int32_t physical_height,
403 const QString &
model,
404 int32_t transform)
override;
424 QList<WaylandOutputDeviceV2Mode *> m_modes;
428 QSize m_physicalSize;
430 QString m_manufacturer;
437 QString m_serialNumber;
441 uint32_t m_vrr_policy;
459 return m_inputSurface.get();
476 std::unique_ptr<KWayland::Client::Surface> m_inputSurface;
477 QtWayland::zwp_input_panel_surface_v1 *m_inputMethodSurface =
nullptr;
478 struct ::zwp_input_method_context_v1 *m_context =
nullptr;
500 int m_preferredScale = 120;
533class FakeInput :
public QtWayland::org_kde_kwin_fake_input
533class FakeInput :
public QtWayland::org_kde_kwin_fake_input {
…};
576 void setPointer(
bool set);
577 void setKeyboard(
bool set);
578 void setTouch(
bool set);
579 void setLidSwitch(
bool set);
580 void setName(
const QString &name);
582 QString sysName()
const override;
583 QString name()
const override;
585 bool isEnabled()
const override;
586 void setEnabled(
bool enabled)
override;
588 LEDs leds()
const override;
589 void setLeds(LEDs leds)
override;
591 bool isKeyboard()
const override;
592 bool isPointer()
const override;
593 bool isTouchpad()
const override;
594 bool isTouch()
const override;
595 bool isTabletTool()
const override;
596 bool isTabletPad()
const override;
597 bool isTabletModeSwitch()
const override;
598 bool isLidSwitch()
const override;
602 bool m_pointer =
false;
603 bool m_keyboard =
false;
604 bool m_touch =
false;
605 bool m_lidSwitch =
false;
612 qint32 discreteDelta = 0,
616 qint32 discreteDelta = 0,
623void touchDown(qint32
id,
const QPointF &pos, quint32 time);
624void touchMotion(qint32
id,
const QPointF &pos, quint32 time);
625void touchUp(qint32
id, quint32 time);
677KWayland::Client::SubSurface *
createSubSurface(KWayland::Client::Surface *surface,
678 KWayland::Client::Surface *parentSurface, QObject *parent =
nullptr);
681 const QString &scope,
682 KWayland::Client::Output *output =
nullptr,
683 LayerShellV1::layer layer = LayerShellV1::layer_top);
693 KWayland::Client::Output *output,
701 QObject *parent =
nullptr);
708 QObject *parent =
nullptr);
719void render(KWayland::Client::Surface *surface,
const QSize &size,
const QColor &color,
const QImage::Format &
format = QImage::Format_ARGB32_Premultiplied);
724void render(KWayland::Client::Surface *surface,
const QImage &img);
735Window *
renderAndWaitForShown(KWayland::Client::Surface *surface,
const QSize &size,
const QColor &color,
const QImage::Format &
format = QImage::Format_ARGB32,
int timeout = 5000);
793 if (isInitialized()) {
800 Q_ASSERT(m_nodeId.has_value());
826 std::optional<uint> m_nodeId;
841 stream->init(stream_output(output, mode));
848 stream->init(stream_window(uuid, mode));
865Q_DECLARE_OPERATORS_FOR_FLAGS(KWin::Test::AdditionalWaylandInterfaces)
869#define WAYLANDTEST_MAIN(TestObject) \
870 int main(int argc, char *argv[]) \
872 setenv("QT_QPA_PLATFORM", "wayland-org.kde.kwin.qpa", true); \
873 setenv("QT_QPA_PLATFORM_PLUGIN_PATH", QFileInfo(QString::fromLocal8Bit(argv[0])).absolutePath().toLocal8Bit().constData(), true); \
874 setenv("KWIN_FORCE_OWN_QPA", "1", true); \
875 qunsetenv("KDE_FULL_SESSION"); \
876 qunsetenv("KDE_SESSION_VERSION"); \
877 qunsetenv("XDG_SESSION_DESKTOP"); \
878 qunsetenv("XDG_CURRENT_DESKTOP"); \
879 KWin::WaylandTestApplication app(KWin::Application::OperationModeXwayland, argc, argv); \
880 app.setAttribute(Qt::AA_Use96Dpi, true); \
882 return QTest::qExec(&tc, argc, argv); \
869#define WAYLANDTEST_MAIN(TestObject) \ …
The Client class encapsulates a window decoration frame.
OperationMode
This enum provides the various operation modes of KWin depending on the available Windowing Systems a...
~AutoHideScreenEdgeV1() override
AutoHideScreenEdgeV1(ScreenEdgeManagerV1 *manager, KWayland::Client::Surface *surface, uint32_t border)
~CursorShapeDeviceV1() override
CursorShapeDeviceV1(CursorShapeManagerV1 *manager, KWayland::Client::Pointer *pointer)
~CursorShapeManagerV1() override
~FractionalScaleManagerV1() override
~FractionalScaleV1() override
void wp_fractional_scale_v1_preferred_scale(uint32_t scale) override
~IdleInhibitManagerV1() override
~IdleInhibitorV1() override
IdleInhibitorV1(IdleInhibitManagerV1 *manager, KWayland::Client::Surface *surface)
void zwlr_layer_surface_v1_configure(uint32_t serial, uint32_t width, uint32_t height) override
void zwlr_layer_surface_v1_closed() override
void configureRequested(quint32 serial, const QSize &size)
~LayerSurfaceV1() override
~ScreenEdgeManagerV1() override
void zkde_screencast_stream_unstable_v1_closed() override
void zkde_screencast_stream_unstable_v1_created(uint32_t node) override
void failed(const QString &error)
~ScreencastingStreamV1() override
void created(quint32 nodeid)
ScreencastingStreamV1(QObject *parent)
void zkde_screencast_stream_unstable_v1_failed(const QString &error) override
ScreencastingV1(QObject *parent=nullptr)
ScreencastingStreamV1 * createOutputStream(wl_output *output, pointer mode)
ScreencastingStreamV1 * createWindowStream(const QString &uuid, pointer mode)
~SecurityContextManagerV1() override
~TextInputManagerV3() override
void zwp_text_input_v3_preedit_string(const QString &text, int32_t cursor_begin, int32_t cursor_end) override
void preeditString(const QString &text, int cursor_begin, int cursor_end)
WaylandOutputConfigurationV2(struct ::kde_output_configuration_v2 *object)
void kde_output_configuration_v2_failed() override
void kde_output_configuration_v2_applied() override
void kde_output_device_v2_uuid(const QString &uuid) override
void kde_output_device_v2_eisa_id(const QString &eisaId) override
void kde_output_device_v2_scale(wl_fixed_t factor) override
void kde_output_device_v2_capabilities(uint32_t flags) override
QPoint globalPosition() const
QString manufacturer() const
void kde_output_device_v2_geometry(int32_t x, int32_t y, int32_t physical_width, int32_t physical_height, int32_t subpixel, const QString &make, const QString &model, int32_t transform) override
void kde_output_device_v2_mode(struct ::kde_output_device_mode_v2 *mode) override
void kde_output_device_v2_overscan(uint32_t overscan) override
uint32_t overscan() const
void kde_output_device_v2_enabled(int32_t enabled) override
uint32_t capabilities() const
void kde_output_device_v2_edid(const QString &raw) override
~WaylandOutputDeviceV2() override
WaylandOutputDeviceV2(int id)
void kde_output_device_v2_rgb_range(uint32_t rgb_range) override
void kde_output_device_v2_serial_number(const QString &serialNumber) override
void kde_output_device_v2_vrr_policy(uint32_t vrr_policy) override
uint32_t rgbRange() const
void kde_output_device_v2_done() override
void kde_output_device_v2_current_mode(struct ::kde_output_device_mode_v2 *mode) override
uint32_t vrrPolicy() const
~WaylandOutputDeviceV2Mode() override
WaylandOutputDeviceV2Mode(struct ::kde_output_device_mode_v2 *object)
void kde_output_device_mode_v2_preferred() override
bool operator==(const WaylandOutputDeviceV2Mode &other) const
void kde_output_device_mode_v2_refresh(int32_t refresh) override
void kde_output_device_mode_v2_removed() override
void kde_output_device_mode_v2_size(int32_t width, int32_t height) override
static WaylandOutputDeviceV2Mode * get(struct ::kde_output_device_mode_v2 *object)
WaylandOutputManagementV2(struct ::wl_registry *registry, int id, int version)
WaylandOutputConfigurationV2 * createConfiguration()
~XdgDecorationManagerV1() override
XdgPositioner(XdgShell *shell)
~XdgPositioner() override
void xdg_wm_base_ping(uint32_t serial) override
void xdg_surface_configure(uint32_t serial) override
KWayland::Client::Surface * surface() const
void configureRequested(quint32 serial)
XdgSurface(XdgShell *shell, KWayland::Client::Surface *surface, QObject *parent=nullptr)
void configureRequested(QtWayland::zxdg_toplevel_decoration_v1::mode mode)
XdgToplevelDecorationV1(XdgDecorationManagerV1 *manager, XdgToplevel *toplevel, QObject *parent=nullptr)
void zxdg_toplevel_decoration_v1_configure(uint32_t mode) override
~XdgToplevelDecorationV1() override
XdgSurface * xdgSurface() const
void xdg_toplevel_close() override
void xdg_toplevel_configure(int32_t width, int32_t height, wl_array *states) override
void configureRequested(const QSize &size, KWin::Test::XdgToplevel::States states)
XdgToplevel(XdgSurface *surface, QObject *parent=nullptr)
XwaylandInterface * xwayland() const override
void performStartup() override
Test::VirtualInputDevice * virtualPointer() const
void setInputMethodServerToStart(const QString &inputMethodServer)
Test::VirtualInputDevice * virtualTouch() const
Test::VirtualInputDevice * virtualKeyboard() const
~WaylandTestApplication() override
WaylandTestApplication(OperationMode mode, int &argc, char **argv)
WaylandOutputManagementV2 * waylandOutputManagementV2()
XdgPositioner * createXdgPositioner()
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)
XdgPopup * createXdgPopupSurface(KWayland::Client::Surface *surface, XdgSurface *parentSurface, XdgPositioner *positioner, CreationSetup configureMode=CreationSetup::CreateAndConfigure, QObject *parent=nullptr)
void destroyWaylandConnection()
void setOutputConfig(const QList< QRect > &geometries)
void touchDown(qint32 id, const QPointF &pos, quint32 time)
void pointerAxisVertical(qreal delta, quint32 time, qint32 discreteDelta=0, InputRedirection::PointerAxisSource source=InputRedirection::PointerAxisSourceUnknown)
void keyboardKeyPressed(quint32 key, quint32 time)
TextInputManagerV3 * waylandTextInputManagerV3()
QtWayland::zwp_input_panel_surface_v1 * createInputPanelSurfaceV1(KWayland::Client::Surface *surface, KWayland::Client::Output *output, MockInputMethod::Mode mode)
bool waitForWaylandKeyboard()
QList< WaylandOutputDeviceV2 * > waylandOutputDevicesV2()
bool setupWaylandConnection(AdditionalWaylandInterfaces flags=AdditionalWaylandInterfaces())
void touchMotion(qint32 id, const QPointF &pos, quint32 time)
KWayland::Client::PlasmaWindowManagement * waylandWindowManagement()
KWayland::Client::Compositor * waylandCompositor()
KWayland::Client::SubCompositor * waylandSubCompositor()
KWayland::Client::PointerConstraints * waylandPointerConstraints()
void render(KWayland::Client::Surface *surface, const QSize &size, const QColor &color, const QImage::Format &format=QImage::Format_ARGB32_Premultiplied)
bool waitForWaylandSurface(Window *window)
void pointerAxisHorizontal(qreal delta, quint32 time, qint32 discreteDelta=0, InputRedirection::PointerAxisSource source=InputRedirection::PointerAxisSourceUnknown)
KWayland::Client::Seat * waylandSeat()
LayerSurfaceV1 * createLayerSurfaceV1(KWayland::Client::Surface *surface, const QString &scope, KWayland::Client::Output *output=nullptr, LayerShellV1::layer layer=LayerShellV1::layer_top)
SecurityContextManagerV1 * waylandSecurityContextManagerV1()
KWayland::Client::Registry * registry
ScreencastingV1 * screencasting()
Window * waitForWaylandWindowShown(int timeout=5000)
bool waitForWaylandTouch()
AutoHideScreenEdgeV1 * createAutoHideScreenEdgeV1(KWayland::Client::Surface *surface, uint32_t border)
MockInputMethod * inputMethod()
QList< KWayland::Client::Output * > waylandOutputs()
KWayland::Client::Surface * inputPanelSurface()
void pointerButtonPressed(quint32 button, quint32 time)
KWayland::Client::ShadowManager * waylandShadowManager()
XcbConnectionPtr createX11Connection()
void pointerMotion(const QPointF &position, quint32 time)
bool renderNodeAvailable()
AdditionalWaylandInterface
std::unique_ptr< KWayland::Client::Surface > createSurface()
KWayland::Client::ShmPool * waylandShmPool()
void pointerMotionRelative(const QPointF &delta, quint32 time)
XdgToplevel * createXdgToplevelSurface(KWayland::Client::Surface *surface, QObject *parent=nullptr)
IdleInhibitorV1 * createIdleInhibitorV1(KWayland::Client::Surface *surface)
XdgToplevelDecorationV1 * createXdgToplevelDecorationV1(XdgToplevel *toplevel, QObject *parent=nullptr)
KWayland::Client::AppMenuManager * waylandAppMenuManager()
FractionalScaleV1 * createFractionalScaleV1(KWayland::Client::Surface *surface)
KWayland::Client::SubSurface * createSubSurface(KWayland::Client::Surface *surface, KWayland::Client::Surface *parentSurface, QObject *parent=nullptr)
bool waitForWaylandPointer()
KWayland::Client::ConnectionThread * waylandConnection()
KWayland::Client::TextInputManager * waylandTextInputManager()
void pointerButtonReleased(quint32 button, quint32 time)
void touchUp(qint32 id, quint32 time)
CursorShapeDeviceV1 * createCursorShapeDeviceV1(KWayland::Client::Pointer *pointer)
void flushWaylandConnection()
KWayland::Client::PlasmaShell * waylandPlasmaShell()
std::unique_ptr< xcb_connection_t, XcbConnectionDeleter > XcbConnectionPtr
bool waitForWindowClosed(Window *window)
KWayland::Client::Output * waylandOutput(const QString &name)
FakeInput * waylandFakeInput()
void operator()(xcb_connection_t *pointer)