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-14 11:03:06 +0900
commite5b1e25b77b630123639d59532267d2727d501a2 (patch)
treeedaec735a24990c27256aea0f0046b1a301fdd66
parentce85a5c603da3f98957853cbe49baee03666f9bb (diff)
downloadscreen-connector-e5b1e25b77b630123639d59532267d2727d501a2.tar.gz
screen-connector-e5b1e25b77b630123639d59532267d2727d501a2.tar.bz2
screen-connector-e5b1e25b77b630123639d59532267d2727d501a2.zip
- 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: Ifd065fd2bc9ee467cdcbd7e30131a5a22ab15254 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,