<AWT Dev> [8] Review request for 7197619 Using modifiers for the dead key detection on Windows
Leonid Romanov
leonid.romanov at oracle.com
Thu Sep 27 03:14:03 PDT 2012
Looks good.
> -----Original Message-----
> From: Alexander Scherbatiy [mailto:alexandr.scherbatiy at oracle.com]
> Sent: Thursday, September 27, 2012 5:07 PM
> To: Leonid Romanov; 'Oleg Pekhovskiy'; awt-dev at openjdk.java.net
> Subject: Re: <AWT Dev> [8] Review request for 7197619 Using modifiers for
> the dead key detection on Windows
>
>
> Could you review the updated fix:
> http://cr.openjdk.java.net/~alexsch/7197619/webrev.03/
>
> The only difference is that the formatting is updated for the line
> 3176 if(isDeadKey){
>
> Thanks,
> Alexandr.
>
>
> On 9/25/2012 10:46 AM, Leonid Romanov wrote:
> > 3176 if(isDeadKey){
> >
> > Please, add space here. Otherwise looks OK, although I'm not an expert
in
> > this area.
> >
> >> -----Original Message-----
> >> From: awt-dev-bounces at openjdk.java.net [mailto:awt-dev-
> >> bounces at openjdk.java.net] On Behalf Of Alexander Scherbatiy
> >> Sent: Thursday, September 20, 2012 6:48 PM
> >> To: Oleg Pekhovskiy; awt-dev at openjdk.java.net; Alexey Utkin
> >> Subject: Re:<AWT Dev> [8] Review request for 7197619 Using modifiers
> for
> >> the dead key detection on Windows
> >>
> >>
> >> Could you review the updated fix:
> >> http://cr.openjdk.java.net/~alexsch/7197619/webrev.02/
> >>
> >> - cast to BOOL type is fixed for the isDeadKey
> >> - isDeadKey parameter is passed by reference in the
> WindowsKeyToJavaChar
> >> method
> >>
> >> Thanks,
> >> Alexandr.
> >>
> >> On 9/19/2012 8:16 PM, Oleg Pekhovskiy wrote:
> >>> Hi Alexander,
> >>>
> >>> let me advice you further changes:
> >>>
> >>> 3397 UINT AwtComponent::WindowsKeyToJavaChar(UINT wkey, UINT
> >>> modifiers, TransOps ops, BOOL *isDeadKey)
> >>> 3398 {
> >>> 3399 static Hashtable transTable("VKEY translations");
> >>> 3400 static Hashtable deadKeyFlagTable("Dead Key Flags");
> >>> 3401 *isDeadKey = FALSE;
> >>> 3402
> >>> 3403 // Try to translate using last saved translation
> >>> 3404 if (ops == LOAD) {
> >>> 3405 void* deadKeyFlag =
> >>>
> >>
> deadKeyFlagTable.remove(reinterpret_cast<void*>(static_cast<INT_PTR>(wke
> >> y)));
> >>> 3406 void* value =
> >>>
> transTable.remove(reinterpret_cast<void*>(static_cast<INT_PTR>(wkey)));
> >>> 3407 if (value != NULL) {
> >>> 3408 *isDeadKey =
> >>> static_cast<UINT>(reinterpret_cast<BOOL>(deadKeyFlag));
> >>> 3409 return
> >>> static_cast<UINT>(reinterpret_cast<INT_PTR>(value));
> >>> 3410 }
> >>> 3411 }
> >>>
> >>> 1. Casting at row 3408 should be corrected to:
> >>>
> >>> static_cast<BOOL>(reinterpret_cast<INT_PTR>(deadKeyFlag))
> >>>
> >>>
> >>> 2. Seems like it makes sense to use a reference instead of a pointer
> > for:
> >>> BOOL *isDeadKey
> >>>
> >>> as this is a required parameter.
> >>>
> >>> Thanks,
> >>> Oleg
> >>>
> >>> 9/19/2012 5:42 PM, Alexander Scherbatiy wrote:
> >>>> Could you review the updated fix:
> >>>> http://cr.openjdk.java.net/~alexsch/7197619/webrev.01/
> >>>>
> >>>> - The WindowsKeyToJavaChar method returns a char as it was before the
> >>>> fix
> >>>> - ToAsciiEx is changed to ToUnicodeEx as it is suggested in the
> > comment.
> >>>> Thanks,
> >>>> Alexandr.
> >>>>
> >>>>
> >>>> On 9/14/2012 9:11 PM, Oleg Pekhovskiy wrote:
> >>>>> Hi Alexander,
> >>>>>
> >>>>> here are my comments:
> >>>>> 1. Why did you decide to make WindowsKeyToJavaChar void? Maybe it
> >>>>> takes sense to leave signature closer to its original look?
> >>>>> 2. Seems like WindowsKeyToJavaChar method could be simplifed
> >>>>> (ToAsciiEx -> ToUnicodeEx, remove MultiByteToWideChar),
> >>>>> like this:
> >>>>>
> >>>>> 3504 WORD wChar[2];
> >>>>> 3505 UINT scancode = ::MapVirtualKey(wkey, 0);
> >>>>> 3506 int converted = ::ToUnicodeEx(wkey, scancode,
keyboardState,
> >>>>> 3507&wChar, 2, 0, GetKeyboardLayout());
> >>>>> 3508
> >>>>> 3509 UINT translation;
> >>>>> 3510 BOOL deadKeyFlag = (converted == 2);
> >>>>> 3511
> >>>>> 3512 // Dead Key
> >>>>> 3513 if (converted< 0) {
> >>>>> 3514 translation = java_awt_event_KeyEvent_CHAR_UNDEFINED;
> >>>>> 3515 } else
> >>>>> 3516 // No translation available -- try known conversions or
> >>>>> else punt.
> >>>>> 3517 if (converted == 0) {
> >>>>> 3518 if (wkey == VK_DELETE) {
> >>>>> 3519 translation = '\177';
> >>>>> 3520 } else
> >>>>> 3521 if (wkey>= VK_NUMPAD0&& wkey<= VK_NUMPAD9) {
> >>>>> 3522 translation = '0' + wkey - VK_NUMPAD0;
> >>>>> 3523 } else {
> >>>>> 3524 translation =
> java_awt_event_KeyEvent_CHAR_UNDEFINED;
> >>>>> 3525 }
> >>>>> 3526 } else
> >>>>> 3527 // the caller expects a Unicode character.
> >>>>> 3528 if (converted> 0) {
> >>>>> 3533 translation = wChar[0];
> >>>>> 3534 }
> >>>>>
> >>>>>
> >>>>> Thanks,
> >>>>> Oleg
> >>>>>
> >>>>>
> >>>>> 9/11/2012 5:24 PM, Alexander Scherbatiy wrote:
> >>>>>> bug:
> http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7197619
> >>>>>> webrev: http://cr.openjdk.java.net/~alexsch/7197619/webrev.00/
> >>>>>>
> >>>>>> Only a virtual key code is used for the dead key detection on
> >>>>>> Windows in the current implementation.
> >>>>>> This does not take into account that dead keys can be pressed with
> >>>>>> modifiers like ctrl+alt+2 (caron dead key) on Hungarian keyboard.
> >>>>>>
> >>>>>> The fix gets isDeadKey flag and a character from the ToAsciiEx
> >>>>>> method and uses them for the windows dead key to java key
> > translation.
> >>>>>> Thanks,
> >>>>>> Alexandr.
> >>>>>>
> >
More information about the awt-dev
mailing list