From: Vadim Zeitlin Date: Sun, 25 Jul 2004 23:09:33 +0000 (+0000) Subject: replace wxHashTable with a type safe hash map of Window to wxWindow X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/b8033a5ddc49eac10758bad563479e573fdf7390?ds=inline replace wxHashTable with a type safe hash map of Window to wxWindow git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@28505 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/x11/private.h b/include/wx/x11/private.h index e98a62cd83..80596e6bbd 100644 --- a/include/wx/x11/private.h +++ b/include/wx/x11/private.h @@ -13,6 +13,7 @@ #define _WX_PRIVATE_H_ #include "wx/defs.h" +#include "wx/hashmap.h" #include "wx/utils.h" #if defined( __cplusplus ) && defined( __VMS ) #pragma message disable nosimpint @@ -52,6 +53,12 @@ class wxWindow; // corresponding to the window for this widget // ---------------------------------------------------------------------------- +WX_DECLARE_HASH_MAP(Window, wxWindow *, wxIntegerHash, wxIntegerEqual, wxWindowHash); + +// these hashes are defined in app.cpp +extern wxWindowHash *wxWidgetHashTable; +extern wxWindowHash *wxClientWidgetHashTable; + extern void wxDeleteWindowFromTable(Window w); extern wxWindow *wxGetWindowFromTable(Window w); extern bool wxAddWindowToTable(Window w, wxWindow *win); diff --git a/src/x11/app.cpp b/src/x11/app.cpp index db8aaf22c3..9a5fff8ef2 100644 --- a/src/x11/app.cpp +++ b/src/x11/app.cpp @@ -46,8 +46,8 @@ extern wxList wxPendingDelete; -wxHashTable *wxWidgetHashTable = NULL; -wxHashTable *wxClientWidgetHashTable = NULL; +wxWindowHash *wxWidgetHashTable = NULL; +wxWindowHash *wxClientWidgetHashTable = NULL; static bool g_showIconic = FALSE; static wxSize g_initialSize = wxDefaultSize; @@ -203,8 +203,8 @@ bool wxApp::Initialize(int& argc, wxChar **argv) wxFont::SetDefaultEncoding(wxLocale::GetSystemEncoding()); #endif - wxWidgetHashTable = new wxHashTable(wxKEY_INTEGER); - wxClientWidgetHashTable = new wxHashTable(wxKEY_INTEGER); + wxWidgetHashTable = new wxWindowHash; + wxClientWidgetHashTable = new wxWindowHash; return true; } diff --git a/src/x11/window.cpp b/src/x11/window.cpp index bc515eef7d..666f2d0157 100644 --- a/src/x11/window.cpp +++ b/src/x11/window.cpp @@ -62,8 +62,6 @@ // global variables for this module // ---------------------------------------------------------------------------- -extern wxHashTable *wxWidgetHashTable; -extern wxHashTable *wxClientWidgetHashTable; static wxWindow* g_captureWindow = NULL; static GC g_eraseGC; @@ -1296,70 +1294,68 @@ void wxWindowX11::OnInternalIdle() // function which maintain the global hash table mapping Widgets to wxWidgets // ---------------------------------------------------------------------------- -bool wxAddWindowToTable(Window w, wxWindow *win) +static bool DoAddWindowToTable(wxWindowHash *hash, Window w, wxWindow *win) { - wxWindow *oldItem = NULL; - if ((oldItem = (wxWindow *)wxWidgetHashTable->Get ((long) w))) + if ( !hash->insert(wxWindowHash::value_type(w, win)).second ) { - wxLogDebug( wxT("Widget table clash: new widget is %ld, %s"), - (long)w, win->GetClassInfo()->GetClassName()); + wxLogDebug( wxT("Widget table clash: new widget is 0x%08x, %s"), + (unsigned int)w, win->GetClassInfo()->GetClassName()); return FALSE; } - wxWidgetHashTable->Put((long) w, win); - wxLogTrace( wxT("widget"), wxT("XWindow 0x%08x <-> window %p (%s)"), (unsigned int) w, win, win->GetClassInfo()->GetClassName()); return TRUE; } -wxWindow *wxGetWindowFromTable(Window w) +static inline wxWindow *DoGetWindowFromTable(wxWindowHash *hash, Window w) { - return (wxWindow *)wxWidgetHashTable->Get((long) w); + wxWindowHash::iterator i = hash->find(w); + return i == hash->end() ? NULL : i->second; } -void wxDeleteWindowFromTable(Window w) +static inline void DoDeleteWindowFromTable(wxWindowHash *hash, Window w) { - wxWidgetHashTable->Delete((long)w); + wxLogTrace( wxT("widget"), wxT("XWindow 0x%08x deleted"), (unsigned int) w); + + hash->erase(w); } // ---------------------------------------------------------------------------- -// function which maintain the global hash table mapping client widgets +// public wrappers // ---------------------------------------------------------------------------- -bool wxAddClientWindowToTable(Window w, wxWindow *win) +bool wxAddWindowToTable(Window w, wxWindow *win) { - wxWindow *oldItem = NULL; - if ((oldItem = (wxWindow *)wxClientWidgetHashTable->Get ((long) w))) - { - wxLogDebug( wxT("Client window table clash: new window is %ld, %s"), - (long)w, win->GetClassInfo()->GetClassName()); - return FALSE; - } + return DoAddWindowToTable(wxWidgetHashTable, w, win); +} - wxClientWidgetHashTable->Put((long) w, win); +wxWindow *wxGetWindowFromTable(Window w) +{ + return DoGetWindowFromTable(wxWidgetHashTable, w); +} - wxLogTrace( wxT("widget"), wxT("XWindow 0x%08x <-> window %p (%s)"), - (unsigned int) w, win, win->GetClassInfo()->GetClassName()); +void wxDeleteWindowFromTable(Window w) +{ + DoDeleteWindowFromTable(wxWidgetHashTable, w); +} - return TRUE; +bool wxAddClientWindowToTable(Window w, wxWindow *win) +{ + return DoAddWindowToTable(wxClientWidgetHashTable, w, win); } wxWindow *wxGetClientWindowFromTable(Window w) { - return (wxWindow *)wxClientWidgetHashTable->Get((long) w); + return DoGetWindowFromTable(wxClientWidgetHashTable, w); } void wxDeleteClientWindowFromTable(Window w) { - wxClientWidgetHashTable->Delete((long)w); + DoDeleteWindowFromTable(wxClientWidgetHashTable, w); } -// ---------------------------------------------------------------------------- -// add/remove window from the table -// ---------------------------------------------------------------------------- - // ---------------------------------------------------------------------------- // X11-specific accessors // ----------------------------------------------------------------------------