Expand the on-screen keyboard to a full US layout (letters, digits, punctuation, Shift layer, Tab, arrows, F1-F12, one-shot Ctrl/Alt modifiers), make it a persistent, movable, closeable panel via a title-bar drag handle, and lower its opacity. Previously the keyboard was just a second panel swapped into the same quad as the menu launcher, which made the launcher translucent too and made the keyboard and menu mutually exclusive. Extract the shared swapchain/JNI/touch-dispatch plumbing into two generic, reusable modules - xr_swapchain.c (swapchain + per-image FBO setup) and xr_overlay.c (an off-screen Android View rendered into its own OpenXR quad, hit-tested via a laser pointer) - and make the menu launcher and keyboard two independent XrOverlay instances instead of one. The controller's menu button now only opens/closes the launcher; the launcher's "Keyboard" button only opens the keyboard - so the keyboard can stay up while picking something from the menu, and only the keyboard's own Close button hides it. xr_menu.c/.h are gone, fully absorbed into xr_overlay.c. On the Java side, OverlayPanel.java carries the shared off-screen-render/touch/ cursor plumbing that MenuOverlay and the new KeyboardOverlay both subclass.
This commit is contained in:
@@ -9,6 +9,9 @@
|
||||
|
||||
#include <SDL.h>
|
||||
|
||||
#include "xr_overlay.h"
|
||||
#include "xr_session.h"
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_de_ladkau_questshock_QuestShockActivity_nativeChdir(JNIEnv *env, jclass clazz, jstring path) {
|
||||
const char *cpath = (*env)->GetStringUTFChars(env, path, NULL);
|
||||
@@ -16,17 +19,18 @@ Java_de_ladkau_questshock_QuestShockActivity_nativeChdir(JNIEnv *env, jclass cla
|
||||
(*env)->ReleaseStringUTFChars(env, path, cpath);
|
||||
}
|
||||
|
||||
// MenuOverlay's hand-built on-screen keyboard (see
|
||||
// MenuOverlay.commitPrintableChar()) has no real Android IME session behind
|
||||
// it, so printable characters can't reach the game via Android's usual IME
|
||||
// path - instead this builds and pushes an SDL_TEXTINPUT event directly,
|
||||
// the same event type/shape SDL's own Android backend pushes for typed
|
||||
// text, using only the public SDL_Event/SDL_PushEvent API. The engine's
|
||||
// pump_events() (sdl_events.c) only picks up printable characters from
|
||||
// this event, not from SDL_KEYDOWN (see handleKeyPress() in MenuOverlay.java
|
||||
// for why).
|
||||
// KeyboardOverlay's hand-built on-screen keyboard (see
|
||||
// KeyboardOverlay.commitPrintableChar()) has no real Android IME session
|
||||
// behind it, so printable characters can't reach the game via Android's
|
||||
// usual IME path - instead this builds and pushes an SDL_TEXTINPUT event
|
||||
// directly, the same event type/shape SDL's own Android backend pushes for
|
||||
// typed text, using only the public SDL_Event/SDL_PushEvent API. The
|
||||
// engine's pump_events() (sdl_events.c) only picks up printable characters
|
||||
// from this event, not from SDL_KEYDOWN (see handleKeyPress() in
|
||||
// KeyboardOverlay.java for why).
|
||||
JNIEXPORT void JNICALL
|
||||
Java_de_ladkau_questshock_MenuOverlay_nativeSendPrintableChar(JNIEnv *env, jclass clazz, jchar c) {
|
||||
Java_de_ladkau_questshock_KeyboardOverlay_nativeSendPrintableChar(JNIEnv *env, jclass clazz,
|
||||
jchar c) {
|
||||
SDL_Event event;
|
||||
SDL_zero(event);
|
||||
event.type = SDL_TEXTINPUT;
|
||||
@@ -36,3 +40,20 @@ Java_de_ladkau_questshock_MenuOverlay_nativeSendPrintableChar(JNIEnv *env, jclas
|
||||
event.text.text[1] = '\0';
|
||||
SDL_PushEvent(&event);
|
||||
}
|
||||
|
||||
// KeyboardOverlay's title-bar Close button - the keyboard is a fully
|
||||
// independent overlay quad from the menu launcher (see xr_overlay.h), so
|
||||
// this is the only way to hide it once it's open; the controller's menu
|
||||
// button only ever affects the menu launcher.
|
||||
JNIEXPORT void JNICALL
|
||||
Java_de_ladkau_questshock_KeyboardOverlay_nativeRequestClose(JNIEnv *env, jclass clazz) {
|
||||
xr_overlay_set_visible(xr_session_get_keyboard_overlay(), false);
|
||||
}
|
||||
|
||||
// MenuOverlay's "Keyboard" button - only opens the keyboard overlay, never
|
||||
// touches the menu launcher's own visibility, so both can be shown
|
||||
// together.
|
||||
JNIEXPORT void JNICALL
|
||||
Java_de_ladkau_questshock_MenuOverlay_nativeShowKeyboard(JNIEnv *env, jclass clazz) {
|
||||
xr_overlay_set_visible(xr_session_get_keyboard_overlay(), true);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user