ecore: Fix support for intl keyboards
[framework/uifw/ecore.git] / src / lib / ecore_imf_evas / ecore_imf_evas.c
1 #ifdef HAVE_CONFIG_H
2 # include <config.h>
3 #endif
4
5 #include "Ecore_IMF_Evas.h"
6
7 /**
8  * @defgroup Ecore_IMF_Evas_Group Ecore Input Method Context Evas Helper Functions
9  *
10  * Helper functions to make it easy to use Evas with Ecore_IMF.
11  * Converts each event from Evas to the corresponding event of Ecore_IMF.
12  *
13  * An example of usage of these functions can be found at:
14  * @li @ref ecore_imf_example_c
15  */
16
17 static const char *_ecore_imf_evas_event_empty = "";
18
19 /* Converts the Evas modifiers to Ecore_IMF keyboard modifiers */
20 static void
21 _ecore_imf_evas_event_modifiers_wrap(Evas_Modifier *evas_modifiers,
22                                      Ecore_IMF_Keyboard_Modifiers *imf_keyboard_modifiers)
23 {
24    if (!evas_modifiers || !imf_keyboard_modifiers)
25      return;
26
27    *imf_keyboard_modifiers = ECORE_IMF_KEYBOARD_MODIFIER_NONE;
28    if (evas_key_modifier_is_set(evas_modifiers, "Control"))
29      *imf_keyboard_modifiers |= ECORE_IMF_KEYBOARD_MODIFIER_CTRL;
30    if (evas_key_modifier_is_set(evas_modifiers, "Alt"))
31      *imf_keyboard_modifiers |= ECORE_IMF_KEYBOARD_MODIFIER_ALT;
32    if (evas_key_modifier_is_set(evas_modifiers, "Shift"))
33      *imf_keyboard_modifiers |= ECORE_IMF_KEYBOARD_MODIFIER_SHIFT;
34    if (evas_key_modifier_is_set(evas_modifiers, "Super") || evas_key_modifier_is_set(evas_modifiers, "Hyper"))
35      *imf_keyboard_modifiers |= ECORE_IMF_KEYBOARD_MODIFIER_WIN;
36    if (evas_key_modifier_is_set(evas_modifiers, "Mode"))
37      *imf_keyboard_modifiers |= ECORE_IMF_KEYBOARD_MODIFIER_MODE;
38 }
39
40 /* Converts the Evas locks to Ecore_IMF keyboard locks */
41 static void
42 _ecore_imf_evas_event_locks_wrap(Evas_Lock *evas_locks,
43                                  Ecore_IMF_Keyboard_Locks *imf_keyboard_locks)
44 {
45    if (!evas_locks || !imf_keyboard_locks)
46      return;
47
48    *imf_keyboard_locks = ECORE_IMF_KEYBOARD_LOCK_NONE;
49    if (evas_key_lock_is_set(evas_locks, "Num_Lock"))
50      *imf_keyboard_locks |= ECORE_IMF_KEYBOARD_LOCK_NUM;
51    if (evas_key_lock_is_set(evas_locks, "Caps_Lock"))
52      *imf_keyboard_locks |= ECORE_IMF_KEYBOARD_LOCK_CAPS;
53    if (evas_key_lock_is_set(evas_locks, "Scroll_Lock"))
54      *imf_keyboard_locks |= ECORE_IMF_KEYBOARD_LOCK_SCROLL;
55 }
56
57 /* Converts the Evas mouse flags to Ecore_IMF mouse flags */
58 static void
59 _ecore_imf_evas_event_mouse_flags_wrap(Evas_Button_Flags evas_flags,
60                                        Ecore_IMF_Mouse_Flags *imf_flags)
61 {
62    if (!imf_flags)
63      return;
64
65    *imf_flags = ECORE_IMF_MOUSE_NONE;
66    if (evas_flags & EVAS_BUTTON_DOUBLE_CLICK)
67      *imf_flags |= ECORE_IMF_MOUSE_DOUBLE_CLICK;
68    if (evas_flags & EVAS_BUTTON_TRIPLE_CLICK)
69      *imf_flags |= ECORE_IMF_MOUSE_TRIPLE_CLICK;
70 }
71
72 /**
73  * Converts a "mouse_in" event from Evas to the corresponding event of Ecore_IMF.
74  *
75  * @param evas_event The received Evas event.
76  * @param imf_event The location to store the converted Ecore_IMF event.
77  * @ingroup Ecore_IMF_Evas_Group
78  */
79 EAPI void
80 ecore_imf_evas_event_mouse_in_wrap(Evas_Event_Mouse_In *evas_event,
81                                    Ecore_IMF_Event_Mouse_In *imf_event)
82 {
83    if (!evas_event || !imf_event)
84      return;
85
86    imf_event->buttons = evas_event->buttons;
87    imf_event->output.x = evas_event->output.x;
88    imf_event->output.y = evas_event->output.y;
89    imf_event->canvas.x = evas_event->canvas.x;
90    imf_event->canvas.y = evas_event->canvas.y;
91    imf_event->timestamp = evas_event->timestamp;
92    _ecore_imf_evas_event_modifiers_wrap(evas_event->modifiers, &imf_event->modifiers);
93    _ecore_imf_evas_event_locks_wrap(evas_event->locks, &imf_event->locks);
94 }
95
96 /**
97  * Converts a "mouse_out" event from Evas to the corresponding event of Ecore_IMF.
98  *
99  * @param evas_event The received Evas event.
100  * @param imf_event The location to store the converted Ecore_IMF event.
101  * @ingroup Ecore_IMF_Evas_Group
102  */
103 EAPI void
104 ecore_imf_evas_event_mouse_out_wrap(Evas_Event_Mouse_Out *evas_event,
105                                     Ecore_IMF_Event_Mouse_Out *imf_event)
106 {
107    if (!evas_event || !imf_event)
108      return;
109
110    imf_event->buttons = evas_event->buttons;
111    imf_event->output.x = evas_event->output.x;
112    imf_event->output.y = evas_event->output.y;
113    imf_event->canvas.x = evas_event->canvas.x;
114    imf_event->canvas.y = evas_event->canvas.y;
115    imf_event->timestamp = evas_event->timestamp;
116    _ecore_imf_evas_event_modifiers_wrap(evas_event->modifiers, &imf_event->modifiers);
117    _ecore_imf_evas_event_locks_wrap(evas_event->locks, &imf_event->locks);
118 }
119
120 /**
121  * Converts a "mouse_move" event from Evas to the corresponding event of Ecore_IMF.
122  *
123  * @param evas_event The received Evas event.
124  * @param imf_event The location to store the converted Ecore_IMF event.
125  * @ingroup Ecore_IMF_Evas_Group
126  */
127 EAPI void
128 ecore_imf_evas_event_mouse_move_wrap(Evas_Event_Mouse_Move *evas_event,
129                                      Ecore_IMF_Event_Mouse_Move *imf_event)
130 {
131    if (!evas_event || !imf_event)
132      return;
133
134    imf_event->buttons = evas_event->buttons;
135    imf_event->cur.output.x = evas_event->cur.output.x;
136    imf_event->cur.output.y = evas_event->cur.output.y;
137    imf_event->prev.output.x = evas_event->prev.output.x;
138    imf_event->prev.output.y = evas_event->prev.output.y;
139    imf_event->cur.canvas.x = evas_event->cur.canvas.x;
140    imf_event->cur.canvas.y = evas_event->cur.canvas.y;
141    imf_event->prev.canvas.x = evas_event->prev.canvas.x;
142    imf_event->prev.canvas.y = evas_event->prev.canvas.y;
143    imf_event->timestamp = evas_event->timestamp;
144    _ecore_imf_evas_event_modifiers_wrap(evas_event->modifiers, &imf_event->modifiers);
145    _ecore_imf_evas_event_locks_wrap(evas_event->locks, &imf_event->locks);
146 }
147
148 /**
149  * Converts a "mouse_down" event from Evas to the corresponding event of Ecore_IMF.
150  *
151  * @param evas_event The received Evas event.
152  * @param imf_event The location to store the converted Ecore_IMF event.
153  * @ingroup Ecore_IMF_Evas_Group
154  */
155 EAPI void
156 ecore_imf_evas_event_mouse_down_wrap(Evas_Event_Mouse_Down *evas_event,
157                                      Ecore_IMF_Event_Mouse_Down *imf_event)
158 {
159    if (!evas_event || !imf_event)
160       return;
161
162    imf_event->button = evas_event->button;
163    imf_event->output.x = evas_event->output.x;
164    imf_event->output.y = evas_event->output.y;
165    imf_event->canvas.x = evas_event->canvas.x;
166    imf_event->canvas.y = evas_event->canvas.y;
167    imf_event->timestamp = evas_event->timestamp;
168    _ecore_imf_evas_event_modifiers_wrap(evas_event->modifiers, &imf_event->modifiers);
169    _ecore_imf_evas_event_locks_wrap(evas_event->locks, &imf_event->locks);
170    _ecore_imf_evas_event_mouse_flags_wrap(evas_event->flags, &imf_event->flags);
171 }
172
173 /**
174  * Converts a "mouse_up" event from Evas to the corresponding event of Ecore_IMF.
175  *
176  * @param evas_event The received Evas event.
177  * @param imf_event The location to store the converted Ecore_IMF event.
178  * @ingroup Ecore_IMF_Evas_Group
179  */
180 EAPI void
181 ecore_imf_evas_event_mouse_up_wrap(Evas_Event_Mouse_Up *evas_event,
182                                    Ecore_IMF_Event_Mouse_Up *imf_event)
183 {
184    if (!evas_event || !imf_event)
185      return;
186
187    imf_event->button = evas_event->button;
188    imf_event->output.x = evas_event->output.x;
189    imf_event->output.y = evas_event->output.y;
190    imf_event->canvas.x = evas_event->canvas.x;
191    imf_event->canvas.y = evas_event->canvas.y;
192    imf_event->timestamp = evas_event->timestamp;
193    _ecore_imf_evas_event_modifiers_wrap(evas_event->modifiers, &imf_event->modifiers);
194    _ecore_imf_evas_event_locks_wrap(evas_event->locks, &imf_event->locks);
195    _ecore_imf_evas_event_mouse_flags_wrap(evas_event->flags, &imf_event->flags);
196 }
197
198 /**
199  * Converts a "mouse_wheel" event from Evas to the corresponding event of Ecore_IMF.
200  *
201  * @param evas_event The received Evas event.
202  * @param imf_event The location to store the converted Ecore_IMF event.
203  * @ingroup Ecore_IMF_Evas_Group
204  */
205 EAPI void
206 ecore_imf_evas_event_mouse_wheel_wrap(Evas_Event_Mouse_Wheel *evas_event,
207                                       Ecore_IMF_Event_Mouse_Wheel *imf_event)
208 {
209    if (!evas_event || !imf_event)
210      return;
211
212    imf_event->direction = evas_event->direction;
213    imf_event->z = evas_event->z;
214    imf_event->output.x = evas_event->output.x;
215    imf_event->output.y = evas_event->output.y;
216    imf_event->canvas.x = evas_event->canvas.x;
217    imf_event->canvas.y = evas_event->canvas.y;
218    imf_event->timestamp = evas_event->timestamp;
219    _ecore_imf_evas_event_modifiers_wrap(evas_event->modifiers, &imf_event->modifiers);
220    _ecore_imf_evas_event_locks_wrap(evas_event->locks, &imf_event->locks);
221    imf_event->timestamp = evas_event->timestamp;
222 }
223
224 /**
225  * Converts a "key_down" event from Evas to the corresponding event of Ecore_IMF.
226  *
227  * @param evas_event The received Evas event.
228  * @param imf_event The location to store the converted Ecore_IMF event.
229  * @ingroup Ecore_IMF_Evas_Group
230  *
231  * Example
232  * @code
233  * static void
234  * _key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
235  * {
236  *    Evas_Event_Key_Down *ev = event_info;
237  *    if (!ev->keyname) return;
238  *
239  *    if (imf_context)
240  *      {
241  *         Ecore_IMF_Event_Key_Down ecore_ev;
242  *         ecore_imf_evas_event_key_down_wrap(ev, &ecore_ev);
243  *         if (ecore_imf_context_filter_event(imf_context,
244  *                                            ECORE_IMF_EVENT_KEY_DOWN,
245  *                                            (Ecore_IMF_Event *)&ecore_ev))
246  *           return;
247  *      }
248  * }
249  *
250  * evas_object_event_callback_add(obj, EVAS_CALLBACK_KEY_DOWN, _key_down_cb, data);
251  * @endcode
252  */
253 EAPI void
254 ecore_imf_evas_event_key_down_wrap(Evas_Event_Key_Down *evas_event,
255                                    Ecore_IMF_Event_Key_Down *imf_event)
256 {
257    if (!evas_event || !imf_event)
258      return;
259
260    imf_event->keyname = evas_event->keyname ? evas_event->keyname : _ecore_imf_evas_event_empty;
261    imf_event->key = evas_event->key ? evas_event->key : _ecore_imf_evas_event_empty;
262    imf_event->string = evas_event->string ? evas_event->string : _ecore_imf_evas_event_empty;
263    imf_event->compose = evas_event->compose ? evas_event->compose : _ecore_imf_evas_event_empty;
264    imf_event->timestamp = evas_event->timestamp;
265    _ecore_imf_evas_event_modifiers_wrap(evas_event->modifiers, &imf_event->modifiers);
266    _ecore_imf_evas_event_locks_wrap(evas_event->locks, &imf_event->locks);
267 }
268
269 /**
270  * Converts a "key_up" event from Evas to the corresponding event of Ecore_IMF.
271  *
272  * @param evas_event The received Evas event.
273  * @param imf_event The location to store the converted Ecore_IMF event.
274  * @ingroup Ecore_IMF_Evas_Group
275  *
276  * Example
277  * @code
278  * static void
279  * _key_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
280  * {
281  *    Evas_Event_Key_Up *ev = event_info;
282  *    if (!ev->keyname) return;
283  *
284  *    if (imf_context)
285  *      {
286  *         Ecore_IMF_Event_Key_Up ecore_ev;
287  *         ecore_imf_evas_event_key_up_wrap(ev, &ecore_ev);
288  *         if (ecore_imf_context_filter_event(imf_context,
289  *                                            ECORE_IMF_EVENT_KEY_UP,
290  *                                            (Ecore_IMF_Event *)&ecore_ev))
291  *           return;
292  *      }
293  * }
294  *
295  * evas_object_event_callback_add(obj, EVAS_CALLBACK_KEY_UP, _key_up_cb, data);
296  * @endcode
297  */
298 EAPI void
299 ecore_imf_evas_event_key_up_wrap(Evas_Event_Key_Up *evas_event,
300                                  Ecore_IMF_Event_Key_Up *imf_event)
301 {
302    imf_event->keyname = evas_event->keyname ? evas_event->keyname : _ecore_imf_evas_event_empty;
303    imf_event->key = evas_event->key ? evas_event->key : _ecore_imf_evas_event_empty;
304    imf_event->string = evas_event->string ? evas_event->string : _ecore_imf_evas_event_empty;
305    imf_event->compose = evas_event->compose ? evas_event->compose : _ecore_imf_evas_event_empty;
306    imf_event->timestamp = evas_event->timestamp;
307    _ecore_imf_evas_event_modifiers_wrap(evas_event->modifiers, &imf_event->modifiers);
308    _ecore_imf_evas_event_locks_wrap(evas_event->locks, &imf_event->locks);
309 }