USB 接続を介してタッチ イベントを提供するデバイスに接続されている、Linux/X11 を実行する組み込みデバイスがあります。このデバイスは、標準のポインター/マウス入力の形式としては認識されません。私がやろうとしているのは、外部デバイスがイベントを報告したときにマウスイベントを X11 に「注入」する方法を見つけることです。
そうすることで、私のアプリケーション (Gtk+ を使用して C で記述) が Gtk+ 呼び出しでマウスの押下を偽造する必要がなくなります。
これができれば、私の Gtk+ アプリケーションは、タッチ イベントを生成するデバイスを認識したり気にしたりする必要がなくなります。アプリケーションには、標準のマウス イベントとして表示されます。
X11に合成マウスイベントを挿入する方法を知っている人はいますか?
現在、私は次のことを行っていますが、これは機能しますが、最適ではありません。
GtkWidget *btnSpin; /* sample button */
gboolean buttonPress_cb( void *btn );
gboolean buttonDePress_cb( void *btn );
/* make this call after the device library calls the TouchEvent_cb() callback
and the application has determined which, if any, button was touched
In this example we are assuming btnSpin was touched.
This function will, in 5ms, begin the process of causing the button to do it's
normal animation ( button in, button out effects ) and then send the actual
button_clicked event to the button.
*/
g_timeout_add(5, (GSourceFunc) buttonPress_cb, (void *)btnSpin);
/* this callback is fired 5ms after the g_timeout_add() function above.
It first sets the button state to ACTIVE to begin the animation cycle (pressed look)
And then 250ms later calls buttonDePress_cb which will make the button look un-pressed
and then send the button_clicked event.
*/
gboolean buttonPress_cb( void *btn )
{
gtk_widget_set_state((GtkWidget *)btn, GTK_STATE_ACTIVE);
g_timeout_add(250, (GSourceFunc) buttonDePress_cb, btn);
return( FALSE );
}
/* Sets button state back to NORMAL ( not pressed look )
and sends the button_clicked event so that the registered signal handler for the
button can be activated
*/
gboolean buttonDePress_cb( void *btn )
{
gtk_widget_set_state( btn, GTK_STATE_NORMAL);
gtk_button_clicked( GTK_BUTTON( btn ));
return( FALSE );
}