X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f41ed3c4424167578262d283865b4642f2da8271..ccf0e7f6d42817cad37fc6480a6c0381fe6799e0:/src/mgl/window.cpp diff --git a/src/mgl/window.cpp b/src/mgl/window.cpp index cb44a8ad26..830b19167d 100644 --- a/src/mgl/window.cpp +++ b/src/mgl/window.cpp @@ -90,80 +90,6 @@ enum // private functions // --------------------------------------------------------------------------- -// wxCreateMGL_WM creates MGL display DC and associates it with winmng_t -// structure. Dimensions and depth of the DC are fetched from wxSystemOptions -// object. -// This function is *not* called from wxApp's initialization but rather at -// the time when WM is needed, i.e. when first wxWindow is created. This -// has two important effects: -// a) it is possible to write windowless wxMGL apps -// b) the app has plenty of time in wxApp::OnInit to feed wxSystemOptions -// with desired settings - -// FIXME_MGL -- move to app.cpp?? -static void wxDesktopPainter(window_t *wnd, MGLDC *dc) -{ - // FIXME_MGL - for now... - MGL_setColorRGB(0x63, 0x63, 0x96); - MGL_fillRectCoord(0, 0, wnd->width, wnd->height); -} - - -bool wxCreateMGL_WM() -{ - int mode; - int width = 640, height = 480, depth = 16; - int refresh = MGL_DEFAULT_REFRESH; - -#if wxUSE_SYSTEM_OPTIONS - // FIXME_MGL -- so what is The Proper Way? - if ( wxSystemOptions::HasOption(wxT("mgl.screen-width") ) - width = wxSystemOptions::GetOptionInt(wxT("mgl.screen-width")); - if ( wxSystemOptions::HasOption(wxT("mgl.screen-height") ) - height = wxSystemOptions::GetOptionInt(wxT("mgl.screen-height")); - if ( wxSystemOptions::HasOption(wxT("mgl.screen-depth") ) - depth = wxSystemOptions::GetOptionInt(wxT("mgl.screen-depth")); - if ( wxSystemOptions::HasOption(wxT("mgl.screen-refresh") ) - refresh = wxSystemOptions::GetOptionInt(wxT("mgl.screen-refresh")); -#endif - - mode = MGL_findMode(width, height, depth); - if ( mode == -1 ) - { - wxLogWarning(_("Mode %ix%i-%i not available, falling back to default mode."), width, height, depth); - mode = 0; // always available - } - g_displayDC = new MGLDisplayDC(mode, 1, refresh); - if ( !g_displayDC->isValid() ) - { - delete g_displayDC; - g_displayDC = NULL; - return FALSE; - } - - g_winMng = MGL_wmCreate(g_displayDC->getDC()); - if (!g_winMng) - return FALSE; - - MGL_wmSetWindowPainter(MGL_wmGetRootWindow(g_winMng), wxDesktopPainter); - - return TRUE; -} - -void wxDestroyMGL_WM() -{ - if ( g_winMng ) - { - MGL_wmDestroy(g_winMng); - g_winMng = NULL; - } - if ( g_displayDC ) - { - delete g_displayDC; - g_displayDC = NULL; - } -} - // Returns toplevel grandparent of given window: static wxWindowMGL* wxGetTopLevelParent(wxWindowMGL *win) { @@ -201,8 +127,6 @@ static void wxWindowPainter(window_t *wnd, MGLDC *dc) MGLDevCtx ctx(dc); w->HandlePaint(&ctx); } - // FIXME_MGL -- root window should be a regular window so that - // enter/leave and activate/deactivate events work correctly } static ibool wxWindowMouseHandler(window_t *wnd, event_t *e) @@ -542,6 +466,11 @@ END_EVENT_TABLE() void wxWindowMGL::Init() { + // First of all, make sure window manager is up and running. If it is + // not the case, initialize it in default display mode + if ( !g_winMng ) + wxTheApp->SetDisplayMode(wxDisplayModeInfo(wxSize(640, 480), 16)); + // generic: InitBase(); @@ -634,18 +563,35 @@ bool wxWindowMGL::Create(wxWindow *parent, wnd_parent = NULL; } - m_wnd = MGL_wmCreateWindow(g_winMng, wnd_parent, x, y, w, h); + window_t *wnd = MGL_wmCreateWindow(g_winMng, wnd_parent, x, y, w, h); + + MGL_wmSetWindowFlags(wnd, mgl_style); + MGL_wmShowWindow(wnd, m_isShown); + + SetMGLwindow_t(wnd); + + return TRUE; +} + +void wxWindowMGL::SetMGLwindow_t(struct window_t *wnd) +{ + if ( m_wnd ) + MGL_wmDestroyWindow(m_wnd); + + m_wnd = wnd; + if ( !m_wnd ) return; + + m_isShown = m_wnd->visible; - MGL_wmSetWindowFlags(m_wnd, mgl_style); MGL_wmSetWindowUserData(m_wnd, (void*) this); MGL_wmSetWindowPainter(m_wnd, wxWindowPainter); - MGL_wmShowWindow(m_wnd, m_isShown); - MGL_wmSetWindowCursor(m_wnd, *wxSTANDARD_CURSOR->GetMGLCursor()); - MGL_wmPushWindowEventHandler(m_wnd, wxWindowMouseHandler, EVT_MOUSEEVT, 0); MGL_wmPushWindowEventHandler(m_wnd, wxWindowKeybHandler, EVT_KEYEVT, 0); - - return TRUE; + + if ( m_cursor.Ok() ) + MGL_wmSetWindowCursor(m_wnd, *m_cursor.GetMGLCursor()); + else + MGL_wmSetWindowCursor(m_wnd, *wxSTANDARD_CURSOR->GetMGLCursor()); } // --------------------------------------------------------------------------- @@ -983,11 +929,15 @@ void wxWindowMGL::DoSetSize(int x, int y, int width, int height, int sizeFlags) } } - DoMoveWindow(x, y, width, height); + if ( m_wnd->x != x || m_wnd->y != y || + (int)m_wnd->width != width || (int)m_wnd->height != height ) + { + DoMoveWindow(x, y, width, height); - wxSizeEvent event(wxSize(width, height), GetId()); - event.SetEventObject(this); - GetEventHandler()->ProcessEvent(event); + wxSizeEvent event(wxSize(width, height), GetId()); + event.SetEventObject(this); + GetEventHandler()->ProcessEvent(event); + } } void wxWindowMGL::DoSetClientSize(int width, int height)