static pthread_mutex_t event_mutex = PTHREAD_MUTEX_INITIALIZER;
static int event_cnt = 0;
-
static void usb_touchscreen_event(void *opaque, int x, int y, int z, int buttons_state)
{
- USBTouchscreenState *s = opaque;
-
- /* scale to resolution */
- s->dx = x; //(x * TOUCHSCREEN_RESOLUTION_X / 0x7FFF);
- s->dy = y; //(y * TOUCHSCREEN_RESOLUTION_Y / 0x7FFF);
- s->dz = z;
- s->buttons_state = buttons_state;
- s->changed = 1;
-
- /*TouchEventEntry *te;
+ TouchEventEntry *te;
USBTouchscreenState *s = opaque;
te = g_malloc0(sizeof(TouchEventEntry));
INFO("full touch event queue, lose event\n", event_cnt);
return;
}
- te->index = event_cnt++;
+ te->index = ++event_cnt;
QTAILQ_INSERT_TAIL(&events_queue, te, node);
- s->changed = 0;
+ s->changed = 1;
pthread_mutex_unlock(&event_mutex);
- TRACE("touch event(%d) : x=%d, y=%d, z=%d, state=%d\n", te->index, x, y, z, buttons_state);*/
+ TRACE("touch event (%d) : x=%d, y=%d, z=%d, state=%d\n", te->index, x, y, z, buttons_state);
}
static int usb_touchscreen_poll(USBTouchscreenState *s, uint8_t *buf, int len)
switch (p->pid) {
case USB_TOKEN_IN:
if (p->devep == 1) {
- //pthread_mutex_lock(&event_mutex);
+ pthread_mutex_lock(&event_mutex);
if (s->changed == 0) {
- //pthread_mutex_unlock(&event_mutex);
+ pthread_mutex_unlock(&event_mutex);
return USB_RET_NAK;
}
- /*if (!QTAILQ_EMPTY(&events_queue)) {
- TouchEventEntry *te = QTAILQ_FIRST(&events_queue);
+ if (event_cnt != 0) {
+ if (!QTAILQ_EMPTY(&events_queue)) {
+ TouchEventEntry *te = QTAILQ_FIRST(&events_queue);
- s->dx = te->queue_packet.x;
- s->dy = te->queue_packet.y;
- s->dz = te->queue_packet.z;
- s->buttons_state = te->queue_packet.state;
+ s->dx = te->queue_packet.x;
+ s->dy = te->queue_packet.y;
+ s->dz = te->queue_packet.z;
+ s->buttons_state = te->queue_packet.state;
- QTAILQ_REMOVE(&events_queue, te, node);
- event_cnt--;
- TRACE("processed touch event(%d) : x=%d, y=%d, z=%d, state=%d\n",
- te->index, s->dx, s->dy, s->dz, s->buttons_state);
+ QTAILQ_REMOVE(&events_queue, te, node);
+ event_cnt--;
+ TRACE("processed touch event (%d) : x=%d, y=%d, z=%d, state=%d\n",
+ te->index, s->dx, s->dy, s->dz, s->buttons_state);
- if (QTAILQ_EMPTY(&events_queue)) {
- s->changed = 0;
+ if (QTAILQ_EMPTY(&events_queue)) {
+ s->changed = 0;
+ TRACE("processed all touch events (%d)\n", event_cnt);
+ }
}
+ } else {
+ s->changed = 0;
}
- pthread_mutex_unlock(&event_mutex); */
- s->changed = 0;
+ pthread_mutex_unlock(&event_mutex);
ret = usb_touchscreen_poll(s, buf, p->iov.size);
usb_packet_copy(p, buf, ret);
{
USBTouchscreenState *s = DO_UPCAST(USBTouchscreenState, dev, dev);
usb_desc_init(dev);
+
+ pthread_mutex_lock(&event_mutex);
s->changed = 1;
+ pthread_mutex_unlock(&event_mutex);
+
return 0;
}
{
USBTouchscreenState *s = (USBTouchscreenState *)opaque;
+ pthread_mutex_lock(&event_mutex);
s->changed = 1;
+ pthread_mutex_unlock(&event_mutex);
+
if (s->mouse_grabbed == 1) {
s->eh_entry = qemu_add_mouse_event_handler(usb_touchscreen_event, s, 1, "QEMU Virtual touchscreen");
qemu_activate_mouse_event_handler(s->eh_entry);