efl_ui_layout: create efl_ui_bg when efl_part for background is called.

Reviewers: woohyun, jpeg, cedric

Subscribers: felipealmeida, cedric, jpeg

Differential Revision: https://phab.enlightenment.org/D5151
This commit is contained in:
Sungtaek Hong 2017-11-24 14:41:31 +09:00 committed by Jean-Philippe Andre
parent 475ae7ef1b
commit 3c47a4f9f9
11 changed files with 411 additions and 5 deletions

View File

@ -54,6 +54,7 @@ elm_public_eolian_files = \
lib/elementary/efl_ui_layout_part_content.eo \
lib/elementary/efl_ui_layout_part_text.eo \
lib/elementary/efl_ui_layout_part_table.eo \
lib/elementary/efl_ui_layout_part_bg.eo \
lib/elementary/efl_ui_layout_part_legacy.eo \
lib/elementary/efl_ui_multibuttonentry_part.eo \
lib/elementary/efl_ui_panes_part.eo \
@ -61,6 +62,7 @@ elm_public_eolian_files = \
lib/elementary/efl_ui_slider_part.eo \
lib/elementary/efl_ui_textpath_part.eo \
lib/elementary/efl_ui_widget_part.eo \
lib/elementary/efl_ui_widget_part_bg.eo \
lib/elementary/efl_ui_win_part.eo \
lib/elementary/efl_access.eo \
lib/elementary/efl_access_action.eo \
@ -862,6 +864,7 @@ bin/elementary/test_notify.c \
bin/elementary/test_nstate.c \
bin/elementary/test_panel.c \
bin/elementary/test_panes.c \
bin/elementary/test_part_bg.c \
bin/elementary/test_photo.c \
bin/elementary/test_photocam.c \
bin/elementary/test_popup.c \

View File

@ -113,6 +113,7 @@ test_notify.c \
test_nstate.c \
test_panel.c \
test_panes.c \
test_part_bg.c \
test_photo.c \
test_photocam.c \
test_popup.c \

View File

@ -302,6 +302,7 @@ void test_win_dialog(void *data, Evas_Object *obj, void *event_info);
void test_win_modal(void *data, Evas_Object *obj, void *event_info);
void test_box_disable(void *data, Evas_Object *obj, void *event_info);
void test_layout_disable(void *data, Evas_Object *obj, void *event_info);
void test_part_background(void *data, Evas_Object *obj, void *event_info);
void test_colorclass(void *data, Evas_Object *obj, void *event_info);
@ -1130,6 +1131,9 @@ add_tests:
//------------------------------//
ADD_TEST(NULL, "Widgets Disable/Enable", "Box", test_box_disable);
ADD_TEST(NULL, "Widgets Disable/Enable", "Layout", test_layout_disable);
//------------------------------//
ADD_TEST(NULL, "Widgets Part", "Part Background", test_part_background);
#undef ADD_TEST
if (autorun)

View File

@ -0,0 +1,183 @@
#ifdef HAVE_CONFIG_H
# include "elementary_config.h"
#endif
#include <Elementary.h>
const Efl_Class *content_class[17];
static void
_reset_cb(void *data, const Efl_Event *ev EINA_UNUSED)
{
Evas_Object *radio = data;
Evas_Object *target;
radio = efl_ui_radio_selected_object_get(radio);
target = evas_object_data_get(radio, "data");
efl_gfx_color_set(efl_part(target, "background"), 0, 0, 0, 0);
efl_file_set(efl_part(target, "background"), NULL, NULL);
}
static void
_color_cb(void *data, const Efl_Event *ev EINA_UNUSED)
{
Evas_Object *radio = data;
Evas_Object *target;
static Eina_Bool i;
radio = efl_ui_radio_selected_object_get(radio);
target = evas_object_data_get(radio, "data");
i ^= EINA_TRUE;
efl_gfx_color_set(efl_part(target, "background"), (i) ? 255 : 0, (i) ? 0 : 255, 0, 255);
}
static void
_scale_type_cb(void *data, const Efl_Event *ev EINA_UNUSED)
{
Evas_Object *radio = data;
Evas_Object *target;
Efl_Ui_Image_Scale_Type type;
char buf[PATH_MAX];
radio = efl_ui_radio_selected_object_get(radio);
target = evas_object_data_get(radio, "data");
snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get());
efl_file_set(efl_part(target, "background"), buf, NULL);
type = efl_ui_image_scale_type_get(efl_part(target, "background"));
type = (type + 1) % 5;
efl_ui_image_scale_type_set(efl_part(target, "background"), type);
}
static Evas_Object *
_create_box_contents(Evas_Object *box)
{
Evas_Object *hbox;
Evas_Object *radio_group, *radio;
Evas_Object *content;
char buf[PATH_MAX];
unsigned int i;
hbox = efl_add(EFL_UI_BOX_CLASS, box,
efl_ui_direction_set(efl_added, EFL_UI_DIR_HORIZONTAL),
efl_gfx_size_hint_weight_set(efl_added, 1, 1),
efl_pack_end(box, efl_added));
radio_group = radio = efl_add(EFL_UI_RADIO_CLASS, hbox,
efl_pack_end(hbox, efl_added),
efl_gfx_size_hint_weight_set(efl_added, 0, 0),
efl_ui_radio_state_value_set(efl_added, 0));
content = efl_add(EFL_UI_BOX_CLASS, hbox,
efl_pack_end(hbox, efl_added));
evas_object_data_set(radio, "data", content);
content = efl_add(EFL_UI_TEXT_CLASS, content,
efl_text_set(efl_added, "box"),
efl_ui_text_interactive_editable_set(efl_added, EINA_FALSE),
efl_pack_end(content, efl_added));
for (i = 0; i < (sizeof(content_class) / sizeof(content_class[0])) ; i++)
{
if (!content_class[i]) continue;
hbox = efl_add(EFL_UI_BOX_CLASS, box,
efl_ui_direction_set(efl_added, EFL_UI_DIR_HORIZONTAL),
efl_pack_end(box, efl_added));
radio = efl_add(EFL_UI_RADIO_CLASS, hbox,
efl_ui_radio_group_add(efl_added, radio_group),
efl_pack_end(hbox, efl_added),
efl_ui_radio_state_value_set(efl_added, i + 1),
efl_gfx_size_hint_weight_set(efl_added, 0, 0)
);
content = efl_add(content_class[i], hbox,
efl_pack_end(hbox, efl_added));
if (efl_isa(content, efl_text_interface_get()))
efl_text_set(content, "text");
if (efl_isa(content, EFL_UI_IMAGE_CLASS))
{
snprintf(buf, sizeof(buf), "%s/images/logo.png", elm_app_data_dir_get());
efl_file_set(content, buf, NULL);
}
evas_object_data_set(radio, "data", content);
}
efl_ui_nstate_value_set(radio_group, 0);
return radio_group;
}
void
test_part_background(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
Evas_Object *win;
Evas_Object *scr;
Evas_Object *vbox, *hbox;
Evas_Object *radio_group;
Evas_Object *reset_btn, *color_btn, *scale_btn;
content_class[0] = EFL_UI_CALENDAR_CLASS;
content_class[1] = EFL_UI_SLIDER_CLASS;
content_class[2] = EFL_UI_SLIDER_INTERVAL_CLASS;
content_class[3] = EFL_UI_MULTIBUTTONENTRY_CLASS;
content_class[4] = EFL_UI_PROGRESSBAR_CLASS;
content_class[5] = EFL_UI_CLOCK_CLASS;
content_class[6] = EFL_UI_BUTTON_CLASS;
content_class[7] = EFL_UI_CHECK_CLASS;
content_class[8] = EFL_UI_RADIO_CLASS;
content_class[9] = EFL_UI_TEXT_CLASS;
content_class[10] = EFL_UI_FLIP_CLASS;
content_class[11] = EFL_UI_PANES_CLASS;
content_class[12] = EFL_UI_VIDEO_CLASS;
content_class[13] = EFL_UI_BG_CLASS;
content_class[14] = EFL_UI_IMAGE_CLASS;
content_class[15] = EFL_UI_IMAGE_ZOOMABLE_CLASS;
content_class[16] = EFL_UI_NSTATE_CLASS;
//content_class[17] = EFL_UI_SPINNER_CLASS;
win = efl_add(EFL_UI_WIN_CLASS, NULL,
efl_text_set(efl_added, "Widget Part Background"),
efl_ui_win_autodel_set(efl_added, EINA_TRUE));
vbox = efl_add(EFL_UI_BOX_CLASS, win,
efl_gfx_size_hint_weight_set(efl_added, 1, 1),
efl_content_set(win, efl_added));
hbox = efl_add(EFL_UI_BOX_CLASS, vbox,
efl_ui_direction_set(efl_added, EFL_UI_DIR_HORIZONTAL),
efl_gfx_size_hint_weight_set(efl_added, 1.0, 0.0),
efl_pack_end(vbox, efl_added));
reset_btn = efl_add(EFL_UI_BUTTON_CLASS, hbox,
efl_pack_end(hbox, efl_added),
efl_text_set(efl_added, "reset"));
color_btn = efl_add(EFL_UI_BUTTON_CLASS, hbox,
efl_pack_end(hbox, efl_added),
efl_text_set(efl_added, "color"));
scale_btn = efl_add(EFL_UI_BUTTON_CLASS, hbox,
efl_pack_end(hbox, efl_added),
efl_text_set(efl_added, "scale_type"));
scr = elm_scroller_add(vbox);
evas_object_show(scr);
evas_object_size_hint_weight_set(scr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(scr, EVAS_HINT_FILL, EVAS_HINT_FILL);
efl_pack_end(vbox, scr);
vbox = efl_add(EFL_UI_BOX_CLASS, scr,
efl_gfx_size_hint_weight_set(efl_added, 1, 1),
efl_content_set(scr, efl_added));
radio_group = _create_box_contents(vbox);
efl_event_callback_add(reset_btn, EFL_UI_EVENT_CLICKED, _reset_cb, radio_group);
efl_event_callback_add(color_btn, EFL_UI_EVENT_CLICKED, _color_cb, radio_group);
efl_event_callback_add(scale_btn, EFL_UI_EVENT_CLICKED, _scale_type_cb, radio_group);
efl_gfx_size_set(win, EINA_SIZE2D(300, 200));
}

View File

@ -282,9 +282,11 @@ EAPI extern Elm_Version *elm_version;
#ifdef EFL_EO_API_SUPPORT
# include <efl_config_global.eo.h>
# include <efl_ui_widget_part.eo.h>
# include <efl_ui_widget_part_bg.eo.h>
# include <efl_ui_layout_part.eo.h>
# include <efl_ui_layout_part_box.eo.h>
# include <efl_ui_layout_part_content.eo.h>
# include <efl_ui_layout_part_bg.eo.h>
# include <efl_ui_layout_part_text.eo.h>
# include <efl_ui_layout_part_table.eo.h>
# include <efl_ui_win_part.eo.h>

View File

@ -4,6 +4,7 @@
#define EFL_ACCESS_PROTECTED
#define ELM_LAYOUT_PROTECTED
#define EFL_UI_WIDGET_PART_BG_PROTECTED
#include <Elementary.h>
@ -2382,6 +2383,8 @@ _efl_ui_layout_efl_part_part(const Eo *obj, Efl_Ui_Layout_Data *sd, const char *
EINA_SAFETY_ON_NULL_RETURN_VAL(part, NULL);
ELM_WIDGET_DATA_GET_OR_RETURN((Eo *) obj, wd, NULL);
if (eina_streq(part, "background"))
return ELM_PART_IMPLEMENT(EFL_UI_LAYOUT_PART_BG_CLASS, obj, part);
// Check part type without using edje_object_part_object_get(), as this
// can cause recalc, which has side effects... and could be slow.
type = efl_canvas_layout_part_type_get(efl_part(wd->resize_obj, part));
@ -2391,7 +2394,6 @@ _efl_ui_layout_efl_part_part(const Eo *obj, Efl_Ui_Layout_Data *sd, const char *
ERR("Invalid type found for part '%s' in group '%s'", part, sd->group);
return NULL;
}
switch (type)
{
case EFL_CANVAS_LAYOUT_PART_TYPE_BOX:
@ -2526,9 +2528,84 @@ _efl_ui_layout_part_legacy_efl_ui_translatable_translatable_text_set(Eo *obj, vo
elm_widget_part_translatable_text_set(pd->obj, pd->part, label, domain);
}
/* Efl.Ui.Layout.Part.Bg (common) */
EOLIAN static void
_efl_ui_layout_part_bg_efl_ui_widget_part_bg_bg_set(Eo *obj, void *_pd EINA_UNUSED, Efl_Canvas_Object *bg)
{
Efl_Canvas_Layout_Part_Type type;
Elm_Part_Data *pd = efl_data_scope_get(obj, EFL_UI_WIDGET_PART_CLASS);
Efl_Ui_Layout_Data *sd = efl_data_scope_get(pd->obj, MY_CLASS);
ELM_WIDGET_DATA_GET_OR_RETURN(pd->obj, wd);
// Check part type without using edje_object_part_object_get(), as this
// can cause recalc, which has side effects... and could be slow.
type = efl_canvas_layout_part_type_get(efl_part(wd->resize_obj, "background"));
if (type != EFL_CANVAS_LAYOUT_PART_TYPE_SWALLOW)
efl_ui_widget_part_bg_set(efl_super(obj, EFL_UI_LAYOUT_PART_BG_CLASS), bg);
if (wd->bg == bg)
return;
efl_del(wd->bg);
wd->bg = bg;
if (!wd->bg)
return;
_efl_ui_layout_content_set(pd->obj, sd, "background", bg);
}
EOLIAN static Eina_Bool
_efl_ui_layout_part_bg_efl_file_file_set(Eo *obj, void *pd EINA_UNUSED, const char *file, const char *key)
{
Evas_Object *bg_obj = efl_ui_widget_part_bg_get(obj);
return efl_file_set(bg_obj, file, key);
}
EOLIAN static void
_efl_ui_layout_part_bg_efl_file_file_get(Eo *obj, void *pd EINA_UNUSED, const char **file, const char **key)
{
Evas_Object *bg_obj = efl_ui_widget_part_bg_get(obj);
efl_file_get(bg_obj, file, key);
}
EOLIAN static void
_efl_ui_layout_part_bg_efl_gfx_color_set(Eo *obj, void *pd EINA_UNUSED, int r, int g, int b, int a)
{
Evas_Object *bg_obj = efl_ui_widget_part_bg_get(obj);
efl_gfx_color_set(bg_obj, r, g, b, a);
}
EOLIAN static void
_efl_ui_layout_part_bg_efl_gfx_color_get(Eo *obj, void *pd EINA_UNUSED, int *r, int *g, int *b, int *a)
{
Evas_Object *bg_obj = efl_ui_widget_part_bg_get(obj);
efl_gfx_color_get(bg_obj, r, g, b, a);
}
EOLIAN static void
_efl_ui_layout_part_bg_efl_ui_image_scale_type_set(Eo *obj, void *pd EINA_UNUSED, Efl_Ui_Image_Scale_Type scale_type)
{
Evas_Object *bg_obj = efl_ui_widget_part_bg_get(obj);
efl_ui_image_scale_type_set(bg_obj, scale_type);
}
EOLIAN static Efl_Ui_Image_Scale_Type
_efl_ui_layout_part_bg_efl_ui_image_scale_type_get(Eo *obj, void *pd EINA_UNUSED)
{
Evas_Object *bg_obj = efl_ui_widget_part_bg_get(obj);
return efl_ui_image_scale_type_get(bg_obj);
}
/* Efl.Ui.Layout.Part_Xxx includes */
#include "efl_ui_layout_part.eo.c"
#include "efl_ui_layout_part_content.eo.c"
#include "efl_ui_layout_part_bg.eo.c"
#include "efl_ui_layout_part_text.eo.c"
#include "efl_ui_layout_part_legacy.eo.c"

View File

@ -0,0 +1,11 @@
class Efl.Ui.Layout.Part.Bg (Efl.Ui.Widget.Part.Bg, Efl.Ui.Bg)
{
[[Elementary layout internal part background class]]
data: null;
implements {
Efl.Ui.Widget.Part.Bg.bg { set; }
Efl.File.file { get; set; }
Efl.Gfx.color { set; get; }
Efl.Ui.Image.scale_type { get; set; }
}
}

View File

@ -0,0 +1,22 @@
class Efl.Ui.Widget.Part.Bg (Efl.Ui.Widget.Part, Efl.Ui.Bg)
{
[[Elementary widget internal part background class]]
data: null;
methods {
@property bg @protected {
[[Background object]]
set {
}
get {
}
values {
bg: Efl.Canvas.Object;
}
}
}
implements {
Efl.File.file { get; set; }
Efl.Gfx.color { set; get; }
Efl.Ui.Image.scale_type { get; set; }
}
}

View File

@ -90,6 +90,8 @@ EOLIAN static Efl_Object * \
_ ## type ## _efl_part_part(const Eo *obj, typedata *priv EINA_UNUSED, const char *part) \
{ \
EINA_SAFETY_ON_NULL_RETURN_VAL(part, NULL); \
if (eina_streq(part, "background")) \
return efl_part(efl_super(obj, MY_CLASS), part); \
return ELM_PART_IMPLEMENT(TYPE ## _PART_CLASS, obj, part); \
}

View File

@ -10,6 +10,7 @@
#define EFL_INPUT_EVENT_PROTECTED
#define EFL_UI_TRANSLATABLE_PROTECTED
#define EFL_UI_FOCUS_OBJECT_PROTECTED
#define EFL_UI_WIDGET_PART_BG_PROTECTED
#include <Elementary.h>
@ -814,6 +815,11 @@ _smart_reconfigure(Elm_Widget_Smart_Data *sd)
evas_object_move(sd->hover_obj, sd->x, sd->y);
evas_object_resize(sd->hover_obj, sd->w, sd->h);
}
if (sd->bg)
{
evas_object_move(sd->bg, sd->x, sd->y);
evas_object_resize(sd->bg, sd->w, sd->h);
}
}
EOLIAN static void
@ -902,7 +908,7 @@ _elm_widget_efl_gfx_visible_set(Eo *obj, Elm_Widget_Smart_Data *pd, Eina_Bool vi
}
EOLIAN static void
_elm_widget_efl_gfx_color_set(Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUSED, int r, int g, int b, int a)
_elm_widget_efl_gfx_color_set(Eo *obj, Elm_Widget_Smart_Data *pd, int r, int g, int b, int a)
{
Eina_Iterator *it;
Evas_Object *o;
@ -913,6 +919,7 @@ _elm_widget_efl_gfx_color_set(Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUSED, i
it = evas_object_smart_iterator_new(obj);
EINA_ITERATOR_FOREACH(it, o)
{
if (pd->bg == o) continue;
if (evas_object_data_get(o, "_elm_leaveme")) continue;
evas_object_color_set(o, r, g, b, a);
}
@ -983,15 +990,18 @@ _elm_widget_efl_canvas_group_group_calculate(Eo *obj EINA_UNUSED, Elm_Widget_Sma
}
EOLIAN static void
_elm_widget_efl_canvas_group_group_member_add(Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUSED, Evas_Object *child)
_elm_widget_efl_canvas_group_group_member_add(Eo *obj, Elm_Widget_Smart_Data *pd, Evas_Object *child)
{
int r, g, b, a;
efl_canvas_group_member_add(efl_super(obj, MY_CLASS), child);
if (evas_object_data_get(child, "_elm_leaveme")) return;
evas_object_color_get(obj, &r, &g, &b, &a);
evas_object_color_set(child, r, g, b, a);
if (pd->bg != child)
{
evas_object_color_get(obj, &r, &g, &b, &a);
evas_object_color_set(child, r, g, b, a);
}
efl_canvas_object_no_render_set(child, efl_canvas_object_no_render_get(obj));
evas_object_clip_set(child, evas_object_clip_get(obj));
@ -5522,6 +5532,8 @@ elm_widget_signal_callback_del(Eo *obj, const char *emission, const char *source
EOLIAN static Efl_Object *
_elm_widget_efl_part_part(const Eo *obj, Elm_Widget_Smart_Data *wd EINA_UNUSED, const char *part)
{
if (eina_streq(part, "background"))
return ELM_PART_IMPLEMENT(EFL_UI_WIDGET_PART_BG_CLASS, obj, part);
return ELM_PART_IMPLEMENT(EFL_UI_WIDGET_PART_CLASS, obj, part);
}
@ -5537,6 +5549,94 @@ _efl_ui_widget_part_efl_object_destructor(Eo *obj, Elm_Part_Data *pd)
/* Efl.Part end */
/* Efl.Part Bg implementation */
EOLIAN static void
_efl_ui_widget_part_bg_bg_set(Eo *obj, void *_pd EINA_UNUSED, Efl_Canvas_Object *bg)
{
Elm_Part_Data *pd = efl_data_scope_get(obj, EFL_UI_WIDGET_PART_CLASS);
Elm_Widget_Smart_Data *sd = efl_data_scope_get(pd->obj, MY_CLASS);
if (sd->bg == bg)
return;
efl_del(sd->bg);
sd->bg = bg;
if (!sd->bg)
return;
efl_canvas_group_member_add(pd->obj, sd->bg);
evas_object_stack_below(sd->bg, sd->resize_obj);
_smart_reconfigure(sd);
}
EOLIAN static Efl_Canvas_Object *
_efl_ui_widget_part_bg_bg_get(Eo *obj, void *_pd EINA_UNUSED)
{
Elm_Part_Data *pd = efl_data_scope_get(obj, EFL_UI_WIDGET_PART_CLASS);
Elm_Widget_Smart_Data *sd = efl_data_scope_get(pd->obj, MY_CLASS);
Evas_Object *bg_obj = sd->bg;
if (!bg_obj)
{
bg_obj = efl_add(EFL_UI_BG_CLASS, pd->obj);
efl_ui_widget_part_bg_set(obj, bg_obj);
}
return bg_obj;
}
EOLIAN static Eina_Bool
_efl_ui_widget_part_bg_efl_file_file_set(Eo *obj, void *pd EINA_UNUSED, const char *file, const char *key)
{
Evas_Object *bg_obj = efl_ui_widget_part_bg_get(obj);
return efl_file_set(bg_obj, file, key);
}
EOLIAN static void
_efl_ui_widget_part_bg_efl_file_file_get(Eo *obj, void *pd EINA_UNUSED, const char **file, const char **key)
{
Evas_Object *bg_obj = efl_ui_widget_part_bg_get(obj);
efl_file_get(bg_obj, file, key);
}
EOLIAN static void
_efl_ui_widget_part_bg_efl_gfx_color_set(Eo *obj, void *pd EINA_UNUSED, int r, int g, int b, int a)
{
Evas_Object *bg_obj = efl_ui_widget_part_bg_get(obj);
efl_gfx_color_set(bg_obj, r, g, b, a);
}
EOLIAN static void
_efl_ui_widget_part_bg_efl_gfx_color_get(Eo *obj, void *pd EINA_UNUSED, int *r, int *g, int *b, int *a)
{
Evas_Object *bg_obj = efl_ui_widget_part_bg_get(obj);
efl_gfx_color_get(bg_obj, r, g, b, a);
}
EOLIAN static void
_efl_ui_widget_part_bg_efl_ui_image_scale_type_set(Eo *obj, void *pd EINA_UNUSED, Efl_Ui_Image_Scale_Type scale_type)
{
Evas_Object *bg_obj = efl_ui_widget_part_bg_get(obj);
efl_ui_image_scale_type_set(bg_obj, scale_type);
}
EOLIAN static Efl_Ui_Image_Scale_Type
_efl_ui_widget_part_bg_efl_ui_image_scale_type_get(Eo *obj, void *pd EINA_UNUSED)
{
Evas_Object *bg_obj = efl_ui_widget_part_bg_get(obj);
return efl_ui_image_scale_type_get(bg_obj);
}
#include "efl_ui_widget_part_bg.eo.c"
/* Efl.Part Bg end */
/* Internal EO APIs and hidden overrides */

View File

@ -387,6 +387,7 @@ typedef struct _Elm_Widget_Smart_Data
Eina_List *subobjs; /**< list of widgets' sub objects in the elementary tree */
Evas_Object *resize_obj; /**< an unique object for each widget that shows the look of a widget. Resize object's geometry is same as the widget. This resize object is different from that of window's resize object. */
Evas_Object *hover_obj;
Evas_Object *bg;
Eina_List *tooltips, *cursors;
Evas_Object *focus_previous, *focus_next;
Evas_Object *focus_up, *focus_down, *focus_right, *focus_left;