У меня есть встроенное устройство под управлением Linux/X11, которое подключается к устройству, которое передает события касания через USB-соединение. Это устройство не распознается ни в какой форме стандартного ввода указателя/мыши. То, что я пытаюсь сделать, это найти способ "вставлять" события мыши в X11, когда внешнее устройство сообщает об этом событии.
Это позволит удалить необходимость моего приложения (написанного на C с использованием Gtk +) для подделки нажатий мыши с вызовами 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
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 );
}