clean DFB event buffer on shutdown
[wxWidgets.git] / src / dfb / evtloop.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/dfb/evtloop.cpp
3 // Purpose: wxEventLoop implementation
4 // Author: Vaclav Slavik
5 // Created: 2006-08-16
6 // RCS-ID: $Id$
7 // Copyright: (c) 2006 REA Elektronik GmbH
8 // Licence: wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
10
11 // ===========================================================================
12 // declarations
13 // ===========================================================================
14
15 // ---------------------------------------------------------------------------
16 // headers
17 // ---------------------------------------------------------------------------
18
19 // For compilers that support precompilation, includes "wx.h".
20 #include "wx/wxprec.h"
21
22 #include "wx/evtloop.h"
23
24 #ifndef WX_PRECOMP
25 #include "wx/app.h"
26 #endif
27
28 #include "wx/timer.h"
29 #include "wx/dfb/private.h"
30
31 #define TRACE_EVENTS _T("events")
32
33 // ===========================================================================
34 // implementation
35 // ===========================================================================
36
37 //-----------------------------------------------------------------------------
38 // wxEventLoop initialization
39 //-----------------------------------------------------------------------------
40
41 wxIDirectFBEventBufferPtr wxEventLoop::ms_buffer;
42
43 wxEventLoop::wxEventLoop()
44 {
45 if ( !ms_buffer )
46 InitBuffer();
47 }
48
49 /* static */
50 void wxEventLoop::InitBuffer()
51 {
52 ms_buffer = wxIDirectFB::Get()->CreateEventBuffer();
53 }
54
55 /* static */
56 void wxEventLoop::CleanUp()
57 {
58 ms_buffer.Reset();
59 }
60
61 /* static */
62 wxIDirectFBEventBufferPtr wxEventLoop::GetDirectFBEventBuffer()
63 {
64 if ( !ms_buffer )
65 InitBuffer();
66
67 return ms_buffer;
68 }
69
70 //-----------------------------------------------------------------------------
71 // events dispatch and loop handling
72 //-----------------------------------------------------------------------------
73
74 bool wxEventLoop::Pending() const
75 {
76 wxCHECK_MSG( ms_buffer, false, _T("invalid event buffer") );
77
78 return ms_buffer->HasEvent();
79 }
80
81 bool wxEventLoop::Dispatch()
82 {
83 wxCHECK_MSG( ms_buffer, false, _T("invalid event buffer") );
84
85 // NB: we don't block indefinitely waiting for an event, but instead
86 // time out after a brief period in order to make sure that
87 // OnNextIteration() will be called frequently enough
88 //
89 // FIXME: call NotifyTimers() from here (and loop) instead?
90 const int TIMEOUT = 100;
91
92 if ( ms_buffer->WaitForEventWithTimeout(0, TIMEOUT) )
93 {
94 switch ( ms_buffer->GetLastResult() )
95 {
96 case DFB_OK:
97 {
98 wxDFBEvent e;
99 ms_buffer->GetEvent(e);
100 HandleDFBEvent(e);
101 break;
102 }
103
104 case DFB_TIMEOUT:
105 // timed out, pretend we processed an event so that
106 // OnNextIteration is called
107 break;
108
109 default:
110 // don't terminate the loop due to errors (they were reported
111 // already by ms_buffer)
112 break;
113 }
114 }
115
116 return true;
117 }
118
119 void wxEventLoop::WakeUp()
120 {
121 wxCHECK_RET( ms_buffer, _T("invalid event buffer") );
122
123 ms_buffer->WakeUp();
124 }
125
126 void wxEventLoop::OnNextIteration()
127 {
128 #if wxUSE_TIMER
129 // see the comment in Dispatch
130 wxTimer::NotifyTimers();
131 #endif
132 }
133
134
135 //-----------------------------------------------------------------------------
136 // DirectFB -> wxWidgets events translation
137 //-----------------------------------------------------------------------------
138
139 void wxEventLoop::HandleDFBEvent(const wxDFBEvent& event)
140 {
141 switch ( event.GetClass() )
142 {
143 case DFEC_WINDOW:
144 {
145 wxDFBWindowEvent winevent(((const DFBEvent&)event).window);
146 wxTopLevelWindowDFB::HandleDFBWindowEvent(winevent);
147 break;
148 }
149
150 case DFEC_NONE:
151 case DFEC_INPUT:
152 case DFEC_USER:
153 #if wxCHECK_DFB_VERSION(0,9,23)
154 case DFEC_UNIVERSAL:
155 #endif
156 {
157 wxLogTrace(TRACE_EVENTS,
158 _T("ignoring event of unsupported class %i"),
159 (int)event.GetClass());
160 }
161 }
162 }