@@ -6642,7 +6642,80 @@ GetImmersiveColorFromColorSetExPtr DisplayServerWindows::GetImmersiveColorFromCo
66426642GetImmersiveColorTypeFromNamePtr DisplayServerWindows::GetImmersiveColorTypeFromName = nullptr ;
66436643GetImmersiveUserColorSetPreferencePtr DisplayServerWindows::GetImmersiveUserColorSetPreference = nullptr ;
66446644
6645- Vector2i _get_device_ids (const String &p_device_name) {
6645+ Vector2i _get_device_ids_reg (const String &p_device_name) {
6646+ Vector2i out;
6647+
6648+ String subkey = " SYSTEM\\ CurrentControlSet\\ Control\\ Class\\ {4d36e968-e325-11ce-bfc1-08002be10318}" ;
6649+ HKEY hkey = nullptr ;
6650+ LSTATUS result = RegOpenKeyExW (HKEY_LOCAL_MACHINE, (LPCWSTR)subkey.utf16 ().get_data (), 0 , KEY_READ, &hkey);
6651+ if (result != ERROR_SUCCESS) {
6652+ return Vector2i ();
6653+ }
6654+
6655+ DWORD subkeys = 0 ;
6656+ result = RegQueryInfoKeyW (hkey, nullptr , nullptr , nullptr , &subkeys, nullptr , nullptr , nullptr , nullptr , nullptr , nullptr , nullptr );
6657+ if (result != ERROR_SUCCESS) {
6658+ RegCloseKey (hkey);
6659+ return Vector2i ();
6660+ }
6661+ for (DWORD i = 0 ; i < subkeys; i++) {
6662+ WCHAR key_name[MAX_PATH] = L" " ;
6663+ DWORD key_name_size = MAX_PATH;
6664+ result = RegEnumKeyExW (hkey, i, key_name, &key_name_size, nullptr , nullptr , nullptr , nullptr );
6665+ if (result != ERROR_SUCCESS) {
6666+ continue ;
6667+ }
6668+ String id = String::utf16 ((const char16_t *)key_name, key_name_size);
6669+ if (!id.is_empty ()) {
6670+ HKEY sub_hkey = nullptr ;
6671+ result = RegOpenKeyExW (HKEY_LOCAL_MACHINE, (LPCWSTR)(subkey + " \\ " + id).utf16 ().get_data (), 0 , KEY_QUERY_VALUE, &sub_hkey);
6672+ if (result != ERROR_SUCCESS) {
6673+ continue ;
6674+ }
6675+
6676+ WCHAR buffer[4096 ];
6677+ DWORD buffer_len = 4096 ;
6678+ DWORD vtype = REG_SZ;
6679+ if (RegQueryValueExW (sub_hkey, L" DriverDesc" , nullptr , &vtype, (LPBYTE)buffer, &buffer_len) != ERROR_SUCCESS || buffer_len == 0 ) {
6680+ buffer_len = 4096 ;
6681+ if (RegQueryValueExW (sub_hkey, L" HardwareInformation.AdapterString" , nullptr , &vtype, (LPBYTE)buffer, &buffer_len) != ERROR_SUCCESS || buffer_len == 0 ) {
6682+ RegCloseKey (sub_hkey);
6683+ continue ;
6684+ }
6685+ }
6686+
6687+ String driver_name = String::utf16 ((const char16_t *)buffer, buffer_len).strip_edges ();
6688+ if (driver_name == p_device_name) {
6689+ String driver_id;
6690+
6691+ buffer_len = 4096 ;
6692+ if (RegQueryValueExW (sub_hkey, L" MatchingDeviceId" , nullptr , &vtype, (LPBYTE)buffer, &buffer_len) == ERROR_SUCCESS && buffer_len != 0 ) {
6693+ driver_id = String::utf16 ((const char16_t *)buffer, buffer_len).strip_edges ();
6694+
6695+ Vector<String> id_parts = driver_id.to_lower ().split (" &" );
6696+ for (const String &id_part : id_parts) {
6697+ int ven_off = id_part.find (" ven_" );
6698+ if (ven_off >= 0 ) {
6699+ out.x = id_part.substr (ven_off + 4 ).hex_to_int ();
6700+ }
6701+ int dev_off = id_part.find (" dev_" );
6702+ if (dev_off >= 0 ) {
6703+ out.y = id_part.substr (dev_off + 4 ).hex_to_int ();
6704+ }
6705+ }
6706+
6707+ RegCloseKey (sub_hkey);
6708+ break ;
6709+ }
6710+ }
6711+ RegCloseKey (sub_hkey);
6712+ }
6713+ }
6714+ RegCloseKey (hkey);
6715+ return out;
6716+ }
6717+
6718+ Vector2i _get_device_ids_wmi (const String &p_device_name) {
66466719 if (p_device_name.is_empty ()) {
66476720 return Vector2i ();
66486721 }
@@ -6704,6 +6777,14 @@ Vector2i _get_device_ids(const String &p_device_name) {
67046777 return ids;
67056778}
67066779
6780+ Vector2i _get_device_ids (const String &p_device_name) {
6781+ Vector2i out = _get_device_ids_reg (p_device_name);
6782+ if (out == Vector2i ()) {
6783+ out = _get_device_ids_wmi (p_device_name);
6784+ }
6785+ return out;
6786+ }
6787+
67076788bool DisplayServerWindows::is_dark_mode_supported () const {
67086789 return ux_theme_available;
67096790}
@@ -6824,9 +6905,12 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win
68246905 os_ver.dwOSVersionInfoSize = sizeof (OSVERSIONINFOW);
68256906
68266907 HMODULE nt_lib = LoadLibraryW (L" ntdll.dll" );
6908+ bool is_wine = false ;
68276909 if (nt_lib) {
68286910 WineGetVersionPtr wine_get_version = (WineGetVersionPtr)(void *)GetProcAddress (nt_lib, " wine_get_version" ); // Do not read Windows build number under Wine, it can be set to arbitrary value.
6829- if (!wine_get_version) {
6911+ if (wine_get_version) {
6912+ is_wine = true ;
6913+ } else {
68306914 RtlGetVersionPtr RtlGetVersion = (RtlGetVersionPtr)(void *)GetProcAddress (nt_lib, " RtlGetVersion" );
68316915 if (RtlGetVersion) {
68326916 RtlGetVersion (&os_ver);
@@ -7072,7 +7156,7 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win
70727156 }
70737157
70747158 bool gl_supported = true ;
7075- if (fallback && (rendering_driver == " opengl3" )) {
7159+ if (fallback && !is_wine && (rendering_driver == " opengl3" )) {
70767160 Dictionary gl_info = detect_wgl ();
70777161
70787162 bool force_angle = false ;
0 commit comments