]> git.saurik.com Git - wxWidgets.git/commitdiff
added raw key code and flags support (based on patch from Bryce Denney)
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 7 Apr 2002 21:06:59 +0000 (21:06 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 7 Apr 2002 21:06:59 +0000 (21:06 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@15003 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
include/wx/defs.h
include/wx/event.h
include/wx/features.h
include/wx/msw/window.h
src/gtk/window.cpp
src/gtk1/window.cpp
src/msw/treectrl.cpp
src/msw/window.cpp

index a7b4e66116ce6e335045219b8bf8f402e6cb80fc..225e93ccebd62f22934fab062374c2dd46663204 100644 (file)
@@ -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:
 
index 464d617096cc674f31449a0e74028299f033cd4e..be319e0322a78a56b9dc270ff33680d7d1250f6f 100644 (file)
@@ -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,
index 2a2f03b2e3a6204119f7cd83b4def8fcfba0e073..42ad307d7f11d05e2309aef192e1797e0ff5b01f 100644 (file)
@@ -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)
 };
index 25eacf788f8c80fb7c46f9a40568094ec931016e..15f9dc9bba11e0785f3d8f9b7244aaa58bdf825c 100644 (file)
     #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_
 
index a43525a245d902c7e2d4ea6420da002adac23ec8..21baed1557a7a7a81408a78331cd8f74ffde6128 100644 (file)
@@ -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
index d8285266abc8153e9253fefb7690c99b3a7f1fa8..2699f573a8a81c126d197e7a724024fec8080d23 100644 (file)
@@ -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 );
index d8285266abc8153e9253fefb7690c99b3a7f1fa8..2699f573a8a81c126d197e7a724024fec8080d23 100644 (file)
@@ -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 );
index ee2a775b345b2db3ebfbed41ea8532b6d4b33ece..ef5bc1d0658e526cc08fee357fffd793a236e7cd 100644 (file)
@@ -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() &&
index 7e0faddaea933af6a163e1ca23ee25f63117449f..8808c8e64f291ce147224b2dbb6c4243d7c78ddf 100644 (file)
     #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
     #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;
     }