Merge pull request #71289 from RandomShaper/avoid_color_flash
Avoid color flash on window creation and resizing
This commit is contained in:
commit
21893140eb
13 changed files with 77 additions and 4 deletions
|
@ -1262,6 +1262,12 @@
|
|||
Tries to free an object in the RenderingServer.
|
||||
</description>
|
||||
</method>
|
||||
<method name="get_default_clear_color">
|
||||
<return type="Color" />
|
||||
<description>
|
||||
Returns the default clear color which is used when a specific clear color has not been selected.
|
||||
</description>
|
||||
</method>
|
||||
<method name="get_frame_setup_time_cpu" qualifiers="const">
|
||||
<return type="float" />
|
||||
<description>
|
||||
|
|
|
@ -688,6 +688,7 @@ void EditorNode::_notification(int p_what) {
|
|||
|
||||
if (theme_changed) {
|
||||
theme = create_custom_theme(theme_base->get_theme());
|
||||
DisplayServer::set_early_window_clear_color_override(true, theme->get_color(SNAME("background"), SNAME("Editor")));
|
||||
|
||||
theme_base->set_theme(theme);
|
||||
gui_base->set_theme(theme);
|
||||
|
@ -6235,6 +6236,7 @@ EditorNode::EditorNode() {
|
|||
// Exporters might need the theme.
|
||||
EditorColorMap::create();
|
||||
theme = create_custom_theme();
|
||||
DisplayServer::set_early_window_clear_color_override(true, theme->get_color(SNAME("background"), SNAME("Editor")));
|
||||
|
||||
register_exporters();
|
||||
|
||||
|
|
|
@ -753,6 +753,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
|
|||
// Editor background
|
||||
Color background_color_opaque = background_color;
|
||||
background_color_opaque.a = 1.0;
|
||||
theme->set_color("background", "Editor", background_color_opaque);
|
||||
theme->set_stylebox("Background", "EditorStyles", make_flat_stylebox(background_color_opaque, default_margin_size, default_margin_size, default_margin_size, default_margin_size));
|
||||
|
||||
// Focus
|
||||
|
|
|
@ -2653,8 +2653,9 @@ ProjectManager::ProjectManager() {
|
|||
AcceptDialog::set_swap_cancel_ok(swap_cancel_ok == 2);
|
||||
}
|
||||
|
||||
set_anchors_and_offsets_preset(Control::PRESET_FULL_RECT);
|
||||
set_theme(create_custom_theme());
|
||||
Ref<Theme> theme = create_custom_theme();
|
||||
set_theme(theme);
|
||||
DisplayServer::set_early_window_clear_color_override(true, theme->get_color(SNAME("background"), SNAME("Editor")));
|
||||
|
||||
set_anchors_and_offsets_preset(Control::PRESET_FULL_RECT);
|
||||
|
||||
|
|
|
@ -1920,6 +1920,9 @@ Error Main::setup2(Thread::ID p_main_tid_override) {
|
|||
window_position = &position;
|
||||
}
|
||||
|
||||
Color boot_bg_color = GLOBAL_DEF_BASIC("application/boot_splash/bg_color", boot_splash_bg_color);
|
||||
DisplayServer::set_early_window_clear_color_override(true, boot_bg_color);
|
||||
|
||||
// rendering_driver now held in static global String in main and initialized in setup()
|
||||
Error err;
|
||||
display_server = DisplayServer::create(display_driver_idx, rendering_driver, window_mode, window_vsync_mode, window_flags, window_position, window_size, init_screen, err);
|
||||
|
@ -2085,7 +2088,7 @@ Error Main::setup2(Thread::ID p_main_tid_override) {
|
|||
boot_logo->set_pixel(0, 0, Color(0, 0, 0, 0));
|
||||
}
|
||||
|
||||
Color boot_bg_color = GLOBAL_DEF_BASIC("application/boot_splash/bg_color", boot_splash_bg_color);
|
||||
Color boot_bg_color = GLOBAL_GET("application/boot_splash/bg_color");
|
||||
|
||||
#if defined(TOOLS_ENABLED) && !defined(NO_EDITOR_SPLASH)
|
||||
boot_bg_color =
|
||||
|
@ -2120,6 +2123,8 @@ Error Main::setup2(Thread::ID p_main_tid_override) {
|
|||
#endif
|
||||
}
|
||||
|
||||
DisplayServer::set_early_window_clear_color_override(false);
|
||||
|
||||
MAIN_PRINT("Main: DCC");
|
||||
RenderingServer::get_singleton()->set_default_clear_color(
|
||||
GLOBAL_GET("rendering/environment/defaults/default_clear_color"));
|
||||
|
|
|
@ -2543,6 +2543,25 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
|||
return 0;
|
||||
}
|
||||
} break;
|
||||
case WM_ERASEBKGND: {
|
||||
Color early_color;
|
||||
if (!_get_window_early_clear_override(early_color)) {
|
||||
break;
|
||||
}
|
||||
bool must_recreate_brush = !window_bkg_brush || window_bkg_brush_color != early_color.to_argb32();
|
||||
if (must_recreate_brush) {
|
||||
if (window_bkg_brush) {
|
||||
DeleteObject(window_bkg_brush);
|
||||
}
|
||||
window_bkg_brush = CreateSolidBrush(RGB(early_color.get_r8(), early_color.get_g8(), early_color.get_b8()));
|
||||
}
|
||||
HDC hdc = (HDC)wParam;
|
||||
RECT rect = {};
|
||||
if (GetUpdateRect(hWnd, &rect, true)) {
|
||||
FillRect(hdc, &rect, window_bkg_brush);
|
||||
}
|
||||
return 1;
|
||||
} break;
|
||||
case WM_PAINT: {
|
||||
Main::force_redraw();
|
||||
} break;
|
||||
|
@ -3982,7 +4001,7 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win
|
|||
|
||||
memset(&wc, 0, sizeof(WNDCLASSEXW));
|
||||
wc.cbSize = sizeof(WNDCLASSEXW);
|
||||
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS;
|
||||
wc.style = CS_OWNDC | CS_DBLCLKS;
|
||||
wc.lpfnWndProc = (WNDPROC)::WndProc;
|
||||
wc.cbClsExtra = 0;
|
||||
wc.cbWndExtra = 0;
|
||||
|
|
|
@ -452,6 +452,8 @@ class DisplayServerWindows : public DisplayServer {
|
|||
bool in_dispatch_input_event = false;
|
||||
|
||||
WNDCLASSEXW wc;
|
||||
HBRUSH window_bkg_brush = nullptr;
|
||||
uint32_t window_bkg_brush_color = 0;
|
||||
|
||||
HCURSOR cursors[CURSOR_MAX] = { nullptr };
|
||||
CursorShape cursor_shape = CursorShape::CURSOR_ARROW;
|
||||
|
|
|
@ -38,6 +38,9 @@ DisplayServer *DisplayServer::singleton = nullptr;
|
|||
|
||||
bool DisplayServer::hidpi_allowed = false;
|
||||
|
||||
bool DisplayServer::window_early_clear_override_enabled = false;
|
||||
Color DisplayServer::window_early_clear_override_color = Color(0, 0, 0, 0);
|
||||
|
||||
DisplayServer::DisplayServerCreate DisplayServer::server_create_functions[DisplayServer::MAX_SERVERS] = {
|
||||
{ "headless", &DisplayServerHeadless::create_func, &DisplayServerHeadless::get_rendering_drivers_func }
|
||||
};
|
||||
|
@ -315,6 +318,23 @@ void DisplayServer::tts_post_utterance_event(TTSUtteranceEvent p_event, int p_id
|
|||
}
|
||||
}
|
||||
|
||||
bool DisplayServer::_get_window_early_clear_override(Color &r_color) {
|
||||
if (window_early_clear_override_enabled) {
|
||||
r_color = window_early_clear_override_color;
|
||||
return true;
|
||||
} else if (RenderingServer::get_singleton()) {
|
||||
r_color = RenderingServer::get_singleton()->get_default_clear_color();
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
void DisplayServer::set_early_window_clear_color_override(bool p_enabled, Color p_color) {
|
||||
window_early_clear_override_enabled = p_enabled;
|
||||
window_early_clear_override_color = p_color;
|
||||
}
|
||||
|
||||
void DisplayServer::mouse_set_mode(MouseMode p_mode) {
|
||||
WARN_PRINT("Mouse is not supported by this display server.");
|
||||
}
|
||||
|
|
|
@ -217,6 +217,16 @@ public:
|
|||
virtual bool is_dark_mode() const { return false; };
|
||||
virtual Color get_accent_color() const { return Color(0, 0, 0, 0); };
|
||||
|
||||
private:
|
||||
static bool window_early_clear_override_enabled;
|
||||
static Color window_early_clear_override_color;
|
||||
|
||||
protected:
|
||||
static bool _get_window_early_clear_override(Color &r_color);
|
||||
|
||||
public:
|
||||
static void set_early_window_clear_color_override(bool p_enabled, Color p_color = Color(0, 0, 0, 0));
|
||||
|
||||
enum MouseMode {
|
||||
MOUSE_MODE_VISIBLE,
|
||||
MOUSE_MODE_HIDDEN,
|
||||
|
|
|
@ -291,6 +291,10 @@ void RenderingServerDefault::set_boot_image(const Ref<Image> &p_image, const Col
|
|||
RSG::rasterizer->set_boot_image(p_image, p_color, p_scale, p_use_filter);
|
||||
}
|
||||
|
||||
Color RenderingServerDefault::get_default_clear_color() {
|
||||
return RSG::texture_storage->get_default_clear_color();
|
||||
}
|
||||
|
||||
void RenderingServerDefault::set_default_clear_color(const Color &p_color) {
|
||||
RSG::viewport->set_default_clear_color(p_color);
|
||||
}
|
||||
|
|
|
@ -986,6 +986,7 @@ public:
|
|||
virtual double get_frame_setup_time_cpu() const override;
|
||||
|
||||
virtual void set_boot_image(const Ref<Image> &p_image, const Color &p_color, bool p_scale, bool p_use_filter = true) override;
|
||||
virtual Color get_default_clear_color() override;
|
||||
virtual void set_default_clear_color(const Color &p_color) override;
|
||||
|
||||
virtual bool has_feature(Features p_feature) const override;
|
||||
|
|
|
@ -2763,6 +2763,7 @@ void RenderingServer::_bind_methods() {
|
|||
ClassDB::bind_method(D_METHOD("get_white_texture"), &RenderingServer::get_white_texture);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_boot_image", "image", "color", "scale", "use_filter"), &RenderingServer::set_boot_image, DEFVAL(true));
|
||||
ClassDB::bind_method(D_METHOD("get_default_clear_color"), &RenderingServer::get_default_clear_color);
|
||||
ClassDB::bind_method(D_METHOD("set_default_clear_color", "color"), &RenderingServer::set_default_clear_color);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("has_feature", "feature"), &RenderingServer::has_feature);
|
||||
|
|
|
@ -1560,6 +1560,7 @@ public:
|
|||
virtual void mesh_add_surface_from_planes(RID p_mesh, const Vector<Plane> &p_planes);
|
||||
|
||||
virtual void set_boot_image(const Ref<Image> &p_image, const Color &p_color, bool p_scale, bool p_use_filter = true) = 0;
|
||||
virtual Color get_default_clear_color() = 0;
|
||||
virtual void set_default_clear_color(const Color &p_color) = 0;
|
||||
|
||||
enum Features {
|
||||
|
|
Loading…
Reference in a new issue