centralized key handling, control key handling

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@16653 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Stefan Csomor 2002-08-21 16:07:18 +00:00
parent d1aba6dbbd
commit 12e049f6f0
2 changed files with 164 additions and 96 deletions

View File

@ -1687,34 +1687,34 @@ long wxMacTranslateKey(unsigned char key, unsigned char code)
long retval = key ; long retval = key ;
switch (key) switch (key)
{ {
case 0x01 : case kHomeCharCode :
retval = WXK_HOME; retval = WXK_HOME;
break; break;
case 0x03 : case kEnterCharCode :
retval = WXK_RETURN; retval = WXK_RETURN;
break; break;
case 0x04 : case kEndCharCode :
retval = WXK_END; retval = WXK_END;
break; break;
case 0x05 : case kHelpCharCode :
retval = WXK_HELP; retval = WXK_HELP;
break; break;
case 0x08 : case kBackspaceCharCode :
retval = WXK_BACK; retval = WXK_BACK;
break; break;
case 0x09 : case kTabCharCode :
retval = WXK_TAB; retval = WXK_TAB;
break; break;
case 0x0b : case kPageUpCharCode :
retval = WXK_PAGEUP; retval = WXK_PAGEUP;
break; break;
case 0x0c : case kPageDownCharCode :
retval = WXK_PAGEDOWN; retval = WXK_PAGEDOWN;
break; break;
case 0x0d : case kReturnCharCode :
retval = WXK_RETURN; retval = WXK_RETURN;
break; break;
case 0x10 : case kFunctionKeyCharCode :
{ {
switch( code ) switch( code )
{ {
@ -1766,22 +1766,22 @@ long wxMacTranslateKey(unsigned char key, unsigned char code)
} }
} }
break ; break ;
case 0x1b : case kEscapeCharCode :
retval = WXK_ESCAPE ; retval = WXK_ESCAPE ;
break ; break ;
case 0x1c : case kLeftArrowCharCode :
retval = WXK_LEFT ; retval = WXK_LEFT ;
break ; break ;
case 0x1d : case kRightArrowCharCode :
retval = WXK_RIGHT ; retval = WXK_RIGHT ;
break ; break ;
case 0x1e : case kUpArrowCharCode :
retval = WXK_UP ; retval = WXK_UP ;
break ; break ;
case 0x1f : case kDownArrowCharCode :
retval = WXK_DOWN ; retval = WXK_DOWN ;
break ; break ;
case 0x7F : case kDeleteCharCode :
retval = WXK_DELETE ; retval = WXK_DELETE ;
default: default:
break ; break ;
@ -1803,32 +1803,42 @@ void wxApp::MacHandleKeyDownEvent( WXEVENTREF evr )
} }
else else
{ {
short keycode ; wxWindow* focus = wxWindow::FindFocus() ;
short keychar ;
keychar = short(ev->message & charCodeMask); if ( MacSendKeyDownEvent( focus , ev->message , ev->modifiers , ev->when , ev->where.h , ev->where.v ) == false )
keycode = short(ev->message & keyCodeMask) >> 8 ;
wxWindow* focus = wxWindow::FindFocus() ;
// it is wxWindows Convention to have Ctrl Key Combinations at ASCII char value
if ( (ev->modifiers & controlKey) && keychar >= 0 && keychar < 0x20 )
{
keychar += 0x40 ;
}
long keyval = wxMacTranslateKey(keychar, keycode) ;
if ( MacSendKeyDownEvent( focus , keyval , ev->modifiers , ev->when , ev->where.h , ev->where.v ) == false )
{ {
// has not been handled -> perform default // has not been handled -> perform default
wxControl* control = wxDynamicCast( focus , wxControl ) ; wxControl* control = wxDynamicCast( focus , wxControl ) ;
if ( control && control->GetMacControl() != NULL ) if ( control && control->GetMacControl() != NULL )
{ {
short keycode ;
short keychar ;
keychar = short(ev->message & charCodeMask);
keycode = short(ev->message & keyCodeMask) >> 8 ;
::HandleControlKey( (ControlHandle) control->GetMacControl() , keycode , keychar , ev->modifiers ) ; ::HandleControlKey( (ControlHandle) control->GetMacControl() , keycode , keychar , ev->modifiers ) ;
} }
} }
} }
} }
bool wxApp::MacSendKeyDownEvent( wxWindow* focus , long keyval , long modifiers , long when , short wherex , short wherey ) bool wxApp::MacSendKeyDownEvent( wxWindow* focus , long keymessage , long modifiers , long when , short wherex , short wherey )
{ {
short keycode ;
short keychar ;
keychar = short(keymessage & charCodeMask);
keycode = short(keymessage & keyCodeMask) >> 8 ;
if ( (modifiers & controlKey) )
{
// control interferes with some built-in keys like pgdown, return etc. therefore we remove the controlKey modifier
// and look at the character after
UInt32 state = 0;
UInt32 keyInfo = KeyTranslate((Ptr)GetScriptManagerVariable(smKCHRCache), ( modifiers & (~controlKey)) | keycode, &state);
keychar = short(keyInfo & charCodeMask);
keycode = short(keyInfo & keyCodeMask) >> 8 ;
}
long keyval = wxMacTranslateKey(keychar, keycode) ;
wxKeyEvent event(wxEVT_KEY_DOWN); wxKeyEvent event(wxEVT_KEY_DOWN);
bool handled = false ; bool handled = false ;
event.m_shiftDown = modifiers & shiftKey; event.m_shiftDown = modifiers & shiftKey;
@ -1870,6 +1880,7 @@ bool wxApp::MacSendKeyDownEvent( wxWindow* focus , long keyval , long modifiers
{ {
event.Skip( FALSE ) ; event.Skip( FALSE ) ;
event.SetEventType( wxEVT_CHAR ) ; event.SetEventType( wxEVT_CHAR ) ;
// raw value again
event.m_keyCode = keyval ; event.m_keyCode = keyval ;
handled = focus->GetEventHandler()->ProcessEvent( event ) ; handled = focus->GetEventHandler()->ProcessEvent( event ) ;
@ -1942,25 +1953,27 @@ void wxApp::MacHandleKeyUpEvent( WXEVENTREF evr )
} }
else else
{ {
short keycode ; MacSendKeyUpEvent( wxWindow::FindFocus() , ev->message , ev->modifiers , ev->when , ev->where.h , ev->where.v ) ;
short keychar ;
keychar = short(ev->message & charCodeMask);
keycode = short(ev->message & keyCodeMask) >> 8 ;
// it is wxWindows Convention to have Ctrl Key Combinations at ASCII char value
if ( (ev->modifiers & controlKey) && keychar >= 0 && keychar < 0x20 )
{
keychar += 0x40 ;
}
long keyval = wxMacTranslateKey(keychar, keycode) ;
wxWindow* focus = wxWindow::FindFocus() ;
MacSendKeyUpEvent( focus , keyval , ev->modifiers , ev->when , ev->where.h , ev->where.v ) ;
// we don't have to do anything under classic here
} }
} }
bool wxApp::MacSendKeyUpEvent( wxWindow* focus , long keyval , long modifiers , long when , short wherex , short wherey ) bool wxApp::MacSendKeyUpEvent( wxWindow* focus , long keymessage , long modifiers , long when , short wherex , short wherey )
{ {
short keycode ;
short keychar ;
keychar = short(keymessage & charCodeMask);
keycode = short(keymessage & keyCodeMask) >> 8 ;
if ( (modifiers & controlKey) )
{
// control interferes with some built-in keys like pgdown, return etc. therefore we remove the controlKey modifier
// and look at the character after
UInt32 state = 0;
UInt32 keyInfo = KeyTranslate((Ptr)GetScriptManagerVariable(smKCHRCache), ( modifiers & (~controlKey)) | keycode, &state);
keychar = short(keyInfo & charCodeMask);
keycode = short(keyInfo & keyCodeMask) >> 8 ;
}
long keyval = wxMacTranslateKey(keychar, keycode) ;
bool handled = false ; bool handled = false ;
if ( focus ) if ( focus )
{ {
@ -1969,6 +1982,9 @@ bool wxApp::MacSendKeyUpEvent( wxWindow* focus , long keyval , long modifiers ,
event.m_controlDown = modifiers & controlKey; event.m_controlDown = modifiers & controlKey;
event.m_altDown = modifiers & optionKey; event.m_altDown = modifiers & optionKey;
event.m_metaDown = modifiers & cmdKey; event.m_metaDown = modifiers & cmdKey;
if ( event.m_controlDown )
{
}
event.m_keyCode = wxToupper(keyval ); event.m_keyCode = wxToupper(keyval );
event.m_x = wherex; event.m_x = wherex;
@ -2102,8 +2118,16 @@ void wxApp::MacHandleOSEvent( WXEVENTREF evr )
wxWindow* currentMouseWindow = NULL ; wxWindow* currentMouseWindow = NULL ;
wxWindow::MacGetWindowFromPoint( wxPoint( ev->where.h , ev->where.v ) , if (s_captureWindow )
&currentMouseWindow ) ; {
currentMouseWindow = s_captureWindow ;
}
else
{
wxWindow::MacGetWindowFromPoint( wxPoint( ev->where.h , ev->where.v ) ,
&currentMouseWindow ) ;
}
if ( currentMouseWindow != wxWindow::s_lastMouseWindow ) if ( currentMouseWindow != wxWindow::s_lastMouseWindow )
{ {
wxMouseEvent event ; wxMouseEvent event ;
@ -2143,8 +2167,18 @@ void wxApp::MacHandleOSEvent( WXEVENTREF evr )
wxWindow::s_lastMouseWindow = currentMouseWindow ; wxWindow::s_lastMouseWindow = currentMouseWindow ;
} }
short windowPart = ::FindWindow(ev->where, &window); short windowPart = inNoWindow ;
if ( s_captureWindow )
{
window = (WindowRef) s_captureWindow->MacGetRootWindow() ;
windowPart = inContent ;
}
else
{
windowPart = ::FindWindow(ev->where, &window);
}
switch (windowPart) switch (windowPart)
{ {
case inContent : case inContent :

View File

@ -1687,34 +1687,34 @@ long wxMacTranslateKey(unsigned char key, unsigned char code)
long retval = key ; long retval = key ;
switch (key) switch (key)
{ {
case 0x01 : case kHomeCharCode :
retval = WXK_HOME; retval = WXK_HOME;
break; break;
case 0x03 : case kEnterCharCode :
retval = WXK_RETURN; retval = WXK_RETURN;
break; break;
case 0x04 : case kEndCharCode :
retval = WXK_END; retval = WXK_END;
break; break;
case 0x05 : case kHelpCharCode :
retval = WXK_HELP; retval = WXK_HELP;
break; break;
case 0x08 : case kBackspaceCharCode :
retval = WXK_BACK; retval = WXK_BACK;
break; break;
case 0x09 : case kTabCharCode :
retval = WXK_TAB; retval = WXK_TAB;
break; break;
case 0x0b : case kPageUpCharCode :
retval = WXK_PAGEUP; retval = WXK_PAGEUP;
break; break;
case 0x0c : case kPageDownCharCode :
retval = WXK_PAGEDOWN; retval = WXK_PAGEDOWN;
break; break;
case 0x0d : case kReturnCharCode :
retval = WXK_RETURN; retval = WXK_RETURN;
break; break;
case 0x10 : case kFunctionKeyCharCode :
{ {
switch( code ) switch( code )
{ {
@ -1766,22 +1766,22 @@ long wxMacTranslateKey(unsigned char key, unsigned char code)
} }
} }
break ; break ;
case 0x1b : case kEscapeCharCode :
retval = WXK_ESCAPE ; retval = WXK_ESCAPE ;
break ; break ;
case 0x1c : case kLeftArrowCharCode :
retval = WXK_LEFT ; retval = WXK_LEFT ;
break ; break ;
case 0x1d : case kRightArrowCharCode :
retval = WXK_RIGHT ; retval = WXK_RIGHT ;
break ; break ;
case 0x1e : case kUpArrowCharCode :
retval = WXK_UP ; retval = WXK_UP ;
break ; break ;
case 0x1f : case kDownArrowCharCode :
retval = WXK_DOWN ; retval = WXK_DOWN ;
break ; break ;
case 0x7F : case kDeleteCharCode :
retval = WXK_DELETE ; retval = WXK_DELETE ;
default: default:
break ; break ;
@ -1803,32 +1803,42 @@ void wxApp::MacHandleKeyDownEvent( WXEVENTREF evr )
} }
else else
{ {
short keycode ; wxWindow* focus = wxWindow::FindFocus() ;
short keychar ;
keychar = short(ev->message & charCodeMask); if ( MacSendKeyDownEvent( focus , ev->message , ev->modifiers , ev->when , ev->where.h , ev->where.v ) == false )
keycode = short(ev->message & keyCodeMask) >> 8 ;
wxWindow* focus = wxWindow::FindFocus() ;
// it is wxWindows Convention to have Ctrl Key Combinations at ASCII char value
if ( (ev->modifiers & controlKey) && keychar >= 0 && keychar < 0x20 )
{
keychar += 0x40 ;
}
long keyval = wxMacTranslateKey(keychar, keycode) ;
if ( MacSendKeyDownEvent( focus , keyval , ev->modifiers , ev->when , ev->where.h , ev->where.v ) == false )
{ {
// has not been handled -> perform default // has not been handled -> perform default
wxControl* control = wxDynamicCast( focus , wxControl ) ; wxControl* control = wxDynamicCast( focus , wxControl ) ;
if ( control && control->GetMacControl() != NULL ) if ( control && control->GetMacControl() != NULL )
{ {
short keycode ;
short keychar ;
keychar = short(ev->message & charCodeMask);
keycode = short(ev->message & keyCodeMask) >> 8 ;
::HandleControlKey( (ControlHandle) control->GetMacControl() , keycode , keychar , ev->modifiers ) ; ::HandleControlKey( (ControlHandle) control->GetMacControl() , keycode , keychar , ev->modifiers ) ;
} }
} }
} }
} }
bool wxApp::MacSendKeyDownEvent( wxWindow* focus , long keyval , long modifiers , long when , short wherex , short wherey ) bool wxApp::MacSendKeyDownEvent( wxWindow* focus , long keymessage , long modifiers , long when , short wherex , short wherey )
{ {
short keycode ;
short keychar ;
keychar = short(keymessage & charCodeMask);
keycode = short(keymessage & keyCodeMask) >> 8 ;
if ( (modifiers & controlKey) )
{
// control interferes with some built-in keys like pgdown, return etc. therefore we remove the controlKey modifier
// and look at the character after
UInt32 state = 0;
UInt32 keyInfo = KeyTranslate((Ptr)GetScriptManagerVariable(smKCHRCache), ( modifiers & (~controlKey)) | keycode, &state);
keychar = short(keyInfo & charCodeMask);
keycode = short(keyInfo & keyCodeMask) >> 8 ;
}
long keyval = wxMacTranslateKey(keychar, keycode) ;
wxKeyEvent event(wxEVT_KEY_DOWN); wxKeyEvent event(wxEVT_KEY_DOWN);
bool handled = false ; bool handled = false ;
event.m_shiftDown = modifiers & shiftKey; event.m_shiftDown = modifiers & shiftKey;
@ -1870,6 +1880,7 @@ bool wxApp::MacSendKeyDownEvent( wxWindow* focus , long keyval , long modifiers
{ {
event.Skip( FALSE ) ; event.Skip( FALSE ) ;
event.SetEventType( wxEVT_CHAR ) ; event.SetEventType( wxEVT_CHAR ) ;
// raw value again
event.m_keyCode = keyval ; event.m_keyCode = keyval ;
handled = focus->GetEventHandler()->ProcessEvent( event ) ; handled = focus->GetEventHandler()->ProcessEvent( event ) ;
@ -1942,25 +1953,27 @@ void wxApp::MacHandleKeyUpEvent( WXEVENTREF evr )
} }
else else
{ {
short keycode ; MacSendKeyUpEvent( wxWindow::FindFocus() , ev->message , ev->modifiers , ev->when , ev->where.h , ev->where.v ) ;
short keychar ;
keychar = short(ev->message & charCodeMask);
keycode = short(ev->message & keyCodeMask) >> 8 ;
// it is wxWindows Convention to have Ctrl Key Combinations at ASCII char value
if ( (ev->modifiers & controlKey) && keychar >= 0 && keychar < 0x20 )
{
keychar += 0x40 ;
}
long keyval = wxMacTranslateKey(keychar, keycode) ;
wxWindow* focus = wxWindow::FindFocus() ;
MacSendKeyUpEvent( focus , keyval , ev->modifiers , ev->when , ev->where.h , ev->where.v ) ;
// we don't have to do anything under classic here
} }
} }
bool wxApp::MacSendKeyUpEvent( wxWindow* focus , long keyval , long modifiers , long when , short wherex , short wherey ) bool wxApp::MacSendKeyUpEvent( wxWindow* focus , long keymessage , long modifiers , long when , short wherex , short wherey )
{ {
short keycode ;
short keychar ;
keychar = short(keymessage & charCodeMask);
keycode = short(keymessage & keyCodeMask) >> 8 ;
if ( (modifiers & controlKey) )
{
// control interferes with some built-in keys like pgdown, return etc. therefore we remove the controlKey modifier
// and look at the character after
UInt32 state = 0;
UInt32 keyInfo = KeyTranslate((Ptr)GetScriptManagerVariable(smKCHRCache), ( modifiers & (~controlKey)) | keycode, &state);
keychar = short(keyInfo & charCodeMask);
keycode = short(keyInfo & keyCodeMask) >> 8 ;
}
long keyval = wxMacTranslateKey(keychar, keycode) ;
bool handled = false ; bool handled = false ;
if ( focus ) if ( focus )
{ {
@ -1969,6 +1982,9 @@ bool wxApp::MacSendKeyUpEvent( wxWindow* focus , long keyval , long modifiers ,
event.m_controlDown = modifiers & controlKey; event.m_controlDown = modifiers & controlKey;
event.m_altDown = modifiers & optionKey; event.m_altDown = modifiers & optionKey;
event.m_metaDown = modifiers & cmdKey; event.m_metaDown = modifiers & cmdKey;
if ( event.m_controlDown )
{
}
event.m_keyCode = wxToupper(keyval ); event.m_keyCode = wxToupper(keyval );
event.m_x = wherex; event.m_x = wherex;
@ -2102,8 +2118,16 @@ void wxApp::MacHandleOSEvent( WXEVENTREF evr )
wxWindow* currentMouseWindow = NULL ; wxWindow* currentMouseWindow = NULL ;
wxWindow::MacGetWindowFromPoint( wxPoint( ev->where.h , ev->where.v ) , if (s_captureWindow )
&currentMouseWindow ) ; {
currentMouseWindow = s_captureWindow ;
}
else
{
wxWindow::MacGetWindowFromPoint( wxPoint( ev->where.h , ev->where.v ) ,
&currentMouseWindow ) ;
}
if ( currentMouseWindow != wxWindow::s_lastMouseWindow ) if ( currentMouseWindow != wxWindow::s_lastMouseWindow )
{ {
wxMouseEvent event ; wxMouseEvent event ;
@ -2143,8 +2167,18 @@ void wxApp::MacHandleOSEvent( WXEVENTREF evr )
wxWindow::s_lastMouseWindow = currentMouseWindow ; wxWindow::s_lastMouseWindow = currentMouseWindow ;
} }
short windowPart = ::FindWindow(ev->where, &window); short windowPart = inNoWindow ;
if ( s_captureWindow )
{
window = (WindowRef) s_captureWindow->MacGetRootWindow() ;
windowPart = inContent ;
}
else
{
windowPart = ::FindWindow(ev->where, &window);
}
switch (windowPart) switch (windowPart)
{ {
case inContent : case inContent :