diff --git a/include/wx/generic/splash.h b/include/wx/generic/splash.h index 77ea5dba03..1441be4420 100644 --- a/include/wx/generic/splash.h +++ b/include/wx/generic/splash.h @@ -13,8 +13,9 @@ #define _WX_SPLASH_H_ #include "wx/bitmap.h" -#include "wx/timer.h" +#include "wx/eventfilter.h" #include "wx/frame.h" +#include "wx/timer.h" /* @@ -33,11 +34,12 @@ class WXDLLIMPEXP_FWD_ADV wxSplashScreenWindow; * wxSplashScreen */ -class WXDLLIMPEXP_ADV wxSplashScreen: public wxFrame +class WXDLLIMPEXP_ADV wxSplashScreen: public wxFrame, + public wxEventFilter { public: // for RTTI macros only - wxSplashScreen() {} + wxSplashScreen() { Init(); } wxSplashScreen(const wxBitmap& bitmap, long splashStyle, int milliseconds, wxWindow* parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, @@ -52,7 +54,13 @@ public: wxSplashScreenWindow* GetSplashWindow() const { return m_window; } int GetTimeout() const { return m_milliseconds; } + // Override wxEventFilter method to hide splash screen on any user input. + virtual int FilterEvent(wxEvent& event); + protected: + // Common part of all ctors. + void Init(); + wxSplashScreenWindow* m_window; long m_splashStyle; int m_milliseconds; @@ -74,8 +82,6 @@ public: void OnPaint(wxPaintEvent& event); void OnEraseBackground(wxEraseEvent& event); - void OnMouseEvent(wxMouseEvent& event); - void OnChar(wxKeyEvent& event); void SetBitmap(const wxBitmap& bitmap) { m_bitmap = bitmap; } wxBitmap& GetBitmap() { return m_bitmap; } diff --git a/src/generic/splash.cpp b/src/generic/splash.cpp index 24dc3c57b2..c101144cbc 100644 --- a/src/generic/splash.cpp +++ b/src/generic/splash.cpp @@ -42,6 +42,13 @@ BEGIN_EVENT_TABLE(wxSplashScreen, wxFrame) EVT_CLOSE(wxSplashScreen::OnCloseWindow) END_EVENT_TABLE() +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. @@ -53,6 +60,8 @@ wxSplashScreen::wxSplashScreen(const wxBitmap& bitmap, long splashStyle, int mil : 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); @@ -62,7 +71,6 @@ wxSplashScreen::wxSplashScreen(const wxBitmap& bitmap, long splashStyle, int mil GDK_WINDOW_TYPE_HINT_SPLASHSCREEN); #endif - m_window = NULL; m_splashStyle = splashStyle; m_milliseconds = milliseconds; @@ -95,6 +103,20 @@ wxSplashScreen::wxSplashScreen(const wxBitmap& bitmap, long splashStyle, int mil 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)) @@ -117,8 +139,6 @@ BEGIN_EVENT_TABLE(wxSplashScreenWindow, wxWindow) 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, @@ -190,17 +210,4 @@ void wxSplashScreenWindow::OnEraseBackground(wxEraseEvent& event) } } -void wxSplashScreenWindow::OnMouseEvent(wxMouseEvent& event) -{ - if (event.LeftDown() || event.RightDown()) - GetParent()->Close(true); - else - event.Skip(); -} - -void wxSplashScreenWindow::OnChar(wxKeyEvent& WXUNUSED(event)) -{ - GetParent()->Close(true); -} - #endif // wxUSE_SPLASH