]> git.jsancho.org Git - guile-irrlicht.git/blob - src/event-receiver.cpp
add-static-text!
[guile-irrlicht.git] / src / event-receiver.cpp
1 /* guile-irrlicht --- GNU Guile bindings for Irrlicht Engine
2
3    Copyright (C) 2020 Javier Sancho <jsf@jsancho.org>
4
5    This file is part of guile-irrlicht.
6
7    guile-irrlicht is free software; you can redistribute it and/or modify
8    it under the terms of the GNU Lesser General Public License as
9    published by the Free Software Foundation; either version 3 of the
10    License, or (at your option) any later version.
11
12    guile-irrlicht is distributed in the hope that it will be useful, but
13    WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15    General Public License for more details.
16
17    You should have received a copy of the GNU Lesser General Public
18    License along with guile-irrlicht. If not, see
19    <http://www.gnu.org/licenses/>.
20 */
21
22 #include <irrlicht/irrlicht.h>
23 #include <libguile.h>
24
25 #include "event-receiver.h"
26 #include "gui-element.h"
27 #include "gsubr.h"
28 #include "keycodes.h"
29 #include "wrapped.h"
30
31 extern "C" {
32
33   void
34   init_event_receiver (void)
35   {
36     init_event_receiver_type ();
37     init_event_type ();
38     DEFINE_GSUBR ("get-event-gui-caller", 1, 0, 0, get_event_gui_caller);
39     DEFINE_GSUBR ("get-event-gui-type", 1, 0, 0, get_event_gui_type);
40     DEFINE_GSUBR ("get-event-key-input-key", 1, 0, 0, get_event_key_input_key);
41     DEFINE_GSUBR ("get-event-key-input-pressed", 1, 0, 0, get_event_key_input_pressed);
42     DEFINE_GSUBR ("get-event-type", 1, 0, 0, get_event_type);
43     DEFINE_GSUBR ("make-event-receiver", 1, 0, 0, make_event_receiver);
44   }
45
46   DEFINE_WRAPPED_TYPE (irr::IEventReceiver*, "event-receiver",
47                        init_event_receiver_type, event_receiver_p,
48                        wrap_event_receiver, unwrap_event_receiver);
49
50   DEFINE_WRAPPED_TYPE (irr::SEvent*, "event",
51                        init_event_type, event_p,
52                        wrap_event, unwrap_event);
53
54   SCM
55   get_event_gui_caller (SCM event)
56   {
57     return wrap_gui_element (unwrap_event (event)->GUIEvent.Caller);
58   }
59
60   SCM
61   get_event_gui_type (SCM event)
62   {
63     return scm_from_gui_event_type (unwrap_event (event)->GUIEvent.EventType);
64   }
65
66   SCM
67   get_event_key_input_key (SCM event)
68   {
69     return scm_from_key_code (unwrap_event (event)->KeyInput.Key);
70   }
71
72   SCM
73   get_event_key_input_pressed (SCM event)
74   {
75     return scm_from_bool (unwrap_event (event)->KeyInput.PressedDown);
76   }
77
78   SCM
79   get_event_type (SCM event)
80   {
81     return scm_from_event_type (unwrap_event (event)->EventType);
82   }
83
84   SCM
85   make_event_receiver (SCM proc_on_event)
86   {
87     class CustomReceiver : public irr::IEventReceiver
88     {
89       SCM scm_on_event;
90
91     public:
92       CustomReceiver (SCM on_event)
93       {
94         scm_on_event = on_event;
95       }
96
97       virtual bool OnEvent (const irr::SEvent& event)
98       {
99         return scm_to_bool (scm_call_1 (scm_on_event, wrap_event ((irr::SEvent*)&event)));
100       }
101     };
102
103     CustomReceiver* receiver = new CustomReceiver (proc_on_event);
104     return wrap_event_receiver (receiver);
105   }
106
107   SCM
108   scm_from_event_type (irr::EEVENT_TYPE event_type)
109   {
110     switch (event_type)
111       {
112       case irr::EET_GUI_EVENT:
113         return scm_from_utf8_symbol ("gui-event");
114         break;
115
116       case irr::EET_MOUSE_INPUT_EVENT:
117         return scm_from_utf8_symbol ("mouse-input-event");
118         break;
119
120       case irr::EET_KEY_INPUT_EVENT:
121         return scm_from_utf8_symbol ("key-input-event");
122         break;
123
124       case irr::EET_JOYSTICK_INPUT_EVENT:
125         return scm_from_utf8_symbol ("joystick-input-event");
126         break;
127
128       case irr::EET_LOG_TEXT_EVENT:
129         return scm_from_utf8_symbol ("log-text-event");
130         break;
131
132       case irr::EET_USER_EVENT:
133         return scm_from_utf8_symbol ("user-event");
134         break;
135
136       default:
137         SCM type = scm_from_uint (event_type);
138         scm_error (scm_arg_type_key, NULL, "Wrong event type: ~S",
139                    scm_list_1 (type), scm_list_1 (type));
140       }
141   }
142
143   SCM
144   scm_from_gui_event_type (irr::gui::EGUI_EVENT_TYPE gui_event_type)
145   {
146     switch (gui_event_type)
147       {
148       case irr::gui::EGET_ELEMENT_FOCUS_LOST:
149         return scm_from_utf8_symbol ("element-focus-lost");
150         break;
151
152       case irr::gui::EGET_ELEMENT_FOCUSED:
153         return scm_from_utf8_symbol ("element-focused");
154         break;
155
156       case irr::gui::EGET_ELEMENT_HOVERED:
157         return scm_from_utf8_symbol ("element-hovered");
158         break;
159
160       case irr::gui::EGET_ELEMENT_LEFT:
161         return scm_from_utf8_symbol ("element-left");
162         break;
163
164       case irr::gui::EGET_ELEMENT_CLOSED:
165         return scm_from_utf8_symbol ("element-closed");
166         break;
167
168       case irr::gui::EGET_BUTTON_CLICKED:
169         return scm_from_utf8_symbol ("button-clicked");
170         break;
171
172       case irr::gui::EGET_SCROLL_BAR_CHANGED:
173         return scm_from_utf8_symbol ("scrollbar-changed");
174         break;
175
176       case irr::gui::EGET_CHECKBOX_CHANGED:
177         return scm_from_utf8_symbol ("checkbox-changed");
178         break;
179
180       case irr::gui::EGET_LISTBOX_CHANGED:
181         return scm_from_utf8_symbol ("listbox-changed");
182         break;
183
184       case irr::gui::EGET_LISTBOX_SELECTED_AGAIN:
185         return scm_from_utf8_symbol ("listbox-selected-again");
186         break;
187
188       case irr::gui::EGET_FILE_SELECTED:
189         return scm_from_utf8_symbol ("file-selected");
190         break;
191
192       case irr::gui::EGET_DIRECTORY_SELECTED:
193         return scm_from_utf8_symbol ("directory-selected");
194         break;
195
196       case irr::gui::EGET_FILE_CHOOSE_DIALOG_CANCELLED:
197         return scm_from_utf8_symbol ("file-choose-dialog-cancelled");
198         break;
199
200       case irr::gui::EGET_MESSAGEBOX_YES:
201         return scm_from_utf8_symbol ("messagebox-yes");
202         break;
203
204       case irr::gui::EGET_MESSAGEBOX_NO:
205         return scm_from_utf8_symbol ("messagebox-no");
206         break;
207
208       case irr::gui::EGET_MESSAGEBOX_OK:
209         return scm_from_utf8_symbol ("messagebox-ok");
210         break;
211
212       case irr::gui::EGET_MESSAGEBOX_CANCEL:
213         return scm_from_utf8_symbol ("messagebox-cancel");
214         break;
215
216       case irr::gui::EGET_EDITBOX_ENTER:
217         return scm_from_utf8_symbol ("editbox-enter");
218         break;
219
220       case irr::gui::EGET_EDITBOX_CHANGED:
221         return scm_from_utf8_symbol ("editbox-changed");
222         break;
223
224       case irr::gui::EGET_EDITBOX_MARKING_CHANGED:
225         return scm_from_utf8_symbol ("editbox-marking-changed");
226         break;
227
228       case irr::gui::EGET_TAB_CHANGED:
229         return scm_from_utf8_symbol ("tab-changed");
230         break;
231
232       case irr::gui::EGET_MENU_ITEM_SELECTED:
233         return scm_from_utf8_symbol ("menu-item-selected");
234         break;
235
236       case irr::gui::EGET_COMBO_BOX_CHANGED:
237         return scm_from_utf8_symbol ("combo-box-changed");
238         break;
239
240       case irr::gui::EGET_SPINBOX_CHANGED:
241         return scm_from_utf8_symbol ("spinbox-changed");
242         break;
243
244       case irr::gui::EGET_TABLE_CHANGED:
245         return scm_from_utf8_symbol ("table-changed");
246         break;
247
248       case irr::gui::EGET_TABLE_HEADER_CHANGED:
249         return scm_from_utf8_symbol ("table-header-changed");
250         break;
251
252       case irr::gui::EGET_TABLE_SELECTED_AGAIN:
253         return scm_from_utf8_symbol ("table-selected-again");
254         break;
255
256       case irr::gui::EGET_TREEVIEW_NODE_DESELECT:
257         return scm_from_utf8_symbol ("treeview-node-deselect");
258         break;
259
260       case irr::gui::EGET_TREEVIEW_NODE_SELECT:
261         return scm_from_utf8_symbol ("treeview-node-select");
262         break;
263
264       case irr::gui::EGET_TREEVIEW_NODE_EXPAND:
265         return scm_from_utf8_symbol ("treeview-node-expand");
266         break;
267
268       case irr::gui::EGET_TREEVIEW_NODE_COLLAPSE:
269         return scm_from_utf8_symbol ("treeview-node-collapse");
270         break;
271
272       default:
273         SCM type = scm_from_uint (gui_event_type);
274         scm_error (scm_arg_type_key, NULL, "Wrong GUI event type: ~S",
275                    scm_list_1 (type), scm_list_1 (type));
276       }
277   }
278
279 }