{
ecore_event_evas_modifier_lock_update(lookup->evas, e->modifiers);
if (press == ECORE_DOWN)
- evas_event_feed_mouse_down(lookup->evas, e->buttons, flags,
- e->timestamp, NULL);
+ {
+ if (evas_device_class_get(dev) & ECORE_DEVICE_TOUCH)
+ {
+ if (lookup->down_multi)
+ lookup->down_multi(lookup->window, e->multi.device,
+ e->x, e->y, e->multi.radius,
+ e->multi.radius_x, e->multi.radius_y,
+ e->multi.pressure, e->multi.angle,
+ e->multi.x, e->multi.y, flags,
+ e->timestamp);
+ else
+ evas_event_input_multi_down(lookup->evas, e->multi.device,
+ e->x, e->y, e->multi.radius,
+ e->multi.radius_x, e->multi.radius_y,
+ e->multi.pressure, e->multi.angle,
+ e->multi.x, e->multi.y, flags,
+ e->timestamp, NULL);
+ }
+ evas_event_feed_mouse_down(lookup->evas, e->buttons, flags,
+ e->timestamp, NULL);
+ }
else
- evas_event_feed_mouse_up(lookup->evas, e->buttons, flags,
- e->timestamp, NULL);
+ {
+ if (evas_device_class_get(dev) & ECORE_DEVICE_TOUCH)
+ {
+ if (lookup->up_multi)
+ lookup->up_multi(lookup->window, e->multi.device,
+ e->x, e->y, e->multi.radius,
+ e->multi.radius_x, e->multi.radius_y,
+ e->multi.pressure, e->multi.angle,
+ e->multi.x, e->multi.y, flags,
+ e->timestamp);
+ else
+ evas_event_input_multi_up(lookup->evas, e->multi.device,
+ e->x, e->y, e->multi.radius,
+ e->multi.radius_x, e->multi.radius_y,
+ e->multi.pressure, e->multi.angle,
+ e->multi.x, e->multi.y, flags,
+ e->timestamp, NULL);
+ }
+ evas_event_feed_mouse_up(lookup->evas, e->buttons, flags,
+ e->timestamp, NULL);
+ }
}
else
{
{
_ecore_event_evas_push_mouse_move(e);
ecore_event_evas_modifier_lock_update(lookup->evas, e->modifiers);
+
+ if (evas_device_class_get(dev) & ECORE_DEVICE_TOUCH)
+ {
+ if (lookup->move_multi)
+ lookup->move_multi(lookup->window, e->multi.device,
+ e->x, e->y, e->multi.radius,
+ e->multi.radius_x, e->multi.radius_y,
+ e->multi.pressure, e->multi.angle,
+ e->multi.x, e->multi.y, e->timestamp);
+ else
+ evas_event_input_multi_move(lookup->evas, e->multi.device,
+ e->x, e->y, e->multi.radius,
+ e->multi.radius_x, e->multi.radius_y,
+ e->multi.pressure, e->multi.angle,
+ e->multi.x, e->multi.y, e->timestamp,
+ NULL);
+ }
+
if (lookup->move_mouse)
lookup->move_mouse(lookup->window, e->x, e->y, e->timestamp);
else
_ecore_wl_input_focus_out_send(input, win, input->timestamp);
}
+static void
+_ecore_wl_input_touch_axis_process(Ecore_Wl_Input *input, int id)
+{
+ if (id >= ECORE_WL_TOUCH_MAX)
+ return;
+
+ if (input->last_radius_x)
+ {
+ input->touch_axis[id].radius_x = input->last_radius_x;
+ input->last_radius_x = 0.0;
+ }
+ if (input->last_radius_y)
+ {
+ input->touch_axis[id].radius_y = input->last_radius_y;
+ input->last_radius_y = 0.0;
+ }
+ if (input->last_pressure)
+ {
+ input->touch_axis[id].pressure = input->last_pressure;
+ input->last_pressure = 0.0;
+ }
+ if (input->last_angle)
+ {
+ input->touch_axis[id].angle = input->last_angle;
+ input->last_angle = 0.0;
+ }
+}
+
+static double
+_ecore_wl_input_touch_radius_calc(double x, double y)
+{
+#define PI 3.14159265358979323846
+ return x*y*PI;
+}
+
static void
_ecore_wl_input_cb_touch_down(void *data, struct wl_touch *touch EINA_UNUSED, unsigned int serial, unsigned int timestamp, struct wl_surface *surface, int id, wl_fixed_t x, wl_fixed_t y)
{
input->display->serial = serial;
input->sx = wl_fixed_to_int(x);
input->sy = wl_fixed_to_int(y);
+ _ecore_wl_input_touch_axis_process(input, id);
+
if (input->touch_focus != win)
{
input->touch_focus = win;
input->timestamp = timestamp;
input->sx = wl_fixed_to_int(x);
input->sy = wl_fixed_to_int(y);
+ _ecore_wl_input_touch_axis_process(input, id);
_ecore_wl_input_mouse_move_send(input, input->touch_focus, timestamp, id);
}
ev->root.y = input->sy;
ev->modifiers = input->modifiers;
ev->multi.device = device;
- ev->multi.radius = 1;
- ev->multi.radius_x = 1;
- ev->multi.radius_y = 1;
- ev->multi.pressure = 1.0;
- ev->multi.angle = 0.0;
+ if (device >= ECORE_WL_TOUCH_MAX)
+ {
+ ev->multi.radius = 1.0;
+ ev->multi.radius_x = 1.0;
+ ev->multi.radius_y = 1.0;
+ ev->multi.pressure = 1.0;
+ ev->multi.angle = 0.0;
+ }
+ else
+ {
+ ev->multi.radius =
+ _ecore_wl_input_touch_radius_calc(input->touch_axis[device].radius_x,
+ input->touch_axis[device].radius_y);
+ ev->multi.radius_x = input->touch_axis[device].radius_x;
+ ev->multi.radius_y = input->touch_axis[device].radius_y;
+ ev->multi.pressure = input->touch_axis[device].pressure;
+ ev->multi.angle = input->touch_axis[device].angle;
+ }
ev->multi.x = input->sx;
ev->multi.y = input->sy;
ev->multi.root.x = input->sx;
}
ev->multi.device = device;
- ev->multi.radius = 1;
- ev->multi.radius_x = 1;
- ev->multi.radius_y = 1;
- ev->multi.pressure = 1.0;
- ev->multi.angle = 0.0;
+ if (device >= ECORE_WL_TOUCH_MAX)
+ {
+ ev->multi.radius = 1.0;
+ ev->multi.radius_x = 1.0;
+ ev->multi.radius_y = 1.0;
+ ev->multi.pressure = 1.0;
+ ev->multi.angle = 0.0;
+ }
+ else
+ {
+ ev->multi.radius =
+ _ecore_wl_input_touch_radius_calc(input->touch_axis[device].radius_x,
+ input->touch_axis[device].radius_y);
+ ev->multi.radius_x = input->touch_axis[device].radius_x;
+ ev->multi.radius_y = input->touch_axis[device].radius_y;
+ ev->multi.pressure = input->touch_axis[device].pressure;
+ ev->multi.angle = input->touch_axis[device].angle;
+ }
ev->multi.x = input->sx;
ev->multi.y = input->sy;
ev->multi.root.x = input->sx;
ev->multi.root.x = input->sx;
ev->multi.root.y = input->sy;
ev->dev_name = input->last_device_name;
+ if (device < ECORE_WL_TOUCH_MAX)
+ {
+ input->touch_axis[device].radius_x = 1.0;
+ input->touch_axis[device].radius_y = 1.0;
+ input->touch_axis[device].pressure = 1.0;
+ input->touch_axis[device].angle = 0;
+ }
if (win)
{
}
static void
-_ecore_wl_input_device_cb_axis(void *data EINA_UNUSED, struct tizen_input_device *tizen_input_device EINA_UNUSED, uint32_t axis_type EINA_UNUSED, wl_fixed_t value EINA_UNUSED)
+_ecore_wl_input_device_cb_axis(void *data EINA_UNUSED, struct tizen_input_device *tizen_input_device EINA_UNUSED, uint32_t axis_type, wl_fixed_t value)
{
+ Ecore_Wl_Input *input = _ecore_wl_disp->input;
+ double dvalue = wl_fixed_to_double(value);
+
+ switch (axis_type)
+ {
+ case TIZEN_INPUT_DEVICE_AXIS_TYPE_RADIUS_X:
+ input->last_radius_x = dvalue;
+ break;
+ case TIZEN_INPUT_DEVICE_AXIS_TYPE_RADIUS_Y:
+ input->last_radius_y = dvalue;
+ break;
+ case TIZEN_INPUT_DEVICE_AXIS_TYPE_PRESSURE:
+ input->last_pressure = dvalue;
+ break;
+ case TIZEN_INPUT_DEVICE_AXIS_TYPE_ANGLE:
+ input->last_angle = dvalue;
+ break;
+ default:
+ WRN("Invalid type(%d) is ignored.\n", axis_type);
+ break;
+ }
return;
}