]> git.saurik.com Git - wxWidgets.git/commitdiff
Dismiss wxSplashScreen on any user input, not necessarily on splash itself.
authorVadim Zeitlin <vadim@wxwidgets.org>
Tue, 22 Nov 2011 13:18:55 +0000 (13:18 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Tue, 22 Nov 2011 13:18:55 +0000 (13:18 +0000)
Use wxEventFilter to remove the splash screen as soon as any user input is
detected anywhere in the application, not necessarily over the splash screen
itself.

This ensures that the splash screen disappears as soon as the user starts
working with the application instead of sticking around and covering the main
window.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@69796 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/generic/splash.h
src/generic/splash.cpp

index 77ea5dba03cc3655880ce9e9e2b7f3d8d3de7a96..1441be4420c36fc86d98184d861a63dcffcf1c89 100644 (file)
@@ -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; }
index 24dc3c57b29731ee91fe12b75049b867e757ffac..c101144cbc96a3569ff6bd2fc02f4e3df3a076f2 100644 (file)
@@ -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