我在 Dell Inspiron 靈越 13 7000 二合一黑色版 (7391) 上運行 Ubuntu 19.10。這台筆記型電腦配備了一支非常漂亮的手寫筆,即戴爾 PN350M 有源筆,但不幸的是,它根本無法在我的系統下使用。在網路上進行一些挖掘後發現,該筆使用 Microsoft Pen 協定而不是藍牙與筆記型電腦配對。這些支持嗎?谷歌沒有給我答案。
編輯:
以下是 xinput 的更新輸出。這裡有一些可疑的東西,特別是「未知」的東西。
~> xinput list
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ DELL0960:00 04F3:30E4 Touchpad id=9 [slave pointer (2)]
⎜ ↳ CUST0000:00 27C6:0111 id=10 [slave pointer (2)]
⎜ ↳ CUST0000:00 27C6:0111 UNKNOWN id=11 [slave pointer (2)]
⎜ ↳ PS/2 Generic Mouse id=16 [slave pointer (2)]
⎜ ↳ M585/M590 Mouse id=18 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ Power Button id=7 [slave keyboard (3)]
↳ Video Bus id=6 [slave keyboard (3)]
↳ Dell WMI hotkeys id=14 [slave keyboard (3)]
↳ Intel HID 5 button array id=13 [slave keyboard (3)]
↳ Intel HID events id=12 [slave keyboard (3)]
↳ Integrated_Webcam_HD: Integrate id=8 [slave keyboard (3)]
↳ AT Translated Set 2 keyboard id=15 [slave keyboard (3)]
↳ M585/M590 Keyboard id=17 [slave keyboard (3)]
答案1
我設法使用 evdev 和 libevdev 庫創建了一個 python 驅動程式。我正在創建一個虛擬設備,然後簡單地傳遞我從手寫筆找到的事件。它正在處理壓力事件和跟踪,但我無法讓按鈕工作。
只需複製此內容並將其標記為可執行文件,您將看到一個名為“自訂手寫筆”的設備應該可以工作。為了進一步使其無縫,我將其添加到 中,gnome-session-properties
以便它在啟動時運行腳本。
希望這可以幫助!
#!/usr/bin/env python3
import sys
import libevdev
import time
import evdev
from evdev import UInput, AbsInfo, ecodes
import os
def main(args):
p = 0
i = 0
devices = evdev.list_devices()
for dev in devices:
# print('%-12i%s' % (p, evdev.InputDevice(dev).name))
if evdev.InputDevice(dev).name == 'CUST0000:00 27C6:0118 Stylus':
i = p
p += 1
# i=int(input("Enter number: "))
device = evdev.InputDevice(devices[i])
print(device)
# print(mouse.capabilities(verbose=True))
device.grab()
x, y = 0, 0
dev = libevdev.Device()
dev.name = "Custom Stylus"
dev.enable(libevdev.INPUT_PROP_DIRECT)
dev.enable(libevdev.EV_KEY.BTN_TOOL_PEN)
dev.enable(libevdev.EV_KEY.BTN_TOOL_RUBBER)
# Click
dev.enable(libevdev.EV_KEY.BTN_TOUCH)
# Press button 1 on pen
dev.enable(libevdev.EV_KEY.BTN_STYLUS)
# Press button 2 on pen, see great doc
dev.enable(libevdev.EV_KEY.BTN_STYLUS2)
# Send absolute X coordinate
dev.enable(libevdev.EV_ABS.ABS_X,
libevdev.InputAbsInfo(minimum=0, maximum=5760, resolution=17))
# Send absolute Y coordinate
dev.enable(libevdev.EV_ABS.ABS_Y,
libevdev.InputAbsInfo(minimum=0, maximum=3240, resolution=17))
# Send absolute pressure
dev.enable(libevdev.EV_ABS.ABS_PRESSURE,
libevdev.InputAbsInfo(minimum=0, maximum=1023))
dev.enable(libevdev.EV_SYN.SYN_REPORT)
dev.enable(libevdev.EV_SYN.SYN_DROPPED)
try:
uinput = dev.create_uinput_device()
print("New device at {} ({})".format(uinput.devnode, uinput.syspath))
# Sleep for a bit so udev, libinput, Xorg, Wayland, ...
# all have had a chance to see the device and initialize
# it. Otherwise the event will be sent by the kernel but
# nothing is ready to listen to the device yet. And it
# will never be detected in the futur ;-)
time.sleep(1)
# Reports that the PEN is close to the surface
# Important to make sure xinput can detect (and list)
# the pen. Otherwise, it won't write anything in gimp.
uinput.send_events([
libevdev.InputEvent(libevdev.EV_KEY.BTN_TOUCH,
value=0),
libevdev.InputEvent(libevdev.EV_KEY.BTN_TOOL_PEN,
value=1),
libevdev.InputEvent(libevdev.EV_SYN.SYN_REPORT,
value=0),
])
# Says that the pen it out of range of the tablet. Useful
# to make sure you can move your mouse, and to avoid
# strange things during the first draw.
uinput.send_events([
libevdev.InputEvent(libevdev.EV_KEY.BTN_TOUCH,
value=0),
libevdev.InputEvent(libevdev.EV_KEY.BTN_TOOL_PEN,
value=0),
libevdev.InputEvent(libevdev.EV_SYN.SYN_REPORT,
value=0),
])
for event in device.read_loop():
code, val = event.code, event.value
if code == ecodes.ABS_MT_POSITION_X:
uinput.send_events([
libevdev.InputEvent(libevdev.EV_ABS.ABS_X,
value=int(val)),
libevdev.InputEvent(libevdev.EV_KEY.BTN_TOUCH,
value=1),
libevdev.InputEvent(libevdev.EV_KEY.BTN_STYLUS,
value=0),
libevdev.InputEvent(libevdev.EV_KEY.BTN_STYLUS2,
value=0),
libevdev.InputEvent(libevdev.EV_KEY.BTN_TOOL_PEN,
value=1),
libevdev.InputEvent(libevdev.EV_SYN.SYN_REPORT,
value=0)])
# vpen.write(ecodes.EV_ABS, ecodes.ABS_X, int(val))
if code == ecodes.ABS_MT_POSITION_Y:
uinput.send_events([
libevdev.InputEvent(libevdev.EV_ABS.ABS_Y,
value=int(val)),
libevdev.InputEvent(libevdev.EV_KEY.BTN_TOUCH,
value=1),
libevdev.InputEvent(libevdev.EV_KEY.BTN_STYLUS,
value=0),
libevdev.InputEvent(libevdev.EV_KEY.BTN_STYLUS2,
value=0),
libevdev.InputEvent(libevdev.EV_KEY.BTN_TOOL_PEN,
value=1),
libevdev.InputEvent(libevdev.EV_SYN.SYN_REPORT,
value=0)])
if code == ecodes.ABS_MT_PRESSURE:
uinput.send_events([
libevdev.InputEvent(libevdev.EV_ABS.ABS_PRESSURE,
value=int(val)),
libevdev.InputEvent(libevdev.EV_KEY.BTN_TOUCH,
value=1),
libevdev.InputEvent(libevdev.EV_KEY.BTN_STYLUS,
value=0),
libevdev.InputEvent(libevdev.EV_KEY.BTN_STYLUS2,
value=0),
libevdev.InputEvent(libevdev.EV_KEY.BTN_TOOL_PEN,
value=1),
libevdev.InputEvent(libevdev.EV_SYN.SYN_REPORT,
value=0)])
device.ungrab()
except KeyboardInterrupt:
pass
if __name__ == "__main__":
main(sys.argv)
答案2
有同樣的問題。我使用的是 15" 銀色。有一個想法,您可能會使用使用該協議的 wacom 驅動程序?但除此之外,您還必須以某種方式獲得 mpp 驅動程序,儘管我不確定在哪裡