diff options
-rw-r--r-- | editor/plugins/sprite_frames_editor_plugin.cpp | 10 | ||||
-rw-r--r-- | editor/plugins/sprite_frames_editor_plugin.h | 2 | ||||
-rw-r--r-- | platform/windows/display_server_windows.cpp | 81 | ||||
-rw-r--r-- | platform/windows/display_server_windows.h | 1 | ||||
-rw-r--r-- | scene/gui/button.cpp | 17 |
5 files changed, 54 insertions, 57 deletions
diff --git a/editor/plugins/sprite_frames_editor_plugin.cpp b/editor/plugins/sprite_frames_editor_plugin.cpp index ae6ec0f702..d1da61e5fc 100644 --- a/editor/plugins/sprite_frames_editor_plugin.cpp +++ b/editor/plugins/sprite_frames_editor_plugin.cpp @@ -1476,8 +1476,8 @@ void SpriteFramesEditor::edit(Ref<SpriteFrames> p_frames) { _fetch_sprite_node(); // Fetch node after set frames. } -bool SpriteFramesEditor::is_editing() const { - return frames.is_valid(); +Ref<SpriteFrames> SpriteFramesEditor::get_sprite_frames() const { + return frames; } Variant SpriteFramesEditor::get_drag_data_fw(const Point2 &p_point, Control *p_from) { @@ -2337,7 +2337,11 @@ bool SpriteFramesEditorPlugin::handles(Object *p_object) const { if (animated_sprite_3d && *animated_sprite_3d->get_sprite_frames()) { return true; } - return !frames_editor->is_editing() && Object::cast_to<SpriteFrames>(p_object); + SpriteFrames *frames = Object::cast_to<SpriteFrames>(p_object); + if (frames && (frames_editor->get_sprite_frames().is_null() || frames_editor->get_sprite_frames() == frames)) { + return true; + } + return false; } void SpriteFramesEditorPlugin::make_visible(bool p_visible) { diff --git a/editor/plugins/sprite_frames_editor_plugin.h b/editor/plugins/sprite_frames_editor_plugin.h index 0e26a793a7..9b6aaf98fe 100644 --- a/editor/plugins/sprite_frames_editor_plugin.h +++ b/editor/plugins/sprite_frames_editor_plugin.h @@ -269,7 +269,7 @@ protected: public: void edit(Ref<SpriteFrames> p_frames); - bool is_editing() const; + Ref<SpriteFrames> get_sprite_frames() const; SpriteFramesEditor(); }; diff --git a/platform/windows/display_server_windows.cpp b/platform/windows/display_server_windows.cpp index 01a4fbf96e..838beddac2 100644 --- a/platform/windows/display_server_windows.cpp +++ b/platform/windows/display_server_windows.cpp @@ -5595,52 +5595,57 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win HMODULE nt_lib = LoadLibraryW(L"ntdll.dll"); if (nt_lib) { - RtlGetVersionPtr RtlGetVersion = (RtlGetVersionPtr)GetProcAddress(nt_lib, "RtlGetVersion"); - if (RtlGetVersion) { - RtlGetVersion(&os_ver); + WineGetVersionPtr wine_get_version = (WineGetVersionPtr)GetProcAddress(nt_lib, "wine_get_version"); // Do not read Windows build number under Wine, it can be set to arbitrary value. + if (!wine_get_version) { + RtlGetVersionPtr RtlGetVersion = (RtlGetVersionPtr)GetProcAddress(nt_lib, "RtlGetVersion"); + if (RtlGetVersion) { + RtlGetVersion(&os_ver); + } } FreeLibrary(nt_lib); } - // Load UXTheme. - HMODULE ux_theme_lib = LoadLibraryW(L"uxtheme.dll"); - if (ux_theme_lib) { - ShouldAppsUseDarkMode = (ShouldAppsUseDarkModePtr)GetProcAddress(ux_theme_lib, MAKEINTRESOURCEA(132)); - GetImmersiveColorFromColorSetEx = (GetImmersiveColorFromColorSetExPtr)GetProcAddress(ux_theme_lib, MAKEINTRESOURCEA(95)); - GetImmersiveColorTypeFromName = (GetImmersiveColorTypeFromNamePtr)GetProcAddress(ux_theme_lib, MAKEINTRESOURCEA(96)); - GetImmersiveUserColorSetPreference = (GetImmersiveUserColorSetPreferencePtr)GetProcAddress(ux_theme_lib, MAKEINTRESOURCEA(98)); - if (os_ver.dwBuildNumber >= 17763) { - AllowDarkModeForAppPtr AllowDarkModeForApp = nullptr; - SetPreferredAppModePtr SetPreferredAppMode = nullptr; - FlushMenuThemesPtr FlushMenuThemes = nullptr; - if (os_ver.dwBuildNumber < 18362) { - AllowDarkModeForApp = (AllowDarkModeForAppPtr)GetProcAddress(ux_theme_lib, MAKEINTRESOURCEA(135)); - } else { - SetPreferredAppMode = (SetPreferredAppModePtr)GetProcAddress(ux_theme_lib, MAKEINTRESOURCEA(135)); - FlushMenuThemes = (FlushMenuThemesPtr)GetProcAddress(ux_theme_lib, MAKEINTRESOURCEA(136)); - } - RefreshImmersiveColorPolicyStatePtr RefreshImmersiveColorPolicyState = (RefreshImmersiveColorPolicyStatePtr)GetProcAddress(ux_theme_lib, MAKEINTRESOURCEA(104)); - if (ShouldAppsUseDarkMode) { - bool dark_mode = ShouldAppsUseDarkMode(); - if (SetPreferredAppMode) { - SetPreferredAppMode(dark_mode ? APPMODE_ALLOWDARK : APPMODE_DEFAULT); - } else if (AllowDarkModeForApp) { - AllowDarkModeForApp(dark_mode); + // Load UXTheme, available on Windows 10+ only. + if (os_ver.dwBuildNumber >= 10240) { + HMODULE ux_theme_lib = LoadLibraryW(L"uxtheme.dll"); + if (ux_theme_lib) { + ShouldAppsUseDarkMode = (ShouldAppsUseDarkModePtr)GetProcAddress(ux_theme_lib, MAKEINTRESOURCEA(132)); + GetImmersiveColorFromColorSetEx = (GetImmersiveColorFromColorSetExPtr)GetProcAddress(ux_theme_lib, MAKEINTRESOURCEA(95)); + GetImmersiveColorTypeFromName = (GetImmersiveColorTypeFromNamePtr)GetProcAddress(ux_theme_lib, MAKEINTRESOURCEA(96)); + GetImmersiveUserColorSetPreference = (GetImmersiveUserColorSetPreferencePtr)GetProcAddress(ux_theme_lib, MAKEINTRESOURCEA(98)); + if (os_ver.dwBuildNumber >= 17763) { // Windows 10 Redstone 5 (1809)+ only. + AllowDarkModeForAppPtr AllowDarkModeForApp = nullptr; + SetPreferredAppModePtr SetPreferredAppMode = nullptr; + FlushMenuThemesPtr FlushMenuThemes = nullptr; + if (os_ver.dwBuildNumber < 18362) { // Windows 10 Redstone 5 (1809) and 19H1 (1903) only. + AllowDarkModeForApp = (AllowDarkModeForAppPtr)GetProcAddress(ux_theme_lib, MAKEINTRESOURCEA(135)); + } else { // Windows 10 19H2 (1909)+ only. + SetPreferredAppMode = (SetPreferredAppModePtr)GetProcAddress(ux_theme_lib, MAKEINTRESOURCEA(135)); + FlushMenuThemes = (FlushMenuThemesPtr)GetProcAddress(ux_theme_lib, MAKEINTRESOURCEA(136)); } - if (RefreshImmersiveColorPolicyState) { - RefreshImmersiveColorPolicyState(); - } - if (FlushMenuThemes) { - FlushMenuThemes(); + RefreshImmersiveColorPolicyStatePtr RefreshImmersiveColorPolicyState = (RefreshImmersiveColorPolicyStatePtr)GetProcAddress(ux_theme_lib, MAKEINTRESOURCEA(104)); + if (ShouldAppsUseDarkMode) { + bool dark_mode = ShouldAppsUseDarkMode(); + if (SetPreferredAppMode) { + SetPreferredAppMode(dark_mode ? APPMODE_ALLOWDARK : APPMODE_DEFAULT); + } else if (AllowDarkModeForApp) { + AllowDarkModeForApp(dark_mode); + } + if (RefreshImmersiveColorPolicyState) { + RefreshImmersiveColorPolicyState(); + } + if (FlushMenuThemes) { + FlushMenuThemes(); + } } } - } - ux_theme_available = ShouldAppsUseDarkMode && GetImmersiveColorFromColorSetEx && GetImmersiveColorTypeFromName && GetImmersiveUserColorSetPreference; - if (os_ver.dwBuildNumber >= 18363) { - dark_title_available = true; - if (os_ver.dwBuildNumber < 19041) { - use_legacy_dark_mode_before_20H1 = true; + ux_theme_available = ShouldAppsUseDarkMode && GetImmersiveColorFromColorSetEx && GetImmersiveColorTypeFromName && GetImmersiveUserColorSetPreference; + if (os_ver.dwBuildNumber >= 18363) { + dark_title_available = true; + if (os_ver.dwBuildNumber < 19041) { + use_legacy_dark_mode_before_20H1 = true; + } } } } diff --git a/platform/windows/display_server_windows.h b/platform/windows/display_server_windows.h index 0f649b76d7..382f18c239 100644 --- a/platform/windows/display_server_windows.h +++ b/platform/windows/display_server_windows.h @@ -162,6 +162,7 @@ enum PreferredAppMode { APPMODE_MAX = 4 }; +typedef const char *(CDECL *WineGetVersionPtr)(void); typedef bool(WINAPI *ShouldAppsUseDarkModePtr)(); typedef DWORD(WINAPI *GetImmersiveColorFromColorSetExPtr)(UINT dwImmersiveColorSet, UINT dwImmersiveColorType, bool bIgnoreHighContrast, UINT dwHighContrastCacheMode); typedef int(WINAPI *GetImmersiveColorTypeFromNamePtr)(const WCHAR *name); diff --git a/scene/gui/button.cpp b/scene/gui/button.cpp index 55ca5fc3ee..4e738216de 100644 --- a/scene/gui/button.cpp +++ b/scene/gui/button.cpp @@ -487,6 +487,8 @@ Size2 Button::_fit_icon_size(const Size2 &p_size) const { } Size2 Button::get_minimum_size_for_text_and_icon(const String &p_text, Ref<Texture2D> p_icon) const { + // Do not include `_internal_margin`, it's already added in the `get_minimum_size` overrides. + Ref<TextParagraph> paragraph; if (p_text.is_empty()) { paragraph = text_buf; @@ -500,21 +502,6 @@ Size2 Button::get_minimum_size_for_text_and_icon(const String &p_text, Ref<Textu minsize.width = 0; } - float left_internal_margin_with_h_separation = _internal_margin[SIDE_LEFT]; - float right_internal_margin_with_h_separation = _internal_margin[SIDE_RIGHT]; - { // The width reserved for internal element in derived classes (and h_separation if needed). - - if (_internal_margin[SIDE_LEFT] > 0.0f) { - left_internal_margin_with_h_separation += theme_cache.h_separation; - } - - if (_internal_margin[SIDE_RIGHT] > 0.0f) { - right_internal_margin_with_h_separation += theme_cache.h_separation; - } - - minsize.width += left_internal_margin_with_h_separation + right_internal_margin_with_h_separation; // The size after the internal element is stripped. - } - if (!expand_icon && p_icon.is_valid()) { Size2 icon_size = _fit_icon_size(p_icon->get_size()); if (vertical_icon_alignment == VERTICAL_ALIGNMENT_CENTER) { |