2017-03-07 11 views
1

저는 우분투 16.10의 두 모니터에서 두 개의 전체 화면 응용 프로그램을 실행하고 있습니다. app1은 포인터가 필요하며 항상 초점을 맞추어야하므로 app1에 포인터를 잠글 필요가 있습니다.포인터 이동 이벤트를 캡처하고 영역에서 포인터를 제한하는 방법은 무엇입니까?

이 같은 포인터를 잡기 위해 도구를 작성했다 : 포인터의 이벤트를 캡처하고 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; 
} 

이 도구. 모션을 제외한 모든 포인터 이벤트가 작동하지 않습니다. 코드에 대한 제안이 있습니까? 아니면 일을 끝내기위한 다른 아이디어?

+0

이벤트를 다시 보내려면 ['SendEvent()'] (https://www.x.org/releases/X11R7.6/doc/libX11/specs/libX11/libX11.html#Sending_Events_to_Other_Applications)를보십시오. 실제로 대상 창을 찾아야 할 수도 있습니다. 나는 실제 코드를 게시하기 위해 X11에서 너무 녹슬지 만 이것은 좋은 단서가되어야한다. 또한 해당 설명서의 색인을 읽으십시오. 섹션 제목이 꽤 좋습니다 (이 경우 "다른 응용 프로그램으로 이벤트 보내기"). – unwind

+0

나는이 방법을 사용했지만 작동하지 않았고 아무 것도 변경되지 않았습니다. XSendEvent (display, 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.

BTW : 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 Xephyr을 루트로 실행하지 않으려면 키보드와 마우스를 가져올 수있는 권한에 관한 오류가 표시됩니다. /etc/udev/rules.d/my.rules 파일을 만들고 SUBSYSTEM=="input", OWNER="username", GROUP="usernamer"을 넣을 수 있습니다. 그러면 사용자 이름으로 Xephyr을 실행할 수 있습니다. 어쩌면 다시 로그인하거나 다시 시작해야 할 수도 있습니다.