From 023128b5ab721e4c72b0fdea7ed8fd732dd5d795 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Tue, 28 Feb 2012 03:37:10 +0100 Subject: [PATCH] Add something eggy. --- df | 1 + g_src/SConscript | 18 +++++++++++++++++- g_src/curses.h | 2 +- g_src/eggy.cpp | 29 +++++++++++++++++++++++++++++ g_src/eggy.h | 23 +++++++++++++++++++++++ g_src/enabler.cpp | 9 ++++++++- g_src/graphics.cpp | 4 ++++ g_src/renderer_curses.cpp | 12 ++++++++++-- 8 files changed, 93 insertions(+), 5 deletions(-) create mode 100644 g_src/eggy.cpp create mode 100644 g_src/eggy.h diff --git a/g_src/eggy.h b/g_src/eggy.h new file mode 100644 index 0000000..d1f24dc --- /dev/null +++ b/g_src/eggy.h @@ -0,0 +1,23 @@ +#pragma once +#ifdef unix + #define EggyExport extern "C" __attribute__ ((visibility("default"))) +#else + #ifdef egg_internal + #define EggyExport extern "C" __declspec(dllexport) + #else + #define EggyExport extern "C" __declspec(dllimport) + #endif +#endif + +// hook - called before rendering +EggyExport int egg_init(void); +// hook - called before rendering +EggyExport int egg_shutdown(void); +// hook - called for each game tick (or more often) +EggyExport int egg_tick(void); +// hook - called before rendering +EggyExport int egg_prerender(void); +// hook - called for each SDL event, returns 0 when the event has been consumed. 1 otherwise +EggyExport int egg_sdl_event(void* event); +// hook - ncurses event, -1 signifies error. +EggyExport int egg_curses_event(int orig_return); \ No newline at end of file diff --git a/g_src/enabler.cpp b/g_src/enabler.cpp index 115e748..7e838ea 100755 --- a/g_src/enabler.cpp +++ b/g_src/enabler.cpp @@ -11,6 +11,7 @@ #include "random.h" #include "init.h" #include "music_and_sound_g.h" +#include "eggy.h" #ifdef unix # include @@ -346,7 +347,7 @@ void enablerst::async_loop() { if (async_frames < 0) async_frames = 0; update_fps(); } - SDL_NumJoysticks(); // Hook for dfhack + egg_tick(); // Hook for dfhack } } @@ -433,6 +434,8 @@ void enablerst::eventLoop_SDL() // Check for SDL events while (SDL_PollEvent(&event)) { + if(!egg_sdl_event(&event)) + continue; // Make sure mainloop isn't running while we're processing input if (!paused_loop) { pause_async_loop(); @@ -574,6 +577,8 @@ int enablerst::loop(string cmdline) { } else { renderer = new renderer_opengl(); } + // Tell the egg that we are ready to roll + egg_init(); // At this point we should have a window that is setup to render DF. if (init.display.flag.has_flag(INIT_DISPLAY_FLAG_TEXT)) { @@ -584,6 +589,8 @@ int enablerst::loop(string cmdline) { SDL_EnableUNICODE(1); eventLoop_SDL(); } + // Tell egg to leave + egg_shutdown(); endroutine(); diff --git a/g_src/graphics.cpp b/g_src/graphics.cpp index e255ea8..5a53fe6 100755 --- a/g_src/graphics.cpp +++ b/g_src/graphics.cpp @@ -17,6 +17,8 @@ #include "svector.h" #include "ttf_manager.hpp" +#include "eggy.h" + #ifdef WIN32 /* @@ -559,4 +561,6 @@ void render_things() fps_locator(fps.size()); gps.addst(fps); } + // tell egg to do its dirty obscure things + egg_prerender(); } diff --git a/g_src/renderer_curses.cpp b/g_src/renderer_curses.cpp index 69bd907..44b9b96 100755 --- a/g_src/renderer_curses.cpp +++ b/g_src/renderer_curses.cpp @@ -1,3 +1,5 @@ +#include "eggy.h" + static bool curses_initialized = false; static void endwin_void() { @@ -134,17 +136,23 @@ public: } }; +static int eggy_getch_wrapper() +{ + int byte = wgetch(*stdscr_p); + return egg_curses_event(byte); +} + // Reads from getch, collapsing utf-8 encoding to the actual unicode // character. Ncurses symbols (left arrow, etc.) are returned as // positive values, unicode as negative. Error returns 0. static int getch_utf8() { - int byte = wgetch(*stdscr_p); + int byte = eggy_getch_wrapper(); if (byte == ERR) return 0; if (byte > 0xff) return byte; int len = decode_utf8_predict_length(byte); if (!len) return 0; string input(len,0); input[0] = byte; - for (int i = 1; i < len; i++) input[i] = wgetch(*stdscr_p); + for (int i = 1; i < len; i++) input[i] = eggy_getch_wrapper(); return -decode_utf8(input); } -- 1.7.12.4