1 #ifdef HAVE_CONFIG_H
2 # include "elementary_config.h"
3 #endif
4
5 #define EFL_UI_FOCUS_OBJECT_PROTECTED
6
7 #include <Elementary.h>
8 #include "elm_priv.h"
9
10 #define MY_CLASS EFL_UI_FOCUS_OBJECT_MIXIN
11
12 typedef struct {
13 Eina_Bool old_focus;
14 Eina_Bool ongoing_prepare_call;
15 Eina_Bool child_focus;
16 Eina_Bool focus_geom_changed;
17 } Efl_Ui_Focus_Object_Data;
18
19 EOLIAN static void
_efl_ui_focus_object_focus_set(Eo * obj,Efl_Ui_Focus_Object_Data * pd,Eina_Bool focus)20 _efl_ui_focus_object_focus_set(Eo *obj, Efl_Ui_Focus_Object_Data *pd, Eina_Bool focus)
21 {
22 Efl_Ui_Focus_Object *parent;
23
24 if (pd->old_focus == focus) return;
25
26 pd->old_focus = focus;
27 parent = efl_ui_focus_object_focus_parent_get(obj);
28 if (parent)
29 efl_ui_focus_object_child_focus_set(parent, focus);
30 efl_event_callback_call(obj, EFL_UI_FOCUS_OBJECT_EVENT_FOCUS_CHANGED , &focus);
31 }
32
33 EOLIAN static Eina_Bool
_efl_ui_focus_object_focus_get(const Eo * obj EINA_UNUSED,Efl_Ui_Focus_Object_Data * pd)34 _efl_ui_focus_object_focus_get(const Eo *obj EINA_UNUSED, Efl_Ui_Focus_Object_Data *pd)
35 {
36 return pd->old_focus;
37 }
38
39 EOLIAN static void
_efl_ui_focus_object_setup_order(Eo * obj,Efl_Ui_Focus_Object_Data * pd)40 _efl_ui_focus_object_setup_order(Eo *obj, Efl_Ui_Focus_Object_Data *pd)
41 {
42 if (pd->ongoing_prepare_call) return;
43
44 pd->ongoing_prepare_call = EINA_TRUE;
45
46 efl_ui_focus_object_setup_order_non_recursive(obj);
47
48 pd->ongoing_prepare_call = EINA_FALSE;
49 }
50
51 EOLIAN static void
_efl_ui_focus_object_child_focus_set(Eo * obj,Efl_Ui_Focus_Object_Data * pd,Eina_Bool child_focus)52 _efl_ui_focus_object_child_focus_set(Eo *obj, Efl_Ui_Focus_Object_Data *pd, Eina_Bool child_focus)
53 {
54 Efl_Ui_Focus_Object *parent;
55
56 if (child_focus == pd->child_focus) return;
57
58 pd->child_focus = child_focus;
59 parent = efl_ui_focus_object_focus_parent_get(obj);
60 if (parent)
61 efl_ui_focus_object_child_focus_set(parent, pd->child_focus);
62 }
63
64 EOLIAN static Eina_Bool
_efl_ui_focus_object_child_focus_get(const Eo * obj EINA_UNUSED,Efl_Ui_Focus_Object_Data * pd)65 _efl_ui_focus_object_child_focus_get(const Eo *obj EINA_UNUSED, Efl_Ui_Focus_Object_Data *pd)
66 {
67 return pd->child_focus;
68 }
69
70
71 EOLIAN static Eina_Bool
_efl_ui_focus_object_efl_object_event_callback_priority_add(Eo * obj,Efl_Ui_Focus_Object_Data * pd,const Efl_Event_Description * desc,Efl_Callback_Priority priority,Efl_Event_Cb func,const void * user_data)72 _efl_ui_focus_object_efl_object_event_callback_priority_add(Eo *obj, Efl_Ui_Focus_Object_Data *pd,
73 const Efl_Event_Description *desc,
74 Efl_Callback_Priority priority,
75 Efl_Event_Cb func,
76 const void *user_data)
77 {
78 if (desc == EFL_UI_FOCUS_OBJECT_EVENT_FOCUS_GEOMETRY_CHANGED)
79 {
80 pd->focus_geom_changed = EINA_TRUE;
81 }
82
83 return efl_event_callback_priority_add(efl_super(obj, MY_CLASS), desc, priority, func, user_data);
84 }
85
86 EOLIAN static Eina_Bool
_efl_ui_focus_object_efl_object_event_callback_array_priority_add(Eo * obj,Efl_Ui_Focus_Object_Data * pd,const Efl_Callback_Array_Item * array,Efl_Callback_Priority priority,const void * user_data)87 _efl_ui_focus_object_efl_object_event_callback_array_priority_add(Eo *obj, Efl_Ui_Focus_Object_Data *pd,
88 const Efl_Callback_Array_Item *array,
89 Efl_Callback_Priority priority,
90 const void *user_data)
91 {
92 for (int i = 0; array[i].desc; ++i)
93 {
94 if (array[i].desc == EFL_UI_FOCUS_OBJECT_EVENT_FOCUS_GEOMETRY_CHANGED)
95 {
96 pd->focus_geom_changed = EINA_TRUE;
97 }
98 }
99 return efl_event_callback_array_priority_add(efl_super(obj, MY_CLASS), array, priority, user_data);
100 }
101
102
103 EOLIAN static Eina_Bool
_efl_ui_focus_object_efl_object_event_callback_call(Eo * obj,Efl_Ui_Focus_Object_Data * pd,const Efl_Event_Description * desc,void * event_info)104 _efl_ui_focus_object_efl_object_event_callback_call(Eo *obj, Efl_Ui_Focus_Object_Data *pd,
105 const Efl_Event_Description *desc,
106 void *event_info)
107 {
108 if (desc == EFL_UI_FOCUS_OBJECT_EVENT_FOCUS_GEOMETRY_CHANGED && !pd->focus_geom_changed)
109 return EINA_TRUE;
110 return efl_event_callback_call(efl_super(obj, MY_CLASS), desc, event_info);
111 }
112
113 #define EFL_UI_FOCUS_OBJECT_EXTRA_OPS \
114 EFL_OBJECT_OP_FUNC(efl_event_callback_priority_add, _efl_ui_focus_object_efl_object_event_callback_priority_add), \
115 EFL_OBJECT_OP_FUNC(efl_event_callback_array_priority_add, _efl_ui_focus_object_efl_object_event_callback_array_priority_add), \
116 EFL_OBJECT_OP_FUNC(efl_event_callback_call, _efl_ui_focus_object_efl_object_event_callback_call) \
117
118 #include "efl_ui_focus_object.eo.c"
119