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
This commit is contained in:
Vadim Zeitlin
2002-04-07 21:06:59 +00:00
parent 62fa9712a0
commit 9c7df356f9
9 changed files with 123 additions and 44 deletions

View File

@@ -142,6 +142,7 @@ All (GUI):
- added wxImage::SaveFile(filename) method (Chris Elliott) - added wxImage::SaveFile(filename) method (Chris Elliott)
- added wxImage::FloodFill and implemented wxWindowDC::DoFloodFill method - added wxImage::FloodFill and implemented wxWindowDC::DoFloodFill method
for GTK+, Mac, MGL, X11, Motif ports (Chris Elliott) for GTK+, Mac, MGL, X11, Motif ports (Chris Elliott)
- added (platform-dependent) scan code to wxKeyEvent (Bryce Denney)
wxMSW: wxMSW:

View File

@@ -1475,8 +1475,8 @@ enum wxKeyCode
WXK_MENU, WXK_MENU,
WXK_PAUSE, WXK_PAUSE,
WXK_CAPITAL, WXK_CAPITAL,
WXK_PRIOR, /* Page up */ WXK_PRIOR, // Page up
WXK_NEXT, /* Page down */ WXK_NEXT, // Page down
WXK_END, WXK_END,
WXK_HOME, WXK_HOME,
WXK_LEFT, WXK_LEFT,

View File

@@ -783,6 +783,12 @@ public:
// get the key code: an ASCII7 char or an element of wxKeyCode enum // get the key code: an ASCII7 char or an element of wxKeyCode enum
int GetKeyCode() const { return (int)m_keyCode; } 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 // Find the position of the event
void GetPosition(wxCoord *xpos, wxCoord *ypos) const void GetPosition(wxCoord *xpos, wxCoord *ypos) const
{ {
@@ -826,6 +832,8 @@ public:
m_altDown = evt.m_altDown; m_altDown = evt.m_altDown;
m_metaDown = evt.m_metaDown; m_metaDown = evt.m_metaDown;
m_scanCode = evt.m_scanCode; m_scanCode = evt.m_scanCode;
m_rawCode = evt.m_rawCode;
m_rawFlags = evt.m_rawFlags;
return *this; return *this;
} }
@@ -841,6 +849,11 @@ public:
bool m_metaDown; bool m_metaDown;
bool m_scanCode; bool m_scanCode;
// these fields contain the platform-specific information about the pressed
// key
wxUint32 m_rawCode;
wxUint32 m_rawFlags;
private: private:
DECLARE_DYNAMIC_CLASS(wxKeyEvent) DECLARE_DYNAMIC_CLASS(wxKeyEvent)
}; };

View File

@@ -20,5 +20,12 @@
#undef wxHAS_RADIO_MENU_ITEMS #undef wxHAS_RADIO_MENU_ITEMS
#endif #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_ #endif // _WX_FEATURES_H_

View File

@@ -459,7 +459,8 @@ protected:
#endif // wxUSE_TOOLTIPS #endif // wxUSE_TOOLTIPS
// the helper functions used by HandleChar/KeyXXX methods // 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: private:
// common part of all ctors // common part of all ctors

View 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_metaDown = (gdk_event->state & GDK_MOD2_MASK);
event.m_keyCode = key_code; event.m_keyCode = key_code;
event.m_scanCode = gdk_event->keyval; event.m_scanCode = gdk_event->keyval;
event.m_rawCode = (wxUint32) gdk_event->keyval;
event.m_rawFlags = 0;
event.m_x = x; event.m_x = x;
event.m_y = y; event.m_y = y;
event.SetEventObject( win ); 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_metaDown = (gdk_event->state & GDK_MOD2_MASK);
event.m_keyCode = key_code; event.m_keyCode = key_code;
event.m_scanCode = gdk_event->keyval; event.m_scanCode = gdk_event->keyval;
event.m_rawCode = (wxUint32) gdk_event->keyval;
event.m_rawFlags = 0;
event.m_x = x; event.m_x = x;
event.m_y = y; event.m_y = y;
event.SetEventObject( win ); event.SetEventObject( win );

View 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_metaDown = (gdk_event->state & GDK_MOD2_MASK);
event.m_keyCode = key_code; event.m_keyCode = key_code;
event.m_scanCode = gdk_event->keyval; event.m_scanCode = gdk_event->keyval;
event.m_rawCode = (wxUint32) gdk_event->keyval;
event.m_rawFlags = 0;
event.m_x = x; event.m_x = x;
event.m_y = y; event.m_y = y;
event.SetEventObject( win ); 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_metaDown = (gdk_event->state & GDK_MOD2_MASK);
event.m_keyCode = key_code; event.m_keyCode = key_code;
event.m_scanCode = gdk_event->keyval; event.m_scanCode = gdk_event->keyval;
event.m_rawCode = (wxUint32) gdk_event->keyval;
event.m_rawFlags = 0;
event.m_x = x; event.m_x = x;
event.m_y = y; event.m_y = y;
event.SetEventObject( win ); event.SetEventObject( win );

View File

@@ -2302,13 +2302,12 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
eventType = wxEVT_COMMAND_TREE_KEY_DOWN; eventType = wxEVT_COMMAND_TREE_KEY_DOWN;
TV_KEYDOWN *info = (TV_KEYDOWN *)lParam; 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 // 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 // it is only used to determin wxKeyEvent::m_altDown flag it's
// not too bad // not too bad
event.m_evtKey = CreateKeyEvent(wxEVT_KEY_DOWN, event.m_evtKey = CreateKeyEvent(wxEVT_KEY_DOWN,
wxCharCodeMSWToWX(info->wVKey), wxCharCodeMSWToWX(info->wVKey));
0);
// a separate event for Space/Return // a separate event for Space/Return
if ( !wxIsCtrlDown() && !wxIsShiftDown() && if ( !wxIsCtrlDown() && !wxIsShiftDown() &&

View File

@@ -102,6 +102,10 @@
#endif #endif
#endif #endif
// ----------------------------------------------------------------------------
// standard constants not available with all compilers/headers
// ----------------------------------------------------------------------------
// This didn't appear in mingw until 2.95.2 // This didn't appear in mingw until 2.95.2
#ifndef SIF_TRACKPOS #ifndef SIF_TRACKPOS
#define SIF_TRACKPOS 16 #define SIF_TRACKPOS 16
@@ -117,6 +121,20 @@
#ifndef SPI_GETWHEELSCROLLLINES #ifndef SPI_GETWHEELSCROLLLINES
#define SPI_GETWHEELSCROLLLINES 104 #define SPI_GETWHEELSCROLLLINES 104
#endif #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 #endif
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
@@ -2464,13 +2482,12 @@ long wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam
case WM_SYSKEYDOWN: case WM_SYSKEYDOWN:
case WM_KEYDOWN: case WM_KEYDOWN:
m_lastKeydownProcessed = FALSE; // If this has been processed by an event handler, return 0 now
// If this has been processed by an event handler, // (we've handled it).
// return 0 now (we've handled it). m_lastKeydownProcessed = HandleKeyDown((WORD) wParam, lParam);
if ( HandleKeyDown((WORD) wParam, lParam) ) if ( m_lastKeydownProcessed )
{ {
processed = TRUE; processed = TRUE;
m_lastKeydownProcessed = TRUE;
break; break;
} }
@@ -2483,8 +2500,9 @@ long wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam
switch ( wParam ) switch ( wParam )
{ {
// avoid duplicate messages to OnChar for these ASCII keys: they // avoid duplicate messages to OnChar for these ASCII keys:
// will be translated by TranslateMessage() and received in WM_CHAR // they will be translated by TranslateMessage() and received
// in WM_CHAR
case VK_ESCAPE: case VK_ESCAPE:
case VK_SPACE: case VK_SPACE:
case VK_RETURN: case VK_RETURN:
@@ -2492,9 +2510,22 @@ long wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam
case VK_TAB: case VK_TAB:
case VK_ADD: case VK_ADD:
case VK_SUBTRACT: case VK_SUBTRACT:
// but set processed to FALSE, not TRUE to still pass them to case VK_MULTIPLY:
// the control's default window proc - otherwise built-in case VK_DIVIDE:
// keyboard handling won't work 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; processed = FALSE;
break; break;
@@ -2518,8 +2549,20 @@ long wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam
case VK_DOWN: case VK_DOWN:
case VK_UP: case VK_UP:
default: default:
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); processed = HandleChar((WORD)wParam, lParam);
} }
}
break; break;
case WM_SYSKEYUP: case WM_SYSKEYUP:
@@ -4006,7 +4049,8 @@ bool wxWindowMSW::HandleMouseWheel(WXWPARAM wParam, WXLPARAM lParam)
// HandleChar and HandleKeyDown/Up // HandleChar and HandleKeyDown/Up
wxKeyEvent wxWindowMSW::CreateKeyEvent(wxEventType evType, wxKeyEvent wxWindowMSW::CreateKeyEvent(wxEventType evType,
int id, int id,
WXLPARAM lParam) const WXLPARAM lParam,
WXWPARAM wParam) const
{ {
wxKeyEvent event(evType); wxKeyEvent event(evType);
event.SetId(GetId()); event.SetId(GetId());
@@ -4016,6 +4060,8 @@ wxKeyEvent wxWindowMSW::CreateKeyEvent(wxEventType evType,
event.m_eventObject = (wxWindow *)this; // const_cast event.m_eventObject = (wxWindow *)this; // const_cast
event.m_keyCode = id; event.m_keyCode = id;
event.m_rawCode = (wxUint32) wParam;
event.m_rawFlags = (wxUint32) lParam;
event.SetTimestamp(s_currentMsg.time); event.SetTimestamp(s_currentMsg.time);
// translate the position to client coords // translate the position to client coords
@@ -4036,14 +4082,6 @@ wxKeyEvent wxWindowMSW::CreateKeyEvent(wxEventType evType,
// WM_KEYDOWN one // WM_KEYDOWN one
bool wxWindowMSW::HandleChar(WXWPARAM wParam, WXLPARAM lParam, bool isASCII) 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; bool ctrlDown = FALSE;
int id; int id;
@@ -4069,30 +4107,28 @@ bool wxWindowMSW::HandleChar(WXWPARAM wParam, WXLPARAM lParam, bool isASCII)
default: default:
ctrlDown = TRUE; ctrlDown = TRUE;
id = id + 96; id = id + 'a' - 1;
} }
} }
} }
else if ( (id = wxCharCodeMSWToWX(wParam)) == 0 ) else // we're called from WM_KEYDOWN
{
id = wxCharCodeMSWToWX(wParam);
if ( id == 0 )
{ {
// it's ASCII and will be processed here only when called from // it's ASCII and will be processed here only when called from
// WM_CHAR (i.e. when isASCII = TRUE), don't process it now // WM_CHAR (i.e. when isASCII = TRUE), don't process it now
id = -1; return FALSE;
}
} }
if ( id != -1 ) wxKeyEvent event(CreateKeyEvent(wxEVT_CHAR, id, lParam, wParam));
{
wxKeyEvent event(CreateKeyEvent(wxEVT_CHAR, id, lParam));
if ( ctrlDown ) if ( ctrlDown )
{ {
event.m_controlDown = TRUE; event.m_controlDown = TRUE;
} }
if ( GetEventHandler()->ProcessEvent(event) ) return GetEventHandler()->ProcessEvent(event);
return TRUE;
}
return FALSE;
} }
bool wxWindowMSW::HandleKeyDown(WXWPARAM wParam, WXLPARAM lParam) 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)? 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) ) if ( GetEventHandler()->ProcessEvent(event) )
{ {
return TRUE; return TRUE;
@@ -4129,7 +4165,7 @@ bool wxWindowMSW::HandleKeyUp(WXWPARAM wParam, WXLPARAM lParam)
if ( id != -1 ) // VZ: does this ever happen (FIXME)? 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) ) if ( GetEventHandler()->ProcessEvent(event) )
return TRUE; return TRUE;
} }
@@ -4358,6 +4394,7 @@ int wxCharCodeMSWToWX(int keySym)
case VK_CONTROL: id = WXK_CONTROL; break; case VK_CONTROL: id = WXK_CONTROL; break;
case VK_MENU : id = WXK_MENU; break; case VK_MENU : id = WXK_MENU; break;
case VK_PAUSE: id = WXK_PAUSE; break; case VK_PAUSE: id = WXK_PAUSE; break;
case VK_CAPITAL: id = WXK_CAPITAL; break;
case VK_SPACE: id = WXK_SPACE; break; case VK_SPACE: id = WXK_SPACE; break;
case VK_ESCAPE: id = WXK_ESCAPE; break; case VK_ESCAPE: id = WXK_ESCAPE; break;
case VK_PRIOR: id = WXK_PRIOR; 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_F24: id = WXK_F24; break;
case VK_NUMLOCK: id = WXK_NUMLOCK; break; case VK_NUMLOCK: id = WXK_NUMLOCK; break;
case VK_SCROLL: id = WXK_SCROLL; 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: default:
id = 0; id = 0;
} }