2017-03-07 6 views
1

私は、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には何も動作することはできません。モーションを除くすべてのポインタイベントは機能しません。コードへの提案はありますか?あるいは、仕事を終えるための他のアイデア?

+0

['SendEvent()'](https://www.x.org/releases/X11R7.6/doc/libX11/specs/libX11/libX11.html#Sending_Events_to_Other_Applications)を参照して、イベントを送り返してください。実際にターゲットウィンドウをルックアップする必要があるかもしれません。私は実際のコードを投稿するにはX11であまりにも錆びていますが、これは良い手がかりになるはずです。また、そのマニュアルの索引を読んで、かなり良いセクションタイトル(このケースでは "他のアプリケーションへのイベントの送信")があります。 – unwind

+0

私はこの方法を使用しましたが、それはうまくいかず、何も変わりませんでした。 XSendEvent(表示、PointerWindow、True、ButtonPressMask、&xevent);ポインタがクリックされたウィンドウがアクティブにならなかったので、私がツールを実行していた端末はいつもアクティブだった。 – user6731513

答えて

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あなたは、デバイスを接続するので、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を実行できます。たぶんあなたは再ログインするか、再起動する必要があります。

関連する問題