implement new dfhooks API

develop
Myk Taylor 2022-12-23 19:05:00 -08:00
parent 7625dc132e
commit 4789637625
No known key found for this signature in database
8 changed files with 79 additions and 25 deletions

@ -258,6 +258,7 @@ if(UNIX)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32 -march=i686") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32 -march=i686")
endif() endif()
string(REPLACE "-DNDEBUG" "" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") string(REPLACE "-DNDEBUG" "" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
set(CMAKE_INSTALL_RPATH "hack")
elseif(MSVC) elseif(MSVC)
# for msvc, tell it to always use 8-byte pointers to member functions to avoid confusion # for msvc, tell it to always use 8-byte pointers to member functions to avoid confusion
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /vmg /vmm /MP") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /vmg /vmm /MP")

@ -96,6 +96,7 @@ endif()
set(MAIN_SOURCES_WINDOWS set(MAIN_SOURCES_WINDOWS
${CONSOLE_SOURCES} ${CONSOLE_SOURCES}
Hooks-windows.cpp Hooks-windows.cpp
Hooks.cpp
PlugLoad-windows.cpp PlugLoad-windows.cpp
Process-windows.cpp Process-windows.cpp
) )
@ -374,6 +375,8 @@ if(WIN32)
else() else()
set_target_properties(dfhack PROPERTIES COMPILE_FLAGS "-include Export.h" ) set_target_properties(dfhack PROPERTIES COMPILE_FLAGS "-include Export.h" )
set_target_properties(dfhack-client PROPERTIES COMPILE_FLAGS "-include Export.h" ) set_target_properties(dfhack-client PROPERTIES COMPILE_FLAGS "-include Export.h" )
add_library(dfhooks SHARED Hooks.cpp)
target_link_libraries(dfhooks dfhack)
endif() endif()
# effectively disables debug builds... # effectively disables debug builds...
@ -422,6 +425,9 @@ if(UNIX)
install(PROGRAMS ${dfhack_SOURCE_DIR}/package/linux/dfhack-run install(PROGRAMS ${dfhack_SOURCE_DIR}/package/linux/dfhack-run
DESTINATION .) DESTINATION .)
endif() endif()
install(TARGETS dfhooks
LIBRARY DESTINATION .
RUNTIME DESTINATION .)
else() else()
# On windows, copy the renamed SDL so DF can still run. # On windows, copy the renamed SDL so DF can still run.
install(PROGRAMS ${dfhack_SOURCE_DIR}/package/windows/win${DFHACK_BUILD_ARCH}/SDLreal.dll install(PROGRAMS ${dfhack_SOURCE_DIR}/package/windows/win${DFHACK_BUILD_ARCH}/SDLreal.dll

@ -1481,11 +1481,12 @@ bool Core::Init()
// make it obvious what's going on if someone checks the *.txt files. // make it obvious what's going on if someone checks the *.txt files.
#ifndef LINUX_BUILD #ifndef LINUX_BUILD
// Don't do this on Linux because it will break PRINT_MODE:TEXT // Don't do this on Linux because it will break PRINT_MODE:TEXT
// this is handled as appropriate in Console-posix.cpp
fprintf(stdout, "dfhack: redirecting stdout to stdout.log (again)\n"); fprintf(stdout, "dfhack: redirecting stdout to stdout.log (again)\n");
fprintf(stderr, "dfhack: redirecting stderr to stderr.log (again)\n");
freopen("stdout.log", "w", stdout); freopen("stdout.log", "w", stdout);
freopen("stderr.log", "w", stderr);
#endif #endif
fprintf(stderr, "dfhack: redirecting stderr to stderr.log\n");
freopen("stderr.log", "w", stderr);
Filesystem::init(); Filesystem::init();
@ -1760,6 +1761,14 @@ bool Core::Init()
} }
cerr << "DFHack is running.\n"; cerr << "DFHack is running.\n";
{
auto L = Lua::Core::State;
Lua::StackUnwinder top(L);
Lua::CallLuaModuleFunction(con, L, "script-manager", "reload");
onStateChange(con, SC_CORE_INITIALIZED);
}
return true; return true;
} }
/// sets the current hotkey command /// sets the current hotkey command
@ -1835,17 +1844,10 @@ bool Core::isSuspended(void)
return ownerThread.load() == std::this_thread::get_id(); return ownerThread.load() == std::this_thread::get_id();
} }
void Core::doUpdate(color_ostream &out, bool first_update) void Core::doUpdate(color_ostream &out)
{ {
Lua::Core::Reset(out, "DF code execution"); Lua::Core::Reset(out, "DF code execution");
if (first_update) {
auto L = Lua::Core::State;
Lua::StackUnwinder top(L);
Lua::CallLuaModuleFunction(out, L, "script-manager", "reload");
onStateChange(out, SC_CORE_INITIALIZED);
}
// find the current viewscreen // find the current viewscreen
df::viewscreen *screen = NULL; df::viewscreen *screen = NULL;
if (df::global::gview) if (df::global::gview)
@ -1948,19 +1950,15 @@ int Core::Update()
// Pretend this thread has suspended the core in the usual way, // Pretend this thread has suspended the core in the usual way,
// and run various processing hooks. // and run various processing hooks.
{ {
// Initialize the core
bool first_update = false;
if(!started) if(!started)
{ {
first_update = true; // Initialize the core
Init(); Init();
if(errorstate) if(errorstate)
return -1; return -1;
Lua::Core::Reset(con, "core init");
} }
doUpdate(out, first_update); doUpdate(out);
} }
// Let all commands run that require CoreSuspender // Let all commands run that require CoreSuspender
@ -2289,6 +2287,14 @@ bool Core::ncurses_wgetch(int in, int & out)
return true; return true;
} }
bool Core::DFH_ncurses_key(int key)
{
if (getenv("DFHACK_HEADLESS"))
return true;
int dummy;
return !ncurses_wgetch(key, dummy);
}
int UnicodeAwareSym(const SDL::KeyboardEvent& ke) int UnicodeAwareSym(const SDL::KeyboardEvent& ke)
{ {
// Assume keyboard layouts don't change the order of numbers: // Assume keyboard layouts don't change the order of numbers:

@ -279,9 +279,8 @@ DFhackCExport int DFH_SDL_Init(uint32_t flags)
{ {
// reroute stderr // reroute stderr
fprintf(stderr,"dfhack: attempting to hook in\n"); fprintf(stderr,"dfhack: attempting to hook in\n");
freopen("stderr.log", "w", stderr);
// we don't reroute stdout until we figure out if this should be done at all // we don't reroute stdout until we figure out if this should be done at all
// See: Console-linux.cpp // See: Console-posix.cpp
// find real functions // find real functions
fprintf(stderr,"dfhack: saving real SDL functions\n"); fprintf(stderr,"dfhack: saving real SDL functions\n");

@ -117,12 +117,6 @@ DFhackCExport int wgetch(WINDOW *win)
static int (*_SDL_Init)(uint32_t flags) = 0; static int (*_SDL_Init)(uint32_t flags) = 0;
DFhackCExport int SDL_Init(uint32_t flags) DFhackCExport int SDL_Init(uint32_t flags)
{ {
// reroute stderr
if (!freopen("stderr.log", "w", stderr))
fprintf(stderr, "dfhack: failed to reroute stderr\n");
// we don't reroute stdout until we figure out if this should be done at all
// See: Console-linux.cpp
// find real functions // find real functions
_SDL_Init = (int (*)( uint32_t )) dlsym(RTLD_NEXT, "SDL_Init"); _SDL_Init = (int (*)( uint32_t )) dlsym(RTLD_NEXT, "SDL_Init");
_SDL_Quit = (void (*)( void )) dlsym(RTLD_NEXT, "SDL_Quit"); _SDL_Quit = (void (*)( void )) dlsym(RTLD_NEXT, "SDL_Quit");

@ -0,0 +1,33 @@
#include "Core.h"
#include "Export.h"
// called before main event loop starts
DFhackCExport void dfhooks_init() {
DFHack::Core::getInstance().Init();
}
// called after main event loops exits
DFhackCExport void dfhooks_shutdown() {
DFHack::Core::getInstance().Shutdown();
}
// called in the main event loop
DFhackCExport void dfhooks_update() {
DFHack::Core::getInstance().Update();
}
// called just before adding the macro recording/playback overlay
DFhackCExport void dfhooks_prerender() {
// TODO: render overlay widgets that are not attached to a viewscreen
}
// called for each SDL event, if true is returned, then the event has been
// consumed and further processing shouldn't happen
DFhackCExport bool dfhooks_sdl_event(SDL::Event* event) {
return DFHack::Core::getInstance().DFH_SDL_Event(event);
}
// called for each utf-8 char read from the ncurses input
// key is positive for ncurses keys and negative for everything else
DFhackCExport bool dfhooks_ncurses_key(int key) {
return DFHack::Core::getInstance().DFH_ncurses_key(key);
}

@ -121,6 +121,12 @@ namespace DFHack
friend int ::SDL_Init(uint32_t flags); friend int ::SDL_Init(uint32_t flags);
friend int ::wgetch(WINDOW * w); friend int ::wgetch(WINDOW * w);
#endif #endif
friend void ::dfhooks_init();
friend void ::dfhooks_shutdown();
friend void ::dfhooks_update();
friend void ::dfhooks_prerender();
friend bool ::dfhooks_sdl_event(SDL::Event* event);
friend bool ::dfhooks_ncurses_key(int key);
public: public:
/// Get the single Core instance or make one. /// Get the single Core instance or make one.
static Core& getInstance() static Core& getInstance()
@ -202,8 +208,9 @@ namespace DFHack
int Shutdown (void); int Shutdown (void);
int DFH_SDL_Event(SDL::Event* event); int DFH_SDL_Event(SDL::Event* event);
bool ncurses_wgetch(int in, int & out); bool ncurses_wgetch(int in, int & out);
bool DFH_ncurses_key(int key);
void doUpdate(color_ostream &out, bool first_update); void doUpdate(color_ostream &out);
void onUpdate(color_ostream &out); void onUpdate(color_ostream &out);
void onStateChange(color_ostream &out, state_change_event event); void onStateChange(color_ostream &out, state_change_event event);
void handleLoadAndUnloadScripts(color_ostream &out, state_change_event event); void handleLoadAndUnloadScripts(color_ostream &out, state_change_event event);

@ -74,3 +74,11 @@ DFhackCExport void * SDL_GetVideoSurface(void);
DFhackCExport int SDL_SemWait(vPtr sem); DFhackCExport int SDL_SemWait(vPtr sem);
DFhackCExport int SDL_SemPost(vPtr sem); DFhackCExport int SDL_SemPost(vPtr sem);
// new Hooks API
DFhackCExport void dfhooks_init();
DFhackCExport void dfhooks_shutdown();
DFhackCExport void dfhooks_update();
DFhackCExport void dfhooks_prerender();
DFhackCExport bool dfhooks_sdl_event(SDL::Event* event);
DFhackCExport bool dfhooks_ncurses_key(int key);