Commit graph

168 commits

Author SHA1 Message Date
Martin Gräßlin
c81271a3b4 Fix shared memory access in BufferInterface
The BufferInterface used nested calls of wl_shm_buffer_begin_access
and allowed multiple different BufferInterfaces to be in a block
between wl_shm_buffer_begin_access and wl_shm_buffer_end_access.
But this is not allowed: nesting is only possible if it accesses
the same buffer!

This resulted in an abort when we accessed two BufferInterfaces
at the same time. The added test case aborts in the previous
version.

The fix now changes the semantic of the method. The BufferInterface
doesn't hold the QImage any more, but creates a new one every time
::data is invoked. The QImage is created with a custom cleanup
function which calls to wl_shm_buffer_end_access. It ensures that
we don't call into wl_shm_buffer_begin_access as long as there is
a valid QImage for any other BufferInterface still around and
instead returns a null QImage.

Thus a user of a BufferInterface::data should destroy the returned
QImage as soon as it's no longer needed or create a deep copy if
it needs to be kept around.
2014-11-13 08:30:51 +01:00
Martin Gräßlin
6c406df725 Adding a test application for paste
Counter part for the copyClient test app: the pasteClient test app
creates and maps a shell surface and waits for selection announce,
initiates the copy/paste mechanismn and prints out what got pasted.
After success it closes itself.
2014-11-12 14:05:46 +01:00
Martin Gräßlin
3f10218d77 Adding a test application for copy
The test application copyClient creates a ShellSurface, maps it as
fullscreen, renders a green buffer and when it gets pointer focus it
sets "foo" in mimetype "text/plain" into the selection.
2014-11-12 13:17:26 +01:00
Martin Gräßlin
5cd92ba7e2 Adding a test application supporting output to a QWidget
This test application "testRenderingServer" is able to start a
Wayland server and uses a QWidget to render the "scene". It manages
ShellSurfaces and renders them on the QWidget in a very static way.
Furthermore input events (key, pointer, wheel) are forwarded to the
top most Surface.

This test server is able to support kwin_wayland as a client, but
weston's test application in latest release fail due to missing
xdg_shell support.
2014-11-10 14:56:17 +01:00
Martin Gräßlin
ce7a6edaea Overloads taking Qt::MouseButton added to Server::SeatInterface
Qt::MouseButton is mapped to the linux buttons. The mapping does
not match the mapping used in QtWayland module [1] as that seems
to be incorrect to me. E.g. Qt::BackButton is not mapped to BTN_BACK.

[1] qtwayland/src/client/qwaylandinputdevice.cpp
2014-11-10 14:51:09 +01:00
Martin Gräßlin
3fa065a2bd Remove destroy listener on BufferInterface in dtor
One needs to use wl_list_remove for the listeners one creates.
2014-11-07 19:09:36 +01:00
Martin Gräßlin
34af4b1cf8 Fix check whether there is already a ShellSurface for a given Surface
Incorrect logic prevented that more than one ShellSurface could be
created.
2014-11-07 17:07:48 +01:00
Martin Gräßlin
bf4c5ef26b Test server extended to start Xwayland server
Proof-of-concept code illustrating how to start a Wayland server
before creating the QGuiApplication and also starting an Xwayland
server before creating the QGuiApplication. Thus the QGuiApplication
is able to connect to the Xwayland server started in the same
application.
2014-11-07 11:48:32 +01:00
Martin Gräßlin
9d5d8d0871 Display can start the server before QCoreApplication is created
Event dispatching in Display requires a QSocketNotifier which
requires the QCoreApplication to be created. This requirement renders
it impossible to create the server before the QCoreApplication is
created. But there are use cases which need this:

Let's assume we want to integrate a wayland server into an existing
X11 dependent application which uses QApplication and enforces the
xcb plugin. This means said application requires that an X Server is
up and running before the QApplication is created. If we want said
application to connect to an Xwayland server we need to be able to
create the Wayland server AND the Xwayland server before creating
the QApplication.

The solution is to only create the socket notifier if the
QCoreApplication exists. For the case that it doesn't exist an
additional method is added which needs to be called once the
QCoreApplication got created. In addition a manual event dispatch
method is added which allows to block for events when we don't
have a QSocketNotifier set up yet.
2014-11-07 11:41:37 +01:00
Martin Gräßlin
376a2ffac9 Add a simple testServer binary 2014-11-07 09:08:29 +01:00
Martin Gräßlin
ec16b7c40e Use a destroy listener in BufferInterface
This fixes a crash when closing a connected Xwayland server.
2014-11-07 09:04:19 +01:00
Martin Gräßlin
7763cd94a7 Add wl_data_offer on Client and Server side
Only selection part is implemented, drag'n'drop still needs to be
implemented.

Unit test is not properly testing whether the data can be transferred.
This needs some better architecture to have multiple processes which
perform the source and target part.
2014-11-06 16:56:50 +01:00
Martin Gräßlin
ea7c4d36e4 Fix signal DataDeviceManager::dataSourceCreated 2014-11-06 10:07:58 +01:00
Martin Gräßlin
421cfaafc3 Add implementation for wl_data_device in Server and Client
On the client side anything related to wl_data_offer is not yet
implemented.
2014-11-06 10:02:49 +01:00
Martin Gräßlin
435c88f1e0 Add static SeatInterface *SeatInterface::get(wl_resource*)
No auto-test for it as we don't track the created resources which
makes testing difficult. Implicit testing will be added through
DataDeviceInterface.
2014-11-05 15:29:18 +01:00
Martin Gräßlin
a160876d05 Add static DatatSourceInterface *DataSourceInterface::get(wl_resource*) 2014-11-05 15:22:15 +01:00
Martin Gräßlin
92c46fdcd3 Add DataDeviceManager and DataSource in client and server
Basic implementation of the DataDeviceManager and the DataSource it
creates.

Still needs support for DataDevice and DataOffer to complement the
API.
2014-11-04 15:10:22 +01:00
Martin Gräßlin
323417ae63 Fix build: don't include wayland-client.h in test_wayland_region.cpp 2014-10-16 15:06:02 +02:00
Martin Gräßlin
5debfb6832 Add support for opaque and input region to Surface
Implemented on both Client and Server side.
2014-10-16 14:59:01 +02:00
Martin Gräßlin
7fce72b7d1 Implement the wl_region interface
Compositor::createRegion added which returns a Region. Also server
side part is implemented.
2014-10-16 14:54:17 +02:00
Martin Gräßlin
ee24e4e08a Add support for wl_subcompositor and wl_subsurface
This implements the subcompositor and subsurface protocol on both
Client and Server side.

Client:
New classes SubCompositor and SubSurface. The SubCompositor can be
created through the Registry and creates the SubSurface which is
bound to a Surface and has a parent Surface. The SubSurface class
provides convenient wrappers for all calls exposed in the
wl_subsurface interface.

Server:
New classes SubCompositorInterface and SubSurfaceInterface. Support
for all commands is added, though the API probably still can need
some fine tuning. The synchronized vs. desynchronized behavior is
not yet exposed in the API. This could also be delegated towards
the user of the library.
2014-10-16 08:19:52 +02:00
Sebastian Kügler
bf0f8fd266 Fix export header for WaylandServer
This makes it possible to install and then use it. Installation is still
commented since we can't give enough stability guarantees for now.

In detail:
- do not actually install headers
- generate the export header into Wayland/Server
- include it from there

REVIEW:120579
2014-10-14 14:46:05 +02:00
Sebastian Kügler
410c414bad Add Registry::interfacesAnnounced signal
Emitted when the Wayland display is done flushing the initial interface
callbacks, announcing wl_display properties. This can be used to compress
events. Note that this signal is emitted only after announcing interfaces,
such as outputs, but not after receiving callbacks of interface properties,
such as the output's geometry, modes, etc..

This signal is emitted from the wl_display_sync callback.

REVIEW:120471
2014-10-14 13:39:37 +02:00
Martin Gräßlin
ecec800357 Improve TestWaylandConnectionThread::testConnectionThread
The test started to fail on my system without changing anything. I
assume my system got an update to latest wayland version and it
looks like the registry doesn't announce anything if nothing is
registered. So now our display at least creates the Shm interface.

In addition the test case is slightly improved with a few smaller
changes added during the debug session.
2014-10-13 10:10:50 +02:00
Martin Gräßlin
809519f058 Add support for Modes in Output 2014-09-23 15:56:13 +02:00
Martin Gräßlin
eb9e5a178f Switch all auto tests to QTEST_GUILESS_MAIN
We don't need a QGuiApplication in the tests.
2014-09-23 12:00:17 +02:00
Martin Gräßlin
f72e4a4d6f Add a Client::EventQueue
The EventQueue is a wrapper for wl_event_queue. The usage is for the
case that the connection is in a different thread.

The EventQueue needs to be added to the Registry before Registry::create
is invoked. This ensures that the Registry gets added to the EventQueue
and all objects created by the Registry (and further down the tree)
will be added to the same EventQueue.

The auto-tests which already used a wl_event_queue are transited to the
EventQueue class. That's also the reason why there is no dedicated
unit test: the new code is sufficiently tested by the existing tests.
2014-09-23 11:55:07 +02:00
Martin Gräßlin
53b9b5b9b2 Add ::destroy to Client::Keyboard and Client::Pointer
This makes the API more consistent and allows to properly cleanup
Keyboard and Pointer if the connection dies. Like with Shell and
ShellSurface signals are emitted from Seat when the interface is
going to be released or destroyed. These are connected to the
methods of the created Pointer and Keyboard.
2014-09-22 13:12:08 +02:00
Martin Gräßlin
6ea3abc56d Add test case for Seat::destroy 2014-09-22 12:02:57 +02:00
Martin Gräßlin
ff9c6ea23d Add test case for operator cast in Client::Seat 2014-09-22 11:56:48 +02:00
Martin Gräßlin
d267cdca02 Add test case for operator cast in Client::Shell
One test also adjusted to get the operator cast in ShellSurface under
coverage.
2014-09-22 11:41:34 +02:00
Martin Gräßlin
bf1168db23 Add test case for ShellSurface::destroy 2014-09-22 11:33:13 +02:00
Martin Gräßlin
44a51fef8b Add test case for Surface::destroy 2014-09-22 11:14:05 +02:00
Martin Gräßlin
610e8ce484 Add test case for Registry::destroy 2014-09-22 11:08:14 +02:00
Martin Gräßlin
ca3b8b0cec Add test case for operator cast in Compositor 2014-09-22 11:03:46 +02:00
Martin Gräßlin
ebac7d3c03 Verify that Pointer isValid in the autotest 2014-09-22 11:02:16 +02:00
Martin Gräßlin
ba9270a887 Pass parent to Client::Keyboard in TestWaylandSeat
This ensures that the Keyboard doesn't leak in the test.
2014-09-22 11:00:02 +02:00
Martin Gräßlin
acb08e276d Add unit test for Client::Compositor::destroy 2014-09-22 10:24:21 +02:00
Martin Gräßlin
6f2d49e680 ShmPool returns QWeakPointer<Buffer> instead of Buffer*
The Buffers are exclusively hold by ShmPool. The user of a Buffer is not
supposed to delete it as a no longer used Buffer should be reused by the
ShmPool.

To make it obvious that the ownership of the pointer is not passed to the
user the return type is changed to QWeakPointer. This also allows the
ShmPool to destroy Buffers as needed.
2014-09-22 09:54:10 +02:00
Martin Gräßlin
aa26a42432 Do not include wayland-client-protocol.h in test_shm_pool.cpp
This should fix the build on CI system.
2014-09-22 09:01:24 +02:00
Martin Gräßlin
6394b6cd8c Add unit test for ShmPool
The unit test found a few problems which are now addressed
* getBuffer did not check the format when reusing a buffer
* creatBuffer used the wrong method on QSize to check whether it is empty
* destroy didn't call destroy on the Buffer. This is now added by moving
  the Buffer::Private in a dedicated header which can also be included
  from the ShmPool
2014-09-22 08:52:05 +02:00
Pier Luigi Fiorini
d8e4f5edf9 Add Review Board configuration 2014-09-21 11:33:11 +02:00
Martin Gräßlin
9ae04f2100 Extend test_wayland_surface to test frame rendered callback 2014-09-20 16:28:47 +02:00
Martin Gräßlin
c14bbe9c53 Change Client::ShmPool to return Client::Buffer* instead of wl_buffer* 2014-09-20 15:11:40 +02:00
Martin Gräßlin
e33c005118 Add support for Formats to Buffer and ShmPool
So far only ARGB32 and RGB32 are supported. The format is an optional
argument to all the createBuffer and getBuffer calls with a default
for ARGB32.
2014-09-19 14:53:03 +02:00
Martin Gräßlin
2bef3d08ef Check maximum supported version in Client::Registry
Ensure that we do not connect to a version which our client library
does not support. If we would allow higher versions we would run the
risk that the wayland library calls into not existing callbacks.
2014-09-19 10:54:09 +02:00
Martin Gräßlin
4d77c197a9 Add convenient create methods to Registry
These methods allow to create the Interface objects and set them up
directly.
2014-09-19 10:42:44 +02:00
Martin Gräßlin
4d70ace4df Add a Registry::create overload taking the ConnectionThread object
This means we don't need to pass the wl_display* around.
2014-09-19 09:52:50 +02:00
Martin Gräßlin
cdd2ab9b78 Do not install Server library
It's not yet used by KWin, so we don't need to expose it yet.
This gives us more time to fine tune the API.
2014-09-19 09:46:55 +02:00
Martin Gräßlin
e448b84a82 Add d-pointer to Server::SurfaceInterface
It also adds a
static SurfaceInterface *get(wl_resource*)
to SurfaceInterface which can find the SurfaceInterface for the
given wl_resource. This is needed for ShellSurfaceInterface which
can no longer just cast the wayland user data.
2014-09-19 07:06:31 +02:00