]> git.saurik.com Git - wxWidgets.git/blame - src/cocoa/evtloop.mm
It's too late.
[wxWidgets.git] / src / cocoa / evtloop.mm
CommitLineData
f5e10026
DE
1///////////////////////////////////////////////////////////////////////////////
2// Name: cocoa/evtloop.mm
3// Purpose: implements wxEventLoop for Cocoa
4// Author: David Elliott
5// Modified by:
6// Created: 2003/10/02
7// RCS-ID: $Id$
8// Copyright: (c) 2003 David Elliott <dfe@cox.net>
065e208e 9// License: wxWidgets licence
f5e10026
DE
10///////////////////////////////////////////////////////////////////////////////
11
12#include "wx/wxprec.h"
13#ifndef WX_PRECOMP
14 #include "wx/log.h"
eb537cfb 15 #include "wx/app.h"
f5e10026
DE
16#endif //WX_PRECOMP
17
18#include "wx/evtloop.h"
19
20#import <AppKit/NSApplication.h>
72ae85dd
DE
21#import <AppKit/NSEvent.h>
22#import <Foundation/NSRunLoop.h>
f5e10026
DE
23
24// ========================================================================
25// wxEventLoopImpl
26// ========================================================================
27
28class WXDLLEXPORT wxEventLoopImpl
29{
30public:
31 // ctor
32 wxEventLoopImpl() { SetExitCode(0); }
33
34 // set/get the exit code
35 void SetExitCode(int exitcode) { m_exitcode = exitcode; }
36 int GetExitCode() const { return m_exitcode; }
37
38private:
39 // the exit code of the event loop
40 int m_exitcode;
41};
42
43// ========================================================================
44// wxEventLoop
45// ========================================================================
46
47// ----------------------------------------------------------------------------
48// wxEventLoop running and exiting
49// ----------------------------------------------------------------------------
50
f5e10026
DE
51wxEventLoop::~wxEventLoop()
52{
53 wxASSERT_MSG( !m_impl, _T("should have been deleted in Run()") );
54}
55
f5e10026
DE
56int wxEventLoop::Run()
57{
58 // event loops are not recursive, you need to create another loop!
59 wxCHECK_MSG( !IsRunning(), -1, _T("can't reenter a message loop") );
60
77fb1a02 61 wxEventLoopActivator activate(this);
f5e10026
DE
62
63 m_impl = new wxEventLoopImpl;
64
65 [[NSApplication sharedApplication] run];
66
67 int exitcode = m_impl->GetExitCode();
68 delete m_impl;
69 m_impl = NULL;
70
f5e10026
DE
71 return exitcode;
72}
73
74void wxEventLoop::Exit(int rc)
75{
76 wxCHECK_RET( IsRunning(), _T("can't call Exit() if not running") );
77
78 m_impl->SetExitCode(rc);
79
80 NSApplication *cocoaApp = [NSApplication sharedApplication];
48580976 81 wxLogTrace(wxTRACE_COCOA,wxT("wxEventLoop::Exit isRunning=%d"), (int)[cocoaApp isRunning]);
eb537cfb 82 wxTheApp->WakeUpIdle();
9670dfc4 83 /* Notes:
eb537cfb
DE
84 If we're being called from idle time (which occurs while checking the
85 queue for new events) there may or may not be any events in the queue.
86 In order to successfully stop the event loop, at least one event must
87 be processed. To ensure this always happens, WakeUpIdle is called.
9670dfc4
DE
88
89 If the application was active when closed then this is unnecessary
90 because it would receive a deactivate event anyway. However, if the
91 application was not active when closed, then no events would be
92 added to the queue by Cocoa and thus the application would wait
93 indefinitely for the next event.
94 */
f5e10026
DE
95 [cocoaApp stop: cocoaApp];
96}
97
98// ----------------------------------------------------------------------------
99// wxEventLoop message processing dispatching
100// ----------------------------------------------------------------------------
101
102bool wxEventLoop::Pending() const
103{
72ae85dd
DE
104 // a pointer to the event is returned if there is one, or nil if not
105 return [[NSApplication sharedApplication]
106 nextEventMatchingMask: NSAnyEventMask
107 untilDate: nil /* Equivalent to [NSDate distantPast] */
108 inMode: NSDefaultRunLoopMode
109 dequeue: NO];
f5e10026
DE
110}
111
112bool wxEventLoop::Dispatch()
113{
72ae85dd
DE
114 // This check is required by wxGTK but probably not really for wxCocoa
115 // Keep it here to encourage developers to write cross-platform code
f5e10026 116 wxCHECK_MSG( IsRunning(), false, _T("can't call Dispatch() if not running") );
72ae85dd
DE
117 NSApplication *cocoaApp = [NSApplication sharedApplication];
118 // Block to retrieve an event then send it
119 if(NSEvent *event = [cocoaApp
120 nextEventMatchingMask:NSAnyEventMask
121 untilDate:[NSDate distantFuture]
122 inMode:NSDefaultRunLoopMode
123 dequeue: YES])
124 {
125 [cocoaApp sendEvent: event];
126 return true;
127 }
f5e10026
DE
128 return false;
129}
130