implement DispatchTimeout() for wxCocoa

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@57620 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2008-12-28 14:25:00 +00:00
parent 41d0b41d68
commit 1df4b19481
5 changed files with 62 additions and 34 deletions

View File

@@ -2489,6 +2489,7 @@ COND_TOOLKIT_COCOA_GUI_HDR = \
wx/cocoa/dialog.h \
wx/cocoa/dirdlg.h \
wx/cocoa/drawer.h \
wx/cocoa/evtloop.h \
wx/cocoa/filedlg.h \
wx/cocoa/font.h \
wx/cocoa/fontdlg.h \

View File

@@ -2682,6 +2682,7 @@ src/osx/iphone/window.mm
wx/cocoa/dialog.h
wx/cocoa/dirdlg.h
wx/cocoa/drawer.h
wx/cocoa/evtloop.h
wx/cocoa/filedlg.h
wx/cocoa/font.h
wx/cocoa/fontdlg.h

View File

@@ -0,0 +1,37 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/cocoa/evtloop.h
// Purpose: declaration of wxGUIEventLoop for wxCocoa
// Author: Vadim Zeitlin
// Created: 2008-12-28
// RCS-ID: $Id$
// Copyright: (c) 2008 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_COCOA_EVTLOOP_H_
#define _WX_COCOA_EVTLOOP_H_
// ----------------------------------------------------------------------------
// wxGUIEventLoop for wxCocoa
// ----------------------------------------------------------------------------
class WXDLLIMPEXP_CORE wxGUIEventLoop : public wxEventLoopBase
{
public:
wxGUIEventLoop() { m_exitcode = 0; }
virtual int Run();
virtual void Exit(int rc = 0);
virtual bool Pending() const;
virtual bool Dispatch();
virtual int DispatchTimeout(unsigned long timeout);
virtual void WakeUp() { }
protected:
int m_exitcode;
DECLARE_NO_COPY_CLASS(wxGUIEventLoop)
};
#endif // _WX_COCOA_EVTLOOP_H_

View File

@@ -124,6 +124,8 @@ protected:
#include "wx/msw/evtloop.h"
#elif defined(__WXMAC__)
#include "wx/osx/evtloop.h"
#elif defined(__WXCOCOA__)
#include "wx/cocoa/evtloop.h"
#elif defined(__WXDFB__)
#include "wx/dfb/evtloop.h"
#elif defined(__WXGTK20__)

View File

@@ -10,6 +10,7 @@
///////////////////////////////////////////////////////////////////////////////
#include "wx/wxprec.h"
#ifndef WX_PRECOMP
#include "wx/log.h"
#include "wx/app.h"
@@ -21,25 +22,6 @@
#import <AppKit/NSEvent.h>
#import <Foundation/NSRunLoop.h>
// ========================================================================
// wxEventLoopImpl
// ========================================================================
class WXDLLEXPORT wxEventLoopImpl
{
public:
// ctor
wxEventLoopImpl() { SetExitCode(0); }
// set/get the exit code
void SetExitCode(int exitcode) { m_exitcode = exitcode; }
int GetExitCode() const { return m_exitcode; }
private:
// the exit code of the event loop
int m_exitcode;
};
// ========================================================================
// wxGUIEventLoop
// ========================================================================
@@ -48,11 +30,6 @@ private:
// wxGUIEventLoop running and exiting
// ----------------------------------------------------------------------------
wxGUIEventLoop::~wxGUIEventLoop()
{
wxASSERT_MSG( !m_impl, _T("should have been deleted in Run()") );
}
int wxGUIEventLoop::Run()
{
// event loops are not recursive, you need to create another loop!
@@ -60,24 +37,18 @@ int wxGUIEventLoop::Run()
wxEventLoopActivator activate(this);
m_impl = new wxEventLoopImpl;
[[NSApplication sharedApplication] run];
OnExit();
int exitcode = m_impl->GetExitCode();
delete m_impl;
m_impl = NULL;
return exitcode;
return m_exitcode;
}
void wxGUIEventLoop::Exit(int rc)
{
wxCHECK_RET( IsRunning(), _T("can't call Exit() if not running") );
m_impl->SetExitCode(rc);
m_exitcode = rc;
NSApplication *cocoaApp = [NSApplication sharedApplication];
wxLogTrace(wxTRACE_COCOA,wxT("wxEventLoop::Exit isRunning=%d"), (int)[cocoaApp isRunning]);
@@ -125,8 +96,24 @@ bool wxGUIEventLoop::Dispatch()
dequeue: YES])
{
[cocoaApp sendEvent: event];
return true;
}
return false;
}
return true;
}
int wxGUIEventLoop::DispatchTimeout(unsigned long timeout)
{
NSApplication *cocoaApp = [NSApplication sharedApplication];
NSEvent *event = [cocoaApp
nextEventMatchingMask:NSAnyEventMask
untilDate:[[NSDate alloc] initWithTimeIntervalSinceNow:timeout/1000]
inMode:NSDefaultRunLoopMode
dequeue: YES];
if ( !event )
return -1;
[cocoaApp sendEvent: event];
return true;
}