summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThaddeus Crews <repiteo@outlook.com>2026-08-12 17:13:24 -0500
committerGitHub <noreply@github.com>2026-08-12 17:13:24 -0500
commitc5198ffd37a4d14120aa32fac918f21ed1eba4f6 (patch)
tree8793ddacfa44343ad3def89b3417048ba37f0890
parentd94b85934640afe312081114636267c9efbef3e3 (diff)
parentaf99bf93d3bf2d7a487946d4c8375f76163db08b (diff)
Merge pull request #122344 from Repiteo/4.7.2-cherry-picks-3
[4.7] Cherry-picks for the 4.7 branch (future 4.7.2) - 3rd batch
-rw-r--r--.github/actions/godot-cache-save/action.yml11
-rw-r--r--core/object/class_db.cpp2
-rw-r--r--doc/classes/DisplayServer.xml7
-rw-r--r--editor/docks/scene_tree_dock.cpp1
-rw-r--r--platform/android/java/build.gradle12
-rw-r--r--platform/android/java/editor/build.gradle5
-rw-r--r--platform/web/web_main.cpp1
-rw-r--r--platform/windows/display_server_windows.cpp1
8 files changed, 34 insertions, 6 deletions
diff --git a/.github/actions/godot-cache-save/action.yml b/.github/actions/godot-cache-save/action.yml
index f2d4455310..507a12d794 100644
--- a/.github/actions/godot-cache-save/action.yml
+++ b/.github/actions/godot-cache-save/action.yml
@@ -20,3 +20,14 @@ runs:
with:
path: ${{ inputs.scons-cache }}
key: ${{ inputs.cache-name }}|${{ github.ref_name }}|${{ github.sha }}
+
+ # This is done after saving the new cache so that the base cache remains more relevant, to reduce
+ # the risk of the cache being purged when multiple large PRs are pushed/merged at the same time.
+ - name: Ping default cache
+ uses: actions/cache/restore@v6
+ if: github.ref_name != github.event.repository.default_branch
+ with:
+ path: ${{ inputs.scons-cache }}
+ key: ${{ inputs.cache-name }}|${{ github.event.repository.default_branch }}|${{ github.sha }}
+ restore-keys: ${{ inputs.cache-name }}|${{ github.event.repository.default_branch }}
+ lookup-only: true
diff --git a/core/object/class_db.cpp b/core/object/class_db.cpp
index d232fcdca0..855ced0a9c 100644
--- a/core/object/class_db.cpp
+++ b/core/object/class_db.cpp
@@ -2278,7 +2278,7 @@ void ClassDB::register_extension_class(ObjectGDExtension *p_extension) {
// The parent classes should be exposed if it has an exposed child class.
while (parent && !parent->exposed) {
parent->exposed = true;
- parent = classes.getptr(parent->gdtype->get_name());
+ parent = classes.getptr(parent->gdtype->get_super_type_name());
}
}
c.reloadable = p_extension->reloadable;
diff --git a/doc/classes/DisplayServer.xml b/doc/classes/DisplayServer.xml
index 367d42ad43..52657f7fb6 100644
--- a/doc/classes/DisplayServer.xml
+++ b/doc/classes/DisplayServer.xml
@@ -1785,9 +1785,8 @@
<method name="screen_get_max_scale" qualifiers="const">
<return type="float" />
<description>
- Returns the greatest scale factor of all screens.
- [b]Note:[/b] On macOS returned value is [code]2.0[/code] if there is at least one hiDPI (Retina) screen in the system, and [code]1.0[/code] in all other cases.
- [b]Note:[/b] This method is implemented only on macOS.
+ Returns the greatest scale factor of all screens. See also [method screen_get_scale].
+ [b]Note:[/b] On macOS, the returned value is [code]2.0[/code] if there is at least one hiDPI (Retina) screen in the system, and [code]1.0[/code] in all other cases.
</description>
</method>
<method name="screen_get_orientation" qualifiers="const">
@@ -1844,7 +1843,7 @@
<return type="float" />
<param index="0" name="screen" type="int" default="-1" />
<description>
- Returns the scale factor of the specified screen by index. Returns [code]1.0[/code] if [param screen] is invalid.
+ Returns the scale factor of the specified screen by index. Returns [code]1.0[/code] if [param screen] is invalid. See also [method screen_get_max_scale].
[b]Note:[/b] One of the following constants can be used as [param screen]: [constant SCREEN_OF_MAIN_WINDOW], [constant SCREEN_PRIMARY], [constant SCREEN_WITH_MOUSE_FOCUS], or [constant SCREEN_WITH_KEYBOARD_FOCUS].
[b]Note:[/b] On macOS, the returned value is [code]2.0[/code] for hiDPI (Retina) screens, and [code]1.0[/code] for all other cases.
[b]Note:[/b] On Linux (Wayland), the returned value is accurate only when [param screen] is [constant SCREEN_OF_MAIN_WINDOW]. Due to API limitations, passing a direct index will return a rounded-up integer, if the screen has a fractional scale (e.g. [code]1.25[/code] would get rounded up to [code]2.0[/code]).
diff --git a/editor/docks/scene_tree_dock.cpp b/editor/docks/scene_tree_dock.cpp
index 74432fb92f..72f0165cfb 100644
--- a/editor/docks/scene_tree_dock.cpp
+++ b/editor/docks/scene_tree_dock.cpp
@@ -1760,6 +1760,7 @@ void SceneTreeDock::_notification(int p_what) {
button_ui->connect(SceneStringName(pressed), callable_mp(this, &SceneTreeDock::_tool_selected).bind(TOOL_CREATE_USER_INTERFACE, false));
favorite_node_shortcuts = memnew(VBoxContainer);
+ favorite_node_shortcuts->set_auto_translate_mode(AUTO_TRANSLATE_MODE_DISABLED);
node_shortcuts->add_child(favorite_node_shortcuts);
button_custom = memnew(Button);
diff --git a/platform/android/java/build.gradle b/platform/android/java/build.gradle
index bf04ffb43a..3d90410dc5 100644
--- a/platform/android/java/build.gradle
+++ b/platform/android/java/build.gradle
@@ -42,6 +42,9 @@ ext {
rootDir = "../../.."
binDir = "$rootDir/bin/"
androidEditorBuildsDir = "$binDir/android_editor_builds/"
+
+ // Used by the editor module to set abiFilters.
+ detectedAbis = []
}
def getSconsTaskName(String flavor, String buildType, String abi) {
@@ -120,9 +123,18 @@ def generateBuildTasks(String flavor = "template", String edition = "standard",
boolean excludeSconsBuildTasks = excludeSconsBuildTasks()
boolean isTemplate = flavor == "template"
String libsDir = isTemplate ? "lib/libs/" : "lib/libs/tools/"
+ def validAbis = ["arm64-v8a", "armeabi-v7a", "x86_64", "x86"]
for (String target : supportedFlavorsBuildTypes[flavor]) {
File targetLibs = new File(libsDir + target)
+ if (targetLibs != null && targetLibs.isDirectory()) {
+ targetLibs.listFiles()?.each { abiDir ->
+ if (abiDir.isDirectory() && validAbis.contains(abiDir.name) && abiDir.listFiles()?.length > 0) {
+ detectedAbis.add(abiDir.name)
+ }
+ }
+ }
+
String targetSuffix = target
if (!excludeSconsBuildTasks || (targetLibs != null
diff --git a/platform/android/java/editor/build.gradle b/platform/android/java/editor/build.gradle
index ab2d17aa31..fcbb102851 100644
--- a/platform/android/java/editor/build.gradle
+++ b/platform/android/java/editor/build.gradle
@@ -166,6 +166,11 @@ android {
android {
dimension "android_distribution"
missingDimensionStrategy 'products', 'editor'
+ ndk {
+ if (!detectedAbis.isEmpty()) {
+ abiFilters += detectedAbis
+ }
+ }
}
horizonos {
dimension "android_distribution"
diff --git a/platform/web/web_main.cpp b/platform/web/web_main.cpp
index 0ca3bc01c4..6b57b0712e 100644
--- a/platform/web/web_main.cpp
+++ b/platform/web/web_main.cpp
@@ -70,7 +70,6 @@ void exit_callback() {
delete os; // We used a normal new, so it needs a normal delete.
os = nullptr;
godot_cleanup_profiler();
- emscripten_cancel_main_loop(); // We are exiting in this iteration.
emscripten_force_exit(exit_code); // Exit runtime.
}
diff --git a/platform/windows/display_server_windows.cpp b/platform/windows/display_server_windows.cpp
index f75a3f7bed..e821786166 100644
--- a/platform/windows/display_server_windows.cpp
+++ b/platform/windows/display_server_windows.cpp
@@ -7468,6 +7468,7 @@ void DisplayServerWindows::_destroy_window(DisplayServerEnums::WindowID p_window
if (has_winrt_queue) {
WinRTUtils::destroy_wd(wd.wrt_wd);
+ wd.wrt_wd = nullptr;
}
DestroyWindow(wd.hWnd);
windows.erase(p_window_id);