/* GWEN Copyright (c) 2011 Facepunch Studios See license in Gwen.h */ #ifndef GWEN_INPUT_WINDOWS_H #define GWEN_INPUT_WINDOWS_H #include "Gwen/InputHandler.h" #include "Gwen/Gwen.h" #include "Gwen/Controls/Canvas.h" #include namespace Gwen { namespace Input { class Windows { public: Windows() { m_Canvas = NULL; m_MouseX = 0; m_MouseY = 0; } void Initialize(Gwen::Controls::Canvas* c) { m_Canvas = c; } bool ProcessMessage(MSG msg) { if (!m_Canvas) return false; switch (msg.message) { case WM_MOUSEMOVE: { int x = (signed short)LOWORD(msg.lParam); int y = (signed short)HIWORD(msg.lParam); int dx = x - m_MouseX; int dy = y - m_MouseY; m_MouseX = x; m_MouseY = y; return m_Canvas->InputMouseMoved(x, y, dx, dy); } case WM_CHAR: { Gwen::UnicodeChar chr = (Gwen::UnicodeChar)msg.wParam; return m_Canvas->InputCharacter(chr); } case WM_MOUSEWHEEL: { return m_Canvas->InputMouseWheel((short)HIWORD(msg.wParam)); } case WM_LBUTTONDOWN: { SetCapture(msg.hwnd); return m_Canvas->InputMouseButton(0, true); } case WM_LBUTTONUP: { ReleaseCapture(); return m_Canvas->InputMouseButton(0, false); } case WM_RBUTTONDOWN: { SetCapture(msg.hwnd); return m_Canvas->InputMouseButton(1, true); } case WM_RBUTTONUP: { ReleaseCapture(); return m_Canvas->InputMouseButton(1, false); } case WM_MBUTTONDOWN: { SetCapture(msg.hwnd); return m_Canvas->InputMouseButton(2, true); } case WM_MBUTTONUP: { ReleaseCapture(); return m_Canvas->InputMouseButton(2, true); } case WM_LBUTTONDBLCLK: case WM_RBUTTONDBLCLK: case WM_MBUTTONDBLCLK: { // Filter out those events from the application return true; } case WM_KEYDOWN: case WM_KEYUP: { bool bDown = msg.message == WM_KEYDOWN; int iKey = -1; // These aren't sent by WM_CHAR when CTRL is down - but we need // them internally for copy and paste etc.. if (bDown && GetKeyState(VK_CONTROL) & 0x80 && msg.wParam >= 'A' && msg.wParam <= 'Z') { Gwen::UnicodeChar chr = (Gwen::UnicodeChar)msg.wParam; return m_Canvas->InputCharacter(chr); } if (msg.wParam == VK_SHIFT) iKey = Gwen::Key::Shift; else if (msg.wParam == VK_RETURN) iKey = Gwen::Key::Return; else if (msg.wParam == VK_BACK) iKey = Gwen::Key::Backspace; else if (msg.wParam == VK_DELETE) iKey = Gwen::Key::Delete; else if (msg.wParam == VK_LEFT) iKey = Gwen::Key::Left; else if (msg.wParam == VK_RIGHT) iKey = Gwen::Key::Right; else if (msg.wParam == VK_TAB) iKey = Gwen::Key::Tab; else if (msg.wParam == VK_SPACE) iKey = Gwen::Key::Space; else if (msg.wParam == VK_HOME) iKey = Gwen::Key::Home; else if (msg.wParam == VK_END) iKey = Gwen::Key::End; else if (msg.wParam == VK_CONTROL) iKey = Gwen::Key::Control; else if (msg.wParam == VK_SPACE) iKey = Gwen::Key::Space; else if (msg.wParam == VK_UP) iKey = Gwen::Key::Up; else if (msg.wParam == VK_DOWN) iKey = Gwen::Key::Down; if (iKey != -1) { return m_Canvas->InputKey(iKey, bDown); } break; } default: { break; } } return false; } protected: Gwen::Controls::Canvas* m_Canvas; int m_MouseX; int m_MouseY; }; } // namespace Input } // namespace Gwen #endif