From 452d1a76b04ce43e57ce6b83c258bcc9391c7e4f Mon Sep 17 00:00:00 2001 From: Eduardo Bart Date: Tue, 17 Jan 2012 04:24:58 -0200 Subject: [PATCH] fix key events for win32 --- src/framework/const.h | 2 +- src/framework/platform/platformwindow.cpp | 8 ++- src/framework/platform/platformwindow.h | 2 +- src/framework/platform/win32window.cpp | 69 ++++++++++++----------- src/framework/platform/x11window.cpp | 2 +- src/framework/ui/uilineedit.cpp | 3 +- src/framework/ui/uimanager.cpp | 4 +- src/framework/ui/uiwidget.cpp | 10 ++-- src/framework/ui/uiwidget.h | 4 +- src/otclient/ui/uigame.cpp | 2 + 10 files changed, 58 insertions(+), 48 deletions(-) diff --git a/src/framework/const.h b/src/framework/const.h index ddadceae..c7f591d0 100644 --- a/src/framework/const.h +++ b/src/framework/const.h @@ -231,7 +231,7 @@ namespace Fw KeyTextInputEvent, KeyDownInputEvent, KeyPressInputEvent, - KeyReleaseInputEvent, + KeyUpInputEvent, MousePressInputEvent, MouseReleaseInputEvent, MouseMoveInputEvent, diff --git a/src/framework/platform/platformwindow.cpp b/src/framework/platform/platformwindow.cpp index 9cb35ee0..f7481a10 100644 --- a/src/framework/platform/platformwindow.cpp +++ b/src/framework/platform/platformwindow.cpp @@ -31,6 +31,8 @@ WIN32Window window; X11Window window; #endif +#include + PlatformWindow& g_window = window; void PlatformWindow::updateUnmaximizedCoords() @@ -71,7 +73,7 @@ void PlatformWindow::processKeyDown(Fw::Key keyCode) } } -void PlatformWindow::processKeyRelease(Fw::Key keyCode) +void PlatformWindow::processKeyUp(Fw::Key keyCode) { if(keyCode == Fw::KeyUnknown || !m_keysState[keyCode]) return; @@ -86,7 +88,7 @@ void PlatformWindow::processKeyRelease(Fw::Key keyCode) m_inputEvent.keyboardModifiers &= ~Fw::KeyboardShiftModifier; if(m_onInputEvent) { - m_inputEvent.reset(Fw::KeyReleaseInputEvent); + m_inputEvent.reset(Fw::KeyUpInputEvent); m_onInputEvent(m_inputEvent); } } @@ -100,7 +102,7 @@ void PlatformWindow::releaseAllKeys() if(!pressed) continue; - processKeyRelease(keyCode); + processKeyUp(keyCode); } } diff --git a/src/framework/platform/platformwindow.h b/src/framework/platform/platformwindow.h index a65d8c41..66c75516 100644 --- a/src/framework/platform/platformwindow.h +++ b/src/framework/platform/platformwindow.h @@ -93,7 +93,7 @@ protected: void updateUnmaximizedCoords(); void processKeyDown(Fw::Key keyCode); - void processKeyRelease(Fw::Key keyCode); + void processKeyUp(Fw::Key keyCode); void releaseAllKeys(); void fireKeysPress(); diff --git a/src/framework/platform/win32window.cpp b/src/framework/platform/win32window.cpp index 32bf3666..d122eb33 100644 --- a/src/framework/platform/win32window.cpp +++ b/src/framework/platform/win32window.cpp @@ -60,10 +60,13 @@ WIN32Window::WIN32Window() m_keyMap[VK_SNAPSHOT] = Fw::KeyPrintScreen; m_keyMap[VK_PAUSE] = Fw::KeyPause; + m_keyMap[VK_CONTROL] = Fw::KeyCtrl; m_keyMap[VK_LCONTROL] = Fw::KeyCtrl; m_keyMap[VK_RCONTROL] = Fw::KeyCtrl; + m_keyMap[VK_SHIFT] = Fw::KeyShift; m_keyMap[VK_LSHIFT] = Fw::KeyShift; m_keyMap[VK_RSHIFT] = Fw::KeyShift; + m_keyMap[VK_MENU] = Fw::KeyAlt; m_keyMap[VK_LMENU] = Fw::KeyAlt; m_keyMap[VK_RMENU] = Fw::KeyAltGr; m_keyMap[VK_LWIN] = Fw::KeyMeta; @@ -376,6 +379,8 @@ void WIN32Window::maximize() void WIN32Window::poll() { + fireKeysPress(); + for(int i=0;i<2;++i) { MSG msg; if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { @@ -394,13 +399,16 @@ void WIN32Window::poll() LRESULT WIN32Window::windowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { - m_inputEvent.type = Fw::NoInputEvent; - m_inputEvent.mouseButton = Fw::MouseNoButton; - m_inputEvent.keyCode = Fw::KeyUnknown; - m_inputEvent.keyText = ""; - m_inputEvent.mouseMoved = Point(); - m_inputEvent.wheelDirection = Fw::MouseNoWheel; + /* + m_inputEvent.keyboardModifiers = 0; + if(HIWORD(GetKeyState(VK_CONTROL))) + m_inputEvent.keyboardModifiers |= Fw::KeyboardCtrlModifier; + if(HIWORD(GetKeyState(VK_MENU))) + m_inputEvent.keyboardModifiers |= Fw::KeyboardAltModifier; + if(HIWORD(GetKeyState(VK_SHIFT))) + m_inputEvent.keyboardModifiers |= Fw::KeyboardShiftModifier; + */ switch(uMsg) { case WM_ACTIVATE: { @@ -409,9 +417,9 @@ LRESULT WIN32Window::windowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPar } case WM_CHAR: { if(wParam >= 32 && wParam <= 255) { - m_inputEvent.type = Fw::KeyPressInputEvent; - m_inputEvent.keyCode = Fw::KeyUnknown; + m_inputEvent.reset(Fw::KeyTextInputEvent); m_inputEvent.keyText = wParam; + m_onInputEvent(m_inputEvent); } break; } @@ -419,55 +427,63 @@ LRESULT WIN32Window::windowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPar m_onClose(); break; } - case WM_KEYDOWN: + case WM_KEYDOWN: { + processKeyDown(m_keyMap[wParam]); + break; + } case WM_KEYUP: { - if(m_keyMap.find(wParam) != m_keyMap.end()) { - m_inputEvent.type = (uMsg == WM_KEYDOWN) ? Fw::KeyPressInputEvent : Fw::KeyReleaseInputEvent; - m_inputEvent.keyCode = m_keyMap[wParam]; - } + processKeyUp(m_keyMap[wParam]); break; } case WM_LBUTTONDOWN: { - m_inputEvent.type = Fw::MousePressInputEvent; + m_inputEvent.reset(Fw::MousePressInputEvent); m_inputEvent.mouseButton = Fw::MouseLeftButton; + m_onInputEvent(m_inputEvent); break; } case WM_LBUTTONUP: { - m_inputEvent.type = Fw::MouseReleaseInputEvent; + m_inputEvent.reset(Fw::MouseReleaseInputEvent); m_inputEvent.mouseButton = Fw::MouseLeftButton; + m_onInputEvent(m_inputEvent); break; } case WM_MBUTTONDOWN: { - m_inputEvent.type = Fw::MousePressInputEvent; + m_inputEvent.reset(Fw::MousePressInputEvent); m_inputEvent.mouseButton = Fw::MouseMidButton; + m_onInputEvent(m_inputEvent); break; } case WM_MBUTTONUP: { - m_inputEvent.type = Fw::MouseReleaseInputEvent; + m_inputEvent.reset(Fw::MouseReleaseInputEvent); m_inputEvent.mouseButton = Fw::MouseMidButton; + m_onInputEvent(m_inputEvent); break; } case WM_RBUTTONDOWN: { - m_inputEvent.type = Fw::MousePressInputEvent; + m_inputEvent.reset(Fw::MousePressInputEvent); m_inputEvent.mouseButton = Fw::MouseRightButton; + m_onInputEvent(m_inputEvent); break; } case WM_RBUTTONUP: { - m_inputEvent.type = Fw::MouseReleaseInputEvent; + m_inputEvent.reset(Fw::MouseReleaseInputEvent); m_inputEvent.mouseButton = Fw::MouseRightButton; + m_onInputEvent(m_inputEvent); break; } case WM_MOUSEMOVE: { - m_inputEvent.type = Fw::MouseMoveInputEvent; + m_inputEvent.reset(Fw::MouseMoveInputEvent); Point newMousePos(LOWORD(lParam), HIWORD(lParam)); m_inputEvent.mouseMoved = newMousePos - m_inputEvent.mousePos; m_inputEvent.mousePos = newMousePos; + m_onInputEvent(m_inputEvent); break; } case WM_MOUSEWHEEL: { - m_inputEvent.type = Fw::MouseWheelInputEvent; + m_inputEvent.reset(Fw::MouseWheelInputEvent); m_inputEvent.mouseButton = Fw::MouseMidButton; m_inputEvent.wheelDirection = HIWORD(wParam) > 0 ? Fw::MouseWheelUp : Fw::MouseWheelDown; + m_onInputEvent(m_inputEvent); break; } case WM_MOVE: { @@ -496,17 +512,6 @@ LRESULT WIN32Window::windowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPar return DefWindowProc(hWnd, uMsg, wParam, lParam); } - if(m_inputEvent.type != Fw::NoInputEvent) { - m_inputEvent.keyboardModifiers = 0; - if(HIWORD(GetKeyState(VK_CONTROL))) - m_inputEvent.keyboardModifiers |= Fw::KeyboardCtrlModifier; - if(HIWORD(GetKeyState(VK_MENU))) - m_inputEvent.keyboardModifiers |= Fw::KeyboardAltModifier; - if(HIWORD(GetKeyState(VK_SHIFT))) - m_inputEvent.keyboardModifiers |= Fw::KeyboardShiftModifier; - m_onInputEvent(m_inputEvent); - } - return 0; } diff --git a/src/framework/platform/x11window.cpp b/src/framework/platform/x11window.cpp index 70fa984b..20ba5c32 100644 --- a/src/framework/platform/x11window.cpp +++ b/src/framework/platform/x11window.cpp @@ -550,7 +550,7 @@ void X11Window::poll() if(event.type == KeyPress) processKeyDown(keyCode); else if(event.type == KeyRelease) - processKeyRelease(keyCode); + processKeyUp(keyCode); } // call filter because xim will discard KeyPress events when keys still composing diff --git a/src/framework/ui/uilineedit.cpp b/src/framework/ui/uilineedit.cpp index 6c56f0c4..3faafaeb 100644 --- a/src/framework/ui/uilineedit.cpp +++ b/src/framework/ui/uilineedit.cpp @@ -442,7 +442,8 @@ bool UILineEdit::onKeyPress(uchar keyCode, int keyboardModifiers, bool wouldFilt } else return false; return true; - } + } else + dump << "what?"; return false; } diff --git a/src/framework/ui/uimanager.cpp b/src/framework/ui/uimanager.cpp index f2983f7c..927ba502 100644 --- a/src/framework/ui/uimanager.cpp +++ b/src/framework/ui/uimanager.cpp @@ -68,8 +68,8 @@ void UIManager::inputEvent(const InputEvent& event) case Fw::KeyPressInputEvent: m_keyboardReceiver->propagateOnKeyPress(event.keyCode, event.keyboardModifiers, event.wouldFilter); break; - case Fw::KeyReleaseInputEvent: - m_keyboardReceiver->propagateOnKeyRelease(event.keyCode, event.keyboardModifiers); + case Fw::KeyUpInputEvent: + m_keyboardReceiver->propagateOnKeyUp(event.keyCode, event.keyboardModifiers); break; case Fw::MousePressInputEvent: m_keyboardReceiver->propagateOnMousePress(event.mousePos, event.mouseButton); diff --git a/src/framework/ui/uiwidget.cpp b/src/framework/ui/uiwidget.cpp index cc58038b..42ddf4e4 100644 --- a/src/framework/ui/uiwidget.cpp +++ b/src/framework/ui/uiwidget.cpp @@ -1071,9 +1071,9 @@ bool UIWidget::onKeyPress(uchar keyCode, int keyboardModifiers, bool wouldFilter return callLuaField("onKeyPress", keyCode, keyboardModifiers, wouldFilter); } -bool UIWidget::onKeyRelease(uchar keyCode, int keyboardModifiers) +bool UIWidget::onKeyUp(uchar keyCode, int keyboardModifiers) { - return callLuaField("onKeyRelease", keyCode, keyboardModifiers); + return callLuaField("onKeyUp", keyCode, keyboardModifiers); } bool UIWidget::onMousePress(const Point& mousePos, Fw::MouseButton button) @@ -1165,7 +1165,7 @@ bool UIWidget::propagateOnKeyPress(uchar keyCode, int keyboardModifiers, bool wo return onKeyPress(keyCode, keyboardModifiers, wouldFilter); } -bool UIWidget::propagateOnKeyRelease(uchar keyCode, int keyboardModifiers) +bool UIWidget::propagateOnKeyUp(uchar keyCode, int keyboardModifiers) { // do a backup of children list, because it may change while looping it UIWidgetList children; @@ -1180,11 +1180,11 @@ bool UIWidget::propagateOnKeyRelease(uchar keyCode, int keyboardModifiers) } for(const UIWidgetPtr& child : children) { - if(child->propagateOnKeyRelease(keyCode, keyboardModifiers)) + if(child->propagateOnKeyUp(keyCode, keyboardModifiers)) return true; } - return onKeyRelease(keyCode, keyboardModifiers); + return onKeyUp(keyCode, keyboardModifiers); } bool UIWidget::propagateOnMousePress(const Point& mousePos, Fw::MouseButton button) diff --git a/src/framework/ui/uiwidget.h b/src/framework/ui/uiwidget.h index 962fb705..afb88065 100644 --- a/src/framework/ui/uiwidget.h +++ b/src/framework/ui/uiwidget.h @@ -164,7 +164,7 @@ protected: virtual bool onKeyText(const std::string& keyText); virtual bool onKeyDown(uchar keyCode, int keyboardModifiers); virtual bool onKeyPress(uchar keyCode, int keyboardModifiers, bool wouldFilter); - virtual bool onKeyRelease(uchar keyCode, int keyboardModifiers); + virtual bool onKeyUp(uchar keyCode, int keyboardModifiers); virtual bool onMousePress(const Point& mousePos, Fw::MouseButton button); virtual void onMouseRelease(const Point& mousePos, Fw::MouseButton button); virtual bool onMouseMove(const Point& mousePos, const Point& mouseMoved); @@ -173,7 +173,7 @@ protected: bool propagateOnKeyText(const std::string& keyText); bool propagateOnKeyDown(uchar keyCode, int keyboardModifiers); bool propagateOnKeyPress(uchar keyCode, int keyboardModifiers, bool wouldFilter); - bool propagateOnKeyRelease(uchar keyCode, int keyboardModifiers); + bool propagateOnKeyUp(uchar keyCode, int keyboardModifiers); bool propagateOnMousePress(const Point& mousePos, Fw::MouseButton button); void propagateOnMouseRelease(const Point& mousePos, Fw::MouseButton button); bool propagateOnMouseMove(const Point& mousePos, const Point& mouseMoved); diff --git a/src/otclient/ui/uigame.cpp b/src/otclient/ui/uigame.cpp index 676db3e9..ded52551 100644 --- a/src/otclient/ui/uigame.cpp +++ b/src/otclient/ui/uigame.cpp @@ -57,6 +57,8 @@ bool UIGame::onKeyPress(uchar keyCode, int keyboardModifiers, bool wouldFilter) } else if(keyCode == Fw::KeyNumpad7) { g_game.walk(Otc::NorthWest); return true; + } else if(wouldFilter) { + return false; } else if(keyCode == Fw::KeyReturn || keyCode == Fw::KeyEnter) { g_game.talk(chatLineEdit->getText()); chatLineEdit->clearText();