Commit Graph

129 Commits

Author SHA1 Message Date
Thaddeus Crews 3572bad292 Merge pull request #119141 from deralmas/wl/hover
Wayland: Improve hovered window handling
2026-05-26 10:09:39 -05:00
ArchercatNEO 3f29efc8a2 HDR: Implement surface supports HDR output.
Previously the Wayland display server would attempt to enable
HDR output and try to detect if it failed afterwards which had some issues.
Now we can query the rendering driver for support and avoid ever enabling
HDR output when this would fail.
2026-05-06 19:51:54 +01:00
Dery Almas 5d961d10ec Wayland: Track transformed mouse position directly
`DisplayServer::get_mouse_position` expects global values, but input
usually works in surface-local coordinates.

Previously, we queried WaylandThread directly and transformed the mouse
position when requested, which was somewhat racy. We now instead keep
track of the transformed position while dispatching input events (as the
whole context is there) and return that when requested.
2026-05-01 13:11:09 +02:00
Dery Almas 1e26d5ef7b Wayland: Track mouse enter/exit events globally
Unlike Godot, Wayland doesn't have the concept of a single "mouse".
Because of this, we could easily emit "mouse enter/exit" events in weird
ways by e.g. using the tablet while using the mouse. This became even
easier to break with the addition of touch support.

This patch does its best to avoid this by tracking a single "hovered
window" and emitting events based on that. This logic is split between
`WaylandThread` and `DisplayServerWayland`:

 * `WaylandThread` does all the "smart" tracking and makes sure that, as
long as there's *any* device pointing something, the hovered window will
be set to something. For example: if I have a pointer on a window and
quickly tap anything, the hover will switch to whatever is under the
pointer instead of getting unset once my finger lifts from the screen.

 * `DisplayServerWayland` actually applies the hover change. This is
tricky as window event dispatching has side effects and might even
delete windows or change the hover itself!
2026-05-01 10:29:55 +02:00
Allen Pestaluky 4309120a4a Fix DisplayServerWayland::window_is_hdr_output_supported to check rendering device for HDR output support and adjust warnings/errors. 2026-04-20 11:11:01 -04:00
Pāvels Nadtočajevs 958510c3e9 Add a bunch of missing window existence checks to HDR methods 2026-04-17 15:53:13 +03:00
Thaddeus Crews 21dbe711c5 Merge pull request #113886 from deralmas/wl-touch
Wayland: Implement touch support
2026-04-15 14:02:35 -05:00
Thaddeus Crews e37b5c4035 Merge pull request #118076 from allenwp/output-max-linear-value-events
[Apple, Wayland] HDR Output: Emit window events when HDR state changes
2026-04-03 11:52:22 -05:00
Allen Pestaluky f9145cbc72 Add HDR events for Wayland and Apple display servers
Co-authored-by: ArchercatNEO <tururu.pompella@gmail.com>
2026-04-02 12:50:38 -04:00
Thaddeus Crews 0f51ed6099 Merge pull request #113543 from bruvzg/win_icons
[DisplayServer] Add per window icon support.
2026-03-30 13:35:47 -05:00
Pāvels Nadtočajevs d47b8d7a64 [DisplayServer] Add per window icon support. 2026-03-23 11:27:09 +02:00
Dery Almas ab135ca3c2 Wayland: Implement touch support 2026-03-20 15:42:20 +01:00
Dery Almas 2d74e56caf Wayland: Fix race with buffer scaling
We now pass the buffer scale along the window size to the display server
and set everything from there.

This should avoid races where the buffer scale changes while we handle
window rect changes.
2026-03-20 14:24:38 +01:00
Thaddeus Crews 179ee951b6 Merge pull request #117530 from ArchercatNEO/wp-color-management-warning
Wayland: Only report HDR request failed warning if HDR was actually requested
2026-03-18 11:43:28 -05:00
Rémi Verschelde e33e98a26f Style: Apply clang-format grouping rules 2026-03-17 20:11:01 +01:00
ArchercatNEO 5b66760492 Wayland: only emit HDR request failed warning if HDR was actually requested
Fixes #117527
2026-03-17 18:52:38 +00:00
Thaddeus Crews 5d0a321575 Merge pull request #102987 from ArchercatNEO/wayland-hdr
[LinuxBSD] Add support for HDR output (Wayland)
2026-03-16 11:32:54 -05:00
ArchercatNEO eee3384e20 HDR output for linuxbsd (wayland) 2026-03-13 16:48:58 +00:00
Dery Almas eb680bc8c3 Wayland: Improve mapping robustness and synchronization
We assumed that a window will be ready after a single roundtrip but
that's actually not guaranteed by the XDG shell protocol.

This patch waits for an arbitrary timeout (10s) before erroring out and
forcefully closing the window. Since this exercised quite some code
paths, it also reworks some window handling logic and fixes a bunch of
synchronization issues.
2026-03-13 08:25:04 +01:00
Rémi Verschelde 727b06a79f Move ProcessID typedef out of OS
This allows decoupling a number of files from `os.h`.
2026-03-04 15:00:45 +01:00
Rémi Verschelde f332faf46b Explicitly include core/os/os.h where used 2026-03-04 09:54:10 +01:00
Rémi Verschelde a447ac95ec Move DisplayServer enums and typedefs to DisplayServerEnums
This will allow decoupling `display_server.h` from a number of headers in the
codebase which only require those enums and not all the DisplayServer API.
2026-03-03 12:44:02 +01:00
Pāvels Nadtočajevs 1306221592 Move accessibility methods/enums from DisplayServer to the AccessibilityServer dedicated singleton. 2026-03-02 13:48:29 +02:00
Rémi Verschelde f5a290ac46 Move RenderingServer enums to a dedicated RenderingServerEnums (RSE) namespace
A number of headers in the codebase included `rendering_server.h` just for
some enum definitions. This means that any change to `rendering_server.h` or
one of its dependencies would trigger a massive incremental rebuild.

With this change, we decouple a number of classes from `rendering_server.h`,
greatly speeding up incremental rebuilds for that area.

On my machine, this reduces incremental compilation time after an edit of
`rendering_server.h` by 60s (from 2m57s).
2026-02-25 19:43:03 +01:00
Rémi Verschelde ad4b910a10 Minimize include dependencies of display_server.h
- Removes `native_menu.h` dependency from `display_server.h`.
  It's now forward-declared in all DisplayServer implementations and should
  be included in the .cpp's.
- Removes some unused `rb_set.h` and `rb_map.h` dependencies, which leads to
  having to include them explicitly in half the scene and editor codebase...
  which shows how much we depend on `display_server.h`.
- Forward-declare `input_event.h`, so now we need only `keyboard.h`.
2026-02-17 19:45:31 +01:00
Thaddeus Crews a82e210b5a Merge pull request #116376 from deralmas/wl/noope
Wayland: Skip resize request when the size is the same
2026-02-17 09:28:23 -06:00
Dery Almas 870631211f Wayland: Skip resize request when the size is the same
`DisplayServer::window_set_size` is called lots of times in the code,
with the assumption (I suppose) that it's going to be idempotent.

We had checks in _update_window_rect but we still called
`WaylandThread::window_set_size`, which did a lot of stuff. In
particular, this caused issues with HiDPI as it "overrode" the window
size before it had a time to figure out its scale.
2026-02-16 20:10:54 +01:00
Thaddeus Crews 2762c56829 Merge pull request #112287 from Kiisu-Master/wl_pointer_warp
Add pointer warping on wayland
2026-02-16 10:19:18 -06:00
Kiisu_Master 4dceee5252 Add pointer warping on wayland 2026-02-15 18:16:27 +01:00
Nintorch eb019511ed Optimize files that #include input.h header 2026-01-28 14:21:00 +05:00
Thaddeus Crews ed0ae97d98 Merge pull request #114922 from DarioSamo/android-platform-gl3-fallback-fix
Fix fallback to OpenGL3 from Vulkan initialization on Android.
2026-01-27 09:04:14 -06:00
Dario 542f8ddf22 Fix fallback to OpenGL3 from Vulkan initialization on Android. 2026-01-14 23:55:21 -03:00
Dery Almas 8a448032c2 Wayland: Allow non-interactive window resizing
Despite what I thought in the past, it is allowed, as long as we follow
certain limitations depending on the toplevel's state.

As usual I peppered the code with comments expaining what those
limitations are.

Regarding popups, AFAICT there are no major limitations, although we
should eventually use the new `reposition` method, which autoadjusts the
popup to follow the screen's borders and whatnot. I didn't do that in
this patch as it requires some elbow grease, especially if we want to do
it synchronously.
2026-01-14 11:20:06 +01:00
Riteo Siuga 33a48f1387 Wayland: Track popup menu mouse mask properly
We were updating `last_mouse_monitor_mask` only if there were popup
menus open, which is obviously wrong.
2026-01-03 21:48:18 +01:00
Rémi Verschelde 5d5db072f3 Merge pull request #113656 from deralmas/gray-goo-scenario
Wayland: Work around window scale ambiguity
2025-12-16 11:26:42 +01:00
Thaddeus Crews 206f1b5a7c Merge pull request #113977 from deralmas/wl-misc-fixes/shhhhh
Wayland: Silence `window_get_wl_surface` on invalid window
2025-12-15 08:01:05 -06:00
Dery Almas 874dd28d66 Wayland: Silence window_get_wl_surface on invalid window
Makes it more consistent with the rest of the `WaylandThread` methods
(so that we can silently check for the window's existence).

Fixes errors when trying to capture the pointer when no surface has been
pointed yet (its logic assumed that this method was silent).

We double-check everywhere anyway but I added it in some places where we
can't either guarantee that it'll check (to avoid segfaults) or that
would be useful to report directly.
2025-12-13 10:10:29 +01:00
Pāvels Nadtočajevs 1251348c96 [Wayland] Implement keyboard_get_label_from_physical 2025-12-10 13:19:35 +02:00
Dery Almas 99b109e981 Wayland: Work around window scale ambiguity 2025-12-06 00:54:50 +01:00
Dery Almas 9a814b4444 Wayland: Unify key handling logic
Previously we had different logic for direct key presses and client-side
key repetition, as one queued up input events and the other dispatched
them directly (client-side key repetition is run from the main thread).

I kinda figured out that this difference doesn't really matter, as we
can queue them up before the thread message dispatching logic. That's
exactly what we do now, which allows us to make a single method for both
of them, making the code much clearer and simplifying future maintenance.

This patch also includes a tiny fixup in the compose logic, which checks
for the validity of the generated key event before actually working with
it. The cases in which we can end up with an invalid reference are very
few, so it's not the end of the world, but it's still absolutely a good
idea to check, to avoid nasty surprises down the line.
2025-11-30 05:11:40 +01:00
Thaddeus Crews e1b3387513 Merge pull request #108704 from wjt/xdg-portal-inhibit
Support XDG Inhibit portal
2025-11-24 15:59:56 -06:00
ArchercatNEO 4dd5c83f72 Wayland: compile with libdecor=no 2025-11-22 08:29:05 +00:00
metamuffin 6145b0ca29 Add Image.load_exr_from_buffer and enable tinyexr by default 2025-11-21 18:58:26 +01:00
Dery Almas 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
Will Thompson 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
Pāvels Nadtočajevs 281c74550a Make utterance_id 64-bit. 2025-11-07 10:21:20 +02:00
Riteo Siuga 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
Thaddeus Crews 5935a32e32 Core: Cleanup headers in core/config
- `MainLoop` now forward-declared in `OS`
2025-10-06 09:20:56 -05:00
chocola-mint ead282ff13 Remove file_access.h and script_backtrace.h includes from logger.h. 2025-10-05 17:49:23 +09:00
Thaddeus Crews 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