X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d53fc7c96d38775025b0714ddb6e98bd1cd6f111..4fa0a5b44341885a0886f2ae6723d2441bd1f62f:/src/mgl/window.cpp diff --git a/src/mgl/window.cpp b/src/mgl/window.cpp index 382a5ed038..f7423ea103 100644 --- a/src/mgl/window.cpp +++ b/src/mgl/window.cpp @@ -4,7 +4,7 @@ // 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 ///////////////////////////////////////////////////////////////////////////// @@ -66,6 +66,9 @@ MGLDevCtx *g_displayDC = NULL; // 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 @@ -101,7 +104,7 @@ static wxWindowMGL* wxGetTopLevelParent(wxWindowMGL *win) } // An easy way to capture screenshots: -static void wxCaptureScreenshot() +static void wxCaptureScreenshot(bool activeWindowOnly) { #ifdef __DOS__ #define SCREENSHOT_FILENAME _T("sshot%03i.png") @@ -116,9 +119,15 @@ static void wxCaptureScreenshot() 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)); } @@ -168,23 +177,33 @@ static ibool MGLAPI wxWindowMouseHandler(window_t *wnd, event_t *e) 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: @@ -418,17 +437,10 @@ static bool wxHandleSpecialKeys(wxKeyEvent& event) ) #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; } @@ -666,8 +678,14 @@ void wxWindowMGL::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; @@ -691,6 +709,7 @@ void wxWindowMGL::SetFocus() wxFocusEvent event(wxEVT_SET_FOCUS, GetId()); event.SetEventObject(this); + event.SetWindow((wxWindow*)oldFocusedWindow); GetEventHandler()->ProcessEvent(event); #if wxUSE_CARET @@ -719,6 +738,7 @@ void wxWindowMGL::KillFocus() wxFocusEvent event(wxEVT_KILL_FOCUS, GetId()); event.SetEventObject(this); + event.SetWindow(gs_toBeFocusedWindow); GetEventHandler()->ProcessEvent(event); } @@ -803,7 +823,19 @@ bool wxWindowMGL::SetCursor(const wxCursor& cursor) 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); } @@ -888,7 +920,7 @@ void wxWindowMGL::DragAcceptFiles(bool accept) // 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; @@ -896,10 +928,13 @@ void wxWindowMGL::DoGetSize(int *x, int *y) const 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