From 554433941f3301282887b920bdc1c9437cc6710f Mon Sep 17 00:00:00 2001 From: Sung-Jin Park Date: Tue, 30 May 2017 13:44:33 +0900 Subject: [PATCH] headless-server: implement basic input event handlers Change-Id: I757ad5825ea5c196b6ef6d22911dfabeb920000e Signed-off-by: Sung-Jin Park --- src/samples/headless-server.c | 227 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 202 insertions(+), 25 deletions(-) diff --git a/src/samples/headless-server.c b/src/samples/headless-server.c index 9c6f2fe..ab1cfe0 100644 --- a/src/samples/headless-server.c +++ b/src/samples/headless-server.c @@ -1,77 +1,252 @@ #include +#include #include #include #include +/* basic pepper objects */ +pepper_seat_t *seat = NULL; +pepper_evdev_t *evdev = NULL; +pepper_keyrouter_t *keyrouter = NULL; +pepper_compositor_t *compositor = NULL; +pepper_input_device_t *input_device = NULL; + +/* event listeners */ +pepper_event_listener_t *listener_seat_add = NULL; +pepper_event_listener_t *listener_input_add = NULL; +pepper_event_listener_t *listener_input_remove = NULL; +pepper_event_listener_t *listener_keyboard_add = NULL; +pepper_event_listener_t *listener_keyboard_event = NULL; +pepper_event_listener_t *listener_pointer_add = NULL; +pepper_event_listener_t *listener_pointer_event = NULL; +pepper_event_listener_t *listener_touch_add = NULL; +pepper_event_listener_t *listener_touch_event = NULL; + +/* pointer event handler */ static void -_seat_add(pepper_event_listener_t *listener, pepper_object_t *object, uint32_t id, void *info, void *data) +_handle_pointer_event(pepper_event_listener_t *listener, pepper_object_t *object, uint32_t id, void *info, void *data) +{ + pepper_input_event_t *event; + + PEPPER_CHECK((id >= PEPPER_EVENT_POINTER_MOTION && id <= PEPPER_EVENT_POINTER_AXIS), return, "unknown event %d !\n", id); + PEPPER_CHECK(info, return, "Invalid event !\n"); + PEPPER_CHECK(data, return, "Invalid data !\n"); + + event = (pepper_input_event_t *)info; + + /* TODO: */ + (void) event; + + switch (id) + { + case PEPPER_EVENT_POINTER_MOTION: + /* TODO: */ + PEPPER_TRACE("[%s] PEPPER_EVENT_POINTER_MOTION\n", __FUNCTION__); + break; + case PEPPER_EVENT_POINTER_MOTION_ABSOLUTE: + /* TODO: */ + PEPPER_TRACE("[%s] PEPPER_EVENT_POINTER_MOTION_ABSOLUTE\n", __FUNCTION__); + break; + case PEPPER_EVENT_POINTER_BUTTON: + /* TODO: */ + PEPPER_TRACE("[%s] PEPPER_EVENT_POINTER_BUTTON\n", __FUNCTION__); + break; + case PEPPER_EVENT_POINTER_AXIS: + /* TODO: */ + PEPPER_TRACE("[%s] PEPPER_EVENT_POINTER_AXIS\n", __FUNCTION__); + break; + default: + break; + } +} + +/* touch event handler */ +static void +_handle_touch_event(pepper_event_listener_t *listener, pepper_object_t *object, uint32_t id, void *info, void *data) +{ + pepper_input_event_t *event; + + PEPPER_CHECK((id >= PEPPER_EVENT_TOUCH_DOWN && id <= PEPPER_EVENT_TOUCH_CANCEL), return, "unknown event %d !\n", id); + PEPPER_CHECK(info, return, "Invalid event !\n"); + PEPPER_CHECK(data, return, "Invalid data !\n"); + + event = (pepper_input_event_t *)info; + + /* TODO: */ + (void) event; + + switch (id) + { + case PEPPER_EVENT_TOUCH_DOWN: + /* TODO: */ + PEPPER_TRACE("[%s] PEPPER_EVENT_TOUCH_DOWN\n", __FUNCTION__); + break; + case PEPPER_EVENT_TOUCH_UP: + /* TODO: */ + PEPPER_TRACE("[%s] PEPPER_EVENT_TOUCH_UP\n", __FUNCTION__); + break; + case PEPPER_EVENT_TOUCH_MOTION: + /* TODO: */ + PEPPER_TRACE("[%s] PEPPER_EVENT_TOUCH_MOTION\n", __FUNCTION__); + break; + case PEPPER_EVENT_TOUCH_FRAME: + /* TODO: */ + PEPPER_TRACE("[%s] PEPPER_EVENT_TOUCH_FRAME\n", __FUNCTION__); + break; + case PEPPER_EVENT_TOUCH_CANCEL: + /* TODO: */ + PEPPER_TRACE("[%s] PEPPER_EVENT_TOUCH_CANCEL\n", __FUNCTION__); + break; + default: + break; + } +} + +/* seat keyboard add event handler */ +static void +_handle_seat_keyboard_add(pepper_event_listener_t *listener, pepper_object_t *object, uint32_t id, void *info, void *data) +{ + pepper_keyboard_t *keyboard = (pepper_keyboard_t *)info; + + PEPPER_TRACE("[%s] keyboard added\n", __FUNCTION__); + + pepper_keyboard_set_keymap_info(keyboard, WL_KEYBOARD_KEYMAP_FORMAT_NO_KEYMAP, -1, 0); + + listener_keyboard_event = pepper_object_add_event_listener((pepper_object_t *)keyboard, + PEPPER_EVENT_KEYBOARD_KEY, + 0, + pepper_keyrouter_event_handler, + (void *)keyrouter); +} + +/* seat pointer add event handler */ +static void +_handle_seat_pointer_add(pepper_event_listener_t *listener, pepper_object_t *object, uint32_t id, void *info, void *data) +{ + pepper_pointer_t *pointer = (pepper_pointer_t *)info; + + PEPPER_TRACE("[%s] pointer added\n", __FUNCTION__); + + listener_pointer_event = pepper_object_add_event_listener((pepper_object_t *)pointer, + PEPPER_EVENT_POINTER_MOTION + | PEPPER_EVENT_POINTER_MOTION_ABSOLUTE + | PEPPER_EVENT_POINTER_BUTTON + | PEPPER_EVENT_POINTER_AXIS, + 0, + _handle_pointer_event, + /*compositor*/ data); +} + +/* seat touch add event handler */ +static void +_handle_seat_touch_add(pepper_event_listener_t *listener, pepper_object_t *object, uint32_t id, void *info, void *data) +{ + pepper_touch_t *touch = (pepper_touch_t *)info; + + PEPPER_TRACE("[%s] touch added\n", __FUNCTION__); + + listener_touch_event = pepper_object_add_event_listener((pepper_object_t *)touch, + PEPPER_EVENT_TOUCH_DOWN + | PEPPER_EVENT_TOUCH_UP + | PEPPER_EVENT_TOUCH_MOTION + | PEPPER_EVENT_TOUCH_FRAME + | PEPPER_EVENT_TOUCH_CANCEL, + 0, + _handle_touch_event, + /*compositor*/ data); +} + +/* seat add event handler */ +static void +_handle_seat_add(pepper_event_listener_t *listener, pepper_object_t *object, uint32_t id, void *info, void *data) { pepper_seat_t *seat = (pepper_seat_t *)info; PEPPER_TRACE("[%s] seat added. name:%s\n", __FUNCTION__, pepper_seat_get_name(seat)); + + listener_keyboard_add = pepper_object_add_event_listener((pepper_object_t *)seat, + PEPPER_EVENT_SEAT_KEYBOARD_ADD, + 0, + _handle_seat_keyboard_add, /*compositor*/ data); + + listener_pointer_add = pepper_object_add_event_listener((pepper_object_t *)seat, + PEPPER_EVENT_SEAT_POINTER_ADD, + 0, + _handle_seat_pointer_add, /*compositor*/ data); + + listener_touch_add = pepper_object_add_event_listener((pepper_object_t *)seat, + PEPPER_EVENT_SEAT_TOUCH_ADD, + 0, + _handle_seat_touch_add, /*compositor*/ data); + } +/* compositor input device add event handler */ static void -_input_device_add(pepper_event_listener_t *listener, pepper_object_t *object, uint32_t id, void *info, void *data) +_handle_input_device_add(pepper_event_listener_t *listener, pepper_object_t *object, uint32_t id, void *info, void *data) { pepper_input_device_t *device = (pepper_input_device_t *)info; PEPPER_TRACE("[%s] input device added.\n", __FUNCTION__); + + if (seat) + pepper_seat_add_input_device(seat, device); } +/* compositor input deviec remove event handler */ static void -_input_device_remove(pepper_event_listener_t *listener, pepper_object_t *object, uint32_t id, void *info, void *data) +_handle_input_device_remove(pepper_event_listener_t *listener, pepper_object_t *object, uint32_t id, void *info, void *data) { pepper_input_device_t *device = (pepper_input_device_t *)info; PEPPER_TRACE("[%s] input device removed.\n", __FUNCTION__); + + if (seat) + pepper_seat_remove_input_device(seat, device); } int main(int argc, char *argv[]) { - int ret = EXIT_SUCCESS; uint32_t caps = 0; uint32_t probed = 0; + int ret = EXIT_SUCCESS; const char* socket_name = NULL; const char* seat_name = NULL; - pepper_compositor_t *compositor = NULL; - pepper_keyrouter_t *keyrouter = NULL; - pepper_seat_t *seat = NULL; - pepper_input_device_t *input_device = NULL; - - pepper_event_listener_t *listener_seat_add = NULL; - pepper_event_listener_t *listener_input_add = NULL; - pepper_event_listener_t *listener_input_remove = NULL; - socket_name = getenv("WAYLAND_DISPLAY"); - if (socket_name) - socket_name = "wayland-0"; + if (!socket_name) + socket_name = "headless-0"; + + if (!getenv("XDG_RUNTIME_DIR")) + setenv("XDG_RUNTIME_DIR", "/run", 1); /* create pepper compositor */ compositor = pepper_compositor_create(socket_name); PEPPER_CHECK(compositor, return EXIT_FAILURE, "Failed to create compositor !\n"); - /* register event handlers */ - listener_seat_add = pepper_object_add_event_listener(compositor, - PEPPER_EVENT_COMPOSITOR_SEAT_ADD, 0, _seat_add, compositor); + /* register event listeners */ + listener_seat_add = pepper_object_add_event_listener((pepper_object_t *)compositor, + PEPPER_EVENT_COMPOSITOR_SEAT_ADD, + 0, _handle_seat_add, compositor); PEPPER_CHECK(listener_seat_add, goto shutdown_on_failure, "Failed to add seat add listener.\n"); - listener_input_add = pepper_object_add_event_listener(compositor, - PEPPER_EVENT_COMPOSITOR_INPUT_DEVICE_ADD, 0, _input_device_add, compositor); + listener_input_add = pepper_object_add_event_listener((pepper_object_t *)compositor, + PEPPER_EVENT_COMPOSITOR_INPUT_DEVICE_ADD, + 0, _handle_input_device_add, compositor); PEPPER_CHECK(listener_input_add, goto shutdown_on_failure, "Failed to add input device add listener.\n"); - listener_input_remove = pepper_object_add_event_listener(compositor, - PEPPER_EVENT_COMPOSITOR_INPUT_DEVICE_REMOVE, 0, _input_device_remove, compositor); + listener_input_remove = pepper_object_add_event_listener((pepper_object_t *)compositor, + PEPPER_EVENT_COMPOSITOR_INPUT_DEVICE_REMOVE, + 0, _handle_input_device_remove, compositor); PEPPER_CHECK(listener_input_remove, goto shutdown_on_failure, "Failed to add input device remove listener.\n"); /* create pepper keyrouter */ keyrouter = pepper_keyrouter_create(compositor); PEPPER_CHECK(keyrouter, goto shutdown_on_failure, "Failed to create keyrouter !\n"); - /* seat add */ + /* seat add : if there is no seat name, set seat0 as a default seat name */ seat_name = getenv("WAYLAND_SEAT"); if (!seat_name) @@ -80,21 +255,23 @@ int main(int argc, char *argv[]) seat = pepper_compositor_add_seat(compositor, seat_name); PEPPER_CHECK(seat, goto shutdown_on_failure, "Failed to add seat !\n"); - /* create pepper input device */ + /* get capabilities for a default pepper input device*/ if (getenv("WAYLAND_INPUT_KEYBOARD")) caps |= WL_SEAT_CAPABILITY_KEYBOARD; if (getenv("WAYLAND_INPUT_POINTER")) caps |= WL_SEAT_CAPABILITY_POINTER; if (getenv("WAYLAND_INPUT_TOUCH")) caps |= WL_SEAT_CAPABILITY_TOUCH; + + /* if there is no capability, set keyboard capability by default */ if (!caps) caps = WL_SEAT_CAPABILITY_KEYBOARD; + /* create a default pepper input device */ input_device = pepper_input_device_create(compositor, caps, NULL, NULL); PEPPER_CHECK(input_device, goto shutdown_on_failure, "Failed to create input device !\n"); /* create pepper evdev */ - pepper_evdev_t *evdev = NULL; evdev = pepper_evdev_create(compositor); PEPPER_CHECK(evdev, goto shutdown_on_failure, "Failed to create evdev !\n"); -- 2.7.4