diff --git a/plugins/proto/RemoteFortressReader.proto b/plugins/proto/RemoteFortressReader.proto index b2aef8c58..7321be36c 100644 --- a/plugins/proto/RemoteFortressReader.proto +++ b/plugins/proto/RemoteFortressReader.proto @@ -470,4 +470,15 @@ message ScreenCapture optional uint32 width = 1; optional uint32 height = 2; repeated ScreenTile tiles = 3; +} + +message KeyboardEvent +{ + optional uint32 type = 1; + optional uint32 which = 2; + optional uint32 state = 3; + optional uint32 scancode = 4; + optional uint32 sym = 5; + optional uint32 mod = 6; + optional uint32 unicode = 7; } \ No newline at end of file diff --git a/plugins/remotefortressreader.cpp b/plugins/remotefortressreader.cpp index f1abbffab..362c28cf3 100644 --- a/plugins/remotefortressreader.cpp +++ b/plugins/remotefortressreader.cpp @@ -75,6 +75,9 @@ #include "modules/World.h" #include "TileTypes.h" #include "MiscUtils.h" +#include "Hooks.h" +#include "SDL_events.h" +#include "SDL_keyboard.h" #include #include @@ -118,6 +121,7 @@ static command_result GetRegionMaps(color_ostream &stream, const EmptyMessage *i static command_result GetCreatureRaws(color_ostream &stream, const EmptyMessage *in, CreatureRawList *out); static command_result GetPlantRaws(color_ostream &stream, const EmptyMessage *in, PlantRawList *out); static command_result CopyScreen(color_ostream &stream, const EmptyMessage *in, ScreenCapture *out); +static command_result PassKeyboardEvent(color_ostream &stream, const KeyboardEvent *in); void CopyBlock(df::map_block * DfBlock, RemoteFortressReader::MapBlock * NetBlock, MapExtras::MapCache * MC, DFCoord pos); @@ -172,6 +176,7 @@ DFhackCExport RPCService *plugin_rpcconnect(color_ostream &) svc->addFunction("GetWorldMapCenter", GetWorldMapCenter); svc->addFunction("GetPlantRaws", GetPlantRaws); svc->addFunction("CopyScreen", CopyScreen); + svc->addFunction("PassKeyboardEvent", PassKeyboardEvent); return svc; } @@ -2057,3 +2062,16 @@ static command_result CopyScreen(color_ostream &stream, const EmptyMessage *in, return CR_OK; } + +static command_result PassKeyboardEvent(color_ostream &stream, const KeyboardEvent *in) +{ + SDL::Event e; + e.key.type = in->type(); + e.key.state = in->state(); + e.key.ksym.mod = (SDL::Mod)in->mod(); + e.key.ksym.scancode = in->scancode(); + e.key.ksym.sym = (SDL::Key)in->sym(); + e.key.ksym.unicode = in->unicode(); + SDL_PushEvent(&e); + return CR_OK; +}