Einfügen von synthetischen Mausereignissen in die X11-Eingabewarteschlange

Ich habe ein Embedded-Gerät mit Linux / X11, das über eine USB-Verbindung mit einem Gerät verbunden ist, das Berührungsereignisse bereitstellt. Dieses Gerät wird nicht als standardmäßige Zeiger- / Mauseingabe erkannt. Ich versuche, eine Möglichkeit zu finden, Mausereignisse in X11 zu "injizieren", wenn das externe Gerät ein Ereignis meldet.

Dies würde die Notwendigkeit beseitigen, dass meine Anwendung (mit Gtk + in C geschrieben) Mausklicks mit Gtk + -Aufrufen vortäuscht.

In diesem Fall muss meine Gtk + -Anwendung das Gerät, das die Berührungsereignisse generiert, nicht kennen oder sich darum kümmern. Es wird der Anwendung nur als Standardmausereignis angezeigt.

Weiß jemand, wie man synthetische Mausereignisse in X11 einfügt?

Im Moment mache ich Folgendes, was funktioniert, aber nicht optimal ist.

<code>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 );
}
</code>

Antworten auf die Frage(4)

Ihre Antwort auf die Frage