Skip to content

Commit d333159

Browse files
committedFeb 13, 2025
Merge pull request #102801 from bruvzg/tab_detect
[Windows] Read Wacom config to check if Windows Ink is disabled and auto switch to WinTab.
2 parents 627373a + 3f2a29c commit d333159

File tree

4 files changed

+48
-6
lines changed

4 files changed

+48
-6
lines changed
 

‎doc/classes/ProjectSettings.xml

+6-1
Original file line numberDiff line numberDiff line change
@@ -1429,9 +1429,14 @@
14291429
<member name="input_devices/pen_tablet/driver" type="String" setter="" getter="">
14301430
Specifies the tablet driver to use. If left empty, the default driver will be used.
14311431
[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].
1432+
[b]Note:[/b] Use [method DisplayServer.tablet_set_current_driver] to switch tablet driver in runtime.
14321433
</member>
14331434
<member name="input_devices/pen_tablet/driver.windows" type="String" setter="" getter="">
1434-
Override for [member input_devices/pen_tablet/driver] on Windows.
1435+
Override for [member input_devices/pen_tablet/driver] on Windows. Supported values are:
1436+
- [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.
1437+
- [code]winink[/code], uses Windows native "Windows Ink" driver.
1438+
- [code]wintab[/code], uses Wacom "WinTab" driver.
1439+
- [code]dummy[/code], tablet input is disabled.
14351440
</member>
14361441
<member name="input_devices/pointing/android/enable_long_press_as_right_click" type="bool" setter="" getter="" default="false">
14371442
If [code]true[/code], long press events on an Android touchscreen are transformed into right click events.

‎main/main.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -3121,7 +3121,7 @@ Error Main::setup2(bool p_show_boot_logo) {
31213121
OS::get_singleton()->benchmark_begin_measure("Servers", "Tablet Driver");
31223122

31233123
GLOBAL_DEF_RST_NOVAL("input_devices/pen_tablet/driver", "");
3124-
GLOBAL_DEF_RST_NOVAL(PropertyInfo(Variant::STRING, "input_devices/pen_tablet/driver.windows", PROPERTY_HINT_ENUM, "winink,wintab,dummy"), "");
3124+
GLOBAL_DEF_RST_NOVAL(PropertyInfo(Variant::STRING, "input_devices/pen_tablet/driver.windows", PROPERTY_HINT_ENUM, "auto,winink,wintab,dummy"), "");
31253125

31263126
if (tablet_driver.is_empty()) { // specified in project.godot
31273127
tablet_driver = GLOBAL_GET("input_devices/pen_tablet/driver");
@@ -3141,7 +3141,7 @@ Error Main::setup2(bool p_show_boot_logo) {
31413141
DisplayServer::get_singleton()->tablet_set_current_driver(DisplayServer::get_singleton()->tablet_get_driver_name(0));
31423142
}
31433143

3144-
print_verbose("Using \"" + tablet_driver + "\" pen tablet driver...");
3144+
print_verbose("Using \"" + DisplayServer::get_singleton()->tablet_get_current_driver() + "\" pen tablet driver...");
31453145

31463146
OS::get_singleton()->benchmark_end_measure("Servers", "Tablet Driver");
31473147
}

‎platform/windows/display_server_windows.cpp

+39-3
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636

3737
#include "core/config/project_settings.h"
3838
#include "core/io/marshalls.h"
39+
#include "core/io/xml_parser.h"
3940
#include "core/version.h"
4041
#include "drivers/png/png_driver_common.h"
4142
#include "main/main.h"
@@ -6528,15 +6529,27 @@ void DisplayServerWindows::tablet_set_current_driver(const String &p_driver) {
65286529
if (tablet_get_driver_count() == 0) {
65296530
return;
65306531
}
6532+
6533+
String driver = p_driver;
6534+
if (driver == "auto") {
6535+
if (winink_available && !winink_disabled) {
6536+
driver = "winink";
6537+
} else if (wintab_available) {
6538+
driver = "wintab";
6539+
} else {
6540+
driver = "dummy";
6541+
}
6542+
}
6543+
65316544
bool found = false;
65326545
for (int i = 0; i < tablet_get_driver_count(); i++) {
6533-
if (p_driver == tablet_get_driver_name(i)) {
6546+
if (driver == tablet_get_driver_name(i)) {
65346547
found = true;
65356548
}
65366549
}
65376550
if (found) {
6538-
_update_tablet_ctx(tablet_driver, p_driver);
6539-
tablet_driver = p_driver;
6551+
_update_tablet_ctx(tablet_driver, driver);
6552+
tablet_driver = driver;
65406553
} else {
65416554
ERR_PRINT("Unknown tablet driver " + p_driver + ".");
65426555
}
@@ -6635,6 +6648,8 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win
66356648
}
66366649
}
66376650

6651+
tablet_drivers.push_back("auto");
6652+
66386653
// Note: Windows Ink API for pen input, available on Windows 8+ only.
66396654
// Note: DPI conversion API, available on Windows 8.1+ only.
66406655
HMODULE user32_lib = LoadLibraryW(L"user32.dll");
@@ -6669,6 +6684,27 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win
66696684

66706685
tablet_drivers.push_back("dummy");
66716686

6687+
String wacom_cfg = OS::get_singleton()->get_config_path().path_join("WTablet").path_join("Wacom_Tablet.dat");
6688+
if (FileAccess::exists(wacom_cfg)) {
6689+
Ref<XMLParser> parser;
6690+
parser.instantiate();
6691+
if (parser->open(wacom_cfg) == OK) {
6692+
while (parser->read() == OK) {
6693+
if (parser->get_node_type() != XMLParser::NODE_ELEMENT) {
6694+
continue;
6695+
}
6696+
if (parser->get_node_name() == "WinUseInk") {
6697+
parser->read();
6698+
if (parser->get_node_type() == XMLParser::NODE_TEXT) {
6699+
winink_disabled = (parser->get_node_data().to_lower().strip_edges() != "true");
6700+
print_verbose(vformat("Wacom tablet config found at \"%s\", Windows Ink support is %s.", wacom_cfg, winink_disabled ? "disabled" : "enabled"));
6701+
break;
6702+
}
6703+
}
6704+
}
6705+
}
6706+
}
6707+
66726708
if (OS::get_singleton()->is_hidpi_allowed()) {
66736709
HMODULE Shcore = LoadLibraryW(L"Shcore.dll");
66746710

‎platform/windows/display_server_windows.h

+1
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,7 @@ class DisplayServerWindows : public DisplayServer {
405405
void _update_tablet_ctx(const String &p_old_driver, const String &p_new_driver);
406406
String tablet_driver;
407407
Vector<String> tablet_drivers;
408+
bool winink_disabled = false;
408409

409410
enum DriverID {
410411
DRIVER_ID_COMPAT_OPENGL3 = 1 << 0,

0 commit comments

Comments
 (0)