summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruno Dilly <bdilly@profusion.mobi>2016-12-06 15:06:38 -0200
committerBruno Dilly <bdilly@profusion.mobi>2016-12-14 18:17:28 -0200
commit07890a1f07b770c661e91b0f2706e739a31ae002 (patch)
tree6258e8ca4e1f877c839923c93775617921d0e78e
parentdd51a3f976d467de4e622cc7fd5ca9c32a409e73 (diff)
downloadefl-07890a1f07b770c661e91b0f2706e739a31ae002.tar.gz
edje: add flag to choose between evas or edje seat naming
collections.group.use_system_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", ...)
-rw-r--r--src/bin/edje/edje_cc_handlers.c36
-rw-r--r--src/lib/edje/edje_data.c1
-rw-r--r--src/lib/edje/edje_edit.c3
-rw-r--r--src/lib/edje/edje_load.c82
-rw-r--r--src/lib/edje/edje_private.h1
5 files changed, 121 insertions, 2 deletions
diff --git a/src/bin/edje/edje_cc_handlers.c b/src/bin/edje/edje_cc_handlers.c
index 9428e45746..fbe1b3c65c 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_system_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_system_seat_names", st_collections_group_use_system_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},
@@ -4517,6 +4519,39 @@ st_collections_group_inherit_only(void)
/**
@page edcref
@property
+ use_system_seat_names
+ @parameters
+ [1 or 0]
+ @effect
+ This flags a group as designed to listen for multiseat signals
+ following Evas naming instead of default Edje naming.
+ Seats are named on Edje as "seat1", "seat2", etc, in an incremental
+ way and never are changed.
+ On Evas, names may be set on different places
+ (Evas, Ecore Evas backends, the application itself)
+ and name changes are allowed.
+ 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_system_seat_names(void)
+{
+ Edje_Part_Collection *pc;
+
+ check_arg_count(1);
+
+ pc = eina_list_data_get(eina_list_last(edje_collections));
+ pc->use_system_seat_names = parse_bool(0);
+}
+
+/**
+ @page edcref
+ @property
target_group
@parameters
[name] [part or program] (part or program) (part or program) ...
@@ -4692,6 +4727,7 @@ st_collections_group_inherit(void)
pc->prop.orientation = pc2->prop.orientation;
pc->lua_script_only = pc2->lua_script_only;
+ pc->use_system_seat_names = pc2->use_system_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..c1a9f4cf47 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_system_seat_names", use_system_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..b38a28fc31 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_system_seat_names)
+ BUF_APPENDF(I2 "use_system_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..15e45d3875 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_system_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)
@@ -585,6 +590,71 @@ _edje_device_removed_cb(void *data, const Efl_Event *event)
}
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)
{
const Eina_List *devices, *l;
@@ -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_system_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_system_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..808a3613ba 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_system_seat_names;
unsigned char checked : 1;
};