From 287486e9208687ba57529adc4bd3b33c99bfbdbb Mon Sep 17 00:00:00 2001 From: Bruno Dilly Date: Tue, 6 Dec 2016 15:06:38 -0200 Subject: [PATCH] edje: add flag to choose between evas or edje seat naming collections.group.use_custom_seat_names should be set to '1' to use seat names on signals as provided by Evas. By default just follow Edje naming approach ("seat1", "seat2", ...) --- src/bin/edje/edje_cc_handlers.c | 40 ++++++++++++++++ src/lib/edje/edje_data.c | 1 + src/lib/edje/edje_edit.c | 3 ++ src/lib/edje/edje_load.c | 82 ++++++++++++++++++++++++++++++++- src/lib/edje/edje_private.h | 1 + 5 files changed, 125 insertions(+), 2 deletions(-) diff --git a/src/bin/edje/edje_cc_handlers.c b/src/bin/edje/edje_cc_handlers.c index 9428e45746..3861cd9aec 100644 --- a/src/bin/edje/edje_cc_handlers.c +++ b/src/bin/edje/edje_cc_handlers.c @@ -262,6 +262,7 @@ static void st_collections_group_broadcast_signal(void); static void st_collections_group_data_item(void); static void st_collections_group_orientation(void); static void st_collections_group_mouse_events(void); +static void st_collections_group_use_custom_seat_names(void); static void st_collections_group_limits_vertical(void); static void st_collections_group_limits_horizontal(void); @@ -716,6 +717,7 @@ New_Statement_Handler statement_handlers[] = {"collections.group.program_source", st_collections_group_program_source}, {"collections.group.inherit", st_collections_group_inherit}, {"collections.group.inherit_only", st_collections_group_inherit_only}, + {"collections.group.use_custom_seat_names", st_collections_group_use_custom_seat_names}, {"collections.group.target_group", st_collections_group_target_group}, /* dup */ {"collections.group.part_remove", st_collections_group_part_remove}, {"collections.group.program_remove", st_collections_group_program_remove}, @@ -4514,6 +4516,43 @@ st_collections_group_inherit_only(void) pcp->inherit_only = parse_bool(0); } +/** + @page edcref + @property + use_custom_seat_names + @parameters + [1 or 0] + @effect + This flags a group as designed to listen for multiseat signals + following a custom naming instead of default Edje naming. + Seats are named on Edje as "seat1", "seat2", etc, in an incremental + way and never are changed. + + But on Evas, names may be set on different places + (Evas, Ecore Evas backends, the application itself) + and name changes are allowed. + So custom names come from system at first, but can be overriden with + evas_device_name_set(). + Also Evas seat names don't need to follow any pattern. + + It's useful for cases where there is control of the + system, as seat names, or when the application + sets the devices names to guarantee they'll match + seat names on EDC. + @since 1.19 + @endproperty +*/ +static void +st_collections_group_use_custom_seat_names(void) +{ + Edje_Part_Collection *pc; + + check_arg_count(1); + + pc = eina_list_data_get(eina_list_last(edje_collections)); + pc->use_custom_seat_names = parse_bool(0); +} + /** @page edcref @property @@ -4692,6 +4731,7 @@ st_collections_group_inherit(void) pc->prop.orientation = pc2->prop.orientation; pc->lua_script_only = pc2->lua_script_only; + pc->use_custom_seat_names = pc2->use_custom_seat_names; pcp = (Edje_Part_Collection_Parser *)pc; pcp2 = (Edje_Part_Collection_Parser *)pc2; diff --git a/src/lib/edje/edje_data.c b/src/lib/edje/edje_data.c index 9141ae139b..6c4ef6aec1 100644 --- a/src/lib/edje/edje_data.c +++ b/src/lib/edje/edje_data.c @@ -1814,6 +1814,7 @@ _edje_edd_init(void) #endif EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection, Edje_Part_Collection, "physics_enabled", physics_enabled, EET_T_UCHAR); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection, Edje_Part_Collection, "script_recursion", script_recursion, EET_T_UCHAR); + EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection, Edje_Part_Collection, "use_custom_seat_names", use_custom_seat_names, EET_T_UCHAR); } EAPI void diff --git a/src/lib/edje/edje_edit.c b/src/lib/edje/edje_edit.c index 317892016e..6c57a7569b 100644 --- a/src/lib/edje/edje_edit.c +++ b/src/lib/edje/edje_edit.c @@ -15616,6 +15616,9 @@ _edje_generate_source_of_group(Edje *ed, Edje_Part_Collection_Directory_Entry *p /* Limits */ _edje_limits_source_generate(ed, buf, &ret); + if (pc->use_custom_seat_names) + BUF_APPENDF(I2 "use_custom_seat_names: 1;\n"); + /* Data */ if (pc->data) { diff --git a/src/lib/edje/edje_load.c b/src/lib/edje/edje_load.c index d3b9f20db3..91695b2aa1 100644 --- a/src/lib/edje/edje_load.c +++ b/src/lib/edje/edje_load.c @@ -515,8 +515,13 @@ _edje_device_add(Edje *ed, Efl_Input_Device *dev) char sig[256]; Eina_List *l; - ed->seats_count++; - name = eina_stringshare_printf("seat%i", ed->seats_count); + if (ed->collection && ed->collection->use_custom_seat_names) + name = eina_stringshare_add(efl_input_device_name_get(dev)); + else + { + ed->seats_count++; + name = eina_stringshare_printf("seat%i", ed->seats_count); + } EINA_SAFETY_ON_NULL_RETURN(name); EINA_LIST_FOREACH(ed->seats, l, s) @@ -584,6 +589,71 @@ _edje_device_removed_cb(void *data, const Efl_Event *event) _edje_emit(ed, sig, ""); } +static void +_edje_device_changed_cb(void *data, const Efl_Event *event) +{ + Efl_Input_Device *dev = event->info; + Edje_Seat *s, *seat = NULL; + Eina_Stringshare *name; + Edje *ed = data; + char sig[256]; + Eina_List *l; + + if (efl_input_device_type_get(dev) != EFL_INPUT_DEVICE_CLASS_SEAT) + return; + + EINA_LIST_FOREACH(ed->seats, l, s) + { + if (s->device != dev) + continue; + seat = s; + break; + } + + /* not registered seat */ + if (!seat) + return; + + name = efl_input_device_name_get(dev); + if (!name) + return; + + /* no name changes */ + if (eina_streq(seat->name, name)) + return; + + /* check if device name was changed to match name used on EDC */ + EINA_LIST_FOREACH(ed->seats, l, s) + { + if (eina_streq(s->name, name)) + { + if (s->device == dev) + continue; + if (s->device) + { + WRN("Two seats were detected with the same name: %s.\n" + "Fix it or focus will misbehave", name); + break; + } + + /* merge seats */ + s->device = dev; + if (seat->focused_part) + s->focused_part = seat->focused_part; + + ed->seats = eina_list_remove(ed->seats, seat); + eina_stringshare_del(seat->name); + free(seat); + + return; + } + } + + snprintf(sig, sizeof(sig), "seat,renamed,%s,%s", seat->name, name); + eina_stringshare_replace(&seat->name, name); + _edje_emit(ed, sig, ""); +} + static void _edje_devices_add(Edje *ed, Evas *tev) { @@ -601,6 +671,10 @@ _edje_devices_add(Edje *ed, Evas *tev) _edje_device_added_cb, ed); efl_event_callback_add(tev, EFL_CANVAS_EVENT_DEVICE_REMOVED, _edje_device_removed_cb, ed); + + if (ed->collection && ed->collection->use_custom_seat_names) + efl_event_callback_add(tev, EFL_CANVAS_EVENT_DEVICE_CHANGED, + _edje_device_changed_cb, ed); } int @@ -1704,6 +1778,10 @@ _edje_file_del(Edje *ed) _edje_device_added_cb, ed); efl_event_callback_del(tev, EFL_CANVAS_EVENT_DEVICE_REMOVED, _edje_device_removed_cb, ed); + if (ed->collection && ed->collection->use_custom_seat_names) + efl_event_callback_del(tev, EFL_CANVAS_EVENT_DEVICE_CHANGED, + _edje_device_changed_cb, ed); + evas_event_freeze(tev); } diff --git a/src/lib/edje/edje_private.h b/src/lib/edje/edje_private.h index d98f324f23..93b131cd09 100644 --- a/src/lib/edje/edje_private.h +++ b/src/lib/edje/edje_private.h @@ -1137,6 +1137,7 @@ struct _Edje_Part_Collection unsigned char broadcast_signal; unsigned char physics_enabled; /* will be 1 if a body is declared */ unsigned char script_recursion; /* permits unsafe Embryo->EDC->Embryo scripting */ + unsigned char use_custom_seat_names; unsigned char checked : 1; };