2017-10-06 7 views
0

Linux에서 Qt 4.8을 사용하여 3D 응용 프로그램을 개발 중입니다. 이제 3D 마우스 (3Dconnexion SpaceNavigator)를 지원해야합니다. 함께 제공되는 SDK는 X11을 사용하여 이벤트를 검색하는 오래된 학교입니다.Linux에서 Qt 4.8을 사용하는 3Dconnexion SpaceNavigator에서 이벤트를 가져올 수 없습니다.

SDK와 함께 제공된 샘플 코드를 사용하고 Qt 4.8과 통합하려고했습니다. 그것은 (내가 디버그 출력에서 ​​알 수있는 한) 마우스가 작동하는 것처럼 보이지만 QWidget :: x11Event (XEvent *)를 사용하여 어떤 XEvents도 얻지 못합니다./

어쩌면 누군가가 이미이 특정 문제에 대한 해결책이 있습니다

은 이미 나를 위해 현재 사용할 수없는 libudev 또는 libusb를을 사용하여 SDK를 우회 솔루션을 모두 발견? 나는 X11을 사용하는 모든 사용자를 상상할 수없는 요즘 :)

내가 사용하고 Heres는 Qt의 설치 코드, 그것과 같은 디버그 출력 모습 일하고 :

Display* pDisplay = QX11Info::display(); 

Atom event_motion = XInternAtom(pDisplay, "MotionEvent", TRUE); 
Atom event_press = XInternAtom(pDisplay, "ButtonPressEvent", TRUE); 
Atom event_release = XInternAtom(pDisplay, "ButtonReleaseEvent", TRUE); 
Atom event_command = XInternAtom(pDisplay, "CommandEvent", TRUE); 


std::cout << "MotionEvent: " << event_motion << std::endl; 
std::cout << "ButtonPressEvent: " << event_press << std::endl; 
std::cout << "ButtonReleaseEvent: " << event_release << std::endl; 
std::cout << "CommandEvent: " << event_command << std::endl; 

Atom ActualType; 
int ActualFormat; 
unsigned long NItems, BytesReturn; 

Window root = RootWindow(pDisplay, DefaultScreen(pDisplay)); 
std::cout << "root: " << std::hex << "0x" << root << std::dec << std::endl; 
unsigned char* p_property; 

Window app_window = (Window) this->window()->winId(); 

XGetWindowProperty(pDisplay, root, event_command, 0, 1, FALSE, 
    AnyPropertyType, &ActualType, &ActualFormat, &NItems, &BytesReturn, &p_property); 

if (0!=p_property) 
{ 
    Window wnd = *(Window*) p_property; 
    XFree(p_property); 

    std::cout << "magellan window number: " << std::hex << wnd << std::dec << std::endl; 

    XTextProperty wnd_name; 
    XGetWMName(pDisplay, wnd, &wnd_name); 
    std::cout << "magellan window name: " << wnd_name.value << std::endl; 

    XGetWMName(pDisplay, app_window, &wnd_name); 
    std::cout << "Found window property: " << wnd_name.value << " (" << std::hex << app_window << std::dec << ")" << std::endl; 

    XEvent CommandMessage; 
    CommandMessage.type = ClientMessage; 
    CommandMessage.xclient.format = 16; 
    CommandMessage.xclient.send_event = FALSE; 
    CommandMessage.xclient.display = pDisplay; 
    CommandMessage.xclient.window = wnd; 
    CommandMessage.xclient.message_type = event_command; 

    CommandMessage.xclient.data.s[0] = (short) XHigh32(app_window); 
    CommandMessage.xclient.data.s[1] = (short) XLow32(app_window); 
    CommandMessage.xclient.data.s[2] = 27695; 

    if (0!=XSendEvent(pDisplay, wnd, FALSE, 0x0000, &CommandMessage)) 
    { 
     std::cout << "Sent event to SpaceMouse" << std::endl; 
    } 

    XSelectInput(pDisplay, app_window, NoEventMask); 
} 

감사 힌트 :

+0

사이드 노트와 마찬가지로 : SpaceNavigator 3D 마우스 자체가 작동하므로 드라이버 등이 실행 중입니다. – pettersson

+0

[This] (http://spacenav.sourceforge.net/)이 다소 유용 할 수 있습니다. 나는 아주 비슷한 코드를 사용 해왔다. –

답변

0

을 위해 주변에 땜질 후 3d 마우스를 사용하면 "공식적인"방법으로 막 다른 골목에 이르게된다는 결론에 도달했습니다. 리눅스가 드라이버에 의해 제대로 지원되지 않는 것 같습니다.

글 머리 기호를 물었고 이제는 적어도 UI와 무관 한 Linux에서/dev/input/event를 사용하여 3d 마우스에서 데이터를 수집 중입니다. 나는 장치를 열고 별도의 스레드에서 데이터를 읽습니다 (장치는 정기적 인 간격으로 폴링 됨).

이것은 지금까지 꽤 잘 작동합니다.