void SDL_ANDROID_CallJavaShowScreenKeyboard(const char * oldText, char * outBuf, int outBufLen) { // Clear mouse button state, to avoid repeated clicks on the text field in some apps SDL_ANDROID_MainThreadPushMouseButton( SDL_RELEASED, SDL_BUTTON_LEFT ); SDL_ANDROID_MainThreadPushMouseButton( SDL_RELEASED, SDL_BUTTON_RIGHT ); SDL_ANDROID_MainThreadPushMouseButton( SDL_RELEASED, SDL_BUTTON_MIDDLE ); SDL_ANDROID_TextInputFinished = 0; SDL_ANDROID_IsScreenKeyboardShownFlag = 1; if( !outBuf ) { showScreenKeyboardDeferred = 1; showScreenKeyboardOldText = oldText; showScreenKeyboardSendBackspace = 1; // Move mouse by 1 pixel to force screen update int x, y; SDL_GetMouseState( &x, &y ); SDL_ANDROID_MainThreadPushMouseMotion(x > 0 ? x-1 : 0, y); } else { SDL_ANDROID_TextInputInit(outBuf, outBufLen); if( SDL_ANDROID_VideoMultithreaded ) { #if SDL_VERSION_ATLEAST(1,3,0) #else // Dirty hack: we may call (*JavaEnv)->CallVoidMethod(...) only from video thread showScreenKeyboardDeferred = 1; showScreenKeyboardOldText = oldText; showScreenKeyboardSendBackspace = 0; SDL_Flip(SDL_GetVideoSurface()); #endif } else { (*JavaEnv)->PushLocalFrame(JavaEnv, 1); jstring s = (*JavaEnv)->NewStringUTF( JavaEnv, oldText ); (*JavaEnv)->CallVoidMethod( JavaEnv, JavaRenderer, JavaShowScreenKeyboard, s, 0 ); (*JavaEnv)->DeleteLocalRef( JavaEnv, s ); (*JavaEnv)->PopLocalFrame(JavaEnv, NULL); } while( !SDL_ANDROID_TextInputFinished ) SDL_Delay(100); SDL_ANDROID_TextInputFinished = 0; SDL_ANDROID_IsScreenKeyboardShownFlag = 0; } }
JNIEXPORT void JNICALL JAVA_EXPORT_NAME(DemoGLSurfaceView_nativeMouseButtonsPressed) (JNIEnv* env, jobject thiz, jint buttonId, jint pressedState) { if( !SDL_CurrentVideoSurface ) return; int btn = SDL_BUTTON_LEFT; switch(buttonId) { case MOUSE_HW_BUTTON_LEFT: btn = SDL_BUTTON_LEFT; break; case MOUSE_HW_BUTTON_RIGHT: btn = SDL_BUTTON_RIGHT; break; case MOUSE_HW_BUTTON_MIDDLE: btn = SDL_BUTTON_MIDDLE; break; case MOUSE_HW_BUTTON_BACK: btn = SDL_BUTTON_X1; break; case MOUSE_HW_BUTTON_FORWARD: btn = SDL_BUTTON_X2; break; } SDL_ANDROID_MainThreadPushMouseButton( pressedState ? SDL_PRESSED : SDL_RELEASED, btn ); }
JNIEXPORT jint JNICALL JAVA_EXPORT_NAME(DemoGLSurfaceView_nativeKey) ( JNIEnv* env, jobject thiz, jint key, jint action ) { if( !SDL_CurrentVideoSurface ) return 1; SDL_scancode sdlKey = TranslateKey(key); if( sdlKey == SDLK_NO_REMAP || sdlKey == SDLK_UNKNOWN ) return 0; if( sdlKey == SDLK_LCLICK ) { SDL_ANDROID_MainThreadPushMouseButton( action ? SDL_PRESSED : SDL_RELEASED, SDL_BUTTON_LEFT ); } else if( sdlKey == SDLK_RCLICK ) { SDL_ANDROID_MainThreadPushMouseButton( action ? SDL_PRESSED : SDL_RELEASED, SDL_BUTTON_RIGHT ); } else { SDL_ANDROID_MainThreadPushKeyboardKey( action ? SDL_PRESSED : SDL_RELEASED, sdlKey ); } return 1; }
extern void SDL_ANDROID_MainThreadPushKeyboardKey(int pressed, SDL_scancode key, int unicode) { SDL_keysym keysym; if( SDL_ANDROID_moveMouseWithArrowKeys && ( key == SDL_KEY(UP) || key == SDL_KEY(DOWN) || key == SDL_KEY(LEFT) || key == SDL_KEY(RIGHT) ) ) { if( SDL_ANDROID_moveMouseWithKbX < 0 ) { SDL_ANDROID_moveMouseWithKbX = SDL_ANDROID_currentMouseX; SDL_ANDROID_moveMouseWithKbY = SDL_ANDROID_currentMouseY; } if( pressed ) { if( key == SDL_KEY(LEFT) ) { if( SDL_ANDROID_moveMouseWithKbSpeedX > 0 ) SDL_ANDROID_moveMouseWithKbSpeedX = 0; SDL_ANDROID_moveMouseWithKbSpeedX -= SDL_ANDROID_moveMouseWithKbSpeed; SDL_ANDROID_moveMouseWithKbAccelX = -SDL_ANDROID_moveMouseWithKbAccel; SDL_ANDROID_moveMouseWithKbAccelUpdateNeeded |= 1; } else if( key == SDL_KEY(RIGHT) ) { if( SDL_ANDROID_moveMouseWithKbSpeedX < 0 ) SDL_ANDROID_moveMouseWithKbSpeedX = 0; SDL_ANDROID_moveMouseWithKbSpeedX += SDL_ANDROID_moveMouseWithKbSpeed; SDL_ANDROID_moveMouseWithKbAccelX = SDL_ANDROID_moveMouseWithKbAccel; SDL_ANDROID_moveMouseWithKbAccelUpdateNeeded |= 1; } if( key == SDL_KEY(UP) ) { if( SDL_ANDROID_moveMouseWithKbSpeedY > 0 ) SDL_ANDROID_moveMouseWithKbSpeedY = 0; SDL_ANDROID_moveMouseWithKbSpeedY -= SDL_ANDROID_moveMouseWithKbSpeed; SDL_ANDROID_moveMouseWithKbAccelY = -SDL_ANDROID_moveMouseWithKbAccel; SDL_ANDROID_moveMouseWithKbAccelUpdateNeeded |= 2; } else if( key == SDL_KEY(DOWN) ) { if( SDL_ANDROID_moveMouseWithKbSpeedY < 0 ) SDL_ANDROID_moveMouseWithKbSpeedY = 0; SDL_ANDROID_moveMouseWithKbSpeedY += SDL_ANDROID_moveMouseWithKbSpeed; SDL_ANDROID_moveMouseWithKbAccelY = SDL_ANDROID_moveMouseWithKbAccel; SDL_ANDROID_moveMouseWithKbAccelUpdateNeeded |= 2; } } else { if( key == SDL_KEY(LEFT) || key == SDL_KEY(RIGHT) ) { SDL_ANDROID_moveMouseWithKbSpeedX = 0; SDL_ANDROID_moveMouseWithKbAccelX = 0; SDL_ANDROID_moveMouseWithKbAccelUpdateNeeded &= ~1; } if( key == SDL_KEY(UP) || key == SDL_KEY(DOWN) ) { SDL_ANDROID_moveMouseWithKbSpeedY = 0; SDL_ANDROID_moveMouseWithKbAccelY = 0; SDL_ANDROID_moveMouseWithKbAccelUpdateNeeded &= ~2; } } SDL_ANDROID_moveMouseWithKbX += SDL_ANDROID_moveMouseWithKbSpeedX; SDL_ANDROID_moveMouseWithKbY += SDL_ANDROID_moveMouseWithKbSpeedY; SDL_ANDROID_MainThreadPushMouseMotion(SDL_ANDROID_moveMouseWithKbX, SDL_ANDROID_moveMouseWithKbY); return; } if ( key >= SDLK_MOUSE_LEFT && key <= SDLK_MOUSE_X2 ) { SDL_ANDROID_MainThreadPushMouseButton(pressed, key - SDLK_MOUSE_LEFT + SDL_BUTTON_LEFT); return; } keysym.scancode = key; if ( key < SDLK_LAST ) keysym.scancode = SDL_android_keysym_to_scancode[key]; keysym.sym = key; keysym.mod = KMOD_NONE; keysym.unicode = 0; #if SDL_VERSION_ATLEAST(1,3,0) #else if ( SDL_TranslateUNICODE ) #endif keysym.unicode = unicode; if( (keysym.unicode & 0xFF80) != 0 ) keysym.sym = SDLK_WORLD_0; //else if( keysym.sym < 0x80 ) // keysym.unicode = keysym.sym; if( pressed == SDL_RELEASED ) keysym.unicode = 0; //__android_log_print(ANDROID_LOG_INFO, "libSDL","SDL_SendKeyboardKey sym %d scancode %d unicode %d", keysym.sym, keysym.scancode, keysym.unicode); SDL_SendKeyboardKey( pressed, &keysym ); }