From a07c344063e6dca568add5f022c7aab495061d11 Mon Sep 17 00:00:00 2001 From: Javier Sancho Date: Tue, 7 Apr 2020 08:42:03 +0200 Subject: [PATCH] make-event-receiver event-type --- Makefile.am | 1 + src/device.cpp | 4 +- src/event-receiver.cpp | 112 +++++++++++++++++++++++++++++++++++++++++ src/event-receiver.h | 51 +++++++++++++++++++ src/guile-irrlicht.cpp | 2 + 5 files changed, 169 insertions(+), 1 deletion(-) create mode 100644 src/event-receiver.cpp create mode 100644 src/event-receiver.h diff --git a/Makefile.am b/Makefile.am index c0dfc0a..2cd0772 100644 --- a/Makefile.am +++ b/Makefile.am @@ -33,6 +33,7 @@ libguile_irrlicht_la_SOURCES = \ src/device.cpp \ src/dimension2d.cpp \ src/driver-types.cpp \ + src/event-receiver.cpp \ src/file-archive.cpp \ src/file-system.cpp \ src/gui-element.cpp \ diff --git a/src/device.cpp b/src/device.cpp index 41d6193..0a4d2c6 100644 --- a/src/device.cpp +++ b/src/device.cpp @@ -25,6 +25,7 @@ #include "device.h" #include "dimension2d.h" #include "driver-types.h" +#include "event-receiver.h" #include "wchar.h" #include "wrapped.h" @@ -75,7 +76,8 @@ extern "C" { scm_to_uint32 (bits), scm_to_bool (fullscreen), scm_to_bool (stencilbuffer), - scm_to_bool (vsync)); + scm_to_bool (vsync), + scm_is_false (receiver) ? 0 : unwrap_event_receiver (receiver)); return wrap_device (device); } 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)); + } + } + +} diff --git a/src/event-receiver.h b/src/event-receiver.h new file mode 100644 index 0000000..3b1cd72 --- /dev/null +++ b/src/event-receiver.h @@ -0,0 +1,51 @@ +/* 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 + . +*/ + +#ifndef __GUILE_IRRLICHT_EVENT_RECEIVER_H_INCLUDED__ +#define __GUILE_IRRLICHT_EVENT_RECEIVER_H_INCLUDED__ + +#include +#include +#include "wrapped.h" + +extern "C" { + + void + init_event_receiver (void); + + DECLARE_WRAPPED_TYPE (irr::IEventReceiver*, init_event_receiver_type, + event_receiver_p, wrap_event_receiver, unwrap_event_receiver); + + DECLARE_WRAPPED_TYPE (irr::SEvent*, init_event_type, + event_p, wrap_event, unwrap_event); + + SCM + event_type (SCM event); + + SCM + make_event_receiver (SCM proc_on_event); + + SCM + scm_from_event_type (irr::EEVENT_TYPE event_type); + +} + +#endif diff --git a/src/guile-irrlicht.cpp b/src/guile-irrlicht.cpp index 35e27f1..f81cff7 100644 --- a/src/guile-irrlicht.cpp +++ b/src/guile-irrlicht.cpp @@ -27,6 +27,7 @@ #include "camera-scene-node.h" #include "cursor-control.h" #include "device.h" +#include "event-receiver.h" #include "file-archive.h" #include "file-system.h" #include "gui-element.h" @@ -59,6 +60,7 @@ extern "C" { init_camera_scene_node (); init_cursor_control (); init_device (); + init_event_receiver (); init_file_archive (); init_file_system (); init_gui_element (); -- 2.39.2