X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=src%2Fevent-receiver.cpp;fp=src%2Fevent-receiver.cpp;h=f5d673b8c2f19d7359dc63068bb00d600dceb6f1;hb=a07c344063e6dca568add5f022c7aab495061d11;hp=0000000000000000000000000000000000000000;hpb=d461760a76c8cd8667d4210d628738db05270366;p=guile-irrlicht.git diff --git a/src/event-receiver.cpp b/src/event-receiver.cpp new file mode 100644 index 0000000..f5d673b --- /dev/null +++ b/src/event-receiver.cpp @@ -0,0 +1,112 @@ +/* guile-irrlicht --- GNU Guile bindings for Irrlicht Engine + + Copyright (C) 2020 Javier Sancho + + This file is part of guile-irrlicht. + + guile-irrlicht is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 3 of the + License, or (at your option) any later version. + + guile-irrlicht is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with guile-irrlicht. If not, see + . +*/ + +#include +#include +#include "event-receiver.h" +#include "wrapped.h" + +extern "C" { + + void + init_event_receiver (void) + { + init_event_receiver_type (); + init_event_type (); + scm_c_define_gsubr ("event-type", 1, 0, 0, (scm_t_subr)event_type); + scm_c_define_gsubr ("make-event-receiver", 1, 0, 0, (scm_t_subr)make_event_receiver); + scm_c_export ("event-type", "make-event-receiver", NULL); + } + + DEFINE_WRAPPED_TYPE (irr::IEventReceiver*, "event-receiver", + init_event_receiver_type, event_receiver_p, + wrap_event_receiver, unwrap_event_receiver); + + DEFINE_WRAPPED_TYPE (irr::SEvent*, "event", + init_event_type, event_p, + wrap_event, unwrap_event); + + SCM + event_type (SCM event) + { + return scm_from_event_type (unwrap_event (event)->EventType); + } + + SCM + make_event_receiver (SCM proc_on_event) + { + class CustomReceiver : public irr::IEventReceiver + { + SCM scm_on_event; + + public: + CustomReceiver (SCM on_event) + { + scm_on_event = on_event; + } + + virtual bool OnEvent (const irr::SEvent& event) + { + return scm_to_bool (scm_call_1 (scm_on_event, wrap_event ((irr::SEvent*)&event))); + } + }; + + CustomReceiver* receiver = new CustomReceiver (proc_on_event); + return wrap_event_receiver (receiver); + } + + SCM + scm_from_event_type (irr::EEVENT_TYPE event_type) + { + switch (event_type) + { + case irr::EET_GUI_EVENT: + return scm_from_utf8_symbol ("gui-event"); + break; + + case irr::EET_MOUSE_INPUT_EVENT: + return scm_from_utf8_symbol ("mouse-input-event"); + break; + + case irr::EET_KEY_INPUT_EVENT: + return scm_from_utf8_symbol ("key-input-event"); + break; + + case irr::EET_JOYSTICK_INPUT_EVENT: + return scm_from_utf8_symbol ("joystick-input-event"); + break; + + case irr::EET_LOG_TEXT_EVENT: + return scm_from_utf8_symbol ("log-text-event"); + break; + + case irr::EET_USER_EVENT: + return scm_from_utf8_symbol ("user-event"); + break; + + default: + SCM type = scm_from_uint (event_type); + scm_error (scm_arg_type_key, NULL, "Wrong event type: ~S", + scm_list_1 (type), scm_list_1 (type)); + } + } + +}