edje: accept optional seat parameter on FOCUS_OBJECT

If not provided, FOCUS_OBJECT action will keep acting
over default seat.

Also include a usage on edje-multiseat test
(actually no example was exercising this action).
This commit is contained in:
Bruno Dilly 2016-12-02 17:50:43 -02:00
parent 7ef5f6c3a0
commit 0ab6567b3e
4 changed files with 142 additions and 15 deletions

View File

@ -14094,7 +14094,7 @@ st_collections_group_programs_program_in(void)
@li DRAG_VAL_STEP 1.0 0.0 @li DRAG_VAL_STEP 1.0 0.0
@li DRAG_VAL_PAGE 0.0 0.0 @li DRAG_VAL_PAGE 0.0 0.0
@li FOCUS_SET ("seat") @li FOCUS_SET ("seat")
@li FOCUS_OBJECT @li FOCUS_OBJECT ("seat")
@li PARAM_COPY "src_part" "src_param" "dst_part" "dst_param" @li PARAM_COPY "src_part" "src_param" "dst_part" "dst_param"
@li PARAM_SET "part" "param" "value" @li PARAM_SET "part" "param" "value"
@li PLAY_SAMPLE "sample name" speed (channel) @li PLAY_SAMPLE "sample name" speed (channel)
@ -14169,7 +14169,8 @@ st_collections_group_programs_program_action(void)
else else
ep->value = parse_float_range(2, 0.0, 1.0); ep->value = parse_float_range(2, 0.0, 1.0);
} }
else if (ep->action == EDJE_ACTION_TYPE_FOCUS_SET) else if ((ep->action == EDJE_ACTION_TYPE_FOCUS_SET) ||
(ep->action == EDJE_ACTION_TYPE_FOCUS_OBJECT))
{ {
if (get_arg_count() == 1) if (get_arg_count() == 1)
ep->seat = NULL; ep->seat = NULL;
@ -14317,7 +14318,6 @@ st_collections_group_programs_program_action(void)
* completeness */ * completeness */
break; break;
case EDJE_ACTION_TYPE_ACTION_STOP: case EDJE_ACTION_TYPE_ACTION_STOP:
case EDJE_ACTION_TYPE_FOCUS_OBJECT:
case EDJE_ACTION_TYPE_PHYSICS_FORCES_CLEAR: case EDJE_ACTION_TYPE_PHYSICS_FORCES_CLEAR:
case EDJE_ACTION_TYPE_PHYSICS_STOP: case EDJE_ACTION_TYPE_PHYSICS_STOP:
check_arg_count(1); check_arg_count(1);
@ -14342,6 +14342,7 @@ st_collections_group_programs_program_action(void)
check_min_arg_count(2); check_min_arg_count(2);
break; break;
case EDJE_ACTION_TYPE_FOCUS_SET: case EDJE_ACTION_TYPE_FOCUS_SET:
case EDJE_ACTION_TYPE_FOCUS_OBJECT:
check_min_arg_count(1); check_min_arg_count(1);
break; break;
default: default:

View File

@ -53,6 +53,52 @@ _on_canvas_resize(Ecore_Evas *ee)
evas_object_resize(edje_obj, w, h); evas_object_resize(edje_obj, w, h);
} }
static void
_on_rect_focus_in(void *data, const Efl_Event *event)
{
Evas_Object *rect, *edje_obj;
Efl_Input_Device *seat;
Eina_Stringshare *name;
Efl_Input_Focus *ev;
edje_obj = data;
rect = event->object;
ev = event->info;
seat = efl_input_device_get(ev);
name = edje_obj_seat_name_get(edje_obj, seat);
printf("Seat %s (%s) focused the rect object\n",
efl_input_device_name_get(seat), name);
if (!strcmp(name, "seat1"))
evas_object_color_set(rect, 200, 0, 0, 255);
else if (!strcmp(name, "seat2"))
evas_object_color_set(rect, 0, 200, 0, 255);
else
printf("Unexpected seat %s - no color change\n", name);
}
static void
_on_rect_focus_out(void *data, const Efl_Event *event)
{
Evas_Object *rect, *edje_obj;
Efl_Input_Device *seat;
Eina_Stringshare *name;
Efl_Input_Focus *ev;
edje_obj = data;
rect = event->object;
ev = event->info;
seat = efl_input_device_get(ev);
name = edje_obj_seat_name_get(edje_obj, seat);
printf("Seat %s (%s) unfocused the rect object\n",
efl_input_device_name_get(seat), name);
evas_object_color_set(rect, 200, 200, 200, 255);
efl_canvas_object_seat_focus_add(edje_obj, seat);
}
static void static void
_on_key_down(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *o, void *event_info) _on_key_down(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *o, void *event_info)
{ {
@ -127,7 +173,7 @@ main(int argc EINA_UNUSED, char *argv[] EINA_UNUSED)
{ {
const char *edje_file = PACKAGE_DATA_DIR"/multiseat.edj"; const char *edje_file = PACKAGE_DATA_DIR"/multiseat.edj";
const Eina_List *devices, *l; const Eina_List *devices, *l;
Evas_Object *edje_obj, *bg; Evas_Object *edje_obj, *bg, *rect;
Efl_Input_Device *dev; Efl_Input_Device *dev;
Ecore_Evas *ee; Ecore_Evas *ee;
Evas *evas; Evas *evas;
@ -174,6 +220,14 @@ main(int argc EINA_UNUSED, char *argv[] EINA_UNUSED)
edje_object_part_text_cursor_end_set(edje_obj, "example/text2", edje_object_part_text_cursor_end_set(edje_obj, "example/text2",
EDJE_CURSOR_MAIN); EDJE_CURSOR_MAIN);
rect = evas_object_rectangle_add(evas);
evas_object_color_set(rect, 200, 200, 200, 255);
edje_object_part_swallow(edje_obj, "example/swallow", rect);
efl_event_callback_add(rect, EFL_EVENT_FOCUS_IN,
_on_rect_focus_in, edje_obj);
efl_event_callback_add(rect, EFL_EVENT_FOCUS_OUT,
_on_rect_focus_out, edje_obj);
devices = evas_device_list(evas, NULL); devices = evas_device_list(evas, NULL);
EINA_LIST_FOREACH(devices, l, dev) EINA_LIST_FOREACH(devices, l, dev)
{ {

View File

@ -247,7 +247,7 @@ collections {
mouse_events: 1; mouse_events: 1;
description { description {
state: "default" 0.0; state: "default" 0.0;
rel1.relative: 0.3 0.65; rel1.relative: 0.45 0.65;
rel2.relative: 0.9 0.9; rel2.relative: 0.9 0.9;
color: 200 200 200 255; color: 200 200 200 255;
} }
@ -305,7 +305,7 @@ collections {
rel2.to: "button_left_over"; rel2.to: "button_left_over";
text { text {
text: "Seat 1 over"; text: "Seat 1 over";
size: 12; size: 10;
font: "sans"; font: "sans";
min: 1 1; min: 1 1;
} }
@ -346,7 +346,7 @@ collections {
rel2.to: "button_left_focus"; rel2.to: "button_left_focus";
text { text {
text: "Seat 1 focus"; text: "Seat 1 focus";
size: 12; size: 10;
font: "sans"; font: "sans";
min: 1 1; min: 1 1;
} }
@ -387,7 +387,7 @@ collections {
rel2.to: "button_right_over"; rel2.to: "button_right_over";
text { text {
text: "Seat 2 over"; text: "Seat 2 over";
size: 12; size: 10;
font: "sans"; font: "sans";
min: 1 1; min: 1 1;
} }
@ -428,12 +428,34 @@ collections {
rel2.to: "button_right_focus"; rel2.to: "button_right_focus";
text { text {
text: "Seat 2 focus"; text: "Seat 2 focus";
size: 12; size: 10;
font: "sans"; font: "sans";
min: 1 1; min: 1 1;
} }
} }
} }
part {
name: "unfocus_area";
type: RECT;
mouse_events: 1;
repeat_events: 1;
description {
state: "default" 0.0;
color: 255 255 255 0;
}
}
part {
name: "example/swallow";
type: SWALLOW;
mouse_events: 1;
description {
state: "default" 0.0;
rel1.relative: 0.3 0.65;
rel2.relative: 0.4 0.9;
}
}
} }
programs { programs {
@ -668,6 +690,36 @@ collections {
action: STATE_SET "default" 0.0; action: STATE_SET "default" 0.0;
target: "example/knob2"; target: "example/knob2";
} }
program {
name: "rect,focus,s1";
signal: "mouse,clicked,1,seat1";
source: "example/swallow";
action: FOCUS_OBJECT "seat1";
target: "example/swallow";
}
program {
name: "rect,unfocus,s1";
signal: "mouse,clicked,1,seat1";
source: "unfocus_area";
action: FOCUS_OBJECT "seat1";
}
program {
name: "rect,focus,s2";
signal: "mouse,clicked,1,seat2";
source: "example/swallow";
action: FOCUS_OBJECT "seat2";
target: "example/swallow";
}
program {
name: "rect,unfocus,s2";
signal: "mouse,clicked,1,seat2";
source: "unfocus_area";
action: FOCUS_OBJECT "seat2";
}
} }
} }

View File

@ -1032,11 +1032,29 @@ low_mem_current:
break; break;
case EDJE_ACTION_TYPE_FOCUS_OBJECT: case EDJE_ACTION_TYPE_FOCUS_OBJECT:
{
Efl_Input_Device *seat = NULL;
if (pr->seat)
{
Eina_Stringshare *seat_name;
seat_name = eina_stringshare_add(pr->seat);
seat = _edje_seat_get(ed, seat_name);
eina_stringshare_del(seat_name);
}
if (!seat)
{
Evas *e;
e = evas_object_evas_get(ed->obj);
seat = evas_canvas_default_device_get(e, EFL_INPUT_DEVICE_CLASS_SEAT);
}
if (!pr->targets) if (!pr->targets)
{ {
Evas_Object *focused; Evas_Object *focused;
focused = evas_focus_get(evas_object_evas_get(ed->obj)); focused = evas_seat_focus_get(evas_object_evas_get(ed->obj), seat);
if (focused) if (focused)
{ {
unsigned int i; unsigned int i;
@ -1050,7 +1068,7 @@ low_mem_current:
(rp->typedata.swallow)) && (rp->typedata.swallow)) &&
(rp->typedata.swallow->swallowed_object == focused)) (rp->typedata.swallow->swallowed_object == focused))
{ {
evas_object_focus_set(focused, EINA_FALSE); evas_object_seat_focus_del(focused, seat);
break; break;
} }
} }
@ -1067,7 +1085,9 @@ low_mem_current:
((rp->type == EDJE_RP_TYPE_SWALLOW) && ((rp->type == EDJE_RP_TYPE_SWALLOW) &&
(rp->typedata.swallow)) && (rp->typedata.swallow)) &&
(rp->typedata.swallow->swallowed_object)) (rp->typedata.swallow->swallowed_object))
evas_object_focus_set(rp->typedata.swallow->swallowed_object, EINA_TRUE); evas_object_seat_focus_add(
rp->typedata.swallow->swallowed_object, seat);
}
} }
} }
} }