openclonk/src/platform/C4App.cpp

97 lines
2.4 KiB
C++

/*
* OpenClonk, http://www.openclonk.org
*
* Copyright (c) 2007, Alexander Post
* Copyright (c) 2010-2016, The OpenClonk Team and contributors
*
* Distributed under the terms of the ISC license; see accompanying file
* "COPYING" for details.
*
* "Clonk" is a registered trademark of Matthes Bender, used with permission.
* See accompanying file "TRADEMARK" for details.
*
* To redistribute this file separately, substitute the full license texts
* for the above references.
*/
#include "C4Include.h"
#include "platform/C4App.h"
#include "platform/C4Window.h"
#ifdef WITH_QT_EDITOR
#include "game/C4Application.h"
#include "editor/C4ConsoleQt.h"
#endif
void C4AbstractApp::Run()
{
#ifdef WITH_QT_EDITOR
if (Application.isEditor)
{
// Qt has its own event loop. Use a timer to call our own event handling whenever Qt is done
// with its events. The alternative (calling Qt's event handling from
// C4Console::Execute) is too slow, at least on Linux.
// FIXME: All of this should be happening in a background thread instead of on the UI thread
QTimer timer;
QObject::connect(&timer, &QTimer::timeout, [this, &timer]() {
ScheduleProcs(0);
if (fQuitMsgReceived)
{
QApplication::quit();
return;
}
auto now = C4TimeMilliseconds::Now();
auto next_tick = GetNextTick(now);
timer.setInterval(Clamp(next_tick - now, 0, 1000/36));
});
timer.setTimerType(Qt::PreciseTimer);
timer.start();
QApplication::exec();
return;
}
#endif
// Main message loop
while (!fQuitMsgReceived)
ScheduleProcs();
}
bool C4AbstractApp::DoScheduleProcs(int iTimeout)
{
// Always fail after quit message
if(fQuitMsgReceived)
return false;
#if defined(USE_SDL_MAINLOOP) || defined(USE_COCOA)
// Unfortunately, the SDL event loop needs to be polled
FlushMessages();
#endif
#ifdef WITH_QT_EDITOR
// Some places, for example the lobby, have a nested event processing loop.
// To prevent the editor from freezing, call the Qt event loop here.
if (iTimeout)
ProcessQtEvents();
#endif
return StdScheduler::DoScheduleProcs(iTimeout);
}
#ifdef WITH_QT_EDITOR
void C4AbstractApp::ProcessQtEvents()
{
if (Application.isEditor)
QApplication::processEvents();
}
#endif
void C4Window::PerformUpdate()
{
}
void C4AbstractApp::NotifyUserIfInactive()
{
#ifdef _WIN32
if (!Active && pWindow) pWindow->FlashWindow();
#else
if (pWindow) pWindow->FlashWindow();
#endif
}