summaryrefslogtreecommitdiff
path: root/src/lib/evas/canvas/efl_input_focus.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/evas/canvas/efl_input_focus.c')
-rw-r--r--src/lib/evas/canvas/efl_input_focus.c161
1 files changed, 161 insertions, 0 deletions
diff --git a/src/lib/evas/canvas/efl_input_focus.c b/src/lib/evas/canvas/efl_input_focus.c
new file mode 100644
index 0000000000..0bf4912364
--- /dev/null
+++ b/src/lib/evas/canvas/efl_input_focus.c
@@ -0,0 +1,161 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#define EFL_INPUT_EVENT_PROTECTED
+
+#include <Evas.h>
+
+#define EFL_INTERNAL_UNSTABLE
+#include "interfaces/efl_common_internal.h"
+
+#define MY_CLASS EFL_INPUT_FOCUS_CLASS
+
+static Efl_Input_Focus *s_cached_event = NULL;
+
+static void
+_del_hook(Eo *evt)
+{
+ if (!s_cached_event)
+ {
+ if (efl_parent_get(evt))
+ {
+ efl_ref(evt);
+ efl_parent_set(evt, NULL);
+ }
+ efl_reuse(evt);
+ s_cached_event = evt;
+ }
+ else
+ {
+ efl_del_intercept_set(evt, NULL);
+ efl_del(evt);
+ }
+}
+
+static void
+_efl_input_focus_free(Efl_Input_Focus_Data *pd)
+{
+ efl_unref(pd->device);
+}
+
+EOLIAN static Efl_Object *
+_efl_input_focus_efl_object_constructor(Eo *obj,
+ Efl_Input_Focus_Data *pd EINA_UNUSED)
+{
+ obj = efl_constructor(efl_super(obj, MY_CLASS));
+ return obj;
+}
+
+EOLIAN static void
+_efl_input_focus_efl_object_destructor(Eo *obj,
+ Efl_Input_Focus_Data *pd)
+{
+ _efl_input_focus_free(pd);
+ efl_destructor(efl_super(obj, MY_CLASS));
+}
+
+EOLIAN static void
+_efl_input_focus_class_destructor(Efl_Class *klass EINA_UNUSED)
+{
+ // this is a strange situation...
+ efl_del_intercept_set(s_cached_event, NULL);
+ efl_del(s_cached_event);
+ s_cached_event = NULL;
+}
+
+EOLIAN static void
+_efl_input_focus_object_set(Eo *obj EINA_UNUSED, Efl_Input_Focus_Data *pd,
+ Efl_Object *object)
+{
+ pd->object = object;
+}
+
+EOLIAN static Efl_Object *
+_efl_input_focus_object_get(Eo *obj EINA_UNUSED, Efl_Input_Focus_Data *pd)
+{
+ return pd->object;
+}
+
+EOLIAN static void
+_efl_input_focus_efl_input_event_device_set(Eo *obj EINA_UNUSED,
+ Efl_Input_Focus_Data *pd,
+ Efl_Input_Device *device)
+{
+ pd->device = efl_ref(device);
+}
+
+EOLIAN static Efl_Input_Device *
+_efl_input_focus_efl_input_event_device_get(Eo *obj EINA_UNUSED,
+ Efl_Input_Focus_Data *pd)
+{
+ return pd->device;
+}
+
+EOLIAN static void
+_efl_input_focus_efl_input_event_timestamp_set(Eo *obj EINA_UNUSED,
+ Efl_Input_Focus_Data *pd,
+ double ms)
+{
+ pd->timestamp = ms;
+}
+
+EOLIAN static double
+_efl_input_focus_efl_input_event_timestamp_get(Eo *obj EINA_UNUSED,
+ Efl_Input_Focus_Data *pd)
+{
+ return pd->timestamp;
+}
+
+EOLIAN static Efl_Input_Focus *
+_efl_input_focus_efl_input_event_dup(Eo *obj EINA_UNUSED,
+ Efl_Input_Focus_Data *pd)
+{
+ Efl_Input_Focus_Data *ev;
+ Efl_Input_Focus *evt;
+
+ // no parent
+ evt = efl_input_instance_get(MY_CLASS, NULL, (void **) &ev);
+ if (!evt || !ev) return NULL;
+
+ ev->eo = evt;
+ ev->object = pd->object;
+ ev->device = efl_ref(pd->device);
+ ev->timestamp = pd->timestamp;
+ return evt;
+}
+
+EOLIAN static Efl_Input_Focus *
+_efl_input_focus_efl_input_event_instance_get(Eo *klass EINA_UNUSED, void *_pd EINA_UNUSED,
+ Eo *owner, void **priv)
+{
+ Efl_Input_Focus_Data *ev;
+ Efl_Input_Focus *evt;
+
+ if (s_cached_event)
+ {
+ evt = s_cached_event;
+ s_cached_event = NULL;
+ efl_input_reset(evt);
+ efl_parent_set(evt, owner);
+ }
+ else
+ {
+ evt = efl_add(MY_CLASS, owner);
+ efl_del_intercept_set(evt, _del_hook);
+ }
+
+ ev = efl_data_scope_get(evt, MY_CLASS);
+ if (priv) *priv = ev;
+ return evt;
+}
+
+EOLIAN static void
+_efl_input_focus_efl_input_event_reset(Eo *obj, Efl_Input_Focus_Data *pd)
+{
+ _efl_input_focus_free(pd);
+ memset(pd, 0, sizeof(Efl_Input_Focus_Data));
+ pd->eo = obj;
+}
+
+#include "efl_input_focus.eo.c"