evas events: Fix axis input values

This adds support for distance, pressure, tilt and twist.
Not entirely sure if normalized & raw (x,y) should be exposed
in the eo interface. Also not sure what to do with tilt_x/y
(as used by libinput) or touch/tool width "major/minor" vs.
radius x/y.

Add debug logs in the example, including the distance.
I can't test most of these values due to a lack of compatible
hardware, but the most basic features seem to work :)
This commit is contained in:
Jean-Philippe Andre 2016-08-31 13:35:15 +09:00
parent caf237abdf
commit b675571bd8
5 changed files with 99 additions and 13 deletions

View File

@ -262,7 +262,7 @@ _axis_update_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EI
{
Evas_Event_Axis_Update *ev = event_info;
float twist = 0, azimuth = 0, tilt = 0;
float pressure = 1;
float pressure = 1, distance = 0;
int i;
for (i = 0; i < ev->naxis; i++)
@ -274,10 +274,13 @@ _axis_update_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EI
case EVAS_AXIS_LABEL_TWIST: twist = val; break;
case EVAS_AXIS_LABEL_AZIMUTH: azimuth = val; break;
case EVAS_AXIS_LABEL_TILT: tilt = val; break;
case EVAS_AXIS_LABEL_DISTANCE: distance = val; break;
default: break;
}
}
printf("distance %.2f, pressure %.2f, twist %.2f, azimuth %.2f, tilt %.2f\n",
distance, pressure, twist, azimuth, tilt);
_mouse_update_handle(ev->toolid, azimuth, tilt, twist, pressure);
}

View File

@ -4568,6 +4568,8 @@ _direct_axis_update_cb(Ecore_Evas *ee, const Ecore_Event_Axis_Update *info)
_efl_input_value_mark(ev, EFL_INPUT_VALUE_X);
x = axis->value;
}
ev->raw.x = axis->value;
ev->has_raw = EINA_TRUE;
break;
case EVAS_AXIS_LABEL_Y:
@ -4576,14 +4578,18 @@ _direct_axis_update_cb(Ecore_Evas *ee, const Ecore_Event_Axis_Update *info)
_efl_input_value_mark(ev, EFL_INPUT_VALUE_Y);
y = axis->value;
}
ev->raw.y = axis->value;
ev->has_raw = EINA_TRUE;
break;
case EVAS_AXIS_LABEL_NORMAL_X:
ev->raw.x = axis->value;
ev->norm.x = axis->value;
ev->has_norm = EINA_TRUE;
break;
case EVAS_AXIS_LABEL_NORMAL_Y:
ev->raw.y = axis->value;
ev->norm.y = axis->value;
ev->has_norm = EINA_TRUE;
break;
case EVAS_AXIS_LABEL_PRESSURE:
@ -4592,10 +4598,24 @@ _direct_axis_update_cb(Ecore_Evas *ee, const Ecore_Event_Axis_Update *info)
break;
case EVAS_AXIS_LABEL_DISTANCE:
_efl_input_value_mark(ev, EFL_INPUT_VALUE_DISTANCE);
ev->distance = axis->value;
break;
case EVAS_AXIS_LABEL_AZIMUTH:
_efl_input_value_mark(ev, EFL_INPUT_VALUE_AZIMUTH);
ev->azimuth = axis->value;
break;
case EVAS_AXIS_LABEL_TILT:
_efl_input_value_mark(ev, EFL_INPUT_VALUE_TILT);
ev->tilt = axis->value;
break;
case EVAS_AXIS_LABEL_TWIST:
// TODO
_efl_input_value_mark(ev, EFL_INPUT_VALUE_TWIST);
ev->twist = axis->value;
break;
case EVAS_AXIS_LABEL_UNKNOWN:
case EVAS_AXIS_LABEL_TOUCH_WIDTH_MAJOR:

View File

@ -31,9 +31,9 @@ struct _Efl_Input_Pointer_Data
unsigned int pressed_buttons;
int tool; /* finger or tool ID */
double radius, radius_x, radius_y;
double pressure;
double pressure, distance, azimuth, tilt, twist;
double angle;
Eina_Vector2 cur, prev, raw;
Eina_Vector2 cur, prev, raw, norm;
struct {
Efl_Orient dir;
int z;
@ -50,6 +50,8 @@ struct _Efl_Input_Pointer_Data
Evas_Lock *locks;
void *legacy; /* DO NOT TOUCH THIS */
uint32_t value_flags;
Eina_Bool has_norm : 1; /* not in value_flags */
Eina_Bool has_raw : 1; /* not in value_flags */
Eina_Bool evas_done : 1; /* set by evas */
Eina_Bool fake : 1;
Eina_Bool win_fed : 1;

View File

@ -3033,6 +3033,8 @@ evas_event_feed_axis_update(Evas *eo_e, unsigned int timestamp, int device, int
_efl_input_value_mark(ev, EFL_INPUT_VALUE_X);
x = axis->value;
}
ev->raw.x = axis->value;
ev->has_raw = EINA_TRUE;
break;
case EVAS_AXIS_LABEL_Y:
@ -3041,14 +3043,18 @@ evas_event_feed_axis_update(Evas *eo_e, unsigned int timestamp, int device, int
_efl_input_value_mark(ev, EFL_INPUT_VALUE_Y);
y = axis->value;
}
ev->raw.y = axis->value;
ev->has_raw = EINA_TRUE;
break;
case EVAS_AXIS_LABEL_NORMAL_X:
ev->raw.x = axis->value;
ev->norm.x = axis->value;
ev->has_norm = EINA_TRUE;
break;
case EVAS_AXIS_LABEL_NORMAL_Y:
ev->raw.y = axis->value;
ev->norm.y = axis->value;
ev->has_norm = EINA_TRUE;
break;
case EVAS_AXIS_LABEL_PRESSURE:
@ -3057,10 +3063,24 @@ evas_event_feed_axis_update(Evas *eo_e, unsigned int timestamp, int device, int
break;
case EVAS_AXIS_LABEL_DISTANCE:
_efl_input_value_mark(ev, EFL_INPUT_VALUE_DISTANCE);
ev->distance = axis->value;
break;
case EVAS_AXIS_LABEL_AZIMUTH:
_efl_input_value_mark(ev, EFL_INPUT_VALUE_AZIMUTH);
ev->azimuth = axis->value;
break;
case EVAS_AXIS_LABEL_TILT:
_efl_input_value_mark(ev, EFL_INPUT_VALUE_TILT);
ev->tilt = axis->value;
break;
case EVAS_AXIS_LABEL_TWIST:
// TODO
_efl_input_value_mark(ev, EFL_INPUT_VALUE_TWIST);
ev->twist = axis->value;
break;
case EVAS_AXIS_LABEL_UNKNOWN:
case EVAS_AXIS_LABEL_TOUCH_WIDTH_MAJOR:

View File

@ -268,20 +268,61 @@ efl_input_pointer_legacy_info_fill(Efl_Input_Key *evt, Evas_Callback_Type type,
/* FIXME: Get device id from above device object. 0 for now. */
e->device = 0;
e->toolid = ev->tool;
e->axis = malloc(sizeof(Evas_Axis) * 3);
e->axis[e->naxis].label = EVAS_AXIS_LABEL_X;
e->axis = malloc(sizeof(Evas_Axis) * 11);
e->axis[e->naxis].label = EVAS_AXIS_LABEL_WINDOW_X;
e->axis[e->naxis].value = ev->cur.x;
e->naxis++;
e->axis[e->naxis].label = EVAS_AXIS_LABEL_Y;
e->axis[e->naxis].label = EVAS_AXIS_LABEL_WINDOW_Y;
e->axis[e->naxis].value = ev->cur.y;
e->naxis++;
if (ev->has_raw)
{
e->axis[e->naxis].label = EVAS_AXIS_LABEL_X;
e->axis[e->naxis].value = ev->raw.x;
e->naxis++;
e->axis[e->naxis].label = EVAS_AXIS_LABEL_Y;
e->axis[e->naxis].value = ev->raw.y;
e->naxis++;
}
if (ev->has_norm)
{
e->axis[e->naxis].label = EVAS_AXIS_LABEL_NORMAL_X;
e->axis[e->naxis].value = ev->norm.x;
e->naxis++;
e->axis[e->naxis].label = EVAS_AXIS_LABEL_NORMAL_Y;
e->axis[e->naxis].value = ev->norm.y;
e->naxis++;
}
if (_efl_input_value_has(ev, EFL_INPUT_VALUE_PRESSURE))
{
e->axis[e->naxis].label = EVAS_AXIS_LABEL_PRESSURE;
e->axis[e->naxis].value = ev->pressure;
e->naxis++;
}
// TODO: distance, azimuth, tild, twist
if (_efl_input_value_has(ev, EFL_INPUT_VALUE_DISTANCE))
{
e->axis[e->naxis].label = EVAS_AXIS_LABEL_DISTANCE;
e->axis[e->naxis].value = ev->distance;
e->naxis++;
}
if (_efl_input_value_has(ev, EFL_INPUT_VALUE_AZIMUTH))
{
e->axis[e->naxis].label = EVAS_AXIS_LABEL_AZIMUTH;
e->axis[e->naxis].value = ev->azimuth;
e->naxis++;
}
if (_efl_input_value_has(ev, EFL_INPUT_VALUE_TILT))
{
e->axis[e->naxis].label = EVAS_AXIS_LABEL_TILT;
e->axis[e->naxis].value = ev->tilt;
e->naxis++;
}
if (_efl_input_value_has(ev, EFL_INPUT_VALUE_TWIST))
{
e->axis[e->naxis].label = EVAS_AXIS_LABEL_TWIST;
e->axis[e->naxis].value = ev->twist;
e->naxis++;
}
tmp_axis = realloc(e->axis, e->naxis * sizeof(Evas_Axis));
if (tmp_axis) e->axis = tmp_axis;
if (pflags) *pflags = NULL;