Commit graph

1350 commits

Author SHA1 Message Date
Xaver Hugl
177d35cace Implement drm-lease-v1 2021-09-17 23:10:13 +02:00
Xaver Hugl
3abbc31272 fix rgb range sending
BUG: 442548
2021-09-17 16:36:06 +02:00
Severin von Wnuck
bd9b42912b Fix texture format handling for Nvidia driver 2021-09-17 13:28:13 +02:00
David Edmundson
b219b9175c Only guard DND cancel events with the version check
In a recent refactor a guard seemingly in the wrong place on
SeatInterface was moved into AbstractDataSource, as typically that's
where we guard.

However it turns out the original code was correct, we want to send
cancel for all clipboard cancels, but for D&D it's version dependent.

This class introduces a new method to astract that from seat.
2021-09-10 14:06:49 +00:00
Vlad Zahorodnii
cd512fee2b Fix a typo
It makes more sense to test primarySelection().
2021-09-10 14:27:52 +03:00
David Redondo
efbe1c9664 Introduce AbstractDropHandler
This abstract class represents an object that receives drag and drop
events.
This roughly maps to some of DataDevice's receiving methods, but by
being abstract
also allows us to use the same code from xwayland in a manner
transparent to all
code paths.

Preivous xwayland support with "proxy surfaces" have been removed.

--
In future it will be extended to have the mouse move events, so that we
can
avoid spying on the seat both in dataDevice and kwin's internal filter
2021-09-09 09:04:05 +00:00
David Redondo
0aaed33c66 Move drag logic to seat and introduce SeatInterface::startDrag
A dataDevice has a request to start a drag with multiple parameters.
As kwayland's goal is to turn an event-driven API into a property cache API we
store this data. This patch moves that storage to the Seat as properties of the
active drag, rather than a property of the data device that happened to
initialise it.

This both helps keep a lot of other logic together, but also allows us to expose
a public startDrag method that can be invoked from Kwin's internal surfaces or
xwayland.

Any properties in DataDevice now relate to data being dropped on the device.
2021-09-09 09:04:05 +00:00
Carl Schwan
ea65068fe0 Fix documentation generation
Otherwise all the 'The' are linked to this class and the class is named The
2021-09-07 20:40:22 +00:00
Méven Car
84dd746a2a Fix some warnings 2021-09-03 09:42:16 +00:00
David Redondo
ca92dccbd8 Install all primaryselection interfaces headers 2021-09-03 08:19:15 +00:00
Jan Blackquill
c2680d7108 Implement set_frost in contrast protocol 2021-09-02 22:41:52 +00:00
Xaver Hugl
e31d10c18d output protocols: add rgb range setting 2021-09-01 20:54:14 +00:00
Méven Car
a9458fa031 Remove unused code after cee6912d00 2021-09-01 17:20:38 +00:00
Méven Car
57f8837e39 Fix two ununsed compile warnings 2021-09-01 18:07:03 +02:00
Méven Car
cee6912d00 Implement kde-output-device-v2 and kde-output-management-v2 2021-09-01 12:20:21 +02:00
Aleix Pol
8d9607391c Implement org_kde_plasma_window_management::send_to_output 2021-08-31 17:26:29 +02:00
Alexander Lohnau
525d12bee5 Run clang-format
If you want git blame to ignore formatting revisions run:
git config blame.ignoreRevsFile .git-blame-ignore-revs
2021-08-29 07:11:06 +02:00
Alexander Lohnau
6c163e3260 clang-format: exclude waylandscanner from formatting 2021-08-28 12:40:34 +02:00
Vlad Zahorodnii
2b3e8d6775 Decouple activation feedback from plasma window management global 2021-08-25 09:21:20 +00:00
Aleix Pol
773995de56 plasma-window-management: Support new activation concepts 2021-08-19 18:08:06 +00:00
David Edmundson
aeaa480b0c Add API to record the socket name used by a given file descriptor 2021-08-16 17:37:15 +01:00
Vlad Zahorodnii
d0a0c70d9c Add aboutToBeDestroyed signal to various xdg-shell classes
With the aboutToBeDestroyed signal, the compositor will be able to
perform cleanup before the QObject::destroyed signal is emitted, which
saves us some nullptr checks.
2021-08-12 10:35:13 +00:00
David Redondo
6ba9856a29 Implement wlr-data-control v2
This adds primary clipboard support to data control.
2021-08-12 09:01:08 +02:00
Vlad Zahorodnii
1083e650d5 Avoid using bitfields
Unfortunately, bitfields can be initialized using default member
initializer only since C++20.
2021-08-06 12:59:07 +03:00
Manuel Stoeckl
3f6433b81d Add a few 30-bit wl_shm formats
Register WL_SHM_FORMAT_ARGB2101010 and its XRGB,ABGR, and XBGR variants.
These (little-endian) formats are only advertised on little endian
machines, where there exist matching (native-endian) QImage formats.
2021-08-03 21:18:26 -04:00
Vlad Zahorodnii
00f112f48a Allocate less memory for every wl_callback
wl_callback and wl_region are two kinds of objects that are frequently
allocated.

Currently, we make two extra heap allocations per each wl_callback
object. One for the wrapper object (FrameCallback) and the other one is
for its Resource.

With this change, no extra allocations will be made. Also, due to
relying on wl_resource linked lists, the destroy listener implementation
got much simpler.

This won't result in huge memory usage or performance improvements, but
still it's worth reducing the number of memory allocations where possible.
2021-07-29 10:21:13 +03:00
Vlad Zahorodnii
43cfd25d27 Search for Xwayland surfaces differently
Currently, we store all surfaces in a single list and use linear search
to find the SurfaceInterface by its object id and client connection.

With this, we first search for the wl_resource object by its id. Once we
have a wl_resource, SurfaceInterface::get(wl_resource) can be used.

The main advantage of the proposed solution is that we don't need to
maintain a static list with all SurfaceInterface objects.
2021-07-28 14:38:01 +03:00
Vlad Zahorodnii
ba3f587200 Drop ClientConnection::createResource()
It's leftover after now gone Global and Resource.
2021-07-28 14:21:11 +03:00
Vlad Zahorodnii
0ed5f6f096 Remove unused wl_event_loop forward declaration 2021-07-28 13:46:56 +03:00
Vlad Zahorodnii
f248dce3da Ignore dpms status in Display::outputsIntersecting()
Display::outputsIntersecting() is used to compute the list of outputs
where the given surface is. The problem is that it accounts for the dpms
mode.

This means that if an output is turned off, clients will receive a leave
event and they may potentially decide to change the buffer scale and
commit new buffers.

The dpms check was introduced to fix a crash, however since then, output
bits in kwin have changed drastically, in particular how wl_output
objects are destroyed. So, it should be safe to remove the dpms check.
2021-07-28 10:28:21 +00:00
David Redondo
8cffad3fe8 Query height instead of texture format
Texture queries do not seem to work on nvidia and QtQuick windows
will then no be rendered.
2021-07-27 17:30:16 +02:00
Vlad Zahorodnii
7335d54209 Fix mapped status tracking for subsurfaces
A subsurface should be considered mapped only if it has a buffer
attached and its parent is also mapped.

Currently, mapped status logic in SurfaceInterface is somewhat broken
for sub-surfaces. For example, the mapped() signal will be emitted even
if the sub-surface should be considered unmapped according to the spec.
2021-07-23 21:42:30 +03:00
Vlad Zahorodnii
0fcc4af42d Make SurfaceInterface::buffer() const 2021-07-23 19:58:42 +03:00
Vlad Zahorodnii
0045eaecfa Reference shm pool for destroyed buffers
Currently, if an application is closed, all of its shm buffers will be
destroyed. However, the compositor may want to access them to fade out
the window.

With this change, the underlying shm pool will be referenced when a shm
buffer is destroyed. So, the compositor can access buffer data even if
the buffer is destroyed.
2021-07-22 11:41:08 +03:00
Vlad Zahorodnii
e4bf7e0334 Drop Global and Resource classes
They're unused.
2021-07-22 11:41:08 +03:00
Vlad Zahorodnii
0d2879c62d Split BufferInterface
Currently, the BufferInterface encapsulates all the kinds of client
buffers. This has become a somewhat annoying issue as we want to
reference the shm pool if a shm buffer is destroyed, or have custom
buffer readiness logic for linux dma-buf client buffers.

Implementing all of that with the current abstractions will be
challenging as there's no good separation between different client
buffer types.

This change splits the BufferInterface class in three sub-classes -
DrmClientBuffer, LinuxDmaBufV1ClientBuffer, and ShmClientBuffer.

In addition to that, this change fixes the broken buffer ref'ing api.
2021-07-22 11:41:06 +03:00
Vlad Zahorodnii
a244769a3f Make layer-surface acknowledged configure serials double-buffered state
This will be needed to delay surface commits.
2021-07-21 17:26:12 +00:00
Vlad Zahorodnii
c5691ba4de Make xdg-surface acknowledged configure serials double-buffered state
This will be needed to delay applying surface state.
2021-07-21 17:26:12 +00:00
Vlad Zahorodnii
9210e25c52 Build surface-to-buffer matrix based on current state
This makes it more clear that the surface-to-buffer matrix is computed
based on the current surface state.
2021-07-21 06:18:38 +00:00
Vlad Zahorodnii
ce92ac7451 Merge SurfaceInterfacePrivate::commit() and SurfaceInterfacePrivate::surface_commit()
This removes an unnecessary layer of indirection.
2021-07-21 06:18:38 +00:00
Vlad Zahorodnii
c2f0db4a92 Split SurfaceInterfacePrivate::swapStates()
Currently, the swapStates() function does two things - (a) it merges one
state with another; (b) it applies the next state. This change splits the
swapStates() so it's simpler and the boolean trap can be removed.
2021-07-21 06:18:38 +00:00
Vlad Zahorodnii
6e734a1f90 Remove needless current state copy
If nothing has been committed to the cached state, no changes to the
current state will be done.

If a synchronized sub-surface has been committed, the pending state will
be merged with the cached state. The latter state will be applied when
the parent surface is committed.
2021-07-20 08:08:22 +00:00
Vlad Zahorodnii
c55de7b70b Emit the committed() signal after the state is applied
Currently, the committed signal is emitted after the client has called
wl_surface.commit. However, this breaks with synchronized subsurfaces.

Notably, Firefox splits a web page in a bunch of smaller layers, which
can be backed by wl_subsurface objects.

All the subsurfaces are in the sync mode. If a layer needs to be
repainted, Firefox will commit the corresponding subsurface with a frame
callback.

Since the committed signal is emitted when the wl_surface.commit request
is invoked, kwin will schedule a new frame immediately. Meaning, that it
is quite likely that firefox will have old contents.

The right thing to do would be to schedule a frame when all the ancestors
of the layer subsurface have been committed.

This change re-jitters the commit logic so the committed signal is
emitted when a new state is applied to the surface. It also slightly
cleans up how SubSurfaceInterface::parentCommit() is called.

It will be nice to cleanup the commit logic further by calling the
surface role's commit hook unconditionally, i.e. not check whether it's
a subsurface. But doing so may result in infinite recursions. How to
clean up that is still TBD.
2021-07-16 13:07:56 +03:00
Vlad Zahorodnii
17cccfa233 Allow placing subsurfaces below parent surface
According to the spec, if the parent surface is specified in the
wl_subsurface.place_below(), the subsurface has to be rendered below the
parent surface.

At the moment, kwaylandserver doesn't handle that case properly. It is
not possible for sub-surfaces to go below the parent surface.

Another issue is that we wrongly assume that the place_above request
will put the subsurface on top of the stack if the parent surface is
specified as sibling. It doesn't seem like that's the case, not
according to the spec.

This change splits the child sub-surface list in two lists - below and
above. The alternative solution is to store the parent surface in the
children list, but it's an error prone solution and it's conceptually
weird.
2021-07-08 05:33:14 +00:00
Emilio Cobos Álvarez
9d8b387d52 display: Add an outputsIntersecting helper.
This will be used to clean up https://invent.kde.org/plasma/kwin/-/merge_requests/1128.
2021-06-24 13:23:22 +02:00
Vlad Zahorodnii
4dd205ce4f Don't move keyboard focus on button press
Until the spec is clear about how the keyboard focus should be
transferred between sub-surfaces, it's better to remove this heuristic
and focus only the main surface.

For example, if an application window has sub-surfaces but user doesn't
press any pointer button, any sub-surface can have focus.

Effectively, this reverts 6fe14f73d2.
2021-06-21 16:56:01 +03:00
Vlad Zahorodnii
5c6b1f4e8d Remove explicit flush in DataDeviceInterface
This allows the compositor batch events better.

If the event loop is about to block, client connections will be flushed.
2021-06-19 14:17:03 +03:00
Vlad Zahorodnii
98477eabc1 Remove manual flush when sending buffer release event
This way we can batch more events before flushing the client connection.
2021-06-19 11:12:35 +03:00
Vlad Zahorodnii
ac60e35818 Don't flush client connection when sending frame callbacks
This way, the compositor can batch more frame callbacks before flushing
the client connection. We attempted this before, but it broke tests.

Now, it seems like the tests pass, so we can remove the manual flush.
2021-06-19 11:12:25 +03:00
Aleix Pol
669d7fd652 xdgactivation: allow sourcing a request's client without a given surface 2021-06-14 17:43:03 +02:00
Aleix Pol
7dd092e910 Implement zwp_input_method_context_v1::grab_keyboard
Offers a new InputKeyboardV1Interface instance that wraps the
wl_keyboard and allows the compositor to forward the keyboard events.
2021-06-03 19:12:12 +02:00
David Edmundson
ecda92e023 Introduce a new signal when a drag is dropped 2021-06-03 11:17:59 +01:00
Vlad Zahorodnii
398841363b Move viewport state into a struct
It makes it more clear what state belongs to the wp_viewport extension.
2021-05-26 21:21:34 +03:00
Vlad Zahorodnii
86d39af6a0 Move surface state struct in KWaylandServer namespace
This way, it's less characters to type. In order to support delayed
surface commits, compositor extensions need to piggyback their state on
the state of the wl_surface. In other words, SurfaceState is going to
be used not only by SurfaceInterface, but the viewporter extension, the
xdg-shell extension, etc.
2021-05-26 21:21:05 +03:00
Aleix Pol
dde500c3ff Implementation of xdg_activation_v1
Offers KWaylandServer::XdgActivationV1Interface
2021-05-24 17:18:44 +02:00
Aleix Pol
b7d733fd76 textinput_v2: Make sendEnter/sendLeave the ones who decide the current surface
Instead of enabled/disabled. This made it possible for non-focussed
processes to interact with our virtual keyboard. In practice, this meant
that sometimes when switching applications, the disabled from the former
application would arrive after the enabled of the latter, leaving kwin
in a broken state (that the user could address by tapping on the screen
just once).
2021-05-22 02:23:53 +02:00
Aleix Pol
a4a10865e4 textinput: translate normal to normal
Not to alpha, maliit considers alpha to just be letters and goes to such
a mode.
2021-05-22 02:09:14 +02:00
Aleix Pol
75ba7fdc90 inputmethod: Make sure to test AutoCompletion
We were doing AutoCapitalization twice, I imagine it was a copy&paste
situation.
2021-05-21 19:17:17 +02:00
Aleix Pol
7e80c54d5d textinput: prefer smart pointers 2021-05-21 19:17:17 +02:00
Aleix Pol
961debb513 textinput: Expose enums to moc
Allows us to pass them to qDebug easily.
2021-05-21 19:17:17 +02:00
Xaver Hugl
93a4104b1e output interface: mark bind and release methods as override 2021-05-20 14:23:20 +02:00
David Edmundson
4a505823d7 Send surface_leave events before announcing output removal
It's the more logical order from the POV of a client
2021-05-19 22:58:38 +01:00
Laurent Montel
0c49d302ce Use Q_EMIT to make it compile against kf5.82 2021-05-13 11:33:08 +02:00
Vlad Zahorodnii
d740a45469 Fix invalid iterator in SurfaceInterfacePrivate::raiseChild()
The append method will invalidate the iterator, so we cannot call the
erase() method with the old iterator.
2021-05-13 10:16:25 +03:00
Vlad Zahorodnii
89dc01ada8 Add a PlasmaShellSurfaceInterface getter
This allows to simplify some compositor code.
2021-05-13 09:17:56 +03:00
Vlad Zahorodnii
c2fc33872e Introduce ClientConnection::aboutToBeDestroyed
This signal is useful if the compositor wants to perform some cleanup
before the disconnected signal is emitted or while the connection object
still has valid wl_client native handle.
2021-05-12 22:39:07 +03:00
Vlad Zahorodnii
da3f4923f1 Scanner: Clean up display destroy listener in deferred global destroy func
We also need to clean up the display destroy listener in the deferred
global destroy func to avoid use-after-free bugs on the display tear down.
2021-05-12 13:52:59 +00:00
Vlad Zahorodnii
e4271a787f Scanner: Remove global version check
libwayland-server ensures that the requested version is less than or
equal to the global version.

This change removes the global version check to simplify the generated
code and reduce memory usage footprint, however the latter shouldn't be
that noticeable.
2021-05-12 14:41:15 +03:00
Vlad Zahorodnii
d9eb05c9a7 Fix delayed global removal
Unfortunately, we cannot just simply unset the wl_global's user data.
The compositor still needs to process client requests after the global
has been removed, for example bind requests or the requests that create
new resources.

CCBUG: 435258
2021-05-12 10:59:45 +03:00
Vlad Zahorodnii
94c92393b1 Prevent potential QMap detaching
Store resourceMap() in a local const variable to avoid detaching.
2021-05-05 23:02:01 +03:00
Vlad Zahorodnii
cdafb5d0da Remove irrelevant workarounds
We have a local fork of qtwaylandscanner so we don't need any quirks to
handle inert resources.
2021-05-05 22:57:53 +03:00
Friedrich W. H. Kossebau
6dd131d815 Port away from ECMSetupVersion's deprecated *_VERSION_STRING CMake variable
GIT_SILENT
2021-05-04 22:13:59 +02:00
Aleix Pol
674e1433af textinputv2: readability
Remove unnecessary casts
2021-05-01 03:24:24 +02:00
Aleix Pol
036663e76d textinputv2: announce the input panel to be hidden as the instance gets disabled
Otherwise we disable it and all events will be disabled (since surface
gets cleared).
This is especially useful since otherwise we lose synchronicity with the
client and weird behaviours happen (like when the client thinks it has a
keyboard but it actually does not).
2021-04-30 12:46:14 +00:00
Xaver Hugl
3b7a43e54b Add VRR to OutputDevice and OutputConfiguration 2021-04-29 13:37:37 +00:00
Aleix Pol
6a3e80d11d Use Q_ENUM on enum class
Otherwise it can't be passed to QDebug at all
2021-04-29 11:04:37 +00:00
Alexander Lohnau
3acd2b5a26 GIT_SILENT Add trailing comma to enums 2021-04-29 11:45:00 +02:00
Aleix Pol
445289d168 Fix leak in test
Unregister an interface when we're done with it. This also ensures we
don't have several running in parallel as well.
2021-04-22 17:31:26 +02:00
Aleix Pol
c9c1c3ae0d Make sure we don't leak interfaces
Properly set the parent
2021-04-22 17:30:54 +02:00
Aleix Pol
b2d648df5d datadevice: do not call a null dragSource
Fixes the following backtrace:
*0  KWaylandServer::DataDeviceInterface::dragSource() const (this=0x0)
at ./src/server/datadevice_interface.cpp:199
*1  0x00007f10d67b0c71 in
KWaylandServer::DataDeviceInterface::updateDragTarget(KWaylandServer::SurfaceInterface*,
unsigned int) (this=0x55c42e3ee9a0,
surface=surface@entry=0x55c42e4b3170, serial=serial@entry=3104)
    at ./src/server/datadevice_interface.cpp:278
*2  0x00007f10d67d8e52 in
KWaylandServer::SeatInterface::setDragTarget(KWaylandServer::SurfaceInterface*,
QPointF const&, QMatrix4x4 const&)
(this=this@entry=0x55c42d422ed0, surface=0x55c42e4b3170,
globalPosition=..., inputTransformation=...) at
/usr/include/c++/9/bits/atomic_base.h:413
*3  0x00007f10d67d9209 in
KWaylandServer::SeatInterface::setDragTarget(KWaylandServer::SurfaceInterface*,
QMatrix4x4 const&) (this=this@entry=0x55c42d422ed0, surface=<optimized
out>, inputTransformation=...)
    at ./src/server/seat_interface.cpp:578
*4  0x000055c42cb4563a in KWin::Xwl::XToWlDrag::setDragTarget()
(this=this@entry=0x55c42ea07a00) at ./src/toplevel.h:990
*5  0x000055c42cb47a68 in KWin::Xwl::XToWlDrag::offerCallback(QString
const&) (mime=..., this=0x55c42ea07a00) at ./src/xwl/drag_x.cpp:242
*6  KWin::Xwl::XToWlDrag::offerCallback(QString const&)
(this=0x55c42ea07a00, mime=...) at ./src/xwl/drag_x.cpp:237
*7  0x00007f10d5dc06fe in  () at /lib/x86_64-linux-gnu/libQt5Core.so.5
2021-04-22 12:21:42 +02:00
Xaver Hugl
3905cfe3ee Add support for overscan 2021-04-19 13:02:18 +02:00
Heiko Becker
d4e5468c70 cmake: Specify file extension for idleinhibit_v1_interface
Gets rid of a cmake warning.

GIT_SILENT
2021-04-16 16:23:17 +02:00
Laurent Montel
2908a02d92 It's deprecated in qt5.15 2021-04-08 22:32:25 +02:00
Vlad Zahorodnii
da81f4c9e8 Send valid UUIDs for output device globals
Currently, kwin sends invalid uuids. This change makes harder to send
invalid uuids by porting relevant parts of the OutputDeviceInterface to
QUuid.
2021-04-08 17:35:30 +00:00
Vlad Zahorodnii
8f3993c91b Drop workaround for QTBUG-52092
I've been using kwaylandserver without this workaround for a while and
haven't experienced any issues. Also, there were some sub-surface fixes
in QtWayland.
2021-04-08 10:17:01 +03:00
Vlad Zahorodnii
8b7136f70d Send only current wl_output mode
Non-current output modes were deprecated due to various reasons, e.g.
it's not possible to remove some nodes; two modes can have the same
resolution and the refresh rate but different flags, but wl_output.mode
fails to communicate that properly; the usefulness of non-current modes
is questionable. For more details, please refer to [1].

[1] https://gitlab.freedesktop.org/wayland/wayland/-/issues/92
2021-04-07 11:04:26 +00:00
Vlad Zahorodnii
f30bd9e341 Rework OutputInterface following new design principles 2021-04-07 11:04:26 +00:00
Vlad Zahorodnii
f16320e693 Don't use nested private class in ClientConnection
Nested private classes are highly discouraged in KWaylandServer due to
their flaws, e.g. it's very easy to forget to put Q_DECL_HIDDEN, etc.
2021-04-06 06:45:39 +00:00
Vlad Zahorodnii
35d601bb23 Don't use nested private class in FilteredDisplay
The usage of nested private classes is highly discouraged in
kwaylandserver due to various reasons, e.g. it's easy to forget to put
Q_DECL_HIDDEN, etc.
2021-04-05 11:35:06 +03:00
Vlad Zahorodnii
f119c9470d Fix some coding style issues in FilteredDisplay 2021-04-05 11:33:54 +03:00
Vlad Zahorodnii
ba4f796e24 Remove some unused includes 2021-04-05 11:20:24 +03:00
Vlad Zahorodnii
7058710eca Use code generated by qtwaylandscanner to send xdg-exported handle
This was overlooked during the port to the new approach.
2021-04-02 10:04:49 +03:00
Vlad Zahorodnii
18815f88fb Drop SurfaceInterface::trackedDamage()
There is no need for both kwin and kwaylandserver track damage.
2021-03-31 13:33:29 +00:00
Vlad Zahorodnii
75a6fd29fd Introduce SurfaceInterface::childSubSurfacesChanged
Currently, the SurfaceInterface class has a signal that is emitted
whenever any sub-surfaces in its sub-tree changes in a way that requires
a repaint. It is emitted when a sub-surface is resized, moved, or
damaged, etc. There is no way for the compositor to track changes in the
stacking order of sub-surfaces efficiently.

This change replaces the subTreeChanged signal with a less noisy signal
that's emitted whenever the list of direct child sub-surfaces changes.
2021-03-31 13:24:58 +00:00
Vlad Zahorodnii
daadaa70de Send current primary selection after introducing focused surface
Toolkits such as GTK don't like that kwin sends the current primary
selection before the wl_keyboard.enter event.
2021-03-30 06:03:39 +00:00
Aleix Pol
4a357d503e Fix typo 2021-03-26 15:32:18 +01:00
Vlad Zahorodnii
755004acd0 Remove redundant check
Given that both pointers are not null and the size is a positive
integer, qstrncpy() can never return null.
2021-03-26 13:41:04 +02:00
Vlad Zahorodnii
c56712776a Fix management of keymap files
This is a regression that was introduced with the port to the new
approach.
2021-03-26 13:17:13 +02:00
Vlad Zahorodnii
83087817f4 Forward keyboard events via seat
This is needed for keyboard grabs. If the seat is notified about a
keyboard event, it will need to forward the event to the grab object,
which in its turn will decide what should happen to the event.
2021-03-26 09:08:12 +00:00
Vlad Zahorodnii
70daa07f27 Destroy output device globals with a delay
When hot plugging outputs, we may hit the wl_global race condition.

We need to delay the destruction of output device globals to prevent
hitting that race condition.
2021-03-26 07:50:32 +00:00
Vlad Zahorodnii
b27150387c Fix -Wunused-variable 2021-03-25 17:29:51 +02:00
David Edmundson
1fec9ed4ae Add API to remove globals without immediate destruction
Destroying a global leads to a race on the client. If a client binds
at just the wrong moment they will use an invalid ID and cause a
protocol error. The current best thing to do is to announce the removal
then remove the global (and thus the ID) only after a delay. Non-ideal,
but better than nothing.

Pragmatically this affects only:
Blur/Contrast/Slide/Output/OutputDevice

See https://gitlab.freedesktop.org/wayland/wayland/issues/10 for more.
2021-03-25 12:31:03 +00:00
Vlad Zahorodnii
71d4b463f0 autotests: Drop testPlasmaWindowModel
KWaylandServer doesn't implement the KWayland::Client::PlasmaWindowModel
class so there is no point for carrying this test.
2021-03-25 08:19:19 +00:00
Vlad Zahorodnii
0b688f6b6e Improve code readability in xdg-foreign wrapper
This moves out code that links/unlinks imported toplevels and child
surfaces in functions to improve code readability.
2021-03-25 07:53:36 +00:00
Vlad Zahorodnii
060940e426 Remove unused method in XdgImporterV2Interface 2021-03-25 07:53:36 +00:00
Vlad Zahorodnii
77a065e8de Remove redundant anonymous namespace
static functions already have translation unit internal linkage.
2021-03-24 15:08:31 +02:00
Vlad Zahorodnii
06cfe1a24a Fix a typo
This probably needs to be currentPrimarySelection.
2021-03-23 21:10:07 +02:00
Vlad Zahorodnii
a50f84a868 Merge notifyPointerPress() and notifyPointerRelease()
This brings the API of the SeatInterface class and the PointerInterface
class closer the corresponding Wayland API.
2021-03-23 11:20:03 +02:00
Vlad Zahorodnii
2af2ba6d4c Use common doxygen comment terminator style
In plasma code, it's more common to see `/** ... */` doxygen comments
rather than `/** ... **/`.

This change fixes up doxygen comment terminators to prevent inconsistency
issues.
2021-03-23 08:14:02 +00:00
Vlad Zahorodnii
c94787bbf4 Move DESIGN.md to toplevel directory
This makes DESIGN.md more noticeable.
2021-03-22 21:30:43 +02:00
Vlad Zahorodnii
a3ab80677c Fix handling of the case where specified surface can't imported
An xdg_imported resource must be created no matter whether there is an
exported surface with the specified handle.

This change fixes handling of that case in kwaylandserver by introducing
a dummy imported object.

If there is no exported surface with the given handle, the compositor
should create an xdg_imported resource and immediately send the
destroyed event.

A dummy imported object is needed because generated code sets resource
implementation; otherwise we would set an implementation without any
user data to mark the resource as inert.
2021-03-22 17:46:12 +00:00
Vlad Zahorodnii
d4901d16fa Call XdgImportedV2Interface::send_destroyed() that takes no resource
XdgImportedV2Interface already knows what the associated resource is, so
we can call send_destroyed() method that takes no resource to let auto
generated code figure out what resource must be used. It simplifies code.
2021-03-22 19:42:05 +02:00
Vlad Zahorodnii
e4b9f9761f Simplify emission of XdgForeignInterface::transientChanged signal
We can emit the transientChanged signal directly on the foreign object.
2021-03-22 17:15:02 +00:00
Vlad Zahorodnii
9445bfb6d8 Simplify QHash lookups
QHash provides a convenience helper to lookup a value, use it. It makes
the code simpler.
2021-03-22 17:15:02 +00:00
Vlad Zahorodnii
2f102e7544 Fix various minor coding style issues
This fixes various coding style issues, e.g. wrong variable name
capitalization, wrong brace placement, etc.
2021-03-22 17:15:02 +00:00
Vlad Zahorodnii
e5bde36e96 Get rid of unnecessary private classes in xdg-foreign wrappers
There's no point for using the d-pointer pattern because the importer
and the exporter classes are private already, they are not exposed in
public api.
2021-03-22 17:15:02 +00:00
Vlad Zahorodnii
5b060bcab0 Remove since version tag in OutputInterface
kwaylandserver is an unstable library, this renders since version tags
highly unreliable.
2021-03-22 18:58:48 +02:00
Vlad Zahorodnii
ca69d9e62a Remove noop destructors 2021-03-22 17:42:28 +02:00
Vlad Zahorodnii
0461b7fe27 autotests: Fix testXdgForeign
Currently, testXdgForeign fails because imported and exported resources
are destroyed immediately from destructor request handlers and code that
performs cleanup in the exported-imported mapping tables accesses the
dangling pointers.

Previously, it wasn't an issue because the destruction of exported and
imported resources was delayed using QObject::deleteLater().
2021-03-22 15:31:41 +00:00
Kevin Ottens
d92fa7f140 Add the activity management protocol server implementation 2021-03-22 11:28:57 +00:00
Vlad Zahorodnii
b822c1e63a Simplify handling of inert input method context
If the input method context object becomes inert, just delete it.
2021-03-22 10:16:34 +00:00
Weng Xuetian
823a34a10d Add explicit done to OutputInterface and deprecate zxdg_output_v1.done if version 3 is used.
In zxdg_output_v1 version 3, done is deprecated and should be replaced
with wl_output.done. This makes automatically send done upon change not
suitable for the usage. OutputInterface user should now use done()
explicitly to send the update.

CCBUG: 433224
2021-03-19 10:39:07 -07:00
Usarin Heininga
2414deb86b Expose missing client UUids in plasma windowManagementInterface
StackingOrder.
2021-03-19 13:54:50 +00:00
Vlad Zahorodnii
61a6ee4b07 Rename some methods in xdg-foreign classes 2021-03-17 10:46:11 +02:00
Vlad Zahorodnii
1f83657c65 Remove unused signals 2021-03-17 10:46:02 +02:00
Vlad Zahorodnii
8fc6cb85a6 Remove redundant class forward declarations 2021-03-17 10:43:58 +02:00
Vlad Zahorodnii
9763aec020 Send an icon only if there is one
Currently, plasma window model test fails because the null icon is
received after executing the main body of the test.

    FAIL!  : PlasmaWindowModelTest::testVirtualDesktops() '!dataChangedSpy.wait(100)' returned FALSE. ()
       Loc: [/data/projects/src/kwayland-server/autotests/client/test_plasma_window_model.cpp(583)]

We can fix the test by waiting for the iconChanged signal to be emitted,
but we will need to wait in all tests too. Furthermore, it doesn't make a
lot of sense to wait for an icon that was never set.

This change makes the compositor send an icon only if there is one.

It's a behavioral change, but it shouldn't regress anything because kwin
always sets icons via the plasma window management protocol even for apps
that have no valid app id.

It also makes the api of the PlasmaWindowInterface class more intuitive.
2021-03-16 15:43:59 +02:00
Vlad Zahorodnii
f321882177 autotests: Fix testWindowmanagement
Currently, testIcon fails because the actual and the expected pixmaps
have mismatching formats.

The root cause is that images with an alpha channel will loose the alpha
channel if they are converted to QPixmap using QPixmap::fromImage().

The >> stream operator for the QPixmap class will deserialize pixel data
in a temporary QImage and then use QPixmap::fromImage() to get a pixmap
object.

The >> stream operator for the QIcon class will delegate the task of
reading the icon from a QDataStream to QPixmapIconEngine, which uses the
>> stream operator under the hood to deserialize icon data.

In order to fix testIcon, this change constructs a dummy icon from a
pixmap object returned by QPixmap::fromImage().
2021-03-16 15:28:46 +02:00
Vlad Zahorodnii
bdb138bdcd Remove @since version tags
Currently, we have a mix of Frameworks versions and Plasma versions in
@since tags, which leads to some confusion. Since this is an unstable
library, one cannot rely on since version tags, we are free to add,
change, and remove apis to serve best to kwin requirements. Thus, we can
simply remove all since version tags to fix mixing up different product
versions.
2021-03-16 10:08:21 +02:00
Vlad Zahorodnii
a6ef2cc9e4 Remove pointer asserts in gesture related functions
These asserts were overlooked in 59ae762300.
2021-03-15 18:53:24 +02:00
Vlad Zahorodnii
59ae762300 Replace input device asserts with if checks
KWin may call pointer or touch-related function even if the
corresponding capabilities are missing.
2021-03-15 16:41:14 +00:00
Vlad Zahorodnii
62c8a3829c Don't print a warning if the compositor sets focused surface without wl_keyboard capability
KWin may set focused keyboard surface even if there is no wl_keyboard
capability. :/
2021-03-15 16:41:14 +00:00
Vlad Zahorodnii
43a56a6ce8 Explicitly destroy inert tablet resources
This makes handling of inert resources easier.
2021-03-15 16:34:46 +00:00
Vlad Zahorodnii
16db81b5cc Make RegionInterface private
If a Wayland protocol deals with regions, they will be exposed as
QRegion objects in public API. Therefore, it makes sense to make
RegionInterface private as it's an implementation detail and it's
not intended to be used in public api.

The corresponding test was dropped because the CompositorInterface
no longer emits a signal to indicate that a wl_region has been created.
It should be also noted that wl_region stuff is already tested via
other means, e.g. surface damage, etc.
2021-03-15 16:28:30 +00:00
Vlad Zahorodnii
a60ed431f1 Fix testError
testError expects that the compositor will post a protocol error if the
client tries to create several plasma shell surfaces for the same wayland
surface.
2021-03-15 16:27:41 +00:00
Vlad Zahorodnii
8c32edcd12 Implement wl_keyboard.release
The destructor request was added in version 3. Currently, we support v7.
2021-03-15 12:34:35 +02:00
Vlad Zahorodnii
9089fc5357 Update pressed keys even if there is no focused surface
This is a minor regression introduced with the refactor of the
KeyboardInterface. We need to update pressed key status even if there is
no focused surface, otherwise some keys may get stuck in the pressed
state.
2021-03-15 10:30:34 +00:00
Vlad Zahorodnii
14ccbb8b94 Remove redundant nullptr check
We always check if focusedSurface is not nullptr before calling
sendModifiers().
2021-03-15 10:30:34 +00:00
Vlad Zahorodnii
9526b1c3fe Explicitly send keyboard modifiers
This improves the readability of the setFocusedSurface() method in the
KeyboardInterface class. Currently, it's easy to overlook that the
sendEnter() function also sends modifiers.
2021-03-15 10:30:34 +00:00
Vlad Zahorodnii
4918519eec Simplify KeyboardInterface
KeyboardInterface no longer has a concept of a focused child surface, so
remove relevant dead code.
2021-03-15 10:30:34 +00:00
Xaver Hugl
264bb6c53d Consider the tool type in TabletSeatV2Interface::toolByHardwareSerial 2021-03-14 23:53:19 +01:00
Vlad Zahorodnii
4e16b10e82 Rename some SeatInterface methods following consistent naming scheme
This change renames methods that are used by the compositor to notify the
seat about input events.

There isn't anything special about the proposed naming scheme, for what
it is worth, it was established in weston. "notify" methods are used to
notify kwaylandserver about something, and "send" methods actually send
relevant events to wayland clients.
2021-03-12 10:19:03 +00:00
Adrien Faveraux
d7a1067a7a move output management to the new approach 2021-03-12 11:06:35 +01:00
Aleix Pol
a0419faecb Include implementation of declared method 2021-03-11 13:49:38 +01:00
David Edmundson
1a0020b18f Move PlasmaWindowInterface lifespan management to the caller
PlasmaWindowInterface is a "Server-managed multicasting resources". We
no longer need our wrapper to outlive objects so we can tidy that up.

It's weird to have a method call to an object delete the object, so
memory management is moved to the caller to be consistent.
2021-03-11 12:01:52 +00:00
Adrien Faveraux
54d3d7e68f move output device to the news approach 2021-03-11 11:12:25 +01:00
Vlad Zahorodnii
d853b08659 Post a protocol error if missing seat capability
The protocol spec indicates that the compositor has to accumulate seat
capabilities and post a protocol error if a client requests an input
device and the seat has never had the corresponding capability.
2021-03-10 22:19:00 +02:00
Vlad Zahorodnii
1d7bc7128d Port SeatInterface to the new approach
This rewrites the wl_seat protocol implementation to adhere to the new
design principles.

Effectively, we've been supporting wl_seat v7 so the version was also
bumped from 5 to 7.
2021-03-10 22:18:59 +02:00
Adrien Faveraux
09126dab41 migrate ifndef to pragma once 2021-03-10 20:16:46 +00:00
Vlad Zahorodnii
6289875418 Remove SeatInterface::keyboardCreated signal
It's pointless with the new design.
2021-03-10 17:33:51 +02:00
Vlad Zahorodnii
c08adf1388 Port wl_touch wrapper to the new approach
With the new design, a single TouchInterface manages multiple wl_touch
objects. This allows implementing things such as touch grabs, etc.
2021-03-10 16:06:24 +02:00
Vlad Zahorodnii
6748a31cd1 Rename methods to send press and release events in PointerInterface
This makes the naming scheme consistent. Most methods don't use past
tense to describe what we send, i.e. sendMotion instead of sendMoved.
2021-03-10 14:05:20 +00:00
Vlad Zahorodnii
a9d480ec0d Minor style fixes 2021-03-10 14:05:20 +00:00
Vlad Zahorodnii
178c5d0595 Rewrite wl_pointer implementation with new approach
With this design, a single PointerInterface manages multiple wl_pointer
objects. This makes the API tidier and allows implementing things such as
keyboard grabs more easier.

In addition to that, the PointerInterface doesn't inject its own frame
events anymore. It's up to the compositor to decide when it has to be
sent. However, the PointerInterface may still send a frame event if the
pointer focus changes.

Besides re-writing the pointer interface, this change, unfortunately,
also affects the implementation of pointer-gestures and relative-pointer
protocols because previously they were coupled to individual instances
of PointerInterface.
2021-03-10 14:05:20 +00:00
Vlad Zahorodnii
eb123a40b7 Introduce SurfaceInterface::mapToChild()
The new method provides a convenient way to map a point from the
parent's coordinate system to a child's coordinate system.
2021-03-10 14:05:20 +00:00
Aleix Pol
5a968c89fe Still tell about received pings if they timed out
There's a good chance the user still cares about it. They're free to
ignore it if they want.
2021-03-01 13:09:59 +00:00
David Edmundson
09a45da505 Port all connects
This is mostly all automatic from clazy, though it got confused by a few
namespace issues.
2021-02-25 13:48:11 +00:00
Vlad Zahorodnii
13e03bde1d Prevent sending enter events to already focused surfaces
If the surface already has keyboard focus, do nothing.
2021-02-17 12:18:54 +00:00
Vlad Zahorodnii
377385fa6e Send enter and modifiers events if wl_keyboard is bound by focused client
We need to send out these events; otherwise the client may have
incorrect state for the new wl_keyboard object.
2021-02-17 12:18:21 +00:00
Vlad Zahorodnii
13fa83c7a6 Make some getters in ClientConnection const 2021-02-17 12:18:21 +00:00
Vlad Zahorodnii
3c0b35cd81 Remove unimplemented keyboardsForSurface() method 2021-02-17 13:23:54 +02:00
David Edmundson
6202dbc0a8 Guard against DataSource being deleted during transfer
During a drag the source can disappear at any time. The other client
will be notified, but it may have actions in flight.

Other methods were guarded but not data_offer_finished.
2021-02-16 10:47:28 +00:00
Vlad Zahorodnii
64744103dc Simplify SeatInterface::touchDown() api
Currently, the compositor is supposed to pass the position of the touch
point to the touchDown() function and in return get its unique global
id. The id can be be passed to subsequent touchMotion() and touchUp().

The compositor is responsible for mapping between libinput slots and
internal touch point ids.

The mapping step is unnecessary and adds in some complexity as the input
code now has to keep the mapping table up to date.

This change makes the touch API more convenient to use by making
relevant functions take touch ids that are assigned by the compositor.
Usually, compositor would use libinput_event_touch_get_seat_slot() to
get touch ids.

It also allows introducing event objects that can be useful later in the
future.
2021-02-15 20:03:11 +02:00
Vlad Zahorodnii
b0a20b2815 Prevent setting invalid buffer transform and scale
At the moment, it is possible to crash the compositor if some client
sets a buffer scale less than 1.
2021-02-11 10:10:12 +02:00
David Edmundson
4047053829 Initialise variable 2021-02-02 19:04:25 +00:00
Vlad Zahorodnii
ae5a31acd1 Introduce SurfaceInterface::hasFrameCallbacks()
The new method can be used to check if the surface has a pending frame
callback.

CCBUG: 428499
2021-02-02 14:00:34 +00:00
Nicolas Fella
ca6fa1cbf0 Use versionless Qt cmake target
This makes it easier to build against both Qt5 and Qt6

GIT_SILENT
2021-01-30 17:24:42 +01:00
Vlad Zahorodnii
db6647a8a2 Simplify handling of inert sub-surfaces
With the local copy of qtwaylandscanner, it's possible now to simplify
handling of inert sub-surfaces.
2021-01-29 13:23:02 +00:00
Vlad Zahorodnii
16bf88b67c Print warning messages in KWAYLAND_SERVER logging category
This makes it easier to analyze logs.
2021-01-26 09:22:39 +02:00
David Edmundson
fe8a0a28b5 Import local copy of qtwaylandscanner
This is a copy of the code from Qt5.15 with some backported patches from
development branch of Qt.

One of the upcoming fixes introduces new API, which is why we can't rely
on distro packaging.

The cmake macro is mostly copied from ECM, but set to rebuild generated
code when the scanner changes.
2021-01-26 06:53:59 +00:00
Vlad Zahorodnii
46604a3ca2 xdg-shell: Provide more helpful description for invalid window geometry error 2021-01-21 15:24:45 +00:00
David Edmundson
fbe8aff439 Send SurfaceInterface::enter events after clients bind to outputs
The following order of events are legal:

Typically order is:
 - server announces a new output
 - client binds to a new output
 - server updates the surface to be on new output

But we can have events occur in the following order:

 - server announces a new output
 - server updates the surface to be on new output
 - client binds to a new output

At which point when we update the surface there is no ID to tell the
client which output the surface is on.

This patch watches for clients binding to output and updates
appropriately.
2021-01-12 11:10:50 +00:00
Aleix Pol
6566c91e39 tablet_v2: Readability
Be more explicit about the types, prefer passing semantically correct
parents and keep track of the pads from the object rather than relying
on them being initialised properly.
2021-01-06 02:33:12 +01:00
Aleix Pol
e57f925dfc tablet: Address how he clean resources up 2021-01-06 02:23:13 +01:00
Aleix Pol
1d904daf65 tablet_v2: Further implements missing components
Namely TabletPadV2Interface, TabletPadRingV2Interface,
TabletPadStripV2Interface and TabletPadGroupV2Interface were entirely
missing.
2021-01-06 02:23:13 +01:00
Aleix Pol
c80086ceda tablet_v2: consistency
Add an m_removed attribute to all elements that can send a removed
event.
Never advertise an object that has been marked as removed already.
2021-01-06 02:21:54 +01:00
Carson Black
4fe4a50aa4 xdgshell: wrap v3 of xdgshell protocol 2021-01-05 21:25:38 +00:00
Aleix Pol
9641aa42ec tablet: small cleanups
Add missing &
Remove unnecessary namespace
Consistant m_ prefix
2020-12-16 02:44:17 +01:00
Andrey Butirsky
03fc51ef2f keyboard_interface: Always update modifiers cache
We send modifiers to the active client when they change, and when we
focus an existing client we send the cached state.

For this reason it's important we always update our internal store of
modifiers regardless of whether a surface is currently active.

Unit test is adopted accordingly.

BUG: 429930
2020-12-14 17:09:38 +00:00
Vlad Zahorodnii
09e079b78f Remove factory methods in Display
The main reason why we have factory methods is that up to some point,
kwayland had its own signal to indicate when globals have to be removed.

Now that all globals add destroy listeners for the wl_display object,
we don't have that signal. Most factory methods are equivalent to doing
new T(display).

Besides adding unnecessary boilerplate code, another reason to get rid
of the factory methods is to reduce the amount of merge conflicts. If
several persons work on implementing wayland protocols at the same time,
sooner or later someone will have to resolve merge conflicts in Display.
2020-12-14 13:04:59 +00:00
Xaver Hugl
b5434e51e8 add setCurrentMode(size,refreshRate) 2020-12-12 20:22:40 +00:00
Vlad Zahorodnii
f1f36f3223 Remove COPYING.LIB
LICENSES directory contains full description of every license that is
used in kwayland-server.
2020-12-09 14:36:49 +02:00
Vlad Zahorodnii
329abecabb autotests: Port remaining tests to SPDX license markers 2020-12-09 14:36:18 +02:00
Vlad Zahorodnii
1247a53eba Allow accepting client connections on multiple sockets
libwayland-server allows the wl_display accept client connections on
more than one socket. We currently don't listen on multiple sockets,
but it would be nice if Display supported such operation mode.
2020-12-09 07:20:42 +00:00
Adrien Faveraux
e12bfaa53c Migrate Fake Input into the new approach 2020-12-07 07:52:54 +00:00
Adrien Faveraux
2780d0557a Move slide interface to the new approach 2020-12-01 12:03:48 +01:00
Bhushan Shah
bfc174ea58 keyboard_interface: remove wrapper methods from the seat_interface
And make them public in th keyboard_interface, there's no point in
wrapping this in seat_interface with new approach

See also: plasma/kwayland-server#13
2020-11-19 06:05:06 +00:00
Aleix Pol
0dffc569ea Notify subsurfaces about output changes
Otherwise they wouldn't notice and wouldn't update to the settings of
the new output, like the new output's scaling.
2020-11-17 14:55:07 +00:00
David Edmundson
f91271b29e Allow small timeout intervals in IdleInterface
A threshold exists to stop users flooding the server for no reason.

However, there is a usecase for small timeouts.

rsibreak has a "please relax for 20 seconds" interface. Here it makes
perfect sense to know if a user is active in small increments. The plan
is to start a 1s timer and wait for that. Then we wait locally for 20s
without a resume event.
2020-11-17 13:10:22 +00:00
David Edmundson
02dd1d45a5 Port PlasmaShellSurface to the new approach
This gets rid of some boiler plate and simplifies some code.
2020-11-16 10:04:40 +00:00
Vlad Zahorodnii
0613e8f4c9 Safely end drag if the source data device gets destroyed
We cannot end a drag after the destroyed() signal for the source data
device is emitted because DataDeviceInterface and its d pointer are gone
by that time.
2020-11-11 16:14:45 +02:00
Vlad Zahorodnii
34982850e2 Destroy all clients before destroying wl_display
One of the most disappointing things when writing autotests is dealing
with a race condition where destructor requests are processed after all
globals have been destroyed.

With this change, the Display object will destroy all clients and their
resources before destroying the wl_display object. The good thing about
doing so is that shut down logic becomes simple. We don't have to assume
that wl_resource objects can outlive their wl_global objects, etc. The
bad thing is that it exposed a couple of pre-existing latent bugs in the
data device and the xdg foreign code.

closes plasma/kwayland-server#2
2020-11-11 09:26:57 +02:00
Vlad Zahorodnii
ed83cea823 Store drag-and-drop focus resource using QPointer
We need to clean up the target data device if it has been destroyed in
the middle of a drag and drop. Weston does a similar thing.

BUG: 425793
2020-11-10 23:54:56 +02:00
Aleix Pol
22bf1087a1 Remove unnecessary SKIP_AUTOMOC call
ecm_add_qtwayland_server_protocol() is already doing this.
2020-11-09 11:06:43 +00:00
Vlad Zahorodnii
794e89c3f8 Get rid of private nested classes in tablet interfaces
With the new design, no private nested classes should be used.
2020-11-06 10:20:38 +00:00
Vlad Zahorodnii
d456214ecc Fix license headers for tablet v2 interfaces
We use SPDX license markers in kwayland-server.
2020-11-05 09:29:05 +02:00
Vlad Zahorodnii
fbda5f9d73 Remove unused includes 2020-11-05 09:26:01 +02:00
Vlad Zahorodnii
0a9351039e Rename tablet interfaces according to the current naming conventions
Tablet interface classes must have "V2" in their names because the
corresponding protocol is still unstable.
2020-11-05 07:09:20 +00:00
Vlad Zahorodnii
426e41f500 Check for subsurface loops
If subsurfaces form a loop, kwin will get stuck in an infinite
recursion while it constructs a window pixmap tree.
2020-11-04 23:41:44 +02:00
Vlad Zahorodnii
0ed0066d74 Port pointer-constraints-v1 to the new design 2020-11-04 06:19:13 +00:00
Vlad Zahorodnii
d0c93b5bc5 Post invalid_positioner error to the right resource
The invalid_positioner error is defined for the xdg_wm_base interface,
not xdg_surface.
2020-11-04 06:17:02 +00:00
Vlad Zahorodnii
9f83741621 Introduce resource_cast<> helper function
Getting the object associated with the particular wl_resource is not
difficult, but it involves a pretty reasonable amount of boilerplate
code.

This change, introduces a helper function with an intend to reduce the
amount of boilerplate code.

It can be used as resource_cast<const ObjectPrivate *>(resource) or
just simply resource_cast<ObjectPrivate *>(resource).
2020-11-04 08:15:31 +02:00
Vlad Zahorodnii
1c412b0f16 Introduce DragAndDropIcon
Every time the icon surface is committed, we need to accumulate the
surface offset. However, this is not easy to do on the compositor side
with the current design.

This change introduces a new class DragAndDropIcon that defines a
surface role as well as accumulates surface offsets on every commit.

This fixes a bug where the dnd icon jumps all of sudden while dragging
an image from Firefox to other applications.
2020-11-03 19:53:12 +00:00
Vlad Zahorodnii
94e3c5a21a Port pointer-gestures-v1 interface to the new design 2020-11-03 19:49:57 +02:00
Vlad Zahorodnii
a7f7a5fb17 Port relative-pointer-v1 interface to the new design 2020-11-03 19:49:54 +02:00
Aleix Pol
9bf4b6b624 Remove double lookups 2020-11-02 16:45:42 +01:00
Vlad Zahorodnii
6c113e1cef Rewrite subsurface wrappers following the new design principles
This change rewrites implementation of subsurfaces with qtwaylandscanner
and fixes various smaller issues, such as proper handling of position
updates for subsurfaces in the desync mode and getting rid of QPointer in
the public API.
2020-11-02 08:26:57 +02:00
Vlad Zahorodnii
17cda4bc9b Introduce SurfaceRole name property
This can be useful for protocol error messages.
2020-10-31 18:10:49 +02:00
David Edmundson
071dd60ab2 [autotests] Keep registry on the stack
Parenting both registry and the client connection to the test leads to a
confusing teardown order. Especially as m_connection is explicitly
deleted in cleanup()

Scoping registry to where it's actually used solves that
2020-10-30 16:12:40 +00:00
Vlad Zahorodnii
454265f4c5 Add missing context object 2020-10-30 17:17:41 +02:00
Vlad Zahorodnii
3a72048547 autotests: Hopefully fix all ASAN issues in DataControlInterfaceTest
In general, the destructor is not needed since cleanup() destroys all
client and server resources.
2020-10-30 13:49:10 +00:00
David Edmundson
a8883c35a5 Don't use Qt::UniqueConnection on a lambda
It won't detect properly, instead the same code is moved into a member
function.
2020-10-29 12:49:36 +00:00
Vlad Zahorodnii
74c1b0f336 Store dnd icon surface in a QPointer
If the drag-and-drop icon has been destroyed, return a nullptr rather
than a dangling pointer.

BUG: 428399
2020-10-29 09:05:06 +02:00
David Edmundson
d5ca50deb3 Only connect to BufferInterface::aboutToBeDestroyed once
It is allowed to call surface_attach multiple times with the same
buffer. We want to only connect once.

Found whilst debugging a freeze, going through the list of
BufferInterface connections I had multiple to the same SurfaceInterface.

CCBUG: 428361
2020-10-28 18:16:46 +00:00
Vlad Zahorodnii
f6e98a34b2 Send a cancelled() event if the dnd data source is not accepted
Currently, Firefox will stuck in "dnd" mode if you try to drag any of
its tabs. The main reason for that is that kwin doesn't send the
wl_data_source.cancelled event if the pointer button has been released
and there is no target surface or if the data source hasn't been
accepted by anyone.

CCBUG: 427528
2020-10-28 17:42:32 +00:00
Vlad Zahorodnii
decfb64ada autotests: Fix TestDragAndDrop
Currently, most of tests in TestDragAndDrop should fail because they
don't specify accepted mime type.
2020-10-28 17:42:32 +00:00
Vlad Zahorodnii
a6e78f9340 Check for protocol errors before converting dnd actions
It kind of makes more sense to check for errors and then start doing
the actual work.
2020-10-28 15:37:29 +02:00
David Edmundson
3c7715ce30 Fix crash on drag and drop from xwayland to wayland clients
During DataDevice migration we moved dataDevicesForSurface away from the
existing template macro due to inheritance reasons at the time.

The SeatInterface::setDragTarget() is used with null surfaces
2020-10-26 18:01:12 +00:00
Aleix Pol
571b7e86a8 OutputDevice: only report the scale when scaleFChanged is emitted
scaleChanged and scaleFChanged are emitted at the same time, there's no
reason to send them twice.
2020-10-21 20:47:36 +02:00
Laurent Montel
026923db94 Remove not implemented method 2020-10-21 08:14:39 +02:00
Adrien Faveraux
68e0604ad7 move keyboard to the new approach and refactor the keyboard_interface
- Get rid of the KF5 deprecated methods related to keymap,
  kwayland-server is not source compatible with kwayland, so we don't
  need to keep the deprecated methods
- Move the key repeat, modifiers and keymap handling fully into the
  KeyboardInterface.
- Get rid of some of the keyboard related code base from the
  seat_interface.

Co-Author: Bhushan Shah <bshah@kde.org>
2020-10-20 20:09:51 +05:30
Vlad Zahorodnii
0561c17552 Simplify how infinite input regions are handled
Some input related code in kwin is mislead by the fact that when the
input region is infinite, SurfaceInterface::input() is going to return
an empty QRegion object.

We cannot really do that because the client could have just set a valid
empty wl_region object to ignore all input events.

This change makes SurfaceInterface assign an actually infinite region
when a NULL input region has been passed to set_input_region().
2020-10-19 08:48:52 +03:00
Bhushan Shah
0117122679 input-method-v1: Fix bug regarding the modifier handling
modifiers request by the input method is supposed to send the raw
modifiers based on the keymap of the keyboard grabbed as result of the
grab_keyboard request. If input method client is not using the keysym
functionality it can decide to not send out the modifiers_map, since it
is already known to compositor as part of keymap event sent by it.

While at it also guard against empty modifiers_map, if this happens
ideally compositor should handle that information based on the keymap
sent out using grab_keyboard function, but since currently, we do not
have the grab_keyboard implemented in here, send out the NoModifier if
that happens.
2020-10-16 17:05:42 +05:30
Sebastian Krzyszkowiak
4da1822100 Send wl_pointer.frame when emulating pointer events out of touch ones
When touching a surface that doesn't register to wl_touch events, KWin
didn't send frame events (which it does for regular pointer and touch
events), causing severe updating issues with some clients.

Test Plan:
Launch a client that doesn't attach to wl_touch (for instance,
rootston) with WAYLAND_DEBUG=client and watch the logs while touching
its window.
2020-10-15 00:53:56 +02:00
Bhushan Shah
e84c1dcac2 input-method-v1: improve the test coverage of the class 2020-10-14 09:34:00 +05:30
Bhushan Shah
65111fcbbd autotests: convert file to use SPDX for license and add my name 2020-10-14 09:34:00 +05:30
Bhushan Shah
afef22a57c input-method-v1: remove unused method InputPanelSurfaceV1Interface::id
This was simply unused
2020-10-14 09:34:00 +05:30
Vlad Zahorodnii
780dba4966 Properly handle destruction of XdgOutputV1Interface
The xdg-output spec omits whether the compositor has to destroy all xdg-
output resources when the associated wl_output global is removed.

This means that no xdg-output resource should be destroyed unless the
client has called the destructor request; otherwise the client may panic
due to protocol errors.

Starting with Qt 5.15.2, it's okay to destroy generated wrapper objects
without destroying associated resources. Destructor requests will be
handled behind the scenes for inert and orphaned resources by code that
is generated by qtwaylandscanner.

BUG: 426293
2020-10-13 08:58:04 +03:00
Aleix Pol
489fc93fcf keystates: use the qtwaylandscanner instead of having the boilerplate 2020-10-09 13:17:30 +00:00
Bhushan Shah
c9c05c3899 input-method-v2: pass the reason state was updated to compositor
This removes the signals the requestReset and stateCommitted and
replaces it with single stateUpdated signal.
2020-10-08 17:50:46 +05:30
Bhushan Shah
30a5cc766c text-input-v3: track commit counts per resource
If we track the commit counts at compositor global, this will fail
horribly for anything other than the first text-input-v3 client, as for
new client the serial count will not be what it expects in the done()
request and it will simply consider events as outdated and will refuse
to accept those events
2020-10-07 11:38:46 +05:30
Vlad Zahorodnii
e3e05d291a Use global static variables to store protocol version
s_version is used only to initialize a global so there is no point for
storing protocol version in a static member field and use funky syntax
in the cpp file to initialize it. This change also simplifies the code.
2020-10-02 16:47:19 +00:00
Vlad Zahorodnii
430aa08714 Improve readability of code that destroys frame callback resources
If a frame callback resource is destroyed, it will unregister itself
from corresponding lists in current, pending, and cached state.

However, this means that we need to be super duper careful when the
compositor wants to destroy all frame callbacks. We need to make a copy
of a frameCallbacks list; otherwise a call to removeOne() will
invalidate iterators and the compositor may crash.

Currently, that copy is made implicitly. Some people may see that code
and add qAsConst() without realizing the consequences it will lead to.

This change improves the readability of that code by making explicit
copies of frameCallbacks in code that shuts down SurfaceInterface.
2020-10-02 09:07:15 +03:00
David Edmundson
096deea9ec Port DataDevice to the new inheritance approach
This was done mostly because I wanted to get rid of the Resource
dependency in AbstractDataSource so I can make our xwl bridge direct,
but this also fixes up some issues with object lifespan present in the
previous version and keeps all our clipboard code in-line.
2020-10-01 14:49:33 +00:00
Bhushan Shah
85d6888504 autotests: fix minor compile time warnings 2020-10-01 12:17:42 +05:30
Vlad Zahorodnii
9707e7c443 Hopefully fix build on FreeBSD 2020-09-29 14:11:32 +03:00
Bhushan Shah
48535b8bc1 server: implement the text-input-unstable-v3
This commit implements the zwp_text_input_v3 in kwayland-server, part of
code is inspired based on the initial patch from Roman at D16735.
2020-09-29 16:16:28 +05:30
adrien faveraux
af16210c95 Migrate Window Management to new approach 2020-09-28 11:40:51 +00:00
Vlad Zahorodnii
feeafa93ed Set focused text input surface before emitting focusedTextInputSurfaceChanged()
When the focusedTextInputSurfaceChanged() signal is emitted, it is
expected that SeatInterface::focusedTextInputSurface() will return
the new focused text input surface.
2020-09-23 13:47:02 +03:00
Bhushan Shah
cff380962c autotests: rename file to reflect that it tests only TextInputV2 now 2020-09-23 08:59:59 +00:00
Adrien Faveraux
52d3e054f0 Migrate zwp_text_input_v2 to new approach
- Drop the v0 support, it is no longer used by anything
- Adapt the text-input related methods in seat interface to include
  versioning, this will be useful for when zwp_text_input_v3 support is
  included in kwayland-server
- Refactor SeatInterface to get rid of globalTextInput, it is no longer
  needed with the new approach
- Refactor out the ContentHints and ContentPurpose enums in separate
  header file which can be shared by zwp_text_input_v2/3 implementation

Co-Author: Bhushan Shah <bshah@kde.org>
2020-09-23 08:59:59 +00:00
Aleix Pol
d7ff3703bc Do not create a temporary QRegion unnecessarily
Just modify the one we are updating in one go
2020-09-23 04:20:17 +02:00
Vlad Zahorodnii
260d6e7a22 Keep unreferenced buffers around
One problem with delaying destruction of buffer objects is that the
compositor may create a shadow that references defunct buffers.

One way to fix that issue is to immediately destroy buffers. However,
there is other way to address the issue - keep released buffers alive.

If a buffer is kept alive by the client, then it will most likely be
used again. It also simplifies buffer management.

BUG: 425233
2020-09-21 13:58:37 +00:00
Vlad Zahorodnii
e727dc2fa9 Untangle SurfaceInterface and BufferInterface
A wl_buffer object can be bound to multiple surfaces or none at all. So
the BufferInterface::surface() property makes very little sense.
2020-09-21 13:58:37 +00:00
David Edmundson
0b3cca4ae0 [DataOffer] Avoid calls on null DataSource
A DataOffer can slightly outlive a DataSource; a client will still be
told it's deleted but could call a method in a race.

DataOfferInterface correctly checks for source being still valid, but
nothing updates it when it gets deleted.

BUG: 396308
2020-09-21 11:02:58 +00:00
Vlad Zahorodnii
456106d749 autotests: Fix ASAN issues in TestWaylandSurface::testStaticAccessor
We need to store surface ids before destroying the corresponding
surfaces in order to avoid heap-use-after-free errors.
2020-09-11 14:01:55 +03:00
Vlad Zahorodnii
4ef47641ed autotests: Fix TestInputMethodInterface
If the underlying wl_surface object has been removed, the input panel
surface will be still alive.

Unfortunately, in order to make the test pass, the input panel surface
interface must have a destructor request.

So, the code that tests the destruction of an input panel surface had
been removed.
2020-09-11 11:34:30 +03:00
Vlad Zahorodnii
f8b9ea5680 Rename screencast wrappers according to unstable protocol naming conventions
Since the screencast protocol is unstable, the ScreencastInterface class
and the ScreencastStreamInterface class must carry version info in their
class names.
2020-09-05 14:45:43 +03:00
Vlad Zahorodnii
c3b9d76d33 Use OutputInterface instead of raw wl_resource objects
Typically, we don't expose wl_output objects as wl_resource objects in
public API. Instead, we use the OutputInterface class for that purpose.
2020-09-04 08:48:30 +00:00
Vlad Zahorodnii
77b7635593 Remove unused things in screencast_interface.h 2020-09-04 06:00:44 +00:00
Vlad Zahorodnii
f8dd1c615b Implement layer-shell v1 protocol 2020-09-03 13:42:36 +03:00
Vlad Zahorodnii
861ea96244 Fix remaining usages of REQUIRED_QT_VERSION and KF5_DEP_VERSION
REQUIRED_QT_VERSION and KF5_DEP_VERSION trace their origin back to KF5.
But in Plasma, we use QT_MIN_VERSION and KF5_MIN_VERSION instead.
2020-09-03 09:19:29 +00:00
Bhushan Shah
8ab656541b textinput: introduce a signal for when the state should be committed
In v1 to v3 of textinput protocol, updates for the text input state
needs to be updated explcitly using commit or update state request, so
send out this information to compositor, which can use it to update the
input method state.
2020-09-03 09:08:02 +00:00
Bhushan Shah
03f5339302 input-method: make sendContentType take the TextInputInterface enums
We need to convert the content hint and content purpose to the
protocol values before passing it to the input method since text-input
v0, v2 and v3 have a different values for some of enums. We need to do
manual translation.
2020-09-03 09:08:02 +00:00
David Edmundson
63d2ab4ee6 Link Wayland::Server as an external dependency
Raw wl_ objects are used throughout the public headers repeatedly.

Exporting the linked library helps clients (kwin) build cleanly.
2020-09-02 17:13:11 +01:00
Vlad Zahorodnii
aebae46fe6 Remove redundant wayland-server include 2020-09-02 16:30:55 +03:00
Vlad Zahorodnii
9b15f97326 Switch to upstream version of FindWaylandProtocols
FindWaylandProtocols has been upstreamed to ECM.
2020-08-27 14:02:37 +00:00
David Edmundson
bef0f305cf Delete resources in XdgOutput teardown
Generated code typically cleans up resource objects when the client
calls the relevant destructor.

In multi-cast mode our wrapper can be deleted at any time, whilst a
client resource exists any existing resources that have a pending
message will then crash the compositor.

Deleting resources ahead of time also resolves this. calls to this
resource will no-op. The zxdg_output_v1::destroy_func will then be
called to delete the Resource object.
2020-08-25 13:45:42 +00:00
Vlad Zahorodnii
9b4e2dbdf8 xdg-shell: Add support for v2 2020-08-23 15:11:57 +03:00
Vlad Zahorodnii
7f7a46563b Post an error if the client attempts to create input panel surface for surface that already has role
If a client attempts to create an input panel surface for a wl_surface
that already has a role assigned, we must post a protocol error or else
the behavior of the input panel surface will be undefined.

Posting an error of 0 is not really correct, but on the other hand the
spec has no any error enums.
2020-08-21 10:54:21 +03:00
David Edmundson
11524da289 Port XdgOutput to the new approach 2020-08-20 11:41:14 +00:00
Vlad Zahorodnii
bda8665389 Remove unused forward declarations 2020-08-19 22:25:13 +03:00
Vlad Zahorodnii
a930e59fcf Revert "Don't flush in SurfaceInterface::frameRendered()"
This reverts commit 3cf004b68e.

Unfortunately, 3cf004b broke a couple of tests in kwin due to Qt not
emitting QAbstractEventDispatcher::aboutToBlock() signal when macros
such as QTRY_VERIFY() or QTRY_COMPARE() spin the event loop.
2020-08-18 13:18:58 +03:00
Vlad Zahorodnii
3cf004b68e Don't flush in SurfaceInterface::frameRendered()
Frame callbacks only indicate when the client can start rendering a new
frame, it's not meant to be precise. If the client wants to do some
black magic with frame scheduling and so on, it needs to use a protocol
such as presentation_time. This change removes the pointless flush to
prevent over-flushing client connections.
2020-08-18 07:28:03 +00:00
Aleix Pol
5efebc3a38 Provide an initial implementation for input-method-unstable-v1
Makes it possible to implement the protocol in your favourite
compositor.
2020-08-17 20:09:21 +02:00
David Edmundson
84337d25f9 Add a workaround to prevent klipper racing with clipboard updates
We have a situation where some clients drop their old offer before
creating a new one. This means klipper tries to fill in the empty
clipboard at the same time the client posts its new real contents.

This adds in a flag (via a hidden mimetype) that klipper is trying to
replace a null clipboard. If this flag is set and our clipboard is not
null because the client has updated it in the meantime we ignore the
klipper update.

It's a workaround, rather than an ideal fix at a data level, but it
solves the problem in the interim.

CCBUG: 424855
2020-08-14 15:01:32 +00:00
David Edmundson
89433eccec [autotests] Cleanup DataControlInterface test
The tests were not fully self-encapsulating and leaky.
2020-08-14 15:01:32 +00:00
Vlad Zahorodnii
89debdef60 Undo pointer-gestures v2 changes
The release request was introduced in v2, which we currently don't support.
2020-08-06 15:42:17 +03:00
Adrien Faveraux
23ef883e84 Fix Build Warning 2020-08-05 12:25:09 +00:00
Xaver Hugl
b7bd93c567 Makes the panelAutoHideHideCallback also handle panels set to "windows can cover" 2020-07-28 23:40:43 +02:00
Vlad Zahorodnii
3407b06c58 Fix build 2020-07-28 17:46:06 +03:00
adrien faveraux
9686a31454 Apply 1 suggestion(s) to 1 file(s) 2020-07-28 13:31:03 +00:00
Adrien Faveraux
2c0f977632 migrate Shadow to new approach 2020-07-28 13:31:03 +00:00
Adrien Faveraux
8e6a525fed Migrate dpms to new approach 2020-07-28 12:07:36 +00:00
Adrien Faveraux
dad8e5a79c migrate Plasma Desktop interface to the new approach 2020-07-28 13:29:32 +02:00
Adrien Faveraux
389aec2156 Migrate Migrate XdgForeign to new approach 2020-07-28 11:23:24 +00:00
Adrien Faveraux
ed264e2c55 migrate idle interface to the new approach 2020-07-28 11:01:31 +00:00
Adrien Faveraux
87abc0e483 move idle Inhibitor to the news approach 2020-07-28 10:46:30 +00:00
Aleix Pol
dfeb71d451 linuxdmabuf: don't leak private implementations
Found when running under ASAN
2020-07-28 10:23:30 +00:00
Vlad Zahorodnii
399560973e Bump plasma window management protocol version 2020-07-28 11:45:57 +03:00
Vlad Zahorodnii
4d1847b13e Drop support for the remote-access protocol
It's been replaced by PipeWire stuff.
2020-07-23 18:16:39 +03:00
Aleix Pol
e089092b54 Implement zkde_screencast_stream_unstable_v1 2020-07-23 12:57:17 +00:00
Aleix Pol
97219ec2d5 PlasmaWindow::internalId was deprecated in favor of ::uuid 2020-07-23 12:57:17 +00:00
David Edmundson
ef539368d9 Emit signal before DataControlSource destruction
SeatInterface cleans up when a data source goes away. However the
cleanup also makes use of metaobjects so needs to run before the leaf
class destructor is run.

All other AbstractDataSource objects emit the unbound signal, which
SeatInterface also connects to do a earlier cleanup. Otherwise we get a
crash if a data control source replaces itself.
2020-07-23 11:58:31 +01:00
Vlad Zahorodnii
3994faff50 Rename the aboutToBeUnbound() signal in SurfaceInterface
Rename the aboutToBeUnbound() signal to aboutToBeDestroyed() in order to
make the usage of the word "destroyed" consistent.
2020-07-16 14:31:41 +00:00
Aleix Pol Gonzalez
c57270fa4a Update surface_interface.cpp 2020-07-15 22:22:40 +00:00
David Edmundson
df9413638d Cache clientConnection in SurfaceInterface
Order of a client teardown is:
 - ClientConnection is removed from the static map
 - All our client owned resources are torn down
 - ClientConnection is deleted (via a previous deleteLater)

The recent refactor led to a behavioural change where ::client could
return a null pointer.

We want the client getter to be valid throughout the lifespan of
SurfaceInterface, by doing the lookup once we achieve that.

BUG: 424255
2020-07-15 22:55:37 +01:00
Vlad Zahorodnii
9a23695bab Use shorter name for variable that holds cached subsurface state 2020-07-15 11:05:59 +03:00
Vlad Zahorodnii
33f4254bd1 Port the wl_compositor wrapper to the new approach 2020-07-15 11:05:59 +03:00
Vlad Zahorodnii
46e4f0948b Port the wl_surface wrapper to the new approach 2020-07-15 11:05:57 +03:00
Vlad Zahorodnii
58cd4825e7 Port the wl_region wrapper to the new approach 2020-07-15 11:04:30 +03:00
Vlad Zahorodnii
c42fc80d33 Fix testServerSideDecoration 2020-07-15 08:20:00 +03:00
Vlad Zahorodnii
551b0dc7e0 Use ssd mode enums generated by qtwaylandscanner 2020-07-14 21:50:55 +03:00
Vlad Zahorodnii
7addf10211 Fix build 2020-07-14 21:28:20 +03:00
Adrien Faveraux
095edbed4c migrate Contrast to new approach 2020-07-14 18:24:24 +00:00
Adrien Faveraux
efdc6e44ee Migrate Server Decoration to new approach 2020-07-14 20:17:46 +02:00
Vlad Zahorodnii
ddac3d14d8 Fix build 2020-07-14 13:15:26 +03:00
Adrien Faveraux
aa2626ee4e move eglstream controler to the new approach 2020-07-14 10:10:04 +00:00
Adrien Faveraux
9ead826465 move server decoration palette to new approach 2020-07-13 15:35:57 +00:00
Vlad Zahorodnii
bd62038ada Drop some tests that matter only for KWayland::Client 2020-07-08 10:35:25 +03:00
Vlad Zahorodnii
ed261e2c5b Remove pointless wl_display_terminate()
Since we don't do wl_display_run(), wl_display_terminate() is pointless.
2020-07-08 07:25:23 +00:00
Vlad Zahorodnii
0d45f15c00 Drop unused method
Display::startLoop() isn't used anywhere and it only adds maintenance
burden, so drop it.
2020-07-08 07:25:23 +00:00
Vlad Zahorodnii
a634ce77c1 Allow creating global objects before Display is started
It can be especially useful if the compositor wants to ensure that all
globals have been created before starting to accept client connections.

Unfortunately, start() and terminate() stuff doesn't align well with it,
so the terminate() method was dropped to ensure that Display always
returns the same wl_display object.
2020-07-08 07:25:23 +00:00
David Edmundson
8792a8d6b8 On bind set stacking order only to newly bound client
sendStackingOrderChanged() iterates though all clients. Only the new
client needs to be send information at this point.
2020-07-06 16:47:05 +01:00
Vlad Zahorodnii
ec0c109f4d Provide an easy way to monitor buffer size changes
The main purpose behind the kwaylandserver library is to provide a set
of re-usable wayland compositor extension implementations. However, it's
worth noting that the design of kwaylandserver is far from perfect at
the moment.

KWaylandServer tries to hide all low level wayland details from the
compositor. But it's not the case with buffers, which diminishes the
whole point behind the library.

Creating OpenGL textures from Wayland buffers is the responsibility of
the compositor. So, when it comes to client buffers, we are one foot in
KWaylandServer, and the other foot in the compositor.

Since the surface size is a logical size, the compositor can't use it
for allocating memory for OpenGL textures. This change adds the buffer
size property in SurfaceInterface that can be used for allocating memory
for textures as well as monitoring buffer size changes.

I must say that the introduction of the buffer size property is a crude
hack because BufferInterface just needs to provide an OpenGL texture for
each plane. The main blocker for that is that it would involve moving
the backend, the compositor, and the wayland bits in the same place, for
example kwayland-server or ultimately kwin.
2020-06-30 09:25:24 +03:00
Vlad Zahorodnii
6adaf7bcc6 Document the buffer transform property
The buffer transform is a pretty confusing thing, so document it in
order to avoid misleading people.
2020-06-24 06:58:46 +00:00
Vlad Zahorodnii
ecca34dea3 Rename buffer-specific surface properties
The buffer scale and the buffer transform property specify transforms
that had been applied to the buffer's contents. Neither one of those
properties apply to the surface, in other words the buffer transform
property doesn't indicate that the surface was rotated or flipped or both.

This change doesn't gain anything in terms of new features, etc. It just
attempts to make things more clear.
2020-06-24 06:58:46 +00:00
David Edmundson
dd825dbfb3 Fix bad merge 2020-06-23 01:03:49 +01:00
David Edmundson
5ca1e73804 Merge branch 'Plasma/5.19' 2020-06-23 00:27:00 +01:00
David Edmundson
a664677051 Scope dragAndDropActionsChanged to source lifespan
The source can have a different lifespan to the offer being made.
If a source is removed and we get a drag actions changed before the
offer is cancelled we don't want to crash.

Couldn't reproduce locally, but the trace was good.

BUG: 423127
2020-06-23 00:23:53 +01:00
Vlad Zahorodnii
ac66d25364 Drop SurfaceInterface::inputIsInfitine
Since we don't guarantee SC and BC in KWaylandServer, we can drop
SurfaceInterface::inputIsInfitine().
2020-06-19 16:12:00 +00:00
David Edmundson
b332cb4d1f Assume enabled if DPMS is not supported
This fixes several unit tests in kwin where the virtual output is not
considered enabled causing behavioural changes.
2020-06-19 08:26:47 +00:00
Vlad Zahorodnii
45812785cf Introduce surface-to-buffer and buffer-to-surface matrices
The compositor needs to monitor changes in the mapping between the
surface local coordinates and the buffer coordinates because texture
coordinates correspond to the latter. One way to do it is to monitor
things such as the surface size, the buffer size, the buffer scale,
etc. The main problem with doing so is that there are so many factors
that contribute to how mapping between the surface local coordinate
space and the buffer coordinate space is performed.

In order to provide a generic way for monitoring changes in the mapping
between the surface local coordinate space and the buffer coordinate
space, this patch introduces two new matrices. The first one specifies
how the surface-local coordinates are mapped to buffer coordinates, and
the other one specifies how to map the buffer coordinates to surface
local coordinates.

With the new two matrices, the compositor has a generic way to get
notified when it has to re-compute texture coordinates.
2020-06-19 06:43:31 +00:00
David Edmundson
aa3f0f53c7 Add some hopefully useful documentation for people creating new interfaces
The generated classes don't really have documentation for the generated
methods. This hopes to provide some context.
2020-06-17 17:01:53 +01:00
Vlad Zahorodnii
0c8b77edc0 Drop unnecessary emptiness check
If a buffer is attached to the surface, its width or height cannot be 0.
2020-06-17 06:48:20 +00:00
David Edmundson
562a57945b Port AppMenu Interface to use autogenerated classes
Public API is identical except the now uneeded explit create on the
global.
2020-06-15 07:28:02 +00:00
David Edmundson
e712c5db2b Introduce API round primary-selection-unstable-v1.xml AKA middle-click paste
It's mostly a copy-paste of DataDevice.
2020-06-03 14:45:30 +01:00
Vlad Zahorodnii
963551d775 Add support for the wp_viewporter protocol
The wp_viewporter compositor extension allows clients to crop and scale
their surface. It can be useful for applications such as video players
because it may potentially reduce their power usage.
2020-06-02 15:33:00 +03:00
Vlad Zahorodnii
99ef521e6d Add methods for converting buffer and surface coordinates
Unfortunately, in order to map a point from the surface-local coordinate
space to the buffer pixel coordinate space, one cannot divide the point
by the scale factor since the buffer might be rotated or flipped.

This change introduces a couple of helper methods for converting points,
regions, and rectangles from the surface-local coordinates to the buffer
pixel coordinates and vice versa.
2020-06-01 17:04:50 +03:00
Vlad Zahorodnii
8651045c4b Mark the buffer transform as committed
We need to mark the buffer transform as committed or else it won't be
ever applied.
2020-06-01 17:04:50 +03:00
Vlad Zahorodnii
238f59365f Simplify code that emits mapped() and unmapped() 2020-06-01 17:04:50 +03:00
Vlad Zahorodnii
6bdd20d47b Introduce methods for retrieving individual buffer dimensions
The new methods can be useful when one wants to get the size of the
buffer along some specific dimension, e.g. width or height.

Of course, size() could be used for this purpose, but with the new
helper methods, one has to type less.
2020-06-01 17:04:50 +03:00
Vlad Zahorodnii
85161bb644 xdg-shell: Reset xdg_toplevel and xdg_popup on unmap 2020-06-01 14:48:51 +03:00
Vlad Zahorodnii
e3ad23ccd8 xdg-shell: Rewrite wrappers for the xdg-shell protocol
The current xdg-shell wrappers don't match existing abstractions in the
xdg-shell protocol well, which makes it more difficult to refactor code
that is responsible for managing configure events and geometry in kwin.

Given that the xdg_decoration and the xdg_shell protocols are tightly
coupled together, I had to rewrite our wrappers for the xdg_decoration
protocol as well.
2020-06-01 14:48:51 +03:00
Vlad Zahorodnii
5955d0486d xdg-shell: Drop support for v6
It's been deprecated for quite a while and all major toolkit already
support xdg_wm_base.
2020-06-01 14:48:51 +03:00
Vlad Zahorodnii
775dd4e134 xdg-shell: Drop support for v5
It's been deprecated for quite a while and all major toolkits already
support xdg_wm_base.
2020-06-01 14:48:51 +03:00
Adriaan de Groot
8715e441a7 Fix test-building on FreeBSD
This is the same change as
	https://invent.kde.org/frameworks/kwayland/-/merge_requests/2
and removes an unneeded #include
2020-05-31 22:40:11 +02:00
Benjamin Port
9ffee262f7 Fix class names for keyboard shortcuts inhibit 2020-05-29 11:30:10 +02:00
Benjamin Port
a452ff1642 Add keyboard_shortcuts_inhibit protocol
Reviewers: zzag, davidedmundson, apol

Subscribers: romangg, crossi, kde-frameworks-devel

Tags: #frameworks

Differential Revision: https://phabricator.kde.org/D29231
2020-05-29 10:46:47 +02:00
Vlad Zahorodnii
ca210bf2b4 Add missing parameter name 2020-05-28 11:09:27 +03:00
Vlad Zahorodnii
6fd661bba9 Add some boring documentation for data control wrappers
This change adds some documentation that describes the purpose of data
control wrappers in a few words.
2020-05-28 11:09:27 +03:00
Vlad Zahorodnii
fc38e55547 No auto
"auto r" implies that it's a resource, but it's not.
2020-05-28 11:09:27 +03:00
Vlad Zahorodnii
1c3059c74b Fix class names for data control wrappers
The data control protocol is unstable. Therefore, class names must have
"V1" suffix.
2020-05-28 11:09:02 +03:00
Vlad Zahorodnii
c3094c686e Pedantic whitespace changes 2020-05-28 10:48:06 +03:00
David Edmundson
6156f86548 Add DataControl iface
Summary:
This patch makes use of wlroot's DataControl interface to support
clipboard management.

Unlike wl_data_device clipboards are sent on every change to all
watchers.
If the data device has a selection set it updates immediately.

Because it was started a year ago it uses the existing style of
wrapping objects. The unit test uses the new approach.

Test Plan:
Updated kwin
used wlroot's wl-copy, wl-paste which are xclip replacements to
show that the clipboard updated correctly

Reviewers: #kwin

Differential Revision: https://phabricator.kde.org/D29330
2020-05-26 13:32:56 +01:00
David Edmundson
149b836d43 Introduce AbstractDataSource round the DataSourceInterface
Summary:
Clipboard managers and middle click paste are new protocols.

We want to be able to copy from a clipboard manager to a regular
clipboard and vice versa without duplicating loads of code.

If we support kliper's "syncronise contents of the clipboard and
selection" inside the compositor that would become an unmanageable amount
of combinations.

It also potentially allows the idea of our XWayland bridge not being a
wayland client and simplifying that code.

Test Plan: Unit test passes

Reviewers: #kwin

Subscribers: zzag

Differential Revision: https://phabricator.kde.org/D29329
2020-05-26 12:49:01 +01:00
David Edmundson
395cc4f945 Manage active selection as active DataSource than DataDevice
Summary:
A DataDevice will have zero or one active DataSource as the seclection.

In the existing code we track the current data device then update it to
the newest data device
when the source inside a data device changes.

If we store the active data source inside Seat instead of the device
everything becomes
somewhat simpler and safer.

An entire unit test vanishes as that case of an externally set
DataDevice with no source
can no longer happen.

There's also a lot of duplication that's been merged in this patch so we
have one path.

There are some technical behavioural changes in particular we do cleanup
when the
source vanishes rather than the data device, but if anything that seems
safer and more correct.

It's a precursor for introducing an abstraction class round the source
without needing to meddle
with too much code.

Test Plan: Relevant unit tests passed, ran with it for a while with no
issue.

Reviewers: #kwin

Differential Revision: https://phabricator.kde.org/D29328
2020-05-26 09:31:03 +01:00
David Edmundson
81f9b8f0ff [BlurInterface] Port to the new approach
BlurInterface always used to be my go-to template when starting a new
protocol, we may as well make it up-to-date with the generation.

Code is reduced by a third.
2020-05-26 08:13:09 +00:00
Méven Car
286b68ea05 Add OutputInterface::isEnabled 2020-05-25 14:00:39 +02:00
Vlad Zahorodnii
4f4f425538 Drop support for wl_shell_surface
wl_shell_surface has been deprecated for quite a long time. Nowadays
most clients use the xdg-shell protocol to create desktop-style user
interface elements.
2020-05-20 16:09:30 +03:00
Méven Car
0e70af208c Fix test after OutputInterface: Initialize output in Off state
ctest passes again
2020-05-20 12:22:23 +02:00
Vlad Zahorodnii
15dd855ef9 GIT_SILENT: Remove .arcconfig and .arclint
KDE has switched to GitLab.
2020-05-20 12:02:43 +03:00
Méven Car
0f1bc5e8ca OutputInterface: Initialize output in Off state 2020-05-20 08:56:11 +02:00
David Edmundson
f7d9dd411c Drop deprecated QtSurfaceExtensionInterface
Summary: This isn't used by kwin or Qt anymore

Differential Revision: https://phabricator.kde.org/D29338
2020-05-18 16:20:57 +01:00
David Edmundson
07369dfee0 Support mulitple data devices on a single client
Summary:
Firefox has two wl_data_devices. One in firefox code one in GTK code.
Both need to get data offers.

I've left handling the case for multiple data devices and drags to make
this patch feasible to put into 5.19 and I didn't want to make this
patch invasive.

Test Plan:
Firefox in wayland
WAYLAND_DEBUG=1 firefox |& grep data
Shows now both created devices get offers
Also I can paste

Reviewers: #kwin, zzag

Reviewed By: #kwin, zzag

Subscribers: meven, ngraham, zzag

Differential Revision: https://phabricator.kde.org/D29720
2020-05-18 13:05:48 +01:00
David Edmundson
9454421ff7 Support mulitple data devices on a single client
Summary:
Firefox has two wl_data_devices. One in firefox code one in GTK code.
Both need to get data offers.

I've left handling the case for multiple data devices and drags to make
this patch feasible to put into 5.19 and I didn't want to make this
patch invasive.

Test Plan:
Firefox in wayland
WAYLAND_DEBUG=1 firefox |& grep data
Shows now both created devices get offers
Also I can paste

Reviewers: #kwin, zzag

Reviewed By: #kwin, zzag

Subscribers: ngraham, zzag

Differential Revision: https://phabricator.kde.org/D29720
2020-05-18 09:44:57 +01:00
Vlad Zahorodnii
7c7d9a117b [server] Introduce mapped() signal
Summary:
In KWin, we need to know when a sub-surface becomes mapped or unmapped
so we can generate or filter out window quads for the sub-surface.

Reviewers: #kwin, davidedmundson, apol

Reviewed By: #kwin, davidedmundson, apol

Differential Revision: https://phabricator.kde.org/D29256
2020-05-04 14:55:15 +03:00
David Edmundson
9ef8ce53ce Revert "Add wrapper for wl_global_remove"
This reverts commit 78a8b6877c.

Despite being a useful fix for an important crash it forces a dependency on
libwayland 1.8, which some distros don't have.
2020-04-30 13:32:18 +02:00
Aleix Pol
768de2aac4 Don't include the KWaylandServer namespace on includes 2020-04-30 12:01:30 +02:00
Aleix Pol
306f242ac8 Port namespaces and includes 2020-04-29 16:56:38 +02:00