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()
wxWindowBase::SetFocusFromKbd();
} // end of wxWindowOS2::SetFocus
-wxWindow* wxWindowBase::FindFocus()
+wxWindow* wxWindowBase::DoFindFocus()
{
HWND hWnd = ::WinQueryFocus(HWND_DESKTOP);
return wxFindWinFromHandle((WXHWND)hWnd);
}
return NULL;
-} // wxWindowBase::FindFocus
+} // wxWindowBase::DoFindFocus
bool wxWindowOS2::Enable(
bool bEnable
{
RECTL vRect;
+ ::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()
,(LONG)nDy
,&vRect
,&vRect
- ,NULLHANDLE
+ ,NULL
,NULL
,SW_SCROLLCHILDREN | SW_INVALIDATERGN
);
- Refresh();
} // end of wxWindowOS2::ScrollWindow
// ---------------------------------------------------------------------------
} // 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
if (pRect)
{
RECTL vOs2Rect;
+ int height;
+ ::WinQueryWindowRect(GetHwnd(), &vOs2Rect);
+ height = vOs2Rect.yTop;
vOs2Rect.xLeft = pRect->x;
- vOs2Rect.yBottom = pRect->y;
+ vOs2Rect.yTop = height - pRect->y;
vOs2Rect.xRight = pRect->x + pRect->width;
- vOs2Rect.yTop = pRect->y + pRect->height;
+ vOs2Rect.yBottom = vOs2Rect.yTop - pRect->height;
::WinInvalidateRect(hWnd, &vOs2Rect, bEraseBack);
}
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
{
QMSG vMsg;
- 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;
} // end of wxWindowOS2::UnpackMenuSelect
// ---------------------------------------------------------------------------
-// Main wxWindows window proc and the window proc for wxWindow
+// Main wxWidgets window proc and the window proc for wxWindow
// ---------------------------------------------------------------------------
//
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)))
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)))
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)
{
);
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
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);
int nHeight;
DoGetSize(0, &nHeight);
rEvent.m_x = nX;
- // Convert to wxWindows standard coordinate system!
+ // 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);
//
// 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
//
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 hCursor = (HPOINTER)GetCursor().GetHCURSOR();
+ wxMouseEvent vEvent(eventsMouse[uMsg - WM_MOUSEMOVE]);
+
+ InitMouseEvent( vEvent
+ ,nX
+ ,nY
+ ,uFlags
+ );
- if (hCursor != NULLHANDLE)
+ 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(
,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)))
//
// 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
// 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";