Ecore_Wayland: Implement handling Touch Events.

NB: None of the touch code has been tested yet.



SVN revision: 67169
This commit is contained in:
Christopher Michael 2012-01-13 01:26:52 +00:00
parent ce12a4481b
commit a2e9465376
1 changed files with 171 additions and 5 deletions

View File

@ -38,6 +38,11 @@ static void _ecore_wl_cb_handle_button(void *data __UNUSED__, struct wl_input_de
static void _ecore_wl_cb_handle_key(void *data __UNUSED__, struct wl_input_device *dev, uint32_t t __UNUSED__, uint32_t key, uint32_t state);
static void _ecore_wl_cb_handle_pointer_focus(void *data __UNUSED__, struct wl_input_device *dev, uint32_t t, struct wl_surface *surface, int32_t x, int32_t y, int32_t sx, int32_t sy);
static void _ecore_wl_cb_handle_keyboard_focus(void *data __UNUSED__, struct wl_input_device *dev, uint32_t t __UNUSED__, struct wl_surface *surface, struct wl_array *keys);
static void _ecore_wl_cb_handle_touch_down(void *data __UNUSED__, struct wl_input_device *dev __UNUSED__, uint32_t timestamp, struct wl_surface *surface, int32_t id, int32_t x, int32_t y);
static void _ecore_wl_cb_handle_touch_up(void *data __UNUSED__, struct wl_input_device *dev __UNUSED__, uint32_t timestamp, int32_t id);
static void _ecore_wl_cb_handle_touch_motion(void *data __UNUSED__, struct wl_input_device *dev __UNUSED__, uint32_t timestamp, int32_t id, int32_t x, int32_t y);
static void _ecore_wl_cb_handle_touch_frame(void *data __UNUSED__, struct wl_input_device *dev __UNUSED__);
static void _ecore_wl_cb_handle_touch_cancel(void *data __UNUSED__, struct wl_input_device *dev __UNUSED__);
static void _ecore_wl_mouse_move_send(uint32_t timestamp);
static void _ecore_wl_mouse_out_send(struct wl_surface *surface, uint32_t timestamp);
@ -58,6 +63,8 @@ static int _ecore_wl_screen_x = 0;
static int _ecore_wl_screen_y = 0;
static int _ecore_wl_surface_x = 0;
static int _ecore_wl_surface_y = 0;
static int _ecore_wl_touch_x = 0;
static int _ecore_wl_touch_y = 0;
static int _ecore_wl_input_modifiers = 0;
static struct xkb_desc *_ecore_wl_xkb;
static uint32_t _ecore_wl_input_button = 0;
@ -68,6 +75,7 @@ static struct wl_shell *_ecore_wl_shell;
static struct wl_output *_ecore_wl_output;
static struct wl_input_device *_ecore_wl_input;
static struct wl_surface *_ecore_wl_input_surface;
static struct wl_surface *_ecore_wl_touch_surface;
static struct wl_data_device_manager *_ecore_wl_dnd_manager;
static struct wl_data_device *_ecore_wl_dnd_dev;
@ -87,11 +95,11 @@ static const struct wl_input_device_listener _ecore_wl_input_listener =
_ecore_wl_cb_handle_key,
_ecore_wl_cb_handle_pointer_focus,
_ecore_wl_cb_handle_keyboard_focus,
NULL, // touch down
NULL, // touch up
NULL, // touch motion
NULL, // touch frame
NULL, // touch cancel
_ecore_wl_cb_handle_touch_down,
_ecore_wl_cb_handle_touch_up,
_ecore_wl_cb_handle_touch_motion,
_ecore_wl_cb_handle_touch_frame,
_ecore_wl_cb_handle_touch_cancel,
};
/* static const struct wl_data_source_listener _ecore_wl_dnd_listener = */
/* { */
@ -594,6 +602,164 @@ _ecore_wl_cb_handle_keyboard_focus(void *data __UNUSED__, struct wl_input_device
}
}
static void
_ecore_wl_cb_handle_touch_down(void *data __UNUSED__, struct wl_input_device *dev __UNUSED__, uint32_t timestamp, struct wl_surface *surface, int32_t id, int32_t x, int32_t y)
{
Ecore_Event_Mouse_Button *ev;
_ecore_wl_touch_surface = surface;
_ecore_wl_touch_x = x;
_ecore_wl_touch_y = y;
if (!(ev = malloc(sizeof(Ecore_Event_Mouse_Button)))) return;
ev->timestamp = timestamp;
/* NB: Need to verify using x,y for these */
ev->x = x;
ev->y = y;
ev->root.x = x;
ev->root.y = y;
ev->modifiers = 0;
ev->buttons = 0;
ev->same_screen = 1;
/* FIXME: Need to get these from Wayland somehow */
ev->double_click = 0;
ev->triple_click = 0;
ev->multi.device = id;
ev->multi.radius = 1;
ev->multi.radius_x = 1;
ev->multi.radius_y = 1;
ev->multi.pressure = 1.0;
ev->multi.angle = 0.0;
/* NB: Need to verify using x,y for these */
ev->multi.x = x;
ev->multi.y = y;
ev->multi.root.x = x;
ev->multi.root.y = y;
{
unsigned int id = 0;
if ((id = (unsigned int)wl_surface_get_user_data(surface)))
{
ev->window = id;
ev->event_window = id;
}
}
ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, ev, NULL, NULL);
}
static void
_ecore_wl_cb_handle_touch_up(void *data __UNUSED__, struct wl_input_device *dev __UNUSED__, uint32_t timestamp, int32_t id)
{
Ecore_Event_Mouse_Button *ev;
if (!(ev = malloc(sizeof(Ecore_Event_Mouse_Button)))) return;
ev->timestamp = timestamp;
/* TODO: Need to verify using x,y for these */
ev->x = _ecore_wl_touch_x;
ev->y = _ecore_wl_touch_y;
ev->root.x = _ecore_wl_touch_x;
ev->root.y = _ecore_wl_touch_y;
ev->modifiers = 0;
ev->buttons = 0;
ev->same_screen = 1;
/* FIXME: Need to get these from Wayland somehow */
ev->double_click = 0;
ev->triple_click = 0;
ev->multi.device = id;
ev->multi.radius = 1;
ev->multi.radius_x = 1;
ev->multi.radius_y = 1;
ev->multi.pressure = 1.0;
ev->multi.angle = 0.0;
/* TODO: Need to verify using x,y for these */
ev->multi.x = _ecore_wl_touch_x;
ev->multi.y = _ecore_wl_touch_y;
ev->multi.root.x = _ecore_wl_touch_x;
ev->multi.root.y = _ecore_wl_touch_y;
{
unsigned int id = 0;
if ((id = (unsigned int)wl_surface_get_user_data(_ecore_wl_touch_surface)))
{
ev->window = id;
ev->event_window = id;
}
}
_ecore_wl_touch_surface = NULL;
ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_UP, ev, NULL, NULL);
}
static void
_ecore_wl_cb_handle_touch_motion(void *data __UNUSED__, struct wl_input_device *dev __UNUSED__, uint32_t timestamp, int32_t id, int32_t x, int32_t y)
{
Ecore_Event_Mouse_Move *ev;
if (!_ecore_wl_touch_surface) return;
if (!(ev = malloc(sizeof(Ecore_Event_Mouse_Move)))) return;
ev->timestamp = timestamp;
/* TODO: Need to verify using x,y for these */
ev->x = x;
ev->y = y;
ev->root.x = x;
ev->root.y = y;
ev->modifiers = 0; //_ecore_wl_input_modifiers;
ev->same_screen = 1;
ev->multi.device = id;
ev->multi.radius = 1;
ev->multi.radius_x = 1;
ev->multi.radius_y = 1;
ev->multi.pressure = 1.0;
ev->multi.angle = 0.0;
/* TODO: Need to verify using x,y for these */
ev->multi.x = x;
ev->multi.y = y;
ev->multi.root.x = x;
ev->multi.root.y = y;
{
unsigned int id = 0;
if ((id = (unsigned int)wl_surface_get_user_data(_ecore_wl_touch_surface)))
{
ev->window = id;
ev->event_window = id;
}
}
ecore_event_add(ECORE_EVENT_MOUSE_MOVE, ev, NULL, NULL);
}
static void
_ecore_wl_cb_handle_touch_frame(void *data __UNUSED__, struct wl_input_device *dev __UNUSED__)
{
/* FIXME: Need to get a device and actually test what happens here */
}
static void
_ecore_wl_cb_handle_touch_cancel(void *data __UNUSED__, struct wl_input_device *dev __UNUSED__)
{
/* FIXME: Need to get a device and actually test what happens here */
_ecore_wl_touch_surface = NULL;
}
static void
_ecore_wl_mouse_move_send(uint32_t timestamp)
{