diff --git a/apps/openmw-mp/Networking.cpp b/apps/openmw-mp/Networking.cpp index c3067f58c..bfda43863 100644 --- a/apps/openmw-mp/Networking.cpp +++ b/apps/openmw-mp/Networking.cpp @@ -25,6 +25,8 @@ #include "processors/ObjectProcessor.hpp" #include "processors/WorldstateProcessor.hpp" +#include "handleInput.cpp" + using namespace mwmp; using namespace std; @@ -496,6 +498,20 @@ void signalHandler(int signum) } } +#ifdef _WIN32 +BOOL WINAPI sigIntHandler(_In_ DWORD dwCtrlType) { + switch (dwCtrlType) + { + case CTRL_C_EVENT: + signalHandler(15); + return TRUE; + default: + // Pass signal on to the next handler + return FALSE; + } +} +#endif + int Networking::mainLoop() { RakNet::Packet *packet; @@ -506,16 +522,15 @@ int Networking::mainLoop() sigIntHandler.sa_handler = signalHandler; sigemptyset(&sigIntHandler.sa_mask); sigIntHandler.sa_flags = 0; + sigaction(SIGTERM, &sigIntHandler, NULL); + sigaction(SIGINT, &sigIntHandler, NULL); +#else + SetConsoleCtrlHandler(sigIntHandler, TRUE); #endif while (running and !killLoop) { -#ifndef _WIN32 - sigaction(SIGTERM, &sigIntHandler, NULL); - sigaction(SIGINT, &sigIntHandler, NULL); -#endif - if (kbhit() && getch() == '\n') - break; + mwmp_input::handler(); for (packet=peer->Receive(); packet; peer->DeallocatePacket(packet), packet=peer->Receive()) { if (getMasterClient()->Process(packet)) diff --git a/apps/openmw-mp/Script/ScriptFunctions.hpp b/apps/openmw-mp/Script/ScriptFunctions.hpp index fe04c739f..a1d539410 100644 --- a/apps/openmw-mp/Script/ScriptFunctions.hpp +++ b/apps/openmw-mp/Script/ScriptFunctions.hpp @@ -214,7 +214,8 @@ public: {"OnWorldWeather", Callback()}, {"OnClientScriptGlobal", Callback()}, {"OnMpNumIncrement", Callback()}, - {"OnRequestDataFileList", Callback<>()} + {"OnRequestDataFileList", Callback<>()}, + {"OnServerWindowInput", Callback()} }; }; diff --git a/apps/openmw-mp/handleInput.cpp b/apps/openmw-mp/handleInput.cpp new file mode 100644 index 000000000..702d007bc --- /dev/null +++ b/apps/openmw-mp/handleInput.cpp @@ -0,0 +1,27 @@ +using namespace std; +namespace mwmp_input { + string windowInputBuffer; + void handler() { + char c; +#ifndef WIN32 + while (kbhit()) { + c = getch(); +#else // on Windows conio.h getch() and kbhit() are deprecated, use _getch() and _kbhit() instead + while (_kbhit()) { + c = _getch(); +#endif + cout << c << flush; + if (c == '\n' || c == '\r') { // handle carriage return as new line on Windows + cout << endl; + Script::Call(windowInputBuffer.c_str()); + windowInputBuffer.assign(""); + } + else if (c == '\b') { + auto size = windowInputBuffer.size(); + if (size > 0) + windowInputBuffer.erase(size - 1); + } + else windowInputBuffer += c; + } + } +}