summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaehyeon Jung <darrenh.jung@samsung.com>2017-01-13 19:22:37 +0900
committerDaehyeon Jung <darrenh.jung@samsung.com>2017-02-13 21:35:39 +0900
commit9272cf57ac061067ce47089a679455d5eb36324c (patch)
tree5f885e695f624e8a8a0614cc482dc37098870f5d
parent47ac0a96e82dbe88da62a9e52d38b13a2410c974 (diff)
downloadscreen-connector-9272cf57ac061067ce47089a679455d5eb36324c.tar.gz
screen-connector-9272cf57ac061067ce47089a679455d5eb36324c.tar.bz2
screen-connector-9272cf57ac061067ce47089a679455d5eb36324c.zip
Apply tizen remote surface v4, add event filter
- Some remote surface enabled applications are need to ignore some input events. - When provider applications set some input event filter, the value will be passed to the watcher application. In this case, watcher applications should check input event filter before send the input events. Change-Id: I2b104211cc8bcd03514472c1762882df85319277 Signed-off-by: Daehyeon Jung <darrenh.jung@samsung.com>
-rw-r--r--screen_connector_provider/include/screen_connector_provider.h21
-rw-r--r--screen_connector_provider/src/screen_connector_provider.c58
-rw-r--r--screen_connector_watcher/include/screen_connector_watcher.h16
-rw-r--r--screen_connector_watcher/src/screen_connector_watcher.c31
-rw-r--r--screen_connector_watcher_evas/src/screen_connector_watcher_evas.c24
5 files changed, 135 insertions, 15 deletions
diff --git a/screen_connector_provider/include/screen_connector_provider.h b/screen_connector_provider/include/screen_connector_provider.h
index 05d20ed..a516a59 100644
--- a/screen_connector_provider/include/screen_connector_provider.h
+++ b/screen_connector_provider/include/screen_connector_provider.h
@@ -16,12 +16,31 @@
#ifndef __SCREEN_CONNECTOR_PROVIDER_H__
#define __SCREEN_CONNECTOR_PROVIDER_H__
-#include <Evas.h>
+#include <wayland-client.h>
+#include <tizen-remote-surface-client-protocol.h>
#ifdef __cplusplus
extern "C" {
#endif
+
+typedef enum {
+ SCREEN_CONNECTOR_INPUT_TYPE_MOUSE_UP_DOWN = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_MOUSE_UP_DOWN,
+ SCREEN_CONNECTOR_INPUT_TYPE_MOUSE_MOVE_X = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_MOUSE_MOVE_X,
+ SCREEN_CONNECTOR_INPUT_TYPE_MOUSE_MOVE_Y = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_MOUSE_MOVE_Y,
+ SCREEN_CONNECTOR_INPUT_TYPE_MOUSE_MOVE_X_Y = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_MOUSE_MOVE_X_Y,
+ SCREEN_CONNECTOR_INPUT_TYPE_MOUSE_WHEEL = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_MOUSE_WHEEL_ALL,
+ SCREEN_CONNECTOR_INPUT_TYPE_TOUCH_UP_DOWN = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_TOUCH_UP_DOWN,
+ SCREEN_CONNECTOR_INPUT_TYPE_TOUCH_MOVE_X = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_TOUCH_MOVE_X,
+ SCREEN_CONNECTOR_INPUT_TYPE_TOUCH_MOVE_Y = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_TOUCH_MOVE_Y,
+ SCREEN_CONNECTOR_INPUT_TYPE_TOUCH_MOVE_X_Y = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_TOUCH_MOVE_X_Y,
+ SCREEN_CONNECTOR_INPUT_TYPE_TOUCH_CANCEL = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_TOUCH_CANCEL_ALL,
+ SCREEN_CONNECTOR_INPUT_TYPE_KEY = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_KEY_ALL,
+} screen_connector_input_type_e;
+
+typedef struct screen_connector_provider_s *screen_connector_provider_h;
int screen_connector_provider_remote_enable(const char *id, struct wl_surface *surface);
+screen_connector_provider_h screen_connector_provider_create(const char *id, struct wl_surface *surface);
+int screen_connector_provider_set_event_filter(screen_connector_provider_h provider, unsigned int filter);
int screen_connector_provider_init(void);
int screen_connector_provider_fini(void);
diff --git a/screen_connector_provider/src/screen_connector_provider.c b/screen_connector_provider/src/screen_connector_provider.c
index 288804b..9213c39 100644
--- a/screen_connector_provider/src/screen_connector_provider.c
+++ b/screen_connector_provider/src/screen_connector_provider.c
@@ -38,7 +38,7 @@
static int __init_count;
static struct tizen_remote_surface_manager *__rsm;
-struct __remote_surface_s {
+struct screen_connector_provider_s {
struct wl_surface *surface;
struct tizen_remote_surface_provider *rsp;
char *id;
@@ -53,7 +53,7 @@ static void __rsp_resource_id_cb(void *data, struct tizen_remote_surface_provide
static void __rsp_visibility_cb(void *data, struct tizen_remote_surface_provider *provider, uint32_t visibility)
{
- struct __remote_surface_s *remote = (struct __remote_surface_s *)data;
+ struct screen_connector_provider_s *remote = (struct screen_connector_provider_s *)data;
Ecore_Wl_Event_Window_Visibility_Change *ev;
ev = calloc(1, sizeof(Ecore_Wl_Event_Window_Visibility_Change));
@@ -79,31 +79,31 @@ static const struct tizen_remote_surface_provider_listener __rsp_listener = {
__rsp_visibility_cb,
};
-EXPORT_API int screen_connector_provider_remote_enable(const char *id, struct wl_surface *surface)
+EXPORT_API screen_connector_provider_h screen_connector_provider_create(const char *id, struct wl_surface *surface)
{
- struct __remote_surface_s *remote;
+ struct screen_connector_provider_s *remote;
struct wl_display *display;
if (!__rsm) {
LOGE("__rsm is not ready");
- return -1;
+ return NULL;
}
if (!surface || !id) {
LOGE("invalid parameter");
- return -1;
+ return NULL;
}
display = ecore_wl_display_get();
if (!display) {
LOGE("Fail to get");
- return -1;
+ return NULL;
}
- remote = (struct __remote_surface_s *)malloc(sizeof(struct __remote_surface_s));
+ remote = (struct screen_connector_provider_s *)malloc(sizeof(struct screen_connector_provider_s));
if (!remote) {
LOGE("out of memory");
- return -1;
+ return NULL;
}
remote->surface = surface;
@@ -111,27 +111,56 @@ EXPORT_API int screen_connector_provider_remote_enable(const char *id, struct wl
if (!remote->win) {
LOGE("failed to find win");
free(remote);
- return -1;
+ return NULL;
}
remote->rsp = tizen_remote_surface_manager_create_provider(__rsm, surface);
if (!remote->rsp) {
LOGE("failed to create provider");
free(remote);
- return -1;
+ return NULL;
}
remote->id = strdup(id);
if (!remote->id) {
free(remote);
LOGE("out of memory");
- return -1;
+ return NULL;
}
tizen_remote_surface_provider_add_listener(remote->rsp, &__rsp_listener, remote);
wl_display_roundtrip(display);
- LOGD("%d surface remote enable");
+ LOGD("surface remote enabled");
+
+ return remote;
+}
+
+EXPORT_API int screen_connector_provider_remote_enable(const char *id, struct wl_surface *surface)
+{
+ screen_connector_provider_h handle;
+
+ handle = screen_connector_provider_create(id, surface);
+ if (handle)
+ return 0;
+
+ return -1;
+}
+
+EXPORT_API int screen_connector_provider_set_event_filter(screen_connector_provider_h provider, unsigned int filter)
+{
+ if (!provider) {
+ LOGE("invalid arguments");
+ return -1;
+ }
+
+ if (tizen_remote_surface_provider_get_version(provider->rsp) <
+ TIZEN_REMOTE_SURFACE_PROVIDER_SET_INPUT_EVENT_FILTER_SINCE_VERSION) {
+ LOGE("unsupported operation");
+ return -1;
+ }
+
+ tizen_remote_surface_provider_set_input_event_filter(provider->rsp, filter);
return 0;
}
@@ -159,7 +188,8 @@ EXPORT_API int screen_connector_provider_init(void)
EINA_INLIST_FOREACH(globals, global) {
if (!strcmp(global->interface, "tizen_remote_surface_manager")) {
__rsm = wl_registry_bind(registry, global->id,
- &tizen_remote_surface_manager_interface, 1);
+ &tizen_remote_surface_manager_interface,
+ global->version < 4 ? global->version : 4);
}
}
diff --git a/screen_connector_watcher/include/screen_connector_watcher.h b/screen_connector_watcher/include/screen_connector_watcher.h
index 223b850..e9a7d17 100644
--- a/screen_connector_watcher/include/screen_connector_watcher.h
+++ b/screen_connector_watcher/include/screen_connector_watcher.h
@@ -23,6 +23,20 @@
extern "C" {
#endif
+typedef enum {
+ SCREEN_CONNECTOR_INPUT_TYPE_MOUSE_UP_DOWN = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_MOUSE_UP_DOWN,
+ SCREEN_CONNECTOR_INPUT_TYPE_MOUSE_MOVE_X = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_MOUSE_MOVE_X,
+ SCREEN_CONNECTOR_INPUT_TYPE_MOUSE_MOVE_Y = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_MOUSE_MOVE_Y,
+ SCREEN_CONNECTOR_INPUT_TYPE_MOUSE_MOVE_X_Y = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_MOUSE_MOVE_X_Y,
+ SCREEN_CONNECTOR_INPUT_TYPE_MOUSE_WHEEL = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_MOUSE_WHEEL_ALL,
+ SCREEN_CONNECTOR_INPUT_TYPE_TOUCH_UP_DOWN = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_TOUCH_UP_DOWN,
+ SCREEN_CONNECTOR_INPUT_TYPE_TOUCH_MOVE_X = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_TOUCH_MOVE_X,
+ SCREEN_CONNECTOR_INPUT_TYPE_TOUCH_MOVE_Y = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_TOUCH_MOVE_Y,
+ SCREEN_CONNECTOR_INPUT_TYPE_TOUCH_MOVE_X_Y = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_TOUCH_MOVE_X_Y,
+ SCREEN_CONNECTOR_INPUT_TYPE_TOUCH_CANCEL = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_TOUCH_CANCEL_ALL,
+ SCREEN_CONNECTOR_INPUT_TYPE_KEY = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_KEY_ALL,
+} screen_connector_input_type_e;
+
typedef void (*screen_connector_watcher_update_cb)(struct tizen_remote_surface *trs, struct wl_buffer *buffer, uint32_t time, void *data);
typedef void (*screen_connector_watcher_missing_cb)(struct tizen_remote_surface *trs, void *data);
typedef void (*screen_connector_watcher_change_cb)(struct tizen_remote_surface *trs, uint32_t type, struct wl_buffer *tbm,
@@ -45,6 +59,8 @@ char *screen_connector_watcher_get_appid(screen_connector_watcher_h h);
int screen_connector_watcher_get_pid(screen_connector_watcher_h h);
int screen_connector_watcher_get_resource_id(screen_connector_watcher_h h);
int screen_connector_watcher_set_resource_id(screen_connector_watcher_h h, int rid);
+unsigned int screen_connector_watcher_get_event_filter(screen_connector_watcher_h h);
+int screen_connector_watcher_check_input_disabled(screen_connector_watcher_h h, screen_connector_input_type_e input);
struct tizen_remote_surface *screen_connector_watcher_get_trs(screen_connector_watcher_h h);
screen_connector_watcher_h screen_connector_watcher_create_handle(char *id, int pid, screen_connector_watcher_ops *ops, void *data);
void screen_connector_watcher_redirect_surface(screen_connector_watcher_h watcher_h);
diff --git a/screen_connector_watcher/src/screen_connector_watcher.c b/screen_connector_watcher/src/screen_connector_watcher.c
index dfec938..78cf107 100644
--- a/screen_connector_watcher/src/screen_connector_watcher.c
+++ b/screen_connector_watcher/src/screen_connector_watcher.c
@@ -42,6 +42,7 @@ struct _screen_connector_watcher_h {
int32_t img_file_fd, uint32_t img_file_size, uint32_t time, struct wl_array *keys, void *data);
void *data;
struct tizen_remote_surface *surface;
+ unsigned int event_filter;
int resource_id;
};
@@ -80,10 +81,21 @@ static void __buffer_changed(void *data, struct tizen_remote_surface *trs, uint3
watcher_h->change_cb(trs, type, tbm, img_file_fd, img_file_size, time, keys, watcher_h->data);
}
+static void __input_event_filter(void *data, struct tizen_remote_surface *trs, uint32_t event_filter)
+{
+ screen_connector_watcher_h watcher_h = (screen_connector_watcher_h)data;
+
+ if (watcher_h)
+ watcher_h->event_filter = event_filter;
+
+ LOGD("event filter updated:%d", event_filter);
+}
+
static const struct tizen_remote_surface_listener __rs_listener = {
__buffer_updated,
__buffer_missing,
__buffer_changed,
+ __input_event_filter,
};
static void __app_removed(const char *appid, const int pid, void *data)
@@ -346,3 +358,22 @@ EXPORT_API struct tizen_remote_surface *screen_connector_watcher_get_trs(screen_
return h->surface;
}
+
+EXPORT_API unsigned int screen_connector_watcher_get_event_filter(screen_connector_watcher_h h)
+{
+ if (h == NULL)
+ return 0;
+
+ return h->event_filter;
+}
+
+EXPORT_API int screen_connector_watcher_check_input_disabled(screen_connector_watcher_h h,
+ screen_connector_input_type_e input)
+{
+ if (h == NULL) {
+ LOGE("inavlid argument");
+ return -1;
+ }
+
+ return ((h->event_filter & input) > 0);
+}
diff --git a/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c b/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c
index c44a18b..b7803f4 100644
--- a/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c
+++ b/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c
@@ -172,6 +172,12 @@ static void __rs_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *even
if (desc == NULL)
desc = "";
+ if (screen_connector_watcher_check_input_disabled(watcher_evas_h->watcher_h,
+ SCREEN_CONNECTOR_INPUT_TYPE_MOUSE_UP_DOWN)) {
+ LOGD("mouse down disabled");
+ return;
+ }
+
surface = screen_connector_watcher_get_trs(watcher_evas_h->watcher_h);
tizen_remote_surface_transfer_mouse_event(surface,
TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_DOWN,
@@ -207,6 +213,12 @@ static void __rs_cb_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_
if (desc == NULL)
desc = "";
+ if (screen_connector_watcher_check_input_disabled(watcher_evas_h->watcher_h,
+ SCREEN_CONNECTOR_INPUT_TYPE_MOUSE_UP_DOWN)) {
+ LOGD("mouse up disabled");
+ return;
+ }
+
surface = screen_connector_watcher_get_trs(watcher_evas_h->watcher_h);
tizen_remote_surface_transfer_mouse_event(surface,
TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_UP,
@@ -242,6 +254,12 @@ static void __rs_cb_mouse_move(void *data, Evas *e, Evas_Object *obj, void *even
if (desc == NULL)
desc = "";
+ if (screen_connector_watcher_check_input_disabled(watcher_evas_h->watcher_h,
+ SCREEN_CONNECTOR_INPUT_TYPE_MOUSE_MOVE_X_Y)) {
+ LOGD("mouse move disabled");
+ return;
+ }
+
surface = screen_connector_watcher_get_trs(watcher_evas_h->watcher_h);
tizen_remote_surface_transfer_mouse_event(surface,
TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_MOVE,
@@ -271,6 +289,12 @@ static void __rs_cb_mouse_wheel(void *data, Evas *e, Evas_Object *obj, void *eve
if (desc == NULL)
desc = "";
+ if (screen_connector_watcher_check_input_disabled(watcher_evas_h->watcher_h,
+ SCREEN_CONNECTOR_INPUT_TYPE_MOUSE_WHEEL)) {
+ LOGD("mouse wheel disabled");
+ return;
+ }
+
surface = screen_connector_watcher_get_trs(watcher_evas_h->watcher_h);
tizen_remote_surface_transfer_mouse_wheel(surface,
ev->direction,