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