我在Ubuntu 16.10上的两台显示器上运行了两个全屏应用程序。 app1需要指针,必须一直聚焦,所以我需要在app1中锁定指针。
我写了一个工具来抓住这样的指针:
#include <stdio.h>
#include <X11/Xlib.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
Display *display;
XEvent xevent;
Window window;
int x,y;
void setPos(int x,int y){
XWarpPointer(display,None,window,0,0,0,0,x,y);
XFlush(display);
}
int main(int argc, char **argv){
if( (display = XOpenDisplay(NULL)) == NULL )
return -1;
window = DefaultRootWindow(display);
XAllowEvents(display, AsyncBoth, CurrentTime);
XGrabPointer(display,window,0,PointerMotionMask,GrabModeAsync,GrabModeAsync,None,None,CurrentTime);
while(1) {
XNextEvent(display, &xevent);
switch (xevent.type) {
case MotionNotify:
if(xevent.xmotion.x_root>1920){
setPos(1920,xevent.xmotion.y_root);
}
break;
}
}
return 0;
}
此工具可捕获指针的事件并限制指针停留在app1中,但指针无法在app1中操作任何内容。除运动之外的所有指针事件都不起作用。这些代码有什么建议吗?还是完成这项工作的任何其他想法?
答案 0 :(得分:0)
终于Xephyr解决了这个问题。 使用此命令运行Xephyr:
/usr/bin/Xephyr :1 -softCursor -name aaa -screen 1920x1080 -keybd evdev,,device=/dev/input/eventkb,xkbrules=evdev,xkbmodel=evdev,xkblayout=us -mouse evdev,5,device=/dev/input/$eventmouse -retro
Xephyr将启动一个新显示并抓取键盘和鼠标,然后您可以在显示器中运行您的应用程序:1。
顺便说一句: 1当您重新插入设备时,可能会更改键盘和鼠标的事件编号,因此请创建一个shell脚本来运行Xephey并在脚本中获取事件编号,如下所示:
eventkb=`grep -A5 "pci0000:00/0000:00:14.0/usb2/2-5/2-5:1.0/0003:1A81:1007" /proc/bus/input/devices | grep 'H: Handlers=' | grep --only-matching -e 'event[0-9]*'`
2如果您不想通过root运行Xephyr,您将收到有关获取键盘和鼠标的权限的错误。你可以创建文件/etc/udev/rules.d/my.rules并将SUBSYSTEM=="input", OWNER="username", GROUP="usernamer"
放入其中。然后你可以用用户名运行Xephyr。也许你需要重新登录或重启。