From e05357cec9c704233dcfcce417036f711027dac9 Mon Sep 17 00:00:00 2001 From: Sung-Jin Park Date: Tue, 14 Mar 2017 13:34:59 +0900 Subject: [PATCH 01/16] evdev: add an api(pepper_evdev_device_probe) and function for opening given device Change-Id: I14ab71e6c6c87a8f87f1d39b68913e6cd740233f Signed-off-by: Sung-Jin Park --- src/lib/evdev/evdev.c | 106 ++++++++++++++++++++++++++++++++++++++++++- src/lib/evdev/pepper-evdev.h | 3 ++ 2 files changed, 108 insertions(+), 1 deletion(-) diff --git a/src/lib/evdev/evdev.c b/src/lib/evdev/evdev.c index 7083290..719c086 100644 --- a/src/lib/evdev/evdev.c +++ b/src/lib/evdev/evdev.c @@ -21,8 +21,94 @@ * DEALINGS IN THE SOFTWARE. */ +#include +#include +#include +#include + #include #include +#include + +static int +_evdev_keyboard_event_fd_read(int fd, unsigned int mask, void *data) +{ + /* FIXME : read events from given fd and create pepper key event(s) */ + + return 0; +} + +static int +_evdev_keyboard_device_open(pepper_evdev_t *evdev, const char *path) +{ + int fd; + unsigned int event_mask; + evdev_device_info_t *device_info = NULL; + pepper_input_device_t *device = NULL; + + PEPPER_CHECK(path, return 0, "[%s] Given path is NULL.\n", __FUNCTION__); + + fd = open(path, O_RDONLY | O_NONBLOCK | O_CLOEXEC); + PEPPER_CHECK(fd>=0, return 0, "[%s] Failed to open Given path of device.\n", __FUNCTION__); + + device = pepper_input_device_create(evdev->compositor, WL_SEAT_CAPABILITY_KEYBOARD, + NULL, NULL); + PEPPER_CHECK(device, goto error, "[%s] Failed to create pepper input device.\n", __FUNCTION__); + + device_info = (evdev_device_info_t *)calloc(1, sizeof(evdev_device_info_t)); + PEPPER_CHECK(device_info, goto error, "[%s] Failed to allocate memory for device info...\n", __FUNCTION__); + + pepper_list_init(&device_info->link); + + event_mask = WL_EVENT_ERROR | WL_EVENT_HANGUP | WL_EVENT_READABLE; + device_info->evdev = evdev; + device_info->device = device; + device_info->event_source = wl_event_loop_add_fd(evdev->event_loop, + fd, event_mask, _evdev_keyboard_event_fd_read, device_info); + PEPPER_CHECK(device_info->event_source, goto error, "[%s] Failed to add fd as an event source...\n", __FUNCTION__); + + pepper_list_insert(&evdev->device_list, &device_info->link); + + return 1; + +error: + if (device) + { + pepper_input_device_destroy(device); + device = NULL; + } + + if (device_info) + { + if (device_info->event_source) + wl_event_source_remove(device_info->event_source); + + free(device_info); + device_info = NULL; + } + + if (fd >=0) + close(fd); + + return 0; +} + +PEPPER_API int +pepper_evdev_device_probe(pepper_evdev_t *evdev, uint32_t caps) +{ + int probed = 0; + + /* FIXME : probe input device under /dev/input directory */ + + /* Open specific device node for example */ + if (caps & WL_SEAT_CAPABILITY_KEYBOARD) + { + probed += _evdev_keyboard_device_open(evdev, "/dev/input/event0"); + probed += _evdev_keyboard_device_open(evdev, "/dev/input/event1"); + } + + return probed; +} PEPPER_API pepper_evdev_t * pepper_evdev_create(pepper_compositor_t *compositor) @@ -45,11 +131,29 @@ pepper_evdev_create(pepper_compositor_t *compositor) PEPPER_API void pepper_evdev_destroy(pepper_evdev_t *evdev) { + evdev_device_info_t *device_info = NULL; + evdev_device_info_t *tmp = NULL; + if (!evdev) return; pepper_list_remove(&evdev->key_event_queue); - pepper_list_remove(&evdev->device_list); + + if (!pepper_list_empty(&evdev->device_list)) + { + pepper_list_for_each_safe(device_info, tmp, &evdev->device_list, link) + { + if (device_info->device) + pepper_input_device_destroy(device_info->device); + if (device_info->event_source) + wl_event_source_remove(device_info->event_source); + + pepper_list_remove(&device_info->link); + free(device_info); + } + + pepper_list_remove(&evdev->device_list); + } free(evdev); } diff --git a/src/lib/evdev/pepper-evdev.h b/src/lib/evdev/pepper-evdev.h index f7b52ae..b39a499 100644 --- a/src/lib/evdev/pepper-evdev.h +++ b/src/lib/evdev/pepper-evdev.h @@ -30,6 +30,9 @@ extern "C" { #endif +PEPPER_API int +pepper_evdev_device_probe(pepper_evdev_t *evdev, uint32_t caps); + PEPPER_API pepper_evdev_t * pepper_evdev_create(pepper_compositor_t *compositor); -- 2.7.4 From 0ac77458ac3341400f8c0785ed555a95c06e0dd6 Mon Sep 17 00:00:00 2001 From: Sung-Jin Park Date: Tue, 14 Mar 2017 13:54:44 +0900 Subject: [PATCH 02/16] evdev: implement _evdev_keyboard_event_fd_read() to read/process key event(s) from kernel Change-Id: I29bce2f5d59d989a4ed21e12b084b2cddce7edfe Signed-off-by: Sung-Jin Park --- src/lib/evdev/evdev.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 49 insertions(+), 3 deletions(-) diff --git a/src/lib/evdev/evdev.c b/src/lib/evdev/evdev.c index 719c086..3ad1b50 100644 --- a/src/lib/evdev/evdev.c +++ b/src/lib/evdev/evdev.c @@ -25,15 +25,61 @@ #include #include #include +#include +#include +#include #include #include #include +#ifdef EVENT_MAX +#undef EVENT_MAX +#endif +#define EVENT_MAX 32 + +static void +_evdev_keyboard_event_process(struct input_event *ev, evdev_device_info_t *device_info) +{ + switch (ev->type) + { + case EV_KEY: + /* TODO : add an event into the event queue */ + break; + + case EV_SYN: + /* TODO : flush events from the event queue */ + break; + + default: + break; + } +} + static int -_evdev_keyboard_event_fd_read(int fd, unsigned int mask, void *data) +_evdev_keyboard_event_fd_read(int fd, uint32_t mask, void *data) { - /* FIXME : read events from given fd and create pepper key event(s) */ + uint32_t i; + int nread; + struct input_event ev[EVENT_MAX]; + evdev_device_info_t *device_info = (evdev_device_info_t *)data; + + PEPPER_CHECK(mask & (WL_EVENT_HANGUP | WL_EVENT_ERROR), + return 0, + "[%s] With the given fd, there is an error or it's been hung-up.\n", + __FUNCTION__); + + if (!(mask & WL_EVENT_READABLE)) + return 0; + + nread = read(fd, &ev, sizeof(ev)); + PEPPER_CHECK(nread>=0, return 0, "[%s] Failed on reading given fd. (error : %s, fd:%d)\n", + __FUNCTION__, strerror(errno), fd); + + for (i = 0 ; i < (nread / sizeof(ev[0])); i++) + { + _evdev_keyboard_event_process(&ev[i], device_info); + } return 0; } @@ -42,7 +88,7 @@ static int _evdev_keyboard_device_open(pepper_evdev_t *evdev, const char *path) { int fd; - unsigned int event_mask; + uint32_t event_mask; evdev_device_info_t *device_info = NULL; pepper_input_device_t *device = NULL; -- 2.7.4 From 2feaf4ca96026487fde7be8bcae17e75ddc3a391 Mon Sep 17 00:00:00 2001 From: Sung-Jin Park Date: Tue, 14 Mar 2017 14:20:25 +0900 Subject: [PATCH 03/16] evdev: implement _evdev_keyboard_event_process/queue/flush/post functions Change-Id: If5ba656bf13d8635e8822f27fec25169175ff917 Signed-off-by: Sung-Jin Park --- src/lib/evdev/evdev.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 58 insertions(+), 3 deletions(-) diff --git a/src/lib/evdev/evdev.c b/src/lib/evdev/evdev.c index 3ad1b50..b1345ce 100644 --- a/src/lib/evdev/evdev.c +++ b/src/lib/evdev/evdev.c @@ -39,16 +39,65 @@ #define EVENT_MAX 32 static void +_evdev_keyboard_event_post(pepper_input_device_t *device, uint32_t keycode, int state, uint32_t time) +{ + pepper_input_event_t event; + + event.time = time; + event.key = keycode; + event.state = state ? PEPPER_KEY_STATE_PRESSED : PEPPER_KEY_STATE_RELEASED; + + pepper_object_emit_event((pepper_object_t *)device, + PEPPER_EVENT_INPUT_DEVICE_KEYBOARD_KEY, &event); +} + +static void +_evdev_keyboard_event_flush(pepper_evdev_t *evdev) +{ + evdev_key_event_t *event = NULL; + evdev_key_event_t *tmp = NULL; + + pepper_list_for_each_safe(event, tmp, &evdev->key_event_queue, link) + { + _evdev_keyboard_event_post(event->device, event->keycode, event->state, event->time); + pepper_list_remove(&event->link); + free(event); + } +} + +static void +_evdev_keyboard_event_queue(uint32_t keycode, int state, uint32_t time, evdev_device_info_t *device_info) +{ + evdev_key_event_t *event = NULL; + pepper_evdev_t *evdev = device_info->evdev; + + event = (evdev_key_event_t *)calloc(1, sizeof(evdev_key_event_t)); + PEPPER_CHECK(event, return, "[%s] Failed to allocate memory for key event.\n", __FUNCTION__); + + event->keycode = keycode; + event->state = state; + event->time = time; + event->device = device_info->device; + + pepper_list_insert(&evdev->key_event_queue, &event->link); +} + +static void _evdev_keyboard_event_process(struct input_event *ev, evdev_device_info_t *device_info) { + uint32_t timestamp; + + /* FIXME : need to think about using current time vs. time within event from kernel */ + timestamp = ev->time.tv_sec * 1000 + ev->time.tv_usec / 1000; + switch (ev->type) { case EV_KEY: - /* TODO : add an event into the event queue */ + _evdev_keyboard_event_queue((uint32_t)ev->code, ev->value, timestamp, device_info); break; case EV_SYN: - /* TODO : flush events from the event queue */ + _evdev_keyboard_event_flush(device_info->evdev); break; default: @@ -183,8 +232,14 @@ pepper_evdev_destroy(pepper_evdev_t *evdev) if (!evdev) return; - pepper_list_remove(&evdev->key_event_queue); + /* clean-up/destroy key event queue */ + if (!pepper_list_empty(&evdev->key_event_queue)) + { + _evdev_keyboard_event_flush(evdev); + pepper_list_remove(&evdev->key_event_queue); + } + /* clean-up/destory device list */ if (!pepper_list_empty(&evdev->device_list)) { pepper_list_for_each_safe(device_info, tmp, &evdev->device_list, link) -- 2.7.4 From 30608ff5b713c2831d03ddd8ae50f4ec1f80d3e5 Mon Sep 17 00:00:00 2001 From: Sung-Jin Park Date: Wed, 15 Mar 2017 09:23:13 +0900 Subject: [PATCH 04/16] evdev: build/enable pepper-evdev packaging Change-Id: I6f87c900aec3473e53ff70aa857576029eeecdb0 Signed-off-by: Sung-Jin Park --- Makefile.am | 1 + configure.ac | 15 +++++++++++++++ packaging/pepper.spec | 30 ++++++++++++++++++++++++++++++ pkgconfig/pepper-evdev.pc.in | 14 ++++++++++++++ src/Makefile.am | 1 + src/lib/evdev/Makefile.am | 11 +++++++++++ 6 files changed, 72 insertions(+) create mode 100644 pkgconfig/pepper-evdev.pc.in create mode 100644 src/lib/evdev/Makefile.am diff --git a/Makefile.am b/Makefile.am index 368ce8d..8c39810 100644 --- a/Makefile.am +++ b/Makefile.am @@ -11,6 +11,7 @@ if ENABLE_TDM pkgconfig_DATA += pkgconfig/pepper-tdm.pc endif pkgconfig_DATA += pkgconfig/pepper-fbdev.pc +pkgconfig_DATA += pkgconfig/pepper-evdev.pc pkgconfig_DATA += pkgconfig/pepper-libinput.pc pkgconfig_DATA += pkgconfig/pepper-wayland.pc if ENABLE_X11 diff --git a/configure.ac b/configure.ac index 4aa8fc8..319b220 100644 --- a/configure.ac +++ b/configure.ac @@ -82,6 +82,19 @@ AC_SUBST(PEPPER_DESKTOP_SHELL_CFLAGS) AC_SUBST(PEPPER_DESKTOP_SHELL_LIBS) AC_SUBST(PEPPER_DESKTOP_SHELL_REQUIRES) +# pepper-evdev +PEPPER_EVDEV_REQUIRES="pepper" + +PEPPER_EVDEV_DIR="-I\$(top_srcdir)/src/lib/evdev" +PEPPER_EVDEV_LIB="\$(top_srcdir)/src/lib/evdev/libpepper-evdev.la" + +PEPPER_EVDEV_CFLAGS="$PEPPER_DIR $PEPPER_EVDEV_DIR $PEPPER_CFLAGS $PEPPER_EVDEV_CFLAGS" +PEPPER_EVDEV_LIBS="$PEPPER_LIB $PEPPER_EVDEV_LIBS" + +AC_SUBST(PEPPER_EVDEV_CFLAGS) +AC_SUBST(PEPPER_EVDEV_LIBS) +AC_SUBST(PEPPER_EVDEV_REQUIRES) + # pepper-render PEPPER_RENDER_REQUIRES="pixman-1 egl glesv2" PKG_CHECK_MODULES(PEPPER_RENDER, [$PEPPER_RENDER_REQUIRES]) @@ -268,6 +281,7 @@ AC_CONFIG_FILES([ Makefile src/Makefile src/lib/pepper/Makefile +src/lib/evdev/Makefile src/lib/libinput/Makefile src/lib/desktop-shell/Makefile src/lib/render/Makefile @@ -280,6 +294,7 @@ pkgconfig/pepper.pc pkgconfig/pepper-render.pc pkgconfig/pepper-drm.pc pkgconfig/pepper-fbdev.pc +pkgconfig/pepper-evdev.pc pkgconfig/pepper-libinput.pc pkgconfig/pepper-wayland.pc pkgconfig/pepper-desktop-shell.pc diff --git a/packaging/pepper.spec b/packaging/pepper.spec index 3aa972c..059e604 100644 --- a/packaging/pepper.spec +++ b/packaging/pepper.spec @@ -42,6 +42,21 @@ Requires: %{name} = %{version}-%{release} %description devel This package includes developer files common to all packages. +###### evdev +%package evdev +Summary: evdev module for pepper package + +%description evdev +This package includes evdev module files. + +###### evdev-devel +%package evdev-devel +Summary: Evdev development module for pepper package +Requires: pepper-evdev = %{version}-%{release} + +%description evdev-devel +This package includes evdev development module files. + ###### libinput %package libinput Summary: Libinput module for pepper package @@ -177,6 +192,9 @@ make %{?_smp_mflags} %post -n %{name} -p /sbin/ldconfig %postun -n %{name} -p /sbin/ldconfig +%post evdev -p /sbin/ldconfig +%postun evdev -p /sbin/ldconfig + %post libinput -p /sbin/ldconfig %postun libinput -p /sbin/ldconfig @@ -212,6 +230,18 @@ make %{?_smp_mflags} %{_libdir}/pkgconfig/pepper.pc %{_libdir}/libpepper.so +%files evdev +%manifest %{name}.manifest +%defattr(-,root,root,-) +%{_libdir}/libpepper-evdev.so.* + +%files evdev-devel +%manifest %{name}.manifest +%defattr(-,root,root,-) +%{_includedir}/pepper/pepper-evdev.h +%{_libdir}/pkgconfig/pepper-evdev.pc +%{_libdir}/libpepper-evdev.so + %files libinput %manifest %{name}.manifest %defattr(-,root,root,-) diff --git a/pkgconfig/pepper-evdev.pc.in b/pkgconfig/pepper-evdev.pc.in new file mode 100644 index 0000000..9bbcf77 --- /dev/null +++ b/pkgconfig/pepper-evdev.pc.in @@ -0,0 +1,14 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ +libexecdir=@libexecdir@ +pkglibexecdir=${libexecdir}/@PACKAGE@ + +Name: Pepper Evdev Backend Library +Description: Pepper evdev backend library header and library files +Version: @PEPPER_EVDEV_VERSION@ + +Requires.private: @PEPPER_EVDEV_REQUIRES@ +Cflags: -I${includedir}/pepper +Libs: -L${libdir} -lpepper-evdev diff --git a/src/Makefile.am b/src/Makefile.am index 6b42931..9438861 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,4 +1,5 @@ SUBDIRS = lib/pepper \ + lib/evdev \ lib/libinput \ lib/desktop-shell \ lib/render \ diff --git a/src/lib/evdev/Makefile.am b/src/lib/evdev/Makefile.am new file mode 100644 index 0000000..799d71d --- /dev/null +++ b/src/lib/evdev/Makefile.am @@ -0,0 +1,11 @@ +lib_LTLIBRARIES = libpepper-evdev.la + +AM_CFLAGS = $(GCC_CFLAGS) + +libpepper_evdev_includedir=$(includedir)/pepper +libpepper_evdev_include_HEADERS = pepper-evdev.h + +libpepper_evdev_la_CFLAGS = $(AM_CFLAGS) $(PEPPER_EVDEV_CFLAGS) +libpepper_evdev_la_LIBADD = $(PEPPER_EVDEV_LIBS) + +libpepper_evdev_la_SOURCES = evdev.c -- 2.7.4 From ab9a6901d646d3cb50e1b8937ef97d1b248466b2 Mon Sep 17 00:00:00 2001 From: JengHyun Kang Date: Mon, 20 Mar 2017 14:26:32 +0900 Subject: [PATCH 05/16] keyrouter: add initial apis for creating / destroying keyrouter Change-Id: I1d5d0b1c0bf8ab804784fa735677939038673974 --- src/lib/keyrouter/keyrouter-internal.h | 27 +++++++++++++ src/lib/keyrouter/keyrouter.c | 74 ++++++++++++++++++++++++++++++++++ src/lib/keyrouter/keyrouter.h | 29 +++++++++++++ 3 files changed, 130 insertions(+) create mode 100644 src/lib/keyrouter/keyrouter-internal.h create mode 100644 src/lib/keyrouter/keyrouter.c create mode 100644 src/lib/keyrouter/keyrouter.h diff --git a/src/lib/keyrouter/keyrouter-internal.h b/src/lib/keyrouter/keyrouter-internal.h new file mode 100644 index 0000000..5e1cf53 --- /dev/null +++ b/src/lib/keyrouter/keyrouter-internal.h @@ -0,0 +1,27 @@ +#ifndef KEYROUTER_INTERNAL_H +#define KEYROUTER_INTERNAL_H + +#include +#include + +#include "keyrouter.h" + +typedef struct keyrouter_grabbed keyrouter_grabbed_t; + +struct keyrouter { + pepper_compositor_t *compositor; + keyrouter_grabbed_t *hard_keys; +}; + +struct keyrouter_grabbed { + int keycode; + struct { + pepper_list_t excl; + pepper_list_t or_excl; + pepper_list_t top; + pepper_list_t shared; + } grab; + pepper_list_t pressed; +}; + +#endif /* KEYROUTER_INTERNAL_H */ diff --git a/src/lib/keyrouter/keyrouter.c b/src/lib/keyrouter/keyrouter.c new file mode 100644 index 0000000..cc4ecf6 --- /dev/null +++ b/src/lib/keyrouter/keyrouter.c @@ -0,0 +1,74 @@ +#include "keyrouter-internal.h" + +PEPPER_API keyrouter_t * +keyrouter_create(void) +{ + keyrouter_t *keyrouter = NULL; + int i; + + keyrouter = (keyrouter_t *)calloc(1, sizeof(keyrouter_t)); + PEPPER_CHECK(keyrouter, return NULL, "keyrouter allocation failed.\n"); + + /* FIXME: Who defined max keycode? */ + keyrouter->hard_keys = (keyrouter_grabbed_t *)calloc(KEYROUTER_MAX_KEYS, sizeof(keyrouter_grabbed_t)); + PEPPER_CHECK(keyrouter->hard_keys, goto alloc_failed, "keyrouter allocation failed.\n"); + + for (i = 0; i < KEYROUTER_MAX_KEYS; i++) { + /* Enable all of keys to grab */ + //keyrouter->hard_keys[i].keycode = i; + pepper_list_init(&keyrouter->hard_keys[i].grab.excl); + pepper_list_init(&keyrouter->hard_keys[i].grab.or_excl); + pepper_list_init(&keyrouter->hard_keys[i].grab.top); + pepper_list_init(&keyrouter->hard_keys[i].grab.shared); + pepper_list_init(&keyrouter->hard_keys[i].pressed); + } + + return keyrouter; + +alloc_failed: + if (keyrouter) { + if (keyrouter->hard_keys) { + free(keyrouter->hard_keys); + keyrouter->hard_keys = NULL; + } + free(keyrouter); + keyrouter = NULL; + } + return NULL; +} + +static void +_keyrouter_list_free(pepper_list_t *list) +{ + keyrouter_key_info_t *info, *tmp; + + if (pepper_list_empty(list)) return; + + pepper_list_for_each_safe(info, tmp, list, link) { + pepper_list_remove(&info->link); + free(info); + info = NULL; + } +} + +PEPPER_API void +keyrouter_destroy(keyrouter_t *keyrouter) +{ + int i; + + PEPPER_CHECK(keyrouter, return, "Invalid keyrouter resource.\n"); + PEPPER_CHECK(keyrouter->hard_keys, return, "Invalid keyrouter resource.\n"); + + for (i = 0; i < KEYROUTER_MAX_KEYS; i++) { + _keyrouter_list_free(&keyrouter->hard_keys[i].grab.excl); + _keyrouter_list_free(&keyrouter->hard_keys[i].grab.or_excl); + _keyrouter_list_free(&keyrouter->hard_keys[i].grab.top); + _keyrouter_list_free(&keyrouter->hard_keys[i].grab.shared); + _keyrouter_list_free(&keyrouter->hard_keys[i].pressed); + } + + free(keyrouter->hard_keys); + keyrouter->hard_keys = NULL; + free(keyrouter); + keyrouter = NULL; +} diff --git a/src/lib/keyrouter/keyrouter.h b/src/lib/keyrouter/keyrouter.h new file mode 100644 index 0000000..b31936a --- /dev/null +++ b/src/lib/keyrouter/keyrouter.h @@ -0,0 +1,29 @@ +#ifndef KEYROUTER_H +#define KEYROUTER_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define KEYROUTER_MAX_KEYS 512 + +typedef struct keyrouter keyrouter_t; +typedef struct keyrouter_key_info keyrouter_key_info_t; + +struct keyrouter_key_info { + void *data; + pepper_list_t link; +}; + +PEPPER_API keyrouter_t *keyrouter_create(void); +PEPPER_API void keyrouter_destroy(keyrouter_t *keyrouter); + +#ifdef __cplusplus +} +#endif + +#endif /* KEYROUTER_H */ + -- 2.7.4 From 0f99f8da8d9c68b06cf1cfdc41efb9cb4d5b9e1b Mon Sep 17 00:00:00 2001 From: JengHyun Kang Date: Mon, 20 Mar 2017 19:02:03 +0900 Subject: [PATCH 06/16] keyrouter: add boiler plates Change-Id: I84c7072c0a5470c4a2947d03218837a8ed752c9c --- src/lib/keyrouter/keyrouter-internal.h | 23 +++++++++++++++++++++++ src/lib/keyrouter/keyrouter.c | 23 +++++++++++++++++++++++ src/lib/keyrouter/keyrouter.h | 23 +++++++++++++++++++++++ 3 files changed, 69 insertions(+) diff --git a/src/lib/keyrouter/keyrouter-internal.h b/src/lib/keyrouter/keyrouter-internal.h index 5e1cf53..bda57c0 100644 --- a/src/lib/keyrouter/keyrouter-internal.h +++ b/src/lib/keyrouter/keyrouter-internal.h @@ -1,3 +1,26 @@ +/* +* Copyright © 2015-2017 Samsung Electronics co., Ltd. All Rights Reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a +* copy of this software and associated documentation files (the "Software"), +* to deal in the Software without restriction, including without limitation +* the rights to use, copy, modify, merge, publish, distribute, sublicense, +* and/or sell copies of the Software, and to permit persons to whom the +* Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice (including the next +* paragraph) shall be included in all copies or substantial portions of the +* Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +* DEALINGS IN THE SOFTWARE. +*/ + #ifndef KEYROUTER_INTERNAL_H #define KEYROUTER_INTERNAL_H diff --git a/src/lib/keyrouter/keyrouter.c b/src/lib/keyrouter/keyrouter.c index cc4ecf6..ee1b946 100644 --- a/src/lib/keyrouter/keyrouter.c +++ b/src/lib/keyrouter/keyrouter.c @@ -1,3 +1,26 @@ +/* +* Copyright © 2015-2017 Samsung Electronics co., Ltd. All Rights Reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a +* copy of this software and associated documentation files (the "Software"), +* to deal in the Software without restriction, including without limitation +* the rights to use, copy, modify, merge, publish, distribute, sublicense, +* and/or sell copies of the Software, and to permit persons to whom the +* Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice (including the next +* paragraph) shall be included in all copies or substantial portions of the +* Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +* DEALINGS IN THE SOFTWARE. +*/ + #include "keyrouter-internal.h" PEPPER_API keyrouter_t * diff --git a/src/lib/keyrouter/keyrouter.h b/src/lib/keyrouter/keyrouter.h index b31936a..2188c2a 100644 --- a/src/lib/keyrouter/keyrouter.h +++ b/src/lib/keyrouter/keyrouter.h @@ -1,3 +1,26 @@ +/* +* Copyright © 2015-2017 Samsung Electronics co., Ltd. All Rights Reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a +* copy of this software and associated documentation files (the "Software"), +* to deal in the Software without restriction, including without limitation +* the rights to use, copy, modify, merge, publish, distribute, sublicense, +* and/or sell copies of the Software, and to permit persons to whom the +* Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice (including the next +* paragraph) shall be included in all copies or substantial portions of the +* Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +* DEALINGS IN THE SOFTWARE. +*/ + #ifndef KEYROUTER_H #define KEYROUTER_H -- 2.7.4 From a35b2068f6062b7a314c5bd131b86c4a6fe83412 Mon Sep 17 00:00:00 2001 From: JengHyun Kang Date: Mon, 20 Mar 2017 19:03:27 +0900 Subject: [PATCH 07/16] keyrouter: add apis for grab / ungrab keys Change-Id: I77f2d6e6277e1a617e96c46333bacf8f4e6caf24 --- src/lib/keyrouter/keyrouter.c | 132 ++++++++++++++++++++++++++++++++++++++++++ src/lib/keyrouter/keyrouter.h | 2 + 2 files changed, 134 insertions(+) diff --git a/src/lib/keyrouter/keyrouter.c b/src/lib/keyrouter/keyrouter.c index ee1b946..efa8158 100644 --- a/src/lib/keyrouter/keyrouter.c +++ b/src/lib/keyrouter/keyrouter.c @@ -23,6 +23,138 @@ #include "keyrouter-internal.h" +static pepper_list_t * +_keyrouter_grabbed_list_get(keyrouter_t *keyrouter, + int type, + int keycode) +{ + PEPPER_CHECK(keyrouter, return NULL, "Invalid keyrouter\n"); + + switch(type) { + case TIZEN_KEYROUTER_MODE_EXCLUSIVE: + return &keyrouter->hard_keys[keycode].grab.excl; + case TIZEN_KEYROUTER_MODE_OVERRIDABLE_EXCLUSIVE: + return &keyrouter->hard_keys[keycode].grab.or_excl; + case TIZEN_KEYROUTER_MODE_TOPMOST: + return &keyrouter->hard_keys[keycode].grab.top; + case TIZEN_KEYROUTER_MODE_SHARED: + return &keyrouter->hard_keys[keycode].grab.shared; + default: + return NULL; + } +} + +static pepper_bool_t +_keyrouter_list_duplicated_data_check(pepper_list_t *list, void *data) +{ + keyrouter_key_info_t *info; + PEPPER_CHECK(list, return PEPPER_FALSE, "Invalid list\n"); + if (pepper_list_empty(list)) return PEPPER_FALSE; + + pepper_list_for_each(info, list, link) { + if (info->data == data) return PEPPER_TRUE; + } + + return PEPPER_FALSE; +} + +static pepper_bool_t +_keyrouter_grabbed_check(keyrouter_t *keyrouter, + int type, + int keycode, + void *data) +{ + pepper_list_t *list = NULL; + pepper_bool_t res = PEPPER_FALSE; + + list = _keyrouter_grabbed_list_get(keyrouter, type, keycode); + PEPPER_CHECK(list, return PEPPER_FALSE, "keycode(%d) had no list for type(%d)\n", keycode, type); + + switch(type) { + case TIZEN_KEYROUTER_MODE_EXCLUSIVE: + if (!pepper_list_empty(list)) + return PEPPER_TRUE; + break; + case TIZEN_KEYROUTER_MODE_OVERRIDABLE_EXCLUSIVE: + res = _keyrouter_list_duplicated_data_check(list, data); + break; + case TIZEN_KEYROUTER_MODE_TOPMOST: + res = _keyrouter_list_duplicated_data_check(list, data); + break; + case TIZEN_KEYROUTER_MODE_SHARED: + res = _keyrouter_list_duplicated_data_check(list, data); + break; + default: + res = TIZEN_KEYROUTER_ERROR_INVALID_MODE; + break; + } + return res; +} + +PEPPER_API int +keyrouter_grab_key(keyrouter_t *keyrouter, + int type, + int keycode, + void *data) +{ + keyrouter_key_info_t *info = NULL; + pepper_list_t *list = NULL; + + PEPPER_CHECK(keyrouter, return TIZEN_KEYROUTER_ERROR_INVALID_MODE, "Invalid keyrouter\n"); + PEPPER_CHECK(0 < keycode || keycode < KEYROUTER_MAX_KEYS, + return TIZEN_KEYROUTER_ERROR_INVALID_KEY, "Invalid keycode(%d)\n", keycode); + + if (_keyrouter_grabbed_check(keyrouter, type, keycode, data)) + return TIZEN_KEYROUTER_ERROR_GRABBED_ALREADY; + + info = (keyrouter_key_info_t *)calloc(1, sizeof(keyrouter_key_info_t)); + info->data = data; + pepper_list_init(&info->link); + + list = _keyrouter_grabbed_list_get(keyrouter, type, keycode); + + if (!keyrouter->hard_keys[keycode].keycode) + keyrouter->hard_keys[keycode].keycode = keycode; + pepper_list_insert(list, &info->link); + + return TIZEN_KEYROUTER_ERROR_NONE; +} + +static void +_keyrouter_list_remove_data(pepper_list_t *list, + void *data) +{ + keyrouter_key_info_t *info, *tmp; + + if (pepper_list_empty(list)) + return; + + pepper_list_for_each_safe(info ,tmp, list, link) { + if (info->data == data) { + pepper_list_remove(&info->link); + free(info); + } + } +} + +PEPPER_API void +keyrouter_ungrab_key(keyrouter_t *keyrouter, + int type, int keycode, void *data) +{ + pepper_list_t *list; + + PEPPER_CHECK(keyrouter, return, "Invalid keyrouter\n"); + PEPPER_CHECK(0 < keycode || keycode < KEYROUTER_MAX_KEYS, + return, "Invalid keycode(%d)\n", keycode); + + if (!keyrouter->hard_keys[keycode].keycode) return; + + list = _keyrouter_grabbed_list_get(keyrouter, type, keycode); + PEPPER_CHECK(list, return, "keycode(%d) had no list for type(%d)\n", keycode, type); + + _keyrouter_list_remove_data(list, data); +} + PEPPER_API keyrouter_t * keyrouter_create(void) { diff --git a/src/lib/keyrouter/keyrouter.h b/src/lib/keyrouter/keyrouter.h index 2188c2a..582a9b1 100644 --- a/src/lib/keyrouter/keyrouter.h +++ b/src/lib/keyrouter/keyrouter.h @@ -43,6 +43,8 @@ struct keyrouter_key_info { PEPPER_API keyrouter_t *keyrouter_create(void); PEPPER_API void keyrouter_destroy(keyrouter_t *keyrouter); +PEPPER_API int keyrouter_grab_key(keyrouter_t *keyrouter, int type, int keycode, void *data); +PEPPER_API void keyrouter_ungrab_key(keyrouter_t *keyrouter, int type, int keycode, void *data); #ifdef __cplusplus } -- 2.7.4 From 19131ebee3fbf4ced3e4282b54015c4b372d4da2 Mon Sep 17 00:00:00 2001 From: JengHyun Kang Date: Mon, 20 Mar 2017 19:07:24 +0900 Subject: [PATCH 08/16] keyrouter: add an api(keyrouter_key_process) for process key events following key grab status Change-Id: Id422665e2052886a300a394c9398cef8b28716de --- src/lib/keyrouter/keyrouter.c | 47 +++++++++++++++++++++++++++++++++++++++++++ src/lib/keyrouter/keyrouter.h | 1 + 2 files changed, 48 insertions(+) diff --git a/src/lib/keyrouter/keyrouter.c b/src/lib/keyrouter/keyrouter.c index efa8158..0a4a401 100644 --- a/src/lib/keyrouter/keyrouter.c +++ b/src/lib/keyrouter/keyrouter.c @@ -92,6 +92,53 @@ _keyrouter_grabbed_check(keyrouter_t *keyrouter, } PEPPER_API int +keyrouter_key_process(keyrouter_t *keyrouter, + int keycode, int pressed, pepper_list_t *delivery_list) +{ + keyrouter_key_info_t *info, *delivery; + int count = 0; + + PEPPER_CHECK(keyrouter, return 0, "Invalid keyrouter\n"); + PEPPER_CHECK(0 < keycode || keycode < KEYROUTER_MAX_KEYS, + return 0, "Invalid keycode(%d)\n", keycode); + PEPPER_CHECK(delivery_list, return 0, "Invalid delivery list\n"); + + if (!pepper_list_empty(&keyrouter->hard_keys[keycode].grab.excl)) { + pepper_list_for_each(info, &keyrouter->hard_keys[keycode].grab.excl, link) { + delivery = (keyrouter_key_info_t *)calloc(1, sizeof(keyrouter_key_info_t)); + PEPPER_CHECK(delivery, return 0, "Failed to allocate memory\n"); + delivery->data = info->data; + pepper_list_insert(delivery_list, &delivery->link); + return 1; + } + } + else if (!pepper_list_empty(&keyrouter->hard_keys[keycode].grab.or_excl)) { + pepper_list_for_each(info, &keyrouter->hard_keys[keycode].grab.or_excl, link) { + delivery = (keyrouter_key_info_t *)calloc(1, sizeof(keyrouter_key_info_t)); + PEPPER_CHECK(delivery, return 0, "Failed to allocate memory\n"); + delivery->data = info->data; + pepper_list_insert(delivery_list, &delivery->link); + return 1; + } + } + else if (!pepper_list_empty(&keyrouter->hard_keys[keycode].grab.top)) { + /* Not supported yet */ + return 0; + } + else if (!pepper_list_empty(&keyrouter->hard_keys[keycode].grab.shared)) { + pepper_list_for_each(info, &keyrouter->hard_keys[keycode].grab.shared, link) { + delivery = (keyrouter_key_info_t *)calloc(1, sizeof(keyrouter_key_info_t)); + PEPPER_CHECK(delivery, return 0, "Failed to allocate memory\n"); + delivery->data = info->data; + pepper_list_insert(delivery_list, &delivery->link); + count++; + } + } + + return count; +} + +PEPPER_API int keyrouter_grab_key(keyrouter_t *keyrouter, int type, int keycode, diff --git a/src/lib/keyrouter/keyrouter.h b/src/lib/keyrouter/keyrouter.h index 582a9b1..a1e7318 100644 --- a/src/lib/keyrouter/keyrouter.h +++ b/src/lib/keyrouter/keyrouter.h @@ -45,6 +45,7 @@ PEPPER_API keyrouter_t *keyrouter_create(void); PEPPER_API void keyrouter_destroy(keyrouter_t *keyrouter); PEPPER_API int keyrouter_grab_key(keyrouter_t *keyrouter, int type, int keycode, void *data); PEPPER_API void keyrouter_ungrab_key(keyrouter_t *keyrouter, int type, int keycode, void *data); +PEPPER_API int keyrouter_key_process(keyrouter_t *keyrouter, int keycode, int pressed, pepper_list_t *delivery_list); #ifdef __cplusplus } -- 2.7.4 From b1e2c86bfb52d36a2e9702eb8b6c1d5b6f4ccf4d Mon Sep 17 00:00:00 2001 From: JengHyun Kang Date: Mon, 20 Mar 2017 16:17:23 +0900 Subject: [PATCH 09/16] keyrouter: add initial apis for keyrouter wayland protocols Change-Id: I8f87735c949e9301d0a3be8d9cb4bcc874ce077f --- src/lib/keyrouter/pepper-keyrouter.c | 258 +++++++++++++++++++++++++++++++++++ src/lib/keyrouter/pepper-keyrouter.h | 29 ++++ 2 files changed, 287 insertions(+) create mode 100644 src/lib/keyrouter/pepper-keyrouter.c create mode 100644 src/lib/keyrouter/pepper-keyrouter.h diff --git a/src/lib/keyrouter/pepper-keyrouter.c b/src/lib/keyrouter/pepper-keyrouter.c new file mode 100644 index 0000000..a5f1417 --- /dev/null +++ b/src/lib/keyrouter/pepper-keyrouter.c @@ -0,0 +1,258 @@ +/* +* Copyright © 2015-2017 Samsung Electronics co., Ltd. All Rights Reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a +* copy of this software and associated documentation files (the "Software"), +* to deal in the Software without restriction, including without limitation +* the rights to use, copy, modify, merge, publish, distribute, sublicense, +* and/or sell copies of the Software, and to permit persons to whom the +* Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice (including the next +* paragraph) shall be included in all copies or substantial portions of the +* Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +* DEALINGS IN THE SOFTWARE. +*/ + +#include "pepper-keyrouter.h" +#include "pepper-internal.h" + +#define MIN(a,b) ((a)<(b)?(a):(b)) + +typedef struct resources_data resources_data_t; + +struct pepper_keyrouter { + struct wl_global *global; + struct wl_display *display; + pepper_compositor_t *compositor; + + pepper_list_t resources; + + keyrouter_t *keyrouter; +}; + +struct resources_data { + struct wl_resource *resource; + pepper_list_t link; +}; + +static void +_pepper_keyrouter_cb_keygrab_set(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *surface, + uint32_t key, + uint32_t mode) +{ + tizen_keyrouter_send_keygrab_notify(resource, surface, key, mode, TIZEN_KEYROUTER_ERROR_NONE); +} + +static void +_pepper_keyrouter_cb_keygrab_unset(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *surface, + uint32_t key) +{ + tizen_keyrouter_send_keygrab_notify(resource, surface, key, TIZEN_KEYROUTER_MODE_NONE, TIZEN_KEYROUTER_ERROR_NONE); +} + +static void +_pepper_keyrouter_cb_get_keygrab_status(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *surface, + uint32_t key) +{ + tizen_keyrouter_send_keygrab_notify(resource, surface, key, TIZEN_KEYROUTER_MODE_NONE, TIZEN_KEYROUTER_ERROR_NO_PERMISSION); +} + +static void +_pepper_keyrouter_cb_keygrab_set_list(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *surface, + struct wl_array *grab_list) +{ + tizen_keyrouter_send_keygrab_notify_list(resource, surface, grab_list); +} + +static void +_pepper_keyrouter_cb_keygrab_unset_list(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *surface, + struct wl_array *ungrab_list) +{ + tizen_keyrouter_send_keygrab_notify_list(resource, surface, ungrab_list); +} + +static void +_pepper_keyrouter_cb_get_keygrab_list(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *surface) +{ + tizen_keyrouter_send_getgrab_notify_list(resource, surface, NULL); +} + +static void +_pepper_keyrouter_cb_set_register_none_key(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *surface, + uint32_t data) +{ + tizen_keyrouter_send_set_register_none_key_notify(resource, NULL, 0); +} + +static void +_pepper_keyrouter_cb_get_keyregister_status(struct wl_client *client, + struct wl_resource *resource, + uint32_t key) +{ + tizen_keyrouter_send_keyregister_notify(resource, (int)PEPPER_FALSE); +} + +static void +_pepper_keyrouter_cb_set_input_config(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *surface, + uint32_t config_mode, + uint32_t value) +{ + tizen_keyrouter_send_set_input_config_notify(resource, (int)PEPPER_FALSE); +} + +static const struct tizen_keyrouter_interface _pepper_keyrouter_implementation = { + _pepper_keyrouter_cb_keygrab_set, + _pepper_keyrouter_cb_keygrab_unset, + _pepper_keyrouter_cb_get_keygrab_status, + _pepper_keyrouter_cb_keygrab_set_list, + _pepper_keyrouter_cb_keygrab_unset_list, + _pepper_keyrouter_cb_get_keygrab_list, + _pepper_keyrouter_cb_set_register_none_key, + _pepper_keyrouter_cb_get_keyregister_status, + _pepper_keyrouter_cb_set_input_config +}; + +/* tizen_keyrouter global object destroy function */ +static void +_pepper_keyrouter_cb_destory(struct wl_resource *resource) +{ + resources_data_t *rdata, *rtmp; + pepper_list_t *list; + struct wl_client *client; + pepper_keyrouter_t *pepper_keyrouter; + + PEPPER_CHECK(resource, return, "Invalid keyrouter resource\n"); + client = wl_resource_get_client(resource); + PEPPER_CHECK(client, return, "Invalid client\n"); + pepper_keyrouter = wl_resource_get_user_data(resource); + PEPPER_CHECK(pepper_keyrouter, return, "Invalid pepper_keyrouter_t\n"); + + list = &pepper_keyrouter->resources; + + if (pepper_list_empty(list)) + return; + + pepper_list_for_each_safe(rdata, rtmp, list, link) { + if (rdata->resource== resource) { + pepper_list_remove(&rdata->link); + free(rdata); + } + } +} + +/* tizen_keyrouter global object bind function */ +static void +_pepper_keyrouter_cb_bind(struct wl_client *client, void *data, uint32_t version, uint32_t id) +{ + struct wl_resource *resource; + resources_data_t *rdata; + pepper_keyrouter_t *pepper_keyrouter; + + pepper_keyrouter = (pepper_keyrouter_t *)data; + PEPPER_CHECK(client, return, "Invalid client\n"); + PEPPER_CHECK(pepper_keyrouter, return, "Invalid pepper_keyrouter_t\n"); + + resource = wl_resource_create(client, &tizen_keyrouter_interface, MIN(version, 1), id); + if (!resource) { + PEPPER_ERROR("Failed to create resource ! (version :%d, id:%d)", version, id); + wl_client_post_no_memory(client); + return; + } + + wl_resource_set_implementation(resource, &_pepper_keyrouter_implementation, + pepper_keyrouter, _pepper_keyrouter_cb_destory); + + rdata = (resources_data_t *)calloc(1, sizeof(resources_data_t)); + rdata->resource = resource; + pepper_list_init(&rdata->link); + + pepper_list_insert(&pepper_keyrouter->resources, &rdata->link); +} + +PEPPER_API pepper_keyrouter_t * +pepper_keyrouter_create(pepper_compositor_t *compositor) +{ + struct wl_display *display = NULL; + struct wl_global *global = NULL; + pepper_keyrouter_t *pepper_keyrouter; + + PEPPER_CHECK(compositor, return PEPPER_FALSE, "Invalid compositor\n"); + + display = pepper_compositor_get_display(compositor); + PEPPER_CHECK(display, return PEPPER_FALSE, "Failed to get wl_display from compositor\n"); + + pepper_keyrouter = (pepper_keyrouter_t *)calloc(1, sizeof(pepper_keyrouter_t)); + PEPPER_CHECK(pepper_keyrouter, return PEPPER_FALSE, "Failed to allocate memory for keyrouter\n"); + pepper_keyrouter->display = display; + pepper_keyrouter->compositor = compositor; + + pepper_list_init(&pepper_keyrouter->resources); + + global = wl_global_create(display, &tizen_keyrouter_interface, 1, pepper_keyrouter, _pepper_keyrouter_cb_bind); + PEPPER_CHECK(global, goto failed, "Failed to create wl_global for tizen_keyrouter\n"); + + pepper_keyrouter->keyrouter = keyrouter_create(); + PEPPER_CHECK(pepper_keyrouter->keyrouter, goto failed, "Failed to create keyrouter\n"); + + return pepper_keyrouter; + +failed: + if (pepper_keyrouter) { + if (pepper_keyrouter->keyrouter) { + keyrouter_destroy(pepper_keyrouter->keyrouter); + pepper_keyrouter->keyrouter = NULL; + } + free(pepper_keyrouter); + } + + return NULL; +} + +PEPPER_API void +pepper_keyrouter_destroy(pepper_keyrouter_t *pepper_keyrouter) +{ + resources_data_t *rdata, *rtmp; + + PEPPER_CHECK(pepper_keyrouter, return, "Pepper keyrouter is not initialized\n"); + + pepper_list_for_each_safe(rdata, rtmp, &pepper_keyrouter->resources, link) { + wl_resource_destroy(rdata->resource); + pepper_list_remove(&rdata->link); + free(rdata); + } + + if (pepper_keyrouter->keyrouter) { + keyrouter_destroy(pepper_keyrouter->keyrouter); + pepper_keyrouter->keyrouter = NULL; + } + + if (pepper_keyrouter->global) + wl_global_destroy(pepper_keyrouter->global); + + free(pepper_keyrouter); + pepper_keyrouter = NULL; +} diff --git a/src/lib/keyrouter/pepper-keyrouter.h b/src/lib/keyrouter/pepper-keyrouter.h new file mode 100644 index 0000000..2c97193 --- /dev/null +++ b/src/lib/keyrouter/pepper-keyrouter.h @@ -0,0 +1,29 @@ +/* +* Copyright © 2015-2017 Samsung Electronics co., Ltd. All Rights Reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a +* copy of this software and associated documentation files (the "Software"), +* to deal in the Software without restriction, including without limitation +* the rights to use, copy, modify, merge, publish, distribute, sublicense, +* and/or sell copies of the Software, and to permit persons to whom the +* Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice (including the next +* paragraph) shall be included in all copies or substantial portions of the +* Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +* DEALINGS IN THE SOFTWARE. +*/ + +#include "keyrouter.h" + +typedef struct pepper_keyrouter pepper_keyrouter_t; + +PEPPER_API pepper_keyrouter_t *pepper_keyrouter_create(pepper_compositor_t *compositor); +PEPPER_API void pepper_keyrouter_destroy(pepper_keyrouter_t *pepper_keyrouter); -- 2.7.4 From 25ef6a7bfa77b3ac4e9e18455f39a305ec369217 Mon Sep 17 00:00:00 2001 From: JengHyun Kang Date: Mon, 20 Mar 2017 16:24:51 +0900 Subject: [PATCH 10/16] keyrouter: implement keyrouter protocol for grab / ungrab requests Change-Id: I3ce989e36c4c16198e4209e6ff71f9f58ef77506 --- src/lib/keyrouter/pepper-keyrouter.c | 130 ++++++++++++++++++++++++++++++++++- 1 file changed, 127 insertions(+), 3 deletions(-) diff --git a/src/lib/keyrouter/pepper-keyrouter.c b/src/lib/keyrouter/pepper-keyrouter.c index a5f1417..64a3c2b 100644 --- a/src/lib/keyrouter/pepper-keyrouter.c +++ b/src/lib/keyrouter/pepper-keyrouter.c @@ -27,6 +27,8 @@ #define MIN(a,b) ((a)<(b)?(a):(b)) typedef struct resources_data resources_data_t; +typedef struct grab_list_data grab_list_data_t; +typedef struct ungrab_list_data ungrab_list_data_t; struct pepper_keyrouter { struct wl_global *global; @@ -43,6 +45,37 @@ struct resources_data { pepper_list_t link; }; +struct grab_list_data { + int key; + int mode; + int err; +}; + +struct ungrab_list_data { + int key; + int err; +}; + +static void +_pepper_keyrouter_remove_client_from_list(pepper_keyrouter_t *pepper_keyrouter, struct wl_client *client) +{ + int i; + for (i = 0; i < KEYROUTER_MAX_KEYS; i++) { + keyrouter_ungrab_key(pepper_keyrouter->keyrouter, + TIZEN_KEYROUTER_MODE_EXCLUSIVE, + i, (void *)client); + keyrouter_ungrab_key(pepper_keyrouter->keyrouter, + TIZEN_KEYROUTER_MODE_OVERRIDABLE_EXCLUSIVE, + i, (void *)client); + keyrouter_ungrab_key(pepper_keyrouter->keyrouter, + TIZEN_KEYROUTER_MODE_TOPMOST, + i, (void *)client); + keyrouter_ungrab_key(pepper_keyrouter->keyrouter, + TIZEN_KEYROUTER_MODE_SHARED, + i, (void *)client); + } +} + static void _pepper_keyrouter_cb_keygrab_set(struct wl_client *client, struct wl_resource *resource, @@ -50,7 +83,16 @@ _pepper_keyrouter_cb_keygrab_set(struct wl_client *client, uint32_t key, uint32_t mode) { - tizen_keyrouter_send_keygrab_notify(resource, surface, key, mode, TIZEN_KEYROUTER_ERROR_NONE); + int res = TIZEN_KEYROUTER_ERROR_NONE; + pepper_keyrouter_t *pepper_keyrouter = NULL; + + pepper_keyrouter = (pepper_keyrouter_t *)wl_resource_get_user_data(resource); + PEPPER_CHECK(pepper_keyrouter, goto notify, "Invalid pepper_keyrouter_t\n"); + + res = keyrouter_grab_key(pepper_keyrouter->keyrouter, mode, key, (void *)client); + +notify: + tizen_keyrouter_send_keygrab_notify(resource, surface, key, mode, res); } static void @@ -59,6 +101,25 @@ _pepper_keyrouter_cb_keygrab_unset(struct wl_client *client, struct wl_resource *surface, uint32_t key) { + pepper_keyrouter_t *pepper_keyrouter = NULL; + + pepper_keyrouter = (pepper_keyrouter_t *)wl_resource_get_user_data(resource); + PEPPER_CHECK(pepper_keyrouter, goto notify, "Invalid pepper_keyrouter_t\n"); + + keyrouter_ungrab_key(pepper_keyrouter->keyrouter, + TIZEN_KEYROUTER_MODE_EXCLUSIVE, + key, (void *)client); + keyrouter_ungrab_key(pepper_keyrouter->keyrouter, + TIZEN_KEYROUTER_MODE_OVERRIDABLE_EXCLUSIVE, + key, (void *)client); + keyrouter_ungrab_key(pepper_keyrouter->keyrouter, + TIZEN_KEYROUTER_MODE_TOPMOST, + key, (void *)client); + keyrouter_ungrab_key(pepper_keyrouter->keyrouter, + TIZEN_KEYROUTER_MODE_SHARED, + key, (void *)client); + +notify: tizen_keyrouter_send_keygrab_notify(resource, surface, key, TIZEN_KEYROUTER_MODE_NONE, TIZEN_KEYROUTER_ERROR_NONE); } @@ -71,13 +132,45 @@ _pepper_keyrouter_cb_get_keygrab_status(struct wl_client *client, tizen_keyrouter_send_keygrab_notify(resource, surface, key, TIZEN_KEYROUTER_MODE_NONE, TIZEN_KEYROUTER_ERROR_NO_PERMISSION); } +static int +_pepper_keyrouter_array_length(const struct wl_array *array) +{ + int *data = NULL; + int count = 0; + + wl_array_for_each(data, array) { + count++; + } + + return count; +} + static void _pepper_keyrouter_cb_keygrab_set_list(struct wl_client *client, struct wl_resource *resource, struct wl_resource *surface, struct wl_array *grab_list) { - tizen_keyrouter_send_keygrab_notify_list(resource, surface, grab_list); + struct wl_array *return_list = NULL; + grab_list_data_t *grab_data = NULL; + int res = TIZEN_KEYROUTER_ERROR_NONE; + pepper_keyrouter_t *pepper_keyrouter = NULL; + + pepper_keyrouter = (pepper_keyrouter_t *)wl_resource_get_user_data(resource); + + PEPPER_CHECK(pepper_keyrouter, goto notify, "Invalid pepper_keyrouter_t\n"); + PEPPER_CHECK(grab_list, goto notify, "Please send valid grab_list\n"); + PEPPER_CHECK(((_pepper_keyrouter_array_length(grab_list) %3) == 0), goto notify, + "Invalid keycode and grab mode pair. Check arguments in a list\n"); + + wl_array_for_each(grab_data, grab_list) { + res = keyrouter_grab_key(pepper_keyrouter->keyrouter, grab_data->mode, grab_data->key, (void *)client); + grab_data->err = res; + } + + return_list = grab_list; +notify: + tizen_keyrouter_send_keygrab_notify_list(resource, surface, return_list); } static void @@ -86,7 +179,36 @@ _pepper_keyrouter_cb_keygrab_unset_list(struct wl_client *client, struct wl_resource *surface, struct wl_array *ungrab_list) { - tizen_keyrouter_send_keygrab_notify_list(resource, surface, ungrab_list); + struct wl_array *return_list = NULL; + ungrab_list_data_t *ungrab_data = NULL; + pepper_keyrouter_t *pepper_keyrouter = NULL; + + pepper_keyrouter = (pepper_keyrouter_t *)wl_resource_get_user_data(resource); + + PEPPER_CHECK(pepper_keyrouter, goto notify, "Invalid pepper_keyrouter_t\n"); + PEPPER_CHECK(((_pepper_keyrouter_array_length(ungrab_list) %3) == 0), goto notify, + "Invalid keycode and grab mode pair. Check arguments in a list\n"); + + wl_array_for_each(ungrab_data, ungrab_list) { + keyrouter_ungrab_key(pepper_keyrouter->keyrouter, + TIZEN_KEYROUTER_MODE_EXCLUSIVE, + ungrab_data->key, (void *)client); + keyrouter_ungrab_key(pepper_keyrouter->keyrouter, + TIZEN_KEYROUTER_MODE_OVERRIDABLE_EXCLUSIVE, + ungrab_data->key, (void *)client); + keyrouter_ungrab_key(pepper_keyrouter->keyrouter, + TIZEN_KEYROUTER_MODE_TOPMOST, + ungrab_data->key, (void *)client); + keyrouter_ungrab_key(pepper_keyrouter->keyrouter, + TIZEN_KEYROUTER_MODE_SHARED, + ungrab_data->key, (void *)client); + + ungrab_data->err = TIZEN_KEYROUTER_ERROR_NONE;; + } + + return_list = ungrab_list; +notify: + tizen_keyrouter_send_keygrab_notify_list(resource, surface, return_list); } static void @@ -151,6 +273,8 @@ _pepper_keyrouter_cb_destory(struct wl_resource *resource) pepper_keyrouter = wl_resource_get_user_data(resource); PEPPER_CHECK(pepper_keyrouter, return, "Invalid pepper_keyrouter_t\n"); + _pepper_keyrouter_remove_client_from_list(pepper_keyrouter, client); + list = &pepper_keyrouter->resources; if (pepper_list_empty(list)) -- 2.7.4 From bcee1cd0e00bc8dad1b8acf08c09893e032b450d Mon Sep 17 00:00:00 2001 From: JengHyun Kang Date: Mon, 20 Mar 2017 16:30:39 +0900 Subject: [PATCH 11/16] keyrouter: add an api(pepper_keyrouter_key_process) for process / send key events to client Change-Id: I3afc54a634f1fe63646b1849017f10be8b7f1a91 --- src/lib/keyrouter/pepper-keyrouter.c | 58 ++++++++++++++++++++++++++++++++++++ src/lib/keyrouter/pepper-keyrouter.h | 3 ++ 2 files changed, 61 insertions(+) diff --git a/src/lib/keyrouter/pepper-keyrouter.c b/src/lib/keyrouter/pepper-keyrouter.c index 64a3c2b..5bcee3c 100644 --- a/src/lib/keyrouter/pepper-keyrouter.c +++ b/src/lib/keyrouter/pepper-keyrouter.c @@ -34,6 +34,7 @@ struct pepper_keyrouter { struct wl_global *global; struct wl_display *display; pepper_compositor_t *compositor; + pepper_seat_t *seat; pepper_list_t resources; @@ -56,6 +57,63 @@ struct ungrab_list_data { int err; }; +PEPPER_API void +pepper_keyrouter_set_seat(pepper_keyrouter_t *pepper_keyrouter, pepper_seat_t *seat) +{ + PEPPER_CHECK(pepper_keyrouter, return, "Invalid pepper_keyrouter_t\n"); + pepper_keyrouter->seat = seat; +} + +static void +_pepper_keyrouter_key_send(pepper_keyrouter_t *pepper_keyrouter, + pepper_seat_t *seat, struct wl_client *client, + unsigned int key, unsigned int state, + unsigned int time) +{ + struct wl_resource *resource; + pepper_keyboard_t *keyboard_info; + + keyboard_info = pepper_seat_get_keyboard(seat); + + wl_resource_for_each(resource, pepper_keyboard_get_resource_list(keyboard_info)) { + if (wl_resource_get_client(resource) == client) + { + wl_keyboard_send_key(resource, wl_display_get_serial(pepper_keyrouter->display), time, key, state); + PEPPER_TRACE("[%s] key : %d, state : %d, time : %d\n", __FUNCTION__, key, state, time); + } + } +} + +PEPPER_API void +pepper_keyrouter_key_process(pepper_keyrouter_t *pepper_keyrouter, + unsigned int key, unsigned int state, unsigned int time) +{ + pepper_list_t delivery_list; + pepper_list_t *seat_list; + keyrouter_key_info_t *info; + int count = 0; + pepper_seat_t *seat; + + pepper_list_init(&delivery_list); + count = keyrouter_key_process(pepper_keyrouter->keyrouter, key, state, &delivery_list); + + if (count > 0) { + pepper_list_for_each(info, &delivery_list, link) { + if (pepper_keyrouter->seat && pepper_object_get_type((pepper_object_t *)pepper_keyrouter->seat) == PEPPER_OBJECT_SEAT) { + _pepper_keyrouter_key_send(pepper_keyrouter, pepper_keyrouter->seat, (struct wl_client *)info->data, key, state, time); + } + else { + seat_list = (pepper_list_t *)pepper_compositor_get_seat_list(pepper_keyrouter->compositor); + if (!pepper_list_empty(seat_list)) { + pepper_list_for_each(seat, seat_list, link) { + _pepper_keyrouter_key_send(pepper_keyrouter, seat, (struct wl_client *)info->data, key, state, time); + } + } + } + } + } +} + static void _pepper_keyrouter_remove_client_from_list(pepper_keyrouter_t *pepper_keyrouter, struct wl_client *client) { diff --git a/src/lib/keyrouter/pepper-keyrouter.h b/src/lib/keyrouter/pepper-keyrouter.h index 2c97193..2804b10 100644 --- a/src/lib/keyrouter/pepper-keyrouter.h +++ b/src/lib/keyrouter/pepper-keyrouter.h @@ -27,3 +27,6 @@ typedef struct pepper_keyrouter pepper_keyrouter_t; PEPPER_API pepper_keyrouter_t *pepper_keyrouter_create(pepper_compositor_t *compositor); PEPPER_API void pepper_keyrouter_destroy(pepper_keyrouter_t *pepper_keyrouter); + +PEPPER_API void pepper_keyrouter_set_seat(pepper_keyrouter_t *pepper_keyrouter, pepper_seat_t *seat); +PEPPER_API void pepper_keyrouter_key_process(pepper_keyrouter_t *pepper_keyrouter, unsigned int key, unsigned int state, unsigned int time); -- 2.7.4 From 6d811bf35068c005756d298d6da042348778acbc Mon Sep 17 00:00:00 2001 From: JengHyun Kang Date: Mon, 20 Mar 2017 16:38:21 +0900 Subject: [PATCH 12/16] keyrouter: add an api(pepper_keyrouter_event_handler) to provide a pepper key event handler Change-Id: Ia3baee215882d892cea09524bb613b159119890f --- src/lib/keyrouter/pepper-keyrouter.c | 18 ++++++++++++++++++ src/lib/keyrouter/pepper-keyrouter.h | 1 + 2 files changed, 19 insertions(+) diff --git a/src/lib/keyrouter/pepper-keyrouter.c b/src/lib/keyrouter/pepper-keyrouter.c index 5bcee3c..91b7670 100644 --- a/src/lib/keyrouter/pepper-keyrouter.c +++ b/src/lib/keyrouter/pepper-keyrouter.c @@ -375,6 +375,24 @@ _pepper_keyrouter_cb_bind(struct wl_client *client, void *data, uint32_t version pepper_list_insert(&pepper_keyrouter->resources, &rdata->link); } +PEPPER_API void +pepper_keyrouter_event_handler(pepper_event_listener_t *listener, + pepper_object_t *object, + uint32_t id, void *info, void *data) +{ + pepper_input_event_t *event; + pepper_keyrouter_t *pepper_keyrouter; + + PEPPER_CHECK((id == PEPPER_EVENT_KEYBOARD_KEY), + return, "%d event is not handled by keyrouter\n", id); + PEPPER_CHECK(info, return, "Invalid event\n"); + PEPPER_CHECK(data, return, "Invalid data. Please insert pepper_keyrouter\n"); + + event = (pepper_input_event_t *)info; + pepper_keyrouter = (pepper_keyrouter_t *)data; + pepper_keyrouter_key_process(pepper_keyrouter, event->key, event->state, event->time); +} + PEPPER_API pepper_keyrouter_t * pepper_keyrouter_create(pepper_compositor_t *compositor) { diff --git a/src/lib/keyrouter/pepper-keyrouter.h b/src/lib/keyrouter/pepper-keyrouter.h index 2804b10..c109dc3 100644 --- a/src/lib/keyrouter/pepper-keyrouter.h +++ b/src/lib/keyrouter/pepper-keyrouter.h @@ -30,3 +30,4 @@ PEPPER_API void pepper_keyrouter_destroy(pepper_keyrouter_t *pepper_keyrouter); PEPPER_API void pepper_keyrouter_set_seat(pepper_keyrouter_t *pepper_keyrouter, pepper_seat_t *seat); PEPPER_API void pepper_keyrouter_key_process(pepper_keyrouter_t *pepper_keyrouter, unsigned int key, unsigned int state, unsigned int time); +PEPPER_API void pepper_keyrouter_event_handler(pepper_event_listener_t *listener, pepper_object_t *object, uint32_t id, void *info, void *data); -- 2.7.4 From 87270b3a3363ce58f9915d103adb6c31faebad66 Mon Sep 17 00:00:00 2001 From: JengHyun Kang Date: Mon, 20 Mar 2017 18:50:15 +0900 Subject: [PATCH 13/16] keyrouter: build/enable pepper-keyrouter packaging Change-Id: I86e424c9fbe80db7a020a5ebdd7e2f8407e00ef5 --- Makefile.am | 1 + configure.ac | 16 ++++++++++++++++ packaging/pepper.spec | 32 ++++++++++++++++++++++++++++++++ pkgconfig/pepper-keyrouter.pc.in | 14 ++++++++++++++ src/Makefile.am | 1 + src/lib/keyrouter/Makefile.am | 13 +++++++++++++ 6 files changed, 77 insertions(+) create mode 100644 pkgconfig/pepper-keyrouter.pc.in create mode 100644 src/lib/keyrouter/Makefile.am diff --git a/Makefile.am b/Makefile.am index 8c39810..64f278c 100644 --- a/Makefile.am +++ b/Makefile.am @@ -11,6 +11,7 @@ if ENABLE_TDM pkgconfig_DATA += pkgconfig/pepper-tdm.pc endif pkgconfig_DATA += pkgconfig/pepper-fbdev.pc +pkgconfig_DATA += pkgconfig/pepper-keyrouter.pc pkgconfig_DATA += pkgconfig/pepper-evdev.pc pkgconfig_DATA += pkgconfig/pepper-libinput.pc pkgconfig_DATA += pkgconfig/pepper-wayland.pc diff --git a/configure.ac b/configure.ac index 319b220..42dbefc 100644 --- a/configure.ac +++ b/configure.ac @@ -54,6 +54,20 @@ if test x$enable_socket_fd = xyes; then AC_DEFINE([ENABLE_SOCKET_FD], [1], [Use wl_display_add_socket_fd]) fi +# pepper-keyrouter +PEPPER_KEYROUTER_REQUIRES="tizen-extension-server" +PKG_CHECK_MODULES(PEPPER_KEYROUTER, [$PEPPER_KEYROUTER_REQUIRES]) + +PEPPER_KEYROUTER_DIR="-I\$(top_srcdir)/src/lib/keyrouter" +PEPPER_KEYROUTER_LIB="\$(top_srcdir)/src/lib/keyrouter/libpepper-keyrouter.la" + +PEPPER_KEYROUTER_CFLAGS="$PEPPER_DIR $PEPPER_KEYROUTER_CFLAGS $PEPPER_CFLAGS $PEPPER_KEYROUTER_DIR" +PEPPER_KEYROUTER_LIBS="$PEPPER_LIB $PEPPER_KEYROUTER_LIBS" + +AC_SUBST(PEPPER_KEYROUTER_CFLAGS) +AC_SUBST(PEPPER_KEYROUTER_LIBS) +AC_SUBST(PEPPER_KEYROUTER_REQUIRES) + # pepper-libinput PEPPER_LIBINPUT_REQUIRES="libinput" PKG_CHECK_MODULES(PEPPER_LIBINPUT, [$PEPPER_LIBINPUT_REQUIRES]) @@ -281,6 +295,7 @@ AC_CONFIG_FILES([ Makefile src/Makefile src/lib/pepper/Makefile +src/lib/keyrouter/Makefile src/lib/evdev/Makefile src/lib/libinput/Makefile src/lib/desktop-shell/Makefile @@ -294,6 +309,7 @@ pkgconfig/pepper.pc pkgconfig/pepper-render.pc pkgconfig/pepper-drm.pc pkgconfig/pepper-fbdev.pc +pkgconfig/pepper-keyrouter.pc pkgconfig/pepper-evdev.pc pkgconfig/pepper-libinput.pc pkgconfig/pepper-wayland.pc diff --git a/packaging/pepper.spec b/packaging/pepper.spec index 059e604..2f1eca4 100644 --- a/packaging/pepper.spec +++ b/packaging/pepper.spec @@ -27,6 +27,7 @@ BuildRequires: doxygen BuildRequires: pkgconfig(wayland-tbm-client) BuildRequires: pkgconfig(wayland-tbm-server) BuildRequires: pkgconfig(libtbm) +BuildRequires: pkgconfig(tizen-extension-server) %if "%{ENABLE_TDM}" == "1" BuildRequires: pkgconfig(libtdm) %endif @@ -42,6 +43,21 @@ Requires: %{name} = %{version}-%{release} %description devel This package includes developer files common to all packages. +###### keyrouter +%package keyrouter +Summary: Keyrouter module for pepper package + +%description keyrouter +This package includes keyrouter module files. + +###### keyrouter-devel +%package keyrouter-devel +Summary: Keyrouter development module for pepper package +Requires: pepper-keyrouter = %{version}-%{release} + +%description keyrouter-devel +This package includes keyrouter development module files. + ###### evdev %package evdev Summary: evdev module for pepper package @@ -192,6 +208,9 @@ make %{?_smp_mflags} %post -n %{name} -p /sbin/ldconfig %postun -n %{name} -p /sbin/ldconfig +%post keyrouter -p /sbin/ldconfig +%postun keyrouter -p /sbin/ldconfig + %post evdev -p /sbin/ldconfig %postun evdev -p /sbin/ldconfig @@ -230,6 +249,19 @@ make %{?_smp_mflags} %{_libdir}/pkgconfig/pepper.pc %{_libdir}/libpepper.so +%files keyrouter +%manifest %{name}.manifest +%defattr(-,root,root,-) +%{_libdir}/libpepper-keyrouter.so.* + +%files keyrouter-devel +%manifest %{name}.manifest +%defattr(-,root,root,-) +%{_includedir}/pepper/keyrouter.h +%{_includedir}/pepper/pepper-keyrouter.h +%{_libdir}/pkgconfig/pepper-keyrouter.pc +%{_libdir}/libpepper-keyrouter.so + %files evdev %manifest %{name}.manifest %defattr(-,root,root,-) diff --git a/pkgconfig/pepper-keyrouter.pc.in b/pkgconfig/pepper-keyrouter.pc.in new file mode 100644 index 0000000..3630247 --- /dev/null +++ b/pkgconfig/pepper-keyrouter.pc.in @@ -0,0 +1,14 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ +libexecdir=@libexecdir@ +pkglibexecdir=${libexecdir}/@PACKAGE@ + +Name: Pepper Keyrouter Library +Description: Pepper Keyrouter library header and library files +Version: @PEPPER_KEYROUTER_VERSION@ + +Requires.private: @PEPPER_KEYROUTER_REQUIRES@ +Cflags: -I${includedir}/pepper +Libs: -L${libdir} -lpepper-keyrouter diff --git a/src/Makefile.am b/src/Makefile.am index 9438861..b918f09 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,4 +1,5 @@ SUBDIRS = lib/pepper \ + lib/keyrouter \ lib/evdev \ lib/libinput \ lib/desktop-shell \ diff --git a/src/lib/keyrouter/Makefile.am b/src/lib/keyrouter/Makefile.am new file mode 100644 index 0000000..fe36aff --- /dev/null +++ b/src/lib/keyrouter/Makefile.am @@ -0,0 +1,13 @@ +lib_LTLIBRARIES = libpepper-keyrouter.la + +AM_CFLAGS = $(GCC_CFLAGS) + +libpepper_keyrouter_includedir=$(includedir)/pepper +libpepper_keyrouter_include_HEADERS = keyrouter.h pepper-keyrouter.h + +libpepper_keyrouter_la_CFLAGS = $(AM_CFLAGS) $(PEPPER_KEYROUTER_CFLAGS) +libpepper_keyrouter_la_LIBADD = $(PEPPER_KEYROUTER_LIBS) + +libpepper_keyrouter_la_SOURCES = keyrouter-internal.h \ + keyrouter.c \ + pepper-keyrouter.c -- 2.7.4 From 3e320058aab40e0e6ebd80bf2ede83e640075aec Mon Sep 17 00:00:00 2001 From: Sung-Jin Park Date: Fri, 17 Mar 2017 14:34:36 +0900 Subject: [PATCH 14/16] Remove unnecessary autogen.sh in some of sub-directories Change-Id: Ib40fc2078bc7f8a6332b84b97dcea381ca155f8c Signed-off-by: Sung-Jin Park --- src/bin/doctor/autogen.sh | 9 --------- src/samples/autogen.sh | 9 --------- 2 files changed, 18 deletions(-) delete mode 100755 src/bin/doctor/autogen.sh delete mode 100755 src/samples/autogen.sh diff --git a/src/bin/doctor/autogen.sh b/src/bin/doctor/autogen.sh deleted file mode 100755 index 916169a..0000000 --- a/src/bin/doctor/autogen.sh +++ /dev/null @@ -1,9 +0,0 @@ -#! /bin/sh - -test -n "$srcdir" || srcdir=`dirname "$0"` -test -n "$srcdir" || srcdir=. -( - cd "$srcdir" && - autoreconf --force -v --install -) || exit -test -n "$NOCONFIGURE" || "$srcdir/configure" "$@" diff --git a/src/samples/autogen.sh b/src/samples/autogen.sh deleted file mode 100755 index 916169a..0000000 --- a/src/samples/autogen.sh +++ /dev/null @@ -1,9 +0,0 @@ -#! /bin/sh - -test -n "$srcdir" || srcdir=`dirname "$0"` -test -n "$srcdir" || srcdir=. -( - cd "$srcdir" && - autoreconf --force -v --install -) || exit -test -n "$NOCONFIGURE" || "$srcdir/configure" "$@" -- 2.7.4 From 63a07ae30f7f6578c20db55ccb5a951661de86e7 Mon Sep 17 00:00:00 2001 From: Sung-Jin Park Date: Wed, 15 Mar 2017 14:27:52 +0900 Subject: [PATCH 15/16] evdev: remove unnecessary init of a pepper list Change-Id: I257fd392977550c2b3b59c21622d8bed658d050e Signed-off-by: Sung-Jin Park --- src/lib/evdev/evdev.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/lib/evdev/evdev.c b/src/lib/evdev/evdev.c index b1345ce..089bc6f 100644 --- a/src/lib/evdev/evdev.c +++ b/src/lib/evdev/evdev.c @@ -153,8 +153,6 @@ _evdev_keyboard_device_open(pepper_evdev_t *evdev, const char *path) device_info = (evdev_device_info_t *)calloc(1, sizeof(evdev_device_info_t)); PEPPER_CHECK(device_info, goto error, "[%s] Failed to allocate memory for device info...\n", __FUNCTION__); - pepper_list_init(&device_info->link); - event_mask = WL_EVENT_ERROR | WL_EVENT_HANGUP | WL_EVENT_READABLE; device_info->evdev = evdev; device_info->device = device; -- 2.7.4 From c9491ecffb672f8d1430adcdb6eca368041ad395 Mon Sep 17 00:00:00 2001 From: Sung-Jin Park Date: Wed, 22 Mar 2017 19:08:37 +0900 Subject: [PATCH 16/16] packaging: update license file and install it for each package Change-Id: I8bb89c3a9fd8c4ece746b89dceff64b8b19ff3a3 Signed-off-by: Sung-Jin Park --- COPYING | 2 +- packaging/pepper.spec | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/COPYING b/COPYING index 8e24484..6af77c9 100644 --- a/COPYING +++ b/COPYING @@ -3,7 +3,7 @@ Copyright © 2010-2012 Intel Corporation Copyright © 2011 Benjamin Franzke Copyright © 2012 Collabora, Ltd. Copyright © 2015 S-Core Corporation -Copyright © 2015-2016 Samsung Electronics co., Ltd. All Rights Reserved. +Copyright © 2015-2017 Samsung Electronics co., Ltd. All Rights Reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), diff --git a/packaging/pepper.spec b/packaging/pepper.spec index 2f1eca4..b8c1771 100644 --- a/packaging/pepper.spec +++ b/packaging/pepper.spec @@ -235,6 +235,7 @@ make %{?_smp_mflags} %files -n %{name} %manifest %{name}.manifest %defattr(-,root,root,-) +%license COPYING %{_libdir}/libpepper.so.* %files devel @@ -252,6 +253,7 @@ make %{?_smp_mflags} %files keyrouter %manifest %{name}.manifest %defattr(-,root,root,-) +%license COPYING %{_libdir}/libpepper-keyrouter.so.* %files keyrouter-devel @@ -265,6 +267,7 @@ make %{?_smp_mflags} %files evdev %manifest %{name}.manifest %defattr(-,root,root,-) +%license COPYING %{_libdir}/libpepper-evdev.so.* %files evdev-devel @@ -277,6 +280,7 @@ make %{?_smp_mflags} %files libinput %manifest %{name}.manifest %defattr(-,root,root,-) +%license COPYING %{_libdir}/libpepper-libinput.so.* %files libinput-devel @@ -289,6 +293,7 @@ make %{?_smp_mflags} %files desktop-shell %manifest %{name}.manifest %defattr(-,root,root,-) +%license COPYING %{_libdir}/libpepper-desktop-shell.so.* %{_bindir}/shell-client @@ -304,6 +309,7 @@ make %{?_smp_mflags} %files render %manifest %{name}.manifest %defattr(-,root,root,-) +%license COPYING %{_libdir}/libpepper-render.so.* %files render-devel @@ -317,6 +323,7 @@ make %{?_smp_mflags} %files drm %manifest %{name}.manifest %defattr(-,root,root,-) +%license COPYING %{_libdir}/libpepper-drm.so.* %files drm-devel @@ -330,6 +337,7 @@ make %{?_smp_mflags} %files tdm %manifest %{name}.manifest %defattr(-,root,root,-) +%license COPYING %{_libdir}/libpepper-tdm.so.* %files tdm-devel @@ -343,6 +351,7 @@ make %{?_smp_mflags} %files fbdev %manifest %{name}.manifest %defattr(-,root,root,-) +%license COPYING %{_libdir}/libpepper-fbdev.so.* %files fbdev-devel @@ -355,6 +364,7 @@ make %{?_smp_mflags} %files wayland %manifest %{name}.manifest %defattr(-,root,root,-) +%license COPYING %{_libdir}/libpepper-wayland.so.* %files wayland-devel @@ -367,4 +377,5 @@ make %{?_smp_mflags} %files doctor %manifest %{name}.manifest %defattr(-,root,root,-) +%license COPYING %{_bindir}/doctor -- 2.7.4