diff --git a/include/wx/os2/window.h b/include/wx/os2/window.h index f89b382262..925b345a8c 100644 --- a/include/wx/os2/window.h +++ b/include/wx/os2/window.h @@ -575,5 +575,19 @@ WXDLLEXPORT int wxCharCodeOS2ToWX(int nKeySym); WXDLLEXPORT int wxCharCodeWXToOS2( int nId ,bool* pbIsVirtual ); + +// ---------------------------------------------------------------------------- +// global objects +// ---------------------------------------------------------------------------- + +// notice that this hash must be defined after wxWindow declaration as it +// needs to "see" its dtor and not just forward declaration +#include "wx/hash.h" + +// pseudo-template HWND <-> wxWindow hash table +WX_DECLARE_HASH(wxWindowOS2, wxWindowList, wxWinHashTable); + +extern wxWinHashTable *wxWinHandleHash; + #endif // _WX_WINDOW_H_ diff --git a/src/os2/app.cpp b/src/os2/app.cpp index 52aebcb4b8..faf14e9be7 100644 --- a/src/os2/app.cpp +++ b/src/os2/app.cpp @@ -82,7 +82,6 @@ extern "C" int _System bsdselect(int, // --------------------------------------------------------------------------- extern wxChar* wxBuffer; -extern wxList* wxWinHandleList; extern wxList WXDLLEXPORT wxPendingDelete; extern wxCursor* g_globalCursor; @@ -240,7 +239,7 @@ bool wxApp::Initialize(int& argc, wxChar **argv) // wxRedirectIOToConsole(); #endif - wxWinHandleList = new wxList(wxKEY_INTEGER); + wxWinHandleHash = new wxWinHashTable(wxKEY_INTEGER, 100); // This is to foil optimizations in Visual C++ that throw out dummy.obj. // PLEASE DO NOT ALTER THIS. @@ -419,8 +418,8 @@ void wxApp::CleanUp() // TODO: ::DeleteObject( wxDisableButtonBrush ); } - if (wxWinHandleList) - delete wxWinHandleList; + delete wxWinHandleHash; + wxWinHandleHash = NULL; // Delete Message queue if (wxTheApp->m_hMq) diff --git a/src/os2/menu.cpp b/src/os2/menu.cpp index ca8af4aa8e..ccb4be4251 100644 --- a/src/os2/menu.cpp +++ b/src/os2/menu.cpp @@ -179,12 +179,12 @@ void wxMenu::UpdateAccel( if (pItem->IsSubMenu()) { wxMenu* pSubmenu = pItem->GetSubMenu(); - wxMenuItemList::Node* pNode = pSubmenu->GetMenuItems().GetFirst(); + wxMenuItemList::compatibility_iterator node = pSubmenu->GetMenuItems().GetFirst(); - while (pNode) + while (node) { - UpdateAccel(pNode->GetData()); - pNode = pNode->GetNext(); + UpdateAccel(node->GetData()); + node = node->GetNext(); } } else if (!pItem->IsSeparator()) @@ -416,11 +416,11 @@ wxMenuItem* wxMenu::DoAppend( // pItem->SetRadioGroupStart(m_nStartRadioGroup); - wxMenuItemList::Node* pNode = GetMenuItems().Item(m_nStartRadioGroup); + wxMenuItemList::compatibility_iterator node = GetMenuItems().Item(m_nStartRadioGroup); - if (pNode) + if (node) { - pNode->GetData()->SetRadioGroupEnd(nCount); + node->GetData()->SetRadioGroupEnd(nCount); } else { @@ -470,19 +470,19 @@ wxMenuItem* wxMenu::DoRemove( // We need to find the items position in the child list // size_t nPos; - wxMenuItemList::Node* pNode = GetMenuItems().GetFirst(); + wxMenuItemList::compatibility_iterator node = GetMenuItems().GetFirst(); - for (nPos = 0; pNode; nPos++) + for (nPos = 0; node; nPos++) { - if (pNode->GetData() == pItem) + if (node->GetData() == pItem) break; - pNode = pNode->GetNext(); + node = node->GetNext(); } // // DoRemove() (unlike Remove) can only be called for existing item! // - wxCHECK_MSG(pNode, NULL, wxT("bug in wxMenu::Remove logic")); + wxCHECK_MSG(node, NULL, wxT("bug in wxMenu::Remove logic")); #if wxUSE_ACCEL // @@ -641,7 +641,7 @@ wxMenuItem* wxMenu::FindItem( wxMenuItem* pItem = NULL; - for ( wxMenuItemList::Node *node = m_items.GetFirst(); + for ( wxMenuItemList::compatibility_iterator node = m_items.GetFirst(); node && !pItem; node = node->GetNext() ) { @@ -772,9 +772,9 @@ WXHMENU wxMenuBar::Create() } else { - size_t nCount = GetMenuCount(); - - for (size_t i = 0; i < nCount; i++) + size_t nCount = GetMenuCount(), i; + wxMenuList::iterator it; + for (i = 0, it = m_menus.begin(); i < nCount; i++, it++) { APIRET rc; ERRORID vError; @@ -784,8 +784,8 @@ WXHMENU wxMenuBar::Create() // // Set the parent and owner of the submenues to be the menubar, not the desktop // - hSubMenu = m_menus[i]->m_vMenuData.hwndSubMenu; - if (!::WinSetParent(m_menus[i]->m_vMenuData.hwndSubMenu, m_hMenu, FALSE)) + hSubMenu = (*it)->m_vMenuData.hwndSubMenu; + if (!::WinSetParent((*it)->m_vMenuData.hwndSubMenu, m_hMenu, FALSE)) { vError = ::WinGetLastError(vHabmain); sError = wxPMErrorToStr(vError); @@ -793,7 +793,7 @@ WXHMENU wxMenuBar::Create() return NULLHANDLE; } - if (!::WinSetOwner(m_menus[i]->m_vMenuData.hwndSubMenu, m_hMenu)) + if (!::WinSetOwner((*it)->m_vMenuData.hwndSubMenu, m_hMenu)) { vError = ::WinGetLastError(vHabmain); sError = wxPMErrorToStr(vError); @@ -801,9 +801,9 @@ WXHMENU wxMenuBar::Create() return NULLHANDLE; } - m_menus[i]->m_vMenuData.iPosition = i; + (*it)->m_vMenuData.iPosition = i; - rc = (APIRET)::WinSendMsg(m_hMenu, MM_INSERTITEM, (MPARAM)&m_menus[i]->m_vMenuData, (MPARAM)m_titles[i].c_str()); + rc = (APIRET)::WinSendMsg(m_hMenu, MM_INSERTITEM, (MPARAM)&(*it)->m_vMenuData, (MPARAM)m_titles[i].c_str()); if (rc == (APIRET)MIT_MEMERROR || rc == (APIRET)MIT_ERROR) { vError = ::WinGetLastError(vHabmain); @@ -1051,7 +1051,7 @@ wxMenu* wxMenuBar::Remove( #endif // wxUSE_ACCEL Refresh(); } - m_titles.Remove(nPos); + m_titles.RemoveAt(nPos); return pMenu; } // end of wxMenuBar::Remove @@ -1065,10 +1065,10 @@ void wxMenuBar::RebuildAccelTable() size_t nAccelCount = 0; size_t i; size_t nCount = GetMenuCount(); - - for (i = 0; i < nCount; i++) + wxMenuList::iterator it; + for (i = 0, it = m_menus.begin(); i < nCount; i++, it++) { - nAccelCount += m_menus[i]->GetAccelCount(); + nAccelCount += (*it)->GetAccelCount(); } if (nAccelCount) @@ -1076,9 +1076,9 @@ void wxMenuBar::RebuildAccelTable() wxAcceleratorEntry* pAccelEntries = new wxAcceleratorEntry[nAccelCount]; nAccelCount = 0; - for (i = 0; i < nCount; i++) + for (i = 0, it = m_menus.begin(); i < nCount; i++, it++) { - nAccelCount += m_menus[i]->CopyAccels(&pAccelEntries[nAccelCount]); + nAccelCount += (*it)->CopyAccels(&pAccelEntries[nAccelCount]); } m_vAccelTable = wxAcceleratorTable( nAccelCount ,pAccelEntries @@ -1128,14 +1128,14 @@ int wxMenuBar::FindMenuItem( ) const { wxString sMenuLabel = wxStripMenuCodes(rMenuString); - size_t nCount = GetMenuCount(); - - for (size_t i = 0; i < nCount; i++) + size_t nCount = GetMenuCount(), i; + wxMenuList::const_iterator it; + for (i = 0, it = m_menus.begin(); i < nCount; i++, it++) { wxString sTitle = wxStripMenuCodes(m_titles[i]); if (rMenuString == sTitle) - return m_menus[i]->FindItem(rItemString); + return (*it)->FindItem(rItemString); } return wxNOT_FOUND; } // end of wxMenuBar::FindMenuItem @@ -1149,13 +1149,13 @@ wxMenuItem* wxMenuBar::FindItem( *ppItemMenu = NULL; wxMenuItem* pItem = NULL; - size_t nCount = GetMenuCount(); - - for (size_t i = 0; !pItem && (i < nCount); i++) + size_t nCount = GetMenuCount(), i; + wxMenuList::const_iterator it; + for (i = 0, it = m_menus.begin(); !pItem && (i < nCount); i++, it++) { - pItem = m_menus[i]->FindItem( nId - ,ppItemMenu - ); + pItem = (*it)->FindItem( nId + ,ppItemMenu + ); } return pItem; } // end of wxMenuBar::FindItem @@ -1170,14 +1170,14 @@ wxMenuItem* wxMenuBar::FindItem( *ppItemMenu = NULL; wxMenuItem* pItem = NULL; - size_t nCount = GetMenuCount(); - - for (size_t i = 0; !pItem && (i < nCount); i++) + size_t nCount = GetMenuCount(), i; + wxMenuList::const_iterator it; + for (i = 0, it = m_menus.begin(); !pItem && (i < nCount); i++, it++) { - pItem = m_menus[i]->FindItem( nId - ,hItem - ,ppItemMenu - ); + pItem = (*it)->FindItem( nId + ,hItem + ,ppItemMenu + ); } return pItem; } // end of wxMenuBar::FindItem diff --git a/src/os2/menuitem.cpp b/src/os2/menuitem.cpp index d5417f8a0d..a3180a5ae8 100644 --- a/src/os2/menuitem.cpp +++ b/src/os2/menuitem.cpp @@ -321,9 +321,9 @@ void wxMenuItem::Check( // // Also uncheck all the other items in this radio group // - wxMenuItemList::Node* pNode = rItems.Item(nStart); + wxMenuItemList::compatibility_iterator node = rItems.Item(nStart); - for (int n = nStart; n <= nEnd && pNode; n++) + for (int n = nStart; n <= nEnd && node; n++) { if (n == nPos) { @@ -335,14 +335,14 @@ void wxMenuItem::Check( } if (n != nPos) { - pNode->GetData()->m_isChecked = FALSE; + node->GetData()->m_isChecked = FALSE; ::WinSendMsg( hMenu ,MM_SETITEMATTR ,MPFROM2SHORT(n, TRUE) ,MPFROM2SHORT(MIA_CHECKED, FALSE) ); } - pNode = pNode->GetNext(); + node = node->GetNext(); } } else // check item diff --git a/src/os2/nativdlg.cpp b/src/os2/nativdlg.cpp index fa52806608..16c8294620 100644 --- a/src/os2/nativdlg.cpp +++ b/src/os2/nativdlg.cpp @@ -137,17 +137,17 @@ wxWindow* wxWindow::GetWindowChild1 ( if (m_windowId == vId) return this; - wxWindowList::Node* pNode = GetChildren().GetFirst(); + wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); - while (pNode) + while (node) { - wxWindow* pChild = pNode->GetData(); + wxWindow* pChild = node->GetData(); wxWindow* pWin = pChild->GetWindowChild1(vId); if (pWin) return pWin; - pNode = pNode->GetNext(); + node = node->GetNext(); } return NULL; } // end of wxWindow::GetWindowChild1 diff --git a/src/os2/radiobut.cpp b/src/os2/radiobut.cpp index 8d1b543ad8..e0eaed2b65 100644 --- a/src/os2/radiobut.cpp +++ b/src/os2/radiobut.cpp @@ -223,9 +223,9 @@ void wxRadioButton::SetValue( if (bValue) { const wxWindowList& rSiblings = GetParent()->GetChildren(); - wxWindowList::Node* pNodeThis = rSiblings.Find(this); + wxWindowList::compatibility_iterator nodeThis = rSiblings.Find(this); - wxCHECK_RET(pNodeThis, _T("radio button not a child of its parent?")); + wxCHECK_RET(nodeThis, _T("radio button not a child of its parent?")); // // If it's not the first item of the group ... @@ -235,11 +235,11 @@ void wxRadioButton::SetValue( // // ...turn off all radio buttons before this one // - for ( wxWindowList::Node* pNodeBefore = pNodeThis->GetPrevious(); - pNodeBefore; - pNodeBefore = pNodeBefore->GetPrevious() ) + for ( wxWindowList::compatibility_iterator nodeBefore = nodeThis->GetPrevious(); + nodeBefore; + nodeBefore = nodeBefore->GetPrevious() ) { - wxRadioButton* pBtn = wxDynamicCast( pNodeBefore->GetData() + wxRadioButton* pBtn = wxDynamicCast( nodeBefore->GetData() ,wxRadioButton ); if (!pBtn) @@ -265,11 +265,11 @@ void wxRadioButton::SetValue( // // ... and all after this one // - for (wxWindowList::Node* pNodeAfter = pNodeThis->GetNext(); - pNodeAfter; - pNodeAfter = pNodeAfter->GetNext()) + for (wxWindowList::compatibility_iterator nodeAfter = nodeThis->GetNext(); + nodeAfter; + nodeAfter = nodeAfter->GetNext()) { - wxRadioButton* pBtn = wxDynamicCast( pNodeAfter->GetData() + wxRadioButton* pBtn = wxDynamicCast( nodeAfter->GetData() ,wxRadioButton ); diff --git a/src/os2/timer.cpp b/src/os2/timer.cpp index 1aebce5ee1..7aa78227b3 100644 --- a/src/os2/timer.cpp +++ b/src/os2/timer.cpp @@ -35,11 +35,31 @@ #include #include + +// ---------------------------------------------------------------------------- +// private globals +// ---------------------------------------------------------------------------- + +// define a hash containing all the timers: it is indexed by timer id and +// contains the corresponding timer +WX_DECLARE_HASH_MAP(unsigned long, wxTimer *, wxIntegerHash, wxIntegerEqual, + wxTimerMap); + +// instead of using a global here, wrap it in a static function as otherwise it +// could have been used before being initialized if a timer object were created +// globally +static wxTimerMap& TimerMap() +{ + static wxTimerMap s_timerMap; + + return s_timerMap; +} + // ---------------------------------------------------------------------------- // private functions // ---------------------------------------------------------------------------- -wxList wxTimerList(wxKEY_INTEGER); +// timer callback used for all timers ULONG wxTimerProc(HWND hwnd, ULONG, int nIdTimer, ULONG); // ---------------------------------------------------------------------------- @@ -48,6 +68,14 @@ ULONG wxTimerProc(HWND hwnd, ULONG, int nIdTimer, ULONG); IMPLEMENT_ABSTRACT_CLASS(wxTimer, wxEvtHandler) +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxTimer class +// ---------------------------------------------------------------------------- + void wxTimer::Init() { m_ulId = 0; @@ -56,8 +84,6 @@ void wxTimer::Init() wxTimer::~wxTimer() { wxTimer::Stop(); - - wxTimerList.DeleteObject(this); } void wxTimer::Notify() @@ -87,8 +113,6 @@ bool wxTimer::Start( wxCHECK_MSG( m_milli > 0L, FALSE, wxT("invalid value for timer") ); - wxTimerList.DeleteObject(this); - wxWindow* pWin = NULL; if (m_owner) @@ -108,10 +132,23 @@ bool wxTimer::Start( ); if (m_ulId > 0L) { - wxTimerList.Append( m_ulId - ,this - ); - return(TRUE); + // check that SetTimer() didn't reuse an existing id: according to + // the MSDN this can happen and this would be catastrophic to us as + // we rely on ids uniquely identifying the timers because we use + // them as keys in the hash + if ( TimerMap().find(m_ulId) != TimerMap().end() ) + { + wxLogError(_("Timer creation failed.")); + + ::WinStopTimer(m_Hab, pWin?(pWin->GetHWND()):NULL, m_ulId); + m_ulId = 0; + + return false; + } + + TimerMap()[m_ulId] = this; + + return true; } else { @@ -133,7 +170,8 @@ void wxTimer::Stop() } else ::WinStopTimer(m_Hab, NULLHANDLE, m_ulId); - wxTimerList.DeleteObject(this); + + TimerMap().erase(m_ulId); } m_ulId = 0L; } @@ -165,11 +203,11 @@ ULONG wxTimerProc( , ULONG ) { - wxNode* pNode = wxTimerList.Find((ULONG)nIdTimer); + wxTimerMap::iterator node = TimerMap().find((ULONG)nIdTimer); - wxCHECK_MSG(pNode, 0, wxT("bogus timer id in wxTimerProc") ); - if (pNode) - wxProcessTimer(*(wxTimer *)pNode->GetData()); + wxCHECK_MSG(node != TimerMap().end(), 0, + wxT("bogus timer id in wxTimerProc") ); + wxProcessTimer(*(node->second)); return 0; } diff --git a/src/os2/toolbar.cpp b/src/os2/toolbar.cpp index 82dd46c560..56ab552677 100644 --- a/src/os2/toolbar.cpp +++ b/src/os2/toolbar.cpp @@ -445,11 +445,11 @@ bool wxToolBar::Realize() // // Find the maximum tool width and height // - wxToolBarToolsList::Node* pNode = m_tools.GetFirst(); + wxToolBarToolsList::compatibility_iterator node = m_tools.GetFirst(); - while (pNode ) + while (node ) { - wxToolBarTool* pTool = (wxToolBarTool *)pNode->GetData(); + wxToolBarTool* pTool = (wxToolBarTool *)node->GetData(); if (HasFlag(wxTB_TEXT) && !pTool->GetLabel().IsEmpty()) { @@ -470,7 +470,7 @@ bool wxToolBar::Realize() if (pTool->GetHeight() > nMaxToolHeight) nMaxToolHeight = pTool->GetHeight(); } - pNode = pNode->GetNext(); + node = node->GetNext(); } wxCoord vTbWidth = 0L; @@ -497,10 +497,10 @@ bool wxToolBar::Realize() int nSeparatorSize = m_toolSeparation; - pNode = m_tools.GetFirst(); - while (pNode) + node = m_tools.GetFirst(); + while (node) { - wxToolBarTool* pTool = (wxToolBarTool *)pNode->GetData(); + wxToolBarTool* pTool = (wxToolBarTool *)node->GetData(); if (pTool->IsSeparator()) { @@ -567,7 +567,7 @@ bool wxToolBar::Realize() if (m_vLastY > m_maxHeight) m_maxHeight = m_vLastY; - pNode = pNode->GetNext(); + node = node->GetNext(); } if ( GetWindowStyleFlag() & wxTB_HORIZONTAL ) @@ -603,11 +603,11 @@ void wxToolBar::OnPaint ( nCount++; ::WinFillRect(vDc.GetHPS(), &vDc.m_vRclPaint, GetBackgroundColour().GetPixel()); - for ( wxToolBarToolsList::Node* pNode = m_tools.GetFirst(); - pNode; - pNode = pNode->GetNext() ) + for ( wxToolBarToolsList::compatibility_iterator node = m_tools.GetFirst(); + node; + node = node->GetNext() ) { - wxToolBarTool* pTool = (wxToolBarTool*)pNode->GetData(); + wxToolBarTool* pTool = (wxToolBarTool*)node->GetData(); if (pTool->IsButton() ) DrawTool(vDc, pTool); @@ -976,10 +976,10 @@ wxToolBarToolBase* wxToolBar::FindToolForPosition( ,&vTBarHeight ); vY = vTBarHeight - vY; - wxToolBarToolsList::Node* pNode = m_tools.GetFirst(); - while (pNode) + wxToolBarToolsList::compatibility_iterator node = m_tools.GetFirst(); + while (node) { - wxToolBarTool* pTool = (wxToolBarTool *)pNode->GetData(); + wxToolBarTool* pTool = (wxToolBarTool *)node->GetData(); if (HasFlag(wxTB_TEXT) && !pTool->GetLabel().IsNull()) { @@ -1001,7 +1001,7 @@ wxToolBarToolBase* wxToolBar::FindToolForPosition( return pTool; } } - pNode = pNode->GetNext(); + node = node->GetNext(); } return (wxToolBarToolBase *)NULL; } // end of wxToolBar::FindToolForPosition diff --git a/src/os2/utilsgui.cpp b/src/os2/utilsgui.cpp index fd710bbc20..a48d2a0936 100644 --- a/src/os2/utilsgui.cpp +++ b/src/os2/utilsgui.cpp @@ -515,10 +515,12 @@ wxString WXDLLEXPORT wxGetWindowText( ) { wxString vStr; - long lLen = ::WinQueryWindowTextLength((HWND)hWnd) + 1; - ::WinQueryWindowText((HWND)hWnd, lLen, vStr.GetWriteBuf((int)lLen)); - vStr.UngetWriteBuf(); + if ( hWnd ) + { + long lLen = ::WinQueryWindowTextLength((HWND)hWnd) + 1; + ::WinQueryWindowText((HWND)hWnd, lLen, wxStringBuffer(vStr, lLen)); + } return vStr; } @@ -528,22 +530,24 @@ wxString WXDLLEXPORT wxGetWindowClass( ) { wxString vStr; - int nLen = 256; // some starting value - - for ( ;; ) + if ( hWnd ) { - int nCount = ::WinQueryClassName((HWND)hWnd, nLen, vStr.GetWriteBuf(nLen)); + int nLen = 256; // some starting value - vStr.UngetWriteBuf(); - if (nCount == nLen ) - { - // the class name might have been truncated, retry with larger - // buffer - nLen *= 2; - } - else - { - break; + for ( ;; ) + { + int nCount = ::WinQueryClassName((HWND)hWnd, nLen, wxStringBuffer(vStr, nLen)); + + if (nCount == nLen ) + { + // the class name might have been truncated, retry with larger + // buffer + nLen *= 2; + } + else + { + break; + } } } return vStr; diff --git a/src/os2/window.cpp b/src/os2/window.cpp index 08b942a312..0db6e081e7 100644 --- a/src/os2/window.cpp +++ b/src/os2/window.cpp @@ -128,8 +128,6 @@ QMSG s_currentMsg; wxMenu* wxCurrentPopupMenu = NULL; #endif // wxUSE_MENUS_NATIVE -wxList* wxWinHandleList = NULL; - // --------------------------------------------------------------------------- // private functions // --------------------------------------------------------------------------- @@ -218,17 +216,17 @@ wxWindow* wxWindowOS2::FindItem( } #endif // wxUSE_CONTROLS - wxWindowList::Node* pCurrent = GetChildren().GetFirst(); + wxWindowList::compatibility_iterator current = GetChildren().GetFirst(); - while (pCurrent) + while (current) { - wxWindow* pChildWin = pCurrent->GetData(); + wxWindow* pChildWin = current->GetData(); wxWindow* pWnd = pChildWin->FindItem(lId); if (pWnd) return pWnd; - pCurrent = pCurrent->GetNext(); + current = current->GetNext(); } return(NULL); } // end of wxWindowOS2::FindItem @@ -241,11 +239,11 @@ wxWindow* wxWindowOS2::FindItemByHWND( , bool bControlOnly ) const { - wxWindowList::Node* pCurrent = GetChildren().GetFirst(); + wxWindowList::compatibility_iterator current = GetChildren().GetFirst(); - while (pCurrent) + while (current) { - wxWindow* pParent = pCurrent->GetData(); + wxWindow* pParent = current->GetData(); // // Do a recursive search. @@ -261,7 +259,7 @@ wxWindow* wxWindowOS2::FindItemByHWND( #endif // wxUSE_CONTROLS ) { - wxWindow* pItem = pCurrent->GetData(); + wxWindow* pItem = current->GetData(); if (pItem->GetHWND() == hWnd) return(pItem); @@ -271,7 +269,7 @@ wxWindow* wxWindowOS2::FindItemByHWND( return(pItem); } } - pCurrent = pCurrent->GetNext(); + current = current->GetNext(); } return(NULL); } // end of wxWindowOS2::FindItemByHWND @@ -506,11 +504,11 @@ bool wxWindowOS2::Enable( if (IsTopLevel()) return TRUE; - wxWindowList::Node* pNode = GetChildren().GetFirst(); + wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); - while (pNode) + while (node) { - wxWindow* pChild = pNode->GetData(); + wxWindow* pChild = node->GetData(); if (bEnable) { @@ -540,7 +538,7 @@ bool wxWindowOS2::Enable( m_pChildrenDisabled->Append(pChild); } } - pNode = pNode->GetNext(); + node = node->GetNext(); } if (bEnable && m_pChildrenDisabled) { @@ -3006,15 +3004,17 @@ MRESULT wxWindowOS2::OS2WindowProc( return mResult; } // end of wxWindowOS2::OS2WindowProc +// ---------------------------------------------------------------------------- +// wxWindow <-> HWND map +// ---------------------------------------------------------------------------- + +wxWinHashTable *wxWinHandleHash = NULL; + wxWindow* wxFindWinFromHandle( WXHWND hWnd ) { - wxNode* pNode = wxWinHandleList->Find((long)hWnd); - - if (!pNode) - return NULL; - return (wxWindow *)pNode->GetData(); + return (wxWindow *)wxWinHandleHash->Get((long)hWnd); } // end of wxFindWinFromHandle void wxAssociateWinWithHandle( @@ -3042,9 +3042,9 @@ void wxAssociateWinWithHandle( } else if (!pOldWin) { - wxWinHandleList->Append( (long)hWnd - ,pWin - ); + wxWinHandleHash->Put( (long)hWnd + ,(wxWindow *)pWin + ); } } // end of wxAssociateWinWithHandle @@ -3052,7 +3052,7 @@ void wxRemoveHandleAssociation( wxWindowOS2* pWin ) { - wxWinHandleList->DeleteObject(pWin); + wxWinHandleHash->Delete((long)pWin->GetHWND()); } // end of wxRemoveHandleAssociation // @@ -3660,14 +3660,14 @@ void wxWindowOS2::OnSysColourChanged( wxSysColourChangedEvent& rEvent ) { - wxWindowListNode* pNode = GetChildren().GetFirst(); + wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); - while (pNode) + while (node) { // // Only propagate to non-top-level windows // - wxWindow* pWin = (wxWindow *)pNode->GetData(); + wxWindow* pWin = (wxWindow *)node->GetData(); if (pWin->GetParent()) { @@ -3676,7 +3676,7 @@ void wxWindowOS2::OnSysColourChanged( rEvent.m_eventObject = pWin; pWin->GetEventHandler()->ProcessEvent(vEvent); } - pNode = pNode->GetNext(); + node = node->GetNext(); } } // end of wxWindowOS2::OnSysColourChanged @@ -4412,11 +4412,11 @@ void wxWindowOS2::MoveChildren( { SWP vSwp; - for (wxWindowList::Node* pNode = GetChildren().GetFirst(); - pNode; - pNode = pNode->GetNext()) + for (wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); + node; + node = node->GetNext()) { - wxWindow* pWin = pNode->GetData(); + wxWindow* pWin = node->GetData(); ::WinQueryWindowPos( GetHwndOf(pWin) ,&vSwp @@ -5311,7 +5311,7 @@ wxWindowOS2* FindWindowForMouseEvent( if (pWinUnderMouse) { - wxWindowList::Node* pCurrent = pWinUnderMouse->GetChildren().GetFirst(); + wxWindowList::compatibility_iterator current = pWinUnderMouse->GetChildren().GetFirst(); wxWindow* pGrandChild = NULL; RECTL vRect; POINTL vPoint2; @@ -5320,9 +5320,9 @@ wxWindowOS2* FindWindowForMouseEvent( // // Find a child window mouse might be under // - while (pCurrent) + while (current) { - wxWindow* pChild = pCurrent->GetData(); + wxWindow* pChild = current->GetData(); vPoint2.x = vPoint.x; vPoint2.y = vPoint.y; @@ -5333,11 +5333,11 @@ wxWindowOS2* FindWindowForMouseEvent( if (pChild->IsTopLevel()) { POINTL vPoint3; - wxWindowList::Node* pCurrent2 =pChild->GetChildren().GetFirst(); + wxWindowList::compatibility_iterator current2 =pChild->GetChildren().GetFirst(); - while (pCurrent2) + while (current2) { - wxWindow* pGrandChild = pCurrent2->GetData(); + wxWindow* pGrandChild = current2->GetData(); vPoint3.x = vPoint2.x; vPoint3.y = vPoint2.y; @@ -5353,7 +5353,7 @@ wxWindowOS2* FindWindowForMouseEvent( pWinUnderMouse = pGrandChild; break; } - pCurrent2 = pCurrent2->GetNext(); + current2 = current2->GetNext(); } if (pGrandChild) break; @@ -5365,7 +5365,7 @@ wxWindowOS2* FindWindowForMouseEvent( if (rcVisible && rcEnabled) break; } - pCurrent = pCurrent->GetNext(); + current = current->GetNext(); } } }