diff options
| author | Timothy Collett | 2012-05-25 14:28:59 -0400 |
|---|---|---|
| committer | Timothy Collett | 2012-05-25 14:28:59 -0400 |
| commit | 1dd4cc56670819e72d05c306d4f97d9b5a15cd3b (patch) | |
| tree | d9f65163e789733a36f37a3def3dd2c428dab9cf /library/Hooks-darwin.cpp | |
| parent | 44c3afc3066652f39d0b7be56cdca1f88e155132 (diff) | |
| download | dfhack-1dd4cc56670819e72d05c306d4f97d9b5a15cd3b.tar.gz dfhack-1dd4cc56670819e72d05c306d4f97d9b5a15cd3b.tar.bz2 dfhack-1dd4cc56670819e72d05c306d4f97d9b5a15cd3b.tar.xz | |
More work on getting dfhack building & compiling on Mac OS X
Diffstat (limited to 'library/Hooks-darwin.cpp')
| -rw-r--r-- | library/Hooks-darwin.cpp | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/library/Hooks-darwin.cpp b/library/Hooks-darwin.cpp new file mode 100644 index 00000000..59539c79 --- /dev/null +++ b/library/Hooks-darwin.cpp @@ -0,0 +1,169 @@ +/* +https://github.com/peterix/dfhack +Copyright (c) 2009-2011 Petr Mrázek (peterix@gmail.com) + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +distribution. +*/ + + +#include <stdio.h> +#include <dlfcn.h> +#include <stdint.h> +#include <stdlib.h> +#include <string.h> +#include <sys/shm.h> +#include <sys/types.h> +#include <sys/ipc.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <unistd.h> +#include <vector> +#include <string> +#include <map> + +/*typedef struct interpose_s +{ + void *new_func; + void *orig_func; +} interpose_t;*/ + +#include "DFHack.h" +#include "Core.h" +#include "Hooks.h" +#include <iostream> + +#include "MacPool.h" + +/*static const interpose_t interposers[] __attribute__ ((section("__DATA, __interpose"))) = +{ + { (void *)DFH_SDL_Init, (void *)SDL_Init }, + { (void *)DFH_SDL_PollEvent, (void *)SDL_PollEvent }, + { (void *)DFH_SDL_Quit, (void *)SDL_Quit }, + { (void *)DFH_SDL_NumJoysticks, (void *)SDL_NumJoysticks }, + +};*/ + +/******************************************************************************* +* SDL part starts here * +*******************************************************************************/ +// hook - called for each game tick (or more often) +DFhackCExport int SDL_NumJoysticks(void) +{ + DFHack::Core & c = DFHack::Core::getInstance(); + return c.Update(); +} + +// hook - called at program exit +static void (*_SDL_Quit)(void) = 0; +DFhackCExport void SDL_Quit(void) +{ + DFHack::Core & c = DFHack::Core::getInstance(); + c.Shutdown(); + /*if(_SDL_Quit) + { + _SDL_Quit(); + }*/ + +// destroy_pool(); + + _SDL_Quit(); +} + +// called by DF to check input events +static int (*_SDL_PollEvent)(SDL_Event* event) = 0; +DFhackCExport int SDL_PollEvent(SDL_Event* event) +{ + pollevent_again: + // if SDL returns 0 here, it means there are no more events. return 0 + int orig_return = _SDL_PollEvent(event); + if(!orig_return) + return 0; + // otherwise we have an event to filter + else if( event != 0 ) + { + DFHack::Core & c = DFHack::Core::getInstance(); + // if we consume the event, ask SDL for more. + if(!c.DFH_SDL_Event(event)) + goto pollevent_again; + } + return orig_return; +} + +struct WINDOW; +DFhackCExport int wgetch(WINDOW *win) +{ + static int (*_wgetch)(WINDOW * win) = (int (*)( WINDOW * )) dlsym(RTLD_NEXT, "wgetch"); + if(!_wgetch) + { + exit(EXIT_FAILURE); + } + DFHack::Core & c = DFHack::Core::getInstance(); + wgetch_again: + int in = _wgetch(win); + int out; + if(c.ncurses_wgetch(in, out)) + { + // not consumed, give to DF + return out; + } + else + { + // consumed, repeat + goto wgetch_again; + } +} + +// hook - called at program start, initialize some stuffs we'll use later +static int (*_SDL_Init)(uint32_t flags) = 0; +DFhackCExport int SDL_Init(uint32_t flags) +{ + // reroute stderr + 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 + // See: Console-linux.cpp + +// create_pool(); + + // find real functions + fprintf(stderr,"dfhack: saving real SDL functions\n"); + _SDL_Init = (int (*)( uint32_t )) dlsym(RTLD_NEXT, "SDL_Init"); + _SDL_Quit = (void (*)( void )) dlsym(RTLD_NEXT, "SDL_Quit"); + _SDL_PollEvent = (int (*)(SDL_Event*))dlsym(RTLD_NEXT,"SDL_PollEvent"); + + fprintf(stderr,"dfhack: saved real SDL functions\n"); + // check if we got them + if(_SDL_Init && _SDL_Quit && _SDL_PollEvent) + { + fprintf(stderr,"dfhack: hooking successful\n"); + } + else + { + // bail, this would be a disaster otherwise + fprintf(stderr,"dfhack: something went horribly wrong\n"); + exit(1); + } + + DFHack::Core & c = DFHack::Core::getInstance(); + c.Init(); + + int ret = _SDL_Init(flags); + return ret; +}
\ No newline at end of file |
