summaryrefslogtreecommitdiffstats
path: root/client/windows
diff options
context:
space:
mode:
authorGal Hammer <ghammer@redhat.com>2011-11-14 12:51:33 +0200
committerUri Lublin <uril@redhat.com>2011-11-24 18:29:55 +0200
commit33be8633f5712062752efe75adc745130a72c4c2 (patch)
treed89477ee104431735db43c821a4d688463fa642b /client/windows
parentcc71891a02dea95f2a65c943c634d3a043c9c394 (diff)
downloadspice-33be8633f5712062752efe75adc745130a72c4c2.tar.gz
spice-33be8633f5712062752efe75adc745130a72c4c2.tar.xz
spice-33be8633f5712062752efe75adc745130a72c4c2.zip
client: handle the redundant right ctrl windows' message send when a alt-gr is pressed bz#709074
Hello, I first updated the translate_key function. It now requires the windows message as parameter (will be used later). It also use the raw wparam and lparam parameters in order to remove the code duplication when calling the function. Gal.
Diffstat (limited to 'client/windows')
-rw-r--r--client/windows/red_window.cpp25
1 files changed, 14 insertions, 11 deletions
diff --git a/client/windows/red_window.cpp b/client/windows/red_window.cpp
index 39960dc7..a4740104 100644
--- a/client/windows/red_window.cpp
+++ b/client/windows/red_window.cpp
@@ -52,12 +52,13 @@ static inline int to_red_mouse_state(WPARAM wParam)
((wParam & MK_RBUTTON) ? SPICE_MOUSE_BUTTON_MASK_RIGHT : 0);
}
-static inline RedKey translate_key(int virtual_key, uint32_t scan, bool escape)
+static inline RedKey translate_key(UINT message, WPARAM wParam, LPARAM lParam)
{
+ uint32_t scan = HIWORD(lParam) & 0xff;
if (scan == 0) {
return REDKEY_INVALID;
}
- switch (virtual_key) {
+ switch (wParam) {
case VK_PAUSE:
return REDKEY_PAUSE;
case VK_SNAPSHOT:
@@ -74,13 +75,16 @@ static inline RedKey translate_key(int virtual_key, uint32_t scan, bool escape)
} else if (scan == 0xf2) {
return REDKEY_KOREAN_HANGUL;
}
+ break;
default:
- //todo: always use vitrtual key
- if (escape) {
- scan += REDKEY_ESCAPE_BASE;
- }
- return (RedKey)scan;
+ break;
+ }
+ // TODO: always use virtual key
+ bool extended = ((HIWORD (lParam) & KF_EXTENDED) != 0);
+ if (extended) {
+ scan += REDKEY_ESCAPE_BASE;
}
+ return (RedKey)scan;
}
static inline void send_filtered_keys(RedWindow* window)
@@ -214,7 +218,7 @@ LRESULT CALLBACK RedWindow_p::WindowProc(HWND hWnd, UINT message, WPARAM wParam,
break;
case WM_SYSKEYDOWN:
case WM_KEYDOWN: {
- RedKey key = translate_key(wParam, HIWORD(lParam) & 0xff, (lParam & (1 << 24)) != 0);
+ RedKey key = translate_key(message, wParam, lParam);
window->get_listener().on_key_press(key);
BYTE key_state[256];
@@ -237,7 +241,7 @@ LRESULT CALLBACK RedWindow_p::WindowProc(HWND hWnd, UINT message, WPARAM wParam,
}
case WM_SYSKEYUP:
case WM_KEYUP: {
- RedKey key = translate_key(wParam, HIWORD(lParam) & 0xff, (lParam & (1 << 24)) != 0);
+ RedKey key = translate_key(message, wParam, lParam);
window->get_listener().on_key_release(key);
break;
}
@@ -1049,8 +1053,7 @@ static LRESULT CALLBACK MessageFilterProc(int nCode, WPARAM wParam, LPARAM lPara
switch (msg->message) {
case WM_SYSKEYUP:
case WM_KEYUP: {
- RedKey key = translate_key(msg->wParam, HIWORD(msg->lParam) & 0xff,
- (msg->lParam & (1 << 24)) != 0);
+ RedKey key = translate_key(msg->message, wParam, lParam);
filtered_up_keys.push_back(key);
break;
}