From: Vadim Zeitlin Date: Sun, 7 Apr 2002 21:06:59 +0000 (+0000) Subject: added raw key code and flags support (based on patch from Bryce Denney) X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/9c7df356f9cdbf99bf09f276d67f0fd65c4ca8ea added raw key code and flags support (based on patch from Bryce Denney) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@15003 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/docs/changes.txt b/docs/changes.txt index a7b4e66116..225e93cceb 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -142,6 +142,7 @@ All (GUI): - added wxImage::SaveFile(filename) method (Chris Elliott) - added wxImage::FloodFill and implemented wxWindowDC::DoFloodFill method for GTK+, Mac, MGL, X11, Motif ports (Chris Elliott) +- added (platform-dependent) scan code to wxKeyEvent (Bryce Denney) wxMSW: diff --git a/include/wx/defs.h b/include/wx/defs.h index 464d617096..be319e0322 100644 --- a/include/wx/defs.h +++ b/include/wx/defs.h @@ -1475,8 +1475,8 @@ enum wxKeyCode WXK_MENU, WXK_PAUSE, WXK_CAPITAL, - WXK_PRIOR, /* Page up */ - WXK_NEXT, /* Page down */ + WXK_PRIOR, // Page up + WXK_NEXT, // Page down WXK_END, WXK_HOME, WXK_LEFT, diff --git a/include/wx/event.h b/include/wx/event.h index 2a2f03b2e3..42ad307d7f 100644 --- a/include/wx/event.h +++ b/include/wx/event.h @@ -783,6 +783,12 @@ public: // get the key code: an ASCII7 char or an element of wxKeyCode enum int GetKeyCode() const { return (int)m_keyCode; } + // get the raw key code (platform-dependent) + wxUint32 GetRawKeyCode() const { return m_rawCode; } + + // get the raw key flags (platform-dependent) + wxUint32 GetRawKeyFlags() const { return m_rawFlags; } + // Find the position of the event void GetPosition(wxCoord *xpos, wxCoord *ypos) const { @@ -826,6 +832,8 @@ public: m_altDown = evt.m_altDown; m_metaDown = evt.m_metaDown; m_scanCode = evt.m_scanCode; + m_rawCode = evt.m_rawCode; + m_rawFlags = evt.m_rawFlags; return *this; } @@ -841,6 +849,11 @@ public: bool m_metaDown; bool m_scanCode; + // these fields contain the platform-specific information about the pressed + // key + wxUint32 m_rawCode; + wxUint32 m_rawFlags; + private: DECLARE_DYNAMIC_CLASS(wxKeyEvent) }; diff --git a/include/wx/features.h b/include/wx/features.h index 25eacf788f..15f9dc9bba 100644 --- a/include/wx/features.h +++ b/include/wx/features.h @@ -20,5 +20,12 @@ #undef wxHAS_RADIO_MENU_ITEMS #endif +// the raw keyboard codes are generated under wxGTK and wxMSW only +#if defined(__WXGTK__) || defined(__WXMSW__) + #define wxHAS_RAW_KEY_CODES +#else + #undef wxHAS_RAW_KEY_CODES +#endif + #endif // _WX_FEATURES_H_ diff --git a/include/wx/msw/window.h b/include/wx/msw/window.h index a43525a245..21baed1557 100644 --- a/include/wx/msw/window.h +++ b/include/wx/msw/window.h @@ -459,7 +459,8 @@ protected: #endif // wxUSE_TOOLTIPS // the helper functions used by HandleChar/KeyXXX methods - wxKeyEvent CreateKeyEvent(wxEventType evType, int id, WXLPARAM lp) const; + wxKeyEvent CreateKeyEvent(wxEventType evType, int id, + WXLPARAM lParam = 0, WXWPARAM wParam = 0) const; private: // common part of all ctors diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index d8285266ab..2699f573a8 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -1003,6 +1003,8 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, event.m_metaDown = (gdk_event->state & GDK_MOD2_MASK); event.m_keyCode = key_code; event.m_scanCode = gdk_event->keyval; + event.m_rawCode = (wxUint32) gdk_event->keyval; + event.m_rawFlags = 0; event.m_x = x; event.m_y = y; event.SetEventObject( win ); @@ -1155,6 +1157,8 @@ static gint gtk_window_key_release_callback( GtkWidget *widget, GdkEventKey *gdk event.m_metaDown = (gdk_event->state & GDK_MOD2_MASK); event.m_keyCode = key_code; event.m_scanCode = gdk_event->keyval; + event.m_rawCode = (wxUint32) gdk_event->keyval; + event.m_rawFlags = 0; event.m_x = x; event.m_y = y; event.SetEventObject( win ); diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index d8285266ab..2699f573a8 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -1003,6 +1003,8 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, event.m_metaDown = (gdk_event->state & GDK_MOD2_MASK); event.m_keyCode = key_code; event.m_scanCode = gdk_event->keyval; + event.m_rawCode = (wxUint32) gdk_event->keyval; + event.m_rawFlags = 0; event.m_x = x; event.m_y = y; event.SetEventObject( win ); @@ -1155,6 +1157,8 @@ static gint gtk_window_key_release_callback( GtkWidget *widget, GdkEventKey *gdk event.m_metaDown = (gdk_event->state & GDK_MOD2_MASK); event.m_keyCode = key_code; event.m_scanCode = gdk_event->keyval; + event.m_rawCode = (wxUint32) gdk_event->keyval; + event.m_rawFlags = 0; event.m_x = x; event.m_y = y; event.SetEventObject( win ); diff --git a/src/msw/treectrl.cpp b/src/msw/treectrl.cpp index ee2a775b34..ef5bc1d065 100644 --- a/src/msw/treectrl.cpp +++ b/src/msw/treectrl.cpp @@ -2302,13 +2302,12 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) eventType = wxEVT_COMMAND_TREE_KEY_DOWN; TV_KEYDOWN *info = (TV_KEYDOWN *)lParam; - // we pass 0 as last CreateKeyEvent() parameter because we + // we pass 0 as 2 last CreateKeyEvent() parameters because we // don't have access to the real key press flags here - but as // it is only used to determin wxKeyEvent::m_altDown flag it's // not too bad event.m_evtKey = CreateKeyEvent(wxEVT_KEY_DOWN, - wxCharCodeMSWToWX(info->wVKey), - 0); + wxCharCodeMSWToWX(info->wVKey)); // a separate event for Space/Return if ( !wxIsCtrlDown() && !wxIsShiftDown() && diff --git a/src/msw/window.cpp b/src/msw/window.cpp index 7e0faddaea..8808c8e64f 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -102,6 +102,10 @@ #endif #endif +// ---------------------------------------------------------------------------- +// standard constants not available with all compilers/headers +// ---------------------------------------------------------------------------- + // This didn't appear in mingw until 2.95.2 #ifndef SIF_TRACKPOS #define SIF_TRACKPOS 16 @@ -117,6 +121,20 @@ #ifndef SPI_GETWHEELSCROLLLINES #define SPI_GETWHEELSCROLLLINES 104 #endif +#endif // wxUSE_MOUSEWHEEL + +#ifndef VK_OEM_1 + #define VK_OEM_1 0xBA + #define VK_OEM_PLUS 0xBB + #define VK_OEM_COMMA 0xBC + #define VK_OEM_MINUS 0xBD + #define VK_OEM_PERIOD 0xBE + #define VK_OEM_2 0xBF + #define VK_OEM_3 0xC0 + #define VK_OEM_4 0xDB + #define VK_OEM_5 0xDC + #define VK_OEM_6 0xDD + #define VK_OEM_7 0xDE #endif // --------------------------------------------------------------------------- @@ -2464,13 +2482,12 @@ long wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam case WM_SYSKEYDOWN: case WM_KEYDOWN: - m_lastKeydownProcessed = FALSE; - // If this has been processed by an event handler, - // return 0 now (we've handled it). - if ( HandleKeyDown((WORD) wParam, lParam) ) + // If this has been processed by an event handler, return 0 now + // (we've handled it). + m_lastKeydownProcessed = HandleKeyDown((WORD) wParam, lParam); + if ( m_lastKeydownProcessed ) { processed = TRUE; - m_lastKeydownProcessed = TRUE; break; } @@ -2483,8 +2500,9 @@ long wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam switch ( wParam ) { - // avoid duplicate messages to OnChar for these ASCII keys: they - // will be translated by TranslateMessage() and received in WM_CHAR + // avoid duplicate messages to OnChar for these ASCII keys: + // they will be translated by TranslateMessage() and received + // in WM_CHAR case VK_ESCAPE: case VK_SPACE: case VK_RETURN: @@ -2492,9 +2510,22 @@ long wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam case VK_TAB: case VK_ADD: case VK_SUBTRACT: - // but set processed to FALSE, not TRUE to still pass them to - // the control's default window proc - otherwise built-in - // keyboard handling won't work + case VK_MULTIPLY: + case VK_DIVIDE: + case VK_OEM_1: + case VK_OEM_2: + case VK_OEM_3: + case VK_OEM_4: + case VK_OEM_5: + case VK_OEM_6: + case VK_OEM_7: + case VK_OEM_PLUS: + case VK_OEM_COMMA: + case VK_OEM_MINUS: + case VK_OEM_PERIOD: + // but set processed to FALSE, not TRUE to still pass them + // to the control's default window proc - otherwise + // built-in keyboard handling won't work processed = FALSE; break; @@ -2518,7 +2549,19 @@ long wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam case VK_DOWN: case VK_UP: default: - processed = HandleChar((WORD)wParam, lParam); + if ( m_lastKeydownProcessed ) + { + // The key was handled in the EVT_KEY_DOWN and handling + // a key in an EVT_KEY_DOWN handler is meant, by + // design, to prevent EVT_CHARs from happening + m_lastKeydownProcessed = FALSE; + processed = TRUE; + } + else // do generate a CHAR event + { + processed = HandleChar((WORD)wParam, lParam); + } + } break; @@ -4006,7 +4049,8 @@ bool wxWindowMSW::HandleMouseWheel(WXWPARAM wParam, WXLPARAM lParam) // HandleChar and HandleKeyDown/Up wxKeyEvent wxWindowMSW::CreateKeyEvent(wxEventType evType, int id, - WXLPARAM lParam) const + WXLPARAM lParam, + WXWPARAM wParam) const { wxKeyEvent event(evType); event.SetId(GetId()); @@ -4016,6 +4060,8 @@ wxKeyEvent wxWindowMSW::CreateKeyEvent(wxEventType evType, event.m_eventObject = (wxWindow *)this; // const_cast event.m_keyCode = id; + event.m_rawCode = (wxUint32) wParam; + event.m_rawFlags = (wxUint32) lParam; event.SetTimestamp(s_currentMsg.time); // translate the position to client coords @@ -4036,14 +4082,6 @@ wxKeyEvent wxWindowMSW::CreateKeyEvent(wxEventType evType, // WM_KEYDOWN one bool wxWindowMSW::HandleChar(WXWPARAM wParam, WXLPARAM lParam, bool isASCII) { - if (m_lastKeydownProcessed) { - // The key was handled in the EVT_KEY_DOWN. Handling a key in an - // EVT_KEY_DOWN handler is meant, by design, to prevent EVT_CHARs - // from happening, so just bail out at this point. - m_lastKeydownProcessed = FALSE; - return TRUE; - } - bool ctrlDown = FALSE; int id; @@ -4069,30 +4107,28 @@ bool wxWindowMSW::HandleChar(WXWPARAM wParam, WXLPARAM lParam, bool isASCII) default: ctrlDown = TRUE; - id = id + 96; + id = id + 'a' - 1; } } } - else if ( (id = wxCharCodeMSWToWX(wParam)) == 0 ) + else // we're called from WM_KEYDOWN { - // it's ASCII and will be processed here only when called from - // WM_CHAR (i.e. when isASCII = TRUE), don't process it now - id = -1; - } - - if ( id != -1 ) - { - wxKeyEvent event(CreateKeyEvent(wxEVT_CHAR, id, lParam)); - if ( ctrlDown ) + id = wxCharCodeMSWToWX(wParam); + if ( id == 0 ) { - event.m_controlDown = TRUE; + // it's ASCII and will be processed here only when called from + // WM_CHAR (i.e. when isASCII = TRUE), don't process it now + return FALSE; } + } - if ( GetEventHandler()->ProcessEvent(event) ) - return TRUE; + wxKeyEvent event(CreateKeyEvent(wxEVT_CHAR, id, lParam, wParam)); + if ( ctrlDown ) + { + event.m_controlDown = TRUE; } - return FALSE; + return GetEventHandler()->ProcessEvent(event); } bool wxWindowMSW::HandleKeyDown(WXWPARAM wParam, WXLPARAM lParam) @@ -4107,7 +4143,7 @@ bool wxWindowMSW::HandleKeyDown(WXWPARAM wParam, WXLPARAM lParam) if ( id != -1 ) // VZ: does this ever happen (FIXME)? { - wxKeyEvent event(CreateKeyEvent(wxEVT_KEY_DOWN, id, lParam)); + wxKeyEvent event(CreateKeyEvent(wxEVT_KEY_DOWN, id, lParam, wParam)); if ( GetEventHandler()->ProcessEvent(event) ) { return TRUE; @@ -4129,7 +4165,7 @@ bool wxWindowMSW::HandleKeyUp(WXWPARAM wParam, WXLPARAM lParam) if ( id != -1 ) // VZ: does this ever happen (FIXME)? { - wxKeyEvent event(CreateKeyEvent(wxEVT_KEY_UP, id, lParam)); + wxKeyEvent event(CreateKeyEvent(wxEVT_KEY_UP, id, lParam, wParam)); if ( GetEventHandler()->ProcessEvent(event) ) return TRUE; } @@ -4358,6 +4394,7 @@ int wxCharCodeMSWToWX(int keySym) case VK_CONTROL: id = WXK_CONTROL; break; case VK_MENU : id = WXK_MENU; break; case VK_PAUSE: id = WXK_PAUSE; break; + case VK_CAPITAL: id = WXK_CAPITAL; break; case VK_SPACE: id = WXK_SPACE; break; case VK_ESCAPE: id = WXK_ESCAPE; break; case VK_PRIOR: id = WXK_PRIOR; break; @@ -4415,6 +4452,19 @@ int wxCharCodeMSWToWX(int keySym) case VK_F24: id = WXK_F24; break; case VK_NUMLOCK: id = WXK_NUMLOCK; break; case VK_SCROLL: id = WXK_SCROLL; break; + + case VK_OEM_1: id = ';'; break; + case VK_OEM_PLUS: id = '+'; break; + case VK_OEM_COMMA: id = ','; break; + case VK_OEM_MINUS: id = '-'; break; + case VK_OEM_PERIOD: id = '.'; break; + case VK_OEM_2: id = '/'; break; + case VK_OEM_3: id = '~'; break; + case VK_OEM_4: id = '['; break; + case VK_OEM_5: id = '\\'; break; + case VK_OEM_6: id = ']'; break; + case VK_OEM_7: id = '\''; break; + default: id = 0; }