私は、Ubuntu 16.10の2台のモニターで2つのフルスクリーンアプリケーションを実行しています。 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には何も動作することはできません。モーションを除くすべてのポインタイベントは機能しません。コードへの提案はありますか?あるいは、仕事を終えるための他のアイデア?
['SendEvent()'](https://www.x.org/releases/X11R7.6/doc/libX11/specs/libX11/libX11.html#Sending_Events_to_Other_Applications)を参照して、イベントを送り返してください。実際にターゲットウィンドウをルックアップする必要があるかもしれません。私は実際のコードを投稿するにはX11であまりにも錆びていますが、これは良い手がかりになるはずです。また、そのマニュアルの索引を読んで、かなり良いセクションタイトル(このケースでは "他のアプリケーションへのイベントの送信")があります。 – unwind
私はこの方法を使用しましたが、それはうまくいかず、何も変わりませんでした。 XSendEvent(表示、PointerWindow、True、ButtonPressMask、&xevent);ポインタがクリックされたウィンドウがアクティブにならなかったので、私がツールを実行していた端末はいつもアクティブだった。 – user6731513