X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/223d09f6b523aac674ef9b72a883dfa8d37c5d4e..d52e91c98083f6ec9d7c4a9e392240e6fad5ed04:/src/os2/dcclient.cpp diff --git a/src/os2/dcclient.cpp b/src/os2/dcclient.cpp index c32978beb7..bc20d8ac52 100644 --- a/src/os2/dcclient.cpp +++ b/src/os2/dcclient.cpp @@ -17,17 +17,9 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ - #pragma implementation "dcclient.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" -#ifdef __BORLANDC__ - #pragma hdrstop -#endif - #include "wx/string.h" #include "wx/log.h" #include "wx/window.h" @@ -42,17 +34,19 @@ struct WXDLLEXPORT wxPaintDCInfo { - wxPaintDCInfo(wxWindow *win, wxDC *dc) + wxPaintDCInfo( wxWindow* pWin + ,wxDC* pDC + ) { - hwnd = win->GetHWND(); - hdc = dc->GetHDC(); - count = 1; + m_hWnd = pWin->GetHWND(); + m_hDC = pDC->GetHDC(); + m_nCount = 1; } - WXHWND hwnd; // window for this DC - WXHDC hdc; // the DC handle - size_t count; // usage count -}; + WXHWND m_hWnd; // window for this DC + WXHDC m_hDC; // the DC handle + size_t m_nCount; // usage count +}; // end of wxPaintDCInfot #include "wx/arrimpl.cpp" @@ -62,11 +56,9 @@ WX_DEFINE_OBJARRAY(wxArrayDCInfo); // macros // ---------------------------------------------------------------------------- -#if !USE_SHARED_LIBRARY IMPLEMENT_DYNAMIC_CLASS(wxWindowDC, wxDC) IMPLEMENT_DYNAMIC_CLASS(wxClientDC, wxWindowDC) IMPLEMENT_DYNAMIC_CLASS(wxPaintDC, wxWindowDC) -#endif // ---------------------------------------------------------------------------- // global variables @@ -92,48 +84,68 @@ static RECT g_paintStruct; wxWindowDC::wxWindowDC() { - m_canvas = NULL; -} - -wxWindowDC::wxWindowDC(wxWindow *the_canvas) -{ - m_canvas = the_canvas; - m_hDC = (WXHDC) ::WinOpenWindowDC(GetWinHwnd(the_canvas) ); - m_hDCCount++; - // - // default under PM is that Window and Client DC's are the same - // so we offer a separate Presentation Space to use for the - // entire window. Otherwise, calling BeginPaint will just create - // chached-micro client presentation space - // - m_hPS = GpiCreatePS( m_hab - ,m_hDC - ,&m_PageSize - ,PU_PELS | GPIF_LONG | GPIA_ASSOC - ); - ::GpiAssociate(m_hPS, NULLHANDLE); - ::GpiAssociate(m_hPS, m_hDC); - SetBackground(wxBrush(m_canvas->GetBackgroundColour(), wxSOLID)); + m_pCanvas = NULL; } -wxWindowDC::~wxWindowDC() +wxWindowDC::wxWindowDC( + wxWindow* pTheCanvas +) { - if (m_canvas && m_hDC) - { - SelectOldObjects(m_hDC); + ERRORID vError; + wxString sError; + m_pCanvas = pTheCanvas; + m_hDC = (WXHDC) ::WinOpenWindowDC(GetWinHwnd(pTheCanvas) ); + m_nDCCount++; // - // In PM one does not explicitly close or release an open WindowDC - // They automatically close with the window, unless explicitly detached - // but we need to destroy our PS + // default under PM is that Window and Client DC's are the same + // so we offer a separate Presentation Space to use for the + // entire window. Otherwise, calling BeginPaint will just create + // chached-micro client presentation space // + m_hPS = GpiCreatePS( m_hab + ,m_hDC + ,&m_PageSize + ,PU_PELS | GPIF_LONG | GPIA_ASSOC + ); ::GpiAssociate(m_hPS, NULLHANDLE); - ::GpiDestroyPS(m_hPS); - m_hPS = NULLHANDLE; - m_hDC = NULLHANDLE; - } + ::GpiAssociate(m_hPS, m_hDC); + // Set the wxWindows color table + if (!::GpiCreateLogColorTable( m_hPS + ,0L + ,LCOLF_CONSECRGB + ,0L + ,(LONG)wxTheColourDatabase->m_nSize + ,(PLONG)wxTheColourDatabase->m_palTable + )) + { + vError = ::WinGetLastError(vHabmain); + sError = wxPMErrorToStr(vError); + wxLogError("Unable to set current color table. Error: %s\n", sError); + } + SetBackground(wxBrush(m_pCanvas->GetBackgroundColour(), wxSOLID)); +} - m_hDCCount--; +wxWindowDC::~wxWindowDC() +{ + if (m_pCanvas && m_hDC) + { + SelectOldObjects(m_hDC); + + // + // In PM one does not explicitly close or release an open WindowDC + // They automatically close with the window, unless explicitly detached + // but we need to destroy our PS + // + if(m_hPS) + { + ::GpiAssociate(m_hPS, NULLHANDLE); + ::GpiDestroyPS(m_hPS); + } + m_hPS = NULLHANDLE; + m_hDC = NULLHANDLE; + } + m_nDCCount--; } // ---------------------------------------------------------------------------- @@ -142,36 +154,64 @@ wxWindowDC::~wxWindowDC() wxClientDC::wxClientDC() { - m_canvas = NULL; + m_pCanvas = NULL; } -wxClientDC::wxClientDC(wxWindow *the_canvas) +wxClientDC::wxClientDC( + wxWindow* pTheCanvas +) { - m_canvas = the_canvas; + SIZEL vSizl = { 0,0}; + ERRORID vError; + wxString sError; - // - // default under PM is that Window and Client DC's are the same - // - m_hDC = (WXHDC) ::WinOpenWindowDC(GetWinHwnd(the_canvas)); + m_pCanvas = pTheCanvas; - // - // Default mode is BM_LEAVEALONE so we make no call Set the mix - // - SetBackground(wxBrush(m_canvas->GetBackgroundColour(), wxSOLID)); -} + // + // default under PM is that Window and Client DC's are the same + // + m_hDC = (WXHDC) ::WinOpenWindowDC(GetWinHwnd(pTheCanvas)); + m_hPS = ::GpiCreatePS( wxGetInstance() + ,m_hDC + ,&vSizl + ,PU_PELS | GPIF_LONG | GPIA_ASSOC + ); + + // Set the wxWindows color table + if (!::GpiCreateLogColorTable( m_hPS + ,0L + ,LCOLF_CONSECRGB + ,0L + ,(LONG)wxTheColourDatabase->m_nSize + ,(PLONG)wxTheColourDatabase->m_palTable + )) + { + vError = ::WinGetLastError(vHabmain); + sError = wxPMErrorToStr(vError); + wxLogError("Unable to set current color table. Error: %s\n", sError); + } + // + // Default mode is BM_LEAVEALONE so we make no call Set the mix + // + SetBackground(wxBrush( m_pCanvas->GetBackgroundColour() + ,wxSOLID + ) + ); +} // end of wxClientDC::wxClientDC wxClientDC::~wxClientDC() { - if ( m_canvas && GetHdc() ) - { - SelectOldObjects(m_hDC); - - // We don't explicitly release Device contexts in PM and - // the cached micro PS is already gone + if ( m_pCanvas && GetHdc() ) + { + SelectOldObjects(m_hDC); - m_hDC = 0; - } -} + // + // We don't explicitly release Device contexts in PM and + // the cached micro PS is already gone + // + m_hDC = 0; + } +} // end of wxClientDC::~wxClientDC // ---------------------------------------------------------------------------- // wxPaintDC @@ -197,38 +237,79 @@ wxArrayDCInfo wxPaintDC::ms_cache; wxPaintDC::wxPaintDC() { - m_canvas = NULL; + m_pCanvas = NULL; m_hDC = 0; } -wxPaintDC::wxPaintDC(wxWindow *canvas) +wxPaintDC::wxPaintDC( + wxWindow* pCanvas +) { - wxCHECK_RET( canvas, wxT("NULL canvas in wxPaintDC ctor") ); + wxCHECK_RET(pCanvas, wxT("NULL canvas in wxPaintDC ctor")); + RECTL vRect; #ifdef __WXDEBUG__ - if ( g_isPainting <= 0 ) + if (g_isPainting <= 0) { wxFAIL_MSG( wxT("wxPaintDC may be created only in EVT_PAINT handler!") ); - return; } #endif // __WXDEBUG__ - m_canvas = canvas; + m_pCanvas = pCanvas; - // do we have a DC for this window in the cache? - wxPaintDCInfo *info = FindInCache(); - if ( info ) + // + // Do we have a DC for this window in the cache? + // + wxPaintDCInfo* pInfo = FindInCache(); + + if (pInfo) { - m_hDC = info->hdc; - info->count++; + m_hDC = pInfo->m_hDC; + pInfo->m_nCount++; } else // not in cache, create a new one { - m_hDC = (WXHDC)::WinBeginPaint(GetWinHwnd(m_canvas), NULLHANDLE, &g_paintStruct); - ms_cache.Add(new wxPaintDCInfo(m_canvas, this)); + HPS hPS; + + hPS = ::WinBeginPaint( GetWinHwnd(m_pCanvas) + ,NULLHANDLE + ,&g_paintStruct + ); + if(hPS) + { + POINTL vPoint[2]; + LONG lControl; + LONG lColor; + + m_hOldPS = m_hPS; + m_hPS = hPS; + ::GpiCreateLogColorTable( m_hPS + ,0L + ,LCOLF_CONSECRGB + ,0L + ,(LONG)wxTheColourDatabase->m_nSize + ,(PLONG)wxTheColourDatabase->m_palTable + ); + ::GpiCreateLogColorTable( m_hPS + ,0L + ,LCOLF_RGB + ,0L + ,0L + ,NULL + ); + + ::WinFillRect(hPS, &g_paintStruct, m_pCanvas->GetBackgroundColour().GetPixel()); + ::WinQueryWindowRect( GetWinHwnd(m_pCanvas) + ,&m_vRclPaint + ); + } + + m_bIsPaintTime = TRUE; + m_hDC = (WXHDC) -1; // to satisfy those anonizmous efforts + ms_cache.Add(new wxPaintDCInfo(m_pCanvas, this)); } - SetBackground(wxBrush(m_canvas->GetBackgroundColour(), wxSOLID)); + SetBackground(wxBrush(m_pCanvas->GetBackgroundColour(), wxSOLID)); } wxPaintDC::~wxPaintDC() @@ -237,16 +318,17 @@ wxPaintDC::~wxPaintDC() { SelectOldObjects(m_hDC); - size_t index; - wxPaintDCInfo *info = FindInCache(&index); + size_t nIndex; + wxPaintDCInfo* pInfo = FindInCache(&nIndex); - wxCHECK_RET( info, wxT("existing DC should have a cache entry") ); + wxCHECK_RET( pInfo, wxT("existing DC should have a cache entry") ); - if ( !--info->count ) + if ( !--pInfo->m_nCount ) { ::WinEndPaint(m_hPS); - - ms_cache.Remove(index); + m_hPS = m_hOldPS; + m_bIsPaintTime = FALSE; + ms_cache.Remove(nIndex); } //else: cached DC entry is still in use @@ -255,20 +337,23 @@ wxPaintDC::~wxPaintDC() } } -wxPaintDCInfo *wxPaintDC::FindInCache(size_t *index) const +wxPaintDCInfo* wxPaintDC::FindInCache( + size_t* pIndex +) const { - wxPaintDCInfo *info = NULL; - size_t nCache = ms_cache.GetCount(); - for ( size_t n = 0; n < nCache; n++ ) + wxPaintDCInfo* pInfo = NULL; + size_t nCache = ms_cache.GetCount(); + + for (size_t n = 0; n < nCache; n++) { - info = &ms_cache[n]; - if ( info->hwnd == m_canvas->GetHWND() ) + pInfo = &ms_cache[n]; + if (pInfo->m_hWnd == m_pCanvas->GetHWND()) { - if ( index ) - *index = n; + if (pIndex) + *pIndex = n; break; } } + return pInfo; +} // end of wxPaintDC::FindInCache - return info; -}