3 * (c) 2011 Alexander Warg <warg@os.inf.tu-dresden.de>
4 * economic rights: Technische Universität Dresden (Germany)
6 * This file is part of TUD:OS and distributed under the terms of the
7 * GNU General Public License 2.
8 * Please see the COPYING-GPL-2 file for details.
14 %include <lua_typemap.i>
16 /* typemap for our input values (supporting and invalid value as 'nil') */
17 %typemap(out) Mag_server::Value<int>
18 %{ if ($1.valid()) lua_pushinteger(L, $1.val()); else lua_pushnil(L); SWIG_arg++; %}
20 %typemap(in) Mag_server::Value<int>
22 if (lua_isnil(L, $input))
23 $1 = Mag_server::Value<int>();
26 SWIG_contract_assert(lua_isinteger(L, $input), "argument must be a number")
27 $1 = Mag_server::Valua<int>(lua_tointeger(L, $input));
31 /* we report key events as pair of code and value in lua */
32 %typemap(out) Mag_server::Hid_report::Key_event const *
36 lua_pushinteger(L, $1->code);
37 lua_pushinteger(L, $1->value);
44 #include <l4/mag/server/hid_report>
45 #include <l4/mag/server/valuator>
46 #include <l4/mag/server/user_state>
47 #include <l4/mag/server/input_source>
50 namespace Mag_server {
51 extern Mag_server::User_state *user_state;
54 int luaopen_Mag(lua_State*);
58 %ignore Mag_server::View_proxy::view;
59 %ignore Mag_server::View_proxy::forget;
60 %ignore Mag_server::View;
62 %ignore Mag_server::User_state::User_state;
63 %ignore Mag_server::User_state::forget_view;
64 %ignore Mag_server::Mode;
66 %ignore L4Re::Default_event_payload;
67 %ignore L4Re::Event_buffer_t;
68 %ignore L4Re::Event_buffer;
70 #pragma SWIG nowarn=401,325
75 %include <server/mode>
76 %include <server/valuator>
77 %apply unsigned *OUTPUT { unsigned *bus, unsigned *vendor, unsigned *product, unsigned *version };
78 %include <l4re/include/event>
79 %clear unsigned *bus, unsigned *vendor, unsigned *product, unsigned *version;
83 %template(Valuatori) Mag_server::Valuator<int>;
84 %template(Valuei) Mag_server::Value<int>;
86 namespace Mag_server {
101 class Axis_info_vector
105 explicit Axis_info_vector(unsigned size);
108 unsigned size() const;
109 Axis_info const *get(unsigned idx) const;
110 Axis_info *get(unsigned idx);
111 Axis_info *create(unsigned idx);
112 %apply SWIGTYPE *DISOWN { Axis_info *info };
113 bool set(unsigned idx, Axis_info *info);
114 %clear Axis_info *info;
117 %extend Axis_info_vector
119 Mag_server::Axis_info *__getitem__(unsigned idx)
121 return self->get(idx);
129 Hid_report(l4_umword_t device_id, unsigned rels, unsigned abss, unsigned mscs,
130 unsigned sws, unsigned mts);
134 bool get(unsigned char type, unsigned code, int &val) const;
135 void set(unsigned char type, unsigned code, int val);
137 bool mt_get(unsigned id, unsigned code, int &val) const;
139 void mt_set(unsigned code, int val);
142 Valuator<int> const *get_vals(unsigned char type) const;
143 Valuator<int> *get_vals(unsigned char type);
144 Valuator<int> const *get_mt_vals(unsigned id) const;
146 bool add_key(int code, int value);
147 Key_event const *get_key_event(unsigned idx) const;
148 Key_event const *find_key_event(int code) const;
149 void remove_key_event(int code);
151 void sync(long long time);
152 long long time() const;
154 l4_umword_t device_id() const;
156 Axis_info_vector const *abs_infos() const;
157 Axis_info_vector *abs_infos();
158 void set_abs_info(Axis_info_vector *i);
163 %extend Mag_server::Valuator<int>
165 Mag_server::Value<int> __getitem__(unsigned idx) const
167 return self->get(idx);
171 %extend Mag_server::Hid_report
173 Mag_server::Valuator<int> *__getitem__(unsigned char type)
175 return self->get_vals(type);
180 class Mag_server::User_state
183 void set_pointer(int x, int y, bool hide);
186 class Mag_server::View_proxy
189 View_proxy(Mag_server::User_state *ust);
194 %extend Mag_server::User_state
196 bool set_kbd_focus(Mag_server::View_proxy *vp)
199 return self->set_focus(0);
201 return self->set_focus(vp->view());
204 void post_event(Mag_server::View_proxy *vp, Mag_server::Hid_report *e, bool update,
207 Mag_server::View *v = vp ? vp->view() : self->kbd_focus();
209 self->vstack()->update_all_views();
211 //maybe_screenshot(ust, e);
213 if (v && (!self->vstack()->mode().kill() || v->super_view()))
214 v->handle_event(e, self->mouse_pos(), core_ev);
217 void toggle_mode(Mag_server::Mode::Mode_flag mode)
219 self->vstack()->toggle_mode(mode);
222 void find_pointed_view(Mag_server::View_proxy *vp)
227 vp->view(self->vstack()->find(self->mouse_pos()));
230 %apply int *OUTPUT {int *w, int*h};
231 void screen_size(int *w, int *h)
233 Mag_gfx::Area s = self->vstack()->canvas()->size();
239 %extend Mag_server::View_proxy
241 void set(Mag_server::View_proxy *src)
243 self->view(src ? src->view() : 0);
248 %typemap(in) ORIG_l4_umword_t = l4_umword_t;
249 %typemap(in,checkfn="lua_isuserdata") l4_umword_t id
250 %{ $1 = (l4_umword_t)lua_touserdata(L, $input); %}
252 class Mag_server::Input_source
255 %extend Mag_server::Input_source
259 int get_stream_info(l4_umword_t id, L4Re::Event_stream_info **OUTPUT)
261 *OUTPUT = new L4Re::Event_stream_info;
262 return self->get_stream_info(id, *OUTPUT);
265 int get_abs_info(l4_umword_t id, unsigned axis, Mag_server::Axis_info **OUTPUT)
270 L4Re::Event_absinfo info[1];
271 int res = self->get_axis_info(id, 1, axes, info);
275 Mag_server::Axis_info *i = new Mag_server::Axis_info();
278 i->value = info->value;
281 i->fuzz = info->fuzz;
282 i->flat = info->flat;
283 i->resolution = info->resolution;
284 i->delta = info->max - info->min;
288 %typemap(in) l4_umword_t id = ORIG_l4_umword_t;
292 %extend L4Re::Event_stream_info
295 void get_device_id(unsigned *bus, unsigned *vendor, unsigned *product, unsigned *version)
297 *bus = self->id.bustype;
298 *vendor = self->id.vendor;
299 *product = self->id.product;
300 *version = self->id.version;
305 static Mag_server::User_state *get_user_state()
307 return Mag_server::user_state;