summaryrefslogtreecommitdiff
path: root/indra/llwindow/llwindowwin32.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/llwindow/llwindowwin32.cpp')
-rw-r--r--indra/llwindow/llwindowwin32.cpp37
1 files changed, 26 insertions, 11 deletions
diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp
index daa1a26b3d..42a88b6cc3 100644
--- a/indra/llwindow/llwindowwin32.cpp
+++ b/indra/llwindow/llwindowwin32.cpp
@@ -1950,19 +1950,34 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
// allow system keys, such as ALT-F4 to be processed by Windows
eat_keystroke = FALSE;
case WM_KEYDOWN:
- if (gDebugWindowProc)
- {
- llinfos << "Debug WindowProc WM_KEYDOWN "
- << " key " << S32(w_param)
- << llendl;
- }
- if (gKeyboard->handleKeyDown(w_param, mask) && eat_keystroke)
{
- return 0;
+ if (gDebugWindowProc)
+ {
+ llinfos << "Debug WindowProc WM_KEYDOWN "
+ << " key " << S32(w_param)
+ << llendl;
+ }
+ // lower 15 bits hold key repeat count
+ S32 key_repeat_count = l_param & 0x7fff;
+ if (key_repeat_count > 1)
+ {
+ KEY translated_key;
+ gKeyboard->translateKey(w_param, &translated_key);
+ if (!gKeyboard->getKeyDown(translated_key))
+ {
+ //RN: hack for handling key repeats when we no longer recognize the key as being down
+ //This is necessary because we sometimes ignore the message queue and use getAsyncKeyState
+ // to clear key level flags before we've processed all key repeat messages
+ return 0;
+ }
+ }
+ if(gKeyboard->handleKeyDown(w_param, mask) && eat_keystroke)
+ {
+ return 0;
+ }
+ // pass on to windows if we didn't handle it
+ break;
}
- // pass on to windows if we didn't handle it
- break;
-
case WM_SYSKEYUP:
eat_keystroke = FALSE;
case WM_KEYUP: