diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml
index aa7ec03b5f5..b27665548f4 100644
--- a/doc/classes/ProjectSettings.xml
+++ b/doc/classes/ProjectSettings.xml
@@ -1429,9 +1429,14 @@
Specifies the tablet driver to use. If left empty, the default driver will be used.
[b]Note:[/b] The driver in use can be overridden at runtime via the [code]--tablet-driver[/code] [url=$DOCS_URL/tutorials/editor/command_line_tutorial.html]command line argument[/url].
+ [b]Note:[/b] Use [method DisplayServer.tablet_set_current_driver] to switch tablet driver in runtime.
- Override for [member input_devices/pen_tablet/driver] on Windows.
+ Override for [member input_devices/pen_tablet/driver] on Windows. Supported values are:
+ - [code]auto[/code] (default), uses [code]wintab[/code] if Windows Ink is disabled in the Wacom Tablet Properties or system settings, [code]winink[/code] otherwise.
+ - [code]winink[/code], uses Windows native "Windows Ink" driver.
+ - [code]wintab[/code], uses Wacom "WinTab" driver.
+ - [code]dummy[/code], tablet input is disabled.
If [code]true[/code], long press events on an Android touchscreen are transformed into right click events.
diff --git a/main/main.cpp b/main/main.cpp
index a008f9f11db..40b9fc8cd9a 100644
--- a/main/main.cpp
+++ b/main/main.cpp
@@ -3121,7 +3121,7 @@ Error Main::setup2(bool p_show_boot_logo) {
OS::get_singleton()->benchmark_begin_measure("Servers", "Tablet Driver");
GLOBAL_DEF_RST_NOVAL("input_devices/pen_tablet/driver", "");
- GLOBAL_DEF_RST_NOVAL(PropertyInfo(Variant::STRING, "input_devices/pen_tablet/driver.windows", PROPERTY_HINT_ENUM, "winink,wintab,dummy"), "");
+ GLOBAL_DEF_RST_NOVAL(PropertyInfo(Variant::STRING, "input_devices/pen_tablet/driver.windows", PROPERTY_HINT_ENUM, "auto,winink,wintab,dummy"), "");
if (tablet_driver.is_empty()) { // specified in project.godot
tablet_driver = GLOBAL_GET("input_devices/pen_tablet/driver");
@@ -3141,7 +3141,7 @@ Error Main::setup2(bool p_show_boot_logo) {
DisplayServer::get_singleton()->tablet_set_current_driver(DisplayServer::get_singleton()->tablet_get_driver_name(0));
}
- print_verbose("Using \"" + tablet_driver + "\" pen tablet driver...");
+ print_verbose("Using \"" + DisplayServer::get_singleton()->tablet_get_current_driver() + "\" pen tablet driver...");
OS::get_singleton()->benchmark_end_measure("Servers", "Tablet Driver");
}
diff --git a/platform/windows/display_server_windows.cpp b/platform/windows/display_server_windows.cpp
index 2c627b3ea67..4479fda54a9 100644
--- a/platform/windows/display_server_windows.cpp
+++ b/platform/windows/display_server_windows.cpp
@@ -36,6 +36,7 @@
#include "core/config/project_settings.h"
#include "core/io/marshalls.h"
+#include "core/io/xml_parser.h"
#include "core/version.h"
#include "drivers/png/png_driver_common.h"
#include "main/main.h"
@@ -6528,15 +6529,27 @@ void DisplayServerWindows::tablet_set_current_driver(const String &p_driver) {
if (tablet_get_driver_count() == 0) {
return;
}
+
+ String driver = p_driver;
+ if (driver == "auto") {
+ if (winink_available && !winink_disabled) {
+ driver = "winink";
+ } else if (wintab_available) {
+ driver = "wintab";
+ } else {
+ driver = "dummy";
+ }
+ }
+
bool found = false;
for (int i = 0; i < tablet_get_driver_count(); i++) {
- if (p_driver == tablet_get_driver_name(i)) {
+ if (driver == tablet_get_driver_name(i)) {
found = true;
}
}
if (found) {
- _update_tablet_ctx(tablet_driver, p_driver);
- tablet_driver = p_driver;
+ _update_tablet_ctx(tablet_driver, driver);
+ tablet_driver = driver;
} else {
ERR_PRINT("Unknown tablet driver " + p_driver + ".");
}
@@ -6635,6 +6648,8 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win
}
}
+ tablet_drivers.push_back("auto");
+
// Note: Windows Ink API for pen input, available on Windows 8+ only.
// Note: DPI conversion API, available on Windows 8.1+ only.
HMODULE user32_lib = LoadLibraryW(L"user32.dll");
@@ -6669,6 +6684,27 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win
tablet_drivers.push_back("dummy");
+ String wacom_cfg = OS::get_singleton()->get_config_path().path_join("WTablet").path_join("Wacom_Tablet.dat");
+ if (FileAccess::exists(wacom_cfg)) {
+ Ref parser;
+ parser.instantiate();
+ if (parser->open(wacom_cfg) == OK) {
+ while (parser->read() == OK) {
+ if (parser->get_node_type() != XMLParser::NODE_ELEMENT) {
+ continue;
+ }
+ if (parser->get_node_name() == "WinUseInk") {
+ parser->read();
+ if (parser->get_node_type() == XMLParser::NODE_TEXT) {
+ winink_disabled = (parser->get_node_data().to_lower().strip_edges() != "true");
+ print_verbose(vformat("Wacom tablet config found at \"%s\", Windows Ink support is %s.", wacom_cfg, winink_disabled ? "disabled" : "enabled"));
+ break;
+ }
+ }
+ }
+ }
+ }
+
if (OS::get_singleton()->is_hidpi_allowed()) {
HMODULE Shcore = LoadLibraryW(L"Shcore.dll");
diff --git a/platform/windows/display_server_windows.h b/platform/windows/display_server_windows.h
index 30f71c8c7e1..4a6b51b5923 100644
--- a/platform/windows/display_server_windows.h
+++ b/platform/windows/display_server_windows.h
@@ -405,6 +405,7 @@ class DisplayServerWindows : public DisplayServer {
void _update_tablet_ctx(const String &p_old_driver, const String &p_new_driver);
String tablet_driver;
Vector tablet_drivers;
+ bool winink_disabled = false;
enum DriverID {
DRIVER_ID_COMPAT_OPENGL3 = 1 << 0,