+ int key_status = (event->type == EVENT_FINGERRELEASE ? KEY_RELEASED :
+ KEY_PRESSED);
+ Key key = (event->x < 1.0 / 3.0 ?
+ (event->y < 1.0 / 2.0 ? setup.input[0].key.snap :
+ setup.input[0].key.drop) :
+ event->x > 2.0 / 3.0 ?
+ (event->y < 1.0 / 3.0 ? setup.input[0].key.up :
+ event->y > 2.0 / 3.0 ? setup.input[0].key.down :
+ event->x < 5.0 / 6.0 ? setup.input[0].key.left :
+ setup.input[0].key.right) :
+ KSYM_UNDEFINED);
+ char *key_status_name = (key_status == KEY_RELEASED ? "KEY_RELEASED" :
+ "KEY_PRESSED");
+ int i;
+
+ Error(ERR_DEBUG, "::: key '%s' was '%s' [fingerId: %lld]",
+ getKeyNameFromKey(key), key_status_name, event->fingerId);
+
+ // check if we already know this touch event's finger id
+ for (i = 0; i < NUM_TOUCH_FINGERS; i++)
+ {
+ if (touch_info[i].touched &&
+ touch_info[i].finger_id == event->fingerId)
+ {
+ // Error(ERR_DEBUG, "MARK 1: %d", i);
+
+ break;
+ }
+ }
+
+ if (i >= NUM_TOUCH_FINGERS)
+ {
+ if (key_status == KEY_PRESSED)
+ {
+ int oldest_pos = 0, oldest_counter = touch_info[0].counter;
+
+ // unknown finger id -- get new, empty slot, if available
+ for (i = 0; i < NUM_TOUCH_FINGERS; i++)
+ {
+ if (touch_info[i].counter < oldest_counter)
+ {
+ oldest_pos = i;
+ oldest_counter = touch_info[i].counter;
+
+ // Error(ERR_DEBUG, "MARK 2: %d", i);
+ }
+
+ if (!touch_info[i].touched)
+ {
+ // Error(ERR_DEBUG, "MARK 3: %d", i);
+
+ break;
+ }
+ }
+
+ if (i >= NUM_TOUCH_FINGERS)
+ {
+ // all slots allocated -- use oldest slot
+ i = oldest_pos;
+
+ // Error(ERR_DEBUG, "MARK 4: %d", i);
+ }
+ }
+ else
+ {
+ // release of previously unknown key (should not happen)
+
+ if (key != KSYM_UNDEFINED)
+ {
+ HandleKey(key, KEY_RELEASED);
+
+ Error(ERR_DEBUG, "=> key == '%s', key_status == '%s' [slot %d] [1]",
+ getKeyNameFromKey(key), "KEY_RELEASED", i);
+ }
+ }
+ }
+
+ if (i < NUM_TOUCH_FINGERS)
+ {
+ if (key_status == KEY_PRESSED)
+ {
+ if (touch_info[i].key != key)
+ {
+ if (touch_info[i].key != KSYM_UNDEFINED)
+ {
+ HandleKey(touch_info[i].key, KEY_RELEASED);
+
+ Error(ERR_DEBUG, "=> key == '%s', key_status == '%s' [slot %d] [2]",
+ getKeyNameFromKey(touch_info[i].key), "KEY_RELEASED", i);
+ }
+
+ if (key != KSYM_UNDEFINED)
+ {
+ HandleKey(key, KEY_PRESSED);
+
+ Error(ERR_DEBUG, "=> key == '%s', key_status == '%s' [slot %d] [3]",
+ getKeyNameFromKey(key), "KEY_PRESSED", i);
+ }
+ }
+
+ touch_info[i].touched = TRUE;
+ touch_info[i].finger_id = event->fingerId;
+ touch_info[i].counter = Counter();
+ touch_info[i].key = key;
+ }
+ else
+ {
+ if (touch_info[i].key != KSYM_UNDEFINED)
+ {
+ HandleKey(touch_info[i].key, KEY_RELEASED);
+
+ Error(ERR_DEBUG, "=> key == '%s', key_status == '%s' [slot %d] [4]",
+ getKeyNameFromKey(touch_info[i].key), "KEY_RELEASED", i);
+ }
+
+ touch_info[i].touched = FALSE;
+ touch_info[i].finger_id = 0;
+ touch_info[i].counter = 0;
+ touch_info[i].key = 0;
+ }
+ }
+
+ return;
+ }
+
+ // use touch direction control
+
+ if (event->type == EVENT_FINGERPRESS)
+ {
+ if (event_x > 1.0 / 3.0)
+ {
+ // motion area
+
+ motion_id = event->fingerId;
+
+ motion_x1 = event_x;
+ motion_y1 = event_y;
+
+ motion_key_x = KSYM_UNDEFINED;
+ motion_key_y = KSYM_UNDEFINED;
+
+ Error(ERR_DEBUG, "---------- MOVE STARTED (WAIT) ----------");
+ }
+ else
+ {
+ // button area
+
+ button_id = event->fingerId;
+
+ button_x1 = event_x;
+ button_y1 = event_y;