Android: Starts improving the key input. Now it gets real unicode chars instead of the key name

git-svn-id: trunk@34509 -
This commit is contained in:
sekelsenmat 2011-12-29 23:12:21 +00:00
parent 98159ea9e5
commit b106f80cb9
4 changed files with 42 additions and 17 deletions

View File

@ -44,7 +44,7 @@ function UTF8Length(p: PChar; ByteCount: PtrInt): PtrInt;
function UTF8CharacterToUnicode(p: PChar; out CharLen: integer): Cardinal;
function UnicodeToUTF8(u: cardinal; Buf: PChar): integer; inline;
function UnicodeToUTF8SkipErrors(u: cardinal; Buf: PChar): integer;
function UnicodeToUTF8(u: cardinal): shortstring; inline;
function UnicodeToUTF8(u: cardinal): string;
function UTF8ToDoubleByteString(const s: string): string;
function UTF8ToDoubleByte(UTF8Str: PChar; Len: PtrInt; DBStr: PByte): PtrInt;
function UTF8FindNearestCharStart(UTF8Str: PChar; Len: integer;
@ -340,9 +340,12 @@ begin
end;
end;
function UnicodeToUTF8(u: cardinal): shortstring;
function UnicodeToUTF8(u: cardinal): string;
var
Buf: array[0..6] of Char;
begin
Result[0]:=chr(UnicodeToUTF8(u,@Result[1]));
UnicodeToUTF8SkipErrors(u, @Buf[0]);
Result := StrPas(@Buf[0]);
end;
function UTF8ToDoubleByteString(const s: string): string;

View File

@ -76,12 +76,9 @@ public class LCLActivity extends Activity implements SensorEventListener, Locati
@Override public boolean onKeyUp (int keyCode, KeyEvent event)
{
// First handle the KeyUp event
int eventResult = LCLOnKey(KeyEvent.ACTION_UP, keyCode, event, event.getDisplayLabel());
int eventResult = LCLOnKey(KeyEvent.ACTION_UP, keyCode, event, event.getUnicodeChar());
if ((eventResult & 1) != 0) postInvalidate();
// Now KeyPress
//KeyCharacterMap localMap = event.getKeyCharacterMap();
// Handling of the Back hardware key
super.onKeyUp(keyCode, event);
if ((eventResult & 2) != 0)
@ -174,7 +171,7 @@ public class LCLActivity extends Activity implements SensorEventListener, Locati
public native int LCLOnTouch(float x, float y, int action);
public native int LCLOnCreate(LCLActivity lclactivity);
public native int LCLOnMessageBoxFinished(int Result);
public native int LCLOnKey(int kind, int keyCode, KeyEvent event, char AChar);
public native int LCLOnKey(int kind, int keyCode, KeyEvent event, int AChar);
public native int LCLOnTimer(Runnable timerid);
public native int LCLOnConfigurationChanged(int ANewDPI, int ANewWidth);
public native int LCLOnSensorChanged(int ASensorKind, double[] AValues);

View File

@ -143,6 +143,7 @@ type
procedure AppProcessMessage;
{$endif}
{$ifdef CD_Android}
CombiningAccent: Cardinal;
procedure AndroidDebugLn(AStr: string);
function AndroidKeyCodeToLCLKeyCode(AAndroidKeyCode: Integer): Word;
{$endif}
@ -247,7 +248,7 @@ function Java_com_pascal_lclproject_LCLActivity_LCLOnMessageBoxFinished(
env:PJNIEnv; this:jobject; AResult: jint): jint; cdecl;
function Java_com_pascal_lclproject_LCLActivity_LCLOnKey(
env:PJNIEnv; this:jobject; AKind: jint; AKeyCode: jint;
AEvent: jobject; AChar: jchar): jint; cdecl;
AEvent: jobject; AChar: jint): jint; cdecl;
function Java_com_pascal_lclproject_LCLActivity_LCLOnTimer(
env:PJNIEnv; this:jobject; ATimer: jobject): jint; cdecl;
function Java_com_pascal_lclproject_LCLActivity_LCLOnConfigurationChanged(

View File

@ -30,6 +30,9 @@ const
ACTION_MULTIPLE = 2;
// Keys are in KeyCodes.pas
// from android.view.KeyCharacterMap
COMBINING_ACCENT = $80000000;
function Java_com_pascal_lclproject_LCLActivity_LCLOnTouch(env:PJNIEnv;this:jobject; x, y: single; action: jint): jint; cdecl;
var
lCurForm: TCDNonNativeForm;
@ -136,19 +139,21 @@ end;
function Java_com_pascal_lclproject_LCLActivity_LCLOnKey(
env:PJNIEnv; this:jobject; AKind: jint; AKeyCode: jint;
AEvent: jobject; AChar: jchar): jint; cdecl;
AEvent: jobject; AChar: jint): jint; cdecl;
var
lCurForm: TCDNonNativeForm;
lTarget, lFocusedControl: TWinControl;
lKey: Word;
AWideText: widestring;
lCombinedAChar: jint;
lChar: Cardinal;
AUTF8Text: string;
AUTF8Char: TUTF8Char;
lForm: TCDNonNativeForm;
begin
lChar := Cardinal(AChar);
{$ifdef VerboseCDEvents}
__android_log_write(ANDROID_LOG_INFO,'lclapp',PChar(
Format('[LCLOnKey] called AKind=%d AKeyCode=%x AChar=%s', [AKind, AKeyCode, UTF8Encode(WideChar(AChar))])));
Format('[LCLOnKey] called AKind=%d AKeyCode=%x AChar=%s', [AKind, AKeyCode, UnicodeToUTF8(lChar)])));
{$endif}
eventResult := 0;
@ -160,13 +165,32 @@ begin
ACTION_UP:
begin
CallbackKeyUp(lCurForm, lKey);
if AChar <> 0 then
if (lChar <> 0) and ((COMBINING_ACCENT and lChar) = 0) then
begin
SetLength(AWideText, 1);
AWideText[1] := WideChar(AChar);
AUTF8Text := UTF16ToUTF8(AWideText);
if CDWidgetset.CombiningAccent <> 0 then
begin
(* // Prepare the input
lJavaString :=javaEnvRef^^.NewStringUTF(javaEnvRef, Str);
javaEnvRef^^.SetObjectField(javaEnvRef, javaActivityObject, JavaField_lcltext, lJavaString);
javaEnvRef^^.SetIntField(javaEnvRef, javaActivityObject, javaField_lcltextsize, lFontSize);
// Call the method
javaEnvRef^^.CallVoidMethod(javaEnvRef, javaActivityObject, javaMethod_LCLDoGetTextBounds);
// Read the output
Size.cx := javaEnvRef^^.GetIntField(javaEnvRef, javaActivityObject, javaField_lclwidth);
Size.cy := javaEnvRef^^.GetIntField(javaEnvRef, javaActivityObject, javaField_lclheight);
//
lCombinedAChar := getDeadChar();*)
end;
AUTF8Text := UnicodeToUTF8(lChar);
AUTF8Char := AUTF8Text;
CallbackKeyChar(lCurForm, lKey, AUTF8Char);
CDWidgetset.CombiningAccent := 0;
end
else if (lChar <> 0) and ((COMBINING_ACCENT and lChar) <> 0) then
begin
CDWidgetset.CombiningAccent := lChar;
end;
// Handle the Back hardware key
@ -333,7 +357,7 @@ const NativeMethods: array[0..7] of JNINativeMethod=
signature:'(I)I';
fnPtr:@Java_com_pascal_lclproject_LCLActivity_LCLOnMessageBoxFinished;),
(name:'LCLOnKey';
signature:'(IILandroid/view/KeyEvent;C)I';
signature:'(IILandroid/view/KeyEvent;I)I';
fnPtr:@Java_com_pascal_lclproject_LCLActivity_LCLOnKey;),
(name:'LCLOnTimer';
signature:'(Ljava/lang/Runnable;)I';