wxMGL wxWindow and wxApp mostly complete, now hunting bugs

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@11341 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Václav Slavík
2001-08-09 22:40:39 +00:00
parent 2cb980c58d
commit 7bdc18790e
13 changed files with 802 additions and 156 deletions

View File

@@ -65,8 +65,11 @@ MGLDevCtx *g_displayDC = NULL;
extern wxList WXDLLEXPORT wxPendingDelete;
// FIXME_MGL -- ???
static wxWindowMGL *g_focusedWindow;
// the window that has keyboard+joystick focus:
static wxWindowMGL *g_focusedWindow = NULL;
// the window that is currently under mouse cursor:
static wxWindowMGL *g_windowUnderMouse = NULL;
// ---------------------------------------------------------------------------
// constants
@@ -85,8 +88,6 @@ enum
// private functions
// ---------------------------------------------------------------------------
static void wxWindowPainter(window_t *wnd, MGLDC *dc);
// wxCreateMGL_WM creates MGL display DC and associates it with winmng_t
// structure. Dimensions and depth of the DC are fetched from wxSystemOptions
// object.
@@ -137,15 +138,31 @@ bool wxCreateMGL_WM()
void wxDestroyMGL_WM()
{
if (g_winMng)
if ( g_winMng )
{
MGL_wmDestroy(g_winMng);
g_winMng = NULL;
}
delete g_displayDC;
g_displayDC = NULL;
if ( g_displayDC )
{
delete g_displayDC;
g_displayDC = NULL;
}
}
// ---------------------------------------------------------------------------
// MGL_WM hooks:
// ---------------------------------------------------------------------------
static void wxWindowPainter(window_t *wnd, MGLDC *dc)
{
wxWindowMGL *w = (wxWindow*) wnd->userData;
if (w)
{
MGLDevCtx ctx(dc);
w->HandlePaint(&ctx);
}
}
// ---------------------------------------------------------------------------
// event tables
@@ -156,8 +173,6 @@ void wxDestroyMGL_WM()
IMPLEMENT_ABSTRACT_CLASS(wxWindowMGL, wxWindowBase)
BEGIN_EVENT_TABLE(wxWindowMGL, wxWindowBase)
EVT_ERASE_BACKGROUND(wxWindowMGL::OnEraseBackground)
EVT_SET_FOCUS(wxWindowMGL::OnSetFocus)
END_EVENT_TABLE()
// ===========================================================================
@@ -191,7 +206,8 @@ wxWindowMGL::~wxWindowMGL()
m_isBeingDeleted = TRUE;
if ( g_focusedWindow == this )
g_focusedWindow = NULL;
KillFocus();
#if 0 // -- fixme - do we need this?
// VS: make sure there's no wxFrame with last focus set to us:
for (wxWindow *win = GetParent(); win; win = win->GetParent())
@@ -226,12 +242,16 @@ bool wxWindowMGL::Create(wxWindow *parent,
long style,
const wxString& name)
{
wxCHECK_MSG( parent, FALSE, wxT("can't create wxWindow without parent") );
// FIXME_MGL -- temporary!
//wxCHECK_MSG( parent, FALSE, wxT("can't create wxWindow without parent") );
if ( !CreateBase(parent, id, pos, size, style, wxDefaultValidator, name) )
return FALSE;
parent->AddChild(this);
if ( parent ) // FIXME_MGL temporary
parent->AddChild(this);
else
m_isShown=FALSE;// FIXME_MGL -- temporary, simulates wxTLW/wxFrame
if ( style & wxPOPUP_WINDOW )
{
@@ -260,10 +280,6 @@ void wxWindowMGL::SetFocus()
MGL_wmCaptureEvents(GetHandle(), EVT_KEYEVT | EVT_JOYEVT, wxMGL_CAPTURE_KEYB);
wxPanel *panel = wxDynamicCast(GetParent(), wxPanel);
if (panel)
panel->SetLastFocus((wxWindow*)this);
#if wxUSE_CARET
// caret needs to be informed about focus change
wxCaret *caret = GetCaret();
@@ -288,16 +304,18 @@ void wxWindowMGL::KillFocus()
if ( g_focusedWindow != this ) return;
g_focusedWindow = NULL;
if ( m_isBeingDeleted ) return;
MGL_wmUncaptureEvents(GetHandle(), wxMGL_CAPTURE_KEYB);
#if wxUSE_CARET
// caret needs to be informed about focus change
wxCaret *caret = GetCaret();
if (caret)
if ( caret )
caret->OnKillFocus();
#endif // wxUSE_CARET
if (IsTopLevel())
if ( IsTopLevel() )
{
wxActivateEvent event(wxEVT_ACTIVATE, FALSE, GetId());
event.SetEventObject(this);
@@ -657,35 +675,6 @@ void wxWindowMGL::GetCaretPos(int *x, int *y) const
#endif // wxUSE_CARET
// ---------------------------------------------------------------------------
// activation/focus
// ---------------------------------------------------------------------------
void wxWindowMGL::OnSetFocus(wxFocusEvent& event)
{
// panel wants to track the window which was the last to have focus in it,
// so we want to set ourselves as the window which last had focus
//
// notice that it's also important to do it upwards the tree becaus
// otherwise when the top level panel gets focus, it won't set it back to
// us, but to some other sibling
wxWindow *win = (wxWindow *)this;
while ( win )
{
wxWindow *parent = win->GetParent();
wxPanel *panel = wxDynamicCast(parent, wxPanel);
if ( panel )
{
panel->SetLastFocus(win);
}
win = parent;
}
event.Skip();
}
// ---------------------------------------------------------------------------
// painting
// ---------------------------------------------------------------------------
@@ -731,16 +720,6 @@ void wxWindowMGL::Thaw()
Refresh();
}
static void wxWindowPainter(window_t *wnd, MGLDC *dc)
{
wxWindow *w = (wxWindow*) wnd->userData;
if (w)
{
MGLDevCtx ctx(dc);
w->HandlePaint(&ctx);
}
}
void wxWindowMGL::HandlePaint(MGLDevCtx *dc)
{
if ( m_frozen )
@@ -749,14 +728,17 @@ void wxWindowMGL::HandlePaint(MGLDevCtx *dc)
return;
}
region_t *clip = NULL;
MGL_getClipRegionDC(*dc, clip);
m_updateRegion = wxRegion(MGLRegion(clip));
region_t clip;
MGL_getClipRegionDC(*dc, &clip);
m_updateRegion = wxRegion(MGLRegion(&clip));
m_paintMGLDC = dc;
wxEraseEvent eventEr(m_windowId, NULL);
{
wxWindowDC dc((wxWindow*)this);
wxEraseEvent eventEr(m_windowId, &dc);
eventEr.SetEventObject(this);
GetEventHandler()->ProcessEvent(eventEr);
}
wxNcPaintEvent eventNc(GetId());
eventNc.SetEventObject(this);
@@ -765,11 +747,8 @@ void wxWindowMGL::HandlePaint(MGLDevCtx *dc)
wxPaintEvent eventPt(GetId());
eventPt.SetEventObject(this);
GetEventHandler()->ProcessEvent(eventPt);
}
void wxWindowMGL::OnEraseBackground(wxEraseEvent& event)
{
Clear();
m_paintMGLDC = NULL;
}