2020-03-28 13:29:29 +01:00
/**************************************************************************/
/* display_server_windows.h */
/**************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/**************************************************************************/
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
/* "Software"), to deal in the Software without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of the Software, and to */
/* permit persons to whom the Software is furnished to do so, subject to */
/* the following conditions: */
/* */
/* The above copyright notice and this permission notice shall be */
/* included in all copies or substantial portions of the Software. */
/* */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/**************************************************************************/
2020-03-09 12:56:48 -03:00
# pragma once
2023-06-08 14:51:32 +02:00
# include "crash_handler_windows.h"
# include "key_mapping_windows.h"
# include "tts_windows.h"
2020-03-09 12:56:48 -03:00
2020-11-07 19:33:38 -03:00
# include "core/config/project_settings.h"
2020-04-28 15:19:37 +02:00
# include "core/input/input.h"
2024-10-16 14:13:36 +03:00
# include "core/io/image.h"
2020-03-09 12:56:48 -03:00
# include "core/os/os.h"
# include "drivers/wasapi/audio_driver_wasapi.h"
# include "drivers/winmidi/midi_driver_winmidi.h"
2024-03-11 20:27:45 -07:00
# include "servers/audio/audio_server.h"
# include "servers/display/display_server.h"
2020-12-04 15:26:24 -03:00
# include "servers/rendering/renderer_compositor.h"
# include "servers/rendering/renderer_rd/renderer_compositor_rd.h"
2024-03-11 20:27:45 -07:00
# include "servers/rendering/rendering_server.h"
2020-03-09 12:56:48 -03:00
# ifdef XAUDIO2_ENABLED
# include "drivers/xaudio2/audio_driver_xaudio2.h"
# endif
2023-12-19 12:48:02 +01:00
# if defined(RD_ENABLED)
# include "servers/rendering/rendering_device.h"
2023-01-09 16:56:16 +01:00
# endif
2021-10-26 08:18:39 -07:00
# if defined(GLES3_ENABLED)
2021-11-12 14:49:49 +02:00
# include "gl_manager_windows_angle.h"
# include "gl_manager_windows_native.h"
# endif // GLES3_ENABLED
2020-11-18 18:11:30 +00:00
2024-03-07 20:42:24 +02:00
# include "native_menu_windows.h"
2020-03-09 12:56:48 -03:00
# include <io.h>
2025-04-28 16:05:13 -05:00
# include <cstdio>
2022-10-03 11:43:20 +02:00
2021-09-23 08:56:12 +02:00
# define WIN32_LEAN_AND_MEAN
2020-03-09 12:56:48 -03:00
# include <windows.h>
# include <windowsx.h>
2020-05-05 14:16:02 +03:00
// WinTab API
# define WT_PACKET 0x7FF0
# define WT_PROXIMITY 0x7FF5
# define WT_INFOCHANGE 0x7FF6
# define WT_CSRCHANGE 0x7FF7
# define WTI_DEFSYSCTX 4
# define WTI_DEVICES 100
# define DVC_NPRESSURE 15
# define DVC_TPRESSURE 16
# define DVC_ORIENTATION 17
# define DVC_ROTATION 18
# define CXO_MESSAGES 0x0004
2022-06-19 02:58:24 -07:00
# define PK_STATUS 0x0002
2020-05-05 14:16:02 +03:00
# define PK_NORMAL_PRESSURE 0x0400
# define PK_TANGENT_PRESSURE 0x0800
# define PK_ORIENTATION 0x1000
2022-06-19 02:58:24 -07:00
# define TPS_INVERT 0x0010 /* 1.1 */
2020-05-05 14:16:02 +03:00
typedef struct tagLOGCONTEXTW {
WCHAR lcName [ 40 ] ;
UINT lcOptions ;
UINT lcStatus ;
UINT lcLocks ;
UINT lcMsgBase ;
UINT lcDevice ;
UINT lcPktRate ;
DWORD lcPktData ;
DWORD lcPktMode ;
DWORD lcMoveMask ;
DWORD lcBtnDnMask ;
DWORD lcBtnUpMask ;
LONG lcInOrgX ;
LONG lcInOrgY ;
LONG lcInOrgZ ;
LONG lcInExtX ;
LONG lcInExtY ;
LONG lcInExtZ ;
LONG lcOutOrgX ;
LONG lcOutOrgY ;
LONG lcOutOrgZ ;
LONG lcOutExtX ;
LONG lcOutExtY ;
LONG lcOutExtZ ;
DWORD lcSensX ;
DWORD lcSensY ;
DWORD lcSensZ ;
BOOL lcSysMode ;
int lcSysOrgX ;
int lcSysOrgY ;
int lcSysExtX ;
int lcSysExtY ;
DWORD lcSysSensX ;
DWORD lcSysSensY ;
} LOGCONTEXTW ;
typedef struct tagAXIS {
LONG axMin ;
LONG axMax ;
UINT axUnits ;
DWORD axResolution ;
} AXIS ;
typedef struct tagORIENTATION {
int orAzimuth ;
int orAltitude ;
int orTwist ;
} ORIENTATION ;
typedef struct tagPACKET {
2022-06-19 02:58:24 -07:00
int pkStatus ;
2020-05-05 14:16:02 +03:00
int pkNormalPressure ;
int pkTangentPressure ;
ORIENTATION pkOrientation ;
} PACKET ;
typedef HANDLE ( WINAPI * WTOpenPtr ) ( HWND p_window , LOGCONTEXTW * p_ctx , BOOL p_enable ) ;
typedef BOOL ( WINAPI * WTClosePtr ) ( HANDLE p_ctx ) ;
typedef UINT ( WINAPI * WTInfoPtr ) ( UINT p_category , UINT p_index , LPVOID p_output ) ;
typedef BOOL ( WINAPI * WTPacketPtr ) ( HANDLE p_ctx , UINT p_param , LPVOID p_packets ) ;
typedef BOOL ( WINAPI * WTEnablePtr ) ( HANDLE p_ctx , BOOL p_enable ) ;
2024-03-15 13:59:47 +02:00
enum PreferredAppMode {
APPMODE_DEFAULT = 0 ,
APPMODE_ALLOWDARK = 1 ,
APPMODE_FORCEDARK = 2 ,
APPMODE_FORCELIGHT = 3 ,
APPMODE_MAX = 4
} ;
2024-06-13 13:46:49 +03:00
typedef const char * ( CDECL * WineGetVersionPtr ) ( void ) ;
2022-08-29 11:24:48 +03:00
typedef bool ( WINAPI * ShouldAppsUseDarkModePtr ) ( ) ;
typedef DWORD ( WINAPI * GetImmersiveColorFromColorSetExPtr ) ( UINT dwImmersiveColorSet , UINT dwImmersiveColorType , bool bIgnoreHighContrast , UINT dwHighContrastCacheMode ) ;
typedef int ( WINAPI * GetImmersiveColorTypeFromNamePtr ) ( const WCHAR * name ) ;
typedef int ( WINAPI * GetImmersiveUserColorSetPreferencePtr ) ( bool bForceCheckRegistry , bool bSkipCheckOnFail ) ;
2024-12-13 17:16:14 +01:00
typedef HRESULT ( WINAPI * RtlGetVersionPtr ) ( OSVERSIONINFOEXW * lpVersionInformation ) ;
2024-03-15 13:59:47 +02:00
typedef bool ( WINAPI * AllowDarkModeForAppPtr ) ( bool darkMode ) ;
typedef PreferredAppMode ( WINAPI * SetPreferredAppModePtr ) ( PreferredAppMode appMode ) ;
typedef void ( WINAPI * RefreshImmersiveColorPolicyStatePtr ) ( ) ;
typedef void ( WINAPI * FlushMenuThemesPtr ) ( ) ;
2022-08-29 11:24:48 +03:00
2020-03-09 12:56:48 -03:00
typedef struct {
BYTE bWidth ; // Width, in pixels, of the image
BYTE bHeight ; // Height, in pixels, of the image
BYTE bColorCount ; // Number of colors in image (0 if >=8bpp)
BYTE bReserved ; // Reserved ( must be 0)
WORD wPlanes ; // Color Planes
WORD wBitCount ; // Bits per pixel
DWORD dwBytesInRes ; // How many bytes in this resource?
DWORD dwImageOffset ; // Where in the file is this image?
} ICONDIRENTRY , * LPICONDIRENTRY ;
typedef struct {
WORD idReserved ; // Reserved (must be 0)
WORD idType ; // Resource Type (1 for icons)
WORD idCount ; // How many images?
ICONDIRENTRY idEntries [ 1 ] ; // An entry for each image (idCount of 'em)
} ICONDIR , * LPICONDIR ;
2024-09-20 17:01:35 +03:00
class DropTargetWindows ;
2024-02-27 22:19:47 +02:00
# ifndef WDA_EXCLUDEFROMCAPTURE
# define WDA_EXCLUDEFROMCAPTURE 0x00000011
# endif
2025-05-28 14:22:20 +05:00
class JoypadSDL ;
2020-03-09 12:56:48 -03:00
class DisplayServerWindows : public DisplayServer {
2025-04-10 09:18:58 +03:00
GDSOFTCLASS ( DisplayServerWindows , DisplayServer ) ;
2020-03-09 12:56:48 -03:00
2024-09-20 17:01:35 +03:00
friend class DropTargetWindows ;
2020-03-09 12:56:48 -03:00
_THREAD_SAFE_CLASS_
2022-08-29 11:24:48 +03:00
// UXTheme API
2022-09-02 21:44:58 +03:00
static bool dark_title_available ;
2024-01-23 21:44:40 -07:00
static bool use_legacy_dark_mode_before_20H1 ;
2022-08-29 11:24:48 +03:00
static bool ux_theme_available ;
static ShouldAppsUseDarkModePtr ShouldAppsUseDarkMode ;
static GetImmersiveColorFromColorSetExPtr GetImmersiveColorFromColorSetEx ;
static GetImmersiveColorTypeFromNamePtr GetImmersiveColorTypeFromName ;
static GetImmersiveUserColorSetPreferencePtr GetImmersiveUserColorSetPreference ;
2020-05-05 14:16:02 +03:00
// WinTab API
static bool wintab_available ;
static WTOpenPtr wintab_WTOpen ;
static WTClosePtr wintab_WTClose ;
static WTInfoPtr wintab_WTInfo ;
static WTPacketPtr wintab_WTPacket ;
static WTEnablePtr wintab_WTEnable ;
2020-05-19 23:34:26 +03:00
void _update_tablet_ctx ( const String & p_old_driver , const String & p_new_driver ) ;
2021-02-17 16:07:56 +02:00
String tablet_driver ;
Vector < String > tablet_drivers ;
2025-02-13 10:25:42 +02:00
bool winink_disabled = false ;
2020-05-19 23:34:26 +03:00
2024-07-30 22:19:06 +03:00
enum DriverID {
DRIVER_ID_COMPAT_OPENGL3 = 1 < < 0 ,
DRIVER_ID_COMPAT_ANGLE_D3D11 = 1 < < 1 ,
DRIVER_ID_RD_VULKAN = 1 < < 2 ,
DRIVER_ID_RD_D3D12 = 1 < < 3 ,
} ;
static BitField < DriverID > tested_drivers ;
2024-07-05 11:43:41 -04:00
enum TimerID {
TIMER_ID_MOVE_REDRAW = 1 ,
TIMER_ID_WINDOW_ACTIVATION = 2 ,
} ;
2024-12-13 17:16:14 +01:00
OSVERSIONINFOEXW os_ver ;
2024-02-27 22:19:47 +02:00
2020-03-09 12:56:48 -03:00
enum {
KEY_EVENT_BUFFER_SIZE = 512
} ;
struct KeyEvent {
WindowID window_id ;
2024-05-24 11:56:13 +03:00
bool alt , shift , control , meta , altgr ;
2020-03-09 12:56:48 -03:00
UINT uMsg ;
WPARAM wParam ;
LPARAM lParam ;
} ;
2022-10-26 11:37:45 +02:00
WindowID window_mouseover_id = INVALID_WINDOW_ID ;
2020-03-09 12:56:48 -03:00
KeyEvent key_event_buffer [ KEY_EVENT_BUFFER_SIZE ] ;
int key_event_pos ;
bool old_invalid ;
int old_x , old_y ;
Point2i center ;
2021-10-26 08:18:39 -07:00
# if defined(GLES3_ENABLED)
2021-11-12 14:49:49 +02:00
GLManagerANGLE_Windows * gl_manager_angle = nullptr ;
GLManagerNative_Windows * gl_manager_native = nullptr ;
2020-03-09 12:56:48 -03:00
# endif
2023-12-19 12:48:02 +01:00
# if defined(RD_ENABLED)
2023-12-19 14:57:56 -03:00
RenderingContextDriver * rendering_context = nullptr ;
2023-12-19 12:48:02 +01:00
RenderingDevice * rendering_device = nullptr ;
2023-01-09 16:56:16 +01:00
# endif
2022-05-13 15:04:37 +02:00
RBMap < int , Vector2 > touch_state ;
2020-03-09 12:56:48 -03:00
int pressrc ;
HINSTANCE hInstance ; // Holds The Instance Of The Application
String rendering_driver ;
2020-06-29 20:47:18 -03:00
bool app_focused = false ;
2022-08-03 18:29:07 +02:00
bool keep_screen_on = false ;
2025-06-15 01:36:10 +02:00
bool get_object_received = false ;
2022-08-03 18:29:07 +02:00
HANDLE power_request ;
2020-03-09 12:56:48 -03:00
2021-11-04 14:33:37 +02:00
TTS_Windows * tts = nullptr ;
2024-03-07 20:42:24 +02:00
NativeMenuWindows * native_menu = nullptr ;
2021-11-04 14:33:37 +02:00
2020-03-09 12:56:48 -03:00
struct WindowData {
HWND hWnd ;
2025-03-21 09:54:55 +02:00
WindowID id ;
2020-03-09 12:56:48 -03:00
2020-06-29 12:31:36 +03:00
Vector < Vector2 > mpath ;
2024-07-16 16:50:45 +08:00
bool create_completed = false ;
2020-03-09 12:56:48 -03:00
bool pre_fs_valid = false ;
RECT pre_fs_rect ;
bool maximized = false ;
2024-02-14 20:12:26 +05:30
bool maximized_fs = false ;
2020-03-09 12:56:48 -03:00
bool minimized = false ;
bool fullscreen = false ;
2022-01-28 11:19:53 +02:00
bool multiwindow_fs = false ;
2020-03-09 12:56:48 -03:00
bool borderless = false ;
bool resizable = true ;
2025-04-06 17:38:00 +03:00
bool no_min_btn = false ;
bool no_max_btn = false ;
2020-03-09 12:56:48 -03:00
bool window_focused = false ;
2024-04-30 14:31:43 +02:00
int activate_state = 0 ;
2024-10-29 09:32:49 +02:00
bool was_maximized_pre_fs = false ;
bool was_fullscreen_pre_min = false ;
2024-09-25 16:57:23 -04:00
bool first_activation_done = false ;
bool was_maximized = false ;
2020-03-09 12:56:48 -03:00
bool always_on_top = false ;
2020-03-20 17:51:53 -03:00
bool no_focus = false ;
2022-01-19 14:04:05 +02:00
bool exclusive = false ;
2022-10-17 16:12:35 +03:00
bool context_created = false ;
2023-01-15 12:05:25 +02:00
bool mpass = false ;
2024-09-14 11:05:53 -05:00
bool sharp_corners = false ;
2024-02-27 22:19:47 +02:00
bool hide_from_capture = false ;
2020-03-09 12:56:48 -03:00
2021-01-05 22:37:45 +03:00
// Used to transfer data between events using timer.
WPARAM saved_wparam ;
LPARAM saved_lparam ;
// Timers.
uint32_t move_timer_id = 0U ;
2024-04-30 14:31:43 +02:00
uint32_t activate_timer_id = 0U ;
2021-01-05 22:37:45 +03:00
2020-05-05 14:16:02 +03:00
HANDLE wtctx ;
LOGCONTEXTW wtlc ;
int min_pressure ;
int max_pressure ;
bool tilt_supported ;
2022-06-19 02:58:24 -07:00
bool pen_inverted = false ;
2020-05-22 10:44:47 +03:00
bool block_mm = false ;
2020-05-05 14:16:02 +03:00
int last_pressure_update ;
float last_pressure ;
Vector2 last_tilt ;
2022-06-19 02:58:24 -07:00
bool last_pen_inverted = false ;
2020-05-05 14:16:02 +03:00
2020-03-09 12:56:48 -03:00
Size2 min_size ;
Size2 max_size ;
int width = 0 , height = 0 ;
Size2 window_rect ;
Point2 last_pos ;
2020-03-24 20:15:35 -03:00
ObjectID instance_id ;
2020-03-09 12:56:48 -03:00
// IME
HIMC im_himc ;
Vector2 im_position ;
2022-12-11 01:21:22 +02:00
bool ime_active = false ;
bool ime_in_progress = false ;
bool ime_suppress_next_keyup = false ;
2020-03-09 12:56:48 -03:00
bool layered_window = false ;
2020-03-14 13:06:39 -03:00
Callable rect_changed_callback ;
2020-03-09 12:56:48 -03:00
Callable event_callback ;
Callable input_event_callback ;
Callable input_text_callback ;
Callable drop_files_callback ;
2024-09-20 17:01:35 +03:00
// OLE API
DropTargetWindows * drop_target = nullptr ;
2020-03-09 12:56:48 -03:00
WindowID transient_parent = INVALID_WINDOW_ID ;
2022-05-19 17:00:06 +02:00
HashSet < WindowID > transient_children ;
2022-02-24 11:21:23 +02:00
bool is_popup = false ;
Rect2i parent_safe_rect ;
2024-05-03 06:36:51 +08:00
bool initialized = false ;
2024-09-25 16:57:23 -04:00
HWND parent_hwnd = 0 ;
2025-11-04 13:34:10 +03:00
bool no_redirection_bitmap = false ;
2020-03-09 12:56:48 -03:00
} ;
2025-05-28 14:22:20 +05:00
# ifdef SDL_ENABLED
JoypadSDL * joypad_sdl = nullptr ;
# endif
2022-02-24 11:21:23 +02:00
HHOOK mouse_monitor = nullptr ;
List < WindowID > popup_list ;
uint64_t time_since_popup = 0 ;
2022-05-10 11:12:04 +03:00
Ref < Image > icon ;
2020-03-09 12:56:48 -03:00
2025-11-04 13:34:10 +03:00
Error _create_window ( WindowID p_window_id , WindowMode p_mode , uint32_t p_flags , const Rect2i & p_rect , bool p_exclusive , WindowID p_transient_parent , HWND p_parent_hwnd , bool p_no_redirection_bitmap ) ;
void _destroy_window ( WindowID p_window_id ) ; // Destroys only what was needed to be created for the main window. Does not destroy transient parent dependencies or GL/rendering context windows.
# ifdef RD_ENABLED
Error _create_rendering_context_window ( WindowID p_window_id ) ;
void _destroy_rendering_context_window ( WindowID p_window_id ) ;
# endif
# ifdef GLES3_ENABLED
Error _create_gl_window ( WindowID p_window_id ) ;
# endif
2020-03-09 12:56:48 -03:00
WindowID window_id_counter = MAIN_WINDOW_ID ;
2022-05-13 15:04:37 +02:00
RBMap < WindowID , WindowData > windows ;
2020-03-09 12:56:48 -03:00
WindowID last_focused_window = INVALID_WINDOW_ID ;
2024-08-16 18:40:46 -04:00
WindowID last_mouse_button_down_window = INVALID_WINDOW_ID ;
2020-03-09 12:56:48 -03:00
HCURSOR hCursor ;
2020-03-12 09:37:40 -03:00
WNDPROC user_proc = nullptr ;
2020-03-09 12:56:48 -03:00
2023-08-03 12:45:56 +03:00
struct IndicatorData {
2024-03-16 23:14:30 +02:00
RID menu_rid ;
2023-08-03 12:45:56 +03:00
Callable callback ;
} ;
IndicatorID indicator_id_counter = 0 ;
HashMap < IndicatorID , IndicatorData > indicators ;
2024-07-24 12:57:46 +03:00
struct FileDialogData {
HWND hwnd_owner = 0 ;
Rect2i wrect ;
String appid ;
String title ;
String current_directory ;
String root ;
String filename ;
bool show_hidden = false ;
DisplayServer : : FileDialogMode mode = FileDialogMode : : FILE_DIALOG_MODE_OPEN_ANY ;
Vector < String > filters ;
TypedArray < Dictionary > options ;
WindowID window_id = DisplayServer : : INVALID_WINDOW_ID ;
Callable callback ;
bool options_in_cb = false ;
Thread listener_thread ;
SafeFlag close_requested ;
SafeFlag finished ;
} ;
Mutex file_dialog_mutex ;
List < FileDialogData * > file_dialogs ;
HashMap < HWND , FileDialogData * > file_dialog_wnd ;
2024-08-23 09:53:16 +03:00
struct FileDialogCallback {
Callable callback ;
Variant status ;
Variant files ;
Variant index ;
Variant options ;
bool opt_in_cb = false ;
} ;
List < FileDialogCallback > pending_cbs ;
void process_file_dialog_callbacks ( ) ;
2024-07-24 12:57:46 +03:00
static void _thread_fd_monitor ( void * p_ud ) ;
2024-07-08 10:42:55 +03:00
HashMap < int64_t , MouseButton > pointer_prev_button ;
HashMap < int64_t , MouseButton > pointer_button ;
HashMap < int64_t , LONG > pointer_down_time ;
HashMap < int64_t , Vector2 > pointer_last_pos ;
2020-03-09 12:56:48 -03:00
void _send_window_event ( const WindowData & wd , WindowEvent p_event ) ;
2025-11-04 13:34:10 +03:00
void _get_window_style ( bool p_main_window , bool p_initialized , bool p_fullscreen , bool p_multiwindow_fs , bool p_borderless , bool p_resizable , bool p_no_min_btn , bool p_no_max_btn , bool p_minimized , bool p_maximized , bool p_maximized_fs , bool p_no_activate_focus , bool p_embed_child , bool p_no_redirection_bitmap , DWORD & r_style , DWORD & r_style_ex ) ;
2020-03-09 12:56:48 -03:00
MouseMode mouse_mode ;
2025-01-22 10:44:50 -05:00
MouseMode mouse_mode_base = MOUSE_MODE_VISIBLE ;
MouseMode mouse_mode_override = MOUSE_MODE_VISIBLE ;
bool mouse_mode_override_enabled = false ;
void _mouse_update_mode ( ) ;
2021-09-19 21:42:56 -07:00
int restore_mouse_trails = 0 ;
2024-05-27 10:52:59 +03:00
2020-03-09 12:56:48 -03:00
bool use_raw_input = false ;
bool drop_events = false ;
2020-04-02 16:06:04 +02:00
bool in_dispatch_input_event = false ;
2020-03-09 12:56:48 -03:00
WNDCLASSEXW wc ;
2023-01-11 19:15:10 +01:00
HBRUSH window_bkg_brush = nullptr ;
uint32_t window_bkg_brush_color = 0 ;
2020-03-09 12:56:48 -03:00
2020-04-02 01:20:12 +02:00
HCURSOR cursors [ CURSOR_MAX ] = { nullptr } ;
2021-01-18 15:52:47 -08:00
CursorShape cursor_shape = CursorShape : : CURSOR_ARROW ;
2022-05-13 15:04:37 +02:00
RBMap < CursorShape , Vector < Variant > > cursors_cache ;
2020-03-09 12:56:48 -03:00
2024-01-19 20:46:26 +02:00
Callable system_theme_changed ;
2020-03-09 12:56:48 -03:00
void _drag_event ( WindowID p_window , float p_x , float p_y , int idx ) ;
void _touch_event ( WindowID p_window , bool p_pressed , float p_x , float p_y , int idx ) ;
2024-12-10 01:35:25 +08:00
bool _is_always_on_top_recursive ( WindowID p_window ) const ;
2020-12-31 14:49:03 +03:00
void _update_window_style ( WindowID p_window , bool p_repaint = true ) ;
2020-06-29 12:31:36 +03:00
void _update_window_mouse_passthrough ( WindowID p_window ) ;
2020-03-09 12:56:48 -03:00
void _update_real_mouse_position ( WindowID p_window ) ;
void _set_mouse_mode_impl ( MouseMode p_mode ) ;
2022-09-07 19:31:57 +02:00
WindowID _get_focused_window_or_popup ( ) const ;
void _register_raw_input_devices ( WindowID p_target_window ) ;
2024-08-15 22:51:34 -04:00
bool _has_moving_window ( ) const ;
2020-03-09 12:56:48 -03:00
2024-04-30 14:31:43 +02:00
void _process_activate_event ( WindowID p_window_id ) ;
2020-03-09 12:56:48 -03:00
void _process_key_events ( ) ;
static void _dispatch_input_events ( const Ref < InputEvent > & p_event ) ;
void _dispatch_input_event ( const Ref < InputEvent > & p_event ) ;
2022-05-08 19:25:49 -04:00
LRESULT _handle_early_window_message ( HWND hWnd , UINT uMsg , WPARAM wParam , LPARAM lParam ) ;
2023-01-05 00:00:02 +02:00
Point2i _get_screens_origin ( ) const ;
2022-05-08 19:25:49 -04:00
2024-05-24 11:56:13 +03:00
enum class WinKeyModifierMask {
ALT_GR = ( 1 < < 1 ) ,
SHIFT = ( 1 < < 2 ) ,
ALT = ( 1 < < 3 ) ,
META = ( 1 < < 4 ) ,
CTRL = ( 1 < < 5 ) ,
} ;
BitField < WinKeyModifierMask > _get_mods ( ) const ;
2024-09-30 12:19:48 +03:00
Error _file_dialog_with_options_show ( const String & p_title , const String & p_current_directory , const String & p_root , const String & p_filename , bool p_show_hidden , FileDialogMode p_mode , const Vector < String > & p_filters , const TypedArray < Dictionary > & p_options , const Callable & p_callback , bool p_options_in_cb , WindowID p_window_id ) ;
2023-10-13 12:37:46 +03:00
2024-07-09 11:39:54 +03:00
String _get_keyboard_layout_display_name ( const String & p_klid ) const ;
String _get_klid ( HKL p_hkl ) const ;
2024-09-25 16:57:23 -04:00
struct EmbeddedProcessData {
HWND window_handle = 0 ;
HWND parent_window_handle = 0 ;
bool is_visible = false ;
} ;
HashMap < OS : : ProcessID , EmbeddedProcessData * > embedded_processes ;
HWND _find_window_from_process_id ( OS : : ProcessID p_pid , HWND p_current_hwnd ) ;
2025-04-01 11:59:04 +03:00
void initialize_tts ( ) const ;
2020-03-09 12:56:48 -03:00
public :
2024-07-24 12:57:46 +03:00
LRESULT WndProcFileDialog ( HWND hWnd , UINT uMsg , WPARAM wParam , LPARAM lParam ) ;
2020-03-09 12:56:48 -03:00
LRESULT WndProc ( HWND hWnd , UINT uMsg , WPARAM wParam , LPARAM lParam ) ;
2022-02-24 11:21:23 +02:00
LRESULT MouseProc ( int code , WPARAM wParam , LPARAM lParam ) ;
void popup_open ( WindowID p_window ) ;
void popup_close ( WindowID p_window ) ;
2020-03-09 12:56:48 -03:00
2021-07-16 21:39:13 +02:00
virtual bool has_feature ( Feature p_feature ) const override ;
virtual String get_name ( ) const override ;
2020-03-09 12:56:48 -03:00
2021-11-04 14:33:37 +02:00
virtual bool tts_is_speaking ( ) const override ;
virtual bool tts_is_paused ( ) const override ;
2022-08-05 03:41:48 +02:00
virtual TypedArray < Dictionary > tts_get_voices ( ) const override ;
2021-11-04 14:33:37 +02:00
virtual void tts_speak ( const String & p_text , const String & p_voice , int p_volume = 50 , float p_pitch = 1.f , float p_rate = 1.f , int p_utterance_id = 0 , bool p_interrupt = false ) override ;
virtual void tts_pause ( ) override ;
virtual void tts_resume ( ) override ;
virtual void tts_stop ( ) override ;
2022-08-29 11:24:48 +03:00
virtual bool is_dark_mode_supported ( ) const override ;
virtual bool is_dark_mode ( ) const override ;
virtual Color get_accent_color ( ) const override ;
2024-01-19 20:46:26 +02:00
virtual Color get_base_color ( ) const override ;
virtual void set_system_theme_change_callback ( const Callable & p_callable ) override ;
2022-08-29 11:24:48 +03:00
2024-09-30 12:19:48 +03:00
virtual Error file_dialog_show ( const String & p_title , const String & p_current_directory , const String & p_filename , bool p_show_hidden , FileDialogMode p_mode , const Vector < String > & p_filters , const Callable & p_callback , WindowID p_window_id ) override ;
virtual Error file_dialog_with_options_show ( const String & p_title , const String & p_current_directory , const String & p_root , const String & p_filename , bool p_show_hidden , FileDialogMode p_mode , const Vector < String > & p_filters , const TypedArray < Dictionary > & p_options , const Callable & p_callback , WindowID p_window_id ) override ;
2023-07-17 12:12:24 +03:00
2024-11-17 22:40:39 +02:00
virtual void beep ( ) const override ;
2021-07-16 21:39:13 +02:00
virtual void mouse_set_mode ( MouseMode p_mode ) override ;
virtual MouseMode mouse_get_mode ( ) const override ;
2025-01-22 10:44:50 -05:00
virtual void mouse_set_mode_override ( MouseMode p_mode ) override ;
virtual MouseMode mouse_get_mode_override ( ) const override ;
virtual void mouse_set_mode_override_enabled ( bool p_override_enabled ) override ;
virtual bool mouse_is_mode_override_enabled ( ) const override ;
2020-03-09 12:56:48 -03:00
2022-03-27 11:17:36 +02:00
virtual void warp_mouse ( const Point2i & p_position ) override ;
2021-07-16 21:39:13 +02:00
virtual Point2i mouse_get_position ( ) const override ;
2023-01-08 00:55:54 +01:00
virtual BitField < MouseButtonMask > mouse_get_button_state ( ) const override ;
2020-03-09 12:56:48 -03:00
2021-07-16 21:39:13 +02:00
virtual void clipboard_set ( const String & p_text ) override ;
virtual String clipboard_get ( ) const override ;
2022-08-02 14:05:37 +02:00
virtual Ref < Image > clipboard_get_image ( ) const override ;
virtual bool clipboard_has ( ) const override ;
virtual bool clipboard_has_image ( ) const override ;
2020-03-09 12:56:48 -03:00
2021-07-16 21:39:13 +02:00
virtual int get_screen_count ( ) const override ;
2023-01-05 00:00:02 +02:00
virtual int get_primary_screen ( ) const override ;
2023-03-21 13:08:46 +02:00
virtual int get_keyboard_focus_screen ( ) const override ;
2021-07-16 21:39:13 +02:00
virtual Point2i screen_get_position ( int p_screen = SCREEN_OF_MAIN_WINDOW ) const override ;
virtual Size2i screen_get_size ( int p_screen = SCREEN_OF_MAIN_WINDOW ) const override ;
virtual Rect2i screen_get_usable_rect ( int p_screen = SCREEN_OF_MAIN_WINDOW ) const override ;
virtual int screen_get_dpi ( int p_screen = SCREEN_OF_MAIN_WINDOW ) const override ;
2022-01-27 13:46:57 -06:00
virtual float screen_get_refresh_rate ( int p_screen = SCREEN_OF_MAIN_WINDOW ) const override ;
2023-02-27 20:36:13 +02:00
virtual Color screen_get_pixel ( const Point2i & p_position ) const override ;
2023-03-16 23:26:09 +02:00
virtual Ref < Image > screen_get_image ( int p_screen = SCREEN_OF_MAIN_WINDOW ) const override ;
2024-02-27 22:19:47 +02:00
virtual Ref < Image > screen_get_image_rect ( const Rect2i & p_rect ) const override ;
2020-03-09 12:56:48 -03:00
2021-07-16 21:39:13 +02:00
virtual void screen_set_keep_on ( bool p_enable ) override ; //disable screensaver
virtual bool screen_is_kept_on ( ) const override ;
2020-03-09 12:56:48 -03:00
2021-07-16 21:39:13 +02:00
virtual Vector < DisplayServer : : WindowID > get_window_list ( ) const override ;
2020-03-09 12:56:48 -03:00
2024-07-25 00:20:31 +08:00
virtual WindowID create_sub_window ( WindowMode p_mode , VSyncMode p_vsync_mode , uint32_t p_flags , const Rect2i & p_rect = Rect2i ( ) , bool p_exclusive = false , WindowID p_transient_parent = INVALID_WINDOW_ID ) override ;
2021-07-16 21:39:13 +02:00
virtual void show_window ( WindowID p_window ) override ;
virtual void delete_sub_window ( WindowID p_window ) override ;
2020-03-09 12:56:48 -03:00
2022-02-24 11:21:23 +02:00
virtual WindowID window_get_active_popup ( ) const override ;
virtual void window_set_popup_safe_rect ( WindowID p_window , const Rect2i & p_rect ) override ;
virtual Rect2i window_get_popup_safe_rect ( WindowID p_window ) const override ;
2022-01-14 12:41:04 +02:00
virtual int64_t window_get_native_handle ( HandleType p_handle_type , WindowID p_window = MAIN_WINDOW_ID ) const override ;
2021-07-16 21:39:13 +02:00
virtual WindowID get_window_at_screen_position ( const Point2i & p_position ) const override ;
2020-03-24 20:15:35 -03:00
2021-07-16 21:39:13 +02:00
virtual void window_attach_instance_id ( ObjectID p_instance , WindowID p_window = MAIN_WINDOW_ID ) override ;
virtual ObjectID window_get_attached_instance_id ( WindowID p_window = MAIN_WINDOW_ID ) const override ;
2021-12-16 15:00:55 +02:00
virtual void gl_window_make_current ( DisplayServer : : WindowID p_window_id ) override ;
2020-03-24 20:15:35 -03:00
2021-07-16 21:39:13 +02:00
virtual void window_set_rect_changed_callback ( const Callable & p_callable , WindowID p_window = MAIN_WINDOW_ID ) override ;
2020-03-09 12:56:48 -03:00
2021-07-16 21:39:13 +02:00
virtual void window_set_window_event_callback ( const Callable & p_callable , WindowID p_window = MAIN_WINDOW_ID ) override ;
virtual void window_set_input_event_callback ( const Callable & p_callable , WindowID p_window = MAIN_WINDOW_ID ) override ;
virtual void window_set_input_text_callback ( const Callable & p_callable , WindowID p_window = MAIN_WINDOW_ID ) override ;
2020-03-09 12:56:48 -03:00
2021-07-16 21:39:13 +02:00
virtual void window_set_drop_files_callback ( const Callable & p_callable , WindowID p_window = MAIN_WINDOW_ID ) override ;
2020-03-09 12:56:48 -03:00
2021-07-16 21:39:13 +02:00
virtual void window_set_title ( const String & p_title , WindowID p_window = MAIN_WINDOW_ID ) override ;
2023-08-08 11:31:56 +03:00
virtual Size2i window_get_title_size ( const String & p_title , WindowID p_window = MAIN_WINDOW_ID ) const override ;
2021-07-16 21:39:13 +02:00
virtual void window_set_mouse_passthrough ( const Vector < Vector2 > & p_region , WindowID p_window = MAIN_WINDOW_ID ) override ;
2020-03-09 12:56:48 -03:00
2021-07-16 21:39:13 +02:00
virtual int window_get_current_screen ( WindowID p_window = MAIN_WINDOW_ID ) const override ;
virtual void window_set_current_screen ( int p_screen , WindowID p_window = MAIN_WINDOW_ID ) override ;
2020-03-09 12:56:48 -03:00
2021-07-16 21:39:13 +02:00
virtual Point2i window_get_position ( WindowID p_window = MAIN_WINDOW_ID ) const override ;
2022-11-30 10:28:16 +02:00
virtual Point2i window_get_position_with_decorations ( WindowID p_window = MAIN_WINDOW_ID ) const override ;
2021-07-16 21:39:13 +02:00
virtual void window_set_position ( const Point2i & p_position , WindowID p_window = MAIN_WINDOW_ID ) override ;
2020-03-09 12:56:48 -03:00
2021-07-16 21:39:13 +02:00
virtual void window_set_transient ( WindowID p_window , WindowID p_parent ) override ;
2022-01-19 14:04:05 +02:00
virtual void window_set_exclusive ( WindowID p_window , bool p_exclusive ) override ;
2020-03-09 12:56:48 -03:00
2021-07-16 21:39:13 +02:00
virtual void window_set_max_size ( const Size2i p_size , WindowID p_window = MAIN_WINDOW_ID ) override ;
virtual Size2i window_get_max_size ( WindowID p_window = MAIN_WINDOW_ID ) const override ;
2020-03-09 12:56:48 -03:00
2021-07-16 21:39:13 +02:00
virtual void window_set_min_size ( const Size2i p_size , WindowID p_window = MAIN_WINDOW_ID ) override ;
virtual Size2i window_get_min_size ( WindowID p_window = MAIN_WINDOW_ID ) const override ;
2020-03-09 12:56:48 -03:00
2021-07-16 21:39:13 +02:00
virtual void window_set_size ( const Size2i p_size , WindowID p_window = MAIN_WINDOW_ID ) override ;
virtual Size2i window_get_size ( WindowID p_window = MAIN_WINDOW_ID ) const override ;
2022-11-30 10:28:16 +02:00
virtual Size2i window_get_size_with_decorations ( WindowID p_window = MAIN_WINDOW_ID ) const override ;
2020-03-09 12:56:48 -03:00
2021-07-16 21:39:13 +02:00
virtual void window_set_mode ( WindowMode p_mode , WindowID p_window = MAIN_WINDOW_ID ) override ;
virtual WindowMode window_get_mode ( WindowID p_window = MAIN_WINDOW_ID ) const override ;
2020-03-09 12:56:48 -03:00
2021-07-16 21:39:13 +02:00
virtual bool window_is_maximize_allowed ( WindowID p_window = MAIN_WINDOW_ID ) const override ;
2020-03-09 12:56:48 -03:00
2021-07-16 21:39:13 +02:00
virtual void window_set_flag ( WindowFlags p_flag , bool p_enabled , WindowID p_window = MAIN_WINDOW_ID ) override ;
virtual bool window_get_flag ( WindowFlags p_flag , WindowID p_window = MAIN_WINDOW_ID ) const override ;
2020-03-09 12:56:48 -03:00
2021-07-16 21:39:13 +02:00
virtual void window_request_attention ( WindowID p_window = MAIN_WINDOW_ID ) override ;
virtual void window_move_to_foreground ( WindowID p_window = MAIN_WINDOW_ID ) override ;
2023-06-15 10:53:31 +03:00
virtual bool window_is_focused ( WindowID p_window = MAIN_WINDOW_ID ) const override ;
2020-03-09 12:56:48 -03:00
2023-12-22 17:50:21 +01:00
virtual WindowID get_focused_window ( ) const override ;
2021-07-16 21:39:13 +02:00
virtual bool window_can_draw ( WindowID p_window = MAIN_WINDOW_ID ) const override ;
2020-03-09 12:56:48 -03:00
2021-07-16 21:39:13 +02:00
virtual bool can_any_window_draw ( ) const override ;
2020-03-09 12:56:48 -03:00
2021-07-16 21:39:13 +02:00
virtual void window_set_ime_active ( const bool p_active , WindowID p_window = MAIN_WINDOW_ID ) override ;
virtual void window_set_ime_position ( const Point2i & p_pos , WindowID p_window = MAIN_WINDOW_ID ) override ;
2020-03-09 12:56:48 -03:00
2025-03-21 09:54:55 +02:00
virtual int accessibility_should_increase_contrast ( ) const override ;
virtual int accessibility_should_reduce_animation ( ) const override ;
virtual int accessibility_should_reduce_transparency ( ) const override ;
virtual int accessibility_screen_reader_active ( ) const override ;
2022-12-11 01:21:22 +02:00
virtual Point2i ime_get_selection ( ) const override ;
virtual String ime_get_text ( ) const override ;
2021-06-19 17:44:59 +02:00
virtual void window_set_vsync_mode ( DisplayServer : : VSyncMode p_vsync_mode , WindowID p_window = MAIN_WINDOW_ID ) override ;
virtual DisplayServer : : VSyncMode window_get_vsync_mode ( WindowID p_vsync_mode ) const override ;
2024-12-16 10:01:07 +02:00
virtual void window_start_drag ( WindowID p_window = MAIN_WINDOW_ID ) override ;
2024-12-17 20:01:56 +02:00
virtual void window_start_resize ( WindowResizeEdge p_edge , WindowID p_window = MAIN_WINDOW_ID ) override ;
2024-12-16 10:01:07 +02:00
2021-07-16 21:39:13 +02:00
virtual void cursor_set_shape ( CursorShape p_shape ) override ;
virtual CursorShape cursor_get_shape ( ) const override ;
2022-05-03 01:43:50 +02:00
virtual void cursor_set_custom_image ( const Ref < Resource > & p_cursor , CursorShape p_shape = CURSOR_ARROW , const Vector2 & p_hotspot = Vector2 ( ) ) override ;
2020-03-09 12:56:48 -03:00
2021-07-16 21:39:13 +02:00
virtual bool get_swap_cancel_ok ( ) override ;
2020-03-09 12:56:48 -03:00
2021-07-16 21:39:13 +02:00
virtual void enable_for_stealing_focus ( OS : : ProcessID pid ) override ;
2024-09-25 16:57:23 -04:00
virtual Error embed_process ( WindowID p_window , OS : : ProcessID p_pid , const Rect2i & p_rect , bool p_visible , bool p_grab_focus ) override ;
2025-02-05 19:51:30 -05:00
virtual Error request_close_embedded_process ( OS : : ProcessID p_pid ) override ;
2024-09-25 16:57:23 -04:00
virtual Error remove_embedded_process ( OS : : ProcessID p_pid ) override ;
virtual OS : : ProcessID get_focused_process_id ( ) override ;
2020-03-09 12:56:48 -03:00
2024-02-18 16:56:32 -08:00
virtual Error dialog_show ( String p_title , String p_description , Vector < String > p_buttons , const Callable & p_callback ) override ;
virtual Error dialog_input_text ( String p_title , String p_description , String p_partial , const Callable & p_callback ) override ;
2021-07-16 21:39:13 +02:00
virtual int keyboard_get_layout_count ( ) const override ;
virtual int keyboard_get_current_layout ( ) const override ;
virtual void keyboard_set_current_layout ( int p_index ) override ;
virtual String keyboard_get_layout_language ( int p_index ) const override ;
virtual String keyboard_get_layout_name ( int p_index ) const override ;
2021-09-17 03:07:59 +02:00
virtual Key keyboard_get_keycode_from_physical ( Key p_keycode ) const override ;
2023-06-08 09:26:48 +03:00
virtual Key keyboard_get_label_from_physical ( Key p_keycode ) const override ;
2025-01-02 13:27:35 +02:00
virtual void show_emoji_and_symbol_picker ( ) const override ;
2020-03-09 12:56:48 -03:00
2021-07-16 21:39:13 +02:00
virtual int tablet_get_driver_count ( ) const override ;
virtual String tablet_get_driver_name ( int p_driver ) const override ;
virtual String tablet_get_current_driver ( ) const override ;
virtual void tablet_set_current_driver ( const String & p_driver ) override ;
2021-02-17 16:07:56 +02:00
2021-07-16 21:39:13 +02:00
virtual void process_events ( ) override ;
2020-03-09 12:56:48 -03:00
2021-07-16 21:39:13 +02:00
virtual void force_process_and_drop_events ( ) override ;
2020-03-09 12:56:48 -03:00
2021-07-16 21:39:13 +02:00
virtual void release_rendering_thread ( ) override ;
virtual void swap_buffers ( ) override ;
2020-03-09 12:56:48 -03:00
2021-07-16 21:39:13 +02:00
virtual void set_native_icon ( const String & p_filename ) override ;
virtual void set_icon ( const Ref < Image > & p_icon ) override ;
2020-03-09 12:56:48 -03:00
2024-03-16 23:14:30 +02:00
virtual IndicatorID create_status_indicator ( const Ref < Texture2D > & p_icon , const String & p_tooltip , const Callable & p_callback ) override ;
virtual void status_indicator_set_icon ( IndicatorID p_id , const Ref < Texture2D > & p_icon ) override ;
2023-08-03 12:45:56 +03:00
virtual void status_indicator_set_tooltip ( IndicatorID p_id , const String & p_tooltip ) override ;
2024-03-16 23:14:30 +02:00
virtual void status_indicator_set_menu ( IndicatorID p_id , const RID & p_rid ) override ;
2023-08-03 12:45:56 +03:00
virtual void status_indicator_set_callback ( IndicatorID p_id , const Callable & p_callback ) override ;
2024-03-08 09:24:58 +02:00
virtual Rect2 status_indicator_get_rect ( IndicatorID p_id ) const override ;
2023-08-03 12:45:56 +03:00
virtual void delete_status_indicator ( IndicatorID p_id ) override ;
2021-07-16 21:39:13 +02:00
virtual void set_context ( Context p_context ) override ;
2020-03-09 12:56:48 -03:00
2024-05-03 11:48:46 +03:00
virtual bool is_window_transparency_available ( ) const override ;
2024-09-25 16:57:23 -04:00
static DisplayServer * create_func ( const String & p_rendering_driver , WindowMode p_mode , VSyncMode p_vsync_mode , uint32_t p_flags , const Vector2i * p_position , const Vector2i & p_resolution , int p_screen , Context p_context , int64_t p_parent_window , Error & r_error ) ;
2020-03-09 12:56:48 -03:00
static Vector < String > get_rendering_drivers_func ( ) ;
static void register_windows_driver ( ) ;
2024-09-25 16:57:23 -04:00
DisplayServerWindows ( const String & p_rendering_driver , WindowMode p_mode , VSyncMode p_vsync_mode , uint32_t p_flags , const Vector2i * p_position , const Vector2i & p_resolution , int p_screen , Context p_context , int64_t p_parent_window , Error & r_error ) ;
2020-03-09 12:56:48 -03:00
~ DisplayServerWindows ( ) ;
} ;