X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/04dbb6467be8f564f380bd9a1106fbdecbd26a98..8a31648287be0ef976f133de2786b137f1e98340:/src/generic/splash.cpp diff --git a/src/generic/splash.cpp b/src/generic/splash.cpp index 3498795c50..c101144cbc 100644 --- a/src/generic/splash.cpp +++ b/src/generic/splash.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: splash.cpp +// Name: src/generic/splash.cpp // Purpose: wxSplashScreen class // Author: Julian Smart // Modified by: @@ -9,53 +9,74 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "splash.h" -#endif - // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ -#pragma hdrstop + #pragma hdrstop #endif #if wxUSE_SPLASH -#ifndef WX_PRECOMP +#ifdef __WXGTK20__ + #include #endif #include "wx/splash.h" -/* - * wxSplashScreen - */ +#ifndef WX_PRECOMP + #include "wx/dcmemory.h" + #include "wx/dcclient.h" +#endif + -#define wxSPLASH_TIMER_ID 9999 +// ---------------------------------------------------------------------------- +// wxSplashScreen +// ---------------------------------------------------------------------------- +#define wxSPLASH_TIMER_ID 9999 + +IMPLEMENT_DYNAMIC_CLASS(wxSplashScreen, wxFrame) BEGIN_EVENT_TABLE(wxSplashScreen, wxFrame) EVT_TIMER(wxSPLASH_TIMER_ID, wxSplashScreen::OnNotify) EVT_CLOSE(wxSplashScreen::OnCloseWindow) END_EVENT_TABLE() -wxSplashScreen::wxSplashScreen(const wxBitmap& bitmap, long splashStyle, int milliseconds, wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style): - wxFrame(parent, id, wxEmptyString, pos, size, style) +void wxSplashScreen::Init() { m_window = NULL; + + wxEvtHandler::AddFilter(this); +} + +/* Note that unless we pass a non-default size to the frame, SetClientSize + * won't work properly under Windows, and the splash screen frame is sized + * slightly too small. + */ + +wxSplashScreen::wxSplashScreen(const wxBitmap& bitmap, long splashStyle, int milliseconds, + wxWindow* parent, wxWindowID id, const wxPoint& pos, + const wxSize& size, long style) + : wxFrame(parent, id, wxEmptyString, wxPoint(0,0), wxSize(100, 100), + style | wxFRAME_TOOL_WINDOW | wxFRAME_NO_TASKBAR) +{ + Init(); + + // splash screen must not be used as parent by the other windows because it + // is going to disappear soon, indicate it by giving it this special style + SetExtraStyle(GetExtraStyle() | wxWS_EX_TRANSIENT); + +#if defined(__WXGTK20__) + gtk_window_set_type_hint(GTK_WINDOW(m_widget), + GDK_WINDOW_TYPE_HINT_SPLASHSCREEN); +#endif + m_splashStyle = splashStyle; m_milliseconds = milliseconds; - m_window = new wxSplashScreenWindow(bitmap, this, -1, pos, size, wxNO_BORDER); + m_window = new wxSplashScreenWindow(bitmap, this, wxID_ANY, pos, size, wxNO_BORDER); - // For some reason, we need to make the client size a couple of pixels - // bigger for all of the bitmap to show. - // Or do we? -#ifdef __WXMSW__ - int fudge = 0; -#else - int fudge = 0; -#endif - SetClientSize(bitmap.GetWidth()+fudge, bitmap.GetHeight()+fudge); + SetClientSize(bitmap.GetWidth(), bitmap.GetHeight()); if (m_splashStyle & wxSPLASH_CENTRE_ON_PARENT) CentreOnParent(); @@ -65,22 +86,42 @@ wxSplashScreen::wxSplashScreen(const wxBitmap& bitmap, long splashStyle, int mil if (m_splashStyle & wxSPLASH_TIMEOUT) { m_timer.SetOwner(this, wxSPLASH_TIMER_ID); - m_timer.Start(milliseconds, TRUE); + m_timer.Start(milliseconds, true); } - Show(TRUE); + Show(true); m_window->SetFocus(); - wxYield(); // Without this, you see a blank screen for an instant +#if defined( __WXMSW__ ) || defined(__WXMAC__) + Update(); // Without this, you see a blank screen for an instant +#elif defined(__WXGTK20__) + // we don't need to do anything at least on wxGTK with GTK+ 2.12.9 +#else + wxYieldIfNeeded(); // Should eliminate this +#endif } wxSplashScreen::~wxSplashScreen() { m_timer.Stop(); + + wxEvtHandler::RemoveFilter(this); +} + +int wxSplashScreen::FilterEvent(wxEvent& event) +{ + const wxEventType t = event.GetEventType(); + if ( t == wxEVT_KEY_DOWN || + t == wxEVT_LEFT_DOWN || + t == wxEVT_RIGHT_DOWN || + t == wxEVT_MIDDLE_DOWN ) + Close(true); + + return -1; } void wxSplashScreen::OnNotify(wxTimerEvent& WXUNUSED(event)) { - Close(TRUE); + Close(true); } void wxSplashScreen::OnCloseWindow(wxCloseEvent& WXUNUSED(event)) @@ -89,85 +130,84 @@ void wxSplashScreen::OnCloseWindow(wxCloseEvent& WXUNUSED(event)) this->Destroy(); } -/* - * wxSplashScreenWindow - */ +// ---------------------------------------------------------------------------- +// wxSplashScreenWindow +// ---------------------------------------------------------------------------- BEGIN_EVENT_TABLE(wxSplashScreenWindow, wxWindow) - //EVT_PAINT(wxSplashScreenWindow::OnPaint) +#ifdef __WXGTK__ + EVT_PAINT(wxSplashScreenWindow::OnPaint) +#endif EVT_ERASE_BACKGROUND(wxSplashScreenWindow::OnEraseBackground) - EVT_CHAR(wxSplashScreenWindow::OnChar) - EVT_MOUSE_EVENTS(wxSplashScreenWindow::OnMouseEvent) END_EVENT_TABLE() -wxSplashScreenWindow::wxSplashScreenWindow(const wxBitmap& bitmap, wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style): - wxWindow(parent, id, pos, size, style) +wxSplashScreenWindow::wxSplashScreenWindow(const wxBitmap& bitmap, wxWindow* parent, + wxWindowID id, const wxPoint& pos, + const wxSize& size, long style) + : wxWindow(parent, id, pos, size, style) { m_bitmap = bitmap; -} -void wxSplashScreenWindow::OnPaint(wxPaintEvent& WXUNUSED(event)) -{ - wxPaintDC dc(this); - if (m_bitmap.Ok()) - dc.DrawBitmap(m_bitmap, 0, 0); +#if !defined(__WXGTK__) && wxUSE_PALETTE + bool hiColour = (wxDisplayDepth() >= 16) ; + + if (bitmap.GetPalette() && !hiColour) + { + SetPalette(* bitmap.GetPalette()); + } +#endif } +// VZ: why don't we do it under wxGTK? +#if !defined(__WXGTK__) && wxUSE_PALETTE + #define USE_PALETTE_IN_SPLASH +#endif + static void wxDrawSplashBitmap(wxDC& dc, const wxBitmap& bitmap, int WXUNUSED(x), int WXUNUSED(y)) { wxMemoryDC dcMem; -#ifndef __WXGTK__ +#ifdef USE_PALETTE_IN_SPLASH bool hiColour = (wxDisplayDepth() >= 16) ; if (bitmap.GetPalette() && !hiColour) { - dc.SetPalette(* bitmap.GetPalette()); dcMem.SetPalette(* bitmap.GetPalette()); } -#endif +#endif // USE_PALETTE_IN_SPLASH - dcMem.SelectObject(bitmap); - dc.Blit(0, 0, bitmap.GetWidth(), bitmap.GetHeight(), & dcMem, 0, 0); + dcMem.SelectObjectAsSource(bitmap); + dc.Blit(0, 0, bitmap.GetWidth(), bitmap.GetHeight(), &dcMem, 0, 0, wxCOPY, + true /* use mask */); dcMem.SelectObject(wxNullBitmap); -#ifndef __WXGTK__ +#ifdef USE_PALETTE_IN_SPLASH if (bitmap.GetPalette() && !hiColour) { - dc.SetPalette(wxNullPalette); dcMem.SetPalette(wxNullPalette); } -#endif +#endif // USE_PALETTE_IN_SPLASH +} + +void wxSplashScreenWindow::OnPaint(wxPaintEvent& WXUNUSED(event)) +{ + wxPaintDC dc(this); + if (m_bitmap.IsOk()) + wxDrawSplashBitmap(dc, m_bitmap, 0, 0); } void wxSplashScreenWindow::OnEraseBackground(wxEraseEvent& event) { - if (event.GetDC()) + if (event.GetDC() && m_bitmap.IsOk()) { - if (m_bitmap.Ok()) - { - wxDrawSplashBitmap(* event.GetDC(), m_bitmap, 0, 0); - } + wxDrawSplashBitmap(* event.GetDC(), m_bitmap, 0, 0); } else { wxClientDC dc(this); - if (m_bitmap.Ok()) - { + if (m_bitmap.IsOk()) wxDrawSplashBitmap(dc, m_bitmap, 0, 0); - } } } -void wxSplashScreenWindow::OnMouseEvent(wxMouseEvent& event) -{ - if (event.LeftDown() || event.RightDown()) - GetParent()->Close(TRUE); -} - -void wxSplashScreenWindow::OnChar(wxKeyEvent& WXUNUSED(event)) -{ - GetParent()->Close(TRUE); -} - #endif // wxUSE_SPLASH