cleanup keyboard event handler

This commit is contained in:
Chloe committed 2026-10-18 16:47:02 -05:00
1 parent 00c47f4c70
commit f4af50b2cb
2 files changed
+54 -42

No files matched your search

@@ -158,8 +158,10 @@ class Cocos2dxGLSurfaceView(context: Context) : GLSurfaceView(context) {
cocos2dxEditText?.apply { cocos2dxEditText?.apply {
removeTextChangedListener(cocos2dxTextInputWrapper) removeTextChangedListener(cocos2dxTextInputWrapper)
if (sendNewCocosEvents) {
inputType = inputTypeForFlags(BaseRobTopActivity.curKeyboardInputFlags) inputType = inputTypeForFlags(BaseRobTopActivity.curKeyboardInputFlags)
imeOptions = imeOptionsForFlags(BaseRobTopActivity.curKeyboardInputFlags) imeOptions = imeOptionsForFlags(BaseRobTopActivity.curKeyboardInputFlags)
}
setText("") setText("")
val text = msg.obj as String val text = msg.obj as String
@@ -369,8 +371,19 @@ class Cocos2dxGLSurfaceView(context: Context) : GLSurfaceView(context) {
} }
} }
private fun queueKeyboardEvent(keyCode: Int, event: KeyEvent, down: Boolean) { private fun queueKeyboardEvent(keyCode: Int, event: KeyEvent, down: Boolean): Boolean {
val keypadCode = keyCode == KeyEvent.KEYCODE_MENU || keyCode == KeyEvent.KEYCODE_BACK
if (event.isSystem && !keypadCode) {
return false
}
if (keypadCode && BaseRobTopActivity.blockBackButton) {
return true
}
queueEvent {
sendNextEventTimestamp(event.eventTime * MS_TO_NS) sendNextEventTimestamp(event.eventTime * MS_TO_NS)
}
if (useKeyboardEvents) { if (useKeyboardEvents) {
if (down) { if (down) {
@@ -382,7 +395,6 @@ class Cocos2dxGLSurfaceView(context: Context) : GLSurfaceView(context) {
GeodeUtils.nativeKeyUp(keyCode, event.modifiers) GeodeUtils.nativeKeyUp(keyCode, event.modifiers)
} }
} }
return
} }
if (controllerEventsEnabled) { if (controllerEventsEnabled) {
@@ -397,28 +409,57 @@ class Cocos2dxGLSurfaceView(context: Context) : GLSurfaceView(context) {
event.repeatCount event.repeatCount
) )
} }
return }
// geode events override native callbacks
if (useKeyboardEvents || controllerEventsEnabled) {
return true
} }
if (sendNewCocosEvents) { if (sendNewCocosEvents) {
if (KeyEvent.isGamepadButton(keyCode)) { if (KeyEvent.isGamepadButton(keyCode)) {
return return false
} }
if (keyCode == KeyEvent.KEYCODE_ESCAPE && BaseRobTopActivity.blockBackButton) { if (keyCode == KeyEvent.KEYCODE_ESCAPE && BaseRobTopActivity.blockBackButton) {
return return true
} }
// messy logic
val isRepeat = event.repeatCount > 0 val isRepeat = event.repeatCount > 0
if (keypadCode) {
if (down) {
if (isRepeat || BaseRobTopActivity.blockBackButton) {
return true
}
queueEvent {
cocos2dxRenderer.handleKeyDown(keyCode)
}
return true
} else {
return false
}
}
val eventTimestamp = event.eventTime / 1000.0 val eventTimestamp = event.eventTime / 1000.0
val shiftPressed = event.isShiftPressed
val ctrlPressed = event.isCtrlPressed
val altPressed = event.isAltPressed
queueEvent { queueEvent {
cocos2dxRenderer.handleKeyboardEvent( cocos2dxRenderer.handleKeyboardEvent(
keyCode, down, isRepeat, eventTimestamp, keyCode, down, isRepeat, eventTimestamp,
event.isShiftPressed, event.isCtrlPressed, event.isAltPressed shiftPressed, ctrlPressed, altPressed
) )
} }
return true
} }
return false
} }
private fun legacyKeyDown(keyCode: Int, keyEvent: KeyEvent): Boolean { private fun legacyKeyDown(keyCode: Int, keyEvent: KeyEvent): Boolean {
@@ -478,51 +519,21 @@ class Cocos2dxGLSurfaceView(context: Context) : GLSurfaceView(context) {
} }
override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean { override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
val deliverGeodeEvents = useKeyboardEvents || controllerEventsEnabled if (!queueKeyboardEvent(keyCode, event, true)) {
if (!deliverGeodeEvents && !sendNewCocosEvents) {
return legacyKeyDown(keyCode, event) return legacyKeyDown(keyCode, event)
} }
if (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_MENU) {
if (deliverGeodeEvents) {
queueKeyboardEvent(keyCode, event, true)
return true
}
if (event.repeatCount != 0 || BaseRobTopActivity.blockBackButton) {
return true
}
queueEvent {
cocos2dxRenderer.handleKeyDown(keyCode)
}
return true
}
if (event.isSystem) {
return super.onKeyDown(keyCode, event)
}
queueKeyboardEvent(keyCode, event, true)
return true return true
} }
override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean { override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean {
val deliverGeodeEvents = useKeyboardEvents || controllerEventsEnabled if (!queueKeyboardEvent(keyCode, event, false)) {
if (!deliverGeodeEvents && !sendNewCocosEvents) {
return super.onKeyUp(keyCode, event) return super.onKeyUp(keyCode, event)
} }
if (event.isSystem) {
return super.onKeyUp(keyCode, event)
}
queueKeyboardEvent(keyCode, event, false)
return true return true
} }
// i'm lazy. // i'm lazy.
// https://developer.android.com/develop/ui/views/touch-and-input/game-controllers/controller-input // https://developer.android.com/develop/ui/views/touch-and-input/game-controllers/controller-input
private fun getCenteredAxis( private fun getCenteredAxis(
@@ -32,7 +32,7 @@ class Cocos2dxTextInputWrapper(private val cocos2dxGLSurfaceView: Cocos2dxGLSurf
val unchanged = str.commonPrefixWith(cText) val unchanged = str.commonPrefixWith(cText)
var unchangedUntil = unchanged.length var unchangedUntil = unchanged.length
if (unchangedUntil > 0 && unchangedUntil < str.length && Character.isLowSurrogate(unchanged.last())) { if (unchangedUntil > 0 && unchangedUntil < str.length && Character.isLowSurrogate(str[unchangedUntil])) {
unchangedUntil-- unchangedUntil--
} }
@@ -64,27 +64,28 @@ class Cocos2dxTextInputWrapper(private val cocos2dxGLSurfaceView: Cocos2dxGLSurf
val fullscreenIme = cocos2dxGLSurfaceView.cocos2dxEditText == textView && isFullScreenEdit val fullscreenIme = cocos2dxGLSurfaceView.cocos2dxEditText == textView && isFullScreenEdit
if (fullscreenIme) { if (fullscreenIme) {
var text = textView.text.toString() var text = textView.text.toString()
if (originText != text) { if (originText != text || !cocos2dxGLSurfaceView.sendNewCocosEvents) {
if (cocos2dxGLSurfaceView.sendNewCocosEvents) { if (cocos2dxGLSurfaceView.sendNewCocosEvents) {
cocos2dxGLSurfaceView.queueEvent { cocos2dxGLSurfaceView.queueEvent {
JniToCpp.textInputCaretToEnd() JniToCpp.textInputCaretToEnd()
} }
} }
for (i in originText!!.length downTo 1) { repeat(originText!!.length) {
cocos2dxGLSurfaceView.deleteBackward() cocos2dxGLSurfaceView.deleteBackward()
} }
// this bit was removed in 2.209, and I don't know if it's important on previous versions
if (!cocos2dxGLSurfaceView.sendNewCocosEvents) { if (!cocos2dxGLSurfaceView.sendNewCocosEvents) {
if (!text.endsWith('\n')) { if (!text.endsWith('\n')) {
text += '\n' text += '\n'
} }
} }
if (text.isNotEmpty()) {
cocos2dxGLSurfaceView.insertText(text) cocos2dxGLSurfaceView.insertText(text)
} }
} }
}
if (fullscreenIme || actionID == EditorInfo.IME_ACTION_DONE) { if (fullscreenIme || actionID == EditorInfo.IME_ACTION_DONE) {
if (cocos2dxGLSurfaceView.sendNewCocosEvents) { if (cocos2dxGLSurfaceView.sendNewCocosEvents) {