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
This commit is contained in:
Vadim Zeitlin
2004-07-25 23:09:33 +00:00
parent fe8604acce
commit b8033a5ddc
3 changed files with 42 additions and 39 deletions

View File

@@ -13,6 +13,7 @@
#define _WX_PRIVATE_H_ #define _WX_PRIVATE_H_
#include "wx/defs.h" #include "wx/defs.h"
#include "wx/hashmap.h"
#include "wx/utils.h" #include "wx/utils.h"
#if defined( __cplusplus ) && defined( __VMS ) #if defined( __cplusplus ) && defined( __VMS )
#pragma message disable nosimpint #pragma message disable nosimpint
@@ -52,6 +53,12 @@ class wxWindow;
// corresponding to the window for this widget // 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 void wxDeleteWindowFromTable(Window w);
extern wxWindow *wxGetWindowFromTable(Window w); extern wxWindow *wxGetWindowFromTable(Window w);
extern bool wxAddWindowToTable(Window w, wxWindow *win); extern bool wxAddWindowToTable(Window w, wxWindow *win);

View File

@@ -46,8 +46,8 @@
extern wxList wxPendingDelete; extern wxList wxPendingDelete;
wxHashTable *wxWidgetHashTable = NULL; wxWindowHash *wxWidgetHashTable = NULL;
wxHashTable *wxClientWidgetHashTable = NULL; wxWindowHash *wxClientWidgetHashTable = NULL;
static bool g_showIconic = FALSE; static bool g_showIconic = FALSE;
static wxSize g_initialSize = wxDefaultSize; static wxSize g_initialSize = wxDefaultSize;
@@ -203,8 +203,8 @@ bool wxApp::Initialize(int& argc, wxChar **argv)
wxFont::SetDefaultEncoding(wxLocale::GetSystemEncoding()); wxFont::SetDefaultEncoding(wxLocale::GetSystemEncoding());
#endif #endif
wxWidgetHashTable = new wxHashTable(wxKEY_INTEGER); wxWidgetHashTable = new wxWindowHash;
wxClientWidgetHashTable = new wxHashTable(wxKEY_INTEGER); wxClientWidgetHashTable = new wxWindowHash;
return true; return true;
} }

View File

@@ -62,8 +62,6 @@
// global variables for this module // global variables for this module
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
extern wxHashTable *wxWidgetHashTable;
extern wxHashTable *wxClientWidgetHashTable;
static wxWindow* g_captureWindow = NULL; static wxWindow* g_captureWindow = NULL;
static GC g_eraseGC; static GC g_eraseGC;
@@ -1296,70 +1294,68 @@ void wxWindowX11::OnInternalIdle()
// function which maintain the global hash table mapping Widgets to wxWidgets // 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 ( !hash->insert(wxWindowHash::value_type(w, win)).second )
if ((oldItem = (wxWindow *)wxWidgetHashTable->Get ((long) w)))
{ {
wxLogDebug( wxT("Widget table clash: new widget is %ld, %s"), wxLogDebug( wxT("Widget table clash: new widget is 0x%08x, %s"),
(long)w, win->GetClassInfo()->GetClassName()); (unsigned int)w, win->GetClassInfo()->GetClassName());
return FALSE; return FALSE;
} }
wxWidgetHashTable->Put((long) w, win);
wxLogTrace( wxT("widget"), wxT("XWindow 0x%08x <-> window %p (%s)"), wxLogTrace( wxT("widget"), wxT("XWindow 0x%08x <-> window %p (%s)"),
(unsigned int) w, win, win->GetClassInfo()->GetClassName()); (unsigned int) w, win, win->GetClassInfo()->GetClassName());
return TRUE; return TRUE;
} }
static inline wxWindow *DoGetWindowFromTable(wxWindowHash *hash, Window w)
{
wxWindowHash::iterator i = hash->find(w);
return i == hash->end() ? NULL : i->second;
}
static inline void DoDeleteWindowFromTable(wxWindowHash *hash, Window w)
{
wxLogTrace( wxT("widget"), wxT("XWindow 0x%08x deleted"), (unsigned int) w);
hash->erase(w);
}
// ----------------------------------------------------------------------------
// public wrappers
// ----------------------------------------------------------------------------
bool wxAddWindowToTable(Window w, wxWindow *win)
{
return DoAddWindowToTable(wxWidgetHashTable, w, win);
}
wxWindow *wxGetWindowFromTable(Window w) wxWindow *wxGetWindowFromTable(Window w)
{ {
return (wxWindow *)wxWidgetHashTable->Get((long) w); return DoGetWindowFromTable(wxWidgetHashTable, w);
} }
void wxDeleteWindowFromTable(Window w) void wxDeleteWindowFromTable(Window w)
{ {
wxWidgetHashTable->Delete((long)w); DoDeleteWindowFromTable(wxWidgetHashTable, w);
} }
// ----------------------------------------------------------------------------
// function which maintain the global hash table mapping client widgets
// ----------------------------------------------------------------------------
bool wxAddClientWindowToTable(Window w, wxWindow *win) bool wxAddClientWindowToTable(Window w, wxWindow *win)
{ {
wxWindow *oldItem = NULL; return DoAddWindowToTable(wxClientWidgetHashTable, w, win);
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;
}
wxClientWidgetHashTable->Put((long) w, win);
wxLogTrace( wxT("widget"), wxT("XWindow 0x%08x <-> window %p (%s)"),
(unsigned int) w, win, win->GetClassInfo()->GetClassName());
return TRUE;
} }
wxWindow *wxGetClientWindowFromTable(Window w) wxWindow *wxGetClientWindowFromTable(Window w)
{ {
return (wxWindow *)wxClientWidgetHashTable->Get((long) w); return DoGetWindowFromTable(wxClientWidgetHashTable, w);
} }
void wxDeleteClientWindowFromTable(Window w) void wxDeleteClientWindowFromTable(Window w)
{ {
wxClientWidgetHashTable->Delete((long)w); DoDeleteWindowFromTable(wxClientWidgetHashTable, w);
} }
// ----------------------------------------------------------------------------
// add/remove window from the table
// ----------------------------------------------------------------------------
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// X11-specific accessors // X11-specific accessors
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------