#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);
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;
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));
__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;
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;
}
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);
}
}
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,
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);
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;
};
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)
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);
+}
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,
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,
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,
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,