]> git.saurik.com Git - wxWidgets.git/blame - src/generic/splash.cpp
Make wxEventLoop::AddSourceForFD() static.
[wxWidgets.git] / src / generic / splash.cpp
CommitLineData
3f4fc796 1/////////////////////////////////////////////////////////////////////////////
ed4b0fdc 2// Name: src/generic/splash.cpp
3f4fc796
JS
3// Purpose: wxSplashScreen class
4// Author: Julian Smart
5// Modified by:
6// Created: 28/6/2000
7// RCS-ID: $Id$
8// Copyright: (c) Julian Smart
65571936 9// Licence: wxWindows licence
3f4fc796
JS
10/////////////////////////////////////////////////////////////////////////////
11
3f4fc796
JS
12// For compilers that support precompilation, includes "wx/wx.h".
13#include "wx/wxprec.h"
14
15#ifdef __BORLANDC__
ed4b0fdc 16 #pragma hdrstop
3f4fc796
JS
17#endif
18
1e6feb95
VZ
19#if wxUSE_SPLASH
20
231475bf
VS
21#ifdef __WXGTK20__
22 #include <gtk/gtk.h>
23#endif
24
3f4fc796
JS
25#include "wx/splash.h"
26
ed4b0fdc
WS
27#ifndef WX_PRECOMP
28 #include "wx/dcmemory.h"
29 #include "wx/dcclient.h"
30#endif
231475bf 31
3f4fc796 32
aac39d1d
FM
33// ----------------------------------------------------------------------------
34// wxSplashScreen
35// ----------------------------------------------------------------------------
3f4fc796 36
aac39d1d 37#define wxSPLASH_TIMER_ID 9999
d1d2cd38 38
aac39d1d 39IMPLEMENT_DYNAMIC_CLASS(wxSplashScreen, wxFrame)
3f4fc796
JS
40BEGIN_EVENT_TABLE(wxSplashScreen, wxFrame)
41 EVT_TIMER(wxSPLASH_TIMER_ID, wxSplashScreen::OnNotify)
42 EVT_CLOSE(wxSplashScreen::OnCloseWindow)
43END_EVENT_TABLE()
44
6e043ba9
VZ
45void wxSplashScreen::Init()
46{
47 m_window = NULL;
48
49 wxEvtHandler::AddFilter(this);
50}
51
97f1fb19
JS
52/* Note that unless we pass a non-default size to the frame, SetClientSize
53 * won't work properly under Windows, and the splash screen frame is sized
54 * slightly too small.
55 */
56
aac39d1d
FM
57wxSplashScreen::wxSplashScreen(const wxBitmap& bitmap, long splashStyle, int milliseconds,
58 wxWindow* parent, wxWindowID id, const wxPoint& pos,
59 const wxSize& size, long style)
7650eed4
VZ
60 : wxFrame(parent, id, wxEmptyString, wxPoint(0,0), wxSize(100, 100),
61 style | wxFRAME_TOOL_WINDOW | wxFRAME_NO_TASKBAR)
3f4fc796 62{
6e043ba9
VZ
63 Init();
64
889e7422
VZ
65 // splash screen must not be used as parent by the other windows because it
66 // is going to disappear soon, indicate it by giving it this special style
67 SetExtraStyle(GetExtraStyle() | wxWS_EX_TRANSIENT);
68
95561814 69#if defined(__WXGTK20__)
231475bf
VS
70 gtk_window_set_type_hint(GTK_WINDOW(m_widget),
71 GDK_WINDOW_TYPE_HINT_SPLASHSCREEN);
72#endif
2997ca30 73
3f4fc796
JS
74 m_splashStyle = splashStyle;
75 m_milliseconds = milliseconds;
76
ca65c044 77 m_window = new wxSplashScreenWindow(bitmap, this, wxID_ANY, pos, size, wxNO_BORDER);
3f4fc796 78
97f1fb19 79 SetClientSize(bitmap.GetWidth(), bitmap.GetHeight());
3f4fc796
JS
80
81 if (m_splashStyle & wxSPLASH_CENTRE_ON_PARENT)
82 CentreOnParent();
83 else if (m_splashStyle & wxSPLASH_CENTRE_ON_SCREEN)
84 CentreOnScreen();
85
86 if (m_splashStyle & wxSPLASH_TIMEOUT)
87 {
88 m_timer.SetOwner(this, wxSPLASH_TIMER_ID);
ca65c044 89 m_timer.Start(milliseconds, true);
3f4fc796
JS
90 }
91
ca65c044 92 Show(true);
3f4fc796 93 m_window->SetFocus();
913ff1a7 94#if defined( __WXMSW__ ) || defined(__WXMAC__)
8d079279 95 Update(); // Without this, you see a blank screen for an instant
aac39d1d
FM
96#elif defined(__WXGTK20__)
97 // we don't need to do anything at least on wxGTK with GTK+ 2.12.9
8d079279
JS
98#else
99 wxYieldIfNeeded(); // Should eliminate this
100#endif
3f4fc796
JS
101}
102
103wxSplashScreen::~wxSplashScreen()
104{
105 m_timer.Stop();
6e043ba9
VZ
106
107 wxEvtHandler::RemoveFilter(this);
108}
109
110int wxSplashScreen::FilterEvent(wxEvent& event)
111{
112 const wxEventType t = event.GetEventType();
113 if ( t == wxEVT_KEY_DOWN ||
114 t == wxEVT_LEFT_DOWN ||
115 t == wxEVT_RIGHT_DOWN ||
116 t == wxEVT_MIDDLE_DOWN )
117 Close(true);
118
119 return -1;
3f4fc796
JS
120}
121
33ac7e6f 122void wxSplashScreen::OnNotify(wxTimerEvent& WXUNUSED(event))
3f4fc796 123{
ca65c044 124 Close(true);
3f4fc796
JS
125}
126
33ac7e6f 127void wxSplashScreen::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
3f4fc796
JS
128{
129 m_timer.Stop();
130 this->Destroy();
131}
132
aac39d1d
FM
133// ----------------------------------------------------------------------------
134// wxSplashScreenWindow
135// ----------------------------------------------------------------------------
3f4fc796
JS
136
137BEGIN_EVENT_TABLE(wxSplashScreenWindow, wxWindow)
c2d516f2
RD
138#ifdef __WXGTK__
139 EVT_PAINT(wxSplashScreenWindow::OnPaint)
140#endif
3f4fc796 141 EVT_ERASE_BACKGROUND(wxSplashScreenWindow::OnEraseBackground)
3f4fc796
JS
142END_EVENT_TABLE()
143
aac39d1d
FM
144wxSplashScreenWindow::wxSplashScreenWindow(const wxBitmap& bitmap, wxWindow* parent,
145 wxWindowID id, const wxPoint& pos,
146 const wxSize& size, long style)
147 : wxWindow(parent, id, pos, size, style)
3f4fc796
JS
148{
149 m_bitmap = bitmap;
574c939e 150
e3b7670b 151#if !defined(__WXGTK__) && wxUSE_PALETTE
574c939e
KB
152 bool hiColour = (wxDisplayDepth() >= 16) ;
153
154 if (bitmap.GetPalette() && !hiColour)
155 {
156 SetPalette(* bitmap.GetPalette());
157 }
158#endif
3f4fc796
JS
159}
160
e22c13fe
VZ
161// VZ: why don't we do it under wxGTK?
162#if !defined(__WXGTK__) && wxUSE_PALETTE
163 #define USE_PALETTE_IN_SPLASH
164#endif
165
33ac7e6f 166static void wxDrawSplashBitmap(wxDC& dc, const wxBitmap& bitmap, int WXUNUSED(x), int WXUNUSED(y))
3f4fc796
JS
167{
168 wxMemoryDC dcMem;
169
e22c13fe 170#ifdef USE_PALETTE_IN_SPLASH
3f4fc796 171 bool hiColour = (wxDisplayDepth() >= 16) ;
33ac7e6f 172
3f4fc796
JS
173 if (bitmap.GetPalette() && !hiColour)
174 {
3f4fc796
JS
175 dcMem.SetPalette(* bitmap.GetPalette());
176 }
e22c13fe 177#endif // USE_PALETTE_IN_SPLASH
25093cf3 178
fea35690 179 dcMem.SelectObjectAsSource(bitmap);
deb8254e
VZ
180 dc.Blit(0, 0, bitmap.GetWidth(), bitmap.GetHeight(), &dcMem, 0, 0, wxCOPY,
181 true /* use mask */);
3f4fc796 182 dcMem.SelectObject(wxNullBitmap);
25093cf3 183
e22c13fe 184#ifdef USE_PALETTE_IN_SPLASH
3f4fc796
JS
185 if (bitmap.GetPalette() && !hiColour)
186 {
3f4fc796
JS
187 dcMem.SetPalette(wxNullPalette);
188 }
e22c13fe 189#endif // USE_PALETTE_IN_SPLASH
3f4fc796
JS
190}
191
c2d516f2
RD
192void wxSplashScreenWindow::OnPaint(wxPaintEvent& WXUNUSED(event))
193{
194 wxPaintDC dc(this);
a1b806b9 195 if (m_bitmap.IsOk())
c2d516f2
RD
196 wxDrawSplashBitmap(dc, m_bitmap, 0, 0);
197}
198
3f4fc796
JS
199void wxSplashScreenWindow::OnEraseBackground(wxEraseEvent& event)
200{
a1b806b9 201 if (event.GetDC() && m_bitmap.IsOk())
3f4fc796 202 {
aac39d1d 203 wxDrawSplashBitmap(* event.GetDC(), m_bitmap, 0, 0);
3f4fc796
JS
204 }
205 else
206 {
207 wxClientDC dc(this);
a1b806b9 208 if (m_bitmap.IsOk())
3f4fc796 209 wxDrawSplashBitmap(dc, m_bitmap, 0, 0);
3f4fc796
JS
210 }
211}
212
1e6feb95 213#endif // wxUSE_SPLASH