mirror of
https://github.com/mauiaaron/apple2.git
synced 2025-01-12 06:29:58 +00:00
Improved two-thumb support for touch keyboard
This commit is contained in:
parent
75be89d1ab
commit
5bd8e25739
@ -351,6 +351,41 @@ public class Apple2KeyboardSettingsMenu extends Apple2AbstractMenu {
|
|||||||
return convertView;
|
return convertView;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
KEYBOARD_ENABLE_DUO_TOUCH {
|
||||||
|
@Override
|
||||||
|
public final String getTitle(Apple2Activity activity) {
|
||||||
|
return activity.getResources().getString(R.string.keyboard_duotouch_enabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final String getSummary(Apple2Activity activity) {
|
||||||
|
return activity.getResources().getString(R.string.keyboard_duotouch_enabled_summary);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getPrefKey() {
|
||||||
|
return "duoTouchEnabled";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getPrefDefault() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View getView(final Apple2Activity activity, View convertView) {
|
||||||
|
convertView = _basicView(activity, this, convertView);
|
||||||
|
CheckBox cb = _addCheckbox(activity, this, convertView, (boolean) Apple2Preferences.getJSONPref(this));
|
||||||
|
final IMenuEnum self = this;
|
||||||
|
cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
|
||||||
|
@Override
|
||||||
|
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
||||||
|
Apple2Preferences.setJSONPref(self, isChecked);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return convertView;
|
||||||
|
}
|
||||||
|
},
|
||||||
KEYBOARD_ENABLE_LOWERCASE {
|
KEYBOARD_ENABLE_LOWERCASE {
|
||||||
@Override
|
@Override
|
||||||
public final String getTitle(Apple2Activity activity) {
|
public final String getTitle(Apple2Activity activity) {
|
||||||
|
@ -201,5 +201,7 @@
|
|||||||
<string name="show_half_scanlines_summary">Renders pixel vertical divisions</string>
|
<string name="show_half_scanlines_summary">Renders pixel vertical divisions</string>
|
||||||
<string name="release_notes">Release notes</string>
|
<string name="release_notes">Release notes</string>
|
||||||
<string name="release_notes_summary">View notes for this release</string>
|
<string name="release_notes_summary">View notes for this release</string>
|
||||||
|
<string name="keyboard_duotouch_enabled">Enable dual-touch</string>
|
||||||
|
<string name="keyboard_duotouch_enabled_summary">Support two-thumb input</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -201,5 +201,7 @@
|
|||||||
<string name="show_half_scanlines_summary">Renders pixel vertical divisions</string>
|
<string name="show_half_scanlines_summary">Renders pixel vertical divisions</string>
|
||||||
<string name="release_notes">Release notes</string>
|
<string name="release_notes">Release notes</string>
|
||||||
<string name="release_notes_summary">View notes for this release</string>
|
<string name="release_notes_summary">View notes for this release</string>
|
||||||
|
<string name="keyboard_duotouch_enabled">Enable dual-touch</string>
|
||||||
|
<string name="keyboard_duotouch_enabled_summary">Support two-thumb input</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -201,5 +201,7 @@
|
|||||||
<string name="show_half_scanlines_summary">Renders pixel vertical divisions</string>
|
<string name="show_half_scanlines_summary">Renders pixel vertical divisions</string>
|
||||||
<string name="release_notes">Release notes</string>
|
<string name="release_notes">Release notes</string>
|
||||||
<string name="release_notes_summary">View notes for this release</string>
|
<string name="release_notes_summary">View notes for this release</string>
|
||||||
|
<string name="keyboard_duotouch_enabled">Enable dual-touch</string>
|
||||||
|
<string name="keyboard_duotouch_enabled_summary">Support two-thumb input</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -201,5 +201,7 @@
|
|||||||
<string name="show_half_scanlines_summary">Renders pixel vertical divisions</string>
|
<string name="show_half_scanlines_summary">Renders pixel vertical divisions</string>
|
||||||
<string name="release_notes">Release notes</string>
|
<string name="release_notes">Release notes</string>
|
||||||
<string name="release_notes_summary">View notes for this release</string>
|
<string name="release_notes_summary">View notes for this release</string>
|
||||||
|
<string name="keyboard_duotouch_enabled">Enable dual-touch</string>
|
||||||
|
<string name="keyboard_duotouch_enabled_summary">Support two-thumb input</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -72,6 +72,7 @@
|
|||||||
#define PREF_KEYBOARD_CAPS "caps"
|
#define PREF_KEYBOARD_CAPS "caps"
|
||||||
#define PREF_KEYBOARD_ALT_PATH "altPath"
|
#define PREF_KEYBOARD_ALT_PATH "altPath"
|
||||||
#define PREF_KEYBOARD_VARIANT "variant"
|
#define PREF_KEYBOARD_VARIANT "variant"
|
||||||
|
#define PREF_KEYBOARD_DUO_TOUCH "duoTouchEnabled"
|
||||||
#define PREF_LOWERCASE_ENABLED "lowercaseEnabled"
|
#define PREF_LOWERCASE_ENABLED "lowercaseEnabled"
|
||||||
#define PREF_PORTRAIT_HEIGHT_SCALE "portraitHeightScale"
|
#define PREF_PORTRAIT_HEIGHT_SCALE "portraitHeightScale"
|
||||||
#define PREF_PORTRAIT_POSITION_SCALE "portraitPositionScale"
|
#define PREF_PORTRAIT_POSITION_SCALE "portraitPositionScale"
|
||||||
|
@ -133,6 +133,7 @@ static struct {
|
|||||||
int ctrlRow;
|
int ctrlRow;
|
||||||
|
|
||||||
bool ctrlPressed;
|
bool ctrlPressed;
|
||||||
|
bool duoTouch;
|
||||||
|
|
||||||
unsigned int glyphMultiplier;
|
unsigned int glyphMultiplier;
|
||||||
float portraitHeightScale;
|
float portraitHeightScale;
|
||||||
@ -364,7 +365,6 @@ static inline int64_t _tap_key_at_point(float x, float y) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case ICONTEXT_NONACTIONABLE:
|
case ICONTEXT_NONACTIONABLE:
|
||||||
scancode = 0;
|
|
||||||
handled = false;
|
handled = false;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -455,15 +455,17 @@ static inline int64_t _tap_key_at_point(float x, float y) {
|
|||||||
assert(key < 0x80);
|
assert(key < 0x80);
|
||||||
scancode = c_keys_ascii_to_scancode(key);
|
scancode = c_keys_ascii_to_scancode(key);
|
||||||
if (kbd.ctrlPressed) {
|
if (kbd.ctrlPressed) {
|
||||||
c_keys_handle_input(scancode, /*pressed*/true, /*ASCII:*/false);
|
c_keys_handle_input(scancode, /*pressed*/true, /*ASCII:*/false);
|
||||||
c_keys_handle_input(scancode, /*pressed*/false, /*ASCII:*/false);
|
c_keys_handle_input(scancode, /*pressed*/false, /*ASCII:*/false);
|
||||||
} else {
|
} else {
|
||||||
c_keys_handle_input(key, /*pressed:*/true, /*ASCII:*/true);
|
c_keys_handle_input(key, /*pressed:*/true, /*ASCII:*/true);
|
||||||
|
c_keys_handle_input(key, /*pressed:*/false, /*ASCII:*/true);
|
||||||
}
|
}
|
||||||
if (key == ' ' && isCalibrating) {
|
if (key == ' ' && isCalibrating) {
|
||||||
key = ICONTEXT_SPACE_VISUAL;
|
key = ICONTEXT_SPACE_VISUAL;
|
||||||
}
|
}
|
||||||
} else if (isCTRL) {
|
} else if (isCTRL) {
|
||||||
|
assert(scancode == SCODE_L_CTRL);
|
||||||
c_keys_handle_input(scancode, /*pressed:*/kbd.ctrlPressed, /*ASCII:*/false);
|
c_keys_handle_input(scancode, /*pressed:*/kbd.ctrlPressed, /*ASCII:*/false);
|
||||||
} else if (scancode) {
|
} else if (scancode) {
|
||||||
// perform a press of other keys (ESC, Arrows, etc)
|
// perform a press of other keys (ESC, Arrows, etc)
|
||||||
@ -481,9 +483,6 @@ static inline int64_t _tap_key_at_point(float x, float y) {
|
|||||||
flags |= TOUCH_FLAGS_HANDLED;
|
flags |= TOUCH_FLAGS_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
key = key & 0xff;
|
|
||||||
scancode = scancode & 0xff;
|
|
||||||
|
|
||||||
flags |= ( (int64_t)((key << 8) | scancode) << TOUCH_FLAGS_ASCII_AND_SCANCODE_SHIFT);
|
flags |= ( (int64_t)((key << 8) | scancode) << TOUCH_FLAGS_ASCII_AND_SCANCODE_SHIFT);
|
||||||
return flags;
|
return flags;
|
||||||
}
|
}
|
||||||
@ -670,13 +669,27 @@ static void gltouchkbd_reshape(int w, int h, bool landscape) {
|
|||||||
|
|
||||||
static int64_t gltouchkbd_onTouchEvent(interface_touch_event_t action, int pointer_count, int pointer_idx, float *x_coords, float *y_coords) {
|
static int64_t gltouchkbd_onTouchEvent(interface_touch_event_t action, int pointer_count, int pointer_idx, float *x_coords, float *y_coords) {
|
||||||
|
|
||||||
if (!isAvailable) {
|
if (UNLIKELY(pointer_idx < 0)) {
|
||||||
|
TOUCH_KBD_LOG("!!!KBD : IGNORING TRACKING INDEX %d", pointer_idx);
|
||||||
|
return 0x0LL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int trackingIndex0 = TRACKING_NONE;
|
||||||
|
static int trackingIndex1 = TRACKING_NONE;
|
||||||
|
|
||||||
|
if (UNLIKELY(!isAvailable)) {
|
||||||
|
trackingIndex0 = TRACKING_NONE;
|
||||||
|
trackingIndex1 = TRACKING_NONE;
|
||||||
return 0x0LL;
|
return 0x0LL;
|
||||||
}
|
}
|
||||||
if (UNLIKELY(kbd.prefsChanged)) {
|
if (UNLIKELY(kbd.prefsChanged)) {
|
||||||
return 0x0;
|
trackingIndex0 = TRACKING_NONE;
|
||||||
|
trackingIndex1 = TRACKING_NONE;
|
||||||
|
return 0x0LL;
|
||||||
}
|
}
|
||||||
if (!ownsScreen) {
|
if (!ownsScreen) {
|
||||||
|
trackingIndex0 = TRACKING_NONE;
|
||||||
|
trackingIndex1 = TRACKING_NONE;
|
||||||
return 0x0LL;
|
return 0x0LL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -687,41 +700,72 @@ static int64_t gltouchkbd_onTouchEvent(interface_touch_event_t action, int point
|
|||||||
|
|
||||||
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 ...
|
if (/*isOnKeyboardModel:*/true) {// TODO FIXME : nonactionable areas could defer to joystick ...
|
||||||
trackingIndex = pointer_idx;
|
|
||||||
flags |= TOUCH_FLAGS_HANDLED;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TOUCH_MOVE:
|
if (trackingIndex0 == TRACKING_NONE) {
|
||||||
flags |= ((pointer_idx == trackingIndex) ? TOUCH_FLAGS_HANDLED : 0);
|
trackingIndex0 = pointer_idx;
|
||||||
break;
|
flags |= TOUCH_FLAGS_HANDLED;
|
||||||
|
TOUCH_KBD_LOG("---KBD TOUCH DOWN 0");
|
||||||
case TOUCH_UP:
|
} else if (kbd.duoTouch && trackingIndex1 == TRACKING_NONE) {
|
||||||
case TOUCH_POINTER_UP:
|
trackingIndex1 = pointer_idx;
|
||||||
{
|
flags |= TOUCH_FLAGS_HANDLED;
|
||||||
if (trackingIndex == pointer_idx) {
|
TOUCH_KBD_LOG("---KBD TOUCH DOWN 1");
|
||||||
int64_t handledAndData = _tap_key_at_point(x, y);
|
} else {
|
||||||
flags |= ((handledAndData & TOUCH_FLAGS_HANDLED) ? (TOUCH_FLAGS_HANDLED|TOUCH_FLAGS_KEY_TAP) : 0x0LL);
|
TOUCH_KBD_LOG("!!!KBD : IGNORING OTHER TOUCH DOWN %d", pointer_idx);
|
||||||
flags |= (handledAndData & TOUCH_FLAGS_REQUEST_SYSTEM_KBD);
|
|
||||||
flags |= (handledAndData & TOUCH_FLAGS_ASCII_AND_SCANCODE_MASK);
|
|
||||||
trackingIndex = TRACKING_NONE;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case TOUCH_MOVE:
|
||||||
|
if (pointer_idx == trackingIndex0) {
|
||||||
|
flags |= TOUCH_FLAGS_HANDLED;
|
||||||
|
} else if (kbd.duoTouch && pointer_idx == trackingIndex1) {
|
||||||
|
flags |= TOUCH_FLAGS_HANDLED;
|
||||||
|
} else {
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TOUCH_UP:
|
||||||
|
case TOUCH_POINTER_UP:
|
||||||
|
// tap is performed on touch up ...
|
||||||
|
if (trackingIndex0 == pointer_idx || (kbd.duoTouch && trackingIndex1 == pointer_idx)) {
|
||||||
|
int64_t handledAndData = _tap_key_at_point(x, y);
|
||||||
|
flags |= ((handledAndData & TOUCH_FLAGS_HANDLED) ? (TOUCH_FLAGS_HANDLED|TOUCH_FLAGS_KEY_TAP) : 0x0LL);
|
||||||
|
flags |= (handledAndData & TOUCH_FLAGS_REQUEST_SYSTEM_KBD);
|
||||||
|
flags |= (handledAndData & TOUCH_FLAGS_ASCII_AND_SCANCODE_MASK);
|
||||||
|
|
||||||
|
if (trackingIndex0 == pointer_idx) {
|
||||||
|
TOUCH_KBD_LOG("---KBD TOUCH UP 0");
|
||||||
|
if (trackingIndex1 != TRACKING_NONE) {
|
||||||
|
// TODO FIXME ... verify this is needed for iOS ... it is apparently needed for Android, ugh
|
||||||
|
TOUCH_KBD_LOG("---KBD MIGRATING TRACKING 1 -> 0");
|
||||||
|
trackingIndex1 = TRACKING_NONE;
|
||||||
|
} else {
|
||||||
|
trackingIndex0 = TRACKING_NONE;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
TOUCH_KBD_LOG("---KBD TOUCH UP 1");
|
||||||
|
trackingIndex1 = TRACKING_NONE;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
TOUCH_KBD_LOG("!!!KBD : IGNORING OTHER TOUCH UP %d", pointer_idx);
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case TOUCH_CANCEL:
|
case TOUCH_CANCEL:
|
||||||
trackingIndex = TRACKING_NONE;
|
trackingIndex0 = TRACKING_NONE;
|
||||||
|
trackingIndex1 = TRACKING_NONE;
|
||||||
LOG("---KBD TOUCH CANCEL");
|
LOG("---KBD TOUCH CANCEL");
|
||||||
return 0x0LL;
|
return 0x0LL;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
trackingIndex = TRACKING_NONE;
|
trackingIndex0 = TRACKING_NONE;
|
||||||
|
trackingIndex1 = TRACKING_NONE;
|
||||||
LOG("!!!KBD UNKNOWN TOUCH EVENT : %d", action);
|
LOG("!!!KBD UNKNOWN TOUCH EVENT : %d", action);
|
||||||
return 0x0LL;
|
return 0x0LL;
|
||||||
}
|
}
|
||||||
@ -913,6 +957,8 @@ static void gltouchkbd_applyPrefs(void) {
|
|||||||
= prefs_parseLongValue (PREF_DOMAIN_TOUCHSCREEN, PREF_SCREEN_OWNER, &lVal, /*base:*/10) ? (interface_device_t)lVal : TOUCH_DEVICE_KEYBOARD;
|
= prefs_parseLongValue (PREF_DOMAIN_TOUCHSCREEN, PREF_SCREEN_OWNER, &lVal, /*base:*/10) ? (interface_device_t)lVal : TOUCH_DEVICE_KEYBOARD;
|
||||||
ownsScreen = (screenOwner == TOUCH_DEVICE_KEYBOARD || screenOwner == TOUCH_DEVICE_NONE);
|
ownsScreen = (screenOwner == TOUCH_DEVICE_KEYBOARD || screenOwner == TOUCH_DEVICE_NONE);
|
||||||
|
|
||||||
|
kbd.duoTouch = prefs_parseBoolValue(PREF_DOMAIN_KEYBOARD, PREF_KEYBOARD_DUO_TOUCH, &bVal) ? bVal : false;
|
||||||
|
|
||||||
if (ownsScreen) {
|
if (ownsScreen) {
|
||||||
minAlpha = minAlphaWhenOwnsScreen;
|
minAlpha = minAlphaWhenOwnsScreen;
|
||||||
if (allowLowercase) {
|
if (allowLowercase) {
|
||||||
@ -931,7 +977,7 @@ static void gltouchkbd_applyPrefs(void) {
|
|||||||
glhud_setupDefault(kbd.model);
|
glhud_setupDefault(kbd.model);
|
||||||
}
|
}
|
||||||
|
|
||||||
// reset CTRL state upon leaving this touch device
|
// reset CTRL pressed state upon leaving this touch device
|
||||||
kbd.ctrlPressed = false;
|
kbd.ctrlPressed = false;
|
||||||
c_keys_handle_input(SCODE_L_CTRL, /*pressed:*/false, /*ASCII:*/false);
|
c_keys_handle_input(SCODE_L_CTRL, /*pressed:*/false, /*ASCII:*/false);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user