kwin/src/wayland/DESIGN.md
Vlad Zahorodnii c94787bbf4 Move DESIGN.md to toplevel directory
This makes DESIGN.md more noticeable.
2021-03-22 21:30:43 +02:00

84 lines
2.8 KiB
Markdown

# History
We started out with one method of generting classes. We then ported to a new approach of using QtWaylandScanner to reduce a lot of boiler plate.
New classes should use the new approach.
# New Approach
A public facing PIMPL class which should inherit from QObject.
A private class that should inherit from QtWaylandServer::interface_name which is auto-generated. This will manage individual resources, handle callbacks and QString conversions.
Class Names should map to the interface name in UpperCamelCase.
Where a V1 exists in the interface name, this should be mirrored in the file and class name.
An implementation should handle all versions of a given interface, but not different interfaces which represent different versions.
(i.e zxdg_output_manager_v1 versions 1 2 and 3 would be wrapped in one class XdgOutputManagerV1Interface. A zxdg_output_manager_v2 protocol would be exposed as a new public class XdgOutputManagerV2Interface)
# Implementations
There are 3 modes of operation happening within the exported classes of KWaylandServer
The generated classes can behave in all these modes, it is up to our implementation to use the correct methods.
## Globals
e.g BlurManager
This represents an object listed by the Display class.
Use the interface_name::(wl_display*, int version) constructor within the private class to create an instance.
## Server-managed multicasting resources
e.g XdgOutput
This is where one QObject represents multiple Resources.
Use the method
```cpp
QtWaylandServer::interface_name::add(client, id, version)
```
to create a a new Resource instance managed by this object.
Use the event method with the wl_resource* overload to send events.
```cpp
for (auto resource : resourceMap())
{
send_some_method(resource->handle, arg1, arg2);
}
```
methods to send requests to all clients.
## Client-owned Resources:
e.g BlurInterface
This is where one instance of our public class represents a single resource. Typically the lifespan of the exported class matches our resource.
In the private class use the QtWaylandServer::interface_name(wl_resource*) constructor to create a wrapper bound to a specific resource.
Use
```cpp
send_some_method(arg1, args2)
```
methods of the privateClass to send events to the resource set in the constructor
## Other hooks
`_bind_resource` is called whenever a resource is bound. This exists for all generated classes in all the operating modes
`_destroy_resource` is a hook called whenever a resource has been unbound.
Note one should not call wl_resource_destroy in this hook.
## Resource destructors
destructors (tagged with type="destructor" in the XML) are not handled specially in QtWayland it is up to the class implementation to implement the event handler and call
```cpp
wl_resource_destroy(resource->handle)
```
in the relevant method