From 8bbb50ba6158c98dcdf5ab8bd55c4bcbb6f43931 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Mon, 4 Nov 2002 23:05:00 +0000 Subject: [PATCH] fix bug in key handling code: toupper() shouldn't be applied to the values outside of the ASCII range (patch 631236) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_4_BRANCH@17715 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/gtk/window.cpp | 5 +++ src/gtk1/window.cpp | 5 +++ src/motif/window.cpp | 89 +++++++++++++------------------------------- src/x11/window.cpp | 28 +++++++------- 4 files changed, 49 insertions(+), 78 deletions(-) diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index eaeb4351c6..51b714768d 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -3336,6 +3336,11 @@ bool wxWindowGTK::Show( bool show ) else gtk_widget_hide( m_widget ); + wxShowEvent eventShow(GetId(), show); + eventShow.m_eventObject = this; + + GetEventHandler()->ProcessEvent(eventShow); + return TRUE; } diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index eaeb4351c6..51b714768d 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -3336,6 +3336,11 @@ bool wxWindowGTK::Show( bool show ) else gtk_widget_hide( m_widget ); + wxShowEvent eventShow(GetId(), show); + eventShow.m_eventObject = this; + + GetEventHandler()->ProcessEvent(eventShow); + return TRUE; } diff --git a/src/motif/window.cpp b/src/motif/window.cpp index 0314491eb7..15a5f5240f 100644 --- a/src/motif/window.cpp +++ b/src/motif/window.cpp @@ -404,7 +404,7 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id, wxWindow::~wxWindow() { if (g_captureWindow == this) - g_captureWindow = NULL; + g_captureWindow = NULL; m_isBeingDeleted = TRUE; @@ -437,7 +437,7 @@ wxWindow::~wxWindow() if (w) { XtDestroyWidget(w); - m_drawingArea = (WXWidget) 0; + m_drawingArea = (WXWidget) 0; } // Only if we're _really_ a canvas (not a dialog box/panel) @@ -449,18 +449,18 @@ wxWindow::~wxWindow() if (m_hScrollBar) { wxDeleteWindowFromTable((Widget) m_hScrollBar); - XtUnmanageChild((Widget) m_hScrollBar); + XtUnmanageChild((Widget) m_hScrollBar); } if (m_vScrollBar) { wxDeleteWindowFromTable((Widget) m_vScrollBar); - XtUnmanageChild((Widget) m_vScrollBar); + XtUnmanageChild((Widget) m_vScrollBar); } if (m_hScrollBar) - XtDestroyWidget((Widget) m_hScrollBar); + XtDestroyWidget((Widget) m_hScrollBar); if (m_vScrollBar) - XtDestroyWidget((Widget) m_vScrollBar); + XtDestroyWidget((Widget) m_vScrollBar); UnmanageAndDestroy(m_scrolledWindow); @@ -958,12 +958,12 @@ void wxWindow::ScrollWindow(int dx, int dy, const wxRect *rect) while (cnode) { wxWindow *child = (wxWindow*) cnode->Data(); - int sx = 0; - int sy = 0; - child->GetSize( &sx, &sy ); + int sx = 0; + int sy = 0; + child->GetSize( &sx, &sy ); wxPoint pos( child->GetPosition() ); - child->SetSize( pos.x + dx, pos.y + dy, sx, sy, wxSIZE_ALLOW_MINUS_ONE ); - cnode = cnode->Next(); + child->SetSize( pos.x + dx, pos.y + dy, sx, sy, wxSIZE_ALLOW_MINUS_ONE ); + cnode = cnode->Next(); } int x1 = (dx >= 0) ? x : x - dx; @@ -1207,15 +1207,15 @@ bool wxWindow::DoPopupMenu(wxMenu *menu, int x, int y) XmMenuPosition (menuWidget, &event); XtManageChild (menuWidget); - XEvent x_event; - // The ID of a pop-up menu is 1 when active, and is set to 0 by the + XEvent x_event; + // The ID of a pop-up menu is 1 when active, and is set to 0 by the // idle-time destroy routine. - // Waiting until this ID changes causes this function to block until + // Waiting until this ID changes causes this function to block until // the menu has been dismissed and the widgets cleaned up. // In other words, once this routine returns, it is safe to delete // the menu object. // Ian Brown - while (menu->GetId() == 1) + while (menu->GetId() == 1) { XtAppNextEvent( (XtAppContext) wxTheApp->GetAppContext(), &x_event); @@ -1732,7 +1732,7 @@ bool wxWindow::ProcessAccelerator(wxKeyEvent& event) if (entry->MatchesEvent(event)) { // Bingo, we have a match. Now find a control that matches the - // entry command id. + // entry command id. // Need to go up to the top of the window hierarchy, since it might // be e.g. a menu item @@ -2201,33 +2201,8 @@ static void wxCanvasInputEvent(Widget drawingArea, } case KeyPress: { - KeySym keySym; - static char buf[100]; -#if 0 - XComposeStatus compose; - (void) XLookupString ((XKeyEvent *) & local_event, buf, 20, &keySym, &compose); -#endif // 0 - - (void) XLookupString ((XKeyEvent *) & local_event, buf, 20, &keySym, NULL); - int id = wxCharCodeXToWX (keySym); - - wxEventType eventType = wxEVT_CHAR; - - wxKeyEvent event (eventType); - - if (local_event.xkey.state & ShiftMask) - event.m_shiftDown = TRUE; - if (local_event.xkey.state & ControlMask) - event.m_controlDown = TRUE; - if (local_event.xkey.state & Mod3Mask) - event.m_altDown = TRUE; - if (local_event.xkey.state & Mod1Mask) - event.m_metaDown = TRUE; - event.SetEventObject(canvas); - event.m_keyCode = id; - event.SetTimestamp(local_event.xkey.time); - - if (id > -1) + wxKeyEvent event (wxEVT_CHAR); + if (wxTranslateKeyEvent (event, canvas, (Widget) 0, &local_event)) { // Implement wxFrame::OnCharHook by checking ancestor. wxWindow *parent = canvas->GetParent(); @@ -2256,26 +2231,8 @@ static void wxCanvasInputEvent(Widget drawingArea, } case KeyRelease: { - static char buf[100]; - KeySym keySym; - (void) XLookupString ((XKeyEvent *) & local_event, buf, 20, &keySym, NULL); - int id = wxCharCodeXToWX (keySym); - wxKeyEvent event (wxEVT_KEY_UP); - - if (local_event.xkey.state & ShiftMask) - event.m_shiftDown = TRUE; - if (local_event.xkey.state & ControlMask) - event.m_controlDown = TRUE; - if (local_event.xkey.state & Mod3Mask) - event.m_altDown = TRUE; - if (local_event.xkey.state & Mod1Mask) - event.m_metaDown = TRUE; - event.SetEventObject(canvas); - event.m_keyCode = id; - event.SetTimestamp(local_event.xkey.time); - - if (id > -1) + if (wxTranslateKeyEvent (event, canvas, (Widget) 0, &local_event)) { canvas->GetEventHandler()->ProcessEvent (event); } @@ -2828,6 +2785,10 @@ bool wxTranslateKeyEvent(wxKeyEvent& wxevent, wxWindow *win, Widget WXUNUSED(wid #endif // 0 (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 + if (id >= 'a' && id <= 'z') + id = toupper(id); if (xevent->xkey.state & ShiftMask) wxevent.m_shiftDown = TRUE; @@ -3075,8 +3036,8 @@ wxPoint wxGetMousePosition() unsigned int maskReturn; XQueryPointer (display, - rootWindow, - &rootReturn, + rootWindow, + &rootReturn, &childReturn, &rootX, &rootY, &winX, &winY, &maskReturn); return wxPoint(rootX, rootY); diff --git a/src/x11/window.cpp b/src/x11/window.cpp index cde8d9c120..857132a3ee 100644 --- a/src/x11/window.cpp +++ b/src/x11/window.cpp @@ -151,15 +151,15 @@ bool wxWindowX11::Create(wxWindow *parent, wxWindowID id, // Note: The Xlib manual doesn't mention this restriction of XCreateWindow. wxSize size2(size); if (size2.x <= 0) - size2.x = 20; + size2.x = 20; if (size2.y <= 0) - size2.y = 20; + size2.y = 20; wxPoint pos2(pos); if (pos2.x == -1) - pos2.x = 0; + pos2.x = 0; if (pos2.y == -1) - pos2.y = 0; + pos2.y = 0; #if wxUSE_TWO_WINDOWS bool need_two_windows = @@ -340,7 +340,7 @@ bool wxWindowX11::Create(wxWindow *parent, wxWindowID id, wxWindowX11::~wxWindowX11() { if (g_captureWindow == this) - g_captureWindow = NULL; + g_captureWindow = NULL; m_isBeingDeleted = TRUE; @@ -490,7 +490,7 @@ void wxWindowX11::DoCaptureMouse() FALSE, ButtonPressMask | ButtonReleaseMask | ButtonMotionMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask, GrabModeAsync, - GrabModeAsync, + GrabModeAsync, None, None, /* cursor */ // TODO: This may need to be set to the cursor of this window CurrentTime ); @@ -1474,23 +1474,23 @@ 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 + if (id >= 'a' && id <= 'z') + id = toupper(id); wxevent.m_shiftDown = XKeyEventShiftIsDown(xevent); wxevent.m_controlDown = XKeyEventCtrlIsDown(xevent); wxevent.m_altDown = XKeyEventAltIsDown(xevent); wxevent.m_metaDown = XKeyEventMetaIsDown(xevent); wxevent.SetEventObject(win); - wxevent.m_keyCode = wxToupper(id); + wxevent.m_keyCode = id; wxevent.SetTimestamp(XKeyEventGetTime(xevent)); wxevent.m_x = XKeyEventGetX(xevent); wxevent.m_y = XKeyEventGetY(xevent); - if (id > -1) - return TRUE; - else - return FALSE; - break; + return id > -1; } default: break; @@ -1566,8 +1566,8 @@ wxPoint wxGetMousePosition() unsigned int maskReturn; XQueryPointer (display, - rootWindow, - &rootReturn, + rootWindow, + &rootReturn, &childReturn, &rootX, &rootY, &winX, &winY, &maskReturn); return wxPoint(rootX, rootY);