From e099370da667288fae5efdc273707028cb829a3d Mon Sep 17 00:00:00 2001
From: Dorian Stoll <dorian.stoll@tmsp.io>
Date: Sat, 27 Jun 2020 18:21:11 +0200
Subject: [PATCH 01/16] Add support for BUS_VIRTUAL

This is needed to support IPTS devices through the iptsd userspace
daemon. It exposes the touchscreen / stylus as uinput, since the parsing
of raw IPTS data needs to happen in userspace.

Because these devices are not backed by an actual bus, they are created
as BUS_VIRTUAL.

Signed-off-by: Dorian Stoll <dorian.stoll@tmsp.io>
---
 libwacom/libwacom-database.c | 4 ++++
 libwacom/libwacom.c          | 5 +++++
 libwacom/libwacom.h          | 1 +
 test/test-tablet-validity.c  | 1 +
 test/test_data_files.py      | 1 +
 tools/debug-device.c         | 1 +
 6 files changed, 13 insertions(+)

diff --git a/libwacom/libwacom-database.c b/libwacom/libwacom-database.c
index ef877287..2c203a10 100644
--- a/libwacom/libwacom-database.c
+++ b/libwacom/libwacom-database.c
@@ -174,6 +174,8 @@ bus_from_str (const char *str)
 		return WBUSTYPE_BLUETOOTH;
 	if (g_str_equal(str, "i2c"))
 		return WBUSTYPE_I2C;
+	if (g_str_equal(str, "virt"))
+		return WBUSTYPE_VIRTUAL;
 	return WBUSTYPE_UNKNOWN;
 }
 
@@ -192,6 +194,8 @@ bus_to_str (WacomBusType bus)
 		return "bluetooth";
 	case WBUSTYPE_I2C:
 		return "i2c";
+	case WBUSTYPE_VIRTUAL:
+		return "virt";
 	}
 	g_assert_not_reached ();
 }
diff --git a/libwacom/libwacom.c b/libwacom/libwacom.c
index e65bcf29..42bec181 100644
--- a/libwacom/libwacom.c
+++ b/libwacom/libwacom.c
@@ -153,6 +153,10 @@ get_bus_vid_pid (GUdevDevice  *device,
 		*bus = WBUSTYPE_I2C;
 		retval = TRUE;
 		break;
+	case 6:
+		*bus = WBUSTYPE_VIRTUAL;
+		retval = TRUE;
+		break;
 	}
 
 out:
@@ -1009,6 +1013,7 @@ static void print_match(int fd, const WacomMatch *match)
 		case WBUSTYPE_USB:		bus_name = "usb";	break;
 		case WBUSTYPE_SERIAL:		bus_name = "serial";	break;
 		case WBUSTYPE_I2C:		bus_name = "i2c";	break;
+		case WBUSTYPE_VIRTUAL:		bus_name = "virt";	break;
 		case WBUSTYPE_UNKNOWN:		bus_name = "unknown";	break;
 		default:			g_assert_not_reached(); break;
 	}
diff --git a/libwacom/libwacom.h b/libwacom/libwacom.h
index 3c820f4a..17dd7600 100644
--- a/libwacom/libwacom.h
+++ b/libwacom/libwacom.h
@@ -154,6 +154,7 @@ typedef enum {
 	WBUSTYPE_SERIAL,	/**< Serial tablet */
 	WBUSTYPE_BLUETOOTH,	/**< Bluetooth tablet */
 	WBUSTYPE_I2C,		/**< I2C tablet */
+	WBUSTYPE_VIRTUAL,	/**< Virtual (uinput) tablet */
 } WacomBusType;
 
 /**
diff --git a/test/test-tablet-validity.c b/test/test-tablet-validity.c
index f84a327b..4bc09b88 100644
--- a/test/test-tablet-validity.c
+++ b/test/test-tablet-validity.c
@@ -177,6 +177,7 @@ assert_vidpid(WacomBusType bus, int vid, int pid)
 			break;
 		case WBUSTYPE_BLUETOOTH:
 		case WBUSTYPE_I2C:
+		case WBUSTYPE_VIRTUAL:
 			g_assert_cmpint(vid, >, 0);
 			g_assert_cmpint(pid, >, 0);
 			break;
diff --git a/test/test_data_files.py b/test/test_data_files.py
index 4cff174f..ee6ffcd3 100755
--- a/test/test_data_files.py
+++ b/test/test_data_files.py
@@ -47,6 +47,7 @@ def test_device_match(tabletfile):
             "bluetooth",
             "i2c",
             "serial",
+            "virt",
         ], f"{tabletfile}: unknown bus type"
         assert re.match("[0-9a-f]{4}", vid), (
             f"{tabletfile}: {vid} must be lowercase hex"
diff --git a/tools/debug-device.c b/tools/debug-device.c
index 83915a20..0c4efe06 100644
--- a/tools/debug-device.c
+++ b/tools/debug-device.c
@@ -176,6 +176,7 @@ handle_device(WacomDeviceDatabase *db, const char *path)
 			case WBUSTYPE_SERIAL: busstr = "SERIAL"; break;
 			case WBUSTYPE_BLUETOOTH: busstr = "BLUETOOTH"; break;
 			case WBUSTYPE_I2C: busstr = "I2C"; break;
+			case WBUSTYPE_VIRTUAL: busstr = "VIRTUAL"; break;
 		}
 		func(libwacom_get_bustype, "%s", busstr);
 	}
-- 
2.50.0

