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