View Issue Details

IDProjectCategoryView StatusLast Update
0032101LazarusLCLpublic2020-03-31 21:26
Reporter隆博 Assigned To 
PrioritynormalSeverityminorReproducibilityalways
Status newResolutionopen 
PlatformWindows 
Product Version1.9 (SVN) 
Summary0032101: Memo,Edit Controls : lost input charactors when you enter Unicode via IME. On Windows
Descriptionapp controls lost input charactors when you enter Unicode via IME

patch attached.
TagsNo tags attached.
Fixed in Revision55459, 55461, 55478
LazTarget-
WidgetsetWin32/Win64
Attached Files

Relationships

related to 0030478 resolvedJuha Manninen Cannot input chinese character 
related to 0032088 new Lazarus has no ImeMode property. 
related to 0032731 new SelLength and SelText return incorrect values when there are codepoints outside Unicode BMP 
related to 0036854 closedJuha Manninen New grid IME support patch. 

Activities

隆博

2017-07-03 18:32

reporter  

unicode-input-patch.diff (2,549 bytes)   
Index: components/lazutils/lazutf8.pas
===================================================================
--- components/lazutils/lazutf8.pas	(revision 55431)
+++ components/lazutils/lazutf8.pas	(working copy)
@@ -193,6 +193,7 @@
 function UTF8ToUTF16(const P: PChar; ByteCnt: SizeUInt): UnicodeString; overload;
 function UTF16ToUTF8(const S: UnicodeString): AnsiString; overload;
 function UTF16ToUTF8(const P: PWideChar; WideCnt: SizeUInt): AnsiString; overload;
+function UTF16ToUTF8(W: WORD): AnsiString; overload;
 
 // locale
 procedure LazGetLanguageIDs(var Lang, FallbackLang: String);
@@ -1159,6 +1160,36 @@
   end;
 end;
 
+function UTF16ToUTF8(W: WORD): AnsiString;
+  var C: Cardinal;
+begin
+  Result := '';
+
+  if W < $0080 then      // to single byte UTF-8 char
+    Result := Char(W)
+  else if W < $0800 then // to double byte UTF-8 char
+    Result := Char(%11000000 or ((W and %11111000000) shr 6))
+            + Char(%10000000 or (W and %111111))
+  else if (W < $D800) or (W > $DFFF) then // single wide char UTF-16 char , to triple byte UTF-8 char
+          Result := Char(%11100000 or ((W and %1111000000000000) shr 12))
+                  + Char(%10000000 or ((W and %111111000000) shr 6))
+                  + Char(%10000000 or (W and %111111));
+  if (Length(Result) > 0) then
+     Exit;
+  // double wide char UTF-16 char
+  if ($D800 <= W ) and (W <= $DBFF) then
+  begin
+    C := (W - $D800) shl 10;
+    Result := Char(%11110000 or (C shr 18))
+            + Char(%10000000 or ((C and $3F000) shr 12));
+  end else if ($DC00 <= W ) and (W <= $DFFF) then
+  begin
+    C := (W - $DC00) + $10000;
+    Result := Char(%10000000 or ((C and %111111000000) shr 6))
+            + Char(%10000000 or (C and %111111));
+  end;
+end;
+
 {
   UTF8SwapCase - a "naive" implementation that uses UTF8UpperCase and UTF8LowerCase.
     It serves its purpose and performs OK for short and resonably long strings
Index: lcl/interfaces/win32/win32callback.inc
===================================================================
--- lcl/interfaces/win32/win32callback.inc	(revision 55431)
+++ lcl/interfaces/win32/win32callback.inc	(working copy)
@@ -1120,7 +1120,14 @@
   WS: WideString;
 begin
   Result := False;
+{$IFDEF WINDOWS}
+  if( WindowInfo^.IMEComposed ) then
+    UTF8Char := UTF16ToUTF8(AChar)
+  else
+    UTF8Char := UTF16ToUTF8(WideString(WideChar(AChar)));
+{$ELSE}
   UTF8Char := UTF16ToUTF8(WideString(WideChar(AChar)));
+{$ENDIF}
   OldUTF8Char := UTF8Char;
   if Assigned(lWinControl) then
   begin
unicode-input-patch.diff (2,549 bytes)   

Juha Manninen

2017-07-03 19:12

developer   ~0101469

Last edited: 2017-07-03 19:13

View 2 revisions

I have no idea if your patch works, but the {$IFDEF WINDOWS} is useless.
The code is in win32callback.inc which is part of LCL-Win32 widget bindings. It is used only with Windows.
I also believe you could use the existing functions instead of introducing another competing version of UTF16ToUTF8().
The following function is used by the other UTF16ToUTF8() versions:

 function ConvertUTF16ToUTF8(Dest: PChar; DestCharCount: SizeUInt;
   Src: PWideChar; SrcWideCharCount: SizeUInt; Options: TConvertOptions;
   out ActualCharCount: SizeUInt): TConvertResult;

隆博

2017-07-04 00:32

reporter  

unicode-input-patch2.diff (2,512 bytes)   
Index: components/lazutils/lazutf8.pas
===================================================================
--- components/lazutils/lazutf8.pas	(revision 55431)
+++ components/lazutils/lazutf8.pas	(working copy)
@@ -193,6 +193,7 @@
 function UTF8ToUTF16(const P: PChar; ByteCnt: SizeUInt): UnicodeString; overload;
 function UTF16ToUTF8(const S: UnicodeString): AnsiString; overload;
 function UTF16ToUTF8(const P: PWideChar; WideCnt: SizeUInt): AnsiString; overload;
+function UTF16ToUTF8(W: WORD): AnsiString; overload;
 
 // locale
 procedure LazGetLanguageIDs(var Lang, FallbackLang: String);
@@ -1159,6 +1160,36 @@
   end;
 end;
 
+function UTF16ToUTF8(W: WORD): AnsiString;
+  var C: Cardinal;
+begin
+  Result := '';
+
+  if W < $0080 then      // to single byte UTF-8 char
+    Result := Char(W)
+  else if W < $0800 then // to double byte UTF-8 char
+    Result := Char(%11000000 or ((W and %11111000000) shr 6))
+            + Char(%10000000 or (W and %111111))
+  else if (W < $D800) or (W > $DFFF) then // single wide char UTF-16 char , to triple byte UTF-8 char
+          Result := Char(%11100000 or ((W and %1111000000000000) shr 12))
+                  + Char(%10000000 or ((W and %111111000000) shr 6))
+                  + Char(%10000000 or (W and %111111));
+  if (Length(Result) > 0) then
+     Exit;
+  // double wide char UTF-16 char
+  if ($D800 <= W ) and (W <= $DBFF) then
+  begin
+    C := (W - $D800) shl 10 + $10000;
+    Result := Char(%11110000 or (C shr 18))
+            + Char(%10000000 or ((C and $3F000) shr 12));
+  end else if ($DC00 <= W ) and (W <= $DFFF) then
+  begin
+    C := (W - $DC00);
+    Result := Char(%10000000 or ((C and %111111000000) shr 6))
+            + Char(%10000000 or (C and %111111));
+  end;
+end;
+
 {
   UTF8SwapCase - a "naive" implementation that uses UTF8UpperCase and UTF8LowerCase.
     It serves its purpose and performs OK for short and resonably long strings
Index: lcl/interfaces/win32/win32callback.inc
===================================================================
--- lcl/interfaces/win32/win32callback.inc	(revision 55431)
+++ lcl/interfaces/win32/win32callback.inc	(working copy)
@@ -1120,7 +1120,10 @@
   WS: WideString;
 begin
   Result := False;
-  UTF8Char := UTF16ToUTF8(WideString(WideChar(AChar)));
+  if( WindowInfo^.IMEComposed ) then
+    UTF8Char := UTF16ToUTF8(AChar)
+  else
+    UTF8Char := UTF16ToUTF8(WideString(WideChar(AChar)));
   OldUTF8Char := UTF8Char;
   if Assigned(lWinControl) then
   begin
unicode-input-patch2.diff (2,512 bytes)   

隆博

2017-07-04 00:49

reporter   ~0101481

WM_CHAR message sends one character(WORD) at a time,
ConvertUTF16ToUTF8 discards the character as a broken character.

WM_CHAR, or WM_IME_CHAR messages send Unicode character divided.

The ConvertUTF16ToUTF8 function discards double unicode char from ime input as broken.

Juha Manninen

2017-07-04 20:59

developer   ~0101495

Last edited: 2017-07-05 10:34

View 3 revisions

> The ConvertUTF16ToUTF8 function discards double unicode char from ime input as broken.

The AChar parameter type in your win32callback.inc code is Word. How can it have double unicode chars?
Can you please give examples of Word values that do not work. I cannot test with real IME editor but I can make a simple test program using both ConvertUTF16ToUTF8() versions.

jamie philbrook

2017-07-06 03:51

reporter   ~0101517

I think maybe what is being said is WM_IME_CHAR is a WideChar, that is
a WORD, the WM_CHAR also uses a WORD from the original spec but it really holds
only a Char.

 WM_IME_CHAR can hold single or double character values and is received as a
WORD from the wParam;

 And I think what is being said is the root to the ConvertUTF16ToUTF8 could
be interpreted as only a Char type either way and treats it like a char instead
of a WideChar in the case of a WM_IME_CHAR message..

隆博

2017-07-06 08:21

reporter   ~0101519

Last edited: 2017-07-06 08:28

View 2 revisions

you can try input from 'ime pad' or 'touch keybord'.

right click on taskbar, and enable touch keybord.

input cursol move to lazarus app.
foucus lazarus source code editor or memo1 contorol on your app.

open touch keybord
😊 click
and select Unicode char


How to open the touch keyboard.
When you click the keyboard icon on the task bar
The touch board opens

隆博

2017-07-06 10:16

reporter  

unicode-input-patch-rev3.diff (2,898 bytes)   
Index: components/lazutils/lazutf8.pas
===================================================================
--- components/lazutils/lazutf8.pas	(revision 55452)
+++ components/lazutils/lazutf8.pas	(working copy)
@@ -193,7 +193,10 @@
 function UTF8ToUTF16(const P: PChar; ByteCnt: SizeUInt): UnicodeString; overload;
 function UTF16ToUTF8(const S: UnicodeString): AnsiString; overload;
 function UTF16ToUTF8(const P: PWideChar; WideCnt: SizeUInt): AnsiString; overload;
+function UTF16ToUTF8(W: WORD): AnsiString; overload;
 
+function isUTF16Surrogate(W: WORD): Boolean;
+
 // locale
 procedure LazGetLanguageIDs(var Lang, FallbackLang: String);
 procedure LazGetShortLanguageID(var Lang: String);
@@ -1159,6 +1162,36 @@
   end;
 end;
 
+function UTF16ToUTF8(W: WORD): AnsiString;
+  var C: Cardinal;
+begin
+  Result := '';
+
+  if W < $0080 then      // to single byte UTF-8 char
+    Result := Char(W)
+  else if W < $0800 then // to double byte UTF-8 char
+    Result := Char(%11000000 or ((W and %11111000000) shr 6))
+            + Char(%10000000 or (W and %111111))
+  else if (W < $D800) or (W > $DFFF) then // single wide char UTF-16 char , to triple byte UTF-8 char
+          Result := Char(%11100000 or ((W and %1111000000000000) shr 12))
+                  + Char(%10000000 or ((W and %111111000000) shr 6))
+                  + Char(%10000000 or (W and %111111));
+  if (Length(Result) > 0) then
+     Exit;
+  // double wide char UTF-16 char
+  if ($D800 <= W ) and (W <= $DBFF) then
+  begin
+    C := (W - $D800) shl 10 + $10000;
+    Result := Char(%11110000 or (C shr 18))
+            + Char(%10000000 or ((C and $3F000) shr 12));
+  end else if ($DC00 <= W ) and (W <= $DFFF) then
+  begin
+    C := (W - $DC00);
+    Result := Char(%10000000 or ((C and %111111000000) shr 6))
+            + Char(%10000000 or (C and %111111));
+  end;
+end;
+
 {
   UTF8SwapCase - a "naive" implementation that uses UTF8UpperCase and UTF8LowerCase.
     It serves its purpose and performs OK for short and resonably long strings
@@ -3780,6 +3813,12 @@
     Result := '';
 end;
 
+function isUTF16Surrogate(W: WORD): Boolean;
+begin
+  Result := (($D800 <= W ) and (W <= $DBFF))
+         or (($DC00 <= W ) and (W <= $DFFF));
+end;
+
 procedure LazGetLanguageIDs(var Lang, FallbackLang: String);
 
   {$IFDEF DARWIN}
Index: lcl/interfaces/win32/win32callback.inc
===================================================================
--- lcl/interfaces/win32/win32callback.inc	(revision 55452)
+++ lcl/interfaces/win32/win32callback.inc	(working copy)
@@ -1120,7 +1120,10 @@
   WS: WideString;
 begin
   Result := False;
-  UTF8Char := UTF16ToUTF8(WideString(WideChar(AChar)));
+  if isUTF16Surrogate(AChar) then
+    UTF8Char := UTF16ToUTF8(AChar)
+  else
+    UTF8Char := UTF16ToUTF8(WideString(WideChar(AChar)));
   OldUTF8Char := UTF8Char;
   if Assigned(lWinControl) then
   begin
unicode-input-patch-rev3.diff (2,898 bytes)   

Juha Manninen

2017-07-06 10:38

developer   ~0101531

Last edited: 2017-07-06 11:14

View 4 revisions

> ... the root to the ConvertUTF16ToUTF8 could be interpreted as only a
> Char type either way and treats it like a char instead of a WideChar ...

jamie, that would mean ConvertUTF16ToUTF8 is seriously buggy. How come nobody has noticed?
It must treat its input as WideChar when it converts from UTF16.
Can you please give me a small code snippet demonstrating the bug.

隆博, my development machine has no Windows but I will try with a Windows laptop.
Have you tested with other OS? I guess IME should work in every modern OS.

Hey, looking at the last patch I start to figure out what it does. When AChar is the first part of a surrogate pair your code converts it without waiting for the second part. That cannot be right. Please explain clearly the logic of your code.

隆博

2017-07-06 11:28

reporter  

test-code.zip (251,264 bytes)

隆博

2017-07-06 11:36

reporter   ~0101533

Last edited: 2017-07-06 11:41

View 2 revisions

It is not a character that can be input without IME, so I do not think that checking is necessary.

When checking, it is necessary to cache the previous character.

I'll check it in Debian9 later

Do-wan Kim

2017-07-06 11:38

reporter   ~0101534

+ if isUTF16Surrogate(AChar) then
+ UTF8Char := UTF16ToUTF8(AChar)
+ else
+ UTF8Char := UTF16ToUTF8(WideString(WideChar(AChar))); <- if AChar is double byte, I guess this unicode conversion fails. (word -> widechar)

隆博

2017-07-06 11:54

reporter   ~0101536

With Delphi, you can display salvate pairs in upper and lower words of wpram, even if they are sent at the same time, but I do not know the IME that is currently transmitting such a thing.

隆博

2017-07-06 13:51

reporter   ~0101541

Last edited: 2017-07-07 02:57

View 2 revisions

Debian9 64bit: It seems that user application does not have this problem.

But in debian 9, there was a more important problem that Lazarus source code editor can not to accept non-alphabetic input. (It seems same as 13374)

Juha Manninen

2017-07-06 15:05

developer   ~0101543

> if AChar is double byte, I guess this unicode conversion fails.

Do-wan Kim: AChar is a Word which is double byte by definition.
WideChar is also double byte, that's why it can be typecasted from Word.
A codepoint with UTF-16 encoding can be one WideChar or a surrogate pair consisting of 2 WideChars.
This issue appears to be about surrogate pairs, codepoints outside of BMP.
Please let's be accurate with terminology everybody. Unicode is confusing enough even when right terms are used.

Now the question is if the other WideChar part of the surrogate pair can be found in wParam or lParam.
If it can then the code must changed and refactored properly.
The patches from 隆博 certainly do not work. I can tell it without testing. Did you test them yourself?
Why do you offer patches that do not work for sure? :(

Somebody with knowledge about WinAPI must solve this.

隆博

2017-07-07 03:13

reporter   ~0101561

Last edited: 2017-07-07 03:16

View 3 revisions

Windows 10 I provided a patch that works properly in the Japanese environment.
If you do not work in your environment, reject this patch,
I recommend that you close the bug report.

Juha Manninen

2017-07-07 10:02

developer   ~0101563

> Windows 10 I provided a patch that works properly in the Japanese environment.

Well, you are right. I just tested and it works!
Why it works is a mystery. The conversion of half of a suffogate pair is very wrong but it triggers another code path which takes care of the full character.
I will debug a little...

Sorry about my comment that your patch does not work. I should always test them.

Juha Manninen

2017-07-07 11:58

developer   ~0101568

Last edited: 2017-07-07 12:01

View 2 revisions

Please test with r55459.
The patches from 隆博 helped me understand what must be changed although the conversion in them was totally wrong.

I still don't quite understand why it worked when an emoji was copy/pasted but not when the virtual keyboard was used.
I think the char handling in LCL-Win32 is overly complex and somebody should simplify it, but that is another issue.

Martin Friebe

2017-07-07 21:34

manager   ~0101576

If I read the patch correct, then
  UTF16ToUTF8(W: WORD)
returns 2 times half a utf8 codepoint? First the upper 2 bytes, then the lower 2 bytes of the same codepoint?

In the end the 2 "half" are both written to the text, and will compose a full codepoint.

Does it forward both of those "half" to OnUtf8KeyPress ?

In any case, if the above observation is correct, then I think the patch is wrong. [1]

The LCL should not sent "half" codepoints around. (IMHO) It should cache the 1st half, wait for the 2nd half, and send 1 utf8 codepoint.

[1] Well it emulates the win32 api behaviour perfectly, but the win32 API apparently (?) sends code-units (words), so there are always full code-units.

The LCL (OnUtf8KeyPress) sends codepoints. And those need to be complete.
To emulate the win32 behaviour would be to send each byte (code unit), but that makes no sense.

Juha Manninen

2017-07-07 22:34

developer   ~0101582

Martin, what do you say about r55459?

Ondrej Pokorny

2017-07-07 23:02

developer   ~0101587

> The LCL should not sent "half" codepoints around. (IMHO) It should cache the 1st half, wait for the 2nd half, and send 1 utf8 codepoint.

Unfortunately it doesn't work so. Windows never sends the second part. The correct way to handle it is via ImmGetContext/ImmGetCompositionStringW/ImmReleaseContext.

I am testing around with it - it works well so far.

Ondrej Pokorny

2017-07-07 23:03

developer   ~0101588

> Martin, what do you say about r55459?

The IsSurrogate function always returns false for me. So it doesn't work here (well it works the same before r55459 and after r55459 completely the same).

Do-wan Kim

2017-07-08 03:21

reporter   ~0101592

@Juha I test with test-code example with some modification(unicode<->utf8), it only works with SendMessageW method. I'm using '-ddisableUTF8RTL' switch.

Ondrej Pokorny

2017-07-08 07:22

developer   ~0101593

Please retest with 55461. I kept the "if TCharacter.IsSurrogate(WideChar(OrgCharCode)) then" code although it never triggers for me.

I read the full IME char with ImmGetCompositionStringW and pass it as whole to HandleUnicodeChar (which has a full UTF8 char now and not only one UTF16 part).

Juha Manninen

2017-07-08 11:00

developer   ~0101597

Last edited: 2017-07-08 11:03

View 4 revisions

Ondrej, what can make such a difference?
I am testing with Windows 10 with latest updates, in a virtual machine but that makes no difference.
I debugged again and IsSurrogate() triggers here with emojis outside Unicode BMP.
Then I commented out the whole IsSurrogate() section of your code. ImmGetContext() returns <> 0 but ImmGetCompositionStringW() gives NewKeyLen 0.
The code does not work!
Such inexplicable differences are annoying. Is there an explicit setting in Windows to enable IME?
Anyway now also IsSurrogate() is there and it should work for everybody.
Does it work for 隆博 and Do-wan Kim and others who truly need IME?

Ondrej Pokorny

2017-07-08 11:22

developer   ~0101598

Juha, I don't know. I experience exactly what is described in https://stackoverflow.com/a/40507591/1231269 in section "the sad truth". It's strange that the wParam doesn't go through IsSurrogate, though.

As I see your answer, it's good I kept the IsSurrogate there :)

Btw, does the ImmGetCompositionStringW trigger on the second WM_CHAR with correct NewKeyLen?

Juha Manninen

2017-07-08 12:27

developer   ~0101600

I could trigger NewKeyLen > 0 when I used hand-writing in the virtual keyboard and got "ss". It is not outside BMP but a string with 2 normal "s" letters.
Are we testing the same thing? Are you sure you tried an emoji outside BMP?

Ondrej Pokorny

2017-07-08 13:14

developer   ~0101601

Yes, we are. I tested Japanese input through IME/Japanese keyboard and also emoji. Btw. I can input emojis only with hand-writing in the virtual keyboard. How do you input them otherwise?

(All details: I don't have the latest Windows 10 updates installed because my updates are somehow broken - my Windows 10 refuses to install updates due to some kind of configuration corruption :/ I don't want to reinstall the whole system now.)

Juha Manninen

2017-07-08 17:24

developer   ~0101618

> I tested Japanese input through IME/Japanese keyboard and also emoji.

AFAIK Japanese is inside BMP.

> I can input emojis only with hand-writing in the virtual keyboard.
> How do you input them otherwise?

See the note #0101519 from 隆博. There is a happy face smiley icon which gives you a list of emojis. There are many categories to choose from.
Note: the very basic smiley is still inside BMP.

Martin Friebe

2017-07-08 23:08

manager   ~0101623

I cant test this on my PC (dont have the emoji kbd).

But calling IME functions: What happens if you enter an emoji while an IME is active. e.g. while you enter Japanese?
Test that separate in
1) Memo
2) SynEdit (in the IDE, because SynEdit integrates IME / try both settings in the Option Editor/General/Misc "Ime handled by System" on/off)

Also I am doubtful that ImmGetCompositionStringW is correct:
https://msdn.microsoft.com/en-us/library/windows/desktop/dd318553(v=vs.85).aspx
>> An application calls this function in response to the WM_IME_COMPOSITION or WM_IME_STARTCOMPOSITION message. <<

And ImmGetCompositionStringW is the string in composition, it may still change, and retrieving it means to display a temporary text. (try Japanese Katakana (Full Syn IME on), keep pressing "a")

But if those are integrated into the LCL, then there needs to be some way for components to intercept them first (or synedit will break)

隆博

2017-07-09 02:07

reporter   ~0101624

This problem seems to be solved in revision 55459 (2017-07-07).

Ondrej Pokorny

2017-07-09 07:27

developer  

virtkeyb.png (22,793 bytes)   
virtkeyb.png (22,793 bytes)   

Ondrej Pokorny

2017-07-09 07:30

developer   ~0101625

@Juha: I don't have any emojis in the virtual keyboard (virtkeyb.png) :/

@Martin: You are right. I reverted r55461.

隆博

2017-07-09 07:40

reporter  

keybord-win10.png (17,608 bytes)   
keybord-win10.png (17,608 bytes)   

Juha Manninen

2017-07-09 10:54

developer   ~0101628

Last edited: 2017-07-09 11:41

View 3 revisions

I have a similar keyboard as 隆博, shown in keybord-win10.png.
What makes that difference? A recent Windows update maybe.

> This problem seems to be solved in revision 55459

Cool! I think it can be merged to 1.8 safely. It does not break anything.

Unfortunately codepoints outside BMP cannot be entered in SynEdit.
Option Editor/General/Misc "Ime handled by System" makes no difference.
隆博 and Do-wan Kim, can you please test if the "Ime handled by System" settings has any effect.

SynEdit should be fixed. Getting codepoints right is the minimum requirement for Unicode support.

隆博

2017-07-09 15:46

reporter   ~0101635

UTF8KeyPress is not called in the surrogate pair.

procedure TForm1.Edit1UTF8KeyPress(Sender : TObject; var UTF8Key : TUTF8Char);
  var i : Integer;
      UTF8 : UTF8String;
      s: string;
begin
  UTF8 := UTF8Key;
  s := '';
  for i := low(UTF8) to high(UTF8) do
    s := s + format('%.2X',[BYTE(UTF8[i])]);
  Memo1.Lines.Add('UTF8KeyPress' + ' : ' + s);
end;

Ondrej Pokorny

2017-07-09 17:40

developer   ~0101642

> UTF8KeyPress is not called in the surrogate pair.

This is what I tried to solve with r55461.

Do-wan Kim

2017-07-13 03:13

reporter   ~0101681

No emoji input mode in Korean keyboard, I can't test in code editor.

With example, IME message to synedit doesn't work.

Juha Manninen

2017-07-13 10:40

developer   ~0101686

The IDE's SynEdit uses the UTF8KeyPress event.
When it is fixed, SynEdit starts to work, too. (I hope)

Issue History

Date Modified Username Field Change
2017-07-03 18:32 隆博 New Issue
2017-07-03 18:32 隆博 File Added: unicode-input-patch.diff
2017-07-03 19:12 Juha Manninen Note Added: 0101469
2017-07-03 19:13 Juha Manninen Note Edited: 0101469 View Revisions
2017-07-03 19:14 Juha Manninen Relationship added related to 0032088
2017-07-04 00:32 隆博 File Added: unicode-input-patch2.diff
2017-07-04 00:49 隆博 Note Added: 0101481
2017-07-04 20:59 Juha Manninen Note Added: 0101495
2017-07-04 22:39 Juha Manninen Note Edited: 0101495 View Revisions
2017-07-05 10:34 Juha Manninen Note Edited: 0101495 View Revisions
2017-07-06 03:51 jamie philbrook Note Added: 0101517
2017-07-06 08:21 隆博 Note Added: 0101519
2017-07-06 08:28 隆博 Note Edited: 0101519 View Revisions
2017-07-06 10:16 隆博 File Added: unicode-input-patch-rev3.diff
2017-07-06 10:38 Juha Manninen Note Added: 0101531
2017-07-06 10:40 Juha Manninen Note Edited: 0101531 View Revisions
2017-07-06 10:40 Juha Manninen Note Edited: 0101531 View Revisions
2017-07-06 11:14 Juha Manninen Note Edited: 0101531 View Revisions
2017-07-06 11:28 隆博 File Added: test-code.zip
2017-07-06 11:36 隆博 Note Added: 0101533
2017-07-06 11:38 Do-wan Kim Note Added: 0101534
2017-07-06 11:41 隆博 Note Edited: 0101533 View Revisions
2017-07-06 11:54 隆博 Note Added: 0101536
2017-07-06 13:51 隆博 Note Added: 0101541
2017-07-06 14:45 Juha Manninen Relationship added related to 0030478
2017-07-06 15:05 Juha Manninen Note Added: 0101543
2017-07-07 02:57 隆博 Note Edited: 0101541 View Revisions
2017-07-07 03:13 隆博 Note Added: 0101561
2017-07-07 03:16 隆博 Note Edited: 0101561 View Revisions
2017-07-07 03:16 隆博 Note Edited: 0101561 View Revisions
2017-07-07 10:02 Juha Manninen Note Added: 0101563
2017-07-07 11:58 Juha Manninen LazTarget => -
2017-07-07 11:58 Juha Manninen Note Added: 0101568
2017-07-07 11:58 Juha Manninen Assigned To => Juha Manninen
2017-07-07 11:58 Juha Manninen Status new => feedback
2017-07-07 12:01 Juha Manninen Note Edited: 0101568 View Revisions
2017-07-07 21:34 Martin Friebe Note Added: 0101576
2017-07-07 22:34 Juha Manninen Note Added: 0101582
2017-07-07 23:02 Ondrej Pokorny Note Added: 0101587
2017-07-07 23:03 Ondrej Pokorny Note Added: 0101588
2017-07-08 03:21 Do-wan Kim Note Added: 0101592
2017-07-08 07:22 Ondrej Pokorny Fixed in Revision => 55459, 55461
2017-07-08 07:22 Ondrej Pokorny Note Added: 0101593
2017-07-08 11:00 Juha Manninen Note Added: 0101597
2017-07-08 11:02 Juha Manninen Note Edited: 0101597 View Revisions
2017-07-08 11:03 Juha Manninen Note Edited: 0101597 View Revisions
2017-07-08 11:03 Juha Manninen Note Edited: 0101597 View Revisions
2017-07-08 11:22 Ondrej Pokorny Note Added: 0101598
2017-07-08 12:27 Juha Manninen Note Added: 0101600
2017-07-08 13:14 Ondrej Pokorny Note Added: 0101601
2017-07-08 17:24 Juha Manninen Note Added: 0101618
2017-07-08 23:08 Martin Friebe Note Added: 0101623
2017-07-09 02:07 隆博 Note Added: 0101624
2017-07-09 02:07 隆博 Status feedback => assigned
2017-07-09 07:27 Ondrej Pokorny File Added: virtkeyb.png
2017-07-09 07:30 Ondrej Pokorny Note Added: 0101625
2017-07-09 07:35 Ondrej Pokorny Fixed in Revision 55459, 55461 => 55459, 55461, 55478
2017-07-09 07:40 隆博 File Added: keybord-win10.png
2017-07-09 10:54 Juha Manninen Note Added: 0101628
2017-07-09 10:57 Juha Manninen Note Edited: 0101628 View Revisions
2017-07-09 11:41 Juha Manninen Note Edited: 0101628 View Revisions
2017-07-09 15:46 隆博 Note Added: 0101635
2017-07-09 17:40 Ondrej Pokorny Note Added: 0101642
2017-07-13 03:13 Do-wan Kim Note Added: 0101681
2017-07-13 10:40 Juha Manninen Note Added: 0101686
2017-12-05 19:43 Juha Manninen Relationship added related to 0032731
2017-12-05 19:48 Juha Manninen Assigned To Juha Manninen =>
2017-12-05 19:49 Juha Manninen Status assigned => new
2020-03-31 21:26 Juha Manninen Relationship added related to 0036854