XP-Pen Drawing Tablet

For those doing the research I was doing last week:

I just purchased an XP-Pen Artist Pro 15.6, considerably cheaper than Wacom, and I chose it over Huion because the manufactrer puts out a linux driver. It’s in beta but works for me (on opensuse) better than advertised: Supports everything but tilt sensitivity. In other words, the buttons and dial all work. However, in its present incarnation, it runs as a script that requires root: Just unzip in its permanent location (I used /opt), change into the subdirectory it creates and make Pentablet_Driver.sh executable, then link to the script from your autostart settings (or use crontab if you don’t want to be pestered for root password). Tip: If you use KDE, you can create a window rule to “skip taskbar”, so when you minimize it, the window disappears (but to get it back, use the Alt+Tab task switcher). As far as other options, I found a month-old post by a dev from the digimend kernal drivers who says he has tilt working but not the express keys, so I figure it’s a matter of time before at least one driver source has full support.


Thank you very much for the info. How does it compare to things like reMarkable? It supports color and has better support for levels of pressure sensitivity?
I’m asking because I was considering buying something like this for my 4 year old daughter and reMarkable seems to be a really cool e-book reader as well so I could use it myself for reading :slight_smile:

I found lots of other people asking which cheaper-than-wacom tablets work well with linux, but not many good answers, so hopefully google will shepherd this first full day’s report to anyone else who needs it:

cellwriter works great. It’s in the standard repo. For those who don’t know, it’s a hand-writing recognition program. When working on the tablet, if you need to look something up on the internet, it can be easier to write it with the stylus in hand than to shift over to the keyboard. Compared to Microsoft Ink, it might seem a bit awkward at first, because it simplifies its own job by first requiring you to train it by writing each letter 5 times, and second by requiring you to write each letter in a separate little square - the cell. Bottom line is that these tricks make it more accurate than MS Ink, at least interpreting my writing, and the training session isn’t really that onerous.

Write (third-party download from styluslabs.com) is a small, nifty app that’s like a word-processor (okay, really just a chainsaw editor) for hand-written notes, and it works too.

Inkscape doesn’t support pressure sensitivity but otherwise works great. With a calligraphy brush, it’s where I got the best results.

I can’t seem to get pressure-sensitivity working in GIMP, either, though I didn’t mess with it much. From what I understand from its gurus, GIMP has an idiom that makes sense when you get to know it, but I’m still alien to the interface. Still with a little help from youtube I managed to find the place to set brush “dynamics” to pressure-based size or opacity, but I couldn’t tell a difference either way.

Krita is amazing, and the pressure sensitivity works well. At first, I found that light pressure made no mark at all, but in the settings there’s a tab for tablets where you can adjust the pressure curve. It ran from 0 at the low end to 4 units at the high, so I just raised the low end to 1 unit and otherwise left a straight slope. It seems to work much better now.

Blender grease pencil also supports pressure sensitivity.

In all these cases, the performance was smooth and snappy, with lines appearing where I expected them to. Same with Tupitube, but opentoonz was just weird. I’d draw a line rapidly, and it would appear in slow motion. The shape of the squiggle was perfect, but the placement was off, and the line started when I started but formed in slow motion, with a very noticeable delay between when I finished a stroke and when the program caught up.

I’ve played a bit more with express key configuration. The Dial has a menu of 5 items which unfortunately don’t include “act like the scroll wheel on a mouse”. Default is zoom in/out, but I changed it to PageUp/Down (next best thing to the scroll wheel).

For the bottom 2 buttons, default is Ctrl +/-. See why I changed the dial? However, in Krita, Ctrl+ didn’t zoom, so I changed it to Ctrl= which works fine.

The top button defaults to Alt, but otherwise I can’t program modifier keys stand-alone. I can program mod+click, which is the main reason I’d want the modifier anyway. Oddly, nothing appears in the input field when I do this, but it saves the result. Why is this important? Because while working with the stylus, mainly for painting but with the occasional need to open files, I can do ctrl+click or shift+click to select multiple files. Also, with the Shift+Click in conjunction with that Alt button, I can move a row in libreoffice-calc. It’s awkward, but it works.

There are undo and redo presets that have no effect, so I added my own Ctrl+Z which is undo in most programs, and for now at least I’m not worried about redo, but I need Esc to get out of things I get into accidentally (because I don’t know these programs very well yet). For some reason, the input box won’t sense Meta or Tab, and the preset Alt won’t work with the dial, i.e., I can’t input Alt+PageUp with that combination. If I could, I’d set that as a shortcut to change desktop. Instead, I set a button to Ctrl+Z, because I use that combo for the cube (way more natural than KDE’s default F11), so that’s my way of changing desktops with the stylus. So my net layout is as follows:

K1: [Alt] preset works in conjunction with the next two:
K2: Ctrl+click
K3: Shift+click
K4: Esc
Dial: PageUp/Down to scroll in apps that support that
K5: Ctrl+Z for undo
K6: Alt+Z for desktop switching with cube
K7: Ctrl+= for zoom in (that is, Ctrl+Shift+Plus)
K8: Ctrl± for zoom out

These settings are saved for all users, which is fine because I’m the only user on this computer. If there were more users, I’d need multiple copies of the driver, launched from different folders, or I’d have to figure out which file holds the configuration and write a fancy command in the desktop file to swap it in and out.

kcron, which is to say KDE’s task scheduler in system settings, fails to launch the thing, so if I get too annoyed with the password requirement, I’ll have to learn to work with cron tables directly.

The included stand to hold the pen is - oh hey, the forum software bleeped the fairly mild derogatory word I wrote here. However, I’m quite pleased with a bit of velcro tape. The stand for the tablet itself works okay, with a shallow angle, but you can use the thing in your lap. A better stand is available (ac18) but costs $50.

PS: I also have Win10 in a vbox. All the best free drawing app in windows land come from linux, so I really didn’t have any different choices except sketchbook which only supports wacom even in windows. I installed mypaint just to test the tilt function, and actually I was underwhelmed. Yeah, you can tilt the brush to make a wider line. Or, you can press harder. Or, you can select a bigger brush tool. I figured I could use any brush for calligraphy, but that didn’t work because tilt makes thick vs. thin lines 90° off of where I’d expect for calligraphy. Tilting the pen in another direction while trying to make fancy letters is really uncomfortable, so now I figure I’d have been fine with one of last year’s models, which the linux driver also supports, like the artist pro 16 (which comes with that better stand) or 22 if I wanted more real estate. Actually, I think I’d have still gone for this size, fits nicely in the bag with my 17" laptop.

Hi Greg, this tablet isn’t the same class of thing as ReMarkable at all. A drawing “tablet” isn’t a standalone computer in a tablet form factor, but rather an an input device like a big fancy mouse or touchpad. A display pen actually mirrors the screen of the computer, so that a line appears under your stylus as you paint - earlier models had you drawing here while looking there. One of it’s strengths is that it’s NOT a touchscreen - it ignore your hand and only pays attention to the precise instrument, the stylus, intended for digital art applications that demand that precision, more than you can get from a mouse.

If I understand correctly, ReMarkable is actually a standalone tablet computer optimized for stylus, and claims to feel like writing on paper, which may be good practice - I do calligraphy now but I learned it in order to make my atrocious handwriting legible. I can’t say the XP-Pen feels like paper but it’s not too slick, and if I write my signature it looks just like it would on paper. I think 4 years old is a bit young (and small) for a pen tablet that’s a the size of a 17" laptop screen on one side of the desk connected to an actual laptop or desktop on the other, so probably ReMarkable is a better choice.


Correction, pressure support works fine in GIMP: Go to Edit => Input Devices. Ignore entries for UGEE if they appear for some reason and select XPPEN from the list, and change mode to “Screen”. For some reason, XPPEN wasn’t listed the first time I tried this.

I should clarify for opensuse users like me:

I’m using Blender, Inkscape, Krita, Opentoonz, and Tupi from the repo, but I got GIMP from an appimage with major plugins included. Now you can get just-the -lugins as appimages, so someday soon I’ll switch back to the repo for GIMP too. However, I’m about to try the Morevna Project appimage for opentoonz because it’s a more recent build than the repo, and a little googling shows that stylus lag may have been a known issue with earlier versions.

Success! The appimage from Morevna Project is broken, undefined symbol that looks like a dependency, but I thought appimages didn’t have those. However, the flatpak works (only use I have for discover). By “works” I mean that the pen is snappy, makes a line where it should, and pressure sensitivity works.

OK, I’m slow, but I figured out how to get the thing running on boot in KDE: Run systemsettings5 as root, go to startup and shutdown, choose task scheduler, and then change the selection from user cron to system cron. Browse to the driver script, and then select root from the “run as” dropdown, check the tick to run at startup instead of scheduling by calender. Launched this way, I didn’t get my express key settings, so it seems I was wrong about them not being stored on a per-user basis.

PS: I wasn’t clear above, tablet works with mypaint on linux (but it works in Windows vbox with tilt support). And I just had an inadvertent test of brightness - it works in direct sunlight if you max out the brightness, though this does affect the color accuracy.

I wasn’t wrong - there’s only one config file, but for some reason, launching on boot via kcron doesn’t read it. Using the gui to enter the command as “cd /working/dir && /working/dir/Pentablet_Driver.sh” doesn’t launch the driver at all.

The binary blob Pentablet_Driver is all you need, the rest of the libraries are present and usable in openSUSE (Tumbleweed anyways).

If you copy the binary to your ~/bin directory and run as you user, what happens? If you run ldd against the binary, are any libraries ‘not found’?

Thanks a lot for the explanation.

Thanks for the suggestion, but I get “you need to use root permissions to run the driver” regardless.

Even if the blob has your permissions? I’m assuming it’s connected via USB? If so likely just needs a udev rule crafted to a) detect and b) change permission so it works in userspace.

>Even if the blob has your permissions?

Yes, even so. Executable, me listed as owner, anyone else given permission to view and modify.

>I’m assuming it’s connected via USB?

Aye. Actually a pigtail, HDMI plus USB plus second USB for power, all connected to tablet by USB C. That’s something I don’t like, proprietary cabling, but it seems to be par for the industry.

>If so likely just needs a udev rule crafted to a) detect and b) change permission so it works in userspace.

Thanks for the suggestion. There’s no GUI for that in some secret part of YaST is there, where I can select the driver and then hit a “make it work” button? I’m reading about udev now…

First step, unplug the device and make sure driver is not running, then ( as root user) run;

udevadm monitor

Now plug the device in and capture the output, then run the driver and see what the output does.

Thanks Malcolm. Here’s the output, but see next post.

UDEV - the event which udev sends out after rule processing
KERNEL - the kernel uevent

KERNEL[192.517539] change   /devices/pci0000:00/0000:00:02.0/drm/card0 (drm)
UDEV  [192.524133] change   /devices/pci0000:00/0000:00:02.0/drm/card0 (drm)
KERNEL[193.295620] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3 (usb)
KERNEL[193.297031] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0 (usb)
KERNEL[193.298064] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/0003:28BD:090D.0003 (hid)
KERNEL[193.298296] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/0003:28BD:090D.0003/input/input26 (input)
KERNEL[193.298339] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/0003:28BD:090D.0003/input/input26/mouse2 (input)
KERNEL[193.298359] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/0003:28BD:090D.0003/input/input26/event22 (input)
KERNEL[193.298423] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/0003:28BD:090D.0003/input/input27 (input)
KERNEL[193.358108] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/0003:28BD:090D.0003/input/input27/event23 (input)
KERNEL[193.358240] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/0003:28BD:090D.0003/hidraw/hidraw2 (hidraw)
KERNEL[193.358312] bind     /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/0003:28BD:090D.0003 (hid)
KERNEL[193.358341] bind     /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0 (usb)
KERNEL[193.358365] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.1 (usb)
KERNEL[193.359154] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.1/0003:28BD:090D.0004 (hid)
KERNEL[193.359263] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.1/0003:28BD:090D.0004/input/input28 (input)
KERNEL[193.359285] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.1/0003:28BD:090D.0004/input/input28/mouse3 (input)
KERNEL[193.359309] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.1/0003:28BD:090D.0004/input/input28/event24 (input)
KERNEL[193.359343] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.1/0003:28BD:090D.0004/input/input29 (input)
KERNEL[193.359362] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.1/0003:28BD:090D.0004/input/input29/event25 (input)
KERNEL[193.359373] add      /class/usbmisc (class)
KERNEL[193.359395] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.1/usbmisc/hiddev0 (usbmisc)
KERNEL[193.359417] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.1/0003:28BD:090D.0004/hidraw/hidraw3 (hidraw)
KERNEL[193.359440] bind     /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.1/0003:28BD:090D.0004 (hid)
KERNEL[193.359460] bind     /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.1 (usb)
KERNEL[193.359479] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.2 (usb)
UDEV  [193.361246] add      /class/usbmisc (class)
KERNEL[193.361452] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.2/0003:28BD:090D.0005 (hid)
KERNEL[193.361676] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.2/usbmisc/hiddev1 (usbmisc)
KERNEL[193.361713] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.2/0003:28BD:090D.0005/hidraw/hidraw4 (hidraw)
KERNEL[193.361733] bind     /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.2/0003:28BD:090D.0005 (hid)
KERNEL[193.361752] bind     /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.2 (usb)
KERNEL[193.361786] bind     /devices/pci0000:00/0000:00:14.0/usb1/1-3 (usb)
UDEV  [193.908286] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3 (usb)
UDEV  [193.920889] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0 (usb)
UDEV  [193.922670] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.1 (usb)
UDEV  [193.924850] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.2 (usb)
UDEV  [193.928038] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/0003:28BD:090D.0003 (hid)
UDEV  [193.931530] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.1/0003:28BD:090D.0004 (hid)
UDEV  [193.937368] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/0003:28BD:090D.0003/hidraw/hidraw2 (hidraw)
UDEV  [193.938489] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/0003:28BD:090D.0003/input/input26 (input)
UDEV  [193.940430] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.1/0003:28BD:090D.0004/input/input28 (input)
UDEV  [193.940965] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.1/usbmisc/hiddev0 (usbmisc)
UDEV  [193.942064] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/0003:28BD:090D.0003/input/input27 (input)
UDEV  [193.945664] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.2/0003:28BD:090D.0005 (hid)
UDEV  [193.948340] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.2/0003:28BD:090D.0005/hidraw/hidraw4 (hidraw)
UDEV  [193.949198] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.2/usbmisc/hiddev1 (usbmisc)
UDEV  [193.949482] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.1/0003:28BD:090D.0004/input/input28/mouse3 (input)
UDEV  [193.950419] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/0003:28BD:090D.0003/input/input26/mouse2 (input)
UDEV  [193.952531] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.1/0003:28BD:090D.0004/hidraw/hidraw3 (hidraw)
UDEV  [193.952950] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.1/0003:28BD:090D.0004/input/input29 (input)
UDEV  [193.953781] bind     /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.2/0003:28BD:090D.0005 (hid)
UDEV  [193.954584] bind     /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.2 (usb)
UDEV  [193.989094] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/0003:28BD:090D.0003/input/input27/event23 (input)
UDEV  [194.012747] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/0003:28BD:090D.0003/input/input26/event22 (input)
UDEV  [194.016404] bind     /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/0003:28BD:090D.0003 (hid)
UDEV  [194.019942] bind     /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0 (usb)
UDEV  [194.050618] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.1/0003:28BD:090D.0004/input/input28/event24 (input)
UDEV  [194.050902] add      /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.1/0003:28BD:090D.0004/input/input29/event25 (input)
UDEV  [194.054108] bind     /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.1/0003:28BD:090D.0004 (hid)
UDEV  [194.057080] bind     /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.1 (usb)
UDEV  [194.067711] bind     /devices/pci0000:00/0000:00:14.0/usb1/1-3 (usb)
KERNEL[205.177560] change   /devices/virtual/thermal/thermal_zone1 (thermal)

Tilt works!

Sort of, seems to register tilt as binary rather than graduated, meaning I don’t notice a difference between moderate and extreme angle, but it’s still a cool tool. The vendor-supplied driver does not do this, something in a recent update does. However, in KDE system settings => hardware => graphics tablet, there’s no tablet detected. The dial and buttons do things (zoom for the dial), but not what I’d like them to do and I have no idea how to access their assignment if KDE is only “subconsciously” aware of the thing.

Reckon I’d rather have tilt than control of the express keys, so I’ll just let the driver be until there’s a newer version to test. -GEF

With Krita great, Mypaint so-so, not with GIMP at all.

Default behavior (not using driver):

–Button closer to nib: Mouse middle button
–Other button: Can’t tell

Ring: Ctrl + and -

Express Keys (from top):
1: b
2: e
3: spacebar
4: PgDown
5: v
6:Ctrl S (or maybe Ctrl Alt S)
7: Ctrl Z
8: Can’t tell

Last key opens a new document from template in inkscape, which is Ctrl+Alt+N.