Commit Graph

198 Commits

Author SHA1 Message Date
1667e6fcce Merge pull request #113195 from teromene/master
Include xkb-compose in `wayland_thread.h`
2025-11-26 23:44:49 +01:00
b8ef67586d Include xkb-compose in wayland_thread.h. Fixes builds without SOWRAP_ENABLED 2025-11-26 16:00:08 +01:00
69ff129e33 Fix error message when closing the project manager on Wayland 2025-11-26 11:16:08 -03:00
0ebb11041b Merge pull request #113138 from deralmas/embedder-oopsies
Wayland: Fix Wayland driver in export templates
2025-11-25 07:06:59 -06:00
8fb195e20d Wayland: Fix Wayland driver in export templates
I might have accidentally put the socket connection logic inside a
`TOOLS_ENABLED` `#ifdef` xD
2025-11-25 03:36:16 +01:00
e1b3387513 Merge pull request #108704 from wjt/xdg-portal-inhibit
Support XDG Inhibit portal
2025-11-24 15:59:56 -06:00
7477823ad5 Merge pull request #113068 from deralmas/writing-with-style
Wayland: Implement compose and dead key support
2025-11-24 10:21:31 -06:00
8ced63315a Wayland: Implement compose and dead key support 2025-11-22 23:30:23 +01:00
4dd5c83f72 Wayland: compile with libdecor=no 2025-11-22 08:29:05 +00:00
6145b0ca29 Add Image.load_exr_from_buffer and enable tinyexr by default 2025-11-21 18:58:26 +01:00
bbf65ae72f Wayland: Implement game embedding
This patch introduces a new protocol proxy, which multiplxes Wayland
clients into a single connection, allowing us to redirect calls (e.g.
create toplevel -> create subsurface). Mixed with some state tracking
and emulation, we can embed a full-featured client into the editor.
2025-11-19 21:24:18 +01:00
1a3a254e26 Support XDG Inhibit portal
Previously, on Linux and BSD, inhibiting the screensaver was handled
using the org.freedesktop.ScreenSaver D-Bus API. Unfortunately, this API
is not available in a Flatpak sandbox. (This is because there is a
desire to tie inhibit sessions to a specific app and visible window; but
the org.freedesktop.ScreenSaver API does not support this.)

As a result, when using the Flatpak build of the Godot Editor (or a
Flatpak-ed build of a game) and using a controller to play a game, the
session will become idle after a few minutes.

The XDG desktop portal -- which is already used for color-picking, file
choosing, and querying the system theme -- has an Inhibit interface that
provides a superset of the functionality of the
org.freedesktop.ScreenSaver API, and is available to any sandboxed app.

Refactor code for making XDG portal requests that was previously
duplicated for the FileChooser and ColorPicker portal code. Check the
portal version to determine whether these portals can be used:

- FileChooser portal version 3 is required due to the use of the
  "directory" parameter.

- On the Settings portal, the only addition in version 2 is the
  ReadOne() method which is not used here, so version 1 suffices.

- On the Screenshot portal, the only addition in version 2 is the
  "interactive" parameter to the Screenshot() method; this code only
  uses the PickColor() method, so version 1 suffices.

Then, add support for the Inhibit portal. Use it if available and if
running in a sandbox. Prefer to use org.freedesktop.ScreenSaver if not
running in a sandbox, even if the portal is available, because (at least
in the GNOME 43 implementation of the portal) it does not work correctly
if the portal cannot map the request to a running app. This adds a small
amount of complexity to the implementation, but supporting both APIs is
necessary anyway (there are many systems in the wild that support
org.freedesktop.ScreenSaver but not the desktop portal).

Fixes https://github.com/godotengine/godot/issues/108634
2025-11-17 11:46:28 +01:00
281c74550a Make utterance_id 64-bit. 2025-11-07 10:21:20 +02:00
2d7380c3ff Merge pull request #111493 from deralmas/racing-the-thread
Wayland: Defer event thread initialization to late initialization
2025-11-06 08:13:13 -06:00
4df96fc7ab Wayland: Set window parent before commit
Fixes a timing issue where dialogs got configured right before having
their parent set. This gave compositors the time to resize/rearrange the
dialog as if it were a normal window, only to be marked as "floating"
right away. On niri, this manifested as huge dialog windows.

This is achieved with the addition of a `p_parent_id` parameter to
`window_create`, akin to its popup counterpart.

`window_create` now also accepts a single `Size2i` parameter instead of
two integers, in line with the rest of the `WaylandThread` API. The
original idea was to have a very "barebones" API, akin to the `drivers/`
directory, but that didn't pan out.
2025-10-28 04:10:28 +01:00
ab205a78ce Wayland: defer event thread initialization to late initialization
This race condition made me pull my hair. `wl_display_roundtrip` has its
own little event loop, which apparently conflicts hard with the
always-running event loop thread.

I kinda assumed that it would be thread-safe thanks to its internal
`wl_display_prepare_read` call that the docs talk about but that's
clearly not enough.

Luckily this method is called very few times and the only dangerous
instances are in the initialization routine, which first starts the
thread and then does various roundtrips. Libdecor has also some internal
roundtrips of its own which would often fail. Starting the thread after
all initialization fixes the issue.

Tested this by spamming *lots* of `wl_display_roundtrip` in
`WaylandThread::init()` with and without this fix.
2025-10-10 23:25:00 +02:00
0a584250ae Fix: Libgodot build on Linux. 2025-10-10 04:31:14 -05:00
a6e44be2dc Merge pull request #105587 from deralmas/framing-this-moment
Wayland: Emulate frame event for old `wl_seat` versions
2025-10-07 13:06:47 +02:00
5935a32e32 Core: Cleanup headers in core/config
- `MainLoop` now forward-declared in `OS`
2025-10-06 09:20:56 -05:00
ead282ff13 Remove file_access.h and script_backtrace.h includes from logger.h. 2025-10-05 17:49:23 +09:00
3d1c9fd5de Move server files into their subfolders 2025-09-30 19:39:39 -07:00
373ff727f0 Merge pull request #110875 from vmedea/2025-wayland-inhibit-idle
wayland: Inhibit idle in DisplayServerWayland::screen_set_keep_on
2025-09-30 18:35:02 -05:00
21fd4faf1b Merge pull request #107469 from Ivorforce/vector-localvector-explicit-span-conversions
Remove implicit conversions between `LocalVector` and `Vector`
2025-09-30 11:19:17 -05:00
c64ff4b069 wayland: Inhibit idle in DisplayServerWayland::screen_set_keep_on
Without this, the screen does go into idle after a few minutes on a RPi5 with default install (wayland w/ labwc), even
though `screen_keep_on` is set. DBUS is enabled but apparently, the screensaver call is not enough.
2025-09-24 22:17:38 +02:00
ce157a446f Merge pull request #107096 from ArchercatNEO/xdg-toplevel-icon
Wayland: Implement the xdg-toplevel-icon-v1 protocol
2025-09-22 08:50:10 -05:00
05dae23f18 Remove dependency of variant.h in print_string.h
Co-authored-by: Lukas Tenbrink <lukas.tenbrink@gmail.com>
Co-authored-by: A Thousand Ships <96648715+AThousandShips@users.noreply.github.com>
2025-09-19 14:57:36 +08:00
abe3b481ae Make conversions from LocalVector to Vector explicit. 2025-09-16 21:41:28 +02:00
76433b0ede Fix Wayland build with OpenGL disabled. 2025-09-06 18:37:49 +03:00
188b47a29b Wayland: Implement the xdg-toplevel-icon-v1 protocol
Closes #87747
Requires a compositor which supports xdg-toplevel-icon-v1.
As of this commit only KWin supports this protocol.
2025-08-22 09:45:28 +01:00
0edb6bd4a0 [Linux/BSD] Initialize DBus only once. 2025-08-22 09:26:11 +03:00
98537b2e0c Wayland: Fix error condition in window_get_current_screen
Leftover from when the Wayland backend was single-window only.
2025-07-14 15:56:43 +02:00
b60b68055f Wayland: Fix division by zero when scale is less than 1
The `Vector2i` division operator casts doubles down to `int32_t`. It
would thus truncate the fractional scale factor to 0 if less than 1,
resulting in a FPE on x86_64.
2025-06-21 03:09:51 +02:00
856d7108e0 Merge pull request #106414 from Riteo/unexpected-frame
Wayland: Fix stuck pointer buttons on window leave
2025-06-18 18:13:45 -05:00
367cabf692 Wayland: Simplify including protocols 2025-06-10 08:39:20 +01:00
c596d93478 Merge pull request #106175 from akien-mga/linux-build-no-dbus
Linux: Fix build with `dbus=no` or `threads=no`
2025-06-09 00:44:12 +02:00
2d93e004b9 Cleanup and unify DisplayServer screen methods and documentation. 2025-06-02 08:03:48 +03:00
67c317c58d Wayland: Add missing return in selection logic
Fixup to "Wayland: Check selection devices before using them"

This slipped under the radar... until for some reason optimized builds
started crashing, perhaps due to timing-related shenanigans, no idea.
2025-05-26 20:36:15 +02:00
202b1176a4 Merge pull request #106251 from ArchercatNEO/wayland-cursor-shape
[Wayland] Implement the cursor-shape-v1 protocol
2025-05-16 10:29:02 -05:00
3cd7b5b9a8 [Wayland] Implement the cursor-shape-v1 protocol
Related #106229. The cursor-shape protocol allows us to not have to deal with cursor theming and instead depend on the
compositor for it.
This still does not quite solve the issue when the compositor doesn't implement the protocol
(or running under the x11 backend) but for gnome/kde and a few more this should resolve things.
2025-05-15 15:42:48 +01:00
a3913b045d Wayland: Fix stuck pointer buttons on window leave
This issue came from the frame-based refactoring done in the multiwin
PR.

It looks like some (all?) compositors group certain events alongside
`wl_pointer::leave`, which I absolutely did not expect. The docs don't
seem to mention it either from what I can tell.

We now fall-back on the old pointed window if and only if the current
window is invalid and the old one isn't. Each state fetch is guarded
with an `ERR_FAIL_NULL` so this should still catch any potentially
corrupted window with missing data but a valid ID.

I also added the usual big comment so that this "quirk" does not get
lost to time.
2025-05-14 23:30:16 +02:00
d213e72866 wayland: Unbreak build with libdecor=no
In #101774, some libdecor-specific code was added, but without adding the guards. This broke the build with
`libdecor=no`.

Add `#ifdef` guard as necessary.
2025-05-14 13:36:45 +00:00
8b93b67e14 Merge pull request #106315 from Riteo/popping-up-everywhere
Wayland: Fix error spam when closing popup
2025-05-13 01:05:49 +02:00
c3b04e6e1e Wayland: fix error spam when closing popup
Previously we did not check whether the value actually changed or not
and thus would get constant errors for no reason.
2025-05-12 05:11:24 +02:00
5441a82cfb Do not call accessibility_set_window_rect on Wayland, fix main windows accessibility context creation. 2025-05-11 12:51:46 +03:00
e9e8ddc5be Linux: Fix build with dbus=no or threads=no 2025-05-09 15:26:13 +02:00
d4dabd15aa Wayland: Ensure pointed window's existence in mouse_get_position
Should fix a crash with certain compositors.
2025-05-03 20:24:44 +02:00
01fc9aee6c Core: Modernize C headers with C++ equivalents 2025-05-02 08:23:01 -05:00
e7a3729175 fix:Compile error in wayland display server when compiling linuxbsd platform after disabling dbus 2025-04-30 14:22:52 +08:00
3947cbe3b2 Merge pull request #104386 from Repiteo/core/cpp-math
Core: Replace C math headers with C++ equivalents
2025-04-27 19:21:22 -05:00
48882f3ca4 Wayland: Handle fifo_v1 and clean up suspension logic
Before, the WSI was unfortunately quite broken and we had work around it
by manually pacing frames. Needless to say it was not an ideal solution.

Now, the WSI can make use of the new fifo_v1 protocol to work properly.
If it's available, we'll trust the WSI by disabling manual frame pacing.

While we're at it, let's clean up the suspension code a bit by removing
some duplicated stuff and handling the suspension state through a switch
case.
2025-04-20 18:05:35 +02:00