X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0093fe11c5f581abbc37447b191903e871112f46..1e151594721201f2048aa295dcf35acd28f012b9:/src/os2/window.cpp diff --git a/src/os2/window.cpp b/src/os2/window.cpp index 9159d1d295..e104adeddf 100644 --- a/src/os2/window.cpp +++ b/src/os2/window.cpp @@ -180,7 +180,6 @@ static wxWindow* gpWinBeingCreated = NULL; BEGIN_EVENT_TABLE(wxWindowOS2, wxWindowBase) EVT_ERASE_BACKGROUND(wxWindowOS2::OnEraseBackground) EVT_SYS_COLOUR_CHANGED(wxWindowOS2::OnSysColourChanged) - EVT_INIT_DIALOG(wxWindowOS2::OnInitDialog) EVT_IDLE(wxWindowOS2::OnIdle) EVT_SET_FOCUS(wxWindowOS2::OnSetFocus) END_EVENT_TABLE() @@ -294,17 +293,11 @@ bool wxWindowOS2::OS2Command( void wxWindowOS2::Init() { - // - // Generic - // - InitBase(); - // // PM specific // m_bWinCaptured = FALSE; - m_isBeingDeleted = FALSE; m_fnOldWndProc = NULL; m_bUseCtl3D = FALSE; m_bMouseInWindow = FALSE; @@ -362,9 +355,6 @@ wxWindowOS2::~wxWindowOS2() DestroyChildren(); - if (m_parent) - m_parent->RemoveChild(this); - if (m_hWnd) { if(!::WinDestroyWindow(GetHWND())) @@ -418,8 +408,6 @@ bool wxWindowOS2::Create( if (pParent) { - int nTempy; - pParent->AddChild(this); hParent = GetWinHwnd(pParent); @@ -487,7 +475,7 @@ void wxWindowOS2::SetFocusFromKbd() wxWindowBase::SetFocusFromKbd(); } // end of wxWindowOS2::SetFocus -wxWindow* wxWindowBase::FindFocus() +wxWindow* wxWindowBase::DoFindFocus() { HWND hWnd = ::WinQueryFocus(HWND_DESKTOP); @@ -496,7 +484,7 @@ wxWindow* wxWindowBase::FindFocus() return wxFindWinFromHandle((WXHWND)hWnd); } return NULL; -} // wxWindowBase::FindFocus +} // wxWindowBase::DoFindFocus bool wxWindowOS2::Enable( bool bEnable @@ -758,7 +746,6 @@ void wxWindowOS2::SetScrollbar( ULONG ulStyle = WS_VISIBLE | WS_SYNCPAINT; SWP vSwp; SWP vSwpOwner; - RECTL vRect; HWND hWndParent; HWND hWndClient; wxWindow* pParent = GetParent(); @@ -950,20 +937,15 @@ void wxWindowOS2::ScrollWindow( ) { RECTL vRect; - RECTL vRectHorz; - RECTL vRectVert; - RECTL vRectChild; + ::WinQueryWindowRect(GetHwnd(), &vRect); + int height = vRect.yTop; if (pRect) { vRect.xLeft = pRect->x; - vRect.yTop = pRect->y + pRect->height; + vRect.yTop = height - pRect->y; vRect.xRight = pRect->x + pRect->width; - vRect.yBottom = pRect->y; - } - else - { - ::WinQueryWindowRect(GetHwnd(), &vRect); + vRect.yBottom = vRect.yTop - pRect->height; } nDy *= -1; // flip the sign of Dy as OS/2 is opposite Windows. ::WinScrollWindow( GetHwnd() @@ -971,11 +953,10 @@ void wxWindowOS2::ScrollWindow( ,(LONG)nDy ,&vRect ,&vRect - ,NULLHANDLE + ,NULL ,NULL ,SW_SCROLLCHILDREN | SW_INVALIDATERGN ); - Refresh(); } // end of wxWindowOS2::ScrollWindow // --------------------------------------------------------------------------- @@ -1102,7 +1083,7 @@ WXDWORD wxWindowOS2::OS2GetStyle( } // end of wxWindowMSW::MSWGetStyle // -// Make a Windows extended style from the given wxWindows window style +// Make a Windows extended style from the given wxWidgets window style // WXDWORD wxWindowOS2::MakeExtendedStyle( long lStyle @@ -1167,10 +1148,10 @@ void wxWindowOS2::OnIdle( // int nState = 0; - if (::WinGetKeyState(HWND_DESKTOP, VK_SHIFT) != 0) - nState |= VK_SHIFT; - if (::WinGetKeyState(HWND_DESKTOP, VK_CTRL) != 0); - nState |= VK_CTRL; + if (IsShiftDown()) + nState |= KC_SHIFT; + if (IsCtrlDown()) + nState |= KC_CTRL; wxMouseEvent rEvent(wxEVT_LEAVE_WINDOW); @@ -1236,11 +1217,14 @@ void wxWindowOS2::Refresh( if (pRect) { RECTL vOs2Rect; + int height; + ::WinQueryWindowRect(GetHwnd(), &vOs2Rect); + height = vOs2Rect.yTop; vOs2Rect.xLeft = pRect->x; - vOs2Rect.yTop = pRect->y; + vOs2Rect.yTop = height - pRect->y; vOs2Rect.xRight = pRect->x + pRect->width; - vOs2Rect.yBottom = pRect->y + pRect->height; + vOs2Rect.yBottom = vOs2Rect.yTop - pRect->height; ::WinInvalidateRect(hWnd, &vOs2Rect, bEraseBack); } @@ -1486,7 +1470,6 @@ void wxWindowOS2::DoMoveWindow( ) { RECTL vRect; - HWND hParent; wxWindow* pParent = GetParent(); if (pParent && !IsKindOf(CLASSINFO(wxDialog))) @@ -1522,7 +1505,6 @@ void wxWindowOS2::DoMoveWindow( int nHeightFrameDelta = 0; int nHeightFrame = 0; int nWidthFrame = 0; - ULONG ulFLag = SWP_MOVE; wxFrame* pFrame; pFrame = wxDynamicCast(this, wxFrame); @@ -1677,7 +1659,6 @@ void wxWindowOS2::DoSetSize( // Must convert Y coords to test for equality under OS/2 // int nY2 = nY; - wxWindow* pParent = (wxWindow*)GetParent(); if (nX == nCurrentX && nY2 == nCurrentY && nWidth == nCurrentWidth && nHeight == nCurrentHeight) @@ -1852,9 +1833,8 @@ void wxWindowOS2::GetTextExtent( int i; int l; FONTMETRICS vFM; // metrics structure - BOOL bRc; + BOOL bRc = FALSE; char* pStr; - ERRORID vErrorCode; // last error id code HPS hPS; @@ -1960,25 +1940,6 @@ bool wxWindowOS2::IsMouseInWindow() const // popup menu // --------------------------------------------------------------------------- // -#if wxUSE_MENUS_NATIVE -static void wxYieldForCommandsOnly() -{ - // - // Peek all WM_COMMANDs (it will always return WM_QUIT too but we don't - // want to process it here) - // - QMSG vMsg; - - while (::WinPeekMsg(vHabmain, &vMsg, (HWND)0, WM_COMMAND, WM_COMMAND, PM_REMOVE) - && vMsg.msg != WM_QUIT) - { - wxTheApp->DoMessage((WXMSG*)&vMsg); - } - if (vMsg.msg == WM_QUIT) - ::WinPostMsg(NULL, WM_QUIT, 0, 0); -} -#endif // wxUSE_MENUS_NATIVE - #if wxUSE_MENUS_NATIVE bool wxWindowOS2::DoPopupMenu( wxMenu* pMenu @@ -1990,13 +1951,28 @@ bool wxWindowOS2::DoPopupMenu( HWND hWndParent = GetHwnd(); HWND hMenu = GetHmenuOf(pMenu); bool bIsWaiting = TRUE; + int nHeight; + + // Protect against recursion + if (wxCurrentPopupMenu) + return false; pMenu->SetInvokingWindow(this); pMenu->UpdateUI(); - DoClientToScreen( &nX - ,&nY - ); + if ( nX == -1 && nY == -1 ) + { + wxPoint mouse = wxGetMousePosition(); + nX = mouse.x; nY = mouse.y; + } + else + { + DoClientToScreen( &nX + ,&nY + ); + DoGetSize(0,&nHeight); + nY = nHeight - nY; + } wxCurrentPopupMenu = pMenu; ::WinPopupMenu( hWndParent @@ -2011,15 +1987,13 @@ bool wxWindowOS2::DoPopupMenu( while(bIsWaiting) { QMSG vMsg; - BOOL bRc = ::WinGetMsg(vHabmain, &vMsg, HWND(NULL), 0, 0); - if (vMsg.msg == WM_MENUEND || vMsg.msg == WM_COMMAND) - { + ::WinGetMsg(vHabmain,&vMsg, (HWND)0, 0, 0); + if (vMsg.msg == WM_COMMAND) bIsWaiting = FALSE; - } ::WinDispatchMsg(vHabmain, (PQMSG)&vMsg); - } + wxCurrentPopupMenu = NULL; pMenu->SetInvokingWindow(NULL); return TRUE; @@ -2308,7 +2282,7 @@ void wxWindowOS2::UnpackMenuSelect( } // end of wxWindowOS2::UnpackMenuSelect // --------------------------------------------------------------------------- -// Main wxWindows window proc and the window proc for wxWindow +// Main wxWidgets window proc and the window proc for wxWindow // --------------------------------------------------------------------------- // @@ -2327,14 +2301,6 @@ MRESULT EXPENTRY wxWndProc( , MPARAM lParam ) { - // - // Trace all ulMsgs - useful for the debugging - // -#ifdef __WXDEBUG__ - wxLogTrace(wxTraceMessages, wxT("Processing %s(wParam=%8lx, lParam=%8lx)"), - wxGetMessageName(ulMsg), wParam, lParam); -#endif // __WXDEBUG__ - wxWindowOS2* pWnd = wxFindWinFromHandle((WXHWND)hWnd); // @@ -2556,7 +2522,7 @@ MRESULT wxWindowOS2::OS2WindowProc( bProcessed = HandleMouseEvent( uMsg ,nX ,nY - ,(WXUINT)SHORT1FROMMP(wParam) + ,(WXUINT)SHORT2FROMMP(lParam) ); } else @@ -2573,7 +2539,7 @@ MRESULT wxWindowOS2::OS2WindowProc( bProcessed = pWin->HandleMouseEvent( uMsg ,nX ,nY - ,(WXUINT)SHORT1FROMMP(wParam) + ,(WXUINT)SHORT2FROMMP(lParam) ); } } @@ -2801,7 +2767,7 @@ MRESULT wxWindowOS2::OS2WindowProc( break; } // - // Simulate a WM_COMMAND here, as wxWindows expects all control + // Simulate a WM_COMMAND here, as wxWidgets expects all control // button clicks to generate WM_COMMAND msgs, not WM_CONTROL // if (pWin->IsKindOf(CLASSINFO(wxRadioBox))) @@ -2861,7 +2827,7 @@ MRESULT wxWindowOS2::OS2WindowProc( break; } // - // Simulate a WM_COMMAND here, as wxWindows expects all control + // Simulate a WM_COMMAND here, as wxWidgets expects all control // button clicks to generate WM_COMMAND msgs, not WM_CONTROL // if (pWin->IsKindOf(CLASSINFO(wxListBox))) @@ -2998,6 +2964,20 @@ MRESULT wxWindowOS2::OS2WindowProc( mResult = (MRESULT)TRUE; } break; + +#if wxUSE_MENUS_NATIVE + case WM_MENUEND: + if (wxCurrentPopupMenu) + { + if (GetHmenuOf(wxCurrentPopupMenu) == (HWND)lParam) + { + // Break out of msg loop in DoPopupMenu + ::WinPostMsg((HWND)lParam,WM_COMMAND,wParam,0); + } + } + break; +#endif // wxUSE_MENUS_NATIVE + } if (!bProcessed) { @@ -3015,36 +2995,6 @@ MRESULT wxWindowOS2::OS2WindowProc( return mResult; } // end of wxWindowOS2::OS2WindowProc -#ifndef __EMX__ -// clashes with wxDlgProc in toplevel.cpp? -// -// Dialog window proc -// -MRESULT wxDlgProc( - HWND WXUNUSED(hWnd) -, UINT uMsg -, MPARAM WXUNUSED(wParam) -, MPARAM WXUNUSED(lParam)) -{ - if (uMsg == WM_INITDLG) - { - // - // For this message, returning TRUE tells system to set focus to the - // first control in the dialog box - // - return (MRESULT)TRUE; - } - else - { - // - // For all the other ones, FALSE means that we didn't process the - // message - // - return (MRESULT)0; - } -} // end of wxDlgProc -#endif - wxWindow* wxFindWinFromHandle( WXHWND hWnd ) @@ -3053,7 +3003,7 @@ wxWindow* wxFindWinFromHandle( if (!pNode) return NULL; - return (wxWindow *)pNode->Data(); + return (wxWindow *)pNode->GetData(); } // end of wxFindWinFromHandle void wxAssociateWinWithHandle( @@ -3160,9 +3110,6 @@ bool wxWindowOS2::OS2Create( int nY = 0L; int nWidth = 0L; int nHeight = 0L; - wxWindow* pParent = GetParent(); - HWND hWnd = NULLHANDLE; - HWND hParent; long lControlId = 0L; wxWindowCreationHook vHook(this); wxString sClassName((wxChar*)zClass); @@ -3188,7 +3135,7 @@ bool wxWindowOS2::OS2Create( // which is the same but without CS_[HV]REDRAW class styles so using it // ensures that the window is not fully repainted on each resize // - if (GetWindowStyleFlag() & wxNO_FULL_REPAINT_ON_RESIZE) + if (!HasFlag(wxFULL_REPAINT_ON_RESIZE)) { sClassName += wxT("NR"); } @@ -3466,7 +3413,7 @@ bool wxWindowOS2::OS2OnDrawItem( ); vDc.SetHPS(pMeasureStruct->hps); // - // Load the wxWindows Pallete and set to RGB mode + // Load the wxWidgets Pallete and set to RGB mode // if (!::GpiCreateLogColorTable( pMeasureStruct->hps ,0L @@ -3702,14 +3649,14 @@ void wxWindowOS2::OnSysColourChanged( wxSysColourChangedEvent& rEvent ) { - wxNode* pNode = GetChildren().First(); + wxWindowListNode* pNode = GetChildren().GetFirst(); while (pNode) { // // Only propagate to non-top-level windows // - wxWindow* pWin = (wxWindow *)pNode->Data(); + wxWindow* pWin = (wxWindow *)pNode->GetData(); if (pWin->GetParent()) { @@ -3718,7 +3665,7 @@ void wxWindowOS2::OnSysColourChanged( rEvent.m_eventObject = pWin; pWin->GetEventHandler()->ProcessEvent(vEvent); } - pNode = pNode->Next(); + pNode = pNode->GetNext(); } } // end of wxWindowOS2::OnSysColourChanged @@ -3746,7 +3693,6 @@ bool wxWindowOS2::HandlePaint() HRGN hRgn; wxPaintEvent vEvent(m_windowId); HPS hPS; - RECTL vRect; bool bProcessed; // Create empty region @@ -3760,6 +3706,51 @@ bool wxWindowOS2::HandlePaint() return FALSE; } + // Get all the rectangles from the region, convert the individual + // rectangles to "the other" coordinate system and reassemble a + // region from the rectangles, to be feed into m_updateRegion. + // + // FIXME: This is a bad hack since OS/2 API specifies that rectangles + // passed into GpiSetRegion must not have Bottom > Top, + // however, at first sight, it _seems_ to work nonetheless. + // + RGNRECT vRgnData; + PRECTL pUpdateRects = NULL; + vRgnData.ulDirection = RECTDIR_LFRT_TOPBOT; + if (::GpiQueryRegionRects( hPS // Pres space + ,hRgn // Handle of region to query + ,NULL // Return all RECTs + ,&vRgnData // Will contain number or RECTs in region + ,NULL // NULL to return number of RECTs + )) + { + pUpdateRects = new RECTL[vRgnData.crcReturned]; + vRgnData.crc = vRgnData.crcReturned; + vRgnData.ircStart = 1; + if (::GpiQueryRegionRects( hPS // Pres space of source + ,hRgn // Handle of source region + ,NULL // Return all RECTs + ,&vRgnData // Operations set to return rects + ,pUpdateRects // Will contain the actual RECTS + )) + { + int height; + RECT vRect; + ::WinQueryWindowRect(GetHwnd(), &vRect); + height = vRect.yTop; + + for(size_t i = 0; i < vRgnData.crc; i++) + { + int rectHeight; + rectHeight = pUpdateRects[i].yTop - pUpdateRects[i].yBottom; + pUpdateRects[i].yTop = height - pUpdateRects[i].yTop; + pUpdateRects[i].yBottom = pUpdateRects[i].yTop + rectHeight; + } + ::GpiSetRegion(hPS, hRgn, vRgnData.crc, pUpdateRects); + delete [] pUpdateRects; + } + } + m_updateRegion = wxRegion(hRgn, hPS); vEvent.SetEventObject(this); @@ -3778,8 +3769,6 @@ bool wxWindowOS2::HandlePaint() // HPS hPS; RECTL vRect; - wxFrame* pFrame; - wxWindow* pParent; hPS = ::WinBeginPaint( GetHwnd() ,NULLHANDLE @@ -3839,8 +3828,6 @@ bool wxWindowOS2::HandlePaint() // HPS hPS; RECTL vRect; - wxFrame* pFrame; - wxWindow* pParent; hPS = ::WinBeginPaint( GetHwnd() ,NULLHANDLE @@ -3960,7 +3947,6 @@ bool wxWindowOS2::HandleGetMinMaxInfo( PSWP pSwp ) { - bool bRc = FALSE; POINTL vPoint; switch(pSwp->fl) @@ -4045,13 +4031,20 @@ void wxWindowOS2::InitMouseEvent( , WXUINT uFlags ) { + int nHeight; + DoGetSize(0, &nHeight); rEvent.m_x = nX; - rEvent.m_y = nY; - rEvent.m_shiftDown = ((uFlags & VK_SHIFT) != 0); - rEvent.m_controlDown = ((uFlags & VK_CTRL) != 0); - rEvent.m_leftDown = ((uFlags & VK_BUTTON1) != 0); - rEvent.m_middleDown = ((uFlags & VK_BUTTON3) != 0); - rEvent.m_rightDown = ((uFlags & VK_BUTTON2) != 0); + // Convert to wxWidgets standard coordinate system! + rEvent.m_y = nHeight - nY; + rEvent.m_shiftDown = ((uFlags & KC_SHIFT) != 0); + rEvent.m_controlDown = ((uFlags & KC_CTRL) != 0); + rEvent.m_altDown = ((uFlags & KC_ALT) != 0); + rEvent.m_leftDown = (::WinGetKeyState(HWND_DESKTOP, VK_BUTTON1) & + 0x8000) != 0; + rEvent.m_middleDown = (::WinGetKeyState(HWND_DESKTOP, VK_BUTTON3) & + 0x8000) != 0; + rEvent.m_rightDown = (::WinGetKeyState(HWND_DESKTOP, VK_BUTTON2) & + 0x8000) != 0; rEvent.SetTimestamp(s_currentMsg.time); rEvent.m_eventObject = this; rEvent.SetId(GetId()); @@ -4074,7 +4067,7 @@ bool wxWindowOS2::HandleMouseEvent( // // The mouse events take consecutive IDs from WM_MOUSEFIRST to - // WM_MOUSELAST, so it's enough to substract WM_MOUSEMOVE == WM_MOUSEFIRST + // WM_MOUSELAST, so it's enough to subtract WM_MOUSEMOVE == WM_MOUSEFIRST // from the message id and take the value in the table to get wxWin event // id // @@ -4092,27 +4085,30 @@ bool wxWindowOS2::HandleMouseEvent( wxEVT_MIDDLE_DCLICK }; - wxMouseEvent vEvent(eventsMouse[uMsg - WM_MOUSEMOVE]); - - InitMouseEvent( vEvent - ,nX - ,nY - ,uFlags - ); - - bProcessed = GetEventHandler()->ProcessEvent(vEvent); - if (!bProcessed) + // Bounds check + if ((uMsg >= WM_MOUSEMOVE) && (uMsg <= WM_BUTTON3DBLCLK)) { - HPOINTER hPtr = ::WinQuerySysPointer(HWND_DESKTOP, SPTR_WAIT, FALSE); - HPOINTER hCursor = (HPOINTER)GetCursor().GetHCURSOR(); + wxMouseEvent vEvent(eventsMouse[uMsg - WM_MOUSEMOVE]); - if (hCursor != NULLHANDLE) + InitMouseEvent( vEvent + ,nX + ,nY + ,uFlags + ); + + bProcessed = GetEventHandler()->ProcessEvent(vEvent); + if (!bProcessed) { - ::WinSetPointer(HWND_DESKTOP, hCursor); - bProcessed = TRUE; + HPOINTER hCursor = (HPOINTER)GetCursor().GetHCURSOR(); + + if (hCursor != NULLHANDLE) + { + ::WinSetPointer(HWND_DESKTOP, hCursor); + bProcessed = TRUE; + } } } - return GetEventHandler()->ProcessEvent(vEvent); + return bProcessed; } // end of wxWindowOS2::HandleMouseEvent bool wxWindowOS2::HandleMouseMove( @@ -4433,7 +4429,7 @@ void wxWindowOS2::MoveChildren( ,vSwp.y - nDiff ,vSwp.cx ,vSwp.cy - ,SWP_MOVE | SWP_SHOW | SWP_ZORDER + ,SWP_MOVE ); ::WinQueryWindowPos(GetHwndOf(pWin), pWin->GetSwp()); if (pWin->IsKindOf(CLASSINFO(wxRadioBox))) @@ -4468,7 +4464,7 @@ void wxWindowOS2::MoveChildren( // // Getting the Y position for a window, like a control, is a real // pain. There are three sitatuions we must deal with in determining -// the OS2 to wxWindows Y coordinate. +// the OS2 to wxWidgets Y coordinate. // // 1) The controls are created in a dialog. // This is the easiest since a dialog is created with its original @@ -4500,8 +4496,6 @@ int wxWindowOS2::GetOS2ParentHeight( wxWindowOS2* pParent ) { - wxWindowOS2* pGrandParent = NULL; - // // Case 1 // @@ -4982,7 +4976,7 @@ const char* wxGetMessageName( // Beginning of user defined messages case 0x1000: return "WM_USER"; - // wxWindows user defined types + // wxWidgets user defined types // listview // case 0x1000 + 0: return "LVM_GETBKCOLOR"; @@ -5297,7 +5291,6 @@ wxWindowOS2* FindWindowForMouseEvent( POINTL vPoint; BOOL rcEnabled = FALSE; BOOL rcVisible = FALSE; - HWND hWndDesktop = HWND_DESKTOP; ::WinQueryPointerPos(HWND_DESKTOP, &vPoint); hWndUnderMouse = ::WinWindowFromPoint(HWND_DESKTOP, &vPoint, TRUE); @@ -5308,7 +5301,6 @@ wxWindowOS2* FindWindowForMouseEvent( if (pWinUnderMouse) { wxWindowList::Node* pCurrent = pWinUnderMouse->GetChildren().GetFirst(); - wxWindow* pChild = NULL; wxWindow* pGrandChild = NULL; RECTL vRect; POINTL vPoint2;