# HG changeset patch # User Claus Gittinger # Date 1492018234 -7200 # Node ID 9b3128e00e64e70e132ecbffb8bd57cc8d64678b # Parent c88e98d6690e78f15d3a49a0f30baf69b3f97461 #FEATURE by expecco class: WinWorkstation changed: #sendKeyOrButtonEvent:x:y:keyOrButton:state:toViewId: diff -r c88e98d6690e -r 9b3128e00e64 WinWorkstation.st --- a/WinWorkstation.st Wed Apr 12 19:13:22 2017 +0200 +++ b/WinWorkstation.st Wed Apr 12 19:30:34 2017 +0200 @@ -13018,6 +13018,7 @@ int _isMouseEvent = 0; int _isKeyEvent = 0; int _keyCodeOrButtonNr = -1; + int _shifted = 0; int _x = 0, _y = 0; if (__isExternalAddress(targetId)) { @@ -13027,7 +13028,18 @@ _keyCodeOrButtonNr = __intVal(keySymCodeOrButtonNr); } else { if (__isCharacter(keySymCodeOrButtonNr)) { + _keyCodeOrButtonNr = __intVal(__characterVal(keySymCodeOrButtonNr)); +console_printf("code: %d (#%02x)\n", _keyCodeOrButtonNr, _keyCodeOrButtonNr); + if ((_keyCodeOrButtonNr >= 'a') && (_keyCodeOrButtonNr <= 'z')) { + _keyCodeOrButtonNr -= 0x20; +console_printf("code: %d (#%02x)\n", _keyCodeOrButtonNr, _keyCodeOrButtonNr); + } else { + if ((_keyCodeOrButtonNr >= 'A') && (_keyCodeOrButtonNr <= 'Z')) { +console_printf("code: shifted %d (#%02x)\n", _keyCodeOrButtonNr, _keyCodeOrButtonNr); + _shifted = 1; + } + } } else if (keySymCodeOrButtonNr == @symbol(Return)) { _keyCodeOrButtonNr = VK_RETURN; } else if (keySymCodeOrButtonNr == @symbol(Enter)) { @@ -13170,8 +13182,15 @@ console_printf("mouse %08x %d/%d\n", dwFlags | MOUSEEVENTF_ABSOLUTE, _x, _y); mouse_event(dwFlags | MOUSEEVENTF_ABSOLUTE, _x, _y, 0, NULL); } else { -console_printf("keybd %08x %d (%02x)\n", dwFlags, _keyCodeOrButtonNr, _keyCodeOrButtonNr); - keybd_event( 0, _keyCodeOrButtonNr, dwFlags, 0); + if (_shifted) { +console_printf("shifted keybd #%08x %d (#%02x)\n", dwFlags, _keyCodeOrButtonNr, _keyCodeOrButtonNr); + keybd_event( VK_SHIFT, 0 /* _keyCodeOrButtonNr */, 0, 0); + keybd_event( _keyCodeOrButtonNr, 0 /* _keyCodeOrButtonNr */, dwFlags, 0); + keybd_event( VK_SHIFT, 0 /* _keyCodeOrButtonNr */, KEYEVENTF_KEYUP, 0); + } else { +console_printf("keybd #%08x %d (#%02x)\n", dwFlags, _keyCodeOrButtonNr, _keyCodeOrButtonNr); + keybd_event( _keyCodeOrButtonNr, 0 /* _keyCodeOrButtonNr */, dwFlags, 0); + } } } else { rslt = PostMessage(hWnd, msg, wParam, lParam);