Evas: Add the default input devices for Evas.

This will be useful when Ecore_Evas is setting up the
EFL_POINTER/KEY_EVENT struct.
This commit is contained in:
Guilherme Iscaro 2016-10-19 15:57:18 -02:00 committed by Bruno Dilly
parent cb6b049987
commit 453770137f
4 changed files with 112 additions and 1 deletions

View File

@ -1116,6 +1116,16 @@ class Evas.Canvas (Efl.Object, Efl.Canvas, Efl.Animator, Efl.Input.Interface)
re-compute of that data etc.
]]
}
default_device_get {
[[Return the default device of a given type.
\@note Currently Evas only creates a seat, mouse and keyboard.
@since 1.19
]]
params {
@in type: Efl.Input.Device.Class; [[The class of the default device to fetch.]]
}
return: Efl.Input.Device; [[The default device or $null on error.]]
}
coord_world_y_to_screen @const {
[[Convert/scale a canvas coordinate into output screen
coordinates.

View File

@ -24,6 +24,53 @@
* here (callbacks and canvas private data).
*/
static Eina_Bool
_is_pointer(Evas_Device_Class clas)
{
if (clas == EVAS_DEVICE_CLASS_MOUSE ||
clas == EVAS_DEVICE_CLASS_TOUCH ||
clas == EVAS_DEVICE_CLASS_WAND ||
clas == EVAS_DEVICE_CLASS_PEN)
return EINA_TRUE;
return EINA_FALSE;
}
static Evas_Device *
_new_default_device_find(Evas_Public_Data *e, Evas_Device *old_dev)
{
Eina_List *l;
Evas_Device *dev, *def, *old_parent;
Evas_Device_Class old_class;
old_class = efl_input_device_type_get(old_dev);
old_parent = efl_input_device_parent_get(old_dev);
def = NULL;
EINA_LIST_FOREACH(e->devices, l, dev)
{
if (efl_input_device_type_get(dev) != old_class)
continue;
def = dev;
//Prefer devices with the same parent.
if (efl_input_device_parent_get(dev) == old_parent)
break;
}
if (!def)
{
const char *class_str;
if (old_class == EVAS_DEVICE_CLASS_SEAT)
class_str = "seat";
else if (old_class == EVAS_DEVICE_CLASS_KEYBOARD)
class_str = "keyboard";
else
class_str = "mouse";
WRN("Could not find a default %s device.", class_str);
}
return def;
}
static void
_del_cb(void *data, const Efl_Event *ev)
{
@ -31,6 +78,14 @@ _del_cb(void *data, const Efl_Event *ev)
// can not be done in std destructor
e->devices = eina_list_remove(e->devices, ev->object);
if (e->default_seat == ev->object)
e->default_seat = _new_default_device_find(e, ev->object);
else if (e->default_mouse == ev->object)
e->default_mouse = _new_default_device_find(e, ev->object);
else if (e->default_keyboard == ev->object)
e->default_keyboard = _new_default_device_find(e, ev->object);
efl_event_callback_call(e->evas, EFL_CANVAS_EVENT_DEVICE_REMOVED,
ev->object);
}
@ -66,6 +121,16 @@ evas_device_add_full(Evas *eo_e, const char *name, const char *desc,
d->evas = eo_e;
e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
/* This is the case when the user is using wayland backend,
since evas itself will not create the devices we must set them here. */
if (!e->default_seat && clas == EVAS_DEVICE_CLASS_SEAT)
e->default_seat = dev;
else if (!e->default_keyboard && clas == EVAS_DEVICE_CLASS_KEYBOARD)
e->default_keyboard = dev;
else if (!e->default_mouse && _is_pointer(clas))
e->default_mouse = dev;
e->devices = eina_list_append(e->devices, dev);
efl_event_callback_add(dev, EFL_EVENT_DEL, _del_cb, e);

View File

@ -410,6 +410,20 @@ _evas_canvas_coord_world_y_to_screen(const Eo *eo_e EINA_UNUSED, Evas_Public_Dat
else return (int)((((long long)y - (long long)e->viewport.y) * (long long)e->output.h) / (long long)e->viewport.h);
}
EOLIAN static Efl_Input_Device *
_evas_canvas_default_device_get(Eo *eo_e EINA_UNUSED,
Evas_Public_Data *e,
Efl_Input_Device_Class klass)
{
if (klass == EFL_INPUT_DEVICE_CLASS_SEAT)
return e->default_seat;
if (klass == EFL_INPUT_DEVICE_CLASS_MOUSE)
return e->default_mouse;
if (klass == EFL_INPUT_DEVICE_CLASS_KEYBOARD)
return e->default_keyboard;
return NULL;
}
EAPI int
evas_render_method_lookup(const char *name)
{
@ -807,7 +821,25 @@ evas_output_method_set(Evas *eo_e, int render_method)
evas_module_ref(em);
/* get the engine info struct */
if (e->engine.func->info) e->engine.info = e->engine.func->info(eo_e);
return;
//Wayland already handle seats.
if (render_method == evas_render_method_lookup("wayland_shm") ||
render_method == evas_render_method_lookup("wayland_egl"))
return;
e->default_seat = evas_device_add_full(eo_e, "default", "The default seat",
NULL, NULL, EVAS_DEVICE_CLASS_SEAT,
EVAS_DEVICE_SUBCLASS_NONE);
e->default_mouse = evas_device_add_full(eo_e, "keyboard",
"The default mouse",
e->default_seat, NULL,
EVAS_DEVICE_CLASS_MOUSE,
EVAS_DEVICE_SUBCLASS_NONE);
e->default_keyboard = evas_device_add_full(eo_e, "keyboard",
"The default keyboard",
e->default_seat, NULL,
EVAS_DEVICE_CLASS_KEYBOARD,
EVAS_DEVICE_SUBCLASS_NONE);
}
EAPI int

View File

@ -905,6 +905,10 @@ struct _Evas_Public_Data
Eina_List *outputs;
Evas_Device *default_seat;
Evas_Device *default_mouse;
Evas_Device *default_keyboard;
unsigned char changed : 1;
unsigned char delete_me : 1;
unsigned char invalidate : 1;