forked from enlightenment/efl
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:
parent
caf237abdf
commit
b675571bd8
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue