forked from enlightenment/efl
efl_ui_focus_manager: ensure the manager is in focus when focus is set
this makes handling of focus easier in elementary
This commit is contained in:
parent
07cb2d2dcd
commit
df81e2f492
|
@ -77,6 +77,13 @@ typedef struct {
|
||||||
Node *root;
|
Node *root;
|
||||||
} Efl_Ui_Focus_Manager_Calc_Data;
|
} Efl_Ui_Focus_Manager_Calc_Data;
|
||||||
|
|
||||||
|
static void
|
||||||
|
_manager_in_chain_set(Efl_Ui_Focus_Manager_Calc_Data *pd)
|
||||||
|
{
|
||||||
|
EINA_SAFETY_ON_NULL_RETURN(pd->root);
|
||||||
|
efl_ui_focus_manager_focus_set(efl_ui_focus_user_manager_get(pd->root->focusable), pd->root->focusable);
|
||||||
|
}
|
||||||
|
|
||||||
static Efl_Ui_Focus_Direction
|
static Efl_Ui_Focus_Direction
|
||||||
_complement(Efl_Ui_Focus_Direction dir)
|
_complement(Efl_Ui_Focus_Direction dir)
|
||||||
{
|
{
|
||||||
|
@ -1346,6 +1353,9 @@ _efl_ui_focus_manager_calc_efl_ui_focus_manager_focus_set(Eo *obj, Efl_Ui_Focus_
|
||||||
|
|
||||||
F_DBG("Manager: %p focusing object %p %s", obj, node->focusable, efl_class_name_get(node->focusable));
|
F_DBG("Manager: %p focusing object %p %s", obj, node->focusable, efl_class_name_get(node->focusable));
|
||||||
|
|
||||||
|
//make sure this manager is in the chain of redirects
|
||||||
|
_manager_in_chain_set(pd);
|
||||||
|
|
||||||
if (eina_list_last_data_get(pd->focus_stack) == node)
|
if (eina_list_last_data_get(pd->focus_stack) == node)
|
||||||
{
|
{
|
||||||
//the correct one is focused
|
//the correct one is focused
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
# include "elementary_config.h"
|
# include "elementary_config.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define EFL_UI_FOCUS_OBJECT_PROTECTED
|
||||||
|
|
||||||
#include <Elementary.h>
|
#include <Elementary.h>
|
||||||
#include "elm_priv.h"
|
#include "elm_priv.h"
|
||||||
|
|
||||||
|
|
|
@ -366,6 +366,36 @@ START_TEST(logical_shift)
|
||||||
}
|
}
|
||||||
END_TEST
|
END_TEST
|
||||||
|
|
||||||
|
START_TEST(root_redirect_chain)
|
||||||
|
{
|
||||||
|
Efl_Ui_Focus_Manager *m, *m2;
|
||||||
|
|
||||||
|
elm_init(1, NULL);
|
||||||
|
|
||||||
|
TEST_OBJ_NEW(root, 0, 20, 20, 20);
|
||||||
|
TEST_OBJ_NEW(root2, 0, 20, 20, 20);
|
||||||
|
TEST_OBJ_NEW(child, 0, 20, 20, 20);
|
||||||
|
|
||||||
|
m = efl_add(EFL_UI_FOCUS_MANAGER_CALC_CLASS, NULL,
|
||||||
|
efl_ui_focus_manager_root_set(efl_added, root)
|
||||||
|
);
|
||||||
|
|
||||||
|
focus_test_manager_set(root2, m);
|
||||||
|
|
||||||
|
m2 = efl_add(EFL_UI_FOCUS_MANAGER_CALC_CLASS, NULL,
|
||||||
|
efl_ui_focus_manager_root_set(efl_added, root2)
|
||||||
|
);
|
||||||
|
|
||||||
|
efl_ui_focus_manager_calc_register(m, root2, root, m2);
|
||||||
|
efl_ui_focus_manager_calc_register(m2, child, root2, NULL);
|
||||||
|
efl_ui_focus_manager_focus_set(m2, child);
|
||||||
|
|
||||||
|
ck_assert_ptr_eq(efl_ui_focus_manager_redirect_get(m), m2);
|
||||||
|
|
||||||
|
elm_shutdown();
|
||||||
|
}
|
||||||
|
END_TEST
|
||||||
|
|
||||||
void elm_test_focus(TCase *tc)
|
void elm_test_focus(TCase *tc)
|
||||||
{
|
{
|
||||||
tcase_add_test(tc, focus_register_twice);
|
tcase_add_test(tc, focus_register_twice);
|
||||||
|
@ -379,4 +409,5 @@ void elm_test_focus(TCase *tc)
|
||||||
tcase_add_test(tc, invalid_args_check);
|
tcase_add_test(tc, invalid_args_check);
|
||||||
tcase_add_test(tc, order_check);
|
tcase_add_test(tc, order_check);
|
||||||
tcase_add_test(tc, logical_shift);
|
tcase_add_test(tc, logical_shift);
|
||||||
|
tcase_add_test(tc, root_redirect_chain);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
#define EFL_UI_FOCUS_OBJECT_PROTECTED
|
||||||
|
|
||||||
#include "elm_test_focus_common.h"
|
#include "elm_test_focus_common.h"
|
||||||
|
|
||||||
#define Q(o,_x,_y,_w,_h) \
|
#define Q(o,_x,_y,_w,_h) \
|
||||||
|
@ -60,6 +62,7 @@ elm_focus_test_manager_new(Efl_Ui_Focus_Object **middle)
|
||||||
typedef struct {
|
typedef struct {
|
||||||
Eina_Rect rect;
|
Eina_Rect rect;
|
||||||
Eina_Bool focus;
|
Eina_Bool focus;
|
||||||
|
Eo *manager;
|
||||||
} Focus_Test_Data;
|
} Focus_Test_Data;
|
||||||
|
|
||||||
EOLIAN static Efl_Object*
|
EOLIAN static Efl_Object*
|
||||||
|
@ -97,5 +100,23 @@ _focus_test_efl_gfx_geometry_get(Eo *obj EINA_UNUSED, Focus_Test_Data *pd)
|
||||||
return pd->rect;
|
return pd->rect;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EOLIAN static Efl_Ui_Focus_Manager*
|
||||||
|
_focus_test_efl_ui_focus_user_manager_get(Eo *obj EINA_UNUSED, Focus_Test_Data *pd)
|
||||||
|
{
|
||||||
|
return pd->manager;
|
||||||
|
}
|
||||||
|
|
||||||
|
EOLIAN static Efl_Ui_Focus_Object*
|
||||||
|
_focus_test_efl_ui_focus_user_parent_get(Eo *obj, Focus_Test_Data *pd EINA_UNUSED)
|
||||||
|
{
|
||||||
|
return efl_parent_get(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
EOLIAN static void
|
||||||
|
_focus_test_manager_set(Eo *obj EINA_UNUSED, Focus_Test_Data *pd, Efl_Ui_Focus_Manager *manager)
|
||||||
|
{
|
||||||
|
pd->manager = manager;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#include "focus_test.eo.c"
|
#include "focus_test.eo.c"
|
||||||
|
|
|
@ -1,15 +1,25 @@
|
||||||
class Focus.Test(Efl.Object, Efl.Ui.Focus.Object, Efl.Gfx) {
|
class Focus.Test(Efl.Object, Efl.Ui.Focus.Object, Efl.Ui.Focus.User, Efl.Gfx) {
|
||||||
methods {
|
methods {
|
||||||
size {
|
size {
|
||||||
params {
|
params {
|
||||||
rect : Eina.Rect;
|
rect : Eina.Rect;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@property manager {
|
||||||
|
set {
|
||||||
|
|
||||||
|
}
|
||||||
|
values {
|
||||||
|
manager : Efl.Ui.Focus.Manager;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
implements {
|
implements {
|
||||||
Efl.Object.constructor;
|
Efl.Object.constructor;
|
||||||
Efl.Ui.Focus.Object.focus_geometry { get; }
|
Efl.Ui.Focus.Object.focus_geometry { get; }
|
||||||
Efl.Ui.Focus.Object.focus { set; }
|
Efl.Ui.Focus.Object.focus { set; }
|
||||||
|
Efl.Ui.Focus.User.manager { get; }
|
||||||
|
Efl.Ui.Focus.User.parent {get; }
|
||||||
Efl.Gfx.geometry { get; }
|
Efl.Gfx.geometry { get; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue