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