X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f44fdfb032152a62cc0e3a4c0f09330cfab76710..10bd072488691de49910185bea3c7107c77148d1:/src/os2/window.cpp diff --git a/src/os2/window.cpp b/src/os2/window.cpp index 7a31cfbbda..eda3bf9747 100644 --- a/src/os2/window.cpp +++ b/src/os2/window.cpp @@ -37,11 +37,6 @@ #include #endif -#define DEBUG_PRINTF(NAME) { static int raz=0; \ - printf( #NAME " %i\n",raz); fflush(stdout); \ - raz++; \ - } - #if wxUSE_OWNER_DRAWN #include "wx/ownerdrw.h" #endif @@ -158,6 +153,7 @@ BEGIN_EVENT_TABLE(wxWindow, wxWindowBase) EVT_SYS_COLOUR_CHANGED(wxWindow::OnSysColourChanged) EVT_INIT_DIALOG(wxWindow::OnInitDialog) EVT_IDLE(wxWindow::OnIdle) + EVT_SET_FOCUS(wxWindow::OnSetFocus) END_EVENT_TABLE() // =========================================================================== @@ -249,9 +245,6 @@ bool wxWindow::OS2Command( , WXWORD WXUNUSED(uId) ) { - -DEBUG_PRINTF(wxWindow::OS2Command); - return(FALSE); } @@ -301,9 +294,6 @@ void wxWindow::Init() m_lLastMouseY = -1; m_nLastMouseEvent = -1; #endif // wxUSE_MOUSEEVENT_HACK - -DEBUG_PRINTF(wxWindow::Init-End); - } // wxWindow::Init // @@ -311,7 +301,6 @@ DEBUG_PRINTF(wxWindow::Init-End); // wxWindow::~wxWindow() { -DEBUG_PRINTF(wxWindow::~wxWindow-Start); m_isBeingDeleted = TRUE; OS2DetachWindowMenu(); @@ -321,8 +310,6 @@ DEBUG_PRINTF(wxWindow::~wxWindow-Start); if (m_hWnd) { -// UnsubclassWin(); - if(!::WinDestroyWindow(GetHWND())) wxLogLastError(wxT("DestroyWindow")); // @@ -330,7 +317,6 @@ DEBUG_PRINTF(wxWindow::~wxWindow-Start); // wxRemoveHandleAssociation(this); } -DEBUG_PRINTF(wxWindow::~wxWindow-End); } // end of wxWindow::~wxWindow bool wxWindow::Create( @@ -372,6 +358,12 @@ bool wxWindow::Create( // set in those class create procs. PM's basic windows styles are // very limited. // + ulCreateFlags |= WS_VISIBLE; + + + if ( lStyle & wxCLIP_SIBLINGS ) + ulCreateFlags |= WS_CLIPSIBLINGS; + if (lStyle & wxCLIP_CHILDREN ) ulCreateFlags |= WS_CLIPCHILDREN; @@ -513,7 +505,6 @@ bool wxWindow::SetFont( const wxFont& rFont ) { -DEBUG_PRINTF(wxWindow::SetFont); if (!wxWindowBase::SetFont(rFont)) { // nothing to do @@ -729,19 +720,12 @@ void wxWindow::SubclassWin( HWND hwnd = (HWND)hWnd; wxASSERT_MSG( !m_fnOldWndProc, wxT("subclassing window twice?") ); - wxCHECK_RET(::WinIsWindow(vHabmain, hwnd), wxT("invalid HWND in SubclassWin") ); - -// wxAssociateWinWithHandle(hwnd, this); - m_fnOldWndProc = (WXFARPROC) ::WinSubclassWindow(hwnd, (PFNWP)wxWndProc); -// ::WinSetWindowULong(hwnd, QWL_USER, (ULONG)wxWndProc); } // end of wxWindow::SubclassWin void wxWindow::UnsubclassWin() { -// wxRemoveHandleAssociation(this); - // // Restore old Window proc // @@ -749,11 +733,10 @@ void wxWindow::UnsubclassWin() if (m_hWnd) { -// m_hWnd = 0; - wxCHECK_RET( ::WinIsWindow(vHabmain, hwnd), wxT("invalid HWND in UnsubclassWin") ); PFNWP fnProc = (PFNWP)::WinQueryWindowPtr(hwnd, QWP_PFNWP); + if ( (m_fnOldWndProc != 0) && (fnProc != (PFNWP) m_fnOldWndProc)) { WinSubclassWindow(hwnd, (PFNWP)m_fnOldWndProc); @@ -1114,7 +1097,10 @@ void wxWindow::DoGetClientSize( RECTL vRect; hWndClient = ::WinWindowFromID(GetHwnd(), FID_CLIENT); - ::WinQueryWindowRect(hWndClient, &vRect); + if( hWndClient == NULLHANDLE) + ::WinQueryWindowRect(GetHwnd(), &vRect); + else + ::WinQueryWindowRect(hWndClient, &vRect); if (pWidth) *pWidth = vRect.xRight; @@ -1338,10 +1324,12 @@ int wxWindow::GetCharHeight() const hPs = ::WinGetPS(GetHwnd()); if(!GpiQueryFontMetrics(hPs, sizeof(FONTMETRICS), &vFontMetrics)) + { + ::WinReleasePS(hPs); return (0); - else - return(vFontMetrics.lMaxAscender + vFontMetrics.lMaxDescender); + } ::WinReleasePS(hPs); + return(vFontMetrics.lMaxAscender + vFontMetrics.lMaxDescender); } // end of wxWindow::GetCharHeight int wxWindow::GetCharWidth() const @@ -1352,10 +1340,12 @@ int wxWindow::GetCharWidth() const hPs = ::WinGetPS(GetHwnd()); if(!GpiQueryFontMetrics(hPs, sizeof(FONTMETRICS), &vFontMetrics)) + { + ::WinReleasePS(hPs); return (0); - else - return(vFontMetrics.lAveCharWidth); + } ::WinReleasePS(hPs); + return(vFontMetrics.lAveCharWidth); } // end of wxWindow::GetCharWidth void wxWindow::GetTextExtent( @@ -1519,8 +1509,6 @@ MRESULT wxWindow::OS2DefWindowProc( , WXLPARAM lParam ) { -DEBUG_PRINTF(wxWindow::OS2DefWindowProc); - if (m_fnOldWndProc) return (MRESULT)m_fnOldWndProc(GetHWND(), (ULONG)uMsg, (MPARAM)wParam, (MPARAM)lParam); else @@ -1533,8 +1521,6 @@ bool wxWindow::OS2ProcessMessage( { QMSG* pQMsg = (QMSG*)pMsg; -DEBUG_PRINTF(OS2ProcessMessage); - if (m_hWnd != 0 && (GetWindowStyleFlag() & wxTAB_TRAVERSAL)) { // @@ -1740,11 +1726,6 @@ void wxWindow::UnpackCommand( , WORD* pCmd ) { -/* - *pId = LOWORD(wParam); - *phWnd = (WXHWND)lParam; - *pCmd = HIWORD(wParam); -*/ *pId = LOWORD(wParam); *phWnd = NULL; // or may be GetHWND() ? *pCmd = LOWORD(lParam); @@ -1811,7 +1792,6 @@ MRESULT EXPENTRY wxWndProc( // Trace all ulMsgs - useful for the debugging // #ifdef __WXDEBUG__ -DEBUG_PRINTF(__WXDEBUG__wxWndProc); wxLogTrace(wxTraceMessages, wxT("Processing %s(wParam=%8lx, lParam=%8lx)"), wxGetMessageName(ulMsg), wParam, lParam); #endif // __WXDEBUG__ @@ -1872,17 +1852,6 @@ MRESULT wxWindow::OS2WindowProc( WXHICON hIcon; WXHBRUSH hBrush; - // - // The return value - // -// union -// { -// bool bAllow; -// MRESULT mResult; -// WXHICON hIcon; -// WXHBRUSH hBrush; -// } vRc; - // // For most messages we should return 0 when we do process the message // @@ -1951,7 +1920,6 @@ MRESULT wxWindow::OS2WindowProc( break; case WM_PAINT: -DEBUG_PRINTF(WM_PAINT) bProcessed = HandlePaint(); break; @@ -1962,11 +1930,9 @@ DEBUG_PRINTF(WM_PAINT) // bProcessed = TRUE; mResult = (MRESULT)TRUE; -DEBUG_PRINTF(WM_CLOSE) break; case WM_SHOW: -DEBUG_PRINTF(WM_SHOW) bProcessed = HandleShow(wParam != 0, (int)lParam); break; @@ -2005,11 +1971,9 @@ DEBUG_PRINTF(WM_SHOW) { WORD id, cmd; WXHWND hwnd; -DEBUG_PRINTF(WM_COMMAND-in) UnpackCommand(wParam, lParam, &id, &hwnd, &cmd); bProcessed = HandleCommand(id, cmd, hwnd); -DEBUG_PRINTF(WM_COMMAND-out) } break; @@ -2142,6 +2106,15 @@ DEBUG_PRINTF(WM_COMMAND-out) } break; #endif + case WM_ERASEBACKGROUND: + // + // Returning TRUE to requestw PM to paint the window background + // in SYSCLR_WINDOW. We don't really want that + // + bProcessed = HandleEraseBkgnd((WXHDC)(HPS)wParam); + mResult = (MRESULT)(FALSE); + break; + // // Instead of CTLCOLOR messages PM sends QUERYWINDOWPARAMS to // things such as colors and fonts and such @@ -2169,17 +2142,6 @@ DEBUG_PRINTF(WM_COMMAND-out) bProcessed = HandlePresParamChanged(wParam); break; - // move this to wxFrame - case WM_ERASEBACKGROUND: - bProcessed = HandleEraseBkgnd((WXHDC)(HDC)wParam); - if (bProcessed) - { - // - // We processed the message, i.e. erased the background - // - mResult = (MRESULT)TRUE; - } - break; // move all drag and drops to wxDrg case WM_ENDDRAG: @@ -2224,14 +2186,16 @@ DEBUG_PRINTF(WM_COMMAND-out) } break; } - if (!bProcessed) { #ifdef __WXDEBUG__ wxLogTrace(wxTraceMessages, wxT("Forwarding %s to DefWindowProc."), wxGetMessageName(uMsg)); #endif // __WXDEBUG__ - mResult = OS2DefWindowProc(uMsg, wParam, lParam); + if (IsKindOf(CLASSINFO(wxFrame))) + mResult = ::WinDefWindowProc(m_hWnd, uMsg, wParam, lParam); + else + mResult = OS2DefWindowProc(uMsg, wParam, lParam); } return mResult; } // end of wxWindow::OS2WindowProc @@ -2375,6 +2339,8 @@ bool wxWindow::OS2Create( long lWidth1 = 20L; long lHeight1 = 20L; int nControlId = 0; + int nNeedsubclass = 0; + PCSZ pszClass = zClass; // // Find parent's size, if it exists, to set up a possible default @@ -2414,6 +2380,21 @@ bool wxWindow::OS2Create( { nControlId = ulId; } + else + { + // no standard controls + if(wxString (wxT("wxFrameClass")) == wxString(zClass) ) + { + pszClass = WC_FRAME; + nNeedsubclass = 1; + } + else + { + nControlId = ulId; + if(nControlId < 0) + nControlId = FID_CLIENT; + } + } // // We will either have a registered class via string name or a standard PM Class via a long @@ -2426,9 +2407,9 @@ bool wxWindow::OS2Create( ,(LONG)lY1 ,(LONG)lWidth ,(LONG)lHeight - ,NULLHANDLE + ,hOwner ,HWND_TOP - ,(ULONG)ulId + ,(ULONG)nControlId ,pCtlData ,pPresParams ); @@ -2462,9 +2443,14 @@ bool wxWindow::OS2Create( // // Now need to subclass window. // - - SubclassWin(GetHWND()); - + if(!nNeedsubclass) + { + wxAssociateWinWithHandle((HWND)m_hWnd,this); + } + else + { + SubclassWin(GetHWND()); + } return TRUE; } // end of wxWindow::OS2Create @@ -2856,47 +2842,65 @@ bool wxWindow::HandlePaint() wxLogLastError("CreateRectRgn"); return FALSE; } - // - // Debug code - // -#ifdef __WXDEBUG__ - { - HWND hWnd; - HWND hWnd0 = NULLHANDLE; - - hWnd = GetHwnd(); - if(hWnd != hWnd0) - printf("HandlePaint hWnd=%x ",hWnd); - } -#endif m_updateRegion = wxRegion(hRgn); vEvent.SetEventObject(this); + if (!GetEventHandler()->ProcessEvent(vEvent)) + { + HPS hPS; + + hPS = ::WinBeginPaint( GetHwnd() + ,NULLHANDLE + ,&vRect + ); + if(hPS) + { + ::GpiCreateLogColorTable( hPS + ,0L + ,LCOLF_CONSECRGB + ,0L + ,(LONG)wxTheColourDatabase->m_nSize + ,(PLONG)wxTheColourDatabase->m_palTable + ); + ::GpiCreateLogColorTable( hPS + ,0L + ,LCOLF_RGB + ,0L + ,0L + ,NULL + ); + + ::WinFillRect(hPS, &vRect, GetBackgroundColour().GetPixel()); + ::WinEndPaint(hPS); + } + } return (GetEventHandler()->ProcessEvent(vEvent)); } // end of wxWindow::HandlePaint -bool wxWindow::HandleEraseBkgnd(WXHDC hdc) +bool wxWindow::HandleEraseBkgnd( + WXHDC hDC +) { - // TODO: will have to worry about this later as part of - // the handling of changed presentation parameters - /* - if ( ::IsIconic(GetHwnd()) ) + SWP vSwp; + + ::WinQueryWindowPos(GetHwnd(), &vSwp); + if (vSwp.fl & SWP_MINIMIZE) return TRUE; - wxDC dc; + wxDC vDC; + + vDC.m_hPS = (HPS)hDC; // this is really a PS + vDC.SetWindow(this); + vDC.BeginDrawing(); - dc.SetHDC(hdc); - dc.SetWindow(this); - dc.BeginDrawing(); + wxEraseEvent vEvent(m_windowId, &vDC); - wxEraseEvent event(m_windowId, &dc); - event.SetEventObject(this); - bool rc = GetEventHandler()->ProcessEvent(event); + vEvent.SetEventObject(this); + + bool rc = GetEventHandler()->ProcessEvent(vEvent); - dc.EndDrawing(); - dc.SelectOldObjects(hdc); - dc.SetHDC((WXHDC) NULL); - */ + vDC.EndDrawing(); + vDC.m_hPS = NULLHANDLE; return TRUE; } // end of wxWindow::HandleEraseBkgnd @@ -2904,7 +2908,11 @@ void wxWindow::OnEraseBackground( wxEraseEvent& rEvent ) { - // TODO: + RECTL vRect; + HPS hPS = rEvent.m_dc->m_hPS; + + ::WinQueryWindowRect(GetHwnd(), &vRect); + ::WinFillRect(hPS, &vRect, m_backgroundColour.GetPixel()); } // end of wxWindow::OnEraseBackground // ---------------------------------------------------------------------------