# HG changeset patch # User unc0rr # Date 1513983543 -3600 # Node ID 90f927b4b9e1869925598f7ac60c795c82ee70ff # Parent 95d903b976d08d11244b4ff51bbbfc19ae03ba4b Start hacking new frontend diff -r 95d903b976d0 -r 90f927b4b9e1 CMakeLists.txt --- a/CMakeLists.txt Sun Dec 17 21:09:59 2017 +0100 +++ b/CMakeLists.txt Fri Dec 22 23:59:03 2017 +0100 @@ -257,7 +257,7 @@ else(ANDROID) #skip frontend for javascript if(NOT BUILD_ENGINE_JS) - add_subdirectory(qmlFrontend) + add_subdirectory(qmlfrontend) add_subdirectory(share) endif() diff -r 95d903b976d0 -r 90f927b4b9e1 hedgewars/CMakeLists.txt --- a/hedgewars/CMakeLists.txt Sun Dec 17 21:09:59 2017 +0100 +++ b/hedgewars/CMakeLists.txt Fri Dec 22 23:59:03 2017 +0100 @@ -106,18 +106,8 @@ uGearsUtils.pas uTeams.pas - uFLAmmo.pas - uFLDrawnMap.pas - uFLGameConfig.pas uFLIPC.pas - uFLNet.pas - uFLNetProtocol.pas - uFLNetTypes.pas uFLRunQueue.pas - uFLScripts.pas - uFLSchemes.pas - uFLTeams.pas - uFLThemes.pas uFLTypes.pas uFLUICallback.pas uFLUtils.pas diff -r 95d903b976d0 -r 90f927b4b9e1 hedgewars/hwLibrary.pas --- a/hedgewars/hwLibrary.pas Sun Dec 17 21:09:59 2017 +0100 +++ b/hedgewars/hwLibrary.pas Fri Dec 22 23:59:03 2017 +0100 @@ -105,12 +105,10 @@ begin initIPC; uPhysFSLayer.initModule(localPrefix, userPrefix); - uFLNet.initModule; end; procedure flibFree; cdecl; begin - uFLNet.freeModule; uPhysFSLayer.freemodule; freeIPC; end; diff -r 95d903b976d0 -r 90f927b4b9e1 qmlfrontend/CMakeLists.txt --- a/qmlfrontend/CMakeLists.txt Sun Dec 17 21:09:59 2017 +0100 +++ b/qmlfrontend/CMakeLists.txt Fri Dec 22 23:59:03 2017 +0100 @@ -8,6 +8,6 @@ find_package(Qt5 COMPONENTS Core Quick REQUIRED) -add_executable(${PROJECT_NAME} "main.cpp" "qml.qrc") +add_executable(${PROJECT_NAME} "main.cpp" "qml.qrc" "hwengine.cpp" "hwengine.h" "flib.h") target_link_libraries(${PROJECT_NAME} Qt5::Core Qt5::Quick) diff -r 95d903b976d0 -r 90f927b4b9e1 qmlfrontend/flib.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qmlfrontend/flib.h Fri Dec 22 23:59:03 2017 +0100 @@ -0,0 +1,72 @@ +#ifndef FLIB_H +#define FLIB_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +enum MessageType { + MSG_RENDERINGPREVIEW + , MSG_PREVIEW + , MSG_PREVIEWHOGCOUNT + , MSG_ADDPLAYINGTEAM + , MSG_REMOVEPLAYINGTEAM + , MSG_ADDTEAM + , MSG_REMOVETEAM + , MSG_TEAMCOLOR + , MSG_HEDGEHOGSNUMBER + , MSG_NETDATA + , MSG_TONET + , MSG_FLIBEVENT + , MSG_CONNECTED + , MSG_DISCONNECTED + , MSG_ADDLOBBYCLIENT + , MSG_REMOVELOBBYCLIENT + , MSG_LOBBYCHATLINE + , MSG_ADDROOMCLIENT + , MSG_REMOVEROOMCLIENT + , MSG_ROOMCHATLINE + , MSG_ADDROOM + , MSG_UPDATEROOM + , MSG_REMOVEROOM + , MSG_ERROR + , MSG_WARNING + , MSG_MOVETOLOBBY + , MSG_MOVETOROOM + , MSG_NICKNAME + , MSG_SEED + , MSG_THEME + , MSG_SCRIPT + , MSG_FEATURESIZE + , MSG_MAPGEN + , MSG_MAP + , MSG_MAZESIZE + , MSG_TEMPLATE + , MSG_AMMO + , MSG_SCHEME +}; + +typedef union string255_ + { + struct { + unsigned char s[256]; + }; + struct { + unsigned char len; + unsigned char str[255]; + }; + } string255; + +typedef void RunEngine_t(int argc, const char ** argv); +typedef void registerUIMessagesCallback_t(void * context, void (*)(void * context, MessageType mt, const char * msg, uint32_t len)); +typedef void flibInit_t(const char * localPrefix, const char * userPrefix); +typedef void flibFree_t(); +typedef void passFlibEvent_t(const char * data); + +#ifdef __cplusplus +} +#endif + +#endif // FLIB_H diff -r 95d903b976d0 -r 90f927b4b9e1 qmlfrontend/hwengine.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qmlfrontend/hwengine.cpp Fri Dec 22 23:59:03 2017 +0100 @@ -0,0 +1,69 @@ +#include "hwengine.h" + +#include +#include + +extern "C" { +RunEngine_t* flibRunEngine; +registerUIMessagesCallback_t* flibRegisterUIMessagesCallback; +flibInit_t* flibInit; +flibFree_t* flibFree; +passFlibEvent_t* flibPassFlibEvent; +} + +HWEngine::HWEngine(QQmlEngine* engine, QObject* parent) + : QObject(parent) + , m_engine(engine) +{ + qRegisterMetaType("MessageType"); + +#ifdef Q_OS_WIN + QLibrary hwlib("./libhwengine.dll"); +#else + QLibrary hwlib("./libhwengine.so"); +#endif + + if (!hwlib.load()) + qWarning() << "Engine library not found" << hwlib.errorString(); + + flibRunEngine = (RunEngine_t*)hwlib.resolve("RunEngine"); + flibRegisterUIMessagesCallback = (registerUIMessagesCallback_t*)hwlib.resolve("registerUIMessagesCallback"); + flibInit = (flibInit_t*)hwlib.resolve("flibInit"); + flibFree = (flibFree_t*)hwlib.resolve("flibFree"); + + flibInit("/usr/home/unC0Rr/Sources/Hedgewars/MainRepo/share/hedgewars/Data", "/usr/home/unC0Rr/.hedgewars"); + flibRegisterUIMessagesCallback(this, &guiMessagesCallback); +} + +HWEngine::~HWEngine() +{ + flibFree(); +} + +void HWEngine::guiMessagesCallback(void* context, MessageType mt, const char* msg, uint32_t len) +{ + HWEngine* obj = reinterpret_cast(context); + QByteArray b = QByteArray(msg, len); + + qDebug() << "FLIPC in" << mt << " size = " << b.size(); + + QMetaObject::invokeMethod(obj, "engineMessageHandler", Qt::QueuedConnection, Q_ARG(MessageType, mt), Q_ARG(QByteArray, b)); +} + +void HWEngine::engineMessageHandler(MessageType mt, const QByteArray& msg) +{ + switch (mt) { + case MSG_RENDERINGPREVIEW: { + emit previewIsRendering(); + break; + } + case MSG_PREVIEW: { + emit previewImageChanged(); + break; + } + case MSG_PREVIEWHOGCOUNT: { + emit previewHogCountChanged((quint8)msg.data()[0]); + break; + } + } +} diff -r 95d903b976d0 -r 90f927b4b9e1 qmlfrontend/hwengine.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qmlfrontend/hwengine.h Fri Dec 22 23:59:03 2017 +0100 @@ -0,0 +1,37 @@ +#ifndef HWENGINE_H +#define HWENGINE_H + +#include + +#include "flib.h" + +class QQmlEngine; + +class HWEnginePrivate; + +class HWEngine : public QObject { + Q_OBJECT + +public: + explicit HWEngine(QQmlEngine* engine, QObject* parent = nullptr); + ~HWEngine(); + + static void exposeToQML(); + +signals: + void previewIsRendering(); + void previewImageChanged(); + void previewHogCountChanged(int count); + +public slots: + +private: + QQmlEngine* m_engine; + + static void guiMessagesCallback(void* context, MessageType mt, const char* msg, uint32_t len); + +private slots: + void engineMessageHandler(MessageType mt, const QByteArray& msg); +}; + +#endif // HWENGINE_H diff -r 95d903b976d0 -r 90f927b4b9e1 qmlfrontend/main.cpp --- a/qmlfrontend/main.cpp Sun Dec 17 21:09:59 2017 +0100 +++ b/qmlfrontend/main.cpp Fri Dec 22 23:59:03 2017 +0100 @@ -1,6 +1,8 @@ #include #include +#include "hwengine.h" + int main(int argc, char *argv[]) { QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);