1 #ifdef HAVE_CONFIG_H
2 # include <config.h>
3 #endif
4 
5 #define EFL_INPUT_EVENT_PROTECTED
6 
7 #include "evas_common_private.h"
8 #include "evas_private.h"
9 
10 #define MY_CLASS EFL_INPUT_KEY_CLASS
11 
12 EOAPI Eo*
efl_input_key_instance_get(Efl_Object * owner,void ** priv)13 efl_input_key_instance_get(Efl_Object *owner, void **priv)
14 {
15    Efl_Input_Key_Data *ev;
16    Efl_Input_Key *evt;
17    Evas *evas;
18 
19    evt = efl_input_event_instance_get(EFL_INPUT_KEY_CLASS, owner);
20    if (!evt) return NULL;
21 
22    ev = efl_data_scope_get(evt, EFL_INPUT_KEY_CLASS);
23    ev->fake = EINA_FALSE;
24    if (priv) *priv = ev;
25 
26    evas = efl_provider_find(owner, EVAS_CANVAS_CLASS);
27    if (evas)
28      {
29         Evas_Public_Data *e = efl_data_scope_get(evas, EVAS_CANVAS_CLASS);
30         ev->modifiers = &e->modifiers;
31         ev->locks = &e->locks;
32      }
33 
34    return evt;
35 }
36 
37 EOLIAN static void
_efl_input_key_class_destructor(Efl_Class * klass)38 _efl_input_key_class_destructor(Efl_Class *klass)
39 {
40    efl_input_event_instance_clean(klass);
41 }
42 
43 EOLIAN static Efl_Object *
_efl_input_key_efl_object_constructor(Eo * obj,Efl_Input_Key_Data * pd EINA_UNUSED)44 _efl_input_key_efl_object_constructor(Eo *obj, Efl_Input_Key_Data *pd EINA_UNUSED)
45 {
46    obj = efl_constructor(efl_super(obj, MY_CLASS));
47    efl_input_reset(obj);
48    return obj;
49 }
50 
51 static inline void
_efl_input_key_free(Efl_Input_Key_Data * pd)52 _efl_input_key_free(Efl_Input_Key_Data *pd)
53 {
54    free(pd->legacy);
55    efl_unref(pd->device);
56    if (pd->no_stringshare) return;
57    eina_stringshare_del(pd->key);
58    eina_stringshare_del(pd->keyname);
59    eina_stringshare_del(pd->string);
60    eina_stringshare_del(pd->compose);
61 }
62 
63 EOLIAN static void
_efl_input_key_efl_object_destructor(Eo * obj,Efl_Input_Key_Data * pd)64 _efl_input_key_efl_object_destructor(Eo *obj, Efl_Input_Key_Data *pd)
65 {
66    _efl_input_key_free(pd);
67    efl_destructor(efl_super(obj, MY_CLASS));
68 }
69 
70 EOLIAN static void
_efl_input_key_pressed_set(Eo * obj EINA_UNUSED,Efl_Input_Key_Data * pd,Eina_Bool val)71 _efl_input_key_pressed_set(Eo *obj EINA_UNUSED, Efl_Input_Key_Data *pd, Eina_Bool val)
72 {
73    pd->pressed = !!val;
74 }
75 
76 EOLIAN static Eina_Bool
_efl_input_key_pressed_get(const Eo * obj EINA_UNUSED,Efl_Input_Key_Data * pd)77 _efl_input_key_pressed_get(const Eo *obj EINA_UNUSED, Efl_Input_Key_Data *pd)
78 {
79    return pd->pressed;
80 }
81 
82 EOLIAN static void
_efl_input_key_key_name_set(Eo * obj EINA_UNUSED,Efl_Input_Key_Data * pd,const char * val)83 _efl_input_key_key_name_set(Eo *obj EINA_UNUSED, Efl_Input_Key_Data *pd, const char *val)
84 {
85    eina_stringshare_replace(&pd->keyname, val);
86 }
87 
88 EOLIAN static const char *
_efl_input_key_key_name_get(const Eo * obj EINA_UNUSED,Efl_Input_Key_Data * pd)89 _efl_input_key_key_name_get(const Eo *obj EINA_UNUSED, Efl_Input_Key_Data *pd)
90 {
91    return pd->keyname;
92 }
93 
94 EOLIAN static void
_efl_input_key_key_sym_set(Eo * obj EINA_UNUSED,Efl_Input_Key_Data * pd,const char * val)95 _efl_input_key_key_sym_set(Eo *obj EINA_UNUSED, Efl_Input_Key_Data *pd, const char *val)
96 {
97    eina_stringshare_replace(&pd->key, val);
98 }
99 
100 EOLIAN static const char *
_efl_input_key_key_sym_get(const Eo * obj EINA_UNUSED,Efl_Input_Key_Data * pd)101 _efl_input_key_key_sym_get(const Eo *obj EINA_UNUSED, Efl_Input_Key_Data *pd)
102 {
103    return pd->key;
104 }
105 
106 EOLIAN static void
_efl_input_key_string_set(Eo * obj EINA_UNUSED,Efl_Input_Key_Data * pd,const char * val)107 _efl_input_key_string_set(Eo *obj EINA_UNUSED, Efl_Input_Key_Data *pd, const char *val)
108 {
109    eina_stringshare_replace(&pd->string, val);
110 }
111 
112 EOLIAN static const char *
_efl_input_key_string_get(const Eo * obj EINA_UNUSED,Efl_Input_Key_Data * pd)113 _efl_input_key_string_get(const Eo *obj EINA_UNUSED, Efl_Input_Key_Data *pd)
114 {
115    return pd->string;
116 }
117 
118 EOLIAN static void
_efl_input_key_compose_string_set(Eo * obj EINA_UNUSED,Efl_Input_Key_Data * pd,const char * val)119 _efl_input_key_compose_string_set(Eo *obj EINA_UNUSED, Efl_Input_Key_Data *pd, const char *val)
120 {
121    eina_stringshare_replace(&pd->compose, val);
122 }
123 
124 EOLIAN static const char *
_efl_input_key_compose_string_get(const Eo * obj EINA_UNUSED,Efl_Input_Key_Data * pd)125 _efl_input_key_compose_string_get(const Eo *obj EINA_UNUSED, Efl_Input_Key_Data *pd)
126 {
127    return pd->compose;
128 }
129 
130 EOLIAN static void
_efl_input_key_key_code_set(Eo * obj EINA_UNUSED,Efl_Input_Key_Data * pd,int val)131 _efl_input_key_key_code_set(Eo *obj EINA_UNUSED, Efl_Input_Key_Data *pd, int val)
132 {
133    pd->keycode = val;
134 }
135 
136 EOLIAN static int
_efl_input_key_key_code_get(const Eo * obj EINA_UNUSED,Efl_Input_Key_Data * pd)137 _efl_input_key_key_code_get(const Eo *obj EINA_UNUSED, Efl_Input_Key_Data *pd)
138 {
139    return pd->keycode;
140 }
141 
142 EOLIAN static void
_efl_input_key_efl_input_event_reset(Eo * obj EINA_UNUSED,Efl_Input_Key_Data * pd)143 _efl_input_key_efl_input_event_reset(Eo *obj EINA_UNUSED, Efl_Input_Key_Data *pd)
144 {
145    _efl_input_key_free(pd);
146    memset(pd, 0, sizeof(*pd));
147    pd->eo = obj;
148    pd->fake = EINA_TRUE;
149 }
150 
151 EOLIAN static Efl_Input_Event *
_efl_input_key_efl_duplicate_duplicate(const Eo * obj,Efl_Input_Key_Data * pd)152 _efl_input_key_efl_duplicate_duplicate(const Eo *obj, Efl_Input_Key_Data *pd)
153 {
154    Efl_Input_Key_Data *ev;
155    Efl_Input_Key *evt;
156 
157    evt = efl_add(MY_CLASS, efl_parent_get(obj),
158                  efl_allow_parent_unref_set(efl_added, EINA_TRUE));
159    ev = efl_data_scope_get(evt, MY_CLASS);
160    if (!ev) return NULL;
161 
162    memcpy(ev, pd, sizeof(*ev));
163    ev->eo        = evt;
164    ev->legacy    = NULL;
165    ev->key       = eina_stringshare_add(pd->key);
166    ev->keyname   = eina_stringshare_add(pd->keyname);
167    ev->string    = eina_stringshare_add(pd->string);
168    ev->compose   = eina_stringshare_add(pd->compose);
169    ev->evas_done = 0;
170    ev->win_fed   = 0;
171    ev->fake      = 1;
172    ev->legacy    = NULL;
173    ev->device    = efl_ref(pd->device);
174 
175    return evt;
176 }
177 
178 EOLIAN static void
_efl_input_key_efl_input_event_timestamp_set(Eo * obj EINA_UNUSED,Efl_Input_Key_Data * pd,double ms)179 _efl_input_key_efl_input_event_timestamp_set(Eo *obj EINA_UNUSED, Efl_Input_Key_Data *pd, double ms)
180 {
181    pd->timestamp = ms;
182 }
183 
184 EOLIAN static double
_efl_input_key_efl_input_event_timestamp_get(const Eo * obj EINA_UNUSED,Efl_Input_Key_Data * pd)185 _efl_input_key_efl_input_event_timestamp_get(const Eo *obj EINA_UNUSED, Efl_Input_Key_Data *pd)
186 {
187    return pd->timestamp;
188 }
189 
190 EOLIAN static void
_efl_input_key_efl_input_event_event_flags_set(Eo * obj EINA_UNUSED,Efl_Input_Key_Data * pd,Efl_Input_Flags flags)191 _efl_input_key_efl_input_event_event_flags_set(Eo *obj EINA_UNUSED, Efl_Input_Key_Data *pd, Efl_Input_Flags flags)
192 {
193    pd->event_flags = flags;
194 }
195 
196 EOLIAN static Efl_Input_Flags
_efl_input_key_efl_input_event_event_flags_get(const Eo * obj EINA_UNUSED,Efl_Input_Key_Data * pd)197 _efl_input_key_efl_input_event_event_flags_get(const Eo *obj EINA_UNUSED, Efl_Input_Key_Data *pd)
198 {
199    return pd->event_flags;
200 }
201 
202 EOLIAN static void
_efl_input_key_efl_input_event_device_set(Eo * obj EINA_UNUSED,Efl_Input_Key_Data * pd,Efl_Input_Device * dev)203 _efl_input_key_efl_input_event_device_set(Eo *obj EINA_UNUSED, Efl_Input_Key_Data *pd, Efl_Input_Device *dev)
204 {
205    efl_replace(&pd->device, dev);
206 }
207 
208 EOLIAN static Efl_Input_Device *
_efl_input_key_efl_input_event_device_get(const Eo * obj EINA_UNUSED,Efl_Input_Key_Data * pd)209 _efl_input_key_efl_input_event_device_get(const Eo *obj EINA_UNUSED, Efl_Input_Key_Data *pd)
210 {
211    return pd->device;
212 }
213 
214 EOLIAN static Eina_Bool
_efl_input_key_efl_input_state_modifier_enabled_get(const Eo * obj EINA_UNUSED,Efl_Input_Key_Data * pd,Efl_Input_Modifier mod,const Efl_Input_Device * seat)215 _efl_input_key_efl_input_state_modifier_enabled_get(const Eo *obj EINA_UNUSED, Efl_Input_Key_Data *pd,
216                                                     Efl_Input_Modifier mod, const Efl_Input_Device *seat)
217 {
218    const char *name;
219 
220    if (!pd->modifiers) return EINA_FALSE;
221    if (!seat)
222      {
223         seat = efl_input_device_seat_get(pd->device);
224         if (!seat) return EINA_FALSE;
225      }
226    name = _efl_input_modifier_to_string(mod);
227    if (!name) return EINA_FALSE;
228    return evas_seat_key_modifier_is_set(pd->modifiers, name, seat);
229 }
230 
231 EOLIAN static Eina_Bool
_efl_input_key_efl_input_state_lock_enabled_get(const Eo * obj EINA_UNUSED,Efl_Input_Key_Data * pd,Efl_Input_Lock lock,const Efl_Input_Device * seat)232 _efl_input_key_efl_input_state_lock_enabled_get(const Eo *obj EINA_UNUSED, Efl_Input_Key_Data *pd,
233                                                 Efl_Input_Lock lock, const Efl_Input_Device *seat)
234 {
235    const char *name;
236 
237    if (!pd->locks) return EINA_FALSE;
238    if (!seat)
239      {
240         seat = efl_input_device_seat_get(pd->device);
241         if (!seat) return EINA_FALSE;
242      }
243    name = _efl_input_lock_to_string(lock);
244    if (!name) return EINA_FALSE;
245    return evas_seat_key_lock_is_set(pd->locks, name, seat);
246 }
247 
248 EOLIAN static Eina_Bool
_efl_input_key_efl_input_event_fake_get(const Eo * obj EINA_UNUSED,Efl_Input_Key_Data * pd)249 _efl_input_key_efl_input_event_fake_get(const Eo *obj EINA_UNUSED, Efl_Input_Key_Data *pd)
250 {
251    return pd->fake;
252 }
253 
254 EOLIAN static void *
_efl_input_key_efl_input_event_legacy_info_get(Eo * obj,Efl_Input_Key_Data * pd)255 _efl_input_key_efl_input_event_legacy_info_get(Eo *obj, Efl_Input_Key_Data *pd)
256 {
257    if (pd->legacy) return pd->legacy;
258    return efl_input_key_legacy_info_fill(obj, NULL);
259 }
260 
261 /* Internal EO APIs */
262 
263 #define EFL_INPUT_KEY_EXTRA_OPS \
264    EFL_OBJECT_OP_FUNC(efl_input_legacy_info_get, _efl_input_key_efl_input_event_legacy_info_get)
265 
266 #include "efl_input_key.eo.c"
267