Commit graph

1337 commits

Author SHA1 Message Date
David Redondo
f6bb95f18e Bump plasmashell version to 7 2022-05-09 15:59:19 +00:00
Volker Krause
f32df68f3d Use the properly named screencast Wayland protocol file
This is needed to build with Qt6.
2022-05-06 19:12:06 +00:00
David Edmundson
ab06dd2e31 Add destructor for primary output global 2022-05-06 11:37:54 +00:00
David Redondo
d548f4bce4 Implement plasma-surface open-under-cursor
The surface is positioned at the current cursor location but kept in
bounds to keep it fully visible when the cursor is near the screen border.
2022-05-06 07:19:25 +00:00
Xaver Hugl
aa432e5947 outputconfigurationinterface: don't crash if mode is invalid
When the client makes the request, the compositor may have already
destroyed the mode object.

BUG: 453042
FIXED-IN: 5.24.5
2022-04-29 17:38:08 +00:00
Méven Car
96e82a3631 plasmawindowmanagement: Fix some warnings 2022-04-29 06:21:05 +00:00
Vlad Zahorodnii
4b91c6163f Rename XdgShellClient to XdgShellWindow
The word "client" means different things in wayland and kwin. Use a
better word to refer to windows.
2022-04-23 07:55:51 +00:00
Vlad Zahorodnii
31c069ebf3 wayland: Let ecm_add_qtwayland_server_protocol_kde() work with targets
Makes CMakeLists.txt code a bit safer.
2022-04-22 12:38:41 +00:00
Vlad Zahorodnii
b64f95b703 Integrate kwaylandserver
This makes KWin switch to in-tree copy of KWaylandServer codebase.

KWaylandServer namespace has been left as is. It will be addressed later
by renaming classes in order to fit in the KWin namespace.
2022-04-22 12:27:33 +03:00
Vlad Zahorodnii
411679ea16 Implement wl_surface_offset()
See https://gitlab.freedesktop.org/wayland/wayland/-/merge_requests/123
2022-04-19 12:31:55 +00:00
Vlad Zahorodnii
219cb54d35 Add missing Display class forward declaration 2022-04-19 13:19:20 +03:00
Vlad Zahorodnii
227ab071be Run .clang-format 2022-04-19 13:14:26 +03:00
Weng Xuetian
14ae6e3100 Fix race in wp_drm_lease_v1.
Basically this is a well known issue in wayland for globals. If bind
comes after destroyed, it will raise a invalid global error. The common
practice is to delay the destroy of global. Similar technique is also
applied to wl_output.

CCBUG: 452435
2022-04-16 00:01:12 -07:00
Vlad Zahorodnii
c157e948e2 autotests: Fix TestWaylandSurface
The API of SurfaceInterface was changed so it always maintains an opaque
region.

At the surface commit, if the attached buffer is opaque, the whole
surface will be marked opaque. Otherwise, the specified opaque region
will be intersected with the surface rect.
2022-04-15 09:44:39 +00:00
Nicolas Fella
bb28c84ec4 Add resourceName to plasma windowmanagement
This allows to get the resource name for XWayland windows, which is useful in the task manager
2022-04-09 14:44:19 +00:00
Vlad Zahorodnii
91f883f5ca Simplify code that announces available modes and current mode
If no mode has the current flag set, the first mode object will be
announced twice.

There's also no benefit from sending the current mode as last. If the
current mode changes, the compositor will send the current_mode event,
not the mode event.

BUG: 452318
2022-04-08 15:56:17 +03:00
Vlad Zahorodnii
8f36b431e7 Add Q_ASSERT in OutputDeviceV2Interface::setCurrentMode()
CCBUG: 452318
2022-04-08 11:32:21 +03:00
David Edmundson
c05e2fea45 Guard subsurface parent access.
Whilst a subsurface must have a parent at the time of creation, the
lifespan is not guaranteed afterwards.

It's a weird thing for a client to do, but we need to not crash
afterwards.

If the parent surface is destroyed we should consider the surface
unmapped.

BUG: 452044
2022-04-05 15:33:52 +00:00
David Edmundson
d73bdf2ee2 Fix layer shell reset
In the current form any client committing multiple times without
attaching a buffer would unset the cached state and trigger an error.

It's legal (though weird) to commit multiple times before attaching a
buffer.

We should only reset the state if we commit an empty buffer after having
committed an existing buffer. This brings us in line with XdgShell.
2022-04-05 13:59:12 +01:00
Vlad Zahorodnii
1dd6575d76 Compute valid opaque region at surface commit time
This allows us to simplify rendering code in the compositor.
2022-03-29 16:27:17 +03:00
Volker Krause
a1d61bb6e8 Link against Qt::CorePrivate as we use internal event loop headers here
Needed to compile against Qt6.
2022-03-18 14:34:41 +00:00
Volker Krause
0952512e0a Move Tranche::operator== before its first use
Qt6 QList::operator!= fails to compile otherwise.
2022-03-18 14:34:41 +00:00
Volker Krause
e5a85f503a QScopedPointer in Qt6 doesn't implicitly cast to bool anymore 2022-03-18 14:34:41 +00:00
Volker Krause
e0c1d2583a Add Wayland includes needed to build against Qt6 2022-03-18 14:34:41 +00:00
Volker Krause
ccad0066e7 Disambiguate KWaylandServer::Display
This unfortunately clashes with a typedef in a Qt6 header.
2022-03-18 14:34:41 +00:00
Volker Krause
6cd0014364 Adapt build system to also support Qt6 2022-03-18 14:34:41 +00:00
Volker Krause
09624c5a9b Make the qtwaylandscanner fork build against Qt6 2022-03-18 14:34:41 +00:00
Aleix Pol
124c78cb4b screencast: Support screencast of regions 2022-03-15 16:09:45 +01:00
Xaver Hugl
215de363e8 linuxdmabuf: port to QVector
QVector is much more suitable for modifiers in KWin than QSet, because you
can access the underlying array
2022-03-15 03:25:50 +01:00
Xaver Hugl
9c5d3c9a70 outputchangeset: set default values for vrr policy and rgb range
If this is not done then KScreen will sometimes unintentionally reset them
to the default.

BUG: 442520
FIXED-IN: 5.24.4
2022-03-11 03:51:18 +01:00
Vlad Zahorodnii
8e304963ad Make pointer focus handling less error prone
Currently, if the pointer surface has to change between two surfaces,
the compositor must do the following

    seat->setFocusedPointerSurface(nullptr);
    seat->notifyPointerMotion(newPos);
    seat->setFocusedPointerSurface(focus);

The pointer motion is needed so the enter event has correct position,
setFocusedPointerSurface(nullptr) is needed to avoid sending a bad
motion event before the leave event.

This change makes the pointer focus api less error prone by splitting
setFocusedPointerSurface() in two functions - notifyPointerEnter() and
notifyPointerLeave().

notifyPointerEnter() takes new focus surface as well as the position
where the pointer has entered the surface so the focus update can be
atomic and without any corner cases.

notifyPointerLeave() is used to clear pointer focus.
2022-03-03 13:35:04 +00:00
Marco Martin
fccbe4e027 Add a methood to fore cancel any drag in progress
This is needed to cancel drags by pressing Escape which is
resposibility of the compositor

CCBUG:405267
2022-03-03 09:09:27 +00:00
Manuel Stoeckl
10b109e31c Add support for [ax]bgr16161616 wl_shm formats
These require Wayland 1.20, for the format definitions.
2022-03-02 09:08:53 +00:00
Heiko Becker
df845939a4 Fix kdebugsettings categories file
By using the same EXPORT for ecm_qt_declare_logging_category and
ecm_qt_install_logging_categories.
2022-02-23 10:14:44 +01:00
Kai Uwe Broulik
6e4acb4303 linuxdmabuf: Add unistd.h include
Don't rely on someone else to pull it in for `close()`

Signed-off-by: Eike Hein <eike.hein@mbition.io>
2022-02-22 15:31:38 +01:00
Aleix Pol
62637c1a92 seat: Do not assert on corner touch cases
Consider the cases where we get a touch move or touch up but we never
received a touch down before.

In the case of move, we'll simulate a touchDown right there and move on
with reality.
In the case of touch up, we'll just ignore the event as simulating could
just be more confusing.

BUG: 450338
2022-02-21 04:08:43 +01:00
Vlad Zahorodnii
9e25fd0468 Add support for xdg_toplevel.configure_bounds()
xdg_toplevel.configure_bounds() allows to indicate the client the
maximum surface size bounds.

wayland-protocols: https://gitlab.freedesktop.org/wayland/wayland-protocols/-/merge_requests/41
2022-02-12 14:14:24 +02:00
Tobias C. Berner
17fc13f100 Add missing errno.h include 2022-02-10 09:11:31 +01:00
Arjen Hiemstra
e6c1ccbd3b Fix drag and drop with touch between different windows
When dragging from one window to another, we may end up in a data_device
that didn't get "data_device_start_drag". In that case, the internal
touch point serial will be incorrect and we need to update it to the
serial from the seat. The serial stored in the seat is changed to
std::optional so we can properly check if it is set.
2022-01-27 10:44:58 +00:00
Vlad Zahorodnii
c793dd93d2 Make data source objects "parentless"
The SeatInterface cleans up currentSelection and currentPrimarySelection
when the AbstractDataSource::aboutToBeDestroyed() signal is emitted, but
since the data source and primary data source have parent objects, they
can be potentially destroyed without emitting the aboutToBeDestroyed()
signal and thus leaving dangling pointers in SeatInterface.

CCBUG: 449101
2022-01-25 09:59:59 +02:00
Xaver Hugl
fd3a7c3c99 linuxdmabuf: remove unnecessary fallback
DRM_FORMAT_MOD_INVALID is now explicitly included in KWin where needed
2022-01-14 17:07:07 +01:00
Vlad Zahorodnii
f06e83f241 Replace resize edges flag with an enum
It's more typesafe.
2022-01-12 14:59:06 +02:00
Vlad Zahorodnii
ee1ea077ba Store surface object in tablet cursor using QPointer
The SurfaceInterface can get destroyed and TabletCursorV2 may return a
dangling pointer.

BUG: 446255
2022-01-10 13:17:32 +02:00
Vlad Zahorodnii
49aadee2a9 Use correct "natural" surface size when computing surface-to-buffer matrix
If the source rectangle is not set, we need to use the surface size
given by the attached buffer. It's computed as buffer size / scale, but
the buffer can also be transformed. In other words, we need to compute
the natural surface size as follows - buffer size / scale and transpose
the result if the buffer is rotated 90 or 270 degrees.
2022-01-08 15:15:14 +02:00
Weng Xuetian
5475751c7b Fix testTextInputV3Interface
Put EnableEmitter in the anonymous namespace to avoid it to be linked to the
wrong implementation.
2022-01-04 11:24:45 -08:00
Xaver Hugl
a011fe74b2 linuxdmabuf: fix sending default tranches
Only the first one was getting sent
2022-01-04 15:22:27 +00:00
Weng Xuetian
afc2a1c0aa Clean up the focus handling for text input.
Usually, a client will only use text input v2/v3. Do not return the focused
surface for text input if it has no relevant text input resource.
If text-input object is created after surface get the focus, send
enter to this text input object. Ensure sendEnter and sendLeave always
appear in pair.

Also, use the same technique in text-input-v2 for text-input-v3 to
handle per resource's enable/disable state, and only send update to
enabled text-input-v3 object.
2021-12-29 00:38:48 +00:00
Xaver Hugl
f2bf7fb1f8 linuxdmabuf: allow setting the default tranches 2021-12-23 00:24:48 +00:00
Weng Xuetian
3ef4f994fa Implemnt preedit_styling for text input v2. 2021-12-19 04:09:48 -08:00
Vlad Zahorodnii
a711f90a69 Include linux/input.h without performing any checks
Currently drag-and-drop doesn't work on FreeBSD because relevant input
parts of kwayland-server are not compiled there.

HAVE_LINUX_INPUT_H is set to 0 on FreeBSD because linux/input.h is in
/usr/local/include and check_include_file() doesn't look there.

Regardless of that, as FreeBSD developers pointed out, including
linux/input.h is the recommended way to get input event codes so let's
make it a hard dependency.
2021-12-17 13:12:31 +02:00
Vlad Zahorodnii
6cdf056047 autotests: Remove unrelated client-side wrapper tests
They belong in KWayland::Client.
2021-12-17 06:56:41 +00:00
Tobias C. Berner
1bc7afe8aa Add helpers to read the executable path for a given PID 2021-12-17 06:54:53 +00:00
Weng Xuetian
2da3276a95 Fix the wrong argument order for send_modifiers. 2021-12-12 23:49:44 -08:00
Vlad Zahorodnii
47897e249f Add ServerDecorationInterface::preferredMode()
This change adds the preferred decoration mode similar to what
XdgToplevelDecorationV1Interface has. It's needed to clean up some kwin
code.
2021-12-08 21:31:17 +02:00
Vlad Zahorodnii
1e84a56df8 Introduce fake None xdg-decoration mode
This is intended for borderless maximized windows. They should be
neither client-side nor server-side decorated.
2021-12-08 21:31:16 +02:00
Xaver Hugl
db91050fb5 dmabuf-feedback: fix crash
BUG: 446502
2021-12-05 13:46:52 +01:00
Xaver Hugl
53064d9af3 linuxdmabuf: implement dmabuf-feedback
dmabuf-feedback allows the compositor to give the client feedback on what
formats and modifiers are best to use, and for which devices it needs to
allocate its buffers, which improves performance and efficiency.
2021-11-30 10:22:31 +01:00
Xaver Hugl
43ccc5910b linuxdmabuf: split out declarations for private classes
The cpp file is getting too long and unwieldy
2021-11-28 13:48:14 +00:00
Arjen Hiemstra
8af2a010c7 Implement drag surface transformation for touch events
Reusing the pointer transformation causes drag with touch to send
completely incorrect coordinates. So implement the "TODO" item about
surface transformation for touch, so we send correct drag events for
touch.
2021-11-17 13:32:00 +00:00
Arjen Hiemstra
1bd496f42b DataDevice: Send enter event with a correct position if we're using touch
It used to send the pointer position, which may be somewhere completely
different when we're using touch.
2021-11-17 13:32:00 +00:00
Arjen Hiemstra
10eb1aa0b9 SeatInterface: Expose firstTouchPointPosition
This exposes "globalTouch.focus.firstTouchPos" so other things can use
it in place of "pointerPos" when touch is being used.
2021-11-17 13:32:00 +00:00
Xaver Hugl
6ffe79dab8 OutputDevice: remove properties
They're unnecessary
2021-11-16 21:31:10 +00:00
Vlad Zahorodnii
f72c2196c7 Calculate correct surface-to-buffer matrix with only upscaled viewport
Currently, if a wp_viewport upscales the surface but doesn't set the
source rectangle, the surface-to-buffer matrix will be calculated
incorrectly.

If the source rect is not set, we need to calculate the source size
based on the buffer size and compare it with the destination size. If
the two are not the same, add a scale transform.

BUG: 445346
2021-11-16 07:24:55 +00:00
Xaver Hugl
357b5c1923 OutputDevice: inline update methods 2021-11-15 12:24:49 +01:00
Xaver Hugl
d166db12b6 OutputDeviceInterface: remove signals
They're unused and unnecessary
2021-11-15 09:46:15 +01:00
Vlad Zahorodnii
128570ed53 Restore correct type check for wl_drm client buffers
With the EGLStreams support gone, we can restore the correct type check
for wl_drm client buffers. The spec suggests to query the
EGL_TEXTURE_FORMAT attribute to determine whether the specified wl_buffer
is a wl_drm buffer.
2021-11-10 13:54:56 +02:00
Xaver Hugl
26233a8dfb Remove the EglStream controller interface
As KWin will no longer use EglStreams it is now unnecessary
2021-11-10 12:29:25 +01:00
Aleix Pol
07a1db9b51 Update to changes in Plasma WaylandProtocols to support primary displays
Adds support for kde-primary-output.
Ports to changes in kde-output-management-v2.
2021-11-08 17:00:37 +01:00
Vlad Zahorodnii
4da5fff033 Correctly apply initial xdg-shell double buffered state
Some double buffered state, e.g. min and max size, should be applied
when the initial state is committed.
2021-11-08 15:49:06 +00:00
Aleix Pol
f4070a23d5 xdgoutput_v1: Do not send a done event to every client when a client binds
When binding we just need to be talking to the one client to make sure
it's set up. This saves us from waking up every other process only to
realise that nothing happened.
2021-11-04 00:21:28 +01:00
Vlad Zahorodnii
fb672f335a Fix ownership of SlideInterface
Similar to other interfaces, the lifetime of the SlideInterface should
be bound to the associated resource.
2021-10-31 12:40:23 +02:00
Vlad Zahorodnii
12946a9ec9 Require the compositor to call IdleInterface::simulateUserActivity() explicitly
In some cases, kwin may decide not to forward input events to the seat.
2021-10-27 17:39:37 +03:00
Vlad Zahorodnii
81e7c10a73 Emit DataOfferInterface::dragAndDropActionsChanged() only if dnd actions change
With some apps, firefox specifically, it's possible to enter a dnd
positive feedback loop, e.g.

* kwin sends wl_data_offer::action event
* the app reacts to it and calls wl_data_offer::set_actions() with the
  same actions
* kwin re-sends the wl_data_offer::action event because
  DataOfferInterface::dragAndDropActionsChanged() has been emitted
* the app calls wl_data_offer::set_actions() again, and so on...

This should make D&D in Firefox more responsive.
2021-10-27 15:46:59 +03:00
Vlad Zahorodnii
c45b69595f autotests: Remove interface version assert
It makes the test fail and there's little point for having it.
2021-10-25 21:56:35 +03:00
David Redondo
731ae21cb2 Remove redundant ifs
The resources are already looked up for a specific client.
2021-10-25 08:13:05 +00:00
David Redondo
2aeaf9331b Implement pointer hold gestures interface 2021-10-25 08:13:05 +00:00
Vlad Zahorodnii
e63783df9f Drop legacy virtual desktop api
The plasma window management protocol is intended to be used by
plasmashell. Since kwin and plasmashell have the same release cycle, we
know that the legacy virtual desktop stuff is unused so it can be
dropped to simplify code.
2021-10-25 09:15:42 +03:00
Vlad Zahorodnii
9769969d8c Drop PlasmaWindowInterface::setThemedIcon()
It's unused. KWin uses setIcon() instead.
2021-10-22 18:44:33 +00:00
Aleix Pol
efc7731088 screencast: Implement version 2 of the protocol 2021-10-22 12:49:15 +00:00
Aleix Pol
01645645a7 outputconfiguration: No need to cast, q already is the right type 2021-10-21 23:44:11 +02:00
Rodney Dawes
dff485f13b TextInputV2: Add API to set modifiers map on clients 2021-10-13 14:31:32 -04:00
Rodney Dawes
b58cc08a36 TextInputV2: Don't drop or convert modifiers for keysym events 2021-10-13 14:31:32 -04:00
Rodney Dawes
25942d6fcb InputMethod: Avoid needless complex conversion of key modifiers
As we only need to pass the modifiers around, rather than do anything
internally with them, simply pass them around with minimal conversion.
2021-10-13 14:31:32 -04:00
Alex Richardson
105042ccda Correct the eglQueryWaylandBufferWL_func prototype
I am trying to build against a Qt built without OpenGL. In that case, the
openGL headers have not been included and therefore GLboolean is not
defined. Use EGLBoolean to match the EGL prototype.

See also d18486c033
2021-10-05 11:16:26 +01:00
Vlad Zahorodnii
48d9e4cc0e Automatically close fds for inert resources
If the plasma window resource is inert, the associated get_icon handler
won't be invoked. This results in leaked file descriptors.

With this change, the corresponding close() function call will be
generated to avoid leaking file descriptors and potentially crashing the
session due to kwin running out of fds.

BUG: 438097
2021-09-27 18:02:58 +00:00
Xaver Hugl
ba0d099e38 outputdevice: add missing done events
CCBUG: 442520
2021-09-21 13:34:04 +02:00
Vlad Zahorodnii
5853cc38a1 Send kde_output_device_v1.current_mode to the right resource
Currently, send_current_mode() is called for every mode resource, no
matter whether the given output resource and mode resource belong to the
same client, libwayland-server doesn't like that and it prints a warning
about a compositor bug.

With this change, the output device will remember the mode resources for
every output resource and avoid sending current_mode events with modes
that belong to other clients.
2021-09-20 11:14:50 +00:00
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