2017-10-06 3 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を回避するソリューション、両方を発見しましたか?私は相続人:)、最近私が使用していますQtのセットアップコードを

をX11を使用してすべての人を想像してみて、それが働いているように、デバッグ出力を見ることができない。任意のヒントについて

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マウスの方がはるかに多く、私は "公式"の道が行き止まりにつながるという結論に達しました。 Linuxはドライバによって適切にサポートされていないようです。

私は弾丸を打ちましたが、Linuxでは、少なくともUIに依存しない/ dev/input/eventを使って3dマウスからデータを収集しています。私はデバイスを開いて別のスレッドでデータを読み込みます(デバイスは定期的にポーリングされます)。

これまでのところ、これはかなりうまくいきます。

関連する問題