---------------------------------------------------------------------- THIS IS A PATCH FOR WXWINDOWS, NOT FOR BOCHS ---------------------------------------------------------------------- Patch name: patch.wx-raw-keycodes $Revision: 1.2 $ Author: Bryce Denney Date: Mon Apr 8 01:00:09 EDT 2002 [This has been edited to match the version that was checked into wxWindows CVS by Vadim Zeitlin.] Detailed description: This patch adds two 32-bit fields to the wxKeyEvent structure, m_rawCode1 and m_rawCode2. On supported wxWindows ports, these two fields will be filled with the raw key information from the underlying graphic toolkit. On unsupported ports, the value in m_rawCode1 and 2 will be unpredictable. The only ports supported by this patch are wxMSW and wxGTK. wxGTK: I added a few lines in src/gtk/window.cpp to copy the GTK keyval into m_rawCode1 and set m_rawCode2 to zero. When an application receives the key event, it can compare m_rawCode1 against the GTK key symbols such as GDK_C, GDK_colon, GDK_Alt_L, etc. See for the complete list of GTK key symbols. wxMSW: In the MSW port of wxWindows, wxWindowMSW::CreateKeyEvent is used to create key events. The lParam of the keydown/keyup event was already passed into this method, so I added the wParam. Then in CreateKeyEvent I added two lines to fill in the m_rawCode1 and m_rawCode2 fields, as follows: event.m_rawCode1 = (wxUint32) wParam; event.m_rawCode2 = (wxUint32) lParam; Other wxWindows ports: It is trivial to add support for other wxWindows ports. Just find the method that fills in the wxKeyEvent structure, and set m_rawCode1 and m_rawCode2 to the platform-specific value from the raw key event. For GTK and MSW ports, look in src/gtk/window.cpp and src/msw/window.cpp. I haven't looked at the other ports. Patch was created with: diff -ur between two directories Apply patch to what version: wxWindows 2.3.2 Instructions: To patch, go to main wxGTK-2.3.2 directory. Type "patch -p1 < THIS_PATCH_FILE". Notes: If you do not have the complete wxwindows source tree (all ports), you will get warnings when you try to apply the patch. For example, if you downloaded wxMSW, then expect some warnings when it cannot find src/gtk/window.cpp. ---------------------------------------------------------------------- Index: include/wx/event.h =================================================================== RCS file: /home/wxcvs/wxWindows/include/wx/event.h,v retrieving revision 1.136 diff -u -b -r1.136 event.h --- include/wx/event.h 21 Nov 2001 23:48:49 -0000 1.136 +++ include/wx/event.h 8 Apr 2002 04:56:23 -0000 @@ -763,6 +763,14 @@ wxEVT_KEY_UP */ +// 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 + + class WXDLLEXPORT wxKeyEvent : public wxEvent { public: @@ -782,6 +790,12 @@ // 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 { @@ -825,6 +839,8 @@ 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; } @@ -839,6 +855,11 @@ bool m_altDown; 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) Index: include/wx/msw/window.h =================================================================== RCS file: /home/wxcvs/wxWindows/include/wx/msw/window.h,v retrieving revision 1.78 diff -u -b -r1.78 window.h --- include/wx/msw/window.h 3 Nov 2001 21:49:33 -0000 1.78 +++ include/wx/msw/window.h 8 Apr 2002 04:56:23 -0000 @@ -452,7 +452,8 @@ #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 Index: src/gtk/window.cpp =================================================================== RCS file: /home/wxcvs/wxWindows/src/gtk/window.cpp,v retrieving revision 1.342 diff -u -b -r1.342 window.cpp --- src/gtk/window.cpp 22 Nov 2001 11:38:56 -0000 1.342 +++ src/gtk/window.cpp 8 Apr 2002 04:56:26 -0000 @@ -1043,6 +1043,8 @@ 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 ); @@ -1195,6 +1197,8 @@ 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 ); Index: src/msw/treectrl.cpp =================================================================== RCS file: /home/wxcvs/wxWindows/src/msw/treectrl.cpp,v retrieving revision 1.107 diff -u -b -r1.107 treectrl.cpp --- src/msw/treectrl.cpp 1 Dec 2001 12:26:27 -0000 1.107 +++ src/msw/treectrl.cpp 8 Apr 2002 04:56:27 -0000 @@ -2099,13 +2099,12 @@ 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() && Index: src/msw/window.cpp =================================================================== RCS file: /home/wxcvs/wxWindows/src/msw/window.cpp,v retrieving revision 1.273 diff -u -b -r1.273 window.cpp --- src/msw/window.cpp 8 Dec 2001 23:13:27 -0000 1.273 +++ src/msw/window.cpp 8 Apr 2002 04:56:29 -0000 @@ -3779,7 +3779,8 @@ // 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()); @@ -3789,6 +3790,8 @@ 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 @@ -3872,7 +3875,7 @@ 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; @@ -3894,7 +3897,7 @@ 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; }