|  | @@ -28,6 +28,7 @@
 | 
	
		
			
				|  |  |  #include <X11/Xos.h>
 | 
	
		
			
				|  |  |  #include <X11/keysymdef.h>
 | 
	
		
			
				|  |  |  #include <X11/XKBlib.h>
 | 
	
		
			
				|  |  | +#include <X11/extensions/XInput.h>
 | 
	
		
			
				|  |  |  #include <X11/extensions/XInput2.h>
 | 
	
		
			
				|  |  |  #include <X11/extensions/Xfixes.h>
 | 
	
		
			
				|  |  |  #include <X11/Xcursor/Xcursor.h>
 | 
	
	
		
			
				|  | @@ -95,6 +96,17 @@ static void la_RegisterWacomEventMasks(Display *display, int deviceid, real* max
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      XIFreeDeviceInfo(dev);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | +int la_DeviceProbablyHasPressure(XIDeviceInfo* dev){
 | 
	
		
			
				|  |  | +    int axis=0;
 | 
	
		
			
				|  |  | +    for (int i = 0; i < dev->num_classes; i++) {
 | 
	
		
			
				|  |  | +        if (dev->classes[i]->type == XIValuatorClass){ axis++; }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    return axis>=3;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +#define LA_G_STYLUS(dev) \
 | 
	
		
			
				|  |  | +    (la_DeviceProbablyHasPressure(dev)&&(!MAIN.WacomDeviceStylus))
 | 
	
		
			
				|  |  | +#define LA_G_ERASER \
 | 
	
		
			
				|  |  | +    (!MAIN.WacomDeviceEraser)
 | 
	
		
			
				|  |  |  void la_ScanWacomDevices(Display *display, int deviceid){
 | 
	
		
			
				|  |  |      XIDeviceInfo *info, *dev;
 | 
	
		
			
				|  |  |      int ndevices;
 | 
	
	
		
			
				|  | @@ -107,15 +119,18 @@ void la_ScanWacomDevices(Display *display, int deviceid){
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      info = XIQueryDevice(display, deviceid, &ndevices);
 | 
	
		
			
				|  |  |      for(i = 0; i < ndevices; i++) {
 | 
	
		
			
				|  |  | -        dev = &info[i];
 | 
	
		
			
				|  |  | +        dev = &info[i]; strToLower(dev->name);
 | 
	
		
			
				|  |  | +        if (strstr(dev->name, "pen pen")){ if(LA_G_STYLUS(dev)) MAIN.WacomDeviceStylus = dev->deviceid; } // some wacom tablets "wacom bamboo connect pen pen"
 | 
	
		
			
				|  |  | +        elif (strstr(dev->name, "stylus pen")){ if(LA_G_STYLUS(dev)) MAIN.WacomDeviceStylus = dev->deviceid; } // some huion ones "HUION 256C PEN STYLUS Pen"
 | 
	
		
			
				|  |  |          int is_ipts=0; if(strstr(dev->name, "ipts")){ is_ipts=1; }
 | 
	
		
			
				|  |  |          word = strtok (dev->name," ");
 | 
	
		
			
				|  |  |          while (1) {
 | 
	
		
			
				|  |  |              word = strtok (NULL, " "); if (!word) break;
 | 
	
		
			
				|  |  | -            if (strcmp("stylus", word) == 0) MAIN.WacomDeviceStylus = dev->deviceid; // wacom
 | 
	
		
			
				|  |  | -            elif (strcmp("eraser", word) == 0) MAIN.WacomDeviceEraser = dev->deviceid; // wacom
 | 
	
		
			
				|  |  | -            elif (is_ipts && strcmp("Pen", word) == 0) MAIN.WacomDeviceStylus = dev->deviceid; // surface ipts
 | 
	
		
			
				|  |  | -            elif (is_ipts && strcmp("Eraser", word) == 0) MAIN.WacomDeviceEraser = dev->deviceid; // surface ipts
 | 
	
		
			
				|  |  | +            if (strcmp("stylus", word) == 0){ if(LA_G_STYLUS(dev)) MAIN.WacomDeviceStylus = dev->deviceid; }// wacom
 | 
	
		
			
				|  |  | +            elif (strcmp("eraser", word) == 0){ if(LA_G_ERASER) MAIN.WacomDeviceEraser = dev->deviceid; }// wacom
 | 
	
		
			
				|  |  | +            elif (is_ipts && strcmp("pen", word) == 0){ if(LA_G_STYLUS(dev)) MAIN.WacomDeviceStylus = dev->deviceid; }// surface ipts
 | 
	
		
			
				|  |  | +            elif (is_ipts && strcmp("eraser", word) == 0){ if(LA_G_ERASER) MAIN.WacomDeviceEraser = dev->deviceid; }// surface ipts
 | 
	
		
			
				|  |  | +            elif (strcmp("pen", word) == 0){ if(LA_G_STYLUS(dev)) MAIN.WacomDeviceStylus = dev->deviceid; }// generic pen
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      if(MAIN.WacomDeviceStylus || MAIN.WacomDeviceEraser){
 |