From 50f4772add609c8ec33acc90c60f706234a85d0b Mon Sep 17 00:00:00 2001 From: "jk7744.park" Date: Sun, 1 Feb 2015 13:07:11 +0900 Subject: [PATCH] tizen 2.3 release --- CMakeLists.txt | 95 +- TC/testcase/Makefile | 34 - TC/testcase/tslist | 2 - TC/testcase/utc_livebox.c | 586 --------- doc/livebox_doc.h | 32 - dynamicbox/CMakeLists.txt | 88 ++ LICENSE => dynamicbox/LICENSE | 0 {data => dynamicbox/data}/CMakeLists.txt | 0 dynamicbox/doc/dynamicbox_doc.h | 135 ++ dynamicbox/dynamicbox.pc.in | 12 + dynamicbox/include/debug.h | 46 + dynamicbox/include/dlist.h | 43 + dynamicbox/include/dynamicbox.h | 283 ++++ dynamicbox/include/internal/dynamicbox.h | 688 ++++++++++ {include => dynamicbox/include}/util.h | 0 dynamicbox/patch/pixmap_ee.patch | 128 ++ dynamicbox/patch/pixmap_ee_dbox.patch | 125 ++ dynamicbox/src/dlist.c | 160 +++ dynamicbox/src/dynamicbox.c | 1367 +++++++++++++++++++ dynamicbox/src/snapshot_window.c | 502 +++++++ {src => dynamicbox/src}/util.c | 24 +- dynamicbox/src/virtual_window.c | 1014 ++++++++++++++ dynamicbox/src/virtual_window_wayland.c | 449 +++++++ include/livebox.h | 771 ----------- livebox/CMakeLists.txt | 56 + livebox/LICENSE | 206 +++ {include => livebox/include}/debug.h | 0 {include => livebox/include}/dlist.h | 0 livebox/include/dynamicbox.h | 871 ++++++++++++ livebox/include/livebox.h | 283 ++++ livebox/include/livebox_product.h | 474 +++++++ livebox/include/util.h | 20 + livebox.pc.in => livebox/livebox.pc.in | 2 +- livebox/src/livebox.c | 199 +++ ...{liblivebox.manifest => libdynamicbox.manifest} | 0 packaging/libdynamicbox.spec | 122 ++ packaging/liblivebox.spec | 95 -- src/dlist.c | 160 --- src/livebox.c | 1388 -------------------- src/snapshot_window.c | 529 -------- src/virtual_window.c | 605 --------- src/virtual_window_wayland.c | 433 ------ 42 files changed, 7287 insertions(+), 4740 deletions(-) delete mode 100644 TC/testcase/Makefile delete mode 100644 TC/testcase/tslist delete mode 100644 TC/testcase/utc_livebox.c delete mode 100644 doc/livebox_doc.h create mode 100644 dynamicbox/CMakeLists.txt rename LICENSE => dynamicbox/LICENSE (100%) rename {data => dynamicbox/data}/CMakeLists.txt (100%) create mode 100644 dynamicbox/doc/dynamicbox_doc.h create mode 100644 dynamicbox/dynamicbox.pc.in create mode 100644 dynamicbox/include/debug.h create mode 100644 dynamicbox/include/dlist.h create mode 100644 dynamicbox/include/dynamicbox.h create mode 100644 dynamicbox/include/internal/dynamicbox.h rename {include => dynamicbox/include}/util.h (100%) create mode 100644 dynamicbox/patch/pixmap_ee.patch create mode 100644 dynamicbox/patch/pixmap_ee_dbox.patch create mode 100644 dynamicbox/src/dlist.c create mode 100644 dynamicbox/src/dynamicbox.c create mode 100644 dynamicbox/src/snapshot_window.c rename {src => dynamicbox/src}/util.c (73%) create mode 100644 dynamicbox/src/virtual_window.c create mode 100644 dynamicbox/src/virtual_window_wayland.c delete mode 100644 include/livebox.h create mode 100644 livebox/CMakeLists.txt create mode 100644 livebox/LICENSE rename {include => livebox/include}/debug.h (100%) rename {include => livebox/include}/dlist.h (100%) create mode 100644 livebox/include/dynamicbox.h create mode 100644 livebox/include/livebox.h create mode 100644 livebox/include/livebox_product.h create mode 100644 livebox/include/util.h rename livebox.pc.in => livebox/livebox.pc.in (83%) create mode 100644 livebox/src/livebox.c rename packaging/{liblivebox.manifest => libdynamicbox.manifest} (100%) create mode 100644 packaging/libdynamicbox.spec delete mode 100644 packaging/liblivebox.spec delete mode 100644 src/dlist.c delete mode 100644 src/livebox.c delete mode 100644 src/snapshot_window.c delete mode 100644 src/virtual_window.c delete mode 100644 src/virtual_window_wayland.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 44f73c1..6ee6fe4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,95 +1,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.6) -PROJECT(livebox C) -SET(PREFIX ${CMAKE_INSTALL_PREFIX}) -SET(EXEC_PREFIX "\${prefix}") -SET(PROJECT_NAME "${PROJECT_NAME}") -SET(LIBDIR "\${exec_prefix}/lib") -SET(INCLUDEDIR "\${prefix}/include/${PROJECT_NAME}") -SET(VERSION_MAJOR 0) -SET(VERSION "${VERSION_MAJOR}.0.1") +ADD_SUBDIRECTORY(dynamicbox) +ADD_SUBDIRECTORY(livebox) -set(CMAKE_SKIP_BUILD_RPATH true) - -INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include) - -INCLUDE(FindPkgConfig) -pkg_check_modules(pkgs REQUIRED - dlog - livebox-service - provider - evas - ecore - elementary -) - -IF (X11_SUPPORT) -pkg_check_modules(pkgs_extra REQUIRED - x11 -) -ADD_DEFINITIONS("-DHAVE_X11") -SET(BUILD_SOURCE - src/virtual_window.c -) -ENDIF (X11_SUPPORT) - -IF (WAYLAND_SUPPORT) -ADD_DEFINITIONS("-DHAVE_WAYLAND") -SET(BUILD_SOURCE - src/virtual_window_wayland.c -) -ENDIF (WAYLAND_SUPPORT) - -FOREACH(flag ${pkgs_CFLAGS}) - SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") -ENDFOREACH(flag) - -FOREACH(flag ${pkgs_extra_CFLAGS}) - SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") -ENDFOREACH(flag) - -SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fvisibility=hidden") - -SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -g") - -#ADD_DEFINITIONS("-Werror") -#ADD_DEFINITIONS("-Wall") -#ADD_DEFINITIONS("-Wextra") -#ADD_DEFINITIONS("-ansi") -#ADD_DEFINITIONS("-pedantic") - -ADD_DEFINITIONS("-DPREFIX=\"${PREFIX}\"") -ADD_DEFINITIONS("-DLOG_TAG=\"LIVEBOX\"") -ADD_DEFINITIONS("-DNDEBUG") -ADD_DEFINITIONS("-D_USE_ECORE_TIME_GET") -ADD_DEFINITIONS("-DMASTER_PKGNAME=\"data-provider-master\"") -ADD_DEFINITIONS("-DSLAVE_PKGNAME=\"org.tizen.data-provider-slave\"") - -IF (MOBILE) - ADD_DEFINITIONS("-DMOBILE") -ELSEIF (WEARABLE) - ADD_DEFINITIONS("-DWEARABLE") - ADD_DEFINITIONS("-DENABLE_ACCESSIBILITY") -ENDIF (MOBILE) - -SET (BUILD_SOURCE - ${BUILD_SOURCE} - src/dlist.c - src/livebox.c - src/util.c -) - -ADD_LIBRARY(${PROJECT_NAME} SHARED ${BUILD_SOURCE}) -SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES SOVERSION ${VERSION_MAJOR}) -SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES VERSION ${VERSION}) -TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_LDFLAGS} ${pkgs_extra_LDFLAGS} "-lpthread") - -CONFIGURE_FILE(${PROJECT_NAME}.pc.in ${PROJECT_NAME}.pc @ONLY) -SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${PROJECT_NAME}.pc") - -INSTALL(TARGETS ${PROJECT_NAME} DESTINATION lib) -INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc DESTINATION lib/pkgconfig) -INSTALL(FILES ${CMAKE_SOURCE_DIR}/include/livebox.h DESTINATION include/${PROJECT_NAME}) -INSTALL(FILES ${CMAKE_SOURCE_DIR}/LICENSE DESTINATION /usr/share/license RENAME "lib${PROJECT_NAME}") - -ADD_SUBDIRECTORY(data) +ADD_DEPENDENCIES(livebox dynamicbox) diff --git a/TC/testcase/Makefile b/TC/testcase/Makefile deleted file mode 100644 index df6033d..0000000 --- a/TC/testcase/Makefile +++ /dev/null @@ -1,34 +0,0 @@ -include ../config - -CC ?= gcc - -C_FILES = $(shell ls *.c) - -PKGS = $(PKG_NAME) -PKGS += glib-2.0 -PKGS += livebox-service -PKGS += evas -PKGS += ecore -PKGS += elementary -PKGS += dlog -#PKGS += provider -LDFLAGS = `pkg-config --libs $(PKGS)` -LDFLAGS += $(TET_ROOT)/lib/tet3/tcm_s.o -LDFLAGS += -L$(TET_ROOT)/lib/tet3 -ltcm_s -LDFLAGS += -L$(TET_ROOT)/lib/tet3 -lapi_s - -CFLAGS = -I. `pkg-config --cflags $(PKGS)` -CFLAGS += -DTIZEN_ENGINEER_MODE -CFLAGS += -DTIZEN_DEBUG_ENABLE -CFLAGS += -I$(TET_ROOT)/inc/tet3 -CFLAGS += -Wall - -TCS := $(shell ls -1 *.c | cut -d. -f1) - -all: $(TCS) - -%: %.c - $(CC) -o $@ $< $(CFLAGS) $(LDFLAGS) - -clean: - rm -f $(TCS) diff --git a/TC/testcase/tslist b/TC/testcase/tslist deleted file mode 100644 index 2fc5b2e..0000000 --- a/TC/testcase/tslist +++ /dev/null @@ -1,2 +0,0 @@ -/testcase/utc_livebox - diff --git a/TC/testcase/utc_livebox.c b/TC/testcase/utc_livebox.c deleted file mode 100644 index 5c2edb2..0000000 --- a/TC/testcase/utc_livebox.c +++ /dev/null @@ -1,586 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#include -#include - -#define LOG_TAG "LIVEBOX_TC" - -#include -#include -#include -#include - -enum { - POSITIVE_TC_IDX = 0x01, - NEGATIVE_TC_IDX, -}; - -static void startup(void) -{ - /* start of TC */ - tet_printf("\n TC start"); -} - - -static void cleanup(void) -{ - /* end of TC */ - tet_printf("\n TC end"); -} - -void (*tet_startup)(void) = startup; -void (*tet_cleanup)(void) = cleanup; - -#define DUMMY_ID "/opt/usr/share/live_magazine/org.tizen.dummy.png" -#define DUMMY_INVALID_ID "/usr/share/live_magazine/org.tizen.dummy.png" -#define DUMMY_PKGNAME "org.tizen.dummy" - -static void utc_livebox_desc_open_n(void) -{ - LOGD(""); - struct livebox_desc *handle; - - handle = livebox_desc_open(DUMMY_INVALID_ID, 0); - if (handle) { - (void)livebox_desc_close(handle); - } - dts_check_eq("livebox_desc_open", handle, NULL, "Must return NULL in case of invalid id is used"); -} - -static void utc_livebox_desc_open_p(void) -{ - LOGD(""); - struct livebox_desc *handle; - - handle = livebox_desc_open(DUMMY_ID, 0); - dts_check_ne("livebox_desc_open", handle, NULL, "Must return valid handle"); -} - -static void utc_livebox_desc_close_n(void) -{ - LOGD(""); - int ret; - - ret = livebox_desc_close(NULL); - dts_check_eq("livebox_desc_close", ret, LB_STATUS_ERROR_INVALID, "Must returns LB_STATUS_ERROR_INVALID"); -} - -static void utc_livebox_desc_close_p(void) -{ - LOGD(""); - struct livebox_desc *handle; - int ret; - - handle = livebox_desc_open(DUMMY_ID, 0); - if (!handle) { - dts_check_ne("livebox_desc_close", handle, NULL, "Failed to create a handle"); - return; - } - - ret = livebox_desc_close(handle); - dts_check_eq("livebox_desc_close", ret, LB_STATUS_SUCCESS, "Must returns LB_STATUS_SUCCESS"); -} - -static void utc_livebox_desc_set_category_n(void) -{ - LOGD(""); - int ret; - ret = livebox_desc_set_category(NULL, NULL, NULL); - - dts_check_eq("livebox_desc_set_category", ret, LB_STATUS_ERROR_INVALID, "Invalid parameter used, LB_STATUS_ERROR_INVALID should be returned"); -} - -static void utc_livebox_desc_set_category_p(void) -{ - LOGD(""); - struct livebox_desc *handle; - int ret; - - handle = livebox_desc_open(DUMMY_ID, 0); - if (!handle) { - dts_check_ne("livebox_desc_set_category", handle, NULL, "Failed to create a handle"); - return; - } - - ret = livebox_desc_set_category(handle, NULL, "New Category"); - (void)livebox_desc_close(handle); - dts_check_eq("livebox_desc_set_category", ret, LB_STATUS_SUCCESS, "LB_STATUS_SUCCESS should be returned\n"); -} - -static void utc_livebox_desc_set_id_n(void) -{ - LOGD(""); - struct livebox_desc *handle; - int ret; - - handle = livebox_desc_open(DUMMY_ID, 0); - if (!handle) { - dts_check_ne("livebox_desc_set_id", handle, NULL, "Failed to create a handle"); - return; - } - ret = livebox_desc_set_id(handle, -1, NULL); - (void)livebox_desc_close(handle); - dts_check_eq("livebox_desc_set_id", ret, LB_STATUS_ERROR_NOT_EXIST, "LB_STATUS_ERROR_NOT_EXIST should be returned\n"); -} - -static void utc_livebox_desc_set_id_p(void) -{ - LOGD(""); - struct livebox_desc *handle; - int ret; - int idx; - - handle = livebox_desc_open(DUMMY_ID, 0); - if (!handle) { - dts_check_ne("livebox_desc_set_id", handle, NULL, "Failed to create a handle"); - return; - } - idx = livebox_desc_add_block(handle, NULL, LB_DESC_TYPE_SCRIPT, "swallow,part", "/usr/apps/org.tizen.test-app/res/edje/test.edj", "test,group"); - if (idx < 0) { - dts_check_ge("livebox_desc_set_id", idx, 0, "Failed to add a desc block"); - (void)livebox_desc_close(handle); - return; - } - - ret = livebox_desc_set_id(handle, idx, "new,id"); - (void)livebox_desc_close(handle); - dts_check_eq("livebox_desc_set_id", ret, LB_STATUS_SUCCESS, "LB_STATUS_SUCCESS should be returned\n"); -} - -static void utc_livebox_desc_add_block_n(void) -{ - LOGD(""); - int idx; - - idx = livebox_desc_add_block(NULL, NULL, LB_DESC_TYPE_SCRIPT, "swallow,part", "/usr/apps/org.tizen.test-app/res/edje/test.edj", "test,group"); - dts_check_eq("livebox_desc_add_block", idx, LB_STATUS_ERROR_INVALID, "LB_STATUS_ERROR_INVALID should be returned\n"); -} - -static void utc_livebox_desc_add_block_p(void) -{ - LOGD(""); - struct livebox_desc *handle; - int idx; - - handle = livebox_desc_open(DUMMY_ID, 0); - if (!handle) { - dts_check_ne("livebox_desc_add_block", handle, NULL, "Failed to create a handle"); - return; - } - - idx = livebox_desc_add_block(handle, NULL, LB_DESC_TYPE_SCRIPT, "swallow,part", "/usr/apps/org.tizen.test-app/res/edje/test.edj", "test,group"); - dts_check_ge("livebox_desc_add_block", idx, 0, "idx should not be less than 0\n"); - (void)livebox_desc_close(handle); -} - -static void utc_livebox_desc_del_block_n(void) -{ - LOGD(""); - struct livebox_desc *handle; - int ret; - - handle = livebox_desc_open(DUMMY_ID, 0); - if (!handle) { - dts_check_ne("livebox_desc_del_block", handle, NULL, "Failed to create a handle"); - return; - } - - ret = livebox_desc_del_block(handle, 0); - dts_check_eq("livebox_desc_del_block", ret, LB_STATUS_ERROR_NOT_EXIST, "Block is not found, LB_STATUS_ERROR_NOT_EXIST should be returned\n"); -} - -static void utc_livebox_desc_del_block_p(void) -{ - LOGD(""); - struct livebox_desc *handle; - int idx; - int ret; - - handle = livebox_desc_open(DUMMY_ID, 0); - if (handle == NULL) { - dts_check_ne("livebox_desc_del_block", handle, NULL, "Failed to create desc handle"); - return; - } - idx = livebox_desc_add_block(handle, NULL, LB_DESC_TYPE_SCRIPT, "swallow,part", "/usr/apps/org.tizen.test-app/res/edje/test.edj", "test,group"); - if (idx < 0) { - dts_check_ge("livebox_desc_del_block", idx, 0, "Failed to add a desc block"); - (void)livebox_desc_close(handle); - return; - } - ret = livebox_desc_del_block(handle, idx); - (void)livebox_desc_close(handle); - dts_check_eq("livebox_desc_del_block", ret, LB_STATUS_SUCCESS, "del_block should returns LB_STATUS_SUCCESS\n"); -} - -int livebox_trigger_update_monitor(const char *id, int is_pd) -{ - if (!id) { - return LB_STATUS_ERROR_INVALID; - } - - return LB_STATUS_SUCCESS; -} - -static void utc_livebox_content_is_updated_n(void) -{ - LOGD(""); - int ret; - - ret = livebox_content_is_updated(NULL, 0); - dts_check_eq("livebox_content_is_updated", ret, LB_STATUS_ERROR_INVALID, "should returns LB_STATUS_ERROR_INVALID\n"); -} - -static void utc_livebox_content_is_updated_p(void) -{ - LOGD(""); - int ret; - ret = livebox_content_is_updated(DUMMY_ID, 0); - dts_check_eq("livebox_content_is_updated", ret, LB_STATUS_SUCCESS, "should returns LB_STATUS_SUCCESS\n"); -} - -static void utc_livebox_request_close_pd_n(void) -{ - LOGD(""); - int ret; - - ret = livebox_request_close_pd(DUMMY_PKGNAME, DUMMY_ID, LB_STATUS_SUCCESS); - dts_check_eq("livebox_request_close_pd", ret, LB_STATUS_ERROR_INVALID, "should returns LB_STATUS_ERROR_INVALID\n"); -} - -static void utc_livebox_request_close_pd_p(void) -{ - LOGD(""); - /*! - * \note - * Unable to test the positive case - */ - dts_pass("livebox_request_close_pd", "pass negative test"); -} - -static void utc_livebox_request_update_n(void) -{ - LOGD(""); - int ret; - ret = livebox_request_update(NULL); - dts_check_eq("livebox_request_update", ret, LB_STATUS_ERROR_INVALID, "should returns LB_STATUS_ERROR_INVALID"); -} - -static void utc_livebox_request_update_p(void) -{ - LOGD(""); - /*! - * \note - * Unable to test the positive case - */ - dts_pass("livebox_request_update", "pass negative test"); -} - -static void utc_livebox_util_nl2br_n(void) -{ - LOGD(""); - char *nl2br; - - nl2br = livebox_util_nl2br(NULL); - dts_check_eq("livebox_util_nl2br", nl2br, NULL, "should returns NULL\n"); -} - -static void utc_livebox_util_nl2br_p(void) -{ - LOGD(""); - char *nl2br; - nl2br = livebox_util_nl2br("hello\nworld"); - LOGD("[%s]", nl2br); - dts_check_str_eq("livebox_util_nl2br", nl2br, "hello
world", "should returns \"hello
world\""); - LOGD(""); -} - -static void utc_livebox_acquire_buffer_n(void) -{ - LOGD(""); - struct livebox_buffer *handle; - - handle = livebox_acquire_buffer(NULL, 0, 720, 200, NULL, NULL); - dts_check_eq("livebox_acquire_buffer", handle, NULL, "should returns NULL\n"); -} - -static void utc_livebox_acquire_buffer_p(void) -{ - LOGD(""); - /*! - * \note - * Unable to test the positive case - */ - dts_pass("livebox_acquire_buffer", "pass positive test"); -} - -static void utc_livebox_acquire_buffer_NEW_n(void) -{ - LOGD(""); - struct livebox_buffer *handle; - - handle = livebox_acquire_buffer_NEW(NULL, 0, 720, 200, NULL, NULL); - dts_check_eq("livebox_acquire_buffer_NEW", handle, NULL, "should returns NULL\n"); -} - -static void utc_livebox_acquire_buffer_NEW_p(void) -{ - LOGD(""); - /*! - * \note - * Unable to test the positive case - */ - dts_pass("livebox_acquire_buffer_NEW", "pass positive test"); -} - - -static void utc_livebox_pixmap_id_n(void) -{ - LOGD(""); - unsigned long pixmap; - - pixmap = livebox_pixmap_id(NULL); - dts_check_eq("livebox_pixmap_id", pixmap, 0, "should returns 0\n"); -} - -static void utc_livebox_pixmap_id_p(void) -{ - LOGD(""); - /*! - * \note - * Unable to test the positive case - */ - dts_pass("livebox_pixmap_id", "pass positive test"); -} - -static void utc_livebox_ref_buffer_n(void) -{ - LOGD(""); - void *ret; - ret = livebox_ref_buffer(NULL); - dts_check_eq("livebox_ref_buffer", ret, NULL, "should returns NULL\n"); -} - -static void utc_livebox_ref_buffer_p(void) -{ - LOGD(""); - /*! - * \note - * Unable to test the positive case - */ - dts_pass("livebox_ref_buffer", "pass positive test"); -} - -static void utc_livebox_sync_buffer_n(void) -{ - LOGD(""); - int ret; - ret = livebox_sync_buffer(NULL); - dts_check_eq("livebox_sync_buffer", ret, LB_STATUS_ERROR_INVALID, "should returns LB_STATUS_ERROR_INVALID\n"); -} - -static void utc_livebox_sync_buffer_p(void) -{ - LOGD(""); - /*! - * \note - * Unable to test the positive case - */ - dts_pass("livebox_sync_buffer", "pass positive test"); -} - -static void utc_livebox_support_hw_buffer_n(void) -{ - LOGD(""); - int ret; - ret = livebox_support_hw_buffer(NULL); - dts_check_eq("livebox_support_hw_buffer", ret, LB_STATUS_ERROR_INVALID, "should returns LB_STATUS_ERROR_INVALID\n"); -} - -static void utc_livebox_support_hw_buffer_p(void) -{ - LOGD(""); - /*! - * \note - * Unable to test the positive case - */ - dts_pass("livebox_support_hw_buffer", "pass positive test"); -} - -static void utc_livebox_create_hw_buffer_n(void) -{ - LOGD(""); - int ret; - ret = livebox_create_hw_buffer(NULL); - dts_check_eq("livebox_create_hw_buffer", ret, LB_STATUS_ERROR_INVALID, "should returns LB_STATUS_ERROR_INVALID\n"); -} - -static void utc_livebox_create_hw_buffer_p(void) -{ - LOGD(""); - /*! - * \note - * Unable to test the positive case - */ - dts_pass("livebox_create_hw_buffer", "pass positive test"); -} - -static void utc_livebox_destroy_hw_buffer_n(void) -{ - LOGD(""); - int ret; - ret = livebox_destroy_hw_buffer(NULL); - dts_check_eq("livebox_destroy_hw_buffer", ret, LB_STATUS_ERROR_INVALID, "should returns LB_STATUS_ERROR_INVALID\n"); -} - -static void utc_livebox_destroy_hw_buffer_p(void) -{ - LOGD(""); - /*! - * \note - * Unable to test the positive case - */ - dts_pass("livebox_destroy_hw_buffer", "pass positive test"); -} - -static void utc_livebox_buffer_hw_buffer_n(void) -{ - LOGD(""); - void *ret; - ret = livebox_buffer_hw_buffer(NULL); - dts_check_eq("livebox_buffer_hw_buffer", ret, NULL, "should returns LB_STATUS_ERROR_INVALID"); -} - -static void utc_livebox_buffer_hw_buffer_p(void) -{ - LOGD(""); - /*! - * \note - * Unable to test the positive case - */ - dts_pass("livebox_buffer_hw_buffer", "pass positive test"); -} - -static void utc_livebox_buffer_pre_render_n(void) -{ - LOGD(""); - int ret; - ret = livebox_buffer_pre_render(NULL); - dts_check_eq("livebox_buffer_pre_render", ret, LB_STATUS_ERROR_INVALID, "should returns LB_STATUS_ERROR_INVALID\n"); -} - -static void utc_livebox_buffer_pre_render_p(void) -{ - LOGD(""); - /*! - * \note - * Unable to test the positive case - */ - dts_pass("livebox_buffer_pre_render", "pass positive test"); -} - -static void utc_livebox_buffer_post_render_n(void) -{ - LOGD(""); - int ret; - ret = livebox_buffer_post_render(NULL); - dts_check_eq("livebox_buffer_post_render", ret, LB_STATUS_ERROR_INVALID, "should returns LB_STATUS_ERROR_INVALID\n"); -} - -static void utc_livebox_buffer_post_render_p(void) -{ - LOGD(""); - /*! - * \note - * Unable to test the positive case - */ - dts_pass("livebox_buffer_post_render", "pass positive test"); -} - -static void utc_livebox_get_evas_object_n(void) -{ - LOGD(""); - Evas_Object *obj; - - obj = livebox_get_evas_object(NULL, 1); - dts_check_eq("livebox_get_evas_object", obj, NULL, "should returns NULL\n"); -} - -static void utc_livebox_get_evas_object_p(void) -{ - LOGD(""); - /*! - * \note - * Unable to test the positive case - */ - dts_pass("livebox_get_evas_object", "pass positve test"); -} - -struct tet_testlist tet_testlist[] = { - { utc_livebox_desc_open_n, NEGATIVE_TC_IDX }, - { utc_livebox_desc_open_p, POSITIVE_TC_IDX }, - { utc_livebox_desc_close_n, NEGATIVE_TC_IDX }, - { utc_livebox_desc_close_p, POSITIVE_TC_IDX }, - { utc_livebox_desc_set_category_n, NEGATIVE_TC_IDX }, - { utc_livebox_desc_set_category_p, POSITIVE_TC_IDX }, - { utc_livebox_desc_set_id_n, NEGATIVE_TC_IDX }, - { utc_livebox_desc_set_id_p, POSITIVE_TC_IDX }, - { utc_livebox_desc_add_block_n, NEGATIVE_TC_IDX }, - { utc_livebox_desc_add_block_p, POSITIVE_TC_IDX }, - { utc_livebox_desc_del_block_n, NEGATIVE_TC_IDX }, - { utc_livebox_desc_del_block_p, POSITIVE_TC_IDX }, - { utc_livebox_content_is_updated_n, NEGATIVE_TC_IDX }, - { utc_livebox_content_is_updated_p, POSITIVE_TC_IDX }, - { utc_livebox_request_close_pd_n, NEGATIVE_TC_IDX }, - { utc_livebox_request_close_pd_p, POSITIVE_TC_IDX }, - { utc_livebox_request_update_n, NEGATIVE_TC_IDX }, - { utc_livebox_request_update_p, POSITIVE_TC_IDX }, - { utc_livebox_util_nl2br_n, NEGATIVE_TC_IDX }, - { utc_livebox_util_nl2br_p, POSITIVE_TC_IDX }, - - { utc_livebox_acquire_buffer_n, NEGATIVE_TC_IDX }, - { utc_livebox_acquire_buffer_p, POSITIVE_TC_IDX }, - { utc_livebox_acquire_buffer_NEW_n, NEGATIVE_TC_IDX }, - { utc_livebox_acquire_buffer_NEW_p, POSITIVE_TC_IDX }, - - { utc_livebox_pixmap_id_n, NEGATIVE_TC_IDX }, - { utc_livebox_pixmap_id_p, POSITIVE_TC_IDX }, - - { utc_livebox_ref_buffer_n, NEGATIVE_TC_IDX }, - { utc_livebox_ref_buffer_p, POSITIVE_TC_IDX }, - - { utc_livebox_sync_buffer_n, NEGATIVE_TC_IDX }, - { utc_livebox_sync_buffer_p, POSITIVE_TC_IDX }, - - { utc_livebox_support_hw_buffer_n, NEGATIVE_TC_IDX }, - { utc_livebox_support_hw_buffer_p, POSITIVE_TC_IDX }, - { utc_livebox_create_hw_buffer_n, NEGATIVE_TC_IDX }, - { utc_livebox_create_hw_buffer_p, POSITIVE_TC_IDX }, - { utc_livebox_destroy_hw_buffer_n, NEGATIVE_TC_IDX }, - { utc_livebox_destroy_hw_buffer_p, POSITIVE_TC_IDX }, - { utc_livebox_buffer_hw_buffer_n, NEGATIVE_TC_IDX }, - { utc_livebox_buffer_hw_buffer_p, POSITIVE_TC_IDX }, - { utc_livebox_buffer_pre_render_n, NEGATIVE_TC_IDX }, - { utc_livebox_buffer_pre_render_p, POSITIVE_TC_IDX }, - { utc_livebox_buffer_post_render_n, NEGATIVE_TC_IDX }, - { utc_livebox_buffer_post_render_p, POSITIVE_TC_IDX }, - { utc_livebox_get_evas_object_n, NEGATIVE_TC_IDX }, - { utc_livebox_get_evas_object_p, POSITIVE_TC_IDX }, - - { NULL, 0 }, -}; - diff --git a/doc/livebox_doc.h b/doc/livebox_doc.h deleted file mode 100644 index 4b21f45..0000000 --- a/doc/livebox_doc.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2013 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @ingroup CORE_LIB_GROUP - * @defgroup CAPI_LIVEBOX_FRAMEWORK Livebox - */ - -/** - * \ingroup CAPI_LIVEBOX_FRAMEWORK - * \defgroup CAPI_LIVEBOX_HELPER_MODULE Livebox Helper - * \brief This helper library only can be used for Inhouse(EFL) liveboxes. - * \section CAPI_LIVEBOX_HELPER_MODULE_HEADER Required Header - * \#include - * \section CAPI_LIVEBOX_HELPER_MODULE_OVERVIEW Overview - * Help the inhouse(EFL) Livebox developer to generate description data formally. - * This API set is only be able to used data-provider-slave process. - * Because some API should be linked with it while loading. - */ diff --git a/dynamicbox/CMakeLists.txt b/dynamicbox/CMakeLists.txt new file mode 100644 index 0000000..48b5fb6 --- /dev/null +++ b/dynamicbox/CMakeLists.txt @@ -0,0 +1,88 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +PROJECT(dynamicbox C) + +SET(PREFIX ${CMAKE_INSTALL_PREFIX}) +SET(EXEC_PREFIX "\${prefix}") +SET(PROJECT_NAME "${PROJECT_NAME}") +SET(LIBDIR "\${exec_prefix}/lib") +SET(INCLUDEDIR "\${prefix}/include/${PROJECT_NAME}") +SET(VERSION_MAJOR 1) +SET(VERSION "${VERSION_MAJOR}.0.0") + +set(CMAKE_SKIP_BUILD_RPATH true) + +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include) + +INCLUDE(FindPkgConfig) +pkg_check_modules(pkgs REQUIRED + dlog + dynamicbox_service + dynamicbox_provider + evas + ecore + elementary +) + +IF (X11_SUPPORT) +pkg_check_modules(pkgs_extra REQUIRED + x11 +) +ADD_DEFINITIONS("-DHAVE_X11") +SET(BUILD_SOURCE + src/virtual_window.c +) +ENDIF (X11_SUPPORT) + +IF (WAYLAND_SUPPORT) +ADD_DEFINITIONS("-DHAVE_WAYLAND") +SET(BUILD_SOURCE + src/virtual_window_wayland.c +) +ENDIF (WAYLAND_SUPPORT) + +FOREACH(flag ${pkgs_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) + +FOREACH(flag ${pkgs_extra_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) + +SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fvisibility=hidden") + +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -g") + +ADD_DEFINITIONS("-DPREFIX=\"${PREFIX}\"") +ADD_DEFINITIONS("-DLOG_TAG=\"DYNAMICBOX\"") +ADD_DEFINITIONS("-DNDEBUG") +ADD_DEFINITIONS("-D_USE_ECORE_TIME_GET") +ADD_DEFINITIONS("-DMASTER_PKGNAME=\"data-provider-master\"") +ADD_DEFINITIONS("-DSLAVE_PKGNAME=\"com.samsung.data-provider-slave\"") +#ADD_DEFINITIONS("-D_ENABLE_PERF") + +SET (BUILD_SOURCE + ${BUILD_SOURCE} + src/dlist.c + src/util.c + src/dynamicbox.c + src/snapshot_window.c +) + +ADD_LIBRARY(${PROJECT_NAME} SHARED ${BUILD_SOURCE}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES SOVERSION ${VERSION_MAJOR}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES VERSION ${VERSION}) +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_LDFLAGS} ${pkgs_extra_LDFLAGS} "-lpthread") + +INSTALL(TARGETS ${PROJECT_NAME} DESTINATION lib) + +CONFIGURE_FILE(${PROJECT_NAME}.pc.in ${PROJECT_NAME}.pc @ONLY) +SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${PROJECT_NAME}.pc") + +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc DESTINATION lib/pkgconfig) + +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/dynamicbox.h DESTINATION include/${PROJECT_NAME}) +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/internal/dynamicbox.h DESTINATION include/${PROJECT_NAME}/internal) + +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE DESTINATION /usr/share/license RENAME "lib${PROJECT_NAME}") + +ADD_SUBDIRECTORY(data) diff --git a/LICENSE b/dynamicbox/LICENSE similarity index 100% rename from LICENSE rename to dynamicbox/LICENSE diff --git a/data/CMakeLists.txt b/dynamicbox/data/CMakeLists.txt similarity index 100% rename from data/CMakeLists.txt rename to dynamicbox/data/CMakeLists.txt diff --git a/dynamicbox/doc/dynamicbox_doc.h b/dynamicbox/doc/dynamicbox_doc.h new file mode 100644 index 0000000..f20bc65 --- /dev/null +++ b/dynamicbox/doc/dynamicbox_doc.h @@ -0,0 +1,135 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef __DYNAMICBOX_DOC_H__ +#define __DYNAMICBOX_DOC_H__ + +/** + * @defgroup DYNAMICBOX_UTILITY_MODULE dynamicbox + * @brief Supports APIs for development of inhouse dynamic box + * @ingroup CAPI_DYNAMICBOX_FRAMEWORK + * @section DYNAMICBOX_UTILITY_MODULE_HEADER Required Header + * \#include + * @section DYNAMICBOX_UTILITY_MODULE_OVERVIEW Overview +

Dynamic Box Utility functions

+ +

1. Script type Dynamic Box

+If you choose the Script Type DBox, you have to use this. + +Dynamic Box defines its own syntax to share the content between home application and provider application. +It is called "Description Data Syntax" + +To generate it you have to use following functions. + +@code +struct dynamicbox_desc *desc_handle; +int idx; + +desc_handle = dynamicbox_desc_open(id, 0); +if (!desc_handle) { + // Error +} + +dynamicbox_desc_set_size(desc_handle, id, 720, 360); + +// Loads sub-layout object into main layout +idx = dynamicbox_desc_add_block(desc_handle, NULL, DBOX_DESC_TYPE_SCRIPT, "sub,layout", "/usr/apps/com.samsung.my-app/shared/res/dbox.edj", "sub,group"); +dynamicbox_desc_set_id(desc_handle, idx, "sub,layout"); + +// Set a text for sub-layout object +dynamicbox_desc_add_block(desc_handle, "sub,layout", DBOX_DESC_TYPE_TEXT, "sub,layout,text", "Hello World", NULL); + +// Flushes changes, the content will be changed after close this handle. +dynamicbox_desc_close(desc_handle); +desc_handle = NULL; +@endcode + +Only after you close the desc_handle, the provider will send changes to the dynamic box manager service. +And if it needs to propagate events to the home application, the home application will get changes event. + +

2. Window(buffer) type Dynamic Box

+ +@code +Evas_Object *parent; +Evas_Object *win; + +parent = dynamicbox_get_evas_object(id, 0); +if (!parent) { + // Error +} + +win = elm_win_add(parent, "Dynamic Box Window", ELM_WIN_DYNAMIC_BOX); +evas_object_del(parent); +if (!win) { + // Error +} +@endcode + +To create a window for dynamic box, +You have to get the parent object using dynamicbox_get_evas_object(). +And after creating a window for dynamic box, you have to delete it. +Its attributes will be passed to the newly created window. So you don't need keep the parent object anymore. + +After creating a window, you can do what you want like an application. +Creatig any core-control such as button, list, etc, .... + +

3. Image type Dynamic Box

+This kind of dynamic box should create an image file using given Id. +The Id's syntax is "file://ABS_PATH_OF_OUTPUT_FILE", so you should create an image file using this URI. +The Id will be assigned to every dynamic box instances. +And those are unique. + +If you create an image file, you should notify it to the viewer using dynamicbox_provider_app_dbox_updated() +it is provided by libdynamicbox_provider_app package. + +

4. Text type Dynamic Box (Experimental)

+In case of text type, you may have no window or script file. +The text type dynamic box only needs to generate content data using dynamicbox_desc_XXXX series APIs. +Of course, after you prepare the desc file, you have to call dynamicbox_provider_app_dbox_updated() function too. +Then the viewer will get your updated contents and try to parse it to locate content of dynamic box to its screen. +But, unfortunately, this type of dynamic box is not fully supported yet. +Because it very highly depends on the viewer implementations. +So if the viewer doesn't support this type of dynamic box, you cannot do anything for user. + +To generate the text data, you can use below API set. + + - dynamicbox_desc_open() + - dynamicbox_desc_set_category() + - dynamicbox_desc_set_size() + - dynamicbox_desc_set_id() + - dynamicbox_desc_add_block() + - dynamicbox_desc_del_block() + - dynamicbox_desc_close() + +Here is a sample code for you. +\code +#define FOR_GBAR 1 +#define FOR_DBOX 0 + +struct dynamicbox_desc *handle; +int idx; + +handle = dynamicbox_desc_open(handle, FOR_GBAR); // The second parameter will help you choose to target, for glance bar or dynamic box? +idx = dynamicbox_desc_add_block(handle, NULL, DBOX_DESC_TYPE_SCRIPT, "/opt/usr/apps/your.company.application/shared/resource/edje/script.edj", "sample", NULL); +dynamicbox_desc_set_id(handle, idx, "sample"); +dynamicbox_desc_close(handle); +dynamicbox_provider_app_dbox_updated(dbox_id, 0, 0); +\endocde + + */ + +#endif /* __DYNAMICBOX_DOC_H__ */ diff --git a/dynamicbox/dynamicbox.pc.in b/dynamicbox/dynamicbox.pc.in new file mode 100644 index 0000000..404c551 --- /dev/null +++ b/dynamicbox/dynamicbox.pc.in @@ -0,0 +1,12 @@ +prefix=@PREFIX@ +exec_prefix=@EXEC_PREFIX@ +libdir=@LIBDIR@ +includedir=@INCLUDEDIR@ + +Name: dynamicbox +Description: dynamicbox supporting library +Version: @VERSION@ +Requires.private: dynamicbox_service >= 1.0.0 dynamicbox_provider >= 1.0.0 +Libs: -L${libdir} -ldynamicbox +Cflags: -I${includedir} +cppflags: -I${includedir} diff --git a/dynamicbox/include/debug.h b/dynamicbox/include/debug.h new file mode 100644 index 0000000..1d6ad5e --- /dev/null +++ b/dynamicbox/include/debug.h @@ -0,0 +1,46 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define DbgPrint(format, arg...) SECURE_LOGD(format, ##arg) +#define ErrPrint(format, arg...) SECURE_LOGE(format, ##arg) +#define WarnPrint(format, arg...) SECURE_LOGW(format, ##arg) + +#if defined(_ENABLE_PERF) +#define PERF_INIT() \ + struct timeval __stv; \ + struct timeval __etv; \ + struct timeval __rtv + +#define PERF_BEGIN() do { \ + if (gettimeofday(&__stv, NULL) < 0) { \ + ErrPrint("gettimeofday: %s\n", strerror(errno)); \ + } \ +} while (0) + +#define PERF_MARK(tag) do { \ + if (gettimeofday(&__etv, NULL) < 0) { \ + ErrPrint("gettimeofday: %s\n", strerror(errno)); \ + } \ + timersub(&__etv, &__stv, &__rtv); \ + DbgPrint("[%s] %u.%06u\n", tag, __rtv.tv_sec, __rtv.tv_usec); \ +} while (0) +#else +#define PERF_INIT() +#define PERF_BEGIN() +#define PERF_MARK(tag) +#endif + +/* End of a file */ diff --git a/dynamicbox/include/dlist.h b/dynamicbox/include/dlist.h new file mode 100644 index 0000000..4a4ac3e --- /dev/null +++ b/dynamicbox/include/dlist.h @@ -0,0 +1,43 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define dlist_remove_data(list, data) do { \ + struct dlist *l; \ + l = dlist_find_data(list, data); \ + list = dlist_remove(list, l); \ +} while (0) + +#define dlist_foreach(list, l, data) \ + for ((l) = (list); ((data) = dlist_data(l)); (l) = dlist_next(l)) + +#define dlist_foreach_safe(list, l, n, data) \ + for ((l) = (list), (n) = dlist_next(l); \ + ((data) = dlist_data(l)); \ + (l) = (n), (n) = dlist_next(l)) + +struct dlist; + +extern struct dlist *dlist_append(struct dlist *list, void *data); +extern struct dlist *dlist_prepend(struct dlist *list, void *data); +extern struct dlist *dlist_remove(struct dlist *list, struct dlist *l); +extern struct dlist *dlist_find_data(struct dlist *list, void *data); +extern void *dlist_data(struct dlist *l); +extern struct dlist *dlist_next(struct dlist *l); +extern struct dlist *dlist_prev(struct dlist *l); +extern int dlist_count(struct dlist *l); +extern struct dlist *dlist_nth(struct dlist *l, int nth); + +/* End of a file */ diff --git a/dynamicbox/include/dynamicbox.h b/dynamicbox/include/dynamicbox.h new file mode 100644 index 0000000..4f05de7 --- /dev/null +++ b/dynamicbox/include/dynamicbox.h @@ -0,0 +1,283 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#ifndef __DYNAMICBOX_UILITY_H +#define __DYNAMICBOX_UILITY_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @file dynamicbox.h + * @brief This file declares API of libdynamicbox library + * @since_tizen 2.3 + */ + +/** + * @addtogroup CAPI_DYNAMICBOX_UTILITY_MODULE + * @{ + */ + +/** + * @brief Event information type for dynamicbox_content_event() + * @details definition is in dynamicbox_service.h file + * @since_tizen 2.3 + */ +typedef struct dynamicbox_event_info *dynamicbox_event_info_t; + +/** + * @brief Creates an Object to create an elm_win object. + * @details Creating a new Object using Dynamic Box frame buffer. + * @since_tizen 2.3 + * @param[in] id Instance Id + * @param[in] gbar 1 if this object is created for Glance Bar or 0 (for Dynamic Box) + * @privlevel public + * @privilege %http://developer.samsung.com/tizen/privilege/dynamicbox.provider + * @feature http://developer.samsung.com/tizen/feature/samsung_extension + * @feature http://developer.samsung.com/tizen/feature/in_house/shell.appwidget + * @return void* Object type + * @retval Address Valid evas object + * @retval @c NULL failed to create, dynamicbox_last_status() will returns reason of failure + */ +extern void *dynamicbox_get_evas_object(const char *id, int gbar); + +/** + * @brief Set extra information for updated content. + * @details + * If the provider should give some hints to the viewer, + * such as title, icon and name, this function can set them. + * provider will send those information to the viewer when the + * content is updated. + * @since_tizen 2.3 + * @remarks This function only works with the buffer type inhouse provider. + * @param[in] id Dynamic Box Instance Id + * @param[in] content Content string that will pass to a Dynamic Box via dynamicbox_create interface when it is re-created. + * @param[in] title Human readable text for accessitility, summarized text for representing the content of a box. + * @param[in] icon Path of icon image file - alternative image content + * @param[in] name Name of a box - alternative text content + * @return int type + * @feature http://developer.samsung.com/tizen/feature/samsung_extension + * @feature http://developer.samsung.com/tizen/feature/in_house/shell.appwidget + * @retval #DBOX_STATUS_ERROR_OUT_OF_MEMORY Out of memory + * @retval #DBOX_STATUS_ERROR_INVALID_PARAMETER Invalid parameters + * @retval #DBOX_STATUS_ERROR_FAULT Unrecoverable error + * @retval #DBOX_STATUS_ERROR_NONE Successfully sent + */ +extern int dynamicbox_set_extra_info(const char *id, const char *content, const char *title, const char *icon, const char *name); + +/** + * @brief Return values of dynamicbox programming interfaces: Operation is successfully done. + * @since_tizen 2.3 + * @feature http://developer.samsung.com/tizen/feature/samsung_extension + * @feature http://developer.samsung.com/tizen/feature/in_house/shell.appwidget + */ +extern const int DBOX_DONE; + +/** + * @brief Return values of dynamicbox programming interfaces: Contents are updated. + * @since_tizen 2.3 + * @feature http://developer.samsung.com/tizen/feature/samsung_extension + * @feature http://developer.samsung.com/tizen/feature/in_house/shell.appwidget + */ +extern const int DBOX_OUTPUT_UPDATED; + +/** + * @brief Return values of dynamicbox programming interfaces: Need to call the dynamicbox_need_to_update and dynamicbox_update_content. + * @since_tizen 2.3 + * @feature http://developer.samsung.com/tizen/feature/samsung_extension + * @feature http://developer.samsung.com/tizen/feature/in_house/shell.appwidget + */ +extern const int DBOX_NEED_TO_SCHEDULE; + +/** + * @internal + * @brief Return values of dynamicbox programming interfaces: Need to create a new instance. + * @since_tizen 2.3 + */ +extern const int DBOX_NEED_TO_CREATE; + +/** + * @brief Return values of dynamicbox programming interfaces: Need to do force update. + * @since_tizen 2.3 + * @feature http://developer.samsung.com/tizen/feature/samsung_extension + * @feature http://developer.samsung.com/tizen/feature/in_house/shell.appwidget + */ +extern const int DBOX_FORCE_TO_SCHEDULE; + +/** + * @brief Return values of dynamicbox programming interfaces: Need to destroy this instance. + * @since_tizen 2.3 + * @feature http://developer.samsung.com/tizen/feature/samsung_extension + * @feature http://developer.samsung.com/tizen/feature/in_house/shell.appwidget + */ +extern const int DBOX_NEED_TO_DESTROY; + +/** + * @brief Return values of dynamicbox programming interfaces: Need to update. + * @since_tizen 2.3 + * @feature http://developer.samsung.com/tizen/feature/samsung_extension + * @feature http://developer.samsung.com/tizen/feature/in_house/shell.appwidget + */ +extern const int DBOX_NEED_TO_UPDATE; + +/** + * @brief System event type: System font is changed. + * @since_tizen 2.3 + * @feature http://developer.samsung.com/tizen/feature/samsung_extension + * @feature http://developer.samsung.com/tizen/feature/in_house/shell.appwidget + */ +extern const int DBOX_SYS_EVENT_FONT_CHANGED; + +/** + * @brief System event type: System language is changed. + * @since_tizen 2.3 + * @feature http://developer.samsung.com/tizen/feature/samsung_extension + * @feature http://developer.samsung.com/tizen/feature/in_house/shell.appwidget + */ +extern const int DBOX_SYS_EVENT_LANG_CHANGED; + +/** + * @brief System event type: System time is changed. + * @since_tizen 2.3 + * @feature http://developer.samsung.com/tizen/feature/samsung_extension + * @feature http://developer.samsung.com/tizen/feature/in_house/shell.appwidget + */ +extern const int DBOX_SYS_EVENT_TIME_CHANGED; + +/** + * @brief System event type: MMC Status change event. + * @since_tizen 2.3 + * @feature http://developer.samsung.com/tizen/feature/samsung_extension + * @feature http://developer.samsung.com/tizen/feature/in_house/shell.appwidget + */ +extern const int DBOX_SYS_EVENT_MMC_STATUS_CHANGED; + +/** + * @brief System event type: Region changed. + * @since_tizen 2.3 + * @feature http://developer.samsung.com/tizen/feature/samsung_extension + * @feature http://developer.samsung.com/tizen/feature/in_house/shell.appwidget + */ +extern const int DBOX_SYS_EVENT_REGION_CHANGED; + +/** + * @brief System event type: Accessibility mode changed. + * @since_tizen 2.3 + * @feature http://developer.samsung.com/tizen/feature/samsung_extension + * @feature http://developer.samsung.com/tizen/feature/in_house/shell.appwidget + */ +extern const int DBOX_SYS_EVENT_TTS_CHANGED; + +/** + * @brief System event type: Dynamic Box is paused. + * @since_tizen 2.3 + * @feature http://developer.samsung.com/tizen/feature/samsung_extension + * @feature http://developer.samsung.com/tizen/feature/in_house/shell.appwidget + */ +extern const int DBOX_SYS_EVENT_PAUSED; + +/** + * @brief System event type: Dynamic Box is resumed. + * @since_tizen 2.3 + * @feature http://developer.samsung.com/tizen/feature/samsung_extension + * @feature http://developer.samsung.com/tizen/feature/in_house/shell.appwidget + */ +extern const int DBOX_SYS_EVENT_RESUMED; + +/** + * @brief System event type: Dynamic Box instance is removed from a viewer. + * @since_tizen 2.3 + * @feature http://developer.samsung.com/tizen/feature/samsung_extension + * @feature http://developer.samsung.com/tizen/feature/in_house/shell.appwidget + */ +extern const int DBOX_SYS_EVENT_DELETED; + +/** + * @brief Requests to schedule the update operation to a provider. + * Your DBox will get the update request, if the @a id is specified, specific box only will get it. + * @since_tizen 2.3 + * @param[in] id Instance Id which is passed to you via the first parameter of every dynamicbox_XXXX interface functions + * @feature http://developer.samsung.com/tizen/feature/samsung_extension + * @feature http://developer.samsung.com/tizen/feature/in_house/shell.appwidget + * @return If succes returns 0 or return less than 0 + * @retval #DBOX_STATUS_ERROR_NONE Successfully triggered + * @retval #DBOX_STATUS_ERROR_INVALID_PARAMETER Invalid argument + * @retval #DBOX_STATUS_ERROR_OUT_OF_MEMORY Not enough memory + * @retval #DBOX_STATUS_ERROR_NOT_EXIST Given id instance is not exist + * @retval #DBOX_STATUS_ERROR_PERMISSION_DENIED Permission denied + * @retval #DBOX_STATUS_ERROR_DISABLED in case of direct request for updating is disabled + */ +extern int dynamicbox_request_update(const char *id); + +/** + * @brief Send a freeze request to the viewer (homescreen) + * @details + * The viewer will get this request via event callback. + * Then it should freeze its scroller or stop moving the dynamicbox. + * @since_tizen 2.3 + * @remarks If the viewer doesn't care this request, this will has no effect. + * @param[in] dboxid Dynamic Box Package Id + * @param[in] id Instance Id which is passed to you via the first parameter of every dynamicbox_XXXX interface functions + * @privlevel public + * @privilege %http://developer.samsung.com/tizen/privilege/dynamicbox.provider + * @feature http://developer.samsung.com/tizen/feature/samsung_extension + * @feature http://developer.samsung.com/tizen/feature/in_house/shell.appwidget + * @return int type + * @retval #DBOX_STATUS_ERROR_INVALID_PARAMETER Invalid parameters + * @retval #DBOX_STATUS_ERROR_OUT_OF_MEMORY Out of memory + * @retval #DBOX_STATUS_ERROR_PERMISSION_DENIED Permission denied + * @retval #DBOX_STATUS_ERROR_FAULT Failed to send requet + * @retval #DBOX_STATUS_ERROR_NONE Successfully requested + * @see dynamicbox_release_scroller() + */ +extern int dynamicbox_freeze_scroller(const char *dboxid, const char *id); + +/** + * @brief Send a release request to the viewer (homescreen) + * @details + * The viewer will get this request via event callback. + * Then it should release its scroller or continue moving the dynamicbox. + * @since_tizen 2.3 + * @remarks If the viewer doesn't care this request, this will has no effect. + * @param[in] dboxid Dynamic Box Package Id + * @param[in] id Instance Id which is passed to you via the first parameter of every dynamicbox_XXXX interface functions + * @privlevel public + * @privilege %http://developer.samsung.com/tizen/privilege/dynamicbox.provider + * @feature http://developer.samsung.com/tizen/feature/samsung_extension + * @feature http://developer.samsung.com/tizen/feature/in_house/shell.appwidget + * @return int type + * @retval #DBOX_STATUS_ERROR_PERMISSION_DENIED Permission denied + * @retval #DBOX_STATUS_ERROR_INVALID_PARAMETER Invalid parameters + * @retval #DBOX_STATUS_ERROR_OUT_OF_MEMORY Out of memory + * @retval #DBOX_STATUS_ERROR_FAULT Failed to send requet + * @retval #DBOX_STATUS_ERROR_NONE Successfully requested + * @see dynamicbox_freeze_scroller() + */ +extern int dynamicbox_thaw_scroller(const char *dboxid, const char *id); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif +/* End of a file */ diff --git a/dynamicbox/include/internal/dynamicbox.h b/dynamicbox/include/internal/dynamicbox.h new file mode 100644 index 0000000..01f23a9 --- /dev/null +++ b/dynamicbox/include/internal/dynamicbox.h @@ -0,0 +1,688 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Export by dynamicbox_service + */ +#include +#include + +#ifndef __DYNAMICBOX_UILITY_INTERNAL_H +#define __DYNAMICBOX_UILITY_INTERNAL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @file dynamicbox_internal.h + * @brief This file declares API of libdynamicbox library + * @since_tizen 2.3 + */ + +/** + * @addtogroup CAPI_DYNAMICBOX_UTILITY_MODULE + * @{ + */ + +/** + * @internal + * @brief Definition for COLOR BLOCK. + * @since_tizen 2.3 + */ +#define DBOX_DESC_TYPE_COLOR "color" + +/** + * @internal + * @brief Definition for TEXT BLOCK. + * @since_tizen 2.3 + */ +#define DBOX_DESC_TYPE_TEXT "text" + +/** + * @internal + * @brief Definition for IMAGE BLOCK. + * @since_tizen 2.3 + */ +#define DBOX_DESC_TYPE_IMAGE "image" + +/** + * @internal + * @brief Definition for SIGNAL BLOCK. + * @since_tizen 2.3 + */ +#define DBOX_DESC_TYPE_SIGNAL "signal" + +/** + * @internal + * @brief Definition for INFO BLOCK. + * @since_tizen 2.3 + */ +#define DBOX_DESC_TYPE_INFO "info" + +/** + * @internal + * @brief Definition for DRAG BLOCK. + * @since_tizen 2.3 + */ +#define DBOX_DESC_TYPE_DRAG "drag" + +/** + * @internal + * @brief Definition for SCRIPT SCRIPT. + * @since_tizen 2.3 + */ +#define DBOX_DESC_TYPE_SCRIPT "script" + +/** + * @internal + * @brief Definition for ACCESSIBILITY INFORMATION BLOCK. + * @since_tizen 2.3 + */ +#define DBOX_DESC_TYPE_ACCESS "access" + +/** + * @internal + * @brief Definition for accessibility operation. + * @since_tizen 2.3 + */ +#define DBOX_DESC_TYPE_ACCESS_OPERATION "access,operation" + +/** + * @internal + * @brief Definition for set highlight on specified part. + * @since_tizen 2.3 + */ +#define DBOX_DESC_DATA_ACCESS_OPERATION_HL_SET "set,hl" + +/** + * @internal + * @brief Definition for remove highlight from specified part. + * @since_tizen 2.3 + */ +#define DBOX_DESC_DATA_ACCESS_OPERATION_HL_UNSET "unset,hl" + +/** + * @internal + * @brief Definition for move the highlight to next part. + * @since_tizen 2.3 + */ +#define DBOX_DESC_DATA_ACCESS_OPERATION_HL_NEXT "next,hl" + +/** + * @internal + * @brief Definition for move the highlight to previous part. + * @since_tizen 2.3 + */ +#define DBOX_DESC_DATA_ACCESS_OPERATION_HL_PREV "prev,hl" + +/** + * @internal + * @brief Definition for reset the chain of accessibility highlight list. + * @since_tizen 2.3 + */ +#define DBOX_DESC_DATA_ACCESS_OPERATION_RESET "reset,focus" + +/** + * @internal + * @brief Definition for specify the highlight move option. + * @details If the highlight list reaches to the last object, move back to the first object. + * @since_tizen 2.3 + */ +#define DBOX_DESC_OPTION_ACCESS_HL_LOOP "cycle" + +/** + * @internal + * @brief Definition for specify the highlight move option. + * @details If the highlight list reaches to the last object(or the first object), + * the "prev,hl", "next,hl" will be failed. + * @since_tizen 2.3 + */ +#define DBOX_DESC_OPTION_ACCESS_HL_NOLOOP "no,cycle" + +/** + * @internal + * @brief Dynamic Box description data handle. + * @since_tizen 2.3 + */ +typedef struct dynamicbox_desc *dynamicbox_desc_h; + +/** + * @internal + * @brief Flush Callback for snapshot window + * @since_tizen 2.3 + */ +typedef void (*dynamicbox_flush_cb)(void *snapshot_window, const char *id, int status, void *data); + +/** + * @internal + * @brief Updates a description file. + * @since_tizen 2.3 + * @remarks Must be used only by Inhouse Dynamic Box. + * @param[in] id Dynamic Box Instance Id + * @param[in] gbar 1 for Glance Bar or 0 + * @privlevel public + * @privilege %http://developer.samsung.com/tizen/privilege/dynamicbox.provider + * @feature http://developer.samsung.com/tizen/feature/samsung_extension + * @feature http://developer.samsung.com/tizen/feature/in_house/shell.appwidget + * @return Handle of desc instance + * @retval @c NULL Failed to create a desc instance, dynamicbox_last_status() will returns reason of failure + * @pre Should be loaded by data-provider-slave. + * @post Should be destroyed(flushed) using dynamicbox_desc_close() API. + * @see dynamicbox_desc_close() + */ +extern dynamicbox_desc_h dynamicbox_desc_open(const char *id, int gbar); + +/** + * @internal + * @brief Completes the description file update. + * @details Only if this API is called, the description data will be applied to the content of Dynamic Box (or GBar). + * @since_tizen 2.3 + * @remarks Must be used only by Inhouse Dynamic Box. + * @param[in] handle Handle which is created by dynamicbox_desc_open() function + * @privlevel public + * @privilege %http://developer.samsung.com/tizen/privilege/dynamicbox.provider + * @feature http://developer.samsung.com/tizen/feature/samsung_extension + * @feature http://developer.samsung.com/tizen/feature/in_house/shell.appwidget + * @return int type + * @retval #DBOX_STATUS_ERROR_NONE If the flushing description data is successfully done + * @retval #DBOX_STATUS_ERROR_INVALID_PARAMETER If the given handle is not valid + * @retval #DBOX_STATUS_ERROR_PERMISSION_DENIED Permission denied + * @pre Handle must be created by dynamicbox_desc_open() + * @post Handle must not be used after return from this function. + * @see dynamicbox_desc_open() + */ +extern int dynamicbox_desc_close(dynamicbox_desc_h handle); + +/** + * @internal + * @brief Sets the category information of current description data. + * @details Creates a new description block for updating category information of layout object. + * @since_tizen 2.3 + * @param[in] handle Handle which is created by dynamicbox_desc_open() function + * @param[in] id Id string of target object + * @param[in] category Category string that will be used by layout object + * @return int type + * @retval #DBOX_STATUS_ERROR_INVALID_PARAMETER Invalid handle + * @retval #DBOX_STATUS_ERROR_OUT_OF_MEMORY Memory is not enough to add this block + * @retval index Index(>=0) of added block, which can be used by dynamicbox_desc_set_id() + * @pre Must be called after create a handle using dynamicbox_desc_open() + * @see dynamicbox_desc_set_id() + */ +extern int dynamicbox_desc_set_category(dynamicbox_desc_h handle, const char *id, const char *category); + +/** + * @internal + * @brief Sets the content size. + * @details Sets the content size of layout. + * @since_tizen 2.3 + * @param[in] handle Handle which is created by dynamicbox_desc_open() function + * @param[in] id Id string of target object + * @param[in] w Width in pixel + * @param[in] h Height in pixel + * @return int type + * @retval #DBOX_STATUS_ERROR_INVALID_PARAMETER Invalid argument + * @retval #DBOX_STATUS_ERROR_OUT_OF_MEMORY Not enough memory to add a new block + * @retval index Index(>=0) of added block Successfully added + * @see dynamicbox_desc_open() + * @see dynamicbox_desc_set_id() + */ +extern int dynamicbox_desc_set_size(dynamicbox_desc_h handle, const char *id, int w, int h); + +/** + * @internal + * @brief Sets the target id of the given block. + * @details Only available for the script block. + * @since_tizen 2.3 + * @param[in] handle Handle which is created by dynamicbox_desc_open() function + * @param[in] idx Index of target block + * @param[in] id Id String which will be used by other dynamicbox_desc_XXX functions + * @return int type + * @retval #DBOX_STATUS_ERROR_NONE Id is successfully updated for given idx of desc block + * @retval #DBOX_STATUS_ERROR_INVALID_PARAMETER Invalid argument + * @retval #DBOX_STATUS_ERROR_NOT_EXIST Given index of desc block is not exists + * @pre Desc block should be exists which has given index "idx". + * @post Specified Id string("id") can be used by other dynamicbox_desc_XXXX functions. + * @see dynamicbox_desc_open() + * @see dynamicbox_desc_set_id() + */ +extern int dynamicbox_desc_set_id(dynamicbox_desc_h handle, int idx, const char *id); + +/** + * @internal + * @brief Adds a new block. + * @since_tizen 2.3 + * @param[in] handle Handle which is created by the dynamicbox_desc_open() function + * @param[in] id ID of source script object + * @param[in] type Type (image|text|script|signal|.. etc) + * @param[in] part Target part to update with given content(data) + * @param[in] data Content for specified part + * @param[in] option Option for the block. (script: group, image: option, ...) + * @return Index of current description block + * @retval #DBOX_STATUS_ERROR_INVALID_PARAMETER Invalid argument + * @retval #DBOX_STATUS_ERROR_OUT_OF_MEMORY Not enough memory to add a new desc block + * @retval index Index(>=0) of added desc block + * @pre Handle must be created using dynamicbox_desc_open. + * @see dynamicbox_desc_set_id() + * @see dynamicbox_desc_del_block() + */ +extern int dynamicbox_desc_add_block(dynamicbox_desc_h handle, const char *id, const char *type, const char *part, const char *data, const char *option); + +/** + * @internal + * @brief Deletes an added block. + * @since_tizen 2.3 + * @details If you discard the added desc block, use this API and the index of the created desc block. + * @param[in] handle Handle which is created by dynamicbox_desc_open() function + * @param[in] idx Index of added block, returned from dynamicbox_desc_add_block(), dynamicbox_desc_set_size(), dynamicbox_desc_set_category(), etc + * @return int type + * @retval #DBOX_STATUS_ERROR_NONE Successfully deleted + * @retval #DBOX_STATUS_ERROR_NOT_EXIST Given index of desc block is not exists + * @pre Index must be exists. + * @see dynamicbox_desc_add_block() + * @see dynamicbox_desc_open() + */ +extern int dynamicbox_desc_del_block(dynamicbox_desc_h handle, int idx); + +/** + * @internal + * @brief Structure for a Dynamic Box buffer defined by a provider. + * @since_tizen 2.3 + */ +typedef struct dynamicbox_buffer *dynamicbox_buffer_h; + +/** + * @internal + * @brief Return values of dynamicbox programming interfaces: Using network. + * @since_tizen 2.3 + */ +extern const int DBOX_USE_NET; + +/** + * @internal + * @brief Notifies the updated content to the provider. + * @details Forcedly notifies the updated contents. + * This function can be used from async callback function to notify the updated content. + * @since_tizen 2.3 + * @param[in] id Instance Id which is passed to you via the first parameter of every dynamicbox_XXXX interface functions + * @param[in] gbar 1 for updating content of Glance Bar or 0(for content of Dynamic Box) + * @return int type + * @retval #DBOX_STATUS_ERROR_OUT_OF_MEMORY Not enough memory + * @retval #DBOX_STATUS_ERROR_INVALID_PARAMETER Invalid argument + * @retval #DBOX_STATUS_ERROR_IO_ERROR I/O failed, Cannot access given resource file(id) + * @retval #DBOX_STATUS_ERROR_NONE Successfully notified + * @pre This API only can be used after loaded into the data-provider-slave process. + */ +extern int dynamicbox_content_is_updated(const char *id, int gbar); + +/** + * @internal + * @brief Acquires a buffer for GBar or DBox, currently only the GBar is supported. + * @since_tizen 2.3 + * @param[in] id Instance Id which is passed to you via the first parameter of every dynamicbox_XXXX interface functions + * @param[in] gbar 1 for Glance Bar or 0 for Dynamic Box + * @param[in] width Width in pixel + * @param[in] height Height in pixel + * @param[in] pixels Size of a pixel in bytes + * @param[in] handler Event handling callback + * @param[in] data User data for event handling callback + * @privlevel public + * @privilege %http://developer.samsung.com/tizen/privilege/dynamicbox.provider + * @feature http://developer.samsung.com/tizen/feature/samsung_extension + * @feature http://developer.samsung.com/tizen/feature/in_house/shell.appwidget + * @return Buffer handle + * @retval @c NULL Failed to acquire buffer, dynamicbox_last_status() will returns reason of failure. + * @retval handler Handle object + * @pre Given instance must be specify its type as buffer. or this API will be fail. + * @post Allocated buffer object must be released via dynamicbox_release_buffer(). + * @see dynamicbox_release_buffer() + */ +extern dynamicbox_buffer_h dynamicbox_create_buffer(const char *id, int gbar, int auto_align, int (*handler)(dynamicbox_buffer_h, dynamicbox_buffer_event_data_t, void *), void *data); + +/** + * @internal + * @brief Acquire a buffer for GBar or DBox. + * @since_tizen 2.3 + * @param[in] handle Buffer handle + * @param[in] idx Index of a buffer, DBOX_PRIMARY_BUFFER is used for accessing primary buffer + * @param[in] width Width of a buffer + * @param[in] height Height of a buffer + * @param[in] pixels Pixel size in byte + * @privlevel public + * @privilege %http://developer.samsung.com/tizen/privilege/dynamicbox.provider + * @feature http://developer.samsung.com/tizen/feature/samsung_extension + * @feature http://developer.samsung.com/tizen/feature/in_house/shell.appwidget + * @return int status + * @retval #DBOX_STATUS_ERROR_NONE Successfully allocated + * @retval #DBOX_STATUS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #DBOX_STATUS_ERROR_FAULT Unrecoverable error occurred + * @retval #DBOX_STATUS_ERROR_PERMISSION_DENIED Permission denied + * @pre dynamicbox_create_buffer() must be called + * @see dynamicbox_create_buffer() + * @see dynamicbox_release_buffer() + */ +extern int dynamicbox_acquire_buffer(dynamicbox_buffer_h handle, int idx, int width, int height, int pixels); + +/** + * @internal + * @brief Acquires the Id of Resource (window system). + * @details Only if the provider uses Resource for providing render buffer. + * @since_tizen 2.3 + * @remarks Pixmap Id can be destroyed if you call the dynamicbox_release_buffer(). Then this Resource Id is not guaranteed to use. + * @param[in] handle Buffer handle + * @param[in] idx Index of a buffer, #c DBOX_PRIMARY_BUFFER is used for accessing the primary buffer + * @return unsigned int Resource Id + * @retval >0 Resource Id + * @retval 0 Failed to get Resource Id + * @pre The system must be set to use the Resource Id method for content sharing. + * @see dynamicbox_acquire_buffer() + */ +extern unsigned int dynamicbox_resource_id(dynamicbox_buffer_h handle, int idx); + +/** + * @internal + * @brief Releases the buffer of dynamicbox. + * @since_tizen 2.3 + * @param[in] handle Buffer handle + * @param[in] idx Index of a buffer, #c DBOX_PRIMARY_BUFFER is used for accessing the primary buffer + * @privlevel public + * @privilege %http://developer.samsung.com/tizen/privilege/dynamicbox.provider + * @feature http://developer.samsung.com/tizen/feature/samsung_extension + * @feature http://developer.samsung.com/tizen/feature/in_house/shell.appwidget + * @return int status + * @retval #DBOX_STATUS_ERROR_INVALID_PARAMETER Invalid argument + * @retval #DBOX_STATUS_ERROR_NONE Successfully released + * @retval #DBOX_STATUS_ERROR_PERMISSION_DENIED Permission denied + * @pre Handle must be created using dynamicbox_acquire_buffer(). + * @see dynamicbox_acquire_buffer() + */ +extern int dynamicbox_release_buffer(dynamicbox_buffer_h handle, int idx); + +/** + * @internal + * @brief Destroy a buffer of dynamicbox + * @since_tizen 2.3 + * @param[in] handle buffer handle + * @privlevel public + * @privilege %http://developer.samsung.com/tizen/privilege/dynamicbox.provider + * @feature http://developer.samsung.com/tizen/feature/samsung_extension + * @feature http://developer.samsung.com/tizen/feature/in_house/shell.appwidget + * @return int status + * @retval #DBOX_STATUS_ERROR_INVALID_PARAMTER Invalid argument + * @retval #DBOX_STATUS_ERROR_PERMISSION_DENIED Permission denied + * @retval #DBOX_STATUS_ERROR_NONE Successfully destroyed + * @see dynamicbox_create_buffer() + */ +extern int dynamicbox_destroy_buffer(dynamicbox_buffer_h handle); + +/** + * @internal + * @brief Gets the address of buffer for S/W rendering. + * @details If you try to use this, after dynamicbox_create_hw_buffer(), you will get @c NULL. + * This API only be used for primary buffer. you cannot access the extra buffer + * @since_tizen 2.3 + * @param[in] handle Buffer handle + * @privlevel public + * @privilege %http://developer.samsung.com/tizen/privilege/dynamicbox.provider + * @feature http://developer.samsung.com/tizen/feature/samsung_extension + * @feature http://developer.samsung.com/tizen/feature/in_house/shell.appwidget + * @return void* address of the render buffer + * @retval @c NULL If it falis to get buffer address, dynamicbox_last_status() will returns reason of failure. + * @retval address If it succeed to get the buffer address + * @see dynamicbox_unref_buffer() + */ +extern void *dynamicbox_ref_buffer(dynamicbox_buffer_h handle); + +/** + * @internal + * @brief Releases the S/W render buffer. + * @since_tizen 2.3 + * @param[in] buffer Address of render buffer + * @privlevel public + * @privilege %http://developer.samsung.com/tizen/privilege/dynamicbox.provider + * @feature http://developer.samsung.com/tizen/feature/samsung_extension + * @feature http://developer.samsung.com/tizen/feature/in_house/shell.appwidget + * @return int type + * @retval #DBOX_STATUS_ERROR_INVALID_PARAMETER Invalid handle + * @retval #DBOX_STATUS_ERROR_PERMISSION_DENIED Permission denied + * @retval #DBOX_STATUS_ERROR_NONE Successfully unreference + * @pre dynamicbox_ref_buffer() must be called. + * @see dynamicbox_ref_buffer() + */ +extern int dynamicbox_unref_buffer(void *buffer); + +/** + * @internal + * @brief Synchronizes the updated buffer. + * @details This is only needed for non-H/W accelerated buffer. + * This API is only supported for primary buffer (#c DBOX_PRIMARY_BUFFER) + * @since_tizen 2.3 + * @param[in] handle Buffer handle + * @privlevel public + * @privilege %http://developer.samsung.com/tizen/privilege/dynamicbox.provider + * @feature http://developer.samsung.com/tizen/feature/samsung_extension + * @feature http://developer.samsung.com/tizen/feature/in_house/shell.appwidget + * @return int type + * @retval #DBOX_STATUS_ERROR_NONE Successfully sync'd + * @retval #DBOX_STATUS_ERROR_PERMISSION_DENIED Permission denied + * @retval #DBOX_STATUS_ERROR_INVALID_PARAMETER Invalid argument + * @see dynamicbox_acquire_buffer() + */ +extern int dynamicbox_sync_buffer(dynamicbox_buffer_h handle); + +/** + * @internal + * @brief Checks whether the dynamicbox supports H/W acceleration or not. + * This API is only supported for primary buffer (#c DBOX_PRIMARY_BUFFER) + * @since_tizen 2.3 + * @param[in] handle Buffer handle + * @return int type + * @retval 1 If the buffer handle support the H/W acceleration buffer + * @retval 0 If it doesn not supported + * @see dynamicbox_acquire_buffer() + */ +extern int dynamicbox_support_hw_buffer(dynamicbox_buffer_h handle); + +/** + * @internal + * @brief Creates the H/W accelerated buffer. + * This API is only supported for primary buffer (#c DBOX_PRIMARY_BUFFER) + * @since_tizen 2.3 + * @param[in] handle Buffer handle + * @privlevel public + * @privilege %http://developer.samsung.com/tizen/privilege/dynamicbox.provider + * @feature http://developer.samsung.com/tizen/feature/samsung_extension + * @feature http://developer.samsung.com/tizen/feature/in_house/shell.appwidget + * @return int type + * @retval #DBOX_STATUS_ERROR_ALREADY H/W buffer is already created + * @retval #DBOX_STATUS_ERROR_INVALID_PARAMETER Invalid argument + * @retval #DBOX_STATUS_ERROR_PERMISSION_DENIED Permission denied + * @retval #DBOX_STATUS_ERROR_NONE Successfully created + * @pre Must be checked whether the H/W buffer is supported or not. + * @post Must be destroyed if it is not necessary. + * @see dynamicbox_support_hw_buffer() + */ +extern int dynamicbox_create_hw_buffer(dynamicbox_buffer_h handle); + +/** + * @internal + * @brief Destroys the H/W accelerated buffer. + * This API is only supported for primary buffer (#c DBOX_PRIMARY_BUFFER) + * @since_tizen 2.3 + * @param[in] handle Buffer handle + * @privlevel public + * @privilege %http://developer.samsung.com/tizen/privilege/dynamicbox.provider + * @feature http://developer.samsung.com/tizen/feature/samsung_extension + * @feature http://developer.samsung.com/tizen/feature/in_house/shell.appwidget + * @return int type + * @retval #DBOX_STATUS_ERROR_NONE Successfully destroyed + * @retval #DBOX_STATUS_ERROR_PERMISSION_DENIED Permission denied + * @retval #DBOX_STATUS_ERROR_INVALID_PARAMETER Invalid argument + * @pre Must be created h/w buffer using dynamicbox_create_hw_buffer. + * @see dynamicbox_create_hw_buffer() + */ +extern int dynamicbox_destroy_hw_buffer(dynamicbox_buffer_h handle); + +/** + * @internal + * @brief Gets the address of the accelerated H/W buffer. + * This API is only supported for primary buffer (#c DBOX_PRIMARY_BUFFER) + * @since_tizen 2.3 + * @param[in] handle Buffer handle + * @privlevel public + * @privilege %http://developer.samsung.com/tizen/privilege/dynamicbox.provider + * @feature http://developer.samsung.com/tizen/feature/samsung_extension + * @feature http://developer.samsung.com/tizen/feature/in_house/shell.appwidget + * @return void* type + * @retval @c NULL Failed to get H/W accelerated buffer address, dynamicbox_last_status() will returns reason of failure. + * @retval addr H/W accelerated buffer address + * @see dynamicbox_create_hw_buffer() + */ +extern void *dynamicbox_buffer_hw_buffer(dynamicbox_buffer_h handle); + +/** + * @internal + * @brief Get the stride information from the buffer info + * This API is only supported for primary buffer (#c DBOX_PRIMARY_BUFFER) + * @since_tizen 2.3 + * @param[in] handle Buffer handle + * @return int stride size + * @retval positive_value length of stride + * @return #DBOX_STATUS_ERROR_INVALID_PARAMETER Invalid parameter + * @return #DBOX_STATUS_ERROR_FAULT Unrecoverable error + * @see dynamicbox_create_hw_buffer() + */ +extern int dynamicbox_buffer_stride(dynamicbox_buffer_h handle); + +/** + * @internal + * @brief Pre-processes for rendering content. + * @details This is only needed for accessing H/W accelerated buffer. + * @since_tizen 2.3 + * @param[in] handle Buffer handle + * @privlevel public + * @privilege %http://developer.samsung.com/tizen/privilege/dynamicbox.provider + * @feature http://developer.samsung.com/tizen/feature/samsung_extension + * @feature http://developer.samsung.com/tizen/feature/in_house/shell.appwidget + * @return int type + * @retval #DBOX_STATUS_ERROR_INVALID_PARAMETER Invalid handle + * @retval #DBOX_STATUS_ERROR_PERMISSION_DENIED Permission denied + * @retval #DBOX_STATUS_ERROR_NONE Successfully done + * @post dynamicbox_buffer_post_render must be called after the rendering (accessing buffer) is completed. + * @see dynamicbox_support_hw_buffer() + * @see dynamicbox_buffer_post_render() + */ +extern int dynamicbox_buffer_pre_render(dynamicbox_buffer_h handle); + +/** + * @internal + * @brief Post-processes for rendering content. + * @since_tizen 2.3 + * @param[in] handle Buffer handle + * @privlevel public + * @privilege %http://developer.samsung.com/tizen/privilege/dynamicbox.provider + * @feature http://developer.samsung.com/tizen/feature/samsung_extension + * @feature http://developer.samsung.com/tizen/feature/in_house/shell.appwidget + * @return If succes returns 0 or return less than 0 + * @retval #DBOX_STATUS_ERROR_NONE If succeed + * @retval #DBOX_STATUS_ERROR_PERMISSION_DENIED Permission denied + * @retval #DBOX_STATUS_ERROR_INVALID_PARAMETER Invalid argument + * @pre dynamicbox_buffer_pre_render must be called. + * @see dynamicbox_support_hw_buffer() + * @see dynamicbox_buffer_pre_render() + */ +extern int dynamicbox_buffer_post_render(dynamicbox_buffer_h handle); + +/** + * @internal + * @brief Sends a request to the viewer (homescreen) to close the GBar. + * @details Even though you call this function. the homescreen can ignore it. + * @since_tizen 2.3 + * @param[in] dboxid Dynamic Box Package Id + * @param[in] id Instance Id which is passed to you via the first parameter of every dynamicbox_XXXX interface functions + * @param[in] reason #DBOX_STATUS_ERROR_NONE(0) + * @privlevel public + * @privilege %http://developer.samsung.com/tizen/privilege/dynamicbox.provider + * @feature http://developer.samsung.com/tizen/feature/samsung_extension + * @feature http://developer.samsung.com/tizen/feature/in_house/shell.appwidget + * @return int type + * @retval #DBOX_STATUS_ERROR_PERMISSION_DENIED Permission denied + * @retval #DBOX_STATUS_ERROR_INVALID_PARAMETER Invalid parameters + * @retval #DBOX_STATUS_ERROR_OUT_OF_MEMORY Out of memory + * @retval #DBOX_STATUS_ERROR_FAULT Failed to send a request + * @retval #DBOX_STATUS_ERROR_NONE Successfully requested + */ +extern int dynamicbox_request_close_glance_bar(const char *dboxid, const char *id, int reason); + +/** + * @internal + * @brief Create a snapshot window + * @details + * If you want create a snapshot image of contents, create this snapshot window + * But it will not renders object asynchronously, + * So you have to render the objects immediately, the delayed rendering object will not be on the canvas + * After flush it to a file. + * @since_tizen 2.3 + * @param[in] id + * @param[in] size_type + * @return void* window + * @retval @c NULL failed to create a snapshot window, dynamicbox_last_status() will returns reason of failure. + * @retval Object window object (ex, elementary window) + * @see dynamicbox_snapshot_window_flush() + */ +extern void *dynamicbox_snapshot_window_add(const char *id, int size_type); + +/** + * @internal + * @brief Flush to a file for snapshot window + * @since_tizen 2.3 + * @param[in] snapshot_win Snapshot window + * @param[in] timeout After this, the image file will be created + * @param[in] flush_cb Right after flush an image file, this callback will be called + * @param[in] data Callback data for flush_cb + * @return int status + * @retval #DBOX_STATUS_ERROR_NONE Successfully flushed (flush timer added) + * @retval #DBOX_STATUS_ERROR_INVALID_PARAMETER Invalid paramter + * @retval #DBOX_STATUS_ERROR_FAULT Failed to create a flush timer + * @see dynamicbox_snapshot_window_add() + */ +extern int dynamicbox_snapshot_window_flush(void *snapshot_win, double timeout, dynamicbox_flush_cb flush_cb, void *data); + +/** + * @internal + * @brief Sending the updated event to the viewer + * @since_tizen 2.3 + * @param[in] handle Dynamicbox Buffer Handle + * @param[in] idx Index of a buffer + * @privlevel public + * @privilege %http://developer.samsung.com/tizen/privilege/dynamicbox.provider + * @feature http://developer.samsung.com/tizen/feature/samsung_extension + * @feature http://developer.samsung.com/tizen/feature/in_house/shell.appwidget + * @return int status + * @retval #DBOX_STATUS_ERROR_NONE Successfully sent + */ +extern int dynamicbox_send_updated_by_idx(dynamicbox_buffer_h handle, int idx); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif +/* End of a file */ diff --git a/include/util.h b/dynamicbox/include/util.h similarity index 100% rename from include/util.h rename to dynamicbox/include/util.h diff --git a/dynamicbox/patch/pixmap_ee.patch b/dynamicbox/patch/pixmap_ee.patch new file mode 100644 index 0000000..8996ccb --- /dev/null +++ b/dynamicbox/patch/pixmap_ee.patch @@ -0,0 +1,128 @@ +diff --git a/src/virtual_window.c b/src/virtual_window.c +index 1c42a7c..7a487ff 100644 +--- a/src/virtual_window.c ++++ b/src/virtual_window.c +@@ -40,9 +40,14 @@ + static struct static_info { + Ecore_Evas *(*alloc_canvas)(int w, int h, void *(*a)(void *data, int size), void (*f)(void *data, void *ptr), void *data); + Ecore_Evas *(*alloc_canvas_with_stride)(int w, int h, void *(*a)(void *data, int size, int *stride, int *bpp), void (*f)(void *data, void *ptr), void *data); ++ Ecore_Evas *(*alloc_canvas_with_pixmap)(const char *disp_name, Ecore_X_Window parent, ++ int x, int y, int w, int h, ++ Ecore_X_Pixmap (*alloc_cb)(void *data, Ecore_X_Window parent, int w, int h, int *depth), ++ void (*free_cb)(void *data, Ecore_X_Pixmap pixmap), void *data); + } s_info = { + .alloc_canvas = NULL, + .alloc_canvas_with_stride = NULL, ++ .alloc_canvas_with_pixmap = NULL, + }; + + /*! +@@ -639,12 +644,70 @@ static void ecore_evas_free_cb(Ecore_Evas *ee) + info->ee = NULL; + } + ++/** ++ * @note ++ * This callback can be called twice (or more) to get a several pixmaps ++ * Acquired pixmaps are used for double/tripple buffering for canvas ++ */ ++static Ecore_X_Pixmap alloc_pixmap_cb(void *data, Ecore_X_Window parent, int w, int h, int *depth) ++{ ++ struct info *info = data; ++ ++ if (info->ee) { ++ ecore_evas_geometry_get(info->ee, NULL, NULL, &info->w, &info->h); ++ DbgPrint("Size of ee is updated: %dx%d (info: %p)\n", info->w, info->h, info); ++ } ++ ++ /*! ++ * Acquire a buffer for canvas. ++ */ ++ info->handle = dynamicbox_acquire_buffer(info->id, info->is_gbar, ++ info->w, info->h, sizeof(int), 0, ++ event_handler_cb, info); ++ if (!info->handle) { ++ ErrPrint("Failed to get the buffer\n"); ++ return 0u; ++ } ++ ++ info->is_hw = 0; ++ return (Ecore_X_Pixmap)dynamicbox_resource_id(info->handle); ++} ++ ++static void free_pixmap_cb(void *data, Ecore_X_Pixmap pixmap) ++{ ++ struct info *info = data; ++ ++ if (!info->handle) { ++ return; ++ } ++ ++ if (info->is_hw) { ++ ErrPrint("Impossible\n"); ++ } ++ ++ dynamicbox_release_buffer(info->handle); ++ info->handle = NULL; ++ ++ if (info->deleted) { ++ free(info->id); ++ info->id = NULL; ++ ++ free(info); ++ } ++} ++ + PUBLIC Evas_Object *dynamicbox_get_evas_object(const char *id, int is_pd) + { + struct info *info; + Evas_Object *rect; ++ const char *engine; ++ ++ if (!s_info.alloc_canvas && !s_info.alloc_canvas_with_stride && !s_info.alloc_canvas_with_pixmap) { ++ s_info.alloc_canvas_with_pixmap = dlsym(RTLD_DEFAULT, "ecore_evas_gl_x11_pixmap_allocfunc_new"); ++ if (!s_info.alloc_canvas_with_pixmap) { ++ DbgPrint("pixmap_allocfunc_new is not found\n"); ++ } + +- if (!s_info.alloc_canvas && !s_info.alloc_canvas_with_stride) { + s_info.alloc_canvas_with_stride = dlsym(RTLD_DEFAULT, "ecore_evas_buffer_allocfunc_with_stride_new"); + if (!s_info.alloc_canvas_with_stride) { + DbgPrint("allocfunc_with_stirde_new is not found\n"); +@@ -655,7 +718,7 @@ PUBLIC Evas_Object *dynamicbox_get_evas_object(const char *id, int is_pd) + ErrPrint("allocfunc_new is not found\n"); + } + +- if (!s_info.alloc_canvas_with_stride && !s_info.alloc_canvas) { ++ if (!s_info.alloc_canvas_with_stride && !s_info.alloc_canvas && !s_info.alloc_canvas_with_pixmap) { + ErrPrint("No way to allocate canvas\n"); + return NULL; + } +@@ -687,10 +750,23 @@ PUBLIC Evas_Object *dynamicbox_get_evas_object(const char *id, int is_pd) + info->w = 1; + info->h = 1; + +- if (!dynamicbox_conf_auto_align() && s_info.alloc_canvas_with_stride) { +- info->ee = s_info.alloc_canvas_with_stride(1, 1, alloc_stride_fb, free_fb, info); +- } else { +- info->ee = s_info.alloc_canvas(1, 1, alloc_fb, free_fb, info); ++ engine = elm_config_preferred_engine_get(); ++ DbgPrint("Preferred engine: %s\n", engine); ++ if (engine && !strcmp(engine, "opengl_x11")) { ++ if (s_info.alloc_canvas_with_pixmap) { ++ info->ee = s_info.alloc_canvas_with_pixmap(NULL, 0u, 0, 0, 1, 1, alloc_pixmap_cb, free_pixmap_cb, info); ++ } ++ } ++ ++ if (!info->ee) { ++ /** ++ * Fallback to buffer backend ++ */ ++ if (!dynamicbox_conf_auto_align() && s_info.alloc_canvas_with_stride) { ++ info->ee = s_info.alloc_canvas_with_stride(1, 1, alloc_stride_fb, free_fb, info); ++ } else { ++ info->ee = s_info.alloc_canvas(1, 1, alloc_fb, free_fb, info); ++ } + } + + if (!info->ee) { diff --git a/dynamicbox/patch/pixmap_ee_dbox.patch b/dynamicbox/patch/pixmap_ee_dbox.patch new file mode 100644 index 0000000..93aeacb --- /dev/null +++ b/dynamicbox/patch/pixmap_ee_dbox.patch @@ -0,0 +1,125 @@ +diff --git a/src/virtual_window.c b/src/virtual_window.c +index 4f482ff..0e39eda 100644 +--- a/src/virtual_window.c ++++ b/src/virtual_window.c +@@ -41,9 +41,11 @@ + static struct static_info { + Ecore_Evas *(*alloc_canvas)(int w, int h, void *(*a)(void *data, int size), void (*f)(void *data, void *ptr), void *data); + Ecore_Evas *(*alloc_canvas_with_stride)(int w, int h, void *(*a)(void *data, int size, int *stride, int *bpp), void (*f)(void *data, void *ptr), void *data); ++ Ecore_Evas *(*alloc_canvas_with_pixmap)(const char *disp_name, Ecore_X_Window parent, int x, int y, int w, int h, Ecore_X_Pixmap (*alloc_cb)(void *data, Ecore_X_Window parent, int w, int h, int *depth), void (*free_cb)(void *data, Ecore_X_Pixmap pixmap), void *data); + } s_info = { + .alloc_canvas = NULL, + .alloc_canvas_with_stride = NULL, ++ .alloc_canvas_with_pixmap = NULL, + }; + + /** +@@ -486,6 +488,58 @@ static int event_handler_cb(struct dynamicbox_buffer *handler, struct dynamicbox + return ret; + } + ++/** ++ * @note ++ * This callback can be called twice (or more) to get a several pixmaps ++ * Acquired pixmaps are used for double/tripple buffering for canvas ++ */ ++static Ecore_X_Pixmap alloc_pixmap_cb(void *data, Ecore_X_Window parent, int w, int h, int *depth) ++{ ++ struct info *info = data; ++ ++ if (info->ee) { ++ ecore_evas_geometry_get(info->ee, NULL, NULL, &info->w, &info->h); ++ DbgPrint("Size of ee is updated: %dx%d (info: %p)\n", info->w, info->h, info); ++ } ++ ++ /*! ++ * Acquire a buffer for canvas. ++ */ ++ info->handle = dynamicbox_acquire_buffer(info->id, info->is_gbar, ++ info->w, info->h, sizeof(int), 0, ++ event_handler_cb, info); ++ if (!info->handle) { ++ ErrPrint("Failed to get the buffer\n"); ++ return 0u; ++ } ++ ++ info->is_hw = 0; ++ return (Ecore_X_Pixmap)dynamicbox_resource_id(info->handle); ++} ++ ++static void free_pixmap_cb(void *data, Ecore_X_Pixmap pixmap) ++{ ++ struct info *info = data; ++ ++ if (!info->handle) { ++ return; ++ } ++ ++ if (info->is_hw) { ++ ErrPrint("Impossible\n"); ++ } ++ ++ dynamicbox_release_buffer(info->handle); ++ info->handle = NULL; ++ ++ if (info->deleted) { ++ free(info->id); ++ info->id = NULL; ++ ++ free(info); ++ } ++} ++ + static void *alloc_fb(void *data, int size) + { + struct info *info = data; +@@ -654,8 +708,14 @@ PUBLIC void *dynamicbox_get_evas_object(const char *id, int is_gbar) + { + struct info *info; + Evas_Object *rect; ++ const char *engine; ++ ++ if (!s_info.alloc_canvas && !s_info.alloc_canvas_with_stride && !s_info.alloc_canvas_with_pixmap) { ++ s_info.alloc_canvas_with_pixmap = dlsym(RTLD_DEFAULT, "ecore_evas_gl_x11_pixmap_allocfunc_new"); ++ if (!s_info.alloc_canvas_with_pixmap) { ++ DbgPrint("pixmap_allocfunc_new is not found\n"); ++ } + +- if (!s_info.alloc_canvas && !s_info.alloc_canvas_with_stride) { + s_info.alloc_canvas_with_stride = dlsym(RTLD_DEFAULT, "ecore_evas_buffer_allocfunc_with_stride_new"); + if (!s_info.alloc_canvas_with_stride) { + DbgPrint("allocfunc_with_stirde_new is not found\n"); +@@ -666,7 +726,7 @@ PUBLIC void *dynamicbox_get_evas_object(const char *id, int is_gbar) + ErrPrint("allocfunc_new is not found\n"); + } + +- if (!s_info.alloc_canvas_with_stride && !s_info.alloc_canvas) { ++ if (!s_info.alloc_canvas_with_stride && !s_info.alloc_canvas && !s_info.alloc_canvas_with_pixmap) { + ErrPrint("No way to allocate canvas\n"); + return NULL; + } +@@ -698,10 +758,20 @@ PUBLIC void *dynamicbox_get_evas_object(const char *id, int is_gbar) + info->w = 1; + info->h = 1; + +- if (!dynamicbox_conf_auto_align() && s_info.alloc_canvas_with_stride) { +- info->ee = s_info.alloc_canvas_with_stride(1, 1, alloc_stride_fb, free_fb, info); +- } else if (s_info.alloc_canvas) { +- info->ee = s_info.alloc_canvas(1, 1, alloc_fb, free_fb, info); ++ engine = elm_config_preferred_engine_get(); ++ DbgPrint("Preferred engine: %s\n", engine); ++ if (engine && !strcmp(engine, "opengl_x11")) { ++ if (s_info.alloc_canvas_with_pixmap) { ++ info->ee = s_info.alloc_canvas_with_pixmap(NULL, 0u, 0, 0, 1, 1, alloc_pixmap_cb, free_pixmap_cb, info); ++ } ++ } ++ ++ if (!info->ee) { ++ if (!dynamicbox_conf_auto_align() && s_info.alloc_canvas_with_stride) { ++ info->ee = s_info.alloc_canvas_with_stride(1, 1, alloc_stride_fb, free_fb, info); ++ } else if (s_info.alloc_canvas) { ++ info->ee = s_info.alloc_canvas(1, 1, alloc_fb, free_fb, info); ++ } + } + + if (!info->ee) { diff --git a/dynamicbox/src/dlist.c b/dynamicbox/src/dlist.c new file mode 100644 index 0000000..cb3aa39 --- /dev/null +++ b/dynamicbox/src/dlist.c @@ -0,0 +1,160 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include + +#include "dlist.h" + +struct dlist { + struct dlist *next; + struct dlist *prev; + void *data; +}; + +struct dlist *dlist_append(struct dlist *list, void *data) +{ + struct dlist *item; + + item = malloc(sizeof(*item)); + if (!item) { + return NULL; + } + + item->next = NULL; + item->data = data; + + if (!list) { + item->prev = item; + + list = item; + } else { + item->prev = list->prev; + item->prev->next = item; + + list->prev = item; + } + + assert(!list->prev->next && "item NEXT"); + + return list; +} + +struct dlist *dlist_prepend(struct dlist *list, void *data) +{ + struct dlist *item; + + item = malloc(sizeof(*item)); + if (!item) { + return NULL; + } + + if (!list) { + item->prev = item; + item->next = NULL; + } else { + item->prev = list->prev; + list->prev = item; + item->next = list; + } + + return item; +} + +struct dlist *dlist_remove(struct dlist *list, struct dlist *l) +{ + if (!list || !l) { + return NULL; + } + + if (l == list) { + l->prev = list->prev; + list = l->next; + } else { + l->prev->next = l->next; + } + + if (l->next) { + l->next->prev = l->prev; + } + + free(l); + return list; +} + +struct dlist *dlist_find_data(struct dlist *list, void *data) +{ + struct dlist *l; + void *_data; + + dlist_foreach(list, l, _data) { + if (data == _data) { + return l; + } + } + + return NULL; +} + +void *dlist_data(struct dlist *l) +{ + return l ? l->data : NULL; +} + +struct dlist *dlist_next(struct dlist *l) +{ + return l ? l->next : NULL; +} + +struct dlist *dlist_prev(struct dlist *l) +{ + return l ? l->prev : NULL; +} + +int dlist_count(struct dlist *l) +{ + register int i; + struct dlist *n; + void *data; + + i = 0; + dlist_foreach(l, n, data) { + i++; + } + + return i; +} + +struct dlist *dlist_nth(struct dlist *l, int nth) +{ + register int i; + struct dlist *n; + void *data; + + i = 0; + dlist_foreach(l, n, data) { + if (i == nth) { + return l; + } + + i++; + } + + return NULL; +} + +/* End of a file */ diff --git a/dynamicbox/src/dynamicbox.c b/dynamicbox/src/dynamicbox.c new file mode 100644 index 0000000..3bb52af --- /dev/null +++ b/dynamicbox/src/dynamicbox.c @@ -0,0 +1,1367 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include /* malloc */ +#include /* strdup */ +#include +#include /* access */ +#define __USE_GNU +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "debug.h" +#include "dlist.h" +#include "util.h" +#include "dynamicbox.h" +#include "internal/dynamicbox.h" + +#define PUBLIC __attribute__((visibility("default"))) + +#define FILE_SCHEMA "file://" + +/** + * @note + * This value is configurable value. + */ +#define FRAME_WAIT_INTERVAL (1.0f/6.0f) + +struct block { + unsigned int idx; + + char *type; + char *part; + char *data; + char *option; + char *id; + char *file; + char *target_id; +}; + +struct dynamicbox_desc { + FILE *fp; + int for_pd; + + unsigned int last_idx; + + struct dlist *block_list; +}; + +struct dynamicbox_buffer_data { + int is_gbar; + int accelerated; + + /* for Buffer event wrapper */ + int (*handler)(dynamicbox_buffer_h , dynamicbox_buffer_event_data_t, void *); + void *cbdata; + + char *content; + char *title; + char *icon; + char *name; + + Ecore_Timer *frame_wait_timer; +}; + +/** + * @brief These functions are defined in the data-provider-slave + */ +static struct info { + const char *(*find_pkgname)(const char *filename); + int (*request_update_by_id)(const char *uri); + int (*trigger_update_monitor)(const char *id, int is_gbar); + int (*update_extra_info)(const char *id, const char *content, const char *title, const char *icon, const char *name); + + enum load_type { + LOAD_TYPE_UNKNOWN = -1, + LOAD_TYPE_SLAVE = 0, + LOAD_TYPE_APP = 1 + } type; + + union _updated { + struct _slave { + int (*send)(const char *pkgname, const char *id, dynamicbox_buffer_h handle, int idx, int x, int y, int w, int h, int gbar, const char *descfile); + } slave; + + struct _app { + int (*send)(dynamicbox_buffer_h handle, int idx, int x, int y, int w, int h, int gbar); + } app; + } updated; +} s_info = { + .find_pkgname = NULL, + .request_update_by_id = NULL, + .trigger_update_monitor = NULL, + .update_extra_info = NULL, + .type = LOAD_TYPE_UNKNOWN, /* Not initialized */ +}; + +#define FUNC_PREFIX "dynamicbox_" +#define FUNC_DYNAMICBOX_SEND_UPDATED FUNC_PREFIX "send_buffer_updated" +#define FUNC_DYNAMICBOX_PROVIDER_APP_UPDATED FUNC_PREFIX "provider_app_buffer_updated" +#define FUNC_DYNAMICBOX_FIND_PKGNAME FUNC_PREFIX "find_pkgname" +#define FUNC_DYNAMICBOX_REQUEST_UPDATE_BY_ID FUNC_PREFIX "request_update_by_id" +#define FUNC_DYNAMICBOX_TRIGGER_UPDATE_MONITOR FUNC_PREFIX "trigger_update_monitor" +#define FUNC_DYNAMICBOX_UPDATE_EXTRA_INFO FUNC_PREFIX "update_extra_info" + +static inline void load_update_function(void) +{ + /* Must to be checked the slave function first. */ + s_info.updated.slave.send = dlsym(RTLD_DEFAULT, FUNC_DYNAMICBOX_SEND_UPDATED); + if (s_info.updated.slave.send) { + s_info.type = LOAD_TYPE_SLAVE; + DbgPrint("Slave detected\n"); + } else { + s_info.updated.app.send = dlsym(RTLD_DEFAULT, FUNC_DYNAMICBOX_PROVIDER_APP_UPDATED); + if (s_info.updated.app.send) { + s_info.type = LOAD_TYPE_APP; + DbgPrint("App detected\n"); + } + } +} + +static int send_updated(const char *pkgname, const char *id, dynamicbox_buffer_h handle, int idx, int x, int y, int w, int h, int gbar, const char *descfile) +{ + int ret = DBOX_STATUS_ERROR_INVALID_PARAMETER; + + if (s_info.type == LOAD_TYPE_UNKNOWN) { + load_update_function(); + } + + if (s_info.type == LOAD_TYPE_APP) { + ret = s_info.updated.app.send(handle, idx, x, y, w, h, gbar); + } else if (s_info.type == LOAD_TYPE_SLAVE) { + /** + * pkgname, id are used for finding handle of direct connection. + */ + ret = s_info.updated.slave.send(pkgname, id, handle, idx, x, y, w, h, gbar, descfile); + } else { + dynamicbox_damage_region_t region = { + .x = x, + .y = y, + .w = w, + .h = h, + }; + ret = dynamicbox_provider_send_buffer_updated(handle, idx, ®ion, gbar, descfile); + } + + return ret; +} + +static char *id_to_uri(const char *id) +{ + char *uri; + int uri_len; + + uri_len = strlen(id) + strlen(FILE_SCHEMA) + 1; + + uri = malloc(uri_len); + if (!uri) { + return NULL; + } + + snprintf(uri, uri_len, FILE_SCHEMA "%s", id); + return uri; +} + +static inline int event_handler_wrapper(dynamicbox_buffer_h buffer, dynamicbox_buffer_event_data_t event_info, void *data) +{ + const char *pkgname; + const char *id; + struct dynamicbox_buffer_data *cbdata = data; + int ret; + + pkgname = dynamicbox_provider_buffer_pkgname(buffer); + if (!pkgname) { + ErrPrint("pkgname is not valid\n"); + return DBOX_STATUS_ERROR_INVALID_PARAMETER; + } + + id = dynamicbox_provider_buffer_id(buffer); + if (!id) { + ErrPrint("id is not valid[%s]\n", pkgname); + return DBOX_STATUS_ERROR_INVALID_PARAMETER; + } + + if (cbdata->handler) { + ret = cbdata->handler(buffer, event_info, cbdata->cbdata); + } else { + ret = DBOX_STATUS_ERROR_FAULT; + } + + switch (event_info->type) { + case DBOX_BUFFER_EVENT_ACCESS_HIGHLIGHT: + case DBOX_BUFFER_EVENT_ACCESS_HIGHLIGHT_NEXT: + case DBOX_BUFFER_EVENT_ACCESS_HIGHLIGHT_PREV: + case DBOX_BUFFER_EVENT_ACCESS_ACTIVATE: + case DBOX_BUFFER_EVENT_ACCESS_ACTION_UP: + case DBOX_BUFFER_EVENT_ACCESS_ACTION_DOWN: + case DBOX_BUFFER_EVENT_ACCESS_SCROLL_UP: + case DBOX_BUFFER_EVENT_ACCESS_SCROLL_MOVE: + case DBOX_BUFFER_EVENT_ACCESS_SCROLL_DOWN: + case DBOX_BUFFER_EVENT_ACCESS_UNHIGHLIGHT: + case DBOX_BUFFER_EVENT_ACCESS_VALUE_CHANGE: + case DBOX_BUFFER_EVENT_ACCESS_MOUSE: + case DBOX_BUFFER_EVENT_ACCESS_BACK: + case DBOX_BUFFER_EVENT_ACCESS_OVER: + case DBOX_BUFFER_EVENT_ACCESS_READ: + case DBOX_BUFFER_EVENT_ACCESS_ENABLE: + case DBOX_BUFFER_EVENT_ACCESS_DISABLE: + DbgPrint("Accessibility event: %d\n", event_info->type); + if (ret < 0) { + (void)dynamicbox_provider_send_access_status(pkgname, id, DBOX_ACCESS_STATUS_ERROR); + } else { + (void)dynamicbox_provider_send_access_status(pkgname, id, ret); + } + break; + case DBOX_BUFFER_EVENT_KEY_UP: + case DBOX_BUFFER_EVENT_KEY_DOWN: + case DBOX_BUFFER_EVENT_KEY_FOCUS_IN: + case DBOX_BUFFER_EVENT_KEY_FOCUS_OUT: + DbgPrint("Key event: %d\n", event_info->type); + if (ret < 0) { + (void)dynamicbox_provider_send_key_status(pkgname, id, DBOX_KEY_STATUS_ERROR); + } else { + (void)dynamicbox_provider_send_key_status(pkgname, id, ret); + } + break; + default: + break; + } + + return ret; +} + +static inline int default_event_handler(dynamicbox_buffer_h buffer, dynamicbox_buffer_event_data_t event_info, void *data) +{ + /* NOP */ + return 0; +} + +PUBLIC const int DBOX_DONE = 0x00; +PUBLIC const int DBOX_OUTPUT_UPDATED = 0x02; +PUBLIC const int DBOX_USE_NET = 0x04; + +PUBLIC const int DBOX_NEED_TO_SCHEDULE = 0x01; +PUBLIC const int DBOX_NEED_TO_CREATE = 0x01; +PUBLIC const int DBOX_NEED_TO_DESTROY = 0x01; +PUBLIC const int DBOX_FORCE_TO_SCHEDULE = 0x08; + +PUBLIC const int DBOX_SYS_EVENT_FONT_CHANGED = 0x01; +PUBLIC const int DBOX_SYS_EVENT_LANG_CHANGED = 0x02; +PUBLIC const int DBOX_SYS_EVENT_TIME_CHANGED = 0x04; +PUBLIC const int DBOX_SYS_EVENT_REGION_CHANGED = 0x08; +PUBLIC const int DBOX_SYS_EVENT_TTS_CHANGED = 0x10; +PUBLIC const int DBOX_SYS_EVENT_PAUSED = 0x0100; +PUBLIC const int DBOX_SYS_EVENT_RESUMED = 0x0200; +PUBLIC const int DBOX_SYS_EVENT_MMC_STATUS_CHANGED = 0x0400; +PUBLIC const int DBOX_SYS_EVENT_DELETED = 0x0800; + +PUBLIC struct dynamicbox_desc *dynamicbox_desc_open(const char *filename, int for_pd) +{ + struct dynamicbox_desc *handle; + char *new_fname; + + handle = calloc(1, sizeof(*handle)); + if (!handle) { + ErrPrint("Error: %s\n", strerror(errno)); + return NULL; + } + + if (for_pd) { + int len; + len = strlen(filename) + strlen(".desc") + 1; + new_fname = malloc(len); + if (!new_fname) { + ErrPrint("Error: %s\n", strerror(errno)); + free(handle); + return NULL; + } + snprintf(new_fname, len, "%s.desc", filename); + } else { + new_fname = strdup(filename); + if (!new_fname) { + ErrPrint("Error: %s\n", strerror(errno)); + free(handle); + return NULL; + } + } + + DbgPrint("Open a file %s with merge mode %s\n", + new_fname, + access(new_fname, F_OK) == 0 ? "enabled" : "disabled"); + + handle->fp = fopen(new_fname, "at"); + free(new_fname); + if (!handle->fp) { + ErrPrint("Failed to open a file: %s\n", strerror(errno)); + free(handle); + return NULL; + } + + return handle; +} + +PUBLIC int dynamicbox_desc_close(struct dynamicbox_desc *handle) +{ + struct dlist *l; + struct dlist *n; + struct block *block; + + if (!handle) { + return DBOX_STATUS_ERROR_INVALID_PARAMETER; + } + + dlist_foreach_safe(handle->block_list, l, n, block) { + handle->block_list = dlist_remove(handle->block_list, l); + + fprintf(handle->fp, "{\n"); + if (block->type) { + fprintf(handle->fp, "type=%s\n", block->type); + } + + if (block->part) { + fprintf(handle->fp, "part=%s\n", block->part); + } + + if (block->data) { + fprintf(handle->fp, "data=%s\n", block->data); + } + + if (block->option) { + fprintf(handle->fp, "option=%s\n", block->option); + } + + if (block->id) { + fprintf(handle->fp, "id=%s\n", block->id); + } + + if (block->target_id) { + fprintf(handle->fp, "target=%s\n", block->target_id); + } + fprintf(handle->fp, "}\n"); + + free(block->type); + free(block->part); + free(block->data); + free(block->option); + free(block->id); + free(block->target_id); + free(block); + } + + if (fclose(handle->fp) != 0) { + ErrPrint("fclose: %s\n", strerror(errno)); + } + free(handle); + return DBOX_STATUS_ERROR_NONE; +} + +PUBLIC int dynamicbox_desc_set_category(struct dynamicbox_desc *handle, const char *id, const char *category) +{ + struct block *block; + + if (!handle || !category) { + return DBOX_STATUS_ERROR_INVALID_PARAMETER; + } + + block = calloc(1, sizeof(*block)); + if (!block) { + return DBOX_STATUS_ERROR_OUT_OF_MEMORY; + } + + block->type = strdup(DBOX_DESC_TYPE_INFO); + if (!block->type) { + free(block); + return DBOX_STATUS_ERROR_OUT_OF_MEMORY; + } + + block->part = strdup("category"); + if (!block->part) { + free(block->type); + free(block); + return DBOX_STATUS_ERROR_OUT_OF_MEMORY; + } + + block->data = strdup(category); + if (!block->data) { + free(block->type); + free(block->part); + free(block); + return DBOX_STATUS_ERROR_OUT_OF_MEMORY; + } + + if (id) { + block->id = strdup(id); + if (!block->id) { + free(block->data); + free(block->type); + free(block->part); + free(block); + return DBOX_STATUS_ERROR_OUT_OF_MEMORY; + } + } + + block->idx = handle->last_idx++; + handle->block_list = dlist_append(handle->block_list, block); + return block->idx; +} + +PUBLIC int dynamicbox_desc_set_size(struct dynamicbox_desc *handle, const char *id, int w, int h) +{ + struct block *block; + char buffer[BUFSIZ]; + + if (!handle) { + return DBOX_STATUS_ERROR_INVALID_PARAMETER; + } + + block = calloc(1, sizeof(*block)); + if (!block) { + return DBOX_STATUS_ERROR_OUT_OF_MEMORY; + } + + block->type = strdup(DBOX_DESC_TYPE_INFO); + if (!block->type) { + free(block); + return DBOX_STATUS_ERROR_OUT_OF_MEMORY; + } + + block->part = strdup("size"); + if (!block->part) { + free(block->type); + free(block); + return DBOX_STATUS_ERROR_OUT_OF_MEMORY; + } + + if (id) { + block->id = strdup(id); + if (!block->id) { + free(block->part); + free(block->type); + free(block); + return DBOX_STATUS_ERROR_OUT_OF_MEMORY; + } + } + + snprintf(buffer, sizeof(buffer), "%dx%d", w, h); + block->data = strdup(buffer); + if (!block->data) { + free(block->id); + free(block->part); + free(block->type); + free(block); + return DBOX_STATUS_ERROR_OUT_OF_MEMORY; + } + + block->idx = handle->last_idx++; + handle->block_list = dlist_append(handle->block_list, block); + return block->idx; +} + +PUBLIC int dynamicbox_desc_set_id(struct dynamicbox_desc *handle, int idx, const char *id) +{ + struct dlist *l; + struct block *block; + + dlist_foreach(handle->block_list, l, block) { + if (block->idx == idx) { + if (strcasecmp(block->type, DBOX_DESC_TYPE_SCRIPT)) { + ErrPrint("Invalid block is used\n"); + return DBOX_STATUS_ERROR_INVALID_PARAMETER; + } + + free(block->target_id); + block->target_id = NULL; + + if (!id || !strlen(id)) { + return DBOX_STATUS_ERROR_NONE; + } + + block->target_id = strdup(id); + if (!block->target_id) { + ErrPrint("Heap: %s\n", strerror(errno)); + return DBOX_STATUS_ERROR_OUT_OF_MEMORY; + } + + return DBOX_STATUS_ERROR_NONE; + } + } + + return DBOX_STATUS_ERROR_NOT_EXIST; +} + +/*! + * \return idx + */ +PUBLIC int dynamicbox_desc_add_block(struct dynamicbox_desc *handle, const char *id, const char *type, const char *part, const char *data, const char *option) +{ + struct block *block; + + if (!handle || !type) { + return DBOX_STATUS_ERROR_INVALID_PARAMETER; + } + + if (!part) { + part = ""; + } + + if (!data) { + data = ""; + } + + block = calloc(1, sizeof(*block)); + if (!block) { + ErrPrint("Heap: %s\n", strerror(errno)); + return DBOX_STATUS_ERROR_OUT_OF_MEMORY; + } + + block->type = strdup(type); + if (!block->type) { + ErrPrint("Heap: %s\n", strerror(errno)); + free(block); + return DBOX_STATUS_ERROR_OUT_OF_MEMORY; + } + + block->part = strdup(part); + if (!block->part) { + ErrPrint("Heap: %s\n", strerror(errno)); + free(block->type); + free(block); + return DBOX_STATUS_ERROR_OUT_OF_MEMORY; + } + + block->data = strdup(data); + if (!block->data) { + ErrPrint("Heap: %s\n", strerror(errno)); + free(block->type); + free(block->part); + free(block); + return DBOX_STATUS_ERROR_OUT_OF_MEMORY; + } + + if (option) { + block->option = strdup(option); + if (!block->option) { + ErrPrint("Heap: %s\n", strerror(errno)); + free(block->data); + free(block->type); + free(block->part); + free(block); + return DBOX_STATUS_ERROR_OUT_OF_MEMORY; + } + } + + if (id) { + block->id = strdup(id); + if (!block->id) { + ErrPrint("Heap: %s\n", strerror(errno)); + free(block->option); + free(block->data); + free(block->type); + free(block->part); + free(block); + return DBOX_STATUS_ERROR_OUT_OF_MEMORY; + } + } + + block->idx = handle->last_idx++; + handle->block_list = dlist_append(handle->block_list, block); + return block->idx; +} + +PUBLIC int dynamicbox_desc_del_block(struct dynamicbox_desc *handle, int idx) +{ + struct dlist *l; + struct block *block; + + if (!handle || idx < 0) { + return DBOX_STATUS_ERROR_INVALID_PARAMETER; + } + + dlist_foreach(handle->block_list, l, block) { + if (block->idx == idx) { + handle->block_list = dlist_remove(handle->block_list, l); + free(block->type); + free(block->part); + free(block->data); + free(block->option); + free(block->id); + free(block->target_id); + free(block); + return DBOX_STATUS_ERROR_NONE; + } + } + + return DBOX_STATUS_ERROR_NOT_EXIST; +} + +PUBLIC int dynamicbox_acquire_buffer(dynamicbox_buffer_h handle, int idx, int width, int height, int pixel_size) +{ + int ret; + + if (!handle || width <= 0 || height <= 0 || pixel_size <= 0 || idx > DYNAMICBOX_CONF_EXTRA_BUFFER_COUNT) { + return DBOX_STATUS_ERROR_INVALID_PARAMETER; + } + + if (idx >= 0) { + int _width = 0; + int _height = 0; + int _pixel_size = 0; + /* To validate the buffer */ + if (dynamicbox_provider_buffer_get_size(handle, &_width, &_height, &_pixel_size) < 0) { + ErrPrint("Failed to get buffer size\n"); + } + + if (_width != width || _height != height || pixel_size != _pixel_size) { + DbgPrint("Extra buffer's geometry is not matched with primary one\n"); + } + + ret = dynamicbox_provider_buffer_extra_acquire(handle, idx, width, height, pixel_size); + } else { + ret = dynamicbox_provider_buffer_acquire(handle, width, height, pixel_size); + } + + return ret; +} + +PUBLIC dynamicbox_buffer_h dynamicbox_create_buffer(const char *filename, int is_gbar, int auto_align, int (*handler)(dynamicbox_buffer_h , dynamicbox_buffer_event_data_t, void *), void *data) +{ + struct dynamicbox_buffer_data *user_data; + const char *pkgname; + dynamicbox_buffer_h handle; + char *uri; + + if (!filename) { + ErrPrint("Invalid argument: %p(%dx%d)\n", filename); + return NULL; + } + + user_data = calloc(1, sizeof(*user_data)); + if (!user_data) { + ErrPrint("Heap: %s\n", strerror(errno)); + return NULL; + } + + user_data->is_gbar = is_gbar; + user_data->handler = handler ? handler : default_event_handler; + user_data->cbdata = data; + + uri = id_to_uri(filename); + if (!uri) { + ErrPrint("Heap: %s\n", strerror(errno)); + free(user_data); + return NULL; + } + + if (!s_info.find_pkgname) { + s_info.find_pkgname = dlsym(RTLD_DEFAULT, FUNC_DYNAMICBOX_FIND_PKGNAME); + if (!s_info.find_pkgname) { + ErrPrint("Failed to find a \"dynamicbox_find_pkgname\"\n"); + free(user_data); + free(uri); + return NULL; + } + } + + pkgname = s_info.find_pkgname(uri); + if (!pkgname) { + ErrPrint("Invalid Request\n"); + free(user_data); + free(uri); + return NULL; + } + + handle = dynamicbox_provider_buffer_create((!!is_gbar) ? DBOX_TYPE_GBAR : DBOX_TYPE_DBOX, pkgname, uri, auto_align, event_handler_wrapper, user_data); + free(uri); + if (!handle) { + free(user_data); + return NULL; + } + + (void)dynamicbox_provider_buffer_set_user_data(handle, user_data); + return handle; +} + +PUBLIC int dynamicbox_request_update(const char *filename) +{ + char *uri; + int ret; + + if (!filename) { + ErrPrint("Invalid argument\n"); + return DBOX_STATUS_ERROR_INVALID_PARAMETER; + } + + uri = id_to_uri(filename); + if (!uri) { + ErrPrint("Heap: %s\n", strerror(errno)); + return DBOX_STATUS_ERROR_OUT_OF_MEMORY; + } + + if (!s_info.request_update_by_id) { + s_info.request_update_by_id = dlsym(RTLD_DEFAULT, FUNC_DYNAMICBOX_REQUEST_UPDATE_BY_ID); + if (!s_info.request_update_by_id) { + ErrPrint("\"dynamicbox_request_update_by_id\" is not exists\n"); + free(uri); + return DBOX_STATUS_ERROR_FAULT; + } + } + + ret = s_info.request_update_by_id(uri); + free(uri); + return ret; +} + +PUBLIC unsigned int dynamicbox_resource_id(dynamicbox_buffer_h handle, int idx) +{ + int ret; + + if (!handle || idx > DYNAMICBOX_CONF_EXTRA_BUFFER_COUNT) { + return DBOX_STATUS_ERROR_INVALID_PARAMETER; + } + + if (idx >= 0) { + ret = dynamicbox_provider_buffer_extra_resource_id(handle, idx); + } else { + ret = dynamicbox_provider_buffer_resource_id(handle); + } + + return ret; +} + +PUBLIC int dynamicbox_release_buffer(dynamicbox_buffer_h handle, int idx) +{ + int ret; + + if (!handle || idx > DYNAMICBOX_CONF_EXTRA_BUFFER_COUNT) { + return DBOX_STATUS_ERROR_INVALID_PARAMETER; + } + + if (idx >= 0) { + ret = dynamicbox_provider_buffer_extra_release(handle, idx); + } else { + ret = dynamicbox_provider_buffer_release(handle); + } + + DbgPrint("Release buffer: %d (%d)\n", idx, ret); + return ret; +} + +PUBLIC int dynamicbox_destroy_buffer(dynamicbox_buffer_h handle) +{ + struct dynamicbox_buffer_data *user_data; + + if (!handle) { + return DBOX_STATUS_ERROR_INVALID_PARAMETER; + } + + user_data = dynamicbox_provider_buffer_user_data(handle); + if (user_data) { + if (user_data->frame_wait_timer) { + ecore_timer_del(user_data->frame_wait_timer); + user_data->frame_wait_timer = NULL; + } + free(user_data->content); + free(user_data->title); + free(user_data->icon); + free(user_data->name); + free(user_data); + dynamicbox_provider_buffer_set_user_data(handle, NULL); + } + + DbgPrint("Destroy buffer\n"); + return dynamicbox_provider_buffer_destroy(handle); +} + +PUBLIC void *dynamicbox_ref_buffer(dynamicbox_buffer_h handle) +{ + struct dynamicbox_buffer_data *user_data; + void *data; + int w, h, size; + int ret; + + if (!handle) { + return NULL; + } + + user_data = dynamicbox_provider_buffer_user_data(handle); + if (!user_data) { + return NULL; + } + + if (user_data->accelerated) { + DbgPrint("H/W accelerated buffer is allocated\n"); + return NULL; + } + + ret = dynamicbox_provider_buffer_get_size(handle, &w, &h, &size); + + data = dynamicbox_provider_buffer_ref(handle); + if (data && !ret && w > 0 && h > 0 && size > 0) { + memset(data, 0, w * h * size); + (void)dynamicbox_provider_buffer_sync(handle); + } + + DbgPrint("Ref buffer %ds%d(%d)\n", w, h, size); + return data; +} + +PUBLIC int dynamicbox_unref_buffer(void *buffer) +{ + if (!buffer) { + return DBOX_STATUS_ERROR_INVALID_PARAMETER; + } + + DbgPrint("Unref buffer\n"); + return dynamicbox_provider_buffer_unref(buffer); +} + +PUBLIC int dynamicbox_sync_buffer(dynamicbox_buffer_h handle) +{ + struct dynamicbox_buffer_data *user_data; + const char *pkgname; + const char *id; + int w; + int h; + int pixel_size; + int ret; + + if (!handle) { + return DBOX_STATUS_ERROR_INVALID_PARAMETER; + } + + user_data = dynamicbox_provider_buffer_user_data(handle); + if (!user_data) { + ErrPrint("Invalid buffer\n"); + return DBOX_STATUS_ERROR_INVALID_PARAMETER; + } + + if (user_data->accelerated) { + DbgPrint("H/W Buffer allocated. skip the sync buffer\n"); + return DBOX_STATUS_ERROR_NONE; + } + + pkgname = dynamicbox_provider_buffer_pkgname(handle); + if (!pkgname) { + ErrPrint("Invalid buffer handler\n"); + return DBOX_STATUS_ERROR_INVALID_PARAMETER; + } + + id = dynamicbox_provider_buffer_id(handle); + if (!id) { + ErrPrint("Invalid buffer handler\n"); + return DBOX_STATUS_ERROR_INVALID_PARAMETER; + } + + (void)dynamicbox_provider_buffer_sync(handle); + + if (dynamicbox_provider_buffer_get_size(handle, &w, &h, &pixel_size) < 0) { + ErrPrint("Failed to get size (%s)\n", id); + } + + /** + * @todo + * manipulate the damaged region, so send update event only for the damaged region. + * to make more efficient updates + */ + ret = send_updated(pkgname, id, handle, DBOX_PRIMARY_BUFFER, 0, 0, w, h, user_data->is_gbar, NULL); + if (ret < 0) { + ErrPrint("Failed to send%supdated (%s)\n", user_data->is_gbar ? " GBAR " : " ", id); + } + + return ret; +} + +PUBLIC int dynamicbox_send_updated_by_idx(dynamicbox_buffer_h handle, int idx) +{ + struct dynamicbox_buffer_data *user_data; + const char *pkgname; + const char *id; + int w; + int h; + int pixel_size; + int ret; + + user_data = dynamicbox_provider_buffer_user_data(handle); + if (!user_data) { + ErrPrint("Invalid buffer\n"); + return DBOX_STATUS_ERROR_INVALID_PARAMETER; + } + + pkgname = dynamicbox_provider_buffer_pkgname(handle); + if (!pkgname) { + ErrPrint("Invalid buffer handler\n"); + return DBOX_STATUS_ERROR_INVALID_PARAMETER; + } + + id = dynamicbox_provider_buffer_id(handle); + if (!id) { + ErrPrint("Invalid buffer handler\n"); + return DBOX_STATUS_ERROR_INVALID_PARAMETER; + } + + if (dynamicbox_provider_buffer_get_size(handle, &w, &h, &pixel_size) < 0) { + ErrPrint("Failed to get size (%s)\n", id); + } + + ret = send_updated(pkgname, id, handle, idx, 0, 0, w, h, user_data->is_gbar, NULL); + if (ret < 0) { + ErrPrint("Failed to send%supdated (%s) %d\n", user_data->is_gbar ? " GBAR " : " ", id, idx); + } + + return ret; +} + +PUBLIC int dynamicbox_support_hw_buffer(dynamicbox_buffer_h handle) +{ + if (!handle) { + return DBOX_STATUS_ERROR_INVALID_PARAMETER; + } + + return dynamicbox_provider_buffer_is_support_hw(handle); +} + +PUBLIC int dynamicbox_create_hw_buffer(dynamicbox_buffer_h handle) +{ + struct dynamicbox_buffer_data *user_data; + int ret; + + if (!handle) { + return DBOX_STATUS_ERROR_INVALID_PARAMETER; + } + + user_data = dynamicbox_provider_buffer_user_data(handle); + if (!user_data) { + return DBOX_STATUS_ERROR_INVALID_PARAMETER; + } + + if (user_data->accelerated) { + return DBOX_STATUS_ERROR_ALREADY; + } + + ret = dynamicbox_provider_buffer_create_hw(handle); + user_data->accelerated = (ret == 0); + return ret; +} + +PUBLIC int dynamicbox_destroy_hw_buffer(dynamicbox_buffer_h handle) +{ + struct dynamicbox_buffer_data *user_data; + + if (!handle) { + LOGD("handle is NULL\n"); + return DBOX_STATUS_ERROR_INVALID_PARAMETER; + } + + user_data = dynamicbox_provider_buffer_user_data(handle); + if (!user_data || !user_data->accelerated) { + LOGD("user_data is NULL\n"); + return DBOX_STATUS_ERROR_INVALID_PARAMETER; + } + + user_data->accelerated = 0; + + return dynamicbox_provider_buffer_destroy_hw(handle); +} + +PUBLIC void *dynamicbox_buffer_hw_buffer(dynamicbox_buffer_h handle) +{ + struct dynamicbox_buffer_data *user_data; + + if (!handle) { + return NULL; + } + + user_data = dynamicbox_provider_buffer_user_data(handle); + if (!user_data || !user_data->accelerated) { + return NULL; + } + + return dynamicbox_provider_buffer_hw_addr(handle); +} + +PUBLIC int dynamicbox_buffer_pre_render(dynamicbox_buffer_h handle) +{ + struct dynamicbox_buffer_data *user_data; + + if (!handle) { + return DBOX_STATUS_ERROR_INVALID_PARAMETER; + } + + user_data = dynamicbox_provider_buffer_user_data(handle); + if (!user_data) { + return DBOX_STATUS_ERROR_INVALID_PARAMETER; + } + + if (!user_data->accelerated) { + return DBOX_STATUS_ERROR_NONE; + } + + /*! + * \note + * Do preprocessing for accessing the H/W render buffer + */ + return dynamicbox_provider_buffer_pre_render(handle); +} + +static Eina_Bool frame_wait_cb(void *data) +{ + dynamicbox_buffer_h handle = data; + struct dynamicbox_buffer_data *user_data; + const char *pkgname; + const char *id; + int pixel_size; + int ret; + int w; + int h; + + user_data = dynamicbox_provider_buffer_user_data(handle); + if (!user_data) { + ErrPrint("Failed to get a user data\n"); + return ECORE_CALLBACK_CANCEL; + } + + pkgname = dynamicbox_provider_buffer_pkgname(handle); + id = dynamicbox_provider_buffer_id(handle); + + if (!pkgname || !id) { + ErrPrint("Failed to get instance information (%s), (%s)\n", pkgname, id); + user_data->frame_wait_timer = NULL; + return ECORE_CALLBACK_CANCEL; + } + + if (dynamicbox_provider_buffer_get_size(handle, &w, &h, &pixel_size) < 0) { + ErrPrint("Failed to get size (%s)\n", id); + w = 0; + h = 0; + pixel_size = sizeof(int); + } + + DbgPrint("Frame skip waiting timer is fired (%s)\n", id); + + /** + * @todo + * manipulate the damaged region, so send update event only for the damaged region. + * to make more efficient updates + */ + ret = send_updated(pkgname, id, handle, DBOX_PRIMARY_BUFFER, 0, 0, w, h, user_data->is_gbar, NULL); + if (ret < 0) { + ErrPrint("Failed to send%supdated (%s)\n", user_data->is_gbar ? " GBAR " : " ", id); + } + + (void)dynamicbox_provider_buffer_clear_frame_skip(handle); + + user_data->frame_wait_timer = NULL; + return ECORE_CALLBACK_CANCEL; +} + +PUBLIC int dynamicbox_buffer_post_render(dynamicbox_buffer_h handle) +{ + int ret; + const char *pkgname; + const char *id; + struct dynamicbox_buffer_data *user_data; + int w; + int h; + int pixel_size; + PERF_INIT(); + PERF_BEGIN(); + + if (!handle) { + PERF_MARK("post_render"); + return DBOX_STATUS_ERROR_INVALID_PARAMETER; + } + + user_data = dynamicbox_provider_buffer_user_data(handle); + if (!user_data) { + PERF_MARK("post_render"); + return DBOX_STATUS_ERROR_INVALID_PARAMETER; + } + + if (!user_data->accelerated) { + PERF_MARK("post_render"); + return DBOX_STATUS_ERROR_NONE; + } + + pkgname = dynamicbox_provider_buffer_pkgname(handle); + if (!pkgname) { + ErrPrint("Invalid buffer handle\n"); + PERF_MARK("post_render"); + return DBOX_STATUS_ERROR_INVALID_PARAMETER; + } + + id = dynamicbox_provider_buffer_id(handle); + if (!id) { + ErrPrint("Invalid buffer handler\n"); + PERF_MARK("post_render"); + return DBOX_STATUS_ERROR_INVALID_PARAMETER; + } + + ret = dynamicbox_provider_buffer_post_render(handle); + if (ret < 0) { + ErrPrint("Failed to post render processing\n"); + PERF_MARK("post_render"); + return ret; + } + + if (dynamicbox_provider_buffer_frame_skip(handle) == 0) { + if (dynamicbox_provider_buffer_get_size(handle, &w, &h, &pixel_size) < 0) { + ErrPrint("Failed to get size (%s)\n", id); + } + + /** + * @todo + * manipulate the damaged region, so send update event only for the damaged region. + * to make more efficient updates + */ + ret = send_updated(pkgname, id, handle, DBOX_PRIMARY_BUFFER, 0, 0, w, h, user_data->is_gbar, NULL); + if (ret < 0) { + ErrPrint("Failed to send%supdated (%s)\n", user_data->is_gbar ? " GBAR " : " ", id); + } + + if (user_data->frame_wait_timer) { + ecore_timer_del(user_data->frame_wait_timer); + user_data->frame_wait_timer = NULL; + } + } else { + if (user_data->frame_wait_timer) { + ecore_timer_reset(user_data->frame_wait_timer); + } else { + user_data->frame_wait_timer = ecore_timer_add(FRAME_WAIT_INTERVAL, frame_wait_cb, handle); + if (!user_data->frame_wait_timer) { + ErrPrint("Failed to add waiting timer for next frame\n"); + } + } + } + + PERF_MARK("post_render"); + return ret; +} + +PUBLIC int dynamicbox_buffer_stride(dynamicbox_buffer_h handle) +{ + if (!handle) { + return DBOX_STATUS_ERROR_INVALID_PARAMETER; + } + + return dynamicbox_provider_buffer_stride(handle); +} + +PUBLIC int dynamicbox_content_is_updated(const char *filename, int is_gbar) +{ + if (!s_info.trigger_update_monitor) { + s_info.trigger_update_monitor = dlsym(RTLD_DEFAULT, FUNC_DYNAMICBOX_TRIGGER_UPDATE_MONITOR); + if (!s_info.trigger_update_monitor) { + ErrPrint("Trigger update monitor function is not exists\n"); + return DBOX_STATUS_ERROR_FAULT; + } + } + + return s_info.trigger_update_monitor(filename, is_gbar); +} + +PUBLIC int dynamicbox_request_close_glance_bar(const char *pkgname, const char *id, int reason) +{ + char *uri; + int schema_len = strlen(FILE_SCHEMA); + int ret; + + if (!pkgname || !id) { + ErrPrint("Invalid parameters (%s) (%s)\n", pkgname, id); + return DBOX_STATUS_ERROR_INVALID_PARAMETER; + } + + if (strncmp(id, FILE_SCHEMA, schema_len)) { + uri = id_to_uri(id); + if (!uri) { + ErrPrint("Heap: %s\n", strerror(errno)); + return DBOX_STATUS_ERROR_OUT_OF_MEMORY; + } + } else { + uri = strdup(id); + if (!uri) { + ErrPrint("Heap: %s\n", strerror(errno)); + return DBOX_STATUS_ERROR_OUT_OF_MEMORY; + } + } + + ret = dynamicbox_provider_send_request_close_gbar(pkgname, uri, reason); + free(uri); + return ret; +} + +PUBLIC int dynamicbox_freeze_scroller(const char *pkgname, const char *id) +{ + char *uri; + int ret; + + uri = id_to_uri(id); + if (!uri) { + ErrPrint("Heap: %s\n", strerror(errno)); + return DBOX_STATUS_ERROR_OUT_OF_MEMORY; + } + + ret = dynamicbox_provider_send_hold_scroll(pkgname, uri, 1); + free(uri); + return ret; +} + +PUBLIC int dynamicbox_thaw_scroller(const char *pkgname, const char *id) +{ + char *uri; + int ret; + + uri = id_to_uri(id); + if (!uri) { + ErrPrint("Heap: %s\n", strerror(errno)); + return DBOX_STATUS_ERROR_OUT_OF_MEMORY; + } + + ret = dynamicbox_provider_send_hold_scroll(pkgname, uri, 0); + free(uri); + return ret; +} + +PUBLIC int dynamicbox_set_extra_info(const char *id, const char *content, const char *title, const char *icon, const char *name) +{ + dynamicbox_buffer_h handle; + const char *pkgname; + char *uri; + + uri = id_to_uri(id); + if (!uri) { + ErrPrint("Heap: %s\n", strerror(errno)); + return DBOX_STATUS_ERROR_OUT_OF_MEMORY; + } + + if (!s_info.find_pkgname) { + s_info.find_pkgname = dlsym(RTLD_DEFAULT, FUNC_DYNAMICBOX_FIND_PKGNAME); + if (!s_info.find_pkgname) { + ErrPrint("Failed to find a \"dynamicbox_find_pkgname\"\n"); + free(uri); + return DBOX_STATUS_ERROR_FAULT; + } + } + + pkgname = s_info.find_pkgname(uri); + if (!pkgname) { + ErrPrint("Failed to find a package (%s)\n", uri); + free(uri); + return DBOX_STATUS_ERROR_INVALID_PARAMETER; + } + + handle = dynamicbox_provider_buffer_find_buffer(DBOX_TYPE_DBOX, pkgname, uri); + if (handle) { + struct dynamicbox_buffer_data *user_data; + + user_data = dynamicbox_provider_buffer_user_data(handle); + if (!user_data) { + ErrPrint("User data is not available\n"); + free(uri); + return DBOX_STATUS_ERROR_FAULT; + } + + if (content && strlen(content)) { + char *_content; + + _content = strdup(content); + if (_content) { + if (user_data->content) { + free(user_data->content); + } + + user_data->content = _content; + } else { + ErrPrint("Heap: %s\n", strerror(errno)); + } + } + + if (title && strlen(title)) { + char *_title; + + _title = strdup(title); + if (_title) { + if (user_data->title) { + free(user_data->title); + } + + user_data->title = _title; + } else { + ErrPrint("Heap: %s\n", strerror(errno)); + } + } + + if (icon && strlen(icon)) { + char *_icon; + + _icon = strdup(icon); + if (_icon) { + if (user_data->icon) { + free(user_data->icon); + } + + user_data->icon = _icon; + } else { + ErrPrint("Heap: %s\n", strerror(errno)); + } + } + + if (name && strlen(name)) { + char *_name; + + _name = strdup(name); + if (_name) { + if (user_data->name) { + free(user_data->name); + } + + user_data->name = _name; + } else { + ErrPrint("Heap: %s\n", strerror(errno)); + } + } + + if (dynamicbox_provider_send_extra_info(pkgname, uri, -1.0f, user_data->content, user_data->title, user_data->icon, user_data->name) < 0) { + ErrPrint("Failed to send extra info (%s)\n", id); + } + + free(uri); + return DBOX_STATUS_ERROR_NONE; + } + free(uri); + + if (!s_info.update_extra_info) { + s_info.update_extra_info = dlsym(RTLD_DEFAULT, FUNC_DYNAMICBOX_UPDATE_EXTRA_INFO); + if (!s_info.update_extra_info) { + ErrPrint("Failed to find a \"dynamicbox_update_extra_info\"\n"); + return DBOX_STATUS_ERROR_INVALID_PARAMETER; + } + } + + return s_info.update_extra_info(id, content, title, icon, name); +} + +/* End of a file */ diff --git a/dynamicbox/src/snapshot_window.c b/dynamicbox/src/snapshot_window.c new file mode 100644 index 0000000..0956faf --- /dev/null +++ b/dynamicbox/src/snapshot_window.c @@ -0,0 +1,502 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "dynamicbox.h" +#include "internal/dynamicbox.h" +#include "debug.h" + +#define QUALITY_N_COMPRESS "quality=100 compress=1" +#define PUBLIC __attribute__((visibility("default"))) + +struct snapshot_info { + char *id; + dynamicbox_flush_cb flush_cb; + void *data; + + Ecore_Timer *flush_timer; + + int render_cnt; + double timeout; +}; + +static void post_render_cb(void *data, Evas *e, void *event_info); +static void pre_render_cb(void *data, Evas *e, void *event_info); + +static inline Evas *create_virtual_canvas(int w, int h) +{ + Ecore_Evas *internal_ee; + Evas *internal_e; + + // Create virtual canvas + internal_ee = ecore_evas_buffer_new(w, h); + if (!internal_ee) { + DbgPrint("Failed to create a new canvas buffer\n"); + return NULL; + } + + ecore_evas_alpha_set(internal_ee, EINA_TRUE); + ecore_evas_manual_render_set(internal_ee, EINA_FALSE); + + // Get the "Evas" object from a virtual canvas + internal_e = ecore_evas_get(internal_ee); + if (!internal_e) { + ecore_evas_free(internal_ee); + DbgPrint("Faield to get Evas object\n"); + return NULL; + } + + return internal_e; +} + +static inline int flush_data_to_file(Evas *e, const char *data, const char *filename, int w, int h) +{ + Evas_Object *output; + + output = evas_object_image_add(e); + if (!output) { + DbgPrint("Failed to create an image object\n"); + return DBOX_STATUS_ERROR_FAULT; + } + + evas_object_image_data_set(output, NULL); + evas_object_image_colorspace_set(output, EVAS_COLORSPACE_ARGB8888); + evas_object_image_alpha_set(output, EINA_TRUE); + evas_object_image_size_set(output, w, h); + evas_object_image_smooth_scale_set(output, EINA_TRUE); + evas_object_image_data_set(output, (void *)data); + evas_object_image_fill_set(output, 0, 0, w, h); + evas_object_image_data_update_add(output, 0, 0, w, h); + + if (evas_object_image_save(output, filename, NULL, QUALITY_N_COMPRESS) == EINA_FALSE) { + evas_object_del(output); + DbgPrint("Faield to save a captured image (%s)\n", filename); + return DBOX_STATUS_ERROR_IO_ERROR; + } + + evas_object_del(output); + + if (access(filename, F_OK) != 0) { + DbgPrint("File %s is not found\n", filename); + return DBOX_STATUS_ERROR_IO_ERROR; + } + + DbgPrint("Flush data to a file (%s)\n", filename); + return DBOX_STATUS_ERROR_NONE; +} + +static inline int destroy_virtual_canvas(Evas *e) +{ + Ecore_Evas *ee; + + ee = ecore_evas_ecore_evas_get(e); + if (!ee) { + DbgPrint("Failed to ecore evas object\n"); + return DBOX_STATUS_ERROR_FAULT; + } + + ecore_evas_free(ee); + return DBOX_STATUS_ERROR_NONE; +} + +static inline int flush_to_file(const void *canvas, const char *filename, int w, int h) +{ + int status; + Evas *shot_e; + Ecore_Evas *shot_ee; + + shot_e = create_virtual_canvas(w, h); + if (!shot_e) { + ErrPrint("Unable to create a new virtual window\n"); + return DBOX_STATUS_ERROR_FAULT; + } + + shot_ee = ecore_evas_ecore_evas_get(shot_e); + if (!shot_ee) { + ErrPrint("Unable to get Ecore_Evas\n"); + destroy_virtual_canvas(shot_e); + return DBOX_STATUS_ERROR_FAULT; + } + + ecore_evas_manual_render_set(shot_ee, EINA_TRUE); + + status = flush_data_to_file(shot_e, canvas, filename, w, h); + destroy_virtual_canvas(shot_e); + + return status; +} + +static Eina_Bool snapshot_cb(void *data) +{ + Evas_Object *snapshot_win = data; + struct snapshot_info *info; + Evas *e; + Ecore_Evas *ee; + void *canvas; + dynamicbox_flush_cb flush_cb; + int status = DBOX_STATUS_ERROR_NONE; + + info = evas_object_data_get(snapshot_win, "snapshot,info"); + if (!info) { + ErrPrint("Invalid object\n"); + return ECORE_CALLBACK_CANCEL; + } + + if (info->flush_timer) { + info->flush_timer = NULL; + } else { + status = DBOX_STATUS_ERROR_CANCEL; + } + + flush_cb = info->flush_cb; + info->flush_cb = NULL; /* To prevent call this from the delete callback */ + + e = evas_object_evas_get(snapshot_win); + if (!e) { + ErrPrint("Invalid object\n"); + if (flush_cb) { + flush_cb(snapshot_win, info->id, DBOX_STATUS_ERROR_FAULT, info->data); + } + return ECORE_CALLBACK_CANCEL; + } + + ee = ecore_evas_ecore_evas_get(e); + if (!ee) { + ErrPrint("Invalid object (ee)\n"); + if (flush_cb) { + flush_cb(snapshot_win, info->id, DBOX_STATUS_ERROR_FAULT, info->data); + } + return ECORE_CALLBACK_CANCEL; + } + + canvas = (void*)ecore_evas_buffer_pixels_get(ee); + if (!canvas) { + DbgPrint("Failed to get pixel canvas\n"); + if (flush_cb) { + flush_cb(snapshot_win, info->id, DBOX_STATUS_ERROR_FAULT, info->data); + } + return ECORE_CALLBACK_CANCEL; + } + + if (flush_cb) { + int w; + int h; + int ret; + + ecore_evas_geometry_get(ee, NULL, NULL, &w, &h); + + DbgPrint("Flush size: %dx%d\n", w, h); + ret = flush_to_file(canvas, info->id, w, h); + if (status == DBOX_STATUS_ERROR_NONE) { + status = ret; + } + + flush_cb(snapshot_win, info->id, status, info->data); + /** + * Do not access info after this. + */ + } + + return ECORE_CALLBACK_CANCEL; +} + +static void del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + struct snapshot_info *info; + + info = evas_object_data_del(obj, "snapshot,info"); + if (!info) { + return; + } + + DbgPrint("Delete object (%s)\n", info->id); + + evas_event_callback_del(e, EVAS_CALLBACK_RENDER_POST, post_render_cb); + evas_event_callback_del(e, EVAS_CALLBACK_RENDER_PRE, pre_render_cb); + + if (info->flush_timer) { + ecore_timer_del(info->flush_timer); + info->flush_timer = NULL; + + (void)snapshot_cb(obj); + DbgPrint("Flush is canceled\n"); + } + + /** + * @note + * Render callback will be deleted. + */ + free(info->id); + free(info); +} + +static Eina_Bool direct_snapshot_cb(void *data) +{ + Evas *e; + Ecore_Evas *ee; + const void *canvas; + int status; + int w; + int h; + dynamicbox_flush_cb flush_cb; + Evas_Object *snapshot_win = data; + struct snapshot_info *info; + + info = evas_object_data_get(snapshot_win, "snapshot,info"); + if (!info) { + ErrPrint("Unable to get snapshot info\n"); + return ECORE_CALLBACK_CANCEL; + } + + info->flush_timer = NULL; + flush_cb = info->flush_cb; + info->flush_cb = NULL; /* To prevent call this from the delete callback */ + + e = evas_object_evas_get(snapshot_win); + if (!e) { + ErrPrint("Invalid object, failed to get Evas\n"); + if (flush_cb) { + flush_cb(snapshot_win, info->id, DBOX_STATUS_ERROR_FAULT, info->data); + } + return ECORE_CALLBACK_CANCEL; + } + + ee = ecore_evas_ecore_evas_get(e); + if (!ee) { + ErrPrint("Unable to get Ecore_Evas object\n"); + if (flush_cb) { + flush_cb(snapshot_win, info->id, DBOX_STATUS_ERROR_FAULT, info->data); + } + return ECORE_CALLBACK_CANCEL; + } + + ecore_evas_geometry_get(ee, NULL, NULL, &w, &h); + ecore_evas_manual_render_set(ee, EINA_TRUE); + + canvas = ecore_evas_buffer_pixels_get(ee); + if (!canvas) { + ErrPrint("Failed to get canvas\n"); + if (flush_cb) { + flush_cb(snapshot_win, info->id, DBOX_STATUS_ERROR_FAULT, info->data); + } + return ECORE_CALLBACK_CANCEL; + } + + status = flush_to_file(canvas, info->id, w, h); + if (flush_cb) { + flush_cb(snapshot_win, info->id, status, info->data); + } + return ECORE_CALLBACK_CANCEL; +} + +static void post_render_cb(void *data, Evas *e, void *event_info) +{ + Evas_Object *snapshot_win = data; + struct snapshot_info *info; + + info = evas_object_data_get(snapshot_win, "snapshot,info"); + if (!info) { + ErrPrint("snapshot info is not valid\n"); + return; + } + + info->render_cnt++; + + if (info->flush_timer) { + /** + * @note + * This has not to be happens. + */ + ErrPrint("Flush timer is not cleared\n"); + ecore_timer_del(info->flush_timer); + info->flush_timer = NULL; + } + + if (!info->flush_cb) { + DbgPrint("Flush request is not initiated yet\n"); + return; + } + + /*! + * \NOTE + * Even if tehre is no timer registered, we should capture the content + * from out of this callback. + * Or we can met unexpected problems. + * To avoid it, use the 0.0001f to get timer callback ASAP, not in this function. + */ + DbgPrint("Fire the flush timer %lf (%d)\n", info->timeout, info->render_cnt); + info->flush_timer = ecore_timer_add(info->timeout, snapshot_cb, snapshot_win); + if (!info->flush_timer) { + dynamicbox_flush_cb flush_cb; + + ErrPrint("Unalbe to add timer for getting the snapshot\n"); + flush_cb = info->flush_cb; + info->flush_cb = NULL; + + if (flush_cb) { + flush_cb(snapshot_win, info->id, DBOX_STATUS_ERROR_FAULT, info->data); + } + /*! + * \note + * Do not access info after from here. + */ + } +} + +static void pre_render_cb(void *data, Evas *e, void *event_info) +{ + Evas_Object *snapshot_win = data; + struct snapshot_info *info; + + info = evas_object_data_get(snapshot_win, "snapshot,info"); + if (!info) { + ErrPrint("snapshot info is not valid\n"); + return; + } + + if (info->flush_timer) { + ecore_timer_del(info->flush_timer); + info->flush_timer = NULL; + DbgPrint("Clear the flush timer\n"); + } + + DbgPrint("Pre-render callback\n"); +} + +PUBLIC void *dynamicbox_snapshot_window_add(const char *id, int size_type) +{ + struct snapshot_info *info; + Evas_Object *snapshot_win; + Evas_Object *parent; + Evas *e; + int w; + int h; + + if (dynamicbox_service_get_size(size_type, &w, &h) != DBOX_STATUS_ERROR_NONE) { + ErrPrint("Invalid size\n"); + return NULL; + } + + info = malloc(sizeof(*info)); + if (!info) { + ErrPrint("Heap: %s\n", strerror(errno)); + return NULL; + } + + info->id = strdup(id); + if (!info->id) { + ErrPrint("Heap: %s\n", strerror(errno)); + free(info); + return NULL; + } + + info->flush_cb = NULL; + info->data = NULL; + info->flush_timer = NULL; + info->render_cnt = 0; + + e = create_virtual_canvas(w, h); + if (!e) { + free(info->id); + free(info); + return NULL; + } + + parent = evas_object_rectangle_add(e); + if (!parent) { + destroy_virtual_canvas(e); + free(info->id); + free(info); + return NULL; + } + + snapshot_win = elm_win_add(parent, "DBox,Snapshot", ELM_WIN_DYNAMIC_BOX); + evas_object_del(parent); + if (!snapshot_win) { + destroy_virtual_canvas(e); + free(info->id); + free(info); + return NULL; + } + + DbgPrint("Create a new window %dx%d for %s\n", w, h, id); + evas_object_event_callback_add(snapshot_win, EVAS_CALLBACK_DEL, del_cb, NULL); + evas_object_resize(snapshot_win, w, h); + evas_object_show(snapshot_win); + + evas_object_data_set(snapshot_win, "snapshot,info", info); + + evas_event_callback_add(e, EVAS_CALLBACK_RENDER_POST, post_render_cb, snapshot_win); + evas_event_callback_add(e, EVAS_CALLBACK_RENDER_PRE, pre_render_cb, snapshot_win); + + return snapshot_win; +} + +PUBLIC int dynamicbox_snapshot_window_flush(void *snapshot_win, double timeout, dynamicbox_flush_cb flush_cb, void *data) +{ + struct snapshot_info *info; + + if (!flush_cb || timeout < 0.0f) { + ErrPrint("Invalid argument (%p, %lf)\n", flush_cb, timeout); + return DBOX_STATUS_ERROR_INVALID_PARAMETER; + } + + info = evas_object_data_get(snapshot_win, "snapshot,info"); + if (!info) { + ErrPrint("Invalid argument\n"); + return DBOX_STATUS_ERROR_INVALID_PARAMETER; + } + + info->timeout = timeout; + + if (timeout == 0.0f) { + /*! + * This timer is just used for guarantees same behavious even if it flushes content directly, + * The callback should be called from next loop. + * or the developer will get confused + */ + info->flush_timer = ecore_timer_add(0.0001f, direct_snapshot_cb, snapshot_win); + if (!info->flush_timer) { + return DBOX_STATUS_ERROR_FAULT; + } + } else if (info->render_cnt) { + /*! + * Try to watit pre-render callback. + * If there is rendered contents. + */ + DbgPrint("Rendered %d times already\n", info->render_cnt); + info->flush_timer = ecore_timer_add(info->timeout, snapshot_cb, snapshot_win); + if (!info->flush_timer) { + return DBOX_STATUS_ERROR_FAULT; + } + } + + info->flush_cb = flush_cb; + info->data = data; + + return DBOX_STATUS_ERROR_NONE; +} + +/* End of a file */ diff --git a/src/util.c b/dynamicbox/src/util.c similarity index 73% rename from src/util.c rename to dynamicbox/src/util.c index 208ee6c..e9f5ebe 100644 --- a/src/util.c +++ b/dynamicbox/src/util.c @@ -29,29 +29,29 @@ int errno; int util_check_extension(const char *filename, const char *check_ptr) { - int name_len; + int name_len; - name_len = strlen(filename); - while (--name_len >= 0 && *check_ptr) { - if (filename[name_len] != *check_ptr) - return -EINVAL; + name_len = strlen(filename); + while (--name_len >= 0 && *check_ptr) { + if (filename[name_len] != *check_ptr) + return -EINVAL; - check_ptr ++; - } + check_ptr ++; + } - return 0; + return 0; } double util_timestamp(void) { #if defined(_USE_ECORE_TIME_GET) - return ecore_time_get(); + return ecore_time_get(); #else - struct timeval tv; + struct timeval tv; - gettimeofday(&tv, NULL); + gettimeofday(&tv, NULL); - return (double)tv.tv_sec + (double)tv.tv_usec / 1000000.0f; + return (double)tv.tv_sec + (double)tv.tv_usec / 1000000.0f; #endif } diff --git a/dynamicbox/src/virtual_window.c b/dynamicbox/src/virtual_window.c new file mode 100644 index 0000000..e396df6 --- /dev/null +++ b/dynamicbox/src/virtual_window.c @@ -0,0 +1,1014 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include + +#include "dynamicbox.h" +#include "internal/dynamicbox.h" +#include "debug.h" + +#define IS_GBAR 1 + +#define PUBLIC __attribute__((visibility("default"))) +#define DBOX_WIN_TAG "dynamic,box,win" + +#define DBOX_DEFAULT_WIDTH 1 +#define DBOX_DEFAULT_HEIGHT 1 +#define GL_ENGINE "opengl_x11" + +static struct static_info { + Ecore_Evas *(*alloc_canvas)(int w, int h, void *(*a)(void *data, int size), void (*f)(void *data, void *ptr), void *data); + Ecore_Evas *(*alloc_canvas_with_stride)(int w, int h, void *(*a)(void *data, int size, int *stride, int *bpp), void (*f)(void *data, void *ptr), void *data); + Ecore_Evas *(*alloc_canvas_with_pixmap)(const char *disp_name, Ecore_X_Window parent, int x, int y, int w, int h, Ecore_X_Pixmap (*alloc_cb)(void *data, Ecore_X_Window parent, int w, int h, int depth), void (*free_cb)(void *data, Ecore_X_Pixmap pixmap), void *data); +} s_info = { + .alloc_canvas = NULL, + .alloc_canvas_with_stride = NULL, + .alloc_canvas_with_pixmap = NULL, +}; + +/** + * @brief + * Abstracted Data Type of Virtual Window + */ +typedef struct virtual_window_info { + char *id; /**< Identification */ + dynamicbox_buffer_h handle; /**< Livebox buffer handle */ + enum win_type { + VWIN_SW_BUF = 0x00, /**< S/W buffer */ + VWIN_GEM = 0x01, /**< GEM buffer */ + VWIN_PIXMAP = 0x02, /**< PIXMAP */ + VWIN_ERROR = 0x03 /**< Unknown */ + } type; + Ecore_Evas *ee; + Evas *e; + int is_gbar; + int deleted; + int w; + int h; + unsigned int *resource_array; + int resource_cnt; + + int pressed; +} *vwin_info_t; + +static inline Evas_Object *get_highlighted_object(Evas_Object *obj) +{ + Evas_Object *o, *ho; + + o = evas_object_name_find(evas_object_evas_get(obj), "_elm_access_disp"); + if (!o) return NULL; + + ho = evas_object_data_get(o, "_elm_access_target"); + return ho; +} + +/** + * @note + * Every user event (mouse) on the buffer will be passed via this event callback + */ +static int event_handler_cb(dynamicbox_buffer_h handler, struct dynamicbox_buffer_event_data *event_info, void *data) +{ + vwin_info_t info = data; + Elm_Access_Action_Info action_info; + Elm_Access_Action_Type action_type; + int ret = 0; + Evas_Object *parent_elm; + KeySym *key_symbol; + unsigned int flags = 0; + double timestamp; + + if (!info->handle) { + /* Just ignore this event */ + return 0; + } + + if (DYNAMICBOX_CONF_USE_GETTIMEOFDAY) { + if (DYNAMICBOX_CONF_EVENT_FILTER > 0.0f && (info->pressed == 0 || event_info->type == DBOX_BUFFER_EVENT_MOVE)) { + struct timeval tv; + + if (gettimeofday(&tv, NULL) < 0) { + ErrPrint("gettimeofday: %s\n", strerror(errno)); + } else { + timestamp = (double)tv.tv_sec + (double)tv.tv_usec / 1000000.0f; + timestamp -= event_info->timestamp; + + if (timestamp > DYNAMICBOX_CONF_EVENT_FILTER) { + DbgPrint("Dropped %lf\n", timestamp); + return 0; + } + } + } + + /** + * If the device doesn't use the clock monotic time, we have to emulate it for EVAS + * Evas only use the monotic time for animating objects + */ + timestamp = ecore_time_get() * 1000.0f; + } else { + if (DYNAMICBOX_CONF_EVENT_FILTER > 0.0f && (info->pressed == 0 || event_info->type == DBOX_BUFFER_EVENT_MOVE)) { + timestamp = ecore_time_get(); + + timestamp -= event_info->timestamp; + if (timestamp > DYNAMICBOX_CONF_EVENT_FILTER) { + DbgPrint("Dropped %lf\n", timestamp); + return 0; + } + } + + timestamp = event_info->timestamp * 1000.0f; + } + + /** + * @note + * Feed up events + */ + switch (event_info->type) { + case DBOX_BUFFER_EVENT_ON_HOLD: + flags = evas_event_default_flags_get(info->e); + flags |= EVAS_EVENT_FLAG_ON_HOLD; + evas_event_default_flags_set(info->e, flags); + ErrPrint("ON_HOLD[%s] %dx%d - %lf\n", info->id, event_info->info.pointer.x, event_info->info.pointer.y, timestamp); + break; + case DBOX_BUFFER_EVENT_OFF_HOLD: + flags = evas_event_default_flags_get(info->e); + flags &= ~EVAS_EVENT_FLAG_ON_HOLD; + evas_event_default_flags_set(info->e, flags); + break; + case DBOX_BUFFER_EVENT_ON_SCROLL: + flags = evas_event_default_flags_get(info->e); + flags |= EVAS_EVENT_FLAG_ON_SCROLL; + evas_event_default_flags_set(info->e, flags); + break; + case DBOX_BUFFER_EVENT_OFF_SCROLL: + flags = evas_event_default_flags_get(info->e); + flags &= ~EVAS_EVENT_FLAG_ON_SCROLL; + evas_event_default_flags_set(info->e, flags); + break; + case DBOX_BUFFER_EVENT_ENTER: + evas_event_feed_mouse_in(info->e, timestamp, NULL); + break; + case DBOX_BUFFER_EVENT_LEAVE: + evas_event_feed_mouse_out(info->e, timestamp, NULL); + break; + case DBOX_BUFFER_EVENT_DOWN: + if (info->pressed) { + ErrPrint("MOUSE UP is not called\n"); + ErrPrint("UP[%s] %dx%d - %lf\n", info->id, event_info->info.pointer.x, event_info->info.pointer.y, timestamp); + evas_event_feed_mouse_move(info->e, event_info->info.pointer.x, event_info->info.pointer.y, timestamp, NULL); + evas_event_feed_mouse_up(info->e, 1, EVAS_BUTTON_NONE, timestamp, NULL); + } + + /** + * @note + * Before processing the DOWN event, + * Reset the evas event flags regarding ON_HOLD option. + * It can be re-enabled while processing down-move-up events. + */ + flags = evas_event_default_flags_get(info->e); + flags &= ~EVAS_EVENT_FLAG_ON_SCROLL; + flags &= ~EVAS_EVENT_FLAG_ON_HOLD; + evas_event_default_flags_set(info->e, flags); + /** + * @note + * Calculate the event occurred X & Y on the buffer + */ + evas_event_feed_mouse_move(info->e, event_info->info.pointer.x, event_info->info.pointer.y, timestamp, NULL); + evas_event_feed_mouse_down(info->e, 1, EVAS_BUTTON_NONE, timestamp, NULL); /* + 0.2f just for fake event */ + info->pressed = 1; + ErrPrint("DOWN[%s] %dx%d - %lf\n", info->id, event_info->info.pointer.x, event_info->info.pointer.y, timestamp); + break; + case DBOX_BUFFER_EVENT_MOVE: + /** + * @note + * Calculate the event occurred X & Y on the buffer + */ + evas_event_feed_mouse_move(info->e, event_info->info.pointer.x, event_info->info.pointer.y, timestamp, NULL); + break; + case DBOX_BUFFER_EVENT_UP: + evas_event_feed_mouse_move(info->e, event_info->info.pointer.x, event_info->info.pointer.y, timestamp, NULL); + evas_event_feed_mouse_up(info->e, 1, EVAS_BUTTON_NONE, timestamp, NULL); + info->pressed = 0; + /** + * @note + * We have to keep the event flags, so we should not clear them from here. + * Sometimes, asynchronously callable Callbacks can refer the evas event flags after up event. + * so if we reset them from here, those kind of callbacks will fails to do their job properly. + */ + ErrPrint("UP[%s] %dx%d - %lf\n", info->id, event_info->info.pointer.x, event_info->info.pointer.y, timestamp); + break; + case DBOX_BUFFER_EVENT_ACCESS_HIGHLIGHT: + parent_elm = ecore_evas_data_get(info->ee, DBOX_WIN_TAG); + if (!parent_elm) { + ret = DBOX_ACCESS_STATUS_ERROR; + break; + } + memset(&action_info, 0, sizeof(action_info)); + action_type = ELM_ACCESS_ACTION_HIGHLIGHT; + /** + * @note + * Calculate the event occurred X & Y on the buffer + */ + action_info.x = event_info->info.access.x; + action_info.y = event_info->info.access.y; + ret = elm_access_action(parent_elm, action_type, &action_info); + if (ret == EINA_TRUE) { + if (!get_highlighted_object(parent_elm)) { + ErrPrint("Highlighted object is not found\n"); + ret = DBOX_ACCESS_STATUS_ERROR; + } else { + DbgPrint("Highlighted object is found\n"); + ret = DBOX_ACCESS_STATUS_DONE; + } + } else { + ErrPrint("Action error\n"); + ret = DBOX_ACCESS_STATUS_ERROR; + } + break; + case DBOX_BUFFER_EVENT_ACCESS_HIGHLIGHT_NEXT: + parent_elm = ecore_evas_data_get(info->ee, DBOX_WIN_TAG); + if (!parent_elm) { + ret = DBOX_ACCESS_STATUS_ERROR; + break; + } + memset(&action_info, 0, sizeof(action_info)); + action_type = ELM_ACCESS_ACTION_HIGHLIGHT_NEXT; + action_info.highlight_cycle = EINA_FALSE; + ret = elm_access_action(parent_elm, action_type, &action_info); + ret = (ret == EINA_FALSE) ? DBOX_ACCESS_STATUS_LAST : DBOX_ACCESS_STATUS_DONE; + break; + case DBOX_BUFFER_EVENT_ACCESS_HIGHLIGHT_PREV: + parent_elm = ecore_evas_data_get(info->ee, DBOX_WIN_TAG); + if (!parent_elm) { + ret = DBOX_ACCESS_STATUS_ERROR; + break; + } + memset(&action_info, 0, sizeof(action_info)); + action_type = ELM_ACCESS_ACTION_HIGHLIGHT_PREV; + action_info.highlight_cycle = EINA_FALSE; + ret = elm_access_action(parent_elm, action_type, &action_info); + ret = (ret == EINA_FALSE) ? DBOX_ACCESS_STATUS_FIRST : DBOX_ACCESS_STATUS_DONE; + break; + case DBOX_BUFFER_EVENT_ACCESS_ACTIVATE: + parent_elm = ecore_evas_data_get(info->ee, DBOX_WIN_TAG); + if (!parent_elm) { + ret = DBOX_ACCESS_STATUS_ERROR; + break; + } + memset(&action_info, 0, sizeof(action_info)); + action_type = ELM_ACCESS_ACTION_ACTIVATE; + ret = elm_access_action(parent_elm, action_type, &action_info); + ret = (ret == EINA_FALSE) ? DBOX_ACCESS_STATUS_ERROR : DBOX_ACCESS_STATUS_DONE; + break; + case DBOX_BUFFER_EVENT_ACCESS_ACTION_UP: + parent_elm = ecore_evas_data_get(info->ee, DBOX_WIN_TAG); + if (!parent_elm) { + ret = DBOX_ACCESS_STATUS_ERROR; + break; + } + memset(&action_info, 0, sizeof(action_info)); + action_type = ELM_ACCESS_ACTION_UP; + ret = elm_access_action(parent_elm, action_type, &action_info); + ret = (ret == EINA_FALSE) ? DBOX_ACCESS_STATUS_ERROR : DBOX_ACCESS_STATUS_DONE; + break; + case DBOX_BUFFER_EVENT_ACCESS_ACTION_DOWN: + parent_elm = ecore_evas_data_get(info->ee, DBOX_WIN_TAG); + if (!parent_elm) { + ret = DBOX_ACCESS_STATUS_ERROR; + break; + } + memset(&action_info, 0, sizeof(action_info)); + action_type = ELM_ACCESS_ACTION_DOWN; + ret = elm_access_action(parent_elm, action_type, &action_info); + ret = (ret == EINA_FALSE) ? DBOX_ACCESS_STATUS_ERROR : DBOX_ACCESS_STATUS_DONE; + break; + case DBOX_BUFFER_EVENT_ACCESS_SCROLL_UP: + parent_elm = ecore_evas_data_get(info->ee, DBOX_WIN_TAG); + if (!parent_elm) { + ret = DBOX_ACCESS_STATUS_ERROR; + break; + } + memset(&action_info, 0, sizeof(action_info)); + action_type = ELM_ACCESS_ACTION_SCROLL; + action_info.x = event_info->info.access.x; + action_info.y = event_info->info.access.y; + action_info.mouse_type = event_info->info.access.mouse_type; + ret = elm_access_action(parent_elm, action_type, &action_info); + ret = (ret == EINA_FALSE) ? DBOX_ACCESS_STATUS_ERROR : DBOX_ACCESS_STATUS_DONE; + break; + case DBOX_BUFFER_EVENT_ACCESS_SCROLL_MOVE: + parent_elm = ecore_evas_data_get(info->ee, DBOX_WIN_TAG); + if (!parent_elm) { + ret = DBOX_ACCESS_STATUS_ERROR; + break; + } + memset(&action_info, 0, sizeof(action_info)); + action_type = ELM_ACCESS_ACTION_SCROLL; + action_info.x = event_info->info.access.x; + action_info.y = event_info->info.access.y; + action_info.mouse_type = event_info->info.access.mouse_type; + ret = elm_access_action(parent_elm, action_type, &action_info); + ret = (ret == EINA_FALSE) ? DBOX_ACCESS_STATUS_ERROR : DBOX_ACCESS_STATUS_DONE; + break; + case DBOX_BUFFER_EVENT_ACCESS_SCROLL_DOWN: + parent_elm = ecore_evas_data_get(info->ee, DBOX_WIN_TAG); + if (!parent_elm) { + ret = DBOX_ACCESS_STATUS_ERROR; + break; + } + memset(&action_info, 0, sizeof(action_info)); + action_type = ELM_ACCESS_ACTION_SCROLL; + action_info.x = event_info->info.access.x; + action_info.y = event_info->info.access.y; + action_info.mouse_type = event_info->info.access.mouse_type; + ret = elm_access_action(parent_elm, action_type, &action_info); + ret = (ret == EINA_FALSE) ? DBOX_ACCESS_STATUS_ERROR : DBOX_ACCESS_STATUS_DONE; + break; + case DBOX_BUFFER_EVENT_ACCESS_UNHIGHLIGHT: + parent_elm = ecore_evas_data_get(info->ee, DBOX_WIN_TAG); + if (!parent_elm) { + ret = DBOX_ACCESS_STATUS_ERROR; + break; + } + memset(&action_info, 0, sizeof(action_info)); + action_type = ELM_ACCESS_ACTION_UNHIGHLIGHT; + ret = elm_access_action(parent_elm, action_type, &action_info); + ret = (ret == EINA_FALSE) ? DBOX_ACCESS_STATUS_ERROR : DBOX_ACCESS_STATUS_DONE; + break; + case DBOX_BUFFER_EVENT_ACCESS_VALUE_CHANGE: + parent_elm = ecore_evas_data_get(info->ee, DBOX_WIN_TAG); + if (!parent_elm) { + ret = DBOX_ACCESS_STATUS_ERROR; + break; + } + memset(&action_info, 0, sizeof(action_info)); + action_type = ELM_ACCESS_ACTION_VALUE_CHANGE; + action_info.x = event_info->info.access.x; + action_info.y = event_info->info.access.y; + action_info.mouse_type = event_info->info.access.mouse_type; + ret = elm_access_action(parent_elm, action_type, &action_info); + ret = (ret == EINA_FALSE) ? DBOX_ACCESS_STATUS_ERROR : DBOX_ACCESS_STATUS_DONE; + break; + case DBOX_BUFFER_EVENT_ACCESS_MOUSE: + parent_elm = ecore_evas_data_get(info->ee, DBOX_WIN_TAG); + if (!parent_elm) { + ret = DBOX_ACCESS_STATUS_ERROR; + break; + } + memset(&action_info, 0, sizeof(action_info)); + action_type = ELM_ACCESS_ACTION_MOUSE; + action_info.x = event_info->info.access.x; + action_info.y = event_info->info.access.y; + action_info.mouse_type = event_info->info.access.mouse_type; + ret = elm_access_action(parent_elm, action_type, &action_info); + ret = (ret == EINA_FALSE) ? DBOX_ACCESS_STATUS_ERROR : DBOX_ACCESS_STATUS_DONE; + break; + case DBOX_BUFFER_EVENT_ACCESS_BACK: + parent_elm = ecore_evas_data_get(info->ee, DBOX_WIN_TAG); + if (!parent_elm) { + ret = DBOX_ACCESS_STATUS_ERROR; + break; + } + memset(&action_info, 0, sizeof(action_info)); + action_type = ELM_ACCESS_ACTION_BACK; + action_info.x = event_info->info.access.x; + action_info.y = event_info->info.access.y; + action_info.mouse_type = event_info->info.access.mouse_type; + ret = elm_access_action(parent_elm, action_type, &action_info); + ret = (ret == EINA_FALSE) ? DBOX_ACCESS_STATUS_ERROR : DBOX_ACCESS_STATUS_DONE; + break; + case DBOX_BUFFER_EVENT_ACCESS_OVER: + parent_elm = ecore_evas_data_get(info->ee, DBOX_WIN_TAG); + if (!parent_elm) { + ret = DBOX_ACCESS_STATUS_ERROR; + break; + } + memset(&action_info, 0, sizeof(action_info)); + action_type = ELM_ACCESS_ACTION_OVER; + action_info.x = event_info->info.access.x; + action_info.y = event_info->info.access.y; + action_info.mouse_type = event_info->info.access.mouse_type; + ret = elm_access_action(parent_elm, action_type, &action_info); + ret = (ret == EINA_FALSE) ? DBOX_ACCESS_STATUS_ERROR : DBOX_ACCESS_STATUS_DONE; + break; + case DBOX_BUFFER_EVENT_ACCESS_READ: + parent_elm = ecore_evas_data_get(info->ee, DBOX_WIN_TAG); + if (!parent_elm) { + ret = DBOX_ACCESS_STATUS_ERROR; + break; + } + memset(&action_info, 0, sizeof(action_info)); + action_type = ELM_ACCESS_ACTION_READ; + action_info.x = event_info->info.access.x; + action_info.y = event_info->info.access.y; + action_info.mouse_type = event_info->info.access.mouse_type; + ret = elm_access_action(parent_elm, action_type, &action_info); + ret = (ret == EINA_FALSE) ? DBOX_ACCESS_STATUS_ERROR : DBOX_ACCESS_STATUS_DONE; + break; + case DBOX_BUFFER_EVENT_ACCESS_ENABLE: + parent_elm = ecore_evas_data_get(info->ee, DBOX_WIN_TAG); + if (!parent_elm) { + ret = DBOX_ACCESS_STATUS_ERROR; + break; + } + memset(&action_info, 0, sizeof(action_info)); + action_type = ELM_ACCESS_ACTION_ENABLE; + action_info.x = event_info->info.access.x; + action_info.y = event_info->info.access.y; + action_info.mouse_type = event_info->info.access.mouse_type; + ret = elm_access_action(parent_elm, action_type, &action_info); + ret = (ret == EINA_FALSE) ? DBOX_ACCESS_STATUS_ERROR : DBOX_ACCESS_STATUS_DONE; + break; + case DBOX_BUFFER_EVENT_ACCESS_DISABLE: + parent_elm = ecore_evas_data_get(info->ee, DBOX_WIN_TAG); + if (!parent_elm) { + ret = DBOX_ACCESS_STATUS_ERROR; + break; + } + memset(&action_info, 0, sizeof(action_info)); + action_type = ELM_ACCESS_ACTION_DISABLE; + action_info.x = event_info->info.access.x; + action_info.y = event_info->info.access.y; + action_info.mouse_type = event_info->info.access.mouse_type; + ret = elm_access_action(parent_elm, action_type, &action_info); + ret = (ret == EINA_FALSE) ? DBOX_ACCESS_STATUS_ERROR : DBOX_ACCESS_STATUS_DONE; + break; + case DBOX_BUFFER_EVENT_KEY_DOWN: + parent_elm = ecore_evas_data_get(info->ee, DBOX_WIN_TAG); + if (!parent_elm) { + ret = DBOX_ACCESS_STATUS_ERROR; + break; + } + + key_symbol = XGetKeyboardMapping(ecore_x_display_get(), event_info->info.keycode, 1, &ret); + if (key_symbol) { + char *key_name; + char *key_string; + + key_string = XKeysymToString(*key_symbol); + key_name = XKeysymToString(*key_symbol); + DbgPrint("Key symbol: %s, name: %s\n", key_string, key_name); + XFree(key_symbol); + XFree(key_name); + XFree(key_string); + } + ret = DBOX_KEY_STATUS_ERROR; + break; + case DBOX_BUFFER_EVENT_KEY_UP: + parent_elm = ecore_evas_data_get(info->ee, DBOX_WIN_TAG); + if (!parent_elm) { + ret = DBOX_ACCESS_STATUS_ERROR; + break; + } + + key_symbol = XGetKeyboardMapping(ecore_x_display_get(), event_info->info.keycode, 1, &ret); + if (key_symbol) { + char *key_name; + char *key_string; + + key_string = XKeysymToString(*key_symbol); + key_name = XKeysymToString(*key_symbol); + DbgPrint("Key symbol: %s, name: %s\n", key_string, key_name); + XFree(key_symbol); + XFree(key_name); + XFree(key_string); + } + ret = DBOX_KEY_STATUS_ERROR; + break; + case DBOX_BUFFER_EVENT_KEY_FOCUS_IN: + parent_elm = ecore_evas_data_get(info->ee, DBOX_WIN_TAG); + if (!parent_elm) { + ret = DBOX_ACCESS_STATUS_ERROR; + break; + } + + key_symbol = XGetKeyboardMapping(ecore_x_display_get(), event_info->info.keycode, 1, &ret); + if (key_symbol) { + char *key_name; + char *key_string; + + key_string = XKeysymToString(*key_symbol); + key_name = XKeysymToString(*key_symbol); + DbgPrint("Key symbol: %s, name: %s\n", key_string, key_name); + XFree(key_symbol); + XFree(key_name); + XFree(key_string); + } + ret = DBOX_KEY_STATUS_ERROR; + break; + case DBOX_BUFFER_EVENT_KEY_FOCUS_OUT: + parent_elm = ecore_evas_data_get(info->ee, DBOX_WIN_TAG); + if (!parent_elm) { + ret = DBOX_ACCESS_STATUS_ERROR; + break; + } + + key_symbol = XGetKeyboardMapping(ecore_x_display_get(), event_info->info.keycode, 1, &ret); + if (key_symbol) { + char *key_name; + char *key_string; + + key_string = XKeysymToString(*key_symbol); + key_name = XKeysymToString(*key_symbol); + DbgPrint("Key symbol: %s, name: %s\n", key_string, key_name); + XFree(key_symbol); + XFree(key_name); + XFree(key_string); + } + ret = DBOX_KEY_STATUS_ERROR; + break; + default: + DbgPrint("Unhandled buffer event (%d)\n", event_info->type); + break; + } + + return ret; +} + +/** + * @note + * This callback can be called twice (or more) to get a several pixmaps + * Acquired pixmaps are used for double/tripple buffering for canvas + */ +static Ecore_X_Pixmap alloc_pixmap_cb(void *data, Ecore_X_Window parent, int w, int h, int depth) +{ + vwin_info_t info = data; + Ecore_X_Pixmap pixmap; + + if (!info->handle) { + ErrPrint("Invalid handle\n"); + return 0u; + } + + info->w = w; + info->h = h; + DbgPrint("Size of ee is updated: %dx%d - %d (info: %p)\n", info->w, info->h, depth, info); + depth >>= 3; + + if (dynamicbox_resource_id(info->handle, DBOX_PRIMARY_BUFFER) == 0u) { + /** + * @note + * Need to allocate a primary buffer + */ + dynamicbox_acquire_buffer(info->handle, DBOX_PRIMARY_BUFFER, info->w, info->h, depth); + if (!info->handle) { + ErrPrint("Failed to get the buffer\n"); + return 0u; + } + + pixmap = (Ecore_X_Pixmap)dynamicbox_resource_id(info->handle, DBOX_PRIMARY_BUFFER); + } else if (DYNAMICBOX_CONF_EXTRA_BUFFER_COUNT > 0) { + int idx; + + if (!info->resource_array) { + info->resource_array = calloc(DYNAMICBOX_CONF_EXTRA_BUFFER_COUNT, sizeof(*info->resource_array)); + if (!info->resource_array) { + ErrPrint("Out of memory: %s\n", strerror(errno)); + return 0u; + } + + idx = 0; + } else { + for (idx = 0; idx < DYNAMICBOX_CONF_EXTRA_BUFFER_COUNT; idx++) { + if (info->resource_array[idx] == 0u) { + break; + } + } + + if (idx == DYNAMICBOX_CONF_EXTRA_BUFFER_COUNT) { + ErrPrint("Out of index: %d\n", idx); + return 0u; + } + } + + if (dynamicbox_acquire_buffer(info->handle, idx, info->w, info->h, depth) < 0) { + ErrPrint("Failed to acquire a buffer for %d\n", idx); + return 0u; + } + + info->resource_array[idx] = dynamicbox_resource_id(info->handle, idx); + if (info->resource_array[idx] == 0u) { + ErrPrint("Failed to allocate pixmap\n"); + } + + DbgPrint("Allocated index: %d/%d - %u\n", idx, DYNAMICBOX_CONF_EXTRA_BUFFER_COUNT, info->resource_array[idx]); + pixmap = info->resource_array[idx]; + } else { + ErrPrint("Unable to allocate pixmap\n"); + pixmap = 0u; + } + + /** + * Acquire a buffer for canvas. + */ + info->type = VWIN_PIXMAP; + info->resource_cnt += !!(unsigned int)pixmap; + return pixmap; +} + +static void free_pixmap_cb(void *data, Ecore_X_Pixmap pixmap) +{ + vwin_info_t info = data; + + if (!info->handle) { + return; + } + + if (info->type != VWIN_PIXMAP) { + ErrPrint("Impossible\n"); + } + + if (dynamicbox_resource_id(info->handle, DBOX_PRIMARY_BUFFER) == pixmap) { + if (dynamicbox_release_buffer(info->handle, DBOX_PRIMARY_BUFFER) < 0) { + DbgPrint("Failed to release buffer\n"); + } + info->resource_cnt--; + } else { + int idx; + + for (idx = 0; idx < DYNAMICBOX_CONF_EXTRA_BUFFER_COUNT; idx++) { + /** + * @note + * Find a index to release it + */ + if (info->resource_array[idx] == pixmap) { + if (dynamicbox_release_buffer(info->handle, idx) < 0) { + DbgPrint("Failed to release buffer\n"); + } + info->resource_array[idx] = 0u; + info->resource_cnt--; + break; + } + } + } + + if (info->deleted && info->resource_cnt == 0) { + DbgPrint("Destroy buffer handle\n"); + + dynamicbox_destroy_buffer(info->handle); + free(info->resource_array); + free(info->id); + free(info); + } +} + +static void *alloc_fb(void *data, int size) +{ + vwin_info_t info = data; + void *buffer; + + if (info->ee) { + ecore_evas_geometry_get(info->ee, NULL, NULL, &info->w, &info->h); + DbgPrint("Size of ee is updated: %dx%d (info: %p)\n", info->w, info->h, info); + } + + if (!info->handle) { + ErrPrint("Failed to create a buffer\n"); + return NULL; + } + + if (dynamicbox_acquire_buffer(info->handle, DBOX_PRIMARY_BUFFER, info->w, info->h, sizeof(int)) < 0) { + ErrPrint("Failed to acquire buffer\n"); + return NULL; + } + + /** + * If it supports the H/W accelerated buffer, + * Use it. + */ + if (dynamicbox_support_hw_buffer(info->handle)) { + if (dynamicbox_create_hw_buffer(info->handle) == 0) { + buffer = dynamicbox_buffer_hw_buffer(info->handle); + if (buffer) { + DbgPrint("HW Accelerated buffer is created %p, (%dx%d)\n", info, info->w, info->h); + info->type = VWIN_GEM; + return buffer; + } + } + + ErrPrint("Failed to allocate HW Accelerated buffer\n"); + } + + /** + * Or use the buffer of a S/W backend. + */ + buffer = dynamicbox_ref_buffer(info->handle); + DbgPrint("SW buffer is created (%dx%d)\n", info->w, info->h); + info->type = VWIN_SW_BUF; + return buffer; +} + +static void *alloc_stride_fb(void *data, int size, int *stride, int *bpp) +{ + void *buffer; + + buffer = alloc_fb(data, size); + if (buffer) { + vwin_info_t info = data; + int _stride; + + *bpp = sizeof(int); + _stride = dynamicbox_buffer_stride(info->handle); + if (_stride < 0) { + _stride = info->w * *bpp; + } + + *stride = _stride; + *bpp <<= 3; + DbgPrint("bpp: %d, stride: %d\n", *bpp, *stride); + } + + return buffer; +} + +static void free_fb(void *data, void *ptr) +{ + vwin_info_t info = data; + + if (!info->handle) { + return; + } + + if (info->type == VWIN_GEM) { + if (dynamicbox_destroy_hw_buffer(info->handle) == 0) { + DbgPrint("HW Accelerated buffer is destroyed\n"); + } + } else if (info->type == VWIN_SW_BUF) { + DbgPrint("SW buffer is destroyed, %p\n", info); + dynamicbox_unref_buffer(ptr); + } else if (info->type == VWIN_PIXMAP) { + ErrPrint("Unable to reach to here\n"); + } + + if (dynamicbox_release_buffer(info->handle, DBOX_PRIMARY_BUFFER) < 0) { + ErrPrint("Failed to release buffer\n"); + } + + if (info->deleted) { + dynamicbox_destroy_buffer(info->handle); + free(info->resource_array); + free(info->id); + free(info); + } +} + +static void pre_render_cb(void *data, Evas *e, void *event_info) +{ + vwin_info_t info = data; + + if (!info->handle) { + return; + } + + if (dynamicbox_conf_premultiplied_alpha()) { + Evas_Coord w; + Evas_Coord h; + + ecore_evas_geometry_get(info->ee, NULL, NULL, &w, &h); + evas_damage_rectangle_add(e, 0, 0, w, h); + } + + if (info->type == VWIN_GEM) { + dynamicbox_buffer_pre_render(info->handle); + } else if (info->type == VWIN_PIXMAP) { + /** + * Only the pixmap type Ecore_Evas uses this variable + */ + } else if (info->type == VWIN_SW_BUF) { + /* Do nothing */ + } +} + +static void post_render_cb(void *data, Evas *e, void *event_info) +{ + vwin_info_t info = data; + + if (!info->handle) { + return; + } + + if (dynamicbox_conf_premultiplied_alpha()) { + void *canvas; + int x, y, w, h; + + // Get a pointer of a buffer of the virtual canvas + canvas = (void *)ecore_evas_buffer_pixels_get(info->ee); + if (!canvas) { + ErrPrint("Failed to get pixel canvas\n"); + return; + } + + ecore_evas_geometry_get(info->ee, &x, &y, &w, &h); + evas_data_argb_unpremul(canvas, w * h); + } + + if (info->type == VWIN_GEM) { + dynamicbox_buffer_post_render(info->handle); + } else if (info->type == VWIN_PIXMAP) { + int idx; + unsigned int front_resource_id; + + front_resource_id = ecore_evas_gl_x11_pixmap_get(info->ee); + + for (idx = 0; idx < DYNAMICBOX_CONF_EXTRA_BUFFER_COUNT; idx++) { + if (front_resource_id == info->resource_array[idx]) { + /** + */ + dynamicbox_send_updated_by_idx(info->handle, idx); + break; + } + } + + if (idx == DYNAMICBOX_CONF_EXTRA_BUFFER_COUNT) { + /* Send updated event for PRIMARY BUFFER */ + if (front_resource_id == dynamicbox_resource_id(info->handle, DBOX_PRIMARY_BUFFER)) { + dynamicbox_send_updated_by_idx(info->handle, DBOX_PRIMARY_BUFFER); + } else { + DbgPrint("Unable to send updated: %u (%u)\n", front_resource_id, dynamicbox_resource_id(info->handle, DBOX_PRIMARY_BUFFER)); + } + } + } else if (info->type == VWIN_SW_BUF) { + dynamicbox_sync_buffer(info->handle); + } +} + +static void ecore_evas_free_cb(Ecore_Evas *ee) +{ + vwin_info_t info; + + info = ecore_evas_data_get(ee, "dynamic,box,info"); + if (!info) { + DbgPrint("Info is not valid\n"); + return; + } + + if (info->e) { + evas_event_callback_del(info->e, EVAS_CALLBACK_RENDER_POST, post_render_cb); + evas_event_callback_del(info->e, EVAS_CALLBACK_RENDER_PRE, pre_render_cb); + } + + info->deleted = 1; + info->ee = NULL; +} + +PUBLIC void *dynamicbox_get_evas_object(const char *id, int is_gbar) +{ + vwin_info_t info; + Evas_Object *rect; + const char *engine; + + if (!s_info.alloc_canvas && !s_info.alloc_canvas_with_stride && !s_info.alloc_canvas_with_pixmap) { + s_info.alloc_canvas_with_pixmap = dlsym(RTLD_DEFAULT, "ecore_evas_gl_x11_pixmap_allocfunc_new"); + if (!s_info.alloc_canvas_with_pixmap) { + DbgPrint("pixmap_allocfunc_new is not found\n"); + } + + s_info.alloc_canvas_with_stride = dlsym(RTLD_DEFAULT, "ecore_evas_buffer_allocfunc_with_stride_new"); + if (!s_info.alloc_canvas_with_stride) { + DbgPrint("allocfunc_with_stirde_new is not found\n"); + } + + s_info.alloc_canvas = dlsym(RTLD_DEFAULT, "ecore_evas_buffer_allocfunc_new"); + if (!s_info.alloc_canvas) { + ErrPrint("allocfunc_new is not found\n"); + } + + if (!s_info.alloc_canvas_with_stride && !s_info.alloc_canvas && !s_info.alloc_canvas_with_pixmap) { + ErrPrint("No way to allocate canvas\n"); + return NULL; + } + } + + if (!id) { + ErrPrint("Invalid parameter\n"); + return NULL; + } + + info = calloc(1, sizeof(*info)); + if (!info) { + ErrPrint("Heap: %s\n", strerror(errno)); + return NULL; + } + + info->id = strdup(id); + if (!info->id) { + ErrPrint("Heap: %s\n", strerror(errno)); + free(info); + return NULL; + } + + info->is_gbar = is_gbar; + + /** + * Acquire a buffer for canvas. + */ + info->handle = dynamicbox_create_buffer(info->id, info->is_gbar, + (dynamicbox_conf_auto_align() || !s_info.alloc_canvas_with_stride), + event_handler_cb, info); + + if (!info->handle) { + ErrPrint("Failed to create a dynamicbox buffer\n"); + free(info->id); + free(info); + return NULL; + } + + /** + * Size information must be initialized before call the ecore_evas_buffer_new. + */ + info->w = DBOX_DEFAULT_WIDTH; + info->h = DBOX_DEFAULT_HEIGHT; + + engine = elm_config_preferred_engine_get(); + DbgPrint("Preferred engine: %s (%s)\n", engine, GL_ENGINE); + if (engine && !strcmp(engine, GL_ENGINE)) { + if (s_info.alloc_canvas_with_pixmap) { + info->ee = s_info.alloc_canvas_with_pixmap(NULL, 0u, 0, 0, info->w, info->h, alloc_pixmap_cb, free_pixmap_cb, info); + if (!info->ee) { + ErrPrint("Unable to create a ee for pixmap\n"); + } + } + } + + if (!info->ee) { + if (!dynamicbox_conf_auto_align() && s_info.alloc_canvas_with_stride) { + info->ee = s_info.alloc_canvas_with_stride(info->w, info->h, alloc_stride_fb, free_fb, info); + } else if (s_info.alloc_canvas) { + info->ee = s_info.alloc_canvas(info->w, info->h, alloc_fb, free_fb, info); + } + } + + if (!info->ee) { + ErrPrint("Failed to create ecore_evas (%dx%d)\n", info->w, info->h); + dynamicbox_destroy_buffer(info->handle); + free(info->id); + free(info); + return NULL; + } + + ecore_evas_data_set(info->ee, "dynamic,box,info", info); + + /** + * @note + * Free callback must be prepared before use the ecore_evas_free() + */ + ecore_evas_callback_pre_free_set(info->ee, ecore_evas_free_cb); + + info->e = ecore_evas_get(info->ee); + if (!info->e) { + ErrPrint("Failed to get evas\n"); + ecore_evas_free(info->ee); + return NULL; + } + + pre_render_cb(info, NULL, NULL); + ecore_evas_alpha_set(info->ee, EINA_TRUE); + post_render_cb(info, NULL, NULL); + + ecore_evas_manual_render_set(info->ee, EINA_FALSE); + ecore_evas_resize(info->ee, info->w, info->h); + + evas_event_callback_add(info->e, EVAS_CALLBACK_RENDER_POST, post_render_cb, info); + evas_event_callback_add(info->e, EVAS_CALLBACK_RENDER_PRE, pre_render_cb, info); + + rect = evas_object_rectangle_add(info->e); + if (!rect) { + ErrPrint("Failed to create evas_object\n"); + ecore_evas_free(info->ee); + return NULL; + } + + evas_object_resize(rect, info->w, info->h); + evas_object_color_set(rect, 0, 0, 0, 0); + return rect; +} + +/* End of a file */ diff --git a/dynamicbox/src/virtual_window_wayland.c b/dynamicbox/src/virtual_window_wayland.c new file mode 100644 index 0000000..15b668a --- /dev/null +++ b/dynamicbox/src/virtual_window_wayland.c @@ -0,0 +1,449 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "dynamicbox.h" +#include "debug.h" + +#define IS_PD 1 + +#define PUBLIC __attribute__((visibility("default"))) + +/*! + * \brief + * Abstracted Data Type of Virtual Window + */ +struct info { + char *id; /*!< Identification */ + struct dynamicbox_buffer *handle; /*!< Livebox buffer handle */ + int is_hw; /*!< 1 if a buffer is created on the H/W accelerated place or 0 */ + Ecore_Evas *ee; + Evas *e; + int is_gbar; +}; + +static inline Evas_Object *get_highlighted_object(Evas_Object *obj) +{ + Evas_Object *o, *ho; + + o = evas_object_name_find(evas_object_evas_get(obj), "_elm_access_disp"); + if (!o) return NULL; + + ho = evas_object_data_get(o, "_elm_access_target"); + return ho; +} + +/*! + * \note + * Every user event (mouse) on the buffer will be passed via this event callback + */ +static int event_handler_cb(struct dynamicbox_buffer *handler, struct dynamicbox_buffer_event_data *event_info, void *data) +{ + struct info *info = data; + Elm_Access_Action_Info action_info; + Elm_Access_Action_Type action_type; + int ret = 0; + Evas_Object *parent_elm; + + + if (!info->handle) { + /* Just ignore this event */ + return 0; + } + + /*! + * \note + * Feed up events + */ + switch (event_info->type) { + case DBOX_BUFFER_EVENT_ENTER: + evas_event_feed_mouse_in(info->e, event_info->timestamp * 1000, NULL); + break; + case DBOX_BUFFER_EVENT_LEAVE: + evas_event_feed_mouse_out(info->e, event_info->timestamp * 1000, NULL); + break; + case DBOX_BUFFER_EVENT_DOWN: + /*! + * \note + * Calculate the event occurred X & Y on the buffer + */ + evas_event_feed_mouse_move(info->e, event_info->info.pointer.x, event_info->info.pointer.y, (event_info->timestamp - 0.001f) * 1000, NULL); /* + 0.1f just for fake event */ + evas_event_feed_mouse_down(info->e, 1, EVAS_BUTTON_NONE, event_info->timestamp * 1000, NULL); /* + 0.2f just for fake event */ + break; + case DBOX_BUFFER_EVENT_MOVE: + /*! + * \note + * Calculate the event occurred X & Y on the buffer + */ + evas_event_feed_mouse_move(info->e, event_info->info.pointer.x, event_info->info.pointer.y, event_info->timestamp * 1000, NULL); + break; + case DBOX_BUFFER_EVENT_UP: + evas_event_feed_mouse_move(info->e, event_info->info.pointer.x, event_info->info.pointer.y, event_info->timestamp * 1000, NULL); + evas_event_feed_mouse_up(info->e, 1, EVAS_BUTTON_NONE, (event_info->timestamp + 0.001f) * 1000, NULL); + break; + case DBOX_BUFFER_EVENT_ACCESS_HIGHLIGHT: + parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); + if (!parent_elm) { + ret = DBOX_ACCESS_STATUS_ERROR; + break; + } + memset(&action_info, 0, sizeof(action_info)); + action_type = ELM_ACCESS_ACTION_HIGHLIGHT; + /*! + * \note + * Calculate the event occurred X & Y on the buffer + */ + action_info.x = event_info->info.pointer.x; + action_info.y = event_info->info.pointer.y; + ret = elm_access_action(parent_elm, action_type, &action_info); + if (ret == EINA_TRUE) { + if (!get_highlighted_object(parent_elm)) { + LOGE("Highlighted object is not found\n"); + ret = DBOX_ACCESS_STATUS_ERROR; + } else { + LOGD("Highlighted object is found\n"); + ret = DBOX_ACCESS_STATUS_DONE; + } + } else { + LOGE("Action error\n"); + ret = DBOX_ACCESS_STATUS_ERROR; + } + break; + case DBOX_BUFFER_EVENT_ACCESS_HIGHLIGHT_NEXT: + parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); + if (!parent_elm) { + ret = DBOX_ACCESS_STATUS_ERROR; + break; + } + memset(&action_info, 0, sizeof(action_info)); + action_type = ELM_ACCESS_ACTION_HIGHLIGHT_NEXT; + action_info.highlight_cycle = EINA_FALSE; + ret = elm_access_action(parent_elm, action_type, &action_info); + ret = (ret == EINA_FALSE) ? DBOX_ACCESS_STATUS_LAST : DBOX_ACCESS_STATUS_DONE; + break; + case DBOX_BUFFER_EVENT_ACCESS_HIGHLIGHT_PREV: + parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); + if (!parent_elm) { + ret = DBOX_ACCESS_STATUS_ERROR; + break; + } + memset(&action_info, 0, sizeof(action_info)); + action_type = ELM_ACCESS_ACTION_HIGHLIGHT_PREV; + action_info.highlight_cycle = EINA_FALSE; + ret = elm_access_action(parent_elm, action_type, &action_info); + ret = (ret == EINA_FALSE) ? DBOX_ACCESS_STATUS_FIRST : DBOX_ACCESS_STATUS_DONE; + break; + case DBOX_BUFFER_EVENT_ACCESS_ACTIVATE: + parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); + if (!parent_elm) { + ret = DBOX_ACCESS_STATUS_ERROR; + break; + } + memset(&action_info, 0, sizeof(action_info)); + action_type = ELM_ACCESS_ACTION_ACTIVATE; + ret = elm_access_action(parent_elm, action_type, &action_info); + ret = (ret == EINA_FALSE) ? DBOX_ACCESS_STATUS_ERROR : DBOX_ACCESS_STATUS_DONE; + break; + case DBOX_BUFFER_EVENT_ACCESS_ACTION_UP: + parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); + if (!parent_elm) { + ret = DBOX_ACCESS_STATUS_ERROR; + break; + } + memset(&action_info, 0, sizeof(action_info)); + action_type = ELM_ACCESS_ACTION_UP; + ret = elm_access_action(parent_elm, action_type, &action_info); + ret = (ret == EINA_FALSE) ? DBOX_ACCESS_STATUS_ERROR : DBOX_ACCESS_STATUS_DONE; + break; + case DBOX_BUFFER_EVENT_ACCESS_ACTION_DOWN: + parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); + if (!parent_elm) { + ret = DBOX_ACCESS_STATUS_ERROR; + break; + } + memset(&action_info, 0, sizeof(action_info)); + action_type = ELM_ACCESS_ACTION_DOWN; + ret = elm_access_action(parent_elm, action_type, &action_info); + ret = (ret == EINA_FALSE) ? DBOX_ACCESS_STATUS_ERROR : DBOX_ACCESS_STATUS_DONE; + break; + case DBOX_BUFFER_EVENT_ACCESS_SCROLL_UP: + parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); + if (!parent_elm) { + ret = DBOX_ACCESS_STATUS_ERROR; + break; + } + memset(&action_info, 0, sizeof(action_info)); + action_type = ELM_ACCESS_ACTION_SCROLL; + action_info.x = event_info->info.pointer.x; + action_info.y = event_info->info.pointer.y; + action_info.mouse_type = 2; + ret = elm_access_action(parent_elm, action_type, &action_info); + ret = (ret == EINA_FALSE) ? DBOX_ACCESS_STATUS_ERROR : DBOX_ACCESS_STATUS_DONE; + break; + case DBOX_BUFFER_EVENT_ACCESS_SCROLL_MOVE: + parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); + if (!parent_elm) { + ret = DBOX_ACCESS_STATUS_ERROR; + break; + } + memset(&action_info, 0, sizeof(action_info)); + action_type = ELM_ACCESS_ACTION_SCROLL; + action_info.x = event_info->info.pointer.x; + action_info.y = event_info->info.pointer.y; + action_info.mouse_type = 1; + ret = elm_access_action(parent_elm, action_type, &action_info); + ret = (ret == EINA_FALSE) ? DBOX_ACCESS_STATUS_ERROR : DBOX_ACCESS_STATUS_DONE; + break; + case DBOX_BUFFER_EVENT_ACCESS_SCROLL_DOWN: + parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); + if (!parent_elm) { + ret = DBOX_ACCESS_STATUS_ERROR; + break; + } + memset(&action_info, 0, sizeof(action_info)); + action_type = ELM_ACCESS_ACTION_SCROLL; + action_info.x = event_info->info.pointer.x; + action_info.y = event_info->info.pointer.y; + action_info.mouse_type = 0; + ret = elm_access_action(parent_elm, action_type, &action_info); + ret = (ret == EINA_FALSE) ? DBOX_ACCESS_STATUS_ERROR : DBOX_ACCESS_STATUS_DONE; + break; + case DBOX_BUFFER_EVENT_ACCESS_UNHIGHLIGHT: + parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); + if (!parent_elm) { + ret = DBOX_ACCESS_STATUS_ERROR; + break; + } + memset(&action_info, 0, sizeof(action_info)); + action_type = ELM_ACCESS_ACTION_UNHIGHLIGHT; + ret = elm_access_action(parent_elm, action_type, &action_info); + ret = (ret == EINA_FALSE) ? DBOX_ACCESS_STATUS_ERROR : DBOX_ACCESS_STATUS_DONE; + break; + case DBOX_BUFFER_EVENT_KEY_DOWN: + parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); + if (!parent_elm) { + ret = DBOX_ACCESS_STATUS_ERROR; + break; + } + + ret = DBOX_KEY_STATUS_ERROR; + break; + case DBOX_BUFFER_EVENT_KEY_UP: + parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); + if (!parent_elm) { + ret = DBOX_ACCESS_STATUS_ERROR; + break; + } + + ret = DBOX_KEY_STATUS_ERROR; + break; + case DBOX_BUFFER_EVENT_KEY_FOCUS_IN: + parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); + if (!parent_elm) { + ret = DBOX_ACCESS_STATUS_ERROR; + break; + } + + ret = DBOX_KEY_STATUS_ERROR; + break; + case DBOX_BUFFER_EVENT_KEY_FOCUS_OUT: + parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); + if (!parent_elm) { + ret = DBOX_ACCESS_STATUS_ERROR; + break; + } + + ret = DBOX_KEY_STATUS_ERROR; + break; + default: + LOGD("Unhandled buffer event (%d)\n", event_info->type); + break; + } + + return ret; +} + +static void *alloc_fb(void *data, int size) +{ + struct info *info = data; + void *buffer; + int width = 0; + int height = 0; + + if (info->ee == NULL) { + width = 1; + height = 1; + } else { + ecore_evas_geometry_get(info->ee, NULL, NULL, &width, &height); + } + + /*! + * Acquire a buffer for canvas. + */ + info->handle = dynamicbox_acquire_buffer(info->id, info->is_gbar, + width, height, + event_handler_cb, info); + + /*! + * If it supports the H/W accelerated buffer, + * Use it. + */ + if (dynamicbox_support_hw_buffer(info->handle)) { + if (dynamicbox_create_hw_buffer(info->handle) == 0) { + buffer = dynamicbox_buffer_hw_buffer(info->handle); + if (buffer) { + LOGD("HW Accelerated buffer is created\n"); + info->is_hw = 1; + return buffer; + } + } + + LOGE("Failed to allocate HW Accelerated buffer\n"); + } + + /*! + * Or use the buffer of a S/W backend. + */ + buffer = dynamicbox_ref_buffer(info->handle); + LOGD("SW buffer is created\n"); + info->is_hw = 0; + return buffer; +} + +static void free_fb(void *data, void *ptr) +{ + struct info *info = data; + + if (!info->handle) { + return; + } + + if (info->is_hw) { + if (dynamicbox_destroy_hw_buffer(info->handle) == 0) { + LOGD("HW Accelerated buffer is destroyed\n"); + goto out; + } + } + + dynamicbox_unref_buffer(ptr); + LOGD("SW buffer is destroyed\n"); +out: + dynamicbox_release_buffer(info->handle); + info->handle = NULL; +} + +static void pre_render_cb(void *data, Evas *e, void *event_info) +{ + struct info *info = data; + + if (!info->handle) { + return; + } + + if (info->is_hw) { + dynamicbox_buffer_pre_render(info->handle); + } +} + +static void post_render_cb(void *data, Evas *e, void *event_info) +{ + struct info *info = data; + + if (!info->handle) { + return; + } + + if (info->is_hw) { + dynamicbox_buffer_post_render(info->handle); + } else { + dynamicbox_sync_buffer(info->handle); + } +} + +PUBLIC void *dynamicbox_get_evas_object(const char *id, int is_gbar) +{ + struct info *info; + Evas_Object *rect; + + if (!id) { + ErrPrint("Invalid parameter\n"); + return NULL; + } + + info = calloc(1, sizeof(*info)); + if (!info) { + ErrPrint("Heap: %s\n", strerror(errno)); + return NULL; + } + + info->id = strdup(id); + if (!info->id) { + ErrPrint("Heap: %s\n", strerror(errno)); + free(info); + return NULL; + } + + info->is_gbar = is_gbar; + + info->ee = ecore_evas_buffer_allocfunc_new(1, 1, alloc_fb, free_fb, info); + if (!info->ee) { + ErrPrint("Failed to create ecore_evas (%dx%d)\n", 1, 1); + free(info->id); + free(info); + return NULL; + } + + pre_render_cb(info, NULL, NULL); + ecore_evas_alpha_set(info->ee, EINA_TRUE); + post_render_cb(info, NULL, NULL); + + ecore_evas_data_set(info->ee, "dynamic,box,info", info); + + ecore_evas_manual_render_set(info->ee, EINA_FALSE); + ecore_evas_resize(info->ee, 1, 1); + + info->e = ecore_evas_get(info->ee); + if (!info->e) { + ErrPrint("Failed to get evas\n"); + ecore_evas_free(info->ee); + return NULL; + } + + evas_event_callback_add(info->e, EVAS_CALLBACK_RENDER_POST, post_render_cb, info); + evas_event_callback_add(info->e, EVAS_CALLBACK_RENDER_PRE, pre_render_cb, info); + + rect = evas_object_rectangle_add(info->e); + if (!rect) { + ErrPrint("Failed to create evas_object\n"); + ecore_evas_free(info->ee); + return NULL; + } + + evas_object_resize(rect, 1, 1); + evas_object_color_set(rect, 0, 0, 0, 0); + return rect; +} + +/* End of a file */ diff --git a/include/livebox.h b/include/livebox.h deleted file mode 100644 index 4baf9f5..0000000 --- a/include/livebox.h +++ /dev/null @@ -1,771 +0,0 @@ -/* - * Copyright 2013 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __LIVEBOX_HELPER_H -#define __LIVEBOX_HELPER_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -/** - * \addtogroup CAPI_LIVEBOX_HELPER_MODULE - * \{ - */ - -/*! - * \brief Defined by provider - */ -struct livebox_buffer; - -/*! - * \brief - * Return values of livebox programming interfaces. - */ -/*! - * \brief - * Operation is successfully done - */ -extern const int DONE; - -/*! - * \brief - * Contents is updated - */ -extern const int OUTPUT_UPDATED; - -/*! - * \brief - * Need to call the livebox_need_to_update and livebox_update_content - */ -extern const int NEED_TO_SCHEDULE; - -/*! - * Need to do force update - */ -extern const int FORCE_TO_SCHEDULE; - -/*! - * \brief - * Need to create a new instance - */ -extern const int NEED_TO_CREATE; - -/*! - * \brief - * Need to destroy this instance - */ -extern const int NEED_TO_DESTROY; - -/*! - * \brief - * Need to update - */ -extern const int NEED_TO_UPDATE; - -/*! - * \brief - * Using network - */ -extern const int USE_NET; - -/*! - * \brief - * System font is changed - */ -extern const int LB_SYS_EVENT_FONT_CHANGED; - -/*! - * \brief - * System language is changed - */ -extern const int LB_SYS_EVENT_LANG_CHANGED; - -/*! - * \brief - * System time is changed - */ -extern const int LB_SYS_EVENT_TIME_CHANGED; - -/*! - * \brief - * Region changed - */ -extern const int LB_SYS_EVENT_REGION_CHANGED; - -/*! - * \brief - * Livebox is paused - */ -extern const int LB_SYS_EVENT_PAUSED; - -/*! - * \brief - * Livebox is resumed - */ -extern const int LB_SYS_EVENT_RESUMED; - -/*! - * \brief - * MMC Status change event - */ -extern const int LB_SYS_EVENT_MMC_STATUS_CHANGED; - -/*! - * \brief - * COLOR BLOCK - */ -#define LB_DESC_TYPE_COLOR "color" - -/*! - * \brief - * TEXT BLOCK - */ -#define LB_DESC_TYPE_TEXT "text" - -/*! - * \brief - * IMAGE BLOCK - */ -#define LB_DESC_TYPE_IMAGE "image" - -/*! - * \brief - * SIGNAL BLOCK - */ -#define LB_DESC_TYPE_SIGNAL "signal" - -/*! - * \brief - * INFO BLOCK - */ -#define LB_DESC_TYPE_INFO "info" - -/*! - * \brief - * DRAG BLOCK - */ -#define LB_DESC_TYPE_DRAG "drag" - -/*! - * \brief - * SCRIPT SCRIPT - */ -#define LB_DESC_TYPE_SCRIPT "script" - -/*! - * \brief - * ACCESSIBILITY INFORMATION BLOCK - */ -#define LB_DESC_TYPE_ACCESS "access" - -/*! - * \brief - * Accessibility operation. - */ -#define LB_DESC_TYPE_ACCESS_OPERATION "access,operation" - -/*! - * \brief - * Set highlight on specified part - */ -#define LB_DESC_DATA_ACCESS_OPERATION_HL_SET "set,hl" - -/*! - * \brief - * Remove highlight from specified part - */ -#define LB_DESC_DATA_ACCESS_OPERATION_HL_UNSET "unset,hl" - -/*! - * \brief - * Move the highlight to next part - */ -#define LB_DESC_DATA_ACCESS_OPERATION_HL_NEXT "next,hl" - -/*! - * \brief - * Move the highlight to previous part - */ -#define LB_DESC_DATA_ACCESS_OPERATION_HL_PREV "prev,hl" - -/*! - * \brief - * Reset the chain of accessibility highlight list. - */ -#define LB_DESC_DATA_ACCESS_OPERATION_RESET "reset,focus" - -/*! - * \brief - * Specify the highligt move option. - * If the highlight list reaches to the last object, move back to the first object. - */ -#define LB_DESC_OPTION_ACCESS_HL_LOOP "cycle" - -/*! - * \brief - * [Default] Specify the highlight move option. - * If the highlight list reaches to the last object(or the first object), - * the "prev,hl", "next,hl" will be failed. - */ -#define LB_DESC_OPTION_ACCESS_HL_NOLOOP "no,cycle" - -/*! - * \brief - * Extra event informatino for livebox_content_event interface function - */ -#ifndef __PROVIDER_H -struct event_info { - struct { - double x; - double y; - int down; - } pointer; /*!< Down/Up state and mouse position */ - - struct { - double sx; - double sy; - double ex; - double ey; - } part; /*!< Geometry of event received part */ -}; -#endif - -/*! - * Livebox description data handle structure. - */ -struct livebox_desc; - -/*! - * \brief Update a description file. - * \details explain api more detail - * \remarks must be used only by Inhouse livebox - * \param[in] filename - * \param[in] for_pd - * \return handle - * \retval Handle of desc instance - * \pre Should be loaded by data-provider-slave - * \post Should be destroyed(flushed) using livebox_desc_close API - * \see livebox_desc_close - */ -extern struct livebox_desc *livebox_desc_open(const char *filename, int for_pd); - -/*! - * \brief Complete the description file updating - * \details Only if this API is called, the description data will be applied to the content of livebox(or PD). - * \remarks must be used only by Inhouse livebox - * \param[in] handle Handle which is created by livebox_desc_open function - * \return int - * \retval LB_STATUS_SUCCESS If the flushing description data is successfully done. - * \retval LB_STATUS_ERROR_INVALID If the given handle is not valid. - * \pre handle must be created by livebox_desc_open - * \post Handle must not be used after return from this function - * \see livebox_desc_open - */ -extern int livebox_desc_close(struct livebox_desc *handle); - -/*! - * \brief - * Set the category information of current description data - * \details - * Create a new description block for updating category information of layout object - * \remarks N/A - * \param[in] handle Handle which is created by livebox_desc_open function - * \param[in] id Id string of target object. - * \param[in] category Category string that will be used by layout object - * \return int - * \retval LB_STATUS_ERROR_INVALID Invalid handle - * \retval LB_STATUS_ERROR_MEMORY Memory is not enough to add this block - * \retval index Index(>=0) of added block, which can be used by livebox_desc_set_id - * \pre Must be called after create a handle using livebox_desc_open. - * \post N/A - * \see livebox_desc_set_id - */ -extern int livebox_desc_set_category(struct livebox_desc *handle, const char *id, const char *category); - -/*! - * \brief - * Set the content size - * \details - * Set the content size of layout - * \remarks N/A - * \param[in] handle Handle which is created by livebox_desc_open function - * \param[in] id Id string of target object. - * \param[in] w Width in pixel - * \param[in] h Height in pixel - * \return int - * \retval LB_STATUS_ERROR_INVALID Invalid argument - * \retval LB_STATUS_ERROR_MEMORY Not enough memory to add a new block - * \retval index Index(>=0) of added block Successfully added - * \pre N/A - * \post N/A - * \see livebox_desc_open - * \see livebox_desc_set_id - */ -extern int livebox_desc_set_size(struct livebox_desc *handle, const char *id, int w, int h); - -/*! - * \brief - * Set the target id of given block - * Only available for the script block - * \details - * N/A - * \remarks N/A - * \param[in] handle Handle which is created by livebox_desc_open function - * \param[in] idx Index of target block - * \param[in] id Id String which will be used by other livebox_desc_XXX functions - * \return int - * \retval LB_STATUS_SUCCESS Id is successfully updated for given idx of desc block - * \retval LB_STATUS_ERROR_INVALID Invalid argument - * \retval LB_STATUS_ERROR_NOT_EXIST Given index of desc block is not exists - * \pre desc block should be exists which has given index "idx" - * \post specified Id string("id") can be used by other livebox_desc_XXXX functions - * \see livebox_desc_open - * \see livebox_desc_set_id - */ -extern int livebox_desc_set_id(struct livebox_desc *handle, int idx, const char *id); - -/*! - * \brief Add a new block - * \details N/A - * \remarks N/A - * \param[in] handle Handle which is created by livebox_desc_open function - * \param[in] id ID of source script object - * \param[in] type image|text|script|signal|... - * \param[in] part target part to update with given content(data) - * \param[in] data content for specified part - * \param[in] option option for the block. (script: group, image: option, ...) - * \return idx Index of current description block - * \retval LB_STATUS_ERROR_INVALID Invalid argument - * \retval LB_STATUS_ERROR_MEMORY Not enough memory to add a new desc block - * \retval Index index(>=0) of added desc block - * \pre handle must be created using livebox_desc_open - * \post N/A - * \see livebox_desc_set_id - * \see livebox_desc_del_block - */ -extern int livebox_desc_add_block(struct livebox_desc *handle, const char *id, const char *type, const char *part, const char *data, const char *option); - -/*! - * \brief Delete a added block - * \details - * If you discard the added desc block, use this API and the index of created desc block. - * \remarks N/A - * \param[in] handle Handle which is created by livebox_desc_open function - * \param[in] idx Index of added block, returned from livebox_desc_add_block, livebox_desc_set_size, livebox_desc_set_category, ... - * \return int - * \retval LB_STATUS_SUCCESS Successfully deleted - * \retval LB_STATUS_ERROR_NOT_EXIST Given index of desc block is not exists - * \pre index must be exists. - * \post N/A - * \see livebox_desc_add_block - * \see livebox_desc_open - */ -extern int livebox_desc_del_block(struct livebox_desc *handle, int idx); - -/*! - * \brief Notify the updated content to the provider. - * \details - * Forcely notify the updated contents. - * This function can be used from async callback function to notify the updated content. - * \remarks N/A - * \param[in] id Instance Id which is passed to you via the first parameter of every livebox_XXXX interface functions. - * \param[in] is_pd 1 for updating content of PD or 0(for content of LB). - * \return int - * \retval LB_STATUS_ERROR_MEMORY Not enough memory - * \retval LB_STATUS_ERROR_INVALID Invalid argument - * \retval LB_STATUS_ERROR_IO I/O failed, Cannot access given resource file(id) - * \retval LB_STATUS_SUCCESS Successfully notified - * \pre This API only can be used after loaded into the data-provider-slave process. - * \post N/A - * \see N/A - */ -extern int livebox_content_is_updated(const char *id, int is_pd); - -/*! - * \brief Replace "\n"(new line character) with <br> - * \details - * This utility function is used to replace all NEW LINE CHARACTER("\n") with <br> tag. - * \remarks N/A - * \param[in] str Source string - * \return char * - * \retval String that is allocted in the heap - * \retval NULL if it fails to replace string - * \pre N/A - * \post Returned string must has to be free'd by user manually. - * \see N/A - */ -extern char *livebox_util_nl2br(const char *str); - - -/*! - * \brief - * Interfaces for direct buffer management (Available only for the PD area) - */ -#ifndef __PROVIDER_BUFFER_H -/*! - * \note - * This enumeration value should be sync'd with provider - */ -enum buffer_event { - BUFFER_EVENT_ENTER, /*!< Mouse cursor enter */ - BUFFER_EVENT_LEAVE, /*!< Mouse cursor leave */ - BUFFER_EVENT_DOWN, /*!< Mouse down */ - BUFFER_EVENT_MOVE, /*!< Mouse move */ - BUFFER_EVENT_UP, /*!< Mouse up */ - - BUFFER_EVENT_KEY_DOWN, /*!< Key down */ - BUFFER_EVENT_KEY_UP, /*!< Key up */ - BUFFER_EVENT_KEY_FOCUS_IN, /*!< Key focus in */ - BUFFER_EVENT_KEY_FOCUS_OUT, /*!< Key focus out */ - - BUFFER_EVENT_HIGHLIGHT, /*!< Accessibility - Highlight */ - BUFFER_EVENT_HIGHLIGHT_NEXT, /*!< Accessibility - Move highlight to next */ - BUFFER_EVENT_HIGHLIGHT_PREV, /*!< Accessibility - Move highlight to prev */ - BUFFER_EVENT_ACTIVATE, /*!< Accessibility - Activate the highlighted object */ - BUFFER_EVENT_ACTION_UP, /*!< Accessibility - Make UP action */ - BUFFER_EVENT_ACTION_DOWN, /*!< Accessibility - Make Down action */ - BUFFER_EVENT_SCROLL_UP, /*!< Accessibility - Scroll up */ - BUFFER_EVENT_SCROLL_MOVE, /*!< Accessibility - Scroll move */ - BUFFER_EVENT_SCROLL_DOWN, /*!< Accessibility - Scroll down */ - BUFFER_EVENT_UNHIGHLIGHT, /*!< Accessibility - Remove highlight */ - - BUFFER_EVENT_ON_HOLD, /*!< To prevent from generating mouse clicked event */ - BUFFER_EVENT_OFF_HOLD, /*!< Stopped holding. */ - BUFFER_EVENT_ON_SCROLL, /*!< On scrolling */ - BUFFER_EVENT_OFF_SCROLL /*!< Scrolling stopped */ -}; - -struct buffer_event_data { - enum buffer_event type; /*!< Mouse, Keyboard, Accessibility event type */ - double timestamp; /*!< Timestamp of events */ - - union input_data { - struct mouse { - int x; /*!< If the event type is for accessibility or mouse, coordinates of X for pointer */ - int y; /*!< If the event type is for accessibility or mouse, coordinates of Y for pointer */ - } pointer; - - unsigned int keycode; /*!< If the event type is for keyboard, the value of keycode */ - } info; -}; -#endif - -/*! - * \brief - * Acquire a buffer for PD or LB, Currently, we only supporting the PD. - * \details N/A - * \remarks N/A - * \param[in] id Id of a livebox instance - * \param[in] is_pd 1 for PD or 0 for livebox - * \param[in] width Width in pixel - * \param[in] height Height in pixel - * \param[in] handler Event handling callback - * \param[in] data user data for event handling callback - * \return handler Buffer handle - * \retval NULL Failed to acquire buffer - * \retval Handle object - * \pre - * Given instance must be specify its type as buffer. or this API will be fail - * \post - * Allocated buffer object must be released via livebox_release_Buffer - * \see livebox_release_buffer - * \sa livebox_acquire_buffer_NEW - */ -extern struct livebox_buffer *livebox_acquire_buffer(const char *id, int is_pd, int width, int height, int (*handler)(struct livebox_buffer *, enum buffer_event, double, double, double, void *), void *data); -extern struct livebox_buffer *livebox_acquire_buffer_NEW(const char *id, int is_pd, int width, int height, int pixels, int (*handler)(struct livebox_buffer *, struct buffer_event_data *, void *), void *data); - -/*! - * \brief Acquire the ID of pixmap resource - * Only if the provider uses pixmap for providing render buffer. - * \details N/A - * \remarks Pixmap Id can be destroyed if you call the livebox_release_buffer. than this pixmap Id is not guaranteed to use. - * \param[in] handle Buffer handle - * \return unsigned - * \retval positive Pixmap Id - * \retval 0 failed to get pixmap Id. - * \pre The system must be set to use the pixmap method for content sharing - * \post N/A - * \see livebox_acquire_buffer - */ -extern unsigned long livebox_pixmap_id(struct livebox_buffer *handle); - -/*! - * \brief Release the buffer of livebox - * \details N/A - * \remarks N/A - * \param[in] handle Buffer handle - * \return int - * \retval LB_STATUS_ERROR_INVALID Invalid argument - * \retval LB_STATUS_SUCCESS Successfully released - * \pre handle must be created using livebox_acquire_buffer. - * \post N/A - * \see livebox_acquire_buffer - * \sa livebox_release_buffer_NEW - */ -extern int livebox_release_buffer(struct livebox_buffer *handle); -extern int livebox_release_buffer_NEW(struct livebox_buffer *handle); - -/*! - * \brief Get the address of S/W render buffer. - * If you try to use this, after create_hw_buffer, you will get NULL - * \details N/A - * \remarks N/A - * \param[in] handle Buffer handle - * \return void* address of the render buffer - * \retval NULL if it falis to get buffer address - * \retval address if it succeed to get the buffer address - * \pre N/A - * \post N/A - * \see livebox_unref_buffer - */ -extern void *livebox_ref_buffer(struct livebox_buffer *handle); - -/*! - * \brief Release the S/W render buffer. - * \details N/A - * \remarks N/A - * \param[in] buffer Address of render buffer - * \return int - * \retval LB_STATUS_ERROR_INVALID Invalid handle - * \retval LB_STATUS_SUCCESS Successfully unref'd - * \pre livebox_ref_buffer must be called - * \post N/A - * \see livebox_ref_buffer - */ -extern int livebox_unref_buffer(void *buffer); - -/*! - * \brief Sync the updated buffer - * This is only needed for non-H/W accelerated buffer - * \details N/A - * \remarks N/A - * \param[in] handle Buffer handle - * \return int - * \retval LB_STATUS_SUCCESS Successfully sync'd - * \retval LB_STATUS_ERROR_INVALID Invalid argument - * \pre N/A - * \post N/A - * \see livebox_acquire_buffer - */ -extern int livebox_sync_buffer(struct livebox_buffer *handle); - -/*! - * \brief Request schedule the update operation to a provider. - * \details - * \remarks N/A - * \param[in] id Livebox Id - * \return int 0 if succeed or errno < 0 - * \retval LB_STATUS_SUCCESS Successfully triggered - * \retval LB_STATUS_ERROR_INVALID Invalid argument - * \retval LB_STATUS_ERROR_MEMORY Not enough memory - * \retval LB_STATUS_ERROR_NOT_EXIST Given id instance is not exist - * \pre N/A - * \post N/A - * \see N/A - */ -extern int livebox_request_update(const char *id); - -/*! - * \brief Checking wether the livebox support H/W acceleration or not. - * \details - * \remarks N/A - * \param[in] handle Buffer handle. - * \return int - * \retval 1 if the buffer handle support the H/W acceleration buffer - * \retval 0 if it doesn not supported - * \pre N/A - * \post N/A - * \see livebox_acquire_buffer - */ -extern int livebox_support_hw_buffer(struct livebox_buffer *handle); - -/*! - * \brief Create the H/W accelerated buffer. - * \details Create the H/W accelerated buffer - * \remarks N/A - * \param[in] handle Buffer handle - * \return int - * \retval LB_STATUS_ERROR_ALREADY H/W buffer is already created - * \retval LB_STATUS_ERROR_INVALID Invalid argument - * \retval LB_STATUS_SUCCESS Successfully created - * \pre Must be checked whether the H/W buffer is supported or not. - * \post Must be destroyed if it is not necessary - * \see livebox_support_hw_buffer - */ -extern int livebox_create_hw_buffer(struct livebox_buffer *handle); - -/*! - * \brief Destroy the H/W accelerated buffer. - * \details N/A - * \remarks N/A - * \param[in] handle Buffer handle - * \return int - * \retval LB_STATUS_SUCCESS Successfully destroyed - * \retval LB_STATUS_ERROR_INVALID Invalid argument - * \pre Must be created h/w buffer using livebox_create_hw_buffer - * \post N/A - * \see livebox_create_hw_buffer - */ -extern int livebox_destroy_hw_buffer(struct livebox_buffer *handle); - -/*! - * \brief Get the address of accelerated H/W buffer - * \details N/A - * \remarks N/A - * \param[in] handle Buffer handle - * \return void * - * \retval NULL failed to get H/W accelerated buffer address - * \retval addr H/W accelerated buffer address - * \pre N/A - * \post N/A - * \see livebox_create_hw_buffer - */ -extern void *livebox_buffer_hw_buffer(struct livebox_buffer *handle); - -/*! - * \brief Pre-processing for rendering content. - * This is only needed for accessing H/W accelerated buffer. - * \details N/A - * \remarks N/A - * \param[in] handle Buffer handle - * \return int - * \retval LB_STATUS_ERROR_INVALID Invalid handle - * \retval LB_STATUS_SUCCESS Successfully done - * \pre N/A - * \post livebox_buffer_post_render must be called after the rendering (accessing buffer) is completed. - * \see livebox_support_hw_buffer - * \see livebox_buffer_post_render - */ -extern int livebox_buffer_pre_render(struct livebox_buffer *handle); - -/*! - * \brief Post-processing for rendering content. - * \details N/A - * \remarks N/A - * \param[in] handle Buffer handle - * \return integer 0 if succeed or errno < 0 - * \retval LB_STATUS_SUCCESS if succeed - * \retval LB_STATUS_ERROR_INVALID Invalid argument - * \pre livebox_buffer_pre_render must be called - * \post N/A - * \see livebox_support_hw_buffer - * \see livebox_buffer_pre_render - */ -extern int livebox_buffer_post_render(struct livebox_buffer *handle); - -/*! - * \brief - * Deprecated API set. -extern Evas_Object *livebox_snapshot_window_add(const char *id, int size_type); -extern int livebox_snapshot_window_flush(Evas_Object *snapshot_win, double timeout, void (*flush_cb)(Evas_Object *snapshot_window, const char *id, int status, void *data), void *data); -extern int livebox_snapshot_window_del(Evas_Object *snapshot_win); -*/ - -/*! - * \brief Create an Evas_Object to create a elm_win object - * \details Creating a new Evas_Object using livebox frame buffer. - * \remarks N/A - * \param[in] id Instance Id - * \param[in] is_pd 1 if this object is created for PD or 0 (for LB) - * \return Evas_Object* Evas Object - * \retval Address Valid evas object - * \retval NULL failed to create - * \pre N/A - * \post N/A - * \see livebox_set_elm_window - */ -extern Evas_Object *livebox_get_evas_object(const char *id, int is_pd); - -/*! - * \brief Send a request to the viewer (homescreen) to close the PD. - * \details Even though you call this function. the homescreen can ignore it. - * \remarks - * \param[in] pkgname Livebox Package Id - * \param[in] id Livebox Instance Id - * \param[in] reason LB_STATUS_SUCCESS(0) - * \return int - * \retval LB_STATUS_ERROR_INVALID Invalid parameters - * \retval LB_STATUS_ERROR_MEMORY Out of memory - * \retval LB_STATUS_ERROR_FAULT Failed to send a request - * \retval LB_STATUS_SUCCESS Successfully requested - * \pre N/A - * \post N/A - * \see - */ -extern int livebox_request_close_pd(const char *pkgname, const char *id, int reason); - -/*! - * \brief Send a freeze request to the viewer (homescreen) - * \details - * The viewer will get this request via event callback. - * Then it should freeze its scroller or stop moving the livebox. - * \remarks If the viewer doesn't care this request, this will has no effect. - * \param[in] pkgname Livebox Package Id - * \param[in] id Livebox Instance Id - * \return int - * \retval LB_STATUS_ERROR_INVALID Invalid parameters - * \retval LB_STATUS_ERROR_MEMORY Out of memory - * \retval LB_STATUS_ERROR_FAULT Failed to send requet - * \retval LB_STATUS_SUCCESS Successfully requested - * \pre N/A - * \post N/A - * \see livebox_release_scroller - */ -extern int livebox_freeze_scroller(const char *pkgname, const char *id); - -/*! - * \brief Send a release request to the viewer (homescreen) - * \details - * The viewer will get this request via event callback. - * Then it should release its scroller or continue moving the livebox. - * \remarks If the viewer doesn't care this request, this will has no effect. - * \param[in] pkgname Livebox Package Id - * \param[in] id Livebox Instance Id - * \retval LB_STATUS_ERROR_INVALID Invalid parameters - * \retval LB_STATUS_ERROR_MEMORY Out of memory - * \retval LB_STATUS_ERROR_FAULT Failed to send requet - * \retval LB_STATUS_SUCCESS Successfully requested - * \pre N/A - * \post N/A - * \see livebox_freeze_scroller - */ -extern int livebox_release_scroller(const char *pkgname, const char *id); - -/*! - * \brief Get the configuration status of premultiplied alpha. - * \details - * If the system uses the premultiplied alpha for content, - * This function will returns 1. - * \remarks This function only works with the inhouse provider. - * \return status of premultiplied alpha. - * \retval 1 Content rendered with premultiplied alpha. - * \retval 0 Content doesn't rendered with premultiplied alpha. - */ -extern int livebox_conf_premultiplied_alpha(void); - -/*! - * \} - */ - -#ifdef __cplusplus -} -#endif - -#endif -/* End of a file */ diff --git a/livebox/CMakeLists.txt b/livebox/CMakeLists.txt new file mode 100644 index 0000000..373e05a --- /dev/null +++ b/livebox/CMakeLists.txt @@ -0,0 +1,56 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +PROJECT(livebox C) + +SET(PREFIX ${CMAKE_INSTALL_PREFIX}) +SET(EXEC_PREFIX "\${prefix}") +SET(PROJECT_NAME "${PROJECT_NAME}") +SET(LIBDIR "\${exec_prefix}/lib") +SET(INCLUDEDIR "\${prefix}/include/${PROJECT_NAME}") +SET(VERSION_MAJOR 1) +SET(VERSION "${VERSION_MAJOR}.0.0") + +set(CMAKE_SKIP_BUILD_RPATH true) + +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include) + +INCLUDE(FindPkgConfig) +pkg_check_modules(old_pkgs REQUIRED + dlog + evas + ecore + elementary + livebox-service +) + +FOREACH(flag ${old_pkgs_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) + +SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fvisibility=hidden") + +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -g") + +ADD_DEFINITIONS("-DPREFIX=\"${PREFIX}\"") +ADD_DEFINITIONS("-DLOG_TAG=\"LIVEBOX\"") +ADD_DEFINITIONS("-DNDEBUG") +ADD_DEFINITIONS("-D_USE_ECORE_TIME_GET") +ADD_DEFINITIONS("-DMASTER_PKGNAME=\"data-provider-master\"") +ADD_DEFINITIONS("-DSLAVE_PKGNAME=\"com.samsung.data-provider-slave\"") + +SET (BUILD_SOURCE + src/livebox.c +) + +ADD_LIBRARY(${PROJECT_NAME} SHARED ${BUILD_SOURCE}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES SOVERSION ${VERSION_MAJOR}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES VERSION ${VERSION}) +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${old_pkgs_LDFLAGS} "-lpthread") + +INSTALL(TARGETS ${PROJECT_NAME} DESTINATION lib) + +CONFIGURE_FILE(${PROJECT_NAME}.pc.in ${PROJECT_NAME}.pc @ONLY) +SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${PROJECT_NAME}.pc") +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc DESTINATION lib/pkgconfig) +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/livebox.h DESTINATION include/${PROJECT_NAME}) +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/livebox_product.h DESTINATION include/${PROJECT_NAME}) +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE DESTINATION /usr/share/license RENAME "lib${PROJECT_NAME}") diff --git a/livebox/LICENSE b/livebox/LICENSE new file mode 100644 index 0000000..571fe79 --- /dev/null +++ b/livebox/LICENSE @@ -0,0 +1,206 @@ +Flora License + +Version 1.1, April, 2013 + +http://floralicense.org/license/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, +and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by +the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and +all other entities that control, are controlled by, or are +under common control with that entity. For the purposes of +this definition, "control" means (i) the power, direct or indirect, +to cause the direction or management of such entity, +whether by contract or otherwise, or (ii) ownership of fifty percent (50%) +or more of the outstanding shares, or (iii) beneficial ownership of +such entity. + +"You" (or "Your") shall mean an individual or Legal Entity +exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, +including but not limited to software source code, documentation source, +and configuration files. + +"Object" form shall mean any form resulting from mechanical +transformation or translation of a Source form, including but +not limited to compiled object code, generated documentation, +and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, +made available under the License, as indicated by a copyright notice +that is included in or attached to the work (an example is provided +in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, +that is based on (or derived from) the Work and for which the editorial +revisions, annotations, elaborations, or other modifications represent, +as a whole, an original work of authorship. For the purposes of this License, +Derivative Works shall not include works that remain separable from, +or merely link (or bind by name) to the interfaces of, the Work and +Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original +version of the Work and any modifications or additions to that Work or +Derivative Works thereof, that is intentionally submitted to Licensor +for inclusion in the Work by the copyright owner or by an individual or +Legal Entity authorized to submit on behalf of the copyright owner. +For the purposes of this definition, "submitted" means any form of +electronic, verbal, or written communication sent to the Licensor or +its representatives, including but not limited to communication on +electronic mailing lists, source code control systems, and issue +tracking systems that are managed by, or on behalf of, the Licensor +for the purpose of discussing and improving the Work, but excluding +communication that is conspicuously marked or otherwise designated +in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity +on behalf of whom a Contribution has been received by Licensor and +subsequently incorporated within the Work. + +"Tizen Certified Platform" shall mean a software platform that complies +with the standards set forth in the Tizen Compliance Specification +and passes the Tizen Compliance Tests as defined from time to time +by the Tizen Technical Steering Group and certified by the Tizen +Association or its designated agent. + +2. Grant of Copyright License. Subject to the terms and conditions of +this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable +copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the +Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of +this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable +(except as stated in this section) patent license to make, have made, +use, offer to sell, sell, import, and otherwise transfer the Work +solely as incorporated into a Tizen Certified Platform, where such +license applies only to those patent claims licensable by such +Contributor that are necessarily infringed by their Contribution(s) +alone or by combination of their Contribution(s) with the Work solely +as incorporated into a Tizen Certified Platform to which such +Contribution(s) was submitted. If You institute patent litigation +against any entity (including a cross-claim or counterclaim +in a lawsuit) alleging that the Work or a Contribution incorporated +within the Work constitutes direct or contributory patent infringement, +then any patent licenses granted to You under this License for that +Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the +Work or Derivative Works thereof pursuant to the copyright license +above, in any medium, with or without modifications, and in Source or +Object form, provided that You meet the following conditions: + + 1. You must give any other recipients of the Work or Derivative Works + a copy of this License; and + 2. You must cause any modified files to carry prominent notices stating + that You changed the files; and + 3. You must retain, in the Source form of any Derivative Works that + You distribute, all copyright, patent, trademark, and attribution + notices from the Source form of the Work, excluding those notices + that do not pertain to any part of the Derivative Works; and + 4. If the Work includes a "NOTICE" text file as part of its distribution, + then any Derivative Works that You distribute must include a readable + copy of the attribution notices contained within such NOTICE file, + excluding those notices that do not pertain to any part of + the Derivative Works, in at least one of the following places: + within a NOTICE text file distributed as part of the Derivative Works; + within the Source form or documentation, if provided along with the + Derivative Works; or, within a display generated by the Derivative Works, + if and wherever such third-party notices normally appear. + The contents of the NOTICE file are for informational purposes only + and do not modify the License. You may add Your own attribution notices + within Derivative Works that You distribute, alongside or as an addendum + to the NOTICE text from the Work, provided that such additional attribution + notices cannot be construed as modifying the License. You may add Your own + copyright statement to Your modifications and may provide additional or + different license terms and conditions for use, reproduction, or + distribution of Your modifications, or for any such Derivative Works + as a whole, provided Your use, reproduction, and distribution of + the Work otherwise complies with the conditions stated in this License + and your own copyright statement or terms and conditions do not conflict + the conditions stated in the License including section 3. + +5. Submission of Contributions. Unless You explicitly state otherwise, +any Contribution intentionally submitted for inclusion in the Work +by You to the Licensor shall be under the terms and conditions of +this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify +the terms of any separate license agreement you may have executed +with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade +names, trademarks, service marks, or product names of the Licensor, +except as required for reasonable and customary use in describing the +origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or +agreed to in writing, Licensor provides the Work (and each +Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +implied, including, without limitation, any warranties or conditions +of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A +PARTICULAR PURPOSE. You are solely responsible for determining the +appropriateness of using or redistributing the Work and assume any +risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, +whether in tort (including negligence), contract, or otherwise, +unless required by applicable law (such as deliberate and grossly +negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, +incidental, or consequential damages of any character arising as a +result of this License or out of the use or inability to use the +Work (including but not limited to damages for loss of goodwill, +work stoppage, computer failure or malfunction, or any and all +other commercial damages or losses), even if such Contributor +has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing +the Work or Derivative Works thereof, You may choose to offer, +and charge a fee for, acceptance of support, warranty, indemnity, +or other liability obligations and/or rights consistent with this +License. However, in accepting such obligations, You may act only +on Your own behalf and on Your sole responsibility, not on behalf +of any other Contributor, and only if You agree to indemnify, +defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason +of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Flora License to your work + +To apply the Flora License to your work, attach the following +boilerplate notice, with the fields enclosed by brackets "[]" +replaced with your own identifying information. (Don't include +the brackets!) The text should be enclosed in the appropriate +comment syntax for the file format. We also recommend that a +file or class name and description of purpose be included on the +same "printed page" as the copyright notice for easier +identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Flora License, Version 1.1 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://floralicense.org/license/ + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + diff --git a/include/debug.h b/livebox/include/debug.h similarity index 100% rename from include/debug.h rename to livebox/include/debug.h diff --git a/include/dlist.h b/livebox/include/dlist.h similarity index 100% rename from include/dlist.h rename to livebox/include/dlist.h diff --git a/livebox/include/dynamicbox.h b/livebox/include/dynamicbox.h new file mode 100644 index 0000000..768e9c5 --- /dev/null +++ b/livebox/include/dynamicbox.h @@ -0,0 +1,871 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __DYNAMICBOX_UILITY_H +#define __DYNAMICBOX_UILITY_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/** + * @file dynamicbox.h + * @brief This file declares API of libdynamicbox library + * @since_tizen 2.3 + */ + +/** + * @addtogroup CAPI_DYNAMICBOX_UTILITY_MODULE + * @{ + */ + +/** + * @brief Definition for COLOR BLOCK. + * @since_tizen 2.3 + */ +#define DBOX_DESC_TYPE_COLOR "color" + +/** + * @brief Definition for TEXT BLOCK. + * @since_tizen 2.3 + */ +#define DBOX_DESC_TYPE_TEXT "text" + +/** + * @brief Definition for IMAGE BLOCK. + * @since_tizen 2.3 + */ +#define DBOX_DESC_TYPE_IMAGE "image" + +/** + * @brief Definition for SIGNAL BLOCK. + * @since_tizen 2.3 + */ +#define DBOX_DESC_TYPE_SIGNAL "signal" + +/** + * @brief Definition for INFO BLOCK. + * @since_tizen 2.3 + */ +#define DBOX_DESC_TYPE_INFO "info" + +/** + * @brief Definition for DRAG BLOCK. + * @since_tizen 2.3 + */ +#define DBOX_DESC_TYPE_DRAG "drag" + +/** + * @brief Definition for SCRIPT SCRIPT. + * @since_tizen 2.3 + */ +#define DBOX_DESC_TYPE_SCRIPT "script" + +/** + * @brief Definition for ACCESSIBILITY INFORMATION BLOCK. + * @since_tizen 2.3 + */ +#define DBOX_DESC_TYPE_ACCESS "access" + +/** + * @brief Definition for accessibility operation. + * @since_tizen 2.3 + */ +#define DBOX_DESC_TYPE_ACCESS_OPERATION "access,operation" + +/** + * @brief Definition for set highlight on specified part. + * @since_tizen 2.3 + */ +#define DBOX_DESC_DATA_ACCESS_OPERATION_HL_SET "set,hl" + +/** + * @brief Definition for remove highlight from specified part. + * @since_tizen 2.3 + */ +#define DBOX_DESC_DATA_ACCESS_OPERATION_HL_UNSET "unset,hl" + +/** + * @brief Definition for move the highlight to next part. + * @since_tizen 2.3 + */ +#define DBOX_DESC_DATA_ACCESS_OPERATION_HL_NEXT "next,hl" + +/** + * @brief Definition for move the highlight to previous part. + * @since_tizen 2.3 + */ +#define DBOX_DESC_DATA_ACCESS_OPERATION_HL_PREV "prev,hl" + +/** + * @brief Definition for reset the chain of accessibility highlight list. + * @since_tizen 2.3 + */ +#define DBOX_DESC_DATA_ACCESS_OPERATION_RESET "reset,focus" + +/** + * @brief Definition for specify the highlight move option. + * @details If the highlight list reaches to the last object, move back to the first object. + * @since_tizen 2.3 + */ +#define DBOX_DESC_OPTION_ACCESS_HL_LOOP "cycle" + +/** + * @brief Definition for specify the highlight move option. + * @details If the highlight list reaches to the last object(or the first object), + * the "prev,hl", "next,hl" will be failed. + * @since_tizen 2.3 + */ +#define DBOX_DESC_OPTION_ACCESS_HL_NOLOOP "no,cycle" + +/** + * @brief Dynamic Box description data handle. + * @since_tizen 2.3 + */ +struct dynamicbox_desc; + +/** + * @brief Updates a description file. + * @since_tizen 2.3 + * @remarks Must be used only by Inhouse Dynamic Box. + * @param[in] id Dynamic Box Instance Id + * @param[in] gbar 1 for Glance Bar or 0 + * @privlevel public + * @privilege %http://tizen.org/privilege/core/dynamicbox.provider + * @return Handle of desc instance + * @pre Should be loaded by data-provider-slave. + * @post Should be destroyed(flushed) using dynamicbox_desc_close() API. + * @see dynamicbox_desc_close() + */ +extern struct dynamicbox_desc *dynamicbox_desc_open(const char *id, int gbar); + +/** + * @brief Completes the description file update. + * @details Only if this API is called, the description data will be applied to the content of Dynamic Box (or GBar). + * @since_tizen 2.3 + * @remarks Must be used only by Inhouse Dynamic Box. + * @param[in] handle Handle which is created by dynamicbox_desc_open() function + * @privlevel public + * @privilege %http://tizen.org/privilege/core/dynamicbox.provider + * @return int type + * @retval #DBOX_STATUS_ERROR_NONE If the flushing description data is successfully done + * @retval #DBOX_STATUS_ERROR_INVALID_PARAMETER If the given handle is not valid + * @pre Handle must be created by dynamicbox_desc_open() + * @post Handle must not be used after return from this function. + * @see dynamicbox_desc_open() + */ +extern int dynamicbox_desc_close(struct dynamicbox_desc *handle); + +/** + * @brief Sets the category information of current description data. + * @details Creates a new description block for updating category information of layout object. + * @since_tizen 2.3 + * @param[in] handle Handle which is created by dynamicbox_desc_open() function + * @param[in] id Id string of target object + * @param[in] category Category string that will be used by layout object + * @return int type + * @retval #DBOX_STATUS_ERROR_INVALID_PARAMETER Invalid handle + * @retval #DBOX_STATUS_ERROR_OUT_OF_MEMORY Memory is not enough to add this block + * @retval index Index(>=0) of added block, which can be used by dynamicbox_desc_set_id() + * @pre Must be called after create a handle using dynamicbox_desc_open() + * @see dynamicbox_desc_set_id() + */ +extern int dynamicbox_desc_set_category(struct dynamicbox_desc *handle, const char *id, const char *category); + +/** + * @brief Sets the content size. + * @details Sets the content size of layout. + * @since_tizen 2.3 + * @param[in] handle Handle which is created by dynamicbox_desc_open() function + * @param[in] id Id string of target object + * @param[in] w Width in pixel + * @param[in] h Height in pixel + * @return int type + * @retval #DBOX_STATUS_ERROR_INVALID_PARAMETER Invalid argument + * @retval #DBOX_STATUS_ERROR_OUT_OF_MEMORY Not enough memory to add a new block + * @retval index Index(>=0) of added block Successfully added + * @see dynamicbox_desc_open() + * @see dynamicbox_desc_set_id() + */ +extern int dynamicbox_desc_set_size(struct dynamicbox_desc *handle, const char *id, int w, int h); + +/** + * @brief Sets the target id of the given block. + * @details Only available for the script block. + * @since_tizen 2.3 + * @param[in] handle Handle which is created by dynamicbox_desc_open() function + * @param[in] idx Index of target block + * @param[in] id Id String which will be used by other dynamicbox_desc_XXX functions + * @return int type + * @retval #DBOX_STATUS_ERROR_NONE Id is successfully updated for given idx of desc block + * @retval #DBOX_STATUS_ERROR_INVALID_PARAMETER Invalid argument + * @retval #DBOX_STATUS_ERROR_NOT_EXIST Given index of desc block is not exists + * @pre Desc block should be exists which has given index "idx". + * @post Specified Id string("id") can be used by other dynamicbox_desc_XXXX functions. + * @see dynamicbox_desc_open() + * @see dynamicbox_desc_set_id() + */ +extern int dynamicbox_desc_set_id(struct dynamicbox_desc *handle, int idx, const char *id); + +/** + * @brief Adds a new block. + * @since_tizen 2.3 + * @param[in] handle Handle which is created by the dynamicbox_desc_open() function + * @param[in] id ID of source script object + * @param[in] type Type (image|text|script|signal|.. etc) + * @param[in] part Target part to update with given content(data) + * @param[in] data Content for specified part + * @param[in] option Option for the block. (script: group, image: option, ...) + * @return Index of current description block + * @retval #DBOX_STATUS_ERROR_INVALID_PARAMETER Invalid argument + * @retval #DBOX_STATUS_ERROR_OUT_OF_MEMORY Not enough memory to add a new desc block + * @retval index Index(>=0) of added desc block + * @pre Handle must be created using dynamicbox_desc_open. + * @see dynamicbox_desc_set_id() + * @see dynamicbox_desc_del_block() + */ +extern int dynamicbox_desc_add_block(struct dynamicbox_desc *handle, const char *id, const char *type, const char *part, const char *data, const char *option); + +/** + * @brief Deletes an added block. + * @since_tizen 2.3 + * @details If you discard the added desc block, use this API and the index of the created desc block. + * @param[in] handle Handle which is created by dynamicbox_desc_open() function + * @param[in] idx Index of added block, returned from dynamicbox_desc_add_block(), dynamicbox_desc_set_size(), dynamicbox_desc_set_category(), etc + * @return int type + * @retval #DBOX_STATUS_ERROR_NONE Successfully deleted + * @retval #DBOX_STATUS_ERROR_NOT_EXIST Given index of desc block is not exists + * @pre Index must be exists. + * @see dynamicbox_desc_add_block() + * @see dynamicbox_desc_open() + */ +extern int dynamicbox_desc_del_block(struct dynamicbox_desc *handle, int idx); + +/** + * @brief Creates an Evas_Object to create an elm_win object. + * @details Creating a new Evas_Object using Dynamic Box frame buffer. + * @since_tizen 2.3 + * @param[in] id Instance Id + * @param[in] gbar 1 if this object is created for Glance Bar or 0 (for Dynamic Box) + * @privlevel public + * @privilege %http://tizen.org/privilege/core/dynamicbox.provider + * @return Evas_Object* Evas Object type + * @retval Address Valid evas object + * @retval @c NULL failed to create + */ +extern Evas_Object *dynamicbox_get_evas_object(const char *id, int gbar); + +/** + * @brief Set extra information for updated content. + * @details + * If the provider should give some hints to the viewer, + * such as title, icon and name, this function can set them. + * provider will send those information to the viewer when the + * content is updated. + * @since_tizen 2.3 + * @remarks This function only works with the buffer type inhouse provider. + * @param[in] id Dynamic Box Instance Id + * @param[in] content Content string that will pass to a Dynamic Box via dynamicbox_create interface when it is re-created. + * @param[in] title Human readable text for accessitility, summarized text for representing the content of a box. + * @param[in] icon Path of icon image file - alternative image content + * @param[in] name Name of a box - alternative text content + * @return int type + * @retval #DBOX_STATUS_ERROR_OUT_OF_MEMORY Out of memory + * @retval #DBOX_STATUS_ERROR_INVALID_PARAMETER Invalid parameters + * @retval #DBOX_STATUS_ERROR_FAULT Unrecoverable error + * @retval #DBOX_STATUS_ERROR_NONE Successfully sent + */ +extern int dynamicbox_set_extra_info(const char *id, const char *content, const char *title, const char *icon, const char *name); + + +/** + * @internal + * @brief Structure for a Dynamic Box buffer defined by a provider. + * @since_tizen 2.3 + */ +struct dynamicbox_buffer; + +/** + * @internal + * @brief Return values of dynamicbox programming interfaces: Operation is successfully done. + * @since_tizen 2.3 + */ +extern const int DONE; + +/** + * @internal + * @brief Return values of dynamicbox programming interfaces: Contents are updated. + * @since_tizen 2.3 + */ +extern const int OUTPUT_UPDATED; + +/** + * @internal + * @brief Return values of dynamicbox programming interfaces: Need to call the dynamicbox_need_to_update and dynamicbox_update_content. + * @since_tizen 2.3 + */ +extern const int NEED_TO_SCHEDULE; + +/** + * @internal + * @brief Return values of dynamicbox programming interfaces: Need to do force update. + * @since_tizen 2.3 + */ +extern const int FORCE_TO_SCHEDULE; + +/** + * @internal + * @brief Return values of dynamicbox programming interfaces: Need to create a new instance. + * @since_tizen 2.3 + */ +extern const int NEED_TO_CREATE; + +/** + * @internal + * @brief Return values of dynamicbox programming interfaces: Need to destroy this instance. + * @since_tizen 2.3 + */ +extern const int NEED_TO_DESTROY; + +/** + * @internal + * @brief Return values of dynamicbox programming interfaces: Need to update. + * @since_tizen 2.3 + */ +extern const int NEED_TO_UPDATE; + +/** + * @internal + * @brief Return values of dynamicbox programming interfaces: Using network. + * @since_tizen 2.3 + */ +extern const int USE_NET; + +/** + * @internal + * @brief System event type: System font is changed. + * @since_tizen 2.3 + */ +extern const int DBOX_SYS_EVENT_FONT_CHANGED; + +/** + * @internal + * @brief System event type: System language is changed. + * @since_tizen 2.3 + */ +extern const int DBOX_SYS_EVENT_LANG_CHANGED; + +/** + * @internal + * @brief System event type: System time is changed. + * @since_tizen 2.3 + */ +extern const int DBOX_SYS_EVENT_TIME_CHANGED; + +/** + * @internal + * @brief System event type: Region changed. + * @since_tizen 2.3 + */ +extern const int DBOX_SYS_EVENT_REGION_CHANGED; + +/** + * @internal + * @brief System event type: Accessibility mode changed. + * @since_tizen 2.3 + */ +extern const int DBOX_SYS_EVENT_TTS_CHANGED; + +/** + * @internal + * @brief System event type: Dynamic Box is paused. + * @since_tizen 2.3 + */ +extern const int DBOX_SYS_EVENT_PAUSED; + +/** + * @internal + * @brief System event type: Dynamic Box is resumed. + * @since_tizen 2.3 + */ +extern const int DBOX_SYS_EVENT_RESUMED; + +/** + * @internal + * @brief System event type: MMC Status change event. + * @since_tizen 2.3 + */ +extern const int DBOX_SYS_EVENT_MMC_STATUS_CHANGED; + +/** + * @internal + * @brief System event type: Dynamic Box instance is removed from a viewer. + * @since_tizen 2.3 + */ +extern const int DBOX_SYS_EVENT_DELETED; + +/** + * @internal + * @brief Structure for extra event information for dynamicbox_content_event interface function. + * @since_tizen 2.3 + */ +#if !defined(__SCRIPT_EVENT_INFO) +#define __SCRIPT_EVENT_INFO + +/** + * @internal + * @brief + * Text signal & Content event uses this data structure. + * @since_tizen 2.3 + */ +struct event_info { + struct _pointer { + double x; /**< X value of current mouse(touch) position */ + double y; /**< Y value of current mouse(touch) position */ + int down; /**< Is it pressed(1) or not(0) */ + } pointer; + + struct _part { + double sx; /**< Pressed object's left top X */ + double sy; /**< Pressed object's left top Y */ + double ex; /**< Pressed object's right bottom X */ + double ey; /**< Pressed object's right bottom Y */ + } part; +}; +#endif + +/** + * @internal + * @brief Notifies the updated content to the provider. + * @details Forcedly notifies the updated contents. + * This function can be used from async callback function to notify the updated content. + * @since_tizen 2.3 + * @param[in] id Instance Id which is passed to you via the first parameter of every dynamicbox_XXXX interface functions + * @param[in] gbar 1 for updating content of Glance Bar or 0(for content of Dynamic Box) + * @return int type + * @retval #DBOX_STATUS_ERROR_OUT_OF_MEMORY Not enough memory + * @retval #DBOX_STATUS_ERROR_INVALID_PARAMETER Invalid argument + * @retval #DBOX_STATUS_ERROR_IO_ERROR I/O failed, Cannot access given resource file(id) + * @retval #DBOX_STATUS_ERROR_NONE Successfully notified + * @pre This API only can be used after loaded into the data-provider-slave process. + */ +extern int dynamicbox_content_is_updated(const char *id, int gbar); + +/** + * @internal + * @brief Replaces "\n" (new line character) with <br> tag. + * @details This utility function is used to replace all NEW LINE CHARACTER ("\n") with <br> tag. + * @since_tizen 2.3 + * @param[in] str Source string + * @return char * type + * @retval string Allocted in the heap + * @retval @c NULL If it fails to replace string + * @post Returned string must has to be free'd by user manually. + */ +extern char *dynamicbox_util_nl2br(const char *str); + +/** + * @internal + * @brief Interfaces for direct buffer management (Available only for the GBar area). + * @since_tizen 2.3 + */ +#ifndef __DBOX_PROVIDER_BUFFER_H +/** + * @internal + * @brief Enumeration for value should be sync'd with provider. + * @since_tizen 2.3 + */ +enum dbox_buffer_event { + DBOX_BUFFER_EVENT_ENTER, /**< Mouse cursor enter */ + DBOX_BUFFER_EVENT_LEAVE, /**< Mouse cursor leave */ + DBOX_BUFFER_EVENT_DOWN, /**< Mouse down */ + DBOX_BUFFER_EVENT_MOVE, /**< Mouse move */ + DBOX_BUFFER_EVENT_UP, /**< Mouse up */ + + DBOX_BUFFER_EVENT_KEY_DOWN, /**< Key down */ + DBOX_BUFFER_EVENT_KEY_UP, /**< Key up */ + DBOX_BUFFER_EVENT_KEY_FOCUS_IN, /**< Key focus in */ + DBOX_BUFFER_EVENT_KEY_FOCUS_OUT, /**< Key focus out */ + + DBOX_BUFFER_EVENT_HIGHLIGHT, /**< Accessibility - Highlight */ + DBOX_BUFFER_EVENT_HIGHLIGHT_NEXT, /**< Accessibility - Move highlight to next */ + DBOX_BUFFER_EVENT_HIGHLIGHT_PREV, /**< Accessibility - Move highlight to prev */ + DBOX_BUFFER_EVENT_ACTIVATE, /**< Accessibility - Activate the highlighted object */ + DBOX_BUFFER_EVENT_ACTION_UP, /**< Accessibility - Make UP action */ + DBOX_BUFFER_EVENT_ACTION_DOWN, /**< Accessibility - Make Down action */ + DBOX_BUFFER_EVENT_SCROLL_UP, /**< Accessibility - Scroll up */ + DBOX_BUFFER_EVENT_SCROLL_MOVE, /**< Accessibility - Scroll move */ + DBOX_BUFFER_EVENT_SCROLL_DOWN, /**< Accessibility - Scroll down */ + DBOX_BUFFER_EVENT_UNHIGHLIGHT, /**< Accessibility - Remove highlight */ + + DBOX_BUFFER_EVENT_ON_HOLD, /**< To prevent from generating mouse clicked event */ + DBOX_BUFFER_EVENT_OFF_HOLD, /**< Stopped holding. */ + DBOX_BUFFER_EVENT_ON_SCROLL, /**< On scrolling */ + DBOX_BUFFER_EVENT_OFF_SCROLL, /**< Scrolling stopped */ + + DBOX_BUFFER_EVENT_ACCESS_VALUE_CHANGE, /**< */ + DBOX_BUFFER_EVENT_ACCESS_MOUSE, /**< give mouse event to highlight object */ + DBOX_BUFFER_EVENT_ACCESS_BACK, /**< go back to a previous view ex: pop naviframe item */ + DBOX_BUFFER_EVENT_ACCESS_OVER, /**< mouse over an object */ + DBOX_BUFFER_EVENT_ACCESS_READ, /**< highlight an object */ + DBOX_BUFFER_EVENT_ACCESS_ENABLE, /**< enable highlight and read ability */ + DBOX_BUFFER_EVENT_ACCESS_DISABLE /**< disable highlight and read ability */ +}; + +/** + * @internal + * @brief Event info + * @since_tizen 2.3 + */ +struct dbox_buffer_event_data { + enum dbox_buffer_event type; /**< Mouse, Keyboard, Accessibility event type */ + double timestamp; /**< Timestamp of events */ + + union _input_data { + struct _mouse { + int x; /**< If the event type is for accessibility or mouse, coordinates of X for pointer */ + int y; /**< If the event type is for accessibility or mouse, coordinates of Y for pointer */ + } pointer; + + struct _access { + int x; /**< Accessibility event X coordinate */ + int y; /**< Accessibility event Y coordinate */ + unsigned int mouse_type; /**< 0: down, 1: move, 2: up | 0: cur, 1: next, 2: prev, 3: off */ + unsigned int action_type; /**< reserved for protocol */ + unsigned int action_by; /**< reserved for protocol */ + int cycle; /**< reserved for protocol */ + } access; + + unsigned int keycode; /**< If the event type is for keyboard, the value of keycode */ + } info; +}; +#endif + +/** + * @internal + * @brief Acquires a buffer for GBar or DBox, currently only the GBar is supported. + * @since_tizen 2.3 + * @param[in] id Instance Id which is passed to you via the first parameter of every dynamicbox_XXXX interface functions + * @param[in] gbar 1 for Glance Bar or 0 for Dynamic Box + * @param[in] width Width in pixel + * @param[in] height Height in pixel + * @param[in] pixels Size of a pixel in bytes + * @param[in] handler Event handling callback + * @param[in] data User data for event handling callback + * @privlevel public + * @privilege %http://tizen.org/privilege/core/dynamicbox.provider + * @return Buffer handle + * @retval @c NULL Failed to acquire buffer + * @retval handler Handle object + * @pre Given instance must be specify its type as buffer. or this API will be fail. + * @post Allocated buffer object must be released via dynamicbox_release_buffer(). + * @see dynamicbox_release_buffer() + */ +extern struct dynamicbox_buffer *dynamicbox_acquire_buffer(const char *id, int gbar, int width, int height, int pixels, int auto_align, int (*handler)(struct dynamicbox_buffer *, struct dbox_buffer_event_data *, void *), void *data); + +/** + * @internal + * @brief Acquires the Id of Resource (window system). + * @details Only if the provider uses Resource for providing render buffer. + * @since_tizen 2.3 + * @remarks Pixmap Id can be destroyed if you call the dynamicbox_release_buffer(). Then this Resource Id is not guaranteed to use. + * @param[in] handle Buffer handle + * @return unsigned int Resource Id + * @retval >0 Resource Id + * @retval 0 Failed to get Resource Id + * @pre The system must be set to use the Resource Id method for content sharing. + * @see dynamicbox_acquire_buffer() + */ +extern unsigned int dynamicbox_resource_id(struct dynamicbox_buffer *handle); + +/** + * @internal + * @brief Releases the buffer of dynamicbox. + * @since_tizen 2.3 + * @param[in] handle Buffer handle + * @privlevel public + * @privilege %http://tizen.org/privilege/core/dynamicbox.provider + * @return int type + * @retval #DBOX_STATUS_ERROR_INVALID_PARAMETER Invalid argument + * @retval #DBOX_STATUS_ERROR_NONE Successfully released + * @pre Handle must be created using dynamicbox_acquire_buffer(). + * @see dynamicbox_acquire_buffer() + */ +extern int dynamicbox_release_buffer(struct dynamicbox_buffer *handle); + +/** + * @internal + * @brief Gets the address of buffer for S/W rendering. + * @details If you try to use this, after dynamicbox_create_hw_buffer(), you will get @c NULL. + * @since_tizen 2.3 + * @param[in] handle Buffer handle + * @privlevel public + * @privilege %http://tizen.org/privilege/core/dynamicbox.provider + * @return void* address of the render buffer + * @retval @c NULL If it falis to get buffer address + * @retval address If it succeed to get the buffer address + * @see dynamicbox_unref_buffer() + */ +extern void *dynamicbox_ref_buffer(struct dynamicbox_buffer *handle); + +/** + * @internal + * @brief Releases the S/W render buffer. + * @since_tizen 2.3 + * @param[in] buffer Address of render buffer + * @privlevel public + * @privilege %http://tizen.org/privilege/core/dynamicbox.provider + * @return int type + * @retval #DBOX_STATUS_ERROR_INVALID_PARAMETER Invalid handle + * @retval #DBOX_STATUS_ERROR_NONE Successfully unreference + * @pre dynamicbox_ref_buffer() must be called. + * @see dynamicbox_ref_buffer() + */ +extern int dynamicbox_unref_buffer(void *buffer); + +/** + * @internal + * @brief Synchronizes the updated buffer. + * @details This is only needed for non-H/W accelerated buffer. + * @since_tizen 2.3 + * @param[in] handle Buffer handle + * @privlevel public + * @privilege %http://tizen.org/privilege/core/dynamicbox.provider + * @return int type + * @retval #DBOX_STATUS_ERROR_NONE Successfully sync'd + * @retval #DBOX_STATUS_ERROR_INVALID_PARAMETER Invalid argument + * @see dynamicbox_acquire_buffer() + */ +extern int dynamicbox_sync_buffer(struct dynamicbox_buffer *handle); + +/** + * @internal + * @brief Requests to schedule the update operation to a provider. + * @since_tizen 2.3 + * @param[in] id Instance Id which is passed to you via the first parameter of every dynamicbox_XXXX interface functions + * @privlevel public + * @privilege %http://tizen.org/privilege/core/dynamicbox.provider + * @return If succes returns 0 or return less than 0 + * @retval #DBOX_STATUS_ERROR_NONE Successfully triggered + * @retval #DBOX_STATUS_ERROR_INVALID_PARAMETER Invalid argument + * @retval #DBOX_STATUS_ERROR_OUT_OF_MEMORY Not enough memory + * @retval #DBOX_STATUS_ERROR_NOT_EXIST Given id instance is not exist + */ +extern int dynamicbox_request_update(const char *id); + +/** + * @internal + * @brief Checks whether the dynamicbox supports H/W acceleration or not. + * @since_tizen 2.3 + * @param[in] handle Buffer handle + * @return int type + * @retval 1 If the buffer handle support the H/W acceleration buffer + * @retval 0 If it doesn not supported + * @see dynamicbox_acquire_buffer() + */ +extern int dynamicbox_support_hw_buffer(struct dynamicbox_buffer *handle); + +/** + * @internal + * @brief Creates the H/W accelerated buffer. + * @since_tizen 2.3 + * @param[in] handle Buffer handle + * @privlevel public + * @privilege %http://tizen.org/privilege/core/dynamicbox.provider + * @return int type + * @retval #DBOX_STATUS_ERROR_ALREADY H/W buffer is already created + * @retval #DBOX_STATUS_ERROR_INVALID_PARAMETER Invalid argument + * @retval #DBOX_STATUS_ERROR_NONE Successfully created + * @pre Must be checked whether the H/W buffer is supported or not. + * @post Must be destroyed if it is not necessary. + * @see dynamicbox_support_hw_buffer() + */ +extern int dynamicbox_create_hw_buffer(struct dynamicbox_buffer *handle); + +/** + * @internal + * @brief Destroys the H/W accelerated buffer. + * @since_tizen 2.3 + * @param[in] handle Buffer handle + * @privlevel public + * @privilege %http://tizen.org/privilege/core/dynamicbox.provider + * @return int type + * @retval #DBOX_STATUS_ERROR_NONE Successfully destroyed + * @retval #DBOX_STATUS_ERROR_INVALID_PARAMETER Invalid argument + * @pre Must be created h/w buffer using dynamicbox_create_hw_buffer. + * @see dynamicbox_create_hw_buffer() + */ +extern int dynamicbox_destroy_hw_buffer(struct dynamicbox_buffer *handle); + +/** + * @internal + * @brief Gets the address of the accelerated H/W buffer. + * @since_tizen 2.3 + * @param[in] handle Buffer handle + * @privlevel public + * @privilege %http://tizen.org/privilege/core/dynamicbox.provider + * @return void* type + * @retval @c NULL Failed to get H/W accelerated buffer address + * @retval addr H/W accelerated buffer address + * @see dynamicbox_create_hw_buffer() + */ +extern void *dynamicbox_buffer_hw_buffer(struct dynamicbox_buffer *handle); + +/** + * @internal + * @brief Get the stride information from the buffer info + * @since_tizen 2.3 + * @param[in] handle Buffer handle + * @return int stride size + * @retval positive_value length of stride + * @return DBOX_STATUS_ERROR_INVALID_PARAMETER Invalid parameter + * @return DBOX_STATUS_ERROR_FAULT Unrecoverable error + * @see dynamicbox_create_hw_buffer() + */ +extern int dynamicbox_buffer_stride(struct dynamicbox_buffer *handle); + +/** + * @internal + * @brief Pre-processes for rendering content. + * @details This is only needed for accessing H/W accelerated buffer. + * @since_tizen 2.3 + * @param[in] handle Buffer handle + * @privlevel public + * @privilege %http://tizen.org/privilege/core/dynamicbox.provider + * @return int type + * @retval #DBOX_STATUS_ERROR_INVALID_PARAMETER Invalid handle + * @retval #DBOX_STATUS_ERROR_NONE Successfully done + * @post dynamicbox_buffer_post_render must be called after the rendering (accessing buffer) is completed. + * @see dynamicbox_support_hw_buffer() + * @see dynamicbox_buffer_post_render() + */ +extern int dynamicbox_buffer_pre_render(struct dynamicbox_buffer *handle); + +/** + * @internal + * @brief Post-processes for rendering content. + * @since_tizen 2.3 + * @param[in] handle Buffer handle + * @privlevel public + * @privilege %http://tizen.org/privilege/core/dynamicbox.provider + * @return If succes returns 0 or return less than 0 + * @retval #DBOX_STATUS_ERROR_NONE If succeed + * @retval #DBOX_STATUS_ERROR_INVALID_PARAMETER Invalid argument + * @pre dynamicbox_buffer_pre_render must be called. + * @see dynamicbox_support_hw_buffer() + * @see dynamicbox_buffer_pre_render() + */ +extern int dynamicbox_buffer_post_render(struct dynamicbox_buffer *handle); + +/** + * @internal + * @brief Sends a request to the viewer (homescreen) to close the GBar. + * @details Even though you call this function. the homescreen can ignore it. + * @since_tizen 2.3 + * @param[in] dboxid Dynamic Box Package Id + * @param[in] id Instance Id which is passed to you via the first parameter of every dynamicbox_XXXX interface functions + * @param[in] reason DBOX_STATUS_ERROR_NONE(0) + * @privlevel public + * @privilege %http://tizen.org/privilege/core/dynamicbox.provider + * @return int type + * @retval #DBOX_STATUS_ERROR_INVALID_PARAMETER Invalid parameters + * @retval #DBOX_STATUS_ERROR_OUT_OF_MEMORY Out of memory + * @retval #DBOX_STATUS_ERROR_FAULT Failed to send a request + * @retval #DBOX_STATUS_ERROR_NONE Successfully requested + */ +extern int dynamicbox_request_close_gbar(const char *dboxid, const char *id, int reason); + +/** + * @internal + * @brief Send a freeze request to the viewer (homescreen) + * @details + * The viewer will get this request via event callback. + * Then it should freeze its scroller or stop moving the dynamicbox. + * @since_tizen 2.3 + * @remarks If the viewer doesn't care this request, this will has no effect. + * @param[in] dboxid Dynamic Box Package Id + * @param[in] id Instance Id which is passed to you via the first parameter of every dynamicbox_XXXX interface functions + * @privlevel public + * @privilege %http://tizen.org/privilege/core/dynamicbox.provider + * @return int type + * @retval #DBOX_STATUS_ERROR_INVALID_PARAMETER Invalid parameters + * @retval #DBOX_STATUS_ERROR_OUT_OF_MEMORY Out of memory + * @retval #DBOX_STATUS_ERROR_FAULT Failed to send requet + * @retval #DBOX_STATUS_ERROR_NONE Successfully requested + * @see dynamicbox_release_scroller() + */ +extern int dynamicbox_freeze_scroller(const char *dboxid, const char *id); + +/** + * @internal + * @brief Send a release request to the viewer (homescreen) + * @details + * The viewer will get this request via event callback. + * Then it should release its scroller or continue moving the dynamicbox. + * @since_tizen 2.3 + * @remarks If the viewer doesn't care this request, this will has no effect. + * @param[in] dboxid Dynamic Box Package Id + * @param[in] id Instance Id which is passed to you via the first parameter of every dynamicbox_XXXX interface functions + * @privlevel public + * @privilege %http://tizen.org/privilege/core/dynamicbox.provider + * @return int type + * @retval #DBOX_STATUS_ERROR_INVALID_PARAMETER Invalid parameters + * @retval #DBOX_STATUS_ERROR_OUT_OF_MEMORY Out of memory + * @retval #DBOX_STATUS_ERROR_FAULT Failed to send requet + * @retval #DBOX_STATUS_ERROR_NONE Successfully requested + * @see dynamicbox_freeze_scroller() + */ +extern int dynamicbox_thaw_scroller(const char *dboxid, const char *id); + +/** + * @internal + * @brief Get the configuration value for premultiplied alpha. + * @details + * If the system uses the premultiplied alpha for content, + * This function will returns 1. + * @since_tizen 2.3 + * @remarks This function only works with the inhouse provider. + * @return status of premultiplied alpha. + * @retval 1 Content rendered with premultiplied alpha. + * @retval 0 Content doesn't rendered with premultiplied alpha. + */ +extern int dynamicbox_conf_premultiplied_alpha(void); + +/** + * @internal + * @brief Get the configuration value for AUTO Alignment of canvas buffer. + * @details + * If the UIFW does not support the STRIDE information for rendering frame, + * This function will returns 1, then the dynamicbox will automatically aligning the buffer. + * @since_tizen 2.3 + * @return status of auto alignment. + * @retval 1 Content will be automatically aligned by dynamicbox. + * @retval 0 Content will be aligned by UIFW, using stride information. + */ +extern int dynamicbox_conf_auto_align(void); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif +/* End of a file */ diff --git a/livebox/include/livebox.h b/livebox/include/livebox.h new file mode 100644 index 0000000..f8686d4 --- /dev/null +++ b/livebox/include/livebox.h @@ -0,0 +1,283 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LIVEBOX_HELPER_H +#define __LIVEBOX_HELPER_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/** + * @file livebox.h + * @brief This file declares API of liblivebox library + */ + +/** + * @addtogroup CAPI_LIVEBOX_HELPER_MODULE + * @{ + */ + +/** + * @brief Definition for COLOR BLOCK. + */ +#define LB_DESC_TYPE_COLOR "color" + +/** + * @brief Definition for TEXT BLOCK. + */ +#define LB_DESC_TYPE_TEXT "text" + +/** + * @brief Definition for IMAGE BLOCK. + */ +#define LB_DESC_TYPE_IMAGE "image" + +/** + * @brief Definition for SIGNAL BLOCK. + */ +#define LB_DESC_TYPE_SIGNAL "signal" + +/** + * @brief Definition for INFO BLOCK. + */ +#define LB_DESC_TYPE_INFO "info" + +/** + * @brief Definition for DRAG BLOCK. + */ +#define LB_DESC_TYPE_DRAG "drag" + +/** + * @brief Definition for SCRIPT SCRIPT. + */ +#define LB_DESC_TYPE_SCRIPT "script" + +/** + * @brief Definition for ACCESSIBILITY INFORMATION BLOCK. + */ +#define LB_DESC_TYPE_ACCESS "access" + +/** + * @brief Definition for accessibility operation. + */ +#define LB_DESC_TYPE_ACCESS_OPERATION "access,operation" + +/** + * @brief Definition for set highlight on specified part. + */ +#define LB_DESC_DATA_ACCESS_OPERATION_HL_SET "set,hl" + +/** + * @brief Definition for remove highlight from specified part. + */ +#define LB_DESC_DATA_ACCESS_OPERATION_HL_UNSET "unset,hl" + +/** + * @brief Definition for move the highlight to next part. + */ +#define LB_DESC_DATA_ACCESS_OPERATION_HL_NEXT "next,hl" + +/** + * @brief Definition for move the highlight to previous part. + */ +#define LB_DESC_DATA_ACCESS_OPERATION_HL_PREV "prev,hl" + +/** + * @brief Definition for reset the chain of accessibility highlight list. + */ +#define LB_DESC_DATA_ACCESS_OPERATION_RESET "reset,focus" + +/** + * @brief Definition for specify the highlight move option. + * @details If the highlight list reaches to the last object, move back to the first object. + */ +#define LB_DESC_OPTION_ACCESS_HL_LOOP "cycle" + +/** + * @brief Definition for specify the highlight move option. + * @details If the highlight list reaches to the last object(or the first object), + * the "prev,hl", "next,hl" will be failed. + */ +#define LB_DESC_OPTION_ACCESS_HL_NOLOOP "no,cycle" + +/** + * @brief Livebox description data handle. + */ +struct livebox_desc; + +/** + * @brief Updates a description file. + * @remarks Must be used only by Inhouse livebox. + * @param[in] filename + * @param[in] for_pd + * @privlevel public + * @privilege %http://tizen.org/privilege/core/dynamicbox.provider + * @return Handle of desc instance + * @pre Should be loaded by data-provider-slave. + * @post Should be destroyed(flushed) using livebox_desc_close() API. + * @see livebox_desc_close() + */ +extern struct livebox_desc *livebox_desc_open(const char *filename, int for_pd); + +/** + * @brief Completes the description file update. + * @details Only if this API is called, the description data will be applied to the content of livebox (or PD). + * @remarks Must be used only by Inhouse livebox. + * @param[in] handle Handle which is created by livebox_desc_open() function + * @privlevel public + * @privilege %http://tizen.org/privilege/core/dynamicbox.provider + * @return int type + * @retval #LB_STATUS_SUCCESS If the flushing description data is successfully done + * @retval #LB_STATUS_ERROR_INVALID If the given handle is not valid + * @pre Handle must be created by livebox_desc_open() + * @post Handle must not be used after return from this function. + * @see livebox_desc_open() + */ +extern int livebox_desc_close(struct livebox_desc *handle); + +/** + * @brief Sets the category information of current description data. + * @details Creates a new description block for updating category information of layout object. + * @param[in] handle Handle which is created by livebox_desc_open() function + * @param[in] id Id string of target object + * @param[in] category Category string that will be used by layout object + * @privlevel N/P + * @return int type + * @retval #LB_STATUS_ERROR_INVALID Invalid handle + * @retval #LB_STATUS_ERROR_MEMORY Memory is not enough to add this block + * @retval index Index(>=0) of added block, which can be used by livebox_desc_set_id() + * @pre Must be called after create a handle using livebox_desc_open() + * @see livebox_desc_set_id() + */ +extern int livebox_desc_set_category(struct livebox_desc *handle, const char *id, const char *category); + +/** + * @brief Sets the content size. + * @details Sets the content size of layout. + * @param[in] handle Handle which is created by livebox_desc_open() function + * @param[in] id Id string of target object + * @param[in] w Width in pixel + * @param[in] h Height in pixel + * @privlevel N/P + * @return int type + * @retval #LB_STATUS_ERROR_INVALID Invalid argument + * @retval #LB_STATUS_ERROR_MEMORY Not enough memory to add a new block + * @retval index Index(>=0) of added block Successfully added + * @see livebox_desc_open() + * @see livebox_desc_set_id() + */ +extern int livebox_desc_set_size(struct livebox_desc *handle, const char *id, int w, int h); + +/** + * @brief Sets the target id of the given block. + * @details Only available for the script block. + * @param[in] handle Handle which is created by livebox_desc_open() function + * @param[in] idx Index of target block + * @param[in] id Id String which will be used by other livebox_desc_XXX functions + * @privlevel N/P + * @return int type + * @retval #LB_STATUS_SUCCESS Id is successfully updated for given idx of desc block + * @retval #LB_STATUS_ERROR_INVALID Invalid argument + * @retval #LB_STATUS_ERROR_NOT_EXIST Given index of desc block is not exists + * @pre Desc block should be exists which has given index "idx". + * @post Specified Id string("id") can be used by other livebox_desc_XXXX functions. + * @see livebox_desc_open() + * @see livebox_desc_set_id() + */ +extern int livebox_desc_set_id(struct livebox_desc *handle, int idx, const char *id); + +/** + * @brief Adds a new block. + * @param[in] handle Handle which is created by the livebox_desc_open() function + * @param[in] id ID of source script object + * @param[in] type Type (image|text|script|signal|.. etc) + * @param[in] part Target part to update with given content(data) + * @param[in] data Content for specified part + * @param[in] option Option for the block. (script: group, image: option, ...) + * @privlevel N/P + * @return Index of current description block + * @retval #LB_STATUS_ERROR_INVALID Invalid argument + * @retval #LB_STATUS_ERROR_MEMORY Not enough memory to add a new desc block + * @retval index Index(>=0) of added desc block + * @pre Handle must be created using livebox_desc_open. + * @see livebox_desc_set_id() + * @see livebox_desc_del_block() + */ +extern int livebox_desc_add_block(struct livebox_desc *handle, const char *id, const char *type, const char *part, const char *data, const char *option); + +/** + * @brief Deletes an added block. + * @details If you discard the added desc block, use this API and the index of the created desc block. + * @param[in] handle Handle which is created by livebox_desc_open() function + * @param[in] idx Index of added block, returned from livebox_desc_add_block(), livebox_desc_set_size(), livebox_desc_set_category(), etc + * @privlevel N/P + * @return int type + * @retval #LB_STATUS_SUCCESS Successfully deleted + * @retval #LB_STATUS_ERROR_NOT_EXIST Given index of desc block is not exists + * @pre Index must be exists. + * @see livebox_desc_add_block() + * @see livebox_desc_open() + */ +extern int livebox_desc_del_block(struct livebox_desc *handle, int idx); + +/** + * @brief Creates an Evas_Object to create an elm_win object. + * @details Creating a new Evas_Object using livebox frame buffer. + * @param[in] id Instance Id + * @param[in] is_pd 1 if this object is created for PD or 0 (for LB) + * @privlevel public + * @privilege %http://tizen.org/privilege/core/dynamicbox.provider + * @return Evas_Object* Evas Object type + * @retval Address Valid evas object + * @retval @c NULL failed to create + */ +extern Evas_Object *livebox_get_evas_object(const char *id, int is_pd); + +/** + * @brief Set extra information for updated content. + * @details + * If the provider should give some hints to the viewer, + * such as title, icon and name, this function can set them. + * provider will send those information to the viewer when the + * content is updated. + * @remarks This function only works with the buffer type inhouse provider. + * @param[in] id Livebox Instance Id + * @param[in] content Content string that will pass to a livebox via livebox_create interface when it is re-created. + * @param[in] title Human readable text for accessitility, summarized text for representing the content of a box. + * @param[in] icon Path of icon image file - alternative image content + * @param[in] name Name of a box - alternative text content + * @privlevel N/P + * @return int type + * @retval #LB_STATUS_ERROR_MEMORY Out of memory + * @retval #LB_STATUS_ERROR_INVALID Invalid parameters + * @retval #LB_STATUS_ERROR_FAULT Unrecoverable error + * @retval #LB_STATUS_SUCCESS Successfully sent + */ +extern int livebox_set_extra_info(const char *id, const char *content, const char *title, const char *icon, const char *name); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif +/* End of a file */ diff --git a/livebox/include/livebox_product.h b/livebox/include/livebox_product.h new file mode 100644 index 0000000..3df2eac --- /dev/null +++ b/livebox/include/livebox_product.h @@ -0,0 +1,474 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LIVEBOX_HELPER_PRODUCT_H +#define __LIVEBOX_HELPER_PRODUCT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @file livebox_product.h + * @brief This file declares API of liblivebox library for product + */ + +/** + * @addtogroup CAPI_LIVEBOX_HELPER_PRODUCT_MODULE + * @{ + */ + +/** + * @brief Structure for a livebox buffer defined by a provider. + */ +struct livebox_buffer; + +extern const int DONE; /** +#include + +#include +#include + +#include "livebox.h" + +#define PUBLIC __attribute__((visibility("default"))) + +struct livebox_desc { + FILE *fp; + int for_pd; + + unsigned int last_idx; + + //struct dlist *block_list; +}; + +PUBLIC const int DONE = 0x00; +PUBLIC const int OUTPUT_UPDATED = 0x02; +PUBLIC const int USE_NET = 0x04; + +PUBLIC const int NEED_TO_SCHEDULE = 0x01; +PUBLIC const int NEED_TO_CREATE = 0x01; +PUBLIC const int NEED_TO_DESTROY = 0x01; +PUBLIC const int NEED_TO_UPDATE = 0x01; +PUBLIC const int FORCE_TO_SCHEDULE = 0x08; + +PUBLIC const int LB_SYS_EVENT_FONT_CHANGED = 0x01; +PUBLIC const int LB_SYS_EVENT_LANG_CHANGED = 0x02; +PUBLIC const int LB_SYS_EVENT_TIME_CHANGED = 0x04; +PUBLIC const int LB_SYS_EVENT_REGION_CHANGED = 0x08; +PUBLIC const int LB_SYS_EVENT_TTS_CHANGED = 0x10; +PUBLIC const int LB_SYS_EVENT_PAUSED = 0x0100; +PUBLIC const int LB_SYS_EVENT_RESUMED = 0x0200; +PUBLIC const int LB_SYS_EVENT_MMC_STATUS_CHANGED = 0x0400; +PUBLIC const int LB_SYS_EVENT_DELETED = 0x0800; + +PUBLIC struct livebox_desc *livebox_desc_open(const char *filename, int for_pd) +{ + return NULL; +} + +PUBLIC int livebox_desc_close(struct livebox_desc *handle) +{ + return LB_STATUS_ERROR_NOT_IMPLEMENTED; +} + +PUBLIC int livebox_desc_set_category(struct livebox_desc *handle, const char *id, const char *category) +{ + return LB_STATUS_ERROR_NOT_IMPLEMENTED; +} + +PUBLIC int livebox_desc_set_size(struct livebox_desc *handle, const char *id, int w, int h) +{ + return LB_STATUS_ERROR_NOT_IMPLEMENTED; +} + +PUBLIC char *livebox_util_nl2br(const char *str) +{ + return NULL; +} + +PUBLIC int livebox_desc_set_id(struct livebox_desc *handle, int idx, const char *id) +{ + return LB_STATUS_ERROR_NOT_IMPLEMENTED; +} + +/*! + * \return idx + */ +PUBLIC int livebox_desc_add_block(struct livebox_desc *handle, const char *id, const char *type, const char *part, const char *data, const char *option) +{ + return LB_STATUS_ERROR_NOT_IMPLEMENTED; +} + +PUBLIC int livebox_desc_del_block(struct livebox_desc *handle, int idx) +{ + return LB_STATUS_ERROR_NOT_IMPLEMENTED; +} + +PUBLIC struct livebox_buffer *livebox_acquire_buffer(const char *filename, int is_pd, int width, int height, int pixels, int auto_align, int (*handler)(struct livebox_buffer *, struct buffer_event_data *, void *), void *data) +{ + return NULL; +} + +PUBLIC int livebox_request_update(const char *filename) +{ + return LB_STATUS_ERROR_NOT_IMPLEMENTED; +} + +PUBLIC int livebox_conf_premultiplied_alpha(void) +{ + return LB_STATUS_ERROR_NOT_IMPLEMENTED; +} + +PUBLIC unsigned long livebox_pixmap_id(struct livebox_buffer *handle) +{ + return 0lu; +} + +PUBLIC int livebox_release_buffer(struct livebox_buffer *handle) +{ + return LB_STATUS_ERROR_NOT_IMPLEMENTED; +} + +PUBLIC void *livebox_ref_buffer(struct livebox_buffer *handle) +{ + return NULL; +} + +PUBLIC int livebox_unref_buffer(void *buffer) +{ + return LB_STATUS_ERROR_NOT_IMPLEMENTED; +} + +PUBLIC int livebox_sync_buffer(struct livebox_buffer *handle) +{ + return LB_STATUS_ERROR_NOT_IMPLEMENTED; +} + +PUBLIC int livebox_support_hw_buffer(struct livebox_buffer *handle) +{ + return LB_STATUS_ERROR_NOT_IMPLEMENTED; +} + +PUBLIC int livebox_create_hw_buffer(struct livebox_buffer *handle) +{ + return LB_STATUS_ERROR_NOT_IMPLEMENTED; +} + +PUBLIC int livebox_destroy_hw_buffer(struct livebox_buffer *handle) +{ + return LB_STATUS_ERROR_NOT_IMPLEMENTED; +} + +PUBLIC void *livebox_buffer_hw_buffer(struct livebox_buffer *handle) +{ + return NULL; +} + +PUBLIC int livebox_buffer_pre_render(struct livebox_buffer *handle) +{ + return LB_STATUS_ERROR_NOT_IMPLEMENTED; +} + +PUBLIC int livebox_buffer_post_render(struct livebox_buffer *handle) +{ + return LB_STATUS_ERROR_NOT_IMPLEMENTED; +} + +PUBLIC int livebox_buffer_stride(struct livebox_buffer *handle) +{ + return LB_STATUS_ERROR_NOT_IMPLEMENTED; +} + +PUBLIC int livebox_content_is_updated(const char *filename, int is_pd) +{ + return LB_STATUS_ERROR_NOT_IMPLEMENTED; +} + +PUBLIC int livebox_request_close_pd(const char *pkgname, const char *id, int reason) +{ + return LB_STATUS_ERROR_NOT_IMPLEMENTED; +} + +PUBLIC int livebox_freeze_scroller(const char *pkgname, const char *id) +{ + return LB_STATUS_ERROR_NOT_IMPLEMENTED; +} + +PUBLIC int livebox_release_scroller(const char *pkgname, const char *id) +{ + return LB_STATUS_ERROR_NOT_IMPLEMENTED; +} + +PUBLIC int livebox_set_extra_info(const char *id, const char *content, const char *title, const char *icon, const char *name) +{ + return LB_STATUS_ERROR_NOT_IMPLEMENTED; +} + +/* End of a file */ diff --git a/packaging/liblivebox.manifest b/packaging/libdynamicbox.manifest similarity index 100% rename from packaging/liblivebox.manifest rename to packaging/libdynamicbox.manifest diff --git a/packaging/libdynamicbox.spec b/packaging/libdynamicbox.spec new file mode 100644 index 0000000..bcba41b --- /dev/null +++ b/packaging/libdynamicbox.spec @@ -0,0 +1,122 @@ +%bcond_with wayland + +Name: libdynamicbox +Summary: Dynamicbox development library +Version: 1.0.0 +Release: 1 +Group: HomeTF/DynamicBox +License: Flora +Source0: %{name}-%{version}.tar.gz +Source1001: %{name}.manifest +BuildRequires: cmake, gettext-tools, coreutils +BuildRequires: pkgconfig(dlog) +BuildRequires: pkgconfig(dynamicbox_service) +BuildRequires: pkgconfig(dynamicbox_provider) +BuildRequires: pkgconfig(ecore) +BuildRequires: pkgconfig(evas) +BuildRequires: pkgconfig(elementary) +BuildRequires: pkgconfig(livebox-service) +BuildRequires: model-build-features + +%if %{with wayland} +%else +BuildRequires: pkgconfig(x11) +%endif + +%if "%{model_build_feature_livebox}" == "0" +ExclusiveArch: +%endif + +%description +Library for the development of a dynamicbox + +%package devel +Summary: Dynamic Box development library (dev) +Group: Development/Libraries +Requires: %{name} = %{version}-%{release} + +%description devel +Header & Package configuration files for dynamicbox development + +%prep +%setup -q +cp %{SOURCE1001} . + +%build +%if 0%{?sec_build_binary_debug_enable} +export CFLAGS="$CFLAGS -DTIZEN_DEBUG_ENABLE" +export CXXFLAGS="$CXXFLAGS -DTIZEN_DEBUG_ENABLE" +export FFLAGS="$FFLAGS -DTIZEN_DEBUG_ENABLE" +%endif + +%if 0%{?tizen_build_binary_release_type_eng} +export CFLAGS="${CFLAGS} -DTIZEN_ENGINEER_MODE" +export CXXFLAGS="${CXXFLAGS} -DTIZEN_ENGINEER_MODE" +export FFLAGS="${FFLAGS} -DTIZEN_ENGINEER_MODE" +%endif + +%if %{with wayland} +export WAYLAND_SUPPORT=On +export X11_SUPPORT=Off +%else +export WAYLAND_SUPPORT=Off +export X11_SUPPORT=On +%endif + +%cmake . -DWAYLAND_SUPPORT=${WAYLAND_SUPPORT} -DX11_SUPPORT=${X11_SUPPORT} +make %{?jobs:-j%jobs} + +%install +rm -rf %{buildroot} +%make_install +mkdir -p %{buildroot}/%{_datarootdir}/license + +%post -n %{name} -p /sbin/ldconfig +%postun -n %{name} -p /sbin/ldconfig + +%files -n %{name} +%defattr(-,root,root,-) +%manifest %{name}.manifest +%{_libdir}/libdynamicbox.so* +%{_datarootdir}/license/libdynamicbox + +%files devel +%defattr(-,root,root,-) +%manifest %{name}.manifest +%{_includedir}/dynamicbox/dynamicbox.h +%{_includedir}/dynamicbox/internal/dynamicbox.h +%{_libdir}/pkgconfig/dynamicbox.pc + +################################################# +# liblivebox (for old version) +%package -n liblivebox +Summary: Library for developing the dynamicbox (old version) +Group: HomeTF/Dynamicbox +License: Flora +Requires: libdynamicbox + +%description -n liblivebox +Provider APIs to develop the dynamicbox. (old version) + +%package -n liblivebox-devel +Summary: Header & package configuration files to support development of the dynamicbox (old version) +Group: Development/Libraries +Requires: liblivebox + +%description -n liblivebox-devel +Dynamicbox development library (dev) (old version) + +%files -n liblivebox +%manifest %{name}.manifest +%defattr(-,root,root,-) +%{_libdir}/liblivebox.so* +%{_datarootdir}/license/liblivebox + +%files -n liblivebox-devel +%manifest %{name}.manifest +%defattr(-,root,root,-) +%{_includedir}/livebox/livebox.h +%{_includedir}/livebox/livebox_product.h +%{_libdir}/pkgconfig/livebox.pc + +# End of a file diff --git a/packaging/liblivebox.spec b/packaging/liblivebox.spec deleted file mode 100644 index 2f2bc87..0000000 --- a/packaging/liblivebox.spec +++ /dev/null @@ -1,95 +0,0 @@ -%bcond_with wayland - -Name: liblivebox -Summary: Livebox development library -Version: 0.7.4 -Release: 1 -Group: HomeTF/Livebox -License: Flora -Source0: %{name}-%{version}.tar.gz -Source1001: %{name}.manifest -BuildRequires: cmake, gettext-tools, coreutils -BuildRequires: pkgconfig(dlog) -BuildRequires: pkgconfig(livebox-service) -BuildRequires: pkgconfig(provider) -BuildRequires: pkgconfig(ecore) -BuildRequires: pkgconfig(evas) -BuildRequires: pkgconfig(elementary) - -%if %{with wayland} -%else -BuildRequires: pkgconfig(x11) -%endif - -%if "%{sec_product_feature_livebox}" == "0" -ExclusiveArch: -%endif - -%description -Library for the development of a livebox - -%package devel -Summary: Livebox development library (dev) -Group: Development/Libraries -Requires: %{name} = %{version}-%{release} - -%description devel -Header & Package configuration files for livebox development - -%prep -%setup -q -cp %{SOURCE1001} . - -%build -%if 0%{?sec_build_binary_debug_enable} -export CFLAGS="$CFLAGS -DTIZEN_DEBUG_ENABLE" -export CXXFLAGS="$CXXFLAGS -DTIZEN_DEBUG_ENABLE" -export FFLAGS="$FFLAGS -DTIZEN_DEBUG_ENABLE" -%endif - -%if 0%{?tizen_build_binary_release_type_eng} -export CFLAGS="${CFLAGS} -DTIZEN_ENGINEER_MODE" -export CXXFLAGS="${CXXFLAGS} -DTIZEN_ENGINEER_MODE" -export FFLAGS="${FFLAGS} -DTIZEN_ENGINEER_MODE" -%endif - -%if "%{_repository}" == "wearable" -export WEARABLE=On -export MOBILE=Off -%elseif "%{_repository}" == "mobile" -export WEARABLE=Off -export MOBILE=On -%endif - -%if %{with wayland} -export WAYLAND_SUPPORT=On -export X11_SUPPORT=Off -%else -export WAYLAND_SUPPORT=Off -export X11_SUPPORT=On -%endif - -%cmake . -DWAYLAND_SUPPORT=${WAYLAND_SUPPORT} -DX11_SUPPORT=${X11_SUPPORT} -DMOBILE=${MOBILE} -DWEARABLE=${WEARABLE} -make %{?jobs:-j%jobs} - -%install -rm -rf %{buildroot} -%make_install -mkdir -p %{buildroot}/%{_datarootdir}/license - -%post -n liblivebox -p /sbin/ldconfig -%postun -n liblivebox -p /sbin/ldconfig - -%files -n liblivebox -%manifest %{name}.manifest -%defattr(-,root,root,-) -%{_libdir}/*.so* -%{_datarootdir}/license/* - -%files devel -%manifest %{name}.manifest -%defattr(-,root,root,-) -%{_includedir}/livebox/livebox.h -%{_libdir}/pkgconfig/*.pc - -# End of a file diff --git a/src/dlist.c b/src/dlist.c deleted file mode 100644 index b545904..0000000 --- a/src/dlist.c +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright 2013 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include - -#include "dlist.h" - -struct dlist { - struct dlist *next; - struct dlist *prev; - void *data; -}; - -struct dlist *dlist_append(struct dlist *list, void *data) -{ - struct dlist *item; - - item = malloc(sizeof(*item)); - if (!item) { - return NULL; - } - - item->next = NULL; - item->data = data; - - if (!list) { - item->prev = item; - - list = item; - } else { - item->prev = list->prev; - item->prev->next = item; - - list->prev = item; - } - - assert(!list->prev->next && "item NEXT"); - - return list; -} - -struct dlist *dlist_prepend(struct dlist *list, void *data) -{ - struct dlist *item; - - item = malloc(sizeof(*item)); - if (!item) { - return NULL; - } - - if (!list) { - item->prev = item; - item->next = NULL; - } else { - item->prev = list->prev; - list->prev = item; - item->next = list; - } - - return item; -} - -struct dlist *dlist_remove(struct dlist *list, struct dlist *l) -{ - if (!list || !l) { - return NULL; - } - - if (l == list) { - l->prev = list->prev; - list = l->next; - } else { - l->prev->next = l->next; - } - - if (l->next) { - l->next->prev = l->prev; - } - - free(l); - return list; -} - -struct dlist *dlist_find_data(struct dlist *list, void *data) -{ - struct dlist *l; - void *_data; - - dlist_foreach(list, l, _data) { - if (data == _data) { - return l; - } - } - - return NULL; -} - -void *dlist_data(struct dlist *l) -{ - return l ? l->data : NULL; -} - -struct dlist *dlist_next(struct dlist *l) -{ - return l ? l->next : NULL; -} - -struct dlist *dlist_prev(struct dlist *l) -{ - return l ? l->prev : NULL; -} - -int dlist_count(struct dlist *l) -{ - register int i; - struct dlist *n; - void *data; - - i = 0; - dlist_foreach(l, n, data) { - i++; - } - - return i; -} - -struct dlist *dlist_nth(struct dlist *l, int nth) -{ - register int i; - struct dlist *n; - void *data; - - i = 0; - dlist_foreach(l, n, data) { - if (i == nth) { - return l; - } - - i++; - } - - return NULL; -} - -/* End of a file */ diff --git a/src/livebox.c b/src/livebox.c deleted file mode 100644 index b71c116..0000000 --- a/src/livebox.c +++ /dev/null @@ -1,1388 +0,0 @@ -/* - * Copyright 2013 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include /* malloc */ -#include /* strdup */ -#include -#include /* access */ -#define __USE_GNU -#include - -#include -#include -#include -#include -#include - -#include "debug.h" -#include "livebox.h" -#include "dlist.h" -#include "util.h" - -#define PUBLIC __attribute__((visibility("default"))) - -#define FILE_SCHEMA "file://" - -/* Must has to sync'd with data-provider-slave */ -struct conf { - int width; - int height; - - int base_width; - int base_height; - double minimum_period; - - struct { - char *script; - char *abi; - char *pd_group; - double period; - } default_conf; - - struct { - char *name; - char *secured; - char *abi; - } launch_key; - - double default_packet_time; - - char *empty_content; - char *empty_title; - - char *default_content; - char *default_title; - - unsigned long minimum_space; - - char *replace_tag; - - double slave_ttl; - double slave_activate_time; - double slave_relaunch_time; - int slave_relaunch_count; - - int max_log_line; - int max_log_file; - - unsigned long sqlite_flush_max; - - struct { - char *conf; - char *image; - char *script; - char *root; - char *script_port; - char *slave_log; - char *reader; - char *always; - char *db; - char *module; - char *input; - } path; - - int max_size_type; - - int slave_max_load; - - double ping_time; - - int use_sw_backend; - char *provider_method; - int debug_mode; - int overwrite_content; - int com_core_thread; - int use_xmonitor; - int premultiplied; -}; - -/*! - * \brief This function is defined by the data-provider-slave - */ -static struct info { - const char *(*find_pkgname)(const char *filename); - int (*request_update_by_id)(const char *uri); - int (*trigger_update_monitor)(const char *id, int is_pd); - int (*update_extra_info)(const char *id, const char *content, const char *title, const char *icon, const char *name); - struct conf *conf; -} s_info = { - .find_pkgname = NULL, - .request_update_by_id = NULL, - .trigger_update_monitor = NULL, - .update_extra_info = NULL, - .conf = NULL, -}; - -struct block { - unsigned int idx; - - char *type; - char *part; - char *data; - char *option; - char *id; - char *file; - char *target_id; -}; - -struct livebox_desc { - FILE *fp; - int for_pd; - - unsigned int last_idx; - - struct dlist *block_list; -}; - -struct livebox_buffer_data { - int is_pd; - int accelerated; - - /* for Buffer event wrapper */ - int (*handler_NEW)(struct livebox_buffer *, struct buffer_event_data *, void *); - int (*handler)(struct livebox_buffer *, enum buffer_event, double, double, double, void *); - void *cbdata; - - char *content; - char *title; - char *icon; - char *name; -}; - -PUBLIC const int DONE = 0x00; -PUBLIC const int OUTPUT_UPDATED = 0x02; -PUBLIC const int USE_NET = 0x04; - -PUBLIC const int NEED_TO_SCHEDULE = 0x01; -PUBLIC const int NEED_TO_CREATE = 0x01; -PUBLIC const int NEED_TO_DESTROY = 0x01; -PUBLIC const int NEED_TO_UPDATE = 0x01; -PUBLIC const int FORCE_TO_SCHEDULE = 0x08; - -PUBLIC const int LB_SYS_EVENT_FONT_CHANGED = 0x01; -PUBLIC const int LB_SYS_EVENT_LANG_CHANGED = 0x02; -PUBLIC const int LB_SYS_EVENT_TIME_CHANGED = 0x04; -PUBLIC const int LB_SYS_EVENT_REGION_CHANGED = 0x08; -PUBLIC const int LB_SYS_EVENT_PAUSED = 0x0100; -PUBLIC const int LB_SYS_EVENT_RESUMED = 0x0200; -PUBLIC const int LB_SYS_EVENT_MMC_STATUS_CHANGED = 0x0400; - -static char *id_to_uri(const char *id) -{ - char *uri; - int uri_len; - - uri_len = strlen(id) + strlen(FILE_SCHEMA) + 1; - - uri = malloc(uri_len); - if (!uri) { - return NULL; - } - - snprintf(uri, uri_len, FILE_SCHEMA "%s", id); - return uri; -} - -PUBLIC struct livebox_desc *livebox_desc_open(const char *filename, int for_pd) -{ - struct livebox_desc *handle; - char *new_fname; - - handle = calloc(1, sizeof(*handle)); - if (!handle) { - ErrPrint("Error: %s\n", strerror(errno)); - return NULL; - } - - if (for_pd) { - int len; - len = strlen(filename) + strlen(".desc") + 1; - new_fname = malloc(len); - if (!new_fname) { - ErrPrint("Error: %s\n", strerror(errno)); - free(handle); - return NULL; - } - snprintf(new_fname, len, "%s.desc", filename); - } else { - new_fname = strdup(filename); - if (!new_fname) { - ErrPrint("Error: %s\n", strerror(errno)); - free(handle); - return NULL; - } - } - - DbgPrint("Open a file %s with merge mode %s\n", - new_fname, - access(new_fname, F_OK) == 0 ? "enabled" : "disabled"); - - handle->fp = fopen(new_fname, "at"); - free(new_fname); - if (!handle->fp) { - ErrPrint("Failed to open a file: %s\n", strerror(errno)); - free(handle); - return NULL; - } - - return handle; -} - -PUBLIC int livebox_desc_close(struct livebox_desc *handle) -{ - struct dlist *l; - struct dlist *n; - struct block *block; - - if (!handle) { - return LB_STATUS_ERROR_INVALID; - } - - dlist_foreach_safe(handle->block_list, l, n, block) { - handle->block_list = dlist_remove(handle->block_list, l); - - fprintf(handle->fp, "{\n"); - if (block->type) { - fprintf(handle->fp, "type=%s\n", block->type); - } - - if (block->part) { - fprintf(handle->fp, "part=%s\n", block->part); - } - - if (block->data) { - fprintf(handle->fp, "data=%s\n", block->data); - } - - if (block->option) { - fprintf(handle->fp, "option=%s\n", block->option); - } - - if (block->id) { - fprintf(handle->fp, "id=%s\n", block->id); - } - - if (block->target_id) { - fprintf(handle->fp, "target=%s\n", block->target_id); - } - fprintf(handle->fp, "}\n"); - - free(block->type); - free(block->part); - free(block->data); - free(block->option); - free(block->id); - free(block->target_id); - free(block); - } - - if (fclose(handle->fp) != 0) { - ErrPrint("fclose: %s\n", strerror(errno)); - } - free(handle); - return LB_STATUS_SUCCESS; -} - -PUBLIC int livebox_desc_set_category(struct livebox_desc *handle, const char *id, const char *category) -{ - struct block *block; - - if (!handle || !category) { - return LB_STATUS_ERROR_INVALID; - } - - block = calloc(1, sizeof(*block)); - if (!block) { - return LB_STATUS_ERROR_MEMORY; - } - - block->type = strdup(LB_DESC_TYPE_INFO); - if (!block->type) { - free(block); - return LB_STATUS_ERROR_MEMORY; - } - - block->part = strdup("category"); - if (!block->part) { - free(block->type); - free(block); - return LB_STATUS_ERROR_MEMORY; - } - - block->data = strdup(category); - if (!block->data) { - free(block->type); - free(block->part); - free(block); - return LB_STATUS_ERROR_MEMORY; - } - - if (id) { - block->id = strdup(id); - if (!block->id) { - free(block->data); - free(block->type); - free(block->part); - free(block); - return LB_STATUS_ERROR_MEMORY; - } - } - - block->idx = handle->last_idx++; - handle->block_list = dlist_append(handle->block_list, block); - return block->idx; -} - -PUBLIC int livebox_desc_set_size(struct livebox_desc *handle, const char *id, int w, int h) -{ - struct block *block; - char buffer[BUFSIZ]; - - if (!handle) { - return LB_STATUS_ERROR_INVALID; - } - - block = calloc(1, sizeof(*block)); - if (!block) { - return LB_STATUS_ERROR_MEMORY; - } - - block->type = strdup(LB_DESC_TYPE_INFO); - if (!block->type) { - free(block); - return LB_STATUS_ERROR_MEMORY; - } - - block->part = strdup("size"); - if (!block->part) { - free(block->type); - free(block); - return LB_STATUS_ERROR_MEMORY; - } - - if (id) { - block->id = strdup(id); - if (!block->id) { - free(block->part); - free(block->type); - free(block); - return LB_STATUS_ERROR_MEMORY; - } - } - - snprintf(buffer, sizeof(buffer), "%dx%d", w, h); - block->data = strdup(buffer); - if (!block->data) { - free(block->part); - free(block->type); - free(block); - return LB_STATUS_ERROR_MEMORY; - } - - block->idx = handle->last_idx++; - handle->block_list = dlist_append(handle->block_list, block); - return block->idx; -} - -PUBLIC char *livebox_util_nl2br(const char *str) -{ - int len; - register int i; - char *ret; - char *ptr; - - if (!str) { - return NULL; - } - - len = strlen(str); - if (!len) { - return NULL; - } - - ret = malloc(len + 1); - if (!ret) { - return NULL; - } - - ptr = ret; - i = 0; - while (*str) { - switch (*str) { - case '\n': - if (len - i < 5) { - char *tmp; - len += len; - - tmp = realloc(ret, len + 1); - if (!tmp) { - free(ret); - return NULL; - } - - ret = tmp; - ptr = tmp + i; - } - - strcpy(ptr, "
"); - ptr += 4; - i += 4; - break; - default: - *ptr++ = *str; - i++; - break; - } - - str++; - } - *ptr = '\0'; - - return ret; -} - -PUBLIC int livebox_desc_set_id(struct livebox_desc *handle, int idx, const char *id) -{ - struct dlist *l; - struct block *block; - - dlist_foreach(handle->block_list, l, block) { - if (block->idx == idx) { - if (strcasecmp(block->type, LB_DESC_TYPE_SCRIPT)) { - ErrPrint("Invalid block is used\n"); - return LB_STATUS_ERROR_INVALID; - } - - free(block->target_id); - block->target_id = NULL; - - if (!id || !strlen(id)) { - return LB_STATUS_SUCCESS; - } - - block->target_id = strdup(id); - if (!block->target_id) { - ErrPrint("Heap: %s\n", strerror(errno)); - return LB_STATUS_ERROR_MEMORY; - } - - return LB_STATUS_SUCCESS; - } - } - - return LB_STATUS_ERROR_NOT_EXIST; -} - -/*! - * \return idx - */ -PUBLIC int livebox_desc_add_block(struct livebox_desc *handle, const char *id, const char *type, const char *part, const char *data, const char *option) -{ - struct block *block; - - if (!handle || !type) { - return LB_STATUS_ERROR_INVALID; - } - - if (!part) { - part = ""; - } - - if (!data) { - data = ""; - } - - block = calloc(1, sizeof(*block)); - if (!block) { - ErrPrint("Heap: %s\n", strerror(errno)); - return LB_STATUS_ERROR_MEMORY; - } - - block->type = strdup(type); - if (!block->type) { - ErrPrint("Heap: %s\n", strerror(errno)); - free(block); - return LB_STATUS_ERROR_MEMORY; - } - - block->part = strdup(part); - if (!block->part) { - ErrPrint("Heap: %s\n", strerror(errno)); - free(block->type); - free(block); - return LB_STATUS_ERROR_MEMORY; - } - - block->data = strdup(data); - if (!block->data) { - ErrPrint("Heap: %s\n", strerror(errno)); - free(block->type); - free(block->part); - free(block); - return LB_STATUS_ERROR_MEMORY; - } - - if (option) { - block->option = strdup(option); - if (!block->option) { - ErrPrint("Heap: %s\n", strerror(errno)); - free(block->data); - free(block->type); - free(block->part); - free(block); - return LB_STATUS_ERROR_MEMORY; - } - } - - if (id) { - block->id = strdup(id); - if (!block->id) { - ErrPrint("Heap: %s\n", strerror(errno)); - free(block->option); - free(block->data); - free(block->type); - free(block->part); - free(block); - return LB_STATUS_ERROR_MEMORY; - } - } - - block->idx = handle->last_idx++; - handle->block_list = dlist_append(handle->block_list, block); - return block->idx; -} - -PUBLIC int livebox_desc_del_block(struct livebox_desc *handle, int idx) -{ - struct dlist *l; - struct block *block; - - if (!handle || idx < 0) { - return LB_STATUS_ERROR_INVALID; - } - - dlist_foreach(handle->block_list, l, block) { - if (block->idx == idx) { - handle->block_list = dlist_remove(handle->block_list, l); - free(block->type); - free(block->part); - free(block->data); - free(block->option); - free(block->id); - free(block->target_id); - free(block); - return LB_STATUS_SUCCESS; - } - } - - return LB_STATUS_ERROR_NOT_EXIST; -} - -static inline int event_handler_wrapper_NEW(struct livebox_buffer *buffer, struct buffer_event_data *event_info, void *data) -{ - const char *pkgname; - const char *id; - struct livebox_buffer_data *cbdata = data; - int ret; - - pkgname = provider_buffer_pkgname(buffer); - if (!pkgname) { - ErrPrint("pkgname is not valid\n"); - return LB_STATUS_ERROR_INVALID; - } - - id = provider_buffer_id(buffer); - if (!id) { - ErrPrint("id is not valid[%s]\n", pkgname); - return LB_STATUS_ERROR_INVALID; - } - - if (cbdata->handler_NEW) { - ret = cbdata->handler_NEW(buffer, event_info, cbdata->cbdata); - } else { - ret = LB_STATUS_ERROR_FAULT; - } - - switch (event_info->type) { - case BUFFER_EVENT_HIGHLIGHT: - case BUFFER_EVENT_HIGHLIGHT_NEXT: - case BUFFER_EVENT_HIGHLIGHT_PREV: - case BUFFER_EVENT_ACTIVATE: - case BUFFER_EVENT_ACTION_UP: - case BUFFER_EVENT_ACTION_DOWN: - case BUFFER_EVENT_SCROLL_UP: - case BUFFER_EVENT_SCROLL_MOVE: - case BUFFER_EVENT_SCROLL_DOWN: - case BUFFER_EVENT_UNHIGHLIGHT: - DbgPrint("Accessibility event: %d\n", event_info->type); - if (ret < 0) { - (void)provider_send_access_status(pkgname, id, LB_ACCESS_STATUS_ERROR); - } else { - (void)provider_send_access_status(pkgname, id, ret); - } - break; - case BUFFER_EVENT_KEY_UP: - case BUFFER_EVENT_KEY_DOWN: - case BUFFER_EVENT_KEY_FOCUS_IN: - case BUFFER_EVENT_KEY_FOCUS_OUT: - DbgPrint("Key event: %d\n", event_info->type); - if (ret < 0) { - (void)provider_send_key_status(pkgname, id, LB_KEY_STATUS_ERROR); - } else { - (void)provider_send_key_status(pkgname, id, ret); - } - break; - default: - break; - } - - return ret; -} - -/*! - * \note - * The last "data" argument is same with "user_data" which is managed by "provider_set_user_data). - */ -static inline int event_handler_wrapper(struct livebox_buffer *buffer, enum buffer_event type, double timestamp, double x, double y, void *data) -{ - const char *pkgname; - const char *id; - struct livebox_buffer_data *cbdata = data; - int ret; - - pkgname = provider_buffer_pkgname(buffer); - if (!pkgname) { - ErrPrint("pkgname is not valid\n"); - return LB_STATUS_ERROR_INVALID; - } - - id = provider_buffer_id(buffer); - if (!id) { - ErrPrint("id is not valid[%s]\n", pkgname); - return LB_STATUS_ERROR_INVALID; - } - - if (cbdata->handler) { - ret = cbdata->handler(buffer, type, timestamp, x, y, cbdata->cbdata); - } else { - ret = LB_STATUS_ERROR_FAULT; - } - - switch (type) { - case BUFFER_EVENT_HIGHLIGHT: - case BUFFER_EVENT_HIGHLIGHT_NEXT: - case BUFFER_EVENT_HIGHLIGHT_PREV: - case BUFFER_EVENT_ACTIVATE: - case BUFFER_EVENT_ACTION_UP: - case BUFFER_EVENT_ACTION_DOWN: - case BUFFER_EVENT_SCROLL_UP: - case BUFFER_EVENT_SCROLL_MOVE: - case BUFFER_EVENT_SCROLL_DOWN: - case BUFFER_EVENT_UNHIGHLIGHT: - DbgPrint("Accessibility event: %d\n", type); - if (ret < 0) { - (void)provider_send_access_status(pkgname, id, LB_ACCESS_STATUS_ERROR); - } else { - (void)provider_send_access_status(pkgname, id, ret); - } - break; - case BUFFER_EVENT_KEY_UP: - case BUFFER_EVENT_KEY_DOWN: - case BUFFER_EVENT_KEY_FOCUS_IN: - case BUFFER_EVENT_KEY_FOCUS_OUT: - DbgPrint("Key event: %d\n", type); - if (ret < 0) { - (void)provider_send_key_status(pkgname, id, LB_KEY_STATUS_ERROR); - } else { - (void)provider_send_key_status(pkgname, id, ret); - } - break; - default: - break; - } - - return ret; -} - -static inline int default_event_handler_NEW(struct livebox_buffer *buffer, struct buffer_event_data *event_info, void *data) -{ - /* NOP */ - return 0; -} - -static inline int default_event_handler(struct livebox_buffer *buffer, enum buffer_event type, double timestamp, double x, double y, void *data) -{ - /* NOP */ - return 0; -} - -PUBLIC struct livebox_buffer *livebox_acquire_buffer_NEW(const char *filename, int is_pd, int width, int height, int pixels, int (*handler)(struct livebox_buffer *, struct buffer_event_data *, void *), void *data) -{ - struct livebox_buffer_data *user_data; - const char *pkgname; - struct livebox_buffer *handle; - char *uri; - - if (!filename || !width || !height) { - ErrPrint("Invalid argument: %p(%dx%d)\n", filename, width, height); - return NULL; - } - - user_data = calloc(1, sizeof(*user_data)); - if (!user_data) { - ErrPrint("Heap: %s\n", strerror(errno)); - return NULL; - } - - user_data->is_pd = is_pd; - user_data->handler_NEW = handler ? handler : default_event_handler_NEW; - user_data->handler = NULL; - user_data->cbdata = data; - - uri = id_to_uri(filename); - if (!uri) { - ErrPrint("Heap: %s\n", strerror(errno)); - free(user_data); - return NULL; - } - - if (!s_info.find_pkgname) { - s_info.find_pkgname = dlsym(RTLD_DEFAULT, "livebox_find_pkgname"); - if (!s_info.find_pkgname) { - ErrPrint("Failed to find a \"livebox_find_pkgname\"\n"); - free(user_data); - free(uri); - return NULL; - } - } - - pkgname = s_info.find_pkgname(uri); - if (!pkgname) { - ErrPrint("Invalid Request\n"); - free(user_data); - free(uri); - return NULL; - } - - handle = provider_buffer_create((!!is_pd) ? TYPE_PD : TYPE_LB, pkgname, uri, event_handler_wrapper_NEW, user_data); - free(uri); - if (!handle) { - free(user_data); - return NULL; - } - - if (provider_buffer_acquire_NEW(handle, width, height, pixels) < 0) { - provider_buffer_destroy(handle); - free(user_data); - return NULL; - } - - (void)provider_buffer_set_user_data(handle, user_data); - return handle; -} - -PUBLIC struct livebox_buffer *livebox_acquire_buffer(const char *filename, int is_pd, int width, int height, int (*handler)(struct livebox_buffer *, enum buffer_event, double, double, double, void *), void *data) -{ - struct livebox_buffer_data *user_data; - const char *pkgname; - struct livebox_buffer *handle; - char *uri; - - if (!filename || !width || !height) { - ErrPrint("Invalid argument: %p(%dx%d)\n", filename, width, height); - return NULL; - } - - user_data = calloc(1, sizeof(*user_data)); - if (!user_data) { - ErrPrint("Heap: %s\n", strerror(errno)); - return NULL; - } - - user_data->is_pd = is_pd; - user_data->handler = handler ? handler : default_event_handler; - user_data->handler_NEW = NULL; - user_data->cbdata = data; - - uri = id_to_uri(filename); - if (!uri) { - ErrPrint("Heap: %s\n", strerror(errno)); - free(user_data); - return NULL; - } - - if (!s_info.find_pkgname) { - s_info.find_pkgname = dlsym(RTLD_DEFAULT, "livebox_find_pkgname"); - if (!s_info.find_pkgname) { - ErrPrint("Failed to find a \"livebox_find_pkgname\"\n"); - free(user_data); - free(uri); - return NULL; - } - } - - pkgname = s_info.find_pkgname(uri); - if (!pkgname) { - ErrPrint("Invalid Request\n"); - free(user_data); - free(uri); - return NULL; - } - - handle = provider_buffer_acquire((!!is_pd) ? TYPE_PD : TYPE_LB, pkgname, uri, width, height, sizeof(int), event_handler_wrapper, user_data); - DbgPrint("Acquire buffer for PD(%s), %s, %p\n", pkgname, uri, handle); - free(uri); - if (!handle) { - free(user_data); - return NULL; - } - - (void)provider_buffer_set_user_data(handle, user_data); - return handle; -} - -PUBLIC int livebox_request_update(const char *filename) -{ - char *uri; - int ret; - - if (!filename) { - ErrPrint("Invalid argument\n"); - return LB_STATUS_ERROR_INVALID; - } - - uri = id_to_uri(filename); - if (!uri) { - ErrPrint("Heap: %s\n", strerror(errno)); - return LB_STATUS_ERROR_MEMORY; - } - - if (!s_info.request_update_by_id) { - s_info.request_update_by_id = dlsym(RTLD_DEFAULT, "livebox_request_update_by_id"); - if (!s_info.request_update_by_id) { - ErrPrint("\"livebox_request_update_by_id\" is not exists\n"); - free(uri); - return LB_STATUS_ERROR_FAULT; - } - } - ret = s_info.request_update_by_id(uri); - free(uri); - return ret; -} - -PUBLIC int livebox_conf_premultiplied_alpha(void) -{ - if (!s_info.conf) { - s_info.conf = dlsym(RTLD_DEFAULT, "g_conf"); - if (!s_info.conf) { - ErrPrint("g_conf is not found\n"); - return 1; - } - - DbgPrint("Premultiplied alpha: %d\n", s_info.conf->premultiplied); - } - - return s_info.conf->premultiplied; -} - -PUBLIC unsigned long livebox_pixmap_id(struct livebox_buffer *handle) -{ - return provider_buffer_pixmap_id(handle); -} - -PUBLIC int livebox_release_buffer(struct livebox_buffer *handle) -{ - struct livebox_buffer_data *user_data; - - if (!handle) { - return LB_STATUS_ERROR_INVALID; - } - - user_data = provider_buffer_user_data(handle); - if (user_data) { - free(user_data->content); - free(user_data->title); - free(user_data->icon); - free(user_data->name); - free(user_data); - provider_buffer_set_user_data(handle, NULL); - } - - DbgPrint("Release buffer\n"); - return provider_buffer_release(handle); -} - -PUBLIC int livebox_release_buffer_NEW(struct livebox_buffer *handle) -{ - struct livebox_buffer_data *user_data; - - if (!handle) { - return LB_STATUS_ERROR_INVALID; - } - - user_data = provider_buffer_user_data(handle); - if (user_data) { - free(user_data->content); - free(user_data->title); - free(user_data->icon); - free(user_data->name); - free(user_data); - provider_buffer_set_user_data(handle, NULL); - } - - (void)provider_buffer_release_NEW(handle); - (void)provider_buffer_destroy(handle); - - DbgPrint("Release buffer\n"); - return 0; -} - -PUBLIC void *livebox_ref_buffer(struct livebox_buffer *handle) -{ - struct livebox_buffer_data *user_data; - void *data; - int w, h, size; - int ret; - - if (!handle) { - return NULL; - } - - user_data = provider_buffer_user_data(handle); - if (!user_data) { - return NULL; - } - - if (user_data->accelerated) { - DbgPrint("H/W accelerated buffer is allocated\n"); - return NULL; - } - - ret = provider_buffer_get_size(handle, &w, &h, &size); - - data = provider_buffer_ref(handle); - if (data && !ret && w > 0 && h > 0 && size > 0) { - memset(data, 0, w * h * size); - (void)provider_buffer_sync(handle); - } - - DbgPrint("Ref buffer %ds%d(%d)\n", w, h, size); - return data; -} - -PUBLIC int livebox_unref_buffer(void *buffer) -{ - if (!buffer) { - return LB_STATUS_ERROR_INVALID; - } - - DbgPrint("Unref buffer\n"); - return provider_buffer_unref(buffer); -} - -PUBLIC int livebox_sync_buffer(struct livebox_buffer *handle) -{ - struct livebox_buffer_data *user_data; - const char *pkgname; - const char *id; - - if (!handle) { - return LB_STATUS_ERROR_INVALID; - } - - user_data = provider_buffer_user_data(handle); - if (!user_data) { - ErrPrint("Invalid buffer\n"); - return LB_STATUS_ERROR_INVALID; - } - - if (user_data->accelerated) { - DbgPrint("H/W Buffer allocated. skip the sync buffer\n"); - return LB_STATUS_SUCCESS; - } - - pkgname = provider_buffer_pkgname(handle); - if (!pkgname) { - ErrPrint("Invalid buffer handler\n"); - return LB_STATUS_ERROR_INVALID; - } - - id = provider_buffer_id(handle); - if (!id) { - ErrPrint("Invalid buffer handler\n"); - return LB_STATUS_ERROR_INVALID; - } - - (void)provider_buffer_sync(handle); - - if (user_data->is_pd == 1) { - if (provider_send_desc_updated(pkgname, id, NULL) < 0) { - ErrPrint("Failed to send PD updated (%s)\n", id); - } - } else { - int w; - int h; - int pixel_size; - - if (provider_buffer_get_size(handle, &w, &h, &pixel_size) < 0) { - ErrPrint("Failed to get size (%s)\n", id); - } - - if (provider_send_updated_NEW(pkgname, id, w, h, -1.0f, user_data->content, user_data->title, user_data->icon, user_data->name) < 0) { - ErrPrint("Failed to send updated (%s)\n", id); - } - } - - return LB_STATUS_SUCCESS; -} - -PUBLIC int livebox_support_hw_buffer(struct livebox_buffer *handle) -{ - if (!handle) { - return LB_STATUS_ERROR_INVALID; - } - - return provider_buffer_pixmap_is_support_hw(handle); -} - -PUBLIC int livebox_create_hw_buffer(struct livebox_buffer *handle) -{ - struct livebox_buffer_data *user_data; - int ret; - - if (!handle) { - return LB_STATUS_ERROR_INVALID; - } - - user_data = provider_buffer_user_data(handle); - if (!user_data) { - return LB_STATUS_ERROR_INVALID; - } - - if (user_data->accelerated) { - return LB_STATUS_ERROR_ALREADY; - } - - ret = provider_buffer_pixmap_create_hw(handle); - user_data->accelerated = (ret == 0); - return ret; -} - -PUBLIC int livebox_destroy_hw_buffer(struct livebox_buffer *handle) -{ - struct livebox_buffer_data *user_data; - - if (!handle) { - LOGD("handle is NULL\n"); - return LB_STATUS_ERROR_INVALID; - } - - user_data = provider_buffer_user_data(handle); - if (!user_data || !user_data->accelerated) { - LOGD("user_data is NULL\n"); - return LB_STATUS_ERROR_INVALID; - } - - user_data->accelerated = 0; - - return provider_buffer_pixmap_destroy_hw(handle); -} - -PUBLIC void *livebox_buffer_hw_buffer(struct livebox_buffer *handle) -{ - struct livebox_buffer_data *user_data; - - if (!handle) { - return NULL; - } - - user_data = provider_buffer_user_data(handle); - if (!user_data || !user_data->accelerated) { - return NULL; - } - - return provider_buffer_pixmap_hw_addr(handle); -} - -PUBLIC int livebox_buffer_pre_render(struct livebox_buffer *handle) -{ - struct livebox_buffer_data *user_data; - - if (!handle) { - return LB_STATUS_ERROR_INVALID; - } - - user_data = provider_buffer_user_data(handle); - if (!user_data) { - return LB_STATUS_ERROR_INVALID; - } - - if (!user_data->accelerated) { - return LB_STATUS_SUCCESS; - } - - /*! - * \note - * Do preprocessing for accessing the H/W render buffer - */ - return provider_buffer_pre_render(handle); -} - -PUBLIC int livebox_buffer_post_render(struct livebox_buffer *handle) -{ - int ret; - const char *pkgname; - const char *id; - struct livebox_buffer_data *user_data; - - if (!handle) { - return LB_STATUS_ERROR_INVALID; - } - - user_data = provider_buffer_user_data(handle); - if (!user_data) { - return LB_STATUS_ERROR_INVALID; - } - - if (!user_data->accelerated) { - return LB_STATUS_SUCCESS; - } - - pkgname = provider_buffer_pkgname(handle); - if (!pkgname) { - ErrPrint("Invalid buffer handle\n"); - return LB_STATUS_ERROR_INVALID; - } - - id = provider_buffer_id(handle); - if (!id) { - ErrPrint("Invalid buffer handler\n"); - return LB_STATUS_ERROR_INVALID; - } - - ret = provider_buffer_post_render(handle); - if (ret < 0) { - ErrPrint("Failed to post render processing\n"); - return ret; - } - - if (user_data->is_pd == 1) { - if (provider_send_desc_updated(pkgname, id, NULL) < 0) { - ErrPrint("Failed to send PD updated (%s)\n", id); - } - } else { - int w; - int h; - int pixel_size; - - if (provider_buffer_get_size(handle, &w, &h, &pixel_size) < 0) { - ErrPrint("Failed to get size (%s)\n", id); - } - - if (provider_send_updated_NEW(pkgname, id, w, h, -1.0f, user_data->content, user_data->title, user_data->icon, user_data->name) < 0) { - ErrPrint("Failed to send updated (%s)\n", id); - } - } - - return LB_STATUS_SUCCESS; -} - -PUBLIC int livebox_content_is_updated(const char *filename, int is_pd) -{ - if (!s_info.trigger_update_monitor) { - s_info.trigger_update_monitor = dlsym(RTLD_DEFAULT, "livebox_trigger_update_monitor"); - if (!s_info.trigger_update_monitor) { - ErrPrint("Trigger update monitor function is not exists\n"); - return LB_STATUS_ERROR_FAULT; - } - } - - return s_info.trigger_update_monitor(filename, is_pd); -} - -PUBLIC int livebox_request_close_pd(const char *pkgname, const char *id, int reason) -{ - char *uri; - int schema_len = strlen(FILE_SCHEMA); - int ret; - - if (!pkgname || !id) { - ErrPrint("Invalid parameters (%s) (%s)\n", pkgname, id); - return LB_STATUS_ERROR_INVALID; - } - - if (strncmp(id, FILE_SCHEMA, schema_len)) { - uri = id_to_uri(id); - if (!uri) { - ErrPrint("Heap: %s\n", strerror(errno)); - return LB_STATUS_ERROR_MEMORY; - } - } else { - uri = strdup(id); - if (!uri) { - ErrPrint("Heap: %s\n", strerror(errno)); - return LB_STATUS_ERROR_MEMORY; - } - } - - ret = provider_send_request_close_pd(pkgname, uri, reason); - free(uri); - return ret; -} - -PUBLIC int livebox_freeze_scroller(const char *pkgname, const char *id) -{ - char *uri; - int ret; - - uri = id_to_uri(id); - if (!uri) { - ErrPrint("Heap: %s\n", strerror(errno)); - return LB_STATUS_ERROR_MEMORY; - } - - ret = provider_send_hold_scroll(pkgname, uri, 1); - free(uri); - return ret; -} - -PUBLIC int livebox_release_scroller(const char *pkgname, const char *id) -{ - char *uri; - int ret; - - uri = id_to_uri(id); - if (!uri) { - ErrPrint("Heap: %s\n", strerror(errno)); - return LB_STATUS_ERROR_MEMORY; - } - - ret = provider_send_hold_scroll(pkgname, uri, 0); - free(uri); - return ret; -} - -PUBLIC int livebox_set_extra_info(const char *id, const char *content, const char *title, const char *icon, const char *name) -{ - struct livebox_buffer *handle; - const char *pkgname; - char *uri; - - uri = id_to_uri(id); - if (!uri) { - ErrPrint("Heap: %s\n", strerror(errno)); - return LB_STATUS_ERROR_MEMORY; - } - - pkgname = s_info.find_pkgname(uri); - if (!pkgname) { - ErrPrint("Failed to find a package (%s)\n", uri); - free(uri); - return LB_STATUS_ERROR_INVALID; - } - - handle = provider_buffer_find_buffer(TYPE_LB, pkgname, uri); - free(uri); - if (handle) { - struct livebox_buffer_data *user_data; - - user_data = provider_buffer_user_data(handle); - if (!user_data) { - ErrPrint("User data is not available\n"); - return LB_STATUS_ERROR_FAULT; - } - - if (content && strlen(content)) { - char *_content; - - _content = strdup(content); - if (_content) { - if (user_data->content) { - free(user_data->content); - user_data->content = NULL; - } - - user_data->content = _content; - } else { - ErrPrint("Heap: %s\n", strerror(errno)); - } - } - - if (title && strlen(title)) { - char *_title; - - _title = strdup(title); - if (_title) { - if (user_data->title) { - free(user_data->title); - user_data->title = NULL; - } - - user_data->title = _title; - } else { - ErrPrint("Heap: %s\n", strerror(errno)); - } - } - - if (icon && strlen(icon)) { - char *_icon; - - _icon = strdup(icon); - if (_icon) { - if (user_data->icon) { - free(user_data->icon); - user_data->icon = NULL; - } - - user_data->icon = _icon; - } else { - ErrPrint("Heap: %s\n", strerror(errno)); - } - } - - if (name && strlen(name)) { - char *_name; - - _name = strdup(name); - if (_name) { - if (user_data->name) { - free(user_data->name); - user_data->name = NULL; - } - - user_data->name = _name; - } else { - ErrPrint("Heap: %s\n", strerror(errno)); - } - } - - return LB_STATUS_SUCCESS; - } - - if (!s_info.update_extra_info) { - s_info.update_extra_info = dlsym(RTLD_DEFAULT, "livebox_update_extra_info"); - if (!s_info.update_extra_info) { - ErrPrint("Failed to find a \"livebox_update_extra_info\"\n"); - return LB_STATUS_ERROR_INVALID; - } - } - - return s_info.update_extra_info(id, content, title, icon, name); -} - -/* End of a file */ diff --git a/src/snapshot_window.c b/src/snapshot_window.c deleted file mode 100644 index f1187d1..0000000 --- a/src/snapshot_window.c +++ /dev/null @@ -1,529 +0,0 @@ -#include -#include -#include -#include - -#include -#include -#include - -#include "livebox.h" -#include "debug.h" - -#define QUALITY_N_COMPRESS "quality=100 compress=1" -#define PUBLIC __attribute__((visibility("default"))) - -struct snapshot_info { - char *id; - void (*flush_cb)(Evas_Object *snapshot_window, const char *id, int status, void *data); - void *data; - - Ecore_Timer *flush_timer; - - int render_cnt; - double timeout; -}; - -static void post_render_cb(void *data, Evas *e, void *event_info); -static void pre_render_cb(void *data, Evas *e, void *event_info); - - - -static inline Evas *create_virtual_canvas(int w, int h) -{ - Ecore_Evas *internal_ee; - Evas *internal_e; - - // Create virtual canvas - internal_ee = ecore_evas_buffer_new(w, h); - if (!internal_ee) { - LOGD("Failed to create a new canvas buffer\n"); - return NULL; - } - - ecore_evas_alpha_set(internal_ee, EINA_TRUE); - ecore_evas_manual_render_set(internal_ee, EINA_FALSE); - - // Get the "Evas" object from a virtual canvas - internal_e = ecore_evas_get(internal_ee); - if (!internal_e) { - ecore_evas_free(internal_ee); - LOGD("Faield to get Evas object\n"); - return NULL; - } - - return internal_e; -} - - - -static inline int flush_data_to_file(Evas *e, char *data, const char *filename, int w, int h) -{ - Evas_Object *output; - - output = evas_object_image_add(e); - if (!output) { - LOGD("Failed to create an image object\n"); - return LB_STATUS_ERROR_FAULT; - } - - evas_object_image_data_set(output, NULL); - evas_object_image_colorspace_set(output, EVAS_COLORSPACE_ARGB8888); - evas_object_image_alpha_set(output, EINA_TRUE); - evas_object_image_size_set(output, w, h); - evas_object_image_smooth_scale_set(output, EINA_TRUE); - evas_object_image_data_set(output, data); - evas_object_image_fill_set(output, 0, 0, w, h); - evas_object_image_data_update_add(output, 0, 0, w, h); - - if (evas_object_image_save(output, filename, NULL, QUALITY_N_COMPRESS) == EINA_FALSE) { - evas_object_del(output); - SECURE_LOGD("Faield to save a captured image (%s)\n", filename); - return LB_STATUS_ERROR_IO; - } - - evas_object_del(output); - - if (access(filename, F_OK) != 0) { - SECURE_LOGD("File %s is not found\n", filename); - return LB_STATUS_ERROR_IO; - } - - SECURE_LOGD("Flush data to a file (%s)\n", filename); - return LB_STATUS_SUCCESS; -} - - - -static inline int destroy_virtual_canvas(Evas *e) -{ - Ecore_Evas *ee; - - ee = ecore_evas_ecore_evas_get(e); - if (!ee) { - LOGD("Failed to ecore evas object\n"); - return LB_STATUS_ERROR_FAULT; - } - - ecore_evas_free(ee); - return LB_STATUS_SUCCESS; -} - - - -static inline int flush_to_file(void *canvas, const char *filename, int w, int h) -{ - int status; - Evas *shot_e; - Ecore_Evas *shot_ee; - - shot_e = create_virtual_canvas(w, h); - if (!shot_e) { - LOGE("Unable to create a new virtual window\n"); - return LB_STATUS_ERROR_FAULT; - } - - shot_ee = ecore_evas_ecore_evas_get(shot_e); - if (!shot_ee) { - LOGE("Unable to get Ecore_Evas\n"); - destroy_virtual_canvas(shot_e); - return LB_STATUS_ERROR_FAULT; - } - - ecore_evas_manual_render_set(shot_ee, EINA_TRUE); - - status = flush_data_to_file(shot_e, canvas, filename, w, h); - destroy_virtual_canvas(shot_e); - - return status; -} - - - -static void del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) -{ - struct snapshot_info *info; - - info = evas_object_data_del(obj, "snapshot,info"); - if (!info) { - return; - } - - SECURE_LOGD("Delete object (%s)\n", info->id); - - if (info->flush_cb) { - info->flush_cb(obj, info->id, LB_STATUS_ERROR_CANCEL, info->data); - LOGD("Flush is canceled\n"); - } - - /*! - * \note - * Render callback will be deleted. - */ - destroy_virtual_canvas(e); - free(info->id); - free(info); -} - - - -static Eina_Bool direct_snapshot_cb(void *data) -{ - Evas *e; - Ecore_Evas *ee; - void *canvas; - int status; - int w; - int h; - void (*flush_cb)(Evas_Object *snapshot_window, const char *id, int status, void *data); - Evas_Object *snapshot_win = data; - struct snapshot_info *info; - - info = evas_object_data_get(snapshot_win, "snapshot,info"); - if (!info) { - LOGE("Unable to get snapshot info\n"); - return ECORE_CALLBACK_CANCEL; - } - - info->flush_timer = NULL; - flush_cb = info->flush_cb; - info->flush_cb = NULL; /* To prevent call this from the delete callback */ - - e = evas_object_evas_get(snapshot_win); - if (!e) { - LOGE("Invalid object, failed to get Evas\n"); - if (flush_cb) { - flush_cb(snapshot_win, info->id, LB_STATUS_ERROR_FAULT, info->data); - } - return ECORE_CALLBACK_CANCEL; - } - - ee = ecore_evas_ecore_evas_get(e); - if (!ee) { - LOGE("Unable to get Ecore_Evas object\n"); - if (flush_cb) { - flush_cb(snapshot_win, info->id, LB_STATUS_ERROR_FAULT, info->data); - } - return ECORE_CALLBACK_CANCEL; - } - - ecore_evas_geometry_get(ee, NULL, NULL, &w, &h); - ecore_evas_manual_render_set(ee, EINA_TRUE); - - canvas = ecore_evas_buffer_pixels_get(ee); - if (!canvas) { - LOGE("Failed to get canvas\n"); - if (flush_cb) { - flush_cb(snapshot_win, info->id, LB_STATUS_ERROR_FAULT, info->data); - } - return ECORE_CALLBACK_CANCEL; - } - - status = flush_to_file(canvas, info->id, w, h); - if (flush_cb) { - flush_cb(snapshot_win, info->id, status, info->data); - } - return ECORE_CALLBACK_CANCEL; -} - - - -static Eina_Bool snapshot_cb(void *data) -{ - Evas_Object *snapshot_win = data; - struct snapshot_info *info; - Evas *e; - Ecore_Evas *ee; - void *canvas; - void (*flush_cb)(Evas_Object *snapshot_window, const char *id, int status, void *data); - - info = evas_object_data_get(snapshot_win, "snapshot,info"); - if (!info) { - LOGE("Invalid object\n"); - return ECORE_CALLBACK_CANCEL; - } - - info->flush_timer = NULL; - flush_cb = info->flush_cb; - info->flush_cb = NULL; /* To prevent call this from the delete callback */ - - e = evas_object_evas_get(snapshot_win); - if (!e) { - LOGE("Invalid object\n"); - if (flush_cb) { - flush_cb(snapshot_win, info->id, LB_STATUS_ERROR_FAULT, info->data); - } - return ECORE_CALLBACK_CANCEL; - } - - ee = ecore_evas_ecore_evas_get(e); - if (!ee) { - LOGE("Invalid object (ee)\n"); - if (flush_cb) { - flush_cb(snapshot_win, info->id, LB_STATUS_ERROR_FAULT, info->data); - } - return ECORE_CALLBACK_CANCEL; - } - - canvas = (void*)ecore_evas_buffer_pixels_get(ee); - if (!canvas) { - LOGD("Failed to get pixel canvas\n"); - if (flush_cb) { - flush_cb(snapshot_win, info->id, LB_STATUS_ERROR_FAULT, info->data); - } - return ECORE_CALLBACK_CANCEL; - } - - if (flush_cb) { - int w; - int h; - int status; - - ecore_evas_geometry_get(ee, NULL, NULL, &w, &h); - - SECURE_LOGD("Flush size: %dx%d\n", w, h); - status = flush_to_file(canvas, info->id, w, h); - - flush_cb(snapshot_win, info->id, status, info->data); - /*! - * Do not access info after this. - */ - } - - return ECORE_CALLBACK_CANCEL; -} - - - -static void post_render_cb(void *data, Evas *e, void *event_info) -{ - Evas_Object *snapshot_win = data; - struct snapshot_info *info; - - info = evas_object_data_get(snapshot_win, "snapshot,info"); - if (!info) { - LOGE("snapshot info is not valid\n"); - return; - } - - info->render_cnt++; - - if (info->flush_timer) { - /*! - * This has not to be happens. - */ - LOGE("Flush timer is not cleared\n"); - ecore_timer_del(info->flush_timer); - info->flush_timer = NULL; - } - - if (!info->flush_cb) { - LOGD("Flush request is not initiated yet\n"); - return; - } - - /*! - * \NOTE - * Even if tehre is no timer registered, we should capture the content - * from out of this callback. - * Or we can met unexpected problems. - * To avoid it, use the 0.0001f to get timer callback ASAP, not in this function. - */ - LOGD("Fire the flush timer %lf (%d)\n", info->timeout, info->render_cnt); - info->flush_timer = ecore_timer_add(info->timeout, snapshot_cb, snapshot_win); - if (!info->flush_timer) { - void (*flush_cb)(Evas_Object *snapshot_window, const char *id, int status, void *data); - - LOGE("Unalbe to add timer for getting the snapshot\n"); - flush_cb = info->flush_cb; - info->flush_cb = NULL; - - flush_cb(snapshot_win, info->id, LB_STATUS_ERROR_FAULT, info->data); - /*! - * \note - * Do not access info after from here. - */ - } -} - - - -static void pre_render_cb(void *data, Evas *e, void *event_info) -{ - Evas_Object *snapshot_win = data; - struct snapshot_info *info; - - info = evas_object_data_get(snapshot_win, "snapshot,info"); - if (!info) { - LOGE("snapshot info is not valid\n"); - return; - } - - if (info->flush_timer) { - ecore_timer_del(info->flush_timer); - info->flush_timer = NULL; - LOGD("Clear the flush timer\n"); - } - - LOGD("Pre-render callback\n"); -} - - - -static void resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) -{ - Ecore_Evas *ee; - int w; - int h; - int ow; - int oh; - - ee = ecore_evas_ecore_evas_get(e); - if (!ee) { - return; - } - - ecore_evas_geometry_get(ee, NULL, NULL, &w, &h); - evas_object_geometry_get(obj, NULL, NULL, &ow, &oh); - if (ow == w && oh == h) { - SECURE_LOGD("Size is not changed: %dx%d\n", w, h); - return; - } - - /*! - * Box(parent object) is resized. - * Try to resize the canvas too. - */ - ecore_evas_resize(ee, w, h); - SECURE_LOGD("Canvas is resized to %dx%d\n", w, h); -} - - - -PUBLIC Evas_Object *livebox_snapshot_window_add(const char *id, int size_type) -{ - struct snapshot_info *info; - Evas_Object *snapshot_win; - Evas *e; - int w; - int h; - - if (livebox_service_get_size(size_type, &w, &h) != LB_STATUS_SUCCESS) { - LOGE("Invalid size\n"); - return NULL; - } - - info = malloc(sizeof(*info)); - if (!info) { - LOGE("Heap: %s\n", strerror(errno)); - return NULL; - } - - info->id = strdup(id); - if (!info->id) { - LOGE("Heap: %s\n", strerror(errno)); - free(info); - return NULL; - } - - info->flush_cb = NULL; - info->data = NULL; - info->flush_timer = NULL; - info->render_cnt = 0; - - e = create_virtual_canvas(w, h); - if (!e) { - free(info->id); - free(info); - return NULL; - } - - snapshot_win = evas_object_rectangle_add(e); - if (!snapshot_win) { - destroy_virtual_canvas(e); - free(info->id); - free(info); - return NULL; - } - - SECURE_LOGD("Add new window %dx%d\n", w, h); - evas_object_event_callback_add(snapshot_win, EVAS_CALLBACK_DEL, del_cb, NULL); - evas_object_event_callback_add(snapshot_win, EVAS_CALLBACK_RESIZE, resize_cb, NULL); - evas_object_resize(snapshot_win, w, h); - evas_object_show(snapshot_win); - - evas_object_data_set(snapshot_win, "snapshot,info", info); - - evas_event_callback_add(e, EVAS_CALLBACK_RENDER_POST, post_render_cb, snapshot_win); - evas_event_callback_add(e, EVAS_CALLBACK_RENDER_PRE, pre_render_cb, snapshot_win); - - return snapshot_win; -} - - - -PUBLIC int livebox_snapshot_window_flush(Evas_Object *snapshot_win, double timeout, void (*flush_cb)(Evas_Object *snapshot_window, const char *id, int status, void *data), void *data) -{ - struct snapshot_info *info; - - if (!flush_cb || timeout < 0.0f) { - LOGE("Invalid argument (%p, %lf)\n", flush_cb, timeout); - return LB_STATUS_ERROR_INVALID; - } - - info = evas_object_data_get(snapshot_win, "snapshot,info"); - if (!info) { - LOGE("Invalid argument\n"); - return LB_STATUS_ERROR_INVALID; - } - - info->timeout = timeout; - - if (timeout == 0.0f) { - /*! - * This timer is just used for guarantees same behavious even if it flushes content directly, - * The callback should be called from next loop. - * or the developer will get confused - */ - info->flush_timer = ecore_timer_add(0.0001f, direct_snapshot_cb, snapshot_win); - if (!info->flush_timer) { - return LB_STATUS_ERROR_FAULT; - } - } else if (info->render_cnt) { - /*! - * Try to watit pre-render callback. - * If there is rendered contents. - */ - DbgPrint("Rendered %d times already\n", info->render_cnt); - info->flush_timer = ecore_timer_add(info->timeout, snapshot_cb, snapshot_win); - if (!info->flush_timer) { - return LB_STATUS_ERROR_FAULT; - } - } - - info->flush_cb = flush_cb; - info->data = data; - - return LB_STATUS_SUCCESS; -} - - - -PUBLIC int livebox_snapshot_window_del(Evas_Object *snapshot_win) -{ - Evas *e; - if (!snapshot_win || !evas_object_data_get(snapshot_win, "snapshot,info")) { - return LB_STATUS_ERROR_INVALID; - } - - e = evas_object_evas_get(snapshot_win); - evas_event_callback_del(e, EVAS_CALLBACK_RENDER_POST, post_render_cb); - evas_event_callback_del(e, EVAS_CALLBACK_RENDER_PRE, pre_render_cb); - - evas_object_del(snapshot_win); - return LB_STATUS_SUCCESS; -} - - - -// End of a file diff --git a/src/virtual_window.c b/src/virtual_window.c deleted file mode 100644 index 0868494..0000000 --- a/src/virtual_window.c +++ /dev/null @@ -1,605 +0,0 @@ -#include -#include -#include -#include -#include - -#include - -#include -#include -#include - -#include "livebox.h" -#include "debug.h" - -#define IS_PD 1 - -#define PUBLIC __attribute__((visibility("default"))) - -/*! - * \brief - * Abstracted Data Type of Virtual Window - */ -struct info { - char *id; /*!< Identification */ - struct livebox_buffer *handle; /*!< Livebox buffer handle */ - int is_hw; /*!< 1 if a buffer is created on the H/W accelerated place or 0 */ - Ecore_Evas *ee; - Evas *e; - int is_pd; - int deleted; - int w; - int h; -}; - -#if defined(ENABLE_ACCESSIBILITY) -static inline Evas_Object *get_highlighted_object(Evas_Object *obj) -{ - Evas_Object *o, *ho; - - o = evas_object_name_find(evas_object_evas_get(obj), "_elm_access_disp"); - if (!o) return NULL; - - ho = evas_object_data_get(o, "_elm_access_target"); - return ho; -} -#endif - -/*! - * \note - * Every user event (mouse) on the buffer will be passed via this event callback - */ -static int event_handler_cb(struct livebox_buffer *handler, struct buffer_event_data *event_info, void *data) -{ - struct info *info = data; -#if defined(ENABLE_ACCESSIBILITY) - Elm_Access_Action_Info action_info; - Elm_Access_Action_Type action_type; -#endif - int ret = 0; - Evas_Object *parent_elm; - KeySym *key_symbol; - unsigned int flags = 0; - - if (!info->handle) { - /* Just ignore this event */ - return 0; - } - - /*! - * \note - * Feed up events - */ - switch (event_info->type) { - case BUFFER_EVENT_ON_HOLD: - flags = evas_event_default_flags_get(info->e); - flags |= EVAS_EVENT_FLAG_ON_HOLD; - evas_event_default_flags_set(info->e, flags); - break; - case BUFFER_EVENT_OFF_HOLD: - flags = evas_event_default_flags_get(info->e); - flags &= ~EVAS_EVENT_FLAG_ON_HOLD; - evas_event_default_flags_set(info->e, flags); - break; - case BUFFER_EVENT_ON_SCROLL: - flags = evas_event_default_flags_get(info->e); - flags |= EVAS_EVENT_FLAG_ON_SCROLL; - evas_event_default_flags_set(info->e, flags); - break; - case BUFFER_EVENT_OFF_SCROLL: - flags = evas_event_default_flags_get(info->e); - flags &= ~EVAS_EVENT_FLAG_ON_SCROLL; - evas_event_default_flags_set(info->e, flags); - break; - case BUFFER_EVENT_ENTER: - evas_event_feed_mouse_in(info->e, event_info->timestamp * 1000, NULL); - break; - case BUFFER_EVENT_LEAVE: - evas_event_feed_mouse_out(info->e, event_info->timestamp * 1000, NULL); - break; - case BUFFER_EVENT_DOWN: - /*! - * \note - * Calculate the event occurred X & Y on the buffer - */ - evas_event_feed_mouse_move(info->e, event_info->info.pointer.x, event_info->info.pointer.y, (event_info->timestamp - 0.001f) * 1000, NULL); /* + 0.1f just for fake event */ - evas_event_feed_mouse_down(info->e, 1, EVAS_BUTTON_NONE, event_info->timestamp * 1000, NULL); /* + 0.2f just for fake event */ - break; - case BUFFER_EVENT_MOVE: - /*! - * \note - * Calculate the event occurred X & Y on the buffer - */ - DbgPrint("[MOVE] %lu x %lu\n", event_info->info.pointer.x, event_info->info.pointer.y); - evas_event_feed_mouse_move(info->e, event_info->info.pointer.x, event_info->info.pointer.y, event_info->timestamp * 1000, NULL); - break; - case BUFFER_EVENT_UP: - DbgPrint("[UP] %lu x %lu\n", event_info->info.pointer.x, event_info->info.pointer.y); - evas_event_feed_mouse_move(info->e, event_info->info.pointer.x, event_info->info.pointer.y, event_info->timestamp * 1000, NULL); - evas_event_feed_mouse_up(info->e, 1, EVAS_BUTTON_NONE, (event_info->timestamp + 0.001f) * 1000, NULL); - - flags = evas_event_default_flags_get(info->e); - flags &= ~EVAS_EVENT_FLAG_ON_SCROLL; - flags &= ~EVAS_EVENT_FLAG_ON_HOLD; - evas_event_default_flags_set(info->e, flags); - break; - case BUFFER_EVENT_HIGHLIGHT: - parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); - if (!parent_elm) { - ret = LB_ACCESS_STATUS_ERROR; - break; - } -#if defined(ENABLE_ACCESSIBILITY) - memset(&action_info, 0, sizeof(action_info)); - action_type = ELM_ACCESS_ACTION_HIGHLIGHT; - /*! - * \note - * Calculate the event occurred X & Y on the buffer - */ - action_info.x = event_info->info.pointer.x; - action_info.y = event_info->info.pointer.y; - ret = elm_access_action(parent_elm, action_type, &action_info); - if (ret == EINA_TRUE) { - if (!get_highlighted_object(parent_elm)) { - LOGE("Highlighted object is not found\n"); - ret = LB_ACCESS_STATUS_ERROR; - } else { - LOGD("Highlighted object is found\n"); - ret = LB_ACCESS_STATUS_DONE; - } - } else { - LOGE("Action error\n"); - ret = LB_ACCESS_STATUS_ERROR; - } -#else - ret = LB_ACCESS_STATUS_ERROR; -#endif - break; - case BUFFER_EVENT_HIGHLIGHT_NEXT: - parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); - if (!parent_elm) { - ret = LB_ACCESS_STATUS_ERROR; - break; - } -#if defined(ENABLE_ACCESSIBILITY) - memset(&action_info, 0, sizeof(action_info)); - action_type = ELM_ACCESS_ACTION_HIGHLIGHT_NEXT; - action_info.highlight_cycle = EINA_FALSE; - ret = elm_access_action(parent_elm, action_type, &action_info); - ret = (ret == EINA_FALSE) ? LB_ACCESS_STATUS_LAST : LB_ACCESS_STATUS_DONE; -#else - ret = LB_ACCESS_STATUS_ERROR; -#endif - break; - case BUFFER_EVENT_HIGHLIGHT_PREV: - parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); - if (!parent_elm) { - ret = LB_ACCESS_STATUS_ERROR; - break; - } -#if defined(ENABLE_ACCESSIBILITY) - memset(&action_info, 0, sizeof(action_info)); - action_type = ELM_ACCESS_ACTION_HIGHLIGHT_PREV; - action_info.highlight_cycle = EINA_FALSE; - ret = elm_access_action(parent_elm, action_type, &action_info); - ret = (ret == EINA_FALSE) ? LB_ACCESS_STATUS_FIRST : LB_ACCESS_STATUS_DONE; -#else - ret = LB_ACCESS_STATUS_ERROR; -#endif - break; - case BUFFER_EVENT_ACTIVATE: - parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); - if (!parent_elm) { - ret = LB_ACCESS_STATUS_ERROR; - break; - } -#if defined(ENABLE_ACCESSIBILITY) - memset(&action_info, 0, sizeof(action_info)); - action_type = ELM_ACCESS_ACTION_ACTIVATE; - ret = elm_access_action(parent_elm, action_type, &action_info); - ret = (ret == EINA_FALSE) ? LB_ACCESS_STATUS_ERROR : LB_ACCESS_STATUS_DONE; -#else - ret = LB_ACCESS_STATUS_ERROR; -#endif - break; - case BUFFER_EVENT_ACTION_UP: - parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); - if (!parent_elm) { - ret = LB_ACCESS_STATUS_ERROR; - break; - } -#if defined(ENABLE_ACCESSIBILITY) - memset(&action_info, 0, sizeof(action_info)); - action_type = ELM_ACCESS_ACTION_UP; - ret = elm_access_action(parent_elm, action_type, &action_info); - ret = (ret == EINA_FALSE) ? LB_ACCESS_STATUS_ERROR : LB_ACCESS_STATUS_DONE; -#else - ret = LB_ACCESS_STATUS_ERROR; -#endif - break; - case BUFFER_EVENT_ACTION_DOWN: - parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); - if (!parent_elm) { - ret = LB_ACCESS_STATUS_ERROR; - break; - } -#if defined(ENABLE_ACCESSIBILITY) - memset(&action_info, 0, sizeof(action_info)); - action_type = ELM_ACCESS_ACTION_DOWN; - ret = elm_access_action(parent_elm, action_type, &action_info); - ret = (ret == EINA_FALSE) ? LB_ACCESS_STATUS_ERROR : LB_ACCESS_STATUS_DONE; -#else - ret = LB_ACCESS_STATUS_ERROR; -#endif - break; - case BUFFER_EVENT_SCROLL_UP: - parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); - if (!parent_elm) { - ret = LB_ACCESS_STATUS_ERROR; - break; - } -#if defined(ENABLE_ACCESSIBILITY) - memset(&action_info, 0, sizeof(action_info)); - action_type = ELM_ACCESS_ACTION_SCROLL; - action_info.x = event_info->info.pointer.x; - action_info.y = event_info->info.pointer.y; - action_info.mouse_type = 2; - ret = elm_access_action(parent_elm, action_type, &action_info); - ret = (ret == EINA_FALSE) ? LB_ACCESS_STATUS_ERROR : LB_ACCESS_STATUS_DONE; -#else - ret = LB_ACCESS_STATUS_ERROR; -#endif - break; - case BUFFER_EVENT_SCROLL_MOVE: - parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); - if (!parent_elm) { - ret = LB_ACCESS_STATUS_ERROR; - break; - } -#if defined(ENABLE_ACCESSIBILITY) - memset(&action_info, 0, sizeof(action_info)); - action_type = ELM_ACCESS_ACTION_SCROLL; - action_info.x = event_info->info.pointer.x; - action_info.y = event_info->info.pointer.y; - action_info.mouse_type = 1; - ret = elm_access_action(parent_elm, action_type, &action_info); - ret = (ret == EINA_FALSE) ? LB_ACCESS_STATUS_ERROR : LB_ACCESS_STATUS_DONE; -#else - ret = LB_ACCESS_STATUS_ERROR; -#endif - break; - case BUFFER_EVENT_SCROLL_DOWN: - parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); - if (!parent_elm) { - ret = LB_ACCESS_STATUS_ERROR; - break; - } -#if defined(ENABLE_ACCESSIBILITY) - memset(&action_info, 0, sizeof(action_info)); - action_type = ELM_ACCESS_ACTION_SCROLL; - action_info.x = event_info->info.pointer.x; - action_info.y = event_info->info.pointer.y; - action_info.mouse_type = 0; - ret = elm_access_action(parent_elm, action_type, &action_info); - ret = (ret == EINA_FALSE) ? LB_ACCESS_STATUS_ERROR : LB_ACCESS_STATUS_DONE; -#else - ret = LB_ACCESS_STATUS_ERROR; -#endif - break; - case BUFFER_EVENT_UNHIGHLIGHT: - parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); - if (!parent_elm) { - ret = LB_ACCESS_STATUS_ERROR; - break; - } -#if defined(ENABLE_ACCESSIBILITY) - memset(&action_info, 0, sizeof(action_info)); - action_type = ELM_ACCESS_ACTION_UNHIGHLIGHT; - ret = elm_access_action(parent_elm, action_type, &action_info); - ret = (ret == EINA_FALSE) ? LB_ACCESS_STATUS_ERROR : LB_ACCESS_STATUS_DONE; -#else - ret = LB_ACCESS_STATUS_ERROR; -#endif - break; - case BUFFER_EVENT_KEY_DOWN: - parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); - if (!parent_elm) { - ret = LB_ACCESS_STATUS_ERROR; - break; - } - - key_symbol = XGetKeyboardMapping(ecore_x_display_get(), event_info->info.keycode, 1, &ret); - if (key_symbol) { - char *key_name; - char *key_string; - - key_string = XKeysymToString(*key_symbol); - key_name = XKeysymToString(*key_symbol); - DbgPrint("Key symbol: %s, name: %s\n", key_string, key_name); - XFree(key_symbol); - XFree(key_name); - } - ret = LB_KEY_STATUS_ERROR; - break; - case BUFFER_EVENT_KEY_UP: - parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); - if (!parent_elm) { - ret = LB_ACCESS_STATUS_ERROR; - break; - } - - key_symbol = XGetKeyboardMapping(ecore_x_display_get(), event_info->info.keycode, 1, &ret); - if (key_symbol) { - char *key_name; - char *key_string; - - key_string = XKeysymToString(*key_symbol); - key_name = XKeysymToString(*key_symbol); - DbgPrint("Key symbol: %s, name: %s\n", key_string, key_name); - XFree(key_symbol); - XFree(key_name); - } - ret = LB_KEY_STATUS_ERROR; - break; - case BUFFER_EVENT_KEY_FOCUS_IN: - parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); - if (!parent_elm) { - ret = LB_ACCESS_STATUS_ERROR; - break; - } - - key_symbol = XGetKeyboardMapping(ecore_x_display_get(), event_info->info.keycode, 1, &ret); - if (key_symbol) { - char *key_name; - char *key_string; - - key_string = XKeysymToString(*key_symbol); - key_name = XKeysymToString(*key_symbol); - DbgPrint("Key symbol: %s, name: %s\n", key_string, key_name); - XFree(key_symbol); - XFree(key_name); - } - ret = LB_KEY_STATUS_ERROR; - break; - case BUFFER_EVENT_KEY_FOCUS_OUT: - parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); - if (!parent_elm) { - ret = LB_ACCESS_STATUS_ERROR; - break; - } - - key_symbol = XGetKeyboardMapping(ecore_x_display_get(), event_info->info.keycode, 1, &ret); - if (key_symbol) { - char *key_name; - char *key_string; - - key_string = XKeysymToString(*key_symbol); - key_name = XKeysymToString(*key_symbol); - DbgPrint("Key symbol: %s, name: %s\n", key_string, key_name); - XFree(key_symbol); - XFree(key_name); - } - ret = LB_KEY_STATUS_ERROR; - break; - default: - LOGD("Unhandled buffer event (%d)\n", event_info->type); - break; - } - - return ret; -} - -static void *alloc_fb(void *data, int size) -{ - struct info *info = data; - void *buffer; - - if (info->ee) { - ecore_evas_geometry_get(info->ee, NULL, NULL, &info->w, &info->h); - LOGD("Size of ee is updated: %dx%d (info: %p)\n", info->w, info->h, info); - } - - /*! - * Acquire a buffer for canvas. - */ - info->handle = livebox_acquire_buffer_NEW(info->id, info->is_pd, - info->w, info->h, sizeof(int), - event_handler_cb, info); - - /*! - * If it supports the H/W accelerated buffer, - * Use it. - */ - if (livebox_support_hw_buffer(info->handle)) { - if (livebox_create_hw_buffer(info->handle) == 0) { - buffer = livebox_buffer_hw_buffer(info->handle); - if (buffer) { - LOGD("HW Accelerated buffer is created %p, (%dx%d)\n", info, info->w, info->h); - info->is_hw = 1; - return buffer; - } - } - - LOGE("Failed to allocate HW Accelerated buffer\n"); - } - - /*! - * Or use the buffer of a S/W backend. - */ - buffer = livebox_ref_buffer(info->handle); - LOGD("SW buffer is created (%dx%d)\n", info->w, info->h); - info->is_hw = 0; - return buffer; -} - -static void free_fb(void *data, void *ptr) -{ - struct info *info = data; - - if (!info->handle) { - return; - } - - if (info->is_hw) { - if (livebox_destroy_hw_buffer(info->handle) == 0) { - LOGD("HW Accelerated buffer is destroyed\n"); - } - } else { - LOGD("SW buffer is destroyed, %p\n", info); - livebox_unref_buffer(ptr); - } - - livebox_release_buffer_NEW(info->handle); - info->handle = NULL; - - if (info->deleted) { - free(info->id); - info->id = NULL; - - free(info); - } -} - -static void pre_render_cb(void *data, Evas *e, void *event_info) -{ - struct info *info = data; - - if (!info->handle) { - return; - } - - if (livebox_conf_premultiplied_alpha()) { - Evas_Coord w; - Evas_Coord h; - - ecore_evas_geometry_get(info->ee, NULL, NULL, &w, &h); - evas_damage_rectangle_add(e, 0, 0, w, h); - } - - if (info->is_hw) { - livebox_buffer_pre_render(info->handle); - } -} - -static void post_render_cb(void *data, Evas *e, void *event_info) -{ - struct info *info = data; - - if (!info->handle) { - return; - } - - if (livebox_conf_premultiplied_alpha()) { - void *canvas; - int x, y, w, h; - - // Get a pointer of a buffer of the virtual canvas - canvas = (void *)ecore_evas_buffer_pixels_get(info->ee); - if (!canvas) { - ErrPrint("Failed to get pixel canvas\n"); - return; - } - - ecore_evas_geometry_get(info->ee, &x, &y, &w, &h); - evas_data_argb_unpremul(canvas, w * h); - } - - if (info->is_hw) { - livebox_buffer_post_render(info->handle); - } else { - livebox_sync_buffer(info->handle); - } -} - -static void ecore_evas_free_cb(Ecore_Evas *ee) -{ - struct info *info; - - info = ecore_evas_data_get(ee, "dynamic,box,info"); - if (!info) { - LOGD("Info is not valid\n"); - return; - } - - if (info->e) { - evas_event_callback_del(info->e, EVAS_CALLBACK_RENDER_POST, post_render_cb); - evas_event_callback_del(info->e, EVAS_CALLBACK_RENDER_PRE, pre_render_cb); - } - - info->deleted = 1; - info->ee = NULL; -} - -PUBLIC Evas_Object *livebox_get_evas_object(const char *id, int is_pd) -{ - struct info *info; - Evas_Object *rect; - - if (!id) { - ErrPrint("Invalid parameter\n"); - return NULL; - } - - info = calloc(1, sizeof(*info)); - if (!info) { - ErrPrint("Heap: %s\n", strerror(errno)); - return NULL; - } - - info->id = strdup(id); - if (!info->id) { - ErrPrint("Heap: %s\n", strerror(errno)); - free(info); - return NULL; - } - - info->is_pd = is_pd; - - /*! - * Size information must be initialized before call the ecore_evas_buffer_new. - */ - info->w = 1; - info->h = 1; - - info->ee = ecore_evas_buffer_allocfunc_new(1, 1, alloc_fb, free_fb, info); - if (!info->ee) { - ErrPrint("Failed to create ecore_evas (%dx%d)\n", 1, 1); - free(info->id); - free(info); - return NULL; - } - - info->e = ecore_evas_get(info->ee); - if (!info->e) { - ErrPrint("Failed to get evas\n"); - ecore_evas_free(info->ee); - return NULL; - } - - ecore_evas_data_set(info->ee, "dynamic,box,info", info); - - pre_render_cb(info, NULL, NULL); - ecore_evas_alpha_set(info->ee, EINA_TRUE); - post_render_cb(info, NULL, NULL); - - ecore_evas_manual_render_set(info->ee, EINA_FALSE); - ecore_evas_resize(info->ee, 1, 1); - - ecore_evas_callback_pre_free_set(info->ee, ecore_evas_free_cb); - evas_event_callback_add(info->e, EVAS_CALLBACK_RENDER_POST, post_render_cb, info); - evas_event_callback_add(info->e, EVAS_CALLBACK_RENDER_PRE, pre_render_cb, info); - - rect = evas_object_rectangle_add(info->e); - if (!rect) { - ErrPrint("Failed to create evas_object\n"); - ecore_evas_free(info->ee); - return NULL; - } - - evas_object_resize(rect, 1, 1); - evas_object_color_set(rect, 0, 0, 0, 0); - return rect; -} - -/* End of a file */ diff --git a/src/virtual_window_wayland.c b/src/virtual_window_wayland.c deleted file mode 100644 index 3a1dadf..0000000 --- a/src/virtual_window_wayland.c +++ /dev/null @@ -1,433 +0,0 @@ -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "livebox.h" -#include "debug.h" - -#define IS_PD 1 - -#define PUBLIC __attribute__((visibility("default"))) - -/*! - * \brief - * Abstracted Data Type of Virtual Window - */ -struct info { - char *id; /*!< Identification */ - struct livebox_buffer *handle; /*!< Livebox buffer handle */ - int is_hw; /*!< 1 if a buffer is created on the H/W accelerated place or 0 */ - Ecore_Evas *ee; - Evas *e; - int is_pd; -}; - -static inline Evas_Object *get_highlighted_object(Evas_Object *obj) -{ - Evas_Object *o, *ho; - - o = evas_object_name_find(evas_object_evas_get(obj), "_elm_access_disp"); - if (!o) return NULL; - - ho = evas_object_data_get(o, "_elm_access_target"); - return ho; -} - -/*! - * \note - * Every user event (mouse) on the buffer will be passed via this event callback - */ -static int event_handler_cb(struct livebox_buffer *handler, struct buffer_event_data *event_info, void *data) -{ - struct info *info = data; - Elm_Access_Action_Info action_info; - Elm_Access_Action_Type action_type; - int ret = 0; - Evas_Object *parent_elm; - - - if (!info->handle) { - /* Just ignore this event */ - return 0; - } - - /*! - * \note - * Feed up events - */ - switch (event_info->type) { - case BUFFER_EVENT_ENTER: - evas_event_feed_mouse_in(info->e, event_info->timestamp * 1000, NULL); - break; - case BUFFER_EVENT_LEAVE: - evas_event_feed_mouse_out(info->e, event_info->timestamp * 1000, NULL); - break; - case BUFFER_EVENT_DOWN: - /*! - * \note - * Calculate the event occurred X & Y on the buffer - */ - evas_event_feed_mouse_move(info->e, event_info->info.pointer.x, event_info->info.pointer.y, (event_info->timestamp - 0.001f) * 1000, NULL); /* + 0.1f just for fake event */ - evas_event_feed_mouse_down(info->e, 1, EVAS_BUTTON_NONE, event_info->timestamp * 1000, NULL); /* + 0.2f just for fake event */ - break; - case BUFFER_EVENT_MOVE: - /*! - * \note - * Calculate the event occurred X & Y on the buffer - */ - evas_event_feed_mouse_move(info->e, event_info->info.pointer.x, event_info->info.pointer.y, event_info->timestamp * 1000, NULL); - break; - case BUFFER_EVENT_UP: - evas_event_feed_mouse_move(info->e, event_info->info.pointer.x, event_info->info.pointer.y, event_info->timestamp * 1000, NULL); - evas_event_feed_mouse_up(info->e, 1, EVAS_BUTTON_NONE, (event_info->timestamp + 0.001f) * 1000, NULL); - break; - case BUFFER_EVENT_HIGHLIGHT: - parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); - if (!parent_elm) { - ret = LB_ACCESS_STATUS_ERROR; - break; - } - memset(&action_info, 0, sizeof(action_info)); - action_type = ELM_ACCESS_ACTION_HIGHLIGHT; - /*! - * \note - * Calculate the event occurred X & Y on the buffer - */ - action_info.x = event_info->info.pointer.x; - action_info.y = event_info->info.pointer.y; - ret = elm_access_action(parent_elm, action_type, &action_info); - if (ret == EINA_TRUE) { - if (!get_highlighted_object(parent_elm)) { - LOGE("Highlighted object is not found\n"); - ret = LB_ACCESS_STATUS_ERROR; - } else { - LOGD("Highlighted object is found\n"); - ret = LB_ACCESS_STATUS_DONE; - } - } else { - LOGE("Action error\n"); - ret = LB_ACCESS_STATUS_ERROR; - } - break; - case BUFFER_EVENT_HIGHLIGHT_NEXT: - parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); - if (!parent_elm) { - ret = LB_ACCESS_STATUS_ERROR; - break; - } - memset(&action_info, 0, sizeof(action_info)); - action_type = ELM_ACCESS_ACTION_HIGHLIGHT_NEXT; - action_info.highlight_cycle = EINA_FALSE; - ret = elm_access_action(parent_elm, action_type, &action_info); - ret = (ret == EINA_FALSE) ? LB_ACCESS_STATUS_LAST : LB_ACCESS_STATUS_DONE; - break; - case BUFFER_EVENT_HIGHLIGHT_PREV: - parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); - if (!parent_elm) { - ret = LB_ACCESS_STATUS_ERROR; - break; - } - memset(&action_info, 0, sizeof(action_info)); - action_type = ELM_ACCESS_ACTION_HIGHLIGHT_PREV; - action_info.highlight_cycle = EINA_FALSE; - ret = elm_access_action(parent_elm, action_type, &action_info); - ret = (ret == EINA_FALSE) ? LB_ACCESS_STATUS_FIRST : LB_ACCESS_STATUS_DONE; - break; - case BUFFER_EVENT_ACTIVATE: - parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); - if (!parent_elm) { - ret = LB_ACCESS_STATUS_ERROR; - break; - } - memset(&action_info, 0, sizeof(action_info)); - action_type = ELM_ACCESS_ACTION_ACTIVATE; - ret = elm_access_action(parent_elm, action_type, &action_info); - ret = (ret == EINA_FALSE) ? LB_ACCESS_STATUS_ERROR : LB_ACCESS_STATUS_DONE; - break; - case BUFFER_EVENT_ACTION_UP: - parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); - if (!parent_elm) { - ret = LB_ACCESS_STATUS_ERROR; - break; - } - memset(&action_info, 0, sizeof(action_info)); - action_type = ELM_ACCESS_ACTION_UP; - ret = elm_access_action(parent_elm, action_type, &action_info); - ret = (ret == EINA_FALSE) ? LB_ACCESS_STATUS_ERROR : LB_ACCESS_STATUS_DONE; - break; - case BUFFER_EVENT_ACTION_DOWN: - parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); - if (!parent_elm) { - ret = LB_ACCESS_STATUS_ERROR; - break; - } - memset(&action_info, 0, sizeof(action_info)); - action_type = ELM_ACCESS_ACTION_DOWN; - ret = elm_access_action(parent_elm, action_type, &action_info); - ret = (ret == EINA_FALSE) ? LB_ACCESS_STATUS_ERROR : LB_ACCESS_STATUS_DONE; - break; - case BUFFER_EVENT_SCROLL_UP: - parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); - if (!parent_elm) { - ret = LB_ACCESS_STATUS_ERROR; - break; - } - memset(&action_info, 0, sizeof(action_info)); - action_type = ELM_ACCESS_ACTION_SCROLL; - action_info.x = event_info->info.pointer.x; - action_info.y = event_info->info.pointer.y; - action_info.mouse_type = 2; - ret = elm_access_action(parent_elm, action_type, &action_info); - ret = (ret == EINA_FALSE) ? LB_ACCESS_STATUS_ERROR : LB_ACCESS_STATUS_DONE; - break; - case BUFFER_EVENT_SCROLL_MOVE: - parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); - if (!parent_elm) { - ret = LB_ACCESS_STATUS_ERROR; - break; - } - memset(&action_info, 0, sizeof(action_info)); - action_type = ELM_ACCESS_ACTION_SCROLL; - action_info.x = event_info->info.pointer.x; - action_info.y = event_info->info.pointer.y; - action_info.mouse_type = 1; - ret = elm_access_action(parent_elm, action_type, &action_info); - ret = (ret == EINA_FALSE) ? LB_ACCESS_STATUS_ERROR : LB_ACCESS_STATUS_DONE; - break; - case BUFFER_EVENT_SCROLL_DOWN: - parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); - if (!parent_elm) { - ret = LB_ACCESS_STATUS_ERROR; - break; - } - memset(&action_info, 0, sizeof(action_info)); - action_type = ELM_ACCESS_ACTION_SCROLL; - action_info.x = event_info->info.pointer.x; - action_info.y = event_info->info.pointer.y; - action_info.mouse_type = 0; - ret = elm_access_action(parent_elm, action_type, &action_info); - ret = (ret == EINA_FALSE) ? LB_ACCESS_STATUS_ERROR : LB_ACCESS_STATUS_DONE; - break; - case BUFFER_EVENT_UNHIGHLIGHT: - parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); - if (!parent_elm) { - ret = LB_ACCESS_STATUS_ERROR; - break; - } - memset(&action_info, 0, sizeof(action_info)); - action_type = ELM_ACCESS_ACTION_UNHIGHLIGHT; - ret = elm_access_action(parent_elm, action_type, &action_info); - ret = (ret == EINA_FALSE) ? LB_ACCESS_STATUS_ERROR : LB_ACCESS_STATUS_DONE; - break; - case BUFFER_EVENT_KEY_DOWN: - parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); - if (!parent_elm) { - ret = LB_ACCESS_STATUS_ERROR; - break; - } - - ret = LB_KEY_STATUS_ERROR; - break; - case BUFFER_EVENT_KEY_UP: - parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); - if (!parent_elm) { - ret = LB_ACCESS_STATUS_ERROR; - break; - } - - ret = LB_KEY_STATUS_ERROR; - break; - case BUFFER_EVENT_KEY_FOCUS_IN: - parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); - if (!parent_elm) { - ret = LB_ACCESS_STATUS_ERROR; - break; - } - - ret = LB_KEY_STATUS_ERROR; - break; - case BUFFER_EVENT_KEY_FOCUS_OUT: - parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win"); - if (!parent_elm) { - ret = LB_ACCESS_STATUS_ERROR; - break; - } - - ret = LB_KEY_STATUS_ERROR; - break; - default: - LOGD("Unhandled buffer event (%d)\n", event_info->type); - break; - } - - return ret; -} - -static void *alloc_fb(void *data, int size) -{ - struct info *info = data; - void *buffer; - int width = 0; - int height = 0; - - if (info->ee == NULL) { - width = 1; - height = 1; - } else { - ecore_evas_geometry_get(info->ee, NULL, NULL, &width, &height); - } - - /*! - * Acquire a buffer for canvas. - */ - info->handle = livebox_acquire_buffer_NEW(info->id, info->is_pd, - width, height, - event_handler_cb, info); - - /*! - * If it supports the H/W accelerated buffer, - * Use it. - */ - if (livebox_support_hw_buffer(info->handle)) { - if (livebox_create_hw_buffer(info->handle) == 0) { - buffer = livebox_buffer_hw_buffer(info->handle); - if (buffer) { - LOGD("HW Accelerated buffer is created\n"); - info->is_hw = 1; - return buffer; - } - } - - LOGE("Failed to allocate HW Accelerated buffer\n"); - } - - /*! - * Or use the buffer of a S/W backend. - */ - buffer = livebox_ref_buffer(info->handle); - LOGD("SW buffer is created\n"); - info->is_hw = 0; - return buffer; -} - -static void free_fb(void *data, void *ptr) -{ - struct info *info = data; - - if (!info->handle) { - return; - } - - if (info->is_hw) { - if (livebox_destroy_hw_buffer(info->handle) == 0) { - LOGD("HW Accelerated buffer is destroyed\n"); - goto out; - } - } - - livebox_unref_buffer(ptr); - LOGD("SW buffer is destroyed\n"); -out: - livebox_release_buffer(info->handle); - info->handle = NULL; -} - -static void pre_render_cb(void *data, Evas *e, void *event_info) -{ - struct info *info = data; - - if (!info->handle) { - return; - } - - if (info->is_hw) { - livebox_buffer_pre_render(info->handle); - } -} - -static void post_render_cb(void *data, Evas *e, void *event_info) -{ - struct info *info = data; - - if (!info->handle) { - return; - } - - if (info->is_hw) { - livebox_buffer_post_render(info->handle); - } else { - livebox_sync_buffer(info->handle); - } -} - -PUBLIC Evas_Object *livebox_get_evas_object(const char *id, int is_pd) -{ - struct info *info; - Evas_Object *rect; - - if (!id) { - ErrPrint("Invalid parameter\n"); - return NULL; - } - - info = calloc(1, sizeof(*info)); - if (!info) { - ErrPrint("Heap: %s\n", strerror(errno)); - return NULL; - } - - info->id = strdup(id); - if (!info->id) { - ErrPrint("Heap: %s\n", strerror(errno)); - free(info); - return NULL; - } - - info->is_pd = is_pd; - - info->ee = ecore_evas_buffer_allocfunc_new(1, 1, alloc_fb, free_fb, info); - if (!info->ee) { - ErrPrint("Failed to create ecore_evas (%dx%d)\n", 1, 1); - free(info->id); - free(info); - return NULL; - } - - pre_render_cb(info, NULL, NULL); - ecore_evas_alpha_set(info->ee, EINA_TRUE); - post_render_cb(info, NULL, NULL); - - ecore_evas_data_set(info->ee, "dynamic,box,info", info); - - ecore_evas_manual_render_set(info->ee, EINA_FALSE); - ecore_evas_resize(info->ee, 1, 1); - - info->e = ecore_evas_get(info->ee); - if (!info->e) { - ErrPrint("Failed to get evas\n"); - ecore_evas_free(info->ee); - return NULL; - } - - evas_event_callback_add(info->e, EVAS_CALLBACK_RENDER_POST, post_render_cb, info); - evas_event_callback_add(info->e, EVAS_CALLBACK_RENDER_PRE, pre_render_cb, info); - - rect = evas_object_rectangle_add(info->e); - if (!rect) { - ErrPrint("Failed to create evas_object\n"); - ecore_evas_free(info->ee); - return NULL; - } - - evas_object_resize(rect, 1, 1); - evas_object_color_set(rect, 0, 0, 0, 0); - return rect; -} - -/* End of a file */ -- 2.7.4