// Author: Vaclav Slavik
// (based on GTK & MSW implementations)
// RCS-ID: $Id$
-// Copyright: (c) 2001 SciTech Software, Inc. (www.scitechsoft.com)
+// Copyright: (c) 2001-2002 SciTech Software, Inc. (www.scitechsoft.com)
// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
// the window that has keyboard focus:
static wxWindowMGL *gs_focusedWindow = NULL;
+// the window that is about to be focused after currently focused
+// one looses focus:
+static wxWindow *gs_toBeFocusedWindow = NULL;
// the window that is currently under mouse cursor:
static wxWindowMGL *gs_windowUnderMouse = NULL;
// the window that has mouse capture
}
// An easy way to capture screenshots:
-static void wxCaptureScreenshot()
+static void wxCaptureScreenshot(bool activeWindowOnly)
{
#ifdef __DOS__
#define SCREENSHOT_FILENAME _T("sshot%03i.png")
screenshot.Printf(SCREENSHOT_FILENAME, screenshot_num++);
} while ( wxFileExists(screenshot) && screenshot_num < 1000 );
- g_displayDC->savePNGFromDC(screenshot.mb_str(), 0, 0,
- g_displayDC->sizex(),
- g_displayDC->sizey());
+ wxRect r(0, 0, g_displayDC->sizex(), g_displayDC->sizey());
+
+ if ( activeWindowOnly && gs_activeFrame )
+ {
+ r.Intersect(gs_activeFrame->GetRect());
+ }
+
+ g_displayDC->savePNGFromDC(screenshot.mb_str(),
+ r.x, r. y, r.x+r.width, r.y+r.height);
wxMessageBox(_("Screenshot captured: ") + wxString(screenshot));
}
event.m_leftDown = e->modifiers & EVT_LEFTBUT;
event.m_middleDown = e->modifiers & EVT_MIDDLEBUT;
event.m_rightDown = e->modifiers & EVT_RIGHTBUT;
-
+
switch (e->what)
{
case EVT_MOUSEDOWN:
- if ( e->message & EVT_LEFTBMASK )
- type = (e->message & EVT_DBLCLICK) ?
- wxEVT_LEFT_DCLICK : wxEVT_LEFT_DOWN;
- else if ( e->message & EVT_MIDDLEBMASK )
- type = (e->message & EVT_DBLCLICK) ?
- wxEVT_MIDDLE_DCLICK : wxEVT_MIDDLE_DOWN;
- else if ( e->message & EVT_RIGHTBMASK )
- type = (e->message & EVT_DBLCLICK) ?
- wxEVT_RIGHT_DCLICK : wxEVT_RIGHT_DOWN;
-
+ // Change focus if the user clicks outside focused window:
if ( win->AcceptsFocus() && wxWindow::FindFocus() != win )
win->SetFocus();
+ if ( e->message & EVT_DBLCLICK )
+ {
+ if ( e->message & EVT_LEFTBMASK )
+ type = wxEVT_LEFT_DCLICK;
+ else if ( e->message & EVT_MIDDLEBMASK )
+ type = wxEVT_MIDDLE_DCLICK;
+ else if ( e->message & EVT_RIGHTBMASK )
+ type = wxEVT_RIGHT_DCLICK;
+ }
+ else
+ {
+ if ( e->message & EVT_LEFTBMASK )
+ type = wxEVT_LEFT_DOWN;
+ else if ( e->message & EVT_MIDDLEBMASK )
+ type = wxEVT_MIDDLE_DOWN;
+ else if ( e->message & EVT_RIGHTBMASK )
+ type = wxEVT_RIGHT_DOWN;
+ }
+
break;
case EVT_MOUSEUP:
)
#endif
{
- wxCaptureScreenshot();
- return TRUE;
- }
-
- if ( event.m_keyCode == WXK_F4 && event.m_altDown &&
- gs_activeFrame != NULL )
- {
- gs_activeFrame->Close();
+ wxCaptureScreenshot(event.m_altDown/*only active wnd?*/);
return TRUE;
}
-
+
return FALSE;
}
if (gs_activeFrame == this)
{
- gs_activeFrame = NULL;
- // activate next frame in Z-order:
- if ( m_wnd->prev )
- {
- wxWindowMGL *win = (wxWindowMGL*)m_wnd->prev->userData;
- win->SetFocus();
+ gs_activeFrame = NULL;
+ // activate next frame in Z-order:
+ if ( m_wnd->prev )
+ {
+ wxWindowMGL *win = (wxWindowMGL*)m_wnd->prev->userData;
+ win->SetFocus();
+ }
+ else if ( m_wnd->next )
+ {
+ wxWindowMGL *win = (wxWindowMGL*)m_wnd->next->userData;
+ win->SetFocus();
}
}
{
if ( gs_focusedWindow == this ) return;
+ wxWindowMGL *oldFocusedWindow = gs_focusedWindow;
+
if ( gs_focusedWindow )
+ {
+ gs_toBeFocusedWindow = (wxWindow*)this;
gs_focusedWindow->KillFocus();
+ gs_toBeFocusedWindow = NULL;
+ }
gs_focusedWindow = this;
wxFocusEvent event(wxEVT_SET_FOCUS, GetId());
event.SetEventObject(this);
+ event.SetWindow((wxWindow*)oldFocusedWindow);
GetEventHandler()->ProcessEvent(event);
#if wxUSE_CARET
wxFocusEvent event(wxEVT_KILL_FOCUS, GetId());
event.SetEventObject(this);
+ event.SetWindow(gs_toBeFocusedWindow);
GetEventHandler()->ProcessEvent(event);
}
if (!show && gs_activeFrame == this)
{
- // activate next frame in Z-order:
- if ( m_wnd->prev )
- {
- wxWindowMGL *win = (wxWindowMGL*)m_wnd->prev->userData;
- win->SetFocus();
+ // activate next frame in Z-order:
+ if ( m_wnd->prev )
+ {
+ wxWindowMGL *win = (wxWindowMGL*)m_wnd->prev->userData;
+ win->SetFocus();
+ }
+ else if ( m_wnd->next )
+ {
+ wxWindowMGL *win = (wxWindowMGL*)m_wnd->next->userData;
+ win->SetFocus();
+ }
+ else
+ {
+ gs_activeFrame = NULL;
}
}
void wxWindowMGL::DoReleaseMouse()
{
- wxASSERT_MSG( gs_mouseCapture == this, wxT("attempt to release mouse, but this window hasn't captured it") )
+ wxASSERT_MSG( gs_mouseCapture == this, wxT("attempt to release mouse, but this window hasn't captured it") );
MGL_wmUncaptureEvents(m_wnd, wxMGL_CAPTURE_MOUSE);
gs_mouseCapture = NULL;
void wxWindowMGL::WarpPointer(int x, int y)
{
+ int w, h;
+ wxDisplaySize(&w, &h);
+
ClientToScreen(&x, &y);
+ if ( x < 0 )
+ x = 0;
+ if ( y < 0 )
+ y = 0;
+ if ( x >= w )
+ x = w-1;
+ if ( y >= h )
+ y = h-1;
+
EVT_setMousePos(x, y);
}
// Get total size
void wxWindowMGL::DoGetSize(int *x, int *y) const
{
- wxASSERT_MSG( m_wnd, wxT("invalid window") )
+ wxASSERT_MSG( m_wnd, wxT("invalid window") );
if (x) *x = m_wnd->width;
if (y) *y = m_wnd->height;
void wxWindowMGL::DoGetPosition(int *x, int *y) const
{
- wxASSERT_MSG( m_wnd, wxT("invalid window") )
+ wxASSERT_MSG( m_wnd, wxT("invalid window") );
+
+ int pX = 0, pY = 0;
+ AdjustForParentClientOrigin(pX, pY, 0);
- if (x) *x = m_wnd->x;
- if (y) *y = m_wnd->y;
+ if (x) *x = m_wnd->x - pX;
+ if (y) *y = m_wnd->y - pY;
}
void wxWindowMGL::DoScreenToClient(int *x, int *y) const