From 48b86c20b24bf4eff6990cd4d7508c0fa23eed8b Mon Sep 17 00:00:00 2001 From: David Hart Date: Tue, 18 Apr 2017 03:17:18 +0200 Subject: [PATCH] Fix or work around several wxX11 problems in the widgets sample Initialize the variables and check that they're initialized in the event handlers which are called earlier in wxX11. Also always use valid wxSlider flags. Closes #17843. --- samples/widgets/odcombobox.cpp | 13 +++++- samples/widgets/slider.cpp | 5 +++ src/x11/window.cpp | 75 +++++++++++++++++++++++++++++++--- 3 files changed, 86 insertions(+), 7 deletions(-) diff --git a/samples/widgets/odcombobox.cpp b/samples/widgets/odcombobox.cpp index 4609f21145..55e8c51607 100644 --- a/samples/widgets/odcombobox.cpp +++ b/samples/widgets/odcombobox.cpp @@ -305,7 +305,8 @@ IMPLEMENT_WIDGETS_PAGE(ODComboboxWidgetsPage, wxT("OwnerDrawnCombobox"), ODComboboxWidgetsPage::ODComboboxWidgetsPage(WidgetsBookCtrl *book, wxImageList *imaglist) - : ItemContainerWidgetsPage(book, imaglist, odcombobox_xpm) + : ItemContainerWidgetsPage(book, imaglist, odcombobox_xpm), + m_textPopupMinWidth(NULL), m_textPopupHeight(NULL) { // init everything m_chkSort = @@ -649,6 +650,11 @@ void ODComboboxWidgetsPage::OnTextPopupWidth(wxCommandEvent& WXUNUSED(event)) { long l = 0; + if (!m_textPopupMinWidth) + { + return; + } + m_textPopupMinWidth->GetValue().ToLong(&l); if (m_combobox && l > 0) @@ -661,6 +667,11 @@ void ODComboboxWidgetsPage::OnTextPopupHeight(wxCommandEvent& WXUNUSED(event)) { long l = 0; + if (!m_textPopupHeight) + { + return; + } + m_textPopupHeight->GetValue().ToLong(&l); if (m_combobox && l > 0) diff --git a/samples/widgets/slider.cpp b/samples/widgets/slider.cpp index 243d6c4482..e5feeec4cd 100644 --- a/samples/widgets/slider.cpp +++ b/samples/widgets/slider.cpp @@ -385,6 +385,11 @@ void SliderWidgetsPage::CreateSlider() { int flags = ms_defaultFlags; +#if defined(__WXX11__) + // wxX11 asserts without a sane tick setting, which initially it hasn't + flags |= wxSL_BOTTOM; +#endif + if ( m_chkInverse->GetValue() ) { flags |= wxSL_INVERSE; diff --git a/src/x11/window.cpp b/src/x11/window.cpp index 89a218afef..3daea83786 100644 --- a/src/x11/window.cpp +++ b/src/x11/window.cpp @@ -1580,13 +1580,76 @@ bool wxTranslateKeyEvent(wxKeyEvent& wxevent, wxWindow *win, Window WXUNUSED(win KeySym keySym; (void) XLookupString ((XKeyEvent *) xevent, buf, 20, &keySym, NULL); int id = wxCharCodeXToWX (keySym); - // id may be WXK_xxx code - these are outside ASCII range, so we - // can't just use toupper() on id. - // Only change this if we want the raw key that was pressed, - // and don't change it if we want an ASCII value. - if (!isAscii && (id >= 'a' && id <= 'z')) + if (isAscii) { - id = id + 'A' - 'a'; + // fold keypad into normal character codes + if (id >= WXK_NUMPAD0 && id <= WXK_NUMPAD9) + { + id = id - WXK_NUMPAD0 + '0'; + } + else if (id >= WXK_NUMPAD_SPACE && id <= WXK_NUMPAD_DIVIDE) + { + switch (id) + { + case WXK_NUMPAD_SPACE: + id = ' '; + break; + case WXK_NUMPAD_TAB: + id = WXK_TAB; + break; + case WXK_NUMPAD_ENTER: + id = WXK_RETURN; + break; + case WXK_NUMPAD_F1: + case WXK_NUMPAD_F2: + case WXK_NUMPAD_F3: + case WXK_NUMPAD_F4: + id = id - WXK_NUMPAD_F1 + WXK_F1; + break; + case WXK_NUMPAD_END: + case WXK_NUMPAD_HOME: + case WXK_NUMPAD_LEFT: + case WXK_NUMPAD_UP: + case WXK_NUMPAD_RIGHT: + case WXK_NUMPAD_DOWN: + id = id - WXK_NUMPAD_END + WXK_END; + break; + case WXK_NUMPAD_PAGEUP: + id = WXK_PAGEUP; + break; + case WXK_NUMPAD_PAGEDOWN: + id = WXK_PAGEDOWN; + break; + case WXK_NUMPAD_INSERT: + case WXK_NUMPAD_DELETE: + case WXK_NUMPAD_EQUAL: + id = id - WXK_NUMPAD_INSERT + WXK_INSERT; + break; + case WXK_NUMPAD_BEGIN: + id = WXK_HOME; + break; + case WXK_NUMPAD_MULTIPLY: + case WXK_NUMPAD_ADD: + case WXK_NUMPAD_SEPARATOR: + case WXK_NUMPAD_SUBTRACT: + case WXK_NUMPAD_DECIMAL: + case WXK_NUMPAD_DIVIDE: + id = id - WXK_NUMPAD_MULTIPLY + WXK_MULTIPLY; + break; + } + } + } + else + { + // Fold case for alphabetic characters. We can't just + // use toupper() on id, since id may be WXK_xxx code - + // these are outside ASCII range. Only change this if + // we want the raw key that was pressed, and don't + // change it if we want an ASCII value. + if (id >= 'a' && id <= 'z') + { + id = id + 'A' - 'a'; + } } wxevent.m_shiftDown = XKeyEventShiftIsDown(xevent);