Skip to content

Commit 6a118b5

Browse files
committed
Draw checkerboard (or clear color) under embedded window.
1 parent c0ebba6 commit 6a118b5

File tree

4 files changed

+36
-1
lines changed

4 files changed

+36
-1
lines changed

editor/plugins/embedded_process.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,20 +30,27 @@
3030

3131
#include "embedded_process.h"
3232

33+
#include "core/config/project_settings.h"
3334
#include "editor/editor_string_names.h"
3435
#include "scene/main/window.h"
3536
#include "scene/resources/style_box_flat.h"
3637
#include "scene/theme/theme_db.h"
3738

3839
void EmbeddedProcessBase::_notification(int p_what) {
3940
switch (p_what) {
41+
case NOTIFICATION_READY: {
42+
ProjectSettings::get_singleton()->connect("settings_changed", callable_mp(this, &EmbeddedProcessBase::_project_settings_changed));
43+
} break;
4044
case NOTIFICATION_ENTER_TREE: {
4145
window = get_window();
46+
transp_enabled = GLOBAL_GET("display/window/per_pixel_transparency/allowed");
47+
clear_color = GLOBAL_GET("rendering/environment/defaults/default_clear_color");
4248
} break;
4349
case NOTIFICATION_DRAW: {
4450
_draw();
4551
} break;
4652
case NOTIFICATION_THEME_CHANGED: {
53+
checkerboard = get_editor_theme_icon(SNAME("Checkerboard"));
4754
focus_style_box = get_theme_stylebox(SNAME("FocusViewport"), EditorStringName(EditorStyles));
4855
Ref<StyleBoxFlat> focus_style_box_flat = focus_style_box;
4956
if (focus_style_box_flat.is_valid()) {
@@ -60,6 +67,12 @@ void EmbeddedProcessBase::_notification(int p_what) {
6067
}
6168
}
6269

70+
void EmbeddedProcessBase::_project_settings_changed() {
71+
transp_enabled = GLOBAL_GET("display/window/per_pixel_transparency/allowed");
72+
clear_color = GLOBAL_GET("rendering/environment/defaults/default_clear_color");
73+
queue_redraw();
74+
}
75+
6376
void EmbeddedProcessBase::_bind_methods() {
6477
ADD_SIGNAL(MethodInfo("embedding_completed"));
6578
ADD_SIGNAL(MethodInfo("embedding_failed"));
@@ -68,6 +81,17 @@ void EmbeddedProcessBase::_bind_methods() {
6881
}
6982

7083
void EmbeddedProcessBase::_draw() {
84+
if (is_embedding_completed()) {
85+
Rect2 r = get_adjusted_embedded_window_rect(get_rect());
86+
#ifndef MACOS_ENABLED
87+
r.position -= get_window()->get_position();
88+
#endif
89+
if (transp_enabled) {
90+
draw_texture_rect(checkerboard, r, true);
91+
} else {
92+
draw_rect(r, clear_color, true);
93+
}
94+
}
7195
if (is_process_focused() && focus_style_box.is_valid()) {
7296
Size2 size = get_size();
7397
Rect2 r = Rect2(Point2(), size);
@@ -79,13 +103,15 @@ void EmbeddedProcessBase::set_window_size(const Size2i &p_window_size) {
79103
if (window_size != p_window_size) {
80104
window_size = p_window_size;
81105
queue_update_embedded_process();
106+
queue_redraw();
82107
}
83108
}
84109

85110
void EmbeddedProcessBase::set_keep_aspect(bool p_keep_aspect) {
86111
if (keep_aspect != p_keep_aspect) {
87112
keep_aspect = p_keep_aspect;
88113
queue_update_embedded_process();
114+
queue_redraw();
89115
}
90116
}
91117

editor/plugins/embedded_process.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@ class EmbeddedProcessBase : public Control {
4747
Point2i margin_bottom_right;
4848
Window *window = nullptr;
4949

50+
bool transp_enabled = false;
51+
Color clear_color;
52+
Ref<Texture2D> checkerboard;
53+
54+
void _project_settings_changed();
55+
5056
static void _bind_methods();
5157
void _notification(int p_what);
5258

main/main.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3132,6 +3132,9 @@ Error Main::setup2(bool p_show_boot_logo) {
31323132
// from --position and --resolution parameters.
31333133
window_mode = DisplayServer::WINDOW_MODE_WINDOWED;
31343134
window_flags = DisplayServer::WINDOW_FLAG_BORDERLESS_BIT;
3135+
if (bool(GLOBAL_GET("display/window/size/transparent"))) {
3136+
window_flags |= DisplayServer::WINDOW_FLAG_TRANSPARENT_BIT;
3137+
}
31353138
}
31363139

31373140
#ifdef TOOLS_ENABLED

platform/macos/display_server_embedded.mm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@
192192
layer.contentsScale = scale;
193193
layer.magnificationFilter = kCAFilterNearest;
194194
layer.minificationFilter = kCAFilterNearest;
195-
layer.opaque = YES; // Always opaque when embedded.
195+
layer.opaque = NO; // Never opaque when embedded, clear color is drawn by control under the view.
196196
layer.actions = @{ @"contents" : [NSNull null] }; // Disable implicit animations for contents.
197197
// AppKit frames, bounds and positions are always in points.
198198
CGRect bounds = CGRectMake(0, 0, p_resolution.width, p_resolution.height);

0 commit comments

Comments
 (0)