]> git.saurik.com Git - wxWidgets.git/blame - src/dfb/evtloop.cpp
Only support detection of "near the edge" coordinates, if dragging grid lines
[wxWidgets.git] / src / dfb / evtloop.cpp
CommitLineData
b3c86150
VS
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
41IDirectFBEventBufferPtr wxEventLoop::ms_buffer;
42
43wxEventLoop::wxEventLoop()
44{
45 if ( !ms_buffer )
46 InitBuffer();
47}
48
49/* static */
50void wxEventLoop::InitBuffer()
51{
52 IDirectFBPtr dfb(wxTheApp->GetDirectFBInterface());
53 DFB_CALL( dfb->CreateEventBuffer(dfb, &ms_buffer) );
54}
55
56/* static */
57IDirectFBEventBufferPtr wxEventLoop::GetDirectFBEventBuffer()
58{
59 if ( !ms_buffer )
60 InitBuffer();
61
62 return ms_buffer;
63}
64
65//-----------------------------------------------------------------------------
66// events dispatch and loop handling
67//-----------------------------------------------------------------------------
68
69bool wxEventLoop::Pending() const
70{
71 wxCHECK_MSG( ms_buffer, false, _T("invalid event buffer") );
72
73 // returns DFB_OK if there is >=1 event, DFB_BUFFER_EMPTY otherwise
74 return ms_buffer->HasEvent(ms_buffer) == DFB_OK;
75}
76
77bool wxEventLoop::Dispatch()
78{
79 wxCHECK_MSG( ms_buffer, false, _T("invalid event buffer") );
80
81 // NB: we don't block indefinitely waiting for an event, but instead
82 // time out after a brief period in order to make sure that
83 // OnNextIteration() will be called frequently enough
84 //
85 // FIXME: call NotifyTimers() from here (and loop) instead?
86 const int TIMEOUT = 100;
87
88 DFBResult ret = ms_buffer->WaitForEventWithTimeout(ms_buffer, 0, TIMEOUT);
89
90 switch ( ret )
91 {
92 case DFB_OK:
93 {
94 wxDFBEvent e;
95 ms_buffer->GetEvent(ms_buffer, &e);
96 HandleDFBEvent(e);
97 break;
98 }
99
100 case DFB_TIMEOUT:
101 // timed out, pretend we processed an event so that OnNextIteration
102 // is called
103 break;
104
105 default:
106 // report any errors, but don't terminate the loop due to them
107 wxDfbCheckReturn(ret);
108 break;
109 }
110
111 return true;
112}
113
114void wxEventLoop::WakeUp()
115{
116 wxCHECK_RET( ms_buffer, _T("invalid event buffer") );
117
118 DFB_CALL( ms_buffer->WakeUp(ms_buffer) );
119}
120
121void wxEventLoop::OnNextIteration()
122{
123#if wxUSE_TIMER
124 // see the comment in Dispatch
125 wxTimer::NotifyTimers();
126#endif
127}
128
129#warning "FIXME: cleanup wxEventLoop::ms_buffer before exiting"
130
131
132//-----------------------------------------------------------------------------
133// DirectFB -> wxWidgets events translation
134//-----------------------------------------------------------------------------
135
136void wxEventLoop::HandleDFBEvent(const wxDFBEvent& event)
137{
138 switch ( event.GetClass() )
139 {
140 case DFEC_WINDOW:
141 {
142 wxDFBWindowEvent winevent(((const DFBEvent&)event).window);
143 wxTopLevelWindowDFB::HandleDFBWindowEvent(winevent);
144 break;
145 }
146
147 case DFEC_NONE:
148 case DFEC_INPUT:
149 case DFEC_USER:
dc4451c2 150#if wxCHECK_DFB_VERSION(0,9,23)
b3c86150 151 case DFEC_UNIVERSAL:
dc4451c2 152#endif
b3c86150
VS
153 {
154 wxLogTrace(TRACE_EVENTS,
155 _T("ignoring event of unsupported class %i"),
156 (int)event.GetClass());
157 }
158 }
159}