X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7e99520bd3fc092bbbcbc38bb699a0236618ea40..a22be3e1fcf362850fe33d52d55518ad68b98d02:/src/os2/window.cpp diff --git a/src/os2/window.cpp b/src/os2/window.cpp index 59c203cc17..ce16cbc0c7 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 @@ -2668,78 +2654,113 @@ bool wxWindow::OS2OnDrawItem( , WXDRAWITEMSTRUCT* pItemStruct ) { - // - // I'll get to owner drawn stuff later - // + wxDC vDc; // - // is it a menu item or control? + // Is it a menu item? // - wxWindow* pItem = FindItem(vId); + if (vId == 0) + { #if wxUSE_OWNER_DRAWN - if (pItem && pItem->IsKindOf(CLASSINFO(wxControl))) - { - return ((wxControl *)pItem)->OS2OnDraw(pItemStruct); - } - else if (pItem && pItem->IsKindOf(CLASSINFO(wxMenu))) - { - /* - // TODO: draw a menu item + POWNERITEM pMeasureStruct = (POWNERITEM)pItemStruct; + wxMenuItem vMenuItem; + HDC hDC = ::GpiQueryDevice(pMeasureStruct->hps); + + vDc.SetHDC( hDC + ,FALSE + ); + vDc.SetHPS(pMeasureStruct->hps); + // - POWNERITEM pDrawStruct = (OWNERITEM *)pItemStruct; - wxMenuItem* pMenuItem = (wxMenuItem *)(pDrawStruct->pItemData); + // We stored the CMenuItem itself into the menuitem text field so now + // we need to extract it. + // + ::WinSendMsg( pMeasureStruct->hItem + ,MM_QUERYITEMTEXT + ,MPFROM2SHORT( (USHORT)pMeasureStruct->idItem + ,(SHORT)(sizeof(wxMenuItem)) + ) + ,(PSZ)&vMenuItem + ); + + wxRect vRect( pMeasureStruct->rclItem.xLeft + ,pMeasureStruct->rclItem.yTop + ,pMeasureStruct->rclItem.xRight + ,pMeasureStruct->rclItem.yBottom + ); - wxCHECK(pMenuItem->IsKindOf(CLASSINFO(wxMenuItem)), FALSE); + wxOwnerDrawn::wxODAction eAction; // - // Prepare to call OnDrawItem() + // Attribute applies to menuitems, fsState to listbox and other controls + // + if (pMeasureStruct->fsAttribute == pMeasureStruct->fsAttributeOld) + eAction = wxOwnerDrawn::wxODDrawAll; + else + eAction = wxOwnerDrawn::wxODSelectChanged; + + return(vMenuItem.OnDrawItem( vDc + ,vRect + ,eAction + ,(wxOwnerDrawn::wxODStatus)pMeasureStruct->fsAttribute + )); + // + // leave the fsAttribute and fsOldAttribute unchanged. If different, + // the system will do the highlight or fraeming or disabling for us, + // otherwise, we'd have to do it ourselves. // - HPSdc; - dc.SetHDC((WXHDC)pDrawStruct->hDC, FALSE); - wxRect rect(pDrawStruct->rcItem.left, pDrawStruct->rcItem.top, - pDrawStruct->rcItem.right - pDrawStruct->rcItem.left, - pDrawStruct->rcItem.bottom - pDrawStruct->rcItem.top); - - return pMenuItem->OnDrawItem - ( - dc, rect, - (wxOwnerDrawn::wxODAction)pDrawStruct->itemAction, - (wxOwnerDrawn::wxODStatus)pDrawStruct->itemState - ); - */ } - else - return FALSE; + wxWindow* pItem = FindItem(vId); + + if (pItem && pItem->IsKindOf(CLASSINFO(wxControl))) + { + return ((wxControl *)pItem)->OS2OnDraw(pItemStruct); + } #endif - return TRUE; + return FALSE; } // end of wxWindow::OS2OnDrawItem -bool wxWindow::OS2OnMeasureItem(int id, WXMEASUREITEMSTRUCT *itemStruct) +bool wxWindow::OS2OnMeasureItem( + int lId +, WXMEASUREITEMSTRUCT* pItemStruct +) { - // TODO: more owner drawn menu related stuff, get to it later -/* -#if wxUSE_OWNER_DRAWN - // is it a menu item? - if ( id == 0 ) + // + // Is it a menu item? + // + if (lId == 0) { - MEASUREITEMSTRUCT *pMeasureStruct = (MEASUREITEMSTRUCT *)itemStruct; - wxMenuItem *pMenuItem = (wxMenuItem *)(pMeasureStruct->itemData); + POWNERITEM pMeasureStruct = (POWNERITEM)pItemStruct; + wxMenuItem vMenuItem; + + // + // We stored the CMenuItem itself into the menuitem text field so now + // we need to extract it. + // + ::WinSendMsg( pMeasureStruct->hItem + ,MM_QUERYITEMTEXT + ,MPFROM2SHORT( (USHORT)pMeasureStruct->idItem + ,(SHORT)(sizeof(wxMenuItem)) + ) + ,(PSZ)&vMenuItem + ); + wxCHECK(vMenuItem.IsKindOf(CLASSINFO(wxMenuItem)), FALSE); - wxCHECK( pMenuItem->IsKindOf(CLASSINFO(wxMenuItem)), FALSE ); + size_t lWidth = (size_t)(pMeasureStruct->rclItem.xRight - pMeasureStruct->rclItem.xLeft); + size_t lHeight = (size_t)(pMeasureStruct->rclItem.yTop - pMeasureStruct->rclItem.yBottom); - return pMenuItem->OnMeasureItem(&pMeasureStruct->itemWidth, - &pMeasureStruct->itemHeight); + return(vMenuItem.OnMeasureItem( &lWidth + ,&lHeight + )); } + wxWindow* pItem = FindItem(id); - wxWindow *item = FindItem(id); - if ( item && item->IsKindOf(CLASSINFO(wxControl)) ) + if (pItem && pItem->IsKindOf(CLASSINFO(wxControl))) { - return ((wxControl *)item)->MSWOnMeasure(itemStruct); + return ((wxControl *)pItem)->OS2OnMeasure(pItemStruct); } -#endif // owner-drawn menus -*/ return FALSE; } @@ -2856,47 +2877,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(); + + wxEraseEvent vEvent(m_windowId, &vDC); - dc.SetHDC(hdc); - dc.SetWindow(this); - dc.BeginDrawing(); + vEvent.SetEventObject(this); - wxEraseEvent event(m_windowId, &dc); - event.SetEventObject(this); - bool rc = GetEventHandler()->ProcessEvent(event); + 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 +2943,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 // --------------------------------------------------------------------------- @@ -4012,28 +4055,43 @@ static void TranslateKbdEventToMouse( // Find the wxWindow at the current mouse position, returning the mouse // position. -wxWindow* wxFindWindowAtPointer(wxPoint& pt) +wxWindow* wxFindWindowAtPointer( + wxPoint& rPt +) { return wxFindWindowAtPoint(wxGetMousePosition()); } -wxWindow* wxFindWindowAtPoint(const wxPoint& pt) +wxWindow* wxFindWindowAtPoint( + const wxPoint& rPt +) { - POINT pt2; - pt2.x = pt.x; - pt2.y = pt.y; - HWND hWndHit = ::WindowFromPoint(pt2); + POINTL vPt2; - wxWindow* win = wxFindWinFromHandle((WXHWND) hWndHit) ; - HWND hWnd = hWndHit; + vPt2.x = rPt.x; + vPt2.y = rPt.y; + HWND hWndHit = ::WinWindowFromPoint(HWND_DESKTOP, &vPt2, FALSE); + wxWindow* pWin = wxFindWinFromHandle((WXHWND)hWndHit) ; + HWND hWnd = hWndHit; + + // // Try to find a window with a wxWindow associated with it - while (!win && (hWnd != 0)) + // + while (!pWin && (hWnd != 0)) { - hWnd = ::GetParent(hWnd); - win = wxFindWinFromHandle((WXHWND) hWnd) ; + hWnd = ::WinQueryWindow(hWnd, QW_PARENT); + pWin = wxFindWinFromHandle((WXHWND)hWnd) ; } - return win; + return pWin; } +// Get the current mouse position. +wxPoint wxGetMousePosition() +{ + POINTL vPt; + + ::WinQueryPointerPos(HWND_DESKTOP, &vPt); + return wxPoint(vPt.x, vPt.y); +}