Merge pull request #87856 from bruvzg/transpbg

Automatically set viewport background to transparent when window flag is set.
This commit is contained in:
Rémi Verschelde 2024-02-02 12:06:29 +01:00
commit 10e111477d
No known key found for this signature in database
GPG key ID: C3336907360768E1
2 changed files with 8 additions and 2 deletions

View file

@ -675,7 +675,7 @@
<member name="transparent" type="bool" setter="set_flag" getter="get_flag" default="false"> <member name="transparent" type="bool" setter="set_flag" getter="get_flag" default="false">
If [code]true[/code], the [Window]'s background can be transparent. This is best used with embedded windows. If [code]true[/code], the [Window]'s background can be transparent. This is best used with embedded windows.
[b]Note:[/b] Transparency support is implemented on Linux, macOS and Windows, but availability might vary depending on GPU driver, display manager, and compositor capabilities. [b]Note:[/b] Transparency support is implemented on Linux, macOS and Windows, but availability might vary depending on GPU driver, display manager, and compositor capabilities.
[b]Note:[/b] This property has no effect if either [member ProjectSettings.display/window/per_pixel_transparency/allowed], or the window's [member Viewport.transparent_bg] is set to [code]false[/code]. [b]Note:[/b] This property has no effect if [member ProjectSettings.display/window/per_pixel_transparency/allowed] is set to [code]false[/code].
</member> </member>
<member name="unfocusable" type="bool" setter="set_flag" getter="get_flag" default="false"> <member name="unfocusable" type="bool" setter="set_flag" getter="get_flag" default="false">
If [code]true[/code], the [Window] can't be focused nor interacted with. It can still be visible. If [code]true[/code], the [Window] can't be focused nor interacted with. It can still be visible.

View file

@ -484,9 +484,12 @@ void Window::set_flag(Flags p_flag, bool p_enabled) {
ERR_FAIL_INDEX(p_flag, FLAG_MAX); ERR_FAIL_INDEX(p_flag, FLAG_MAX);
flags[p_flag] = p_enabled; flags[p_flag] = p_enabled;
if (p_flag == FLAG_TRANSPARENT) {
set_transparent_background(p_enabled);
}
if (embedder) { if (embedder) {
embedder->_sub_window_update(this); embedder->_sub_window_update(this);
} else if (window_id != DisplayServer::INVALID_WINDOW_ID) { } else if (window_id != DisplayServer::INVALID_WINDOW_ID) {
if (!is_in_edited_scene_root()) { if (!is_in_edited_scene_root()) {
DisplayServer::get_singleton()->window_set_flag(DisplayServer::WindowFlags(p_flag), p_enabled, window_id); DisplayServer::get_singleton()->window_set_flag(DisplayServer::WindowFlags(p_flag), p_enabled, window_id);
@ -1285,6 +1288,9 @@ void Window::_notification(int p_what) {
_update_viewport_size(); // Then feed back to the viewport. _update_viewport_size(); // Then feed back to the viewport.
_update_window_callbacks(); _update_window_callbacks();
RS::get_singleton()->viewport_set_update_mode(get_viewport_rid(), RS::VIEWPORT_UPDATE_WHEN_VISIBLE); RS::get_singleton()->viewport_set_update_mode(get_viewport_rid(), RS::VIEWPORT_UPDATE_WHEN_VISIBLE);
if (DisplayServer::get_singleton()->window_get_flag(DisplayServer::WindowFlags(FLAG_TRANSPARENT), window_id)) {
set_transparent_background(true);
}
} else { } else {
// Create. // Create.
if (visible) { if (visible) {