src/core/android/SDL_android.h
author Sam Lantinga <slouken@libsdl.org>
Wed, 03 Oct 2012 20:49:16 -0700
changeset 6555 f2c03c06d987
parent 6464 ab55284b389f
child 6642 b716011e53ce
permissions -rw-r--r--
Fixed bug 1614 - SDL for Android does not implement TextInput API

Andrey Isakov 2012-10-03 08:30:25 PDT

I've found out in the process of porting one OS project to Android/SDL2 that
there is no support for TextInput events/APIs on Android.
So I implemented some kind of initial support of that feature, and at the very
least it seems to work fine with latin chars input with soft and hardware
keyboards on my Moto Milestone2. I've also tried playing around with more
complex IMEs, like japanese, logging the process and it seemed to work too. I'm
not sure since the app itself I am working on does not have support for
non-latin input.

The main point of the patch is to place a fake input view in the region
specified by SDL_SetTextInputRect and create a custom InputConnection for it.
The reason to make it a separate view is to support Android's pan&scan on input
feature properly. For details please refer to
http://android-developers.blogspot.com/2009/04/updating-applications-for-on-screen.html
Even though the manual states that SetTextInputRect is used to determine the
IME variants position, I thought this would be a proper use for this too.
slouken@4994
     1
/*
slouken@5535
     2
  Simple DirectMedia Layer
slouken@6138
     3
  Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
slouken@4994
     4
slouken@5535
     5
  This software is provided 'as-is', without any express or implied
slouken@5535
     6
  warranty.  In no event will the authors be held liable for any damages
slouken@5535
     7
  arising from the use of this software.
slouken@4994
     8
slouken@5535
     9
  Permission is granted to anyone to use this software for any purpose,
slouken@5535
    10
  including commercial applications, and to alter it and redistribute it
slouken@5535
    11
  freely, subject to the following restrictions:
slouken@4994
    12
slouken@5535
    13
  1. The origin of this software must not be misrepresented; you must not
slouken@5535
    14
     claim that you wrote the original software. If you use this software
slouken@5535
    15
     in a product, an acknowledgment in the product documentation would be
slouken@5535
    16
     appreciated but is not required.
slouken@5535
    17
  2. Altered source versions must be plainly marked as such, and must not be
slouken@5535
    18
     misrepresented as being the original software.
slouken@5535
    19
  3. This notice may not be removed or altered from any source distribution.
slouken@4994
    20
*/
slouken@4994
    21
#include "SDL_config.h"
slouken@4994
    22
slouken@4994
    23
/* Set up for C function definitions, even when using C++ */
slouken@4994
    24
#ifdef __cplusplus
slouken@4994
    25
/* *INDENT-OFF* */
slouken@4994
    26
extern "C" {
slouken@4994
    27
/* *INDENT-ON* */
slouken@4994
    28
#endif
slouken@4994
    29
slouken@6555
    30
#include "SDL_rect.h"
slouken@6555
    31
slouken@4994
    32
/* Interface from the SDL library into the Android Java activity */
slouken@5222
    33
extern SDL_bool Android_JNI_CreateContext(int majorVersion, int minorVersion);
slouken@5000
    34
extern void Android_JNI_SwapWindow();
slouken@5000
    35
extern void Android_JNI_SetActivityTitle(const char *title);
slouken@6212
    36
extern SDL_bool Android_JNI_GetAccelerometerValues(float values[3]);
slouken@6555
    37
extern int Android_JNI_ShowTextInput(SDL_Rect *inputRect);
slouken@4995
    38
slouken@4995
    39
// Audio support
slouken@5000
    40
extern int Android_JNI_OpenAudioDevice(int sampleRate, int is16Bit, int channelCount, int desiredBufferFrames);
slouken@5000
    41
extern void* Android_JNI_GetAudioBuffer();
slouken@5000
    42
extern void Android_JNI_WriteAudioBuffer();
slouken@5000
    43
extern void Android_JNI_CloseAudioDevice();
slouken@4994
    44
icculus@5582
    45
#include "SDL_rwops.h"
icculus@5582
    46
icculus@5582
    47
int Android_JNI_FileOpen(SDL_RWops* ctx, const char* fileName, const char* mode);
icculus@5582
    48
long Android_JNI_FileSeek(SDL_RWops* ctx, long offset, int whence);
icculus@5582
    49
size_t Android_JNI_FileRead(SDL_RWops* ctx, void* buffer, size_t size, size_t maxnum);
icculus@5582
    50
size_t Android_JNI_FileWrite(SDL_RWops* ctx, const void* buffer, size_t size, size_t num);
icculus@5582
    51
int Android_JNI_FileClose(SDL_RWops* ctx);
icculus@5582
    52
slouken@6464
    53
/* Clipboard support */
slouken@6464
    54
int Android_JNI_SetClipboardText(const char* text);
slouken@6464
    55
char* Android_JNI_GetClipboardText();
slouken@6464
    56
SDL_bool Android_JNI_HasClipboardText();
slouken@6464
    57
slouken@6448
    58
/* Power support */
slouken@6448
    59
int Android_JNI_GetPowerInfo(int* plugged, int* charged, int* battery, int* seconds, int* percent);
slouken@6448
    60
gabomdq@6354
    61
// Threads
gabomdq@6354
    62
#include <jni.h>
gabomdq@6354
    63
static void Android_JNI_ThreadDestroyed(void*);
gabomdq@6354
    64
JNIEnv *Android_JNI_GetEnv(void);
gabomdq@6354
    65
int Android_JNI_SetupThread(void);
gabomdq@6354
    66
slouken@6392
    67
// Generic messages
slouken@6392
    68
int Android_JNI_SendMessage(int command, int param);
slouken@6392
    69
slouken@4994
    70
/* Ends C function definitions when using C++ */
slouken@4994
    71
#ifdef __cplusplus
slouken@4994
    72
/* *INDENT-OFF* */
slouken@4994
    73
}
slouken@4994
    74
/* *INDENT-ON* */
slouken@4994
    75
#endif
slouken@4994
    76
slouken@4994
    77
/* vi: set ts=4 sw=4 expandtab: */