← easystroke

Test whether device is absolute or relative

88ed6fe9cd1d5cbd7d0342b074d9a11e854f386f · Thomas Jaeger · Jan 23, 2010 03:39

+8 −2 · 2 files changed

  • grabber.cc +7 −2
  • grabber.h +1 −0
diff --git a/grabber.cc b/grabber.cc
index cef1d67..9ae5187 100644
--- a/grabber.cc
+++ b/grabber.cc
@@ -364,7 +364,7 @@ void Grabber::new_device(XIDeviceInfo *info) {
 		}
 }
 
-Grabber::XiDevice::XiDevice(Grabber *parent, XIDeviceInfo *info) : supports_pressure(false), num_buttons(0) {
+Grabber::XiDevice::XiDevice(Grabber *parent, XIDeviceInfo *info) : supports_pressure(false), absolute(false), num_buttons(0) {
 	dev = info->deviceid;
 	name = info->name;
 	master = info->attachment;
@@ -375,6 +375,8 @@ Grabber::XiDevice::XiDevice(Grabber *parent, XIDeviceInfo *info) : supports_pres
 			num_buttons = b->num_buttons;
 		} else if (dev_class->type == ValuatorClass) {
 			XIValuatorClassInfo *v = (XIValuatorClassInfo*)dev_class;
+			if ((v->number == 0 || v->number == 1) && v->mode != XIModeRelative)
+				absolute = true;
 			if (v->number == 2) {
 				pressure_min = v->min;
 				pressure_max = v->max;
@@ -385,7 +387,10 @@ Grabber::XiDevice::XiDevice(Grabber *parent, XIDeviceInfo *info) : supports_pres
 	}
 
 	if (verbosity >= 1)
-		printf("Opened Device %d (\"%s\").\n", dev, info->name);
+		printf("Opened Device %d ('%s'%s).\n", dev, info->name,
+				absolute ?
+					supports_pressure ? ": absolute, pressure" : ": absolute" :
+					supports_pressure ? ": pressure" : "");
 }
 
 Grabber::XiDevice *Grabber::get_xi_dev(int id) {
diff --git a/grabber.h b/grabber.h
index 7ea262a..7823969 100644
--- a/grabber.h
+++ b/grabber.h
@@ -67,6 +67,7 @@ public:
 		int dev;
 		std::string name;
 		bool supports_pressure;
+		bool absolute;
 		bool active;
 		int pressure_min, pressure_max;
 		int num_buttons;