Tôi có thiết bị nhúng chạy Linux/X11 được kết nối với thiết bị cung cấp sự kiện chạm qua kết nối USB. Thiết bị này không được nhận dạng dưới dạng đầu vào con trỏ/chuột chuẩn. Những gì tôi đang cố gắng làm là tìm một cách để "tiêm" các sự kiện chuột vào X11 khi thiết bị bên ngoài báo cáo một sự kiện.Cách chèn các sự kiện chuột tổng hợp vào hàng đợi đầu vào X11
Làm như vậy sẽ xóa nhu cầu đăng ký của tôi (được viết bằng C bằng Gtk +) cho máy ép chuột giả với các cuộc gọi Gtk +.
Nếu điều này có thể được thực hiện, ứng dụng Gtk + của tôi sẽ không cần phải biết hoặc quan tâm đến thiết bị tạo sự kiện chạm. Nó sẽ chỉ xuất hiện với ứng dụng như các sự kiện chuột chuẩn.
Bất kỳ ai biết cách chuyển các sự kiện chuột tổng hợp thành X11?
Hiện tại tôi đang thực hiện các thao tác sau, nhưng không phải là tối ưu.
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);
}
Tuyệt vời .. điều này chỉ có thể là câu trả lời. Tôi sẽ cần phải xem liệu thiết bị Linux nhúng của tôi có hỗ trợ hệ thống 'uinput' hay không. Cảm ơn bạn. – Chimera