我从我的网络接收 xy 数据,我想在 Wayland 上使用 linux 控制鼠标位置。
我见过很多使用 X 库或 X 应用程序的源代码,但它在 Wayland 上不起作用。我也查看了 libinput 和 evedev,但我没有找到任何关于如何创建/模拟鼠标的代码示例。
是否可以从Anaconda命令行直接安装Windows-10 64位evdev等效项?例:
[Anaconda2] C:\Users\User>conda install -c auto evdev_equivalent
Run Code Online (Sandbox Code Playgroud)
尝试从anaconda命令行安装pyHook失败:
[Anaconda2] C:\Users\User>anaconda search -t conda pyhook
Using Anaconda Cloud api site https://api.anaconda.org
Run 'anaconda show <USER/PACKAGE>' to get more details:
No packages found
Name | Version | Package Types | Platforms
------------------------- | ------ | --------------- | ---------------
Found 0 packages
Run Code Online (Sandbox Code Playgroud) 我的笔记本电脑连接了 2 个键盘(内置键盘和 USB 键盘)。我正在获取这些连接的键盘并libudev使用epoll它们通过接口轮询输入evdev:
// Compile with $(gcc udev.c -ludev)
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#include <sys/epoll.h>
#include <sys/poll.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h>
#include <time.h>
#include <libudev.h>
#define BILLION 1000000000L
long timespec_diff(struct timespec *start, struct timespec *end)
{
return (BILLION * (end->tv_sec - start->tv_sec)) +
(end->tv_nsec - start->tv_nsec);
}
bool want_to_run = true;
int
main(int argc, char *argv[])
{
int epoll_fd = epoll_create1(0);
struct udev *udev_obj = udev_new(); …Run Code Online (Sandbox Code Playgroud) 我正在使用gpio-keys设备驱动程序来处理运行Linux的嵌入式设备中的一些按钮.用户空间中的应用程序只能/dev/input/eventX在循环中打开和读取输入事件.
我的问题是如何获得按钮的初始状态.有一个ioctl call(EVIOCGKEY)可以用于此,但是如果我先检查这个然后开始读取/dev/input/eventX,就无法保证状态之间没有变化.
有什么建议?
我编写了一个python脚本,用于轮询evdev以获取HID条形码扫描器(模拟键盘):该脚本在Linux平台(Ubuntu)上运行良好.是否存在与evdev等效的OS X Python,它允许对现有python脚本进行轻微移植?
如果您具有Python经验并已针对HID设备输入进行了配置,请在响应中指明.
我正在 Raspberry Pi 上开发一个小型应用程序。对于这个问题,我可以将其归结为旋转编码器的使用。我发现使用 dtoverlay 对我来说是最方便的方法。因此,我使用python3中的evdev模块。我当前的代码如下所示:
import time
from threading import Thread
from evdev import InputDevice, events
import evdev
rotary_dev = InputDevice('/dev/input/event1')
def rotaryAction(dev):
for ev in dev.read_loop():
ev = evdev.util.categorize(ev)
if isinstance(ev, events.RelEvent):
if ev.event.value == 1:
print("Value: ",ev.event.value)
elif ev.event.value == -1:
print("Value: ",ev.event.value)
t = Thread(target=rotaryAction, args=(rotary_dev,))
t.start()
while True:
try:
time.sleep(5)
except KeyboardInterrupt:
print("Interrupt")
#Do something to stop the wait for device events
break
Run Code Online (Sandbox Code Playgroud)
现在我的问题是,我怎样才能以最好的方式终止这个程序。我无法停止线程,因为 for 循环等待设备上的事件。我正在考虑以某种方式模拟一个事件,但我不确定(=我不知道)如何做到这一点。我在网上没有找到任何参考资料,我想知道为什么。
我感谢您的帮助!
我一直在研究基于 python 的驱动程序,以在一些旧平板电脑中恢复一些功能。
我初始化如下
dev.enable(libevdev.EV_REL.REL_X )
dev.enable(libevdev.EV_REL.REL_Y )
dev.enable(libevdev.INPUT_PROP_DIRECT)
dev.enable(libevdev.EV_KEY.BTN_TOOL_PEN)
dev.enable(libevdev.EV_KEY.BTN_TOOL_RUBBER)
dev.enable(libevdev.EV_KEY.BTN_TOOL_MOUSE)
dev.enable(libevdev.EV_KEY.BTN_STYLUS)
dev.enable(libevdev.EV_KEY.BTN_STYLUS2)
dev.enable(libevdev.EV_ABS.ABS_X,libevdev.InputAbsInfo(minimum=0, maximum=Xmax*10,resolution=1270))
dev.enable(libevdev.EV_ABS.ABS_Y,libevdev.InputAbsInfo(minimum=0, maximum=Ymax*10,resolution=1270))
dev.enable(libevdev.EV_ABS.ABS_PRESSURE,libevdev.InputAbsInfo(0,254))
dev.enable(libevdev.EV_ABS.ABS_TILT_X,libevdev.InputAbsInfo(minimum=-64, maximum=64))
dev.enable(libevdev.EV_ABS.ABS_TILT_Y,libevdev.InputAbsInfo(minimum=-64, maximum=64))
dev.enable(libevdev.EV_KEY.BTN_LEFT)
dev.enable(libevdev.EV_KEY.BTN_RIGHT)
uinput = dev.create_uinput_device()
Run Code Online (Sandbox Code Playgroud)
然而当
[InputEvent(EV_KEY, BTN_TOOL_MOUSE, 1), InputEvent(EV_SYN, SYN_REPORT, 0)]
Run Code Online (Sandbox Code Playgroud)
发送后,此后在 xinput 中列出了笔而不是鼠标,尽管随后
[InputEvent(EV_KEY, BTN_TOOL_PEN, 1), InputEvent(EV_SYN, SYN_REPORT, 0)]
Run Code Online (Sandbox Code Playgroud)
工作,再次将输入工具设置为鼠标后,发送的位置数据将被忽略。
只有钢笔和橡皮擦工作。我以某种方式初始化这个错误吗?在 Ubuntu 20 和 FreeBSD 12 上测试
我想从包含如下数据的文本文件中读取按钮映射:
DPAD_LEFT = 105
DPAD_RIGHT = 106
DPAD_UP = 103
DPAD_DOWN = 108
Run Code Online (Sandbox Code Playgroud)
正确的部分实际上是evdev键码(如中所定义<linux/input.h>).
这很难读,所以我希望能够有这样的文件:
DPAD_LEFT = KEY_LEFT
DPAD_RIGHT = KEY_RIGHT
DPAD_UP = KEY_UP
DPAD_DOWN = KEY_DOWN
Run Code Online (Sandbox Code Playgroud)
但我目前无法将它们转换回来:
char[256] keyname;
some_method_to_read(&keyname, "DPAD_LEFT");
//keyname now contains "KEY_LEFT"
Run Code Online (Sandbox Code Playgroud)
如何获取相应的密钥代码(例如105)?有没有标准的方法来做到这一点?
编辑:我现在能想到的唯一方法是复制我的源代码中的所有密钥代码并将它们放在数组或映射中,就像evtest实用程序一样.但是有很多密钥代码,这对我来说似乎有点过分.此外,这可能与<input/linux.h>某些时候定义的密钥代码不同步.
std::map<string, int> keynames;
#define MAP_KEYCODE(keycode) keynames[#keycode] = keycode
MAP_KEYCODE(KEY_LEFT);
MAP_KEYCODE(KEY_RIGHT);
MAP_KEYCODE(KEY_UP);
MAP_KEYCODE(KEY_DOWN);
// [...]
Run Code Online (Sandbox Code Playgroud) 我正在建立一个自助服务终端系统,可以在启动时自动加载全屏网页.标准的东西.
问题是连接Acer触摸屏,它与evdev驱动程序工作正常......但它的工作原理有点太好了.如果用户按下并按住屏幕,则会生成右键单击并显示上下文菜单.这会导致界面出现一些问题,我需要禁用此功能,但我还没有找到办法.
X11配置文件不是我有很多经验的东西.有没有人有摆脱这个功能的经验?是否可以将触摸屏映射到通用鼠标驱动程序?
该系统是: - Ubuntu Mate 15.04 - Raspberry Pi 2 - 窗口管理器:Matchbox - 浏览器:Chromium
到目前为止,我对/usr/share/X11/xorg.conf.d中的10-evdev.conf文件进行了以下更改.
Section "InputClass"
Identifier "evdev touchscreen catchall"
MatchIsTouchscreen "on"
MatchDevicePath "/dev/input/event*"
Driver "evdev"
**Option "ButtonMapping" "1 0 0 0 0"
Option "Emulate3Buttons" "False"
Option "EmulateWheel" "False"
Option "EmulateThirdButton" "False"
Option "EmulateThirdButtonTimeout" "100000"
Option "EmulateThirdButtonMoveThreshold" "0"**
EndSection
Run Code Online (Sandbox Code Playgroud)
它们都没有对正在生成的右键单击事件或上下文菜单出现任何影响.但是,如果我把:
Option "Ignore" "on"
Run Code Online (Sandbox Code Playgroud)
触摸屏根本不起作用,所以我认为这是适当的改变部分.
我正在使用以下代码为我当前插入的键盘打印键码和扫描码:
import evdev
device = evdev.InputDevice('/dev/input/event8')
for event in device.read_loop():
if event.type == evdev.ecodes.EV_KEY:
print((evdev.categorize(event).keycode))
print((evdev.categorize(event).scancode))
Run Code Online (Sandbox Code Playgroud)
目前我有一个德语键盘布局,因为我想要别的东西而不是美国。当我按“#”时,我得到以下输出:
KEY_BACKSLASH
43
显然,这是错误的。在美式键盘上,这是正确的。
所以我的问题是:如何在不调用 shell 的情况下获得正确的键码/扫描码?
evdev ×10
linux ×6
python ×5
c ×2
driver ×1
embedded ×1
epoll ×1
hid ×1
keyboard ×1
linux-kernel ×1
macos ×1
mouseevent ×1
python-2.7 ×1
terminate ×1
ubuntu ×1
udev ×1
wayland ×1
windows-10 ×1