A couple of fixes to wxMGL's wxWindow:
1. fixed caret interference when painting the window 2. now calls SetFocus when you click on a window that doesn't have focus 3. hopefully correct translations of event for OnKeyDown vs. OnKey git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@13864 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -172,6 +172,10 @@ static ibool MGLAPI wxWindowMouseHandler(window_t *wnd, event_t *e)
|
||||
else if ( e->message & EVT_RIGHTBMASK )
|
||||
type = (e->message & EVT_DBLCLICK) ?
|
||||
wxEVT_RIGHT_DCLICK : wxEVT_RIGHT_DOWN;
|
||||
|
||||
if ( win->AcceptsFocus() && wxWindow::FindFocus() != win )
|
||||
win->SetFocus();
|
||||
|
||||
break;
|
||||
|
||||
case EVT_MOUSEUP:
|
||||
@@ -246,7 +250,7 @@ static ibool MGLAPI wxWindowMouseHandler(window_t *wnd, event_t *e)
|
||||
}
|
||||
}
|
||||
|
||||
static long wxScanToKeyCode(event_t *event)
|
||||
static long wxScanToKeyCode(event_t *event, bool translate)
|
||||
{
|
||||
// VS: make it __WXDEBUG__-only, since we have lots of wxLogTrace calls
|
||||
// here and the arguments would be stored in non-debug executable even
|
||||
@@ -264,13 +268,16 @@ static long wxScanToKeyCode(event_t *event)
|
||||
#endif
|
||||
|
||||
long key = 0;
|
||||
|
||||
if ( translate )
|
||||
{
|
||||
switch ( EVT_scanCode(event->message) )
|
||||
{
|
||||
KEY (KB_padEnter, WXK_NUMPAD_ENTER)
|
||||
KEY (KB_padMinus, WXK_NUMPAD_SUBTRACT)
|
||||
KEY (KB_padPlus, WXK_NUMPAD_ADD)
|
||||
KEY (KB_padTimes, WXK_NUMPAD_MULTIPLY)
|
||||
KEY (KB_padDivide, WXK_NUMPAD_DIVIDE)
|
||||
KEY (KB_padCenter, WXK_NUMPAD_SEPARATOR) // ?
|
||||
KEY (KB_padLeft, WXK_NUMPAD_LEFT)
|
||||
KEY (KB_padRight, WXK_NUMPAD_RIGHT)
|
||||
KEY (KB_padUp, WXK_NUMPAD_UP)
|
||||
@@ -283,7 +290,64 @@ static long wxScanToKeyCode(event_t *event)
|
||||
//KEY (KB_padPageUp, WXK_NUMPAD_PRIOR)
|
||||
KEY (KB_padPageDown, WXK_NUMPAD_PAGEDOWN)
|
||||
//KEY (KB_padPageDown, WXK_NUMPAD_NEXT)
|
||||
KEY (KB_padCenter, WXK_NUMPAD_SEPARATOR) // ?
|
||||
KEY (KB_1, '1')
|
||||
KEY (KB_2, '2')
|
||||
KEY (KB_3, '3')
|
||||
KEY (KB_4, '4')
|
||||
KEY (KB_5, '5')
|
||||
KEY (KB_6, '6')
|
||||
KEY (KB_7, '7')
|
||||
KEY (KB_8, '8')
|
||||
KEY (KB_9, '9')
|
||||
KEY (KB_0, '0')
|
||||
KEY (KB_minus, WXK_SUBTRACT)
|
||||
KEY (KB_equals, WXK_ADD)
|
||||
KEY (KB_backSlash, '\\')
|
||||
KEY (KB_Q, 'Q')
|
||||
KEY (KB_W, 'W')
|
||||
KEY (KB_E, 'E')
|
||||
KEY (KB_R, 'R')
|
||||
KEY (KB_T, 'T')
|
||||
KEY (KB_Y, 'Y')
|
||||
KEY (KB_U, 'U')
|
||||
KEY (KB_I, 'I')
|
||||
KEY (KB_O, 'O')
|
||||
KEY (KB_P, 'P')
|
||||
KEY (KB_leftSquareBrace,'[')
|
||||
KEY (KB_rightSquareBrace,']')
|
||||
KEY (KB_A, 'A')
|
||||
KEY (KB_S, 'S')
|
||||
KEY (KB_D, 'D')
|
||||
KEY (KB_F, 'F')
|
||||
KEY (KB_G, 'G')
|
||||
KEY (KB_H, 'H')
|
||||
KEY (KB_J, 'J')
|
||||
KEY (KB_K, 'K')
|
||||
KEY (KB_L, 'L')
|
||||
KEY (KB_semicolon, ';')
|
||||
KEY (KB_apostrophe, '\'')
|
||||
KEY (KB_Z, 'Z')
|
||||
KEY (KB_X, 'X')
|
||||
KEY (KB_C, 'C')
|
||||
KEY (KB_V, 'V')
|
||||
KEY (KB_B, 'B')
|
||||
KEY (KB_N, 'N')
|
||||
KEY (KB_M, 'M')
|
||||
KEY (KB_comma, ',')
|
||||
KEY (KB_period, '.')
|
||||
KEY (KB_divide, WXK_DIVIDE)
|
||||
KEY (KB_space, WXK_SPACE)
|
||||
KEY (KB_tilde, '~')
|
||||
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
if ( key == 0 )
|
||||
{
|
||||
switch ( EVT_scanCode(event->message) )
|
||||
{
|
||||
KEY (KB_padEnter, WXK_NUMPAD_ENTER)
|
||||
KEY (KB_F1, WXK_F1)
|
||||
KEY (KB_F2, WXK_F2)
|
||||
KEY (KB_F3, WXK_F3)
|
||||
@@ -320,73 +384,21 @@ static long wxScanToKeyCode(event_t *event)
|
||||
KEY (KB_menu, WXK_MENU)
|
||||
KEY (KB_sysReq, WXK_SNAPSHOT)
|
||||
KEY (KB_esc, WXK_ESCAPE)
|
||||
KEY (KB_1, '1')
|
||||
KEY (KB_2, '2')
|
||||
KEY (KB_3, '3')
|
||||
KEY (KB_4, '4')
|
||||
KEY (KB_5, '5')
|
||||
KEY (KB_6, '6')
|
||||
KEY (KB_7, '7')
|
||||
KEY (KB_8, '8')
|
||||
KEY (KB_9, '9')
|
||||
KEY (KB_0, '0')
|
||||
KEY (KB_minus, WXK_SUBTRACT)
|
||||
KEY (KB_equals, WXK_ADD)
|
||||
KEY (KB_backSlash, '\\')
|
||||
KEY (KB_backspace, WXK_BACK)
|
||||
KEY (KB_tab, WXK_TAB)
|
||||
KEY (KB_Q, 'Q')
|
||||
KEY (KB_W, 'W')
|
||||
KEY (KB_E, 'E')
|
||||
KEY (KB_R, 'R')
|
||||
KEY (KB_T, 'T')
|
||||
KEY (KB_Y, 'Y')
|
||||
KEY (KB_U, 'U')
|
||||
KEY (KB_I, 'I')
|
||||
KEY (KB_O, 'O')
|
||||
KEY (KB_P, 'P')
|
||||
KEY (KB_leftSquareBrace,'[')
|
||||
KEY (KB_rightSquareBrace,']')
|
||||
KEY (KB_enter, WXK_RETURN)
|
||||
KEY (KB_A, 'A')
|
||||
KEY (KB_S, 'S')
|
||||
KEY (KB_D, 'D')
|
||||
KEY (KB_F, 'F')
|
||||
KEY (KB_G, 'G')
|
||||
KEY (KB_H, 'H')
|
||||
KEY (KB_J, 'J')
|
||||
KEY (KB_K, 'K')
|
||||
KEY (KB_L, 'L')
|
||||
KEY (KB_semicolon, ';')
|
||||
KEY (KB_apostrophe, '\'')
|
||||
KEY (KB_Z, 'Z')
|
||||
KEY (KB_X, 'X')
|
||||
KEY (KB_C, 'C')
|
||||
KEY (KB_V, 'V')
|
||||
KEY (KB_B, 'B')
|
||||
KEY (KB_N, 'N')
|
||||
KEY (KB_M, 'M')
|
||||
KEY (KB_comma, ',')
|
||||
KEY (KB_period, '.')
|
||||
KEY (KB_divide, WXK_DIVIDE)
|
||||
KEY (KB_space, WXK_SPACE)
|
||||
KEY (KB_tilde, '~')
|
||||
|
||||
default:
|
||||
key = EVT_asciiCode(event->message);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#undef KEY
|
||||
|
||||
return key;
|
||||
}
|
||||
|
||||
static long wxAsciiToKeyCode(event_t *event)
|
||||
{
|
||||
return (long)EVT_asciiCode(event->message);
|
||||
}
|
||||
|
||||
static ibool MGLAPI wxWindowKeybHandler(window_t *wnd, event_t *e)
|
||||
{
|
||||
wxWindowMGL *win = (wxWindowMGL*)MGL_wmGetWindowUserData(wnd);
|
||||
@@ -400,7 +412,7 @@ static ibool MGLAPI wxWindowKeybHandler(window_t *wnd, event_t *e)
|
||||
wxKeyEvent event;
|
||||
event.SetEventObject(win);
|
||||
event.SetTimestamp(e->when);
|
||||
event.m_keyCode = wxScanToKeyCode(e);
|
||||
event.m_keyCode = wxScanToKeyCode(e, TRUE);
|
||||
event.m_scanCode = 0; // not used by wx at all
|
||||
event.m_x = where.x;
|
||||
event.m_y = where.y;
|
||||
@@ -453,7 +465,7 @@ static ibool MGLAPI wxWindowKeybHandler(window_t *wnd, event_t *e)
|
||||
// wxMSW doesn't send char events with Alt pressed
|
||||
// Only send wxEVT_CHAR event if not processed yet. Thus, ALT-x
|
||||
// will only be sent if it is not in an accelerator table.
|
||||
event2.m_keyCode = wxAsciiToKeyCode(e);
|
||||
event2.m_keyCode = wxScanToKeyCode(e, FALSE);
|
||||
if ( !ret && event2.m_keyCode != 0 )
|
||||
{
|
||||
event2.SetEventType(wxEVT_CHAR);
|
||||
@@ -462,7 +474,6 @@ static ibool MGLAPI wxWindowKeybHandler(window_t *wnd, event_t *e)
|
||||
|
||||
// Synthetize navigation key event, but do it only if the TAB key
|
||||
// wasn't handled yet.
|
||||
// FIXME_MGL - isn't this wxUniv's business?
|
||||
if ( !ret && event.m_keyCode == WXK_TAB &&
|
||||
win->GetParent() && win->GetParent()->HasFlag(wxTAB_TRAVERSAL) )
|
||||
{
|
||||
@@ -1126,6 +1137,13 @@ void wxWindowMGL::HandlePaint(MGLDevCtx *dc)
|
||||
m_updateRegion = wxRegion(clip);
|
||||
m_paintMGLDC = dc;
|
||||
|
||||
#if wxUSE_CARET
|
||||
// must hide caret temporarily, otherwise we'd get rendering artifacts
|
||||
wxCaret *caret = GetCaret();
|
||||
if ( caret )
|
||||
caret->Hide();
|
||||
#endif // wxUSE_CARET
|
||||
|
||||
if ( m_eraseBackground != 0 )
|
||||
{
|
||||
wxWindowDC dc((wxWindow*)this);
|
||||
@@ -1143,6 +1161,11 @@ void wxWindowMGL::HandlePaint(MGLDevCtx *dc)
|
||||
eventPt.SetEventObject(this);
|
||||
GetEventHandler()->ProcessEvent(eventPt);
|
||||
|
||||
#if wxUSE_CARET
|
||||
if ( caret )
|
||||
caret->Show();
|
||||
#endif // wxUSE_CARET
|
||||
|
||||
m_paintMGLDC = NULL;
|
||||
m_updateRegion.Clear();
|
||||
}
|
||||
|
Reference in New Issue
Block a user