summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/wasapi/audio_driver_wasapi.cpp19
-rw-r--r--drivers/wasapi/audio_driver_wasapi.h9
-rw-r--r--platform/linuxbsd/x11/display_server_x11.cpp6
-rw-r--r--platform/windows/console_wrapper_windows.cpp4
-rw-r--r--platform/windows/os_windows.cpp4
-rw-r--r--scene/gui/line_edit.cpp2
-rw-r--r--scene/gui/text_edit.cpp2
-rw-r--r--scene/main/viewport.cpp25
-rw-r--r--scene/main/viewport.h1
-rw-r--r--servers/display_server.cpp5
10 files changed, 49 insertions, 28 deletions
diff --git a/drivers/wasapi/audio_driver_wasapi.cpp b/drivers/wasapi/audio_driver_wasapi.cpp
index a349a66f75..4e7c9695a5 100644
--- a/drivers/wasapi/audio_driver_wasapi.cpp
+++ b/drivers/wasapi/audio_driver_wasapi.cpp
@@ -39,6 +39,9 @@
#include <functiondiscoverykeys.h>
+#include <wrl/client.h>
+using Microsoft::WRL::ComPtr;
+
// Define IAudioClient3 if not already defined by MinGW headers
#if defined __MINGW32__ || defined __MINGW64__
@@ -107,6 +110,12 @@ const IID IID_IAudioClient3 = __uuidof(IAudioClient3);
const IID IID_IAudioRenderClient = __uuidof(IAudioRenderClient);
const IID IID_IAudioCaptureClient = __uuidof(IAudioCaptureClient);
+#define SAFE_RELEASE(memory) \
+ if ((memory) != nullptr) { \
+ (memory)->Release(); \
+ (memory) = nullptr; \
+ }
+
#define REFTIMES_PER_SEC 10000000
#define REFTIMES_PER_MILLISEC 10000
@@ -302,7 +311,7 @@ Error AudioDriverWASAPI::audio_device_init(AudioDeviceWASAPI *p_device, bool p_i
audioProps.bIsOffload = FALSE;
audioProps.eCategory = AudioCategory_GameEffects;
- hr = ((IAudioClient3 *)p_device->audio_client.Get())->SetClientProperties(&audioProps);
+ hr = ((IAudioClient3 *)p_device->audio_client)->SetClientProperties(&audioProps);
ERR_FAIL_COND_V_MSG(hr != S_OK, ERR_CANT_OPEN, "WASAPI: SetClientProperties failed with error 0x" + String::num_uint64(hr, 16) + ".");
}
@@ -385,7 +394,7 @@ Error AudioDriverWASAPI::audio_device_init(AudioDeviceWASAPI *p_device, bool p_i
}
} else {
- IAudioClient3 *device_audio_client_3 = (IAudioClient3 *)p_device->audio_client.Get();
+ IAudioClient3 *device_audio_client_3 = (IAudioClient3 *)p_device->audio_client;
// AUDCLNT_STREAMFLAGS_RATEADJUST is an invalid flag with IAudioClient3, therefore we have to use
// the closest supported mix rate supported by the audio driver.
@@ -516,9 +525,9 @@ Error AudioDriverWASAPI::audio_device_finish(AudioDeviceWASAPI *p_device) {
p_device->active.clear();
}
- p_device->audio_client.Reset();
- p_device->render_client.Reset();
- p_device->capture_client.Reset();
+ SAFE_RELEASE(p_device->audio_client)
+ SAFE_RELEASE(p_device->render_client)
+ SAFE_RELEASE(p_device->capture_client)
return OK;
}
diff --git a/drivers/wasapi/audio_driver_wasapi.h b/drivers/wasapi/audio_driver_wasapi.h
index d73cbf4a8a..367c30607a 100644
--- a/drivers/wasapi/audio_driver_wasapi.h
+++ b/drivers/wasapi/audio_driver_wasapi.h
@@ -40,18 +40,15 @@
#include <audioclient.h>
#include <mmdeviceapi.h>
-#include <wrl/client.h>
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
-using Microsoft::WRL::ComPtr;
-
class AudioDriverWASAPI : public AudioDriver {
class AudioDeviceWASAPI {
public:
- ComPtr<IAudioClient> audio_client = nullptr;
- ComPtr<IAudioRenderClient> render_client = nullptr; // Output
- ComPtr<IAudioCaptureClient> capture_client = nullptr; // Input
+ IAudioClient *audio_client = nullptr;
+ IAudioRenderClient *render_client = nullptr; // Output
+ IAudioCaptureClient *capture_client = nullptr; // Input
SafeFlag active;
WORD format_tag = 0;
diff --git a/platform/linuxbsd/x11/display_server_x11.cpp b/platform/linuxbsd/x11/display_server_x11.cpp
index 499df55bef..a12c935273 100644
--- a/platform/linuxbsd/x11/display_server_x11.cpp
+++ b/platform/linuxbsd/x11/display_server_x11.cpp
@@ -2998,7 +2998,11 @@ bool DisplayServerX11::window_is_focused(WindowID p_window) const {
const WindowData &wd = windows[p_window];
- return wd.focused;
+ Window focused_window;
+ int focus_ret_state;
+ XGetInputFocus(x11_display, &focused_window, &focus_ret_state);
+
+ return wd.x11_window == focused_window;
}
bool DisplayServerX11::window_can_draw(WindowID p_window) const {
diff --git a/platform/windows/console_wrapper_windows.cpp b/platform/windows/console_wrapper_windows.cpp
index 1ba09b236b..03e77cb92c 100644
--- a/platform/windows/console_wrapper_windows.cpp
+++ b/platform/windows/console_wrapper_windows.cpp
@@ -65,7 +65,9 @@ int main(int argc, char *argv[]) {
// Enable virtual terminal sequences processing.
HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE);
- DWORD out_mode = ENABLE_PROCESSED_OUTPUT | ENABLE_VIRTUAL_TERMINAL_PROCESSING;
+ DWORD out_mode = 0;
+ GetConsoleMode(stdout_handle, &out_mode);
+ out_mode |= ENABLE_PROCESSED_OUTPUT | ENABLE_VIRTUAL_TERMINAL_PROCESSING;
SetConsoleMode(stdout_handle, out_mode);
// Find main executable name and check if it exist.
diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp
index e6e8c6aaef..adc72a79e9 100644
--- a/platform/windows/os_windows.cpp
+++ b/platform/windows/os_windows.cpp
@@ -2044,7 +2044,9 @@ OS_Windows::OS_Windows(HINSTANCE _hInstance) {
// NOTE: The engine does not use ANSI escape codes to color error/warning messages; it uses Windows API calls instead.
// Therefore, error/warning messages are still colored on Windows versions older than 10.
HANDLE stdoutHandle = GetStdHandle(STD_OUTPUT_HANDLE);
- DWORD outMode = ENABLE_PROCESSED_OUTPUT | ENABLE_VIRTUAL_TERMINAL_PROCESSING;
+ DWORD outMode = 0;
+ GetConsoleMode(stdoutHandle, &outMode);
+ outMode |= ENABLE_PROCESSED_OUTPUT | ENABLE_VIRTUAL_TERMINAL_PROCESSING;
if (!SetConsoleMode(stdoutHandle, outMode)) {
// Windows 8.1 or below, or Windows 10 prior to Anniversary Update.
print_verbose("Can't set the ENABLE_VIRTUAL_TERMINAL_PROCESSING Windows console mode. `print_rich()` will not work as expected.");
diff --git a/scene/gui/line_edit.cpp b/scene/gui/line_edit.cpp
index 1a066b0728..a08fb96e71 100644
--- a/scene/gui/line_edit.cpp
+++ b/scene/gui/line_edit.cpp
@@ -103,7 +103,7 @@ void LineEdit::_close_ime_window() {
void LineEdit::_update_ime_window_position() {
DisplayServer::WindowID wid = get_window() ? get_window()->get_window_id() : DisplayServer::INVALID_WINDOW_ID;
- if (wid == DisplayServer::INVALID_WINDOW_ID || !DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_IME)) {
+ if (wid == DisplayServer::INVALID_WINDOW_ID || !DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_IME) || !DisplayServer::get_singleton()->window_is_focused(wid)) {
return;
}
DisplayServer::get_singleton()->window_set_ime_active(true, wid);
diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp
index d7799588ea..bf9c479c69 100644
--- a/scene/gui/text_edit.cpp
+++ b/scene/gui/text_edit.cpp
@@ -2958,7 +2958,7 @@ void TextEdit::_close_ime_window() {
void TextEdit::_update_ime_window_position() {
DisplayServer::WindowID wid = get_window() ? get_window()->get_window_id() : DisplayServer::INVALID_WINDOW_ID;
- if (wid == DisplayServer::INVALID_WINDOW_ID || !DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_IME)) {
+ if (wid == DisplayServer::INVALID_WINDOW_ID || !DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_IME) || !DisplayServer::get_singleton()->window_is_focused(wid)) {
return;
}
DisplayServer::get_singleton()->window_set_ime_active(true, wid);
diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp
index a4e27a3d16..acf4f67673 100644
--- a/scene/main/viewport.cpp
+++ b/scene/main/viewport.cpp
@@ -111,6 +111,9 @@ void ViewportTexture::set_viewport_path_in_scene(const NodePath &p_path) {
if (get_local_scene() && !path.is_empty()) {
setup_local_to_scene();
} else {
+ if (path.is_empty()) {
+ vp_changed = false;
+ }
emit_changed();
}
}
@@ -121,9 +124,7 @@ NodePath ViewportTexture::get_viewport_path_in_scene() const {
int ViewportTexture::get_width() const {
if (!vp) {
- if (!vp_pending) {
- ERR_PRINT("Viewport Texture must be set to use it.");
- }
+ _err_print_viewport_not_set();
return 0;
}
return vp->size.width;
@@ -131,9 +132,7 @@ int ViewportTexture::get_width() const {
int ViewportTexture::get_height() const {
if (!vp) {
- if (!vp_pending) {
- ERR_PRINT("Viewport Texture must be set to use it.");
- }
+ _err_print_viewport_not_set();
return 0;
}
return vp->size.height;
@@ -141,9 +140,7 @@ int ViewportTexture::get_height() const {
Size2 ViewportTexture::get_size() const {
if (!vp) {
- if (!vp_pending) {
- ERR_PRINT("Viewport Texture must be set to use it.");
- }
+ _err_print_viewport_not_set();
return Size2();
}
return vp->size;
@@ -163,14 +160,18 @@ bool ViewportTexture::has_alpha() const {
Ref<Image> ViewportTexture::get_image() const {
if (!vp) {
- if (!vp_pending) {
- ERR_PRINT("Viewport Texture must be set to use it.");
- }
+ _err_print_viewport_not_set();
return Ref<Image>();
}
return RS::get_singleton()->texture_2d_get(vp->texture_rid);
}
+void ViewportTexture::_err_print_viewport_not_set() const {
+ if (!vp_pending && !vp_changed) {
+ ERR_PRINT("Viewport Texture must be set to use it.");
+ }
+}
+
void ViewportTexture::_setup_local_to_scene(const Node *p_loc_scene) {
// Always reset this, even if this call fails with an error.
vp_pending = false;
diff --git a/scene/main/viewport.h b/scene/main/viewport.h
index edacee2d88..a18dc1f6f0 100644
--- a/scene/main/viewport.h
+++ b/scene/main/viewport.h
@@ -63,6 +63,7 @@ class ViewportTexture : public Texture2D {
bool vp_changed = false;
void _setup_local_to_scene(const Node *p_loc_scene);
+ void _err_print_viewport_not_set() const;
mutable RID proxy_ph;
mutable RID proxy;
diff --git a/servers/display_server.cpp b/servers/display_server.cpp
index 12456fc828..86b4016da8 100644
--- a/servers/display_server.cpp
+++ b/servers/display_server.cpp
@@ -1224,6 +1224,11 @@ void DisplayServer::_input_set_custom_mouse_cursor_func(const Ref<Resource> &p_i
bool DisplayServer::can_create_rendering_device() {
#if defined(RD_ENABLED)
+ RenderingDevice *device = RenderingDevice::get_singleton();
+ if (device) {
+ return true;
+ }
+
Error err;
RenderingContextDriver *rcd = nullptr;