diff options
-rw-r--r-- | drivers/wasapi/audio_driver_wasapi.cpp | 19 | ||||
-rw-r--r-- | drivers/wasapi/audio_driver_wasapi.h | 9 | ||||
-rw-r--r-- | platform/linuxbsd/x11/display_server_x11.cpp | 6 | ||||
-rw-r--r-- | platform/windows/console_wrapper_windows.cpp | 4 | ||||
-rw-r--r-- | platform/windows/os_windows.cpp | 4 | ||||
-rw-r--r-- | scene/gui/line_edit.cpp | 2 | ||||
-rw-r--r-- | scene/gui/text_edit.cpp | 2 | ||||
-rw-r--r-- | scene/main/viewport.cpp | 25 | ||||
-rw-r--r-- | scene/main/viewport.h | 1 | ||||
-rw-r--r-- | servers/display_server.cpp | 5 |
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; |