X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/079b6a775a0498cf3e100180f28878bb4700d80d..8a31648287be0ef976f133de2786b137f1e98340:/src/gtk/window.cpp diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index 1f83b25b85..1a3f1065b0 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -338,18 +338,6 @@ parent_set(GtkWidget* widget, GtkWidget* old_parent, wxWindow* win) // "key_press_event" from any window //----------------------------------------------------------------------------- -// These are used when transforming Ctrl-alpha to ascii values 1-26 -inline bool wxIsLowerChar(int code) -{ - return (code >= 'a' && code <= 'z' ); -} - -inline bool wxIsUpperChar(int code) -{ - return (code >= 'A' && code <= 'Z' ); -} - - // set WXTRACE to this to see the key event codes on the console #define TRACE_KEYS wxT("keyevent") @@ -842,13 +830,49 @@ bool SendCharHookEvent(const wxKeyEvent& event, wxWindow *win) if ( !g_captureWindow ) { wxKeyEvent eventCharHook(wxEVT_CHAR_HOOK, event); - if ( win->HandleWindowEvent(eventCharHook) ) + if ( win->HandleWindowEvent(eventCharHook) + && !event.IsNextEventAllowed() ) return true; } return false; } +// Adjust wxEVT_CHAR event key code fields. This function takes care of two +// conventions: +// (a) Ctrl-letter key presses generate key codes in range 1..26 +// (b) Unicode key codes are same as key codes for the codes in 1..255 range +void AdjustCharEventKeyCodes(wxKeyEvent& event) +{ + const int code = event.m_keyCode; + + // Check for (a) above. + if ( event.ControlDown() ) + { + // We intentionally don't use isupper/lower() here, we really need + // ASCII letters only as it doesn't make sense to translate any other + // ones into this range which has only 26 slots. + if ( code >= 'a' && code <= 'z' ) + event.m_keyCode = code - 'a' + 1; + else if ( code >= 'A' && code <= 'Z' ) + event.m_keyCode = code - 'A' + 1; + +#if wxUSE_UNICODE + // Adjust the Unicode equivalent in the same way too. + if ( event.m_keyCode != code ) + event.m_uniChar = event.m_keyCode; +#endif // wxUSE_UNICODE + } + +#if wxUSE_UNICODE + // Check for (b) from above. + // + // FIXME: Should we do it for key codes up to 255? + if ( !event.m_uniChar && code < WXK_DELETE ) + event.m_uniChar = code; +#endif // wxUSE_UNICODE +} + } // anonymous namespace extern "C" { @@ -964,19 +988,7 @@ gtk_window_key_press_callback( GtkWidget *WXUNUSED(widget), eventChar.m_keyCode = key_code; - // To conform to the docs we need to translate Ctrl-alpha - // characters to values in the range 1-26. - if ( eventChar.ControlDown() && - ( wxIsLowerChar(key_code) || wxIsUpperChar(key_code) )) - { - if ( wxIsLowerChar(key_code) ) - eventChar.m_keyCode = key_code - 'a' + 1; - if ( wxIsUpperChar(key_code) ) - eventChar.m_keyCode = key_code - 'A' + 1; -#if wxUSE_UNICODE - eventChar.m_uniChar = eventChar.m_keyCode; -#endif - } + AdjustCharEventKeyCodes(eventChar); ret = win->HandleWindowEvent(eventChar); } @@ -1021,21 +1033,7 @@ gtk_wxwindow_commit_cb (GtkIMContext * WXUNUSED(context), event.m_keyCode = (char)*pstr; #endif // wxUSE_UNICODE - // To conform to the docs we need to translate Ctrl-alpha - // characters to values in the range 1-26. - if ( event.ControlDown() && - ( wxIsLowerChar(*pstr) || wxIsUpperChar(*pstr) )) - { - if ( wxIsLowerChar(*pstr) ) - event.m_keyCode = *pstr - 'a' + 1; - if ( wxIsUpperChar(*pstr) ) - event.m_keyCode = *pstr - 'A' + 1; - - event.m_keyCode = *pstr - 'a' + 1; -#if wxUSE_UNICODE - event.m_uniChar = event.m_keyCode; -#endif - } + AdjustCharEventKeyCodes(event); window->HandleWindowEvent(event); } @@ -2615,14 +2613,6 @@ void wxWindowGTK::OnInternalIdle() RealizeTabOrder(); } - // Update style if the window was not yet realized when - // SetBackgroundStyle() was called - if (m_needsStyleChange) - { - SetBackgroundStyle(GetBackgroundStyle()); - m_needsStyleChange = false; - } - wxWindowBase::OnInternalIdle(); } @@ -3974,7 +3964,7 @@ bool wxWindowGTK::SetBackgroundStyle(wxBackgroundStyle style) } else // window not realized yet { - // Do in OnIdle, because the window is not yet available + // Do when window is realized m_needsStyleChange = true; }