From dc26810390cdae597c70952c6a9a05b80e078747 Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Mon, 12 Dec 2016 21:36:56 +0900 Subject: [PATCH 01/16] Fix remove callback remove callback have to pass object to keep consistancy of old version. Change-Id: I40001484188a983092d1bcd6e10f658249c38420 Signed-off-by: Hyunho Kang --- screen_connector_provider/include/screen_connector_provider.h | 1 - screen_connector_provider/src/screen_connector_provider.c | 2 ++ screen_connector_watcher/include/screen_connector_watcher.h | 3 ++- screen_connector_watcher/src/screen_connector_watcher.c | 6 +++++- .../include/screen_connector_watcher_evas.h | 2 +- screen_connector_watcher_evas/src/screen_connector_watcher_evas.c | 4 ++-- 6 files changed, 12 insertions(+), 6 deletions(-) diff --git a/screen_connector_provider/include/screen_connector_provider.h b/screen_connector_provider/include/screen_connector_provider.h index 4f3dab6..f937c50 100644 --- a/screen_connector_provider/include/screen_connector_provider.h +++ b/screen_connector_provider/include/screen_connector_provider.h @@ -17,7 +17,6 @@ #ifndef __SCREEN_CONNECTOR_PROVIDER_H__ #define __SCREEN_CONNECTOR_PROVIDER_H__ #include -#include #ifdef __cplusplus extern "C" { diff --git a/screen_connector_provider/src/screen_connector_provider.c b/screen_connector_provider/src/screen_connector_provider.c index 26575fe..7834f69 100644 --- a/screen_connector_provider/src/screen_connector_provider.c +++ b/screen_connector_provider/src/screen_connector_provider.c @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -27,6 +28,7 @@ #include #include + #include "screen_connector_provider.h" #ifdef LOG_TAG diff --git a/screen_connector_watcher/include/screen_connector_watcher.h b/screen_connector_watcher/include/screen_connector_watcher.h index 7179bad..24aa3c4 100644 --- a/screen_connector_watcher/include/screen_connector_watcher.h +++ b/screen_connector_watcher/include/screen_connector_watcher.h @@ -18,6 +18,7 @@ #define __SCREEN_CONNECTOR_WATCHER_H__ #include +#include #include #ifdef __cplusplus extern "C" { @@ -30,7 +31,7 @@ typedef enum { } visibility_type; typedef void (*screen_connector_watcher_added_cb)(const char *appid, Evas_Object *image, void *data); -typedef void (*screen_connector_watcher_removed_cb)(const char *appid, void *data); +typedef void (*screen_connector_watcher_removed_cb)(const char *appid, Evas_Object *image, void *data); typedef void (*screen_connector_watcher_updated_cb)(const char *appid, Evas_Object *image, void *data); typedef struct _screen_connector_watcher_ops { diff --git a/screen_connector_watcher/src/screen_connector_watcher.c b/screen_connector_watcher/src/screen_connector_watcher.c index 8a6ce7a..a22e5f8 100644 --- a/screen_connector_watcher/src/screen_connector_watcher.c +++ b/screen_connector_watcher/src/screen_connector_watcher.c @@ -411,7 +411,7 @@ static void __buffer_missing(void *data, struct tizen_remote_surface *trs) plug_id = evas_object_data_del(surface_info->img_tbm, "___PLUGID"); free(plug_id); - surface_info->ops->removed(surface_info->appid, surface_info->data); + surface_info->ops->removed(surface_info->appid, surface_info->img_tbm, surface_info->data); __free_surface_info(surface_info); } @@ -437,6 +437,8 @@ static void __redirect_surface(screen_connector_surface_info *surface_info) { surface_info->surface = tizen_remote_surface_manager_create_surface(__rsm, (uint32_t)surface_info->surface_id, __tbm); + + LOGD("surface_id : %d, (%p)", surface_info->surface_id, surface_info->surface); tizen_remote_surface_add_listener(surface_info->surface, &__rs_listener, surface_info); tizen_remote_surface_redirect(surface_info->surface); @@ -480,6 +482,8 @@ static void __app_added(const char *appid, const int pid, const unsigned int sur surface_info->pid = pid; surface_info->surface_id = surface_id; __pending_surface_list = g_list_append(__pending_surface_list, surface_info); + + LOGD("add pending list: %d, surface_id: %d, appid: %s", pid, surface_id, appid); return; } diff --git a/screen_connector_watcher_evas/include/screen_connector_watcher_evas.h b/screen_connector_watcher_evas/include/screen_connector_watcher_evas.h index 06ebdf7..9407fee 100644 --- a/screen_connector_watcher_evas/include/screen_connector_watcher_evas.h +++ b/screen_connector_watcher_evas/include/screen_connector_watcher_evas.h @@ -39,7 +39,7 @@ extern "C" { */ typedef void (*screen_connector_watcher_evas_added_cb)(const char *appid, Evas_Object *image, void *data); -typedef void (*screen_connector_watcher_evas_removed_cb)(const char *appid, void *data); +typedef void (*screen_connector_watcher_evas_removed_cb)(const char *appid, Evas_Object *image, void *data); typedef void (*screen_connector_watcher_evas_updated_cb)(const char *appid, Evas_Object *image, void *data); typedef struct _screen_connector_watcher_evas_ops { 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 ffd1589..3c97241 100644 --- a/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c +++ b/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c @@ -66,12 +66,12 @@ static void __watcher_added_cb(const char *appid, Evas_Object *image, void *data handle->ops->added(appid, image, handle->data); } -static void __watcher_removed_cb(const char *appid, void *data) +static void __watcher_removed_cb(const char *appid, Evas_Object *image, void *data) { screen_connector_watcher_evas_h handle; handle = (screen_connector_watcher_evas_h)data; - handle->ops->removed(appid, handle->data); + handle->ops->removed(appid, image, handle->data); } static void __watcher_updated_cb(const char *appid, Evas_Object *image, void *data) -- 2.7.4 From 741ccffd461cc26a02e67dcc408ee4c5bd1c7a67 Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Tue, 13 Dec 2016 20:03:06 +0900 Subject: [PATCH 02/16] Add APIs and divide Evas dependant APIs Added APIs - _compositor_set_handler_by_rid -> screen_connector_watcher_evas_add_by_rid - _compositor_get_rid -> screen_connector_watcher_evas_get_rid - _compositor_get_pid -> screen_connector_watcher_evas_get_pid Evas dependant APIs should be devided for none evas APIs like dali. Change-Id: I5806013d68262becc1b6d69bbccdffea757cfaf0 Signed-off-by: Hyunho Kang --- .../include/screen_connector_watcher.h | 35 +- .../src/screen_connector_watcher.c | 758 ++++----------------- .../include/screen_connector_watcher_evas.h | 18 +- .../src/screen_connector_watcher_evas.c | 637 ++++++++++++++++- 4 files changed, 797 insertions(+), 651 deletions(-) diff --git a/screen_connector_watcher/include/screen_connector_watcher.h b/screen_connector_watcher/include/screen_connector_watcher.h index 24aa3c4..0bfde94 100644 --- a/screen_connector_watcher/include/screen_connector_watcher.h +++ b/screen_connector_watcher/include/screen_connector_watcher.h @@ -17,43 +17,36 @@ #ifndef __SCREEN_CONNECTOR_WATCHER_H__ #define __SCREEN_CONNECTOR_WATCHER_H__ -#include #include #include #ifdef __cplusplus extern "C" { #endif -typedef enum { - VISIBILITY_TYPE_UNOBSCURED = 0, - VISIBILITY_TYPE_PARTIALLY_OBSCURED, - VISIBILITY_TYPE_FULLY_OBSCURED, -} visibility_type; - -typedef void (*screen_connector_watcher_added_cb)(const char *appid, Evas_Object *image, void *data); -typedef void (*screen_connector_watcher_removed_cb)(const char *appid, Evas_Object *image, void *data); -typedef void (*screen_connector_watcher_updated_cb)(const char *appid, Evas_Object *image, void *data); +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, + int32_t img_file_fd, uint32_t img_file_size, uint32_t time, struct wl_array *keys, void *data); typedef struct _screen_connector_watcher_ops { - screen_connector_watcher_added_cb added; - screen_connector_watcher_removed_cb removed; - screen_connector_watcher_updated_cb updated; + screen_connector_watcher_update_cb update_cb; + screen_connector_watcher_missing_cb missing_cb; + screen_connector_watcher_change_cb change_cb; } screen_connector_watcher_ops; typedef struct _screen_connector_watcher_h *screen_connector_watcher_h; -int screen_connector_watcher_init(Evas_Object *win); +int screen_connector_watcher_init(); int screen_connector_watcher_fini(); screen_connector_watcher_h screen_connector_watcher_add(screen_connector_watcher_ops *ops, char *id, void *data); int screen_connector_watcher_remove(screen_connector_watcher_h h); int screen_connector_watcher_update(const char *appid); - -int screen_connector_watcher_start_visibility_notify(); -int screen_connector_watcher_stop_visibility_notify(); -int screen_connector_watcher_freeze_visibility(Evas_Object *obj, visibility_type type); -int screen_connector_watcher_thaw_visibility(Evas_Object *obj); -int screen_connector_watcher_send_mouse_up(Evas_Object *obj); -int screen_connector_watcher_send_touch_cancel(Evas_Object *obj); +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); +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); #ifdef __cplusplus } diff --git a/screen_connector_watcher/src/screen_connector_watcher.c b/screen_connector_watcher/src/screen_connector_watcher.c index a22e5f8..02210c6 100644 --- a/screen_connector_watcher/src/screen_connector_watcher.c +++ b/screen_connector_watcher/src/screen_connector_watcher.c @@ -17,7 +17,6 @@ #include #include #include -#include #include #include @@ -35,387 +34,51 @@ #define LOG_TAG "SC_WATCHER" -struct _screen_connector_watcher_h{ - void *surface_info; -}; - -typedef struct _screen_connector_surface_info { - int pid; - int surface_id; +struct _screen_connector_watcher_h { char *appid; - struct tizen_remote_surface *surface; - int freeze; - bool is_init; - bool cancel_touch; - Evas_Object *img_tbm; - Evas_Object *img_file; - screen_connector_watcher_ops *ops; + int pid; + void (*update_cb)(struct tizen_remote_surface *trs, struct wl_buffer *buffer, uint32_t time, void *data); + void (*missing_cb)(struct tizen_remote_surface *trs, void *data); + void (*change_cb)(struct tizen_remote_surface *trs, uint32_t type, struct wl_buffer *tbm, + int32_t img_file_fd, uint32_t img_file_size, uint32_t time, struct wl_array *keys, void *data); void *data; -}screen_connector_surface_info; + struct tizen_remote_surface *surface; + int resource_id; +}; + +typedef struct _screen_connector_watcher_h *screen_connector_watcher_h; -static Ecore_Event_Handler *__visibility_listener; static struct tizen_remote_surface_manager *__rsm; static struct wayland_tbm_client *__tbm_client; static struct wl_tbm *__tbm; -static int __init_count; -static Evas_Object *__viewer_win; -static GHashTable *__surface_tbl; -static GList *__surface_list; -static GList *__pending_surface_list; +static bool __is_init = false; +static GList *__watcher_list; +static GList *__pending_watcher_list; static aul_screen_viewer_handler __aul_cbs; -static bool __obj_is_visible(Evas_Object *obj) -{ - int x, y, w, h; - Ecore_Wl_Window *window = NULL; - int window_x, window_y, window_w, window_h; - int rotation; - - window = elm_win_wl_window_get(__viewer_win); - ecore_wl_window_geometry_get(window, &window_x, &window_y, &window_w, &window_h); - evas_object_geometry_get(obj, &x, &y, &w, &h); - rotation = ecore_wl_window_rotation_get(window); - - if (x >= 0 && x < window_w && - y >= 0 && y < window_h && - (rotation == 0 || rotation == 180)) { - LOGD("x %d, y %d w %d h %d, window_w %d window_h %d rotation %d", - x, y, w, h, window_w, window_h, rotation); - return true; - } else if (x >= 0 && x < window_h && - y >= 0 && y < window_w && - (rotation == 90 || rotation == 270)) { - LOGD("x %d, y %d w %d h %d, window_w %d window_h %d rotation %d", - x, y, w, h, window_w, window_h, rotation); - return true; - } - return false; -} - -static int __set_visibility(screen_connector_surface_info *surface_info, visibility_type type) -{ - int obscured; - - if (!surface_info) { - LOGE("obj not found"); - return -1; - } - - switch (type) { - case VISIBILITY_TYPE_UNOBSCURED: - case VISIBILITY_TYPE_PARTIALLY_OBSCURED: - obscured = TIZEN_REMOTE_SURFACE_VISIBILITY_TYPE_VISIBLE; - break; - case VISIBILITY_TYPE_FULLY_OBSCURED: - obscured = TIZEN_REMOTE_SURFACE_VISIBILITY_TYPE_INVISIBLE; - break; - default: - return -1; - } - - if (surface_info->surface) - tizen_remote_surface_transfer_visibility(surface_info->surface, obscured); - - return 0; -} - -static void __obj_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) -{ - screen_connector_surface_info *surface_info = (screen_connector_surface_info *)data; - - if (!surface_info->is_init) { - surface_info->is_init = true; - return; - } - - if (__obj_is_visible(obj)) - __set_visibility(surface_info, VISIBILITY_TYPE_UNOBSCURED); - else - __set_visibility(surface_info, VISIBILITY_TYPE_FULLY_OBSCURED); -} - -static void __rs_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info) -{ - screen_connector_surface_info *surface_info = (screen_connector_surface_info *)data; - Evas_Event_Mouse_Down *ev = event_info; - const char *desc = evas_device_description_get(ev->dev); - int x; - int y; - int w; - int h; - - evas_object_geometry_get(obj, &x, &y, &w, &h); - - LOGD("mouse down: %d %d", ev->canvas.x - x, ev->canvas.y - y); - - if (desc == NULL) - desc = ""; - - tizen_remote_surface_transfer_mouse_event(surface_info->surface, - TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_DOWN, - 0, - ev->button, - ev->canvas.x - x, - ev->canvas.y - y, - wl_fixed_from_double(ev->radius_x), - wl_fixed_from_double(ev->radius_y), - wl_fixed_from_double(ev->pressure), - wl_fixed_from_double(ev->angle), - evas_device_class_get(ev->dev), - evas_device_subclass_get(ev->dev), - desc, - ev->timestamp); -} - -static void __rs_cb_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_info) -{ - screen_connector_surface_info *surface_info = (screen_connector_surface_info *)data; - Evas_Event_Mouse_Up *ev = event_info; - const char *desc = evas_device_description_get(ev->dev); - int x; - int y; - int w; - int h; - - evas_object_geometry_get(obj, &x, &y, &w, &h); - - LOGD("mouse up: %d %d", ev->canvas.x - x, ev->canvas.y - y); - - if (desc == NULL) - desc = ""; - - tizen_remote_surface_transfer_mouse_event(surface_info->surface, - TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_UP, - 0, - ev->button, - ev->canvas.x - x, - ev->canvas.y - y, - wl_fixed_from_double(ev->radius_x), - wl_fixed_from_double(ev->radius_y), - wl_fixed_from_double(ev->pressure), - wl_fixed_from_double(ev->angle), - evas_device_class_get(ev->dev), - evas_device_subclass_get(ev->dev), - desc, - ev->timestamp); - -} - -static void __rs_cb_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info) -{ - screen_connector_surface_info *surface_info = (screen_connector_surface_info *)data; - Evas_Event_Mouse_Move *ev = event_info; - const char *desc = evas_device_description_get(ev->dev); - int x; - int y; - int w; - int h; - - evas_object_geometry_get(obj, &x, &y, &w, &h); - - LOGD("mouse move: %d %d", ev->cur.canvas.x - x, ev->cur.canvas.y - y); - - if (desc == NULL) - desc = ""; - - tizen_remote_surface_transfer_mouse_event(surface_info->surface, - TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_MOVE, - 0, - 0, - ev->cur.canvas.x - x, - ev->cur.canvas.y - y, - wl_fixed_from_double(ev->radius_x), - wl_fixed_from_double(ev->radius_y), - wl_fixed_from_double(ev->pressure), - wl_fixed_from_double(ev->angle), - evas_device_class_get(ev->dev), - evas_device_subclass_get(ev->dev), - desc, - ev->timestamp); - -} - -static void __rs_cb_mouse_wheel(void *data, Evas *e, Evas_Object *obj, void *event_info) -{ - screen_connector_surface_info *surface_info = (screen_connector_surface_info *)data; - Evas_Event_Mouse_Wheel *ev = event_info; - const char *desc = evas_device_description_get(ev->dev); - - LOGD("mouse wheel"); - - if (desc == NULL) - desc = ""; - - tizen_remote_surface_transfer_mouse_wheel(surface_info->surface, - ev->direction, - ev->z, - evas_device_class_get(ev->dev), - evas_device_subclass_get(ev->dev), - desc, - ev->timestamp); - -} - -static void __rs_cb_show(void *data, Evas *e, Evas_Object *obj, void *event_info) +static void __buffer_updated(void *data, struct tizen_remote_surface *trs, struct wl_buffer *buffer, uint32_t time) { - LOGD("show"); + screen_connector_watcher_h watcher_h = (screen_connector_watcher_h)data; + if (watcher_h) + watcher_h->update_cb(trs, buffer, time, watcher_h->data); } -static void __rs_cb_hide(void *data, Evas *e, Evas_Object *obj, void *event_info) +static void __buffer_missing(void *data, struct tizen_remote_surface *trs) { - LOGD("hide"); + screen_connector_watcher_h watcher_h = (screen_connector_watcher_h)data; + if (watcher_h) + watcher_h->missing_cb(trs, watcher_h->data); } +#if 0 static void __buffer_changed(void *data, struct tizen_remote_surface *trs, uint32_t type, struct wl_buffer *tbm, int32_t img_file_fd, uint32_t img_file_size, uint32_t time, struct wl_array *keys) { - screen_connector_surface_info *surface_info; - bool is_added = false; - Evas_Native_Surface ns; - tbm_surface_h tbm_surface; - int width, height; - char *map; - char format[] = "png"; - char plug_id[256]; - - surface_info = (screen_connector_surface_info *)data; - if (surface_info->img_tbm == NULL) { - - LOGD("first added !!!! %d, %d %s", (surface_info->img_tbm == NULL), type, surface_info->appid); - surface_info->img_tbm = evas_object_image_filled_add( - evas_object_evas_get(__viewer_win)); - - /* Image alpha set */ - evas_object_image_alpha_set(surface_info->img_tbm, 1); - - evas_object_event_callback_add(surface_info->img_tbm, - EVAS_CALLBACK_MOUSE_DOWN, - __rs_cb_mouse_down, surface_info); - evas_object_event_callback_add(surface_info->img_tbm, - EVAS_CALLBACK_MOUSE_UP, - __rs_cb_mouse_up, surface_info); - evas_object_event_callback_add(surface_info->img_tbm, - EVAS_CALLBACK_MOUSE_MOVE, - __rs_cb_mouse_move, surface_info); - evas_object_event_callback_add(surface_info->img_tbm, - EVAS_CALLBACK_MOUSE_WHEEL, - __rs_cb_mouse_wheel, surface_info); - evas_object_event_callback_add(surface_info->img_tbm, - EVAS_CALLBACK_SHOW, - __rs_cb_show, surface_info); - evas_object_event_callback_add(surface_info->img_tbm, - EVAS_CALLBACK_HIDE, - __rs_cb_hide, surface_info); - - /* Store surface_info */ - g_hash_table_insert(__surface_tbl, surface_info->img_tbm, surface_info); - - /* Set data to use in accessibility */ - snprintf(plug_id, sizeof(plug_id), "%s:%d", surface_info->appid, surface_info->pid); - evas_object_data_set(surface_info->img_tbm, "___PLUGID", strdup(plug_id)); - evas_object_event_callback_add(surface_info->img_tbm, - EVAS_CALLBACK_MOVE, __obj_move_cb, surface_info); - - is_added = true; - } - - /* check type of given buffer */ - if (type == 0) {//if (type == TIZEN_REMOTE_SURFACE_BUFFER_TYPE_TBM) { - - /* get tbm surface from buffer */ - tbm_surface = wl_buffer_get_user_data(tbm); - width = tbm_surface_get_width(tbm_surface); - height = tbm_surface_get_height(tbm_surface); - - memset(&ns, 0, sizeof(Evas_Native_Surface)); - ns.version = EVAS_NATIVE_SURFACE_VERSION; - ns.type = EVAS_NATIVE_SURFACE_TBM; - ns.data.tbm.buffer = tbm_surface; - - evas_object_resize(surface_info->img_tbm, width, height); - evas_object_image_size_set(surface_info->img_tbm, width, height); - evas_object_image_native_surface_set(surface_info->img_tbm, &ns); /* set native surface */ - evas_object_image_pixels_dirty_set(surface_info->img_tbm, EINA_TRUE); /* set dirty for image updating */ - - //evas_object_del(surface_info->img_file); /* delete previous object for the image file type */ - - } else if (type == 1) {//} else if (type == TIZEN_REMOTE_SURFACE_BUFFER_TYPE_IMAGE_FILE) { - - if (!surface_info->img_file) { - surface_info->img_file = evas_object_image_filled_add( - evas_object_evas_get(__viewer_win)); - } - - map = mmap(NULL, img_file_size, PROT_READ, MAP_SHARED, img_file_fd, 0); - evas_object_image_memfile_set(surface_info->img_file, map, img_file_size, format, NULL); - evas_object_image_size_get(surface_info->img_tbm, &width, &height); - evas_object_image_fill_set(surface_info->img_file, 0, 0, width, height); - evas_object_resize(surface_info->img_file, width, height); - munmap(map, img_file_size); - close(img_file_fd); /* close passed fd */ - - evas_object_image_native_surface_set(surface_info->img_tbm, NULL); /* set null to previous object for the tbm type */ - } - - if (is_added) { - LOGD("call added !!!! %s", surface_info->appid); - surface_info->ops->added(surface_info->appid, surface_info->img_tbm, - surface_info->data); - } else { - LOGD("call updated !!!! %s", surface_info->appid); - surface_info->ops->updated(surface_info->appid, surface_info->img_tbm, - surface_info->data); - } - + screen_connector_watcher_h watcher_h = (screen_connector_watcher_h)data; + if (watcher_h) + watcher_h->change_cb(trs, type, tbm, img_file_fd, img_file_size, time, keys, watcher_h->data); } -static void __buffer_updated(void *data, struct tizen_remote_surface *trs, struct wl_buffer *buffer, uint32_t time) -{ - __buffer_changed(data, trs, 0, buffer, 0, 0, 0, NULL); -} - -static void __free_surface_info(screen_connector_surface_info *surface_info) -{ - if (!surface_info) - return; - - if (surface_info->appid) - free(surface_info->appid); - - if (surface_info->img_tbm) { - evas_object_del(surface_info->img_tbm); - surface_info->img_tbm = NULL; - } - - if (surface_info->ops) - free(surface_info->ops); - - free(surface_info); -} - -static void __buffer_missing(void *data, struct tizen_remote_surface *trs) -{ - screen_connector_surface_info *surface_info; - char *plug_id; - - LOGD("missing"); - surface_info = (screen_connector_surface_info *)data; - if (!surface_info) { - LOGE("Null surface_info"); - return; - } - - g_hash_table_remove(__surface_tbl, surface_info->img_tbm); - - /* Remove data used in accessibility */ - plug_id = evas_object_data_del(surface_info->img_tbm, "___PLUGID"); - free(plug_id); - - surface_info->ops->removed(surface_info->appid, surface_info->img_tbm, surface_info->data); - __free_surface_info(surface_info); -} - -#if 0 static const struct tizen_remote_surface_listener __rs_listener = { __buffer_updated, __buffer_missing, @@ -428,238 +91,79 @@ static const struct tizen_remote_surface_listener __rs_listener = { }; #endif - static void __app_removed(const char *appid, const int pid, void *data) { } -static void __redirect_surface(screen_connector_surface_info *surface_info) +EXPORT_API void screen_connector_watcher_redirect_surface(screen_connector_watcher_h watcher_h) { - surface_info->surface = - tizen_remote_surface_manager_create_surface(__rsm, (uint32_t)surface_info->surface_id, __tbm); - - LOGD("surface_id : %d, (%p)", surface_info->surface_id, surface_info->surface); - tizen_remote_surface_add_listener(surface_info->surface, &__rs_listener, - surface_info); - tizen_remote_surface_redirect(surface_info->surface); + watcher_h->surface = + tizen_remote_surface_manager_create_surface(__rsm, (uint32_t)watcher_h->resource_id, __tbm); + LOGD("resource_id : %d, (%p)", watcher_h->resource_id, watcher_h->surface); + tizen_remote_surface_add_listener(watcher_h->surface, &__rs_listener, + watcher_h); + tizen_remote_surface_redirect(watcher_h->surface); } -static screen_connector_surface_info *__create_surface_info(char *appid) +static screen_connector_watcher_h __create_watcher_handle_info(char *appid) { - screen_connector_surface_info *surface_info = NULL; - surface_info = (screen_connector_surface_info *)calloc(1, sizeof(screen_connector_surface_info)); - if (surface_info == NULL) { - LOGE("surface_info calloc fail"); + screen_connector_watcher_h watcher_h = NULL; + watcher_h = (screen_connector_watcher_h)calloc(1, sizeof(struct _screen_connector_watcher_h)); + if (watcher_h == NULL) { + LOGE("watcher_h calloc fail"); return NULL; } + watcher_h->appid = strdup(appid); - surface_info->img_file = NULL; - surface_info->img_tbm = NULL; - surface_info->appid = strdup(appid); - - return surface_info; + return watcher_h; } -static void __app_added(const char *appid, const int pid, const unsigned int surface_id, void *data) +static void __app_added(const char *appid, const int pid, const unsigned int resource_id, void *data) { - LOGD("__app_added pid: %d, surface_id: %d, appid: %s", pid, surface_id, appid); - screen_connector_surface_info *surface_info = NULL; - screen_connector_surface_info *cur_info = NULL; - GList *surface_list = __surface_list; - - for (; surface_list != NULL; surface_list = surface_list->next) { - cur_info = (screen_connector_surface_info *)surface_list->data; - if (strcmp(cur_info->appid, appid) == 0) { - surface_info = cur_info; - __surface_list = g_list_remove(__surface_list, cur_info); + LOGD("__app_added pid: %d, resource_id: %d, appid: %s", pid, resource_id, appid); + screen_connector_watcher_h watcher_h = NULL; + screen_connector_watcher_h cur_h = NULL; + GList *watcher_list = __watcher_list; + + for (; watcher_list != NULL; watcher_list = watcher_list->next) { + cur_h = (screen_connector_watcher_h)watcher_list->data; + if (strcmp(cur_h->appid, appid) == 0) { + watcher_h = cur_h; + __watcher_list = g_list_remove(__watcher_list, cur_h); break; } } - if (surface_info == NULL) { - surface_info = __create_surface_info((char *)appid); - surface_info->pid = pid; - surface_info->surface_id = surface_id; - __pending_surface_list = g_list_append(__pending_surface_list, surface_info); + if (watcher_h == NULL) { + watcher_h = __create_watcher_handle_info((char *)appid); + watcher_h->pid = pid; + watcher_h->resource_id = resource_id; + __pending_watcher_list = g_list_append(__pending_watcher_list, watcher_h); - LOGD("add pending list: %d, surface_id: %d, appid: %s", pid, surface_id, appid); + LOGD("add pending list: %d, resource_id: %d, appid: %s", pid, resource_id, appid); return; } - surface_info->surface_id = surface_id; - surface_info->pid = pid; - if (surface_id > 0) - __redirect_surface(surface_info); + watcher_h->resource_id = resource_id; + watcher_h->pid = pid; + if (resource_id > 0) + screen_connector_watcher_redirect_surface(watcher_h); else LOGE("bad tbm message received. missing arguments"); } -static void __send_visibility(gpointer key, gpointer value, gpointer user_data) -{ - screen_connector_surface_info *surface_info = (screen_connector_surface_info *)value; - Evas_Object *evas_obj = (Evas_Object *)key; - unsigned int event = GPOINTER_TO_INT(user_data); - int ret; - visibility_type type; - - if (surface_info->freeze) - return; - - if (!__obj_is_visible(evas_obj)) - return; - - if (event) - type = VISIBILITY_TYPE_FULLY_OBSCURED; - else - type = VISIBILITY_TYPE_UNOBSCURED; - - ret = __set_visibility(surface_info, type); - if (ret == -1) - LOGE("failed to set object visibility set %p to %d", evas_obj, type); -} - -static Eina_Bool __visibility_cb(void *data, int type, void *event) -{ - Ecore_Wl_Event_Window_Visibility_Change *ev = event; - - LOGD("visibility change: %d %d", (unsigned int)ev->win, - (unsigned int)ev->fully_obscured); - - if (!__surface_tbl) - return ECORE_CALLBACK_RENEW; - - g_hash_table_foreach(__surface_tbl, __send_visibility, - GINT_TO_POINTER(ev->fully_obscured)); - - return ECORE_CALLBACK_RENEW; -} - -EXPORT_API int screen_connector_watcher_start_visibility_notify() -{ - if (__visibility_listener) - return 0; - - __visibility_listener = ecore_event_handler_add( - ECORE_WL_EVENT_WINDOW_VISIBILITY_CHANGE, __visibility_cb, NULL); - - return 0; -} - - -EXPORT_API int screen_connector_watcher_stop_visibility_notify() -{ - if (!__visibility_listener) - return 0; - - ecore_event_handler_del(__visibility_listener); - __visibility_listener = NULL; - - return 0; -} - -EXPORT_API int screen_connector_watcher_freeze_visibility(Evas_Object *obj, visibility_type type) -{ - screen_connector_surface_info *surface_info; - - surface_info = (screen_connector_surface_info *)g_hash_table_lookup(__surface_tbl, obj); - if (!surface_info) { - LOGE("obj not found"); - return -1; - } - surface_info->freeze = 1; - - return __set_visibility(surface_info, type); -} - -EXPORT_API int screen_connector_watcher_thaw_visibility(Evas_Object *obj) -{ - screen_connector_surface_info *surface_info; - - surface_info = (screen_connector_surface_info *)g_hash_table_lookup(__surface_tbl, obj); - if (!surface_info) { - LOGE("obj not found"); - return -1; - } - surface_info->freeze = 0; - - return 0; -} - -EXPORT_API int screen_connector_watcher_send_mouse_up(Evas_Object *obj) -{ - screen_connector_surface_info *surface_info; - int x; - int y; - int w; - int h; - unsigned int timestamp; - - surface_info = g_hash_table_lookup(__surface_tbl, obj); - if (!surface_info) { - LOGE("unknown object. not widget object."); - return -1; - } - - if (!surface_info->img_tbm) { - LOGE("surface not yet initialized."); - return -1; - } - - evas_object_geometry_get(obj, &x, &y, &w, &h); - timestamp = (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff); - tizen_remote_surface_transfer_mouse_event(surface_info->surface, - TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_UP, - 0, - 1, - w / 2, - h / 2, - 0, - 0, - 0, - 0, - TIZEN_INPUT_DEVICE_CLAS_MOUSE, - TIZEN_INPUT_DEVICE_SUBCLAS_NONE, - "", - timestamp); - - return 0; -} - -EXPORT_API int screen_connector_watcher_send_touch_cancel(Evas_Object *obj) -{ - screen_connector_surface_info *surface_info; - - surface_info = g_hash_table_lookup(__surface_tbl, obj); - if (!surface_info) { - LOGE("unknown object. not widget object."); - return -1; - } - - if (surface_info->img_tbm) { - tizen_remote_surface_transfer_touch_cancel(surface_info->surface); - surface_info->cancel_touch = true; - } else { - LOGE("surface not yet initialized."); - return -1; - } - - return 0; -} - -EXPORT_API int screen_connector_watcher_init(Evas_Object *win) +EXPORT_API int screen_connector_watcher_init() { int ret = 0; struct wl_registry *registry; Ecore_Wl_Global *global; Eina_Inlist *globals; - __viewer_win = win; - - if (__init_count > 0) { + if (__is_init) return 0; - } + ecore_wl_init(NULL); registry = ecore_wl_registry_get(); @@ -695,100 +199,136 @@ EXPORT_API int screen_connector_watcher_init(Evas_Object *win) return -1; } - __surface_tbl = g_hash_table_new(g_direct_hash, g_direct_equal); - if (!__surface_tbl) { - LOGE("failed to create table"); - return -1; - } - __aul_cbs.app_added = __app_added; __aul_cbs.app_removed = __app_removed; aul_screen_connector_add_screen_viewer(&__aul_cbs, NULL); - __init_count++; + __is_init = true; return ret; } EXPORT_API int screen_connector_watcher_fini() { - int ret = 0; - - if (__init_count > 1) + if (!__is_init) return 0; + if (aul_screen_connector_remove_app_screen() != 0) + return -1; + if (__tbm_client) wayland_tbm_client_deinit(__tbm_client); if (__rsm) tizen_remote_surface_manager_destroy(__rsm); - if (__surface_tbl) - g_hash_table_destroy(__surface_tbl); - ecore_wl_shutdown(); - __init_count--; - return ret; + __is_init = false; + return 0; } -EXPORT_API screen_connector_watcher_h screen_connector_watcher_add(screen_connector_watcher_ops *ops, char *id, void *data) +static void __destroy_watcher_h(screen_connector_watcher_h handle) { + if (!handle) + return; - screen_connector_watcher_h w_handle; - screen_connector_watcher_ops *watcher_ops; - screen_connector_surface_info *surface_info = NULL; - screen_connector_surface_info *cur_info = NULL; - GList *surface_list = __pending_surface_list; + if (handle->appid) + free(handle->appid); - watcher_ops = (screen_connector_watcher_ops *)calloc(1, sizeof(screen_connector_watcher_ops *)); - if (watcher_ops == NULL) { - LOGE("watcher_ops calloc fail"); - return NULL; - } + free(handle); +} - watcher_ops->added = ops->added; - watcher_ops->removed = ops->removed; - watcher_ops->updated = ops->updated; +EXPORT_API screen_connector_watcher_h screen_connector_watcher_create_handle(char *id, int pid, screen_connector_watcher_ops *ops, void *data) +{ + screen_connector_watcher_h watcher_h = NULL; - w_handle = (screen_connector_watcher_h)calloc(1, sizeof(struct _screen_connector_watcher_h)); - if (watcher_ops == NULL) { - LOGE("w_handle calloc fail"); - return NULL; - } + watcher_h = __create_watcher_handle_info(id); + watcher_h->update_cb = ops->update_cb; + watcher_h->change_cb = ops->change_cb; + watcher_h->missing_cb = ops->missing_cb; + watcher_h->pid = pid; + watcher_h->data = data; - for (; surface_list != NULL; surface_list = surface_list->next) { - cur_info = (screen_connector_surface_info *)surface_list->data; - if (strcmp(cur_info->appid, id) == 0) { - surface_info = cur_info; - __pending_surface_list = g_list_remove(__pending_surface_list, cur_info); + return watcher_h; +} + +EXPORT_API screen_connector_watcher_h screen_connector_watcher_add(screen_connector_watcher_ops *ops, char *id, void *data) +{ + + screen_connector_watcher_h watcher_h = NULL; + screen_connector_watcher_h cur_h = NULL; + GList *watcher_list = __pending_watcher_list; + + for (; watcher_list != NULL; watcher_list = watcher_list->next) { + cur_h = (screen_connector_watcher_h)watcher_list->data; + if (strcmp(cur_h->appid, id) == 0) { + watcher_h = cur_h; + __pending_watcher_list = g_list_remove(__pending_watcher_list, cur_h); break; } } - if (surface_info != NULL) { - surface_info->ops = watcher_ops; - surface_info->data = data; - __redirect_surface(surface_info); + if (watcher_h != NULL) { + watcher_h->update_cb = ops->update_cb; + watcher_h->change_cb = ops->change_cb; + watcher_h->missing_cb = ops->missing_cb; + watcher_h->data = data; + screen_connector_watcher_redirect_surface(watcher_h); } else { - surface_info = __create_surface_info(id); - surface_info->ops = watcher_ops; - surface_info->data = data; - __surface_list = g_list_append(__surface_list, surface_info); + watcher_h = __create_watcher_handle_info(id); + watcher_h->update_cb = ops->update_cb; + watcher_h->change_cb = ops->change_cb; + watcher_h->missing_cb = ops->missing_cb; + watcher_h->data = data; + __watcher_list = g_list_append(__watcher_list, watcher_h); } - w_handle->surface_info = surface_info; - return w_handle; + return watcher_h; } EXPORT_API int screen_connector_watcher_remove(screen_connector_watcher_h h) { int ret = 0; + __destroy_watcher_h(h); return ret; } EXPORT_API int screen_connector_watcher_update(const char *appid) { int ret = 0; + ret = aul_screen_connector_update_app_screen(appid); return ret; } + +EXPORT_API char *screen_connector_watcher_get_appid(screen_connector_watcher_h h) +{ + if (h == NULL) + return NULL; + + return h->appid; +} + +EXPORT_API int screen_connector_watcher_get_pid(screen_connector_watcher_h h) +{ + if (h == NULL) + return -1; + + return h->pid; +} + +EXPORT_API int screen_connector_watcher_get_resource_id(screen_connector_watcher_h h) +{ + if (h == NULL) + return -1; + + return h->resource_id; +} + +EXPORT_API struct tizen_remote_surface *screen_connector_watcher_get_trs(screen_connector_watcher_h h) +{ + if (h == NULL) + return NULL; + + return h->surface; +} diff --git a/screen_connector_watcher_evas/include/screen_connector_watcher_evas.h b/screen_connector_watcher_evas/include/screen_connector_watcher_evas.h index 9407fee..efbe06a 100644 --- a/screen_connector_watcher_evas/include/screen_connector_watcher_evas.h +++ b/screen_connector_watcher_evas/include/screen_connector_watcher_evas.h @@ -21,8 +21,6 @@ #include #include -#include "screen_connector_watcher.h" - #ifdef __cplusplus extern "C" { #endif @@ -38,6 +36,12 @@ extern "C" { * @{ */ +typedef enum { + VISIBILITY_TYPE_UNOBSCURED = 0, + VISIBILITY_TYPE_PARTIALLY_OBSCURED, + VISIBILITY_TYPE_FULLY_OBSCURED, +} visibility_type; + typedef void (*screen_connector_watcher_evas_added_cb)(const char *appid, Evas_Object *image, void *data); typedef void (*screen_connector_watcher_evas_removed_cb)(const char *appid, Evas_Object *image, void *data); typedef void (*screen_connector_watcher_evas_updated_cb)(const char *appid, Evas_Object *image, void *data); @@ -56,6 +60,16 @@ screen_connector_watcher_evas_h screen_connector_watcher_evas_add(screen_connect int screen_connector_watcher_evas_remove(screen_connector_watcher_evas_h handle); int screen_connector_watcher_evas_update(const char *appid); +int screen_connector_watcher_evas_start_visibility_notify(); +int screen_connector_watcher_evas_stop_visibility_notify(); +int screen_connector_watcher_evas_freeze_visibility(Evas_Object *obj, visibility_type type); +int screen_connector_watcher_evas_thaw_visibility(Evas_Object *obj); +int screen_connector_watcher_evas_send_mouse_up(Evas_Object *obj); +int screen_connector_watcher_evas_send_touch_cancel(Evas_Object *obj); +int screen_connector_watcher_evas_get_pid(Evas_Object *obj, int *pid); +int screen_connector_watcher_evas_add_by_rid(screen_connector_watcher_evas_ops *ops, int res_id, void *data); +int screen_connector_watcher_evas_get_rid(Evas_Object *obj, int *resource_id); + /** * @} */ 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 3c97241..8f36025 100644 --- a/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c +++ b/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c @@ -18,8 +18,13 @@ #include #include #include +#include #include +#include +#include +#include +#include #include "screen_connector_watcher.h" #include "screen_connector_watcher_evas.h" @@ -33,8 +38,16 @@ struct _screen_connector_watcher_evas_h { screen_connector_watcher_evas_ops *ops; screen_connector_watcher_h watcher_h; + int freeze; + bool is_init; + bool cancel_touch; + Evas_Object *img_tbm; + Evas_Object *img_file; void *data; }; +static Evas_Object *__viewer_win; +static Ecore_Event_Handler *__visibility_listener; +static GHashTable *__watcher_tbl; static void __destroy_watcher_evas_handle(screen_connector_watcher_evas_h h) { @@ -47,51 +60,407 @@ static void __destroy_watcher_evas_handle(screen_connector_watcher_evas_h h) EXPORT_API int screen_connector_watcher_evas_init(Evas_Object *win) { int ret = 0; - ret = screen_connector_watcher_init(win); + __viewer_win = win; + + __watcher_tbl = g_hash_table_new(g_direct_hash, g_direct_equal); + if (!__watcher_tbl) { + LOGE("failed to create table"); + return -1; + } + + ret = screen_connector_watcher_init(); return ret; } EXPORT_API int screen_connector_watcher_evas_fini() { int ret = 0; + + if (__watcher_tbl) + g_hash_table_destroy(__watcher_tbl); + ret = screen_connector_watcher_fini(); return ret; } -static void __watcher_added_cb(const char *appid, Evas_Object *image, void *data) +static bool __obj_is_visible(Evas_Object *obj) { - screen_connector_watcher_evas_h handle; + int x, y, w, h; + Ecore_Wl_Window *window = NULL; + int window_x, window_y, window_w, window_h; + int rotation; - handle = (screen_connector_watcher_evas_h)data; - handle->ops->added(appid, image, handle->data); + window = elm_win_wl_window_get(__viewer_win); + ecore_wl_window_geometry_get(window, &window_x, &window_y, &window_w, &window_h); + evas_object_geometry_get(obj, &x, &y, &w, &h); + rotation = ecore_wl_window_rotation_get(window); + + if (x >= 0 && x < window_w && + y >= 0 && y < window_h && + (rotation == 0 || rotation == 180)) { + LOGD("x %d, y %d w %d h %d, window_w %d window_h %d rotation %d", + x, y, w, h, window_w, window_h, rotation); + return true; + } else if (x >= 0 && x < window_h && + y >= 0 && y < window_w && + (rotation == 90 || rotation == 270)) { + LOGD("x %d, y %d w %d h %d, window_w %d window_h %d rotation %d", + x, y, w, h, window_w, window_h, rotation); + return true; + } + return false; } -static void __watcher_removed_cb(const char *appid, Evas_Object *image, void *data) +static int __set_visibility(screen_connector_watcher_evas_h watcher_evas_h, visibility_type type) { - screen_connector_watcher_evas_h handle; + int obscured; + struct tizen_remote_surface *surface; + + if (!watcher_evas_h) { + LOGE("obj not found"); + return -1; + } + + switch (type) { + case VISIBILITY_TYPE_UNOBSCURED: + case VISIBILITY_TYPE_PARTIALLY_OBSCURED: + obscured = TIZEN_REMOTE_SURFACE_VISIBILITY_TYPE_VISIBLE; + break; + case VISIBILITY_TYPE_FULLY_OBSCURED: + obscured = TIZEN_REMOTE_SURFACE_VISIBILITY_TYPE_INVISIBLE; + break; + default: + return -1; + } + + surface = screen_connector_watcher_get_trs(watcher_evas_h->watcher_h); + if (surface) + tizen_remote_surface_transfer_visibility(surface, obscured); - handle = (screen_connector_watcher_evas_h)data; - handle->ops->removed(appid, image, handle->data); + return 0; } -static void __watcher_updated_cb(const char *appid, Evas_Object *image, void *data) +static void __obj_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { - screen_connector_watcher_evas_h handle; + screen_connector_watcher_evas_h watcher_evas_h = (screen_connector_watcher_evas_h)data; + + if (!watcher_evas_h->is_init) { + watcher_evas_h->is_init = true; + return; + } + + if (__obj_is_visible(obj)) + __set_visibility(watcher_evas_h, VISIBILITY_TYPE_UNOBSCURED); + else + __set_visibility(watcher_evas_h, VISIBILITY_TYPE_FULLY_OBSCURED); +} + +static void __rs_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + screen_connector_watcher_evas_h watcher_evas_h = (screen_connector_watcher_evas_h)data; + Evas_Event_Mouse_Down *ev = event_info; + const char *desc = evas_device_description_get(ev->dev); + int x; + int y; + int w; + int h; + struct tizen_remote_surface *surface; + + evas_object_geometry_get(obj, &x, &y, &w, &h); + + LOGD("mouse down: %d %d", ev->canvas.x - x, ev->canvas.y - y); + + if (desc == NULL) + desc = ""; + + 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, + 0, + ev->button, + ev->canvas.x - x, + ev->canvas.y - y, + wl_fixed_from_double(ev->radius_x), + wl_fixed_from_double(ev->radius_y), + wl_fixed_from_double(ev->pressure), + wl_fixed_from_double(ev->angle), + evas_device_class_get(ev->dev), + evas_device_subclass_get(ev->dev), + desc, + ev->timestamp); +} + +static void __rs_cb_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + screen_connector_watcher_evas_h watcher_evas_h = (screen_connector_watcher_evas_h)data; + Evas_Event_Mouse_Up *ev = event_info; + const char *desc = evas_device_description_get(ev->dev); + int x; + int y; + int w; + int h; + struct tizen_remote_surface *surface; + + evas_object_geometry_get(obj, &x, &y, &w, &h); + + LOGD("mouse up: %d %d", ev->canvas.x - x, ev->canvas.y - y); + + if (desc == NULL) + desc = ""; + + 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, + 0, + ev->button, + ev->canvas.x - x, + ev->canvas.y - y, + wl_fixed_from_double(ev->radius_x), + wl_fixed_from_double(ev->radius_y), + wl_fixed_from_double(ev->pressure), + wl_fixed_from_double(ev->angle), + evas_device_class_get(ev->dev), + evas_device_subclass_get(ev->dev), + desc, + ev->timestamp); + +} + +static void __rs_cb_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + screen_connector_watcher_evas_h watcher_evas_h = (screen_connector_watcher_evas_h)data; + Evas_Event_Mouse_Move *ev = event_info; + const char *desc = evas_device_description_get(ev->dev); + int x; + int y; + int w; + int h; + struct tizen_remote_surface *surface; + + evas_object_geometry_get(obj, &x, &y, &w, &h); + + LOGD("mouse move: %d %d", ev->cur.canvas.x - x, ev->cur.canvas.y - y); + + if (desc == NULL) + desc = ""; + + 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, + 0, + 0, + ev->cur.canvas.x - x, + ev->cur.canvas.y - y, + wl_fixed_from_double(ev->radius_x), + wl_fixed_from_double(ev->radius_y), + wl_fixed_from_double(ev->pressure), + wl_fixed_from_double(ev->angle), + evas_device_class_get(ev->dev), + evas_device_subclass_get(ev->dev), + desc, + ev->timestamp); + +} + +static void __rs_cb_mouse_wheel(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + screen_connector_watcher_evas_h watcher_evas_h = (screen_connector_watcher_evas_h)data; + Evas_Event_Mouse_Wheel *ev = event_info; + const char *desc = evas_device_description_get(ev->dev); + struct tizen_remote_surface *surface; + + LOGD("mouse wheel"); + + if (desc == NULL) + desc = ""; + + surface = screen_connector_watcher_get_trs(watcher_evas_h->watcher_h); + tizen_remote_surface_transfer_mouse_wheel(surface, + ev->direction, + ev->z, + evas_device_class_get(ev->dev), + evas_device_subclass_get(ev->dev), + desc, + ev->timestamp); - handle = (screen_connector_watcher_evas_h)data; - handle->ops->updated(appid, image, handle->data); } +static void __rs_cb_show(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + LOGD("show"); +} + +static void __rs_cb_hide(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + LOGD("hide"); +} + +static void __watcher_change_cb(struct tizen_remote_surface *trs, uint32_t type, struct wl_buffer *tbm, + int32_t img_file_fd, uint32_t img_file_size, uint32_t time, struct wl_array *keys, void *data) +{ + + bool is_added = false; + Evas_Native_Surface ns; + tbm_surface_h tbm_surface; + int width, height; + char *map; + char format[] = "png"; + char plug_id[256]; + screen_connector_watcher_evas_h watcher_evas_h; + char *appid; + char pid; + + watcher_evas_h = (screen_connector_watcher_evas_h)data; + appid = screen_connector_watcher_get_appid(watcher_evas_h->watcher_h); + pid = screen_connector_watcher_get_pid(watcher_evas_h->watcher_h); + if (watcher_evas_h->img_tbm == NULL) { + + LOGD("first added !!!! %d, %d %s", (watcher_evas_h->img_tbm == NULL), type, appid); + watcher_evas_h->img_tbm = evas_object_image_filled_add( + evas_object_evas_get(__viewer_win)); + + /* Image alpha set */ + evas_object_image_alpha_set(watcher_evas_h->img_tbm, 1); + + evas_object_event_callback_add(watcher_evas_h->img_tbm, + EVAS_CALLBACK_MOUSE_DOWN, + __rs_cb_mouse_down, watcher_evas_h); + evas_object_event_callback_add(watcher_evas_h->img_tbm, + EVAS_CALLBACK_MOUSE_UP, + __rs_cb_mouse_up, watcher_evas_h); + evas_object_event_callback_add(watcher_evas_h->img_tbm, + EVAS_CALLBACK_MOUSE_MOVE, + __rs_cb_mouse_move, watcher_evas_h); + evas_object_event_callback_add(watcher_evas_h->img_tbm, + EVAS_CALLBACK_MOUSE_WHEEL, + __rs_cb_mouse_wheel, watcher_evas_h); + evas_object_event_callback_add(watcher_evas_h->img_tbm, + EVAS_CALLBACK_SHOW, + __rs_cb_show, watcher_evas_h); + evas_object_event_callback_add(watcher_evas_h->img_tbm, + EVAS_CALLBACK_HIDE, + __rs_cb_hide, watcher_evas_h); + + /* Store watcher_evas_h */ + g_hash_table_insert(__watcher_tbl, watcher_evas_h->img_tbm, watcher_evas_h); + + /* Set data to use in accessibility */ + snprintf(plug_id, sizeof(plug_id), "%s:%d", appid, pid); + evas_object_data_set(watcher_evas_h->img_tbm, "___PLUGID", strdup(plug_id)); + evas_object_event_callback_add(watcher_evas_h->img_tbm, + EVAS_CALLBACK_MOVE, __obj_move_cb, watcher_evas_h); + + is_added = true; + } + + /* check type of given buffer */ + if (type == 0) {//if (type == TIZEN_REMOTE_SURFACE_BUFFER_TYPE_TBM) { + + /* get tbm surface from buffer */ + tbm_surface = wl_buffer_get_user_data(tbm); + width = tbm_surface_get_width(tbm_surface); + height = tbm_surface_get_height(tbm_surface); + + memset(&ns, 0, sizeof(Evas_Native_Surface)); + ns.version = EVAS_NATIVE_SURFACE_VERSION; + ns.type = EVAS_NATIVE_SURFACE_TBM; + ns.data.tbm.buffer = tbm_surface; + + evas_object_resize(watcher_evas_h->img_tbm, width, height); + evas_object_image_size_set(watcher_evas_h->img_tbm, width, height); + evas_object_image_native_surface_set(watcher_evas_h->img_tbm, &ns); /* set native surface */ + evas_object_image_pixels_dirty_set(watcher_evas_h->img_tbm, EINA_TRUE); /* set dirty for image updating */ + + //evas_object_del(watcher_evas_h->img_file); /* delete previous object for the image file type */ + + } else if (type == 1) {//} else if (type == TIZEN_REMOTE_SURFACE_BUFFER_TYPE_IMAGE_FILE) { + + if (!watcher_evas_h->img_file) { + watcher_evas_h->img_file = evas_object_image_filled_add( + evas_object_evas_get(__viewer_win)); + } + + map = mmap(NULL, img_file_size, PROT_READ, MAP_SHARED, img_file_fd, 0); + evas_object_image_memfile_set(watcher_evas_h->img_file, map, img_file_size, format, NULL); + evas_object_image_size_get(watcher_evas_h->img_tbm, &width, &height); + evas_object_image_fill_set(watcher_evas_h->img_file, 0, 0, width, height); + evas_object_resize(watcher_evas_h->img_file, width, height); + munmap(map, img_file_size); + close(img_file_fd); /* close passed fd */ + + evas_object_image_native_surface_set(watcher_evas_h->img_tbm, NULL); /* set null to previous object for the tbm type */ + } + + if (is_added) { + LOGD("call added !!!! %s", appid); + watcher_evas_h->ops->added(appid, watcher_evas_h->img_tbm, + watcher_evas_h->data); + } else { + LOGD("call updated !!!! %s", appid); + watcher_evas_h->ops->updated(appid, watcher_evas_h->img_tbm, + watcher_evas_h->data); + } + +} + +static void __watcher_update_cb(struct tizen_remote_surface *trs, struct wl_buffer *buffer, uint32_t time, void *data) +{ + __watcher_change_cb(trs, 0, buffer, 0, 0, 0, NULL, data); +} + +static void __free_watcher_evas_h(screen_connector_watcher_evas_h watcher_evas_h) +{ + if (!watcher_evas_h) + return; + + if (watcher_evas_h->watcher_h) + screen_connector_watcher_remove(watcher_evas_h->watcher_h); + + if (watcher_evas_h->img_tbm) { + evas_object_del(watcher_evas_h->img_tbm); + watcher_evas_h->img_tbm = NULL; + } + + if (watcher_evas_h->ops) + free(watcher_evas_h->ops); + + free(watcher_evas_h); +} + +static void __watcher_missing_cb(struct tizen_remote_surface *trs, void *data) +{ + screen_connector_watcher_evas_h watcher_evas_h; + char *plug_id; + char *appid; + + LOGD("missing"); + watcher_evas_h = (screen_connector_watcher_evas_h)data; + if (!watcher_evas_h) { + LOGE("Null watcher_evas_h"); + return; + } + + g_hash_table_remove(__watcher_tbl, watcher_evas_h->img_tbm); + + /* Remove data used in accessibility */ + plug_id = evas_object_data_del(watcher_evas_h->img_tbm, "___PLUGID"); + free(plug_id); + + appid = screen_connector_watcher_get_appid(watcher_evas_h->watcher_h); + watcher_evas_h->ops->removed(appid, watcher_evas_h->img_tbm, watcher_evas_h->data); + __free_watcher_evas_h(watcher_evas_h); +} + + EXPORT_API screen_connector_watcher_evas_h screen_connector_watcher_evas_add(screen_connector_watcher_evas_ops *ops, char *id, void *data) { screen_connector_watcher_evas_h handle; screen_connector_watcher_evas_ops *evas_ops; - screen_connector_watcher_ops *watcher_ops; + screen_connector_watcher_ops watcher_ops; - watcher_ops = (screen_connector_watcher_ops *)calloc(1, sizeof(screen_connector_watcher_ops)); - watcher_ops->added = __watcher_added_cb; - watcher_ops->removed = __watcher_removed_cb; - watcher_ops->updated = __watcher_updated_cb; + watcher_ops.change_cb = __watcher_change_cb; + watcher_ops.missing_cb = __watcher_missing_cb; + watcher_ops.update_cb = __watcher_update_cb; evas_ops = (screen_connector_watcher_evas_ops *)calloc(1, sizeof(screen_connector_watcher_evas_ops)); if (evas_ops == NULL) { @@ -107,7 +476,7 @@ EXPORT_API screen_connector_watcher_evas_h screen_connector_watcher_evas_add(scr } handle->ops = evas_ops; handle->data = data; - handle->watcher_h = screen_connector_watcher_add(watcher_ops, id, handle); + handle->watcher_h = screen_connector_watcher_add(&watcher_ops, id, handle); return handle; } @@ -126,4 +495,234 @@ EXPORT_API int screen_connector_watcher_evas_update(const char *appid) ret = screen_connector_watcher_update(appid); return ret; } + + +static void __send_visibility(gpointer key, gpointer value, gpointer user_data) +{ + screen_connector_watcher_evas_h watcher_evas_h = (screen_connector_watcher_evas_h)value; + Evas_Object *evas_obj = (Evas_Object *)key; + unsigned int event = GPOINTER_TO_INT(user_data); + int ret; + visibility_type type; + + if (watcher_evas_h->freeze) + return; + + if (!__obj_is_visible(evas_obj)) + return; + + if (event) + type = VISIBILITY_TYPE_FULLY_OBSCURED; + else + type = VISIBILITY_TYPE_UNOBSCURED; + + ret = __set_visibility(watcher_evas_h, type); + if (ret == -1) + LOGE("failed to set object visibility set %p to %d", evas_obj, type); +} + +static Eina_Bool __visibility_cb(void *data, int type, void *event) +{ + Ecore_Wl_Event_Window_Visibility_Change *ev = event; + + LOGD("visibility change: %d %d", (unsigned int)ev->win, + (unsigned int)ev->fully_obscured); + + if (!__watcher_tbl) + return ECORE_CALLBACK_RENEW; + + g_hash_table_foreach(__watcher_tbl, __send_visibility, + GINT_TO_POINTER(ev->fully_obscured)); + + return ECORE_CALLBACK_RENEW; +} + +EXPORT_API int screen_connector_watcher_evas_start_visibility_notify() +{ + if (__visibility_listener) + return 0; + + __visibility_listener = ecore_event_handler_add( + ECORE_WL_EVENT_WINDOW_VISIBILITY_CHANGE, __visibility_cb, NULL); + + return 0; +} + + +EXPORT_API int screen_connector_watcher_evas_stop_visibility_notify() +{ + if (!__visibility_listener) + return 0; + + ecore_event_handler_del(__visibility_listener); + __visibility_listener = NULL; + + return 0; +} + +EXPORT_API int screen_connector_watcher_evas_freeze_visibility(Evas_Object *obj, visibility_type type) +{ + screen_connector_watcher_evas_h watcher_evas_h; + + watcher_evas_h = (screen_connector_watcher_evas_h)g_hash_table_lookup(__watcher_tbl, obj); + if (!watcher_evas_h) { + LOGE("obj not found"); + return -1; + } + watcher_evas_h->freeze = 1; + + return __set_visibility(watcher_evas_h, type); +} + +EXPORT_API int screen_connector_watcher_evas_thaw_visibility(Evas_Object *obj) +{ + screen_connector_watcher_evas_h watcher_evas_h; + + watcher_evas_h = (screen_connector_watcher_evas_h)g_hash_table_lookup(__watcher_tbl, obj); + if (!watcher_evas_h) { + LOGE("obj not found"); + return -1; + } + watcher_evas_h->freeze = 0; + + return 0; +} + +EXPORT_API int screen_connector_watcher_evas_send_mouse_up(Evas_Object *obj) +{ + screen_connector_watcher_evas_h watcher_evas_h; + int x; + int y; + int w; + int h; + unsigned int timestamp; + struct tizen_remote_surface *surface; + + watcher_evas_h = g_hash_table_lookup(__watcher_tbl, obj); + if (!watcher_evas_h) { + LOGE("unknown object. not widget object."); + return -1; + } + + if (!watcher_evas_h->img_tbm) { + LOGE("surface not yet initialized."); + return -1; + } + + surface = screen_connector_watcher_get_trs(watcher_evas_h->watcher_h); + evas_object_geometry_get(obj, &x, &y, &w, &h); + timestamp = (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff); + tizen_remote_surface_transfer_mouse_event(surface, + TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_UP, + 0, + 1, + w / 2, + h / 2, + 0, + 0, + 0, + 0, + TIZEN_INPUT_DEVICE_CLAS_MOUSE, + TIZEN_INPUT_DEVICE_SUBCLAS_NONE, + "", + timestamp); + + return 0; +} + +EXPORT_API int screen_connector_watcher_evas_send_touch_cancel(Evas_Object *obj) +{ + screen_connector_watcher_evas_h watcher_evas_h; + struct tizen_remote_surface *surface; + + watcher_evas_h = g_hash_table_lookup(__watcher_tbl, obj); + if (!watcher_evas_h) { + LOGE("unknown object. not widget object."); + return -1; + } + + if (watcher_evas_h->img_tbm) { + surface = screen_connector_watcher_get_trs(watcher_evas_h->watcher_h); + tizen_remote_surface_transfer_touch_cancel(surface); + watcher_evas_h->cancel_touch = true; + } else { + LOGE("surface not yet initialized."); + return -1; + } + + return 0; +} + +EXPORT_API int screen_connector_watcher_evas_add_by_rid(screen_connector_watcher_evas_ops *ops, int res_id, void *data) +{ + GHashTableIter iter; + gpointer key, value; + screen_connector_watcher_evas_h watcher_evas_h; + screen_connector_watcher_evas_h cur_h = NULL; + screen_connector_watcher_evas_ops *evas_ops; + char *appid = NULL; + int pid = 0; + screen_connector_watcher_ops watcher_ops; + + watcher_ops.change_cb = __watcher_change_cb; + watcher_ops.missing_cb = __watcher_missing_cb; + watcher_ops.update_cb = __watcher_update_cb; + + g_hash_table_iter_init(&iter, __watcher_tbl); + while (g_hash_table_iter_next(&iter, &key, &value)) { + cur_h = (screen_connector_watcher_evas_h)value; + if (screen_connector_watcher_get_resource_id(cur_h->watcher_h) == res_id) { + appid = screen_connector_watcher_get_appid(cur_h->watcher_h); + pid = screen_connector_watcher_get_pid(cur_h->watcher_h); + break; + } + } + + evas_ops = (screen_connector_watcher_evas_ops *)calloc(1, sizeof(screen_connector_watcher_evas_ops)); + if (evas_ops == NULL) { + LOGE("evas_ops calloc fail"); + return -1; + } + + memcpy(evas_ops, ops, sizeof(screen_connector_watcher_evas_ops)); + watcher_evas_h = (screen_connector_watcher_evas_h)calloc(1, sizeof(struct _screen_connector_watcher_evas_h)); + if (watcher_evas_h == NULL) { + LOGE("handle calloc fail"); + return -1; + } + watcher_evas_h->ops = evas_ops; + watcher_evas_h->data = data; + watcher_evas_h->watcher_h = screen_connector_watcher_create_handle(appid, pid, &watcher_ops, watcher_evas_h); + screen_connector_watcher_redirect_surface(watcher_evas_h->watcher_h); + return 0; +} + +EXPORT_API int screen_connector_watcher_evas_get_rid(Evas_Object *obj, int *resource_id) +{ + + screen_connector_watcher_evas_h watcher_evas_h; + + watcher_evas_h = (screen_connector_watcher_evas_h)g_hash_table_lookup(__watcher_tbl, obj); + if (!watcher_evas_h) { + LOGE("unknown object. not widget object"); + return -1; + } + + return screen_connector_watcher_get_resource_id(watcher_evas_h->watcher_h); +} + + +EXPORT_API int screen_connector_watcher_evas_get_pid(Evas_Object *obj, int *pid) +{ + screen_connector_watcher_evas_h watcher_evas_h; + + watcher_evas_h = (screen_connector_watcher_evas_h)g_hash_table_lookup(__watcher_tbl, obj); + if (!watcher_evas_h) { + LOGE("unknown object. not widget object"); + return -1; + } + + return screen_connector_watcher_get_pid(watcher_evas_h->watcher_h); +} + /* End of a file */ -- 2.7.4 From 22997e40e765466572e97942b1b13c7c37626f03 Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Mon, 19 Dec 2016 16:37:05 +0900 Subject: [PATCH 03/16] tizen_remote_surface version up tizen_remote_surface manager version 1 has bug. tizen_remote_surface_release protocol is added. Change-Id: I23e4d6533451b78e2c88e0ab330d2af3485581f4 Signed-off-by: Hyunho Kang --- screen_connector_watcher/src/screen_connector_watcher.c | 3 ++- .../src/screen_connector_watcher_evas.c | 9 +++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/screen_connector_watcher/src/screen_connector_watcher.c b/screen_connector_watcher/src/screen_connector_watcher.c index 02210c6..acf1e07 100644 --- a/screen_connector_watcher/src/screen_connector_watcher.c +++ b/screen_connector_watcher/src/screen_connector_watcher.c @@ -178,7 +178,8 @@ EXPORT_API int screen_connector_watcher_init() 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 < 2 ? global->version : 2); } } 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 8f36025..3bfebd0 100644 --- a/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c +++ b/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c @@ -43,6 +43,7 @@ struct _screen_connector_watcher_evas_h { bool cancel_touch; Evas_Object *img_tbm; Evas_Object *img_file; + struct wl_buffer *pre_buffer; void *data; }; static Evas_Object *__viewer_win; @@ -313,6 +314,7 @@ static void __watcher_change_cb(struct tizen_remote_surface *trs, uint32_t type, watcher_evas_h = (screen_connector_watcher_evas_h)data; appid = screen_connector_watcher_get_appid(watcher_evas_h->watcher_h); pid = screen_connector_watcher_get_pid(watcher_evas_h->watcher_h); + if (watcher_evas_h->img_tbm == NULL) { LOGD("first added !!!! %d, %d %s", (watcher_evas_h->img_tbm == NULL), type, appid); @@ -391,6 +393,13 @@ static void __watcher_change_cb(struct tizen_remote_surface *trs, uint32_t type, evas_object_image_native_surface_set(watcher_evas_h->img_tbm, NULL); /* set null to previous object for the tbm type */ } + if (watcher_evas_h->pre_buffer) { + if (tizen_remote_surface_get_version(trs) >= TIZEN_REMOTE_SURFACE_RELEASE_SINCE_VERSION) + tizen_remote_surface_release(trs, watcher_evas_h->pre_buffer); + } + watcher_evas_h->pre_buffer = tbm; + + if (is_added) { LOGD("call added !!!! %s", appid); watcher_evas_h->ops->added(appid, watcher_evas_h->img_tbm, -- 2.7.4 From 4b6bb12caf18806f949d8d1814607de22e536031 Mon Sep 17 00:00:00 2001 From: Hwankyu Jhun Date: Tue, 20 Dec 2016 14:01:54 +0900 Subject: [PATCH 04/16] Adjust coding style Change-Id: Ia8eae134aac2f04a82e8402f93b194bfbe43b932 Signed-off-by: Hwankyu Jhun --- .../include/screen_connector_provider.h | 6 +- .../src/screen_connector_provider.c | 24 ++-- .../include/screen_connector_watcher.h | 8 +- .../src/screen_connector_watcher.c | 59 +++++----- .../include/screen_connector_watcher_evas.h | 25 ++--- .../src/screen_connector_watcher_evas.c | 123 ++++++++------------- 6 files changed, 109 insertions(+), 136 deletions(-) diff --git a/screen_connector_provider/include/screen_connector_provider.h b/screen_connector_provider/include/screen_connector_provider.h index f937c50..05d20ed 100644 --- a/screen_connector_provider/include/screen_connector_provider.h +++ b/screen_connector_provider/include/screen_connector_provider.h @@ -22,11 +22,11 @@ extern "C" { #endif int screen_connector_provider_remote_enable(const char *id, struct wl_surface *surface); -int screen_connector_provider_init(); -int screen_connector_provider_fini(); +int screen_connector_provider_init(void); +int screen_connector_provider_fini(void); #ifdef __cplusplus } #endif -#endif +#endif /* __SCREEN_CONNECTOR_PROVIDER_H__ */ diff --git a/screen_connector_provider/src/screen_connector_provider.c b/screen_connector_provider/src/screen_connector_provider.c index 7834f69..288804b 100644 --- a/screen_connector_provider/src/screen_connector_provider.c +++ b/screen_connector_provider/src/screen_connector_provider.c @@ -1,5 +1,4 @@ /* - * Screen Connector Watcher * Copyright (c) 2016 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the License); @@ -14,11 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + #include #include #include #include - #include #include #include @@ -28,7 +27,6 @@ #include #include - #include "screen_connector_provider.h" #ifdef LOG_TAG @@ -49,7 +47,6 @@ struct __remote_surface_s { static void __rsp_resource_id_cb(void *data, struct tizen_remote_surface_provider *provider, uint32_t res_id) { - LOGE("add app screen : %d", res_id); aul_screen_connector_add_app_screen(res_id); } @@ -139,16 +136,15 @@ EXPORT_API int screen_connector_provider_remote_enable(const char *id, struct wl return 0; } -EXPORT_API int screen_connector_provider_init() +EXPORT_API int screen_connector_provider_init(void) { - int ret = 0; struct wl_registry *registry; Ecore_Wl_Global *global; Eina_Inlist *globals; - if (__init_count > 0) { + if (__init_count > 0) return 0; - } + ecore_wl_init(NULL); registry = ecore_wl_registry_get(); @@ -156,14 +152,14 @@ EXPORT_API int screen_connector_provider_init() if (!registry || !globals) { LOGE("could not get registry(%p) or global list(%p)", registry, - globals); + globals); return -1; } 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, 1); } } @@ -173,13 +169,11 @@ EXPORT_API int screen_connector_provider_init() } __init_count++; - return ret; + return 0; } -EXPORT_API int screen_connector_provider_fini() +EXPORT_API int screen_connector_provider_fini(void) { - int ret = 0; - if (__init_count > 1) return 0; @@ -189,5 +183,5 @@ EXPORT_API int screen_connector_provider_fini() ecore_wl_shutdown(); __init_count--; - return ret; + return 0; } diff --git a/screen_connector_watcher/include/screen_connector_watcher.h b/screen_connector_watcher/include/screen_connector_watcher.h index 0bfde94..b1cfed7 100644 --- a/screen_connector_watcher/include/screen_connector_watcher.h +++ b/screen_connector_watcher/include/screen_connector_watcher.h @@ -26,7 +26,7 @@ extern "C" { 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, - int32_t img_file_fd, uint32_t img_file_size, uint32_t time, struct wl_array *keys, void *data); + int32_t img_file_fd, uint32_t img_file_size, uint32_t time, struct wl_array *keys, void *data); typedef struct _screen_connector_watcher_ops { screen_connector_watcher_update_cb update_cb; @@ -36,8 +36,8 @@ typedef struct _screen_connector_watcher_ops { typedef struct _screen_connector_watcher_h *screen_connector_watcher_h; -int screen_connector_watcher_init(); -int screen_connector_watcher_fini(); +int screen_connector_watcher_init(void); +int screen_connector_watcher_fini(void); screen_connector_watcher_h screen_connector_watcher_add(screen_connector_watcher_ops *ops, char *id, void *data); int screen_connector_watcher_remove(screen_connector_watcher_h h); int screen_connector_watcher_update(const char *appid); @@ -52,4 +52,4 @@ void screen_connector_watcher_redirect_surface(screen_connector_watcher_h watche } #endif -#endif +#endif /* __SCREEN_CONNECTOR_WATCHER_H__ */ diff --git a/screen_connector_watcher/src/screen_connector_watcher.c b/screen_connector_watcher/src/screen_connector_watcher.c index acf1e07..c1bcfb1 100644 --- a/screen_connector_watcher/src/screen_connector_watcher.c +++ b/screen_connector_watcher/src/screen_connector_watcher.c @@ -1,5 +1,4 @@ /* - * Screen Connector Watcher * Copyright (c) 2016 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the License); @@ -14,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + #include #include #include - #include #include #include @@ -40,7 +39,7 @@ struct _screen_connector_watcher_h { void (*update_cb)(struct tizen_remote_surface *trs, struct wl_buffer *buffer, uint32_t time, void *data); void (*missing_cb)(struct tizen_remote_surface *trs, void *data); void (*change_cb)(struct tizen_remote_surface *trs, uint32_t type, struct wl_buffer *tbm, - int32_t img_file_fd, uint32_t img_file_size, uint32_t time, struct wl_array *keys, void *data); + 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; int resource_id; @@ -51,7 +50,7 @@ typedef struct _screen_connector_watcher_h *screen_connector_watcher_h; static struct tizen_remote_surface_manager *__rsm; static struct wayland_tbm_client *__tbm_client; static struct wl_tbm *__tbm; -static bool __is_init = false; +static bool __is_init; static GList *__watcher_list; static GList *__pending_watcher_list; static aul_screen_viewer_handler __aul_cbs; @@ -59,6 +58,7 @@ static aul_screen_viewer_handler __aul_cbs; static void __buffer_updated(void *data, struct tizen_remote_surface *trs, struct wl_buffer *buffer, uint32_t time) { screen_connector_watcher_h watcher_h = (screen_connector_watcher_h)data; + if (watcher_h) watcher_h->update_cb(trs, buffer, time, watcher_h->data); } @@ -66,15 +66,17 @@ static void __buffer_updated(void *data, struct tizen_remote_surface *trs, struc static void __buffer_missing(void *data, struct tizen_remote_surface *trs) { screen_connector_watcher_h watcher_h = (screen_connector_watcher_h)data; + if (watcher_h) watcher_h->missing_cb(trs, watcher_h->data); } #if 0 static void __buffer_changed(void *data, struct tizen_remote_surface *trs, uint32_t type, struct wl_buffer *tbm, - int32_t img_file_fd, uint32_t img_file_size, uint32_t time, struct wl_array *keys) + int32_t img_file_fd, uint32_t img_file_size, uint32_t time, struct wl_array *keys) { screen_connector_watcher_h watcher_h = (screen_connector_watcher_h)data; + if (watcher_h) watcher_h->change_cb(trs, type, tbm, img_file_fd, img_file_size, time, keys, watcher_h->data); } @@ -97,35 +99,43 @@ static void __app_removed(const char *appid, const int pid, void *data) EXPORT_API void screen_connector_watcher_redirect_surface(screen_connector_watcher_h watcher_h) { - watcher_h->surface = - tizen_remote_surface_manager_create_surface(__rsm, (uint32_t)watcher_h->resource_id, __tbm); + if (watcher_h == NULL) + return; + + watcher_h->surface = tizen_remote_surface_manager_create_surface(__rsm, (uint32_t)watcher_h->resource_id, __tbm); LOGD("resource_id : %d, (%p)", watcher_h->resource_id, watcher_h->surface); - tizen_remote_surface_add_listener(watcher_h->surface, &__rs_listener, - watcher_h); + tizen_remote_surface_add_listener(watcher_h->surface, &__rs_listener, watcher_h); tizen_remote_surface_redirect(watcher_h->surface); } static screen_connector_watcher_h __create_watcher_handle_info(char *appid) { - screen_connector_watcher_h watcher_h = NULL; + screen_connector_watcher_h watcher_h; + watcher_h = (screen_connector_watcher_h)calloc(1, sizeof(struct _screen_connector_watcher_h)); if (watcher_h == NULL) { LOGE("watcher_h calloc fail"); return NULL; } + watcher_h->appid = strdup(appid); + if (watcher_h->appid == NULL) { + LOGE("out of memory"); + free(watcher_h); + return NULL; + } return watcher_h; } static void __app_added(const char *appid, const int pid, const unsigned int resource_id, void *data) { - LOGD("__app_added pid: %d, resource_id: %d, appid: %s", pid, resource_id, appid); screen_connector_watcher_h watcher_h = NULL; - screen_connector_watcher_h cur_h = NULL; + screen_connector_watcher_h cur_h; GList *watcher_list = __watcher_list; + LOGD("__app_added pid: %d, resource_id: %d, appid: %s", pid, resource_id, appid); for (; watcher_list != NULL; watcher_list = watcher_list->next) { cur_h = (screen_connector_watcher_h)watcher_list->data; if (strcmp(cur_h->appid, appid) == 0) { @@ -151,10 +161,9 @@ static void __app_added(const char *appid, const int pid, const unsigned int res screen_connector_watcher_redirect_surface(watcher_h); else LOGE("bad tbm message received. missing arguments"); - } -EXPORT_API int screen_connector_watcher_init() +EXPORT_API int screen_connector_watcher_init(void) { int ret = 0; struct wl_registry *registry; @@ -171,15 +180,15 @@ EXPORT_API int screen_connector_watcher_init() if (!registry || !globals) { LOGE("could not get registry(%p) or global list(%p)", registry, - globals); + globals); return -1; } 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, - global->version < 2 ? global->version : 2); + &tizen_remote_surface_manager_interface, + global->version < 2 ? global->version : 2); } } @@ -209,7 +218,7 @@ EXPORT_API int screen_connector_watcher_init() return ret; } -EXPORT_API int screen_connector_watcher_fini() +EXPORT_API int screen_connector_watcher_fini(void) { if (!__is_init) return 0; @@ -245,6 +254,9 @@ EXPORT_API screen_connector_watcher_h screen_connector_watcher_create_handle(cha screen_connector_watcher_h watcher_h = NULL; watcher_h = __create_watcher_handle_info(id); + if (watcher_h == NULL) + return NULL; + watcher_h->update_cb = ops->update_cb; watcher_h->change_cb = ops->change_cb; watcher_h->missing_cb = ops->missing_cb; @@ -256,9 +268,8 @@ EXPORT_API screen_connector_watcher_h screen_connector_watcher_create_handle(cha EXPORT_API screen_connector_watcher_h screen_connector_watcher_add(screen_connector_watcher_ops *ops, char *id, void *data) { - screen_connector_watcher_h watcher_h = NULL; - screen_connector_watcher_h cur_h = NULL; + screen_connector_watcher_h cur_h; GList *watcher_list = __pending_watcher_list; for (; watcher_list != NULL; watcher_list = watcher_list->next) { @@ -290,16 +301,14 @@ EXPORT_API screen_connector_watcher_h screen_connector_watcher_add(screen_connec EXPORT_API int screen_connector_watcher_remove(screen_connector_watcher_h h) { - int ret = 0; __destroy_watcher_h(h); - return ret; + + return 0; } EXPORT_API int screen_connector_watcher_update(const char *appid) { - int ret = 0; - ret = aul_screen_connector_update_app_screen(appid); - return ret; + return aul_screen_connector_update_app_screen(appid); } EXPORT_API char *screen_connector_watcher_get_appid(screen_connector_watcher_h h) diff --git a/screen_connector_watcher_evas/include/screen_connector_watcher_evas.h b/screen_connector_watcher_evas/include/screen_connector_watcher_evas.h index efbe06a..117fea5 100644 --- a/screen_connector_watcher_evas/include/screen_connector_watcher_evas.h +++ b/screen_connector_watcher_evas/include/screen_connector_watcher_evas.h @@ -14,8 +14,8 @@ * limitations under the License. */ -#ifndef __SCREEN_CONNECTOR_WATCHER_EVAS_H -#define __SCREEN_CONNECTOR_WATCHER_EVAS_H +#ifndef __SCREEN_CONNECTOR_WATCHER_EVAS_H__ +#define __SCREEN_CONNECTOR_WATCHER_EVAS_H__ #include #include @@ -37,7 +37,7 @@ extern "C" { */ typedef enum { - VISIBILITY_TYPE_UNOBSCURED = 0, + VISIBILITY_TYPE_UNOBSCURED, VISIBILITY_TYPE_PARTIALLY_OBSCURED, VISIBILITY_TYPE_FULLY_OBSCURED, } visibility_type; @@ -47,21 +47,20 @@ typedef void (*screen_connector_watcher_evas_removed_cb)(const char *appid, Evas typedef void (*screen_connector_watcher_evas_updated_cb)(const char *appid, Evas_Object *image, void *data); typedef struct _screen_connector_watcher_evas_ops { - screen_connector_watcher_evas_added_cb added; - screen_connector_watcher_evas_removed_cb removed; - screen_connector_watcher_evas_updated_cb updated; -}screen_connector_watcher_evas_ops; + screen_connector_watcher_evas_added_cb added; + screen_connector_watcher_evas_removed_cb removed; + screen_connector_watcher_evas_updated_cb updated; +} screen_connector_watcher_evas_ops; typedef struct _screen_connector_watcher_evas_h *screen_connector_watcher_evas_h; int screen_connector_watcher_evas_init(Evas_Object *win); -int screen_connector_watcher_evas_fini(); +int screen_connector_watcher_evas_fini(void); screen_connector_watcher_evas_h screen_connector_watcher_evas_add(screen_connector_watcher_evas_ops *ops, char *id, void *data); int screen_connector_watcher_evas_remove(screen_connector_watcher_evas_h handle); int screen_connector_watcher_evas_update(const char *appid); - -int screen_connector_watcher_evas_start_visibility_notify(); -int screen_connector_watcher_evas_stop_visibility_notify(); +int screen_connector_watcher_evas_start_visibility_notify(void); +int screen_connector_watcher_evas_stop_visibility_notify(void); int screen_connector_watcher_evas_freeze_visibility(Evas_Object *obj, visibility_type type); int screen_connector_watcher_evas_thaw_visibility(Evas_Object *obj); int screen_connector_watcher_evas_send_mouse_up(Evas_Object *obj); @@ -78,6 +77,4 @@ int screen_connector_watcher_evas_get_rid(Evas_Object *obj, int *resource_id); } #endif -#endif - -/* End of a file */ +#endif /* __SCREEN_CONNECTOR_WATCHER_EVAS_H__ */ 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 3bfebd0..9152610 100644 --- a/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c +++ b/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c @@ -1,5 +1,4 @@ /* - * Screen Connector Watcher Evas * Copyright (c) 2016 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the License); @@ -19,7 +18,6 @@ #include #include #include - #include #include #include @@ -46,6 +44,7 @@ struct _screen_connector_watcher_evas_h { struct wl_buffer *pre_buffer; void *data; }; + static Evas_Object *__viewer_win; static Ecore_Event_Handler *__visibility_listener; static GHashTable *__watcher_tbl; @@ -60,7 +59,6 @@ static void __destroy_watcher_evas_handle(screen_connector_watcher_evas_h h) EXPORT_API int screen_connector_watcher_evas_init(Evas_Object *win) { - int ret = 0; __viewer_win = win; __watcher_tbl = g_hash_table_new(g_direct_hash, g_direct_equal); @@ -69,19 +67,15 @@ EXPORT_API int screen_connector_watcher_evas_init(Evas_Object *win) return -1; } - ret = screen_connector_watcher_init(); - return ret; + return screen_connector_watcher_init(); } -EXPORT_API int screen_connector_watcher_evas_fini() +EXPORT_API int screen_connector_watcher_evas_fini(void) { - int ret = 0; - if (__watcher_tbl) g_hash_table_destroy(__watcher_tbl); - ret = screen_connector_watcher_fini(); - return ret; + return screen_connector_watcher_fini(); } static bool __obj_is_visible(Evas_Object *obj) @@ -100,15 +94,16 @@ static bool __obj_is_visible(Evas_Object *obj) y >= 0 && y < window_h && (rotation == 0 || rotation == 180)) { LOGD("x %d, y %d w %d h %d, window_w %d window_h %d rotation %d", - x, y, w, h, window_w, window_h, rotation); + x, y, w, h, window_w, window_h, rotation); return true; } else if (x >= 0 && x < window_h && y >= 0 && y < window_w && (rotation == 90 || rotation == 270)) { LOGD("x %d, y %d w %d h %d, window_w %d window_h %d rotation %d", - x, y, w, h, window_w, window_h, rotation); + x, y, w, h, window_w, window_h, rotation); return true; } + return false; } @@ -224,7 +219,6 @@ static void __rs_cb_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_ evas_device_subclass_get(ev->dev), desc, ev->timestamp); - } static void __rs_cb_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info) @@ -260,7 +254,6 @@ static void __rs_cb_mouse_move(void *data, Evas *e, Evas_Object *obj, void *even evas_device_subclass_get(ev->dev), desc, ev->timestamp); - } static void __rs_cb_mouse_wheel(void *data, Evas *e, Evas_Object *obj, void *event_info) @@ -283,7 +276,6 @@ static void __rs_cb_mouse_wheel(void *data, Evas *e, Evas_Object *obj, void *eve evas_device_subclass_get(ev->dev), desc, ev->timestamp); - } static void __rs_cb_show(void *data, Evas *e, Evas_Object *obj, void *event_info) @@ -297,9 +289,8 @@ static void __rs_cb_hide(void *data, Evas *e, Evas_Object *obj, void *event_info } static void __watcher_change_cb(struct tizen_remote_surface *trs, uint32_t type, struct wl_buffer *tbm, - int32_t img_file_fd, uint32_t img_file_size, uint32_t time, struct wl_array *keys, void *data) + int32_t img_file_fd, uint32_t img_file_size, uint32_t time, struct wl_array *keys, void *data) { - bool is_added = false; Evas_Native_Surface ns; tbm_surface_h tbm_surface; @@ -316,32 +307,31 @@ static void __watcher_change_cb(struct tizen_remote_surface *trs, uint32_t type, pid = screen_connector_watcher_get_pid(watcher_evas_h->watcher_h); if (watcher_evas_h->img_tbm == NULL) { - LOGD("first added !!!! %d, %d %s", (watcher_evas_h->img_tbm == NULL), type, appid); watcher_evas_h->img_tbm = evas_object_image_filled_add( - evas_object_evas_get(__viewer_win)); + evas_object_evas_get(__viewer_win)); /* Image alpha set */ evas_object_image_alpha_set(watcher_evas_h->img_tbm, 1); evas_object_event_callback_add(watcher_evas_h->img_tbm, - EVAS_CALLBACK_MOUSE_DOWN, - __rs_cb_mouse_down, watcher_evas_h); + EVAS_CALLBACK_MOUSE_DOWN, + __rs_cb_mouse_down, watcher_evas_h); evas_object_event_callback_add(watcher_evas_h->img_tbm, - EVAS_CALLBACK_MOUSE_UP, - __rs_cb_mouse_up, watcher_evas_h); + EVAS_CALLBACK_MOUSE_UP, + __rs_cb_mouse_up, watcher_evas_h); evas_object_event_callback_add(watcher_evas_h->img_tbm, - EVAS_CALLBACK_MOUSE_MOVE, - __rs_cb_mouse_move, watcher_evas_h); + EVAS_CALLBACK_MOUSE_MOVE, + __rs_cb_mouse_move, watcher_evas_h); evas_object_event_callback_add(watcher_evas_h->img_tbm, - EVAS_CALLBACK_MOUSE_WHEEL, - __rs_cb_mouse_wheel, watcher_evas_h); + EVAS_CALLBACK_MOUSE_WHEEL, + __rs_cb_mouse_wheel, watcher_evas_h); evas_object_event_callback_add(watcher_evas_h->img_tbm, - EVAS_CALLBACK_SHOW, - __rs_cb_show, watcher_evas_h); + EVAS_CALLBACK_SHOW, + __rs_cb_show, watcher_evas_h); evas_object_event_callback_add(watcher_evas_h->img_tbm, - EVAS_CALLBACK_HIDE, - __rs_cb_hide, watcher_evas_h); + EVAS_CALLBACK_HIDE, + __rs_cb_hide, watcher_evas_h); /* Store watcher_evas_h */ g_hash_table_insert(__watcher_tbl, watcher_evas_h->img_tbm, watcher_evas_h); @@ -350,14 +340,13 @@ static void __watcher_change_cb(struct tizen_remote_surface *trs, uint32_t type, snprintf(plug_id, sizeof(plug_id), "%s:%d", appid, pid); evas_object_data_set(watcher_evas_h->img_tbm, "___PLUGID", strdup(plug_id)); evas_object_event_callback_add(watcher_evas_h->img_tbm, - EVAS_CALLBACK_MOVE, __obj_move_cb, watcher_evas_h); + EVAS_CALLBACK_MOVE, __obj_move_cb, watcher_evas_h); is_added = true; } /* check type of given buffer */ - if (type == 0) {//if (type == TIZEN_REMOTE_SURFACE_BUFFER_TYPE_TBM) { - + if (type == 0) { /* get tbm surface from buffer */ tbm_surface = wl_buffer_get_user_data(tbm); width = tbm_surface_get_width(tbm_surface); @@ -372,15 +361,9 @@ static void __watcher_change_cb(struct tizen_remote_surface *trs, uint32_t type, evas_object_image_size_set(watcher_evas_h->img_tbm, width, height); evas_object_image_native_surface_set(watcher_evas_h->img_tbm, &ns); /* set native surface */ evas_object_image_pixels_dirty_set(watcher_evas_h->img_tbm, EINA_TRUE); /* set dirty for image updating */ - - //evas_object_del(watcher_evas_h->img_file); /* delete previous object for the image file type */ - - } else if (type == 1) {//} else if (type == TIZEN_REMOTE_SURFACE_BUFFER_TYPE_IMAGE_FILE) { - - if (!watcher_evas_h->img_file) { - watcher_evas_h->img_file = evas_object_image_filled_add( - evas_object_evas_get(__viewer_win)); - } + } else if (type == 1) { + if (!watcher_evas_h->img_file) + watcher_evas_h->img_file = evas_object_image_filled_add(evas_object_evas_get(__viewer_win)); map = mmap(NULL, img_file_size, PROT_READ, MAP_SHARED, img_file_fd, 0); evas_object_image_memfile_set(watcher_evas_h->img_file, map, img_file_size, format, NULL); @@ -399,7 +382,6 @@ static void __watcher_change_cb(struct tizen_remote_surface *trs, uint32_t type, } watcher_evas_h->pre_buffer = tbm; - if (is_added) { LOGD("call added !!!! %s", appid); watcher_evas_h->ops->added(appid, watcher_evas_h->img_tbm, @@ -409,7 +391,6 @@ static void __watcher_change_cb(struct tizen_remote_surface *trs, uint32_t type, watcher_evas_h->ops->updated(appid, watcher_evas_h->img_tbm, watcher_evas_h->data); } - } static void __watcher_update_cb(struct tizen_remote_surface *trs, struct wl_buffer *buffer, uint32_t time, void *data) @@ -460,7 +441,6 @@ static void __watcher_missing_cb(struct tizen_remote_surface *trs, void *data) __free_watcher_evas_h(watcher_evas_h); } - EXPORT_API screen_connector_watcher_evas_h screen_connector_watcher_evas_add(screen_connector_watcher_evas_ops *ops, char *id, void *data) { screen_connector_watcher_evas_h handle; @@ -492,7 +472,8 @@ EXPORT_API screen_connector_watcher_evas_h screen_connector_watcher_evas_add(scr EXPORT_API int screen_connector_watcher_evas_remove(screen_connector_watcher_evas_h handle) { - int ret = 0; + int ret; + ret = screen_connector_watcher_remove(handle->watcher_h); __destroy_watcher_evas_handle(handle); return ret; @@ -500,12 +481,9 @@ EXPORT_API int screen_connector_watcher_evas_remove(screen_connector_watcher_eva EXPORT_API int screen_connector_watcher_evas_update(const char *appid) { - int ret = 0; - ret = screen_connector_watcher_update(appid); - return ret; + return screen_connector_watcher_update(appid); } - static void __send_visibility(gpointer key, gpointer value, gpointer user_data) { screen_connector_watcher_evas_h watcher_evas_h = (screen_connector_watcher_evas_h)value; @@ -535,30 +513,28 @@ static Eina_Bool __visibility_cb(void *data, int type, void *event) Ecore_Wl_Event_Window_Visibility_Change *ev = event; LOGD("visibility change: %d %d", (unsigned int)ev->win, - (unsigned int)ev->fully_obscured); + (unsigned int)ev->fully_obscured); if (!__watcher_tbl) return ECORE_CALLBACK_RENEW; g_hash_table_foreach(__watcher_tbl, __send_visibility, - GINT_TO_POINTER(ev->fully_obscured)); + GINT_TO_POINTER(ev->fully_obscured)); return ECORE_CALLBACK_RENEW; } -EXPORT_API int screen_connector_watcher_evas_start_visibility_notify() +EXPORT_API int screen_connector_watcher_evas_start_visibility_notify(void) { if (__visibility_listener) return 0; - __visibility_listener = ecore_event_handler_add( - ECORE_WL_EVENT_WINDOW_VISIBILITY_CHANGE, __visibility_cb, NULL); + __visibility_listener = ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_VISIBILITY_CHANGE, __visibility_cb, NULL); return 0; } - -EXPORT_API int screen_connector_watcher_evas_stop_visibility_notify() +EXPORT_API int screen_connector_watcher_evas_stop_visibility_notify(void) { if (!__visibility_listener) return 0; @@ -622,19 +598,19 @@ EXPORT_API int screen_connector_watcher_evas_send_mouse_up(Evas_Object *obj) evas_object_geometry_get(obj, &x, &y, &w, &h); timestamp = (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff); tizen_remote_surface_transfer_mouse_event(surface, - TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_UP, - 0, - 1, - w / 2, - h / 2, - 0, - 0, - 0, - 0, - TIZEN_INPUT_DEVICE_CLAS_MOUSE, - TIZEN_INPUT_DEVICE_SUBCLAS_NONE, - "", - timestamp); + TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_UP, + 0, + 1, + w / 2, + h / 2, + 0, + 0, + 0, + 0, + TIZEN_INPUT_DEVICE_CLAS_MOUSE, + TIZEN_INPUT_DEVICE_SUBCLAS_NONE, + "", + timestamp); return 0; } @@ -703,12 +679,12 @@ EXPORT_API int screen_connector_watcher_evas_add_by_rid(screen_connector_watcher watcher_evas_h->data = data; watcher_evas_h->watcher_h = screen_connector_watcher_create_handle(appid, pid, &watcher_ops, watcher_evas_h); screen_connector_watcher_redirect_surface(watcher_evas_h->watcher_h); + return 0; } EXPORT_API int screen_connector_watcher_evas_get_rid(Evas_Object *obj, int *resource_id) { - screen_connector_watcher_evas_h watcher_evas_h; watcher_evas_h = (screen_connector_watcher_evas_h)g_hash_table_lookup(__watcher_tbl, obj); @@ -720,7 +696,6 @@ EXPORT_API int screen_connector_watcher_evas_get_rid(Evas_Object *obj, int *reso return screen_connector_watcher_get_resource_id(watcher_evas_h->watcher_h); } - EXPORT_API int screen_connector_watcher_evas_get_pid(Evas_Object *obj, int *pid) { screen_connector_watcher_evas_h watcher_evas_h; @@ -733,5 +708,3 @@ EXPORT_API int screen_connector_watcher_evas_get_pid(Evas_Object *obj, int *pid) return screen_connector_watcher_get_pid(watcher_evas_h->watcher_h); } - -/* End of a file */ -- 2.7.4 From ffa0de1e1fa558b8649f868d6fce9ac1bf93e591 Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Fri, 23 Dec 2016 09:21:19 +0900 Subject: [PATCH 05/16] Fix fail to get object pid Change-Id: I4cfff44f1628e9bd4467d437a446e3445de9c51f Signed-off-by: Hyunho Kang --- screen_connector_watcher_evas/src/screen_connector_watcher_evas.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 9152610..e560334 100644 --- a/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c +++ b/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c @@ -705,6 +705,7 @@ EXPORT_API int screen_connector_watcher_evas_get_pid(Evas_Object *obj, int *pid) LOGE("unknown object. not widget object"); return -1; } + *pid = screen_connector_watcher_get_pid(watcher_evas_h->watcher_h); - return screen_connector_watcher_get_pid(watcher_evas_h->watcher_h); + return 0; } -- 2.7.4 From a6feb4b93fb290802d392a5bfd5998fefa2bdff9 Mon Sep 17 00:00:00 2001 From: Semun Lee Date: Wed, 28 Dec 2016 14:01:47 +0900 Subject: [PATCH 06/16] Call visibility update in show,resize callback We need to update initial visibility value for the object when it is shown or resized. If we skip it, the display server sets its own visibility state value for the object as invisible one. Change-Id: I75782a77f1cabadafabf560965e34e634816d702 Signed-off-by: Semun Lee --- .../src/screen_connector_watcher_evas.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) 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 e560334..9cb94d4 100644 --- a/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c +++ b/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c @@ -136,7 +136,7 @@ static int __set_visibility(screen_connector_watcher_evas_h watcher_evas_h, visi return 0; } -static void __obj_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +static void __obj_update_visibility(void *data, Evas *e, Evas_Object *obj, void *event_info) { screen_connector_watcher_evas_h watcher_evas_h = (screen_connector_watcher_evas_h)data; @@ -281,6 +281,7 @@ static void __rs_cb_mouse_wheel(void *data, Evas *e, Evas_Object *obj, void *eve static void __rs_cb_show(void *data, Evas *e, Evas_Object *obj, void *event_info) { LOGD("show"); + __obj_update_visibility(data, e, obj, event_info); } static void __rs_cb_hide(void *data, Evas *e, Evas_Object *obj, void *event_info) @@ -288,6 +289,12 @@ static void __rs_cb_hide(void *data, Evas *e, Evas_Object *obj, void *event_info LOGD("hide"); } +static void __rs_cb_resize(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + LOGD("resize"); + __obj_update_visibility(data, e, obj, event_info); +} + static void __watcher_change_cb(struct tizen_remote_surface *trs, uint32_t type, struct wl_buffer *tbm, int32_t img_file_fd, uint32_t img_file_size, uint32_t time, struct wl_array *keys, void *data) { @@ -332,6 +339,9 @@ static void __watcher_change_cb(struct tizen_remote_surface *trs, uint32_t type, evas_object_event_callback_add(watcher_evas_h->img_tbm, EVAS_CALLBACK_HIDE, __rs_cb_hide, watcher_evas_h); + evas_object_event_callback_add(watcher_evas_h->img_tbm, + EVAS_CALLBACK_RESIZE, + __rs_cb_resize, watcher_evas_h); /* Store watcher_evas_h */ g_hash_table_insert(__watcher_tbl, watcher_evas_h->img_tbm, watcher_evas_h); @@ -340,7 +350,7 @@ static void __watcher_change_cb(struct tizen_remote_surface *trs, uint32_t type, snprintf(plug_id, sizeof(plug_id), "%s:%d", appid, pid); evas_object_data_set(watcher_evas_h->img_tbm, "___PLUGID", strdup(plug_id)); evas_object_event_callback_add(watcher_evas_h->img_tbm, - EVAS_CALLBACK_MOVE, __obj_move_cb, watcher_evas_h); + EVAS_CALLBACK_MOVE, __obj_update_visibility, watcher_evas_h); is_added = true; } -- 2.7.4 From 3fd02474299527b3b60eda271590a3445d6ac822 Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Thu, 5 Jan 2017 22:32:10 +0900 Subject: [PATCH 07/16] Add Null Check logic __watcher_tbl can be already destroyed by screen_connector_watcher_evas_fini call Change-Id: I783c4bcdea20d02ced1910a066d0d1652f0d5d9a Signed-off-by: Hyunho Kang --- .../src/screen_connector_watcher_evas.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) 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 9cb94d4..4cb233e 100644 --- a/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c +++ b/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c @@ -75,6 +75,7 @@ EXPORT_API int screen_connector_watcher_evas_fini(void) if (__watcher_tbl) g_hash_table_destroy(__watcher_tbl); + __watcher_tbl = NULL; return screen_connector_watcher_fini(); } @@ -440,11 +441,13 @@ static void __watcher_missing_cb(struct tizen_remote_surface *trs, void *data) return; } - g_hash_table_remove(__watcher_tbl, watcher_evas_h->img_tbm); + if (__watcher_tbl != NULL && watcher_evas_h->img_tbm != NULL) { + g_hash_table_remove(__watcher_tbl, watcher_evas_h->img_tbm); - /* Remove data used in accessibility */ - plug_id = evas_object_data_del(watcher_evas_h->img_tbm, "___PLUGID"); - free(plug_id); + /* Remove data used in accessibility */ + plug_id = evas_object_data_del(watcher_evas_h->img_tbm, "___PLUGID"); + free(plug_id); + } appid = screen_connector_watcher_get_appid(watcher_evas_h->watcher_h); watcher_evas_h->ops->removed(appid, watcher_evas_h->img_tbm, watcher_evas_h->data); -- 2.7.4 From 7d2b2c27ba0d30a951c26802a7412d8c3a563ef0 Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Tue, 17 Jan 2017 10:00:29 +0900 Subject: [PATCH 08/16] Add tizen remote surface buffer changed callback tizen remote surface version up to 3. Change-Id: I1e4b5fab125903ac7b63c8a1a97314accb576380 Signed-off-by: Hyunho Kang --- screen_connector_watcher/src/screen_connector_watcher.c | 7 ------- screen_connector_watcher_evas/src/screen_connector_watcher_evas.c | 6 +++--- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/screen_connector_watcher/src/screen_connector_watcher.c b/screen_connector_watcher/src/screen_connector_watcher.c index c1bcfb1..9077d76 100644 --- a/screen_connector_watcher/src/screen_connector_watcher.c +++ b/screen_connector_watcher/src/screen_connector_watcher.c @@ -71,7 +71,6 @@ static void __buffer_missing(void *data, struct tizen_remote_surface *trs) watcher_h->missing_cb(trs, watcher_h->data); } -#if 0 static void __buffer_changed(void *data, struct tizen_remote_surface *trs, uint32_t type, struct wl_buffer *tbm, int32_t img_file_fd, uint32_t img_file_size, uint32_t time, struct wl_array *keys) { @@ -86,12 +85,6 @@ static const struct tizen_remote_surface_listener __rs_listener = { __buffer_missing, __buffer_changed, }; -#else -static const struct tizen_remote_surface_listener __rs_listener = { - __buffer_updated, - __buffer_missing, -}; -#endif static void __app_removed(const char *appid, const int pid, void *data) { 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 4cb233e..a690fff 100644 --- a/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c +++ b/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c @@ -357,7 +357,7 @@ static void __watcher_change_cb(struct tizen_remote_surface *trs, uint32_t type, } /* check type of given buffer */ - if (type == 0) { + if (type == TIZEN_REMOTE_SURFACE_BUFFER_TYPE_TBM) { /* get tbm surface from buffer */ tbm_surface = wl_buffer_get_user_data(tbm); width = tbm_surface_get_width(tbm_surface); @@ -372,7 +372,7 @@ static void __watcher_change_cb(struct tizen_remote_surface *trs, uint32_t type, evas_object_image_size_set(watcher_evas_h->img_tbm, width, height); evas_object_image_native_surface_set(watcher_evas_h->img_tbm, &ns); /* set native surface */ evas_object_image_pixels_dirty_set(watcher_evas_h->img_tbm, EINA_TRUE); /* set dirty for image updating */ - } else if (type == 1) { + } else if (type == TIZEN_REMOTE_SURFACE_BUFFER_TYPE_IMAGE_FILE) { if (!watcher_evas_h->img_file) watcher_evas_h->img_file = evas_object_image_filled_add(evas_object_evas_get(__viewer_win)); @@ -406,7 +406,7 @@ static void __watcher_change_cb(struct tizen_remote_surface *trs, uint32_t type, static void __watcher_update_cb(struct tizen_remote_surface *trs, struct wl_buffer *buffer, uint32_t time, void *data) { - __watcher_change_cb(trs, 0, buffer, 0, 0, 0, NULL, data); + __watcher_change_cb(trs, TIZEN_REMOTE_SURFACE_BUFFER_TYPE_TBM, buffer, 0, 0, 0, NULL, data); } static void __free_watcher_evas_h(screen_connector_watcher_evas_h watcher_evas_h) -- 2.7.4 From b615969580f1a1919b47fcb86f7d0ee4ecedc610 Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Tue, 17 Jan 2017 10:18:14 +0900 Subject: [PATCH 09/16] Release version 1.1.0 Changes: - Add tizen remote surface buffer changed callback Change-Id: I87c2c4d15db825b050fa5545276057f6f4fced7c Signed-off-by: Hyunho Kang --- packaging/libscreen_connector.spec | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packaging/libscreen_connector.spec b/packaging/libscreen_connector.spec index c419aa0..469cdc3 100644 --- a/packaging/libscreen_connector.spec +++ b/packaging/libscreen_connector.spec @@ -1,6 +1,6 @@ Name: libscreen_connector Summary: Library for developing the application -Version: 1.0 +Version: 1.1.0 Release: 1 Group: Applications/Core Applications License: Apache-2.0 @@ -36,7 +36,8 @@ cp %{SOURCE1002} . cp %{SOURCE1003} . %build -%cmake . -DTZ_SYS_SHARE=/usr/share +MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'` +%cmake . -DTZ_SYS_SHARE=/usr/share -DMAJORVER=${MAJORVER} -DFULLVER=%{version} make %{?jobs:-j%jobs} %install @@ -140,4 +141,4 @@ Header & package configuration files to support development of the widget viewer %{_libdir}/pkgconfig/screen_connector_watcher_evas.pc -# End of a file \ No newline at end of file +# End of a file -- 2.7.4 From beef22b1e1617335ced16bbcbf67f6d57b74f137 Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Tue, 24 Jan 2017 11:59:16 +0900 Subject: [PATCH 10/16] Fix tbm buffer and file fd management logic Change-Id: I8bb5c15ea0a247c33e9450698d0529926a1a0f86 Signed-off-by: Hyunho Kang --- .../src/screen_connector_watcher.c | 2 +- .../src/screen_connector_watcher_evas.c | 59 ++++++++++++++++++---- 2 files changed, 51 insertions(+), 10 deletions(-) diff --git a/screen_connector_watcher/src/screen_connector_watcher.c b/screen_connector_watcher/src/screen_connector_watcher.c index 9077d76..a52fee4 100644 --- a/screen_connector_watcher/src/screen_connector_watcher.c +++ b/screen_connector_watcher/src/screen_connector_watcher.c @@ -181,7 +181,7 @@ EXPORT_API int screen_connector_watcher_init(void) if (!strcmp(global->interface, "tizen_remote_surface_manager")) { __rsm = wl_registry_bind(registry, global->id, &tizen_remote_surface_manager_interface, - global->version < 2 ? global->version : 2); + global->version < 4 ? global->version : 4); } } 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 a690fff..f9774f5 100644 --- a/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c +++ b/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c @@ -41,6 +41,7 @@ struct _screen_connector_watcher_evas_h { bool cancel_touch; Evas_Object *img_tbm; Evas_Object *img_file; + uint32_t img_type; struct wl_buffer *pre_buffer; void *data; }; @@ -55,6 +56,7 @@ static void __destroy_watcher_evas_handle(screen_connector_watcher_evas_h h) return; free(h->ops); free(h); + h = NULL; } EXPORT_API int screen_connector_watcher_evas_init(Evas_Object *win) @@ -296,6 +298,25 @@ static void __rs_cb_resize(void *data, Evas *e, Evas_Object *obj, void *event_in __obj_update_visibility(data, e, obj, event_info); } +static void __clear_img_tbm(screen_connector_watcher_evas_h watcher_evas_h) +{ + if (watcher_evas_h->img_tbm == NULL) + return; + + g_hash_table_remove(__watcher_tbl, watcher_evas_h->img_tbm); + evas_object_del(watcher_evas_h->img_tbm); + watcher_evas_h->img_tbm = NULL; +} + +static void __clear_img_file(screen_connector_watcher_evas_h watcher_evas_h) +{ + if (watcher_evas_h->img_file == NULL) + return; + + evas_object_del(watcher_evas_h->img_file); + watcher_evas_h->img_file = NULL; +} + static void __watcher_change_cb(struct tizen_remote_surface *trs, uint32_t type, struct wl_buffer *tbm, int32_t img_file_fd, uint32_t img_file_size, uint32_t time, struct wl_array *keys, void *data) { @@ -352,9 +373,11 @@ static void __watcher_change_cb(struct tizen_remote_surface *trs, uint32_t type, evas_object_data_set(watcher_evas_h->img_tbm, "___PLUGID", strdup(plug_id)); evas_object_event_callback_add(watcher_evas_h->img_tbm, EVAS_CALLBACK_MOVE, __obj_update_visibility, watcher_evas_h); + } + if (watcher_evas_h->img_type != type) is_added = true; - } + watcher_evas_h->img_type = type; /* check type of given buffer */ if (type == TIZEN_REMOTE_SURFACE_BUFFER_TYPE_TBM) { @@ -382,7 +405,6 @@ static void __watcher_change_cb(struct tizen_remote_surface *trs, uint32_t type, evas_object_image_fill_set(watcher_evas_h->img_file, 0, 0, width, height); evas_object_resize(watcher_evas_h->img_file, width, height); munmap(map, img_file_size); - close(img_file_fd); /* close passed fd */ evas_object_image_native_surface_set(watcher_evas_h->img_tbm, NULL); /* set null to previous object for the tbm type */ } @@ -394,14 +416,29 @@ static void __watcher_change_cb(struct tizen_remote_surface *trs, uint32_t type, watcher_evas_h->pre_buffer = tbm; if (is_added) { - LOGD("call added !!!! %s", appid); - watcher_evas_h->ops->added(appid, watcher_evas_h->img_tbm, - watcher_evas_h->data); + LOGD("call added !!!! %s, type %d", appid, type); + if (type == TIZEN_REMOTE_SURFACE_BUFFER_TYPE_IMAGE_FILE) { + watcher_evas_h->ops->added(appid, watcher_evas_h->img_file, + watcher_evas_h->data); + __clear_img_tbm(watcher_evas_h); + } else { + watcher_evas_h->ops->added(appid, watcher_evas_h->img_tbm, + watcher_evas_h->data); + __clear_img_file(watcher_evas_h); + } } else { - LOGD("call updated !!!! %s", appid); - watcher_evas_h->ops->updated(appid, watcher_evas_h->img_tbm, - watcher_evas_h->data); + LOGD("call updated !!!! %s, type %d", appid, type); + if (type == TIZEN_REMOTE_SURFACE_BUFFER_TYPE_IMAGE_FILE) { + watcher_evas_h->ops->updated(appid, watcher_evas_h->img_file, + watcher_evas_h->data); + __clear_img_tbm(watcher_evas_h); + } else { + watcher_evas_h->ops->updated(appid, watcher_evas_h->img_tbm, + watcher_evas_h->data); + __clear_img_file(watcher_evas_h); + } } + close(img_file_fd); /* close passed fd */ } static void __watcher_update_cb(struct tizen_remote_surface *trs, struct wl_buffer *buffer, uint32_t time, void *data) @@ -450,7 +487,10 @@ static void __watcher_missing_cb(struct tizen_remote_surface *trs, void *data) } appid = screen_connector_watcher_get_appid(watcher_evas_h->watcher_h); - watcher_evas_h->ops->removed(appid, watcher_evas_h->img_tbm, watcher_evas_h->data); + if (watcher_evas_h->img_tbm != NULL) + watcher_evas_h->ops->removed(appid, watcher_evas_h->img_tbm, watcher_evas_h->data); + else + watcher_evas_h->ops->removed(appid, watcher_evas_h->img_file, watcher_evas_h->data); __free_watcher_evas_h(watcher_evas_h); } @@ -476,6 +516,7 @@ EXPORT_API screen_connector_watcher_evas_h screen_connector_watcher_evas_add(scr LOGE("handle calloc fail"); return NULL; } + handle->img_type = -1; handle->ops = evas_ops; handle->data = data; handle->watcher_h = screen_connector_watcher_add(&watcher_ops, id, handle); -- 2.7.4 From 970ad693eeccfe1a80f1567bb57cf5626c7ad1c5 Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Wed, 1 Feb 2017 10:15:58 +0900 Subject: [PATCH 11/16] Release version 1.1.1 Changes: - Fix tbm buffer and file fd management logic Change-Id: I17058cd8dc7016bcf0ae4106f489cd0f04c44965 Signed-off-by: Hyunho Kang --- packaging/libscreen_connector.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libscreen_connector.spec b/packaging/libscreen_connector.spec index 469cdc3..c9cf689 100644 --- a/packaging/libscreen_connector.spec +++ b/packaging/libscreen_connector.spec @@ -1,6 +1,6 @@ Name: libscreen_connector Summary: Library for developing the application -Version: 1.1.0 +Version: 1.1.1 Release: 1 Group: Applications/Core Applications License: Apache-2.0 -- 2.7.4 From 1061dbe786a9b9ae6382a147982a714128898ea2 Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Wed, 8 Feb 2017 18:13:49 +0900 Subject: [PATCH 12/16] Fix screen_connector_watcher_evas_get_rid bug Change-Id: If3086b6a1984ceb6a1864a57b5fba238ad04ee81 Signed-off-by: Hyunho Kang --- screen_connector_watcher_evas/src/screen_connector_watcher_evas.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 f9774f5..baf1839 100644 --- a/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c +++ b/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c @@ -746,8 +746,9 @@ EXPORT_API int screen_connector_watcher_evas_get_rid(Evas_Object *obj, int *reso LOGE("unknown object. not widget object"); return -1; } + *resource_id = screen_connector_watcher_get_resource_id(watcher_evas_h->watcher_h); - return screen_connector_watcher_get_resource_id(watcher_evas_h->watcher_h); + return 0; } EXPORT_API int screen_connector_watcher_evas_get_pid(Evas_Object *obj, int *pid) -- 2.7.4 From d88dd0de0d418c42ed4465a2c76de2cef677401b Mon Sep 17 00:00:00 2001 From: Hwankyu Jhun Date: Fri, 10 Feb 2017 08:46:28 +0900 Subject: [PATCH 13/16] Add an exception handling The tizen_remote_surface_manager_create_surface() API returns a NULL porinter if the resource id is invalid. Change-Id: I5d3b084db876061d4f2a02254e8905db4ff52d68 Signed-off-by: Hwankyu Jhun --- screen_connector_watcher/src/screen_connector_watcher.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/screen_connector_watcher/src/screen_connector_watcher.c b/screen_connector_watcher/src/screen_connector_watcher.c index a52fee4..fb76e57 100644 --- a/screen_connector_watcher/src/screen_connector_watcher.c +++ b/screen_connector_watcher/src/screen_connector_watcher.c @@ -96,6 +96,8 @@ EXPORT_API void screen_connector_watcher_redirect_surface(screen_connector_watch return; watcher_h->surface = tizen_remote_surface_manager_create_surface(__rsm, (uint32_t)watcher_h->resource_id, __tbm); + if (watcher_h->surface == NULL) + return; LOGD("resource_id : %d, (%p)", watcher_h->resource_id, watcher_h->surface); tizen_remote_surface_add_listener(watcher_h->surface, &__rs_listener, watcher_h); -- 2.7.4 From e262f6dbb8bb12f2a537b620a9e90a0929f833b5 Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Wed, 8 Feb 2017 21:36:51 +0900 Subject: [PATCH 14/16] Fix memory leaks Change-Id: Idb56464495739c44b1735fea75d56a1901718d13 Signed-off-by: Hyunho Kang --- screen_connector_watcher_evas/src/screen_connector_watcher_evas.c | 2 ++ 1 file changed, 2 insertions(+) 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 baf1839..00657af 100644 --- a/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c +++ b/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c @@ -514,6 +514,7 @@ EXPORT_API screen_connector_watcher_evas_h screen_connector_watcher_evas_add(scr handle = (screen_connector_watcher_evas_h)calloc(1, sizeof(struct _screen_connector_watcher_evas_h)); if (handle == NULL) { LOGE("handle calloc fail"); + free(evas_ops); return NULL; } handle->img_type = -1; @@ -727,6 +728,7 @@ EXPORT_API int screen_connector_watcher_evas_add_by_rid(screen_connector_watcher watcher_evas_h = (screen_connector_watcher_evas_h)calloc(1, sizeof(struct _screen_connector_watcher_evas_h)); if (watcher_evas_h == NULL) { LOGE("handle calloc fail"); + free(evas_ops); return -1; } watcher_evas_h->ops = evas_ops; -- 2.7.4 From 7dcac60b2b98387af463681e012998be9278ef64 Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Fri, 10 Feb 2017 14:18:28 +0900 Subject: [PATCH 15/16] Fix screen_connector_watcher_evas_add_by_rid bug This API was designed for other viewer but implementation was for main viewer Change-Id: I1292fb070d5a1c298e0bc8750ae864ee9407cda5 Signed-off-by: Hyunho Kang --- .../include/screen_connector_watcher.h | 1 + .../src/screen_connector_watcher.c | 9 ++++++ .../include/screen_connector_watcher_evas.h | 30 +++++++++++++++++++- .../src/screen_connector_watcher_evas.c | 33 ++++++++-------------- 4 files changed, 51 insertions(+), 22 deletions(-) diff --git a/screen_connector_watcher/include/screen_connector_watcher.h b/screen_connector_watcher/include/screen_connector_watcher.h index b1cfed7..223b850 100644 --- a/screen_connector_watcher/include/screen_connector_watcher.h +++ b/screen_connector_watcher/include/screen_connector_watcher.h @@ -44,6 +44,7 @@ int screen_connector_watcher_update(const char *appid); 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); 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 fb76e57..dfec938 100644 --- a/screen_connector_watcher/src/screen_connector_watcher.c +++ b/screen_connector_watcher/src/screen_connector_watcher.c @@ -330,6 +330,15 @@ EXPORT_API int screen_connector_watcher_get_resource_id(screen_connector_watcher return h->resource_id; } +EXPORT_API int screen_connector_watcher_set_resource_id(screen_connector_watcher_h h, int rid) +{ + if (h == NULL) + return -1; + + h->resource_id = rid; + return 0; +} + EXPORT_API struct tizen_remote_surface *screen_connector_watcher_get_trs(screen_connector_watcher_h h) { if (h == NULL) diff --git a/screen_connector_watcher_evas/include/screen_connector_watcher_evas.h b/screen_connector_watcher_evas/include/screen_connector_watcher_evas.h index 117fea5..3e429cb 100644 --- a/screen_connector_watcher_evas/include/screen_connector_watcher_evas.h +++ b/screen_connector_watcher_evas/include/screen_connector_watcher_evas.h @@ -65,8 +65,36 @@ int screen_connector_watcher_evas_freeze_visibility(Evas_Object *obj, visibility int screen_connector_watcher_evas_thaw_visibility(Evas_Object *obj); int screen_connector_watcher_evas_send_mouse_up(Evas_Object *obj); int screen_connector_watcher_evas_send_touch_cancel(Evas_Object *obj); + +/** + * @brief Add screen connector watcher by rid. + * @details Using this API, viewer can watch screen which already watched by other viewer.\n + * @since_tizen 3.0 + * @param[in] obj screen image object + * @param[out] pid screen provider pid + * @return 0 if success, negative value(<0) if fail + * + * @remark + * This API is only for main viewer. \n + * Sub viewer can not get provider's information like provider's pid by screen image object. + * @see screen_connector_watcher_evas_add_by_rid() +*/ int screen_connector_watcher_evas_get_pid(Evas_Object *obj, int *pid); -int screen_connector_watcher_evas_add_by_rid(screen_connector_watcher_evas_ops *ops, int res_id, void *data); + +/** + * @brief Add screen connector watcher by rid. + * @details Using this API, viewer can watch screen which already watched by other viewer.\n + * @since_tizen 3.0 + * @param[in] ops screen watcher evas callback handler function + * @param[in] res_id screen provider rid + * @param[in] data user-supplied data for watcher handler + * @return @c Not null on success + * + * @remark + * This API is only for sub viewer. \n + * Sub viewer can not get provider's information like provider's pid by screen image object. +*/ +screen_connector_watcher_evas_h screen_connector_watcher_evas_add_by_rid(screen_connector_watcher_evas_ops *ops, int res_id, void *data); int screen_connector_watcher_evas_get_rid(Evas_Object *obj, int *resource_id); /** 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 00657af..3d0a25c 100644 --- a/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c +++ b/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c @@ -693,14 +693,12 @@ EXPORT_API int screen_connector_watcher_evas_send_touch_cancel(Evas_Object *obj) return 0; } -EXPORT_API int screen_connector_watcher_evas_add_by_rid(screen_connector_watcher_evas_ops *ops, int res_id, void *data) +EXPORT_API screen_connector_watcher_evas_h screen_connector_watcher_evas_add_by_rid(screen_connector_watcher_evas_ops *ops, + int res_id, void *data) { - GHashTableIter iter; - gpointer key, value; screen_connector_watcher_evas_h watcher_evas_h; - screen_connector_watcher_evas_h cur_h = NULL; screen_connector_watcher_evas_ops *evas_ops; - char *appid = NULL; + char rid_str[32]; int pid = 0; screen_connector_watcher_ops watcher_ops; @@ -708,35 +706,28 @@ EXPORT_API int screen_connector_watcher_evas_add_by_rid(screen_connector_watcher watcher_ops.missing_cb = __watcher_missing_cb; watcher_ops.update_cb = __watcher_update_cb; - g_hash_table_iter_init(&iter, __watcher_tbl); - while (g_hash_table_iter_next(&iter, &key, &value)) { - cur_h = (screen_connector_watcher_evas_h)value; - if (screen_connector_watcher_get_resource_id(cur_h->watcher_h) == res_id) { - appid = screen_connector_watcher_get_appid(cur_h->watcher_h); - pid = screen_connector_watcher_get_pid(cur_h->watcher_h); - break; - } - } - evas_ops = (screen_connector_watcher_evas_ops *)calloc(1, sizeof(screen_connector_watcher_evas_ops)); if (evas_ops == NULL) { LOGE("evas_ops calloc fail"); - return -1; + return NULL; } + snprintf(rid_str, sizeof(rid_str), "%d", res_id); memcpy(evas_ops, ops, sizeof(screen_connector_watcher_evas_ops)); watcher_evas_h = (screen_connector_watcher_evas_h)calloc(1, sizeof(struct _screen_connector_watcher_evas_h)); if (watcher_evas_h == NULL) { LOGE("handle calloc fail"); free(evas_ops); - return -1; + return NULL; } + watcher_evas_h->img_type = -1; watcher_evas_h->ops = evas_ops; watcher_evas_h->data = data; - watcher_evas_h->watcher_h = screen_connector_watcher_create_handle(appid, pid, &watcher_ops, watcher_evas_h); + watcher_evas_h->watcher_h = screen_connector_watcher_create_handle(rid_str, pid, &watcher_ops, watcher_evas_h); + screen_connector_watcher_set_resource_id(watcher_evas_h->watcher_h, res_id); screen_connector_watcher_redirect_surface(watcher_evas_h->watcher_h); - return 0; + return watcher_evas_h; } EXPORT_API int screen_connector_watcher_evas_get_rid(Evas_Object *obj, int *resource_id) @@ -745,7 +736,7 @@ EXPORT_API int screen_connector_watcher_evas_get_rid(Evas_Object *obj, int *reso watcher_evas_h = (screen_connector_watcher_evas_h)g_hash_table_lookup(__watcher_tbl, obj); if (!watcher_evas_h) { - LOGE("unknown object. not widget object"); + LOGE("unknown object."); return -1; } *resource_id = screen_connector_watcher_get_resource_id(watcher_evas_h->watcher_h); @@ -759,7 +750,7 @@ EXPORT_API int screen_connector_watcher_evas_get_pid(Evas_Object *obj, int *pid) watcher_evas_h = (screen_connector_watcher_evas_h)g_hash_table_lookup(__watcher_tbl, obj); if (!watcher_evas_h) { - LOGE("unknown object. not widget object"); + LOGE("unknown object."); return -1; } *pid = screen_connector_watcher_get_pid(watcher_evas_h->watcher_h); -- 2.7.4 From 29c85c12a9d6c42860fe64abf485c5beb67b6cdc Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Fri, 10 Feb 2017 14:47:53 +0900 Subject: [PATCH 16/16] Add error return logic to watcher_evas_get_pid Sub viewer should not get pid using screen image object. Change-Id: I4f12cb2c1f8f96575a81f1e8a5665ff7f52fba09 Signed-off-by: Hyunho Kang --- .../src/screen_connector_watcher_evas.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) 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 3d0a25c..c44a18b 100644 --- a/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c +++ b/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c @@ -747,13 +747,21 @@ EXPORT_API int screen_connector_watcher_evas_get_rid(Evas_Object *obj, int *reso EXPORT_API int screen_connector_watcher_evas_get_pid(Evas_Object *obj, int *pid) { screen_connector_watcher_evas_h watcher_evas_h; + int watcher_pid; watcher_evas_h = (screen_connector_watcher_evas_h)g_hash_table_lookup(__watcher_tbl, obj); if (!watcher_evas_h) { LOGE("unknown object."); return -1; } - *pid = screen_connector_watcher_get_pid(watcher_evas_h->watcher_h); + + watcher_pid = screen_connector_watcher_get_pid(watcher_evas_h->watcher_h); + if (watcher_pid == 0) { + LOGE("Invalid object"); + return -1; + } + + *pid = watcher_pid; return 0; } -- 2.7.4