]> git.jsancho.org Git - guile-irrlicht.git/blob - src/event-receiver.cpp
Some doc
[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 #include "event-receiver.h"
25 #include "gsubr.h"
26 #include "keycodes.h"
27 #include "wrapped.h"
28
29 using namespace irr;
30
31 SCM
32 IEventReceiver_make (SCM proc_on_event)
33 {
34   class CustomReceiver : public IEventReceiver
35   {
36     SCM scm_on_event;
37
38   public:
39     CustomReceiver (SCM on_event)
40     {
41       scm_on_event = on_event;
42     }
43
44     virtual bool OnEvent (const SEvent& event)
45     {
46       SCM wrapped_event = scm_from_irr_pointer ("<event>", (void*) &event);
47       return scm_to_bool (scm_call_1 (scm_on_event, wrapped_event));
48     }
49   };
50
51   CustomReceiver* receiver = new CustomReceiver (proc_on_event);
52   return scm_from_irr_pointer ("<event-receiver>", (void*) receiver);
53 }
54
55 SCM
56 SEvent_EventType (SCM event)
57 {
58   return scm_from_event_type
59     (((SEvent*)scm_to_irr_pointer (event))->EventType);
60 }
61
62 SCM
63 SEvent_SGUIEvent_Caller (SCM event)
64 {
65   gui::IGUIElement* caller =
66     ((SEvent*)scm_to_irr_pointer (event))->GUIEvent.Caller;
67   return scm_from_irr_pointer ("<gui-element>", (void*) caller);
68 }
69
70 SCM
71 SEvent_SGUIEvent_EventType (SCM event)
72 {
73   return scm_from_gui_event_type
74     (((SEvent*)scm_to_irr_pointer (event))->GUIEvent.EventType);
75 }
76
77 SCM
78 SEvent_SKeyInput_Key (SCM event)
79 {
80   return scm_from_key_code
81     (((SEvent*)scm_to_irr_pointer (event))->KeyInput.Key);
82 }
83
84 SCM
85 SEvent_SKeyInput_PressedDown (SCM event)
86 {
87   return scm_from_bool
88     (((SEvent*)scm_to_irr_pointer (event))->KeyInput.PressedDown);
89 }
90
91 void
92 init_event_receiver (void)
93 {
94   DEFINE_GSUBR ("IEventReceiver_make", 1, 0, 0, IEventReceiver_make);
95   DEFINE_GSUBR ("SEvent_EventType", 1, 0, 0, SEvent_EventType);
96   DEFINE_GSUBR ("SEvent_SGUIEvent_Caller", 1, 0, 0, SEvent_SGUIEvent_Caller);
97   DEFINE_GSUBR ("SEvent_SGUIEvent_EventType", 1, 0, 0, SEvent_SGUIEvent_EventType);
98   DEFINE_GSUBR ("SEvent_SKeyInput_Key", 1, 0, 0, SEvent_SKeyInput_Key);
99   DEFINE_GSUBR ("SEvent_SKeyInput_PressedDown", 1, 0, 0, SEvent_SKeyInput_PressedDown);
100 }
101
102 SCM
103 scm_from_event_type (EEVENT_TYPE event_type)
104 {
105   switch (event_type)
106     {
107     case EET_GUI_EVENT:
108       return scm_from_utf8_symbol ("gui-event");
109       break;
110
111     case EET_MOUSE_INPUT_EVENT:
112       return scm_from_utf8_symbol ("mouse-input-event");
113       break;
114
115     case EET_KEY_INPUT_EVENT:
116       return scm_from_utf8_symbol ("key-input-event");
117       break;
118
119     case EET_JOYSTICK_INPUT_EVENT:
120       return scm_from_utf8_symbol ("joystick-input-event");
121       break;
122
123     case EET_LOG_TEXT_EVENT:
124       return scm_from_utf8_symbol ("log-text-event");
125       break;
126
127     case EET_USER_EVENT:
128       return scm_from_utf8_symbol ("user-event");
129       break;
130
131     default:
132       SCM type = scm_from_uint (event_type);
133       scm_error (scm_arg_type_key, NULL, "Wrong event type: ~S",
134                  scm_list_1 (type), scm_list_1 (type));
135     }
136 }
137
138 SCM
139 scm_from_gui_event_type (gui::EGUI_EVENT_TYPE gui_event_type)
140 {
141   switch (gui_event_type)
142     {
143     case gui::EGET_ELEMENT_FOCUS_LOST:
144       return scm_from_utf8_symbol ("element-focus-lost");
145       break;
146
147     case gui::EGET_ELEMENT_FOCUSED:
148       return scm_from_utf8_symbol ("element-focused");
149       break;
150
151     case gui::EGET_ELEMENT_HOVERED:
152       return scm_from_utf8_symbol ("element-hovered");
153       break;
154
155     case gui::EGET_ELEMENT_LEFT:
156       return scm_from_utf8_symbol ("element-left");
157       break;
158
159     case gui::EGET_ELEMENT_CLOSED:
160       return scm_from_utf8_symbol ("element-closed");
161       break;
162
163     case gui::EGET_BUTTON_CLICKED:
164       return scm_from_utf8_symbol ("button-clicked");
165       break;
166
167     case gui::EGET_SCROLL_BAR_CHANGED:
168       return scm_from_utf8_symbol ("scrollbar-changed");
169       break;
170
171     case gui::EGET_CHECKBOX_CHANGED:
172       return scm_from_utf8_symbol ("checkbox-changed");
173       break;
174
175     case gui::EGET_LISTBOX_CHANGED:
176       return scm_from_utf8_symbol ("listbox-changed");
177       break;
178
179     case gui::EGET_LISTBOX_SELECTED_AGAIN:
180       return scm_from_utf8_symbol ("listbox-selected-again");
181       break;
182
183     case gui::EGET_FILE_SELECTED:
184       return scm_from_utf8_symbol ("file-selected");
185       break;
186
187     case gui::EGET_DIRECTORY_SELECTED:
188       return scm_from_utf8_symbol ("directory-selected");
189       break;
190
191     case gui::EGET_FILE_CHOOSE_DIALOG_CANCELLED:
192       return scm_from_utf8_symbol ("file-choose-dialog-cancelled");
193       break;
194
195     case gui::EGET_MESSAGEBOX_YES:
196       return scm_from_utf8_symbol ("messagebox-yes");
197       break;
198
199     case gui::EGET_MESSAGEBOX_NO:
200       return scm_from_utf8_symbol ("messagebox-no");
201       break;
202
203     case gui::EGET_MESSAGEBOX_OK:
204       return scm_from_utf8_symbol ("messagebox-ok");
205       break;
206
207     case gui::EGET_MESSAGEBOX_CANCEL:
208       return scm_from_utf8_symbol ("messagebox-cancel");
209       break;
210
211     case gui::EGET_EDITBOX_ENTER:
212       return scm_from_utf8_symbol ("editbox-enter");
213       break;
214
215     case gui::EGET_EDITBOX_CHANGED:
216       return scm_from_utf8_symbol ("editbox-changed");
217       break;
218
219     case gui::EGET_EDITBOX_MARKING_CHANGED:
220       return scm_from_utf8_symbol ("editbox-marking-changed");
221       break;
222
223     case gui::EGET_TAB_CHANGED:
224       return scm_from_utf8_symbol ("tab-changed");
225       break;
226
227     case gui::EGET_MENU_ITEM_SELECTED:
228       return scm_from_utf8_symbol ("menu-item-selected");
229       break;
230
231     case gui::EGET_COMBO_BOX_CHANGED:
232       return scm_from_utf8_symbol ("combo-box-changed");
233       break;
234
235     case gui::EGET_SPINBOX_CHANGED:
236       return scm_from_utf8_symbol ("spinbox-changed");
237       break;
238
239     case gui::EGET_TABLE_CHANGED:
240       return scm_from_utf8_symbol ("table-changed");
241       break;
242
243     case gui::EGET_TABLE_HEADER_CHANGED:
244       return scm_from_utf8_symbol ("table-header-changed");
245       break;
246
247     case gui::EGET_TABLE_SELECTED_AGAIN:
248       return scm_from_utf8_symbol ("table-selected-again");
249       break;
250
251     case gui::EGET_TREEVIEW_NODE_DESELECT:
252       return scm_from_utf8_symbol ("treeview-node-deselect");
253       break;
254
255     case gui::EGET_TREEVIEW_NODE_SELECT:
256       return scm_from_utf8_symbol ("treeview-node-select");
257       break;
258
259     case gui::EGET_TREEVIEW_NODE_EXPAND:
260       return scm_from_utf8_symbol ("treeview-node-expand");
261       break;
262
263     case gui::EGET_TREEVIEW_NODE_COLLAPSE:
264       return scm_from_utf8_symbol ("treeview-node-collapse");
265       break;
266
267     default:
268       SCM type = scm_from_uint (gui_event_type);
269       scm_error (scm_arg_type_key, NULL, "Wrong GUI event type: ~S",
270                  scm_list_1 (type), scm_list_1 (type));
271     }
272 }