mirror of
https://github.com/mauiaaron/apple2.git
synced 2024-07-01 17:29:28 +00:00
Enforce pointer index tracking for touch lifecycle
- Fixes glitch where GLTouchMenu would capture a joystick event if the movement came into its portion of the screen - Prepares the way for allowing both keyboard and joystick access to same screen real-estate
This commit is contained in:
parent
c29daf006e
commit
8f03d0ca6f
|
@ -16,6 +16,8 @@
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
|
#define TRACKING_NONE (-1)
|
||||||
|
|
||||||
typedef enum glnode_render_order_t {
|
typedef enum glnode_render_order_t {
|
||||||
RENDER_BOTTOM=0, // e.g., the //e framebuffer node itself
|
RENDER_BOTTOM=0, // e.g., the //e framebuffer node itself
|
||||||
RENDER_LOW =1, // e.g., the touchjoy and touchkbd
|
RENDER_LOW =1, // e.g., the touchjoy and touchkbd
|
||||||
|
|
|
@ -16,7 +16,6 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define MODEL_DEPTH -1/32.f
|
#define MODEL_DEPTH -1/32.f
|
||||||
#define TRACKING_NONE (-1)
|
|
||||||
|
|
||||||
#define AXIS_TEMPLATE_COLS 3
|
#define AXIS_TEMPLATE_COLS 3
|
||||||
#define AXIS_TEMPLATE_ROWS 3
|
#define AXIS_TEMPLATE_ROWS 3
|
||||||
|
|
|
@ -414,7 +414,7 @@ static inline int64_t _tap_key_at_point(float x, float y) {
|
||||||
_rerender_selected(kbd.selectedCol, kbd.selectedRow);
|
_rerender_selected(kbd.selectedCol, kbd.selectedRow);
|
||||||
|
|
||||||
// return the key+scancode+handled
|
// return the key+scancode+handled
|
||||||
int64_t flags = (handled ? 0x1LL : 0x0LL);
|
int64_t flags = (handled ? TOUCH_FLAGS_HANDLED : 0x0LL);
|
||||||
|
|
||||||
key = key & 0xff;
|
key = key & 0xff;
|
||||||
scancode = scancode & 0xff;
|
scancode = scancode & 0xff;
|
||||||
|
@ -587,32 +587,44 @@ static int64_t gltouchkbd_onTouchEvent(interface_touch_event_t action, int point
|
||||||
float x = x_coords[pointer_idx];
|
float x = x_coords[pointer_idx];
|
||||||
float y = y_coords[pointer_idx];
|
float y = y_coords[pointer_idx];
|
||||||
|
|
||||||
int64_t flags = TOUCH_FLAGS_KBD | TOUCH_FLAGS_HANDLED;
|
int64_t flags = TOUCH_FLAGS_KBD;
|
||||||
|
|
||||||
clock_gettime(CLOCK_MONOTONIC, &kbd.timingBegin);
|
clock_gettime(CLOCK_MONOTONIC, &kbd.timingBegin);
|
||||||
|
|
||||||
|
static int trackingIndex = TRACKING_NONE;
|
||||||
|
|
||||||
switch (action) {
|
switch (action) {
|
||||||
case TOUCH_DOWN:
|
case TOUCH_DOWN:
|
||||||
case TOUCH_POINTER_DOWN:
|
case TOUCH_POINTER_DOWN:
|
||||||
|
if (/*isOnKeyboardModel:*/true) {// TODO FIXME : nonactionable areas could defer to joystick ...
|
||||||
|
trackingIndex = pointer_idx;
|
||||||
|
flags |= TOUCH_FLAGS_HANDLED;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TOUCH_MOVE:
|
case TOUCH_MOVE:
|
||||||
|
flags |= ((pointer_idx == trackingIndex) ? TOUCH_FLAGS_HANDLED : 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TOUCH_UP:
|
case TOUCH_UP:
|
||||||
case TOUCH_POINTER_UP:
|
case TOUCH_POINTER_UP:
|
||||||
{
|
{
|
||||||
|
if (trackingIndex == pointer_idx) {
|
||||||
int64_t handledAndData = _tap_key_at_point(x, y);
|
int64_t handledAndData = _tap_key_at_point(x, y);
|
||||||
flags |= ((handledAndData & 0x01) ? TOUCH_FLAGS_KEY_TAP : 0x0LL);
|
flags |= ((handledAndData & TOUCH_FLAGS_HANDLED) ? (TOUCH_FLAGS_HANDLED|TOUCH_FLAGS_KEY_TAP) : 0x0LL);
|
||||||
flags |= (handledAndData & TOUCH_FLAGS_ASCII_AND_SCANCODE_MASK);
|
flags |= (handledAndData & TOUCH_FLAGS_ASCII_AND_SCANCODE_MASK);
|
||||||
|
trackingIndex = TRACKING_NONE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TOUCH_CANCEL:
|
case TOUCH_CANCEL:
|
||||||
|
trackingIndex = TRACKING_NONE;
|
||||||
LOG("---KBD TOUCH CANCEL");
|
LOG("---KBD TOUCH CANCEL");
|
||||||
return 0x0LL;
|
return 0x0LL;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
trackingIndex = TRACKING_NONE;
|
||||||
LOG("!!!KBD UNKNOWN TOUCH EVENT : %d", action);
|
LOG("!!!KBD UNKNOWN TOUCH EVENT : %d", action);
|
||||||
return 0x0LL;
|
return 0x0LL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -236,7 +236,7 @@ static inline int64_t _tap_menu_item(float x, float y) {
|
||||||
|
|
||||||
uint8_t selectedItem = topMenuTemplate[row][col];
|
uint8_t selectedItem = topMenuTemplate[row][col];
|
||||||
|
|
||||||
int64_t flags = TOUCH_FLAGS_KEY_TAP;
|
int64_t flags = TOUCH_FLAGS_KEY_TAP | TOUCH_FLAGS_HANDLED;
|
||||||
switch (selectedItem) {
|
switch (selectedItem) {
|
||||||
|
|
||||||
case MOUSETEXT_LEFT:
|
case MOUSETEXT_LEFT:
|
||||||
|
@ -470,35 +470,45 @@ static int64_t gltouchmenu_onTouchEvent(interface_touch_event_t action, int poin
|
||||||
float x = x_coords[pointer_idx];
|
float x = x_coords[pointer_idx];
|
||||||
float y = y_coords[pointer_idx];
|
float y = y_coords[pointer_idx];
|
||||||
|
|
||||||
bool handled = (_is_point_on_left_menu(x, y) || _is_point_on_right_menu(x, y));
|
|
||||||
int flags = TOUCH_FLAGS_MENU;
|
int flags = TOUCH_FLAGS_MENU;
|
||||||
|
|
||||||
|
static int trackingIndex = TRACKING_NONE;
|
||||||
|
|
||||||
switch (action) {
|
switch (action) {
|
||||||
case TOUCH_DOWN:
|
case TOUCH_DOWN:
|
||||||
case TOUCH_POINTER_DOWN:
|
case TOUCH_POINTER_DOWN:
|
||||||
|
if (_is_point_on_left_menu(x, y) || _is_point_on_right_menu(x, y)) {
|
||||||
|
trackingIndex = pointer_idx;
|
||||||
_sprout_menu(x, y);
|
_sprout_menu(x, y);
|
||||||
|
flags |= TOUCH_FLAGS_HANDLED;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TOUCH_MOVE:
|
case TOUCH_MOVE:
|
||||||
|
flags |= ((pointer_idx == trackingIndex) ? TOUCH_FLAGS_HANDLED : 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TOUCH_UP:
|
case TOUCH_UP:
|
||||||
case TOUCH_POINTER_UP:
|
case TOUCH_POINTER_UP:
|
||||||
|
if (trackingIndex == pointer_idx) {
|
||||||
flags |= _tap_menu_item(x, y);
|
flags |= _tap_menu_item(x, y);
|
||||||
|
trackingIndex = TRACKING_NONE;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TOUCH_CANCEL:
|
case TOUCH_CANCEL:
|
||||||
|
trackingIndex = TRACKING_NONE;
|
||||||
LOG("---MENU TOUCH CANCEL");
|
LOG("---MENU TOUCH CANCEL");
|
||||||
return 0x0;
|
return 0x0;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
trackingIndex = TRACKING_NONE;
|
||||||
LOG("!!!MENU UNKNOWN TOUCH EVENT : %d", action);
|
LOG("!!!MENU UNKNOWN TOUCH EVENT : %d", action);
|
||||||
return 0x0;
|
return 0x0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (handled) {
|
if (flags & TOUCH_FLAGS_HANDLED) {
|
||||||
clock_gettime(CLOCK_MONOTONIC, &menu.timingBegin);
|
clock_gettime(CLOCK_MONOTONIC, &menu.timingBegin);
|
||||||
flags |= TOUCH_FLAGS_HANDLED;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return flags;
|
return flags;
|
||||||
|
|
|
@ -456,10 +456,6 @@ static void gldriver_reshape(int w, int h) {
|
||||||
windowHeight = h;
|
windowHeight = h;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if MOBILE_DEVICE
|
|
||||||
int viewportHeightPrevious = viewportHeight;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int w2 = ((float)h * (SCANWIDTH/(float)SCANHEIGHT));
|
int w2 = ((float)h * (SCANWIDTH/(float)SCANHEIGHT));
|
||||||
int h2 = ((float)w / (SCANWIDTH/(float)SCANHEIGHT));
|
int h2 = ((float)w / (SCANWIDTH/(float)SCANHEIGHT));
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user